diff --git a/Zombie Core/common_zm/codescripts/character.gsc b/Zombie Core/common_zm/codescripts/character.gsc index 4a4272d..e47145d 100644 --- a/Zombie Core/common_zm/codescripts/character.gsc +++ b/Zombie Core/common_zm/codescripts/character.gsc @@ -1,201 +1,216 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool setmodelfromarray( a ) { - self setmodel( a[randomint( a.size )] ); + self setmodel( a[ randomint( a.size ) ] ); } precachemodelarray( a ) { - for ( i = 0; i < a.size; i++ ) - precachemodel( a[i] ); + i = 0; + while ( i < a.size ) + { + precachemodel( a[ i ] ); + i++; + } } randomelement( a ) { - return a[randomint( a.size )]; + return a[ randomint( a.size ) ]; } attachfromarray( a ) { - self attach( randomelement( a ), "", 1 ); + self attach( randomelement( a ), "", 1 ); } new() { - self detachall(); - oldgunhand = self.anim_gunhand; - - if ( !isdefined( oldgunhand ) ) - return; - - self.anim_gunhand = "none"; - self [[ anim.putguninhand ]]( oldgunhand ); + self detachall(); + oldgunhand = self.anim_gunhand; + if ( !isDefined( oldgunhand ) ) + { + return; + } + self.anim_gunhand = "none"; + self [[ anim.putguninhand ]]( oldgunhand ); } save() { - info["gunHand"] = self.anim_gunhand; - info["gunInHand"] = self.anim_guninhand; - info["model"] = self.model; - info["hatModel"] = self.hatmodel; - info["gearModel"] = self.gearmodel; - - if ( isdefined( self.name ) ) - { - info["name"] = self.name; + info[ "gunHand" ] = self.anim_gunhand; + info[ "gunInHand" ] = self.anim_guninhand; + info[ "model" ] = self.model; + info[ "hatModel" ] = self.hatmodel; + info[ "gearModel" ] = self.gearmodel; + if ( isDefined( self.name ) ) + { + info[ "name" ] = self.name; /# - println( "Save: Guy has name ", self.name ); + println( "Save: Guy has name ", self.name ); #/ - } - else - { + } + else + { /# - println( "save: Guy had no name!" ); + println( "save: Guy had no name!" ); #/ - } - - attachsize = self getattachsize(); - - for ( i = 0; i < attachsize; i++ ) - { - info["attach"][i]["model"] = self getattachmodelname( i ); - info["attach"][i]["tag"] = self getattachtagname( i ); - } - - return info; + } + attachsize = self getattachsize(); + i = 0; + while ( i < attachsize ) + { + info[ "attach" ][ i ][ "model" ] = self getattachmodelname( i ); + info[ "attach" ][ i ][ "tag" ] = self getattachtagname( i ); + i++; + } + return info; } load( info ) { - self detachall(); - self.anim_gunhand = info["gunHand"]; - self.anim_guninhand = info["gunInHand"]; - self setmodel( info["model"] ); - self.hatmodel = info["hatModel"]; - self.gearmodel = info["gearModel"]; - - if ( isdefined( info["name"] ) ) - { - self.name = info["name"]; + self detachall(); + self.anim_gunhand = info[ "gunHand" ]; + self.anim_guninhand = info[ "gunInHand" ]; + self setmodel( info[ "model" ] ); + self.hatmodel = info[ "hatModel" ]; + self.gearmodel = info[ "gearModel" ]; + if ( isDefined( info[ "name" ] ) ) + { + self.name = info[ "name" ]; /# - println( "Load: Guy has name ", self.name ); + println( "Load: Guy has name ", self.name ); #/ - } - else - { + } + else + { /# - println( "Load: Guy had no name!" ); + println( "Load: Guy had no name!" ); #/ - } - - attachinfo = info["attach"]; - attachsize = attachinfo.size; - - for ( i = 0; i < attachsize; i++ ) - self attach( attachinfo[i]["model"], attachinfo[i]["tag"] ); + } + attachinfo = info[ "attach" ]; + attachsize = attachinfo.size; + i = 0; + while ( i < attachsize ) + { + self attach( attachinfo[ i ][ "model" ], attachinfo[ i ][ "tag" ] ); + i++; + } } precache( info ) { - if ( isdefined( info["name"] ) ) - { + if ( isDefined( info[ "name" ] ) ) + { /# - println( "Precache: Guy has name ", info["name"] ); + println( "Precache: Guy has name ", info[ "name" ] ); #/ - } - else - { + } + else + { /# - println( "Precache: Guy had no name!" ); + println( "Precache: Guy had no name!" ); #/ - } - - precachemodel( info["model"] ); - attachinfo = info["attach"]; - attachsize = attachinfo.size; - - for ( i = 0; i < attachsize; i++ ) - precachemodel( attachinfo[i]["model"] ); + } + precachemodel( info[ "model" ] ); + attachinfo = info[ "attach" ]; + attachsize = attachinfo.size; + i = 0; + while ( i < attachsize ) + { + precachemodel( attachinfo[ i ][ "model" ] ); + i++; + } } get_random_character( amount ) { - self_info = strtok( self.classname, "_" ); - - if ( self_info.size <= 2 ) - return randomint( amount ); - - group = "auto"; - index = undefined; - prefix = self_info[2]; - - if ( isdefined( self.script_char_index ) ) - index = self.script_char_index; - - if ( isdefined( self.script_char_group ) ) - { - type = "grouped"; - group = "group_" + self.script_char_group; - } - - if ( !isdefined( level.character_index_cache ) ) - level.character_index_cache = []; - - if ( !isdefined( level.character_index_cache[prefix] ) ) - level.character_index_cache[prefix] = []; - - if ( !isdefined( level.character_index_cache[prefix][group] ) ) - initialize_character_group( prefix, group, amount ); - - if ( !isdefined( index ) ) - { - index = get_least_used_index( prefix, group ); - - if ( !isdefined( index ) ) - index = randomint( 5000 ); - } - - while ( index >= amount ) - index -= amount; - - level.character_index_cache[prefix][group][index]++; - return index; + self_info = strtok( self.classname, "_" ); + if ( self_info.size <= 2 ) + { + return randomint( amount ); + } + group = "auto"; + index = undefined; + prefix = self_info[ 2 ]; + if ( isDefined( self.script_char_index ) ) + { + index = self.script_char_index; + } + if ( isDefined( self.script_char_group ) ) + { + type = "grouped"; + group = "group_" + self.script_char_group; + } + if ( !isDefined( level.character_index_cache ) ) + { + level.character_index_cache = []; + } + if ( !isDefined( level.character_index_cache[ prefix ] ) ) + { + level.character_index_cache[ prefix ] = []; + } + if ( !isDefined( level.character_index_cache[ prefix ][ group ] ) ) + { + initialize_character_group( prefix, group, amount ); + } + if ( !isDefined( index ) ) + { + index = get_least_used_index( prefix, group ); + if ( !isDefined( index ) ) + { + index = randomint( 5000 ); + } + } + while ( index >= amount ) + { + index -= amount; + } + level.character_index_cache[ prefix ][ group ][ index ]++; + return index; } get_least_used_index( prefix, group ) { - lowest_indices = []; - lowest_use = level.character_index_cache[prefix][group][0]; - lowest_indices[0] = 0; - - for ( i = 1; i < level.character_index_cache[prefix][group].size; i++ ) - { - if ( level.character_index_cache[prefix][group][i] > lowest_use ) - continue; - - if ( level.character_index_cache[prefix][group][i] < lowest_use ) - { - lowest_indices = []; - lowest_use = level.character_index_cache[prefix][group][i]; - } - - lowest_indices[lowest_indices.size] = i; - } + lowest_indices = []; + lowest_use = level.character_index_cache[ prefix ][ group ][ 0 ]; + lowest_indices[ 0 ] = 0; + i = 1; + while ( i < level.character_index_cache[ prefix ][ group ].size ) + { + if ( level.character_index_cache[ prefix ][ group ][ i ] > lowest_use ) + { + i++; + continue; + } + else + { + if ( level.character_index_cache[ prefix ][ group ][ i ] < lowest_use ) + { + lowest_indices = []; + lowest_use = level.character_index_cache[ prefix ][ group ][ i ]; + } + lowest_indices[ lowest_indices.size ] = i; + } + i++; + } /# - assert( lowest_indices.size, "Tried to spawn a character but the lowest indices didn't exist" ); + assert( lowest_indices.size, "Tried to spawn a character but the lowest indices didn't exist" ); #/ - return random( lowest_indices ); + return random( lowest_indices ); } initialize_character_group( prefix, group, amount ) { - for ( i = 0; i < amount; i++ ) - level.character_index_cache[prefix][group][i] = 0; + i = 0; + while ( i < amount ) + { + level.character_index_cache[ prefix ][ group ][ i ] = 0; + i++; + } } random( array ) { - return array[randomint( array.size )]; + return array[ randomint( array.size ) ]; } diff --git a/Zombie Core/common_zm/codescripts/delete.gsc b/Zombie Core/common_zm/codescripts/delete.gsc index 67cd584..082155e 100644 --- a/Zombie Core/common_zm/codescripts/delete.gsc +++ b/Zombie Core/common_zm/codescripts/delete.gsc @@ -1,26 +1,23 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool main() { /# - assert( isdefined( self ) ); + assert( isDefined( self ) ); #/ - wait 0; - - if ( isdefined( self ) ) - { + wait 0; + if ( isDefined( self ) ) + { /# - if ( isdefined( self.classname ) ) - { - if ( self.classname == "trigger_once" || self.classname == "trigger_radius" || self.classname == "trigger_multiple" ) - { - println( "" ); - println( "*** trigger debug: delete.gsc is deleting trigger with ent#: " + self getentitynumber() + " at origin: " + self.origin ); - println( "" ); - } - } + if ( isDefined( self.classname ) ) + { + if ( self.classname != "trigger_once" || self.classname == "trigger_radius" && self.classname == "trigger_multiple" ) + { + println( "" ); + println( "*** trigger debug: delete.gsc is deleting trigger with ent#: " + self getentitynumber() + " at origin: " + self.origin ); + println( "" ); #/ - self delete(); - } + } + } + self delete(); + } } diff --git a/Zombie Core/common_zm/codescripts/struct.gsc b/Zombie Core/common_zm/codescripts/struct.gsc index d9c0839..8d47324 100644 --- a/Zombie Core/common_zm/codescripts/struct.gsc +++ b/Zombie Core/common_zm/codescripts/struct.gsc @@ -1,29 +1,41 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool initstructs() { - level.struct = []; + level.struct = []; } createstruct() { - struct = spawnstruct(); - level.struct[level.struct.size] = struct; - return struct; + struct = spawnstruct(); + level.struct[ level.struct.size ] = struct; + return struct; } findstruct( position ) { - foreach ( key, _ in level.struct_class_names ) - { - foreach ( val, s_array in level.struct_class_names[key] ) - { - foreach ( struct in s_array ) - { - if ( distancesquared( struct.origin, position ) < 1 ) - return struct; - } - } - } + _a20 = level.struct_class_names; + key = getFirstArrayKey( _a20 ); + while ( isDefined( key ) ) + { + _ = _a20[ key ]; + _a22 = level.struct_class_names[ key ]; + val = getFirstArrayKey( _a22 ); + while ( isDefined( val ) ) + { + s_array = _a22[ val ]; + _a24 = s_array; + _k24 = getFirstArrayKey( _a24 ); + while ( isDefined( _k24 ) ) + { + struct = _a24[ _k24 ]; + if ( distancesquared( struct.origin, position ) < 1 ) + { + return struct; + } + _k24 = getNextArrayKey( _a24, _k24 ); + } + val = getNextArrayKey( _a22, val ); + } + key = getNextArrayKey( _a20, key ); + } } diff --git a/Zombie Core/common_zm/maps/mp/_serverfaceanim_mp.gsc b/Zombie Core/common_zm/maps/mp/_serverfaceanim_mp.gsc index 57936ef..bbd52a4 100644 --- a/Zombie Core/common_zm/maps/mp/_serverfaceanim_mp.gsc +++ b/Zombie Core/common_zm/maps/mp/_serverfaceanim_mp.gsc @@ -1,61 +1,56 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - for (;;) - { - level waittill( "connecting", player ); - - player thread onplayerspawned(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self thread init_serverfaceanim(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread init_serverfaceanim(); + } } init_serverfaceanim() { - self.do_face_anims = 1; - - if ( !isdefined( level.face_event_handler ) ) - { - level.face_event_handler = spawnstruct(); - level.face_event_handler.events = []; - level.face_event_handler.events["death"] = "face_death"; - level.face_event_handler.events["grenade danger"] = "face_alert"; - level.face_event_handler.events["bulletwhizby"] = "face_alert"; - level.face_event_handler.events["projectile_impact"] = "face_alert"; - level.face_event_handler.events["explode"] = "face_alert"; - level.face_event_handler.events["alert"] = "face_alert"; - level.face_event_handler.events["shoot"] = "face_shoot_single"; - level.face_event_handler.events["melee"] = "face_melee"; - level.face_event_handler.events["damage"] = "face_pain"; - level thread wait_for_face_event(); - } + self.do_face_anims = 1; + if ( !isDefined( level.face_event_handler ) ) + { + level.face_event_handler = spawnstruct(); + level.face_event_handler.events = []; + level.face_event_handler.events[ "death" ] = "face_death"; + level.face_event_handler.events[ "grenade danger" ] = "face_alert"; + level.face_event_handler.events[ "bulletwhizby" ] = "face_alert"; + level.face_event_handler.events[ "projectile_impact" ] = "face_alert"; + level.face_event_handler.events[ "explode" ] = "face_alert"; + level.face_event_handler.events[ "alert" ] = "face_alert"; + level.face_event_handler.events[ "shoot" ] = "face_shoot_single"; + level.face_event_handler.events[ "melee" ] = "face_melee"; + level.face_event_handler.events[ "damage" ] = "face_pain"; + level thread wait_for_face_event(); + } } wait_for_face_event() { - while ( true ) - { - level waittill( "face", face_notify, ent ); - - if ( isdefined( ent ) && isdefined( ent.do_face_anims ) && ent.do_face_anims ) - { - if ( isdefined( level.face_event_handler.events[face_notify] ) ) - ent sendfaceevent( level.face_event_handler.events[face_notify] ); - } - } + while ( 1 ) + { + level waittill( "face", face_notify, ent ); + if ( isDefined( ent ) && isDefined( ent.do_face_anims ) && ent.do_face_anims ) + { + if ( isDefined( level.face_event_handler.events[ face_notify ] ) ) + { + ent sendfaceevent( level.face_event_handler.events[ face_notify ] ); + } + } + } } diff --git a/Zombie Core/common_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc b/Zombie Core/common_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc index 9605ea7..f66f5ad 100644 --- a/Zombie Core/common_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc +++ b/Zombie Core/common_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc @@ -1,367 +1,378 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_laststand; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +#using_animtree( "zombie_cymbal_monkey" ); init() { - if ( !cymbal_monkey_exists() ) - return; + if ( !cymbal_monkey_exists() ) + { + return; + } /# - level.zombiemode_devgui_cymbal_monkey_give = ::player_give_cymbal_monkey; + level.zombiemode_devgui_cymbal_monkey_give = ::player_give_cymbal_monkey; #/ - level._effect["monkey_glow"] = loadfx( "maps/zombie/fx_zombie_monkey_light" ); - level._effect["grenade_samantha_steal"] = loadfx( "maps/zombie/fx_zmb_blackhole_trap_end" ); - level.cymbal_monkeys = []; - scriptmodelsuseanimtree( -1 ); + level._effect[ "monkey_glow" ] = loadfx( "maps/zombie/fx_zombie_monkey_light" ); + level._effect[ "grenade_samantha_steal" ] = loadfx( "maps/zombie/fx_zmb_blackhole_trap_end" ); + level.cymbal_monkeys = []; + scriptmodelsuseanimtree( -1 ); } player_give_cymbal_monkey() { - self giveweapon( "cymbal_monkey_zm" ); - self set_player_tactical_grenade( "cymbal_monkey_zm" ); - self thread player_handle_cymbal_monkey(); + self giveweapon( "cymbal_monkey_zm" ); + self set_player_tactical_grenade( "cymbal_monkey_zm" ); + self thread player_handle_cymbal_monkey(); } player_handle_cymbal_monkey() { - self notify( "starting_monkey_watch" ); - self endon( "disconnect" ); - self endon( "starting_monkey_watch" ); - attract_dist_diff = level.monkey_attract_dist_diff; - - if ( !isdefined( attract_dist_diff ) ) - attract_dist_diff = 45; - - num_attractors = level.num_monkey_attractors; - - if ( !isdefined( num_attractors ) ) - num_attractors = 96; - - max_attract_dist = level.monkey_attract_dist; - - if ( !isdefined( max_attract_dist ) ) - max_attract_dist = 1536; - - while ( true ) - { - grenade = get_thrown_monkey(); - self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff ); - wait 0.05; - } + self notify( "starting_monkey_watch" ); + self endon( "disconnect" ); + self endon( "starting_monkey_watch" ); + attract_dist_diff = level.monkey_attract_dist_diff; + if ( !isDefined( attract_dist_diff ) ) + { + attract_dist_diff = 45; + } + num_attractors = level.num_monkey_attractors; + if ( !isDefined( num_attractors ) ) + { + num_attractors = 96; + } + max_attract_dist = level.monkey_attract_dist; + if ( !isDefined( max_attract_dist ) ) + { + max_attract_dist = 1536; + } + while ( 1 ) + { + grenade = get_thrown_monkey(); + self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff ); + wait 0,05; + } } watch_for_dud( model ) { - self endon( "death" ); - - self waittill( "grenade_dud" ); - - model.dud = 1; - self playsound( "zmb_vox_monkey_scream" ); - self.monk_scream_vox = 1; - wait 3; - - if ( isdefined( model ) ) - model delete(); - - if ( isdefined( self ) ) - self delete(); + self endon( "death" ); + self waittill( "grenade_dud" ); + model.dud = 1; + self playsound( "zmb_vox_monkey_scream" ); + self.monk_scream_vox = 1; + wait 3; + if ( isDefined( model ) ) + { + model delete(); + } + if ( isDefined( self ) ) + { + self delete(); + } } -#using_animtree("zombie_cymbal_monkey"); - watch_for_emp( model ) { - self endon( "death" ); - - while ( true ) - { - level waittill( "emp_detonate", origin, radius ); - - if ( distancesquared( origin, self.origin ) < radius * radius ) - break; - } - - self.stun_fx = 1; - - if ( isdefined( level._equipment_emp_destroy_fx ) ) - playfx( level._equipment_emp_destroy_fx, self.origin + vectorscale( ( 0, 0, 1 ), 5.0 ), ( 0, randomfloat( 360 ), 0 ) ); - - wait 0.15; - self.attract_to_origin = 0; - self deactivate_zombie_point_of_interest(); - model clearanim( %o_monkey_bomb, 0 ); - wait 1; - self detonate(); - wait 1; - - if ( isdefined( model ) ) - model delete(); - - if ( isdefined( self ) ) - self delete(); + self endon( "death" ); + while ( 1 ) + { + level waittill( "emp_detonate", origin, radius ); + if ( distancesquared( origin, self.origin ) < ( radius * radius ) ) + { + break; + } + else + { + } + } + self.stun_fx = 1; + if ( isDefined( level._equipment_emp_destroy_fx ) ) + { + playfx( level._equipment_emp_destroy_fx, self.origin + vectorScale( ( 0, 0, 1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) ); + } + wait 0,15; + self.attract_to_origin = 0; + self deactivate_zombie_point_of_interest(); + model clearanim( %o_monkey_bomb, 0 ); + wait 1; + self detonate(); + wait 1; + if ( isDefined( model ) ) + { + model delete(); + } + if ( isDefined( self ) ) + { + self delete(); + } } player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff ) { - self endon( "disconnect" ); - self endon( "starting_monkey_watch" ); - - if ( isdefined( grenade ) ) - { - grenade endon( "death" ); - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - grenade delete(); - return; - } - - grenade hide(); - model = spawn( "script_model", grenade.origin ); - model setmodel( "weapon_zombie_monkey_bomb" ); - model useanimtree( -1 ); - model linkto( grenade ); - model.angles = grenade.angles; - model thread monkey_cleanup( grenade ); - grenade thread watch_for_dud( model ); - grenade thread watch_for_emp( model ); - info = spawnstruct(); - info.sound_attractors = []; - grenade thread monitor_zombie_groans( info ); - - grenade waittill( "stationary" ); - - if ( isdefined( level.grenade_planted ) ) - self thread [[ level.grenade_planted ]]( grenade, model ); - - if ( isdefined( grenade ) ) - { - if ( isdefined( model ) ) - { - model setanim( %o_monkey_bomb ); - - if ( !( isdefined( grenade.backlinked ) && grenade.backlinked ) ) - { - model unlink(); - model.origin = grenade.origin; - model.angles = grenade.angles; - } - } - - grenade resetmissiledetonationtime(); - playfxontag( level._effect["monkey_glow"], model, "origin_animate_jnt" ); - valid_poi = check_point_in_active_zone( grenade.origin ); - - if ( valid_poi ) - { - grenade create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 ); - grenade.attract_to_origin = 1; - grenade thread create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff ); - grenade thread wait_for_attractor_positions_complete(); - grenade thread do_monkey_sound( model, info ); - level.cymbal_monkeys[level.cymbal_monkeys.size] = grenade; - } - else - { - grenade.script_noteworthy = undefined; - level thread grenade_stolen_by_sam( grenade, model ); - } - } - else - { - grenade.script_noteworthy = undefined; - level thread grenade_stolen_by_sam( grenade, model ); - } - } + self endon( "disconnect" ); + self endon( "starting_monkey_watch" ); + if ( isDefined( grenade ) ) + { + grenade endon( "death" ); + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + grenade delete(); + return; + } + grenade hide(); + model = spawn( "script_model", grenade.origin ); + model setmodel( "weapon_zombie_monkey_bomb" ); + model useanimtree( -1 ); + model linkto( grenade ); + model.angles = grenade.angles; + model thread monkey_cleanup( grenade ); + grenade thread watch_for_dud( model ); + grenade thread watch_for_emp( model ); + info = spawnstruct(); + info.sound_attractors = []; + grenade thread monitor_zombie_groans( info ); + grenade waittill( "stationary" ); + if ( isDefined( level.grenade_planted ) ) + { + self thread [[ level.grenade_planted ]]( grenade, model ); + } + if ( isDefined( grenade ) ) + { + if ( isDefined( model ) ) + { + model setanim( %o_monkey_bomb ); + if ( isDefined( grenade.backlinked ) && !grenade.backlinked ) + { + model unlink(); + model.origin = grenade.origin; + model.angles = grenade.angles; + } + } + grenade resetmissiledetonationtime(); + playfxontag( level._effect[ "monkey_glow" ], model, "origin_animate_jnt" ); + valid_poi = check_point_in_active_zone( grenade.origin ); + if ( valid_poi ) + { + grenade create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 ); + grenade.attract_to_origin = 1; + grenade thread create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff ); + grenade thread wait_for_attractor_positions_complete(); + grenade thread do_monkey_sound( model, info ); + level.cymbal_monkeys[ level.cymbal_monkeys.size ] = grenade; + } + else + { + grenade.script_noteworthy = undefined; + level thread grenade_stolen_by_sam( grenade, model ); + } + return; + } + else + { + grenade.script_noteworthy = undefined; + level thread grenade_stolen_by_sam( grenade, model ); + } + } } grenade_stolen_by_sam( ent_grenade, ent_model ) { - if ( !isdefined( ent_model ) ) - return; - - direction = ent_model.origin; - direction = ( direction[1], direction[0], 0 ); - - if ( direction[1] < 0 || direction[0] > 0 && direction[1] > 0 ) - direction = ( direction[0], direction[1] * -1, 0 ); - else if ( direction[0] < 0 ) - direction = ( direction[0] * -1, direction[1], 0 ); - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isalive( players[i] ) ) - players[i] playlocalsound( level.zmb_laugh_alias ); - } - - playfxontag( level._effect["grenade_samantha_steal"], ent_model, "tag_origin" ); - ent_model movez( 60, 1.0, 0.25, 0.25 ); - ent_model vibrate( direction, 1.5, 2.5, 1.0 ); - - ent_model waittill( "movedone" ); - - ent_model delete(); - - if ( isdefined( ent_grenade ) ) - ent_grenade delete(); + if ( !isDefined( ent_model ) ) + { + return; + } + direction = ent_model.origin; + direction = ( direction[ 1 ], direction[ 0 ], 0 ); + if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 ) + { + direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 ); + } + else + { + if ( direction[ 0 ] < 0 ) + { + direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 ); + } + } + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( isalive( players[ i ] ) ) + { + players[ i ] playlocalsound( level.zmb_laugh_alias ); + } + i++; + } + playfxontag( level._effect[ "grenade_samantha_steal" ], ent_model, "tag_origin" ); + ent_model movez( 60, 1, 0,25, 0,25 ); + ent_model vibrate( direction, 1,5, 2,5, 1 ); + ent_model waittill( "movedone" ); + ent_model delete(); + if ( isDefined( ent_grenade ) ) + { + ent_grenade delete(); + } } wait_for_attractor_positions_complete() { - self waittill( "attractor_positions_generated" ); - - self.attract_to_origin = 0; + self waittill( "attractor_positions_generated" ); + self.attract_to_origin = 0; } monkey_cleanup( parent ) { - while ( true ) - { - if ( !isdefined( parent ) ) - { - if ( isdefined( self ) && ( isdefined( self.dud ) && self.dud ) ) - wait 6; - - self_delete(); - return; - } - - wait 0.05; - } + while ( 1 ) + { + if ( !isDefined( parent ) ) + { + if ( isDefined( self ) && isDefined( self.dud ) && self.dud ) + { + wait 6; + } + self_delete(); + return; + } + wait 0,05; + } } do_monkey_sound( model, info ) { - self.monk_scream_vox = 0; - - if ( isdefined( level.grenade_safe_to_bounce ) ) - { - if ( ![[ level.grenade_safe_to_bounce ]]( self.owner, "cymbal_monkey_zm" ) ) - { - self playsound( "zmb_vox_monkey_scream" ); - self.monk_scream_vox = 1; - } - } - - if ( !self.monk_scream_vox && level.music_override == 0 ) - self playsound( "zmb_monkey_song" ); - - if ( !self.monk_scream_vox ) - self thread play_delayed_explode_vox(); - - self waittill( "explode", position ); - - level notify( "grenade_exploded", position, 100, 5000, 450 ); - monkey_index = -1; - - for ( i = 0; i < level.cymbal_monkeys.size; i++ ) - { - if ( !isdefined( level.cymbal_monkeys[i] ) ) - { - monkey_index = i; - break; - } - } - - if ( monkey_index >= 0 ) - arrayremoveindex( level.cymbal_monkeys, monkey_index ); - - if ( isdefined( model ) ) - model clearanim( %o_monkey_bomb, 0.2 ); - - for ( i = 0; i < info.sound_attractors.size; i++ ) - { - if ( isdefined( info.sound_attractors[i] ) ) - info.sound_attractors[i] notify( "monkey_blown_up" ); - } + self.monk_scream_vox = 0; + if ( isDefined( level.grenade_safe_to_bounce ) ) + { + if ( !( [[ level.grenade_safe_to_bounce ]]( self.owner, "cymbal_monkey_zm" ) ) ) + { + self playsound( "zmb_vox_monkey_scream" ); + self.monk_scream_vox = 1; + } + } + if ( !self.monk_scream_vox && level.music_override == 0 ) + { + self playsound( "zmb_monkey_song" ); + } + if ( !self.monk_scream_vox ) + { + self thread play_delayed_explode_vox(); + } + self waittill( "explode", position ); + level notify( "grenade_exploded" ); + monkey_index = -1; + i = 0; + while ( i < level.cymbal_monkeys.size ) + { + if ( !isDefined( level.cymbal_monkeys[ i ] ) ) + { + monkey_index = i; + break; + } + else + { + i++; + } + } + if ( monkey_index >= 0 ) + { + arrayremoveindex( level.cymbal_monkeys, monkey_index ); + } + if ( isDefined( model ) ) + { + model clearanim( %o_monkey_bomb, 0,2 ); + } + i = 0; + while ( i < info.sound_attractors.size ) + { + if ( isDefined( info.sound_attractors[ i ] ) ) + { + info.sound_attractors[ i ] notify( "monkey_blown_up" ); + } + i++; + } } play_delayed_explode_vox() { - wait 6.5; - - if ( isdefined( self ) ) - self playsound( "zmb_vox_monkey_explode" ); + wait 6,5; + if ( isDefined( self ) ) + { + self playsound( "zmb_vox_monkey_explode" ); + } } get_thrown_monkey() { - self endon( "disconnect" ); - self endon( "starting_monkey_watch" ); - - while ( true ) - { - self waittill( "grenade_fire", grenade, weapname ); - - if ( weapname == "cymbal_monkey_zm" ) - { - grenade.use_grenade_special_long_bookmark = 1; - grenade.grenade_multiattack_bookmark_count = 1; - return grenade; - } - - wait 0.05; - } + self endon( "disconnect" ); + self endon( "starting_monkey_watch" ); + while ( 1 ) + { + self waittill( "grenade_fire", grenade, weapname ); + if ( weapname == "cymbal_monkey_zm" ) + { + grenade.use_grenade_special_long_bookmark = 1; + grenade.grenade_multiattack_bookmark_count = 1; + return grenade; + } + wait 0,05; + } } monitor_zombie_groans( info ) { - self endon( "explode" ); - - while ( true ) - { - if ( !isdefined( self ) ) - return; - - if ( !isdefined( self.attractor_array ) ) - { - wait 0.05; - continue; - } - - for ( i = 0; i < self.attractor_array.size; i++ ) - { - if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[i] ) ) - { - if ( isdefined( self.origin ) && isdefined( self.attractor_array[i].origin ) ) - { - if ( distancesquared( self.origin, self.attractor_array[i].origin ) < 250000 ) - { - info.sound_attractors[info.sound_attractors.size] = self.attractor_array[i]; - self.attractor_array[i] thread play_zombie_groans(); - } - } - } - } - - wait 0.05; - } + self endon( "explode" ); + while ( 1 ) + { + if ( !isDefined( self ) ) + { + return; + } + while ( !isDefined( self.attractor_array ) ) + { + wait 0,05; + } + i = 0; + while ( i < self.attractor_array.size ) + { + if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[ i ] ) ) + { + if ( isDefined( self.origin ) && isDefined( self.attractor_array[ i ].origin ) ) + { + if ( distancesquared( self.origin, self.attractor_array[ i ].origin ) < 250000 ) + { + info.sound_attractors[ info.sound_attractors.size ] = self.attractor_array[ i ]; + self.attractor_array[ i ] thread play_zombie_groans(); + } + } + } + i++; + } + wait 0,05; + } } play_zombie_groans() { - self endon( "death" ); - self endon( "monkey_blown_up" ); - - while ( true ) - { - if ( isdefined( self ) ) - { - self playsound( "zmb_vox_zombie_groan" ); - wait( randomfloatrange( 2, 3 ) ); - } - else - return; - } + self endon( "death" ); + self endon( "monkey_blown_up" ); + while ( 1 ) + { + if ( isDefined( self ) ) + { + self playsound( "zmb_vox_zombie_groan" ); + wait randomfloatrange( 2, 3 ); + continue; + } + else + { + return; + } + } } cymbal_monkey_exists() { - return isdefined( level.zombie_weapons["cymbal_monkey_zm"] ); + return isDefined( level.zombie_weapons[ "cymbal_monkey_zm" ] ); } diff --git a/Zombie Core/common_zm/maps/mp/zombies/_zm_weap_thundergun.gsc b/Zombie Core/common_zm/maps/mp/zombies/_zm_weap_thundergun.gsc index de25942..4690759 100644 --- a/Zombie Core/common_zm/maps/mp/zombies/_zm_weap_thundergun.gsc +++ b/Zombie Core/common_zm/maps/mp/zombies/_zm_weap_thundergun.gsc @@ -1,379 +1,396 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_net; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_score; -#include maps\mp\animscripts\zm_death; -#include maps\mp\zombies\_zm_audio; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/animscripts/zm_death; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; init() { - if ( !maps\mp\zombies\_zm_weapons::is_weapon_included( "thundergun_zm" ) ) - return; - - level._effect["thundergun_viewmodel_power_cell1"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" ); - level._effect["thundergun_viewmodel_power_cell2"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" ); - level._effect["thundergun_viewmodel_power_cell3"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" ); - level._effect["thundergun_viewmodel_steam"] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" ); - level._effect["thundergun_viewmodel_power_cell1_upgraded"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" ); - level._effect["thundergun_viewmodel_power_cell2_upgraded"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" ); - level._effect["thundergun_viewmodel_power_cell3_upgraded"] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" ); - level._effect["thundergun_viewmodel_steam_upgraded"] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" ); - level._effect["thundergun_knockdown_ground"] = loadfx( "weapon/thunder_gun/fx_thundergun_knockback_ground" ); - level._effect["thundergun_smoke_cloud"] = loadfx( "weapon/thunder_gun/fx_thundergun_smoke_cloud" ); - set_zombie_var( "thundergun_cylinder_radius", 180 ); - set_zombie_var( "thundergun_fling_range", 480 ); - set_zombie_var( "thundergun_gib_range", 900 ); - set_zombie_var( "thundergun_gib_damage", 75 ); - set_zombie_var( "thundergun_knockdown_range", 1200 ); - set_zombie_var( "thundergun_knockdown_damage", 15 ); - level.thundergun_gib_refs = []; - level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "guts"; - level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "right_arm"; - level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "left_arm"; - level.basic_zombie_thundergun_knockdown = ::zombie_knockdown; + if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "thundergun_zm" ) ) + { + return; + } + level._effect[ "thundergun_viewmodel_power_cell1" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" ); + level._effect[ "thundergun_viewmodel_power_cell2" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" ); + level._effect[ "thundergun_viewmodel_power_cell3" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" ); + level._effect[ "thundergun_viewmodel_steam" ] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" ); + level._effect[ "thundergun_viewmodel_power_cell1_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" ); + level._effect[ "thundergun_viewmodel_power_cell2_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" ); + level._effect[ "thundergun_viewmodel_power_cell3_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" ); + level._effect[ "thundergun_viewmodel_steam_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" ); + level._effect[ "thundergun_knockdown_ground" ] = loadfx( "weapon/thunder_gun/fx_thundergun_knockback_ground" ); + level._effect[ "thundergun_smoke_cloud" ] = loadfx( "weapon/thunder_gun/fx_thundergun_smoke_cloud" ); + set_zombie_var( "thundergun_cylinder_radius", 180 ); + set_zombie_var( "thundergun_fling_range", 480 ); + set_zombie_var( "thundergun_gib_range", 900 ); + set_zombie_var( "thundergun_gib_damage", 75 ); + set_zombie_var( "thundergun_knockdown_range", 1200 ); + set_zombie_var( "thundergun_knockdown_damage", 15 ); + level.thundergun_gib_refs = []; + level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "guts"; + level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "right_arm"; + level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "left_arm"; + level.basic_zombie_thundergun_knockdown = ::zombie_knockdown; /# - level thread thundergun_devgui_dvar_think(); + level thread thundergun_devgui_dvar_think(); #/ - onplayerconnect_callback( ::thundergun_on_player_connect ); + onplayerconnect_callback( ::thundergun_on_player_connect ); } thundergun_devgui_dvar_think() { /# - if ( !maps\mp\zombies\_zm_weapons::is_weapon_included( "thundergun_zm" ) ) - return; - - setdvar( "scr_thundergun_cylinder_radius", level.zombie_vars["thundergun_cylinder_radius"] ); - setdvar( "scr_thundergun_fling_range", level.zombie_vars["thundergun_fling_range"] ); - setdvar( "scr_thundergun_gib_range", level.zombie_vars["thundergun_gib_range"] ); - setdvar( "scr_thundergun_gib_damage", level.zombie_vars["thundergun_gib_damage"] ); - setdvar( "scr_thundergun_knockdown_range", level.zombie_vars["thundergun_knockdown_range"] ); - setdvar( "scr_thundergun_knockdown_damage", level.zombie_vars["thundergun_knockdown_damage"] ); - - for (;;) - { - level.zombie_vars["thundergun_cylinder_radius"] = getdvarint( _hash_DEA6F730 ); - level.zombie_vars["thundergun_fling_range"] = getdvarint( _hash_16044A2B ); - level.zombie_vars["thundergun_gib_range"] = getdvarint( _hash_F5270E6D ); - level.zombie_vars["thundergun_gib_damage"] = getdvarint( _hash_795FFDFF ); - level.zombie_vars["thundergun_knockdown_range"] = getdvarint( _hash_2721E469 ); - level.zombie_vars["thundergun_knockdown_damage"] = getdvarint( _hash_EAB5937B ); - wait 0.5; - } + if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "thundergun_zm" ) ) + { + return; + } + setdvar( "scr_thundergun_cylinder_radius", level.zombie_vars[ "thundergun_cylinder_radius" ] ); + setdvar( "scr_thundergun_fling_range", level.zombie_vars[ "thundergun_fling_range" ] ); + setdvar( "scr_thundergun_gib_range", level.zombie_vars[ "thundergun_gib_range" ] ); + setdvar( "scr_thundergun_gib_damage", level.zombie_vars[ "thundergun_gib_damage" ] ); + setdvar( "scr_thundergun_knockdown_range", level.zombie_vars[ "thundergun_knockdown_range" ] ); + setdvar( "scr_thundergun_knockdown_damage", level.zombie_vars[ "thundergun_knockdown_damage" ] ); + for ( ;; ) + { + level.zombie_vars[ "thundergun_cylinder_radius" ] = getDvarInt( "scr_thundergun_cylinder_radius" ); + level.zombie_vars[ "thundergun_fling_range" ] = getDvarInt( "scr_thundergun_fling_range" ); + level.zombie_vars[ "thundergun_gib_range" ] = getDvarInt( "scr_thundergun_gib_range" ); + level.zombie_vars[ "thundergun_gib_damage" ] = getDvarInt( "scr_thundergun_gib_damage" ); + level.zombie_vars[ "thundergun_knockdown_range" ] = getDvarInt( "scr_thundergun_knockdown_range" ); + level.zombie_vars[ "thundergun_knockdown_damage" ] = getDvarInt( "scr_thundergun_knockdown_damage" ); + wait 0,5; #/ + } } thundergun_on_player_connect() { - self thread wait_for_thundergun_fired(); + self thread wait_for_thundergun_fired(); } wait_for_thundergun_fired() { - self endon( "disconnect" ); - - self waittill( "spawned_player" ); - - for (;;) - { - self waittill( "weapon_fired" ); - - currentweapon = self getcurrentweapon(); - - if ( currentweapon == "thundergun_zm" || currentweapon == "thundergun_upgraded_zm" ) - { - self thread thundergun_fired(); - view_pos = self gettagorigin( "tag_flash" ) - self getplayerviewheight(); - view_angles = self gettagangles( "tag_flash" ); - playfx( level._effect["thundergun_smoke_cloud"], view_pos, anglestoforward( view_angles ), anglestoup( view_angles ) ); - } - } + self endon( "disconnect" ); + self waittill( "spawned_player" ); + for ( ;; ) + { + self waittill( "weapon_fired" ); + currentweapon = self getcurrentweapon(); + if ( currentweapon == "thundergun_zm" || currentweapon == "thundergun_upgraded_zm" ) + { + self thread thundergun_fired(); + view_pos = self gettagorigin( "tag_flash" ) - self getplayerviewheight(); + view_angles = self gettagangles( "tag_flash" ); + playfx( level._effect[ "thundergun_smoke_cloud" ], view_pos, anglesToForward( view_angles ), anglesToUp( view_angles ) ); + } + } } thundergun_network_choke() { - level.thundergun_network_choke_count++; - - if ( !( level.thundergun_network_choke_count % 10 ) ) - { - wait_network_frame(); - wait_network_frame(); - wait_network_frame(); - } + level.thundergun_network_choke_count++; + if ( level.thundergun_network_choke_count % 10 ) + { + wait_network_frame(); + wait_network_frame(); + wait_network_frame(); + } } thundergun_fired() { - physicsexplosioncylinder( self.origin, 600, 240, 1 ); - - if ( !isdefined( level.thundergun_knockdown_enemies ) ) - { - level.thundergun_knockdown_enemies = []; - level.thundergun_knockdown_gib = []; - level.thundergun_fling_enemies = []; - level.thundergun_fling_vecs = []; - } - - self thundergun_get_enemies_in_range(); - level.thundergun_network_choke_count = 0; - - for ( i = 0; i < level.thundergun_fling_enemies.size; i++ ) - { - thundergun_network_choke(); - level.thundergun_fling_enemies[i] thread thundergun_fling_zombie( self, level.thundergun_fling_vecs[i], i ); - } - - for ( i = 0; i < level.thundergun_knockdown_enemies.size; i++ ) - { - thundergun_network_choke(); - level.thundergun_knockdown_enemies[i] thread thundergun_knockdown_zombie( self, level.thundergun_knockdown_gib[i] ); - } - - level.thundergun_knockdown_enemies = []; - level.thundergun_knockdown_gib = []; - level.thundergun_fling_enemies = []; - level.thundergun_fling_vecs = []; + physicsexplosioncylinder( self.origin, 600, 240, 1 ); + if ( !isDefined( level.thundergun_knockdown_enemies ) ) + { + level.thundergun_knockdown_enemies = []; + level.thundergun_knockdown_gib = []; + level.thundergun_fling_enemies = []; + level.thundergun_fling_vecs = []; + } + self thundergun_get_enemies_in_range(); + level.thundergun_network_choke_count = 0; + i = 0; + while ( i < level.thundergun_fling_enemies.size ) + { + thundergun_network_choke(); + level.thundergun_fling_enemies[ i ] thread thundergun_fling_zombie( self, level.thundergun_fling_vecs[ i ], i ); + i++; + } + i = 0; + while ( i < level.thundergun_knockdown_enemies.size ) + { + thundergun_network_choke(); + level.thundergun_knockdown_enemies[ i ] thread thundergun_knockdown_zombie( self, level.thundergun_knockdown_gib[ i ] ); + i++; + } + level.thundergun_knockdown_enemies = []; + level.thundergun_knockdown_gib = []; + level.thundergun_fling_enemies = []; + level.thundergun_fling_vecs = []; } thundergun_get_enemies_in_range() { - view_pos = self getweaponmuzzlepoint(); - zombies = get_array_of_closest( view_pos, get_round_enemy_array(), undefined, undefined, level.zombie_vars["thundergun_knockdown_range"] ); - - if ( !isdefined( zombies ) ) - return; - - knockdown_range_squared = level.zombie_vars["thundergun_knockdown_range"] * level.zombie_vars["thundergun_knockdown_range"]; - gib_range_squared = level.zombie_vars["thundergun_gib_range"] * level.zombie_vars["thundergun_gib_range"]; - fling_range_squared = level.zombie_vars["thundergun_fling_range"] * level.zombie_vars["thundergun_fling_range"]; - cylinder_radius_squared = level.zombie_vars["thundergun_cylinder_radius"] * level.zombie_vars["thundergun_cylinder_radius"]; - forward_view_angles = self getweaponforwarddir(); - end_pos = view_pos + vectorscale( forward_view_angles, level.zombie_vars["thundergun_knockdown_range"] ); + view_pos = self getweaponmuzzlepoint(); + zombies = get_array_of_closest( view_pos, get_round_enemy_array(), undefined, undefined, level.zombie_vars[ "thundergun_knockdown_range" ] ); + if ( !isDefined( zombies ) ) + { + return; + } + knockdown_range_squared = level.zombie_vars[ "thundergun_knockdown_range" ] * level.zombie_vars[ "thundergun_knockdown_range" ]; + gib_range_squared = level.zombie_vars[ "thundergun_gib_range" ] * level.zombie_vars[ "thundergun_gib_range" ]; + fling_range_squared = level.zombie_vars[ "thundergun_fling_range" ] * level.zombie_vars[ "thundergun_fling_range" ]; + cylinder_radius_squared = level.zombie_vars[ "thundergun_cylinder_radius" ] * level.zombie_vars[ "thundergun_cylinder_radius" ]; + forward_view_angles = self getweaponforwarddir(); + end_pos = view_pos + vectorScale( forward_view_angles, level.zombie_vars[ "thundergun_knockdown_range" ] ); /# - if ( 2 == getdvarint( _hash_AAC84AD6 ) ) - { - near_circle_pos = view_pos + vectorscale( forward_view_angles, 2 ); - circle( near_circle_pos, level.zombie_vars["thundergun_cylinder_radius"], ( 1, 0, 0 ), 0, 0, 100 ); - line( near_circle_pos, end_pos, ( 0, 0, 1 ), 1, 0, 100 ); - circle( end_pos, level.zombie_vars["thundergun_cylinder_radius"], ( 1, 0, 0 ), 0, 0, 100 ); - } + if ( getDvarInt( #"AAC84AD6" ) == 2 ) + { + near_circle_pos = view_pos + vectorScale( forward_view_angles, 2 ); + circle( near_circle_pos, level.zombie_vars[ "thundergun_cylinder_radius" ], ( 0, 0, 1 ), 0, 0, 100 ); + line( near_circle_pos, end_pos, ( 0, 0, 1 ), 1, 0, 100 ); + circle( end_pos, level.zombie_vars[ "thundergun_cylinder_radius" ], ( 0, 0, 1 ), 0, 0, 100 ); #/ - for ( i = 0; i < zombies.size; i++ ) - { - if ( !isdefined( zombies[i] ) || !isalive( zombies[i] ) ) - continue; - - test_origin = zombies[i] getcentroid(); - test_range_squared = distancesquared( view_pos, test_origin ); - - if ( test_range_squared > knockdown_range_squared ) - { - zombies[i] thundergun_debug_print( "range", ( 1, 0, 0 ) ); - return; - } - - normal = vectornormalize( test_origin - view_pos ); - dot = vectordot( forward_view_angles, normal ); - - if ( 0 > dot ) - { - zombies[i] thundergun_debug_print( "dot", ( 1, 0, 0 ) ); - continue; - } - - radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin ); - - if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared ) - { - zombies[i] thundergun_debug_print( "cylinder", ( 1, 0, 0 ) ); - continue; - } - - if ( 0 == zombies[i] damageconetrace( view_pos, self ) ) - { - zombies[i] thundergun_debug_print( "cone", ( 1, 0, 0 ) ); - continue; - } - - if ( test_range_squared < fling_range_squared ) - { - level.thundergun_fling_enemies[level.thundergun_fling_enemies.size] = zombies[i]; - dist_mult = ( fling_range_squared - test_range_squared ) / fling_range_squared; - fling_vec = vectornormalize( test_origin - view_pos ); - - if ( 5000 < test_range_squared ) - fling_vec += vectornormalize( test_origin - radial_origin ); - - fling_vec = ( fling_vec[0], fling_vec[1], abs( fling_vec[2] ) ); - fling_vec = vectorscale( fling_vec, 100 + 100 * dist_mult ); - level.thundergun_fling_vecs[level.thundergun_fling_vecs.size] = fling_vec; - zombies[i] thread setup_thundergun_vox( self, 1, 0, 0 ); - continue; - } - - if ( test_range_squared < gib_range_squared ) - { - level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i]; - level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = 1; - zombies[i] thread setup_thundergun_vox( self, 0, 1, 0 ); - continue; - } - - level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i]; - level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = 0; - zombies[i] thread setup_thundergun_vox( self, 0, 0, 1 ); - } + } + i = 0; + while ( i < zombies.size ) + { + if ( !isDefined( zombies[ i ] ) || !isalive( zombies[ i ] ) ) + { + i++; + continue; + } + else + { + test_origin = zombies[ i ] getcentroid(); + test_range_squared = distancesquared( view_pos, test_origin ); + if ( test_range_squared > knockdown_range_squared ) + { + zombies[ i ] thundergun_debug_print( "range", ( 0, 0, 1 ) ); + return; + } + normal = vectornormalize( test_origin - view_pos ); + dot = vectordot( forward_view_angles, normal ); + if ( dot <= 0 ) + { + zombies[ i ] thundergun_debug_print( "dot", ( 0, 0, 1 ) ); + i++; + continue; + } + else radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin ); + if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared ) + { + zombies[ i ] thundergun_debug_print( "cylinder", ( 0, 0, 1 ) ); + i++; + continue; + } + else if ( zombies[ i ] damageconetrace( view_pos, self ) == 0 ) + { + zombies[ i ] thundergun_debug_print( "cone", ( 0, 0, 1 ) ); + i++; + continue; + } + else if ( test_range_squared < fling_range_squared ) + { + level.thundergun_fling_enemies[ level.thundergun_fling_enemies.size ] = zombies[ i ]; + dist_mult = ( fling_range_squared - test_range_squared ) / fling_range_squared; + fling_vec = vectornormalize( test_origin - view_pos ); + if ( test_range_squared >= 5000 ) + { + fling_vec += vectornormalize( test_origin - radial_origin ); + } + fling_vec = ( fling_vec[ 0 ], fling_vec[ 1 ], abs( fling_vec[ 2 ] ) ); + fling_vec = vectorScale( fling_vec, 100 + ( 100 * dist_mult ) ); + level.thundergun_fling_vecs[ level.thundergun_fling_vecs.size ] = fling_vec; + zombies[ i ] thread setup_thundergun_vox( self, 1, 0, 0 ); + i++; + continue; + } + else if ( test_range_squared < gib_range_squared ) + { + level.thundergun_knockdown_enemies[ level.thundergun_knockdown_enemies.size ] = zombies[ i ]; + level.thundergun_knockdown_gib[ level.thundergun_knockdown_gib.size ] = 1; + zombies[ i ] thread setup_thundergun_vox( self, 0, 1, 0 ); + i++; + continue; + } + else + { + level.thundergun_knockdown_enemies[ level.thundergun_knockdown_enemies.size ] = zombies[ i ]; + level.thundergun_knockdown_gib[ level.thundergun_knockdown_gib.size ] = 0; + zombies[ i ] thread setup_thundergun_vox( self, 0, 0, 1 ); + } + } + i++; + } } thundergun_debug_print( msg, color ) { /# - if ( !getdvarint( _hash_AAC84AD6 ) ) - return; - - if ( !isdefined( color ) ) - color = ( 1, 1, 1 ); - - print3d( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), msg, color, 1, 1, 40 ); + if ( !getDvarInt( #"AAC84AD6" ) ) + { + return; + } + if ( !isDefined( color ) ) + { + color = ( 0, 0, 1 ); + } + print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 ); #/ } thundergun_fling_zombie( player, fling_vec, index ) { - if ( !isdefined( self ) || !isalive( self ) ) - return; - - if ( isdefined( self.thundergun_fling_func ) ) - { - self [[ self.thundergun_fling_func ]]( player ); - return; - } - - self dodamage( self.health + 666, player.origin, player ); - - if ( self.health <= 0 ) - { - points = 10; - - if ( !index ) - points = maps\mp\zombies\_zm_score::get_zombie_death_player_points(); - else if ( 1 == index ) - points = 30; - - player maps\mp\zombies\_zm_score::player_add_points( "thundergun_fling", points ); - self startragdoll(); - self launchragdoll( fling_vec ); - self.thundergun_death = 1; - } + if ( !isDefined( self ) || !isalive( self ) ) + { + return; + } + if ( isDefined( self.thundergun_fling_func ) ) + { + self [[ self.thundergun_fling_func ]]( player ); + return; + } + self dodamage( self.health + 666, player.origin, player ); + if ( self.health <= 0 ) + { + points = 10; + if ( !index ) + { + points = maps/mp/zombies/_zm_score::get_zombie_death_player_points(); + } + else + { + if ( index == 1 ) + { + points = 30; + } + } + player maps/mp/zombies/_zm_score::player_add_points( "thundergun_fling", points ); + self startragdoll(); + self launchragdoll( fling_vec ); + self.thundergun_death = 1; + } } zombie_knockdown( player, gib ) { - if ( gib && !self.gibbed ) - { - self.a.gib_ref = random( level.thundergun_gib_refs ); - self thread maps\mp\animscripts\zm_death::do_gib(); - } - - damage = level.zombie_vars["thundergun_knockdown_damage"]; - - if ( isdefined( level.override_thundergun_damage_func ) ) - self [[ level.override_thundergun_damage_func ]]( player, gib ); - else - { - self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks; - self dodamage( damage, player.origin, player ); - } + if ( gib && !self.gibbed ) + { + self.a.gib_ref = random( level.thundergun_gib_refs ); + self thread maps/mp/animscripts/zm_death::do_gib(); + } + damage = level.zombie_vars[ "thundergun_knockdown_damage" ]; + if ( isDefined( level.override_thundergun_damage_func ) ) + { + self [[ level.override_thundergun_damage_func ]]( player, gib ); + } + else + { + self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks; + self dodamage( damage, player.origin, player ); + } } thundergun_knockdown_zombie( player, gib ) { - self endon( "death" ); - playsoundatposition( "vox_thundergun_forcehit", self.origin ); - playsoundatposition( "wpn_thundergun_proj_impact", self.origin ); - - if ( !isdefined( self ) || !isalive( self ) ) - return; - - if ( isdefined( self.thundergun_knockdown_func ) ) - self [[ self.thundergun_knockdown_func ]]( player, gib ); - else - self dodamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player ); - - if ( gib ) - { - self.a.gib_ref = random( level.thundergun_gib_refs ); - self thread maps\mp\animscripts\zm_death::do_gib(); - } - - self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks; - self dodamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player ); - self playsound( "fly_thundergun_forcehit" ); + self endon( "death" ); + playsoundatposition( "vox_thundergun_forcehit", self.origin ); + playsoundatposition( "wpn_thundergun_proj_impact", self.origin ); + if ( !isDefined( self ) || !isalive( self ) ) + { + return; + } + if ( isDefined( self.thundergun_knockdown_func ) ) + { + self [[ self.thundergun_knockdown_func ]]( player, gib ); + } + else + { + self dodamage( level.zombie_vars[ "thundergun_knockdown_damage" ], player.origin, player ); + } + if ( gib ) + { + self.a.gib_ref = random( level.thundergun_gib_refs ); + self thread maps/mp/animscripts/zm_death::do_gib(); + } + self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks; + self dodamage( level.zombie_vars[ "thundergun_knockdown_damage" ], player.origin, player ); + self playsound( "fly_thundergun_forcehit" ); } handle_thundergun_pain_notetracks( note ) { - if ( note == "zombie_knockdown_ground_impact" ) - { - playfx( level._effect["thundergun_knockdown_ground"], self.origin, anglestoforward( self.angles ), anglestoup( self.angles ) ); - self playsound( "fly_thundergun_forcehit" ); - } + if ( note == "zombie_knockdown_ground_impact" ) + { + playfx( level._effect[ "thundergun_knockdown_ground" ], self.origin, anglesToForward( self.angles ), anglesToUp( self.angles ) ); + self playsound( "fly_thundergun_forcehit" ); + } } is_thundergun_damage() { - return isdefined( self.damageweapon ) && ( self.damageweapon == "thundergun_zm" || self.damageweapon == "thundergun_upgraded_zm" ) && ( self.damagemod != "MOD_GRENADE" && self.damagemod != "MOD_GRENADE_SPLASH" ); + if ( isDefined( self.damageweapon ) && self.damageweapon != "thundergun_zm" && self.damageweapon == "thundergun_upgraded_zm" ) + { + if ( self.damagemod != "MOD_GRENADE" ) + { + return self.damagemod != "MOD_GRENADE_SPLASH"; + } + } } enemy_killed_by_thundergun() { - return isdefined( self.thundergun_death ) && self.thundergun_death == 1; + if ( isDefined( self.thundergun_death ) ) + { + return self.thundergun_death == 1; + } } thundergun_sound_thread() { - self endon( "disconnect" ); - - self waittill( "spawned_player" ); - - for (;;) - { - result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" ); - - if ( !isdefined( result ) ) - continue; - - if ( ( result == "weapon_change" || result == "grenade_fire" ) && self getcurrentweapon() == "thundergun_zm" ) - { - self playloopsound( "tesla_idle", 0.25 ); - continue; - } - - self notify( "weap_away" ); - self stoploopsound( 0.25 ); - } + self endon( "disconnect" ); + self waittill( "spawned_player" ); + for ( ;; ) + { + result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" ); + if ( !isDefined( result ) ) + { + continue; + } + else if ( result != "weapon_change" && result == "grenade_fire" && self getcurrentweapon() == "thundergun_zm" ) + { + self playloopsound( "tesla_idle", 0,25 ); + continue; + } + else + { + self notify( "weap_away" ); + self stoploopsound( 0,25 ); + } + } } setup_thundergun_vox( player, fling, gib, knockdown ) { - if ( !isdefined( self ) || !isalive( self ) ) - return; - - if ( !fling && ( gib || knockdown ) ) - { - if ( 25 > randomintrange( 1, 100 ) ) - { - - } - } - - if ( fling ) - { - if ( 30 > randomintrange( 1, 100 ) ) - player maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "thundergun" ); - } + if ( !isDefined( self ) || !isalive( self ) ) + { + return; + } + if ( !fling || gib && knockdown ) + { + if ( randomintrange( 1, 100 ) <= 25 ) + { + } + } + if ( fling ) + { + if ( randomintrange( 1, 100 ) <= 30 ) + { + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "thundergun" ); + } + } } diff --git a/Zombie Core/patch_zm/codescripts/character_mp.gsc b/Zombie Core/patch_zm/codescripts/character_mp.gsc index 6086847..99f3c87 100644 --- a/Zombie Core/patch_zm/codescripts/character_mp.gsc +++ b/Zombie Core/patch_zm/codescripts/character_mp.gsc @@ -1,19 +1,21 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include codescripts\character; +#include codescripts/character; setmodelfromarray( a ) { - self setmodel( a[randomint( a.size )] ); + self setmodel( a[ randomint( a.size ) ] ); } precachemodelarray( a ) { - for ( i = 0; i < a.size; i++ ) - precachemodel( a[i] ); + i = 0; + while ( i < a.size ) + { + precachemodel( a[ i ] ); + i++; + } } attachfromarray( a ) { - self attach( codescripts\character::randomelement( a ), "", 1 ); + self attach( codescripts/character::randomelement( a ), "", 1 ); } diff --git a/Zombie Core/patch_zm/common_scripts/utility.gsc b/Zombie Core/patch_zm/common_scripts/utility.gsc index cea261c..27d067e 100644 --- a/Zombie Core/patch_zm/common_scripts/utility.gsc +++ b/Zombie Core/patch_zm/common_scripts/utility.gsc @@ -1,1739 +1,2012 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool init_session_mode_flags() { - level.gamemode_public_match = 0; - level.gamemode_private_match = 1; - level.gamemode_local_splitscreen = 2; - level.gamemode_wager_match = 3; - level.gamemode_theater = 5; - level.gamemode_league_match = 6; - level.gamemode_rts = 7; - level.language = getdvar( "language" ); + level.gamemode_public_match = 0; + level.gamemode_private_match = 1; + level.gamemode_local_splitscreen = 2; + level.gamemode_wager_match = 3; + level.gamemode_theater = 5; + level.gamemode_league_match = 6; + level.gamemode_rts = 7; + level.language = getDvar( "language" ); } empty( a, b, c, d, e ) { - } add_to_array( array, item, allow_dupes ) { - if ( !isdefined( item ) ) - return array; - - if ( !isdefined( allow_dupes ) ) - allow_dupes = 1; - - if ( !isdefined( array ) ) - array[0] = item; - else if ( allow_dupes || !isinarray( array, item ) ) - array[array.size] = item; - - return array; + if ( !isDefined( item ) ) + { + return array; + } + if ( !isDefined( allow_dupes ) ) + { + allow_dupes = 1; + } + if ( !isDefined( array ) ) + { + array[ 0 ] = item; + } + else + { + if ( allow_dupes || !isinarray( array, item ) ) + { + array[ array.size ] = item; + } + } + return array; } array_copy( array ) { - a_copy = []; - - foreach ( elem in array ) - a_copy[a_copy.size] = elem; - - return a_copy; + a_copy = []; + _a92 = array; + _k92 = getFirstArrayKey( _a92 ); + while ( isDefined( _k92 ) ) + { + elem = _a92[ _k92 ]; + a_copy[ a_copy.size ] = elem; + _k92 = getNextArrayKey( _a92, _k92 ); + } + return a_copy; } array_delete( array, is_struct ) { - foreach ( ent in array ) - { - if ( isdefined( is_struct ) && is_struct ) - { - ent structdelete(); - ent = undefined; - continue; - } - - if ( isdefined( ent ) ) - ent delete(); - } + _a109 = array; + _k109 = getFirstArrayKey( _a109 ); + while ( isDefined( _k109 ) ) + { + ent = _a109[ _k109 ]; + if ( isDefined( is_struct ) && is_struct ) + { + ent structdelete(); + ent = undefined; + } + else + { + if ( isDefined( ent ) ) + { + ent delete(); + } + } + _k109 = getNextArrayKey( _a109, _k109 ); + } } array_randomize( array ) { - for ( i = 0; i < array.size; i++ ) - { - j = randomint( array.size ); - temp = array[i]; - array[i] = array[j]; - array[j] = temp; - } - - return array; + i = 0; + while ( i < array.size ) + { + j = randomint( array.size ); + temp = array[ i ]; + array[ i ] = array[ j ]; + array[ j ] = temp; + i++; + } + return array; } array_reverse( array ) { - array2 = []; + array2 = []; + i = array.size - 1; + while ( i >= 0 ) + { + array2[ array2.size ] = array[ i ]; + i--; - for ( i = array.size - 1; i >= 0; i-- ) - array2[array2.size] = array[i]; - - return array2; + } + return array2; } array_exclude( array, arrayexclude ) { - newarray = array; - - if ( isarray( arrayexclude ) ) - { - for ( i = 0; i < arrayexclude.size; i++ ) - arrayremovevalue( newarray, arrayexclude[i] ); - } - else - arrayremovevalue( newarray, arrayexclude ); - - return newarray; + newarray = array; + if ( isarray( arrayexclude ) ) + { + i = 0; + while ( i < arrayexclude.size ) + { + arrayremovevalue( newarray, arrayexclude[ i ] ); + i++; + } + } + else arrayremovevalue( newarray, arrayexclude ); + return newarray; } array_notify( ents, notifier ) { - for ( i = 0; i < ents.size; i++ ) - ents[i] notify( notifier ); + i = 0; + while ( i < ents.size ) + { + ents[ i ] notify( notifier ); + i++; + } } array_wait( array, msg, timeout ) { - keys = getarraykeys( array ); - structs = []; - - for ( i = 0; i < keys.size; i++ ) - { - key = keys[i]; - structs[key] = spawnstruct(); - structs[key]._array_wait = 1; - structs[key] thread array_waitlogic1( array[key], msg, timeout ); - } - - for ( i = 0; i < keys.size; i++ ) - { - key = keys[i]; - - if ( isdefined( array[key] ) && structs[key]._array_wait ) - structs[key] waittill( "_array_wait" ); - } + keys = getarraykeys( array ); + structs = []; + i = 0; + while ( i < keys.size ) + { + key = keys[ i ]; + structs[ key ] = spawnstruct(); + structs[ key ]._array_wait = 1; + structs[ key ] thread array_waitlogic1( array[ key ], msg, timeout ); + i++; + } + i = 0; + while ( i < keys.size ) + { + key = keys[ i ]; + if ( isDefined( array[ key ] ) && structs[ key ]._array_wait ) + { + structs[ key ] waittill( "_array_wait" ); + } + i++; + } } array_wait_any( array, msg, timeout ) { - if ( array.size == 0 ) - return undefined; - - keys = getarraykeys( array ); - structs = []; - internal_msg = msg + "array_wait"; - - for ( i = 0; i < keys.size; i++ ) - { - key = keys[i]; - structs[key] = spawnstruct(); - structs[key]._array_wait = 1; - structs[key] thread array_waitlogic3( array[key], msg, internal_msg, timeout ); - } - - level waittill( internal_msg, ent ); - - return ent; + if ( array.size == 0 ) + { + return undefined; + } + keys = getarraykeys( array ); + structs = []; + internal_msg = msg + "array_wait"; + i = 0; + while ( i < keys.size ) + { + key = keys[ i ]; + structs[ key ] = spawnstruct(); + structs[ key ]._array_wait = 1; + structs[ key ] thread array_waitlogic3( array[ key ], msg, internal_msg, timeout ); + i++; + } + level waittill( internal_msg, ent ); + return ent; } array_waitlogic1( ent, msg, timeout ) { - self array_waitlogic2( ent, msg, timeout ); - self._array_wait = 0; - self notify( "_array_wait" ); + self array_waitlogic2( ent, msg, timeout ); + self._array_wait = 0; + self notify( "_array_wait" ); } array_waitlogic2( ent, msg, timeout ) { - ent endon( msg ); - ent endon( "death" ); - - if ( isdefined( timeout ) ) - wait( timeout ); - else - ent waittill( msg ); + ent endon( msg ); + ent endon( "death" ); + if ( isDefined( timeout ) ) + { + wait timeout; + } + else + { + ent waittill( msg ); + } } array_waitlogic3( ent, msg, internal_msg, timeout ) { - if ( msg != "death" ) - ent endon( "death" ); - - level endon( internal_msg ); - self array_waitlogic2( ent, msg, timeout ); - level notify( internal_msg, ent ); + if ( msg != "death" ) + { + ent endon( "death" ); + } + level endon( internal_msg ); + self array_waitlogic2( ent, msg, timeout ); + level notify( internal_msg ); } array_check_for_dupes( array, single ) { - for ( i = 0; i < array.size; i++ ) - { - if ( array[i] == single ) - return false; - } - - return true; + i = 0; + while ( i < array.size ) + { + if ( array[ i ] == single ) + { + return 0; + } + i++; + } + return 1; } array_swap( array, index1, index2 ) { /# - assert( index1 < array.size, "index1 to swap out of range" ); + assert( index1 < array.size, "index1 to swap out of range" ); #/ /# - assert( index2 < array.size, "index2 to swap out of range" ); + assert( index2 < array.size, "index2 to swap out of range" ); #/ - temp = array[index1]; - array[index1] = array[index2]; - array[index2] = temp; - return array; + temp = array[ index1 ]; + array[ index1 ] = array[ index2 ]; + array[ index2 ] = temp; + return array; } array_average( array ) { /# - assert( isarray( array ) ); + assert( isarray( array ) ); #/ /# - assert( array.size > 0 ); + assert( array.size > 0 ); #/ - total = 0; - - for ( i = 0; i < array.size; i++ ) - total += array[i]; - - return total / array.size; + total = 0; + i = 0; + while ( i < array.size ) + { + total += array[ i ]; + i++; + } + return total / array.size; } array_std_deviation( array, mean ) { /# - assert( isarray( array ) ); + assert( isarray( array ) ); #/ /# - assert( array.size > 0 ); + assert( array.size > 0 ); #/ - tmp = []; - - for ( i = 0; i < array.size; i++ ) - tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); - - total = 0; - - for ( i = 0; i < tmp.size; i++ ) - total += tmp[i]; - - return sqrt( total / array.size ); + tmp = []; + i = 0; + while ( i < array.size ) + { + tmp[ i ] = ( array[ i ] - mean ) * ( array[ i ] - mean ); + i++; + } + total = 0; + i = 0; + while ( i < tmp.size ) + { + total += tmp[ i ]; + i++; + } + return sqrt( total / array.size ); } random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) { - x1 = 0; - x2 = 0; - w = 1; - y1 = 0; - - while ( w >= 1 ) - { - x1 = 2 * randomfloatrange( 0, 1 ) - 1; - x2 = 2 * randomfloatrange( 0, 1 ) - 1; - w = x1 * x1 + x2 * x2; - } - - w = sqrt( -2.0 * log( w ) / w ); - y1 = x1 * w; - number = mean + y1 * std_deviation; - - if ( isdefined( lower_bound ) && number < lower_bound ) - number = lower_bound; - - if ( isdefined( upper_bound ) && number > upper_bound ) - number = upper_bound; - - return number; + x1 = 0; + x2 = 0; + w = 1; + y1 = 0; + while ( w >= 1 ) + { + x1 = ( 2 * randomfloatrange( 0, 1 ) ) - 1; + x2 = ( 2 * randomfloatrange( 0, 1 ) ) - 1; + w = ( x1 * x1 ) + ( x2 * x2 ); + } + w = sqrt( ( -2 * log( w ) ) / w ); + y1 = x1 * w; + number = mean + ( y1 * std_deviation ); + if ( isDefined( lower_bound ) && number < lower_bound ) + { + number = lower_bound; + } + if ( isDefined( upper_bound ) && number > upper_bound ) + { + number = upper_bound; + } + return number; } random( array ) { - keys = getarraykeys( array ); - return array[keys[randomint( keys.size )]]; + keys = getarraykeys( array ); + return array[ keys[ randomint( keys.size ) ] ]; } get_players( str_team ) { - if ( isdefined( str_team ) ) - return getplayers( str_team ); - else - return getplayers(); + if ( isDefined( str_team ) ) + { + return getplayers( str_team ); + } + else + { + return getplayers(); + } } is_prefix( msg, prefix ) { - if ( prefix.size > msg.size ) - return false; - - for ( i = 0; i < prefix.size; i++ ) - { - if ( msg[i] != prefix[i] ) - return false; - } - - return true; + if ( prefix.size > msg.size ) + { + return 0; + } + i = 0; + while ( i < prefix.size ) + { + if ( msg[ i ] != prefix[ i ] ) + { + return 0; + } + i++; + } + return 1; } is_suffix( msg, suffix ) { - if ( suffix.size > msg.size ) - return false; - - for ( i = 0; i < suffix.size; i++ ) - { - if ( msg[msg.size - 1 - i] != suffix[suffix.size - 1 - i] ) - return false; - } - - return true; + if ( suffix.size > msg.size ) + { + return 0; + } + i = 0; + while ( i < suffix.size ) + { + if ( msg[ ( msg.size - 1 ) - i ] != suffix[ ( suffix.size - 1 ) - i ] ) + { + return 0; + } + i++; + } + return 1; } vector_compare( vec1, vec2 ) { - return abs( vec1[0] - vec2[0] ) < 0.001 && abs( vec1[1] - vec2[1] ) < 0.001 && abs( vec1[2] - vec2[2] ) < 0.001; + if ( abs( vec1[ 0 ] - vec2[ 0 ] ) < 0,001 && abs( vec1[ 1 ] - vec2[ 1 ] ) < 0,001 ) + { + return abs( vec1[ 2 ] - vec2[ 2 ] ) < 0,001; + } } draw_debug_line( start, end, timer ) { /# - for ( i = 0; i < timer * 20; i++ ) - { - line( start, end, ( 1, 1, 0.5 ) ); - wait 0.05; - } + i = 0; + while ( i < ( timer * 20 ) ) + { + line( start, end, ( 1, 1, 0,5 ) ); + wait 0,05; + i++; #/ + } } waittillend( msg ) { - self waittillmatch( msg, "end" ); + self waittillmatch( msg ); + return "end"; } random_vector( max_length ) { - return ( randomfloatrange( -1 * max_length, max_length ), randomfloatrange( -1 * max_length, max_length ), randomfloatrange( -1 * max_length, max_length ) ); + return ( randomfloatrange( -1 * max_length, max_length ), randomfloatrange( -1 * max_length, max_length ), randomfloatrange( -1 * max_length, max_length ) ); } angle_dif( oldangle, newangle ) { - outvalue = ( oldangle - newangle ) % 360; - - if ( outvalue < 0 ) - outvalue += 360; - - if ( outvalue > 180 ) - outvalue = ( outvalue - 360 ) * -1; - - return outvalue; + outvalue = ( oldangle - newangle ) % 360; + if ( outvalue < 0 ) + { + outvalue += 360; + } + if ( outvalue > 180 ) + { + outvalue = ( outvalue - 360 ) * -1; + } + return outvalue; } sign( x ) { - if ( x >= 0 ) - return 1; - - return -1; + if ( x >= 0 ) + { + return 1; + } + return -1; } track( spot_to_track ) { - if ( isdefined( self.current_target ) ) - { - if ( spot_to_track == self.current_target ) - return; - } - - self.current_target = spot_to_track; + if ( isDefined( self.current_target ) ) + { + if ( spot_to_track == self.current_target ) + { + return; + } + } + self.current_target = spot_to_track; } clear_exception( type ) { /# - assert( isdefined( self.exception[type] ) ); + assert( isDefined( self.exception[ type ] ) ); #/ - self.exception[type] = anim.defaultexception; + self.exception[ type ] = anim.defaultexception; } set_exception( type, func ) { /# - assert( isdefined( self.exception[type] ) ); + assert( isDefined( self.exception[ type ] ) ); #/ - self.exception[type] = func; + self.exception[ type ] = func; } set_all_exceptions( exceptionfunc ) { - keys = getarraykeys( self.exception ); - - for ( i = 0; i < keys.size; i++ ) - self.exception[keys[i]] = exceptionfunc; + keys = getarraykeys( self.exception ); + i = 0; + while ( i < keys.size ) + { + self.exception[ keys[ i ] ] = exceptionfunc; + i++; + } } cointoss() { - return randomint( 100 ) >= 50; + return randomint( 100 ) >= 50; } waittill_string( msg, ent ) { - if ( msg != "death" ) - self endon( "death" ); - - ent endon( "die" ); - - self waittill( msg ); - - ent notify( "returned", msg ); + if ( msg != "death" ) + { + self endon( "death" ); + } + ent endon( "die" ); + self waittill( msg ); + ent notify( "returned" ); } waittill_multiple( string1, string2, string3, string4, string5 ) { - self endon( "death" ); - ent = spawnstruct(); - ent.threads = 0; + self endon( "death" ); + ent = spawnstruct(); + ent.threads = 0; + if ( isDefined( string1 ) ) + { + self thread waittill_string( string1, ent ); + ent.threads++; + } + if ( isDefined( string2 ) ) + { + self thread waittill_string( string2, ent ); + ent.threads++; + } + if ( isDefined( string3 ) ) + { + self thread waittill_string( string3, ent ); + ent.threads++; + } + if ( isDefined( string4 ) ) + { + self thread waittill_string( string4, ent ); + ent.threads++; + } + if ( isDefined( string5 ) ) + { + self thread waittill_string( string5, ent ); + ent.threads++; + } + while ( ent.threads ) + { + ent waittill( "returned" ); + ent.threads--; - if ( isdefined( string1 ) ) - { - self thread waittill_string( string1, ent ); - ent.threads++; - } - - if ( isdefined( string2 ) ) - { - self thread waittill_string( string2, ent ); - ent.threads++; - } - - if ( isdefined( string3 ) ) - { - self thread waittill_string( string3, ent ); - ent.threads++; - } - - if ( isdefined( string4 ) ) - { - self thread waittill_string( string4, ent ); - ent.threads++; - } - - if ( isdefined( string5 ) ) - { - self thread waittill_string( string5, ent ); - ent.threads++; - } - - while ( ent.threads ) - { - ent waittill( "returned" ); - - ent.threads--; - } - - ent notify( "die" ); + } + ent notify( "die" ); } waittill_multiple_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4 ) { - self endon( "death" ); - ent = spawnstruct(); - ent.threads = 0; - - if ( isdefined( ent1 ) ) - { + self endon( "death" ); + ent = spawnstruct(); + ent.threads = 0; + if ( isDefined( ent1 ) ) + { /# - assert( isdefined( string1 ) ); + assert( isDefined( string1 ) ); #/ - ent1 thread waittill_string( string1, ent ); - ent.threads++; - } - - if ( isdefined( ent2 ) ) - { + ent1 thread waittill_string( string1, ent ); + ent.threads++; + } + if ( isDefined( ent2 ) ) + { /# - assert( isdefined( string2 ) ); + assert( isDefined( string2 ) ); #/ - ent2 thread waittill_string( string2, ent ); - ent.threads++; - } - - if ( isdefined( ent3 ) ) - { + ent2 thread waittill_string( string2, ent ); + ent.threads++; + } + if ( isDefined( ent3 ) ) + { /# - assert( isdefined( string3 ) ); + assert( isDefined( string3 ) ); #/ - ent3 thread waittill_string( string3, ent ); - ent.threads++; - } - - if ( isdefined( ent4 ) ) - { + ent3 thread waittill_string( string3, ent ); + ent.threads++; + } + if ( isDefined( ent4 ) ) + { /# - assert( isdefined( string4 ) ); + assert( isDefined( string4 ) ); #/ - ent4 thread waittill_string( string4, ent ); - ent.threads++; - } + ent4 thread waittill_string( string4, ent ); + ent.threads++; + } + while ( ent.threads ) + { + ent waittill( "returned" ); + ent.threads--; - while ( ent.threads ) - { - ent waittill( "returned" ); - - ent.threads--; - } - - ent notify( "die" ); + } + ent notify( "die" ); } waittill_any_return( string1, string2, string3, string4, string5, string6, string7 ) { - if ( ( !isdefined( string1 ) || string1 != "death" ) && ( !isdefined( string2 ) || string2 != "death" ) && ( !isdefined( string3 ) || string3 != "death" ) && ( !isdefined( string4 ) || string4 != "death" ) && ( !isdefined( string5 ) || string5 != "death" ) && ( !isdefined( string6 ) || string6 != "death" ) && ( !isdefined( string7 ) || string7 != "death" ) ) - self endon( "death" ); - - ent = spawnstruct(); - - if ( isdefined( string1 ) ) - self thread waittill_string( string1, ent ); - - if ( isdefined( string2 ) ) - self thread waittill_string( string2, ent ); - - if ( isdefined( string3 ) ) - self thread waittill_string( string3, ent ); - - if ( isdefined( string4 ) ) - self thread waittill_string( string4, ent ); - - if ( isdefined( string5 ) ) - self thread waittill_string( string5, ent ); - - if ( isdefined( string6 ) ) - self thread waittill_string( string6, ent ); - - if ( isdefined( string7 ) ) - self thread waittill_string( string7, ent ); - - ent waittill( "returned", msg ); - - ent notify( "die" ); - return msg; + if ( isDefined( string1 ) && string1 != "death" && isDefined( string2 ) && string2 != "death" && isDefined( string3 ) && string3 != "death" && isDefined( string4 ) && string4 != "death" && isDefined( string5 ) && string5 != "death" && isDefined( string6 ) && string6 != "death" || !isDefined( string7 ) && string7 != "death" ) + { + self endon( "death" ); + } + ent = spawnstruct(); + if ( isDefined( string1 ) ) + { + self thread waittill_string( string1, ent ); + } + if ( isDefined( string2 ) ) + { + self thread waittill_string( string2, ent ); + } + if ( isDefined( string3 ) ) + { + self thread waittill_string( string3, ent ); + } + if ( isDefined( string4 ) ) + { + self thread waittill_string( string4, ent ); + } + if ( isDefined( string5 ) ) + { + self thread waittill_string( string5, ent ); + } + if ( isDefined( string6 ) ) + { + self thread waittill_string( string6, ent ); + } + if ( isDefined( string7 ) ) + { + self thread waittill_string( string7, ent ); + } + ent waittill( "returned", msg ); + ent notify( "die" ); + return msg; } waittill_any_array_return( a_notifies ) { - if ( isinarray( a_notifies, "death" ) ) - self endon( "death" ); - - s_tracker = spawnstruct(); - - foreach ( str_notify in a_notifies ) - { - if ( isdefined( str_notify ) ) - self thread waittill_string( str_notify, s_tracker ); - } - - s_tracker waittill( "returned", msg ); - - s_tracker notify( "die" ); - return msg; + if ( isinarray( a_notifies, "death" ) ) + { + self endon( "death" ); + } + s_tracker = spawnstruct(); + _a825 = a_notifies; + _k825 = getFirstArrayKey( _a825 ); + while ( isDefined( _k825 ) ) + { + str_notify = _a825[ _k825 ]; + if ( isDefined( str_notify ) ) + { + self thread waittill_string( str_notify, s_tracker ); + } + _k825 = getNextArrayKey( _a825, _k825 ); + } + s_tracker waittill( "returned", msg ); + s_tracker notify( "die" ); + return msg; } waittill_any( str_notify1, str_notify2, str_notify3, str_notify4, str_notify5 ) { /# - assert( isdefined( str_notify1 ) ); + assert( isDefined( str_notify1 ) ); #/ - waittill_any_array( array( str_notify1, str_notify2, str_notify3, str_notify4, str_notify5 ) ); + waittill_any_array( array( str_notify1, str_notify2, str_notify3, str_notify4, str_notify5 ) ); } waittill_any_array( a_notifies ) { /# - assert( isdefined( a_notifies[0] ), "At least the first element has to be defined for waittill_any_array." ); + assert( isDefined( a_notifies[ 0 ] ), "At least the first element has to be defined for waittill_any_array." ); #/ - for ( i = 1; i < a_notifies.size; i++ ) - { - if ( isdefined( a_notifies[i] ) ) - self endon( a_notifies[i] ); - } - - self waittill( a_notifies[0] ); + i = 1; + while ( i < a_notifies.size ) + { + if ( isDefined( a_notifies[ i ] ) ) + { + self endon( a_notifies[ i ] ); + } + i++; + } + self waittill( a_notifies[ 0 ] ); } waittill_any_timeout( n_timeout, string1, string2, string3, string4, string5 ) { - if ( ( !isdefined( string1 ) || string1 != "death" ) && ( !isdefined( string2 ) || string2 != "death" ) && ( !isdefined( string3 ) || string3 != "death" ) && ( !isdefined( string4 ) || string4 != "death" ) && ( !isdefined( string5 ) || string5 != "death" ) ) - self endon( "death" ); - - ent = spawnstruct(); - - if ( isdefined( string1 ) ) - self thread waittill_string( string1, ent ); - - if ( isdefined( string2 ) ) - self thread waittill_string( string2, ent ); - - if ( isdefined( string3 ) ) - self thread waittill_string( string3, ent ); - - if ( isdefined( string4 ) ) - self thread waittill_string( string4, ent ); - - if ( isdefined( string5 ) ) - self thread waittill_string( string5, ent ); - - ent thread _timeout( n_timeout ); - - ent waittill( "returned", msg ); - - ent notify( "die" ); - return msg; + if ( isDefined( string1 ) && string1 != "death" && isDefined( string2 ) && string2 != "death" && isDefined( string3 ) && string3 != "death" && isDefined( string4 ) && string4 != "death" || !isDefined( string5 ) && string5 != "death" ) + { + self endon( "death" ); + } + ent = spawnstruct(); + if ( isDefined( string1 ) ) + { + self thread waittill_string( string1, ent ); + } + if ( isDefined( string2 ) ) + { + self thread waittill_string( string2, ent ); + } + if ( isDefined( string3 ) ) + { + self thread waittill_string( string3, ent ); + } + if ( isDefined( string4 ) ) + { + self thread waittill_string( string4, ent ); + } + if ( isDefined( string5 ) ) + { + self thread waittill_string( string5, ent ); + } + ent thread _timeout( n_timeout ); + ent waittill( "returned", msg ); + ent notify( "die" ); + return msg; } _timeout( delay ) { - self endon( "die" ); - wait( delay ); - self notify( "returned", "timeout" ); + self endon( "die" ); + wait delay; + self notify( "returned" ); } waittill_any_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4, ent5, string5, ent6, string6, ent7, string7 ) { /# - assert( isdefined( ent1 ) ); + assert( isDefined( ent1 ) ); #/ /# - assert( isdefined( string1 ) ); + assert( isDefined( string1 ) ); #/ - if ( isdefined( ent2 ) && isdefined( string2 ) ) - ent2 endon( string2 ); - - if ( isdefined( ent3 ) && isdefined( string3 ) ) - ent3 endon( string3 ); - - if ( isdefined( ent4 ) && isdefined( string4 ) ) - ent4 endon( string4 ); - - if ( isdefined( ent5 ) && isdefined( string5 ) ) - ent5 endon( string5 ); - - if ( isdefined( ent6 ) && isdefined( string6 ) ) - ent6 endon( string6 ); - - if ( isdefined( ent7 ) && isdefined( string7 ) ) - ent7 endon( string7 ); - - ent1 waittill( string1 ); + if ( isDefined( ent2 ) && isDefined( string2 ) ) + { + ent2 endon( string2 ); + } + if ( isDefined( ent3 ) && isDefined( string3 ) ) + { + ent3 endon( string3 ); + } + if ( isDefined( ent4 ) && isDefined( string4 ) ) + { + ent4 endon( string4 ); + } + if ( isDefined( ent5 ) && isDefined( string5 ) ) + { + ent5 endon( string5 ); + } + if ( isDefined( ent6 ) && isDefined( string6 ) ) + { + ent6 endon( string6 ); + } + if ( isDefined( ent7 ) && isDefined( string7 ) ) + { + ent7 endon( string7 ); + } + ent1 waittill( string1 ); } waittill_any_ents_two( ent1, string1, ent2, string2 ) { /# - assert( isdefined( ent1 ) ); + assert( isDefined( ent1 ) ); #/ /# - assert( isdefined( string1 ) ); + assert( isDefined( string1 ) ); #/ - if ( isdefined( ent2 ) && isdefined( string2 ) ) - ent2 endon( string2 ); - - ent1 waittill( string1 ); + if ( isDefined( ent2 ) && isDefined( string2 ) ) + { + ent2 endon( string2 ); + } + ent1 waittill( string1 ); } waittill_flag_exists( msg ) { - while ( !flag_exists( msg ) ) - { - waittillframeend; - - if ( flag_exists( msg ) ) - break; - - wait 0.05; - } + while ( !flag_exists( msg ) ) + { + waittillframeend; + if ( flag_exists( msg ) ) + { + return; + } + else + { + wait 0,05; + } + } } isflashed() { - if ( !isdefined( self.flashendtime ) ) - return 0; - - return gettime() < self.flashendtime; + if ( !isDefined( self.flashendtime ) ) + { + return 0; + } + return getTime() < self.flashendtime; } isstunned() { - if ( !isdefined( self.flashendtime ) ) - return 0; - - return gettime() < self.flashendtime; + if ( !isDefined( self.flashendtime ) ) + { + return 0; + } + return getTime() < self.flashendtime; } flag( flagname ) { /# - assert( isdefined( flagname ), "Tried to check flag but the flag was not defined." ); + assert( isDefined( flagname ), "Tried to check flag but the flag was not defined." ); #/ /# - assert( isdefined( level.flag[flagname] ), "Tried to check flag " + flagname + " but the flag was not initialized." ); + assert( isDefined( level.flag[ flagname ] ), "Tried to check flag " + flagname + " but the flag was not initialized." ); #/ - if ( !level.flag[flagname] ) - return false; - - return true; + if ( !level.flag[ flagname ] ) + { + return 0; + } + return 1; } flag_delete( flagname ) { - if ( isdefined( level.flag[flagname] ) ) - level.flag[flagname] = undefined; - else - { + if ( isDefined( level.flag[ flagname ] ) ) + { + } + else + { /# - println( "flag_delete() called on flag that does not exist: " + flagname ); + println( "flag_delete() called on flag that does not exist: " + flagname ); #/ - } + } } flag_init( flagname, val, b_is_trigger ) { - if ( !isdefined( b_is_trigger ) ) - b_is_trigger = 0; - - if ( !isdefined( level.flag ) ) - level.flag = []; - - if ( !isdefined( level.sp_stat_tracking_func ) ) - level.sp_stat_tracking_func = ::empty; - - if ( !isdefined( level.first_frame ) ) - { + if ( !isDefined( b_is_trigger ) ) + { + b_is_trigger = 0; + } + if ( !isDefined( level.flag ) ) + { + level.flag = []; + } + if ( !isDefined( level.sp_stat_tracking_func ) ) + { + level.sp_stat_tracking_func = ::empty; + } + if ( !isDefined( level.first_frame ) ) + { /# - assert( !isdefined( level.flag[flagname] ), "Attempt to reinitialize existing flag: " + flagname ); + assert( !isDefined( level.flag[ flagname ] ), "Attempt to reinitialize existing flag: " + flagname ); #/ - } - - if ( isdefined( val ) && val ) - level.flag[flagname] = 1; - else - level.flag[flagname] = 0; - - if ( b_is_trigger ) - { - if ( !isdefined( level.trigger_flags ) ) - { - init_trigger_flags(); - level.trigger_flags[flagname] = []; - } - else if ( !isdefined( level.trigger_flags[flagname] ) ) - level.trigger_flags[flagname] = []; - } - - if ( is_suffix( flagname, "aa_" ) ) - thread [[ level.sp_stat_tracking_func ]]( flagname ); + } + if ( isDefined( val ) && val ) + { + level.flag[ flagname ] = 1; + } + else + { + level.flag[ flagname ] = 0; + } + if ( b_is_trigger ) + { + if ( !isDefined( level.trigger_flags ) ) + { + init_trigger_flags(); + level.trigger_flags[ flagname ] = []; + } + else + { + if ( !isDefined( level.trigger_flags[ flagname ] ) ) + { + level.trigger_flags[ flagname ] = []; + } + } + } + if ( is_suffix( flagname, "aa_" ) ) + { + thread [[ level.sp_stat_tracking_func ]]( flagname ); + } } flag_set( flagname ) { /# - assert( isdefined( level.flag[flagname] ), "Attempt to set a flag before calling flag_init: " + flagname ); + assert( isDefined( level.flag[ flagname ] ), "Attempt to set a flag before calling flag_init: " + flagname ); #/ - level.flag[flagname] = 1; - level notify( flagname ); - set_trigger_flag_permissions( flagname ); + level.flag[ flagname ] = 1; + level notify( flagname ); + set_trigger_flag_permissions( flagname ); } flag_set_for_time( n_time, str_flag ) { - level notify( "set_flag_for_time:" + str_flag ); - flag_set( str_flag ); - level endon( "set_flag_for_time:" + str_flag ); - wait( n_time ); - flag_clear( str_flag ); + level notify( "set_flag_for_time:" + str_flag ); + flag_set( str_flag ); + level endon( "set_flag_for_time:" + str_flag ); + wait n_time; + flag_clear( str_flag ); } flag_toggle( flagname ) { - if ( flag( flagname ) ) - flag_clear( flagname ); - else - flag_set( flagname ); + if ( flag( flagname ) ) + { + flag_clear( flagname ); + } + else + { + flag_set( flagname ); + } } flag_wait( flagname ) { - level waittill_flag_exists( flagname ); - - while ( !level.flag[flagname] ) - level waittill( flagname ); + level waittill_flag_exists( flagname ); + while ( !level.flag[ flagname ] ) + { + level waittill( flagname ); + } } flag_wait_any( str_flag1, str_flag2, str_flag3, str_flag4, str_flag5 ) { - level flag_wait_any_array( array( str_flag1, str_flag2, str_flag3, str_flag4, str_flag5 ) ); + level flag_wait_any_array( array( str_flag1, str_flag2, str_flag3, str_flag4, str_flag5 ) ); } flag_wait_any_array( a_flags ) { - while ( true ) - { - for ( i = 0; i < a_flags.size; i++ ) - { - if ( flag( a_flags[i] ) ) - return a_flags[i]; - } - - level waittill_any_array( a_flags ); - } + while ( 1 ) + { + i = 0; + while ( i < a_flags.size ) + { + if ( flag( a_flags[ i ] ) ) + { + return a_flags[ i ]; + } + i++; + } + level waittill_any_array( a_flags ); + } } flag_clear( flagname ) { /# - assert( isdefined( level.flag[flagname] ), "Attempt to set a flag before calling flag_init: " + flagname ); + assert( isDefined( level.flag[ flagname ] ), "Attempt to set a flag before calling flag_init: " + flagname ); #/ - if ( level.flag[flagname] ) - { - level.flag[flagname] = 0; - level notify( flagname ); - set_trigger_flag_permissions( flagname ); - } + if ( level.flag[ flagname ] ) + { + level.flag[ flagname ] = 0; + level notify( flagname ); + set_trigger_flag_permissions( flagname ); + } } flag_waitopen( flagname ) { - while ( level.flag[flagname] ) - level waittill( flagname ); + while ( level.flag[ flagname ] ) + { + level waittill( flagname ); + } } flag_waitopen_array( a_flags ) { - foreach ( str_flag in a_flags ) - { - if ( flag( str_flag ) ) - { - flag_waitopen( str_flag ); - continue; - } - } + _a1324 = a_flags; + _k1324 = getFirstArrayKey( _a1324 ); + while ( isDefined( _k1324 ) ) + { + str_flag = _a1324[ _k1324 ]; + if ( flag( str_flag ) ) + { + flag_waitopen( str_flag ); + break; + } + _k1324 = getNextArrayKey( _a1324, _k1324 ); + } } flag_exists( flagname ) { - if ( self == level ) - { - if ( !isdefined( level.flag ) ) - return false; - - if ( isdefined( level.flag[flagname] ) ) - return true; - } - else - { - if ( !isdefined( self.ent_flag ) ) - return false; - - if ( isdefined( self.ent_flag[flagname] ) ) - return true; - } - - return false; + if ( self == level ) + { + if ( !isDefined( level.flag ) ) + { + return 0; + } + if ( isDefined( level.flag[ flagname ] ) ) + { + return 1; + } + } + else + { + if ( !isDefined( self.ent_flag ) ) + { + return 0; + } + if ( isDefined( self.ent_flag[ flagname ] ) ) + { + return 1; + } + } + return 0; } script_gen_dump_addline( string, signature ) { - if ( !isdefined( string ) ) - string = "nowrite"; - - if ( !isdefined( level._loadstarted ) ) - { - if ( !isdefined( level.script_gen_dump_preload ) ) - level.script_gen_dump_preload = []; - - struct = spawnstruct(); - struct.string = string; - struct.signature = signature; - level.script_gen_dump_preload[level.script_gen_dump_preload.size] = struct; - return; - } - - if ( !isdefined( level.script_gen_dump[signature] ) ) - level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "Added: " + string; - - level.script_gen_dump[signature] = string; - level.script_gen_dump2[signature] = string; + if ( !isDefined( string ) ) + { + string = "nowrite"; + } + if ( !isDefined( level._loadstarted ) ) + { + if ( !isDefined( level.script_gen_dump_preload ) ) + { + level.script_gen_dump_preload = []; + } + struct = spawnstruct(); + struct.string = string; + struct.signature = signature; + level.script_gen_dump_preload[ level.script_gen_dump_preload.size ] = struct; + return; + } + if ( !isDefined( level.script_gen_dump[ signature ] ) ) + { + level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "Added: " + string; + } + level.script_gen_dump[ signature ] = string; + level.script_gen_dump2[ signature ] = string; } array_func( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ) { - if ( !isdefined( entities ) ) - return; - - if ( isarray( entities ) ) - { - if ( entities.size ) - { - keys = getarraykeys( entities ); - - for ( i = 0; i < keys.size; i++ ) - single_func( entities[keys[i]], func, arg1, arg2, arg3, arg4, arg5, arg6 ); - } - } - else - single_func( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ); + if ( !isDefined( entities ) ) + { + return; + } + if ( isarray( entities ) ) + { + while ( entities.size ) + { + keys = getarraykeys( entities ); + i = 0; + while ( i < keys.size ) + { + single_func( entities[ keys[ i ] ], func, arg1, arg2, arg3, arg4, arg5, arg6 ); + i++; + } + } + } + else single_func( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ); } single_func( entity, func, arg1, arg2, arg3, arg4, arg5, arg6 ) { - if ( !isdefined( entity ) ) - entity = level; - - if ( isdefined( arg6 ) ) - return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); - else if ( isdefined( arg5 ) ) - return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); - else if ( isdefined( arg4 ) ) - return entity [[ func ]]( arg1, arg2, arg3, arg4 ); - else if ( isdefined( arg3 ) ) - return entity [[ func ]]( arg1, arg2, arg3 ); - else if ( isdefined( arg2 ) ) - return entity [[ func ]]( arg1, arg2 ); - else if ( isdefined( arg1 ) ) - return entity [[ func ]]( arg1 ); - else - return entity [[ func ]](); + if ( !isDefined( entity ) ) + { + entity = level; + } + if ( isDefined( arg6 ) ) + { + return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); + } + else + { + if ( isDefined( arg5 ) ) + { + return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); + } + else + { + if ( isDefined( arg4 ) ) + { + return entity [[ func ]]( arg1, arg2, arg3, arg4 ); + } + else + { + if ( isDefined( arg3 ) ) + { + return entity [[ func ]]( arg1, arg2, arg3 ); + } + else + { + if ( isDefined( arg2 ) ) + { + return entity [[ func ]]( arg1, arg2 ); + } + else + { + if ( isDefined( arg1 ) ) + { + return entity [[ func ]]( arg1 ); + } + else + { + return entity [[ func ]](); + } + } + } + } + } + } } new_func( func, arg1, arg2, arg3, arg4, arg5, arg6 ) { - s_func = spawnstruct(); - s_func.func = func; - s_func.arg1 = arg1; - s_func.arg2 = arg2; - s_func.arg3 = arg3; - s_func.arg4 = arg4; - s_func.arg5 = arg5; - s_func.arg6 = arg6; - return s_func; + s_func = spawnstruct(); + s_func.func = func; + s_func.arg1 = arg1; + s_func.arg2 = arg2; + s_func.arg3 = arg3; + s_func.arg4 = arg4; + s_func.arg5 = arg5; + s_func.arg6 = arg6; + return s_func; } call_func( s_func ) { - return single_func( self, s_func.func, s_func.arg1, s_func.arg2, s_func.arg3, s_func.arg4, s_func.arg5, s_func.arg6 ); + return single_func( self, s_func.func, s_func.arg1, s_func.arg2, s_func.arg3, s_func.arg4, s_func.arg5, s_func.arg6 ); } array_thread( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ) { /# - assert( isdefined( entities ), "Undefined entity array passed to common_scriptsutility::array_thread" ); + assert( isDefined( entities ), "Undefined entity array passed to common_scriptsutility::array_thread" ); #/ /# - assert( isdefined( func ), "Undefined function passed to common_scriptsutility::array_thread" ); + assert( isDefined( func ), "Undefined function passed to common_scriptsutility::array_thread" ); #/ - if ( isarray( entities ) ) - { - if ( isdefined( arg6 ) ) - { - foreach ( ent in entities ) - ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); - } - else if ( isdefined( arg5 ) ) - { - foreach ( ent in entities ) - ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); - } - else if ( isdefined( arg4 ) ) - { - foreach ( ent in entities ) - ent thread [[ func ]]( arg1, arg2, arg3, arg4 ); - } - else if ( isdefined( arg3 ) ) - { - foreach ( ent in entities ) - ent thread [[ func ]]( arg1, arg2, arg3 ); - } - else if ( isdefined( arg2 ) ) - { - foreach ( ent in entities ) - ent thread [[ func ]]( arg1, arg2 ); - } - else if ( isdefined( arg1 ) ) - { - foreach ( ent in entities ) - ent thread [[ func ]]( arg1 ); - } - else - { - foreach ( ent in entities ) - ent thread [[ func ]](); - } - } - else - single_thread( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ); + if ( isarray( entities ) ) + { + if ( isDefined( arg6 ) ) + { + _a1554 = entities; + _k1554 = getFirstArrayKey( _a1554 ); + while ( isDefined( _k1554 ) ) + { + ent = _a1554[ _k1554 ]; + ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); + _k1554 = getNextArrayKey( _a1554, _k1554 ); + } + } + else if ( isDefined( arg5 ) ) + { + _a1561 = entities; + _k1561 = getFirstArrayKey( _a1561 ); + while ( isDefined( _k1561 ) ) + { + ent = _a1561[ _k1561 ]; + ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); + _k1561 = getNextArrayKey( _a1561, _k1561 ); + } + } + else if ( isDefined( arg4 ) ) + { + _a1568 = entities; + _k1568 = getFirstArrayKey( _a1568 ); + while ( isDefined( _k1568 ) ) + { + ent = _a1568[ _k1568 ]; + ent thread [[ func ]]( arg1, arg2, arg3, arg4 ); + _k1568 = getNextArrayKey( _a1568, _k1568 ); + } + } + else if ( isDefined( arg3 ) ) + { + _a1575 = entities; + _k1575 = getFirstArrayKey( _a1575 ); + while ( isDefined( _k1575 ) ) + { + ent = _a1575[ _k1575 ]; + ent thread [[ func ]]( arg1, arg2, arg3 ); + _k1575 = getNextArrayKey( _a1575, _k1575 ); + } + } + else if ( isDefined( arg2 ) ) + { + _a1582 = entities; + _k1582 = getFirstArrayKey( _a1582 ); + while ( isDefined( _k1582 ) ) + { + ent = _a1582[ _k1582 ]; + ent thread [[ func ]]( arg1, arg2 ); + _k1582 = getNextArrayKey( _a1582, _k1582 ); + } + } + else if ( isDefined( arg1 ) ) + { + _a1589 = entities; + _k1589 = getFirstArrayKey( _a1589 ); + while ( isDefined( _k1589 ) ) + { + ent = _a1589[ _k1589 ]; + ent thread [[ func ]]( arg1 ); + _k1589 = getNextArrayKey( _a1589, _k1589 ); + } + } + else _a1596 = entities; + _k1596 = getFirstArrayKey( _a1596 ); + while ( isDefined( _k1596 ) ) + { + ent = _a1596[ _k1596 ]; + ent thread [[ func ]](); + _k1596 = getNextArrayKey( _a1596, _k1596 ); + } + } + else single_thread( entities, func, arg1, arg2, arg3, arg4, arg5, arg6 ); } array_ent_thread( entities, func, arg1, arg2, arg3, arg4, arg5 ) { /# - assert( isdefined( entities ), "Undefined entity array passed to common_scriptsutility::array_ent_thread" ); + assert( isDefined( entities ), "Undefined entity array passed to common_scriptsutility::array_ent_thread" ); #/ /# - assert( isdefined( func ), "Undefined function passed to common_scriptsutility::array_ent_thread" ); + assert( isDefined( func ), "Undefined function passed to common_scriptsutility::array_ent_thread" ); #/ - if ( isarray( entities ) ) - { - if ( entities.size ) - { - keys = getarraykeys( entities ); - - for ( i = 0; i < keys.size; i++ ) - single_thread( self, func, entities[keys[i]], arg1, arg2, arg3, arg4, arg5 ); - } - } - else - single_thread( self, func, entities, arg1, arg2, arg3, arg4, arg5 ); + if ( isarray( entities ) ) + { + while ( entities.size ) + { + keys = getarraykeys( entities ); + i = 0; + while ( i < keys.size ) + { + single_thread( self, func, entities[ keys[ i ] ], arg1, arg2, arg3, arg4, arg5 ); + i++; + } + } + } + else single_thread( self, func, entities, arg1, arg2, arg3, arg4, arg5 ); } single_thread( entity, func, arg1, arg2, arg3, arg4, arg5, arg6 ) { /# - assert( isdefined( entity ), "Undefined entity passed to common_scriptsutility::single_thread()" ); + assert( isDefined( entity ), "Undefined entity passed to common_scriptsutility::single_thread()" ); #/ - if ( isdefined( arg6 ) ) - entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); - else if ( isdefined( arg5 ) ) - entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); - else if ( isdefined( arg4 ) ) - entity thread [[ func ]]( arg1, arg2, arg3, arg4 ); - else if ( isdefined( arg3 ) ) - entity thread [[ func ]]( arg1, arg2, arg3 ); - else if ( isdefined( arg2 ) ) - entity thread [[ func ]]( arg1, arg2 ); - else if ( isdefined( arg1 ) ) - entity thread [[ func ]]( arg1 ); - else - entity thread [[ func ]](); + if ( isDefined( arg6 ) ) + { + entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 ); + } + else if ( isDefined( arg5 ) ) + { + entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 ); + } + else if ( isDefined( arg4 ) ) + { + entity thread [[ func ]]( arg1, arg2, arg3, arg4 ); + } + else if ( isDefined( arg3 ) ) + { + entity thread [[ func ]]( arg1, arg2, arg3 ); + } + else if ( isDefined( arg2 ) ) + { + entity thread [[ func ]]( arg1, arg2 ); + } + else if ( isDefined( arg1 ) ) + { + entity thread [[ func ]]( arg1 ); + } + else + { + entity thread [[ func ]](); + } } remove_undefined_from_array( array ) { - newarray = []; - - for ( i = 0; i < array.size; i++ ) - { - if ( !isdefined( array[i] ) ) - continue; - - newarray[newarray.size] = array[i]; - } - - return newarray; + newarray = []; + i = 0; + while ( i < array.size ) + { + if ( !isDefined( array[ i ] ) ) + { + i++; + continue; + } + else + { + newarray[ newarray.size ] = array[ i ]; + } + i++; + } + return newarray; } trigger_on( name, type ) { - if ( isdefined( name ) ) - { - if ( !isdefined( type ) ) - type = "targetname"; - - ents = getentarray( name, type ); - array_thread( ents, ::trigger_on_proc ); - } - else - self trigger_on_proc(); + if ( isDefined( name ) ) + { + if ( !isDefined( type ) ) + { + type = "targetname"; + } + ents = getentarray( name, type ); + array_thread( ents, ::trigger_on_proc ); + } + else + { + self trigger_on_proc(); + } } trigger_on_proc() { - if ( isdefined( self.realorigin ) ) - self.origin = self.realorigin; - - self.trigger_off = undefined; + if ( isDefined( self.realorigin ) ) + { + self.origin = self.realorigin; + } + self.trigger_off = undefined; } trigger_off( name, type ) { - if ( isdefined( name ) ) - { - if ( !isdefined( type ) ) - type = "targetname"; - - ents = getentarray( name, type ); - array_thread( ents, ::trigger_off_proc ); - } - else - self trigger_off_proc(); + if ( isDefined( name ) ) + { + if ( !isDefined( type ) ) + { + type = "targetname"; + } + ents = getentarray( name, type ); + array_thread( ents, ::trigger_off_proc ); + } + else + { + self trigger_off_proc(); + } } trigger_off_proc() { - if ( !isdefined( self.trigger_off ) || !self.trigger_off ) - { - self.realorigin = self.origin; - self.origin += vectorscale( ( 0, 0, -1 ), 10000.0 ); - self.trigger_off = 1; - } + if ( !isDefined( self.trigger_off ) || !self.trigger_off ) + { + self.realorigin = self.origin; + self.origin += vectorScale( ( 0, 0, -1 ), 10000 ); + self.trigger_off = 1; + } } trigger_wait( str_name, str_key, e_entity ) { - if ( !isdefined( str_key ) ) - str_key = "targetname"; - - if ( isdefined( str_name ) ) - { - triggers = getentarray( str_name, str_key ); + if ( !isDefined( str_key ) ) + { + str_key = "targetname"; + } + if ( isDefined( str_name ) ) + { + triggers = getentarray( str_name, str_key ); /# - assert( triggers.size > 0, "trigger not found: " + str_name + " key: " + str_key ); + assert( triggers.size > 0, "trigger not found: " + str_name + " key: " + str_key ); #/ - if ( triggers.size == 1 ) - { - trigger_hit = triggers[0]; - trigger_hit _trigger_wait( e_entity ); - } - else - { - s_tracker = spawnstruct(); - array_thread( triggers, ::_trigger_wait_think, s_tracker, e_entity ); - - s_tracker waittill( "trigger", e_other, trigger_hit ); - - trigger_hit.who = e_other; - } - - level notify( str_name, trigger_hit.who ); - return trigger_hit; - } - else - return _trigger_wait( e_entity ); + if ( triggers.size == 1 ) + { + trigger_hit = triggers[ 0 ]; + trigger_hit _trigger_wait( e_entity ); + } + else + { + s_tracker = spawnstruct(); + array_thread( triggers, ::_trigger_wait_think, s_tracker, e_entity ); + s_tracker waittill( "trigger", e_other, trigger_hit ); + trigger_hit.who = e_other; + } + level notify( str_name ); + return trigger_hit; + } + else + { + return _trigger_wait( e_entity ); + } } _trigger_wait( e_entity ) { - do - { - if ( is_look_trigger( self ) ) - { - self waittill( "trigger_look", e_other ); - - continue; - } - - self waittill( "trigger", e_other ); - } - while ( isdefined( e_entity ) && e_other != e_entity ); - - self.who = e_other; - return self; + if ( is_look_trigger( self ) ) + { + self waittill( "trigger_look", e_other ); + } + else + { + self waittill( "trigger", e_other ); + } + if ( isDefined( e_entity )self.who = e_other; + return self; } _trigger_wait_think( s_tracker, e_entity ) { - self endon( "death" ); - s_tracker endon( "trigger" ); - e_other = _trigger_wait( e_entity ); - s_tracker notify( "trigger", e_other, self ); + self endon( "death" ); + s_tracker endon( "trigger" ); + e_other = _trigger_wait( e_entity ); + s_tracker notify( "trigger" ); } trigger_use( str_name, str_key, ent, b_assert ) { - if ( !isdefined( str_key ) ) - str_key = "targetname"; - - if ( !isdefined( b_assert ) ) - b_assert = 1; - - if ( !isdefined( ent ) ) - ent = get_players()[0]; - - if ( isdefined( str_name ) ) - { - e_trig = getent( str_name, str_key ); - - if ( !isdefined( e_trig ) ) - { - if ( b_assert ) - { + if ( !isDefined( str_key ) ) + { + str_key = "targetname"; + } + if ( !isDefined( b_assert ) ) + { + b_assert = 1; + } + if ( !isDefined( ent ) ) + { + ent = get_players()[ 0 ]; + } + if ( isDefined( str_name ) ) + { + e_trig = getent( str_name, str_key ); + if ( !isDefined( e_trig ) ) + { + if ( b_assert ) + { /# - assertmsg( "trigger not found: " + str_name + " key: " + str_key ); + assertmsg( "trigger not found: " + str_name + " key: " + str_key ); #/ - } - - return; - } - } - else - { - e_trig = self; - str_name = self.targetname; - } - - e_trig useby( ent ); - level notify( str_name, ent ); - - if ( is_look_trigger( e_trig ) ) - e_trig notify( "trigger_look" ); - - return e_trig; + } + return; + } + } + else + { + e_trig = self; + str_name = self.targetname; + } + e_trig useby( ent ); + level notify( str_name ); + if ( is_look_trigger( e_trig ) ) + { + e_trig notify( "trigger_look" ); + } + return e_trig; } set_trigger_flag_permissions( msg ) { - if ( !isdefined( level.trigger_flags ) || !isdefined( level.trigger_flags[msg] ) ) - return; - - level.trigger_flags[msg] = remove_undefined_from_array( level.trigger_flags[msg] ); - array_thread( level.trigger_flags[msg], ::update_trigger_based_on_flags ); + if ( !isDefined( level.trigger_flags ) || !isDefined( level.trigger_flags[ msg ] ) ) + { + return; + } + level.trigger_flags[ msg ] = remove_undefined_from_array( level.trigger_flags[ msg ] ); + array_thread( level.trigger_flags[ msg ], ::update_trigger_based_on_flags ); } update_trigger_based_on_flags() { - true_on = 1; - - if ( isdefined( self.script_flag_true ) ) - { - true_on = 0; - tokens = create_flags_and_return_tokens( self.script_flag_true ); - - for ( i = 0; i < tokens.size; i++ ) - { - if ( flag( tokens[i] ) ) - { - true_on = 1; - break; - } - } - } - - false_on = 1; - - if ( isdefined( self.script_flag_false ) ) - { - tokens = create_flags_and_return_tokens( self.script_flag_false ); - - for ( i = 0; i < tokens.size; i++ ) - { - if ( flag( tokens[i] ) ) - { - false_on = 0; - break; - } - } - } - - [[ level.trigger_func[true_on && false_on] ]](); + true_on = 1; + while ( isDefined( self.script_flag_true ) ) + { + true_on = 0; + tokens = create_flags_and_return_tokens( self.script_flag_true ); + i = 0; + while ( i < tokens.size ) + { + if ( flag( tokens[ i ] ) ) + { + true_on = 1; + break; + } + else + { + i++; + } + } + } + false_on = 1; + while ( isDefined( self.script_flag_false ) ) + { + tokens = create_flags_and_return_tokens( self.script_flag_false ); + i = 0; + while ( i < tokens.size ) + { + if ( flag( tokens[ i ] ) ) + { + false_on = 0; + break; + } + else + { + i++; + } + } + } + if ( true_on ) + { + [[ level.trigger_func[ false_on ] ]](); + } } create_flags_and_return_tokens( flags ) { - tokens = strtok( flags, " " ); - - for ( i = 0; i < tokens.size; i++ ) - { - if ( !isdefined( level.flag[tokens[i]] ) ) - flag_init( tokens[i], undefined, 1 ); - } - - return tokens; + tokens = strtok( flags, " " ); + i = 0; + while ( i < tokens.size ) + { + if ( !isDefined( level.flag[ tokens[ i ] ] ) ) + { + flag_init( tokens[ i ], undefined, 1 ); + } + i++; + } + return tokens; } init_trigger_flags() { - level.trigger_flags = []; - level.trigger_func[1] = ::trigger_on; - level.trigger_func[0] = ::trigger_off; + level.trigger_flags = []; + level.trigger_func[ 1 ] = ::trigger_on; + level.trigger_func[ 0 ] = ::trigger_off; } is_look_trigger( trig ) { - return isdefined( trig ) ? trig has_spawnflag( 256 ) && !( !isdefined( trig.classname ) && !isdefined( "trigger_damage" ) || isdefined( trig.classname ) && isdefined( "trigger_damage" ) && trig.classname == "trigger_damage" ) : 0; + if ( isDefined( trig ) ) + { + if ( trig has_spawnflag( 256 ) ) + { + if ( !isDefined( trig.classname ) && isDefined( "trigger_damage" ) && isDefined( trig.classname ) && isDefined( "trigger_damage" )} + } + else + { + } + return 0; } is_trigger_once( trig ) { - return isdefined( trig ) ? trig has_spawnflag( 1024 ) || !isdefined( self.classname ) && !isdefined( "trigger_once" ) || isdefined( self.classname ) && isdefined( "trigger_once" ) && self.classname == "trigger_once" : 0; + if ( isDefined( trig ) ) + { + if ( !trig has_spawnflag( 1024 ) ) + { + if ( !isDefined( self.classname ) && isDefined( "trigger_once" ) ) + { + if ( isDefined( self.classname ) && isDefined( "trigger_once" ) ) + { + } + } + } + } + else + { + } + return 0; } getstruct( name, type ) { - if ( !isdefined( type ) ) - type = "targetname"; + if ( !isDefined( type ) ) + { + type = "targetname"; + } /# - assert( isdefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); + assert( isDefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); #/ - array = level.struct_class_names[type][name]; - - if ( !isdefined( array ) ) - return undefined; - - if ( array.size > 1 ) - { + array = level.struct_class_names[ type ][ name ]; + if ( !isDefined( array ) ) + { + return undefined; + } + if ( array.size > 1 ) + { /# - assertmsg( "getstruct used for more than one struct of type " + type + " called " + name + "." ); + assertmsg( "getstruct used for more than one struct of type " + type + " called " + name + "." ); #/ - return undefined; - } - - return array[0]; + return undefined; + } + return array[ 0 ]; } getstructarray( name, type ) { - if ( !isdefined( type ) ) - type = "targetname"; + if ( !isDefined( type ) ) + { + type = "targetname"; + } /# - assert( isdefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); + assert( isDefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); #/ - array = level.struct_class_names[type][name]; - - if ( !isdefined( array ) ) - return []; - - return array; + array = level.struct_class_names[ type ][ name ]; + if ( !isDefined( array ) ) + { + return []; + } + return array; } structdelete() { - if ( isdefined( self.target ) && isdefined( level.struct_class_names["target"][self.target] ) ) - level.struct_class_names["target"][self.target] = undefined; - - if ( isdefined( self.targetname ) && isdefined( level.struct_class_names["targetname"][self.targetname] ) ) - level.struct_class_names["targetname"][self.targetname] = undefined; - - if ( isdefined( self.script_noteworthy ) && isdefined( level.struct_class_names["script_noteworthy"][self.script_noteworthy] ) ) - level.struct_class_names["script_noteworthy"][self.script_noteworthy] = undefined; - - if ( isdefined( self.script_linkname ) && isdefined( level.struct_class_names["script_linkname"][self.script_linkname] ) ) - level.struct_class_names["script_linkname"][self.script_linkname] = undefined; + if ( isDefined( self.target ) && isDefined( level.struct_class_names[ "target" ][ self.target ] ) ) + { + } + if ( isDefined( self.targetname ) && isDefined( level.struct_class_names[ "targetname" ][ self.targetname ] ) ) + { + } + if ( isDefined( self.script_noteworthy ) && isDefined( level.struct_class_names[ "script_noteworthy" ][ self.script_noteworthy ] ) ) + { + } + if ( isDefined( self.script_linkname ) && isDefined( level.struct_class_names[ "script_linkname" ][ self.script_linkname ] ) ) + { + } } struct_class_init() { /# - assert( !isdefined( level.struct_class_names ), "level.struct_class_names is being initialized in the wrong place! It shouldn't be initialized yet." ); + assert( !isDefined( level.struct_class_names ), "level.struct_class_names is being initialized in the wrong place! It shouldn't be initialized yet." ); #/ - level.struct_class_names = []; - level.struct_class_names["target"] = []; - level.struct_class_names["targetname"] = []; - level.struct_class_names["script_noteworthy"] = []; - level.struct_class_names["script_linkname"] = []; - level.struct_class_names["script_unitrigger_type"] = []; - - foreach ( s_struct in level.struct ) - { - if ( isdefined( s_struct.targetname ) ) - { - if ( !isdefined( level.struct_class_names["targetname"][s_struct.targetname] ) ) - level.struct_class_names["targetname"][s_struct.targetname] = []; - - size = level.struct_class_names["targetname"][s_struct.targetname].size; - level.struct_class_names["targetname"][s_struct.targetname][size] = s_struct; - } - - if ( isdefined( s_struct.target ) ) - { - if ( !isdefined( level.struct_class_names["target"][s_struct.target] ) ) - level.struct_class_names["target"][s_struct.target] = []; - - size = level.struct_class_names["target"][s_struct.target].size; - level.struct_class_names["target"][s_struct.target][size] = s_struct; - } - - if ( isdefined( s_struct.script_noteworthy ) ) - { - if ( !isdefined( level.struct_class_names["script_noteworthy"][s_struct.script_noteworthy] ) ) - level.struct_class_names["script_noteworthy"][s_struct.script_noteworthy] = []; - - size = level.struct_class_names["script_noteworthy"][s_struct.script_noteworthy].size; - level.struct_class_names["script_noteworthy"][s_struct.script_noteworthy][size] = s_struct; - } - - if ( isdefined( s_struct.script_linkname ) ) - { + level.struct_class_names = []; + level.struct_class_names[ "target" ] = []; + level.struct_class_names[ "targetname" ] = []; + level.struct_class_names[ "script_noteworthy" ] = []; + level.struct_class_names[ "script_linkname" ] = []; + level.struct_class_names[ "script_unitrigger_type" ] = []; + _a2064 = level.struct; + _k2064 = getFirstArrayKey( _a2064 ); + while ( isDefined( _k2064 ) ) + { + s_struct = _a2064[ _k2064 ]; + if ( isDefined( s_struct.targetname ) ) + { + if ( !isDefined( level.struct_class_names[ "targetname" ][ s_struct.targetname ] ) ) + { + level.struct_class_names[ "targetname" ][ s_struct.targetname ] = []; + } + size = level.struct_class_names[ "targetname" ][ s_struct.targetname ].size; + level.struct_class_names[ "targetname" ][ s_struct.targetname ][ size ] = s_struct; + } + if ( isDefined( s_struct.target ) ) + { + if ( !isDefined( level.struct_class_names[ "target" ][ s_struct.target ] ) ) + { + level.struct_class_names[ "target" ][ s_struct.target ] = []; + } + size = level.struct_class_names[ "target" ][ s_struct.target ].size; + level.struct_class_names[ "target" ][ s_struct.target ][ size ] = s_struct; + } + if ( isDefined( s_struct.script_noteworthy ) ) + { + if ( !isDefined( level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ] ) ) + { + level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ] = []; + } + size = level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ].size; + level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ][ size ] = s_struct; + } + if ( isDefined( s_struct.script_linkname ) ) + { /# - assert( !isdefined( level.struct_class_names["script_linkname"][s_struct.script_linkname] ), "Two structs have the same linkname" ); + assert( !isDefined( level.struct_class_names[ "script_linkname" ][ s_struct.script_linkname ] ), "Two structs have the same linkname" ); #/ - level.struct_class_names["script_linkname"][s_struct.script_linkname][0] = s_struct; - } - - if ( isdefined( s_struct.script_unitrigger_type ) ) - { - if ( !isdefined( level.struct_class_names["script_unitrigger_type"][s_struct.script_unitrigger_type] ) ) - level.struct_class_names["script_unitrigger_type"][s_struct.script_unitrigger_type] = []; - - size = level.struct_class_names["script_unitrigger_type"][s_struct.script_unitrigger_type].size; - level.struct_class_names["script_unitrigger_type"][s_struct.script_unitrigger_type][size] = s_struct; - } - } + level.struct_class_names[ "script_linkname" ][ s_struct.script_linkname ][ 0 ] = s_struct; + } + if ( isDefined( s_struct.script_unitrigger_type ) ) + { + if ( !isDefined( level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ] ) ) + { + level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ] = []; + } + size = level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ].size; + level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ][ size ] = s_struct; + } + _k2064 = getNextArrayKey( _a2064, _k2064 ); + } } fileprint_start( file ) { /# - filename = file; - file = openfile( filename, "write" ); - level.fileprint = file; - level.fileprintlinecount = 0; - level.fileprint_filename = filename; + filename = file; + file = openfile( filename, "write" ); + level.fileprint = file; + level.fileprintlinecount = 0; + level.fileprint_filename = filename; #/ } fileprint_map_start( file ) { /# - file = "map_source/" + file + ".map"; - fileprint_start( file ); - level.fileprint_mapentcount = 0; - fileprint_map_header( 1 ); + file = "map_source/" + file + ".map"; + fileprint_start( file ); + level.fileprint_mapentcount = 0; + fileprint_map_header( 1 ); #/ } fileprint_chk( file, str ) { /# - level.fileprintlinecount++; - - if ( level.fileprintlinecount > 400 ) - { - wait 0.05; - level.fileprintlinecount++; - level.fileprintlinecount = 0; - } - - fprintln( file, str ); + level.fileprintlinecount++; + if ( level.fileprintlinecount > 400 ) + { + wait 0,05; + level.fileprintlinecount++; + level.fileprintlinecount = 0; + } + fprintln( file, str ); #/ } fileprint_map_header( binclude_blank_worldspawn ) { - if ( !isdefined( binclude_blank_worldspawn ) ) - binclude_blank_worldspawn = 0; + if ( !isDefined( binclude_blank_worldspawn ) ) + { + binclude_blank_worldspawn = 0; + } /# - assert( isdefined( level.fileprint ) ); + assert( isDefined( level.fileprint ) ); #/ /# - fileprint_chk( level.fileprint, "iwmap 4" ); - fileprint_chk( level.fileprint, "\"000_Global\" flags active" ); - fileprint_chk( level.fileprint, "\"The Map\" flags" ); - - if ( !binclude_blank_worldspawn ) - return; - - fileprint_map_entity_start(); - fileprint_map_keypairprint( "classname", "worldspawn" ); - fileprint_map_entity_end(); + fileprint_chk( level.fileprint, "iwmap 4" ); + fileprint_chk( level.fileprint, ""000_Global" flags active" ); + fileprint_chk( level.fileprint, ""The Map" flags" ); + if ( !binclude_blank_worldspawn ) + { + return; + } + fileprint_map_entity_start(); + fileprint_map_keypairprint( "classname", "worldspawn" ); + fileprint_map_entity_end(); #/ } fileprint_map_keypairprint( key1, key2 ) { /# - assert( isdefined( level.fileprint ) ); - fileprint_chk( level.fileprint, "\"" + key1 + "\" \"" + key2 + "\"" ); + assert( isDefined( level.fileprint ) ); + fileprint_chk( level.fileprint, """ + key1 + "" "" + key2 + """ ); #/ } fileprint_map_entity_start() { /# - assert( !isdefined( level.fileprint_entitystart ) ); - level.fileprint_entitystart = 1; - assert( isdefined( level.fileprint ) ); - fileprint_chk( level.fileprint, "// entity " + level.fileprint_mapentcount ); - fileprint_chk( level.fileprint, "{" ); - level.fileprint_mapentcount++; + assert( !isDefined( level.fileprint_entitystart ) ); + level.fileprint_entitystart = 1; + assert( isDefined( level.fileprint ) ); + fileprint_chk( level.fileprint, "// entity " + level.fileprint_mapentcount ); + fileprint_chk( level.fileprint, "{" ); + level.fileprint_mapentcount++; #/ } fileprint_map_entity_end() { /# - assert( isdefined( level.fileprint_entitystart ) ); - assert( isdefined( level.fileprint ) ); - level.fileprint_entitystart = undefined; - fileprint_chk( level.fileprint, "}" ); + assert( isDefined( level.fileprint_entitystart ) ); + assert( isDefined( level.fileprint ) ); + level.fileprint_entitystart = undefined; + fileprint_chk( level.fileprint, "}" ); #/ } fileprint_end() { /# - assert( !isdefined( level.fileprint_entitystart ) ); - saved = closefile( level.fileprint ); - - if ( saved != 1 ) - { - println( "-----------------------------------" ); - println( " " ); - println( "file write failure" ); - println( "file with name: " + level.fileprint_filename ); - println( "make sure you checkout the file you are trying to save" ); - println( "note: USE P4 Search to find the file and check that one out" ); - println( " Do not checkin files in from the xenonoutput folder, " ); - println( " this is junctioned to the proper directory where you need to go" ); - println( "junctions looks like this" ); - println( " " ); - println( "..\xenonOutput\scriptdata\createfx ..\share\raw\maps\createfx" ); - println( "..\xenonOutput\scriptdata\createart ..\share\raw\maps\createart" ); - println( "..\xenonOutput\scriptdata\vision ..\share\raw\vision" ); - println( "..\xenonOutput\scriptdata\scriptgen ..\share\raw\maps\scriptgen" ); - println( "..\xenonOutput\scriptdata\zone_source ..\xenon\zone_source" ); - println( "..\xenonOutput\accuracy ..\share\raw\accuracy" ); - println( "..\xenonOutput\scriptdata\map_source ..\map_source\xenon_export" ); - println( " " ); - println( "-----------------------------------" ); - println( "File not saved( see console.log for info ) " ); - } - - level.fileprint = undefined; - level.fileprint_filename = undefined; + assert( !isDefined( level.fileprint_entitystart ) ); + saved = closefile( level.fileprint ); + if ( saved != 1 ) + { + println( "-----------------------------------" ); + println( " " ); + println( "file write failure" ); + println( "file with name: " + level.fileprint_filename ); + println( "make sure you checkout the file you are trying to save" ); + println( "note: USE P4 Search to find the file and check that one out" ); + println( " Do not checkin files in from the xenonoutput folder, " ); + println( " this is junctioned to the proper directory where you need to go" ); + println( "junctions looks like this" ); + println( " " ); + println( "..\\xenonOutput\\scriptdata\\createfx ..\\share\\raw\\maps\\createfx" ); + println( "..\\xenonOutput\\scriptdata\\createart ..\\share\\raw\\maps\\createart" ); + println( "..\\xenonOutput\\scriptdata\\vision ..\\share\\raw\\vision" ); + println( "..\\xenonOutput\\scriptdata\\scriptgen ..\\share\\raw\\maps\\scriptgen" ); + println( "..\\xenonOutput\\scriptdata\\zone_source ..\\xenon\\zone_source" ); + println( "..\\xenonOutput\\accuracy ..\\share\\raw\\accuracy" ); + println( "..\\xenonOutput\\scriptdata\\map_source ..\\map_source\\xenon_export" ); + println( " " ); + println( "-----------------------------------" ); + println( "File not saved( see console.log for info ) " ); + } + level.fileprint = undefined; + level.fileprint_filename = undefined; #/ } fileprint_radiant_vec( vector ) { /# - string = "" + vector[0] + " " + vector[1] + " " + vector[2] + ""; - return string; + string = "" + vector[ 0 ] + " " + vector[ 1 ] + " " + vector[ 2 ] + ""; + return string; #/ } is_mature() { - if ( level.onlinegame ) - return 1; - - return getlocalprofileint( "cg_mature" ); + if ( level.onlinegame ) + { + return 1; + } + return getlocalprofileint( "cg_mature" ); } is_german_build() { - if ( level.language == "german" ) - return true; - - return false; + if ( level.language == "german" ) + { + return 1; + } + return 0; } is_gib_restricted_build() { - if ( getdvar( "language" ) == "japanese" ) - return true; - - return false; + if ( getDvar( "language" ) == "japanese" ) + { + return 1; + } + return 0; } is_true( check ) { - return isdefined( check ) && check; + if ( isDefined( check ) && check ) + { + return 1; + } + return 0; } is_false( check ) { - return isdefined( check ) && !check; + if ( isDefined( check ) ) + { + return !check; + } } has_spawnflag( spawnflags ) { - if ( isdefined( self.spawnflags ) ) - return ( self.spawnflags & spawnflags ) == spawnflags; - - return 0; + if ( isDefined( self.spawnflags ) ) + { + return ( self.spawnflags & spawnflags ) == spawnflags; + } + return 0; } clamp( val, val_min, val_max ) { - if ( val < val_min ) - val = val_min; - else if ( val > val_max ) - val = val_max; - - return val; + if ( val < val_min ) + { + val = val_min; + } + else + { + if ( val > val_max ) + { + val = val_max; + } + } + return val; } linear_map( num, min_a, max_a, min_b, max_b ) { - return clamp( ( num - min_a ) / ( max_a - min_a ) * ( max_b - min_b ) + min_b, min_b, max_b ); + return clamp( ( ( ( num - min_a ) / ( max_a - min_a ) ) * ( max_b - min_b ) ) + min_b, min_b, max_b ); } lag( desired, curr, k, dt ) { - r = 0.0; - - if ( k * dt >= 1.0 || k <= 0.0 ) - r = desired; - else - { - err = desired - curr; - r = curr + k * err * dt; - } - - return r; + r = 0; + if ( ( k * dt ) >= 1 || k <= 0 ) + { + r = desired; + } + else + { + err = desired - curr; + r = curr + ( k * err * dt ); + } + return r; } death_notify_wrapper( attacker, damagetype ) { - level notify( "face", "death", self ); - self notify( "death", attacker, damagetype ); + level notify( "face" ); + self notify( "death" ); } damage_notify_wrapper( damage, attacker, direction_vec, point, type, modelname, tagname, partname, idflags ) { - level notify( "face", "damage", self ); - self notify( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, idflags ); + level notify( "face" ); + self notify( "damage" ); } explode_notify_wrapper() { - level notify( "face", "explode", self ); - self notify( "explode" ); + level notify( "face" ); + self notify( "explode" ); } alert_notify_wrapper() { - level notify( "face", "alert", self ); - self notify( "alert" ); + level notify( "face" ); + self notify( "alert" ); } shoot_notify_wrapper() { - level notify( "face", "shoot", self ); - self notify( "shoot" ); + level notify( "face" ); + self notify( "shoot" ); } melee_notify_wrapper() { - level notify( "face", "melee", self ); - self notify( "melee" ); + level notify( "face" ); + self notify( "melee" ); } isusabilityenabled() { - return !self.disabledusability; + return !self.disabledusability; } _disableusability() { - self.disabledusability++; - self disableusability(); + self.disabledusability++; + self disableusability(); } _enableusability() { - self.disabledusability--; + self.disabledusability--; + /# - assert( self.disabledusability >= 0 ); + assert( self.disabledusability >= 0 ); #/ - if ( !self.disabledusability ) - self enableusability(); + if ( !self.disabledusability ) + { + self enableusability(); + } } resetusability() { - self.disabledusability = 0; - self enableusability(); + self.disabledusability = 0; + self enableusability(); } _disableweapon() { - if ( !isdefined( self.disabledweapon ) ) - self.disabledweapon = 0; - - self.disabledweapon++; - self disableweapons(); + if ( !isDefined( self.disabledweapon ) ) + { + self.disabledweapon = 0; + } + self.disabledweapon++; + self disableweapons(); } _enableweapon() { - self.disabledweapon--; + self.disabledweapon--; + /# - assert( self.disabledweapon >= 0 ); + assert( self.disabledweapon >= 0 ); #/ - if ( !self.disabledweapon ) - self enableweapons(); + if ( !self.disabledweapon ) + { + self enableweapons(); + } } isweaponenabled() { - return !self.disabledweapon; + return !self.disabledweapon; } delay_thread( timer, func, param1, param2, param3, param4, param5, param6 ) { - self thread _delay_thread_proc( func, timer, param1, param2, param3, param4, param5, param6 ); + self thread _delay_thread_proc( func, timer, param1, param2, param3, param4, param5, param6 ); } _delay_thread_proc( func, timer, param1, param2, param3, param4, param5, param6 ) { - self endon( "death" ); - self endon( "disconnect" ); - wait( timer ); - single_thread( self, func, param1, param2, param3, param4, param5, param6 ); + self endon( "death" ); + self endon( "disconnect" ); + wait timer; + single_thread( self, func, param1, param2, param3, param4, param5, param6 ); } delay_notify( str_notify, n_delay, str_endon ) { /# - assert( isdefined( str_notify ) ); + assert( isDefined( str_notify ) ); #/ /# - assert( isdefined( n_delay ) ); + assert( isDefined( n_delay ) ); #/ - self thread _delay_notify_proc( str_notify, n_delay, str_endon ); + self thread _delay_notify_proc( str_notify, n_delay, str_endon ); } _delay_notify_proc( str_notify, n_delay, str_endon ) { - self endon( "death" ); - - if ( isdefined( str_endon ) ) - self endon( str_endon ); - - if ( n_delay > 0 ) - wait( n_delay ); - - self notify( str_notify ); + self endon( "death" ); + if ( isDefined( str_endon ) ) + { + self endon( str_endon ); + } + if ( n_delay > 0 ) + { + wait n_delay; + } + self notify( str_notify ); } notify_delay_with_ender( snotifystring, fdelay, ender ) { - if ( isdefined( ender ) ) - level endon( ender ); + if ( isDefined( ender ) ) + { + level endon( ender ); + } /# - assert( isdefined( self ) ); + assert( isDefined( self ) ); #/ /# - assert( isdefined( snotifystring ) ); + assert( isDefined( snotifystring ) ); #/ /# - assert( isdefined( fdelay ) ); + assert( isDefined( fdelay ) ); #/ - self endon( "death" ); - - if ( fdelay > 0 ) - wait( fdelay ); - - if ( !isdefined( self ) ) - return; - - self notify( snotifystring ); + self endon( "death" ); + if ( fdelay > 0 ) + { + wait fdelay; + } + if ( !isDefined( self ) ) + { + return; + } + self notify( snotifystring ); } diff --git a/Zombie Core/patch_zm/maps/mp/_art.gsc b/Zombie Core/patch_zm/maps/mp/_art.gsc index 050b7f2..84313fc 100644 --- a/Zombie Core/patch_zm/maps/mp/_art.gsc +++ b/Zombie Core/patch_zm/maps/mp/_art.gsc @@ -1,447 +1,497 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; +#include maps/mp/_utility; +#include common_scripts/utility; main() { /# - if ( getdvar( "scr_art_tweak" ) == "" || getdvar( "scr_art_tweak" ) == "0" ) - setdvar( "scr_art_tweak", 0 ); - - if ( getdvar( "scr_dof_enable" ) == "" ) - setdvar( "scr_dof_enable", "1" ); - - if ( getdvar( "scr_cinematic_autofocus" ) == "" ) - setdvar( "scr_cinematic_autofocus", "1" ); - - if ( getdvar( "scr_art_visionfile" ) == "" && isdefined( level.script ) ) - setdvar( "scr_art_visionfile", level.script ); - - if ( getdvar( "debug_reflection" ) == "" ) - setdvar( "debug_reflection", "0" ); - - if ( getdvar( "debug_reflection_matte" ) == "" ) - setdvar( "debug_reflection_matte", "0" ); - - if ( getdvar( "debug_color_pallete" ) == "" ) - setdvar( "debug_color_pallete", "0" ); - - precachemodel( "test_sphere_lambert" ); - precachemodel( "test_macbeth_chart" ); - precachemodel( "test_macbeth_chart_unlit" ); - precachemodel( "test_sphere_silver" ); - level thread debug_reflection(); - level thread debug_reflection_matte(); - level thread debug_color_pallete(); + if ( getDvar( "scr_art_tweak" ) == "" || getDvar( "scr_art_tweak" ) == "0" ) + { + setdvar( "scr_art_tweak", 0 ); + } + if ( getDvar( "scr_dof_enable" ) == "" ) + { + setdvar( "scr_dof_enable", "1" ); + } + if ( getDvar( "scr_cinematic_autofocus" ) == "" ) + { + setdvar( "scr_cinematic_autofocus", "1" ); + } + if ( getDvar( "scr_art_visionfile" ) == "" && isDefined( level.script ) ) + { + setdvar( "scr_art_visionfile", level.script ); + } + if ( getDvar( "debug_reflection" ) == "" ) + { + setdvar( "debug_reflection", "0" ); + } + if ( getDvar( "debug_reflection_matte" ) == "" ) + { + setdvar( "debug_reflection_matte", "0" ); + } + if ( getDvar( "debug_color_pallete" ) == "" ) + { + setdvar( "debug_color_pallete", "0" ); + } + precachemodel( "test_sphere_lambert" ); + precachemodel( "test_macbeth_chart" ); + precachemodel( "test_macbeth_chart_unlit" ); + precachemodel( "test_sphere_silver" ); + level thread debug_reflection(); + level thread debug_reflection_matte(); + level thread debug_color_pallete(); #/ - if ( !isdefined( level.dofdefault ) ) - { - level.dofdefault["nearStart"] = 0; - level.dofdefault["nearEnd"] = 1; - level.dofdefault["farStart"] = 8000; - level.dofdefault["farEnd"] = 10000; - level.dofdefault["nearBlur"] = 6; - level.dofdefault["farBlur"] = 0; - } - - level.curdof = ( level.dofdefault["farStart"] - level.dofdefault["nearEnd"] ) / 2; + if ( !isDefined( level.dofdefault ) ) + { + level.dofdefault[ "nearStart" ] = 0; + level.dofdefault[ "nearEnd" ] = 1; + level.dofdefault[ "farStart" ] = 8000; + level.dofdefault[ "farEnd" ] = 10000; + level.dofdefault[ "nearBlur" ] = 6; + level.dofdefault[ "farBlur" ] = 0; + } + level.curdof = ( level.dofdefault[ "farStart" ] - level.dofdefault[ "nearEnd" ] ) / 2; /# - thread tweakart(); + thread tweakart(); #/ - if ( !isdefined( level.script ) ) - level.script = tolower( getdvar( "mapname" ) ); + if ( !isDefined( level.script ) ) + { + level.script = tolower( getDvar( "mapname" ) ); + } } artfxprintln( file, string ) { /# - if ( file == -1 ) - return; - - fprintln( file, string ); + if ( file == -1 ) + { + return; + } + fprintln( file, string ); #/ } strtok_loc( string, par1 ) { - stringlist = []; - indexstring = ""; - - for ( i = 0; i < string.size; i++ ) - { - if ( string[i] == " " ) - { - stringlist[stringlist.size] = indexstring; - indexstring = ""; - continue; - } - - indexstring += string[i]; - } - - if ( indexstring.size ) - stringlist[stringlist.size] = indexstring; - - return stringlist; + stringlist = []; + indexstring = ""; + i = 0; + while ( i < string.size ) + { + if ( string[ i ] == " " ) + { + stringlist[ stringlist.size ] = indexstring; + indexstring = ""; + i++; + continue; + } + else + { + indexstring += string[ i ]; + } + i++; + } + if ( indexstring.size ) + { + stringlist[ stringlist.size ] = indexstring; + } + return stringlist; } setfogsliders() { - fogall = strtok_loc( getdvar( "g_fogColorReadOnly" ), " " ); - red = fogall[0]; - green = fogall[1]; - blue = fogall[2]; - halfplane = getdvar( "g_fogHalfDistReadOnly" ); - nearplane = getdvar( "g_fogStartDistReadOnly" ); - - if ( !isdefined( red ) || !isdefined( green ) || !isdefined( blue ) || !isdefined( halfplane ) ) - { - red = 1; - green = 1; - blue = 1; - halfplane = 10000001; - nearplane = 10000000; - } - - setdvar( "scr_fog_exp_halfplane", halfplane ); - setdvar( "scr_fog_nearplane", nearplane ); - setdvar( "scr_fog_color", red + " " + green + " " + blue ); + fogall = strtok_loc( getDvar( "g_fogColorReadOnly" ), " " ); + red = fogall[ 0 ]; + green = fogall[ 1 ]; + blue = fogall[ 2 ]; + halfplane = getDvar( "g_fogHalfDistReadOnly" ); + nearplane = getDvar( "g_fogStartDistReadOnly" ); + if ( isDefined( red ) && isDefined( green ) || !isDefined( blue ) && !isDefined( halfplane ) ) + { + red = 1; + green = 1; + blue = 1; + halfplane = 10000001; + nearplane = 10000000; + } + setdvar( "scr_fog_exp_halfplane", halfplane ); + setdvar( "scr_fog_nearplane", nearplane ); + setdvar( "scr_fog_color", ( red + " " ) + green + " " + blue ); } tweakart() { /# - if ( !isdefined( level.tweakfile ) ) - level.tweakfile = 0; - - if ( getdvar( "scr_fog_baseheight" ) == "" ) - { - setdvar( "scr_fog_exp_halfplane", "500" ); - setdvar( "scr_fog_exp_halfheight", "500" ); - setdvar( "scr_fog_nearplane", "0" ); - setdvar( "scr_fog_baseheight", "0" ); - } - - setdvar( "scr_fog_fraction", "1.0" ); - setdvar( "scr_art_dump", "0" ); - setdvar( "scr_art_sun_fog_dir_set", "0" ); - setdvar( "scr_dof_nearStart", level.dofdefault["nearStart"] ); - setdvar( "scr_dof_nearEnd", level.dofdefault["nearEnd"] ); - setdvar( "scr_dof_farStart", level.dofdefault["farStart"] ); - setdvar( "scr_dof_farEnd", level.dofdefault["farEnd"] ); - setdvar( "scr_dof_nearBlur", level.dofdefault["nearBlur"] ); - setdvar( "scr_dof_farBlur", level.dofdefault["farBlur"] ); - file = undefined; - filename = undefined; - tweak_toggle = 1; - - for (;;) - { - while ( getdvarint( "scr_art_tweak" ) == 0 ) - { - tweak_toggle = 1; - wait 0.05; - } - - if ( tweak_toggle ) - { - tweak_toggle = 0; - fogsettings = getfogsettings(); - setdvar( "scr_fog_nearplane", fogsettings[0] ); - setdvar( "scr_fog_exp_halfplane", fogsettings[1] ); - setdvar( "scr_fog_exp_halfheight", fogsettings[3] ); - setdvar( "scr_fog_baseheight", fogsettings[2] ); - setdvar( "scr_fog_color", fogsettings[4] + " " + fogsettings[5] + " " + fogsettings[6] ); - setdvar( "scr_fog_color_scale", fogsettings[7] ); - setdvar( "scr_sun_fog_color", fogsettings[8] + " " + fogsettings[9] + " " + fogsettings[10] ); - level.fogsundir = []; - level.fogsundir[0] = fogsettings[11]; - level.fogsundir[1] = fogsettings[12]; - level.fogsundir[2] = fogsettings[13]; - setdvar( "scr_sun_fog_start_angle", fogsettings[14] ); - setdvar( "scr_sun_fog_end_angle", fogsettings[15] ); - setdvar( "scr_fog_max_opacity", fogsettings[16] ); - } - - level.fogexphalfplane = getdvarfloat( "scr_fog_exp_halfplane" ); - level.fogexphalfheight = getdvarfloat( "scr_fog_exp_halfheight" ); - level.fognearplane = getdvarfloat( "scr_fog_nearplane" ); - level.fogbaseheight = getdvarfloat( "scr_fog_baseheight" ); - level.fogcolorred = getdvarcolorred( "scr_fog_color" ); - level.fogcolorgreen = getdvarcolorgreen( "scr_fog_color" ); - level.fogcolorblue = getdvarcolorblue( "scr_fog_color" ); - level.fogcolorscale = getdvarfloat( "scr_fog_color_scale" ); - level.sunfogcolorred = getdvarcolorred( "scr_sun_fog_color" ); - level.sunfogcolorgreen = getdvarcolorgreen( "scr_sun_fog_color" ); - level.sunfogcolorblue = getdvarcolorblue( "scr_sun_fog_color" ); - level.sunstartangle = getdvarfloat( "scr_sun_fog_start_angle" ); - level.sunendangle = getdvarfloat( "scr_sun_fog_end_angle" ); - level.fogmaxopacity = getdvarfloat( "scr_fog_max_opacity" ); - - if ( getdvarint( "scr_art_sun_fog_dir_set" ) ) - { - setdvar( "scr_art_sun_fog_dir_set", "0" ); - println( "Setting sun fog direction to facing of player" ); - players = get_players(); - dir = vectornormalize( anglestoforward( players[0] getplayerangles() ) ); - level.fogsundir = []; - level.fogsundir[0] = dir[0]; - level.fogsundir[1] = dir[1]; - level.fogsundir[2] = dir[2]; - } - - fovslidercheck(); - dumpsettings(); - - if ( !getdvarint( _hash_DBBD8F3B ) ) - { - if ( !isdefined( level.fogsundir ) ) - { - level.fogsundir = []; - level.fogsundir[0] = 1; - level.fogsundir[1] = 0; - level.fogsundir[2] = 0; - } - - setvolfog( level.fognearplane, level.fogexphalfplane, level.fogexphalfheight, level.fogbaseheight, level.fogcolorred, level.fogcolorgreen, level.fogcolorblue, level.fogcolorscale, level.sunfogcolorred, level.sunfogcolorgreen, level.sunfogcolorblue, level.fogsundir[0], level.fogsundir[1], level.fogsundir[2], level.sunstartangle, level.sunendangle, 0, level.fogmaxopacity ); - } - else - setexpfog( 100000000, 100000001, 0, 0, 0, 0 ); - - wait 0.1; - } + if ( !isDefined( level.tweakfile ) ) + { + level.tweakfile = 0; + } + if ( getDvar( "scr_fog_baseheight" ) == "" ) + { + setdvar( "scr_fog_exp_halfplane", "500" ); + setdvar( "scr_fog_exp_halfheight", "500" ); + setdvar( "scr_fog_nearplane", "0" ); + setdvar( "scr_fog_baseheight", "0" ); + } + setdvar( "scr_fog_fraction", "1.0" ); + setdvar( "scr_art_dump", "0" ); + setdvar( "scr_art_sun_fog_dir_set", "0" ); + setdvar( "scr_dof_nearStart", level.dofdefault[ "nearStart" ] ); + setdvar( "scr_dof_nearEnd", level.dofdefault[ "nearEnd" ] ); + setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] ); + setdvar( "scr_dof_farEnd", level.dofdefault[ "farEnd" ] ); + setdvar( "scr_dof_nearBlur", level.dofdefault[ "nearBlur" ] ); + setdvar( "scr_dof_farBlur", level.dofdefault[ "farBlur" ] ); + file = undefined; + filename = undefined; + tweak_toggle = 1; + for ( ;; ) + { + while ( getDvarInt( "scr_art_tweak" ) == 0 ) + { + tweak_toggle = 1; + wait 0,05; + } + if ( tweak_toggle ) + { + tweak_toggle = 0; + fogsettings = getfogsettings(); + setdvar( "scr_fog_nearplane", fogsettings[ 0 ] ); + setdvar( "scr_fog_exp_halfplane", fogsettings[ 1 ] ); + setdvar( "scr_fog_exp_halfheight", fogsettings[ 3 ] ); + setdvar( "scr_fog_baseheight", fogsettings[ 2 ] ); + setdvar( "scr_fog_color", fogsettings[ 4 ] + " " + fogsettings[ 5 ] + " " + fogsettings[ 6 ] ); + setdvar( "scr_fog_color_scale", fogsettings[ 7 ] ); + setdvar( "scr_sun_fog_color", fogsettings[ 8 ] + " " + fogsettings[ 9 ] + " " + fogsettings[ 10 ] ); + level.fogsundir = []; + level.fogsundir[ 0 ] = fogsettings[ 11 ]; + level.fogsundir[ 1 ] = fogsettings[ 12 ]; + level.fogsundir[ 2 ] = fogsettings[ 13 ]; + setdvar( "scr_sun_fog_start_angle", fogsettings[ 14 ] ); + setdvar( "scr_sun_fog_end_angle", fogsettings[ 15 ] ); + setdvar( "scr_fog_max_opacity", fogsettings[ 16 ] ); + } + level.fogexphalfplane = getDvarFloat( "scr_fog_exp_halfplane" ); + level.fogexphalfheight = getDvarFloat( "scr_fog_exp_halfheight" ); + level.fognearplane = getDvarFloat( "scr_fog_nearplane" ); + level.fogbaseheight = getDvarFloat( "scr_fog_baseheight" ); + level.fogcolorred = getDvarColorRed( "scr_fog_color" ); + level.fogcolorgreen = getDvarColorGreen( "scr_fog_color" ); + level.fogcolorblue = getDvarColorBlue( "scr_fog_color" ); + level.fogcolorscale = getDvarFloat( "scr_fog_color_scale" ); + level.sunfogcolorred = getDvarColorRed( "scr_sun_fog_color" ); + level.sunfogcolorgreen = getDvarColorGreen( "scr_sun_fog_color" ); + level.sunfogcolorblue = getDvarColorBlue( "scr_sun_fog_color" ); + level.sunstartangle = getDvarFloat( "scr_sun_fog_start_angle" ); + level.sunendangle = getDvarFloat( "scr_sun_fog_end_angle" ); + level.fogmaxopacity = getDvarFloat( "scr_fog_max_opacity" ); + if ( getDvarInt( "scr_art_sun_fog_dir_set" ) ) + { + setdvar( "scr_art_sun_fog_dir_set", "0" ); + println( "Setting sun fog direction to facing of player" ); + players = get_players(); + dir = vectornormalize( anglesToForward( players[ 0 ] getplayerangles() ) ); + level.fogsundir = []; + level.fogsundir[ 0 ] = dir[ 0 ]; + level.fogsundir[ 1 ] = dir[ 1 ]; + level.fogsundir[ 2 ] = dir[ 2 ]; + } + fovslidercheck(); + dumpsettings(); + if ( !getDvarInt( "scr_fog_disable" ) ) + { + if ( !isDefined( level.fogsundir ) ) + { + level.fogsundir = []; + level.fogsundir[ 0 ] = 1; + level.fogsundir[ 1 ] = 0; + level.fogsundir[ 2 ] = 0; + } + setvolfog( level.fognearplane, level.fogexphalfplane, level.fogexphalfheight, level.fogbaseheight, level.fogcolorred, level.fogcolorgreen, level.fogcolorblue, level.fogcolorscale, level.sunfogcolorred, level.sunfogcolorgreen, level.sunfogcolorblue, level.fogsundir[ 0 ], level.fogsundir[ 1 ], level.fogsundir[ 2 ], level.sunstartangle, level.sunendangle, 0, level.fogmaxopacity ); + } + else + { + setexpfog( 100000000, 100000001, 0, 0, 0, 0 ); + } + wait 0,1; #/ + } } fovslidercheck() { - if ( level.dofdefault["nearStart"] >= level.dofdefault["nearEnd"] ) - { - level.dofdefault["nearStart"] = level.dofdefault["nearEnd"] - 1; - setdvar( "scr_dof_nearStart", level.dofdefault["nearStart"] ); - } - - if ( level.dofdefault["nearEnd"] <= level.dofdefault["nearStart"] ) - { - level.dofdefault["nearEnd"] = level.dofdefault["nearStart"] + 1; - setdvar( "scr_dof_nearEnd", level.dofdefault["nearEnd"] ); - } - - if ( level.dofdefault["farStart"] >= level.dofdefault["farEnd"] ) - { - level.dofdefault["farStart"] = level.dofdefault["farEnd"] - 1; - setdvar( "scr_dof_farStart", level.dofdefault["farStart"] ); - } - - if ( level.dofdefault["farEnd"] <= level.dofdefault["farStart"] ) - { - level.dofdefault["farEnd"] = level.dofdefault["farStart"] + 1; - setdvar( "scr_dof_farEnd", level.dofdefault["farEnd"] ); - } - - if ( level.dofdefault["farBlur"] >= level.dofdefault["nearBlur"] ) - { - level.dofdefault["farBlur"] = level.dofdefault["nearBlur"] - 0.1; - setdvar( "scr_dof_farBlur", level.dofdefault["farBlur"] ); - } - - if ( level.dofdefault["farStart"] <= level.dofdefault["nearEnd"] ) - { - level.dofdefault["farStart"] = level.dofdefault["nearEnd"] + 1; - setdvar( "scr_dof_farStart", level.dofdefault["farStart"] ); - } + if ( level.dofdefault[ "nearStart" ] >= level.dofdefault[ "nearEnd" ] ) + { + level.dofdefault[ "nearStart" ] = level.dofdefault[ "nearEnd" ] - 1; + setdvar( "scr_dof_nearStart", level.dofdefault[ "nearStart" ] ); + } + if ( level.dofdefault[ "nearEnd" ] <= level.dofdefault[ "nearStart" ] ) + { + level.dofdefault[ "nearEnd" ] = level.dofdefault[ "nearStart" ] + 1; + setdvar( "scr_dof_nearEnd", level.dofdefault[ "nearEnd" ] ); + } + if ( level.dofdefault[ "farStart" ] >= level.dofdefault[ "farEnd" ] ) + { + level.dofdefault[ "farStart" ] = level.dofdefault[ "farEnd" ] - 1; + setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] ); + } + if ( level.dofdefault[ "farEnd" ] <= level.dofdefault[ "farStart" ] ) + { + level.dofdefault[ "farEnd" ] = level.dofdefault[ "farStart" ] + 1; + setdvar( "scr_dof_farEnd", level.dofdefault[ "farEnd" ] ); + } + if ( level.dofdefault[ "farBlur" ] >= level.dofdefault[ "nearBlur" ] ) + { + level.dofdefault[ "farBlur" ] = level.dofdefault[ "nearBlur" ] - 0,1; + setdvar( "scr_dof_farBlur", level.dofdefault[ "farBlur" ] ); + } + if ( level.dofdefault[ "farStart" ] <= level.dofdefault[ "nearEnd" ] ) + { + level.dofdefault[ "farStart" ] = level.dofdefault[ "nearEnd" ] + 1; + setdvar( "scr_dof_farStart", level.dofdefault[ "farStart" ] ); + } } dumpsettings() { /# - if ( getdvar( "scr_art_dump" ) != "0" ) - { - println( "\tstart_dist = " + level.fognearplane + ";" ); - println( "\thalf_dist = " + level.fogexphalfplane + ";" ); - println( "\thalf_height = " + level.fogexphalfheight + ";" ); - println( "\tbase_height = " + level.fogbaseheight + ";" ); - println( "\tfog_r = " + level.fogcolorred + ";" ); - println( "\tfog_g = " + level.fogcolorgreen + ";" ); - println( "\tfog_b = " + level.fogcolorblue + ";" ); - println( "\tfog_scale = " + level.fogcolorscale + ";" ); - println( "\tsun_col_r = " + level.sunfogcolorred + ";" ); - println( "\tsun_col_g = " + level.sunfogcolorgreen + ";" ); - println( "\tsun_col_b = " + level.sunfogcolorblue + ";" ); - println( "\tsun_dir_x = " + level.fogsundir[0] + ";" ); - println( "\tsun_dir_y = " + level.fogsundir[1] + ";" ); - println( "\tsun_dir_z = " + level.fogsundir[2] + ";" ); - println( "\tsun_start_ang = " + level.sunstartangle + ";" ); - println( "\tsun_stop_ang = " + level.sunendangle + ";" ); - println( "\ttime = 0;" ); - println( "\tmax_fog_opacity = " + level.fogmaxopacity + ";" ); - println( "" ); - println( "\tsetVolFog(start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale," ); - println( "\t\tsun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, " ); - println( "\t\tsun_stop_ang, time, max_fog_opacity);" ); - setdvar( "scr_art_dump", "0" ); - } + if ( getDvar( "scr_art_dump" ) != "0" ) + { + println( "\tstart_dist = " + level.fognearplane + ";" ); + println( "\thalf_dist = " + level.fogexphalfplane + ";" ); + println( "\thalf_height = " + level.fogexphalfheight + ";" ); + println( "\tbase_height = " + level.fogbaseheight + ";" ); + println( "\tfog_r = " + level.fogcolorred + ";" ); + println( "\tfog_g = " + level.fogcolorgreen + ";" ); + println( "\tfog_b = " + level.fogcolorblue + ";" ); + println( "\tfog_scale = " + level.fogcolorscale + ";" ); + println( "\tsun_col_r = " + level.sunfogcolorred + ";" ); + println( "\tsun_col_g = " + level.sunfogcolorgreen + ";" ); + println( "\tsun_col_b = " + level.sunfogcolorblue + ";" ); + println( "\tsun_dir_x = " + level.fogsundir[ 0 ] + ";" ); + println( "\tsun_dir_y = " + level.fogsundir[ 1 ] + ";" ); + println( "\tsun_dir_z = " + level.fogsundir[ 2 ] + ";" ); + println( "\tsun_start_ang = " + level.sunstartangle + ";" ); + println( "\tsun_stop_ang = " + level.sunendangle + ";" ); + println( "\ttime = 0;" ); + println( "\tmax_fog_opacity = " + level.fogmaxopacity + ";" ); + println( "" ); + println( "\tsetVolFog(start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale," ); + println( "\t\tsun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, " ); + println( "\t\tsun_stop_ang, time, max_fog_opacity);" ); + setdvar( "scr_art_dump", "0" ); #/ + } } debug_reflection() { /# - for ( level.debug_reflection = 0; 1; level.debug_reflection = 0 ) - { - wait 0.1; - asm_cond( getdvar( "debug_reflection" ) == "2" && level.debug_reflection != 2 || getdvar( "debug_reflection" ) == "3" && level.debug_reflection != 3, loc_1498 ); - remove_reflection_objects(); - asm_cond( getdvar( "debug_reflection" ) == "2", loc_147C ); - create_reflection_objects(); - level.debug_reflection = 2; - asm_jump( loc_1495 ); - create_reflection_objects(); - create_reflection_object(); - level.debug_reflection = 3; - asm_jump( loc_1517 ); - asm_cond( getdvar( "debug_reflection" ) == "1" && level.debug_reflection != 1, loc_14EC ); - setdvar( "debug_reflection_matte", "0" ); - setdvar( "debug_color_pallete", "0" ); - remove_reflection_objects(); - create_reflection_object(); - level.debug_reflection = 1; - asm_jump( loc_1517 ); - asm_cond( getdvar( "debug_reflection" ) == "0" && level.debug_reflection != 0, loc_1517 ); - remove_reflection_objects(); - } + level.debug_reflection = 0; + while ( 1 ) + { + wait 0,1; + if ( getDvar( "debug_reflection" ) == "2" || level.debug_reflection != 2 && getDvar( "debug_reflection" ) == "3" && level.debug_reflection != 3 ) + { + remove_reflection_objects(); + if ( getDvar( "debug_reflection" ) == "2" ) + { + create_reflection_objects(); + level.debug_reflection = 2; + } + else + { + create_reflection_objects(); + create_reflection_object(); + level.debug_reflection = 3; + } + continue; + } + else + { + if ( getDvar( "debug_reflection" ) == "1" && level.debug_reflection != 1 ) + { + setdvar( "debug_reflection_matte", "0" ); + setdvar( "debug_color_pallete", "0" ); + remove_reflection_objects(); + create_reflection_object(); + level.debug_reflection = 1; + break; + } + else + { + if ( getDvar( "debug_reflection" ) == "0" && level.debug_reflection != 0 ) + { + remove_reflection_objects(); + level.debug_reflection = 0; + } + } + } #/ + } } remove_reflection_objects() { /# - if ( ( level.debug_reflection == 2 || level.debug_reflection == 3 ) && isdefined( level.debug_reflection_objects ) ) - { - for ( i = 0; i < level.debug_reflection_objects.size; i++ ) - level.debug_reflection_objects[i] delete(); - - level.debug_reflection_objects = undefined; - } - - if ( level.debug_reflection == 1 || level.debug_reflection == 3 || level.debug_reflection_matte == 1 || level.debug_color_pallete == 1 || level.debug_color_pallete == 2 ) - { - if ( isdefined( level.debug_reflectionobject ) ) - level.debug_reflectionobject delete(); - } + if ( level.debug_reflection != 2 && level.debug_reflection == 3 && isDefined( level.debug_reflection_objects ) ) + { + i = 0; + while ( i < level.debug_reflection_objects.size ) + { + level.debug_reflection_objects[ i ] delete(); + i++; + } + level.debug_reflection_objects = undefined; + } + if ( level.debug_reflection != 1 && level.debug_reflection != 3 && level.debug_reflection_matte != 1 || level.debug_color_pallete == 1 && level.debug_color_pallete == 2 ) + { + if ( isDefined( level.debug_reflectionobject ) ) + { + level.debug_reflectionobject delete(); #/ + } + } } create_reflection_objects() { /# - reflection_locs = getreflectionlocs(); - - for ( i = 0; i < reflection_locs.size; i++ ) - { - level.debug_reflection_objects[i] = spawn( "script_model", reflection_locs[i] ); - level.debug_reflection_objects[i] setmodel( "test_sphere_silver" ); - } + reflection_locs = getreflectionlocs(); + i = 0; + while ( i < reflection_locs.size ) + { + level.debug_reflection_objects[ i ] = spawn( "script_model", reflection_locs[ i ] ); + level.debug_reflection_objects[ i ] setmodel( "test_sphere_silver" ); + i++; #/ + } } create_reflection_object( model ) { - if ( !isdefined( model ) ) - model = "test_sphere_silver"; + if ( !isDefined( model ) ) + { + model = "test_sphere_silver"; + } /# - if ( isdefined( level.debug_reflectionobject ) ) - level.debug_reflectionobject delete(); - - players = get_players(); - player = players[0]; - level.debug_reflectionobject = spawn( "script_model", player geteye() + vectorscale( anglestoforward( player.angles ), 100 ) ); - level.debug_reflectionobject setmodel( model ); - level.debug_reflectionobject.origin = player geteye() + vectorscale( anglestoforward( player getplayerangles() ), 100 ); - level.debug_reflectionobject linkto( player ); - thread debug_reflection_buttons(); + if ( isDefined( level.debug_reflectionobject ) ) + { + level.debug_reflectionobject delete(); + } + players = get_players(); + player = players[ 0 ]; + level.debug_reflectionobject = spawn( "script_model", player geteye() + vectorScale( anglesToForward( player.angles ), 100 ) ); + level.debug_reflectionobject setmodel( model ); + level.debug_reflectionobject.origin = player geteye() + vectorScale( anglesToForward( player getplayerangles() ), 100 ); + level.debug_reflectionobject linkto( player ); + thread debug_reflection_buttons(); #/ } debug_reflection_buttons() { /# - level notify( "new_reflection_button_running" ); - level endon( "new_reflection_button_running" ); - level.debug_reflectionobject endon( "death" ); - offset = 100; - lastoffset = offset; - - while ( getdvar( "debug_reflection" ) == "1" || getdvar( "debug_reflection" ) == "3" || getdvar( "debug_reflection_matte" ) == "1" || getdvar( "debug_color_pallete" ) == "1" || getdvar( "debug_color_pallete" ) == "2" ) - { - players = get_players(); - - if ( players[0] buttonpressed( "BUTTON_X" ) ) - offset += 50; - - if ( players[0] buttonpressed( "BUTTON_Y" ) ) - offset -= 50; - - if ( offset > 1000 ) - offset = 1000; - - if ( offset < 64 ) - offset = 64; - - level.debug_reflectionobject unlink(); - level.debug_reflectionobject.origin = players[0] geteye() + vectorscale( anglestoforward( players[0] getplayerangles() ), offset ); - temp_angles = vectortoangles( players[0].origin - level.debug_reflectionobject.origin ); - level.debug_reflectionobject.angles = ( 0, temp_angles[1], 0 ); - lastoffset = offset; - line( level.debug_reflectionobject.origin, getreflectionorigin( level.debug_reflectionobject.origin ), ( 1, 0, 0 ), 1, 1 ); - wait 0.05; - - if ( isdefined( level.debug_reflectionobject ) ) - level.debug_reflectionobject linkto( players[0] ); - } + level notify( "new_reflection_button_running" ); + level endon( "new_reflection_button_running" ); + level.debug_reflectionobject endon( "death" ); + offset = 100; + lastoffset = offset; + while ( getDvar( "debug_reflection" ) != "1" && getDvar( "debug_reflection" ) != "3" && getDvar( "debug_reflection_matte" ) != "1" || getDvar( "debug_color_pallete" ) == "1" && getDvar( "debug_color_pallete" ) == "2" ) + { + players = get_players(); + if ( players[ 0 ] buttonpressed( "BUTTON_X" ) ) + { + offset += 50; + } + if ( players[ 0 ] buttonpressed( "BUTTON_Y" ) ) + { + offset -= 50; + } + if ( offset > 1000 ) + { + offset = 1000; + } + if ( offset < 64 ) + { + offset = 64; + } + level.debug_reflectionobject unlink(); + level.debug_reflectionobject.origin = players[ 0 ] geteye() + vectorScale( anglesToForward( players[ 0 ] getplayerangles() ), offset ); + temp_angles = vectorToAngle( players[ 0 ].origin - level.debug_reflectionobject.origin ); + level.debug_reflectionobject.angles = ( 0, temp_angles[ 1 ], 0 ); + lastoffset = offset; + line( level.debug_reflectionobject.origin, getreflectionorigin( level.debug_reflectionobject.origin ), ( 1, 0, 0 ), 1, 1 ); + wait 0,05; + if ( isDefined( level.debug_reflectionobject ) ) + { + level.debug_reflectionobject linkto( players[ 0 ] ); + } #/ + } } debug_reflection_matte() { /# - for ( level.debug_reflection_matte = 0; 1; level.debug_reflection_matte = 0 ) - { - wait 0.1; - asm_cond( getdvar( "debug_reflection_matte" ) == "1" && level.debug_reflection_matte != 1, loc_18DC ); - setdvar( "debug_reflection", "0" ); - setdvar( "debug_color_pallete", "0" ); - remove_reflection_objects(); - create_reflection_object( "test_sphere_lambert" ); - level.debug_reflection_matte = 1; - asm_jump( loc_1907 ); - asm_cond( getdvar( "debug_reflection_matte" ) == "0" && level.debug_reflection_matte != 0, loc_1907 ); - remove_reflection_objects(); - } + level.debug_reflection_matte = 0; + while ( 1 ) + { + wait 0,1; + if ( getDvar( "debug_reflection_matte" ) == "1" && level.debug_reflection_matte != 1 ) + { + setdvar( "debug_reflection", "0" ); + setdvar( "debug_color_pallete", "0" ); + remove_reflection_objects(); + create_reflection_object( "test_sphere_lambert" ); + level.debug_reflection_matte = 1; + continue; + } + else + { + if ( getDvar( "debug_reflection_matte" ) == "0" && level.debug_reflection_matte != 0 ) + { + remove_reflection_objects(); + level.debug_reflection_matte = 0; + } + } #/ + } } debug_color_pallete() { /# - for ( level.debug_color_pallete = 0; 1; level.debug_color_pallete = 0 ) - { - wait 0.1; - asm_cond( getdvar( "debug_color_pallete" ) == "1" && level.debug_color_pallete != 1, loc_1980 ); - setdvar( "debug_reflection", "0" ); - setdvar( "debug_reflection_matte", "0" ); - remove_reflection_objects(); - create_reflection_object( "test_macbeth_chart" ); - level.debug_color_pallete = 1; - asm_jump( loc_19E7 ); - asm_cond( getdvar( "debug_color_pallete" ) == "2" && level.debug_color_pallete != 2, loc_19BC ); - remove_reflection_objects(); - create_reflection_object( "test_macbeth_chart_unlit" ); - level.debug_color_pallete = 2; - asm_jump( loc_19E7 ); - asm_cond( getdvar( "debug_color_pallete" ) == "0" && level.debug_color_pallete != 0, loc_19E7 ); - remove_reflection_objects(); - } + level.debug_color_pallete = 0; + while ( 1 ) + { + wait 0,1; + if ( getDvar( "debug_color_pallete" ) == "1" && level.debug_color_pallete != 1 ) + { + setdvar( "debug_reflection", "0" ); + setdvar( "debug_reflection_matte", "0" ); + remove_reflection_objects(); + create_reflection_object( "test_macbeth_chart" ); + level.debug_color_pallete = 1; + continue; + } + else + { + if ( getDvar( "debug_color_pallete" ) == "2" && level.debug_color_pallete != 2 ) + { + remove_reflection_objects(); + create_reflection_object( "test_macbeth_chart_unlit" ); + level.debug_color_pallete = 2; + break; + } + else + { + if ( getDvar( "debug_color_pallete" ) == "0" && level.debug_color_pallete != 0 ) + { + remove_reflection_objects(); + level.debug_color_pallete = 0; + } + } + } #/ + } } diff --git a/Zombie Core/patch_zm/maps/mp/_audio.gsc b/Zombie Core/patch_zm/maps/mp/_audio.gsc index 039e1ac..bbfcf66 100644 --- a/Zombie Core/patch_zm/maps/mp/_audio.gsc +++ b/Zombie Core/patch_zm/maps/mp/_audio.gsc @@ -1,139 +1,150 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - } wait_until_first_player() { - players = get_players(); - - if ( !isdefined( players[0] ) ) - level waittill( "first_player_ready" ); - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] thread monitor_player_sprint(); + players = get_players(); + if ( !isDefined( players[ 0 ] ) ) + { + level waittill( "first_player_ready" ); + } + players = get_players(); + i = 0; + while ( i < players.size ) + { + players[ i ] thread monitor_player_sprint(); + i++; + } } stand_think( trig ) { - killtext = "kill_stand_think" + trig getentitynumber(); - self endon( "disconnect" ); - self endon( "death" ); - self endon( killtext ); - - while ( true ) - { - if ( self.player_is_moving ) - trig playsound( trig.script_label ); - - wait 1; - } + killtext = "kill_stand_think" + trig getentitynumber(); + self endon( "disconnect" ); + self endon( "death" ); + self endon( killtext ); + while ( 1 ) + { + if ( self.player_is_moving ) + { + trig playsound( trig.script_label ); + } + wait 1; + } } monitor_player_sprint() { - self endon( "disconnect" ); - self thread monitor_player_movement(); - - for ( self._is_sprinting = 0; 1; self._is_sprinting = 0 ) - { - self waittill( "sprint_begin" ); - - self._is_sprinting = 1; - - self waittill( "sprint_end" ); - } + self endon( "disconnect" ); + self thread monitor_player_movement(); + self._is_sprinting = 0; + while ( 1 ) + { + self waittill( "sprint_begin" ); + self._is_sprinting = 1; + self waittill( "sprint_end" ); + self._is_sprinting = 0; + } } monitor_player_movement() { - self endon( "disconnect" ); - - while ( true ) - { - org_1 = self.origin; - wait 1.0; - org_2 = self.origin; - distancemoved = distancesquared( org_1, org_2 ); - - if ( distancemoved > 4096 ) - self.player_is_moving = 1; - else - self.player_is_moving = 0; - } + self endon( "disconnect" ); + while ( 1 ) + { + org_1 = self.origin; + wait 1; + org_2 = self.origin; + distancemoved = distancesquared( org_1, org_2 ); + if ( distancemoved > 4096 ) + { + self.player_is_moving = 1; + continue; + } + else + { + self.player_is_moving = 0; + } + } } thread_enter_exit_sound( trig ) { - self endon( "death" ); - self endon( "disconnect" ); - trig.touchingplayers[self getentitynumber()] = 1; - - if ( isdefined( trig.script_sound ) && trig.script_activated && self._is_sprinting ) - self playsound( trig.script_sound ); - - self thread stand_think( trig ); - - while ( self istouching( trig ) ) - wait 0.1; - - self notify( "kill_stand_think" + trig getentitynumber() ); - self playsound( trig.script_noteworthy ); - trig.touchingplayers[self getentitynumber()] = 0; + self endon( "death" ); + self endon( "disconnect" ); + trig.touchingplayers[ self getentitynumber() ] = 1; + if ( isDefined( trig.script_sound ) && trig.script_activated && self._is_sprinting ) + { + self playsound( trig.script_sound ); + } + self thread stand_think( trig ); + while ( self istouching( trig ) ) + { + wait 0,1; + } + self notify( "kill_stand_think" + trig getentitynumber() ); + self playsound( trig.script_noteworthy ); + trig.touchingplayers[ self getentitynumber() ] = 0; } thread_step_trigger() { - if ( !isdefined( self.script_activated ) ) - self.script_activated = 1; - - if ( !isdefined( self.touchingplayers ) ) - { - self.touchingplayers = []; - - for ( i = 0; i < 4; i++ ) - self.touchingplayers[i] = 0; - } - - while ( true ) - { - self waittill( "trigger", who ); - - if ( self.touchingplayers[who getentitynumber()] == 0 ) - who thread thread_enter_exit_sound( self ); - } + if ( !isDefined( self.script_activated ) ) + { + self.script_activated = 1; + } + while ( !isDefined( self.touchingplayers ) ) + { + self.touchingplayers = []; + i = 0; + while ( i < 4 ) + { + self.touchingplayers[ i ] = 0; + i++; + } + } + while ( 1 ) + { + self waittill( "trigger", who ); + if ( self.touchingplayers[ who getentitynumber() ] == 0 ) + { + who thread thread_enter_exit_sound( self ); + } + } } disable_bump_trigger( triggername ) { - triggers = getentarray( "audio_bump_trigger", "targetname" ); - - if ( isdefined( triggers ) ) - { - for ( i = 0; i < triggers.size; i++ ) - { - if ( isdefined( triggers[i].script_label ) && triggers[i].script_label == triggername ) - triggers[i].script_activated = 0; - } - } + triggers = getentarray( "audio_bump_trigger", "targetname" ); + while ( isDefined( triggers ) ) + { + i = 0; + while ( i < triggers.size ) + { + if ( isDefined( triggers[ i ].script_label ) && triggers[ i ].script_label == triggername ) + { + triggers[ i ].script_activated = 0; + } + i++; + } + } } get_player_index_number( player ) { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] == player ) - return i; - } - - return 1; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ] == player ) + { + return i; + } + i++; + } + return 1; } diff --git a/Zombie Core/patch_zm/maps/mp/_ballistic_knife.gsc b/Zombie Core/patch_zm/maps/mp/_ballistic_knife.gsc index e9eca74..8b4286c 100644 --- a/Zombie Core/patch_zm/maps/mp/_ballistic_knife.gsc +++ b/Zombie Core/patch_zm/maps/mp/_ballistic_knife.gsc @@ -1,262 +1,273 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\_challenges; +#include maps/mp/_challenges; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - precachemodel( "t6_wpn_ballistic_knife_projectile" ); - precachemodel( "t6_wpn_ballistic_knife_blade_retrieve" ); + precachemodel( "t6_wpn_ballistic_knife_projectile" ); + precachemodel( "t6_wpn_ballistic_knife_blade_retrieve" ); } onspawn( watcher, player ) { - player endon( "death" ); - player endon( "disconnect" ); - level endon( "game_ended" ); - - self waittill( "stationary", endpos, normal, angles, attacker, prey, bone ); - - isfriendly = 0; - - if ( isdefined( endpos ) ) - { - retrievable_model = spawn( "script_model", endpos ); - retrievable_model setmodel( "t6_wpn_ballistic_knife_projectile" ); - retrievable_model setteam( player.team ); - retrievable_model setowner( player ); - retrievable_model.owner = player; - retrievable_model.angles = angles; - retrievable_model.name = watcher.weapon; - retrievable_model.targetname = "sticky_weapon"; - - if ( isdefined( prey ) ) - { - if ( level.teambased && isplayer( prey ) && player.team == prey.team ) - isfriendly = 1; - else if ( level.teambased && isai( prey ) && player.team == prey.aiteam ) - isfriendly = 1; - - if ( !isfriendly ) - { - if ( isalive( prey ) ) - retrievable_model droptoground( retrievable_model.origin, 80 ); - else - retrievable_model linkto( prey, bone ); - } - else if ( isfriendly ) - { - retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) ); - normal = ( 0, 0, 1 ); - } - } - - watcher.objectarray[watcher.objectarray.size] = retrievable_model; - - if ( isfriendly ) - retrievable_model waittill( "stationary" ); - - retrievable_model thread dropknivestoground(); - - if ( isfriendly ) - player notify( "ballistic_knife_stationary", retrievable_model, normal ); - else - player notify( "ballistic_knife_stationary", retrievable_model, normal, prey ); - - retrievable_model thread wait_to_show_glowing_model( prey ); - } + player endon( "death" ); + player endon( "disconnect" ); + level endon( "game_ended" ); + self waittill( "stationary", endpos, normal, angles, attacker, prey, bone ); + isfriendly = 0; + if ( isDefined( endpos ) ) + { + retrievable_model = spawn( "script_model", endpos ); + retrievable_model setmodel( "t6_wpn_ballistic_knife_projectile" ); + retrievable_model setteam( player.team ); + retrievable_model setowner( player ); + retrievable_model.owner = player; + retrievable_model.angles = angles; + retrievable_model.name = watcher.weapon; + retrievable_model.targetname = "sticky_weapon"; + if ( isDefined( prey ) ) + { + if ( level.teambased && isplayer( prey ) && player.team == prey.team ) + { + isfriendly = 1; + } + else + { + if ( level.teambased && isai( prey ) && player.team == prey.aiteam ) + { + isfriendly = 1; + } + } + if ( !isfriendly ) + { + if ( isalive( prey ) ) + { + retrievable_model droptoground( retrievable_model.origin, 80 ); + } + else + { + retrievable_model linkto( prey, bone ); + } + } + else + { + if ( isfriendly ) + { + retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) ); + normal = ( 0, 0, 1 ); + } + } + } + watcher.objectarray[ watcher.objectarray.size ] = retrievable_model; + if ( isfriendly ) + { + retrievable_model waittill( "stationary" ); + } + retrievable_model thread dropknivestoground(); + if ( isfriendly ) + { + player notify( "ballistic_knife_stationary" ); + } + else + { + player notify( "ballistic_knife_stationary" ); + } + retrievable_model thread wait_to_show_glowing_model( prey ); + } } wait_to_show_glowing_model( prey ) { - level endon( "game_ended" ); - self endon( "death" ); - glowing_retrievable_model = spawn( "script_model", self.origin ); - self.glowing_model = glowing_retrievable_model; - glowing_retrievable_model.angles = self.angles; - glowing_retrievable_model linkto( self ); - - if ( isdefined( prey ) && !isalive( prey ) ) - wait 2; - - glowing_retrievable_model setmodel( "t6_wpn_ballistic_knife_blade_retrieve" ); + level endon( "game_ended" ); + self endon( "death" ); + glowing_retrievable_model = spawn( "script_model", self.origin ); + self.glowing_model = glowing_retrievable_model; + glowing_retrievable_model.angles = self.angles; + glowing_retrievable_model linkto( self ); + if ( isDefined( prey ) && !isalive( prey ) ) + { + wait 2; + } + glowing_retrievable_model setmodel( "t6_wpn_ballistic_knife_blade_retrieve" ); } watch_shutdown() { - pickuptrigger = self.pickuptrigger; - glowing_model = self.glowing_model; - - self waittill( "death" ); - - if ( isdefined( pickuptrigger ) ) - pickuptrigger delete(); - - if ( isdefined( glowing_model ) ) - glowing_model delete(); + pickuptrigger = self.pickuptrigger; + glowing_model = self.glowing_model; + self waittill( "death" ); + if ( isDefined( pickuptrigger ) ) + { + pickuptrigger delete(); + } + if ( isDefined( glowing_model ) ) + { + glowing_model delete(); + } } onspawnretrievetrigger( watcher, player ) { - player endon( "death" ); - player endon( "disconnect" ); - level endon( "game_ended" ); - - player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey ); - - if ( !isdefined( retrievable_model ) ) - return; - - vec_scale = 10; - trigger_pos = []; - - if ( isdefined( prey ) && ( isplayer( prey ) || isai( prey ) ) ) - { - trigger_pos[0] = prey.origin[0]; - trigger_pos[1] = prey.origin[1]; - trigger_pos[2] = prey.origin[2] + vec_scale; - } - else - { - trigger_pos[0] = retrievable_model.origin[0] + vec_scale * normal[0]; - trigger_pos[1] = retrievable_model.origin[1] + vec_scale * normal[1]; - trigger_pos[2] = retrievable_model.origin[2] + vec_scale * normal[2]; - } - - trigger_pos[2] -= 50.0; - pickup_trigger = spawn( "trigger_radius", ( trigger_pos[0], trigger_pos[1], trigger_pos[2] ), 0, 50, 100 ); - pickup_trigger.owner = player; - retrievable_model.pickuptrigger = pickup_trigger; - pickup_trigger enablelinkto(); - - if ( isdefined( prey ) ) - pickup_trigger linkto( prey ); - else - pickup_trigger linkto( retrievable_model ); - - retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.pickupsoundplayer, watcher.pickupsound ); - retrievable_model thread watch_shutdown(); + player endon( "death" ); + player endon( "disconnect" ); + level endon( "game_ended" ); + player waittill( "ballistic_knife_stationary", retrievable_model, normal, prey ); + if ( !isDefined( retrievable_model ) ) + { + return; + } + vec_scale = 10; + trigger_pos = []; + if ( isDefined( prey ) || isplayer( prey ) && isai( prey ) ) + { + trigger_pos[ 0 ] = prey.origin[ 0 ]; + trigger_pos[ 1 ] = prey.origin[ 1 ]; + trigger_pos[ 2 ] = prey.origin[ 2 ] + vec_scale; + } + else + { + trigger_pos[ 0 ] = retrievable_model.origin[ 0 ] + ( vec_scale * normal[ 0 ] ); + trigger_pos[ 1 ] = retrievable_model.origin[ 1 ] + ( vec_scale * normal[ 1 ] ); + trigger_pos[ 2 ] = retrievable_model.origin[ 2 ] + ( vec_scale * normal[ 2 ] ); + } + trigger_pos[ 2 ] -= 50; + pickup_trigger = spawn( "trigger_radius", ( trigger_pos[ 0 ], trigger_pos[ 1 ], trigger_pos[ 2 ] ), 0, 50, 100 ); + pickup_trigger.owner = player; + retrievable_model.pickuptrigger = pickup_trigger; + pickup_trigger enablelinkto(); + if ( isDefined( prey ) ) + { + pickup_trigger linkto( prey ); + } + else + { + pickup_trigger linkto( retrievable_model ); + } + retrievable_model thread watch_use_trigger( pickup_trigger, retrievable_model, ::pick_up, watcher.pickupsoundplayer, watcher.pickupsound ); + retrievable_model thread watch_shutdown(); } watch_use_trigger( trigger, model, callback, playersoundonuse, npcsoundonuse ) { - self endon( "death" ); - self endon( "delete" ); - level endon( "game_ended" ); - max_ammo = weaponmaxammo( "knife_ballistic_mp" ) + 1; - - while ( true ) - { - trigger waittill( "trigger", player ); - - if ( !isalive( player ) ) - continue; - - if ( !player isonground() ) - continue; - - if ( isdefined( trigger.triggerteam ) && player.team != trigger.triggerteam ) - continue; - - if ( isdefined( trigger.claimedby ) && player != trigger.claimedby ) - continue; - - if ( !player hasweapon( "knife_ballistic_mp" ) ) - continue; - - ammo_stock = player getweaponammostock( "knife_ballistic_mp" ); - ammo_clip = player getweaponammoclip( "knife_ballistic_mp" ); - current_weapon = player getcurrentweapon(); - total_ammo = ammo_stock + ammo_clip; - hasreloaded = 1; - - if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == "knife_ballistic_mp" ) - hasreloaded = 0; - - if ( total_ammo >= max_ammo || !hasreloaded ) - continue; - - if ( isdefined( playersoundonuse ) ) - player playlocalsound( playersoundonuse ); - - if ( isdefined( npcsoundonuse ) ) - player playsound( npcsoundonuse ); - - self thread [[ callback ]]( player ); - break; - } + self endon( "death" ); + self endon( "delete" ); + level endon( "game_ended" ); + max_ammo = weaponmaxammo( "knife_ballistic_mp" ) + 1; + while ( 1 ) + { + trigger waittill( "trigger", player ); + while ( !isalive( player ) ) + { + continue; + } + while ( !player isonground() ) + { + continue; + } + if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam ) + { + continue; + } + if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) + { + continue; + } + while ( !player hasweapon( "knife_ballistic_mp" ) ) + { + continue; + } + ammo_stock = player getweaponammostock( "knife_ballistic_mp" ); + ammo_clip = player getweaponammoclip( "knife_ballistic_mp" ); + current_weapon = player getcurrentweapon(); + total_ammo = ammo_stock + ammo_clip; + hasreloaded = 1; + if ( total_ammo > 0 && ammo_stock == total_ammo && current_weapon == "knife_ballistic_mp" ) + { + hasreloaded = 0; + } + if ( total_ammo >= max_ammo || !hasreloaded ) + { + continue; + } + if ( isDefined( playersoundonuse ) ) + { + player playlocalsound( playersoundonuse ); + } + if ( isDefined( npcsoundonuse ) ) + { + player playsound( npcsoundonuse ); + } + self thread [[ callback ]]( player ); + return; + } } pick_up( player ) { - self destroy_ent(); - current_weapon = player getcurrentweapon(); - player maps\mp\_challenges::pickedupballisticknife(); - - if ( current_weapon != "knife_ballistic_mp" ) - { - clip_ammo = player getweaponammoclip( "knife_ballistic_mp" ); - - if ( !clip_ammo ) - player setweaponammoclip( "knife_ballistic_mp", 1 ); - else - { - new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1; - player setweaponammostock( "knife_ballistic_mp", new_ammo_stock ); - } - } - else - { - new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1; - player setweaponammostock( "knife_ballistic_mp", new_ammo_stock ); - } + self destroy_ent(); + current_weapon = player getcurrentweapon(); + player maps/mp/_challenges::pickedupballisticknife(); + if ( current_weapon != "knife_ballistic_mp" ) + { + clip_ammo = player getweaponammoclip( "knife_ballistic_mp" ); + if ( !clip_ammo ) + { + player setweaponammoclip( "knife_ballistic_mp", 1 ); + } + else + { + new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1; + player setweaponammostock( "knife_ballistic_mp", new_ammo_stock ); + } + } + else + { + new_ammo_stock = player getweaponammostock( "knife_ballistic_mp" ) + 1; + player setweaponammostock( "knife_ballistic_mp", new_ammo_stock ); + } } destroy_ent() { - if ( isdefined( self ) ) - { - pickuptrigger = self.pickuptrigger; - - if ( isdefined( pickuptrigger ) ) - pickuptrigger delete(); - - if ( isdefined( self.glowing_model ) ) - self.glowing_model delete(); - - self delete(); - } + if ( isDefined( self ) ) + { + pickuptrigger = self.pickuptrigger; + if ( isDefined( pickuptrigger ) ) + { + pickuptrigger delete(); + } + if ( isDefined( self.glowing_model ) ) + { + self.glowing_model delete(); + } + self delete(); + } } dropknivestoground() { - self endon( "death" ); - - for (;;) - { - level waittill( "drop_objects_to_ground", origin, radius ); - - self droptoground( origin, radius ); - } + self endon( "death" ); + for ( ;; ) + { + level waittill( "drop_objects_to_ground", origin, radius ); + self droptoground( origin, radius ); + } } droptoground( origin, radius ) { - if ( distancesquared( origin, self.origin ) < radius * radius ) - { - self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) ); - self thread updateretrievetrigger(); - } + if ( distancesquared( origin, self.origin ) < ( radius * radius ) ) + { + self physicslaunch( ( 0, 0, 1 ), vectorScale( ( 0, 0, 1 ), 5 ) ); + self thread updateretrievetrigger(); + } } updateretrievetrigger() { - self endon( "death" ); - - self waittill( "stationary" ); - - trigger = self.pickuptrigger; - trigger.origin = ( self.origin[0], self.origin[1], self.origin[2] + 10 ); - trigger linkto( self ); + self endon( "death" ); + self waittill( "stationary" ); + trigger = self.pickuptrigger; + trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 ); + trigger linkto( self ); } diff --git a/Zombie Core/patch_zm/maps/mp/_bb.gsc b/Zombie Core/patch_zm/maps/mp/_bb.gsc index 9c095c5..d24054b 100644 --- a/Zombie Core/patch_zm/maps/mp/_bb.gsc +++ b/Zombie Core/patch_zm/maps/mp/_bb.gsc @@ -1,91 +1,87 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - level thread onplayerconnect(); + level thread onplayerconnect(); } onplayerconnect() { - for (;;) - { - level waittill( "connected", player ); - - player thread onplayerspawned(); - player thread onplayerdeath(); - } + for ( ;; ) + { + level waittill( "connected", player ); + player thread onplayerspawned(); + player thread onplayerdeath(); + } } onplayerspawned() { - self endon( "disconnect" ); - self._bbdata = []; - - for (;;) - { - self waittill( "spawned_player" ); - - self._bbdata["score"] = 0; - self._bbdata["momentum"] = 0; - self._bbdata["spawntime"] = gettime(); - self._bbdata["shots"] = 0; - self._bbdata["hits"] = 0; - } + self endon( "disconnect" ); + self._bbdata = []; + for ( ;; ) + { + self waittill( "spawned_player" ); + self._bbdata[ "score" ] = 0; + self._bbdata[ "momentum" ] = 0; + self._bbdata[ "spawntime" ] = getTime(); + self._bbdata[ "shots" ] = 0; + self._bbdata[ "hits" ] = 0; + } } onplayerdisconnect() { - for (;;) - { - self waittill( "disconnect" ); - - self commitspawndata(); - break; - } + for ( ;; ) + { + self waittill( "disconnect" ); + self commitspawndata(); + return; + } } onplayerdeath() { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "death" ); - - self commitspawndata(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "death" ); + self commitspawndata(); + } } commitspawndata() { /# - assert( isdefined( self._bbdata ) ); + assert( isDefined( self._bbdata ) ); #/ - if ( !isdefined( self._bbdata ) ) - return; - - bbprint( "mpplayerlives", "gametime %d spawnid %d lifescore %d lifemomentum %d lifetime %d name %s", gettime(), getplayerspawnid( self ), self._bbdata["score"], self._bbdata["momentum"], gettime() - self._bbdata["spawntime"], self.name ); + if ( !isDefined( self._bbdata ) ) + { + return; + } + bbprint( "mpplayerlives", "gametime %d spawnid %d lifescore %d lifemomentum %d lifetime %d name %s", getTime(), getplayerspawnid( self ), self._bbdata[ "score" ], self._bbdata[ "momentum" ], getTime() - self._bbdata[ "spawntime" ], self.name ); } commitweapondata( spawnid, currentweapon, time0 ) { /# - assert( isdefined( self._bbdata ) ); + assert( isDefined( self._bbdata ) ); #/ - if ( !isdefined( self._bbdata ) ) - return; - - time1 = gettime(); - bbprint( "mpweapons", "spawnid %d name %s duration %d shots %d hits %d", spawnid, currentweapon, time1 - time0, self._bbdata["shots"], self._bbdata["hits"] ); - self._bbdata["shots"] = 0; - self._bbdata["hits"] = 0; + if ( !isDefined( self._bbdata ) ) + { + return; + } + time1 = getTime(); + bbprint( "mpweapons", "spawnid %d name %s duration %d shots %d hits %d", spawnid, currentweapon, time1 - time0, self._bbdata[ "shots" ], self._bbdata[ "hits" ] ); + self._bbdata[ "shots" ] = 0; + self._bbdata[ "hits" ] = 0; } bbaddtostat( statname, delta ) { - if ( isdefined( self._bbdata ) && isdefined( self._bbdata[statname] ) ) - self._bbdata[statname] += delta; + if ( isDefined( self._bbdata ) && isDefined( self._bbdata[ statname ] ) ) + { + self._bbdata[ statname ] += delta; + } } diff --git a/Zombie Core/patch_zm/maps/mp/_busing.gsc b/Zombie Core/patch_zm/maps/mp/_busing.gsc index 5a8bf36..75250e7 100644 --- a/Zombie Core/patch_zm/maps/mp/_busing.gsc +++ b/Zombie Core/patch_zm/maps/mp/_busing.gsc @@ -1,20 +1,19 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; +#include maps/mp/_utility; businit() { /# - assert( level.clientscripts ); + assert( level.clientscripts ); #/ - level.busstate = ""; - registerclientsys( "busCmd" ); + level.busstate = ""; + registerclientsys( "busCmd" ); } setbusstate( state ) { - if ( level.busstate != state ) - setclientsysstate( "busCmd", state ); - - level.busstate = state; + if ( level.busstate != state ) + { + setclientsysstate( "busCmd", state ); + } + level.busstate = state; } diff --git a/Zombie Core/patch_zm/maps/mp/_challenges.gsc b/Zombie Core/patch_zm/maps/mp/_challenges.gsc index 167ec67..7a2c03a 100644 --- a/Zombie Core/patch_zm/maps/mp/_challenges.gsc +++ b/Zombie Core/patch_zm/maps/mp/_challenges.gsc @@ -1,1881 +1,2117 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - if ( !isdefined( level.challengescallbacks ) ) - level.challengescallbacks = []; - - waittillframeend; - - if ( canprocesschallenges() ) - { - registerchallengescallback( "playerKilled", ::challengekills ); - registerchallengescallback( "gameEnd", ::challengegameend ); - registerchallengescallback( "roundEnd", ::challengeroundend ); - } - - level thread onplayerconnect(); - - foreach ( team in level.teams ) - initteamchallenges( team ); + if ( !isDefined( level.challengescallbacks ) ) + { + level.challengescallbacks = []; + } + waittillframeend; + if ( canprocesschallenges() ) + { + registerchallengescallback( "playerKilled", ::challengekills ); + registerchallengescallback( "gameEnd", ::challengegameend ); + registerchallengescallback( "roundEnd", ::challengeroundend ); + } + level thread onplayerconnect(); + _a24 = level.teams; + _k24 = getFirstArrayKey( _a24 ); + while ( isDefined( _k24 ) ) + { + team = _a24[ _k24 ]; + initteamchallenges( team ); + _k24 = getNextArrayKey( _a24, _k24 ); + } } addflyswatterstat( weapon, aircraft ) { - if ( !isdefined( self.pers["flyswattercount"] ) ) - self.pers["flyswattercount"] = 0; - - self addweaponstat( weapon, "destroyed_aircraft", 1 ); - self.pers["flyswattercount"]++; - - if ( self.pers["flyswattercount"] == 5 ) - self addweaponstat( weapon, "destroyed_5_aircraft", 1 ); - - if ( isdefined( aircraft ) && isdefined( aircraft.birthtime ) ) - { - if ( gettime() - aircraft.birthtime < 20000 ) - self addweaponstat( weapon, "destroyed_aircraft_under20s", 1 ); - } - - if ( !isdefined( self.destroyedaircrafttime ) ) - self.destroyedaircrafttime = []; - - if ( isdefined( self.destroyedaircrafttime[weapon] ) && gettime() - self.destroyedaircrafttime[weapon] < 10000 ) - { - self addweaponstat( weapon, "destroyed_2aircraft_quickly", 1 ); - self.destroyedaircrafttime[weapon] = undefined; - } - else - self.destroyedaircrafttime[weapon] = gettime(); + if ( !isDefined( self.pers[ "flyswattercount" ] ) ) + { + self.pers[ "flyswattercount" ] = 0; + } + self addweaponstat( weapon, "destroyed_aircraft", 1 ); + self.pers[ "flyswattercount" ]++; + if ( self.pers[ "flyswattercount" ] == 5 ) + { + self addweaponstat( weapon, "destroyed_5_aircraft", 1 ); + } + if ( isDefined( aircraft ) && isDefined( aircraft.birthtime ) ) + { + if ( ( getTime() - aircraft.birthtime ) < 20000 ) + { + self addweaponstat( weapon, "destroyed_aircraft_under20s", 1 ); + } + } + if ( !isDefined( self.destroyedaircrafttime ) ) + { + self.destroyedaircrafttime = []; + } + if ( isDefined( self.destroyedaircrafttime[ weapon ] ) && ( getTime() - self.destroyedaircrafttime[ weapon ] ) < 10000 ) + { + self addweaponstat( weapon, "destroyed_2aircraft_quickly", 1 ); + } + else + { + self.destroyedaircrafttime[ weapon ] = getTime(); + } } canprocesschallenges() { /# - if ( getdvarintdefault( "scr_debug_challenges", 0 ) ) - return true; + if ( getdvarintdefault( "scr_debug_challenges", 0 ) ) + { + return 1; #/ - if ( level.rankedmatch || level.wagermatch ) - return true; - - return false; + } + if ( level.rankedmatch || level.wagermatch ) + { + return 1; + } + return 0; } initteamchallenges( team ) { - if ( !isdefined( game["challenge"] ) ) - game["challenge"] = []; - - if ( !isdefined( game["challenge"][team] ) ) - { - game["challenge"][team] = []; - game["challenge"][team]["plantedBomb"] = 0; - game["challenge"][team]["destroyedBombSite"] = 0; - game["challenge"][team]["capturedFlag"] = 0; - } - - game["challenge"][team]["allAlive"] = 1; + if ( !isDefined( game[ "challenge" ] ) ) + { + game[ "challenge" ] = []; + } + if ( !isDefined( game[ "challenge" ][ team ] ) ) + { + game[ "challenge" ][ team ] = []; + game[ "challenge" ][ team ][ "plantedBomb" ] = 0; + game[ "challenge" ][ team ][ "destroyedBombSite" ] = 0; + game[ "challenge" ][ team ][ "capturedFlag" ] = 0; + } + game[ "challenge" ][ team ][ "allAlive" ] = 1; } registerchallengescallback( callback, func ) { - if ( !isdefined( level.challengescallbacks[callback] ) ) - level.challengescallbacks[callback] = []; - - level.challengescallbacks[callback][level.challengescallbacks[callback].size] = func; + if ( !isDefined( level.challengescallbacks[ callback ] ) ) + { + level.challengescallbacks[ callback ] = []; + } + level.challengescallbacks[ callback ][ level.challengescallbacks[ callback ].size ] = func; } dochallengecallback( callback, data ) { - if ( !isdefined( level.challengescallbacks ) ) - return; - - if ( !isdefined( level.challengescallbacks[callback] ) ) - return; - - if ( isdefined( data ) ) - { - for ( i = 0; i < level.challengescallbacks[callback].size; i++ ) - thread [[ level.challengescallbacks[callback][i] ]]( data ); - } - else - { - for ( i = 0; i < level.challengescallbacks[callback].size; i++ ) - thread [[ level.challengescallbacks[callback][i] ]](); - } + if ( !isDefined( level.challengescallbacks ) ) + { + return; + } + if ( !isDefined( level.challengescallbacks[ callback ] ) ) + { + return; + } + if ( isDefined( data ) ) + { + i = 0; + while ( i < level.challengescallbacks[ callback ].size ) + { + thread [[ level.challengescallbacks[ callback ][ i ] ]]( data ); + i++; + } + } + else i = 0; + while ( i < level.challengescallbacks[ callback ].size ) + { + thread [[ level.challengescallbacks[ callback ][ i ] ]](); + i++; + } } onplayerconnect() { - for (;;) - { - level waittill( "connected", player ); - - player thread initchallengedata(); - player thread spawnwatcher(); - player thread monitorreloads(); - } + for ( ;; ) + { + level waittill( "connected", player ); + player thread initchallengedata(); + player thread spawnwatcher(); + player thread monitorreloads(); + } } monitorreloads() { - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "reload" ); - - currentweapon = self getcurrentweapon(); - - if ( currentweapon == "none" ) - continue; - - time = gettime(); - self.lastreloadtime = time; - - if ( currentweapon == "crossbow_mp" ) - self.crossbowclipkillcount = 0; - - if ( weaponhasattachment( currentweapon, "dualclip" ) ) - self thread reloadthenkill( currentweapon ); - } + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "reload" ); + currentweapon = self getcurrentweapon(); + while ( currentweapon == "none" ) + { + continue; + } + time = getTime(); + self.lastreloadtime = time; + if ( currentweapon == "crossbow_mp" ) + { + self.crossbowclipkillcount = 0; + } + if ( weaponhasattachment( currentweapon, "dualclip" ) ) + { + self thread reloadthenkill( currentweapon ); + } + } } reloadthenkill( reloadweapon ) { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "reloadThenKillTimedOut" ); - self notify( "reloadThenKillStart" ); - self endon( "reloadThenKillStart" ); - self thread reloadthenkilltimeout( 5 ); - - for (;;) - { - self waittill( "killed_enemy_player", time, weapon ); - - if ( reloadweapon == weapon ) - self addplayerstat( "reload_then_kill_dualclip", 1 ); - } + self endon( "disconnect" ); + self endon( "death" ); + self endon( "reloadThenKillTimedOut" ); + self notify( "reloadThenKillStart" ); + self endon( "reloadThenKillStart" ); + self thread reloadthenkilltimeout( 5 ); + for ( ;; ) + { + self waittill( "killed_enemy_player", time, weapon ); + if ( reloadweapon == weapon ) + { + self addplayerstat( "reload_then_kill_dualclip", 1 ); + } + } } reloadthenkilltimeout( time ) { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "reloadThenKillStart" ); - wait( time ); - self notify( "reloadThenKillTimedOut" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "reloadThenKillStart" ); + wait time; + self notify( "reloadThenKillTimedOut" ); } initchallengedata() { - self.pers["bulletStreak"] = 0; - self.pers["lastBulletKillTime"] = 0; - self.pers["stickExplosiveKill"] = 0; - self.pers["carepackagesCalled"] = 0; - self.explosiveinfo = []; + self.pers[ "bulletStreak" ] = 0; + self.pers[ "lastBulletKillTime" ] = 0; + self.pers[ "stickExplosiveKill" ] = 0; + self.pers[ "carepackagesCalled" ] = 0; + self.explosiveinfo = []; } isdamagefromplayercontrolledaitank( eattacker, einflictor, sweapon ) { - if ( sweapon == "ai_tank_drone_gun_mp" ) - { - if ( isdefined( eattacker ) && isdefined( eattacker.remoteweapon ) && isdefined( einflictor ) ) - { - if ( isdefined( einflictor.controlled ) && einflictor.controlled == 1 ) - { - if ( eattacker.remoteweapon == einflictor ) - return true; - } - } - } - else if ( sweapon == "ai_tank_drone_rocket_mp" ) - { - if ( isdefined( einflictor ) && !isdefined( einflictor.from_ai ) ) - return true; - } - - return false; + if ( sweapon == "ai_tank_drone_gun_mp" ) + { + if ( isDefined( eattacker ) && isDefined( eattacker.remoteweapon ) && isDefined( einflictor ) ) + { + if ( isDefined( einflictor.controlled ) && einflictor.controlled == 1 ) + { + if ( eattacker.remoteweapon == einflictor ) + { + return 1; + } + } + } + } + else + { + if ( sweapon == "ai_tank_drone_rocket_mp" ) + { + if ( isDefined( einflictor ) && !isDefined( einflictor.from_ai ) ) + { + return 1; + } + } + } + return 0; } isdamagefromplayercontrolledsentry( eattacker, einflictor, sweapon ) { - if ( sweapon == "auto_gun_turret_mp" ) - { - if ( isdefined( eattacker ) && isdefined( eattacker.remoteweapon ) && isdefined( einflictor ) ) - { - if ( eattacker.remoteweapon == einflictor ) - { - if ( isdefined( einflictor.controlled ) && einflictor.controlled == 1 ) - return true; - } - } - } - - return false; + if ( sweapon == "auto_gun_turret_mp" ) + { + if ( isDefined( eattacker ) && isDefined( eattacker.remoteweapon ) && isDefined( einflictor ) ) + { + if ( eattacker.remoteweapon == einflictor ) + { + if ( isDefined( einflictor.controlled ) && einflictor.controlled == 1 ) + { + return 1; + } + } + } + } + return 0; } challengekills( data, time ) { - victim = data.victim; - player = data.attacker; - attacker = data.attacker; - time = data.time; - victim = data.victim; - weapon = data.sweapon; - time = data.time; - inflictor = data.einflictor; - meansofdeath = data.smeansofdeath; - wasplanting = data.wasplanting; - wasdefusing = data.wasdefusing; - lastweaponbeforetoss = data.lastweaponbeforetoss; - ownerweaponatlaunch = data.ownerweaponatlaunch; - - if ( !isdefined( data.sweapon ) ) - return; - - if ( !isdefined( player ) || !isplayer( player ) ) - return; - - weaponclass = getweaponclass( weapon ); - game["challenge"][victim.team]["allAlive"] = 0; - - if ( level.teambased ) - { - if ( player.team == victim.team ) - return; - } - else if ( player == victim ) - return; - - if ( isdamagefromplayercontrolledaitank( player, inflictor, weapon ) == 1 ) - player addplayerstat( "kill_with_remote_control_ai_tank", 1 ); - - if ( weapon == "auto_gun_turret_mp" ) - { - if ( isdefined( inflictor ) ) - { - if ( !isdefined( inflictor.killcount ) ) - inflictor.killcount = 0; - - inflictor.killcount++; - - if ( inflictor.killcount >= 5 ) - { - inflictor.killcount = 0; - player addplayerstat( "killstreak_5_with_sentry_gun", 1 ); - } - } - - if ( isdamagefromplayercontrolledsentry( player, inflictor, weapon ) == 1 ) - player addplayerstat( "kill_with_remote_control_sentry_gun", 1 ); - } - - if ( weapon == "minigun_mp" || weapon == "inventory_minigun_mp" ) - { - player.deathmachinekills++; - - if ( player.deathmachinekills >= 5 ) - { - player.deathmachinekills = 0; - player addplayerstat( "killstreak_5_with_death_machine", 1 ); - } - } - - if ( data.waslockingon == 1 && weapon == "chopper_minigun_mp" ) - player addplayerstat( "kill_enemy_locking_on_with_chopper_gunner", 1 ); - - if ( isdefined( level.iskillstreakweapon ) ) - { - if ( [[ level.iskillstreakweapon ]]( data.sweapon ) ) - return; - } - - attacker notify( "killed_enemy_player", time, weapon ); - - if ( isdefined( player.primaryloadoutweapon ) && weapon == player.primaryloadoutweapon || isdefined( player.primaryloadoutaltweapon ) && weapon == player.primaryloadoutaltweapon ) - { - if ( player isbonuscardactive( 0, player.class_num ) ) - { - player addbonuscardstat( 0, "kills", 1, player.class_num ); - player addplayerstat( "kill_with_loadout_weapon_with_3_attachments", 1 ); - } - - if ( isdefined( player.secondaryweaponkill ) && player.secondaryweaponkill == 1 ) - { - player.primaryweaponkill = 0; - player.secondaryweaponkill = 0; - - if ( player isbonuscardactive( 2, player.class_num ) ) - { - player addbonuscardstat( 2, "kills", 1, player.class_num ); - player addplayerstat( "kill_with_both_primary_weapons", 1 ); - } - } - else - player.primaryweaponkill = 1; - } - else if ( isdefined( player.secondaryloadoutweapon ) && weapon == player.secondaryloadoutweapon || isdefined( player.secondaryloadoutaltweapon ) && weapon == player.secondaryloadoutaltweapon ) - { - if ( player isbonuscardactive( 1, player.class_num ) ) - player addbonuscardstat( 1, "kills", 1, player.class_num ); - - if ( isdefined( player.primaryweaponkill ) && player.primaryweaponkill == 1 ) - { - player.primaryweaponkill = 0; - player.secondaryweaponkill = 0; - - if ( player isbonuscardactive( 2, player.class_num ) ) - { - player addbonuscardstat( 2, "kills", 1, player.class_num ); - player addplayerstat( "kill_with_both_primary_weapons", 1 ); - } - } - else - player.secondaryweaponkill = 1; - } - - if ( player isbonuscardactive( 5, player.class_num ) || player isbonuscardactive( 4, player.class_num ) || player isbonuscardactive( 3, player.class_num ) ) - player addplayerstat( "kill_with_2_perks_same_category", 1 ); - - baseweaponname = getreffromitemindex( getbaseweaponitemindex( weapon ) ) + "_mp"; - - if ( isdefined( player.weaponkills[baseweaponname] ) ) - { - player.weaponkills[baseweaponname]++; - - if ( player.weaponkills[baseweaponname] == 5 ) - player addweaponstat( baseweaponname, "killstreak_5", 1 ); - - if ( player.weaponkills[baseweaponname] == 10 ) - player addweaponstat( baseweaponname, "killstreak_10", 1 ); - } - else - player.weaponkills[baseweaponname] = 1; - - attachmentname = player getweaponoptic( weapon ); - - if ( isdefined( attachmentname ) && attachmentname != "" ) - { - if ( isdefined( player.attachmentkills[attachmentname] ) ) - { - player.attachmentkills[attachmentname]++; - - if ( player.attachmentkills[attachmentname] == 5 ) - player addweaponstat( weapon, "killstreak_5_attachment", 1 ); - } - else - player.attachmentkills[attachmentname] = 1; - } + victim = data.victim; + player = data.attacker; + attacker = data.attacker; + time = data.time; + victim = data.victim; + weapon = data.sweapon; + time = data.time; + inflictor = data.einflictor; + meansofdeath = data.smeansofdeath; + wasplanting = data.wasplanting; + wasdefusing = data.wasdefusing; + lastweaponbeforetoss = data.lastweaponbeforetoss; + ownerweaponatlaunch = data.ownerweaponatlaunch; + if ( !isDefined( data.sweapon ) ) + { + return; + } + if ( !isDefined( player ) || !isplayer( player ) ) + { + return; + } + weaponclass = getweaponclass( weapon ); + game[ "challenge" ][ victim.team ][ "allAlive" ] = 0; + if ( level.teambased ) + { + if ( player.team == victim.team ) + { + return; + } + } + else + { + if ( player == victim ) + { + return; + } + } + if ( isdamagefromplayercontrolledaitank( player, inflictor, weapon ) == 1 ) + { + player addplayerstat( "kill_with_remote_control_ai_tank", 1 ); + } + if ( weapon == "auto_gun_turret_mp" ) + { + if ( isDefined( inflictor ) ) + { + if ( !isDefined( inflictor.killcount ) ) + { + inflictor.killcount = 0; + } + inflictor.killcount++; + if ( inflictor.killcount >= 5 ) + { + inflictor.killcount = 0; + player addplayerstat( "killstreak_5_with_sentry_gun", 1 ); + } + } + if ( isdamagefromplayercontrolledsentry( player, inflictor, weapon ) == 1 ) + { + player addplayerstat( "kill_with_remote_control_sentry_gun", 1 ); + } + } + if ( weapon == "minigun_mp" || weapon == "inventory_minigun_mp" ) + { + player.deathmachinekills++; + if ( player.deathmachinekills >= 5 ) + { + player.deathmachinekills = 0; + player addplayerstat( "killstreak_5_with_death_machine", 1 ); + } + } + if ( data.waslockingon == 1 && weapon == "chopper_minigun_mp" ) + { + player addplayerstat( "kill_enemy_locking_on_with_chopper_gunner", 1 ); + } + if ( isDefined( level.iskillstreakweapon ) ) + { + if ( [[ level.iskillstreakweapon ]]( data.sweapon ) ) + { + return; + } + } + attacker notify( "killed_enemy_player" ); + if ( isDefined( player.primaryloadoutweapon ) || weapon == player.primaryloadoutweapon && isDefined( player.primaryloadoutaltweapon ) && weapon == player.primaryloadoutaltweapon ) + { + if ( player isbonuscardactive( 0, player.class_num ) ) + { + player addbonuscardstat( 0, "kills", 1, player.class_num ); + player addplayerstat( "kill_with_loadout_weapon_with_3_attachments", 1 ); + } + if ( isDefined( player.secondaryweaponkill ) && player.secondaryweaponkill == 1 ) + { + player.primaryweaponkill = 0; + player.secondaryweaponkill = 0; + if ( player isbonuscardactive( 2, player.class_num ) ) + { + player addbonuscardstat( 2, "kills", 1, player.class_num ); + player addplayerstat( "kill_with_both_primary_weapons", 1 ); + } + } + else + { + player.primaryweaponkill = 1; + } + } + else + { + if ( isDefined( player.secondaryloadoutweapon ) || weapon == player.secondaryloadoutweapon && isDefined( player.secondaryloadoutaltweapon ) && weapon == player.secondaryloadoutaltweapon ) + { + if ( player isbonuscardactive( 1, player.class_num ) ) + { + player addbonuscardstat( 1, "kills", 1, player.class_num ); + } + if ( isDefined( player.primaryweaponkill ) && player.primaryweaponkill == 1 ) + { + player.primaryweaponkill = 0; + player.secondaryweaponkill = 0; + if ( player isbonuscardactive( 2, player.class_num ) ) + { + player addbonuscardstat( 2, "kills", 1, player.class_num ); + player addplayerstat( "kill_with_both_primary_weapons", 1 ); + } + } + else + { + player.secondaryweaponkill = 1; + } + } + } + if ( !player isbonuscardactive( 5, player.class_num ) || player isbonuscardactive( 4, player.class_num ) && player isbonuscardactive( 3, player.class_num ) ) + { + player addplayerstat( "kill_with_2_perks_same_category", 1 ); + } + baseweaponname = getreffromitemindex( getbaseweaponitemindex( weapon ) ) + "_mp"; + if ( isDefined( player.weaponkills[ baseweaponname ] ) ) + { + player.weaponkills[ baseweaponname ]++; + if ( player.weaponkills[ baseweaponname ] == 5 ) + { + player addweaponstat( baseweaponname, "killstreak_5", 1 ); + } + if ( player.weaponkills[ baseweaponname ] == 10 ) + { + player addweaponstat( baseweaponname, "killstreak_10", 1 ); + } + } + else + { + player.weaponkills[ baseweaponname ] = 1; + } + attachmentname = player getweaponoptic( weapon ); + if ( isDefined( attachmentname ) && attachmentname != "" ) + { + if ( isDefined( player.attachmentkills[ attachmentname ] ) ) + { + player.attachmentkills[ attachmentname ]++; + if ( player.attachmentkills[ attachmentname ] == 5 ) + { + player addweaponstat( weapon, "killstreak_5_attachment", 1 ); + } + } + else + { + player.attachmentkills[ attachmentname ] = 1; + } + } /# - assert( isdefined( player.activecounteruavs ) ); + assert( isDefined( player.activecounteruavs ) ); #/ /# - assert( isdefined( player.activeuavs ) ); + assert( isDefined( player.activeuavs ) ); #/ /# - assert( isdefined( player.activesatellites ) ); + assert( isDefined( player.activesatellites ) ); #/ - if ( player.activeuavs > 0 ) - player addplayerstat( "kill_while_uav_active", 1 ); - - if ( player.activecounteruavs > 0 ) - player addplayerstat( "kill_while_cuav_active", 1 ); - - if ( player.activesatellites > 0 ) - player addplayerstat( "kill_while_satellite_active", 1 ); - - if ( isdefined( attacker.tacticalinsertiontime ) && attacker.tacticalinsertiontime + 5000 > time ) - { - player addplayerstat( "kill_after_tac_insert", 1 ); - player addweaponstat( "tactical_insertion_mp", "CombatRecordStat", 1 ); - } - - if ( isdefined( victim.tacticalinsertiontime ) && victim.tacticalinsertiontime + 5000 > time ) - player addweaponstat( "tactical_insertion_mp", "headshots", 1 ); - - if ( isdefined( level.isplayertrackedfunc ) ) - { - if ( attacker [[ level.isplayertrackedfunc ]]( victim, time ) ) - { - attacker addplayerstat( "kill_enemy_revealed_by_sensor", 1 ); - attacker addweaponstat( "sensor_grenade_mp", "CombatRecordStat", 1 ); - } - } - - if ( level.teambased ) - { - activeempowner = level.empowners[player.team]; - - if ( isdefined( activeempowner ) ) - { - if ( activeempowner == player ) - player addplayerstat( "kill_while_emp_active", 1 ); - } - } - else if ( isdefined( level.empplayer ) ) - { - if ( level.empplayer == player ) - player addplayerstat( "kill_while_emp_active", 1 ); - } - - if ( isdefined( player.flakjacketclaymore[victim.clientid] ) && player.flakjacketclaymore[victim.clientid] == 1 ) - player addplayerstat( "survive_claymore_kill_planter_flak_jacket_equipped", 1 ); - - if ( isdefined( player.dogsactive ) ) - { - if ( weapon != "dog_bite_mp" ) - { - player.dogsactivekillstreak++; - - if ( player.dogsactivekillstreak > 5 ) - player addplayerstat( "killstreak_5_dogs", 1 ); - } - } - - isstunned = 0; - - if ( victim maps\mp\_utility::isflashbanged() ) - { - if ( isdefined( victim.lastflashedby ) && victim.lastflashedby == player ) - { - player addplayerstat( "kill_flashed_enemy", 1 ); - player addweaponstat( "flash_grenade_mp", "CombatRecordStat", 1 ); - } - - isstunned = 1; - } - - if ( isdefined( victim.concussionendtime ) && victim.concussionendtime > gettime() ) - { - if ( isdefined( victim.lastconcussedby ) && victim.lastconcussedby == player ) - { - player addplayerstat( "kill_concussed_enemy", 1 ); - player addweaponstat( "concussion_grenade_mp", "CombatRecordStat", 1 ); - } - - isstunned = 1; - } - - if ( isdefined( player.laststunnedby ) ) - { - if ( player.laststunnedby == victim && player.laststunnedtime + 5000 > time ) - player addplayerstat( "kill_enemy_who_shocked_you", 1 ); - } - - if ( isdefined( victim.laststunnedby ) && victim.laststunnedtime + 5000 > time ) - { - isstunned = 1; - - if ( victim.laststunnedby == player ) - { - player addplayerstat( "kill_shocked_enemy", 1 ); - player addweaponstat( "proximity_grenade_mp", "CombatRecordStat", 1 ); - - if ( data.smeansofdeath == "MOD_MELEE" ) - player addplayerstat( "shock_enemy_then_stab_them", 1 ); - } - } - - if ( player.mantletime + 5000 > time ) - player addplayerstat( "mantle_then_kill", 1 ); - - if ( isdefined( player.tookweaponfrom ) && isdefined( player.tookweaponfrom[weapon] ) && isdefined( player.tookweaponfrom[weapon].previousowner ) ) - { - if ( level.teambased ) - { - if ( player.tookweaponfrom[weapon].previousowner.team != player.team ) - { - player.pickedupweaponkills[weapon]++; - player addplayerstat( "kill_enemy_with_picked_up_weapon", 1 ); - } - } - else - { - player.pickedupweaponkills[weapon]++; - player addplayerstat( "kill_enemy_with_picked_up_weapon", 1 ); - } - - if ( player.pickedupweaponkills[weapon] >= 5 ) - { - player.pickedupweaponkills[weapon] = 0; - player addplayerstat( "killstreak_5_picked_up_weapon", 1 ); - } - } - - if ( isdefined( victim.explosiveinfo["originalOwnerKill"] ) && victim.explosiveinfo["originalOwnerKill"] == 1 ) - { - if ( victim.explosiveinfo["damageExplosiveKill"] == 1 ) - player addplayerstat( "kill_enemy_shoot_their_explosive", 1 ); - } - - if ( data.attackerstance == "crouch" ) - player addplayerstat( "kill_enemy_while_crouched", 1 ); - else if ( data.attackerstance == "prone" ) - player addplayerstat( "kill_enemy_while_prone", 1 ); - - if ( data.victimstance == "prone" ) - player addplayerstat( "kill_prone_enemy", 1 ); - - if ( data.smeansofdeath == "MOD_HEAD_SHOT" || data.smeansofdeath == "MOD_PISTOL_BULLET" || data.smeansofdeath == "MOD_RIFLE_BULLET" ) - player genericbulletkill( data, victim, weapon ); - - if ( level.teambased ) - { - if ( !isdefined( player.pers["kill_every_enemy"] ) && ( level.playercount[victim.pers["team"]] > 3 && player.pers["killed_players"].size >= level.playercount[victim.pers["team"]] ) ) - { - player addplayerstat( "kill_every_enemy", 1 ); - player.pers["kill_every_enemy"] = 1; - } - } - - switch ( weaponclass ) - { - case "weapon_pistol": - if ( data.smeansofdeath == "MOD_HEAD_SHOT" ) - { - player.pers["pistolHeadshot"]++; - - if ( player.pers["pistolHeadshot"] >= 10 ) - { - player.pers["pistolHeadshot"] = 0; - player addplayerstat( "pistolHeadshot_10_onegame", 1 ); - } - } - - break; - case "weapon_assault": - if ( data.smeansofdeath == "MOD_HEAD_SHOT" ) - { - player.pers["assaultRifleHeadshot"]++; - - if ( player.pers["assaultRifleHeadshot"] >= 5 ) - { - player.pers["assaultRifleHeadshot"] = 0; - player addplayerstat( "headshot_assault_5_onegame", 1 ); - } - } - - break; - case "weapon_smg": - case "weapon_lmg": - break; - case "weapon_sniper": - if ( isdefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) - { - player addplayerstat( "kill_enemy_one_bullet_sniper", 1 ); - player addweaponstat( weapon, "kill_enemy_one_bullet_sniper", 1 ); - - if ( !isdefined( player.pers["one_shot_sniper_kills"] ) ) - player.pers["one_shot_sniper_kills"] = 0; - - player.pers["one_shot_sniper_kills"]++; - - if ( player.pers["one_shot_sniper_kills"] == 10 ) - player addplayerstat( "kill_10_enemy_one_bullet_sniper_onegame", 1 ); - } - - break; - case "weapon_cqb": - if ( isdefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) - { - player addplayerstat( "kill_enemy_one_bullet_shotgun", 1 ); - player addweaponstat( weapon, "kill_enemy_one_bullet_shotgun", 1 ); - - if ( !isdefined( player.pers["one_shot_shotgun_kills"] ) ) - player.pers["one_shot_shotgun_kills"] = 0; - - player.pers["one_shot_shotgun_kills"]++; - - if ( player.pers["one_shot_shotgun_kills"] == 10 ) - player addplayerstat( "kill_10_enemy_one_bullet_shotgun_onegame", 1 ); - } - - break; - } - - if ( data.smeansofdeath == "MOD_MELEE" ) - { - if ( weaponhasattachment( weapon, "tacknife" ) ) - { - player addplayerstat( "kill_enemy_with_tacknife", 1 ); - player bladekill(); - } - else if ( weapon == "knife_ballistic_mp" ) - { - player bladekill(); - player addweaponstat( weapon, "ballistic_knife_melee", 1 ); - } - else if ( weapon == "knife_held_mp" || weapon == "knife_mp" ) - player bladekill(); - else if ( weapon == "riotshield_mp" ) - { - if ( victim.lastfiretime + 3000 > time ) - player addweaponstat( weapon, "shield_melee_while_enemy_shooting", 1 ); - } - } - else - { - if ( data.smeansofdeath == "MOD_IMPACT" && baseweaponname == "crossbow_mp" ) - { - if ( weaponhasattachment( weapon, "stackfire" ) ) - player addplayerstat( "KILL_CROSSBOW_STACKFIRE", 1 ); - } - else if ( isdefined( ownerweaponatlaunch ) ) - { - if ( weaponhasattachment( ownerweaponatlaunch, "stackfire" ) ) - player addplayerstat( "KILL_CROSSBOW_STACKFIRE", 1 ); - } - - if ( weapon == "knife_ballistic_mp" ) - { - player bladekill(); - - if ( isdefined( player.retreivedblades ) && player.retreivedblades > 0 ) - { - player.retreivedblades--; - player addweaponstat( weapon, "kill_retrieved_blade", 1 ); - } - } - } - - lethalgrenadekill = 0; - - switch ( weapon ) - { - case "bouncingbetty_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - break; - case "hatchet_mp": - player bladekill(); - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - - if ( isdefined( lastweaponbeforetoss ) ) - { - if ( lastweaponbeforetoss == level.riotshield_name ) - { - player addweaponstat( level.riotshield_name, "hatchet_kill_with_shield_equiped", 1 ); - player addplayerstat( "hatchet_kill_with_shield_equiped", 1 ); - } - } - - break; - case "claymore_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - player addplayerstat( "kill_with_claymore", 1 ); - - if ( data.washacked ) - player addplayerstat( "kill_with_hacked_claymore", 1 ); - - break; - case "satchel_charge_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - player addplayerstat( "kill_with_c4", 1 ); - break; - case "destructible_car_mp": - player addplayerstat( "kill_enemy_withcar", 1 ); - - if ( isdefined( inflictor.destroyingweapon ) ) - player addweaponstat( inflictor.destroyingweapon, "kills_from_cars", 1 ); - - break; - case "sticky_grenade_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - - if ( isdefined( victim.explosiveinfo["stuckToPlayer"] ) && victim.explosiveinfo["stuckToPlayer"] == victim ) - { - attacker.pers["stickExplosiveKill"]++; - - if ( attacker.pers["stickExplosiveKill"] >= 5 ) - { - attacker.pers["stickExplosiveKill"] = 0; - player addplayerstat( "stick_explosive_kill_5_onegame", 1 ); - } - } - - break; - case "frag_grenade_mp": - lethalgrenadekill = 1; - player notify( "lethalGrenadeKill" ); - - if ( isdefined( data.victim.explosiveinfo["cookedKill"] ) && data.victim.explosiveinfo["cookedKill"] == 1 ) - player addplayerstat( "kill_with_cooked_grenade", 1 ); - - if ( isdefined( data.victim.explosiveinfo["throwbackKill"] ) && data.victim.explosiveinfo["throwbackKill"] == 1 ) - player addplayerstat( "kill_with_tossed_back_lethal", 1 ); - - break; - case "explosive_bolt_mp": - case "crossbow_mp": - if ( !isdefined( player.crossbowclipkillcount ) ) - player.crossbowclipkillcount = 0; - - player.crossbowclipkillcount++; - - if ( player.crossbowclipkillcount >= weaponclipsize( "crossbow_mp" ) ) - { - player.crossbowclipkillcount = 0; - player addweaponstat( "crossbow_mp", "crossbow_kill_clip", 1 ); - } - - break; - } - - if ( lethalgrenadekill ) - { - if ( player isbonuscardactive( 6, player.class_num ) ) - { - player addbonuscardstat( 6, "kills", 1, player.class_num ); - - if ( !isdefined( player.pers["dangerCloseKills"] ) ) - player.pers["dangerCloseKills"] = 0; - - player.pers["dangerCloseKills"]++; - - if ( player.pers["dangerCloseKills"] == 5 ) - player addplayerstat( "kill_with_dual_lethal_grenades", 1 ); - } - } - - player perkkills( victim, isstunned, time ); + if ( player.activeuavs > 0 ) + { + player addplayerstat( "kill_while_uav_active", 1 ); + } + if ( player.activecounteruavs > 0 ) + { + player addplayerstat( "kill_while_cuav_active", 1 ); + } + if ( player.activesatellites > 0 ) + { + player addplayerstat( "kill_while_satellite_active", 1 ); + } + if ( isDefined( attacker.tacticalinsertiontime ) && ( attacker.tacticalinsertiontime + 5000 ) > time ) + { + player addplayerstat( "kill_after_tac_insert", 1 ); + player addweaponstat( "tactical_insertion_mp", "CombatRecordStat", 1 ); + } + if ( isDefined( victim.tacticalinsertiontime ) && ( victim.tacticalinsertiontime + 5000 ) > time ) + { + player addweaponstat( "tactical_insertion_mp", "headshots", 1 ); + } + if ( isDefined( level.isplayertrackedfunc ) ) + { + if ( attacker [[ level.isplayertrackedfunc ]]( victim, time ) ) + { + attacker addplayerstat( "kill_enemy_revealed_by_sensor", 1 ); + attacker addweaponstat( "sensor_grenade_mp", "CombatRecordStat", 1 ); + } + } + if ( level.teambased ) + { + activeempowner = level.empowners[ player.team ]; + if ( isDefined( activeempowner ) ) + { + if ( activeempowner == player ) + { + player addplayerstat( "kill_while_emp_active", 1 ); + } + } + } + else + { + if ( isDefined( level.empplayer ) ) + { + if ( level.empplayer == player ) + { + player addplayerstat( "kill_while_emp_active", 1 ); + } + } + } + if ( isDefined( player.flakjacketclaymore[ victim.clientid ] ) && player.flakjacketclaymore[ victim.clientid ] == 1 ) + { + player addplayerstat( "survive_claymore_kill_planter_flak_jacket_equipped", 1 ); + } + if ( isDefined( player.dogsactive ) ) + { + if ( weapon != "dog_bite_mp" ) + { + player.dogsactivekillstreak++; + if ( player.dogsactivekillstreak > 5 ) + { + player addplayerstat( "killstreak_5_dogs", 1 ); + } + } + } + isstunned = 0; + if ( victim maps/mp/_utility::isflashbanged() ) + { + if ( isDefined( victim.lastflashedby ) && victim.lastflashedby == player ) + { + player addplayerstat( "kill_flashed_enemy", 1 ); + player addweaponstat( "flash_grenade_mp", "CombatRecordStat", 1 ); + } + isstunned = 1; + } + if ( isDefined( victim.concussionendtime ) && victim.concussionendtime > getTime() ) + { + if ( isDefined( victim.lastconcussedby ) && victim.lastconcussedby == player ) + { + player addplayerstat( "kill_concussed_enemy", 1 ); + player addweaponstat( "concussion_grenade_mp", "CombatRecordStat", 1 ); + } + isstunned = 1; + } + if ( isDefined( player.laststunnedby ) ) + { + if ( player.laststunnedby == victim && ( player.laststunnedtime + 5000 ) > time ) + { + player addplayerstat( "kill_enemy_who_shocked_you", 1 ); + } + } + if ( isDefined( victim.laststunnedby ) && ( victim.laststunnedtime + 5000 ) > time ) + { + isstunned = 1; + if ( victim.laststunnedby == player ) + { + player addplayerstat( "kill_shocked_enemy", 1 ); + player addweaponstat( "proximity_grenade_mp", "CombatRecordStat", 1 ); + if ( data.smeansofdeath == "MOD_MELEE" ) + { + player addplayerstat( "shock_enemy_then_stab_them", 1 ); + } + } + } + if ( ( player.mantletime + 5000 ) > time ) + { + player addplayerstat( "mantle_then_kill", 1 ); + } + if ( isDefined( player.tookweaponfrom ) && isDefined( player.tookweaponfrom[ weapon ] ) && isDefined( player.tookweaponfrom[ weapon ].previousowner ) ) + { + if ( level.teambased ) + { + if ( player.tookweaponfrom[ weapon ].previousowner.team != player.team ) + { + player.pickedupweaponkills[ weapon ]++; + player addplayerstat( "kill_enemy_with_picked_up_weapon", 1 ); + } + } + else + { + player.pickedupweaponkills[ weapon ]++; + player addplayerstat( "kill_enemy_with_picked_up_weapon", 1 ); + } + if ( player.pickedupweaponkills[ weapon ] >= 5 ) + { + player.pickedupweaponkills[ weapon ] = 0; + player addplayerstat( "killstreak_5_picked_up_weapon", 1 ); + } + } + if ( isDefined( victim.explosiveinfo[ "originalOwnerKill" ] ) && victim.explosiveinfo[ "originalOwnerKill" ] == 1 ) + { + if ( victim.explosiveinfo[ "damageExplosiveKill" ] == 1 ) + { + player addplayerstat( "kill_enemy_shoot_their_explosive", 1 ); + } + } + if ( data.attackerstance == "crouch" ) + { + player addplayerstat( "kill_enemy_while_crouched", 1 ); + } + else + { + if ( data.attackerstance == "prone" ) + { + player addplayerstat( "kill_enemy_while_prone", 1 ); + } + } + if ( data.victimstance == "prone" ) + { + player addplayerstat( "kill_prone_enemy", 1 ); + } + if ( data.smeansofdeath != "MOD_HEAD_SHOT" || data.smeansofdeath == "MOD_PISTOL_BULLET" && data.smeansofdeath == "MOD_RIFLE_BULLET" ) + { + player genericbulletkill( data, victim, weapon ); + } + if ( level.teambased ) + { + if ( !isDefined( player.pers[ "kill_every_enemy" ] ) && level.playercount[ victim.pers[ "team" ] ] > 3 && player.pers[ "killed_players" ].size >= level.playercount[ victim.pers[ "team" ] ] ) + { + player addplayerstat( "kill_every_enemy", 1 ); + player.pers[ "kill_every_enemy" ] = 1; + } + } + switch( weaponclass ) + { + case "weapon_pistol": + if ( data.smeansofdeath == "MOD_HEAD_SHOT" ) + { + player.pers[ "pistolHeadshot" ]++; + if ( player.pers[ "pistolHeadshot" ] >= 10 ) + { + player.pers[ "pistolHeadshot" ] = 0; + player addplayerstat( "pistolHeadshot_10_onegame", 1 ); + } + } + break; + case "weapon_assault": + if ( data.smeansofdeath == "MOD_HEAD_SHOT" ) + { + player.pers[ "assaultRifleHeadshot" ]++; + if ( player.pers[ "assaultRifleHeadshot" ] >= 5 ) + { + player.pers[ "assaultRifleHeadshot" ] = 0; + player addplayerstat( "headshot_assault_5_onegame", 1 ); + } + } + break; + case "weapon_lmg": + case "weapon_smg": + case "weapon_sniper": + if ( isDefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) + { + player addplayerstat( "kill_enemy_one_bullet_sniper", 1 ); + player addweaponstat( weapon, "kill_enemy_one_bullet_sniper", 1 ); + if ( !isDefined( player.pers[ "one_shot_sniper_kills" ] ) ) + { + player.pers[ "one_shot_sniper_kills" ] = 0; + } + player.pers[ "one_shot_sniper_kills" ]++; + if ( player.pers[ "one_shot_sniper_kills" ] == 10 ) + { + player addplayerstat( "kill_10_enemy_one_bullet_sniper_onegame", 1 ); + } + } + break; + case "weapon_cqb": + if ( isDefined( victim.firsttimedamaged ) && victim.firsttimedamaged == time ) + { + player addplayerstat( "kill_enemy_one_bullet_shotgun", 1 ); + player addweaponstat( weapon, "kill_enemy_one_bullet_shotgun", 1 ); + if ( !isDefined( player.pers[ "one_shot_shotgun_kills" ] ) ) + { + player.pers[ "one_shot_shotgun_kills" ] = 0; + } + player.pers[ "one_shot_shotgun_kills" ]++; + if ( player.pers[ "one_shot_shotgun_kills" ] == 10 ) + { + player addplayerstat( "kill_10_enemy_one_bullet_shotgun_onegame", 1 ); + } + } + break; + } + if ( data.smeansofdeath == "MOD_MELEE" ) + { + if ( weaponhasattachment( weapon, "tacknife" ) ) + { + player addplayerstat( "kill_enemy_with_tacknife", 1 ); + player bladekill(); + } + else if ( weapon == "knife_ballistic_mp" ) + { + player bladekill(); + player addweaponstat( weapon, "ballistic_knife_melee", 1 ); + } + else if ( weapon == "knife_held_mp" || weapon == "knife_mp" ) + { + player bladekill(); + } + else + { + if ( weapon == "riotshield_mp" ) + { + if ( ( victim.lastfiretime + 3000 ) > time ) + { + player addweaponstat( weapon, "shield_melee_while_enemy_shooting", 1 ); + } + } + } + } + else + { + if ( data.smeansofdeath == "MOD_IMPACT" && baseweaponname == "crossbow_mp" ) + { + if ( weaponhasattachment( weapon, "stackfire" ) ) + { + player addplayerstat( "KILL_CROSSBOW_STACKFIRE", 1 ); + } + } + else + { + if ( isDefined( ownerweaponatlaunch ) ) + { + if ( weaponhasattachment( ownerweaponatlaunch, "stackfire" ) ) + { + player addplayerstat( "KILL_CROSSBOW_STACKFIRE", 1 ); + } + } + } + if ( weapon == "knife_ballistic_mp" ) + { + player bladekill(); + if ( isDefined( player.retreivedblades ) && player.retreivedblades > 0 ) + { + player.retreivedblades--; + + player addweaponstat( weapon, "kill_retrieved_blade", 1 ); + } + } + } + lethalgrenadekill = 0; + switch( weapon ) + { + case "bouncingbetty_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + break; + case "hatchet_mp": + player bladekill(); + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + if ( isDefined( lastweaponbeforetoss ) ) + { + if ( lastweaponbeforetoss == level.riotshield_name ) + { + player addweaponstat( level.riotshield_name, "hatchet_kill_with_shield_equiped", 1 ); + player addplayerstat( "hatchet_kill_with_shield_equiped", 1 ); + } + } + break; + case "claymore_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + player addplayerstat( "kill_with_claymore", 1 ); + if ( data.washacked ) + { + player addplayerstat( "kill_with_hacked_claymore", 1 ); + } + break; + case "satchel_charge_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + player addplayerstat( "kill_with_c4", 1 ); + break; + case "destructible_car_mp": + player addplayerstat( "kill_enemy_withcar", 1 ); + if ( isDefined( inflictor.destroyingweapon ) ) + { + player addweaponstat( inflictor.destroyingweapon, "kills_from_cars", 1 ); + } + break; + case "sticky_grenade_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + if ( isDefined( victim.explosiveinfo[ "stuckToPlayer" ] ) && victim.explosiveinfo[ "stuckToPlayer" ] == victim ) + { + attacker.pers[ "stickExplosiveKill" ]++; + if ( attacker.pers[ "stickExplosiveKill" ] >= 5 ) + { + attacker.pers[ "stickExplosiveKill" ] = 0; + player addplayerstat( "stick_explosive_kill_5_onegame", 1 ); + } + } + break; + case "frag_grenade_mp": + lethalgrenadekill = 1; + player notify( "lethalGrenadeKill" ); + if ( isDefined( data.victim.explosiveinfo[ "cookedKill" ] ) && data.victim.explosiveinfo[ "cookedKill" ] == 1 ) + { + player addplayerstat( "kill_with_cooked_grenade", 1 ); + } + if ( isDefined( data.victim.explosiveinfo[ "throwbackKill" ] ) && data.victim.explosiveinfo[ "throwbackKill" ] == 1 ) + { + player addplayerstat( "kill_with_tossed_back_lethal", 1 ); + } + break; + case "crossbow_mp": + case "explosive_bolt_mp": + if ( !isDefined( player.crossbowclipkillcount ) ) + { + player.crossbowclipkillcount = 0; + } + player.crossbowclipkillcount++; + if ( player.crossbowclipkillcount >= weaponclipsize( "crossbow_mp" ) ) + { + player.crossbowclipkillcount = 0; + player addweaponstat( "crossbow_mp", "crossbow_kill_clip", 1 ); + } + break; + } + if ( lethalgrenadekill ) + { + if ( player isbonuscardactive( 6, player.class_num ) ) + { + player addbonuscardstat( 6, "kills", 1, player.class_num ); + if ( !isDefined( player.pers[ "dangerCloseKills" ] ) ) + { + player.pers[ "dangerCloseKills" ] = 0; + } + player.pers[ "dangerCloseKills" ]++; + if ( player.pers[ "dangerCloseKills" ] == 5 ) + { + player addplayerstat( "kill_with_dual_lethal_grenades", 1 ); + } + } + } + player perkkills( victim, isstunned, time ); + } } perkkills( victim, isstunned, time ) { - player = self; - - if ( player hasperk( "specialty_movefaster" ) ) - player addplayerstat( "perk_movefaster_kills", 1 ); - - if ( player hasperk( "specialty_noname" ) ) - player addplayerstat( "perk_noname_kills", 1 ); - - if ( player hasperk( "specialty_quieter" ) ) - player addplayerstat( "perk_quieter_kills", 1 ); - - if ( player hasperk( "specialty_longersprint" ) ) - { - if ( isdefined( player.lastsprinttime ) && gettime() - player.lastsprinttime < 2500 ) - player addplayerstat( "perk_longersprint", 1 ); - } - - if ( player hasperk( "specialty_fastmantle" ) ) - { - if ( isdefined( player.lastsprinttime ) && gettime() - player.lastsprinttime < 2500 && player playerads() >= 1 ) - player addplayerstat( "perk_fastmantle_kills", 1 ); - } - - if ( player hasperk( "specialty_loudenemies" ) ) - player addplayerstat( "perk_loudenemies_kills", 1 ); - - if ( isstunned == 1 && player hasperk( "specialty_stunprotection" ) ) - player addplayerstat( "perk_protection_stun_kills", 1 ); + player = self; + if ( player hasperk( "specialty_movefaster" ) ) + { + player addplayerstat( "perk_movefaster_kills", 1 ); + } + if ( player hasperk( "specialty_noname" ) ) + { + player addplayerstat( "perk_noname_kills", 1 ); + } + if ( player hasperk( "specialty_quieter" ) ) + { + player addplayerstat( "perk_quieter_kills", 1 ); + } + if ( player hasperk( "specialty_longersprint" ) ) + { + if ( isDefined( player.lastsprinttime ) && ( getTime() - player.lastsprinttime ) < 2500 ) + { + player addplayerstat( "perk_longersprint", 1 ); + } + } + if ( player hasperk( "specialty_fastmantle" ) ) + { + if ( isDefined( player.lastsprinttime ) && ( getTime() - player.lastsprinttime ) < 2500 && player playerads() >= 1 ) + { + player addplayerstat( "perk_fastmantle_kills", 1 ); + } + } + if ( player hasperk( "specialty_loudenemies" ) ) + { + player addplayerstat( "perk_loudenemies_kills", 1 ); + } + if ( isstunned == 1 && player hasperk( "specialty_stunprotection" ) ) + { + player addplayerstat( "perk_protection_stun_kills", 1 ); + } /# - assert( isdefined( victim.activecounteruavs ) ); + assert( isDefined( victim.activecounteruavs ) ); #/ - activeemp = 0; - - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - if ( team == player.team ) - continue; - - if ( isdefined( level.empowners[team] ) ) - { - activeemp = 1; - break; - } - } - } - else if ( isdefined( level.empplayer ) ) - { - if ( level.empplayer != player ) - activeemp = 1; - } - - activecuav = 0; - - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - if ( team == player.team ) - continue; - - if ( level.activecounteruavs[team] > 0 ) - { - activecuav = 1; - break; - } - } - } - else - { - players = level.players; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] != player ) - { - if ( isdefined( level.activecounteruavs[players[i].entnum] ) && level.activecounteruavs[players[i].entnum] > 0 ) - { - activecuav = 1; - break; - } - } - } - } - - if ( activecuav == 1 || activeemp == 1 ) - { - if ( player hasperk( "specialty_immunecounteruav" ) ) - player addplayerstat( "perk_immune_cuav_kills", 1 ); - } - - activeuavvictim = 0; - - if ( level.teambased ) - { - if ( level.activeuavs[victim.team] > 0 ) - activeuavvictim = 1; - } - else - activeuavvictim = isdefined( level.activeuavs[victim.entnum] ) && level.activeuavs[victim.entnum] > 0; - - if ( activeuavvictim == 1 ) - { - if ( player hasperk( "specialty_gpsjammer" ) ) - player addplayerstat( "perk_gpsjammer_immune_kills", 1 ); - } - - if ( player.lastweaponchange + 5000 > time ) - { - if ( player hasperk( "specialty_fastweaponswitch" ) ) - player addplayerstat( "perk_fastweaponswitch_kill_after_swap", 1 ); - } - - if ( player.scavenged == 1 ) - { - if ( player hasperk( "specialty_scavenger" ) ) - player addplayerstat( "perk_scavenger_kills_after_resupply", 1 ); - } + activeemp = 0; + if ( level.teambased ) + { + _a905 = level.teams; + _k905 = getFirstArrayKey( _a905 ); + while ( isDefined( _k905 ) ) + { + team = _a905[ _k905 ]; + if ( team == player.team ) + { + } + else + { + if ( isDefined( level.empowners[ team ] ) ) + { + activeemp = 1; + break; + } + } + else + { + _k905 = getNextArrayKey( _a905, _k905 ); + } + } + } + else if ( isDefined( level.empplayer ) ) + { + if ( level.empplayer != player ) + { + activeemp = 1; + } + } + activecuav = 0; + if ( level.teambased ) + { + _a932 = level.teams; + _k932 = getFirstArrayKey( _a932 ); + while ( isDefined( _k932 ) ) + { + team = _a932[ _k932 ]; + if ( team == player.team ) + { + } + else + { + if ( level.activecounteruavs[ team ] > 0 ) + { + activecuav = 1; + break; + } + } + else + { + _k932 = getNextArrayKey( _a932, _k932 ); + } + } + } + else players = level.players; + i = 0; + while ( i < players.size ) + { + if ( players[ i ] != player ) + { + if ( isDefined( level.activecounteruavs[ players[ i ].entnum ] ) && level.activecounteruavs[ players[ i ].entnum ] > 0 ) + { + activecuav = 1; + break; + } + } + else + { + i++; + } + } + if ( activecuav == 1 || activeemp == 1 ) + { + if ( player hasperk( "specialty_immunecounteruav" ) ) + { + player addplayerstat( "perk_immune_cuav_kills", 1 ); + } + } + activeuavvictim = 0; + if ( level.teambased ) + { + if ( level.activeuavs[ victim.team ] > 0 ) + { + activeuavvictim = 1; + } + } + else + { + if ( isDefined( level.activeuavs[ victim.entnum ] ) ) + { + activeuavvictim = level.activeuavs[ victim.entnum ] > 0; + } + } + if ( activeuavvictim == 1 ) + { + if ( player hasperk( "specialty_gpsjammer" ) ) + { + player addplayerstat( "perk_gpsjammer_immune_kills", 1 ); + } + } + if ( ( player.lastweaponchange + 5000 ) > time ) + { + if ( player hasperk( "specialty_fastweaponswitch" ) ) + { + player addplayerstat( "perk_fastweaponswitch_kill_after_swap", 1 ); + } + } + if ( player.scavenged == 1 ) + { + if ( player hasperk( "specialty_scavenger" ) ) + { + player addplayerstat( "perk_scavenger_kills_after_resupply", 1 ); + } + } } flakjacketprotected( weapon, attacker ) { - if ( weapon == "claymore_mp" ) - self.flakjacketclaymore[attacker.clientid] = 1; - - self addplayerstat( "perk_flak_survive", 1 ); + if ( weapon == "claymore_mp" ) + { + self.flakjacketclaymore[ attacker.clientid ] = 1; + } + self addplayerstat( "perk_flak_survive", 1 ); } earnedkillstreak() { - if ( self hasperk( "specialty_earnmoremomentum" ) ) - self addplayerstat( "perk_earnmoremomentum_earn_streak", 1 ); + if ( self hasperk( "specialty_earnmoremomentum" ) ) + { + self addplayerstat( "perk_earnmoremomentum_earn_streak", 1 ); + } } genericbulletkill( data, victim, weapon ) { - player = self; - time = data.time; - - if ( player.pers["lastBulletKillTime"] == time ) - player.pers["bulletStreak"]++; - else - player.pers["bulletStreak"] = 1; - - player.pers["lastBulletKillTime"] = time; - - if ( data.victim.idflagstime == time ) - { - if ( data.victim.idflags & level.idflags_penetration ) - { - player addplayerstat( "kill_enemy_through_wall", 1 ); - - if ( isdefined( weapon ) && weaponhasattachment( weapon, "fmj" ) ) - player addplayerstat( "kill_enemy_through_wall_with_fmj", 1 ); - } - } + player = self; + time = data.time; + if ( player.pers[ "lastBulletKillTime" ] == time ) + { + player.pers[ "bulletStreak" ]++; + } + else + { + player.pers[ "bulletStreak" ] = 1; + } + player.pers[ "lastBulletKillTime" ] = time; + if ( data.victim.idflagstime == time ) + { + if ( data.victim.idflags & level.idflags_penetration ) + { + player addplayerstat( "kill_enemy_through_wall", 1 ); + if ( isDefined( weapon ) && weaponhasattachment( weapon, "fmj" ) ) + { + player addplayerstat( "kill_enemy_through_wall_with_fmj", 1 ); + } + } + } } ishighestscoringplayer( player ) { - if ( !isdefined( player.score ) || player.score < 1 ) - return false; - - players = level.players; - - if ( level.teambased ) - team = player.pers["team"]; - else - team = "all"; - - highscore = player.score; - - for ( i = 0; i < players.size; i++ ) - { - if ( !isdefined( players[i].score ) ) - continue; - - if ( players[i] == player ) - continue; - - if ( players[i].score < 1 ) - continue; - - if ( team != "all" && players[i].pers["team"] != team ) - continue; - - if ( players[i].score >= highscore ) - return false; - } - - return true; + if ( !isDefined( player.score ) || player.score < 1 ) + { + return 0; + } + players = level.players; + if ( level.teambased ) + { + team = player.pers[ "team" ]; + } + else + { + team = "all"; + } + highscore = player.score; + i = 0; + while ( i < players.size ) + { + if ( !isDefined( players[ i ].score ) ) + { + i++; + continue; + } + else if ( players[ i ] == player ) + { + i++; + continue; + } + else if ( players[ i ].score < 1 ) + { + i++; + continue; + } + else if ( team != "all" && players[ i ].pers[ "team" ] != team ) + { + i++; + continue; + } + else + { + if ( players[ i ].score >= highscore ) + { + return 0; + } + } + i++; + } + return 1; } spawnwatcher() { - self endon( "disconnect" ); - self.pers["stickExplosiveKill"] = 0; - self.pers["pistolHeadshot"] = 0; - self.pers["assaultRifleHeadshot"] = 0; - self.pers["killNemesis"] = 0; - - while ( true ) - { - self waittill( "spawned_player" ); - - self.pers["longshotsPerLife"] = 0; - self.flakjacketclaymore = []; - self.weaponkills = []; - self.attachmentkills = []; - self.retreivedblades = 0; - self.lastreloadtime = 0; - self.crossbowclipkillcount = 0; - self thread watchfordtp(); - self thread watchformantle(); - self thread monitor_player_sprint(); - } + self endon( "disconnect" ); + self.pers[ "stickExplosiveKill" ] = 0; + self.pers[ "pistolHeadshot" ] = 0; + self.pers[ "assaultRifleHeadshot" ] = 0; + self.pers[ "killNemesis" ] = 0; + while ( 1 ) + { + self waittill( "spawned_player" ); + self.pers[ "longshotsPerLife" ] = 0; + self.flakjacketclaymore = []; + self.weaponkills = []; + self.attachmentkills = []; + self.retreivedblades = 0; + self.lastreloadtime = 0; + self.crossbowclipkillcount = 0; + self thread watchfordtp(); + self thread watchformantle(); + self thread monitor_player_sprint(); + } } pickedupballisticknife() { - self.retreivedblades++; + self.retreivedblades++; } watchfordtp() { - self endon( "disconnect" ); - self endon( "death" ); - - for ( self.dtptime = 0; 1; self.dtptime = gettime() + 4000 ) - self waittill( "dtp_end" ); + self endon( "disconnect" ); + self endon( "death" ); + self.dtptime = 0; + while ( 1 ) + { + self waittill( "dtp_end" ); + self.dtptime = getTime() + 4000; + } } watchformantle() { - self endon( "disconnect" ); - self endon( "death" ); - - for ( self.mantletime = 0; 1; self.mantletime = mantleendtime ) - self waittill( "mantle_start", mantleendtime ); + self endon( "disconnect" ); + self endon( "death" ); + self.mantletime = 0; + while ( 1 ) + { + self waittill( "mantle_start", mantleendtime ); + self.mantletime = mantleendtime; + } } disarmedhackedcarepackage() { - self addplayerstat( "disarm_hacked_carepackage", 1 ); + self addplayerstat( "disarm_hacked_carepackage", 1 ); } destroyed_car() { - if ( !isdefined( self ) || !isplayer( self ) ) - return; - - self addplayerstat( "destroy_car", 1 ); + if ( !isDefined( self ) || !isplayer( self ) ) + { + return; + } + self addplayerstat( "destroy_car", 1 ); } killednemesis() { - self.pers["killNemesis"]++; - - if ( self.pers["killNemesis"] >= 5 ) - { - self.pers["killNemesis"] = 0; - self addplayerstat( "kill_nemesis", 1 ); - } + self.pers[ "killNemesis" ]++; + if ( self.pers[ "killNemesis" ] >= 5 ) + { + self.pers[ "killNemesis" ] = 0; + self addplayerstat( "kill_nemesis", 1 ); + } } killwhiledamagingwithhpm() { - self addplayerstat( "kill_while_damaging_with_microwave_turret", 1 ); + self addplayerstat( "kill_while_damaging_with_microwave_turret", 1 ); } longdistancehatchetkill() { - self addplayerstat( "long_distance_hatchet_kill", 1 ); + self addplayerstat( "long_distance_hatchet_kill", 1 ); } blockedsatellite() { - self addplayerstat( "activate_cuav_while_enemy_satelite_active", 1 ); + self addplayerstat( "activate_cuav_while_enemy_satelite_active", 1 ); } longdistancekill() { - self.pers["longshotsPerLife"]++; - - if ( self.pers["longshotsPerLife"] >= 3 ) - { - self.pers["longshotsPerLife"] = 0; - self addplayerstat( "longshot_3_onelife", 1 ); - } + self.pers[ "longshotsPerLife" ]++; + if ( self.pers[ "longshotsPerLife" ] >= 3 ) + { + self.pers[ "longshotsPerLife" ] = 0; + self addplayerstat( "longshot_3_onelife", 1 ); + } } challengeroundend( data ) { - player = data.player; - winner = data.winner; - - if ( endedearly( winner ) ) - return; - - if ( level.teambased ) - { - winnerscore = game["teamScores"][winner]; - loserscore = getlosersteamscores( winner ); - } - - switch ( level.gametype ) - { - case "sd": - if ( player.team == winner ) - { - if ( game["challenge"][winner]["allAlive"] ) - player addgametypestat( "round_win_no_deaths", 1 ); - - if ( isdefined( player.lastmansddefeat3enemies ) ) - player addgametypestat( "last_man_defeat_3_enemies", 1 ); - } - - break; - default: - break; - } + player = data.player; + winner = data.winner; + if ( endedearly( winner ) ) + { + return; + } + if ( level.teambased ) + { + winnerscore = game[ "teamScores" ][ winner ]; + loserscore = getlosersteamscores( winner ); + } + switch( level.gametype ) + { + case "sd": + if ( player.team == winner ) + { + if ( game[ "challenge" ][ winner ][ "allAlive" ] ) + { + player addgametypestat( "round_win_no_deaths", 1 ); + } + if ( isDefined( player.lastmansddefeat3enemies ) ) + { + player addgametypestat( "last_man_defeat_3_enemies", 1 ); + } + } + break; + default: + } + } } roundend( winner ) { - wait 0.05; - data = spawnstruct(); - data.time = gettime(); - - if ( level.teambased ) - { - if ( isdefined( winner ) && isdefined( level.teams[winner] ) ) - data.winner = winner; - } - else if ( isdefined( winner ) ) - data.winner = winner; - - for ( index = 0; index < level.placement["all"].size; index++ ) - { - data.player = level.placement["all"][index]; - data.place = index; - dochallengecallback( "roundEnd", data ); - } + wait 0,05; + data = spawnstruct(); + data.time = getTime(); + if ( level.teambased ) + { + if ( isDefined( winner ) && isDefined( level.teams[ winner ] ) ) + { + data.winner = winner; + } + } + else + { + if ( isDefined( winner ) ) + { + data.winner = winner; + } + } + index = 0; + while ( index < level.placement[ "all" ].size ) + { + data.player = level.placement[ "all" ][ index ]; + data.place = index; + dochallengecallback( "roundEnd", data ); + index++; + } } gameend( winner ) { - wait 0.05; - data = spawnstruct(); - data.time = gettime(); - - if ( level.teambased ) - { - if ( isdefined( winner ) && isdefined( level.teams[winner] ) ) - data.winner = winner; - } - else if ( isdefined( winner ) && isplayer( winner ) ) - data.winner = winner; - - for ( index = 0; index < level.placement["all"].size; index++ ) - { - data.player = level.placement["all"][index]; - data.place = index; - dochallengecallback( "gameEnd", data ); - } + wait 0,05; + data = spawnstruct(); + data.time = getTime(); + if ( level.teambased ) + { + if ( isDefined( winner ) && isDefined( level.teams[ winner ] ) ) + { + data.winner = winner; + } + } + else + { + if ( isDefined( winner ) && isplayer( winner ) ) + { + data.winner = winner; + } + } + index = 0; + while ( index < level.placement[ "all" ].size ) + { + data.player = level.placement[ "all" ][ index ]; + data.place = index; + dochallengecallback( "gameEnd", data ); + index++; + } } getfinalkill( player ) { - if ( isplayer( player ) ) - player addplayerstat( "get_final_kill", 1 ); + if ( isplayer( player ) ) + { + player addplayerstat( "get_final_kill", 1 ); + } } destroyrcbomb( weaponname ) { - self destroyscorestreak( weaponname ); - - if ( weaponname == "hatchet_mp" ) - self addplayerstat( "destroy_rcbomb_with_hatchet", 1 ); + self destroyscorestreak( weaponname ); + if ( weaponname == "hatchet_mp" ) + { + self addplayerstat( "destroy_rcbomb_with_hatchet", 1 ); + } } capturedcrate() { - if ( isdefined( self.lastrescuedby ) && isdefined( self.lastrescuedtime ) ) - { - if ( self.lastrescuedtime + 5000 > gettime() ) - self.lastrescuedby addplayerstat( "defend_teammate_who_captured_package", 1 ); - } + if ( isDefined( self.lastrescuedby ) && isDefined( self.lastrescuedtime ) ) + { + if ( ( self.lastrescuedtime + 5000 ) > getTime() ) + { + self.lastrescuedby addplayerstat( "defend_teammate_who_captured_package", 1 ); + } + } } destroyscorestreak( weaponname ) { - if ( isdefined( weaponname ) && weaponname == "qrdrone_turret_mp" ) - self addplayerstat( "destroy_score_streak_with_qrdrone", 1 ); + if ( isDefined( weaponname ) && weaponname == "qrdrone_turret_mp" ) + { + self addplayerstat( "destroy_score_streak_with_qrdrone", 1 ); + } } capturedobjective( capturetime ) { - if ( isdefined( self.smokegrenadetime ) && isdefined( self.smokegrenadeposition ) ) - { - if ( self.smokegrenadetime + 14000 > capturetime ) - { - distsq = distancesquared( self.smokegrenadeposition, self.origin ); - - if ( distsq < 57600 ) - { - self addplayerstat( "capture_objective_in_smoke", 1 ); - self addweaponstat( "willy_pete_mp", "CombatRecordStat", 1 ); - } - else - { - - } - } - } + if ( isDefined( self.smokegrenadetime ) && isDefined( self.smokegrenadeposition ) ) + { + if ( ( self.smokegrenadetime + 14000 ) > capturetime ) + { + distsq = distancesquared( self.smokegrenadeposition, self.origin ); + if ( distsq < 57600 ) + { + self addplayerstat( "capture_objective_in_smoke", 1 ); + self addweaponstat( "willy_pete_mp", "CombatRecordStat", 1 ); + return; + } + } + } } hackedordestroyedequipment() { - if ( self hasperk( "specialty_showenemyequipment" ) ) - self addplayerstat( "perk_hacker_destroy", 1 ); + if ( self hasperk( "specialty_showenemyequipment" ) ) + { + self addplayerstat( "perk_hacker_destroy", 1 ); + } } destroyedequipment( weaponname ) { - if ( isdefined( weaponname ) && weaponname == "emp_grenade_mp" ) - { - self addplayerstat( "destroy_equipment_with_emp_grenade", 1 ); - self addweaponstat( "emp_grenade_mp", "combatRecordStat", 1 ); - } - - self addplayerstat( "destroy_equipment", 1 ); - self hackedordestroyedequipment(); + if ( isDefined( weaponname ) && weaponname == "emp_grenade_mp" ) + { + self addplayerstat( "destroy_equipment_with_emp_grenade", 1 ); + self addweaponstat( "emp_grenade_mp", "combatRecordStat", 1 ); + } + self addplayerstat( "destroy_equipment", 1 ); + self hackedordestroyedequipment(); } destroyedtacticalinsert() { - if ( !isdefined( self.pers["tacticalInsertsDestroyed"] ) ) - self.pers["tacticalInsertsDestroyed"] = 0; - - self.pers["tacticalInsertsDestroyed"]++; - - if ( self.pers["tacticalInsertsDestroyed"] >= 5 ) - { - self.pers["tacticalInsertsDestroyed"] = 0; - self addplayerstat( "destroy_5_tactical_inserts", 1 ); - } + if ( !isDefined( self.pers[ "tacticalInsertsDestroyed" ] ) ) + { + self.pers[ "tacticalInsertsDestroyed" ] = 0; + } + self.pers[ "tacticalInsertsDestroyed" ]++; + if ( self.pers[ "tacticalInsertsDestroyed" ] >= 5 ) + { + self.pers[ "tacticalInsertsDestroyed" ] = 0; + self addplayerstat( "destroy_5_tactical_inserts", 1 ); + } } bladekill() { - if ( !isdefined( self.pers["bladeKills"] ) ) - self.pers["bladeKills"] = 0; - - self.pers["bladeKills"]++; - - if ( self.pers["bladeKills"] >= 15 ) - { - self.pers["bladeKills"] = 0; - self addplayerstat( "kill_15_with_blade", 1 ); - } + if ( !isDefined( self.pers[ "bladeKills" ] ) ) + { + self.pers[ "bladeKills" ] = 0; + } + self.pers[ "bladeKills" ]++; + if ( self.pers[ "bladeKills" ] >= 15 ) + { + self.pers[ "bladeKills" ] = 0; + self addplayerstat( "kill_15_with_blade", 1 ); + } } destroyedexplosive( weaponname ) { - self destroyedequipment( weaponname ); - self addplayerstat( "destroy_explosive", 1 ); + self destroyedequipment( weaponname ); + self addplayerstat( "destroy_explosive", 1 ); } assisted() { - self addplayerstat( "assist", 1 ); + self addplayerstat( "assist", 1 ); } earnedmicrowaveassistscore( score ) { - self addplayerstat( "assist_score_microwave_turret", score ); - self addplayerstat( "assist_score_killstreak", score ); + self addplayerstat( "assist_score_microwave_turret", score ); + self addplayerstat( "assist_score_killstreak", score ); } earnedcuavassistscore( score ) { - self addplayerstat( "assist_score_cuav", score ); - self addplayerstat( "assist_score_killstreak", score ); - self addweaponstat( "counteruav_mp", "assists", 1 ); + self addplayerstat( "assist_score_cuav", score ); + self addplayerstat( "assist_score_killstreak", score ); + self addweaponstat( "counteruav_mp", "assists", 1 ); } earneduavassistscore( score ) { - self addplayerstat( "assist_score_uav", score ); - self addplayerstat( "assist_score_killstreak", score ); - self addweaponstat( "radar_mp", "assists", 1 ); + self addplayerstat( "assist_score_uav", score ); + self addplayerstat( "assist_score_killstreak", score ); + self addweaponstat( "radar_mp", "assists", 1 ); } earnedsatelliteassistscore( score ) { - self addplayerstat( "assist_score_satellite", score ); - self addplayerstat( "assist_score_killstreak", score ); - self addweaponstat( "radardirection_mp", "assists", 1 ); + self addplayerstat( "assist_score_satellite", score ); + self addplayerstat( "assist_score_killstreak", score ); + self addweaponstat( "radardirection_mp", "assists", 1 ); } earnedempassistscore( score ) { - self addplayerstat( "assist_score_emp", score ); - self addplayerstat( "assist_score_killstreak", score ); - self addweaponstat( "emp_mp", "assists", 1 ); + self addplayerstat( "assist_score_emp", score ); + self addplayerstat( "assist_score_killstreak", score ); + self addweaponstat( "emp_mp", "assists", 1 ); } teamcompletedchallenge( team, challenge ) { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( players[i].team ) && players[i].team == team ) - players[i] addgametypestat( challenge, 1 ); - } + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( isDefined( players[ i ].team ) && players[ i ].team == team ) + { + players[ i ] addgametypestat( challenge, 1 ); + } + i++; + } } endedearly( winner ) { - if ( level.hostforcedend ) - return true; - - if ( !isdefined( winner ) ) - return true; - - if ( level.teambased ) - { - if ( winner == "tie" ) - return true; - } - - return false; + if ( level.hostforcedend ) + { + return 1; + } + if ( !isDefined( winner ) ) + { + return 1; + } + if ( level.teambased ) + { + if ( winner == "tie" ) + { + return 1; + } + } + return 0; } getlosersteamscores( winner ) { - teamscores = 0; - - foreach ( team in level.teams ) - { - if ( team == winner ) - continue; - - teamscores += game["teamScores"][team]; - } - - return teamscores; + teamscores = 0; + _a1474 = level.teams; + _k1474 = getFirstArrayKey( _a1474 ); + while ( isDefined( _k1474 ) ) + { + team = _a1474[ _k1474 ]; + if ( team == winner ) + { + } + else + { + teamscores += game[ "teamScores" ][ team ]; + } + _k1474 = getNextArrayKey( _a1474, _k1474 ); + } + return teamscores; } didloserfailchallenge( winner, challenge ) { - foreach ( team in level.teams ) - { - if ( team == winner ) - continue; - - if ( game["challenge"][team][challenge] ) - return false; - } - - return true; + _a1487 = level.teams; + _k1487 = getFirstArrayKey( _a1487 ); + while ( isDefined( _k1487 ) ) + { + team = _a1487[ _k1487 ]; + if ( team == winner ) + { + } + else + { + if ( game[ "challenge" ][ team ][ challenge ] ) + { + return 0; + } + } + _k1487 = getNextArrayKey( _a1487, _k1487 ); + } + return 1; } challengegameend( data ) { - player = data.player; - winner = data.winner; - - if ( isdefined( level.scoreeventgameendcallback ) ) - [[ level.scoreeventgameendcallback ]]( data ); - - if ( endedearly( winner ) ) - return; - - if ( level.teambased ) - { - winnerscore = game["teamScores"][winner]; - loserscore = getlosersteamscores( winner ); - } - - switch ( level.gametype ) - { - case "tdm": - if ( player.team == winner ) - { - if ( winnerscore >= loserscore + 20 ) - player addgametypestat( "CRUSH", 1 ); - } - - mostkillsleastdeaths = 1; - - for ( index = 0; index < level.placement["all"].size; index++ ) - { - if ( level.placement["all"][index].deaths < player.deaths ) - mostkillsleastdeaths = 0; - - if ( level.placement["all"][index].kills > player.kills ) - mostkillsleastdeaths = 0; - } - - if ( mostkillsleastdeaths && player.kills > 0 && level.placement["all"].size > 3 ) - player addgametypestat( "most_kills_least_deaths", 1 ); - - break; - case "dm": - if ( player == winner ) - { - if ( level.placement["all"].size >= 2 ) - { - secondplace = level.placement["all"][1]; - - if ( player.kills >= secondplace.kills + 7 ) - player addgametypestat( "CRUSH", 1 ); - } - } - - break; - case "ctf": - if ( player.team == winner ) - { - if ( loserscore == 0 ) - player addgametypestat( "SHUT_OUT", 1 ); - } - - break; - case "dom": - if ( player.team == winner ) - { - if ( winnerscore >= loserscore + 70 ) - player addgametypestat( "CRUSH", 1 ); - } - - break; - case "hq": - if ( player.team == winner && winnerscore > 0 ) - { - if ( winnerscore >= loserscore + 70 ) - player addgametypestat( "CRUSH", 1 ); - } - - break; - case "koth": - if ( player.team == winner && winnerscore > 0 ) - { - if ( winnerscore >= loserscore + 70 ) - player addgametypestat( "CRUSH", 1 ); - } - - if ( player.team == winner && winnerscore > 0 ) - { - if ( winnerscore >= loserscore + 110 ) - player addgametypestat( "ANNIHILATION", 1 ); - } - - break; - case "dem": - if ( player.team == game["defenders"] && player.team == winner ) - { - if ( loserscore == 0 ) - player addgametypestat( "SHUT_OUT", 1 ); - } - - break; - case "sd": - if ( player.team == winner ) - { - if ( loserscore <= 1 ) - player addgametypestat( "CRUSH", 1 ); - } - default: - break; - } + player = data.player; + winner = data.winner; + if ( isDefined( level.scoreeventgameendcallback ) ) + { + [[ level.scoreeventgameendcallback ]]( data ); + } + if ( endedearly( winner ) ) + { + return; + } + if ( level.teambased ) + { + winnerscore = game[ "teamScores" ][ winner ]; + loserscore = getlosersteamscores( winner ); + } + switch( level.gametype ) + { + case "tdm": + if ( player.team == winner ) + { + if ( winnerscore >= ( loserscore + 20 ) ) + { + player addgametypestat( "CRUSH", 1 ); + } + } + mostkillsleastdeaths = 1; + index = 0; + while ( index < level.placement[ "all" ].size ) + { + if ( level.placement[ "all" ][ index ].deaths < player.deaths ) + { + mostkillsleastdeaths = 0; + } + if ( level.placement[ "all" ][ index ].kills > player.kills ) + { + mostkillsleastdeaths = 0; + } + index++; + } + if ( mostkillsleastdeaths && player.kills > 0 && level.placement[ "all" ].size > 3 ) + { + player addgametypestat( "most_kills_least_deaths", 1 ); + } + break; + case "dm": + if ( player == winner ) + { + if ( level.placement[ "all" ].size >= 2 ) + { + secondplace = level.placement[ "all" ][ 1 ]; + if ( player.kills >= ( secondplace.kills + 7 ) ) + { + player addgametypestat( "CRUSH", 1 ); + } + } + } + break; + case "ctf": + if ( player.team == winner ) + { + if ( loserscore == 0 ) + { + player addgametypestat( "SHUT_OUT", 1 ); + } + } + break; + case "dom": + if ( player.team == winner ) + { + if ( winnerscore >= ( loserscore + 70 ) ) + { + player addgametypestat( "CRUSH", 1 ); + } + } + break; + case "hq": + if ( player.team == winner && winnerscore > 0 ) + { + if ( winnerscore >= ( loserscore + 70 ) ) + { + player addgametypestat( "CRUSH", 1 ); + } + } + break; + case "koth": + if ( player.team == winner && winnerscore > 0 ) + { + if ( winnerscore >= ( loserscore + 70 ) ) + { + player addgametypestat( "CRUSH", 1 ); + } + } + if ( player.team == winner && winnerscore > 0 ) + { + if ( winnerscore >= ( loserscore + 110 ) ) + { + player addgametypestat( "ANNIHILATION", 1 ); + } + } + break; + case "dem": + if ( player.team == game[ "defenders" ] && player.team == winner ) + { + if ( loserscore == 0 ) + { + player addgametypestat( "SHUT_OUT", 1 ); + } + } + break; + case "sd": + if ( player.team == winner ) + { + if ( loserscore <= 1 ) + { + player addgametypestat( "CRUSH", 1 ); + } + } + default: + break; + } + } } multikill( killcount, weapon ) { - if ( killcount >= 3 && isdefined( self.lastkillwheninjured ) ) - { - if ( self.lastkillwheninjured + 5000 > gettime() ) - self addplayerstat( "multikill_3_near_death", 1 ); - } + if ( killcount >= 3 && isDefined( self.lastkillwheninjured ) ) + { + if ( ( self.lastkillwheninjured + 5000 ) > getTime() ) + { + self addplayerstat( "multikill_3_near_death", 1 ); + } + } } domattackermultikill( killcount ) { - self addgametypestat( "kill_2_enemies_capturing_your_objective", 1 ); + self addgametypestat( "kill_2_enemies_capturing_your_objective", 1 ); } totaldomination( team ) { - teamcompletedchallenge( team, "control_3_points_3_minutes" ); + teamcompletedchallenge( team, "control_3_points_3_minutes" ); } holdflagentirematch( team, label ) { - switch ( label ) - { - case "_a": - event = "hold_a_entire_match"; - break; - case "_b": - event = "hold_b_entire_match"; - break; - case "_c": - event = "hold_c_entire_match"; - break; - default: - return; - } - - teamcompletedchallenge( team, event ); + switch( label ) + { + case "_a": + event = "hold_a_entire_match"; + break; + case "_b": + event = "hold_b_entire_match"; + break; + case "_c": + event = "hold_c_entire_match"; + break; + default: + return; + } + teamcompletedchallenge( team, event ); } capturedbfirstminute() { - self addgametypestat( "capture_b_first_minute", 1 ); + self addgametypestat( "capture_b_first_minute", 1 ); } controlzoneentirely( team ) { - teamcompletedchallenge( team, "control_zone_entirely" ); + teamcompletedchallenge( team, "control_zone_entirely" ); } multi_lmg_smg_kill() { - self addplayerstat( "multikill_3_lmg_or_smg_hip_fire", 1 ); + self addplayerstat( "multikill_3_lmg_or_smg_hip_fire", 1 ); } killedzoneattacker( weapon ) { - if ( weapon == "planemortar_mp" || weapon == "remote_missile_missile_mp" || weapon == "remote_missile_bomblet_mp" ) - self thread updatezonemultikills(); + if ( weapon != "planemortar_mp" || weapon == "remote_missile_missile_mp" && weapon == "remote_missile_bomblet_mp" ) + { + self thread updatezonemultikills(); + } } killeddog() { - origin = self.origin; - - if ( level.teambased ) - { - teammates = get_team_alive_players_s( self.team ); - - foreach ( player in teammates.a ) - { - if ( player == self ) - continue; - - distsq = distancesquared( origin, player.origin ); - - if ( distsq < 57600 ) - { - self addplayerstat( "killed_dog_close_to_teammate", 1 ); - break; - } - } - } + origin = self.origin; + while ( level.teambased ) + { + teammates = get_team_alive_players_s( self.team ); + _a1714 = teammates.a; + _k1714 = getFirstArrayKey( _a1714 ); + while ( isDefined( _k1714 ) ) + { + player = _a1714[ _k1714 ]; + if ( player == self ) + { + } + else + { + distsq = distancesquared( origin, player.origin ); + if ( distsq < 57600 ) + { + self addplayerstat( "killed_dog_close_to_teammate", 1 ); + return; + } + } + else + { + _k1714 = getNextArrayKey( _a1714, _k1714 ); + } + } + } } updatezonemultikills() { - self endon( "disconnect" ); - level endon( "game_ended" ); - self notify( "updateRecentZoneKills" ); - self endon( "updateRecentZoneKills" ); - - if ( !isdefined( self.recentzonekillcount ) ) - self.recentzonekillcount = 0; - - self.recentzonekillcount++; - wait 4.0; - - if ( self.recentzonekillcount > 1 ) - self addplayerstat( "multikill_2_zone_attackers", 1 ); - - self.recentzonekillcount = 0; + self endon( "disconnect" ); + level endon( "game_ended" ); + self notify( "updateRecentZoneKills" ); + self endon( "updateRecentZoneKills" ); + if ( !isDefined( self.recentzonekillcount ) ) + { + self.recentzonekillcount = 0; + } + self.recentzonekillcount++; + wait 4; + if ( self.recentzonekillcount > 1 ) + { + self addplayerstat( "multikill_2_zone_attackers", 1 ); + } + self.recentzonekillcount = 0; } multi_rcbomb_kill() { - self addplayerstat( "muiltikill_2_with_rcbomb", 1 ); + self addplayerstat( "muiltikill_2_with_rcbomb", 1 ); } multi_remotemissile_kill() { - self addplayerstat( "multikill_3_remote_missile", 1 ); + self addplayerstat( "multikill_3_remote_missile", 1 ); } multi_mgl_kill() { - self addplayerstat( "multikill_3_with_mgl", 1 ); + self addplayerstat( "multikill_3_with_mgl", 1 ); } immediatecapture() { - self addgametypestat( "immediate_capture", 1 ); + self addgametypestat( "immediate_capture", 1 ); } killedlastcontester() { - self addgametypestat( "contest_then_capture", 1 ); + self addgametypestat( "contest_then_capture", 1 ); } bothbombsdetonatewithintime() { - self addgametypestat( "both_bombs_detonate_10_seconds", 1 ); + self addgametypestat( "both_bombs_detonate_10_seconds", 1 ); } fullclipnomisses( weaponclass, weapon ) { - } destroyedturret( weaponname ) { - self destroyscorestreak( weaponname ); - self addplayerstat( "destroy_turret", 1 ); + self destroyscorestreak( weaponname ); + self addplayerstat( "destroy_turret", 1 ); } calledincarepackage() { - self.pers["carepackagesCalled"]++; - - if ( self.pers["carepackagesCalled"] >= 3 ) - { - self addplayerstat( "call_in_3_care_packages", 1 ); - self.pers["carepackagesCalled"] = 0; - } + self.pers[ "carepackagesCalled" ]++; + if ( self.pers[ "carepackagesCalled" ] >= 3 ) + { + self addplayerstat( "call_in_3_care_packages", 1 ); + self.pers[ "carepackagesCalled" ] = 0; + } } destroyedhelicopter( attacker, weapon, damagetype, playercontrolled ) { - attacker destroyscorestreak( weapon ); - - if ( damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET" ) - attacker addplayerstat( "destroyed_helicopter_with_bullet", 1 ); + attacker destroyscorestreak( weapon ); + if ( damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET" ) + { + attacker addplayerstat( "destroyed_helicopter_with_bullet", 1 ); + } } destroyedqrdrone( damagetype, weapon ) { - self destroyscorestreak( weapon ); - self addplayerstat( "destroy_qrdrone", 1 ); - - if ( damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET" ) - self addplayerstat( "destroyed_qrdrone_with_bullet", 1 ); - - self destroyedplayercontrolledaircraft(); + self destroyscorestreak( weapon ); + self addplayerstat( "destroy_qrdrone", 1 ); + if ( damagetype == "MOD_RIFLE_BULLET" || damagetype == "MOD_PISTOL_BULLET" ) + { + self addplayerstat( "destroyed_qrdrone_with_bullet", 1 ); + } + self destroyedplayercontrolledaircraft(); } destroyedplayercontrolledaircraft() { - if ( self hasperk( "specialty_noname" ) ) - self addplayerstat( "destroy_helicopter", 1 ); + if ( self hasperk( "specialty_noname" ) ) + { + self addplayerstat( "destroy_helicopter", 1 ); + } } destroyedaircraft( attacker, weapon ) { - attacker destroyscorestreak( weapon ); - - if ( isdefined( weapon ) ) - { - if ( weapon == "emp_mp" || weapon == "killstreak_emp_mp" ) - attacker addplayerstat( "destroy_aircraft_with_emp", 1 ); - else if ( weapon == "missile_drone_projectile_mp" || weapon == "missile_drone_mp" ) - attacker addplayerstat( "destroy_aircraft_with_missile_drone", 1 ); - } - - if ( attacker hasperk( "specialty_nottargetedbyairsupport" ) ) - attacker addplayerstat( "perk_nottargetedbyairsupport_destroy_aircraft", 1 ); - - attacker addplayerstat( "destroy_aircraft", 1 ); + attacker destroyscorestreak( weapon ); + if ( isDefined( weapon ) ) + { + if ( weapon == "emp_mp" || weapon == "killstreak_emp_mp" ) + { + attacker addplayerstat( "destroy_aircraft_with_emp", 1 ); + } + else + { + if ( weapon == "missile_drone_projectile_mp" || weapon == "missile_drone_mp" ) + { + attacker addplayerstat( "destroy_aircraft_with_missile_drone", 1 ); + } + } + } + if ( attacker hasperk( "specialty_nottargetedbyairsupport" ) ) + { + attacker addplayerstat( "perk_nottargetedbyairsupport_destroy_aircraft", 1 ); + } + attacker addplayerstat( "destroy_aircraft", 1 ); } killstreakten() { - primary = self getloadoutitem( self.class_num, "primary" ); - - if ( primary != 0 ) - return; - - secondary = self getloadoutitem( self.class_num, "secondary" ); - - if ( secondary != 0 ) - return; - - primarygrenade = self getloadoutitem( self.class_num, "primarygrenade" ); - - if ( primarygrenade != 0 ) - return; - - specialgrenade = self getloadoutitem( self.class_num, "specialgrenade" ); - - if ( specialgrenade != 0 ) - return; - - for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) - { - perk = self getloadoutitem( self.class_num, "specialty" + ( numspecialties + 1 ) ); - - if ( perk != 0 ) - return; - } - - self addplayerstat( "killstreak_10_no_weapons_perks", 1 ); + primary = self getloadoutitem( self.class_num, "primary" ); + if ( primary != 0 ) + { + return; + } + secondary = self getloadoutitem( self.class_num, "secondary" ); + if ( secondary != 0 ) + { + return; + } + primarygrenade = self getloadoutitem( self.class_num, "primarygrenade" ); + if ( primarygrenade != 0 ) + { + return; + } + specialgrenade = self getloadoutitem( self.class_num, "specialgrenade" ); + if ( specialgrenade != 0 ) + { + return; + } + numspecialties = 0; + while ( numspecialties < level.maxspecialties ) + { + perk = self getloadoutitem( self.class_num, "specialty" + ( numspecialties + 1 ) ); + if ( perk != 0 ) + { + return; + } + numspecialties++; + } + self addplayerstat( "killstreak_10_no_weapons_perks", 1 ); } scavengedgrenade() { - self endon( "disconnect" ); - self endon( "death" ); - self notify( "scavengedGrenade" ); - self endon( "scavengedGrenade" ); - - for (;;) - { - self waittill( "lethalGrenadeKill" ); - - self addplayerstat( "kill_with_resupplied_lethal_grenade", 1 ); - } + self endon( "disconnect" ); + self endon( "death" ); + self notify( "scavengedGrenade" ); + self endon( "scavengedGrenade" ); + for ( ;; ) + { + self waittill( "lethalGrenadeKill" ); + self addplayerstat( "kill_with_resupplied_lethal_grenade", 1 ); + } } stunnedtankwithempgrenade( attacker ) { - attacker addplayerstat( "stun_aitank_wIth_emp_grenade", 1 ); + attacker addplayerstat( "stun_aitank_wIth_emp_grenade", 1 ); } playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, shitloc, attackerstance ) { /# - print( level.gametype ); + print( level.gametype ); #/ - self.anglesondeath = self getplayerangles(); - - if ( isdefined( attacker ) ) - attacker.anglesonkill = attacker getplayerangles(); - - if ( !isdefined( sweapon ) ) - sweapon = "none"; - - self endon( "disconnect" ); - data = spawnstruct(); - data.victim = self; - data.victimstance = self getstance(); - data.einflictor = einflictor; - data.attacker = attacker; - data.attackerstance = attackerstance; - data.idamage = idamage; - data.smeansofdeath = smeansofdeath; - data.sweapon = sweapon; - data.shitloc = shitloc; - data.time = gettime(); - - if ( isdefined( einflictor ) && isdefined( einflictor.lastweaponbeforetoss ) ) - data.lastweaponbeforetoss = einflictor.lastweaponbeforetoss; - - if ( isdefined( einflictor ) && isdefined( einflictor.ownerweaponatlaunch ) ) - data.ownerweaponatlaunch = einflictor.ownerweaponatlaunch; - - waslockingon = 0; - - if ( isdefined( einflictor.locking_on ) ) - waslockingon |= einflictor.locking_on; - - if ( isdefined( einflictor.locked_on ) ) - waslockingon |= einflictor.locked_on; - - waslockingon &= 1 << data.victim.entnum; - - if ( waslockingon != 0 ) - data.waslockingon = 1; - else - data.waslockingon = 0; - - data.washacked = einflictor maps\mp\_utility::ishacked(); - data.wasplanting = data.victim.isplanting; - - if ( !isdefined( data.wasplanting ) ) - data.wasplanting = 0; - - data.wasdefusing = data.victim.isdefusing; - - if ( !isdefined( data.wasdefusing ) ) - data.wasdefusing = 0; - - data.victimweapon = data.victim.currentweapon; - data.victimonground = data.victim isonground(); - - if ( isplayer( attacker ) ) - { - data.attackeronground = data.attacker isonground(); - - if ( !isdefined( data.attackerstance ) ) - data.attackerstance = data.attacker getstance(); - } - else - { - data.attackeronground = 0; - data.attackerstance = "stand"; - } - - waitandprocessplayerkilledcallback( data ); - data.attacker notify( "playerKilledChallengesProcessed" ); + self.anglesondeath = self getplayerangles(); + if ( isDefined( attacker ) ) + { + attacker.anglesonkill = attacker getplayerangles(); + } + if ( !isDefined( sweapon ) ) + { + sweapon = "none"; + } + self endon( "disconnect" ); + data = spawnstruct(); + data.victim = self; + data.victimstance = self getstance(); + data.einflictor = einflictor; + data.attacker = attacker; + data.attackerstance = attackerstance; + data.idamage = idamage; + data.smeansofdeath = smeansofdeath; + data.sweapon = sweapon; + data.shitloc = shitloc; + data.time = getTime(); + if ( isDefined( einflictor ) && isDefined( einflictor.lastweaponbeforetoss ) ) + { + data.lastweaponbeforetoss = einflictor.lastweaponbeforetoss; + } + if ( isDefined( einflictor ) && isDefined( einflictor.ownerweaponatlaunch ) ) + { + data.ownerweaponatlaunch = einflictor.ownerweaponatlaunch; + } + waslockingon = 0; + if ( isDefined( einflictor.locking_on ) ) + { + waslockingon |= einflictor.locking_on; + } + if ( isDefined( einflictor.locked_on ) ) + { + waslockingon |= einflictor.locked_on; + } + waslockingon &= 1 << data.victim.entnum; + if ( waslockingon != 0 ) + { + data.waslockingon = 1; + } + else + { + data.waslockingon = 0; + } + data.washacked = einflictor maps/mp/_utility::ishacked(); + data.wasplanting = data.victim.isplanting; + if ( !isDefined( data.wasplanting ) ) + { + data.wasplanting = 0; + } + data.wasdefusing = data.victim.isdefusing; + if ( !isDefined( data.wasdefusing ) ) + { + data.wasdefusing = 0; + } + data.victimweapon = data.victim.currentweapon; + data.victimonground = data.victim isonground(); + if ( isplayer( attacker ) ) + { + data.attackeronground = data.attacker isonground(); + if ( !isDefined( data.attackerstance ) ) + { + data.attackerstance = data.attacker getstance(); + } + } + else + { + data.attackeronground = 0; + data.attackerstance = "stand"; + } + waitandprocessplayerkilledcallback( data ); + data.attacker notify( "playerKilledChallengesProcessed" ); } waittillslowprocessallowed() { - while ( level.lastslowprocessframe == gettime() ) - wait 0.05; - - level.lastslowprocessframe = gettime(); + while ( level.lastslowprocessframe == getTime() ) + { + wait 0,05; + } + level.lastslowprocessframe = getTime(); } doscoreeventcallback( callback, data ) { - if ( !isdefined( level.scoreeventcallbacks ) ) - return; - - if ( !isdefined( level.scoreeventcallbacks[callback] ) ) - return; - - if ( isdefined( data ) ) - { - for ( i = 0; i < level.scoreeventcallbacks[callback].size; i++ ) - thread [[ level.scoreeventcallbacks[callback][i] ]]( data ); - } - else - { - for ( i = 0; i < level.scoreeventcallbacks[callback].size; i++ ) - thread [[ level.scoreeventcallbacks[callback][i] ]](); - } + if ( !isDefined( level.scoreeventcallbacks ) ) + { + return; + } + if ( !isDefined( level.scoreeventcallbacks[ callback ] ) ) + { + return; + } + if ( isDefined( data ) ) + { + i = 0; + while ( i < level.scoreeventcallbacks[ callback ].size ) + { + thread [[ level.scoreeventcallbacks[ callback ][ i ] ]]( data ); + i++; + } + } + else i = 0; + while ( i < level.scoreeventcallbacks[ callback ].size ) + { + thread [[ level.scoreeventcallbacks[ callback ][ i ] ]](); + i++; + } } waitandprocessplayerkilledcallback( data ) { - if ( isdefined( data.attacker ) ) - data.attacker endon( "disconnect" ); - - wait 0.05; - waittillslowprocessallowed(); - level thread dochallengecallback( "playerKilled", data ); - level thread doscoreeventcallback( "playerKilled", data ); + if ( isDefined( data.attacker ) ) + { + data.attacker endon( "disconnect" ); + } + wait 0,05; + waittillslowprocessallowed(); + level thread dochallengecallback( "playerKilled", data ); + level thread doscoreeventcallback( "playerKilled", data ); } weaponisknife( weapon ) { - if ( weapon == "knife_held_mp" || weapon == "knife_mp" || weapon == "knife_ballistic_mp" ) - return true; - - return false; + if ( weapon != "knife_held_mp" || weapon == "knife_mp" && weapon == "knife_ballistic_mp" ) + { + return 1; + } + return 0; } eventreceived( eventname ) { - self endon( "disconnect" ); - waittillslowprocessallowed(); - - switch ( level.gametype ) - { - case "tdm": - if ( eventname == "killstreak_10" ) - self addgametypestat( "killstreak_10", 1 ); - else if ( eventname == "killstreak_15" ) - self addgametypestat( "killstreak_15", 1 ); - else if ( eventname == "killstreak_20" ) - self addgametypestat( "killstreak_20", 1 ); - else if ( eventname == "multikill_3" ) - self addgametypestat( "multikill_3", 1 ); - else if ( eventname == "kill_enemy_who_killed_teammate" ) - self addgametypestat( "kill_enemy_who_killed_teammate", 1 ); - else if ( eventname == "kill_enemy_injuring_teammate" ) - self addgametypestat( "kill_enemy_injuring_teammate", 1 ); - - break; - case "dm": - if ( eventname == "killstreak_10" ) - self addgametypestat( "killstreak_10", 1 ); - else if ( eventname == "killstreak_15" ) - self addgametypestat( "killstreak_15", 1 ); - else if ( eventname == "killstreak_20" ) - self addgametypestat( "killstreak_20", 1 ); - else if ( eventname == "killstreak_30" ) - self addgametypestat( "killstreak_30", 1 ); - - break; - case "sd": - if ( eventname == "defused_bomb_last_man_alive" ) - self addgametypestat( "defused_bomb_last_man_alive", 1 ); - else if ( eventname == "elimination_and_last_player_alive" ) - self addgametypestat( "elimination_and_last_player_alive", 1 ); - else if ( eventname == "killed_bomb_planter" ) - self addgametypestat( "killed_bomb_planter", 1 ); - else if ( eventname == "killed_bomb_defuser" ) - self addgametypestat( "killed_bomb_defuser", 1 ); - - break; - case "ctf": - if ( eventname == "kill_flag_carrier" ) - self addgametypestat( "kill_flag_carrier", 1 ); - else if ( eventname == "defend_flag_carrier" ) - self addgametypestat( "defend_flag_carrier", 1 ); - - break; - case "dem": - if ( eventname == "killed_bomb_planter" ) - self addgametypestat( "killed_bomb_planter", 1 ); - else if ( eventname == "killed_bomb_defuser" ) - self addgametypestat( "killed_bomb_defuser", 1 ); - - break; - default: - break; - } + self endon( "disconnect" ); + waittillslowprocessallowed(); + switch( level.gametype ) + { + case "tdm": + if ( eventname == "killstreak_10" ) + { + self addgametypestat( "killstreak_10", 1 ); + } + else if ( eventname == "killstreak_15" ) + { + self addgametypestat( "killstreak_15", 1 ); + } + else if ( eventname == "killstreak_20" ) + { + self addgametypestat( "killstreak_20", 1 ); + } + else if ( eventname == "multikill_3" ) + { + self addgametypestat( "multikill_3", 1 ); + } + else if ( eventname == "kill_enemy_who_killed_teammate" ) + { + self addgametypestat( "kill_enemy_who_killed_teammate", 1 ); + } + else + { + if ( eventname == "kill_enemy_injuring_teammate" ) + { + self addgametypestat( "kill_enemy_injuring_teammate", 1 ); + } + } + break; + case "dm": + if ( eventname == "killstreak_10" ) + { + self addgametypestat( "killstreak_10", 1 ); + } + else if ( eventname == "killstreak_15" ) + { + self addgametypestat( "killstreak_15", 1 ); + } + else if ( eventname == "killstreak_20" ) + { + self addgametypestat( "killstreak_20", 1 ); + } + else + { + if ( eventname == "killstreak_30" ) + { + self addgametypestat( "killstreak_30", 1 ); + } + } + break; + case "sd": + if ( eventname == "defused_bomb_last_man_alive" ) + { + self addgametypestat( "defused_bomb_last_man_alive", 1 ); + } + else if ( eventname == "elimination_and_last_player_alive" ) + { + self addgametypestat( "elimination_and_last_player_alive", 1 ); + } + else if ( eventname == "killed_bomb_planter" ) + { + self addgametypestat( "killed_bomb_planter", 1 ); + } + else + { + if ( eventname == "killed_bomb_defuser" ) + { + self addgametypestat( "killed_bomb_defuser", 1 ); + } + } + break; + case "ctf": + if ( eventname == "kill_flag_carrier" ) + { + self addgametypestat( "kill_flag_carrier", 1 ); + } + else + { + if ( eventname == "defend_flag_carrier" ) + { + self addgametypestat( "defend_flag_carrier", 1 ); + } + } + break; + case "dem": + if ( eventname == "killed_bomb_planter" ) + { + self addgametypestat( "killed_bomb_planter", 1 ); + } + else + { + if ( eventname == "killed_bomb_defuser" ) + { + self addgametypestat( "killed_bomb_defuser", 1 ); + } + } + break; + default: + } + } } monitor_player_sprint() { - self endon( "disconnect" ); - self endon( "death" ); - - for ( self.lastsprinttime = undefined; 1; self.lastsprinttime = gettime() ) - { - self waittill( "sprint_begin" ); - - self waittill( "sprint_end" ); - } + self endon( "disconnect" ); + self endon( "death" ); + self.lastsprinttime = undefined; + while ( 1 ) + { + self waittill( "sprint_begin" ); + self waittill( "sprint_end" ); + self.lastsprinttime = getTime(); + } } diff --git a/Zombie Core/patch_zm/maps/mp/_compass.gsc b/Zombie Core/patch_zm/maps/mp/_compass.gsc index d2e8842..4b074d8 100644 --- a/Zombie Core/patch_zm/maps/mp/_compass.gsc +++ b/Zombie Core/patch_zm/maps/mp/_compass.gsc @@ -1,76 +1,67 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool setupminimap( material ) { - requiredmapaspectratio = getdvarfloat( "scr_RequiredMapAspectratio" ); - corners = getentarray( "minimap_corner", "targetname" ); - - if ( corners.size != 2 ) - { + requiredmapaspectratio = getDvarFloat( "scr_RequiredMapAspectratio" ); + corners = getentarray( "minimap_corner", "targetname" ); + if ( corners.size != 2 ) + { /# - println( "^1Error: There are not exactly two \"minimap_corner\" entities in the map. Could not set up minimap." ); + println( "^1Error: There are not exactly two "minimap_corner" entities in the map. Could not set up minimap." ); #/ - return; - } - - corner0 = ( corners[0].origin[0], corners[0].origin[1], 0 ); - corner1 = ( corners[1].origin[0], corners[1].origin[1], 0 ); - cornerdiff = corner1 - corner0; - north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); - west = ( 0 - north[1], north[0], 0 ); - - if ( vectordot( cornerdiff, west ) > 0 ) - { - if ( vectordot( cornerdiff, north ) > 0 ) - { - northwest = corner1; - southeast = corner0; - } - else - { - side = vecscale( north, vectordot( cornerdiff, north ) ); - northwest = corner1 - side; - southeast = corner0 + side; - } - } - else if ( vectordot( cornerdiff, north ) > 0 ) - { - side = vecscale( north, vectordot( cornerdiff, north ) ); - northwest = corner0 + side; - southeast = corner1 - side; - } - else - { - northwest = corner0; - southeast = corner1; - } - - if ( requiredmapaspectratio > 0 ) - { - northportion = vectordot( northwest - southeast, north ); - westportion = vectordot( northwest - southeast, west ); - mapaspectratio = westportion / northportion; - - if ( mapaspectratio < requiredmapaspectratio ) - { - incr = requiredmapaspectratio / mapaspectratio; - addvec = vecscale( west, westportion * ( incr - 1 ) * 0.5 ); - } - else - { - incr = mapaspectratio / requiredmapaspectratio; - addvec = vecscale( north, northportion * ( incr - 1 ) * 0.5 ); - } - - northwest += addvec; - southeast -= addvec; - } - - setminimap( material, northwest[0], northwest[1], southeast[0], southeast[1] ); + return; + } + corner0 = ( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], 0 ); + corner1 = ( corners[ 1 ].origin[ 0 ], corners[ 1 ].origin[ 1 ], 0 ); + cornerdiff = corner1 - corner0; + north = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); + west = ( 0 - north[ 1 ], north[ 0 ], 0 ); + if ( vectordot( cornerdiff, west ) > 0 ) + { + if ( vectordot( cornerdiff, north ) > 0 ) + { + northwest = corner1; + southeast = corner0; + } + else + { + side = vecscale( north, vectordot( cornerdiff, north ) ); + northwest = corner1 - side; + southeast = corner0 + side; + } + } + else if ( vectordot( cornerdiff, north ) > 0 ) + { + side = vecscale( north, vectordot( cornerdiff, north ) ); + northwest = corner0 + side; + southeast = corner1 - side; + } + else + { + northwest = corner0; + southeast = corner1; + } + if ( requiredmapaspectratio > 0 ) + { + northportion = vectordot( northwest - southeast, north ); + westportion = vectordot( northwest - southeast, west ); + mapaspectratio = westportion / northportion; + if ( mapaspectratio < requiredmapaspectratio ) + { + incr = requiredmapaspectratio / mapaspectratio; + addvec = vecscale( west, westportion * ( incr - 1 ) * 0,5 ); + } + else + { + incr = mapaspectratio / requiredmapaspectratio; + addvec = vecscale( north, northportion * ( incr - 1 ) * 0,5 ); + } + northwest += addvec; + southeast -= addvec; + } + setminimap( material, northwest[ 0 ], northwest[ 1 ], southeast[ 0 ], southeast[ 1 ] ); } vecscale( vec, scalar ) { - return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar ); + return ( vec[ 0 ] * scalar, vec[ 1 ] * scalar, vec[ 2 ] * scalar ); } diff --git a/Zombie Core/patch_zm/maps/mp/_createfx.gsc b/Zombie Core/patch_zm/maps/mp/_createfx.gsc index 4af95df..8d142f8 100644 --- a/Zombie Core/patch_zm/maps/mp/_createfx.gsc +++ b/Zombie Core/patch_zm/maps/mp/_createfx.gsc @@ -1,2937 +1,3273 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\_createfxmenu; -#include maps\mp\_createfxundo; -#include maps\mp\_fx; -#include maps\mp\_script_gen; +#include maps/mp/_script_gen; +#include maps/mp/_fx; +#include maps/mp/_createfxundo; +#include maps/mp/_createfxmenu; +#include maps/mp/_utility; +#include common_scripts/utility; createfx() { /# - println( "^2Running CreateFX 2.0" ); + println( "^2Running CreateFX 2.0" ); #/ - if ( ismp() ) - { - init_mp_paths(); - level.timelimitoverride = 1; - } - else - init_sp_paths(); - - precachemodel( "fx_axis_createfx" ); - precacheshader( "black" ); - - if ( getdvar( "createfx_scaleid" ) == "" ) - setdvar( "createfx_scaleid", "0.5" ); - - if ( getdvar( "createfx_print_frames" ) == "" ) - setdvar( "createfx_print_frames", "3" ); - - if ( getdvar( "createfx_drawaxis" ) == "" ) - setdvar( "createfx_drawaxis", "1" ); - - if ( getdvar( "createfx_drawaxis_range" ) == "" ) - setdvar( "createfx_drawaxis_range", "2000" ); - - if ( getdvar( "createfx_autosave_time" ) == "" ) - setdvar( "createfx_autosave_time", "300" ); - - if ( getdvar( "createfx_oneshot_min_delay" ) == "" ) - setdvar( "createfx_oneshot_min_delay", "-100" ); - - if ( getdvar( "createfx_oneshot_max_delay" ) == "" ) - setdvar( "createfx_oneshot_max_delay", "-15" ); - - flag_init( "createfx_saving" ); - - if ( !isdefined( level.createfx ) ) - level.createfx = []; - - if ( !isdefined( level.cfx_uniqueid ) ) - level.cfx_uniqueid = 0; - - level.cfx_last_action = "none"; - - if ( !ismp() ) - level thread [[ level.cfx_func_run_gump_func ]](); - - if ( isdefined( level.createfx_callback_thread ) ) - level thread [[ level.createfx_callback_thread ]](); - - if ( ismp() ) - { - level.callbackplayerdisconnect = ::empty; - level.callbackplayerdamage = ::damage_void; - level.callbackplayerkilled = ::empty; - level.callbackplayerconnect = ::callback_playerconnect; - - while ( !isdefined( level.player ) ) - wait 0.05; - - thread createfxdelay(); - } - - level.is_camera_on = 0; - thread createfxlogic(); - - level waittill( "eternity" ); + if ( ismp() ) + { + init_mp_paths(); + level.timelimitoverride = 1; + } + else + { + init_sp_paths(); + } + precachemodel( "fx_axis_createfx" ); + precacheshader( "black" ); + if ( getDvar( "createfx_scaleid" ) == "" ) + { + setdvar( "createfx_scaleid", "0.5" ); + } + if ( getDvar( "createfx_print_frames" ) == "" ) + { + setdvar( "createfx_print_frames", "3" ); + } + if ( getDvar( "createfx_drawaxis" ) == "" ) + { + setdvar( "createfx_drawaxis", "1" ); + } + if ( getDvar( "createfx_drawaxis_range" ) == "" ) + { + setdvar( "createfx_drawaxis_range", "2000" ); + } + if ( getDvar( "createfx_autosave_time" ) == "" ) + { + setdvar( "createfx_autosave_time", "300" ); + } + if ( getDvar( "createfx_oneshot_min_delay" ) == "" ) + { + setdvar( "createfx_oneshot_min_delay", "-100" ); + } + if ( getDvar( "createfx_oneshot_max_delay" ) == "" ) + { + setdvar( "createfx_oneshot_max_delay", "-15" ); + } + flag_init( "createfx_saving" ); + if ( !isDefined( level.createfx ) ) + { + level.createfx = []; + } + if ( !isDefined( level.cfx_uniqueid ) ) + { + level.cfx_uniqueid = 0; + } + level.cfx_last_action = "none"; + if ( !ismp() ) + { + level thread [[ level.cfx_func_run_gump_func ]](); + } + if ( isDefined( level.createfx_callback_thread ) ) + { + level thread [[ level.createfx_callback_thread ]](); + } + if ( ismp() ) + { + level.callbackplayerdisconnect = ::empty; + level.callbackplayerdamage = ::damage_void; + level.callbackplayerkilled = ::empty; + level.callbackplayerconnect = ::callback_playerconnect; + while ( !isDefined( level.player ) ) + { + wait 0,05; + } + thread createfxdelay(); + } + level.is_camera_on = 0; + thread createfxlogic(); + level waittill( "eternity" ); } fx_init() { - if ( ismp() ) - init_client_mp_variables(); - else - init_client_sp_variables(); - - level.exploderfunction = level.cfx_exploder_before; - waittillframeend; - waittillframeend; - level.exploderfunction = level.cfx_exploder_after; - level.non_fx_ents = 0; - - if ( level.createfx_enabled ) - { - triggers = getentarray( "trigger_multiple", "classname" ); - - for ( i = 0; i < triggers.size; i++ ) - triggers[i] delete(); - - triggers = getentarray( "trigger_once", "classname" ); - - for ( i = 0; i < triggers.size; i++ ) - triggers[i] delete(); - - triggers = getentarray( "trigger_box", "classname" ); - - for ( i = 0; i < triggers.size; i++ ) - triggers[i] delete(); - - triggers = getentarray( "trigger_radius", "classname" ); - - for ( i = 0; i < triggers.size; i++ ) - triggers[i] delete(); - - triggers = getentarray( "trigger_lookat", "classname" ); - - for ( i = 0; i < triggers.size; i++ ) - triggers[i] delete(); - - triggers = getentarray( "trigger_damage", "classname" ); - - for ( i = 0; i < triggers.size; i++ ) - triggers[i] delete(); - - sm = getentarray( "spawn_manager", "classname" ); - - for ( i = 0; i < sm.size; i++ ) - sm[i] delete(); - - delete_spawns(); - - if ( !ismp() ) - { - delete_arrays_in_sp(); + if ( ismp() ) + { + init_client_mp_variables(); + } + else + { + init_client_sp_variables(); + } + level.exploderfunction = level.cfx_exploder_before; + waittillframeend; + waittillframeend; + level.exploderfunction = level.cfx_exploder_after; + level.non_fx_ents = 0; + if ( level.createfx_enabled ) + { + triggers = getentarray( "trigger_multiple", "classname" ); + i = 0; + while ( i < triggers.size ) + { + triggers[ i ] delete(); + i++; + } + triggers = getentarray( "trigger_once", "classname" ); + i = 0; + while ( i < triggers.size ) + { + triggers[ i ] delete(); + i++; + } + triggers = getentarray( "trigger_box", "classname" ); + i = 0; + while ( i < triggers.size ) + { + triggers[ i ] delete(); + i++; + } + triggers = getentarray( "trigger_radius", "classname" ); + i = 0; + while ( i < triggers.size ) + { + triggers[ i ] delete(); + i++; + } + triggers = getentarray( "trigger_lookat", "classname" ); + i = 0; + while ( i < triggers.size ) + { + triggers[ i ] delete(); + i++; + } + triggers = getentarray( "trigger_damage", "classname" ); + i = 0; + while ( i < triggers.size ) + { + triggers[ i ] delete(); + i++; + } + sm = getentarray( "spawn_manager", "classname" ); + i = 0; + while ( i < sm.size ) + { + sm[ i ] delete(); + i++; + } + delete_spawns(); + if ( !ismp() ) + { + delete_arrays_in_sp(); /# - println( "We're not in MP!" ); + println( "We're not in MP!" ); #/ - } - } - - for ( i = 0; i < level.createfxent.size; i++ ) - { - ent = level.createfxent[i]; - ent set_forward_and_up_vectors(); - - if ( level.clientscripts ) - { - if ( !level.createfx_enabled ) - continue; - } - - if ( isdefined( ent.model ) ) - level.non_fx_ents++; - - if ( ent.v["type"] == "loopfx" ) - ent thread [[ level.cfx_func_loopfx ]](); - - if ( ent.v["type"] == "oneshotfx" ) - ent thread [[ level.cfx_func_oneshotfx ]](); - - if ( ent.v["type"] == "soundfx" ) - ent thread [[ level.cfx_func_soundfx ]](); - } + } + } + i = 0; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + ent set_forward_and_up_vectors(); + if ( level.clientscripts ) + { + if ( !level.createfx_enabled ) + { + i++; + continue; + } + } + else + { + if ( isDefined( ent.model ) ) + { + level.non_fx_ents++; + } + if ( ent.v[ "type" ] == "loopfx" ) + { + ent thread [[ level.cfx_func_loopfx ]](); + } + if ( ent.v[ "type" ] == "oneshotfx" ) + { + ent thread [[ level.cfx_func_oneshotfx ]](); + } + if ( ent.v[ "type" ] == "soundfx" ) + { + ent thread [[ level.cfx_func_soundfx ]](); + } + } + i++; + } } add_effect( name, effect ) { - if ( !isdefined( level._effect ) ) - level._effect = []; - - level._effect[name] = loadfx( effect ); + if ( !isDefined( level._effect ) ) + { + level._effect = []; + } + level._effect[ name ] = loadfx( effect ); } createeffect( type, fxid ) { - ent = undefined; - - if ( !isdefined( level.createfx_enabled ) ) - level.createfx_enabled = getdvar( "createfx" ) != ""; - - if ( !isdefined( level.createfxent ) ) - level.createfxent = []; - - if ( level.createfx_enabled ) - { - if ( !isdefined( level.cfx_uniqueid ) ) - level.cfx_uniqueid = 0; - - ent = spawnstruct(); - ent.uniqueid = level.cfx_uniqueid; - level.cfx_uniqueid++; - } - else if ( type == "exploder" ) - ent = spawnstruct(); - else - { - if ( !isdefined( level._fake_createfx_struct ) ) - level._fake_createfx_struct = spawnstruct(); - - ent = level._fake_createfx_struct; - } - - level.createfxent[level.createfxent.size] = ent; - ent.v = []; - ent.v["type"] = type; - ent.v["fxid"] = fxid; - ent.v["angles"] = ( 0, 0, 0 ); - ent.v["origin"] = ( 0, 0, 0 ); - ent.drawn = 1; - return ent; + ent = undefined; + if ( !isDefined( level.createfx_enabled ) ) + { + level.createfx_enabled = getDvar( "createfx" ) != ""; + } + if ( !isDefined( level.createfxent ) ) + { + level.createfxent = []; + } + if ( level.createfx_enabled ) + { + if ( !isDefined( level.cfx_uniqueid ) ) + { + level.cfx_uniqueid = 0; + } + ent = spawnstruct(); + ent.uniqueid = level.cfx_uniqueid; + level.cfx_uniqueid++; + } + else if ( type == "exploder" ) + { + ent = spawnstruct(); + } + else + { + if ( !isDefined( level._fake_createfx_struct ) ) + { + level._fake_createfx_struct = spawnstruct(); + } + ent = level._fake_createfx_struct; + } + level.createfxent[ level.createfxent.size ] = ent; + ent.v = []; + ent.v[ "type" ] = type; + ent.v[ "fxid" ] = fxid; + ent.v[ "angles" ] = ( 1, 1, 1 ); + ent.v[ "origin" ] = ( 1, 1, 1 ); + ent.drawn = 1; + return ent; } createloopsound() { - ent = spawnstruct(); - - if ( !isdefined( level.createfxent ) ) - level.createfxent = []; - - level.createfxent[level.createfxent.size] = ent; - ent.v = []; - ent.v["type"] = "soundfx"; - ent.v["fxid"] = "No FX"; - ent.v["soundalias"] = "nil"; - ent.v["angles"] = ( 0, 0, 0 ); - ent.v["origin"] = ( 0, 0, 0 ); - ent.drawn = 1; - return ent; + ent = spawnstruct(); + if ( !isDefined( level.createfxent ) ) + { + level.createfxent = []; + } + level.createfxent[ level.createfxent.size ] = ent; + ent.v = []; + ent.v[ "type" ] = "soundfx"; + ent.v[ "fxid" ] = "No FX"; + ent.v[ "soundalias" ] = "nil"; + ent.v[ "angles" ] = ( 1, 1, 1 ); + ent.v[ "origin" ] = ( 1, 1, 1 ); + ent.drawn = 1; + return ent; } set_forward_and_up_vectors() { - self.v["up"] = anglestoup( self.v["angles"] ); - self.v["forward"] = anglestoforward( self.v["angles"] ); + self.v[ "up" ] = anglesToUp( self.v[ "angles" ] ); + self.v[ "forward" ] = anglesToForward( self.v[ "angles" ] ); } createfxlogic() { - waittillframeend; - menu_init(); - - if ( !ismp() ) - { - players = get_players(); - - if ( !isdefined( players ) || players.size == 0 ) - level waittill( "first_player_ready" ); - } + waittillframeend; + menu_init(); + if ( !ismp() ) + { + players = get_players(); + if ( !isDefined( players ) || players.size == 0 ) + { + level waittill( "first_player_ready" ); + } + } /# - adddebugcommand( "noclip" ); + adddebugcommand( "noclip" ); #/ - if ( !isdefined( level._effect ) ) - level._effect = []; - - if ( getdvar( "createfx_map" ) == "" ) - setdvar( "createfx_map", level.script ); - else if ( getdvar( "createfx_map" ) == level.script ) - { - if ( !ismp() ) - { - playerpos = []; - playerpos[0] = getdvarint( _hash_274F266C ); - playerpos[1] = getdvarint( _hash_274F266D ); - playerpos[2] = getdvarint( _hash_274F266E ); - player = get_players()[0]; - player setorigin( ( playerpos[0], playerpos[1], playerpos[2] ) ); - } - } + if ( !isDefined( level._effect ) ) + { + level._effect = []; + } + if ( getDvar( "createfx_map" ) == "" ) + { + setdvar( "createfx_map", level.script ); + } + else + { + if ( getDvar( "createfx_map" ) == level.script ) + { + if ( !ismp() ) + { + playerpos = []; + playerpos[ 0 ] = getDvarInt( #"274F266C" ); + playerpos[ 1 ] = getDvarInt( #"274F266D" ); + playerpos[ 2 ] = getDvarInt( #"274F266E" ); + player = get_players()[ 0 ]; + player setorigin( ( playerpos[ 0 ], playerpos[ 1 ], playerpos[ 2 ] ) ); + } + } + } /# - filename = level.cfx_server_scriptdata + level.script + "_fx.gsc"; - file = openfile( filename, "append" ); - level.write_error = ""; - - if ( file == -1 ) - level.write_error = filename; - else - closefile( file ); + filename = level.cfx_server_scriptdata + level.script + "_fx.gsc"; + file = openfile( filename, "append" ); + level.write_error = ""; + if ( file == -1 ) + { + level.write_error = filename; + } + else + { + closefile( file ); #/ - level.createfxhudelements = []; - level.createfx_hudelements = 100; - stroffsetx = []; - stroffsety = []; - stroffsetx[0] = 0; - stroffsety[0] = 0; - stroffsetx[1] = 1; - stroffsety[1] = 1; - stroffsetx[2] = -2; - stroffsety[2] = 1; - setdvar( "fx", "nil" ); - crosshair = newdebughudelem(); - crosshair.location = 0; - crosshair.alignx = "center"; - crosshair.aligny = "middle"; - crosshair.foreground = 1; - crosshair.fontscale = 2; - crosshair.sort = 20; - crosshair.alpha = 1; - crosshair.x = 320; - crosshair.y = 233; - crosshair settext( "." ); - center_text_init(); - level.cleartextmarker = newdebughudelem(); - level.cleartextmarker.alpha = 0; - level.cleartextmarker settext( "marker" ); - - for ( i = 0; i < level.createfx_hudelements; i++ ) - { - newstrarray = []; - - for ( p = 0; p < 2; p++ ) - { - newstr = newhudelem(); - newstr.alignx = "left"; - newstr.location = 0; - newstr.foreground = 1; - newstr.fontscale = 1.1; - newstr.sort = 20 - p; - newstr.alpha = 1; - newstr.x = 0 + stroffsetx[p]; - newstr.y = 60 + stroffsety[p] + i * 15; - - if ( p > 0 ) - newstr.color = ( 0, 0, 0 ); - - newstrarray[newstrarray.size] = newstr; - } - - level.createfxhudelements[i] = newstrarray; - } - - level.selectedmove_up = 0; - level.selectedmove_forward = 0; - level.selectedmove_right = 0; - level.selectedrotate_pitch = 0; - level.selectedrotate_roll = 0; - level.selectedrotate_yaw = 0; - level.selected_fx = []; - level.selected_fx_ents = []; - level.createfx_lockedlist = []; - level.createfx_lockedlist["escape"] = 1; - level.createfx_lockedlist["BUTTON_LSHLDR"] = 1; - level.createfx_lockedlist["BUTTON_RSHLDR"] = 1; - level.createfx_lockedlist["mouse1"] = 1; - level.createfx_lockedlist["ctrl"] = 1; - level.createfx_draw_enabled = 1; - level.buttonisheld = []; - axismode = 0; - colors = []; - colors["loopfx"]["selected"] = ( 1.0, 1.0, 0.2 ); - colors["loopfx"]["highlighted"] = ( 0.4, 0.95, 1.0 ); - colors["loopfx"]["default"] = ( 0.3, 0.5, 1.0 ); - colors["oneshotfx"]["selected"] = ( 1.0, 1.0, 0.2 ); - colors["oneshotfx"]["highlighted"] = ( 0.33, 0.97, 1.0 ); - colors["oneshotfx"]["default"] = ( 0.1, 0.73, 0.73 ); - colors["exploder"]["selected"] = ( 1.0, 1.0, 0.2 ); - colors["exploder"]["highlighted"] = ( 1.0, 0.1, 0.1 ); - colors["exploder"]["default"] = ( 1.0, 0.1, 0.1 ); - colors["rainfx"]["selected"] = ( 1.0, 1.0, 0.2 ); - colors["rainfx"]["highlighted"] = ( 0.95, 0.4, 0.95 ); - colors["rainfx"]["default"] = ( 0.78, 0.0, 0.73 ); - colors["soundfx"]["selected"] = ( 1.0, 1.0, 0.2 ); - colors["soundfx"]["highlighted"] = ( 0.5, 1.0, 0.75 ); - colors["soundfx"]["default"] = ( 0.2, 0.9, 0.2 ); - lasthighlightedent = undefined; - level.fx_rotating = 0; - setmenu( "none" ); - level.createfx_selecting = 0; - level.createfx_last_player_origin = ( 0, 0, 0 ); - level.createfx_last_player_forward = ( 0, 0, 0 ); - level.createfx_last_view_change_test = 0; - player = get_players()[0]; - black = newdebughudelem(); - black.x = -120; - black.y = 200; - black.foreground = 0; - black setshader( "black", 250, 160 ); - black.alpha = 0; - level.createfx_inputlocked = 0; - help_on_last_frame = 0; - - for ( i = 0; i < level.createfxent.size; i++ ) - { - ent = level.createfxent[i]; - ent post_entity_creation_function(); - } - - thread draw_distance(); - lastselectentity = undefined; - thread createfx_autosave(); - - if ( !ismp() ) - make_sp_player_invulnerable( player ); - - for (;;) - { - player = get_players()[0]; - changedselectedents = 0; - right = anglestoright( player getplayerangles() ); - forward = anglestoforward( player getplayerangles() ); - up = anglestoup( player getplayerangles() ); - dot = 0.85; - placeent_vector = vectorscale( forward, 750 ); - level.createfxcursor = bullettrace( player geteye(), player geteye() + placeent_vector, 0, undefined ); - highlightedent = undefined; - level.buttonclick = []; - level.button_is_kb = []; - process_button_held_and_clicked(); - ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); - shiftheld = button_is_held( "shift" ); - functionheld = button_is_held( "f" ); - leftclick = button_is_clicked( "mouse1", "BUTTON_A" ); - leftheld = button_is_held( "mouse1", "BUTTON_A" ); - create_fx_menu(); - - if ( button_is_clicked( "BUTTON_X" ) || shiftheld && button_is_clicked( "x" ) ) - axismode = !axismode; - - if ( button_is_clicked( "F2" ) || functionheld && button_is_clicked( "2" ) ) - toggle_createfx_drawing(); - - if ( button_is_clicked( "F3" ) || functionheld && button_is_clicked( "3" ) ) - print_ambient_fx_inventory(); - - if ( button_is_clicked( "F5" ) || functionheld && button_is_clicked( "5" ) ) - createfx_save(); - - if ( button_is_clicked( "ins", "i" ) ) - insert_effect(); - - if ( button_is_clicked( "c" ) ) - { - if ( level.is_camera_on == 0 ) - { + } + level.createfxhudelements = []; + level.createfx_hudelements = 100; + stroffsetx = []; + stroffsety = []; + stroffsetx[ 0 ] = 0; + stroffsety[ 0 ] = 0; + stroffsetx[ 1 ] = 1; + stroffsety[ 1 ] = 1; + stroffsetx[ 2 ] = -2; + stroffsety[ 2 ] = 1; + setdvar( "fx", "nil" ); + crosshair = newdebughudelem(); + crosshair.location = 0; + crosshair.alignx = "center"; + crosshair.aligny = "middle"; + crosshair.foreground = 1; + crosshair.fontscale = 2; + crosshair.sort = 20; + crosshair.alpha = 1; + crosshair.x = 320; + crosshair.y = 233; + crosshair settext( "." ); + center_text_init(); + level.cleartextmarker = newdebughudelem(); + level.cleartextmarker.alpha = 0; + level.cleartextmarker settext( "marker" ); + i = 0; + while ( i < level.createfx_hudelements ) + { + newstrarray = []; + p = 0; + while ( p < 2 ) + { + newstr = newhudelem(); + newstr.alignx = "left"; + newstr.location = 0; + newstr.foreground = 1; + newstr.fontscale = 1,1; + newstr.sort = 20 - p; + newstr.alpha = 1; + newstr.x = 0 + stroffsetx[ p ]; + newstr.y = ( 60 + stroffsety[ p ] ) + ( i * 15 ); + if ( p > 0 ) + { + newstr.color = ( 1, 1, 1 ); + } + newstrarray[ newstrarray.size ] = newstr; + p++; + } + level.createfxhudelements[ i ] = newstrarray; + i++; + } + level.selectedmove_up = 0; + level.selectedmove_forward = 0; + level.selectedmove_right = 0; + level.selectedrotate_pitch = 0; + level.selectedrotate_roll = 0; + level.selectedrotate_yaw = 0; + level.selected_fx = []; + level.selected_fx_ents = []; + level.createfx_lockedlist = []; + level.createfx_lockedlist[ "escape" ] = 1; + level.createfx_lockedlist[ "BUTTON_LSHLDR" ] = 1; + level.createfx_lockedlist[ "BUTTON_RSHLDR" ] = 1; + level.createfx_lockedlist[ "mouse1" ] = 1; + level.createfx_lockedlist[ "ctrl" ] = 1; + level.createfx_draw_enabled = 1; + level.buttonisheld = []; + axismode = 0; + colors = []; + colors[ "loopfx" ][ "selected" ] = ( 1, 1, 0,2 ); + colors[ "loopfx" ][ "highlighted" ] = ( 0,4, 0,95, 1 ); + colors[ "loopfx" ][ "default" ] = ( 0,3, 0,5, 1 ); + colors[ "oneshotfx" ][ "selected" ] = ( 1, 1, 0,2 ); + colors[ "oneshotfx" ][ "highlighted" ] = ( 0,33, 0,97, 1 ); + colors[ "oneshotfx" ][ "default" ] = ( 0,1, 0,73, 0,73 ); + colors[ "exploder" ][ "selected" ] = ( 1, 1, 0,2 ); + colors[ "exploder" ][ "highlighted" ] = ( 1, 0,1, 0,1 ); + colors[ "exploder" ][ "default" ] = ( 1, 0,1, 0,1 ); + colors[ "rainfx" ][ "selected" ] = ( 1, 1, 0,2 ); + colors[ "rainfx" ][ "highlighted" ] = ( 0,95, 0,4, 0,95 ); + colors[ "rainfx" ][ "default" ] = ( 0,78, 0, 0,73 ); + colors[ "soundfx" ][ "selected" ] = ( 1, 1, 0,2 ); + colors[ "soundfx" ][ "highlighted" ] = ( 0,5, 1, 0,75 ); + colors[ "soundfx" ][ "default" ] = ( 0,2, 0,9, 0,2 ); + lasthighlightedent = undefined; + level.fx_rotating = 0; + setmenu( "none" ); + level.createfx_selecting = 0; + level.createfx_last_player_origin = ( 1, 1, 1 ); + level.createfx_last_player_forward = ( 1, 1, 1 ); + level.createfx_last_view_change_test = 0; + player = get_players()[ 0 ]; + black = newdebughudelem(); + black.x = -120; + black.y = 200; + black.foreground = 0; + black setshader( "black", 250, 160 ); + black.alpha = 0; + level.createfx_inputlocked = 0; + help_on_last_frame = 0; + i = 0; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + ent post_entity_creation_function(); + i++; + } + thread draw_distance(); + lastselectentity = undefined; + thread createfx_autosave(); + if ( !ismp() ) + { + make_sp_player_invulnerable( player ); + } + for ( ;; ) + { + player = get_players()[ 0 ]; + changedselectedents = 0; + right = anglesToRight( player getplayerangles() ); + forward = anglesToForward( player getplayerangles() ); + up = anglesToUp( player getplayerangles() ); + dot = 0,85; + placeent_vector = vectorScale( forward, 750 ); + level.createfxcursor = bullettrace( player geteye(), player geteye() + placeent_vector, 0, undefined ); + highlightedent = undefined; + level.buttonclick = []; + level.button_is_kb = []; + process_button_held_and_clicked(); + ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); + shiftheld = button_is_held( "shift" ); + functionheld = button_is_held( "f" ); + leftclick = button_is_clicked( "mouse1", "BUTTON_A" ); + leftheld = button_is_held( "mouse1", "BUTTON_A" ); + create_fx_menu(); + if ( button_is_clicked( "BUTTON_X" ) || shiftheld && button_is_clicked( "x" ) ) + { + axismode = !axismode; + } + if ( button_is_clicked( "F2" ) || functionheld && button_is_clicked( "2" ) ) + { + toggle_createfx_drawing(); + } + if ( button_is_clicked( "F3" ) || functionheld && button_is_clicked( "3" ) ) + { + print_ambient_fx_inventory(); + } + if ( button_is_clicked( "F5" ) || functionheld && button_is_clicked( "5" ) ) + { + createfx_save(); + } + if ( button_is_clicked( "ins", "i" ) ) + { + insert_effect(); + } + if ( button_is_clicked( "c" ) ) + { + if ( level.is_camera_on == 0 ) + { /# - adddebugcommand( "noclip" ); + adddebugcommand( "noclip" ); #/ - level thread handle_camera(); - level.is_camera_on = 1; - } - else if ( level.is_camera_on == 1 ) - { + level thread handle_camera(); + level.is_camera_on = 1; + break; + } + else + { + if ( level.is_camera_on == 1 ) + { /# - adddebugcommand( "noclip" ); + adddebugcommand( "noclip" ); #/ - level notify( "new_camera" ); - level.is_camera_on = 0; - axismode = 0; - } - } - - if ( button_is_held( "BUTTON_RTRIG" ) && level.is_camera_on ) - axismode = 1; - else if ( !button_is_held( "BUTTON_RTRIG" ) && level.is_camera_on ) - axismode = 0; - - if ( button_is_clicked( "del" ) || !shiftheld && button_is_clicked( "d" ) ) - delete_pressed(); - - if ( button_is_clicked( "end" ) || shiftheld && button_is_clicked( "d" ) ) - { - drop_selection_to_ground(); - changedselectedents = 1; - } - - if ( button_is_clicked( "s" ) ) - { - setmenu( "select_by_property" ); - wait 0.05; - } - - if ( isdefined( level.cfx_selected_prop ) ) - { - if ( ctrlheld ) - select_ents_by_property( level.cfx_selected_prop, 1 ); - else - select_ents_by_property( level.cfx_selected_prop ); - - level.cfx_selected_prop = undefined; - } - - if ( button_is_clicked( "j" ) ) - { - setmenu( "jump_to_effect" ); - draw_effects_list( "Select effect to jump to:" ); - } - - if ( button_is_clicked( "escape" ) ) - clear_settable_fx(); - - if ( button_is_clicked( "space" ) && !shiftheld ) - set_off_exploders(); - - if ( button_is_clicked( "space" ) && shiftheld ) - turn_off_exploders(); - - if ( button_is_clicked( "tab", "BUTTON_RSHLDR" ) ) - { - move_selection_to_cursor(); - changedselectedents = 1; - } - - if ( button_is_clicked( "z" ) ) - { - if ( shiftheld ) - { - - } - else - undo(); - } - - if ( button_is_held( "q", "F1" ) ) - { - help_on_last_frame = 1; - show_help(); - wait 0.05; - continue; - } - else if ( help_on_last_frame == 1 ) - { - clear_fx_hudelements(); - help_on_last_frame = 0; - } - - if ( button_is_clicked( "BUTTON_LSTICK" ) && !ctrlheld ) - copy_ents(); - - if ( button_is_clicked( "BUTTON_RSTICK" ) ) - { - if ( ctrlheld ) - paste_ents_onto_ents(); - else - paste_ents(); - } - - if ( isdefined( level.selected_fx_option_index ) ) - menu_fx_option_set(); - - if ( button_is_held( "BUTTON_RTRIG" ) && button_is_held( "BUTTON_LTRIG" ) ) - { - move_player_around_map_fast(); - wait 0.25; - continue; - } - - if ( menu( "none" ) ) - { - if ( button_is_clicked( "rightarrow" ) ) - move_player_to_next_same_effect( 1, lastselectentity ); - else if ( button_is_clicked( "leftarrow" ) ) - move_player_to_next_same_effect( 0, lastselectentity ); - } - - if ( level.write_error != "" ) - { - level notify( "write_error" ); - thread write_error_msg( level.write_error ); - level.write_error = ""; - } - - highlightedent = level.fx_highlightedent; - - if ( leftclick || gettime() - level.createfx_last_view_change_test > 250 ) - { - if ( leftclick || vector_changed( level.createfx_last_player_origin, player.origin ) || dot_changed( level.createfx_last_player_forward, forward ) ) - { - for ( i = 0; i < level.createfxent.size; i++ ) - { - ent = level.createfxent[i]; - - if ( !ent.drawn ) - continue; - - difference = vectornormalize( ent.v["origin"] - player.origin + vectorscale( ( 0, 0, 1 ), 55.0 ) ); - newdot = vectordot( forward, difference ); - - if ( newdot < dot ) - continue; - - if ( newdot == dot ) - { - if ( ent_is_selected( ent ) ) - continue; - } - - dot = newdot; - highlightedent = ent; - highlightedent.last_fx_index = i; - } - - level.fx_highlightedent = highlightedent; - level.createfx_last_player_origin = player.origin; - level.createfx_last_player_forward = forward; - } - - level.createfx_last_view_change_test = gettime(); - } - - if ( isdefined( highlightedent ) ) - { - if ( isdefined( lasthighlightedent ) ) - { - if ( lasthighlightedent != highlightedent ) - { - if ( !ent_is_selected( lasthighlightedent ) ) - lasthighlightedent thread entity_highlight_disable(); - - if ( !ent_is_selected( highlightedent ) ) - highlightedent thread entity_highlight_enable(); - } - } - else if ( !ent_is_selected( highlightedent ) ) - highlightedent thread entity_highlight_enable(); - } - - manipulate_createfx_ents( highlightedent, leftclick, leftheld, ctrlheld, colors, right ); - - if ( axismode && level.selected_fx_ents.size > 0 ) - { - thread process_fx_rotater(); - - if ( button_is_clicked( "enter", "r" ) ) - reset_axis_of_selected_ents(); - - if ( button_is_clicked( "v" ) ) - copy_angles_of_selected_ents(); - - if ( getdvarint( "createfx_drawaxis" ) == 1 ) - { - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - level.selected_fx_ents[i] draw_axis(); - } - - if ( level.selectedrotate_pitch != 0 || level.selectedrotate_yaw != 0 || level.selectedrotate_roll != 0 ) - changedselectedents = 1; - - wait 0.05; - } - else - { - stop_drawing_axis_models(); - selectedmove_vector = get_selected_move_vector(); - - if ( distancesquared( ( 0, 0, 0 ), selectedmove_vector ) > 0 ) - { - changedselectedents = 1; - - if ( level.cfx_last_action != "translate" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "translate"; - } - } - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - - if ( isdefined( ent.model ) ) - continue; - - ent.v["origin"] += selectedmove_vector; - } - - wait 0.05; - } - - if ( changedselectedents ) - update_selected_entities(); - - lasthighlightedent = highlightedent; - - if ( last_selected_entity_has_changed( lastselectentity ) ) - { - level.effect_list_offset = 0; - clear_settable_fx(); - setmenu( "none" ); - } - - if ( level.selected_fx_ents.size ) - { - lastselectentity = level.selected_fx_ents[level.selected_fx_ents.size - 1]; - continue; - } - - lastselectentity = undefined; - } + level notify( "new_camera" ); + level.is_camera_on = 0; + axismode = 0; + } + } + } + if ( button_is_held( "BUTTON_RTRIG" ) && level.is_camera_on ) + { + axismode = 1; + } + else + { + if ( !button_is_held( "BUTTON_RTRIG" ) && level.is_camera_on ) + { + axismode = 0; + } + } + if ( button_is_clicked( "del" ) || !shiftheld && button_is_clicked( "d" ) ) + { + delete_pressed(); + } + if ( button_is_clicked( "end" ) || shiftheld && button_is_clicked( "d" ) ) + { + drop_selection_to_ground(); + changedselectedents = 1; + } + if ( button_is_clicked( "s" ) ) + { + setmenu( "select_by_property" ); + wait 0,05; + } + if ( isDefined( level.cfx_selected_prop ) ) + { + if ( ctrlheld ) + { + select_ents_by_property( level.cfx_selected_prop, 1 ); + } + else + { + select_ents_by_property( level.cfx_selected_prop ); + } + level.cfx_selected_prop = undefined; + } + if ( button_is_clicked( "j" ) ) + { + setmenu( "jump_to_effect" ); + draw_effects_list( "Select effect to jump to:" ); + } + if ( button_is_clicked( "escape" ) ) + { + clear_settable_fx(); + } + if ( button_is_clicked( "space" ) && !shiftheld ) + { + set_off_exploders(); + } + if ( button_is_clicked( "space" ) && shiftheld ) + { + turn_off_exploders(); + } + if ( button_is_clicked( "tab", "BUTTON_RSHLDR" ) ) + { + move_selection_to_cursor(); + changedselectedents = 1; + } + if ( button_is_clicked( "z" ) ) + { + if ( shiftheld ) + { + break; + } + else + { + undo(); + } + } + if ( button_is_held( "q", "F1" ) ) + { + help_on_last_frame = 1; + show_help(); + wait 0,05; + continue; + } + else if ( help_on_last_frame == 1 ) + { + clear_fx_hudelements(); + help_on_last_frame = 0; + } + if ( button_is_clicked( "BUTTON_LSTICK" ) && !ctrlheld ) + { + copy_ents(); + } + if ( button_is_clicked( "BUTTON_RSTICK" ) ) + { + if ( ctrlheld ) + { + paste_ents_onto_ents(); + break; + } + else + { + paste_ents(); + } + } + if ( isDefined( level.selected_fx_option_index ) ) + { + menu_fx_option_set(); + } + if ( button_is_held( "BUTTON_RTRIG" ) && button_is_held( "BUTTON_LTRIG" ) ) + { + move_player_around_map_fast(); + wait 0,25; + continue; + } + else + { + if ( menu( "none" ) ) + { + if ( button_is_clicked( "rightarrow" ) ) + { + move_player_to_next_same_effect( 1, lastselectentity ); + break; + } + else + { + if ( button_is_clicked( "leftarrow" ) ) + { + move_player_to_next_same_effect( 0, lastselectentity ); + } + } + } + if ( level.write_error != "" ) + { + level notify( "write_error" ); + thread write_error_msg( level.write_error ); + level.write_error = ""; + } + highlightedent = level.fx_highlightedent; + if ( leftclick || ( getTime() - level.createfx_last_view_change_test ) > 250 ) + { + if ( !leftclick || vector_changed( level.createfx_last_player_origin, player.origin ) && dot_changed( level.createfx_last_player_forward, forward ) ) + { + i = 0; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + if ( !ent.drawn ) + { + i++; + continue; + } + else difference = vectornormalize( ent.v[ "origin" ] - ( player.origin + vectorScale( ( 1, 1, 1 ), 55 ) ) ); + newdot = vectordot( forward, difference ); + if ( newdot < dot ) + { + i++; + continue; + } + else if ( newdot == dot ) + { + if ( ent_is_selected( ent ) ) + { + i++; + continue; + } + } + else + { + dot = newdot; + highlightedent = ent; + highlightedent.last_fx_index = i; + } + i++; + } + level.fx_highlightedent = highlightedent; + level.createfx_last_player_origin = player.origin; + level.createfx_last_player_forward = forward; + } + level.createfx_last_view_change_test = getTime(); + } + if ( isDefined( highlightedent ) ) + { + if ( isDefined( lasthighlightedent ) ) + { + if ( lasthighlightedent != highlightedent ) + { + if ( !ent_is_selected( lasthighlightedent ) ) + { + lasthighlightedent thread entity_highlight_disable(); + } + if ( !ent_is_selected( highlightedent ) ) + { + highlightedent thread entity_highlight_enable(); + } + } + break; + } + else + { + if ( !ent_is_selected( highlightedent ) ) + { + highlightedent thread entity_highlight_enable(); + } + } + } + manipulate_createfx_ents( highlightedent, leftclick, leftheld, ctrlheld, colors, right ); + if ( axismode && level.selected_fx_ents.size > 0 ) + { + thread process_fx_rotater(); + if ( button_is_clicked( "enter", "r" ) ) + { + reset_axis_of_selected_ents(); + } + if ( button_is_clicked( "v" ) ) + { + copy_angles_of_selected_ents(); + } + while ( getDvarInt( "createfx_drawaxis" ) == 1 ) + { + i = 0; + while ( i < level.selected_fx_ents.size ) + { + level.selected_fx_ents[ i ] draw_axis(); + i++; + } + } + if ( level.selectedrotate_pitch != 0 || level.selectedrotate_yaw != 0 && level.selectedrotate_roll != 0 ) + { + changedselectedents = 1; + } + wait 0,05; + } + else + { + stop_drawing_axis_models(); + selectedmove_vector = get_selected_move_vector(); + if ( distancesquared( ( 1, 1, 1 ), selectedmove_vector ) > 0 ) + { + changedselectedents = 1; + if ( level.cfx_last_action != "translate" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "translate"; + } + } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + if ( isDefined( ent.model ) ) + { + i++; + continue; + } + else + { + ent.v[ "origin" ] += selectedmove_vector; + } + i++; + } + wait 0,05; + } + if ( changedselectedents ) + { + update_selected_entities(); + } + lasthighlightedent = highlightedent; + if ( last_selected_entity_has_changed( lastselectentity ) ) + { + level.effect_list_offset = 0; + clear_settable_fx(); + setmenu( "none" ); + } + if ( level.selected_fx_ents.size ) + { + lastselectentity = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; + break; + } + else + { + lastselectentity = undefined; + } + } + } } toggle_createfx_drawing() { - level.createfx_draw_enabled = !level.createfx_draw_enabled; + level.createfx_draw_enabled = !level.createfx_draw_enabled; } manipulate_createfx_ents( highlightedent, leftclick, leftheld, ctrlheld, colors, right ) { - if ( !level.createfx_draw_enabled ) - { - clear_fx_hudelements(); - return; - } - - scale = getdvarfloat( "createfx_scaleid" ); - print_frames = getdvarint( "createfx_print_frames" ); - - if ( !isdefined( level.createfx_manipulate_offset ) ) - level.createfx_manipulate_offset = 0; - - offset = level.createfx_manipulate_offset; - level.createfx_manipulate_offset = ( level.createfx_manipulate_offset + 1 ) % print_frames; - - for ( i = offset; i < level.createfxent.size; i += print_frames ) - { - ent = level.createfxent[i]; - - if ( !ent.drawn ) - continue; - - if ( isdefined( highlightedent ) && ent == highlightedent ) - { - continue; - continue; - } - - colorindex = "default"; - - if ( index_is_selected( i ) ) - colorindex = "selected"; + if ( !level.createfx_draw_enabled ) + { + clear_fx_hudelements(); + return; + } + scale = getDvarFloat( "createfx_scaleid" ); + print_frames = getDvarInt( "createfx_print_frames" ); + if ( !isDefined( level.createfx_manipulate_offset ) ) + { + level.createfx_manipulate_offset = 0; + } + offset = level.createfx_manipulate_offset; + level.createfx_manipulate_offset = ( level.createfx_manipulate_offset + 1 ) % print_frames; + i = offset; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + if ( !ent.drawn ) + { + } + else if ( isDefined( highlightedent ) && ent == highlightedent ) + { + } + else colorindex = "default"; + if ( index_is_selected( i ) ) + { + colorindex = "selected"; + } /# - print3d( ent.v["origin"], ".", colors[ent.v["type"]][colorindex], 1, scale, print_frames ); + print3d( ent.v[ "origin" ], ".", colors[ ent.v[ "type" ] ][ colorindex ], 1, scale, print_frames ); #/ - if ( ent.textalpha > 0 ) - { - printright = vectorscale( right, ent.v["fxid"].size * -2.93 * scale ); - printup = ( 0, 0, 15 * scale ); + if ( ent.textalpha > 0 ) + { + printright = vectorScale( right, ( ent.v[ "fxid" ].size * -2,93 ) * scale ); + printup = ( 0, 0, 15 * scale ); /# - print3d( ent.v["origin"] + printright + printup, ent.v["fxid"], colors[ent.v["type"]][colorindex], ent.textalpha, scale, print_frames ); + print3d( ent.v[ "origin" ] + printright + printup, ent.v[ "fxid" ], colors[ ent.v[ "type" ] ][ colorindex ], ent.textalpha, scale, print_frames ); #/ - } - } - - if ( isdefined( highlightedent ) ) - { - if ( !entities_are_selected() ) - display_fx_info( highlightedent ); - - if ( leftclick ) - { - entwasselected = index_is_selected( highlightedent.last_fx_index ); - level.createfx_selecting = !entwasselected; - - if ( !ctrlheld ) - { - selectedsize = level.selected_fx_ents.size; - clear_entity_selection(); - - if ( entwasselected && selectedsize == 1 ) - select_entity( highlightedent.last_fx_index, highlightedent ); - } - - toggle_entity_selection( highlightedent.last_fx_index, highlightedent ); - } - else if ( leftheld ) - { - if ( ctrlheld ) - { - if ( level.createfx_selecting ) - select_entity( highlightedent.last_fx_index, highlightedent ); - - if ( !level.createfx_selecting ) - deselect_entity( highlightedent.last_fx_index, highlightedent ); - } - } - - colorindex = "highlighted"; - - if ( index_is_selected( highlightedent.last_fx_index ) ) - colorindex = "selected"; + } + i += print_frames; + } + if ( isDefined( highlightedent ) ) + { + if ( !entities_are_selected() ) + { + display_fx_info( highlightedent ); + } + if ( leftclick ) + { + entwasselected = index_is_selected( highlightedent.last_fx_index ); + level.createfx_selecting = !entwasselected; + if ( !ctrlheld ) + { + selectedsize = level.selected_fx_ents.size; + clear_entity_selection(); + if ( entwasselected && selectedsize == 1 ) + { + select_entity( highlightedent.last_fx_index, highlightedent ); + } + } + toggle_entity_selection( highlightedent.last_fx_index, highlightedent ); + } + else + { + if ( leftheld ) + { + if ( ctrlheld ) + { + if ( level.createfx_selecting ) + { + select_entity( highlightedent.last_fx_index, highlightedent ); + } + if ( !level.createfx_selecting ) + { + deselect_entity( highlightedent.last_fx_index, highlightedent ); + } + } + } + } + colorindex = "highlighted"; + if ( index_is_selected( highlightedent.last_fx_index ) ) + { + colorindex = "selected"; + } /# - print3d( highlightedent.v["origin"], ".", colors[highlightedent.v["type"]][colorindex], 1, scale, 1 ); + print3d( highlightedent.v[ "origin" ], ".", colors[ highlightedent.v[ "type" ] ][ colorindex ], 1, scale, 1 ); #/ - if ( highlightedent.textalpha > 0 ) - { - printright = vectorscale( right, highlightedent.v["fxid"].size * -2.93 * scale ); - printup = ( 0, 0, 15 * scale ); + if ( highlightedent.textalpha > 0 ) + { + printright = vectorScale( right, ( highlightedent.v[ "fxid" ].size * -2,93 ) * scale ); + printup = ( 0, 0, 15 * scale ); /# - print3d( highlightedent.v["origin"] + printright + printup, highlightedent.v["fxid"], colors[highlightedent.v["type"]][colorindex], highlightedent.textalpha, scale, 1 ); + print3d( highlightedent.v[ "origin" ] + printright + printup, highlightedent.v[ "fxid" ], colors[ highlightedent.v[ "type" ] ][ colorindex ], highlightedent.textalpha, scale, 1 ); #/ - } - } + } + } } clear_settable_fx() { - level.createfx_inputlocked = 0; - setdvar( "fx", "nil" ); - level.selected_fx_option_index = undefined; - reset_fx_hud_colors(); + level.createfx_inputlocked = 0; + setdvar( "fx", "nil" ); + level.selected_fx_option_index = undefined; + reset_fx_hud_colors(); } reset_fx_hud_colors() { - for ( i = 0; i < level.createfx_hudelements; i++ ) - level.createfxhudelements[i][0].color = ( 1, 1, 1 ); + i = 0; + while ( i < level.createfx_hudelements ) + { + level.createfxhudelements[ i ][ 0 ].color = ( 1, 1, 1 ); + i++; + } } button_is_held( name, name2 ) { - if ( isdefined( name2 ) ) - { - if ( isdefined( level.buttonisheld[name2] ) ) - return 1; - } - - return isdefined( level.buttonisheld[name] ); + if ( isDefined( name2 ) ) + { + if ( isDefined( level.buttonisheld[ name2 ] ) ) + { + return 1; + } + } + return isDefined( level.buttonisheld[ name ] ); } button_is_clicked( name, name2 ) { - if ( isdefined( name2 ) ) - { - if ( isdefined( level.buttonclick[name2] ) ) - return 1; - } - - return isdefined( level.buttonclick[name] ); + if ( isDefined( name2 ) ) + { + if ( isDefined( level.buttonclick[ name2 ] ) ) + { + return 1; + } + } + return isDefined( level.buttonclick[ name ] ); } toggle_entity_selection( index, ent ) { - if ( isdefined( level.selected_fx[index] ) ) - deselect_entity( index, ent ); - else - select_entity( index, ent ); + if ( isDefined( level.selected_fx[ index ] ) ) + { + deselect_entity( index, ent ); + } + else + { + select_entity( index, ent ); + } } select_entity( index, ent, skip_undo ) { - if ( isdefined( level.selected_fx[index] ) ) - return; - - ent.last_fx_index = index; - - if ( !isdefined( skip_undo ) && level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "none"; - } - - clear_settable_fx(); - level notify( "new_ent_selection" ); - ent thread entity_highlight_enable(); - level.selected_fx[index] = 1; - level.selected_fx_ents[level.selected_fx_ents.size] = ent; + if ( isDefined( level.selected_fx[ index ] ) ) + { + return; + } + ent.last_fx_index = index; + if ( !isDefined( skip_undo ) && level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "none"; + } + clear_settable_fx(); + level notify( "new_ent_selection" ); + ent thread entity_highlight_enable(); + level.selected_fx[ index ] = 1; + level.selected_fx_ents[ level.selected_fx_ents.size ] = ent; } ent_is_highlighted( ent ) { - if ( !isdefined( level.fx_highlightedent ) ) - return 0; - - return ent == level.fx_highlightedent; + if ( !isDefined( level.fx_highlightedent ) ) + { + return 0; + } + return ent == level.fx_highlightedent; } deselect_entity( index, ent ) { - if ( !isdefined( level.selected_fx[index] ) ) - return; - - if ( level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "none"; - } - - clear_settable_fx(); - level notify( "new_ent_selection" ); - level.selected_fx[index] = undefined; - - if ( !ent_is_highlighted( ent ) ) - ent thread entity_highlight_disable(); - - newarray = []; - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - if ( level.selected_fx_ents[i] != ent ) - newarray[newarray.size] = level.selected_fx_ents[i]; - } - - level.selected_fx_ents = newarray; + if ( !isDefined( level.selected_fx[ index ] ) ) + { + return; + } + if ( level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "none"; + } + clear_settable_fx(); + level notify( "new_ent_selection" ); + if ( !ent_is_highlighted( ent ) ) + { + ent thread entity_highlight_disable(); + } + newarray = []; + i = 0; + while ( i < level.selected_fx_ents.size ) + { + if ( level.selected_fx_ents[ i ] != ent ) + { + newarray[ newarray.size ] = level.selected_fx_ents[ i ]; + } + i++; + } + level.selected_fx_ents = newarray; } index_is_selected( index ) { - return isdefined( level.selected_fx[index] ); + return isDefined( level.selected_fx[ index ] ); } ent_is_selected( ent ) { - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - if ( level.selected_fx_ents[i] == ent ) - return true; - } - - return false; + i = 0; + while ( i < level.selected_fx_ents.size ) + { + if ( level.selected_fx_ents[ i ] == ent ) + { + return 1; + } + i++; + } + return 0; } clear_entity_selection( skip_undo ) { - if ( !isdefined( skip_undo ) && level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "none"; - } - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - if ( !ent_is_highlighted( level.selected_fx_ents[i] ) ) - level.selected_fx_ents[i] thread entity_highlight_disable(); - } - - level.selected_fx = []; - level.selected_fx_ents = []; + if ( !isDefined( skip_undo ) && level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "none"; + } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + if ( !ent_is_highlighted( level.selected_fx_ents[ i ] ) ) + { + level.selected_fx_ents[ i ] thread entity_highlight_disable(); + } + i++; + } + level.selected_fx = []; + level.selected_fx_ents = []; } draw_axis() { - if ( isdefined( self.draw_axis_model ) ) - return; - - self.draw_axis_model = spawn_axis_model( self.v["origin"], self.v["angles"] ); - level thread draw_axis_think( self ); - - if ( !isdefined( level.draw_axis_models ) ) - level.draw_axis_models = []; - - level.draw_axis_models[level.draw_axis_models.size] = self.draw_axis_model; + if ( isDefined( self.draw_axis_model ) ) + { + return; + } + self.draw_axis_model = spawn_axis_model( self.v[ "origin" ], self.v[ "angles" ] ); + level thread draw_axis_think( self ); + if ( !isDefined( level.draw_axis_models ) ) + { + level.draw_axis_models = []; + } + level.draw_axis_models[ level.draw_axis_models.size ] = self.draw_axis_model; } spawn_axis_model( origin, angles ) { - model = spawn( "script_model", origin ); - model setmodel( "fx_axis_createfx" ); - model.angles = angles; - return model; + model = spawn( "script_model", origin ); + model setmodel( "fx_axis_createfx" ); + model.angles = angles; + return model; } draw_axis_think( axis_parent ) { - axis_model = axis_parent.draw_axis_model; - axis_model endon( "death" ); - player = get_players()[0]; - range = getdvarint( "createfx_drawaxis_range" ); - - for ( i = 0; 1; i = 0 ) - { - asm_cond( !isdefined( axis_parent ), loc_48FC ); - asm_jump( loc_49CC ); - asm_cond( distancesquared( axis_model.origin, player.origin ) > range * range, loc_4940 ); - asm_cond( isdefined( axis_model ), loc_493D ); - axis_model delete(); - arrayremovevalue( level.draw_axis_models, undefined ); - asm_jump( loc_4980 ); - asm_cond( !isdefined( axis_model ), loc_4980 ); - axis_model = spawn_axis_model( axis_parent.v["origin"], axis_parent.v["angles"] ); - axis_parent.draw_axis_model = axis_model; - level.draw_axis_models[level.draw_axis_models.size] = axis_model; - axis_model.origin = axis_parent.v["origin"]; - axis_model.angles = axis_parent.v["angles"]; - wait 0.1; - i++; - asm_cond( i >= 10, loc_49C8 ); - range = getdvarint( "createfx_drawaxis_range" ); - } - - if ( isdefined( axis_model ) ) - axis_model delete(); + axis_model = axis_parent.draw_axis_model; + axis_model endon( "death" ); + player = get_players()[ 0 ]; + range = getDvarInt( "createfx_drawaxis_range" ); + i = 0; + while ( 1 ) + { + if ( !isDefined( axis_parent ) ) + { + break; + } + else + { + if ( distancesquared( axis_model.origin, player.origin ) > ( range * range ) ) + { + if ( isDefined( axis_model ) ) + { + axis_model delete(); + arrayremovevalue( level.draw_axis_models, undefined ); + } + } + else + { + if ( !isDefined( axis_model ) ) + { + axis_model = spawn_axis_model( axis_parent.v[ "origin" ], axis_parent.v[ "angles" ] ); + axis_parent.draw_axis_model = axis_model; + level.draw_axis_models[ level.draw_axis_models.size ] = axis_model; + } + } + axis_model.origin = axis_parent.v[ "origin" ]; + axis_model.angles = axis_parent.v[ "angles" ]; + wait 0,1; + i++; + if ( i >= 10 ) + { + range = getDvarInt( "createfx_drawaxis_range" ); + i = 0; + } + } + } + if ( isDefined( axis_model ) ) + { + axis_model delete(); + } } stop_drawing_axis_models() { - if ( isdefined( level.draw_axis_models ) ) - { - for ( i = 0; i < level.draw_axis_models.size; i++ ) - { - if ( isdefined( level.draw_axis_models[i] ) ) - level.draw_axis_models[i] delete(); - } - - arrayremovevalue( level.draw_axis_models, undefined ); - } + if ( isDefined( level.draw_axis_models ) ) + { + i = 0; + while ( i < level.draw_axis_models.size ) + { + if ( isDefined( level.draw_axis_models[ i ] ) ) + { + level.draw_axis_models[ i ] delete(); + } + i++; + } + arrayremovevalue( level.draw_axis_models, undefined ); + } } clear_fx_hudelements() { - level.cfx_center_text[level.cfx_center_text_max - 1] clearalltextafterhudelem(); - - for ( i = 0; i < level.createfx_hudelements; i++ ) - { - for ( p = 0; p < 2; p++ ) - level.createfxhudelements[i][p] settext( "" ); - } - - level.fxhudelements = 0; + level.cfx_center_text[ level.cfx_center_text_max - 1 ] clearalltextafterhudelem(); + i = 0; + while ( i < level.createfx_hudelements ) + { + p = 0; + while ( p < 2 ) + { + level.createfxhudelements[ i ][ p ] settext( "" ); + p++; + } + i++; + } + level.fxhudelements = 0; } set_fx_hudelement( text ) { - if ( ismp() && !isdefined( level.createfx_delay_done ) ) - return; - - if ( level.fxhudelements < level.createfx_hudelements ) - { - for ( p = 0; p < 2; p++ ) - level.createfxhudelements[level.fxhudelements][p] settext( text ); - - level.fxhudelements++; - } + if ( ismp() && !isDefined( level.createfx_delay_done ) ) + { + return; + } + if ( level.fxhudelements < level.createfx_hudelements ) + { + p = 0; + while ( p < 2 ) + { + level.createfxhudelements[ level.fxhudelements ][ p ] settext( text ); + p++; + } + level.fxhudelements++; + } } buttondown( button, button2 ) { - return buttonpressed_internal( button ) || buttonpressed_internal( button2 ); + if ( !buttonpressed_internal( button ) ) + { + return buttonpressed_internal( button2 ); + } } buttonpressed_internal( button ) { - if ( !isdefined( button ) ) - return 0; - - if ( kb_locked( button ) ) - return 0; - - player = get_players()[0]; - return player buttonpressed( button ); + if ( !isDefined( button ) ) + { + return 0; + } + if ( kb_locked( button ) ) + { + return 0; + } + player = get_players()[ 0 ]; + return player buttonpressed( button ); } get_selected_move_vector() { - player = get_players()[0]; - yaw = player getplayerangles()[1]; - angles = ( 0, yaw, 0 ); - right = anglestoright( angles ); - forward = anglestoforward( angles ); - up = anglestoup( angles ); - ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); - - if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) - { - if ( level.selectedmove_forward < 0 ) - level.selectedmove_forward = 0; - - if ( ctrlheld ) - { - level.selectedmove_forward = 0.1; - wait 0.05; - } - else - level.selectedmove_forward += 1; - } - else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) - { - if ( level.selectedmove_forward > 0 ) - level.selectedmove_forward = 0; - - if ( ctrlheld ) - { - level.selectedmove_forward = -1 * 0.1; - wait 0.05; - } - else - level.selectedmove_forward -= 1; - } - else - level.selectedmove_forward = 0; - - if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) - { - if ( level.selectedmove_right < 0 ) - level.selectedmove_right = 0; - - if ( ctrlheld ) - { - level.selectedmove_right = 0.1; - wait 0.05; - } - else - level.selectedmove_right += 1; - } - else if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) - { - if ( level.selectedmove_right > 0 ) - level.selectedmove_right = 0; - - if ( ctrlheld ) - { - level.selectedmove_right = -1 * 0.1; - wait 0.05; - } - else - level.selectedmove_right -= 1; - } - else - level.selectedmove_right = 0; - - if ( buttondown( "BUTTON_Y" ) ) - { - if ( level.selectedmove_up < 0 ) - level.selectedmove_up = 0; - - if ( ctrlheld ) - { - level.selectedmove_up = 0.1; - wait 0.05; - } - else - level.selectedmove_up += 1; - } - else if ( buttondown( "BUTTON_B" ) ) - { - if ( level.selectedmove_up > 0 ) - level.selectedmove_up = 0; - - if ( ctrlheld ) - { - level.selectedmove_up = -1 * 0.1; - wait 0.05; - } - else - level.selectedmove_up -= 1; - } - else - level.selectedmove_up = 0; - - vector = ( 0, 0, 0 ); - vector += vectorscale( forward, level.selectedmove_forward ); - vector += vectorscale( right, level.selectedmove_right ); - vector += vectorscale( up, level.selectedmove_up ); - return vector; + player = get_players()[ 0 ]; + yaw = player getplayerangles()[ 1 ]; + angles = ( 0, yaw, 0 ); + right = anglesToRight( angles ); + forward = anglesToForward( angles ); + up = anglesToUp( angles ); + ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); + if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) + { + if ( level.selectedmove_forward < 0 ) + { + level.selectedmove_forward = 0; + } + if ( ctrlheld ) + { + level.selectedmove_forward = 0,1; + wait 0,05; + } + else + { + level.selectedmove_forward += 1; + } + } + else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) + { + if ( level.selectedmove_forward > 0 ) + { + level.selectedmove_forward = 0; + } + if ( ctrlheld ) + { + level.selectedmove_forward = -1 * 0,1; + wait 0,05; + } + else + { + level.selectedmove_forward -= 1; + } + } + else + { + level.selectedmove_forward = 0; + } + if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) + { + if ( level.selectedmove_right < 0 ) + { + level.selectedmove_right = 0; + } + if ( ctrlheld ) + { + level.selectedmove_right = 0,1; + wait 0,05; + } + else + { + level.selectedmove_right += 1; + } + } + else if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) + { + if ( level.selectedmove_right > 0 ) + { + level.selectedmove_right = 0; + } + if ( ctrlheld ) + { + level.selectedmove_right = -1 * 0,1; + wait 0,05; + } + else + { + level.selectedmove_right -= 1; + } + } + else + { + level.selectedmove_right = 0; + } + if ( buttondown( "BUTTON_Y" ) ) + { + if ( level.selectedmove_up < 0 ) + { + level.selectedmove_up = 0; + } + if ( ctrlheld ) + { + level.selectedmove_up = 0,1; + wait 0,05; + } + else + { + level.selectedmove_up += 1; + } + } + else if ( buttondown( "BUTTON_B" ) ) + { + if ( level.selectedmove_up > 0 ) + { + level.selectedmove_up = 0; + } + if ( ctrlheld ) + { + level.selectedmove_up = -1 * 0,1; + wait 0,05; + } + else + { + level.selectedmove_up -= 1; + } + } + else + { + level.selectedmove_up = 0; + } + vector = ( 1, 1, 1 ); + vector += vectorScale( forward, level.selectedmove_forward ); + vector += vectorScale( right, level.selectedmove_right ); + vector += vectorScale( up, level.selectedmove_up ); + return vector; } process_button_held_and_clicked() { - add_button( "mouse1" ); - add_kb_button( "shift" ); - add_kb_button( "ctrl" ); - add_button( "BUTTON_RSHLDR" ); - add_button( "BUTTON_LSHLDR" ); - add_button( "BUTTON_RSTICK" ); - add_button( "BUTTON_LSTICK" ); - add_button( "BUTTON_A" ); - add_button( "BUTTON_B" ); - add_button( "BUTTON_X" ); - add_button( "BUTTON_Y" ); - add_button( "DPAD_UP" ); - add_button( "DPAD_LEFT" ); - add_button( "DPAD_RIGHT" ); - add_button( "DPAD_DOWN" ); - add_kb_button( "escape" ); - add_button( "BUTTON_RTRIG" ); - add_button( "BUTTON_LTRIG" ); - add_kb_button( "a" ); - add_button( "F1" ); - add_button( "F5" ); - add_button( "F2" ); - add_kb_button( "c" ); - add_kb_button( "d" ); - add_kb_button( "f" ); - add_kb_button( "h" ); - add_kb_button( "i" ); - add_kb_button( "j" ); - add_kb_button( "k" ); - add_kb_button( "l" ); - add_kb_button( "m" ); - add_kb_button( "p" ); - add_kb_button( "q" ); - add_kb_button( "r" ); - add_kb_button( "s" ); - add_kb_button( "v" ); - add_kb_button( "x" ); - add_kb_button( "z" ); - add_button( "del" ); - add_kb_button( "end" ); - add_kb_button( "tab" ); - add_kb_button( "ins" ); - add_kb_button( "add" ); - add_kb_button( "space" ); - add_kb_button( "enter" ); - add_kb_button( "leftarrow" ); - add_kb_button( "rightarrow" ); - add_kb_button( "1" ); - add_kb_button( "2" ); - add_kb_button( "3" ); - add_kb_button( "4" ); - add_kb_button( "5" ); - add_kb_button( "6" ); - add_kb_button( "7" ); - add_kb_button( "8" ); - add_kb_button( "9" ); - add_kb_button( "0" ); - add_kb_button( "~" ); + add_button( "mouse1" ); + add_kb_button( "shift" ); + add_kb_button( "ctrl" ); + add_button( "BUTTON_RSHLDR" ); + add_button( "BUTTON_LSHLDR" ); + add_button( "BUTTON_RSTICK" ); + add_button( "BUTTON_LSTICK" ); + add_button( "BUTTON_A" ); + add_button( "BUTTON_B" ); + add_button( "BUTTON_X" ); + add_button( "BUTTON_Y" ); + add_button( "DPAD_UP" ); + add_button( "DPAD_LEFT" ); + add_button( "DPAD_RIGHT" ); + add_button( "DPAD_DOWN" ); + add_kb_button( "escape" ); + add_button( "BUTTON_RTRIG" ); + add_button( "BUTTON_LTRIG" ); + add_kb_button( "a" ); + add_button( "F1" ); + add_button( "F5" ); + add_button( "F2" ); + add_kb_button( "c" ); + add_kb_button( "d" ); + add_kb_button( "f" ); + add_kb_button( "h" ); + add_kb_button( "i" ); + add_kb_button( "j" ); + add_kb_button( "k" ); + add_kb_button( "l" ); + add_kb_button( "m" ); + add_kb_button( "p" ); + add_kb_button( "q" ); + add_kb_button( "r" ); + add_kb_button( "s" ); + add_kb_button( "v" ); + add_kb_button( "x" ); + add_kb_button( "z" ); + add_button( "del" ); + add_kb_button( "end" ); + add_kb_button( "tab" ); + add_kb_button( "ins" ); + add_kb_button( "add" ); + add_kb_button( "space" ); + add_kb_button( "enter" ); + add_kb_button( "leftarrow" ); + add_kb_button( "rightarrow" ); + add_kb_button( "1" ); + add_kb_button( "2" ); + add_kb_button( "3" ); + add_kb_button( "4" ); + add_kb_button( "5" ); + add_kb_button( "6" ); + add_kb_button( "7" ); + add_kb_button( "8" ); + add_kb_button( "9" ); + add_kb_button( "0" ); + add_kb_button( "~" ); } locked( name ) { - if ( isdefined( level.createfx_lockedlist[name] ) ) - return 0; - - return kb_locked( name ); + if ( isDefined( level.createfx_lockedlist[ name ] ) ) + { + return 0; + } + return kb_locked( name ); } kb_locked( name ) { - return level.createfx_inputlocked && isdefined( level.button_is_kb[name] ); + if ( level.createfx_inputlocked ) + { + return isDefined( level.button_is_kb[ name ] ); + } } add_button( name ) { - player = get_players()[0]; - - if ( locked( name ) ) - return; - - if ( !isdefined( level.buttonisheld[name] ) ) - { - if ( player buttonpressed( name ) ) - { - level.buttonisheld[name] = 1; - level.buttonclick[name] = 1; - } - } - else if ( !player buttonpressed( name ) ) - level.buttonisheld[name] = undefined; + player = get_players()[ 0 ]; + if ( locked( name ) ) + { + return; + } + if ( !isDefined( level.buttonisheld[ name ] ) ) + { + if ( player buttonpressed( name ) ) + { + level.buttonisheld[ name ] = 1; + level.buttonclick[ name ] = 1; + } + } + else + { + if ( !player buttonpressed( name ) ) + { + } + } } add_kb_button( name ) { - level.button_is_kb[name] = 1; - add_button( name ); + level.button_is_kb[ name ] = 1; + add_button( name ); } set_anglemod_move_vector() { /# - ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); - players = get_players(); - - if ( level.is_camera_on == 1 ) - { - newmovement = players[0] getnormalizedmovement(); - dolly_movement = players[0] getnormalizedcameramovement(); - - if ( newmovement[1] <= -0.3 ) - level.selectedrotate_yaw -= 1; - else if ( newmovement[1] >= 0.3 ) - level.selectedrotate_yaw += 1; - else if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) - { - if ( level.selectedrotate_yaw < 0 ) - level.selectedrotate_yaw = 0; - - level.selectedrotate_yaw += 0.1; - } - else if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) - { - if ( level.selectedrotate_yaw > 0 ) - level.selectedrotate_yaw = 0; - - level.selectedrotate_yaw -= 0.1; - } - else - level.selectedrotate_yaw = 0; - - if ( dolly_movement[0] <= -0.2 ) - level.selectedrotate_pitch += 1; - else if ( dolly_movement[0] >= 0.2 ) - level.selectedrotate_pitch -= 1; - else if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) - { - if ( level.selectedrotate_pitch < 0 ) - level.selectedrotate_pitch = 0; - - level.selectedrotate_pitch += 0.1; - } - else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) - { - if ( level.selectedrotate_pitch > 0 ) - level.selectedrotate_pitch = 0; - - level.selectedrotate_pitch -= 0.1; - } - else - level.selectedrotate_pitch = 0; - - if ( buttondown( "BUTTON_Y" ) ) - { - if ( level.selectedrotate_roll < 0 ) - level.selectedrotate_roll = 0; - - level.selectedrotate_roll += 0.1; - } - else if ( buttondown( "BUTTON_B" ) ) - { - if ( level.selectedrotate_roll > 0 ) - level.selectedrotate_roll = 0; - - level.selectedrotate_roll -= 0.1; - } - else - level.selectedrotate_roll = 0; - } - else - { - if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) - { - if ( level.selectedrotate_pitch < 0 ) - level.selectedrotate_pitch = 0; - - if ( ctrlheld ) - { - level.selectedrotate_pitch = 0.1; - wait 0.05; - } - else - level.selectedrotate_pitch += 1; - } - else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) - { - if ( level.selectedrotate_pitch > 0 ) - level.selectedrotate_pitch = 0; - - if ( ctrlheld ) - { - level.selectedrotate_pitch = -1 * 0.1; - wait 0.05; - } - else - level.selectedrotate_pitch -= 1; - } - else - level.selectedrotate_pitch = 0; - - if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) - { - if ( level.selectedrotate_yaw < 0 ) - level.selectedrotate_yaw = 0; - - if ( ctrlheld ) - { - level.selectedrotate_yaw = 0.1; - wait 0.05; - } - else - level.selectedrotate_yaw += 1; - } - else if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) - { - if ( level.selectedrotate_yaw > 0 ) - level.selectedrotate_yaw = 0; - - if ( ctrlheld ) - { - level.selectedrotate_yaw = -1 * 0.1; - wait 0.05; - } - else - level.selectedrotate_yaw -= 1; - } - else - level.selectedrotate_yaw = 0; - - if ( buttondown( "BUTTON_Y" ) ) - { - if ( level.selectedrotate_roll < 0 ) - level.selectedrotate_roll = 0; - - if ( ctrlheld ) - { - level.selectedrotate_roll = 0.1; - wait 0.05; - } - else - level.selectedrotate_roll += 1; - } - else if ( buttondown( "BUTTON_B" ) ) - { - if ( level.selectedrotate_roll > 0 ) - level.selectedrotate_roll = 0; - - if ( ctrlheld ) - { - level.selectedrotate_roll = -1 * 0.1; - wait 0.05; - } - else - level.selectedrotate_roll -= 1; - } - else - level.selectedrotate_roll = 0; - } + ctrlheld = button_is_held( "ctrl", "BUTTON_LSHLDR" ); + players = get_players(); + if ( level.is_camera_on == 1 ) + { + newmovement = players[ 0 ] getnormalizedmovement(); + dolly_movement = players[ 0 ] getnormalizedcameramovement(); + if ( newmovement[ 1 ] <= -0,3 ) + { + level.selectedrotate_yaw -= 1; + } + else if ( newmovement[ 1 ] >= 0,3 ) + { + level.selectedrotate_yaw += 1; + } + else if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) + { + if ( level.selectedrotate_yaw < 0 ) + { + level.selectedrotate_yaw = 0; + } + level.selectedrotate_yaw += 0,1; + } + else if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) + { + if ( level.selectedrotate_yaw > 0 ) + { + level.selectedrotate_yaw = 0; + } + level.selectedrotate_yaw -= 0,1; + } + else + { + level.selectedrotate_yaw = 0; + } + if ( dolly_movement[ 0 ] <= -0,2 ) + { + level.selectedrotate_pitch += 1; + } + else if ( dolly_movement[ 0 ] >= 0,2 ) + { + level.selectedrotate_pitch -= 1; + } + else if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) + { + if ( level.selectedrotate_pitch < 0 ) + { + level.selectedrotate_pitch = 0; + } + level.selectedrotate_pitch += 0,1; + } + else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) + { + if ( level.selectedrotate_pitch > 0 ) + { + level.selectedrotate_pitch = 0; + } + level.selectedrotate_pitch -= 0,1; + } + else + { + level.selectedrotate_pitch = 0; + } + if ( buttondown( "BUTTON_Y" ) ) + { + if ( level.selectedrotate_roll < 0 ) + { + level.selectedrotate_roll = 0; + } + level.selectedrotate_roll += 0,1; + } + else if ( buttondown( "BUTTON_B" ) ) + { + if ( level.selectedrotate_roll > 0 ) + { + level.selectedrotate_roll = 0; + } + level.selectedrotate_roll -= 0,1; + } + else + { + level.selectedrotate_roll = 0; + } + } + else if ( buttondown( "kp_uparrow", "DPAD_UP" ) ) + { + if ( level.selectedrotate_pitch < 0 ) + { + level.selectedrotate_pitch = 0; + } + if ( ctrlheld ) + { + level.selectedrotate_pitch = 0,1; + wait 0,05; + } + else + { + level.selectedrotate_pitch += 1; + } + } + else if ( buttondown( "kp_downarrow", "DPAD_DOWN" ) ) + { + if ( level.selectedrotate_pitch > 0 ) + { + level.selectedrotate_pitch = 0; + } + if ( ctrlheld ) + { + level.selectedrotate_pitch = -1 * 0,1; + wait 0,05; + } + else + { + level.selectedrotate_pitch -= 1; + } + } + else + { + level.selectedrotate_pitch = 0; + } + if ( buttondown( "kp_leftarrow", "DPAD_LEFT" ) ) + { + if ( level.selectedrotate_yaw < 0 ) + { + level.selectedrotate_yaw = 0; + } + if ( ctrlheld ) + { + level.selectedrotate_yaw = 0,1; + wait 0,05; + } + else + { + level.selectedrotate_yaw += 1; + } + } + else if ( buttondown( "kp_rightarrow", "DPAD_RIGHT" ) ) + { + if ( level.selectedrotate_yaw > 0 ) + { + level.selectedrotate_yaw = 0; + } + if ( ctrlheld ) + { + level.selectedrotate_yaw = -1 * 0,1; + wait 0,05; + } + else + { + level.selectedrotate_yaw -= 1; + } + } + else + { + level.selectedrotate_yaw = 0; + } + if ( buttondown( "BUTTON_Y" ) ) + { + if ( level.selectedrotate_roll < 0 ) + { + level.selectedrotate_roll = 0; + } + if ( ctrlheld ) + { + level.selectedrotate_roll = 0,1; + wait 0,05; + } + else + { + level.selectedrotate_roll += 1; + } + } + else if ( buttondown( "BUTTON_B" ) ) + { + if ( level.selectedrotate_roll > 0 ) + { + level.selectedrotate_roll = 0; + } + if ( ctrlheld ) + { + level.selectedrotate_roll = -1 * 0,1; + wait 0,05; + } + else + { + level.selectedrotate_roll -= 1; + } + } + else + { + level.selectedrotate_roll = 0; #/ + } } cfxprintln( file, string ) { /# - if ( file == -1 ) - return; - - fprintln( file, string ); + if ( file == -1 ) + { + return; + } + fprintln( file, string ); #/ } update_save_bar( number ) { - level notify( "saving_start" ); - level endon( "saving_start" ); - level.current_saving_number = 0; - - while ( level.current_saving_number < level.createfxent.size ) - { - center_text_clear(); - center_text_add( "Saving Createfx to File" ); - center_text_add( "Saving effect " + level.current_saving_number + "/" + level.createfxent.size ); - center_text_add( "Do not reset Xenon until saving is complete." ); - wait 0.05; - center_text_clear(); - } - - center_text_add( "Saving Complete." ); - center_text_add( level.createfxent.size + " effects saved to files." ); + level notify( "saving_start" ); + level endon( "saving_start" ); + level.current_saving_number = 0; + while ( level.current_saving_number < level.createfxent.size ) + { + center_text_clear(); + center_text_add( "Saving Createfx to File" ); + center_text_add( "Saving effect " + level.current_saving_number + "/" + level.createfxent.size ); + center_text_add( "Do not reset Xenon until saving is complete." ); + wait 0,05; + center_text_clear(); + } + center_text_add( "Saving Complete." ); + center_text_add( level.createfxent.size + " effects saved to files." ); } generate_fx_log( type, autosave ) { /# - autosave = isdefined( autosave ); - - if ( type == "server" ) - { - if ( !autosave ) - filename = level.cfx_server_scriptdata + level.script + "_fx.gsc"; - else - filename = level.cfx_server_scriptdata + "backup.gsc"; - - call_loop = level.cfx_server_loop; - call_oneshot = level.cfx_server_oneshot; - call_exploder = level.cfx_server_exploder; - call_loopsound = level.cfx_server_loopsound; - } - else if ( type == "client" ) - { - if ( !autosave ) - filename = level.cfx_client_scriptdata + level.script + "_fx.csc"; - else - filename = level.cfx_client_scriptdata + "backup.csc"; - - call_loop = level.cfx_client_loop; - call_oneshot = level.cfx_client_oneshot; - call_exploder = level.cfx_client_exploder; - call_loopsound = level.cfx_client_loopsound; - } - else - { - println( "^1Error: Improper type in generate_fx_log()" ); - return; - } - - file = openfile( filename, "write" ); - - if ( file == -1 ) - { - level.write_error = filename; - - if ( type == "server" ) - return 1; - else if ( type == "client" ) - return 2; - else - return 3; - } - else - { - cfxprintln( file, "//_createfx generated. Do not touch!!" ); - cfxprintln( file, "main()" ); - cfxprintln( file, "{" ); - - for ( p = 0; p < level.createfxent.size; p++ ) - { - ent = level.createfxent[p]; - origin = []; - angles = []; - - for ( i = 0; i < 3; i++ ) - { - origin[i] = ent.v["origin"][i]; - angles[i] = ent.v["angles"][i]; - - if ( origin[i] < 0.1 && origin[i] > 0.1 * -1 ) - origin[i] = 0; - - if ( angles[i] < 0.1 && angles[i] > 0.1 * -1 ) - angles[i] = 0; - } - - ent.v["origin"] = ( origin[0], origin[1], origin[2] ); - ent.v["angles"] = ( angles[0], angles[1], angles[2] ); - } - - if ( !autosave ) - println( " *** CREATING EFFECT, COPY THESE LINES TO ", level.script, "_fx.gsc *** " ); - - cfxprintln( file, "// CreateFX entities placed: " + level.createfxent.size - level.non_fx_ents ); - breather = 0; - - if ( autosave ) - breather_pause = 1; - else - breather_pause = 5; - - for ( i = 0; i < level.createfxent.size; i++ ) - { - e = level.createfxent[i]; -/# - assert( isdefined( e.v["type"] ), "effect at origin " + e.v["origin"] + " has no type" ); -#/ - if ( isdefined( e.model ) ) - continue; - - if ( e.v["fxid"] == "No FX" ) - continue; - - output_name = "\t"; - output_props = "\t"; - ent_type = e.v["type"]; - - if ( ent_type == "loopfx" ) - output_name += ( "ent = " + call_loop + "( \"" + e.v["fxid"] + "\" );" ); - - if ( ent_type == "oneshotfx" ) - output_name += ( "ent = " + call_oneshot + "( \"" + e.v["fxid"] + "\" );" ); - - if ( ent_type == "exploder" ) - output_name += ( "ent = " + call_exploder + "( \"" + e.v["fxid"] + "\" );" ); - - if ( ent_type == "soundfx" ) - output_name += ( "ent = " + call_loopsound + "();" ); - - output_props += get_fx_options( e ); - cfxprintln( file, output_name ); - cfxprintln( file, output_props ); - cfxprintln( file, "\t" ); - breather++; - - if ( breather >= breather_pause ) - { - wait 0.05; - breather = 0; - } - } - - if ( level.bscriptgened ) - { - script_gen_dump_addline( level.cfx_server_scriptgendump, level.script + "_fx" ); - [[ level.cfx_func_script_gen_dump ]](); - } - - cfxprintln( file, "}" ); - saved = closefile( file ); -/# - assert( saved == 1, "File not saved (see above message?): " + filename ); -#/ - println( "CreateFX entities placed: " + level.createfxent.size - level.non_fx_ents ); - return 0; - } + autosave = isDefined( autosave ); + if ( type == "server" ) + { + if ( !autosave ) + { + filename = level.cfx_server_scriptdata + level.script + "_fx.gsc"; + } + else + { + filename = level.cfx_server_scriptdata + "backup.gsc"; + } + call_loop = level.cfx_server_loop; + call_oneshot = level.cfx_server_oneshot; + call_exploder = level.cfx_server_exploder; + call_loopsound = level.cfx_server_loopsound; + } + else if ( type == "client" ) + { + if ( !autosave ) + { + filename = level.cfx_client_scriptdata + level.script + "_fx.csc"; + } + else + { + filename = level.cfx_client_scriptdata + "backup.csc"; + } + call_loop = level.cfx_client_loop; + call_oneshot = level.cfx_client_oneshot; + call_exploder = level.cfx_client_exploder; + call_loopsound = level.cfx_client_loopsound; + } + else + { + println( "^1Error: Improper type in generate_fx_log()" ); + return; + } + file = openfile( filename, "write" ); + if ( file == -1 ) + { + level.write_error = filename; + if ( type == "server" ) + { + return 1; + } + else + { + if ( type == "client" ) + { + return 2; + } + else + { + return 3; + } + } + } + else + { + cfxprintln( file, "//_createfx generated. Do not touch!!" ); + cfxprintln( file, "main()" ); + cfxprintln( file, "{" ); + p = 0; + while ( p < level.createfxent.size ) + { + ent = level.createfxent[ p ]; + origin = []; + angles = []; + i = 0; + while ( i < 3 ) + { + origin[ i ] = ent.v[ "origin" ][ i ]; + angles[ i ] = ent.v[ "angles" ][ i ]; + if ( origin[ i ] < 0,1 && origin[ i ] > ( 0,1 * -1 ) ) + { + origin[ i ] = 0; + } + if ( angles[ i ] < 0,1 && angles[ i ] > ( 0,1 * -1 ) ) + { + angles[ i ] = 0; + } + i++; + } + ent.v[ "origin" ] = ( origin[ 0 ], origin[ 1 ], origin[ 2 ] ); + ent.v[ "angles" ] = ( angles[ 0 ], angles[ 1 ], angles[ 2 ] ); + p++; + } + if ( !autosave ) + { + println( " *** CREATING EFFECT, COPY THESE LINES TO ", level.script, "_fx.gsc *** " ); + } + cfxprintln( file, "// CreateFX entities placed: " + ( level.createfxent.size - level.non_fx_ents ) ); + breather = 0; + if ( autosave ) + { + breather_pause = 1; + } + else + { + breather_pause = 5; + } + i = 0; + while ( i < level.createfxent.size ) + { + e = level.createfxent[ i ]; + assert( isDefined( e.v[ "type" ] ), "effect at origin " + e.v[ "origin" ] + " has no type" ); + if ( isDefined( e.model ) ) + { + i++; + continue; + } + else if ( e.v[ "fxid" ] == "No FX" ) + { + i++; + continue; + } + else + { + output_name = "\t"; + output_props = "\t"; + ent_type = e.v[ "type" ]; + if ( ent_type == "loopfx" ) + { + output_name += "ent = " + call_loop + "( "" + e.v[ "fxid" ] + "" );"; + } + if ( ent_type == "oneshotfx" ) + { + output_name += "ent = " + call_oneshot + "( "" + e.v[ "fxid" ] + "" );"; + } + if ( ent_type == "exploder" ) + { + output_name += "ent = " + call_exploder + "( "" + e.v[ "fxid" ] + "" );"; + } + if ( ent_type == "soundfx" ) + { + output_name += "ent = " + call_loopsound + "();"; + } + output_props += get_fx_options( e ); + cfxprintln( file, output_name ); + cfxprintln( file, output_props ); + cfxprintln( file, "\t" ); + breather++; + if ( breather >= breather_pause ) + { + wait 0,05; + breather = 0; + } + } + i++; + } + if ( level.bscriptgened ) + { + script_gen_dump_addline( level.cfx_server_scriptgendump, level.script + "_fx" ); + [[ level.cfx_func_script_gen_dump ]](); + } + cfxprintln( file, "}" ); + saved = closefile( file ); + assert( saved == 1, "File not saved (see above message?): " + filename ); + println( "CreateFX entities placed: " + ( level.createfxent.size - level.non_fx_ents ) ); + return 0; #/ + } } get_fx_options( ent ) { - output_props = ""; - - for ( i = 0; i < level.createfx_options.size; i++ ) - { - option = level.createfx_options[i]; - - if ( !isdefined( ent.v[option["name"]] ) ) - continue; - - if ( !mask( option["mask"], ent.v["type"] ) ) - continue; - - if ( option["type"] == "string" ) - { - if ( option["name"] == "fxid" ) - continue; - - output_props += ( "ent.v[ \"" + option["name"] + "\" ] = \"" + ent.v[option["name"]] + "\"; " ); - continue; - } - - output_props += ( "ent.v[ \"" + option["name"] + "\" ] = " + ent.v[option["name"]] + "; " ); - } - - return output_props; + output_props = ""; + i = 0; + while ( i < level.createfx_options.size ) + { + option = level.createfx_options[ i ]; + if ( !isDefined( ent.v[ option[ "name" ] ] ) ) + { + i++; + continue; + } + else if ( !mask( option[ "mask" ], ent.v[ "type" ] ) ) + { + i++; + continue; + } + else if ( option[ "type" ] == "string" ) + { + if ( option[ "name" ] == "fxid" ) + { + i++; + continue; + } + else output_props += "ent.v[ "" + option[ "name" ] + "" ] = "" + ent.v[ option[ "name" ] ] + ""; "; + i++; + continue; + } + else + { + output_props += "ent.v[ "" + option[ "name" ] + "" ] = " + ent.v[ option[ "name" ] ] + "; "; + } + i++; + } + return output_props; } entity_highlight_disable() { - self notify( "highlight change" ); - self endon( "highlight change" ); - - for (;;) - { - self.textalpha -= 0.05; - - if ( self.textalpha < 0.4 ) - break; - - wait 0.05; - } - - self.textalpha = 0.4; + self notify( "highlight change" ); + self endon( "highlight change" ); + for ( ;; ) + { + self.textalpha -= 0,05; + if ( self.textalpha < 0,4 ) + { + break; + } + else + { + wait 0,05; + } + } + self.textalpha = 0,4; } entity_highlight_enable() { - self notify( "highlight change" ); - self endon( "highlight change" ); - - for (;;) - { - self.textalpha += 0.05; - - if ( self.textalpha > 1 ) - break; - - wait 0.05; - } - - self.textalpha = 1; + self notify( "highlight change" ); + self endon( "highlight change" ); + for ( ;; ) + { + self.textalpha += 0,05; + if ( self.textalpha > 1 ) + { + break; + } + else + { + wait 0,05; + } + } + self.textalpha = 1; } get_center_of_array( array ) { - center = ( 0, 0, 0 ); - - for ( i = 0; i < array.size; i++ ) - center = ( center[0] + array[i].v["origin"][0], center[1] + array[i].v["origin"][1], center[2] + array[i].v["origin"][2] ); - - return ( center[0] / array.size, center[1] / array.size, center[2] / array.size ); + center = ( 1, 1, 1 ); + i = 0; + while ( i < array.size ) + { + center = ( center[ 0 ] + array[ i ].v[ "origin" ][ 0 ], center[ 1 ] + array[ i ].v[ "origin" ][ 1 ], center[ 2 ] + array[ i ].v[ "origin" ][ 2 ] ); + i++; + } + return ( center[ 0 ] / array.size, center[ 1 ] / array.size, center[ 2 ] / array.size ); } rotation_is_occuring() { - if ( level.selectedrotate_roll != 0 ) - return 1; - - if ( level.selectedrotate_pitch != 0 ) - return 1; - - return level.selectedrotate_yaw != 0; + if ( level.selectedrotate_roll != 0 ) + { + return 1; + } + if ( level.selectedrotate_pitch != 0 ) + { + return 1; + } + return level.selectedrotate_yaw != 0; } process_fx_rotater() { - if ( level.fx_rotating ) - return; - - set_anglemod_move_vector(); - - if ( !rotation_is_occuring() ) - return; - - level.fx_rotating = 1; - - if ( level.cfx_last_action != "rotate" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "rotate"; - } - - if ( level.selected_fx_ents.size > 1 ) - { - center = get_center_of_array( level.selected_fx_ents ); - org = spawn( "script_origin", center ); - org.v["angles"] = level.selected_fx_ents[0].v["angles"]; - org.v["origin"] = center; - rotater = []; - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - rotater[i] = spawn( "script_origin", level.selected_fx_ents[i].v["origin"] ); - rotater[i].angles = level.selected_fx_ents[i].v["angles"]; - rotater[i] linkto( org ); - } - - rotate_over_time( org, rotater ); - org delete(); - - for ( i = 0; i < rotater.size; i++ ) - rotater[i] delete(); - } - else if ( level.selected_fx_ents.size == 1 ) - { - ent = level.selected_fx_ents[0]; - rotater = spawn( "script_origin", ( 0, 0, 0 ) ); - rotater.angles = ent.v["angles"]; - - if ( level.selectedrotate_pitch != 0 ) - rotater devaddpitch( level.selectedrotate_pitch ); - else if ( level.selectedrotate_yaw != 0 ) - rotater devaddyaw( level.selectedrotate_yaw ); - else - rotater devaddroll( level.selectedrotate_roll ); - - ent.v["angles"] = rotater.angles; - rotater delete(); - wait 0.05; - } - - level.fx_rotating = 0; + if ( level.fx_rotating ) + { + return; + } + set_anglemod_move_vector(); + if ( !rotation_is_occuring() ) + { + return; + } + level.fx_rotating = 1; + if ( level.cfx_last_action != "rotate" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "rotate"; + } + if ( level.selected_fx_ents.size > 1 ) + { + center = get_center_of_array( level.selected_fx_ents ); + org = spawn( "script_origin", center ); + org.v[ "angles" ] = level.selected_fx_ents[ 0 ].v[ "angles" ]; + org.v[ "origin" ] = center; + rotater = []; + i = 0; + while ( i < level.selected_fx_ents.size ) + { + rotater[ i ] = spawn( "script_origin", level.selected_fx_ents[ i ].v[ "origin" ] ); + rotater[ i ].angles = level.selected_fx_ents[ i ].v[ "angles" ]; + rotater[ i ] linkto( org ); + i++; + } + rotate_over_time( org, rotater ); + org delete(); + i = 0; + while ( i < rotater.size ) + { + rotater[ i ] delete(); + i++; + } + } + else if ( level.selected_fx_ents.size == 1 ) + { + ent = level.selected_fx_ents[ 0 ]; + rotater = spawn( "script_origin", ( 1, 1, 1 ) ); + rotater.angles = ent.v[ "angles" ]; + if ( level.selectedrotate_pitch != 0 ) + { + rotater devaddpitch( level.selectedrotate_pitch ); + } + else if ( level.selectedrotate_yaw != 0 ) + { + rotater devaddyaw( level.selectedrotate_yaw ); + } + else + { + rotater devaddroll( level.selectedrotate_roll ); + } + ent.v[ "angles" ] = rotater.angles; + rotater delete(); + wait 0,05; + } + level.fx_rotating = 0; } rotate_over_time( org, rotater ) { - level endon( "new_ent_selection" ); - - for ( p = 0; p < 2; p++ ) - { - if ( level.selectedrotate_pitch != 0 ) - org devaddpitch( level.selectedrotate_pitch ); - else if ( level.selectedrotate_yaw != 0 ) - org devaddyaw( level.selectedrotate_yaw ); - else - org devaddroll( level.selectedrotate_roll ); - - wait 0.05; - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - - if ( isdefined( ent.model ) ) - continue; - - ent.v["origin"] = rotater[i].origin; - ent.v["angles"] = rotater[i].angles; - } - } + level endon( "new_ent_selection" ); + p = 0; + while ( p < 2 ) + { + if ( level.selectedrotate_pitch != 0 ) + { + org devaddpitch( level.selectedrotate_pitch ); + } + else if ( level.selectedrotate_yaw != 0 ) + { + org devaddyaw( level.selectedrotate_yaw ); + } + else + { + org devaddroll( level.selectedrotate_roll ); + } + wait 0,05; + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + if ( isDefined( ent.model ) ) + { + i++; + continue; + } + else + { + ent.v[ "origin" ] = rotater[ i ].origin; + ent.v[ "angles" ] = rotater[ i ].angles; + } + i++; + } + p++; + } } delete_pressed() { - if ( level.createfx_inputlocked ) - { - remove_selected_option(); - return; - } - - delete_selection(); + if ( level.createfx_inputlocked ) + { + remove_selected_option(); + return; + } + delete_selection(); } remove_selected_option() { - if ( !isdefined( level.selected_fx_option_index ) ) - return; - - name = level.createfx_options[level.selected_fx_option_index]["name"]; - - for ( i = 0; i < level.createfxent.size; i++ ) - { - ent = level.createfxent[i]; - - if ( !ent_is_selected( ent ) ) - continue; - - ent remove_option( name ); - } - - update_selected_entities(); - clear_settable_fx(); + if ( !isDefined( level.selected_fx_option_index ) ) + { + return; + } + name = level.createfx_options[ level.selected_fx_option_index ][ "name" ]; + i = 0; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + if ( !ent_is_selected( ent ) ) + { + i++; + continue; + } + else + { + ent remove_option( name ); + } + i++; + } + update_selected_entities(); + clear_settable_fx(); } remove_option( name ) { - self.v[name] = undefined; } delete_selection() { - newarray = []; - - if ( level.selected_fx_ents.size < 1 ) - return; - - store_undo_state( "delete", level.selected_fx_ents ); - level.cfx_last_action = "none"; - - for ( i = 0; i < level.createfxent.size; i++ ) - { - ent = level.createfxent[i]; - - if ( ent_is_selected( ent ) ) - { - if ( isdefined( ent.looper ) ) - ent.looper delete(); - - level.fx_highlightedent = undefined; - ent notify( "stop_loop" ); - continue; - } - - newarray[newarray.size] = ent; - } - - level.createfxent = newarray; - level.selected_fx = []; - level.selected_fx_ents = []; - clear_fx_hudelements(); + newarray = []; + if ( level.selected_fx_ents.size < 1 ) + { + return; + } + store_undo_state( "delete", level.selected_fx_ents ); + level.cfx_last_action = "none"; + i = 0; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + if ( ent_is_selected( ent ) ) + { + if ( isDefined( ent.looper ) ) + { + ent.looper delete(); + } + level.fx_highlightedent = undefined; + ent notify( "stop_loop" ); + i++; + continue; + } + else + { + newarray[ newarray.size ] = ent; + } + i++; + } + level.createfxent = newarray; + level.selected_fx = []; + level.selected_fx_ents = []; + clear_fx_hudelements(); } move_selection_to_cursor( skip_undo ) { - origin = level.createfxcursor["position"]; - - if ( level.selected_fx_ents.size <= 0 ) - return; - - if ( !isdefined( skip_undo ) && level.cfx_last_action != "move_to_cursor" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "move_to_cursor"; - } - - center = get_center_of_array( level.selected_fx_ents ); - difference = center - origin; - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - - if ( isdefined( ent.model ) ) - continue; - - ent.v["origin"] -= difference; - } + origin = level.createfxcursor[ "position" ]; + if ( level.selected_fx_ents.size <= 0 ) + { + return; + } + if ( !isDefined( skip_undo ) && level.cfx_last_action != "move_to_cursor" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "move_to_cursor"; + } + center = get_center_of_array( level.selected_fx_ents ); + difference = center - origin; + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + if ( isDefined( ent.model ) ) + { + i++; + continue; + } + else + { + ent.v[ "origin" ] -= difference; + } + i++; + } } insert_effect() { - setmenu( "creation" ); - level.effect_list_offset = 0; - clear_fx_hudelements(); - set_fx_hudelement( "Pick effect type to create:" ); - set_fx_hudelement( "1. One Shot fx" ); - set_fx_hudelement( "2. Looping fx" ); - set_fx_hudelement( "3. Exploder" ); - set_fx_hudelement( "4. Looping sound" ); - set_fx_hudelement( "(c) Cancel" ); - set_fx_hudelement( "(x) Exit" ); + setmenu( "creation" ); + level.effect_list_offset = 0; + clear_fx_hudelements(); + set_fx_hudelement( "Pick effect type to create:" ); + set_fx_hudelement( "1. One Shot fx" ); + set_fx_hudelement( "2. Looping fx" ); + set_fx_hudelement( "3. Exploder" ); + set_fx_hudelement( "4. Looping sound" ); + set_fx_hudelement( "(c) Cancel" ); + set_fx_hudelement( "(x) Exit" ); } show_help() { - clear_fx_hudelements(); - set_fx_hudelement( "Help:" ); - set_fx_hudelement( "I Insert effect" ); - set_fx_hudelement( "Shift + D Delete selected effects" ); - set_fx_hudelement( "F + 5 Save" ); - set_fx_hudelement( "A button Toggle the selection of the current effect" ); - set_fx_hudelement( "X button Toggle effect rotation mode" ); - set_fx_hudelement( "Y button Move selected effects up or rotate X axis" ); - set_fx_hudelement( "B button Move selected effects down or rotate X axis" ); - set_fx_hudelement( "D-pad Up/Down Move selected effects Forward/Backward or rotate Y axis" ); - set_fx_hudelement( "D-pad Left/Right Move selected effects Left/Right or rotate Z axis" ); - set_fx_hudelement( "R Shoulder Move selected effects to the cursor" ); - set_fx_hudelement( "L Shoulder Hold to select multiple effects" ); - set_fx_hudelement( "Right Arrow Next page in options menu" ); - set_fx_hudelement( "Left Arrow Previous page in options menu" ); - set_fx_hudelement( "A Add option to the selected effects" ); - set_fx_hudelement( "X Exit effect options menu" ); - set_fx_hudelement( "Shift + D Drop selected effects to the ground" ); - set_fx_hudelement( "R Reset the rotation of the selected effects" ); - set_fx_hudelement( "L Stick Copy effects" ); - set_fx_hudelement( "R Stick Paste effects" ); - set_fx_hudelement( "V Copy the angles from the most recently selected fx onto all selected fx." ); - set_fx_hudelement( "F + 2 Toggle CreateFX dot and menu drawing" ); - set_fx_hudelement( "U UFO" ); - set_fx_hudelement( "N Noclip" ); - set_fx_hudelement( "R Trig + L Trig Jump forward 8000 units" ); - set_fx_hudelement( "T Toggle Timescale FAST" ); - set_fx_hudelement( "Y Toggle Timescale SLOW" ); - set_fx_hudelement( "H Toggle FX Visibility" ); - set_fx_hudelement( "W Toggle effect wireframe" ); - set_fx_hudelement( "P Toggle FX Profile" ); + clear_fx_hudelements(); + set_fx_hudelement( "Help:" ); + set_fx_hudelement( "I Insert effect" ); + set_fx_hudelement( "Shift + D Delete selected effects" ); + set_fx_hudelement( "F + 5 Save" ); + set_fx_hudelement( "A button Toggle the selection of the current effect" ); + set_fx_hudelement( "X button Toggle effect rotation mode" ); + set_fx_hudelement( "Y button Move selected effects up or rotate X axis" ); + set_fx_hudelement( "B button Move selected effects down or rotate X axis" ); + set_fx_hudelement( "D-pad Up/Down Move selected effects Forward/Backward or rotate Y axis" ); + set_fx_hudelement( "D-pad Left/Right Move selected effects Left/Right or rotate Z axis" ); + set_fx_hudelement( "R Shoulder Move selected effects to the cursor" ); + set_fx_hudelement( "L Shoulder Hold to select multiple effects" ); + set_fx_hudelement( "Right Arrow Next page in options menu" ); + set_fx_hudelement( "Left Arrow Previous page in options menu" ); + set_fx_hudelement( "A Add option to the selected effects" ); + set_fx_hudelement( "X Exit effect options menu" ); + set_fx_hudelement( "Shift + D Drop selected effects to the ground" ); + set_fx_hudelement( "R Reset the rotation of the selected effects" ); + set_fx_hudelement( "L Stick Copy effects" ); + set_fx_hudelement( "R Stick Paste effects" ); + set_fx_hudelement( "V Copy the angles from the most recently selected fx onto all selected fx." ); + set_fx_hudelement( "F + 2 Toggle CreateFX dot and menu drawing" ); + set_fx_hudelement( "U UFO" ); + set_fx_hudelement( "N Noclip" ); + set_fx_hudelement( "R Trig + L Trig Jump forward 8000 units" ); + set_fx_hudelement( "T Toggle Timescale FAST" ); + set_fx_hudelement( "Y Toggle Timescale SLOW" ); + set_fx_hudelement( "H Toggle FX Visibility" ); + set_fx_hudelement( "W Toggle effect wireframe" ); + set_fx_hudelement( "P Toggle FX Profile" ); } center_text_init() { - level.cfx_center_text = []; - level.cfx_center_text_index = 0; - level.cfx_center_text_max = 3; - new_array = []; - - for ( p = 0; p < level.cfx_center_text_max; p++ ) - { - center_hud = newdebughudelem(); - center_hud settext( " " ); - center_hud.horzalign = "center"; - center_hud.vertalign = "middle"; - center_hud.alignx = "center"; - center_hud.aligny = "middle"; - center_hud.foreground = 1; - center_hud.fontscale = 1.1; - center_hud.sort = 21; - center_hud.alpha = 1; - center_hud.color = ( 1, 0, 0 ); - center_hud.y = p * 25; - new_array[p] = center_hud; - } - - level.cfx_center_text = new_array; + level.cfx_center_text = []; + level.cfx_center_text_index = 0; + level.cfx_center_text_max = 3; + new_array = []; + p = 0; + while ( p < level.cfx_center_text_max ) + { + center_hud = newdebughudelem(); + center_hud settext( " " ); + center_hud.horzalign = "center"; + center_hud.vertalign = "middle"; + center_hud.alignx = "center"; + center_hud.aligny = "middle"; + center_hud.foreground = 1; + center_hud.fontscale = 1,1; + center_hud.sort = 21; + center_hud.alpha = 1; + center_hud.color = ( 1, 1, 1 ); + center_hud.y = p * 25; + new_array[ p ] = center_hud; + p++; + } + level.cfx_center_text = new_array; } center_text_add( text ) { - if ( isdefined( text ) && isdefined( level.cfx_center_text ) ) - { - level.cfx_center_text[level.cfx_center_text_index] settext( text ); - level.cfx_center_text_index++; - - if ( level.cfx_center_text_index >= level.cfx_center_text_max ) - level.cfx_center_text_index = level.cfx_center_text_max - 1; - } + if ( isDefined( text ) && isDefined( level.cfx_center_text ) ) + { + level.cfx_center_text[ level.cfx_center_text_index ] settext( text ); + level.cfx_center_text_index++; + if ( level.cfx_center_text_index >= level.cfx_center_text_max ) + { + level.cfx_center_text_index = level.cfx_center_text_max - 1; + } + } } center_text_clear() { - for ( p = 0; p < level.cfx_center_text_max; p++ ) - level.cfx_center_text[p] settext( " " ); - - level.cfx_center_text_index = 0; + p = 0; + while ( p < level.cfx_center_text_max ) + { + level.cfx_center_text[ p ] settext( " " ); + p++; + } + level.cfx_center_text_index = 0; } write_error_msg( filename ) { - level notify( "write_error" ); - level endon( "write_error" ); - - if ( isdefined( filename ) ) - { - center_text_clear(); - center_text_add( "File " + filename + " is not writeable." ); - center_text_add( "If it's checked out, restart your computer!" ); - center_text_add( "Hold the A Button to dismiss." ); - - for (;;) - { - player = get_players()[0]; - - if ( player buttonpressed( "BUTTON_A" ) ) - { - center_text_clear(); - level.write_error = ""; - break; - } - - wait 0.25; - } - } + level notify( "write_error" ); + level endon( "write_error" ); + while ( isDefined( filename ) ) + { + center_text_clear(); + center_text_add( "File " + filename + " is not writeable." ); + center_text_add( "If it's checked out, restart your computer!" ); + center_text_add( "Hold the A Button to dismiss." ); + for ( ;; ) + { + player = get_players()[ 0 ]; + if ( player buttonpressed( "BUTTON_A" ) ) + { + center_text_clear(); + level.write_error = ""; + return; + } + else + { + wait 0,25; + } + } + } } select_last_entity( skip_undo ) { - select_entity( level.createfxent.size - 1, level.createfxent[level.createfxent.size - 1], skip_undo ); + select_entity( level.createfxent.size - 1, level.createfxent[ level.createfxent.size - 1 ], skip_undo ); } post_entity_creation_function() { - self.textalpha = 0; - self.drawn = 1; + self.textalpha = 0; + self.drawn = 1; } copy_ents() { - if ( level.selected_fx_ents.size <= 0 ) - return; - - array = []; - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - newent = spawnstruct(); - newent.v = ent.v; - newent post_entity_creation_function(); - array[array.size] = newent; - } - - level.stored_ents = array; + if ( level.selected_fx_ents.size <= 0 ) + { + return; + } + array = []; + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + newent = spawnstruct(); + newent.v = ent.v; + newent post_entity_creation_function(); + array[ array.size ] = newent; + i++; + } + level.stored_ents = array; } paste_ents() { - delay_min = getdvarint( "createfx_oneshot_min_delay" ); - delay_max = getdvarint( "createfx_oneshot_max_delay" ); - - if ( delay_min > delay_max ) - { - temp = delay_min; - delay_min = delay_max; - delay_max = temp; - } - - if ( !isdefined( level.stored_ents ) ) - return; - - clear_entity_selection(); - - if ( level.cfx_last_action != "none" ) - store_undo_state( "edit", level.selected_fx_ents ); - - level.cfx_last_action = "none"; - - for ( i = 0; i < level.stored_ents.size; i++ ) - { - level.stored_ents[i].uniqueid = level.cfx_uniqueid; - level.cfx_uniqueid++; - - if ( level.stored_ents[i].v["type"] == "oneshotfx" ) - level.stored_ents[i].v["delay"] = randomintrange( delay_min, delay_max ); - - add_and_select_entity( level.stored_ents[i], "skip_undo" ); - } - - move_selection_to_cursor( "skip_undo" ); - update_selected_entities(); - store_undo_state( "add", level.stored_ents ); - level.stored_ents = []; - copy_ents(); + delay_min = getDvarInt( "createfx_oneshot_min_delay" ); + delay_max = getDvarInt( "createfx_oneshot_max_delay" ); + if ( delay_min > delay_max ) + { + temp = delay_min; + delay_min = delay_max; + delay_max = temp; + } + if ( !isDefined( level.stored_ents ) ) + { + return; + } + clear_entity_selection(); + if ( level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + } + level.cfx_last_action = "none"; + i = 0; + while ( i < level.stored_ents.size ) + { + level.stored_ents[ i ].uniqueid = level.cfx_uniqueid; + level.cfx_uniqueid++; + if ( level.stored_ents[ i ].v[ "type" ] == "oneshotfx" ) + { + level.stored_ents[ i ].v[ "delay" ] = randomintrange( delay_min, delay_max ); + } + add_and_select_entity( level.stored_ents[ i ], "skip_undo" ); + i++; + } + move_selection_to_cursor( "skip_undo" ); + update_selected_entities(); + store_undo_state( "add", level.stored_ents ); + level.stored_ents = []; + copy_ents(); } paste_ents_onto_ents() { - if ( !isdefined( level.stored_ents ) || !isdefined( level.selected_fx_ents ) ) - return; - - if ( level.stored_ents.size < 1 || level.selected_fx_ents.size < 1 ) - return; - - if ( level.stored_ents.size != level.selected_fx_ents.size ) - { + if ( !isDefined( level.stored_ents ) || !isDefined( level.selected_fx_ents ) ) + { + return; + } + if ( level.stored_ents.size < 1 || level.selected_fx_ents.size < 1 ) + { + return; + } + if ( level.stored_ents.size != level.selected_fx_ents.size ) + { /# - println( "^2CreateFX: Number of source ents must match the number of destination ents for Paste Into to work." ); + println( "^2CreateFX: Number of source ents must match the number of destination ents for Paste Into to work." ); #/ - return; - } - - if ( level.cfx_last_action != "none" ) - store_undo_state( "edit", level.selected_fx_ents ); - - level.cfx_last_action = "none"; - selected_ents_temp = level.selected_fx_ents; - - for ( i = 0; i < level.stored_ents.size; i++ ) - { - source_ent = level.stored_ents[i]; - target_ent = level.selected_fx_ents[i]; - source_ent.uniqueid = level.cfx_uniqueid; - level.cfx_uniqueid++; - source_ent.v["angles"] = target_ent.v["angles"]; - source_ent.v["origin"] = target_ent.v["origin"]; - add_and_select_entity( source_ent, "skip_undo" ); - } - - for ( i = 0; i < selected_ents_temp.size; i++ ) - deselect_entity( selected_ents_temp[i].last_fx_index, selected_ents_temp[i] ); - - update_selected_entities(); - store_undo_state( "add", level.stored_ents ); - level.stored_ents = []; - copy_ents(); + return; + } + if ( level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + } + level.cfx_last_action = "none"; + selected_ents_temp = level.selected_fx_ents; + i = 0; + while ( i < level.stored_ents.size ) + { + source_ent = level.stored_ents[ i ]; + target_ent = level.selected_fx_ents[ i ]; + source_ent.uniqueid = level.cfx_uniqueid; + level.cfx_uniqueid++; + source_ent.v[ "angles" ] = target_ent.v[ "angles" ]; + source_ent.v[ "origin" ] = target_ent.v[ "origin" ]; + add_and_select_entity( source_ent, "skip_undo" ); + i++; + } + i = 0; + while ( i < selected_ents_temp.size ) + { + deselect_entity( selected_ents_temp[ i ].last_fx_index, selected_ents_temp[ i ] ); + i++; + } + update_selected_entities(); + store_undo_state( "add", level.stored_ents ); + level.stored_ents = []; + copy_ents(); } add_and_select_entity( ent, skip_undo ) { - level.createfxent[level.createfxent.size] = ent; - select_last_entity( skip_undo ); + level.createfxent[ level.createfxent.size ] = ent; + select_last_entity( skip_undo ); } stop_fx_looper() { - if ( isdefined( self.looper ) ) - self.looper delete(); - - self [[ level.cfx_func_stop_loopsound ]](); + if ( isDefined( self.looper ) ) + { + self.looper delete(); + } + self [[ level.cfx_func_stop_loopsound ]](); } restart_fx_looper() { - stop_fx_looper(); - self set_forward_and_up_vectors(); - - if ( self.v["type"] == "loopfx" ) - self [[ level.cfx_func_create_looper ]](); - - if ( self.v["type"] == "oneshotfx" ) - self [[ level.cfx_func_create_triggerfx ]](); - - if ( self.v["type"] == "soundfx" ) - self [[ level.cfx_func_create_loopsound ]](); + stop_fx_looper(); + self set_forward_and_up_vectors(); + if ( self.v[ "type" ] == "loopfx" ) + { + self [[ level.cfx_func_create_looper ]](); + } + if ( self.v[ "type" ] == "oneshotfx" ) + { + self [[ level.cfx_func_create_triggerfx ]](); + } + if ( self.v[ "type" ] == "soundfx" ) + { + self [[ level.cfx_func_create_loopsound ]](); + } } update_selected_entities() { - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - ent restart_fx_looper(); - } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + ent restart_fx_looper(); + i++; + } } copy_angles_of_selected_ents() { - level notify( "new_ent_selection" ); - - if ( level.cfx_last_action != "copy_angles" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "copy_angles"; - } - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - ent.v["angles"] = level.selected_fx_ents[level.selected_fx_ents.size - 1].v["angles"]; - ent set_forward_and_up_vectors(); - } - - update_selected_entities(); + level notify( "new_ent_selection" ); + if ( level.cfx_last_action != "copy_angles" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "copy_angles"; + } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + ent.v[ "angles" ] = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ].v[ "angles" ]; + ent set_forward_and_up_vectors(); + i++; + } + update_selected_entities(); } reset_axis_of_selected_ents() { - level notify( "new_ent_selection" ); - - if ( level.cfx_last_action != "reset_axis" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "reset_axis"; - } - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - ent.v["angles"] = ( 0, 0, 0 ); - ent set_forward_and_up_vectors(); - } - - update_selected_entities(); + level notify( "new_ent_selection" ); + if ( level.cfx_last_action != "reset_axis" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "reset_axis"; + } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + ent.v[ "angles" ] = ( 1, 1, 1 ); + ent set_forward_and_up_vectors(); + i++; + } + update_selected_entities(); } last_selected_entity_has_changed( lastselectentity ) { - if ( isdefined( lastselectentity ) ) - { - if ( !entities_are_selected() ) - return 1; - } - else - return entities_are_selected(); - - return lastselectentity != level.selected_fx_ents[level.selected_fx_ents.size - 1]; + if ( isDefined( lastselectentity ) ) + { + if ( !entities_are_selected() ) + { + return 1; + } + } + else + { + return entities_are_selected(); + } + return lastselectentity != level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; } createfx_showorigin( id, org, delay, org2, type, exploder, id2, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout ) { - } drop_selection_to_ground() { - if ( level.cfx_last_action != "drop_to_ground" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "drop_to_ground"; - } - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - trace = bullettrace( ent.v["origin"], ent.v["origin"] + vectorscale( ( 0, 0, -1 ), 2048.0 ), 0, undefined ); - ent.v["origin"] = trace["position"]; - } + if ( level.cfx_last_action != "drop_to_ground" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "drop_to_ground"; + } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + trace = bullettrace( ent.v[ "origin" ], ent.v[ "origin" ] + vectorScale( ( 1, 1, 1 ), 2048 ), 0, undefined ); + ent.v[ "origin" ] = trace[ "position" ]; + i++; + } } set_off_exploders() { - level notify( "createfx_exploder_reset" ); - exploders = []; - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - - if ( isdefined( ent.v["exploder"] ) ) - exploders[ent.v["exploder"]] = 1; - } - - keys = getarraykeys( exploders ); - - for ( i = 0; i < keys.size; i++ ) - exploder( keys[i] ); + level notify( "createfx_exploder_reset" ); + exploders = []; + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + if ( isDefined( ent.v[ "exploder" ] ) ) + { + exploders[ ent.v[ "exploder" ] ] = 1; + } + i++; + } + keys = getarraykeys( exploders ); + i = 0; + while ( i < keys.size ) + { + exploder( keys[ i ] ); + i++; + } } turn_off_exploders() { - level notify( "createfx_exploder_reset" ); - exploders = []; - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - - if ( isdefined( ent.v["exploder"] ) ) - exploders[ent.v["exploder"]] = 1; - } - - keys = getarraykeys( exploders ); - - for ( i = 0; i < keys.size; i++ ) - stop_exploder( keys[i] ); + level notify( "createfx_exploder_reset" ); + exploders = []; + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + if ( isDefined( ent.v[ "exploder" ] ) ) + { + exploders[ ent.v[ "exploder" ] ] = 1; + } + i++; + } + keys = getarraykeys( exploders ); + i = 0; + while ( i < keys.size ) + { + stop_exploder( keys[ i ] ); + i++; + } } draw_distance() { - count = 0; - last_pos = ( 0, 0, 0 ); - - if ( getdvarint( "createfx_drawdist" ) == 0 ) - setdvar( "createfx_drawdist", "1500" ); - - player = get_players()[0]; - - for (;;) - { - maxdist = getdvarint( "createfx_drawdist" ); - maxdistsqr = maxdist * maxdist; + count = 0; + last_pos = ( 1, 1, 1 ); + if ( getDvarInt( "createfx_drawdist" ) == 0 ) + { + setdvar( "createfx_drawdist", "1500" ); + } + player = get_players()[ 0 ]; + for ( ;; ) + { + maxdist = getDvarInt( "createfx_drawdist" ); + maxdistsqr = maxdist * maxdist; /# - if ( flag( "createfx_saving" ) ) - println( "Waiting for createfx to save..." ); + if ( flag( "createfx_saving" ) ) + { + println( "Waiting for createfx to save..." ); #/ - flag_waitopen( "createfx_saving" ); - - for ( i = 0; i < level.createfxent.size; i++ ) - { - ent = level.createfxent[i]; - - if ( ent_is_selected( ent ) ) - ent.drawn = 1; - else - ent.drawn = distancesquared( player.origin, ent.v["origin"] ) <= maxdistsqr; - - count++; - - if ( count > 50 ) - { - count = 0; - wait 0.05; - } - } - - wait 0.1; - - while ( distancesquared( player.origin, last_pos ) < 2500 ) - wait 0.1; - - last_pos = player.origin; - } + } + flag_waitopen( "createfx_saving" ); + i = 0; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + if ( ent_is_selected( ent ) ) + { + ent.drawn = 1; + count++; + continue; + } + else + { + ent.drawn = distancesquared( player.origin, ent.v[ "origin" ] ) <= maxdistsqr; + } + count++; + if ( count > 50 ) + { + count = 0; + wait 0,05; + } + i++; + } + wait 0,1; + while ( distancesquared( player.origin, last_pos ) < 2500 ) + { + wait 0,1; + } + last_pos = player.origin; + } } createfx_save( autosave ) { - flag_waitopen( "createfx_saving" ); - flag_set( "createfx_saving" ); - resettimeout(); - - if ( isdefined( autosave ) ) - savemode = "AUTOSAVE"; - else - savemode = "USER SAVE"; - - type = "server"; - old_time = gettime(); + flag_waitopen( "createfx_saving" ); + flag_set( "createfx_saving" ); + resettimeout(); + if ( isDefined( autosave ) ) + { + savemode = "AUTOSAVE"; + } + else + { + savemode = "USER SAVE"; + } + type = "server"; + old_time = getTime(); /# - println( "\n^3#### CREATEFX SERVER " + savemode + " BEGIN ####" ); + println( "\n^3#### CREATEFX SERVER " + savemode + " BEGIN ####" ); #/ - file_error = generate_fx_log( type, autosave ); + file_error = generate_fx_log( type, autosave ); /# - println( "^3#### CREATEFX SERVER " + savemode + " END (Time: " + ( gettime() - old_time ) * 0.001 + " seconds)####" ); + println( ( "^3#### CREATEFX SERVER " + savemode + " END (Time: " ) + ( ( getTime() - old_time ) * 0,001 ) + " seconds)####" ); #/ - if ( file_error ) - { + if ( file_error ) + { /# - println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); + println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); #/ - createfx_emergency_backup(); - } - else - { - if ( level.clientscripts && !isdefined( autosave ) ) - { - old_time = gettime(); + createfx_emergency_backup(); + } + else + { + if ( level.clientscripts && !isDefined( autosave ) ) + { + old_time = getTime(); /# - println( "\n^3#### CREATEFX CLIENT " + savemode + " BEGIN ####" ); + println( "\n^3#### CREATEFX CLIENT " + savemode + " BEGIN ####" ); #/ - file_error = generate_fx_log( "client" ); + file_error = generate_fx_log( "client" ); /# - println( "^3#### CREATEFX CLIENT " + savemode + " END (Time: " + ( gettime() - old_time ) * 0.001 + " seconds)####" ); + println( ( "^3#### CREATEFX CLIENT " + savemode + " END (Time: " ) + ( ( getTime() - old_time ) * 0,001 ) + " seconds)####" ); #/ - if ( file_error ) - { + if ( file_error ) + { /# - iprintln( "CreateFX clientscript file is not writeable! Aborting save." ); + iprintln( "CreateFX clientscript file is not writeable! Aborting save." ); #/ /# - println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); + println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); #/ - return; - } - } - - flag_clear( "createfx_saving" ); - } + return; + } + } + flag_clear( "createfx_saving" ); + } } createfx_autosave() { - for (;;) - { - wait_time = getdvarint( "createfx_autosave_time" ); - - if ( wait_time < 120 || isstring( wait_time ) ) - wait_time = 120; - - wait( wait_time ); - - if ( !flag( "createfx_saving" ) ) - createfx_save( 1 ); - } + for ( ;; ) + { + wait_time = getDvarInt( "createfx_autosave_time" ); + if ( wait_time < 120 || isstring( wait_time ) ) + { + wait_time = 120; + } + wait wait_time; + if ( !flag( "createfx_saving" ) ) + { + createfx_save( 1 ); + } + } } createfx_emergency_backup() { /# - println( "^5#### CREATEFX EMERGENCY BACKUP BEGIN ####" ); + println( "^5#### CREATEFX EMERGENCY BACKUP BEGIN ####" ); #/ - file_error = generate_fx_log( "server", 1 ); - - if ( file_error ) - { + file_error = generate_fx_log( "server", 1 ); + if ( file_error ) + { /# - iprintln( "Error saving to backup.gsc. All is lost!" ); + iprintln( "Error saving to backup.gsc. All is lost!" ); #/ - } - else - { + } + else + { /# - println( "^5#### CREATEFX EMERGENCY BACKUP END ####" ); + println( "^5#### CREATEFX EMERGENCY BACKUP END ####" ); #/ - } - - flag_clear( "createfx_saving" ); + } + flag_clear( "createfx_saving" ); } move_player_around_map_fast() { - player = get_players()[0]; - direction = player getplayerangles(); - direction_vec = anglestoforward( direction ); - eye = player geteye(); - trace = bullettrace( eye, eye + vectorscale( direction_vec, 20000 ), 0, undefined ); - dist = distance( eye, trace["position"] ); - position = eye + vectorscale( direction_vec, dist - 64 ); - player setorigin( position ); + player = get_players()[ 0 ]; + direction = player getplayerangles(); + direction_vec = anglesToForward( direction ); + eye = player geteye(); + trace = bullettrace( eye, eye + vectorScale( direction_vec, 20000 ), 0, undefined ); + dist = distance( eye, trace[ "position" ] ); + position = eye + vectorScale( direction_vec, dist - 64 ); + player setorigin( position ); } move_player_to_next_same_effect( forward_search, lastselectentity ) { - player = get_players()[0]; - direction = player getplayerangles(); - direction_vec = anglestoforward( direction ); - - if ( !isdefined( forward_search ) ) - forward_search = 1; - - ent = level.selected_fx_ents[level.selected_fx_ents.size - 1]; - start_index = 0; - - if ( level.selected_fx_ents.size <= 0 ) - { - if ( forward_search ) - ent = level.cfx_next_ent; - else - ent = level.cfx_previous_ent; - - if ( isdefined( ent ) ) - { - index = get_ent_index( ent ); - - if ( index >= 0 ) - { - select_entity( index, ent ); - position = ent.v["origin"] - vectorscale( direction_vec, 175 ); - player setorigin( position ); - level.cfx_previous_ent = ent; - level.cfx_next_ent = get_next_ent_with_same_id( index, ent.v["fxid"] ); - } - else if ( forward_search ) - level.cfx_next_ent = undefined; - else - level.cfx_previous_ent = undefined; - } - - return; - } - - if ( level.selected_fx_ents.size == 1 ) - { - for ( i = 0; i < level.createfxent.size; i++ ) - { - if ( isdefined( level.selected_fx[i] ) ) - { - start_index = i; - deselect_entity( i, ent ); - break; - } - } - - if ( forward_search ) - { - level.cfx_previous_ent = ent; - ent = get_next_ent_with_same_id( i, ent.v["fxid"] ); - select_entity( level.ent_found_index, ent ); - position = ent.v["origin"] - vectorscale( direction_vec, 175 ); - player setorigin( position ); - level.cfx_next_ent = get_next_ent_with_same_id( level.ent_found_index, ent.v["fxid"] ); - return; - } - else - { - level.cfx_next_ent = ent; - ent = get_previous_ent_with_same_id( i, ent.v["fxid"] ); - select_entity( level.ent_found_index, ent ); - position = ent.v["origin"] - vectorscale( direction_vec, 175 ); - player setorigin( position ); - level.cfx_previous_ent = get_previous_ent_with_same_id( level.ent_found_index, ent.v["fxid"] ); - return; - } - } - else - { - if ( isdefined( level.last_ent_moved_to ) && !last_selected_entity_has_changed( lastselectentity ) ) - ent = level.last_ent_moved_to; - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - if ( ent == level.selected_fx_ents[i] ) - break; - } - - if ( forward_search ) - { - if ( i < level.selected_fx_ents.size - 1 ) - { - i++; - ent = level.selected_fx_ents[i]; - } - else - ent = level.selected_fx_ents[0]; - } - else if ( i > 0 ) - ent = level.selected_fx_ents[i - 1]; - else - ent = level.selected_fx_ents[level.selected_fx_ents.size - 1]; - - level.last_ent_moved_to = ent; - position = ent.v["origin"] - vectorscale( direction_vec, 175 ); - player setorigin( position ); - } + player = get_players()[ 0 ]; + direction = player getplayerangles(); + direction_vec = anglesToForward( direction ); + if ( !isDefined( forward_search ) ) + { + forward_search = 1; + } + ent = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; + start_index = 0; + if ( level.selected_fx_ents.size <= 0 ) + { + if ( forward_search ) + { + ent = level.cfx_next_ent; + } + else + { + ent = level.cfx_previous_ent; + } + if ( isDefined( ent ) ) + { + index = get_ent_index( ent ); + if ( index >= 0 ) + { + select_entity( index, ent ); + position = ent.v[ "origin" ] - vectorScale( direction_vec, 175 ); + player setorigin( position ); + level.cfx_previous_ent = ent; + level.cfx_next_ent = get_next_ent_with_same_id( index, ent.v[ "fxid" ] ); + } + else if ( forward_search ) + { + level.cfx_next_ent = undefined; + } + else + { + level.cfx_previous_ent = undefined; + } + } + return; + } + if ( level.selected_fx_ents.size == 1 ) + { + i = 0; + while ( i < level.createfxent.size ) + { + if ( isDefined( level.selected_fx[ i ] ) ) + { + start_index = i; + deselect_entity( i, ent ); + break; + } + else + { + i++; + } + } + if ( forward_search ) + { + level.cfx_previous_ent = ent; + ent = get_next_ent_with_same_id( i, ent.v[ "fxid" ] ); + select_entity( level.ent_found_index, ent ); + position = ent.v[ "origin" ] - vectorScale( direction_vec, 175 ); + player setorigin( position ); + level.cfx_next_ent = get_next_ent_with_same_id( level.ent_found_index, ent.v[ "fxid" ] ); + return; + } + else + { + level.cfx_next_ent = ent; + ent = get_previous_ent_with_same_id( i, ent.v[ "fxid" ] ); + select_entity( level.ent_found_index, ent ); + position = ent.v[ "origin" ] - vectorScale( direction_vec, 175 ); + player setorigin( position ); + level.cfx_previous_ent = get_previous_ent_with_same_id( level.ent_found_index, ent.v[ "fxid" ] ); + return; + } + } + else + { + if ( isDefined( level.last_ent_moved_to ) && !last_selected_entity_has_changed( lastselectentity ) ) + { + ent = level.last_ent_moved_to; + } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + if ( ent == level.selected_fx_ents[ i ] ) + { + break; + } + else + { + i++; + } + } + if ( forward_search ) + { + if ( i < ( level.selected_fx_ents.size - 1 ) ) + { + i++; + ent = level.selected_fx_ents[ i ]; + } + else + { + ent = level.selected_fx_ents[ 0 ]; + } + } + else if ( i > 0 ) + { + ent = level.selected_fx_ents[ i - 1 ]; + } + else + { + ent = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; + } + level.last_ent_moved_to = ent; + position = ent.v[ "origin" ] - vectorScale( direction_vec, 175 ); + player setorigin( position ); + } } get_next_ent_with_same_id( index, ent_id ) { - for ( i = index + 1; i < level.createfxent.size; i++ ) - { - if ( ent_id == level.createfxent[i].v["fxid"] ) - { - level.ent_found_index = i; - return level.createfxent[i]; - } - } - - for ( i = 0; i < index; i++ ) - { - if ( ent_id == level.createfxent[i].v["fxid"] ) - { - level.ent_found_index = i; - return level.createfxent[i]; - } - } - - level.ent_found_index = index; - return level.createfxent[index]; + i = index + 1; + while ( i < level.createfxent.size ) + { + if ( ent_id == level.createfxent[ i ].v[ "fxid" ] ) + { + level.ent_found_index = i; + return level.createfxent[ i ]; + } + i++; + } + i = 0; + while ( i < index ) + { + if ( ent_id == level.createfxent[ i ].v[ "fxid" ] ) + { + level.ent_found_index = i; + return level.createfxent[ i ]; + } + i++; + } + level.ent_found_index = index; + return level.createfxent[ index ]; } get_previous_ent_with_same_id( index, ent_id ) { - for ( i = index - 1; i > 0; i-- ) - { - if ( ent_id == level.createfxent[i].v["fxid"] ) - { - level.ent_found_index = i; - return level.createfxent[i]; - } - } + i = index - 1; + while ( i > 0 ) + { + if ( ent_id == level.createfxent[ i ].v[ "fxid" ] ) + { + level.ent_found_index = i; + return level.createfxent[ i ]; + } + i--; - for ( i = level.createfxent.size - 1; i > index; i-- ) - { - if ( ent_id == level.createfxent[i].v["fxid"] ) - { - level.ent_found_index = i; - return level.createfxent[i]; - } - } + } + i = level.createfxent.size - 1; + while ( i > index ) + { + if ( ent_id == level.createfxent[ i ].v[ "fxid" ] ) + { + level.ent_found_index = i; + return level.createfxent[ i ]; + } + i--; - level.ent_found_index = index; - return level.createfxent[index]; + } + level.ent_found_index = index; + return level.createfxent[ index ]; } get_ent_index( ent ) { - for ( i = 0; i < level.createfxent.size; i++ ) - { - if ( ent == level.createfxent[i] ) - return i; - } - - return -1; + i = 0; + while ( i < level.createfxent.size ) + { + if ( ent == level.createfxent[ i ] ) + { + return i; + } + i++; + } + return -1; } select_ents_by_property( property, add_to_selection ) { - ent = level.selected_fx_ents[level.selected_fx_ents.size - 1]; - prop_to_match = ent.v[property]; - - if ( !isdefined( add_to_selection ) ) - clear_entity_selection(); - - for ( i = 0; i < level.createfxent.size; i++ ) - { - if ( isdefined( level.createfxent[i].v[property] ) ) - { - if ( level.createfxent[i].v[property] == prop_to_match ) - select_entity( i, level.createfxent[i] ); - } - } + ent = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; + prop_to_match = ent.v[ property ]; + if ( !isDefined( add_to_selection ) ) + { + clear_entity_selection(); + } + i = 0; + while ( i < level.createfxent.size ) + { + if ( isDefined( level.createfxent[ i ].v[ property ] ) ) + { + if ( level.createfxent[ i ].v[ property ] == prop_to_match ) + { + select_entity( i, level.createfxent[ i ] ); + } + } + i++; + } } print_ambient_fx_inventory() { /# - fx_list = get_level_ambient_fx(); - ent_list = []; - fx_list_count = []; - println( "\n\n^2INVENTORY OF AMBIENT EFFECTS: " ); - - for ( i = 0; i < level.createfxent.size; i++ ) - ent_list[i] = level.createfxent[i].v["fxid"]; - - for ( i = 0; i < fx_list.size; i++ ) - { - count = 0; - - for ( j = 0; j < ent_list.size; j++ ) - { - if ( fx_list[i] == ent_list[j] ) - { - count++; - ent_list[j] = ""; - } - } - - fx_list_count[i] = count; - } - - for ( i = 0; i < fx_list_count.size - 1; i++ ) - { - for ( j = i + 1; j < fx_list_count.size; j++ ) - { - if ( fx_list_count[j] < fx_list_count[i] ) - { - temp_count = fx_list_count[i]; - temp_id = fx_list[i]; - fx_list_count[i] = fx_list_count[j]; - fx_list[i] = fx_list[j]; - fx_list_count[j] = temp_count; - fx_list[j] = temp_id; - } - } - } - - for ( i = 0; i < fx_list_count.size; i++ ) - { - switch ( fx_list_count[i] ) - { - case "0": - print( "^1" ); - break; - case "1": - print( "^3" ); - break; - default: - break; - } - - print( fx_list_count[i] + "\t" + fx_list[i] + "\n" ); - } - - print( "\n" ); + fx_list = get_level_ambient_fx(); + ent_list = []; + fx_list_count = []; + println( "\n\n^2INVENTORY OF AMBIENT EFFECTS: " ); + i = 0; + while ( i < level.createfxent.size ) + { + ent_list[ i ] = level.createfxent[ i ].v[ "fxid" ]; + i++; + } + i = 0; + while ( i < fx_list.size ) + { + count = 0; + j = 0; + while ( j < ent_list.size ) + { + if ( fx_list[ i ] == ent_list[ j ] ) + { + count++; + ent_list[ j ] = ""; + } + j++; + } + fx_list_count[ i ] = count; + i++; + } + i = 0; + while ( i < ( fx_list_count.size - 1 ) ) + { + j = i + 1; + while ( j < fx_list_count.size ) + { + if ( fx_list_count[ j ] < fx_list_count[ i ] ) + { + temp_count = fx_list_count[ i ]; + temp_id = fx_list[ i ]; + fx_list_count[ i ] = fx_list_count[ j ]; + fx_list[ i ] = fx_list[ j ]; + fx_list_count[ j ] = temp_count; + fx_list[ j ] = temp_id; + } + j++; + } + i++; + } + i = 0; + while ( i < fx_list_count.size ) + { + switch( fx_list_count[ i ] ) + { + case 0: + print( "^1" ); + break; + case 1: + print( "^3" ); + break; + default: + } + print( fx_list_count[ i ] + "\t" + fx_list[ i ] + "\n" ); + i++; + } + print( "\n" ); #/ + } } vector_changed( old, new ) { - if ( distancesquared( old, new ) >= 1 ) - return true; - - return false; + if ( distancesquared( old, new ) >= 1 ) + { + return 1; + } + return 0; } dot_changed( old, new ) { - dot = vectordot( old, new ); - - if ( dot < 1 ) - return true; - - return false; + dot = vectordot( old, new ); + if ( dot < 1 ) + { + return 1; + } + return 0; } damage_void( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) { - } handle_camera() { /# - level notify( "new_camera" ); - level endon( "new_camera" ); - movement = ( 0, 0, 0 ); - - if ( !isdefined( level.camera ) ) - { - level.camera = spawn( "script_origin", ( 0, 0, 0 ) ); - level.camera setmodel( "tag_origin" ); - } - - players = get_players(); - players[0] playerlinktodelta( level.camera, "tag_origin", 1, 0, 0, 0, 0, 1 ); - players[0] disableweapons(); - level.camera_snapto = 1; - level.stick_camera = 1; - level.camera_prev_snapto = 0; - level.cameravec = ( 90, 150, 20 ); - model = undefined; - n_y_vector = 0; - n_x_vector = 0; - zoom_level = 300; - b_changes_x = 0; - b_changes_z = 0; - b_changes_y = 0; - test_string = ""; - - while ( true ) - { - if ( level.camera_snapto > 0 ) - { - if ( level.stick_camera ) - { - originoffset = vectorscale( level.cameravec, -1 ); - temp_offset = originoffset + vectorscale( ( 0, 0, -1 ), 60.0 ); - anglesoffset = vectortoangles( temp_offset ); - - if ( level.camera_prev_snapto == level.camera_snapto ) - { - players = get_players(); - newmovement = players[0] getnormalizedmovement(); - dolly_movement = players[0] getnormalizedcameramovement(); - - if ( button_is_held( "BUTTON_LTRIG" ) || button_is_held( "BUTTON_RTRIG" ) ) - { - - } - else - { - if ( newmovement[1] <= -0.4 ) - { - n_y_vector += -0.2; - b_changes_y = 1; - } - else if ( newmovement[1] >= 0.4 ) - { - n_y_vector += 0.2; - b_changes_y = 1; - } - else - b_changes_y = 0; - - if ( newmovement[0] <= -0.4 ) - { - n_x_vector += -0.4; - b_changes_x = 1; - } - else if ( newmovement[0] >= 0.4 ) - { - n_x_vector += 0.4; - b_changes_x = 1; - } - else - b_changes_x = 0; - - if ( dolly_movement[0] <= -0.4 ) - { - zoom_level += 30; - b_changes_z = 1; - } - else if ( dolly_movement[0] >= 0.4 ) - { - zoom_level += -30; - b_changes_z = 1; - } - else - b_changes_z = 0; - - if ( b_changes_z || b_changes_x || b_changes_y ) - { - newmovement = ( n_x_vector, n_y_vector, newmovement[2] ); - movement = ( 0, 0, 0 ); - movement = vectorscale( movement, 0.8 ) + vectorscale( newmovement, 1 - 0.8 ); - tilt = max( 0, 10 + movement[0] * 160 ); - level.cameravec = ( cos( movement[1] * 180 ) * zoom_level, sin( movement[1] * 180 ) * zoom_level, tilt ); - iprintln( level.cameravec[0] + " " + level.cameravec[1] + " " + level.cameravec[2] ); - } - } - } - else - level.camera_prev_snapto = level.camera_snapto; - - if ( isdefined( level.current_select_ent ) ) - { - originoffset = vectorscale( level.cameravec, -1 ); - temp_offset = originoffset + vectorscale( ( 0, 0, -1 ), 60.0 ); - anglesoffset = vectortoangles( temp_offset ); - - if ( !isdefined( model ) ) - { - model = spawn( "script_origin", level.current_select_ent.v["origin"] ); - model setmodel( "tag_origin" ); - } - - if ( model.origin != level.current_select_ent.v["origin"] ) - model.origin = level.current_select_ent.v["origin"]; - - level.camera linkto( model, "tag_origin", level.cameravec, anglesoffset ); - } - else - { - wait 0.05; - continue; - } - } - else - level.camera unlink(); - } - - wait 0.05; - } + level notify( "new_camera" ); + level endon( "new_camera" ); + movement = ( 1, 1, 1 ); + if ( !isDefined( level.camera ) ) + { + level.camera = spawn( "script_origin", ( 1, 1, 1 ) ); + level.camera setmodel( "tag_origin" ); + } + players = get_players(); + players[ 0 ] playerlinktodelta( level.camera, "tag_origin", 1, 0, 0, 0, 0, 1 ); + players[ 0 ] disableweapons(); + level.camera_snapto = 1; + level.stick_camera = 1; + level.camera_prev_snapto = 0; + level.cameravec = ( 90, 150, 20 ); + model = undefined; + n_y_vector = 0; + n_x_vector = 0; + zoom_level = 300; + b_changes_x = 0; + b_changes_z = 0; + b_changes_y = 0; + test_string = ""; + for ( ;; ) + { + while ( 1 ) + { + if ( level.camera_snapto > 0 ) + { + if ( level.stick_camera ) + { + originoffset = vectorScale( level.cameravec, -1 ); + temp_offset = originoffset + vectorScale( ( 1, 1, 1 ), 60 ); + anglesoffset = vectorToAngle( temp_offset ); + if ( level.camera_prev_snapto == level.camera_snapto ) + { + players = get_players(); + newmovement = players[ 0 ] getnormalizedmovement(); + dolly_movement = players[ 0 ] getnormalizedcameramovement(); + if ( button_is_held( "BUTTON_LTRIG" ) || button_is_held( "BUTTON_RTRIG" ) ) + { + } + else + { + if ( newmovement[ 1 ] <= -0,4 ) + { + n_y_vector += -0,2; + b_changes_y = 1; + } + else if ( newmovement[ 1 ] >= 0,4 ) + { + n_y_vector += 0,2; + b_changes_y = 1; + } + else + { + b_changes_y = 0; + } + if ( newmovement[ 0 ] <= -0,4 ) + { + n_x_vector += -0,4; + b_changes_x = 1; + } + else if ( newmovement[ 0 ] >= 0,4 ) + { + n_x_vector += 0,4; + b_changes_x = 1; + } + else + { + b_changes_x = 0; + } + if ( dolly_movement[ 0 ] <= -0,4 ) + { + zoom_level += 30; + b_changes_z = 1; + } + else if ( dolly_movement[ 0 ] >= 0,4 ) + { + zoom_level += -30; + b_changes_z = 1; + } + else + { + b_changes_z = 0; + } + if ( !b_changes_z || b_changes_x && b_changes_y ) + { + newmovement = ( n_x_vector, n_y_vector, newmovement[ 2 ] ); + movement = ( 1, 1, 1 ); + movement = vectorScale( movement, 0,8 ) + vectorScale( newmovement, 1 - 0,8 ); + tilt = max( 0, 10 + ( movement[ 0 ] * 160 ) ); + level.cameravec = ( cos( movement[ 1 ] * 180 ) * zoom_level, sin( movement[ 1 ] * 180 ) * zoom_level, tilt ); + iprintln( level.cameravec[ 0 ] + " " + level.cameravec[ 1 ] + " " + level.cameravec[ 2 ] ); + } + } + } + else + { + level.camera_prev_snapto = level.camera_snapto; + } + if ( isDefined( level.current_select_ent ) ) + { + originoffset = vectorScale( level.cameravec, -1 ); + temp_offset = originoffset + vectorScale( ( 1, 1, 1 ), 60 ); + anglesoffset = vectorToAngle( temp_offset ); + if ( !isDefined( model ) ) + { + model = spawn( "script_origin", level.current_select_ent.v[ "origin" ] ); + model setmodel( "tag_origin" ); + } + if ( model.origin != level.current_select_ent.v[ "origin" ] ) + { + model.origin = level.current_select_ent.v[ "origin" ]; + } + level.camera linkto( model, "tag_origin", level.cameravec, anglesoffset ); + break; + } + else + { + wait 0,05; + } + } + } + else level.camera unlink(); + } + wait 0,05; #/ + } } camera_hud_toggle( text ) { - if ( isdefined( level.camera_hud ) ) - level.camera_hud destroy(); - - level.camera_hud = newdebughudelem(); - level.camera_hud settext( text ); - level.camera_hud.horzalign = "left"; - level.camera_hud.vertalign = "bottom"; - level.camera_hud.alignx = "left"; - level.camera_hud.aligny = "bottom"; - level.camera_hud.foreground = 1; - level.camera_hud.fontscale = 1.1; - level.camera_hud.sort = 21; - level.camera_hud.alpha = 1; - level.camera_hud.color = ( 1, 1, 1 ); + if ( isDefined( level.camera_hud ) ) + { + level.camera_hud destroy(); + } + level.camera_hud = newdebughudelem(); + level.camera_hud settext( text ); + level.camera_hud.horzalign = "left"; + level.camera_hud.vertalign = "bottom"; + level.camera_hud.alignx = "left"; + level.camera_hud.aligny = "bottom"; + level.camera_hud.foreground = 1; + level.camera_hud.fontscale = 1,1; + level.camera_hud.sort = 21; + level.camera_hud.alpha = 1; + level.camera_hud.color = ( 1, 1, 1 ); } init_sp_paths() { - } make_sp_player_invulnerable( player ) { - } delete_arrays_in_sp() { - } used_in_animation( sp ) { - } init_client_sp_variables() { - } init_mp_paths() { - level.cfx_server_scriptdata = "mpcreatefx/"; - level.cfx_client_scriptdata = "mpclientcreatefx/"; - level.cfx_server_loop = "maps\mp\_utility::createLoopEffect"; - level.cfx_server_oneshot = "maps\mp\_utility::createOneshotEffect"; - level.cfx_server_exploder = "maps\mp\_utility::createExploder"; - level.cfx_server_loopsound = "maps\mp\_createfx::createLoopSound"; - level.cfx_server_scriptgendump = "maps\mp\createfx\" + level.script + "_fx::main();"; - level.cfx_client_loop = "clientscripts\mp\_fx::createLoopEffect"; - level.cfx_client_oneshot = "clientscripts\mp\_fx::createOneshotEffect"; - level.cfx_client_exploder = "clientscripts\mp\_fx::createExploder"; - level.cfx_client_loopsound = "clientscripts\mp\_fx::createLoopSound"; - level.cfx_client_scriptgendump = "clientscripts\mp\_createfx\" + level.script + "_fx::main();"; - level.cfx_func_run_gump_func = ::empty; - level.cfx_func_loopfx = maps\mp\_fx::loopfxthread; - level.cfx_func_oneshotfx = maps\mp\_fx::oneshotfxthread; - level.cfx_func_soundfx = maps\mp\_fx::create_loopsound; - level.cfx_func_script_gen_dump = maps\mp\_script_gen::script_gen_dump; - level.cfx_func_stop_loopsound = maps\mp\_fx::stop_loopsound; - level.cfx_func_create_looper = maps\mp\_fx::create_looper; - level.cfx_func_create_triggerfx = maps\mp\_fx::create_triggerfx; - level.cfx_func_create_loopsound = maps\mp\_fx::create_loopsound; + level.cfx_server_scriptdata = "mpcreatefx/"; + level.cfx_client_scriptdata = "mpclientcreatefx/"; + level.cfx_server_loop = "maps\\mp\\_utility::createLoopEffect"; + level.cfx_server_oneshot = "maps\\mp\\_utility::createOneshotEffect"; + level.cfx_server_exploder = "maps\\mp\\_utility::createExploder"; + level.cfx_server_loopsound = "maps\\mp\\_createfx::createLoopSound"; + level.cfx_server_scriptgendump = "maps\\mp\\createfx\\" + level.script + "_fx::main();"; + level.cfx_client_loop = "clientscripts\\mp\\_fx::createLoopEffect"; + level.cfx_client_oneshot = "clientscripts\\mp\\_fx::createOneshotEffect"; + level.cfx_client_exploder = "clientscripts\\mp\\_fx::createExploder"; + level.cfx_client_loopsound = "clientscripts\\mp\\_fx::createLoopSound"; + level.cfx_client_scriptgendump = "clientscripts\\mp\\_createfx\\" + level.script + "_fx::main();"; + level.cfx_func_run_gump_func = ::empty; + level.cfx_func_loopfx = ::maps/mp/_fx::loopfxthread; + level.cfx_func_oneshotfx = ::maps/mp/_fx::oneshotfxthread; + level.cfx_func_soundfx = ::maps/mp/_fx::create_loopsound; + level.cfx_func_script_gen_dump = ::maps/mp/_script_gen::script_gen_dump; + level.cfx_func_stop_loopsound = ::maps/mp/_fx::stop_loopsound; + level.cfx_func_create_looper = ::maps/mp/_fx::create_looper; + level.cfx_func_create_triggerfx = ::maps/mp/_fx::create_triggerfx; + level.cfx_func_create_loopsound = ::maps/mp/_fx::create_loopsound; } callback_playerconnect() { - self waittill( "begin" ); - - if ( !isdefined( level.hasspawned ) ) - { - spawnpoints = getentarray( "mp_global_intermission", "classname" ); - - if ( !spawnpoints.size ) - spawnpoints = getentarray( "info_player_start", "classname" ); + self waittill( "begin" ); + if ( !isDefined( level.hasspawned ) ) + { + spawnpoints = getentarray( "mp_global_intermission", "classname" ); + if ( !spawnpoints.size ) + { + spawnpoints = getentarray( "info_player_start", "classname" ); + } /# - assert( spawnpoints.size ); + assert( spawnpoints.size ); #/ - spawnpoint = spawnpoints[0]; - self.sessionteam = "none"; - self.sessionstate = "playing"; - - if ( !level.teambased ) - self.ffateam = "none"; - - self spawn( spawnpoint.origin, spawnpoint.angles ); - level.player = self; - level.hasspawned = 1; - } - else - kick( self.name ); + spawnpoint = spawnpoints[ 0 ]; + self.sessionteam = "none"; + self.sessionstate = "playing"; + if ( !level.teambased ) + { + self.ffateam = "none"; + } + self spawn( spawnpoint.origin, spawnpoint.angles ); + level.player = self; + level.hasspawned = 1; + } + else + { + kick( self.name ); + } } delete_spawns() { - spawn_classes = []; - spawn_classes[spawn_classes.size] = "mp_dm_spawn"; - spawn_classes[spawn_classes.size] = "mp_tdm_spawn"; - spawn_classes[spawn_classes.size] = "mp_dom_spawn"; - spawn_classes[spawn_classes.size] = "mp_dom_spawn_axis_start"; - spawn_classes[spawn_classes.size] = "mp_dom_spawn_allies_start"; - spawn_classes[spawn_classes.size] = "mp_res_spawn_allies"; - spawn_classes[spawn_classes.size] = "mp_res_spawn_axis"; - spawn_classes[spawn_classes.size] = "mp_res_spawn_axis_start"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker_a"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker_b"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker_c"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_attacker_start"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_attackerOT_start"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender_a"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender_b"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender_c"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_defender_start"; - spawn_classes[spawn_classes.size] = "mp_dem_spawn_defenderOT_start"; - - foreach ( class in spawn_classes ) - { - spawns = getentarray( class, "classname" ); - - foreach ( spawn in spawns ) - spawn delete(); - } + spawn_classes = []; + spawn_classes[ spawn_classes.size ] = "mp_dm_spawn"; + spawn_classes[ spawn_classes.size ] = "mp_tdm_spawn"; + spawn_classes[ spawn_classes.size ] = "mp_dom_spawn"; + spawn_classes[ spawn_classes.size ] = "mp_dom_spawn_axis_start"; + spawn_classes[ spawn_classes.size ] = "mp_dom_spawn_allies_start"; + spawn_classes[ spawn_classes.size ] = "mp_res_spawn_allies"; + spawn_classes[ spawn_classes.size ] = "mp_res_spawn_axis"; + spawn_classes[ spawn_classes.size ] = "mp_res_spawn_axis_start"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker_a"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker_b"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker_c"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attacker_start"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_attackerOT_start"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender_a"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender_b"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender_c"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defender_start"; + spawn_classes[ spawn_classes.size ] = "mp_dem_spawn_defenderOT_start"; + _a4256 = spawn_classes; + _k4256 = getFirstArrayKey( _a4256 ); + while ( isDefined( _k4256 ) ) + { + class = _a4256[ _k4256 ]; + spawns = getentarray( class, "classname" ); + _a4260 = spawns; + _k4260 = getFirstArrayKey( _a4260 ); + while ( isDefined( _k4260 ) ) + { + spawn = _a4260[ _k4260 ]; + spawn delete(); + _k4260 = getNextArrayKey( _a4260, _k4260 ); + } + _k4256 = getNextArrayKey( _a4256, _k4256 ); + } } createfxdelay() { - wait 10; - level.createfx_delay_done = 1; + wait 10; + level.createfx_delay_done = 1; } init_client_mp_variables() { - level.cfx_exploder_before = maps\mp\_utility::exploder_before_load; - level.cfx_exploder_after = maps\mp\_utility::exploder_after_load; + level.cfx_exploder_before = ::maps/mp/_utility::exploder_before_load; + level.cfx_exploder_after = ::maps/mp/_utility::exploder_after_load; } diff --git a/Zombie Core/patch_zm/maps/mp/_createfxmenu.gsc b/Zombie Core/patch_zm/maps/mp/_createfxmenu.gsc index 2e27bec..163c53f 100644 --- a/Zombie Core/patch_zm/maps/mp/_createfxmenu.gsc +++ b/Zombie Core/patch_zm/maps/mp/_createfxmenu.gsc @@ -1,941 +1,1019 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\_createfx; -#include maps\mp\_createfxundo; +#include maps/mp/_createfxundo; +#include maps/mp/_createfx; +#include maps/mp/_utility; +#include common_scripts/utility; menu( name ) { /# - return level.create_fx_menu == name; + return level.create_fx_menu == name; #/ } setmenu( name ) { /# - level.create_fx_menu = name; + level.create_fx_menu = name; #/ } create_fx_menu() { /# - if ( button_is_clicked( "escape", "x" ) ) - { - exit_menu(); - return; - } - - if ( menu( "creation" ) ) - { - if ( button_is_clicked( "1" ) ) - { - setmenu( "create_oneshot" ); - draw_effects_list(); - return; - } - - if ( button_is_clicked( "2" ) ) - { - setmenu( "create_loopfx" ); - draw_effects_list(); - return; - } - - if ( button_is_clicked( "3" ) ) - { - setmenu( "create_exploder" ); - draw_effects_list(); - return; - } - - if ( button_is_clicked( "4" ) ) - { - setmenu( "create_loopsound" ); - ent = createloopsound(); - finish_creating_entity( ent ); - setmenu( "none" ); - return; - } - } - - if ( menu( "create_oneshot" ) || menu( "create_loopfx" ) || menu( "create_exploder" ) || menu( "change_fxid" ) ) - { - if ( button_is_clicked( "rightarrow" ) ) - { - increment_list_offset(); - draw_effects_list(); - } - - if ( button_is_clicked( "leftarrow" ) ) - { - decrement_list_offset(); - draw_effects_list(); - } - - menu_fx_creation(); - } - else if ( menu( "none" ) ) - { - menu_change_selected_fx(); - - if ( entities_are_selected() ) - { - display_fx_info( get_last_selected_entity() ); - - if ( button_is_clicked( "a" ) ) - { - clear_settable_fx(); - setmenu( "add_options" ); - } - } - } - else if ( menu( "add_options" ) ) - { - if ( !entities_are_selected() ) - { - clear_fx_hudelements(); - setmenu( "none" ); - return; - } - - display_fx_add_options( get_last_selected_entity() ); - - if ( button_is_clicked( "rightarrow" ) ) - increment_list_offset(); - - if ( button_is_clicked( "leftarrow" ) ) - decrement_list_offset(); - } - else if ( menu( "jump_to_effect" ) ) - { - if ( button_is_clicked( "rightarrow" ) ) - { - increment_list_offset(); - draw_effects_list( "Select effect to jump to:" ); - } - - if ( button_is_clicked( "leftarrow" ) ) - { - decrement_list_offset(); - draw_effects_list( "Select effect to jump to:" ); - } - - jump_to_effect(); - } - else if ( menu( "select_by_property" ) ) - { - menu_selection(); - - if ( button_is_clicked( "rightarrow" ) ) - increment_list_offset(); - - if ( button_is_clicked( "leftarrow" ) ) - decrement_list_offset(); - } - else if ( menu( "change_type" ) ) - { - if ( !entities_are_selected() ) - { - clear_fx_hudelements(); - setmenu( "none" ); - return; - } - else - menu_fx_type(); - } + if ( button_is_clicked( "escape", "x" ) ) + { + exit_menu(); + return; + } + if ( menu( "creation" ) ) + { + if ( button_is_clicked( "1" ) ) + { + setmenu( "create_oneshot" ); + draw_effects_list(); + return; + } + if ( button_is_clicked( "2" ) ) + { + setmenu( "create_loopfx" ); + draw_effects_list(); + return; + } + if ( button_is_clicked( "3" ) ) + { + setmenu( "create_exploder" ); + draw_effects_list(); + return; + } + if ( button_is_clicked( "4" ) ) + { + setmenu( "create_loopsound" ); + ent = createloopsound(); + finish_creating_entity( ent ); + setmenu( "none" ); + return; + } + } + if ( !menu( "create_oneshot" ) && !menu( "create_loopfx" ) || menu( "create_exploder" ) && menu( "change_fxid" ) ) + { + if ( button_is_clicked( "rightarrow" ) ) + { + increment_list_offset(); + draw_effects_list(); + } + if ( button_is_clicked( "leftarrow" ) ) + { + decrement_list_offset(); + draw_effects_list(); + } + menu_fx_creation(); + } + else + { + if ( menu( "none" ) ) + { + menu_change_selected_fx(); + if ( entities_are_selected() ) + { + display_fx_info( get_last_selected_entity() ); + if ( button_is_clicked( "a" ) ) + { + clear_settable_fx(); + setmenu( "add_options" ); + } + } + return; + } + else if ( menu( "add_options" ) ) + { + if ( !entities_are_selected() ) + { + clear_fx_hudelements(); + setmenu( "none" ); + return; + } + display_fx_add_options( get_last_selected_entity() ); + if ( button_is_clicked( "rightarrow" ) ) + { + increment_list_offset(); + } + if ( button_is_clicked( "leftarrow" ) ) + { + decrement_list_offset(); + } + return; + } + else if ( menu( "jump_to_effect" ) ) + { + if ( button_is_clicked( "rightarrow" ) ) + { + increment_list_offset(); + draw_effects_list( "Select effect to jump to:" ); + } + if ( button_is_clicked( "leftarrow" ) ) + { + decrement_list_offset(); + draw_effects_list( "Select effect to jump to:" ); + } + jump_to_effect(); + return; + } + else if ( menu( "select_by_property" ) ) + { + menu_selection(); + if ( button_is_clicked( "rightarrow" ) ) + { + increment_list_offset(); + } + if ( button_is_clicked( "leftarrow" ) ) + { + decrement_list_offset(); + } + return; + } + else if ( menu( "change_type" ) ) + { + if ( !entities_are_selected() ) + { + clear_fx_hudelements(); + setmenu( "none" ); + return; + return; + } + else + { + menu_fx_type(); #/ + } + } + } } exit_menu() { /# - clear_fx_hudelements(); - clear_entity_selection(); - update_selected_entities(); - setmenu( "none" ); + clear_fx_hudelements(); + clear_entity_selection(); + update_selected_entities(); + setmenu( "none" ); #/ } get_last_selected_entity() { /# - return level.selected_fx_ents[level.selected_fx_ents.size - 1]; + return level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; #/ } menu_fx_creation() { /# - count = 0; - picked_fx = undefined; - keys = get_level_ambient_fx(); - - for ( i = level.effect_list_offset; i < keys.size; i++ ) - { - count += 1; - button_to_check = count; - - if ( button_to_check == 10 ) - button_to_check = 0; - - if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) - { - picked_fx = keys[i]; - break; - } - - if ( count > level.effect_list_offset_max ) - break; - } - - if ( !isdefined( picked_fx ) ) - return; - - if ( menu( "change_fxid" ) ) - { - apply_option_to_selected_fx( get_option( "fxid" ), picked_fx ); - level.effect_list_offset = 0; - clear_fx_hudelements(); - setmenu( "none" ); - return; - } - - ent = undefined; - - if ( menu( "create_loopfx" ) ) - ent = createloopeffect( picked_fx ); - - if ( menu( "create_oneshot" ) ) - { - ent = createoneshoteffect( picked_fx ); - delay_min = getdvarint( "createfx_oneshot_min_delay" ); - delay_max = getdvarint( "createfx_oneshot_max_delay" ); - - if ( delay_min > delay_max ) - { - temp = delay_min; - delay_min = delay_max; - delay_max = temp; - } - - ent.v["delay"] = randomintrange( delay_min, delay_max ); - } - - if ( menu( "create_exploder" ) ) - ent = createexploder( picked_fx ); - - finish_creating_entity( ent ); - - if ( level.cfx_last_action != "none" ) - store_undo_state( "edit", level.selected_fx_ents ); - - store_undo_state( "add", level.createfxent[level.createfxent.size - 1] ); - level.cfx_last_action = "none"; - setmenu( "none" ); + count = 0; + picked_fx = undefined; + keys = get_level_ambient_fx(); + i = level.effect_list_offset; + while ( i < keys.size ) + { + count += 1; + button_to_check = count; + if ( button_to_check == 10 ) + { + button_to_check = 0; + } + if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) + { + picked_fx = keys[ i ]; + break; + } + else + { + if ( count > level.effect_list_offset_max ) + { + break; + } + else + { + i++; + } + } + } + if ( !isDefined( picked_fx ) ) + { + return; + } + if ( menu( "change_fxid" ) ) + { + apply_option_to_selected_fx( get_option( "fxid" ), picked_fx ); + level.effect_list_offset = 0; + clear_fx_hudelements(); + setmenu( "none" ); + return; + } + ent = undefined; + if ( menu( "create_loopfx" ) ) + { + ent = createloopeffect( picked_fx ); + } + if ( menu( "create_oneshot" ) ) + { + ent = createoneshoteffect( picked_fx ); + delay_min = getDvarInt( "createfx_oneshot_min_delay" ); + delay_max = getDvarInt( "createfx_oneshot_max_delay" ); + if ( delay_min > delay_max ) + { + temp = delay_min; + delay_min = delay_max; + delay_max = temp; + } + ent.v[ "delay" ] = randomintrange( delay_min, delay_max ); + } + if ( menu( "create_exploder" ) ) + { + ent = createexploder( picked_fx ); + } + finish_creating_entity( ent ); + if ( level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + } + store_undo_state( "add", level.createfxent[ level.createfxent.size - 1 ] ); + level.cfx_last_action = "none"; + setmenu( "none" ); #/ } finish_creating_entity( ent ) { /# - ent.v["angles"] = vectortoangles( ent.v["origin"] + vectorscale( ( 0, 0, 1 ), 100.0 ) - ent.v["origin"] ); - assert( isdefined( ent ) ); - ent post_entity_creation_function(); - clear_entity_selection(); - select_last_entity( "skip_undo" ); - move_selection_to_cursor( "skip_undo" ); - update_selected_entities(); + ent.v[ "angles" ] = vectorToAngle( ( ent.v[ "origin" ] + vectorScale( ( 1, 1, 0 ), 100 ) ) - ent.v[ "origin" ] ); + assert( isDefined( ent ) ); + ent post_entity_creation_function(); + clear_entity_selection(); + select_last_entity( "skip_undo" ); + move_selection_to_cursor( "skip_undo" ); + update_selected_entities(); #/ } change_effect_to_oneshot( ent ) { /# - if ( ent.v["type"] == "oneshotfx" ) - return; - - if ( ent.v["type"] == "exploder" ) - { - ent.v["exploder"] = undefined; - ent.v["exploder_type"] = undefined; - ent.v["soundalias"] = undefined; - } - - if ( !isdefined( ent.v["delay"] ) || ent.v["delay"] == 0 ) - { - delay_min = getdvarint( "createfx_oneshot_min_delay" ); - delay_max = getdvarint( "createfx_oneshot_max_delay" ); - - if ( delay_min > delay_max ) - { - temp = delay_min; - delay_min = delay_max; - delay_max = temp; - } - - ent.v["delay"] = randomintrange( delay_min, delay_max ); - } - - ent.v["type"] = "oneshotfx"; + if ( ent.v[ "type" ] == "oneshotfx" ) + { + return; + } + if ( ent.v[ "type" ] == "exploder" ) + { + } + if ( !isDefined( ent.v[ "delay" ] ) || ent.v[ "delay" ] == 0 ) + { + delay_min = getDvarInt( "createfx_oneshot_min_delay" ); + delay_max = getDvarInt( "createfx_oneshot_max_delay" ); + if ( delay_min > delay_max ) + { + temp = delay_min; + delay_min = delay_max; + delay_max = temp; + } + ent.v[ "delay" ] = randomintrange( delay_min, delay_max ); + } + ent.v[ "type" ] = "oneshotfx"; #/ } change_effect_to_loop( ent ) { /# - if ( ent.v["type"] == "loopfx" ) - return; - - if ( ent.v["type"] == "exploder" ) - { - ent.v["exploder"] = undefined; - ent.v["exploder_type"] = undefined; - ent.v["soundalias"] = undefined; - } - - if ( !isdefined( ent.v["delay"] ) || ent.v["delay"] <= 0 ) - ent.v["delay"] = 1; - - ent.v["type"] = "loopfx"; + if ( ent.v[ "type" ] == "loopfx" ) + { + return; + } + if ( ent.v[ "type" ] == "exploder" ) + { + } + if ( !isDefined( ent.v[ "delay" ] ) || ent.v[ "delay" ] <= 0 ) + { + ent.v[ "delay" ] = 1; + } + ent.v[ "type" ] = "loopfx"; #/ } change_effect_to_exploder( ent ) { /# - if ( ent.v["type"] == "exploder" ) - return; - - ent.v["type"] = "exploder"; - - if ( !isdefined( ent.v["delay"] ) || ent.v["delay"] < 0 ) - ent.v["delay"] = 0; - - ent.v["exploder"] = 1; - ent.v["exploder_type"] = "normal"; + if ( ent.v[ "type" ] == "exploder" ) + { + return; + } + ent.v[ "type" ] = "exploder"; + if ( !isDefined( ent.v[ "delay" ] ) || ent.v[ "delay" ] < 0 ) + { + ent.v[ "delay" ] = 0; + } + ent.v[ "exploder" ] = 1; + ent.v[ "exploder_type" ] = "normal"; #/ } change_ent_type( newtype ) { /# - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = "ent_type"; - - if ( newtype == "oneshotfx" ) - { - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - change_effect_to_oneshot( level.selected_fx_ents[i] ); - } - else if ( newtype == "loopfx" ) - { - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - change_effect_to_loop( level.selected_fx_ents[i] ); - } - else if ( newtype == "exploder" ) - { - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - change_effect_to_exploder( level.selected_fx_ents[i] ); - } + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = "ent_type"; + if ( newtype == "oneshotfx" ) + { + i = 0; + while ( i < level.selected_fx_ents.size ) + { + change_effect_to_oneshot( level.selected_fx_ents[ i ] ); + i++; + } + } + else if ( newtype == "loopfx" ) + { + i = 0; + while ( i < level.selected_fx_ents.size ) + { + change_effect_to_loop( level.selected_fx_ents[ i ] ); + i++; + } + } + else while ( newtype == "exploder" ) + { + i = 0; + while ( i < level.selected_fx_ents.size ) + { + change_effect_to_exploder( level.selected_fx_ents[ i ] ); + i++; #/ + } + } } menu_init() { /# - level.createfx_options = []; - addoption( "string", "type", "Type", "oneshotfx", "fx" ); - addoption( "string", "fxid", "Name", "nil", "fx" ); - addoption( "vector", "origin", "Origin", ( 0, 0, 0 ), "fx" ); - addoption( "vector", "angles", "Angles", ( 0, 0, 0 ), "fx" ); - addoption( "float", "delay", "Repeat rate/start delay", 0.5, "fx" ); - addoption( "int", "repeat", "Number of times to repeat", 5, "exploder" ); - addoption( "float", "primlightfrac", "Primary light fraction", 1.0, "fx" ); - addoption( "int", "lightoriginoffs", "Light origin offset", 64, "fx" ); - addoption( "float", "delay_min", "Minimum time between repeats", 1, "exploder" ); - addoption( "float", "delay_max", "Maximum time between repeats", 2, "exploder" ); - addoption( "float", "fire_range", "Fire damage range", 0, "fx" ); - addoption( "string", "firefx", "2nd FX id", "nil", "exploder" ); - addoption( "float", "firefxdelay", "2nd FX id repeat rate", 0.5, "exploder" ); - addoption( "float", "firefxtimeout", "2nd FX timeout", 5, "exploder" ); - addoption( "string", "firefxsound", "2nd FX soundalias", "nil", "exploder" ); - addoption( "string", "ender", "Level notify for ending 2nd FX", "nil", "exploder" ); - addoption( "string", "rumble", "Rumble", "nil", "exploder" ); - addoption( "float", "damage", "Radius damage", 150, "exploder" ); - addoption( "float", "damage_radius", "Radius of radius damage", 250, "exploder" ); - addoption( "int", "exploder", "Exploder", 1, "exploder" ); - addoption( "string", "earthquake", "Earthquake", "nil", "exploder" ); - addoption( "string", "soundalias", "Soundalias", "nil", "all" ); - addoption( "int", "stoppable", "Can be stopped from script", "1", "all" ); - level.effect_list_offset = 0; - level.effect_list_offset_max = 9; - level.createfxmasks = []; - level.createfxmasks["all"] = []; - level.createfxmasks["all"]["exploder"] = 1; - level.createfxmasks["all"]["oneshotfx"] = 1; - level.createfxmasks["all"]["loopfx"] = 1; - level.createfxmasks["all"]["soundfx"] = 1; - level.createfxmasks["fx"] = []; - level.createfxmasks["fx"]["exploder"] = 1; - level.createfxmasks["fx"]["oneshotfx"] = 1; - level.createfxmasks["fx"]["loopfx"] = 1; - level.createfxmasks["exploder"] = []; - level.createfxmasks["exploder"]["exploder"] = 1; - level.createfxmasks["loopfx"] = []; - level.createfxmasks["loopfx"]["loopfx"] = 1; - level.createfxmasks["oneshotfx"] = []; - level.createfxmasks["oneshotfx"]["oneshotfx"] = 1; - level.createfxmasks["soundfx"] = []; - level.createfxmasks["soundfx"]["soundalias"] = 1; + level.createfx_options = []; + addoption( "string", "type", "Type", "oneshotfx", "fx" ); + addoption( "string", "fxid", "Name", "nil", "fx" ); + addoption( "vector", "origin", "Origin", ( 1, 1, 0 ), "fx" ); + addoption( "vector", "angles", "Angles", ( 1, 1, 0 ), "fx" ); + addoption( "float", "delay", "Repeat rate/start delay", 0,5, "fx" ); + addoption( "int", "repeat", "Number of times to repeat", 5, "exploder" ); + addoption( "float", "primlightfrac", "Primary light fraction", 1, "fx" ); + addoption( "int", "lightoriginoffs", "Light origin offset", 64, "fx" ); + addoption( "float", "delay_min", "Minimum time between repeats", 1, "exploder" ); + addoption( "float", "delay_max", "Maximum time between repeats", 2, "exploder" ); + addoption( "float", "fire_range", "Fire damage range", 0, "fx" ); + addoption( "string", "firefx", "2nd FX id", "nil", "exploder" ); + addoption( "float", "firefxdelay", "2nd FX id repeat rate", 0,5, "exploder" ); + addoption( "float", "firefxtimeout", "2nd FX timeout", 5, "exploder" ); + addoption( "string", "firefxsound", "2nd FX soundalias", "nil", "exploder" ); + addoption( "string", "ender", "Level notify for ending 2nd FX", "nil", "exploder" ); + addoption( "string", "rumble", "Rumble", "nil", "exploder" ); + addoption( "float", "damage", "Radius damage", 150, "exploder" ); + addoption( "float", "damage_radius", "Radius of radius damage", 250, "exploder" ); + addoption( "int", "exploder", "Exploder", 1, "exploder" ); + addoption( "string", "earthquake", "Earthquake", "nil", "exploder" ); + addoption( "string", "soundalias", "Soundalias", "nil", "all" ); + addoption( "int", "stoppable", "Can be stopped from script", "1", "all" ); + level.effect_list_offset = 0; + level.effect_list_offset_max = 9; + level.createfxmasks = []; + level.createfxmasks[ "all" ] = []; + level.createfxmasks[ "all" ][ "exploder" ] = 1; + level.createfxmasks[ "all" ][ "oneshotfx" ] = 1; + level.createfxmasks[ "all" ][ "loopfx" ] = 1; + level.createfxmasks[ "all" ][ "soundfx" ] = 1; + level.createfxmasks[ "fx" ] = []; + level.createfxmasks[ "fx" ][ "exploder" ] = 1; + level.createfxmasks[ "fx" ][ "oneshotfx" ] = 1; + level.createfxmasks[ "fx" ][ "loopfx" ] = 1; + level.createfxmasks[ "exploder" ] = []; + level.createfxmasks[ "exploder" ][ "exploder" ] = 1; + level.createfxmasks[ "loopfx" ] = []; + level.createfxmasks[ "loopfx" ][ "loopfx" ] = 1; + level.createfxmasks[ "oneshotfx" ] = []; + level.createfxmasks[ "oneshotfx" ][ "oneshotfx" ] = 1; + level.createfxmasks[ "soundfx" ] = []; + level.createfxmasks[ "soundfx" ][ "soundalias" ] = 1; #/ } get_last_selected_ent() { /# - return level.selected_fx_ents[level.selected_fx_ents.size - 1]; + return level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; #/ } entities_are_selected() { /# - return level.selected_fx_ents.size > 0; + return level.selected_fx_ents.size > 0; #/ } menu_change_selected_fx() { /# - if ( !level.selected_fx_ents.size ) - return; - - count = 0; - drawncount = 0; - ent = get_last_selected_ent(); - - for ( i = 0; i < level.createfx_options.size; i++ ) - { - option = level.createfx_options[i]; - - if ( !isdefined( ent.v[option["name"]] ) ) - continue; - - count++; - - if ( count < level.effect_list_offset ) - continue; - - drawncount++; - button_to_check = drawncount; - - if ( button_to_check == 10 ) - button_to_check = 0; - - if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) - { - prepare_option_for_change( option, drawncount ); - break; - } - - if ( drawncount > level.effect_list_offset_max ) - break; - } + if ( !level.selected_fx_ents.size ) + { + return; + } + count = 0; + drawncount = 0; + ent = get_last_selected_ent(); + i = 0; + while ( i < level.createfx_options.size ) + { + option = level.createfx_options[ i ]; + if ( !isDefined( ent.v[ option[ "name" ] ] ) ) + { + i++; + continue; + } + else count++; + if ( count < level.effect_list_offset ) + { + i++; + continue; + } + else + { + drawncount++; + button_to_check = drawncount; + if ( button_to_check == 10 ) + { + button_to_check = 0; + } + if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) + { + prepare_option_for_change( option, drawncount ); + return; + } + else + { + if ( drawncount > level.effect_list_offset_max ) + { + return; + } + } + else + { + i++; #/ + } + } + } } prepare_option_for_change( option, drawncount ) { /# - if ( option["name"] == "fxid" ) - { - setmenu( "change_fxid" ); - draw_effects_list(); - return; - } - - if ( option["name"] == "type" ) - { - setmenu( "change_type" ); - return; - } - - level.createfx_inputlocked = 1; - set_option_index( option["name"] ); - setdvar( "fx", "nil" ); - level.createfxhudelements[drawncount + 1][0].color = ( 1, 1, 0 ); + if ( option[ "name" ] == "fxid" ) + { + setmenu( "change_fxid" ); + draw_effects_list(); + return; + } + if ( option[ "name" ] == "type" ) + { + setmenu( "change_type" ); + return; + } + level.createfx_inputlocked = 1; + set_option_index( option[ "name" ] ); + setdvar( "fx", "nil" ); + level.createfxhudelements[ drawncount + 1 ][ 0 ].color = ( 1, 1, 0 ); #/ } menu_fx_option_set() { /# - if ( getdvar( "fx" ) == "nil" ) - return; - - option = get_selected_option(); - setting = undefined; - - if ( option["type"] == "string" ) - setting = getdvar( "fx" ); - - if ( option["type"] == "int" ) - setting = getdvarint( "fx" ); - - if ( option["type"] == "float" ) - setting = getdvarfloat( "fx" ); - - if ( option["type"] == "vector" ) - { - setting = getdvar( "fx" ); - temparray = strtok( setting, " " ); - - if ( temparray.size == 3 ) - setting = ( float( temparray[0] ), float( temparray[1] ), float( temparray[2] ) ); - else - { - clear_settable_fx(); - return; - } - } - - apply_option_to_selected_fx( option, setting ); + if ( getDvar( "fx" ) == "nil" ) + { + return; + } + option = get_selected_option(); + setting = undefined; + if ( option[ "type" ] == "string" ) + { + setting = getDvar( "fx" ); + } + if ( option[ "type" ] == "int" ) + { + setting = getDvarInt( "fx" ); + } + if ( option[ "type" ] == "float" ) + { + setting = getDvarFloat( "fx" ); + } + if ( option[ "type" ] == "vector" ) + { + setting = getDvar( "fx" ); + temparray = strtok( setting, " " ); + if ( temparray.size == 3 ) + { + setting = ( float( temparray[ 0 ] ), float( temparray[ 1 ] ), float( temparray[ 2 ] ) ); + } + else + { + clear_settable_fx(); + return; + } + } + apply_option_to_selected_fx( option, setting ); #/ } menu_fx_type() { /# - clear_fx_hudelements(); - set_fx_hudelement( "Change effect type to:" ); - set_fx_hudelement( " (1) Oneshot" ); - set_fx_hudelement( " (2) Looped" ); - set_fx_hudelement( " (3) Exploder" ); - set_fx_hudelement( "(x) Exit >" ); - - if ( button_is_clicked( "1" ) && !button_is_held( "f" ) ) - { - change_ent_type( "oneshotfx" ); - setmenu( "none" ); - } - else if ( button_is_clicked( "2" ) && !button_is_held( "f" ) ) - { - change_ent_type( "loopfx" ); - setmenu( "none" ); - } - else if ( button_is_clicked( "3" ) && !button_is_held( "f" ) ) - { - change_ent_type( "exploder" ); - setmenu( "none" ); - } - - if ( menu( "none" ) ) - update_selected_entities(); + clear_fx_hudelements(); + set_fx_hudelement( "Change effect type to:" ); + set_fx_hudelement( " (1) Oneshot" ); + set_fx_hudelement( " (2) Looped" ); + set_fx_hudelement( " (3) Exploder" ); + set_fx_hudelement( "(x) Exit >" ); + if ( button_is_clicked( "1" ) && !button_is_held( "f" ) ) + { + change_ent_type( "oneshotfx" ); + setmenu( "none" ); + } + else + { + if ( button_is_clicked( "2" ) && !button_is_held( "f" ) ) + { + change_ent_type( "loopfx" ); + setmenu( "none" ); + } + else + { + if ( button_is_clicked( "3" ) && !button_is_held( "f" ) ) + { + change_ent_type( "exploder" ); + setmenu( "none" ); + } + } + } + if ( menu( "none" ) ) + { + update_selected_entities(); #/ + } } menu_selection() { /# - clear_fx_hudelements(); - set_fx_hudelement( "Select all by property:" ); - drawncount = 0; - option_number = 0; - ent = level.selected_fx_ents[level.selected_fx_ents.size - 1]; - - if ( level.selected_fx_ents.size < 1 ) - set_fx_hudelement( "No ent is selected." ); - else - { - for ( i = level.effect_list_offset; i < level.createfx_options.size; i++ ) - { - if ( drawncount > level.effect_list_offset_max ) - break; - - if ( drawncount > ent.v.size ) - break; - - prop_name = level.createfx_options[i]["name"]; - option_number = drawncount + 1; - - if ( isdefined( ent.v[prop_name] ) ) - { - if ( button_is_clicked( option_number + "" ) && !button_is_held( "f" ) ) - { - level.cfx_selected_prop = prop_name; - menunone(); - level.effect_list_offset = 0; - return; - } - - prop_desc = level.createfx_options[i]["description"]; - set_fx_hudelement( option_number + ". " + prop_desc + ": " + ent.v[prop_name] ); - drawncount++; - continue; - } - } - } - - if ( drawncount > level.effect_list_offset_max ) - { - pages = ceil( ent.v.size / level.effect_list_offset_max ); - current_page = level.effect_list_offset / level.effect_list_offset_max + 1; - set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); - } - - set_fx_hudelement( "(x) Exit >" ); + clear_fx_hudelements(); + set_fx_hudelement( "Select all by property:" ); + drawncount = 0; + option_number = 0; + ent = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ]; + if ( level.selected_fx_ents.size < 1 ) + { + set_fx_hudelement( "No ent is selected." ); + } + else i = level.effect_list_offset; + while ( i < level.createfx_options.size ) + { + if ( drawncount > level.effect_list_offset_max ) + { + break; + } + else if ( drawncount > ent.v.size ) + { + break; + } + else + { + prop_name = level.createfx_options[ i ][ "name" ]; + option_number = drawncount + 1; + if ( isDefined( ent.v[ prop_name ] ) ) + { + if ( button_is_clicked( option_number + "" ) && !button_is_held( "f" ) ) + { + level.cfx_selected_prop = prop_name; + menunone(); + level.effect_list_offset = 0; + return; + } + prop_desc = level.createfx_options[ i ][ "description" ]; + set_fx_hudelement( ( option_number + ". " ) + prop_desc + ": " + ent.v[ prop_name ] ); + drawncount++; + i++; + continue; + } + i++; + } + } + if ( drawncount > level.effect_list_offset_max ) + { + pages = ceil( ent.v.size / level.effect_list_offset_max ); + current_page = ( level.effect_list_offset / level.effect_list_offset_max ) + 1; + set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); + } + set_fx_hudelement( "(x) Exit >" ); #/ } apply_option_to_selected_fx( option, setting ) { /# - if ( level.cfx_last_action != option["name"] ) - { - store_undo_state( "edit", level.selected_fx_ents ); - level.cfx_last_action = option["name"]; - } - - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - - if ( mask( option["mask"], ent.v["type"] ) ) - ent.v[option["name"]] = setting; - } - - update_selected_entities(); - clear_settable_fx(); + if ( level.cfx_last_action != option[ "name" ] ) + { + store_undo_state( "edit", level.selected_fx_ents ); + level.cfx_last_action = option[ "name" ]; + } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + if ( mask( option[ "mask" ], ent.v[ "type" ] ) ) + { + ent.v[ option[ "name" ] ] = setting; + } + i++; + } + update_selected_entities(); + clear_settable_fx(); #/ } set_option_index( name ) { /# - for ( i = 0; i < level.createfx_options.size; i++ ) - { - if ( level.createfx_options[i]["name"] != name ) - continue; - - level.selected_fx_option_index = i; - return; - } + i = 0; + while ( i < level.createfx_options.size ) + { + if ( level.createfx_options[ i ][ "name" ] != name ) + { + i++; + continue; + } + else + { + level.selected_fx_option_index = i; + return; + } + i++; #/ + } } get_selected_option() { /# - return level.createfx_options[level.selected_fx_option_index]; + return level.createfx_options[ level.selected_fx_option_index ]; #/ } mask( type, name ) { /# - return isdefined( level.createfxmasks[type][name] ); + return isDefined( level.createfxmasks[ type ][ name ] ); #/ } addoption( type, name, description, defaultsetting, mask ) { /# - option = []; - option["type"] = type; - option["name"] = name; - option["description"] = description; - option["default"] = defaultsetting; - option["mask"] = mask; - level.createfx_options[level.createfx_options.size] = option; + option = []; + option[ "type" ] = type; + option[ "name" ] = name; + option[ "description" ] = description; + option[ "default" ] = defaultsetting; + option[ "mask" ] = mask; + level.createfx_options[ level.createfx_options.size ] = option; #/ } get_option( name ) { /# - for ( i = 0; i < level.createfx_options.size; i++ ) - { - if ( level.createfx_options[i]["name"] == name ) - return level.createfx_options[i]; - } + i = 0; + while ( i < level.createfx_options.size ) + { + if ( level.createfx_options[ i ][ "name" ] == name ) + { + return level.createfx_options[ i ]; + } + i++; #/ + } } display_fx_info( ent ) { /# - if ( !menu( "none" ) ) - return; - - clear_fx_hudelements(); - - if ( !level.createfx_draw_enabled ) - return; - - set_fx_hudelement( "Selected: " + level.selected_fx_ents.size + " Distance: " + get_distance_from_ent( ent ) ); - level.createfxhudelements[0][0].color = ( 1, 1, 0 ); - set_fx_hudelement( "Name: " + ent.v["fxid"] ); - - if ( entities_are_selected() ) - { - count = 0; - drawncount = 0; - - for ( i = 0; i < level.createfx_options.size; i++ ) - { - option = level.createfx_options[i]; - - if ( !isdefined( ent.v[option["name"]] ) ) - continue; - - count++; - - if ( count < level.effect_list_offset ) - continue; - - drawncount++; - set_fx_hudelement( drawncount + ". " + option["description"] + ": " + ent.v[option["name"]] ); - - if ( drawncount > level.effect_list_offset_max ) - { - more = 1; - break; - } - } - - if ( count > level.effect_list_offset_max ) - { - pages = ceil( level.createfx_options.size / level.effect_list_offset_max ); - current_page = level.effect_list_offset / level.effect_list_offset_max + 1; - set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); - } - - set_fx_hudelement( "(a) Add >" ); - set_fx_hudelement( "(x) Exit >" ); - } - else - { - set_fx_hudelement( "Origin: " + ent.v["origin"] ); - set_fx_hudelement( "Angles: " + ent.v["angles"] ); - } + if ( !menu( "none" ) ) + { + return; + } + clear_fx_hudelements(); + if ( !level.createfx_draw_enabled ) + { + return; + } + set_fx_hudelement( "Selected: " + level.selected_fx_ents.size + " Distance: " + get_distance_from_ent( ent ) ); + level.createfxhudelements[ 0 ][ 0 ].color = ( 1, 1, 0 ); + set_fx_hudelement( "Name: " + ent.v[ "fxid" ] ); + if ( entities_are_selected() ) + { + count = 0; + drawncount = 0; + i = 0; + while ( i < level.createfx_options.size ) + { + option = level.createfx_options[ i ]; + if ( !isDefined( ent.v[ option[ "name" ] ] ) ) + { + i++; + continue; + } + else count++; + if ( count < level.effect_list_offset ) + { + i++; + continue; + } + else + { + drawncount++; + set_fx_hudelement( ( drawncount + ". " ) + option[ "description" ] + ": " + ent.v[ option[ "name" ] ] ); + if ( drawncount > level.effect_list_offset_max ) + { + more = 1; + break; + } + } + else + { + i++; + } + } + if ( count > level.effect_list_offset_max ) + { + pages = ceil( level.createfx_options.size / level.effect_list_offset_max ); + current_page = ( level.effect_list_offset / level.effect_list_offset_max ) + 1; + set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); + } + set_fx_hudelement( "(a) Add >" ); + set_fx_hudelement( "(x) Exit >" ); + } + else + { + set_fx_hudelement( "Origin: " + ent.v[ "origin" ] ); + set_fx_hudelement( "Angles: " + ent.v[ "angles" ] ); #/ + } } display_fx_add_options( ent ) { /# - assert( menu( "add_options" ) ); - assert( entities_are_selected() ); - clear_fx_hudelements(); - set_fx_hudelement( "Selected: " + level.selected_fx_ents.size + " Distance: " + get_distance_from_ent( ent ) ); - level.createfxhudelements[0][0].color = ( 1, 1, 0 ); - set_fx_hudelement( "Name: " + ent.v["fxid"] ); - set_fx_hudelement( "Origin: " + ent.v["origin"] ); - set_fx_hudelement( "Angles: " + ent.v["angles"] ); - count = 0; - drawncount = 0; - - if ( level.effect_list_offset >= level.createfx_options.size ) - level.effect_list_offset = 0; - - for ( i = 0; i < level.createfx_options.size; i++ ) - { - option = level.createfx_options[i]; - - if ( isdefined( ent.v[option["name"]] ) ) - continue; - - if ( !mask( option["mask"], ent.v["type"] ) ) - continue; - - count++; - - if ( count < level.effect_list_offset ) - continue; - - if ( drawncount >= level.effect_list_offset_max ) - continue; - - drawncount++; - button_to_check = drawncount; - - if ( button_to_check == 10 ) - button_to_check = 0; - - if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) - { - add_option_to_selected_entities( option ); - menunone(); - return; - } - - set_fx_hudelement( button_to_check + ". " + option["description"] ); - } - - if ( count > level.effect_list_offset_max ) - { - pages = ceil( level.createfx_options.size / level.effect_list_offset_max ); - current_page = level.effect_list_offset / level.effect_list_offset_max + 1; - set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); - } - - set_fx_hudelement( "(x) Exit >" ); + assert( menu( "add_options" ) ); + assert( entities_are_selected() ); + clear_fx_hudelements(); + set_fx_hudelement( "Selected: " + level.selected_fx_ents.size + " Distance: " + get_distance_from_ent( ent ) ); + level.createfxhudelements[ 0 ][ 0 ].color = ( 1, 1, 0 ); + set_fx_hudelement( "Name: " + ent.v[ "fxid" ] ); + set_fx_hudelement( "Origin: " + ent.v[ "origin" ] ); + set_fx_hudelement( "Angles: " + ent.v[ "angles" ] ); + count = 0; + drawncount = 0; + if ( level.effect_list_offset >= level.createfx_options.size ) + { + level.effect_list_offset = 0; + } + i = 0; + while ( i < level.createfx_options.size ) + { + option = level.createfx_options[ i ]; + if ( isDefined( ent.v[ option[ "name" ] ] ) ) + { + i++; + continue; + } + else if ( !mask( option[ "mask" ], ent.v[ "type" ] ) ) + { + i++; + continue; + } + else count++; + if ( count < level.effect_list_offset ) + { + i++; + continue; + } + else if ( drawncount >= level.effect_list_offset_max ) + { + i++; + continue; + } + else + { + drawncount++; + button_to_check = drawncount; + if ( button_to_check == 10 ) + { + button_to_check = 0; + } + if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) + { + add_option_to_selected_entities( option ); + menunone(); + return; + } + set_fx_hudelement( ( button_to_check + ". " ) + option[ "description" ] ); + } + i++; + } + if ( count > level.effect_list_offset_max ) + { + pages = ceil( level.createfx_options.size / level.effect_list_offset_max ); + current_page = ( level.effect_list_offset / level.effect_list_offset_max ) + 1; + set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); + } + set_fx_hudelement( "(x) Exit >" ); #/ } add_option_to_selected_entities( option ) { /# - for ( i = 0; i < level.selected_fx_ents.size; i++ ) - { - ent = level.selected_fx_ents[i]; - - if ( mask( option["mask"], ent.v["type"] ) ) - ent.v[option["name"]] = option["default"]; - } + i = 0; + while ( i < level.selected_fx_ents.size ) + { + ent = level.selected_fx_ents[ i ]; + if ( mask( option[ "mask" ], ent.v[ "type" ] ) ) + { + ent.v[ option[ "name" ] ] = option[ "default" ]; + } + i++; #/ + } } menunone() { /# - level.effect_list_offset = 0; - clear_fx_hudelements(); - setmenu( "none" ); + level.effect_list_offset = 0; + clear_fx_hudelements(); + setmenu( "none" ); #/ } draw_effects_list( title ) { /# - clear_fx_hudelements(); - - if ( !isdefined( title ) ) - title = "Pick an effect:"; - - set_fx_hudelement( title ); - count = 0; - more = 0; - keys = get_level_ambient_fx(); - - if ( level.effect_list_offset >= keys.size ) - level.effect_list_offset = 0; - else if ( level.effect_list_offset < 0 ) - level.effect_list_offset = int( floor( keys.size / level.effect_list_offset_max ) * level.effect_list_offset_max ); - - for ( i = level.effect_list_offset; i < keys.size; i++ ) - { - count += 1; - set_fx_hudelement( count + ". " + keys[i] ); - - if ( count >= level.effect_list_offset_max ) - { - more = 1; - break; - } - } - - if ( keys.size > level.effect_list_offset_max ) - { - pages = ceil( keys.size / level.effect_list_offset_max ); - current_page = level.effect_list_offset / level.effect_list_offset_max + 1; - set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); - } + clear_fx_hudelements(); + if ( !isDefined( title ) ) + { + title = "Pick an effect:"; + } + set_fx_hudelement( title ); + count = 0; + more = 0; + keys = get_level_ambient_fx(); + if ( level.effect_list_offset >= keys.size ) + { + level.effect_list_offset = 0; + } + else + { + if ( level.effect_list_offset < 0 ) + { + level.effect_list_offset = int( floor( keys.size / level.effect_list_offset_max ) * level.effect_list_offset_max ); + } + } + i = level.effect_list_offset; + while ( i < keys.size ) + { + count += 1; + set_fx_hudelement( ( count + ". " ) + keys[ i ] ); + if ( count >= level.effect_list_offset_max ) + { + more = 1; + break; + } + else + { + i++; + } + } + if ( keys.size > level.effect_list_offset_max ) + { + pages = ceil( keys.size / level.effect_list_offset_max ); + current_page = ( level.effect_list_offset / level.effect_list_offset_max ) + 1; + set_fx_hudelement( "(<-) Page " + current_page + " of " + pages + " (->)" ); #/ + } } increment_list_offset() { /# - level.effect_list_offset += level.effect_list_offset_max; + level.effect_list_offset += level.effect_list_offset_max; #/ } decrement_list_offset() { /# - level.effect_list_offset -= level.effect_list_offset_max; + level.effect_list_offset -= level.effect_list_offset_max; #/ } jump_to_effect() { /# - count = 0; - picked_fxid = undefined; - keys = get_level_ambient_fx(); - - for ( i = level.effect_list_offset; i < keys.size; i++ ) - { - count += 1; - button_to_check = count; - - if ( button_to_check == 10 ) - button_to_check = 0; - - if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) - { - picked_fxid = keys[i]; - break; - } - - if ( count > level.effect_list_offset_max ) - break; - } - - if ( !isdefined( picked_fxid ) ) - return; - - clear_entity_selection(); - ent = get_next_ent_with_same_id( -1, picked_fxid ); - - if ( isdefined( ent ) ) - { - level.cfx_next_ent = ent; - move_player_to_next_same_effect( 1 ); - } - else - iprintln( "Effect " + picked_fxid + " has not been placed." ); - - level.effect_list_offset = 0; - clear_fx_hudelements(); - setmenu( "none" ); + count = 0; + picked_fxid = undefined; + keys = get_level_ambient_fx(); + i = level.effect_list_offset; + while ( i < keys.size ) + { + count += 1; + button_to_check = count; + if ( button_to_check == 10 ) + { + button_to_check = 0; + } + if ( button_is_clicked( button_to_check + "" ) && !button_is_held( "f" ) ) + { + picked_fxid = keys[ i ]; + break; + } + else + { + if ( count > level.effect_list_offset_max ) + { + break; + } + else + { + i++; + } + } + } + if ( !isDefined( picked_fxid ) ) + { + return; + } + clear_entity_selection(); + ent = get_next_ent_with_same_id( -1, picked_fxid ); + if ( isDefined( ent ) ) + { + level.cfx_next_ent = ent; + move_player_to_next_same_effect( 1 ); + } + else + { + iprintln( "Effect " + picked_fxid + " has not been placed." ); + } + level.effect_list_offset = 0; + clear_fx_hudelements(); + setmenu( "none" ); #/ } get_level_ambient_fx() { /# - if ( !isdefined( level._effect_keys ) ) - { - keys = getarraykeys( level._effect ); - level._effect_keys = []; - k = 0; - - for ( i = 0; i < keys.size; i++ ) - { - if ( issubstr( keys[i], "fx_" ) ) - { - level._effect_keys[k] = keys[i]; - k++; - } - } - - if ( level._effect_keys.size == 0 ) - level._effect_keys = keys; - } - - return level._effect_keys; + if ( !isDefined( level._effect_keys ) ) + { + keys = getarraykeys( level._effect ); + level._effect_keys = []; + k = 0; + i = 0; + while ( i < keys.size ) + { + if ( issubstr( keys[ i ], "fx_" ) ) + { + level._effect_keys[ k ] = keys[ i ]; + k++; + } + i++; + } + if ( level._effect_keys.size == 0 ) + { + level._effect_keys = keys; + } + } + return level._effect_keys; #/ } get_distance_from_ent( ent ) { /# - player = get_players()[0]; - return distance( player geteye(), ent.v["origin"] ); + player = get_players()[ 0 ]; + return distance( player geteye(), ent.v[ "origin" ] ); #/ } diff --git a/Zombie Core/patch_zm/maps/mp/_createfxundo.gsc b/Zombie Core/patch_zm/maps/mp/_createfxundo.gsc index 3ef987b..082e0ed 100644 --- a/Zombie Core/patch_zm/maps/mp/_createfxundo.gsc +++ b/Zombie Core/patch_zm/maps/mp/_createfxundo.gsc @@ -1,508 +1,545 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\_createfx; -#include maps\mp\_createfxmenu; +#include maps/mp/_createfxmenu; +#include maps/mp/_createfx; +#include maps/mp/_utility; +#include common_scripts/utility; store_undo_state( change_type, ents ) { - if ( !isdefined( level.cfx_undo_states ) ) - { - level.cfx_undo_states = []; - level.cfx_redo_states = []; - level.cfx_limbo_state = spawnstruct(); - level.cfx_max_states = 10; - } - - if ( !isarray( ents ) ) - ents = array( ents ); - - temp_array = []; - - for ( i = 0; i < ents.size; i++ ) - temp_array[i] = copy_fx_ent( ents[i] ); - - state = spawnstruct(); - state.operation = change_type; - state.last_action = level.cfx_last_action; - state.ent_array = temp_array; - - if ( level.cfx_undo_states.size >= level.cfx_max_states ) - level.cfx_undo_states = array_drop( level.cfx_undo_states ); - - level.cfx_undo_states[level.cfx_undo_states.size] = state; - level.cfx_redo_states = []; - level.cfx_limbo_state = undefined; - debug_print_latest_state( "undo" ); + if ( !isDefined( level.cfx_undo_states ) ) + { + level.cfx_undo_states = []; + level.cfx_redo_states = []; + level.cfx_limbo_state = spawnstruct(); + level.cfx_max_states = 10; + } + if ( !isarray( ents ) ) + { + ents = array( ents ); + } + temp_array = []; + i = 0; + while ( i < ents.size ) + { + temp_array[ i ] = copy_fx_ent( ents[ i ] ); + i++; + } + state = spawnstruct(); + state.operation = change_type; + state.last_action = level.cfx_last_action; + state.ent_array = temp_array; + if ( level.cfx_undo_states.size >= level.cfx_max_states ) + { + level.cfx_undo_states = array_drop( level.cfx_undo_states ); + } + level.cfx_undo_states[ level.cfx_undo_states.size ] = state; + level.cfx_redo_states = []; + level.cfx_limbo_state = undefined; + debug_print_latest_state( "undo" ); } undo() { - if ( !isdefined( level.createfxent ) || !isdefined( level.cfx_undo_states ) || level.cfx_undo_states.size < 1 ) - return; - - revert_state = level.cfx_undo_states[level.cfx_undo_states.size - 1]; - - if ( level.cfx_last_action != "none" ) - { - store_undo_state( "edit", level.selected_fx_ents ); - move_undo_state_to_redo(); - clear_entity_selection( "skip_undo" ); - apply_state_change( "undo", revert_state ); - move_undo_state_to_limbo(); - level.cfx_last_action = "none"; - } - else - { - clear_entity_selection( "skip_undo" ); - - if ( revert_state.operation != "edit" ) - { - apply_state_change( "undo", revert_state ); - move_undo_state_to_redo(); - level.cfx_last_action = "none"; - } - else if ( isdefined( level.cfx_limbo_state ) ) - { - move_limbo_state_to_redo(); - apply_state_change( "undo", revert_state ); - move_undo_state_to_limbo(); - level.cfx_last_action = "none"; - } - else - { - if ( level.cfx_undo_states.size > 1 ) - { - move_undo_state_to_redo(); - revert_state = level.cfx_undo_states[level.cfx_undo_states.size - 1]; - } - - apply_state_change( "undo", revert_state ); - move_undo_state_to_limbo(); - } - } + if ( isDefined( level.createfxent ) || !isDefined( level.cfx_undo_states ) && level.cfx_undo_states.size < 1 ) + { + return; + } + revert_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ]; + if ( level.cfx_last_action != "none" ) + { + store_undo_state( "edit", level.selected_fx_ents ); + move_undo_state_to_redo(); + clear_entity_selection( "skip_undo" ); + apply_state_change( "undo", revert_state ); + move_undo_state_to_limbo(); + level.cfx_last_action = "none"; + } + else clear_entity_selection( "skip_undo" ); + if ( revert_state.operation != "edit" ) + { + apply_state_change( "undo", revert_state ); + move_undo_state_to_redo(); + level.cfx_last_action = "none"; + } + else if ( isDefined( level.cfx_limbo_state ) ) + { + move_limbo_state_to_redo(); + apply_state_change( "undo", revert_state ); + move_undo_state_to_limbo(); + level.cfx_last_action = "none"; + } + else + { + if ( level.cfx_undo_states.size > 1 ) + { + move_undo_state_to_redo(); + revert_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ]; + } + apply_state_change( "undo", revert_state ); + move_undo_state_to_limbo(); + } } apply_state_change( type, revert_state ) { - if ( type == "undo" ) - { + if ( type == "undo" ) + { /# - println( "^2CreateFX: Undo operation" ); + println( "^2CreateFX: Undo operation" ); #/ - if ( revert_state.operation == "edit" ) - undo_edit( revert_state.ent_array ); - else if ( revert_state.operation == "add" ) - undo_add( revert_state.ent_array ); - else if ( revert_state.operation == "delete" ) - undo_delete( revert_state.ent_array ); - } - else - { -/# - println( "^2CreateFX: Redo operation" ); + if ( revert_state.operation == "edit" ) + { + undo_edit( revert_state.ent_array ); + } + else if ( revert_state.operation == "add" ) + { + undo_add( revert_state.ent_array ); + } + else + { + if ( revert_state.operation == "delete" ) + { + undo_delete( revert_state.ent_array ); + } + } + } + else /# + println( "^2CreateFX: Redo operation" ); #/ - if ( revert_state.operation == "edit" ) - undo_edit( revert_state.ent_array ); - else if ( revert_state.operation == "add" ) - undo_delete( revert_state.ent_array ); - else if ( revert_state.operation == "delete" ) - undo_add( revert_state.ent_array ); - } + if ( revert_state.operation == "edit" ) + { + undo_edit( revert_state.ent_array ); + } + else if ( revert_state.operation == "add" ) + { + undo_delete( revert_state.ent_array ); + } + else + { + if ( revert_state.operation == "delete" ) + { + undo_add( revert_state.ent_array ); + } + } } move_undo_state_to_redo() { - if ( level.cfx_redo_states.size >= level.cfx_max_states ) - level.cfx_redo_states = array_drop( level.cfx_redo_states ); - - level.cfx_redo_states[level.cfx_redo_states.size] = level.cfx_undo_states[level.cfx_undo_states.size - 1]; - level.cfx_undo_states = array_pop( level.cfx_undo_states ); - debug_print_latest_state( "undo" ); - debug_print_latest_state( "redo" ); + if ( level.cfx_redo_states.size >= level.cfx_max_states ) + { + level.cfx_redo_states = array_drop( level.cfx_redo_states ); + } + level.cfx_redo_states[ level.cfx_redo_states.size ] = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ]; + level.cfx_undo_states = array_pop( level.cfx_undo_states ); + debug_print_latest_state( "undo" ); + debug_print_latest_state( "redo" ); } move_redo_state_to_undo() { - if ( level.cfx_undo_states.size >= level.cfx_max_states ) - level.cfx_undo_states = array_drop( level.cfx_undo_states ); - - level.cfx_undo_states[level.cfx_undo_states.size] = level.cfx_redo_states[level.cfx_redo_states.size - 1]; - level.cfx_redo_states = array_pop( level.cfx_redo_states ); - debug_print_latest_state( "undo" ); - debug_print_latest_state( "redo" ); + if ( level.cfx_undo_states.size >= level.cfx_max_states ) + { + level.cfx_undo_states = array_drop( level.cfx_undo_states ); + } + level.cfx_undo_states[ level.cfx_undo_states.size ] = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ]; + level.cfx_redo_states = array_pop( level.cfx_redo_states ); + debug_print_latest_state( "undo" ); + debug_print_latest_state( "redo" ); } move_undo_state_to_limbo() { - level.cfx_limbo_state = level.cfx_undo_states[level.cfx_undo_states.size - 1]; - level.cfx_undo_states = array_pop( level.cfx_undo_states ); - debug_print_latest_state( "undo" ); - debug_print_latest_state( "limbo" ); + level.cfx_limbo_state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ]; + level.cfx_undo_states = array_pop( level.cfx_undo_states ); + debug_print_latest_state( "undo" ); + debug_print_latest_state( "limbo" ); } move_redo_state_to_limbo() { - level.cfx_limbo_state = level.cfx_redo_states[level.cfx_redo_states.size - 1]; - level.cfx_redo_states = array_pop( level.cfx_redo_states ); - debug_print_latest_state( "redo" ); - debug_print_latest_state( "limbo" ); + level.cfx_limbo_state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ]; + level.cfx_redo_states = array_pop( level.cfx_redo_states ); + debug_print_latest_state( "redo" ); + debug_print_latest_state( "limbo" ); } move_limbo_state_to_undo() { - if ( level.cfx_undo_states.size >= level.cfx_max_states ) - level.cfx_undo_states = array_drop( level.cfx_undo_states ); - - level.cfx_undo_states[level.cfx_undo_states.size] = level.cfx_limbo_state; - level.cfx_limbo_state = undefined; - debug_print_latest_state( "undo" ); - debug_print_latest_state( "limbo" ); + if ( level.cfx_undo_states.size >= level.cfx_max_states ) + { + level.cfx_undo_states = array_drop( level.cfx_undo_states ); + } + level.cfx_undo_states[ level.cfx_undo_states.size ] = level.cfx_limbo_state; + level.cfx_limbo_state = undefined; + debug_print_latest_state( "undo" ); + debug_print_latest_state( "limbo" ); } move_limbo_state_to_redo() { - if ( level.cfx_redo_states.size >= level.cfx_max_states ) - level.cfx_redo_states = array_drop( level.cfx_redo_states ); - - level.cfx_redo_states[level.cfx_redo_states.size] = level.cfx_limbo_state; - level.cfx_limbo_state = undefined; - debug_print_latest_state( "redo" ); + if ( level.cfx_redo_states.size >= level.cfx_max_states ) + { + level.cfx_redo_states = array_drop( level.cfx_redo_states ); + } + level.cfx_redo_states[ level.cfx_redo_states.size ] = level.cfx_limbo_state; + level.cfx_limbo_state = undefined; + debug_print_latest_state( "redo" ); } undo_edit( ent_array ) { - ent_array = reorder_ent_array_by_uniqueid( ent_array ); + ent_array = reorder_ent_array_by_uniqueid( ent_array ); /# - println( "^3CreateFX: Undoing edit" ); - debug_print_ent_array( ent_array, "ent_array[]" ); - debug_print_ent_array( level.createfxent, "level.createFXent[]" ); + println( "^3CreateFX: Undoing edit" ); + debug_print_ent_array( ent_array, "ent_array[]" ); + debug_print_ent_array( level.createfxent, "level.createFXent[]" ); #/ - last_id = ent_array[ent_array.size - 1].uniqueid; + last_id = ent_array[ ent_array.size - 1 ].uniqueid; + if ( last_id > ( level.createfxent.size - 1 ) ) + { + last_id = level.createfxent.size - 1; + } + j = ent_array.size - 1; + source_ent = ent_array[ j ]; + i = last_id; + while ( i >= 0 ) + { + target_ent = level.createfxent[ i ]; + if ( source_ent.uniqueid == target_ent.uniqueid ) + { + copy_values_between_fx_ents( source_ent, target_ent ); + select_entity( i, target_ent, "skip_undo" ); + j--; - if ( last_id > level.createfxent.size - 1 ) - last_id = level.createfxent.size - 1; + if ( j < 0 ) + { + break; + } + else + { + source_ent = ent_array[ j ]; + } + i--; - j = ent_array.size - 1; - source_ent = ent_array[j]; - - for ( i = last_id; i >= 0; i-- ) - { - target_ent = level.createfxent[i]; - - if ( source_ent.uniqueid == target_ent.uniqueid ) - { - copy_values_between_fx_ents( source_ent, target_ent ); - select_entity( i, target_ent, "skip_undo" ); - j--; - - if ( j < 0 ) - break; - - source_ent = ent_array[j]; - } - } - - update_selected_entities(); + } + } + update_selected_entities(); /# - println( "^1CreateFX: Finished edit" ); - debug_print_ent_array( level.createfxent, "level.createFXent[]" ); + println( "^1CreateFX: Finished edit" ); + debug_print_ent_array( level.createfxent, "level.createFXent[]" ); #/ } undo_add( ent_array ) { - ent_array = reorder_ent_array_by_uniqueid( ent_array ); + ent_array = reorder_ent_array_by_uniqueid( ent_array ); /# - println( "^3createfx: Undoing add." ); - debug_print_ent_array( ent_array, "ent_array[]" ); - debug_print_ent_array( level.createfxent, "level.createFXent[]" ); + println( "^3createfx: Undoing add." ); + debug_print_ent_array( ent_array, "ent_array[]" ); + debug_print_ent_array( level.createfxent, "level.createFXent[]" ); #/ - last_id = ent_array[ent_array.size - 1].uniqueid; + last_id = ent_array[ ent_array.size - 1 ].uniqueid; + if ( last_id > ( level.createfxent.size - 1 ) ) + { + last_id = level.createfxent.size - 1; + } + j = ent_array.size - 1; + source_ent = ent_array[ j ]; + i = last_id; + while ( i >= 0 ) + { + target_ent = level.createfxent[ i ]; + if ( source_ent.uniqueid == target_ent.uniqueid ) + { + if ( isDefined( target_ent.looper ) ) + { + target_ent.looper delete(); + } + target_ent notify( "stop_loop" ); + j--; - if ( last_id > level.createfxent.size - 1 ) - last_id = level.createfxent.size - 1; + if ( j < 0 ) + { + break; + } + else + { + source_ent = ent_array[ j ]; + } + i--; - j = ent_array.size - 1; - source_ent = ent_array[j]; - - for ( i = last_id; i >= 0; i-- ) - { - target_ent = level.createfxent[i]; - - if ( source_ent.uniqueid == target_ent.uniqueid ) - { - if ( isdefined( target_ent.looper ) ) - target_ent.looper delete(); - - target_ent notify( "stop_loop" ); - level.createfxent[i] = undefined; - j--; - - if ( j < 0 ) - break; - - source_ent = ent_array[j]; - } - } + } + } /# - debug_print_ent_array( level.createfxent, "level.createFXent[]" ); - println( "createfx: Starting array_remove_undefined()" ); + debug_print_ent_array( level.createfxent, "level.createFXent[]" ); + println( "createfx: Starting array_remove_undefined()" ); #/ - arrayremovevalue( level.createfxent, undefined ); + arrayremovevalue( level.createfxent, undefined ); /# - println( "^1CreateFX: Finished undo add." ); - debug_print_ent_array( level.createfxent, "level.createFXent[]" ); + println( "^1CreateFX: Finished undo add." ); + debug_print_ent_array( level.createfxent, "level.createFXent[]" ); #/ - clear_fx_hudelements(); + clear_fx_hudelements(); } undo_delete( ent_array ) { /# - println( "^3CreateFX: Undoing delete" ); - debug_print_ent_array( ent_array, "ent_array in undo_delete()" ); - debug_print_ent_array( level.createfxent, "level.createFXent[]" ); + println( "^3CreateFX: Undoing delete" ); + debug_print_ent_array( ent_array, "ent_array in undo_delete()" ); + debug_print_ent_array( level.createfxent, "level.createFXent[]" ); #/ - ent_array = reorder_ent_array_by_uniqueid( ent_array ); + ent_array = reorder_ent_array_by_uniqueid( ent_array ); + if ( level.createfxent.size == 0 ) + { + i = 0; + while ( i < ent_array.size ) + { + level.createfxent[ i ] = copy_fx_ent( ent_array[ i ] ); + i++; + } + } + else temp_array = []; + i = 0; + j = 0; + while ( j < level.createfxent.size ) + { + target_ent = level.createfxent[ j ]; + if ( i >= ent_array.size ) + { + temp_array[ temp_array.size ] = target_ent; + j++; + continue; + } + else source_ent = ent_array[ i ]; + if ( target_ent.uniqueid < source_ent.uniqueid ) + { + temp_array[ temp_array.size ] = target_ent; + j++; + continue; + } + else + { + temp_array[ temp_array.size ] = copy_fx_ent( source_ent ); + j--; - if ( level.createfxent.size == 0 ) - { - for ( i = 0; i < ent_array.size; i++ ) - level.createfxent[i] = copy_fx_ent( ent_array[i] ); - } - else - { - temp_array = []; - i = 0; - - for ( j = 0; j < level.createfxent.size; j++ ) - { - target_ent = level.createfxent[j]; - - if ( i >= ent_array.size ) - { - temp_array[temp_array.size] = target_ent; - continue; - } - - source_ent = ent_array[i]; - - if ( target_ent.uniqueid < source_ent.uniqueid ) - { - temp_array[temp_array.size] = target_ent; - continue; - } - - temp_array[temp_array.size] = copy_fx_ent( source_ent ); - j--; - i++; - } - - while ( i < ent_array.size ) - { - temp_array[temp_array.size] = ent_array[i]; - i++; - } - - level.createfxent = temp_array; - } + i++; + } + j++; + } + while ( i < ent_array.size ) + { + temp_array[ temp_array.size ] = ent_array[ i ]; + i++; + } + level.createfxent = temp_array; /# - println( "^1Createfx: Finished undoing delete, pre-selection" ); - debug_print_ent_array( level.createfxent, "level.createFXent[]" ); + println( "^1Createfx: Finished undoing delete, pre-selection" ); + debug_print_ent_array( level.createfxent, "level.createFXent[]" ); #/ - last_id = ent_array[ent_array.size - 1].uniqueid; + last_id = ent_array[ ent_array.size - 1 ].uniqueid; + if ( last_id > ( level.createfxent.size - 1 ) ) + { + last_id = level.createfxent.size - 1; + } + j = ent_array.size - 1; + source_ent = ent_array[ j ]; + i = last_id; + while ( i >= 0 ) + { + target_ent = level.createfxent[ i ]; + if ( source_ent.uniqueid == target_ent.uniqueid ) + { + target_ent post_entity_creation_function(); + select_entity( i, target_ent, "skip_undo" ); + j--; - if ( last_id > level.createfxent.size - 1 ) - last_id = level.createfxent.size - 1; + if ( j < 0 ) + { + break; + } + else + { + source_ent = ent_array[ j ]; + } + i--; - j = ent_array.size - 1; - source_ent = ent_array[j]; - - for ( i = last_id; i >= 0; i-- ) - { - target_ent = level.createfxent[i]; - - if ( source_ent.uniqueid == target_ent.uniqueid ) - { - target_ent post_entity_creation_function(); - select_entity( i, target_ent, "skip_undo" ); - j--; - - if ( j < 0 ) - break; - - source_ent = ent_array[j]; - } - } - - update_selected_entities(); + } + } + update_selected_entities(); } redo() { - if ( !isdefined( level.createfxent ) || !isdefined( level.cfx_redo_states ) || level.cfx_redo_states.size < 1 ) - return; - - clear_entity_selection( "skip_undo" ); - - if ( isdefined( level.cfx_limbo_state ) ) - { - move_limbo_state_to_undo(); - move_redo_state_to_limbo(); - apply_state_change( "redo", level.cfx_limbo_state ); - } - else - { - revert_state = level.cfx_redo_states[level.cfx_redo_states.size - 1]; - apply_state_change( "redo", revert_state ); - - if ( revert_state.operation == "edit" ) - move_redo_state_to_limbo(); - else - move_redo_state_to_undo(); - } - - level.cfx_last_action = "none"; + if ( isDefined( level.createfxent ) || !isDefined( level.cfx_redo_states ) && level.cfx_redo_states.size < 1 ) + { + return; + } + clear_entity_selection( "skip_undo" ); + if ( isDefined( level.cfx_limbo_state ) ) + { + move_limbo_state_to_undo(); + move_redo_state_to_limbo(); + apply_state_change( "redo", level.cfx_limbo_state ); + } + else revert_state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ]; + apply_state_change( "redo", revert_state ); + if ( revert_state.operation == "edit" ) + { + move_redo_state_to_limbo(); + } + else + { + move_redo_state_to_undo(); + } + level.cfx_last_action = "none"; } reorder_ent_array_by_uniqueid( ent_array ) { - if ( ent_array.size <= 1 ) - return ent_array; - - array_size = ent_array.size; - - for ( i = 0; i < array_size - 1; i++ ) - { - for ( j = i + 1; j < array_size; j++ ) - { - if ( ent_array[i].uniqueid > ent_array[j].uniqueid ) - { - temp_ent = ent_array[i]; - ent_array[i] = ent_array[j]; - ent_array[j] = temp_ent; - } - } - } - - return ent_array; + if ( ent_array.size <= 1 ) + { + return ent_array; + } + array_size = ent_array.size; + i = 0; + while ( i < ( array_size - 1 ) ) + { + j = i + 1; + while ( j < array_size ) + { + if ( ent_array[ i ].uniqueid > ent_array[ j ].uniqueid ) + { + temp_ent = ent_array[ i ]; + ent_array[ i ] = ent_array[ j ]; + ent_array[ j ] = temp_ent; + } + j++; + } + i++; + } + return ent_array; } copy_fx_ent( ent ) { - temp_ent = spawnstruct(); - temp_ent.drawn = ent.drawn; - temp_ent.drawn_axis_model = ent.drawn_axis_model; - temp_ent.last_fx_index = ent.last_fx_index; - temp_ent.textalpha = ent.textalpha; - temp_ent.uniqueid = ent.uniqueid; - temp_ent.v = ent.v; - return temp_ent; + temp_ent = spawnstruct(); + temp_ent.drawn = ent.drawn; + temp_ent.drawn_axis_model = ent.drawn_axis_model; + temp_ent.last_fx_index = ent.last_fx_index; + temp_ent.textalpha = ent.textalpha; + temp_ent.uniqueid = ent.uniqueid; + temp_ent.v = ent.v; + return temp_ent; } copy_values_between_fx_ents( source, dest ) { - dest.drawn = source.drawn; - dest.drawn_axis_model = source.drawn_axis_model; - dest.last_fx_index = source.last_fx_index; - dest.textalpha = source.textalpha; - dest.v = source.v; - return dest; + dest.drawn = source.drawn; + dest.drawn_axis_model = source.drawn_axis_model; + dest.last_fx_index = source.last_fx_index; + dest.textalpha = source.textalpha; + dest.v = source.v; + return dest; } array_pop( array ) { - array_size = array.size - 1; - temp_array = []; - - if ( array_size <= 0 ) - return temp_array; - - for ( i = 0; i < array_size; i++ ) - temp_array[i] = array[i]; - - array = temp_array; - return array; + array_size = array.size - 1; + temp_array = []; + if ( array_size <= 0 ) + { + return temp_array; + } + i = 0; + while ( i < array_size ) + { + temp_array[ i ] = array[ i ]; + i++; + } + array = temp_array; + return array; } array_drop( array ) { - if ( array.size > 0 ) - { - temp_array = []; - - for ( i = 1; i < array.size; i++ ) - temp_array[i - 1] = array[i]; - - array = temp_array; - } - - return array; + if ( array.size > 0 ) + { + temp_array = []; + i = 1; + while ( i < array.size ) + { + temp_array[ i - 1 ] = array[ i ]; + i++; + } + array = temp_array; + } + return array; } debug_print_ent_array( array, name ) { /# - if ( isdefined( name ) ) - println( "Printing out " + name ); - else - println( "Printing out some array" ); - - for ( i = 0; i < array.size; i++ ) - { - if ( !isdefined( array[i] ) ) - { - println( "" + i + ": deleted effect" ); - continue; - } - - println( "" + i + ": uniqueid: " + array[i].uniqueid + " fxid: " + array[i].v["fxid"] ); - } + if ( isDefined( name ) ) + { + println( "Printing out " + name ); + } + else + { + println( "Printing out some array" ); + } + i = 0; + while ( i < array.size ) + { + if ( !isDefined( array[ i ] ) ) + { + println( "" + i + ": deleted effect" ); + i++; + continue; + } + else + { + println( "" + i + ": uniqueid: " + array[ i ].uniqueid + " fxid: " + array[ i ].v[ "fxid" ] ); + } + i++; #/ + } } debug_print_latest_state( type ) { /# - println( "^3Saving " + type + " state" ); - - if ( type == "undo" ) - { - if ( !isdefined( level.cfx_undo_states[level.cfx_undo_states.size - 1] ) ) - { - println( "There are no undo states." ); - return; - } - - state = level.cfx_undo_states[level.cfx_undo_states.size - 1]; - size = level.cfx_undo_states.size - 1; - } - else if ( type == "redo" ) - { - if ( !isdefined( level.cfx_redo_states[level.cfx_redo_states.size - 1] ) ) - { - println( "There are no redo states." ); - return; - } - - state = level.cfx_redo_states[level.cfx_redo_states.size - 1]; - size = level.cfx_redo_states.size - 1; - } - else - { - if ( !isdefined( level.cfx_limbo_state ) ) - { - println( "There is no limbo state." ); - return; - } - - state = level.cfx_limbo_state; - size = 0; - } - - println( "State " + size + " - " + state.operation + ": " + state.last_action ); - debug_print_ent_array( state.ent_array, "save state ent_array" ); + println( "^3Saving " + type + " state" ); + if ( type == "undo" ) + { + if ( !isDefined( level.cfx_undo_states[ level.cfx_undo_states.size - 1 ] ) ) + { + println( "There are no undo states." ); + return; + } + state = level.cfx_undo_states[ level.cfx_undo_states.size - 1 ]; + size = level.cfx_undo_states.size - 1; + } + else if ( type == "redo" ) + { + if ( !isDefined( level.cfx_redo_states[ level.cfx_redo_states.size - 1 ] ) ) + { + println( "There are no redo states." ); + return; + } + state = level.cfx_redo_states[ level.cfx_redo_states.size - 1 ]; + size = level.cfx_redo_states.size - 1; + } + else + { + if ( !isDefined( level.cfx_limbo_state ) ) + { + println( "There is no limbo state." ); + return; + } + state = level.cfx_limbo_state; + size = 0; + } + println( "State " + size + " - " + state.operation + ": " + state.last_action ); + debug_print_ent_array( state.ent_array, "save state ent_array" ); #/ } diff --git a/Zombie Core/patch_zm/maps/mp/_demo.gsc b/Zombie Core/patch_zm/maps/mp/_demo.gsc index ce5101f..72e387c 100644 --- a/Zombie Core/patch_zm/maps/mp/_demo.gsc +++ b/Zombie Core/patch_zm/maps/mp/_demo.gsc @@ -1,94 +1,97 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool init() { - level.bookmark["kill"] = 0; - level.bookmark["event"] = 1; - level.bookmark["zm_round_end"] = 2; - level.bookmark["zm_player_downed"] = 3; - level.bookmark["zm_player_revived"] = 4; - level.bookmark["zm_player_bledout"] = 5; - level.bookmark["zm_player_use_magicbox"] = 6; - level.bookmark["score_event"] = 7; - level.bookmark["medal"] = 8; - level.bookmark["round_result"] = 9; - level.bookmark["game_result"] = 10; - level.bookmark["zm_powerup_dropped"] = 11; - level.bookmark["zm_player_powerup_grabbed"] = 12; - level.bookmark["zm_player_perk"] = 13; - level.bookmark["zm_power"] = 14; - level.bookmark["zm_player_door"] = 15; - level.bookmark["zm_player_buildable_placed"] = 16; - level.bookmark["zm_player_use_packapunch"] = 17; - level.bookmark["zm_player_rampage"] = 18; - level.bookmark["zm_player_grenade_special"] = 19; - level.bookmark["zm_player_grenade_multiattack"] = 20; - level.bookmark["zm_player_meat_stink"] = 21; - level.bookmark["zm_player_grabbed_magicbox"] = 22; - level.bookmark["zm_player_grabbed_packapunch"] = 23; - level.bookmark["zm_player_grenade_special_long"] = 24; + level.bookmark[ "kill" ] = 0; + level.bookmark[ "event" ] = 1; + level.bookmark[ "zm_round_end" ] = 2; + level.bookmark[ "zm_player_downed" ] = 3; + level.bookmark[ "zm_player_revived" ] = 4; + level.bookmark[ "zm_player_bledout" ] = 5; + level.bookmark[ "zm_player_use_magicbox" ] = 6; + level.bookmark[ "score_event" ] = 7; + level.bookmark[ "medal" ] = 8; + level.bookmark[ "round_result" ] = 9; + level.bookmark[ "game_result" ] = 10; + level.bookmark[ "zm_powerup_dropped" ] = 11; + level.bookmark[ "zm_player_powerup_grabbed" ] = 12; + level.bookmark[ "zm_player_perk" ] = 13; + level.bookmark[ "zm_power" ] = 14; + level.bookmark[ "zm_player_door" ] = 15; + level.bookmark[ "zm_player_buildable_placed" ] = 16; + level.bookmark[ "zm_player_use_packapunch" ] = 17; + level.bookmark[ "zm_player_rampage" ] = 18; + level.bookmark[ "zm_player_grenade_special" ] = 19; + level.bookmark[ "zm_player_grenade_multiattack" ] = 20; + level.bookmark[ "zm_player_meat_stink" ] = 21; + level.bookmark[ "zm_player_grabbed_magicbox" ] = 22; + level.bookmark[ "zm_player_grabbed_packapunch" ] = 23; + level.bookmark[ "zm_player_grenade_special_long" ] = 24; } bookmark( type, time, clientent1, clientent2, eventpriority, inflictorent, overrideentitycamera, actorent ) { /# - assert( isdefined( level.bookmark[type] ), "Unable to find a bookmark type for type - " + type ); + assert( isDefined( level.bookmark[ type ] ), "Unable to find a bookmark type for type - " + type ); #/ - client1 = 255; - client2 = 255; - inflictorentnum = -1; - inflictorenttype = 0; - inflictorbirthtime = 0; - actorentnum = undefined; - scoreeventpriority = 0; - - if ( isdefined( clientent1 ) ) - client1 = clientent1 getentitynumber(); - - if ( isdefined( clientent2 ) ) - client2 = clientent2 getentitynumber(); - - if ( isdefined( eventpriority ) ) - scoreeventpriority = eventpriority; - - if ( isdefined( inflictorent ) ) - { - inflictorentnum = inflictorent getentitynumber(); - inflictorenttype = inflictorent getentitytype(); - - if ( isdefined( inflictorent.birthtime ) ) - inflictorbirthtime = inflictorent.birthtime; - } - - if ( !isdefined( overrideentitycamera ) ) - overrideentitycamera = 0; - - if ( isdefined( actorent ) ) - actorentnum = actorent getentitynumber(); - - adddemobookmark( level.bookmark[type], time, client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum ); + client1 = 255; + client2 = 255; + inflictorentnum = -1; + inflictorenttype = 0; + inflictorbirthtime = 0; + actorentnum = undefined; + scoreeventpriority = 0; + if ( isDefined( clientent1 ) ) + { + client1 = clientent1 getentitynumber(); + } + if ( isDefined( clientent2 ) ) + { + client2 = clientent2 getentitynumber(); + } + if ( isDefined( eventpriority ) ) + { + scoreeventpriority = eventpriority; + } + if ( isDefined( inflictorent ) ) + { + inflictorentnum = inflictorent getentitynumber(); + inflictorenttype = inflictorent getentitytype(); + if ( isDefined( inflictorent.birthtime ) ) + { + inflictorbirthtime = inflictorent.birthtime; + } + } + if ( !isDefined( overrideentitycamera ) ) + { + overrideentitycamera = 0; + } + if ( isDefined( actorent ) ) + { + actorentnum = actorent getentitynumber(); + } + adddemobookmark( level.bookmark[ type ], time, client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum ); } gameresultbookmark( type, winningteamindex, losingteamindex ) { /# - assert( isdefined( level.bookmark[type] ), "Unable to find a bookmark type for type - " + type ); + assert( isDefined( level.bookmark[ type ] ), "Unable to find a bookmark type for type - " + type ); #/ - client1 = 255; - client2 = 255; - scoreeventpriority = 0; - inflictorentnum = -1; - inflictorenttype = 0; - inflictorbirthtime = 0; - overrideentitycamera = 0; - actorentnum = undefined; - - if ( isdefined( winningteamindex ) ) - client1 = winningteamindex; - - if ( isdefined( losingteamindex ) ) - client2 = losingteamindex; - - adddemobookmark( level.bookmark[type], gettime(), client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum ); + client1 = 255; + client2 = 255; + scoreeventpriority = 0; + inflictorentnum = -1; + inflictorenttype = 0; + inflictorbirthtime = 0; + overrideentitycamera = 0; + actorentnum = undefined; + if ( isDefined( winningteamindex ) ) + { + client1 = winningteamindex; + } + if ( isDefined( losingteamindex ) ) + { + client2 = losingteamindex; + } + adddemobookmark( level.bookmark[ type ], getTime(), client1, client2, scoreeventpriority, inflictorentnum, inflictorenttype, inflictorbirthtime, overrideentitycamera, actorentnum ); } diff --git a/Zombie Core/patch_zm/maps/mp/_fx.gsc b/Zombie Core/patch_zm/maps/mp/_fx.gsc index 32ef5e4..568ef04 100644 --- a/Zombie Core/patch_zm/maps/mp/_fx.gsc +++ b/Zombie Core/patch_zm/maps/mp/_fx.gsc @@ -1,455 +1,458 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\_createfx; +#include maps/mp/_createfx; +#include maps/mp/_utility; +#include common_scripts/utility; print_org( fxcommand, fxid, fxpos, waittime ) { /# - if ( getdvar( _hash_F49A52C ) == "1" ) - { - println( "{" ); - println( "\"origin\" \"" + fxpos[0] + " " + fxpos[1] + " " + fxpos[2] + "\"" ); - println( "\"classname\" \"script_model\"" ); - println( "\"model\" \"fx\"" ); - println( "\"script_fxcommand\" \"" + fxcommand + "\"" ); - println( "\"script_fxid\" \"" + fxid + "\"" ); - println( "\"script_delay\" \"" + waittime + "\"" ); - println( "}" ); - } + if ( getDvar( "debug" ) == "1" ) + { + println( "{" ); + println( ""origin" "" + fxpos[ 0 ] + " " + fxpos[ 1 ] + " " + fxpos[ 2 ] + """ ); + println( ""classname" "script_model"" ); + println( ""model" "fx"" ); + println( ""script_fxcommand" "" + fxcommand + """ ); + println( ""script_fxid" "" + fxid + """ ); + println( ""script_delay" "" + waittime + """ ); + println( "}" ); #/ + } } oneshotfx( fxid, fxpos, waittime, fxpos2 ) { - } oneshotfxthread() { - wait 0.05; - - if ( self.v["delay"] > 0 ) - wait( self.v["delay"] ); - - create_triggerfx(); + wait 0,05; + if ( self.v[ "delay" ] > 0 ) + { + wait self.v[ "delay" ]; + } + create_triggerfx(); } create_triggerfx() { - self.looper = spawnfx_wrapper( self.v["fxid"], self.v["origin"], self.v["forward"], self.v["up"] ); - triggerfx( self.looper, self.v["delay"] ); - create_loopsound(); + self.looper = spawnfx_wrapper( self.v[ "fxid" ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); + triggerfx( self.looper, self.v[ "delay" ] ); + create_loopsound(); } exploderfx( num, fxid, fxpos, waittime, fxpos2, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout, exploder_group ) { - if ( 1 ) - { - ent = createexploder( fxid ); - ent.v["origin"] = fxpos; - ent.v["angles"] = ( 0, 0, 0 ); - - if ( isdefined( fxpos2 ) ) - ent.v["angles"] = vectortoangles( fxpos2 - fxpos ); - - ent.v["delay"] = waittime; - ent.v["exploder"] = num; - return; - } - - fx = spawn( "script_origin", ( 0, 0, 0 ) ); - fx.origin = fxpos; - fx.angles = vectortoangles( fxpos2 - fxpos ); - fx.script_exploder = num; - fx.script_fxid = fxid; - fx.script_delay = waittime; - fx.script_firefx = firefx; - fx.script_firefxdelay = firefxdelay; - fx.script_firefxsound = firefxsound; - fx.script_sound = fxsound; - fx.script_earthquake = fxquake; - fx.script_damage = fxdamage; - fx.script_radius = damage_radius; - fx.script_soundalias = soundalias; - fx.script_firefxtimeout = firefxtimeout; - fx.script_repeat = repeat; - fx.script_delay_min = delay_min; - fx.script_delay_max = delay_max; - fx.script_exploder_group = exploder_group; - forward = anglestoforward( fx.angles ); - forward = vectorscale( forward, 150 ); - fx.targetpos = fxpos + forward; - - if ( !isdefined( level._script_exploders ) ) - level._script_exploders = []; - - level._script_exploders[level._script_exploders.size] = fx; - maps\mp\_createfx::createfx_showorigin( fxid, fxpos, waittime, fxpos2, "exploderfx", fx, undefined, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout ); + if ( 1 ) + { + ent = createexploder( fxid ); + ent.v[ "origin" ] = fxpos; + ent.v[ "angles" ] = ( 0, 0, 0 ); + if ( isDefined( fxpos2 ) ) + { + ent.v[ "angles" ] = vectorToAngle( fxpos2 - fxpos ); + } + ent.v[ "delay" ] = waittime; + ent.v[ "exploder" ] = num; + return; + } + fx = spawn( "script_origin", ( 0, 0, 0 ) ); + fx.origin = fxpos; + fx.angles = vectorToAngle( fxpos2 - fxpos ); + fx.script_exploder = num; + fx.script_fxid = fxid; + fx.script_delay = waittime; + fx.script_firefx = firefx; + fx.script_firefxdelay = firefxdelay; + fx.script_firefxsound = firefxsound; + fx.script_sound = fxsound; + fx.script_earthquake = fxquake; + fx.script_damage = fxdamage; + fx.script_radius = damage_radius; + fx.script_soundalias = soundalias; + fx.script_firefxtimeout = firefxtimeout; + fx.script_repeat = repeat; + fx.script_delay_min = delay_min; + fx.script_delay_max = delay_max; + fx.script_exploder_group = exploder_group; + forward = anglesToForward( fx.angles ); + forward = vectorScale( forward, 150 ); + fx.targetpos = fxpos + forward; + if ( !isDefined( level._script_exploders ) ) + { + level._script_exploders = []; + } + level._script_exploders[ level._script_exploders.size ] = fx; + maps/mp/_createfx::createfx_showorigin( fxid, fxpos, waittime, fxpos2, "exploderfx", fx, undefined, firefx, firefxdelay, firefxsound, fxsound, fxquake, fxdamage, soundalias, repeat, delay_min, delay_max, damage_radius, firefxtimeout ); } loopfx( fxid, fxpos, waittime, fxpos2, fxstart, fxstop, timeout ) { /# - println( "Loopfx is deprecated!" ); + println( "Loopfx is deprecated!" ); #/ - ent = createloopeffect( fxid ); - ent.v["origin"] = fxpos; - ent.v["angles"] = ( 0, 0, 0 ); - - if ( isdefined( fxpos2 ) ) - ent.v["angles"] = vectortoangles( fxpos2 - fxpos ); - - ent.v["delay"] = waittime; + ent = createloopeffect( fxid ); + ent.v[ "origin" ] = fxpos; + ent.v[ "angles" ] = ( 0, 0, 0 ); + if ( isDefined( fxpos2 ) ) + { + ent.v[ "angles" ] = vectorToAngle( fxpos2 - fxpos ); + } + ent.v[ "delay" ] = waittime; } create_looper() { - self.looper = playloopedfx( level._effect[self.v["fxid"]], self.v["delay"], self.v["origin"], 0, self.v["forward"], self.v["up"] ); - create_loopsound(); + self.looper = playloopedfx( level._effect[ self.v[ "fxid" ] ], self.v[ "delay" ], self.v[ "origin" ], 0, self.v[ "forward" ], self.v[ "up" ] ); + create_loopsound(); } create_loopsound() { - self notify( "stop_loop" ); - - if ( isdefined( self.v["soundalias"] ) && self.v["soundalias"] != "nil" ) - { - if ( isdefined( self.looper ) ) - self.looper thread maps\mp\_utility::loop_fx_sound( self.v["soundalias"], self.v["origin"], "death" ); - else - thread maps\mp\_utility::loop_fx_sound( self.v["soundalias"], self.v["origin"], "stop_loop" ); - } + self notify( "stop_loop" ); + if ( isDefined( self.v[ "soundalias" ] ) && self.v[ "soundalias" ] != "nil" ) + { + if ( isDefined( self.looper ) ) + { + self.looper thread maps/mp/_utility::loop_fx_sound( self.v[ "soundalias" ], self.v[ "origin" ], "death" ); + return; + } + else + { + thread maps/mp/_utility::loop_fx_sound( self.v[ "soundalias" ], self.v[ "origin" ], "stop_loop" ); + } + } } stop_loopsound() { - self notify( "stop_loop" ); + self notify( "stop_loop" ); } loopfxthread() { - wait 0.05; - - if ( isdefined( self.fxstart ) ) - level waittill( "start fx" + self.fxstart ); - - while ( true ) - { - create_looper(); - - if ( isdefined( self.timeout ) ) - thread loopfxstop( self.timeout ); - - if ( isdefined( self.fxstop ) ) - level waittill( "stop fx" + self.fxstop ); - else - return; - - if ( isdefined( self.looper ) ) - self.looper delete(); - - if ( isdefined( self.fxstart ) ) - level waittill( "start fx" + self.fxstart ); - else - return; - } + wait 0,05; + if ( isDefined( self.fxstart ) ) + { + level waittill( "start fx" + self.fxstart ); + } + while ( 1 ) + { + create_looper(); + if ( isDefined( self.timeout ) ) + { + thread loopfxstop( self.timeout ); + } + if ( isDefined( self.fxstop ) ) + { + level waittill( "stop fx" + self.fxstop ); + } + else + { + return; + } + if ( isDefined( self.looper ) ) + { + self.looper delete(); + } + if ( isDefined( self.fxstart ) ) + { + level waittill( "start fx" + self.fxstart ); + continue; + } + else + { + return; + } + } } loopfxchangeid( ent ) { - self endon( "death" ); - - ent waittill( "effect id changed", change ); + self endon( "death" ); + ent waittill( "effect id changed", change ); } loopfxchangeorg( ent ) { - self endon( "death" ); - - for (;;) - { - ent waittill( "effect org changed", change ); - - self.origin = change; - } + self endon( "death" ); + for ( ;; ) + { + ent waittill( "effect org changed", change ); + self.origin = change; + } } loopfxchangedelay( ent ) { - self endon( "death" ); - - ent waittill( "effect delay changed", change ); + self endon( "death" ); + ent waittill( "effect delay changed", change ); } loopfxdeletion( ent ) { - self endon( "death" ); - - ent waittill( "effect deleted" ); - - self delete(); + self endon( "death" ); + ent waittill( "effect deleted" ); + self delete(); } loopfxstop( timeout ) { - self endon( "death" ); - wait( timeout ); - self.looper delete(); + self endon( "death" ); + wait timeout; + self.looper delete(); } loopsound( sound, pos, waittime ) { - level thread loopsoundthread( sound, pos, waittime ); + level thread loopsoundthread( sound, pos, waittime ); } loopsoundthread( sound, pos, waittime ) { - org = spawn( "script_origin", pos ); - org.origin = pos; - org playloopsound( sound ); + org = spawn( "script_origin", pos ); + org.origin = pos; + org playloopsound( sound ); } gunfireloopfx( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax ) { - thread gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax ); + thread gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax ); } gunfireloopfxthread( fxid, fxpos, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax ) { - level endon( "stop all gunfireloopfx" ); - wait 0.05; - - if ( betweensetsmax < betweensetsmin ) - { - temp = betweensetsmax; - betweensetsmax = betweensetsmin; - betweensetsmin = temp; - } - - betweensetsbase = betweensetsmin; - betweensetsrange = betweensetsmax - betweensetsmin; - - if ( shotdelaymax < shotdelaymin ) - { - temp = shotdelaymax; - shotdelaymax = shotdelaymin; - shotdelaymin = temp; - } - - shotdelaybase = shotdelaymin; - shotdelayrange = shotdelaymax - shotdelaymin; - - if ( shotsmax < shotsmin ) - { - temp = shotsmax; - shotsmax = shotsmin; - shotsmin = temp; - } - - shotsbase = shotsmin; - shotsrange = shotsmax - shotsmin; - fxent = spawnfx( level._effect[fxid], fxpos ); - - for (;;) - { - shotnum = shotsbase + randomint( shotsrange ); - - for ( i = 0; i < shotnum; i++ ) - { - triggerfx( fxent ); - wait( shotdelaybase + randomfloat( shotdelayrange ) ); - } - - wait( betweensetsbase + randomfloat( betweensetsrange ) ); - } + level endon( "stop all gunfireloopfx" ); + wait 0,05; + if ( betweensetsmax < betweensetsmin ) + { + temp = betweensetsmax; + betweensetsmax = betweensetsmin; + betweensetsmin = temp; + } + betweensetsbase = betweensetsmin; + betweensetsrange = betweensetsmax - betweensetsmin; + if ( shotdelaymax < shotdelaymin ) + { + temp = shotdelaymax; + shotdelaymax = shotdelaymin; + shotdelaymin = temp; + } + shotdelaybase = shotdelaymin; + shotdelayrange = shotdelaymax - shotdelaymin; + if ( shotsmax < shotsmin ) + { + temp = shotsmax; + shotsmax = shotsmin; + shotsmin = temp; + } + shotsbase = shotsmin; + shotsrange = shotsmax - shotsmin; + fxent = spawnfx( level._effect[ fxid ], fxpos ); + for ( ;; ) + { + shotnum = shotsbase + randomint( shotsrange ); + i = 0; + while ( i < shotnum ) + { + triggerfx( fxent ); + wait ( shotdelaybase + randomfloat( shotdelayrange ) ); + i++; + } + wait ( betweensetsbase + randomfloat( betweensetsrange ) ); + } } gunfireloopfxvec( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax ) { - thread gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax ); + thread gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax ); } gunfireloopfxvecthread( fxid, fxpos, fxpos2, shotsmin, shotsmax, shotdelaymin, shotdelaymax, betweensetsmin, betweensetsmax ) { - level endon( "stop all gunfireloopfx" ); - wait 0.05; - - if ( betweensetsmax < betweensetsmin ) - { - temp = betweensetsmax; - betweensetsmax = betweensetsmin; - betweensetsmin = temp; - } - - betweensetsbase = betweensetsmin; - betweensetsrange = betweensetsmax - betweensetsmin; - - if ( shotdelaymax < shotdelaymin ) - { - temp = shotdelaymax; - shotdelaymax = shotdelaymin; - shotdelaymin = temp; - } - - shotdelaybase = shotdelaymin; - shotdelayrange = shotdelaymax - shotdelaymin; - - if ( shotsmax < shotsmin ) - { - temp = shotsmax; - shotsmax = shotsmin; - shotsmin = temp; - } - - shotsbase = shotsmin; - shotsrange = shotsmax - shotsmin; - fxpos2 = vectornormalize( fxpos2 - fxpos ); - fxent = spawnfx( level._effect[fxid], fxpos, fxpos2 ); - - for (;;) - { - shotnum = shotsbase + randomint( shotsrange ); - - for ( i = 0; i < int( shotnum / level.fxfireloopmod ); i++ ) - { - triggerfx( fxent ); - delay = ( shotdelaybase + randomfloat( shotdelayrange ) ) * level.fxfireloopmod; - - if ( delay < 0.05 ) - delay = 0.05; - - wait( delay ); - } - - wait( shotdelaybase + randomfloat( shotdelayrange ) ); - wait( betweensetsbase + randomfloat( betweensetsrange ) ); - } + level endon( "stop all gunfireloopfx" ); + wait 0,05; + if ( betweensetsmax < betweensetsmin ) + { + temp = betweensetsmax; + betweensetsmax = betweensetsmin; + betweensetsmin = temp; + } + betweensetsbase = betweensetsmin; + betweensetsrange = betweensetsmax - betweensetsmin; + if ( shotdelaymax < shotdelaymin ) + { + temp = shotdelaymax; + shotdelaymax = shotdelaymin; + shotdelaymin = temp; + } + shotdelaybase = shotdelaymin; + shotdelayrange = shotdelaymax - shotdelaymin; + if ( shotsmax < shotsmin ) + { + temp = shotsmax; + shotsmax = shotsmin; + shotsmin = temp; + } + shotsbase = shotsmin; + shotsrange = shotsmax - shotsmin; + fxpos2 = vectornormalize( fxpos2 - fxpos ); + fxent = spawnfx( level._effect[ fxid ], fxpos, fxpos2 ); + for ( ;; ) + { + shotnum = shotsbase + randomint( shotsrange ); + i = 0; + while ( i < int( shotnum / level.fxfireloopmod ) ) + { + triggerfx( fxent ); + delay = ( shotdelaybase + randomfloat( shotdelayrange ) ) * level.fxfireloopmod; + if ( delay < 0,05 ) + { + delay = 0,05; + } + wait delay; + i++; + } + wait ( shotdelaybase + randomfloat( shotdelayrange ) ); + wait ( betweensetsbase + randomfloat( betweensetsrange ) ); + } } setfireloopmod( value ) { - level.fxfireloopmod = 1 / value; + level.fxfireloopmod = 1 / value; } setup_fx() { - if ( !isdefined( self.script_fxid ) || !isdefined( self.script_fxcommand ) || !isdefined( self.script_delay ) ) - return; - - org = undefined; - - if ( isdefined( self.target ) ) - { - ent = getent( self.target, "targetname" ); - - if ( isdefined( ent ) ) - org = ent.origin; - } - - fxstart = undefined; - - if ( isdefined( self.script_fxstart ) ) - fxstart = self.script_fxstart; - - fxstop = undefined; - - if ( isdefined( self.script_fxstop ) ) - fxstop = self.script_fxstop; - - if ( self.script_fxcommand == "OneShotfx" ) - oneshotfx( self.script_fxid, self.origin, self.script_delay, org ); - - if ( self.script_fxcommand == "loopfx" ) - loopfx( self.script_fxid, self.origin, self.script_delay, org, fxstart, fxstop ); - - if ( self.script_fxcommand == "loopsound" ) - loopsound( self.script_fxid, self.origin, self.script_delay ); - - self delete(); + if ( isDefined( self.script_fxid ) || !isDefined( self.script_fxcommand ) && !isDefined( self.script_delay ) ) + { + return; + } + org = undefined; + if ( isDefined( self.target ) ) + { + ent = getent( self.target, "targetname" ); + if ( isDefined( ent ) ) + { + org = ent.origin; + } + } + fxstart = undefined; + if ( isDefined( self.script_fxstart ) ) + { + fxstart = self.script_fxstart; + } + fxstop = undefined; + if ( isDefined( self.script_fxstop ) ) + { + fxstop = self.script_fxstop; + } + if ( self.script_fxcommand == "OneShotfx" ) + { + oneshotfx( self.script_fxid, self.origin, self.script_delay, org ); + } + if ( self.script_fxcommand == "loopfx" ) + { + loopfx( self.script_fxid, self.origin, self.script_delay, org, fxstart, fxstop ); + } + if ( self.script_fxcommand == "loopsound" ) + { + loopsound( self.script_fxid, self.origin, self.script_delay ); + } + self delete(); } script_print_fx() { /# - if ( !isdefined( self.script_fxid ) || !isdefined( self.script_fxcommand ) || !isdefined( self.script_delay ) ) - { - println( "Effect at origin ", self.origin, " doesn't have script_fxid/script_fxcommand/script_delay" ); - self delete(); - return; - } - - if ( isdefined( self.target ) ) - org = getent( self.target, "targetname" ).origin; - else - org = "undefined"; - - if ( self.script_fxcommand == "OneShotfx" ) - println( "mapsmp_fx::OneShotfx(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" ); - - if ( self.script_fxcommand == "loopfx" ) - println( "mapsmp_fx::LoopFx(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" ); - - if ( self.script_fxcommand == "loopsound" ) - println( "mapsmp_fx::LoopSound(\"" + self.script_fxid + "\", " + self.origin + ", " + self.script_delay + ", " + org + ");" ); + if ( isDefined( self.script_fxid ) || !isDefined( self.script_fxcommand ) && !isDefined( self.script_delay ) ) + { + println( "Effect at origin ", self.origin, " doesn't have script_fxid/script_fxcommand/script_delay" ); + self delete(); + return; + } + if ( isDefined( self.target ) ) + { + org = getent( self.target, "targetname" ).origin; + } + else + { + org = "undefined"; + } + if ( self.script_fxcommand == "OneShotfx" ) + { + println( "mapsmp_fx::OneShotfx("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" ); + } + if ( self.script_fxcommand == "loopfx" ) + { + println( "mapsmp_fx::LoopFx("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" ); + } + if ( self.script_fxcommand == "loopsound" ) + { + println( "mapsmp_fx::LoopSound("" + self.script_fxid + "", " + self.origin + ", " + self.script_delay + ", " + org + ");" ); #/ + } } script_playfx( id, pos, pos2 ) { - if ( !id ) - return; - - if ( isdefined( pos2 ) ) - playfx( id, pos, pos2 ); - else - playfx( id, pos ); + if ( !id ) + { + return; + } + if ( isDefined( pos2 ) ) + { + playfx( id, pos, pos2 ); + } + else + { + playfx( id, pos ); + } } script_playfxontag( id, ent, tag ) { - if ( !id ) - return; - - playfxontag( id, ent, tag ); + if ( !id ) + { + return; + } + playfxontag( id, ent, tag ); } grenadeexplosionfx( pos ) { - playfx( level._effect["mechanical explosion"], pos ); - earthquake( 0.15, 0.5, pos, 250 ); + playfx( level._effect[ "mechanical explosion" ], pos ); + earthquake( 0,15, 0,5, pos, 250 ); } soundfx( fxid, fxpos, endonnotify ) { - org = spawn( "script_origin", ( 0, 0, 0 ) ); - org.origin = fxpos; - org playloopsound( fxid ); - - if ( isdefined( endonnotify ) ) - org thread soundfxdelete( endonnotify ); + org = spawn( "script_origin", ( 0, 0, 0 ) ); + org.origin = fxpos; + org playloopsound( fxid ); + if ( isDefined( endonnotify ) ) + { + org thread soundfxdelete( endonnotify ); + } } soundfxdelete( endonnotify ) { - level waittill( endonnotify ); - - self delete(); + level waittill( endonnotify ); + self delete(); } blenddelete( blend ) { - self waittill( "death" ); - - blend delete(); + self waittill( "death" ); + blend delete(); } spawnfx_wrapper( fx_id, origin, forward, up ) { /# - assert( isdefined( level._effect[fx_id] ), "Missing level._effect[\"" + fx_id + "\"]. You did not setup the fx before calling it in createFx." ); + assert( isDefined( level._effect[ fx_id ] ), "Missing level._effect["" + fx_id + ""]. You did not setup the fx before calling it in createFx." ); #/ - fx_object = spawnfx( level._effect[fx_id], origin, forward, up ); - return fx_object; + fx_object = spawnfx( level._effect[ fx_id ], origin, forward, up ); + return fx_object; } diff --git a/Zombie Core/patch_zm/maps/mp/_fxanim.gsc b/Zombie Core/patch_zm/maps/mp/_fxanim.gsc index 73937d3..2a40039 100644 --- a/Zombie Core/patch_zm/maps/mp/_fxanim.gsc +++ b/Zombie Core/patch_zm/maps/mp/_fxanim.gsc @@ -1,8 +1,6 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool init() { - level.scr_anim = []; - level.scr_anim["fxanim_props"] = []; + level.scr_anim = []; + level.scr_anim[ "fxanim_props" ] = []; } diff --git a/Zombie Core/patch_zm/maps/mp/_global_fx.gsc b/Zombie Core/patch_zm/maps/mp/_global_fx.gsc index 5b002ac..8692423 100644 --- a/Zombie Core/patch_zm/maps/mp/_global_fx.gsc +++ b/Zombie Core/patch_zm/maps/mp/_global_fx.gsc @@ -1,53 +1,60 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; +#include maps/mp/_utility; +#include common_scripts/utility; main() { - randomstartdelay = randomfloatrange( -20, -15 ); - global_fx( "barrel_fireFX_origin", "global_barrel_fire", "fire/firelp_barrel_pm", randomstartdelay, "fire_barrel_small" ); - global_fx( "ch_streetlight_02_FX_origin", "ch_streetlight_02_FX", "misc/lighthaze", randomstartdelay ); - global_fx( "me_streetlight_01_FX_origin", "me_streetlight_01_FX", "misc/lighthaze_bog_a", randomstartdelay ); - global_fx( "ch_street_light_01_on", "lamp_glow_FX", "misc/light_glow_white", randomstartdelay ); - global_fx( "highway_lamp_post", "ch_streetlight_02_FX", "misc/lighthaze_villassault", randomstartdelay ); - global_fx( "cs_cargoship_spotlight_on_FX_origin", "cs_cargoship_spotlight_on_FX", "misc/lighthaze", randomstartdelay ); - global_fx( "me_dumpster_fire_FX_origin", "me_dumpster_fire_FX", "fire/firelp_med_pm_nodistort", randomstartdelay, "fire_dumpster_medium" ); - global_fx( "com_tires_burning01_FX_origin", "com_tires_burning01_FX", "fire/tire_fire_med", randomstartdelay ); - global_fx( "icbm_powerlinetower_FX_origin", "icbm_powerlinetower_FX", "misc/power_tower_light_red_blink", randomstartdelay ); + randomstartdelay = randomfloatrange( -20, -15 ); + global_fx( "barrel_fireFX_origin", "global_barrel_fire", "fire/firelp_barrel_pm", randomstartdelay, "fire_barrel_small" ); + global_fx( "ch_streetlight_02_FX_origin", "ch_streetlight_02_FX", "misc/lighthaze", randomstartdelay ); + global_fx( "me_streetlight_01_FX_origin", "me_streetlight_01_FX", "misc/lighthaze_bog_a", randomstartdelay ); + global_fx( "ch_street_light_01_on", "lamp_glow_FX", "misc/light_glow_white", randomstartdelay ); + global_fx( "highway_lamp_post", "ch_streetlight_02_FX", "misc/lighthaze_villassault", randomstartdelay ); + global_fx( "cs_cargoship_spotlight_on_FX_origin", "cs_cargoship_spotlight_on_FX", "misc/lighthaze", randomstartdelay ); + global_fx( "me_dumpster_fire_FX_origin", "me_dumpster_fire_FX", "fire/firelp_med_pm_nodistort", randomstartdelay, "fire_dumpster_medium" ); + global_fx( "com_tires_burning01_FX_origin", "com_tires_burning01_FX", "fire/tire_fire_med", randomstartdelay ); + global_fx( "icbm_powerlinetower_FX_origin", "icbm_powerlinetower_FX", "misc/power_tower_light_red_blink", randomstartdelay ); } global_fx( targetname, fxname, fxfile, delay, soundalias ) { - ents = getstructarray( targetname, "targetname" ); - - if ( !isdefined( ents ) ) - return; - - if ( ents.size <= 0 ) - return; - - for ( i = 0; i < ents.size; i++ ) - ents[i] global_fx_create( fxname, fxfile, delay, soundalias ); + ents = getstructarray( targetname, "targetname" ); + if ( !isDefined( ents ) ) + { + return; + } + if ( ents.size <= 0 ) + { + return; + } + i = 0; + while ( i < ents.size ) + { + ents[ i ] global_fx_create( fxname, fxfile, delay, soundalias ); + i++; + } } global_fx_create( fxname, fxfile, delay, soundalias ) { - if ( !isdefined( level._effect ) ) - level._effect = []; - - if ( !isdefined( level._effect[fxname] ) ) - level._effect[fxname] = loadfx( fxfile ); - - if ( !isdefined( self.angles ) ) - self.angles = ( 0, 0, 0 ); - - ent = createoneshoteffect( fxname ); - ent.v["origin"] = self.origin; - ent.v["angles"] = self.angles; - ent.v["fxid"] = fxname; - ent.v["delay"] = delay; - - if ( isdefined( soundalias ) ) - ent.v["soundalias"] = soundalias; + if ( !isDefined( level._effect ) ) + { + level._effect = []; + } + if ( !isDefined( level._effect[ fxname ] ) ) + { + level._effect[ fxname ] = loadfx( fxfile ); + } + if ( !isDefined( self.angles ) ) + { + self.angles = ( 0, 0, 0 ); + } + ent = createoneshoteffect( fxname ); + ent.v[ "origin" ] = self.origin; + ent.v[ "angles" ] = self.angles; + ent.v[ "fxid" ] = fxname; + ent.v[ "delay" ] = delay; + if ( isDefined( soundalias ) ) + { + ent.v[ "soundalias" ] = soundalias; + } } diff --git a/Zombie Core/patch_zm/maps/mp/_interactive_objects.gsc b/Zombie Core/patch_zm/maps/mp/_interactive_objects.gsc index 148d9d5..490fd54 100644 --- a/Zombie Core/patch_zm/maps/mp/_interactive_objects.gsc +++ b/Zombie Core/patch_zm/maps/mp/_interactive_objects.gsc @@ -1,387 +1,407 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - level.barrelexplodingthisframe = 0; - qbarrels = 0; - all_barrels = []; - barrels = getentarray( "explodable_barrel", "targetname" ); - - if ( isdefined( barrels ) && barrels.size > 0 ) - { - qbarrels = 1; - - for ( i = 0; i < barrels.size; i++ ) - all_barrels[all_barrels.size] = barrels[i]; - } - - barrels = getentarray( "explodable_barrel", "script_noteworthy" ); - - if ( isdefined( barrels ) && barrels.size > 0 ) - { - qbarrels = 1; - - for ( i = 0; i < barrels.size; i++ ) - all_barrels[all_barrels.size] = barrels[i]; - } - - if ( qbarrels ) - { - precachemodel( "global_explosive_barrel" ); - level.barrelburn = 100; - level.barrelhealth = 250; - level.barrelingsound = "exp_redbarrel_ignition"; - level.barrelexpsound = "exp_redbarrel"; - level.breakables_fx["barrel"]["burn_start"] = loadfx( "destructibles/fx_barrel_ignite" ); - level.breakables_fx["barrel"]["burn"] = loadfx( "destructibles/fx_barrel_fire_top" ); - level.breakables_fx["barrel"]["explode"] = loadfx( "destructibles/fx_dest_barrelexp" ); - array_thread( all_barrels, ::explodable_barrel_think ); - } - - qcrates = 0; - all_crates = []; - crates = getentarray( "flammable_crate", "targetname" ); - - if ( isdefined( crates ) && crates.size > 0 ) - { - qcrates = 1; - - for ( i = 0; i < crates.size; i++ ) - all_crates[all_crates.size] = crates[i]; - } - - crates = getentarray( "flammable_crate", "script_noteworthy" ); - - if ( isdefined( crates ) && crates.size > 0 ) - { - qcrates = 1; - - for ( i = 0; i < crates.size; i++ ) - all_crates[all_crates.size] = crates[i]; - } - - if ( qcrates ) - { - precachemodel( "global_flammable_crate_jap_piece01_d" ); - level.crateburn = 100; - level.cratehealth = 200; - level.breakables_fx["ammo_crate"]["burn_start"] = loadfx( "destructibles/fx_ammobox_ignite" ); - level.breakables_fx["ammo_crate"]["burn"] = loadfx( "destructibles/fx_ammobox_fire_top" ); - level.breakables_fx["ammo_crate"]["explode"] = loadfx( "destructibles/fx_ammoboxExp" ); - level.crateignsound = "Ignition_ammocrate"; - level.crateexpsound = "Explo_ammocrate"; - array_thread( all_crates, ::flammable_crate_think ); - } - - if ( !qbarrels && !qcrates ) - return; + level.barrelexplodingthisframe = 0; + qbarrels = 0; + all_barrels = []; + barrels = getentarray( "explodable_barrel", "targetname" ); + while ( isDefined( barrels ) && barrels.size > 0 ) + { + qbarrels = 1; + i = 0; + while ( i < barrels.size ) + { + all_barrels[ all_barrels.size ] = barrels[ i ]; + i++; + } + } + barrels = getentarray( "explodable_barrel", "script_noteworthy" ); + while ( isDefined( barrels ) && barrels.size > 0 ) + { + qbarrels = 1; + i = 0; + while ( i < barrels.size ) + { + all_barrels[ all_barrels.size ] = barrels[ i ]; + i++; + } + } + if ( qbarrels ) + { + precachemodel( "global_explosive_barrel" ); + level.barrelburn = 100; + level.barrelhealth = 250; + level.barrelingsound = "exp_redbarrel_ignition"; + level.barrelexpsound = "exp_redbarrel"; + level.breakables_fx[ "barrel" ][ "burn_start" ] = loadfx( "destructibles/fx_barrel_ignite" ); + level.breakables_fx[ "barrel" ][ "burn" ] = loadfx( "destructibles/fx_barrel_fire_top" ); + level.breakables_fx[ "barrel" ][ "explode" ] = loadfx( "destructibles/fx_dest_barrelexp" ); + array_thread( all_barrels, ::explodable_barrel_think ); + } + qcrates = 0; + all_crates = []; + crates = getentarray( "flammable_crate", "targetname" ); + while ( isDefined( crates ) && crates.size > 0 ) + { + qcrates = 1; + i = 0; + while ( i < crates.size ) + { + all_crates[ all_crates.size ] = crates[ i ]; + i++; + } + } + crates = getentarray( "flammable_crate", "script_noteworthy" ); + while ( isDefined( crates ) && crates.size > 0 ) + { + qcrates = 1; + i = 0; + while ( i < crates.size ) + { + all_crates[ all_crates.size ] = crates[ i ]; + i++; + } + } + if ( qcrates ) + { + precachemodel( "global_flammable_crate_jap_piece01_d" ); + level.crateburn = 100; + level.cratehealth = 200; + level.breakables_fx[ "ammo_crate" ][ "burn_start" ] = loadfx( "destructibles/fx_ammobox_ignite" ); + level.breakables_fx[ "ammo_crate" ][ "burn" ] = loadfx( "destructibles/fx_ammobox_fire_top" ); + level.breakables_fx[ "ammo_crate" ][ "explode" ] = loadfx( "destructibles/fx_ammoboxExp" ); + level.crateignsound = "Ignition_ammocrate"; + level.crateexpsound = "Explo_ammocrate"; + array_thread( all_crates, ::flammable_crate_think ); + } + if ( !qbarrels && !qcrates ) + { + return; + } } explodable_barrel_think() { - if ( self.classname != "script_model" ) - return; - - self endon( "exploding" ); - self breakable_clip(); - self.health = level.barrelhealth; - self setcandamage( 1 ); - self.targetname = "explodable_barrel"; - - if ( sessionmodeiszombiesgame() ) - self.removeexplodable = 1; - - for (;;) - { - self waittill( "damage", amount, attacker, direction_vec, p, type ); + if ( self.classname != "script_model" ) + { + return; + } + self endon( "exploding" ); + self breakable_clip(); + self.health = level.barrelhealth; + self setcandamage( 1 ); + self.targetname = "explodable_barrel"; + if ( sessionmodeiszombiesgame() ) + { + self.removeexplodable = 1; + } + for ( ;; ) + { + self waittill( "damage", amount, attacker, direction_vec, p, type ); /# - println( "BARRELDAMAGE: " + type ); + println( "BARRELDAMAGE: " + type ); #/ - if ( type == "MOD_MELEE" || type == "MOD_IMPACT" ) - continue; - - if ( isdefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) ) - continue; - - if ( isdefined( self.script_selfisattacker ) && self.script_selfisattacker ) - self.damageowner = self; - else - self.damageowner = attacker; - - self.health -= amount; - - if ( self.health <= level.barrelburn ) - self thread explodable_barrel_burn(); - } + if ( type == "MOD_MELEE" || type == "MOD_IMPACT" ) + { + continue; + } + else + { + if ( isDefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) ) + { + break; + } + else + { + if ( isDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageowner = self; + } + else + { + self.damageowner = attacker; + } + self.health -= amount; + if ( self.health <= level.barrelburn ) + { + self thread explodable_barrel_burn(); + } + } + } + } } explodable_barrel_burn() { - count = 0; - startedfx = 0; - up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); - worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); - dot = vectordot( up, worldup ); - offset1 = ( 0, 0, 0 ); - offset2 = up * vectorscale( ( 0, 0, 1 ), 44.0 ); - - if ( dot < 0.5 ) - { - offset1 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) - vectorscale( ( 0, 0, 1 ), 30.0 ); - offset2 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) + vectorscale( ( 0, 0, 1 ), 14.0 ); - } - - while ( self.health > 0 ) - { - if ( !startedfx ) - { - playfx( level.breakables_fx["barrel"]["burn_start"], self.origin + offset1 ); - level thread play_sound_in_space( level.barrelingsound, self.origin ); - startedfx = 1; - } - - if ( count > 20 ) - count = 0; - - playfx( level.breakables_fx["barrel"]["burn"], self.origin + offset2 ); - self playloopsound( "barrel_fuse" ); - - if ( count == 0 ) - self.health -= 10 + randomint( 10 ); - - count++; - wait 0.05; - } - - level notify( "explosion_started" ); - self thread explodable_barrel_explode(); + count = 0; + startedfx = 0; + up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); + worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); + dot = vectordot( up, worldup ); + offset1 = ( 0, 0, 1 ); + offset2 = up * vectorScale( ( 0, 0, 1 ), 44 ); + if ( dot < 0,5 ) + { + offset1 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) - vectorScale( ( 0, 0, 1 ), 30 ); + offset2 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) + vectorScale( ( 0, 0, 1 ), 14 ); + } + while ( self.health > 0 ) + { + if ( !startedfx ) + { + playfx( level.breakables_fx[ "barrel" ][ "burn_start" ], self.origin + offset1 ); + level thread play_sound_in_space( level.barrelingsound, self.origin ); + startedfx = 1; + } + if ( count > 20 ) + { + count = 0; + } + playfx( level.breakables_fx[ "barrel" ][ "burn" ], self.origin + offset2 ); + self playloopsound( "barrel_fuse" ); + if ( count == 0 ) + { + self.health -= 10 + randomint( 10 ); + } + count++; + wait 0,05; + } + level notify( "explosion_started" ); + self thread explodable_barrel_explode(); } explodable_barrel_explode() { - self notify( "exploding" ); - self death_notify_wrapper(); - up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); - worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); - dot = vectordot( up, worldup ); - offset = ( 0, 0, 0 ); - - if ( dot < 0.5 ) - { - start = self.origin + vectorscale( up, 22 ); - trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) ); - end = trace["position"]; - offset = end - self.origin; - } - - offset += vectorscale( ( 0, 0, 1 ), 4.0 ); - mindamage = 1; - maxdamage = 250; - blastradius = 250; - level thread play_sound_in_space( level.barrelexpsound, self.origin ); - playfx( level.breakables_fx["barrel"]["explode"], self.origin + offset ); - physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage ); - level.barrelexplodingthisframe = 1; - - if ( isdefined( self.remove ) ) - self.remove delete(); - - if ( isdefined( self.radius ) ) - blastradius = self.radius; - - self radiusdamage( self.origin + vectorscale( ( 0, 0, 1 ), 56.0 ), blastradius, maxdamage, mindamage, self.damageowner ); - attacker = undefined; - - if ( isdefined( self.damageowner ) ) - attacker = self.damageowner; - - level.lastexplodingbarrel["time"] = gettime(); - level.lastexplodingbarrel["origin"] = self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ); - - if ( isdefined( self.removeexplodable ) ) - self hide(); - else - self setmodel( "global_explosive_barrel" ); - - if ( dot < 0.5 ) - { - start = self.origin + vectorscale( up, 22 ); - trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) ); - pos = trace["position"]; - self.origin = pos; - self.angles += vectorscale( ( 0, 0, 1 ), 90.0 ); - } - - wait 0.05; - level.barrelexplodingthisframe = 0; + self notify( "exploding" ); + self death_notify_wrapper(); + up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); + worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); + dot = vectordot( up, worldup ); + offset = ( 0, 0, 1 ); + if ( dot < 0,5 ) + { + start = self.origin + vectorScale( up, 22 ); + trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) ); + end = trace[ "position" ]; + offset = end - self.origin; + } + offset += vectorScale( ( 0, 0, 1 ), 4 ); + mindamage = 1; + maxdamage = 250; + blastradius = 250; + level thread play_sound_in_space( level.barrelexpsound, self.origin ); + playfx( level.breakables_fx[ "barrel" ][ "explode" ], self.origin + offset ); + physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage ); + level.barrelexplodingthisframe = 1; + if ( isDefined( self.remove ) ) + { + self.remove delete(); + } + if ( isDefined( self.radius ) ) + { + blastradius = self.radius; + } + self radiusdamage( self.origin + vectorScale( ( 0, 0, 1 ), 56 ), blastradius, maxdamage, mindamage, self.damageowner ); + attacker = undefined; + if ( isDefined( self.damageowner ) ) + { + attacker = self.damageowner; + } + level.lastexplodingbarrel[ "time" ] = getTime(); + level.lastexplodingbarrel[ "origin" ] = self.origin + vectorScale( ( 0, 0, 1 ), 30 ); + if ( isDefined( self.removeexplodable ) ) + { + self hide(); + } + else + { + self setmodel( "global_explosive_barrel" ); + } + if ( dot < 0,5 ) + { + start = self.origin + vectorScale( up, 22 ); + trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) ); + pos = trace[ "position" ]; + self.origin = pos; + self.angles += vectorScale( ( 0, 0, 1 ), 90 ); + } + wait 0,05; + level.barrelexplodingthisframe = 0; } flammable_crate_think() { - if ( self.classname != "script_model" ) - return; - - self endon( "exploding" ); - self breakable_clip(); - self.health = level.cratehealth; - self setcandamage( 1 ); - - for (;;) - { - self waittill( "damage", amount, attacker, direction_vec, p, type ); - - if ( isdefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) ) - continue; - - if ( isdefined( self.script_selfisattacker ) && self.script_selfisattacker ) - self.damageowner = self; - else - self.damageowner = attacker; - - if ( level.barrelexplodingthisframe ) - wait( randomfloat( 1 ) ); - - self.health -= amount; - - if ( self.health <= level.crateburn ) - self thread flammable_crate_burn(); - } + if ( self.classname != "script_model" ) + { + return; + } + self endon( "exploding" ); + self breakable_clip(); + self.health = level.cratehealth; + self setcandamage( 1 ); + for ( ;; ) + { + self waittill( "damage", amount, attacker, direction_vec, p, type ); + if ( isDefined( self.script_requires_player ) && self.script_requires_player && !isplayer( attacker ) ) + { + continue; + } + else + { + if ( isDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageowner = self; + } + else + { + self.damageowner = attacker; + } + if ( level.barrelexplodingthisframe ) + { + wait randomfloat( 1 ); + } + self.health -= amount; + if ( self.health <= level.crateburn ) + { + self thread flammable_crate_burn(); + } + } + } } flammable_crate_burn() { - count = 0; - startedfx = 0; - up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); - worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); - dot = vectordot( up, worldup ); - offset1 = ( 0, 0, 0 ); - offset2 = up * vectorscale( ( 0, 0, 1 ), 44.0 ); - - if ( dot < 0.5 ) - { - offset1 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) - vectorscale( ( 0, 0, 1 ), 30.0 ); - offset2 = up * vectorscale( ( 0, 0, 1 ), 22.0 ) + vectorscale( ( 0, 0, 1 ), 14.0 ); - } - - while ( self.health > 0 ) - { - if ( !startedfx ) - { - playfx( level.breakables_fx["ammo_crate"]["burn_start"], self.origin ); - level thread play_sound_in_space( level.crateignsound, self.origin ); - startedfx = 1; - } - - if ( count > 20 ) - count = 0; - - playfx( level.breakables_fx["ammo_crate"]["burn"], self.origin ); - - if ( count == 0 ) - self.health -= 10 + randomint( 10 ); - - count++; - wait 0.05; - } - - self thread flammable_crate_explode(); + count = 0; + startedfx = 0; + up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); + worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); + dot = vectordot( up, worldup ); + offset1 = ( 0, 0, 1 ); + offset2 = up * vectorScale( ( 0, 0, 1 ), 44 ); + if ( dot < 0,5 ) + { + offset1 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) - vectorScale( ( 0, 0, 1 ), 30 ); + offset2 = ( up * vectorScale( ( 0, 0, 1 ), 22 ) ) + vectorScale( ( 0, 0, 1 ), 14 ); + } + while ( self.health > 0 ) + { + if ( !startedfx ) + { + playfx( level.breakables_fx[ "ammo_crate" ][ "burn_start" ], self.origin ); + level thread play_sound_in_space( level.crateignsound, self.origin ); + startedfx = 1; + } + if ( count > 20 ) + { + count = 0; + } + playfx( level.breakables_fx[ "ammo_crate" ][ "burn" ], self.origin ); + if ( count == 0 ) + { + self.health -= 10 + randomint( 10 ); + } + count++; + wait 0,05; + } + self thread flammable_crate_explode(); } flammable_crate_explode() { - self notify( "exploding" ); - self death_notify_wrapper(); - up = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); - worldup = anglestoup( vectorscale( ( 0, 1, 0 ), 90.0 ) ); - dot = vectordot( up, worldup ); - offset = ( 0, 0, 0 ); - - if ( dot < 0.5 ) - { - start = self.origin + vectorscale( up, 22 ); - trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) ); - end = trace["position"]; - offset = end - self.origin; - } - - offset += vectorscale( ( 0, 0, 1 ), 4.0 ); - mindamage = 1; - maxdamage = 250; - blastradius = 250; - level thread play_sound_in_space( level.crateexpsound, self.origin ); - playfx( level.breakables_fx["ammo_crate"]["explode"], self.origin ); - physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage ); - level.barrelexplodingthisframe = 1; - - if ( isdefined( self.remove ) ) - self.remove delete(); - - if ( isdefined( self.radius ) ) - blastradius = self.radius; - - attacker = undefined; - - if ( isdefined( self.damageowner ) ) - attacker = self.damageowner; - - self radiusdamage( self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), blastradius, maxdamage, mindamage, attacker ); - self setmodel( "global_flammable_crate_jap_piece01_d" ); - - if ( dot < 0.5 ) - { - start = self.origin + vectorscale( up, 22 ); - trace = physicstrace( start, start + vectorscale( ( 0, 0, -1 ), 64.0 ) ); - pos = trace["position"]; - self.origin = pos; - self.angles += vectorscale( ( 0, 0, 1 ), 90.0 ); - } - - wait 0.05; - level.barrelexplodingthisframe = 0; + self notify( "exploding" ); + self death_notify_wrapper(); + up = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); + worldup = anglesToUp( vectorScale( ( 0, 0, 1 ), 90 ) ); + dot = vectordot( up, worldup ); + offset = ( 0, 0, 1 ); + if ( dot < 0,5 ) + { + start = self.origin + vectorScale( up, 22 ); + trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) ); + end = trace[ "position" ]; + offset = end - self.origin; + } + offset += vectorScale( ( 0, 0, 1 ), 4 ); + mindamage = 1; + maxdamage = 250; + blastradius = 250; + level thread play_sound_in_space( level.crateexpsound, self.origin ); + playfx( level.breakables_fx[ "ammo_crate" ][ "explode" ], self.origin ); + physicsexplosionsphere( self.origin + offset, 100, 80, 1, maxdamage, mindamage ); + level.barrelexplodingthisframe = 1; + if ( isDefined( self.remove ) ) + { + self.remove delete(); + } + if ( isDefined( self.radius ) ) + { + blastradius = self.radius; + } + attacker = undefined; + if ( isDefined( self.damageowner ) ) + { + attacker = self.damageowner; + } + self radiusdamage( self.origin + vectorScale( ( 0, 0, 1 ), 30 ), blastradius, maxdamage, mindamage, attacker ); + self setmodel( "global_flammable_crate_jap_piece01_d" ); + if ( dot < 0,5 ) + { + start = self.origin + vectorScale( up, 22 ); + trace = physicstrace( start, start + vectorScale( ( 0, 0, 1 ), 64 ) ); + pos = trace[ "position" ]; + self.origin = pos; + self.angles += vectorScale( ( 0, 0, 1 ), 90 ); + } + wait 0,05; + level.barrelexplodingthisframe = 0; } breakable_clip() { - if ( isdefined( self.target ) ) - { - targ = getent( self.target, "targetname" ); - - if ( targ.classname == "script_brushmodel" ) - { - self.remove = targ; - return; - } - } - - if ( isdefined( level.breakables_clip ) && level.breakables_clip.size > 0 ) - self.remove = getclosestent( self.origin, level.breakables_clip ); - - if ( isdefined( self.remove ) ) - arrayremovevalue( level.breakables_clip, self.remove ); + if ( isDefined( self.target ) ) + { + targ = getent( self.target, "targetname" ); + if ( targ.classname == "script_brushmodel" ) + { + self.remove = targ; + return; + } + } + if ( isDefined( level.breakables_clip ) && level.breakables_clip.size > 0 ) + { + self.remove = getclosestent( self.origin, level.breakables_clip ); + } + if ( isDefined( self.remove ) ) + { + arrayremovevalue( level.breakables_clip, self.remove ); + } } getclosestent( org, array ) { - if ( array.size < 1 ) - return; - - dist = 256; - ent = undefined; - - for ( i = 0; i < array.size; i++ ) - { - newdist = distance( array[i] getorigin(), org ); - - if ( newdist >= dist ) - continue; - - dist = newdist; - ent = array[i]; - } - - return ent; + if ( array.size < 1 ) + { + return; + } + dist = 256; + ent = undefined; + i = 0; + while ( i < array.size ) + { + newdist = distance( array[ i ] getorigin(), org ); + if ( newdist >= dist ) + { + i++; + continue; + } + else + { + dist = newdist; + ent = array[ i ]; + } + i++; + } + return ent; } diff --git a/Zombie Core/patch_zm/maps/mp/_music.gsc b/Zombie Core/patch_zm/maps/mp/_music.gsc index 8d9c2db..9faa900 100644 --- a/Zombie Core/patch_zm/maps/mp/_music.gsc +++ b/Zombie Core/patch_zm/maps/mp/_music.gsc @@ -1,28 +1,30 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; +#include maps/mp/_utility; music_init() { /# - assert( level.clientscripts ); + assert( level.clientscripts ); #/ - level.musicstate = ""; - registerclientsys( "musicCmd" ); + level.musicstate = ""; + registerclientsys( "musicCmd" ); } setmusicstate( state, player ) { - if ( isdefined( level.musicstate ) ) - { - if ( isdefined( player ) ) - { - setclientsysstate( "musicCmd", state, player ); - return; - } - else if ( level.musicstate != state ) - setclientsysstate( "musicCmd", state ); - } - - level.musicstate = state; + if ( isDefined( level.musicstate ) ) + { + if ( isDefined( player ) ) + { + setclientsysstate( "musicCmd", state, player ); + return; + } + else + { + if ( level.musicstate != state ) + { + setclientsysstate( "musicCmd", state ); + } + } + } + level.musicstate = state; } diff --git a/Zombie Core/patch_zm/maps/mp/_script_gen.gsc b/Zombie Core/patch_zm/maps/mp/_script_gen.gsc index cb9a7ff..f5dbda6 100644 --- a/Zombie Core/patch_zm/maps/mp/_script_gen.gsc +++ b/Zombie Core/patch_zm/maps/mp/_script_gen.gsc @@ -1,291 +1,342 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\_script_gen; +#include maps/mp/_script_gen; +#include maps/mp/_utility; +#include common_scripts/utility; script_gen_dump_checksaved() { - signatures = getarraykeys( level.script_gen_dump ); - - for ( i = 0; i < signatures.size; i++ ) - { - if ( !isdefined( level.script_gen_dump2[signatures[i]] ) ) - { - level.script_gen_dump[signatures[i]] = undefined; - level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "Signature unmatched( removed feature ): " + signatures[i]; - } - } + signatures = getarraykeys( level.script_gen_dump ); + i = 0; + while ( i < signatures.size ) + { + if ( !isDefined( level.script_gen_dump2[ signatures[ i ] ] ) ) + { + level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "Signature unmatched( removed feature ): " + signatures[ i ]; + } + i++; + } } script_gen_dump() { /# - script_gen_dump_checksaved(); - - if ( !level.script_gen_dump_reasons.size ) - { - flag_set( "scriptgen_done" ); - return; - } - - firstrun = 0; - - if ( level.bscriptgened ) - { - println( " " ); - println( " " ); - println( " " ); - println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); - println( "^3Dumping scriptgen dump for these reasons" ); - println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); - - for ( i = 0; i < level.script_gen_dump_reasons.size; i++ ) - { - if ( issubstr( level.script_gen_dump_reasons[i], "nowrite" ) ) - { - substr = getsubstr( level.script_gen_dump_reasons[i], 15 ); - println( i + ". ) " + substr ); - } - else - println( i + ". ) " + level.script_gen_dump_reasons[i] ); - - if ( level.script_gen_dump_reasons[i] == "First run" ) - firstrun = 1; - } - - println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); - println( " " ); - - if ( firstrun ) - { - println( "for First Run make sure you delete all of the vehicle precache script calls, createart calls, createfx calls( most commonly placed in maps\" + level.script + "_fx.gsc ) " ); - println( " " ); - println( "replace:" ); - println( "maps\_load::main( 1 );" ); - println( " " ); - println( "with( don't forget to add this file to P4 ):" ); - println( "maps\scriptgen\" + level.script + "_scriptgen::main();" ); - println( " " ); - } - - println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); - println( " " ); - println( "^2 / \ / \ / \" ); - println( "^2scroll up" ); - println( "^2 / \ / \ / \" ); - println( " " ); - } - else - return; - - filename = "scriptgen/" + level.script + "_scriptgen.gsc"; - csvfilename = "zone_source/" + level.script + ".csv"; - - if ( level.bscriptgened ) - file = openfile( filename, "write" ); - else - file = 0; - - assert( file != -1, "File not writeable( check it and and restart the map ): " + filename ); - script_gen_dumpprintln( file, "// script generated script do not write your own script here it will go away if you do." ); - script_gen_dumpprintln( file, "main()" ); - script_gen_dumpprintln( file, "{" ); - script_gen_dumpprintln( file, "" ); - script_gen_dumpprintln( file, "\tlevel.script_gen_dump = [];" ); - script_gen_dumpprintln( file, "" ); - signatures = getarraykeys( level.script_gen_dump ); - - for ( i = 0; i < signatures.size; i++ ) - { - if ( !issubstr( level.script_gen_dump[signatures[i]], "nowrite" ) ) - script_gen_dumpprintln( file, "\t" + level.script_gen_dump[signatures[i]] ); - } - - for ( i = 0; i < signatures.size; i++ ) - { - if ( !issubstr( level.script_gen_dump[signatures[i]], "nowrite" ) ) - { - script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + "\"" + signatures[i] + "\"" + " ] = " + "\"" + signatures[i] + "\"" + ";" ); - continue; - } - - script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + "\"" + signatures[i] + "\"" + " ] = " + "\"nowrite\"" + ";" ); - } - - script_gen_dumpprintln( file, "" ); - keys1 = undefined; - keys2 = undefined; - - if ( isdefined( level.sg_precacheanims ) ) - keys1 = getarraykeys( level.sg_precacheanims ); - - if ( isdefined( keys1 ) ) - { - for ( i = 0; i < keys1.size; i++ ) - script_gen_dumpprintln( file, "\tanim_precach_" + keys1[i] + "();" ); - } - - script_gen_dumpprintln( file, "\tmaps\_load::main( 1, " + level.bcsvgened + ", 1 );" ); - script_gen_dumpprintln( file, "}" ); - script_gen_dumpprintln( file, "" ); - - if ( isdefined( level.sg_precacheanims ) ) - keys1 = getarraykeys( level.sg_precacheanims ); - - if ( isdefined( keys1 ) ) - { - for ( i = 0; i < keys1.size; i++ ) - { - script_gen_dumpprintln( file, "#using_animtree( \"" + keys1[i] + "\" );" ); - script_gen_dumpprintln( file, "anim_precach_" + keys1[i] + "()" ); - script_gen_dumpprintln( file, "{" ); - script_gen_dumpprintln( file, "\tlevel.sg_animtree[ \"" + keys1[i] + "\" ] = #animtree;" ); - keys2 = getarraykeys( level.sg_precacheanims[keys1[i]] ); - - if ( isdefined( keys2 ) ) - { - for ( j = 0; j < keys2.size; j++ ) - script_gen_dumpprintln( file, "\tlevel.sg_anim[ \"" + keys2[j] + "\" ] = %" + keys2[j] + ";" ); - } - - script_gen_dumpprintln( file, "}" ); - script_gen_dumpprintln( file, "" ); - } - } - - if ( level.bscriptgened ) - saved = closefile( file ); - else - saved = 1; - - if ( level.bcsvgened ) - csvfile = openfile( csvfilename, "write" ); - else - csvfile = 0; - - assert( csvfile != -1, "File not writeable( check it and and restart the map ): " + csvfilename ); - signatures = getarraykeys( level.script_gen_dump ); - - for ( i = 0; i < signatures.size; i++ ) - script_gen_csvdumpprintln( csvfile, signatures[i] ); - - if ( level.bcsvgened ) - csvfilesaved = closefile( csvfile ); - else - csvfilesaved = 1; - - assert( csvfilesaved == 1, "csv not saved( see above message? ): " + csvfilename ); - assert( saved == 1, "map not saved( see above message? ): " + filename ); + script_gen_dump_checksaved(); + if ( !level.script_gen_dump_reasons.size ) + { + flag_set( "scriptgen_done" ); + return; + } + firstrun = 0; + if ( level.bscriptgened ) + { + println( " " ); + println( " " ); + println( " " ); + println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); + println( "^3Dumping scriptgen dump for these reasons" ); + println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); + i = 0; + while ( i < level.script_gen_dump_reasons.size ) + { + if ( issubstr( level.script_gen_dump_reasons[ i ], "nowrite" ) ) + { + substr = getsubstr( level.script_gen_dump_reasons[ i ], 15 ); + println( ( i + ". ) " ) + substr ); + } + else + { + println( ( i + ". ) " ) + level.script_gen_dump_reasons[ i ] ); + } + if ( level.script_gen_dump_reasons[ i ] == "First run" ) + { + firstrun = 1; + } + i++; + } + println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); + println( " " ); + if ( firstrun ) + { + println( "for First Run make sure you delete all of the vehicle precache script calls, createart calls, createfx calls( most commonly placed in maps\\" + level.script + "_fx.gsc ) " ); + println( " " ); + println( "replace:" ); + println( "maps\\_load::main( 1 );" ); + println( " " ); + println( "with( don't forget to add this file to P4 ):" ); + println( "maps\\scriptgen\\" + level.script + "_scriptgen::main();" ); + println( " " ); + } + println( "^2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); + println( " " ); + println( "^2 / \\ / \\ / \\" ); + println( "^2scroll up" ); + println( "^2 / \\ / \\ / \\" ); + println( " " ); + } + else + { + return; + } + filename = "scriptgen/" + level.script + "_scriptgen.gsc"; + csvfilename = "zone_source/" + level.script + ".csv"; + if ( level.bscriptgened ) + { + file = openfile( filename, "write" ); + } + else + { + file = 0; + } + assert( file != -1, "File not writeable( check it and and restart the map ): " + filename ); + script_gen_dumpprintln( file, "// script generated script do not write your own script here it will go away if you do." ); + script_gen_dumpprintln( file, "main()" ); + script_gen_dumpprintln( file, "{" ); + script_gen_dumpprintln( file, "" ); + script_gen_dumpprintln( file, "\tlevel.script_gen_dump = [];" ); + script_gen_dumpprintln( file, "" ); + signatures = getarraykeys( level.script_gen_dump ); + i = 0; + while ( i < signatures.size ) + { + if ( !issubstr( level.script_gen_dump[ signatures[ i ] ], "nowrite" ) ) + { + script_gen_dumpprintln( file, "\t" + level.script_gen_dump[ signatures[ i ] ] ); + } + i++; + } + i = 0; + while ( i < signatures.size ) + { + if ( !issubstr( level.script_gen_dump[ signatures[ i ] ], "nowrite" ) ) + { + script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + """ + signatures[ i ] + """ + " ] = " + """ + signatures[ i ] + """ + ";" ); + i++; + continue; + } + else + { + script_gen_dumpprintln( file, "\tlevel.script_gen_dump[ " + """ + signatures[ i ] + """ + " ] = " + ""nowrite"" + ";" ); + } + i++; + } + script_gen_dumpprintln( file, "" ); + keys1 = undefined; + keys2 = undefined; + if ( isDefined( level.sg_precacheanims ) ) + { + keys1 = getarraykeys( level.sg_precacheanims ); + } + while ( isDefined( keys1 ) ) + { + i = 0; + while ( i < keys1.size ) + { + script_gen_dumpprintln( file, "\tanim_precach_" + keys1[ i ] + "();" ); + i++; + } + } + script_gen_dumpprintln( file, "\tmaps\\_load::main( 1, " + level.bcsvgened + ", 1 );" ); + script_gen_dumpprintln( file, "}" ); + script_gen_dumpprintln( file, "" ); + if ( isDefined( level.sg_precacheanims ) ) + { + keys1 = getarraykeys( level.sg_precacheanims ); + } + while ( isDefined( keys1 ) ) + { + i = 0; + while ( i < keys1.size ) + { + script_gen_dumpprintln( file, "#using_animtree( "" + keys1[ i ] + "" );" ); + script_gen_dumpprintln( file, "anim_precach_" + keys1[ i ] + "()" ); + script_gen_dumpprintln( file, "{" ); + script_gen_dumpprintln( file, "\tlevel.sg_animtree[ "" + keys1[ i ] + "" ] = #animtree;" ); + keys2 = getarraykeys( level.sg_precacheanims[ keys1[ i ] ] ); + while ( isDefined( keys2 ) ) + { + j = 0; + while ( j < keys2.size ) + { + script_gen_dumpprintln( file, "\tlevel.sg_anim[ "" + keys2[ j ] + "" ] = %" + keys2[ j ] + ";" ); + j++; + } + } + script_gen_dumpprintln( file, "}" ); + script_gen_dumpprintln( file, "" ); + i++; + } + } + if ( level.bscriptgened ) + { + saved = closefile( file ); + } + else + { + saved = 1; + } + if ( level.bcsvgened ) + { + csvfile = openfile( csvfilename, "write" ); + } + else + { + csvfile = 0; + } + assert( csvfile != -1, "File not writeable( check it and and restart the map ): " + csvfilename ); + signatures = getarraykeys( level.script_gen_dump ); + i = 0; + while ( i < signatures.size ) + { + script_gen_csvdumpprintln( csvfile, signatures[ i ] ); + i++; + } + if ( level.bcsvgened ) + { + csvfilesaved = closefile( csvfile ); + } + else + { + csvfilesaved = 1; + } + assert( csvfilesaved == 1, "csv not saved( see above message? ): " + csvfilename ); + assert( saved == 1, "map not saved( see above message? ): " + filename ); #/ /# - assert( !level.bscriptgened, "SCRIPTGEN generated: follow instructions listed above this error in the console" ); + assert( !level.bscriptgened, "SCRIPTGEN generated: follow instructions listed above this error in the console" ); #/ - if ( level.bscriptgened ) - { + if ( level.bscriptgened ) + { /# - assertmsg( "SCRIPTGEN updated: Rebuild fast file and run map again" ); + assertmsg( "SCRIPTGEN updated: Rebuild fast file and run map again" ); #/ - } - - flag_set( "scriptgen_done" ); + } + flag_set( "scriptgen_done" ); } script_gen_csvdumpprintln( file, signature ) { - prefix = undefined; - writtenprefix = undefined; - path = ""; - extension = ""; - - if ( issubstr( signature, "ignore" ) ) - prefix = "ignore"; - else if ( issubstr( signature, "col_map_sp" ) ) - prefix = "col_map_sp"; - else if ( issubstr( signature, "gfx_map" ) ) - prefix = "gfx_map"; - else if ( issubstr( signature, "rawfile" ) ) - prefix = "rawfile"; - else if ( issubstr( signature, "sound" ) ) - prefix = "sound"; - else if ( issubstr( signature, "xmodel" ) ) - prefix = "xmodel"; - else if ( issubstr( signature, "xanim" ) ) - prefix = "xanim"; - else if ( issubstr( signature, "item" ) ) - { - prefix = "item"; - writtenprefix = "weapon"; - path = "sp/"; - } - else if ( issubstr( signature, "fx" ) ) - prefix = "fx"; - else if ( issubstr( signature, "menu" ) ) - { - prefix = "menu"; - writtenprefix = "menufile"; - path = "ui / scriptmenus/"; - extension = ".menu"; - } - else if ( issubstr( signature, "rumble" ) ) - { - prefix = "rumble"; - writtenprefix = "rawfile"; - path = "rumble/"; - } - else if ( issubstr( signature, "shader" ) ) - { - prefix = "shader"; - writtenprefix = "material"; - } - else if ( issubstr( signature, "shock" ) ) - { - prefix = "shock"; - writtenprefix = "rawfile"; - extension = ".shock"; - path = "shock/"; - } - else if ( issubstr( signature, "string" ) ) - { - prefix = "string"; + prefix = undefined; + writtenprefix = undefined; + path = ""; + extension = ""; + if ( issubstr( signature, "ignore" ) ) + { + prefix = "ignore"; + } + else if ( issubstr( signature, "col_map_sp" ) ) + { + prefix = "col_map_sp"; + } + else if ( issubstr( signature, "gfx_map" ) ) + { + prefix = "gfx_map"; + } + else if ( issubstr( signature, "rawfile" ) ) + { + prefix = "rawfile"; + } + else if ( issubstr( signature, "sound" ) ) + { + prefix = "sound"; + } + else if ( issubstr( signature, "xmodel" ) ) + { + prefix = "xmodel"; + } + else if ( issubstr( signature, "xanim" ) ) + { + prefix = "xanim"; + } + else if ( issubstr( signature, "item" ) ) + { + prefix = "item"; + writtenprefix = "weapon"; + path = "sp/"; + } + else if ( issubstr( signature, "fx" ) ) + { + prefix = "fx"; + } + else if ( issubstr( signature, "menu" ) ) + { + prefix = "menu"; + writtenprefix = "menufile"; + path = "ui / scriptmenus/"; + extension = ".menu"; + } + else if ( issubstr( signature, "rumble" ) ) + { + prefix = "rumble"; + writtenprefix = "rawfile"; + path = "rumble/"; + } + else if ( issubstr( signature, "shader" ) ) + { + prefix = "shader"; + writtenprefix = "material"; + } + else if ( issubstr( signature, "shock" ) ) + { + prefix = "shock"; + writtenprefix = "rawfile"; + extension = ".shock"; + path = "shock/"; + } + else if ( issubstr( signature, "string" ) ) + { + prefix = "string"; /# - assertmsg( "string not yet supported by scriptgen" ); + assertmsg( "string not yet supported by scriptgen" ); #/ - } - else if ( issubstr( signature, "turret" ) ) - { - prefix = "turret"; - writtenprefix = "weapon"; - path = "sp/"; - } - else if ( issubstr( signature, "vehicle" ) ) - { - prefix = "vehicle"; - writtenprefix = "rawfile"; - path = "vehicles/"; - } - - if ( !isdefined( prefix ) ) - return; - - if ( !isdefined( writtenprefix ) ) - string = prefix + ", " + getsubstr( signature, prefix.size + 1, signature.size ); - else - string = writtenprefix + ", " + path + getsubstr( signature, prefix.size + 1, signature.size ) + extension; + } + else if ( issubstr( signature, "turret" ) ) + { + prefix = "turret"; + writtenprefix = "weapon"; + path = "sp/"; + } + else + { + if ( issubstr( signature, "vehicle" ) ) + { + prefix = "vehicle"; + writtenprefix = "rawfile"; + path = "vehicles/"; + } + } + if ( !isDefined( prefix ) ) + { + return; + } + if ( !isDefined( writtenprefix ) ) + { + string = ( prefix + ", " ) + getsubstr( signature, prefix.size + 1, signature.size ); + } + else + { + string = ( writtenprefix + ", " ) + path + getsubstr( signature, prefix.size + 1, signature.size ) + extension; + } /# - if ( file == -1 || !level.bcsvgened ) - println( string ); - else - fprintln( file, string ); + if ( file == -1 || !level.bcsvgened ) + { + println( string ); + } + else + { + fprintln( file, string ); #/ + } } script_gen_dumpprintln( file, string ) { /# - if ( file == -1 || !level.bscriptgened ) - println( string ); - else - fprintln( file, string ); + if ( file == -1 || !level.bscriptgened ) + { + println( string ); + } + else + { + fprintln( file, string ); #/ + } } diff --git a/Zombie Core/patch_zm/maps/mp/_serverfaceanim_mp.gsc b/Zombie Core/patch_zm/maps/mp/_serverfaceanim_mp.gsc index 57936ef..bbd52a4 100644 --- a/Zombie Core/patch_zm/maps/mp/_serverfaceanim_mp.gsc +++ b/Zombie Core/patch_zm/maps/mp/_serverfaceanim_mp.gsc @@ -1,61 +1,56 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - for (;;) - { - level waittill( "connecting", player ); - - player thread onplayerspawned(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self thread init_serverfaceanim(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread init_serverfaceanim(); + } } init_serverfaceanim() { - self.do_face_anims = 1; - - if ( !isdefined( level.face_event_handler ) ) - { - level.face_event_handler = spawnstruct(); - level.face_event_handler.events = []; - level.face_event_handler.events["death"] = "face_death"; - level.face_event_handler.events["grenade danger"] = "face_alert"; - level.face_event_handler.events["bulletwhizby"] = "face_alert"; - level.face_event_handler.events["projectile_impact"] = "face_alert"; - level.face_event_handler.events["explode"] = "face_alert"; - level.face_event_handler.events["alert"] = "face_alert"; - level.face_event_handler.events["shoot"] = "face_shoot_single"; - level.face_event_handler.events["melee"] = "face_melee"; - level.face_event_handler.events["damage"] = "face_pain"; - level thread wait_for_face_event(); - } + self.do_face_anims = 1; + if ( !isDefined( level.face_event_handler ) ) + { + level.face_event_handler = spawnstruct(); + level.face_event_handler.events = []; + level.face_event_handler.events[ "death" ] = "face_death"; + level.face_event_handler.events[ "grenade danger" ] = "face_alert"; + level.face_event_handler.events[ "bulletwhizby" ] = "face_alert"; + level.face_event_handler.events[ "projectile_impact" ] = "face_alert"; + level.face_event_handler.events[ "explode" ] = "face_alert"; + level.face_event_handler.events[ "alert" ] = "face_alert"; + level.face_event_handler.events[ "shoot" ] = "face_shoot_single"; + level.face_event_handler.events[ "melee" ] = "face_melee"; + level.face_event_handler.events[ "damage" ] = "face_pain"; + level thread wait_for_face_event(); + } } wait_for_face_event() { - while ( true ) - { - level waittill( "face", face_notify, ent ); - - if ( isdefined( ent ) && isdefined( ent.do_face_anims ) && ent.do_face_anims ) - { - if ( isdefined( level.face_event_handler.events[face_notify] ) ) - ent sendfaceevent( level.face_event_handler.events[face_notify] ); - } - } + while ( 1 ) + { + level waittill( "face", face_notify, ent ); + if ( isDefined( ent ) && isDefined( ent.do_face_anims ) && ent.do_face_anims ) + { + if ( isDefined( level.face_event_handler.events[ face_notify ] ) ) + { + ent sendfaceevent( level.face_event_handler.events[ face_notify ] ); + } + } + } } diff --git a/Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc b/Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc index 86ae4c3..eb8885c 100644 --- a/Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc +++ b/Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc @@ -1,15 +1,12 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" ); - loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" ); + loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" ); + loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" ); } watch_bolt_detonation( owner ) { - } diff --git a/Zombie Core/patch_zm/maps/mp/_utility.gsc b/Zombie Core/patch_zm/maps/mp/_utility.gsc index 70e5702..0157398 100644 --- a/Zombie Core/patch_zm/maps/mp/_utility.gsc +++ b/Zombie Core/patch_zm/maps/mp/_utility.gsc @@ -1,2721 +1,3077 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\_createfx; -#include maps\mp\_utility; +#include maps/mp/_utility; +#include maps/mp/_createfx; +#include maps/mp/gametypes/_hud_util; +#include common_scripts/utility; addcallback( event, func ) { /# - assert( isdefined( event ), "Trying to set a callback on an undefined event." ); + assert( isDefined( event ), "Trying to set a callback on an undefined event." ); #/ - if ( !isdefined( level._callbacks ) || !isdefined( level._callbacks[event] ) ) - level._callbacks[event] = []; - - level._callbacks[event] = add_to_array( level._callbacks[event], func, 0 ); + if ( !isDefined( level._callbacks ) || !isDefined( level._callbacks[ event ] ) ) + { + level._callbacks[ event ] = []; + } + level._callbacks[ event ] = add_to_array( level._callbacks[ event ], func, 0 ); } callback( event ) { - if ( isdefined( level._callbacks ) && isdefined( level._callbacks[event] ) ) - { - for ( i = 0; i < level._callbacks[event].size; i++ ) - { - callback = level._callbacks[event][i]; - - if ( isdefined( callback ) ) - self thread [[ callback ]](); - } - } + while ( isDefined( level._callbacks ) && isDefined( level._callbacks[ event ] ) ) + { + i = 0; + while ( i < level._callbacks[ event ].size ) + { + callback = level._callbacks[ event ][ i ]; + if ( isDefined( callback ) ) + { + self thread [[ callback ]](); + } + i++; + } + } } onfinalizeinitialization_callback( func ) { - addcallback( "on_finalize_initialization", func ); + addcallback( "on_finalize_initialization", func ); } triggeroff() { - if ( !isdefined( self.realorigin ) ) - self.realorigin = self.origin; - - if ( self.origin == self.realorigin ) - self.origin += vectorscale( ( 0, 0, -1 ), 10000.0 ); + if ( !isDefined( self.realorigin ) ) + { + self.realorigin = self.origin; + } + if ( self.origin == self.realorigin ) + { + self.origin += vectorScale( ( 0, 0, 1 ), 10000 ); + } } triggeron() { - if ( isdefined( self.realorigin ) ) - self.origin = self.realorigin; + if ( isDefined( self.realorigin ) ) + { + self.origin = self.realorigin; + } } error( msg ) { /# - println( "^c*ERROR* ", msg ); - wait 0.05; - - if ( getdvar( _hash_F49A52C ) != "1" ) - { -/# - assertmsg( "This is a forced error - attach the log file" ); -#/ - } + println( "^c*ERROR* ", msg ); + wait 0,05; + if ( getDvar( "debug" ) != "1" ) + { + assertmsg( "This is a forced error - attach the log file" ); #/ + } } warning( msg ) { /# - println( "^1WARNING: " + msg ); + println( "^1WARNING: " + msg ); #/ } spawn_array_struct() { - s = spawnstruct(); - s.a = []; - return s; + s = spawnstruct(); + s.a = []; + return s; } within_fov( start_origin, start_angles, end_origin, fov ) { - normal = vectornormalize( end_origin - start_origin ); - forward = anglestoforward( start_angles ); - dot = vectordot( forward, normal ); - return dot >= fov; + normal = vectornormalize( end_origin - start_origin ); + forward = anglesToForward( start_angles ); + dot = vectordot( forward, normal ); + return dot >= fov; } append_array_struct( dst_s, src_s ) { - for ( i = 0; i < src_s.a.size; i++ ) - dst_s.a[dst_s.a.size] = src_s.a[i]; + i = 0; + while ( i < src_s.a.size ) + { + dst_s.a[ dst_s.a.size ] = src_s.a[ i ]; + i++; + } } exploder( num ) { - [[ level.exploderfunction ]]( num ); + [[ level.exploderfunction ]]( num ); } exploder_stop( num ) { - stop_exploder( num ); + stop_exploder( num ); } exploder_sound() { - if ( isdefined( self.script_delay ) ) - wait( self.script_delay ); - - self playsound( level.scr_sound[self.script_sound] ); + if ( isDefined( self.script_delay ) ) + { + wait self.script_delay; + } + self playsound( level.scr_sound[ self.script_sound ] ); } cannon_effect() { - if ( isdefined( self.v["repeat"] ) ) - { - for ( i = 0; i < self.v["repeat"]; i++ ) - { - playfx( level._effect[self.v["fxid"]], self.v["origin"], self.v["forward"], self.v["up"] ); - self exploder_delay(); - } - - return; - } - - self exploder_delay(); - - if ( isdefined( self.looper ) ) - self.looper delete(); - - self.looper = spawnfx( getfx( self.v["fxid"] ), self.v["origin"], self.v["forward"], self.v["up"] ); - triggerfx( self.looper ); - exploder_playsound(); + if ( isDefined( self.v[ "repeat" ] ) ) + { + i = 0; + while ( i < self.v[ "repeat" ] ) + { + playfx( level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); + self exploder_delay(); + i++; + } + return; + } + self exploder_delay(); + if ( isDefined( self.looper ) ) + { + self.looper delete(); + } + self.looper = spawnfx( getfx( self.v[ "fxid" ] ), self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); + triggerfx( self.looper ); + exploder_playsound(); } exploder_delay() { - if ( !isdefined( self.v["delay"] ) ) - self.v["delay"] = 0; - - min_delay = self.v["delay"]; - max_delay = self.v["delay"] + 0.001; - - if ( isdefined( self.v["delay_min"] ) ) - min_delay = self.v["delay_min"]; - - if ( isdefined( self.v["delay_max"] ) ) - max_delay = self.v["delay_max"]; - - if ( min_delay > 0 ) - wait( randomfloatrange( min_delay, max_delay ) ); + if ( !isDefined( self.v[ "delay" ] ) ) + { + self.v[ "delay" ] = 0; + } + min_delay = self.v[ "delay" ]; + max_delay = self.v[ "delay" ] + 0,001; + if ( isDefined( self.v[ "delay_min" ] ) ) + { + min_delay = self.v[ "delay_min" ]; + } + if ( isDefined( self.v[ "delay_max" ] ) ) + { + max_delay = self.v[ "delay_max" ]; + } + if ( min_delay > 0 ) + { + wait randomfloatrange( min_delay, max_delay ); + } } exploder_playsound() { - if ( !isdefined( self.v["soundalias"] ) || self.v["soundalias"] == "nil" ) - return; - - play_sound_in_space( self.v["soundalias"], self.v["origin"] ); + if ( !isDefined( self.v[ "soundalias" ] ) || self.v[ "soundalias" ] == "nil" ) + { + return; + } + play_sound_in_space( self.v[ "soundalias" ], self.v[ "origin" ] ); } brush_delete() { - num = self.v["exploder"]; - - if ( isdefined( self.v["delay"] ) ) - wait( self.v["delay"] ); - else - wait 0.05; - - if ( !isdefined( self.model ) ) - return; + num = self.v[ "exploder" ]; + if ( isDefined( self.v[ "delay" ] ) ) + { + wait self.v[ "delay" ]; + } + else + { + wait 0,05; + } + if ( !isDefined( self.model ) ) + { + return; + } /# - assert( isdefined( self.model ) ); + assert( isDefined( self.model ) ); #/ - if ( level.createfx_enabled ) - { - if ( isdefined( self.exploded ) ) - return; - - self.exploded = 1; - self.model hide(); - self.model notsolid(); - wait 3; - self.exploded = undefined; - self.model show(); - self.model solid(); - return; - } - - if ( !isdefined( self.v["fxid"] ) || self.v["fxid"] == "No FX" ) - self.v["exploder"] = undefined; - - waittillframeend; - self.model delete(); + if ( level.createfx_enabled ) + { + if ( isDefined( self.exploded ) ) + { + return; + } + self.exploded = 1; + self.model hide(); + self.model notsolid(); + wait 3; + self.exploded = undefined; + self.model show(); + self.model solid(); + return; + } + if ( !isDefined( self.v[ "fxid" ] ) || self.v[ "fxid" ] == "No FX" ) + { + } + waittillframeend; + self.model delete(); } brush_show() { - if ( isdefined( self.v["delay"] ) ) - wait( self.v["delay"] ); + if ( isDefined( self.v[ "delay" ] ) ) + { + wait self.v[ "delay" ]; + } /# - assert( isdefined( self.model ) ); + assert( isDefined( self.model ) ); #/ - self.model show(); - self.model solid(); - - if ( level.createfx_enabled ) - { - if ( isdefined( self.exploded ) ) - return; - - self.exploded = 1; - wait 3; - self.exploded = undefined; - self.model hide(); - self.model notsolid(); - } + self.model show(); + self.model solid(); + if ( level.createfx_enabled ) + { + if ( isDefined( self.exploded ) ) + { + return; + } + self.exploded = 1; + wait 3; + self.exploded = undefined; + self.model hide(); + self.model notsolid(); + } } brush_throw() { - if ( isdefined( self.v["delay"] ) ) - wait( self.v["delay"] ); - - ent = undefined; - - if ( isdefined( self.v["target"] ) ) - ent = getent( self.v["target"], "targetname" ); - - if ( !isdefined( ent ) ) - { - self.model delete(); - return; - } - - self.model show(); - startorg = self.v["origin"]; - startang = self.v["angles"]; - org = ent.origin; - temp_vec = org - self.v["origin"]; - x = temp_vec[0]; - y = temp_vec[1]; - z = temp_vec[2]; - self.model rotatevelocity( ( x, y, z ), 12 ); - self.model movegravity( ( x, y, z ), 12 ); - - if ( level.createfx_enabled ) - { - if ( isdefined( self.exploded ) ) - return; - - self.exploded = 1; - wait 3; - self.exploded = undefined; - self.v["origin"] = startorg; - self.v["angles"] = startang; - self.model hide(); - return; - } - - self.v["exploder"] = undefined; - wait 6; - self.model delete(); + if ( isDefined( self.v[ "delay" ] ) ) + { + wait self.v[ "delay" ]; + } + ent = undefined; + if ( isDefined( self.v[ "target" ] ) ) + { + ent = getent( self.v[ "target" ], "targetname" ); + } + if ( !isDefined( ent ) ) + { + self.model delete(); + return; + } + self.model show(); + startorg = self.v[ "origin" ]; + startang = self.v[ "angles" ]; + org = ent.origin; + temp_vec = org - self.v[ "origin" ]; + x = temp_vec[ 0 ]; + y = temp_vec[ 1 ]; + z = temp_vec[ 2 ]; + self.model rotatevelocity( ( x, y, z ), 12 ); + self.model movegravity( ( x, y, z ), 12 ); + if ( level.createfx_enabled ) + { + if ( isDefined( self.exploded ) ) + { + return; + } + self.exploded = 1; + wait 3; + self.exploded = undefined; + self.v[ "origin" ] = startorg; + self.v[ "angles" ] = startang; + self.model hide(); + return; + } + wait 6; + self.model delete(); } getplant() { - start = self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); - range = 11; - forward = anglestoforward( self.angles ); - forward = vectorscale( forward, range ); - traceorigins[0] = start + forward; - traceorigins[1] = start; - trace = bullettrace( traceorigins[0], traceorigins[0] + vectorscale( ( 0, 0, -1 ), 18.0 ), 0, undefined ); - - if ( trace["fraction"] < 1 ) - { - temp = spawnstruct(); - temp.origin = trace["position"]; - temp.angles = orienttonormal( trace["normal"] ); - return temp; - } - - trace = bullettrace( traceorigins[1], traceorigins[1] + vectorscale( ( 0, 0, -1 ), 18.0 ), 0, undefined ); - - if ( trace["fraction"] < 1 ) - { - temp = spawnstruct(); - temp.origin = trace["position"]; - temp.angles = orienttonormal( trace["normal"] ); - return temp; - } - - traceorigins[2] = start + vectorscale( ( 1, 1, 0 ), 16.0 ); - traceorigins[3] = start + vectorscale( ( 1, -1, 0 ), 16.0 ); - traceorigins[4] = start + vectorscale( ( -1, -1, 0 ), 16.0 ); - traceorigins[5] = start + vectorscale( ( -1, 1, 0 ), 16.0 ); - besttracefraction = undefined; - besttraceposition = undefined; - - for ( i = 0; i < traceorigins.size; i++ ) - { - trace = bullettrace( traceorigins[i], traceorigins[i] + vectorscale( ( 0, 0, -1 ), 1000.0 ), 0, undefined ); - - if ( !isdefined( besttracefraction ) || trace["fraction"] < besttracefraction ) - { - besttracefraction = trace["fraction"]; - besttraceposition = trace["position"]; - } - } - - if ( besttracefraction == 1 ) - besttraceposition = self.origin; - - temp = spawnstruct(); - temp.origin = besttraceposition; - temp.angles = orienttonormal( trace["normal"] ); - return temp; + start = self.origin + vectorScale( ( 0, 0, 1 ), 10 ); + range = 11; + forward = anglesToForward( self.angles ); + forward = vectorScale( forward, range ); + traceorigins[ 0 ] = start + forward; + traceorigins[ 1 ] = start; + trace = bullettrace( traceorigins[ 0 ], traceorigins[ 0 ] + vectorScale( ( 0, 0, 1 ), 18 ), 0, undefined ); + if ( trace[ "fraction" ] < 1 ) + { + temp = spawnstruct(); + temp.origin = trace[ "position" ]; + temp.angles = orienttonormal( trace[ "normal" ] ); + return temp; + } + trace = bullettrace( traceorigins[ 1 ], traceorigins[ 1 ] + vectorScale( ( 0, 0, 1 ), 18 ), 0, undefined ); + if ( trace[ "fraction" ] < 1 ) + { + temp = spawnstruct(); + temp.origin = trace[ "position" ]; + temp.angles = orienttonormal( trace[ "normal" ] ); + return temp; + } + traceorigins[ 2 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); + traceorigins[ 3 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); + traceorigins[ 4 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); + traceorigins[ 5 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); + besttracefraction = undefined; + besttraceposition = undefined; + i = 0; + while ( i < traceorigins.size ) + { + trace = bullettrace( traceorigins[ i ], traceorigins[ i ] + vectorScale( ( 0, 0, 1 ), 1000 ), 0, undefined ); + if ( !isDefined( besttracefraction ) || trace[ "fraction" ] < besttracefraction ) + { + besttracefraction = trace[ "fraction" ]; + besttraceposition = trace[ "position" ]; + } + i++; + } + if ( besttracefraction == 1 ) + { + besttraceposition = self.origin; + } + temp = spawnstruct(); + temp.origin = besttraceposition; + temp.angles = orienttonormal( trace[ "normal" ] ); + return temp; } orienttonormal( normal ) { - hor_normal = ( normal[0], normal[1], 0 ); - hor_length = length( hor_normal ); - - if ( !hor_length ) - return ( 0, 0, 0 ); - - hor_dir = vectornormalize( hor_normal ); - neg_height = normal[2] * -1; - tangent = ( hor_dir[0] * neg_height, hor_dir[1] * neg_height, hor_length ); - plant_angle = vectortoangles( tangent ); - return plant_angle; + hor_normal = ( normal[ 0 ], normal[ 1 ], 0 ); + hor_length = length( hor_normal ); + if ( !hor_length ) + { + return ( 0, 0, 1 ); + } + hor_dir = vectornormalize( hor_normal ); + neg_height = normal[ 2 ] * -1; + tangent = ( hor_dir[ 0 ] * neg_height, hor_dir[ 1 ] * neg_height, hor_length ); + plant_angle = vectorToAngle( tangent ); + return plant_angle; } array_levelthread( ents, process, var, excluders ) { - exclude = []; - - for ( i = 0; i < ents.size; i++ ) - exclude[i] = 0; - - if ( isdefined( excluders ) ) - { - for ( i = 0; i < ents.size; i++ ) - { - for ( p = 0; p < excluders.size; p++ ) - { - if ( ents[i] == excluders[p] ) - exclude[i] = 1; - } - } - } - - for ( i = 0; i < ents.size; i++ ) - { - if ( !exclude[i] ) - { - if ( isdefined( var ) ) - { - level thread [[ process ]]( ents[i], var ); - continue; - } - - level thread [[ process ]]( ents[i] ); - } - } + exclude = []; + i = 0; + while ( i < ents.size ) + { + exclude[ i ] = 0; + i++; + } + while ( isDefined( excluders ) ) + { + i = 0; + while ( i < ents.size ) + { + p = 0; + while ( p < excluders.size ) + { + if ( ents[ i ] == excluders[ p ] ) + { + exclude[ i ] = 1; + } + p++; + } + i++; + } + } + i = 0; + while ( i < ents.size ) + { + if ( !exclude[ i ] ) + { + if ( isDefined( var ) ) + { + level thread [[ process ]]( ents[ i ], var ); + i++; + continue; + } + else + { + level thread [[ process ]]( ents[ i ] ); + } + } + i++; + } } deleteplacedentity( entity ) { - entities = getentarray( entity, "classname" ); - - for ( i = 0; i < entities.size; i++ ) - entities[i] delete(); + entities = getentarray( entity, "classname" ); + i = 0; + while ( i < entities.size ) + { + entities[ i ] delete(); + i++; + } } playsoundonplayers( sound, team ) { /# - assert( isdefined( level.players ) ); + assert( isDefined( level.players ) ); #/ - if ( level.splitscreen ) - { - if ( isdefined( level.players[0] ) ) - level.players[0] playlocalsound( sound ); - } - else if ( isdefined( team ) ) - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - player playlocalsound( sound ); - } - } - else - { - for ( i = 0; i < level.players.size; i++ ) - level.players[i] playlocalsound( sound ); - } + if ( level.splitscreen ) + { + if ( isDefined( level.players[ 0 ] ) ) + { + level.players[ 0 ] playlocalsound( sound ); + } + } + else if ( isDefined( team ) ) + { + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player playlocalsound( sound ); + } + i++; + } + } + else i = 0; + while ( i < level.players.size ) + { + level.players[ i ] playlocalsound( sound ); + i++; + } } get_player_height() { - return 70.0; + return 70; } isbulletimpactmod( smeansofdeath ) { - return issubstr( smeansofdeath, "BULLET" ) || smeansofdeath == "MOD_HEAD_SHOT"; + if ( !issubstr( smeansofdeath, "BULLET" ) ) + { + return smeansofdeath == "MOD_HEAD_SHOT"; + } } get_team_alive_players_s( teamname ) { - teamplayers_s = spawn_array_struct(); - - if ( isdefined( teamname ) && isdefined( level.aliveplayers ) && isdefined( level.aliveplayers[teamname] ) ) - { - for ( i = 0; i < level.aliveplayers[teamname].size; i++ ) - teamplayers_s.a[teamplayers_s.a.size] = level.aliveplayers[teamname][i]; - } - - return teamplayers_s; + teamplayers_s = spawn_array_struct(); + while ( isDefined( teamname ) && isDefined( level.aliveplayers ) && isDefined( level.aliveplayers[ teamname ] ) ) + { + i = 0; + while ( i < level.aliveplayers[ teamname ].size ) + { + teamplayers_s.a[ teamplayers_s.a.size ] = level.aliveplayers[ teamname ][ i ]; + i++; + } + } + return teamplayers_s; } get_all_alive_players_s() { - allplayers_s = spawn_array_struct(); - - if ( isdefined( level.aliveplayers ) ) - { - keys = getarraykeys( level.aliveplayers ); - - for ( i = 0; i < keys.size; i++ ) - { - team = keys[i]; - - for ( j = 0; j < level.aliveplayers[team].size; j++ ) - allplayers_s.a[allplayers_s.a.size] = level.aliveplayers[team][j]; - } - } - - return allplayers_s; + allplayers_s = spawn_array_struct(); + while ( isDefined( level.aliveplayers ) ) + { + keys = getarraykeys( level.aliveplayers ); + i = 0; + while ( i < keys.size ) + { + team = keys[ i ]; + j = 0; + while ( j < level.aliveplayers[ team ].size ) + { + allplayers_s.a[ allplayers_s.a.size ] = level.aliveplayers[ team ][ j ]; + j++; + } + i++; + } + } + return allplayers_s; } waitrespawnbutton() { - self endon( "disconnect" ); - self endon( "end_respawn" ); - - while ( self usebuttonpressed() != 1 ) - wait 0.05; + self endon( "disconnect" ); + self endon( "end_respawn" ); + while ( self usebuttonpressed() != 1 ) + { + wait 0,05; + } } setlowermessage( text, time, combinemessageandtimer ) { - if ( !isdefined( self.lowermessage ) ) - return; - - if ( isdefined( self.lowermessageoverride ) && text != &"" ) - { - text = self.lowermessageoverride; - time = undefined; - } - - self notify( "lower_message_set" ); - self.lowermessage settext( text ); - - if ( isdefined( time ) && time > 0 ) - { - if ( !isdefined( combinemessageandtimer ) || !combinemessageandtimer ) - self.lowertimer.label = &""; - else - { - self.lowermessage settext( "" ); - self.lowertimer.label = text; - } - - self.lowertimer settimer( time ); - } - else - { - self.lowertimer settext( "" ); - self.lowertimer.label = &""; - } - - if ( self issplitscreen() ) - self.lowermessage.fontscale = 1.4; - - self.lowermessage fadeovertime( 0.05 ); - self.lowermessage.alpha = 1; - self.lowertimer fadeovertime( 0.05 ); - self.lowertimer.alpha = 1; + if ( !isDefined( self.lowermessage ) ) + { + return; + } + if ( isDefined( self.lowermessageoverride ) && text != &"" ) + { + text = self.lowermessageoverride; + time = undefined; + } + self notify( "lower_message_set" ); + self.lowermessage settext( text ); + if ( isDefined( time ) && time > 0 ) + { + if ( !isDefined( combinemessageandtimer ) || !combinemessageandtimer ) + { + self.lowertimer.label = &""; + } + else + { + self.lowermessage settext( "" ); + self.lowertimer.label = text; + } + self.lowertimer settimer( time ); + } + else + { + self.lowertimer settext( "" ); + self.lowertimer.label = &""; + } + if ( self issplitscreen() ) + { + self.lowermessage.fontscale = 1,4; + } + self.lowermessage fadeovertime( 0,05 ); + self.lowermessage.alpha = 1; + self.lowertimer fadeovertime( 0,05 ); + self.lowertimer.alpha = 1; } setlowermessagevalue( text, value, combinemessage ) { - if ( !isdefined( self.lowermessage ) ) - return; - - if ( isdefined( self.lowermessageoverride ) && text != &"" ) - { - text = self.lowermessageoverride; - time = undefined; - } - - self notify( "lower_message_set" ); - - if ( !isdefined( combinemessage ) || !combinemessage ) - self.lowermessage settext( text ); - else - self.lowermessage settext( "" ); - - if ( isdefined( value ) && value > 0 ) - { - if ( !isdefined( combinemessage ) || !combinemessage ) - self.lowertimer.label = &""; - else - self.lowertimer.label = text; - - self.lowertimer setvalue( value ); - } - else - { - self.lowertimer settext( "" ); - self.lowertimer.label = &""; - } - - if ( self issplitscreen() ) - self.lowermessage.fontscale = 1.4; - - self.lowermessage fadeovertime( 0.05 ); - self.lowermessage.alpha = 1; - self.lowertimer fadeovertime( 0.05 ); - self.lowertimer.alpha = 1; + if ( !isDefined( self.lowermessage ) ) + { + return; + } + if ( isDefined( self.lowermessageoverride ) && text != &"" ) + { + text = self.lowermessageoverride; + time = undefined; + } + self notify( "lower_message_set" ); + if ( !isDefined( combinemessage ) || !combinemessage ) + { + self.lowermessage settext( text ); + } + else + { + self.lowermessage settext( "" ); + } + if ( isDefined( value ) && value > 0 ) + { + if ( !isDefined( combinemessage ) || !combinemessage ) + { + self.lowertimer.label = &""; + } + else + { + self.lowertimer.label = text; + } + self.lowertimer setvalue( value ); + } + else + { + self.lowertimer settext( "" ); + self.lowertimer.label = &""; + } + if ( self issplitscreen() ) + { + self.lowermessage.fontscale = 1,4; + } + self.lowermessage fadeovertime( 0,05 ); + self.lowermessage.alpha = 1; + self.lowertimer fadeovertime( 0,05 ); + self.lowertimer.alpha = 1; } clearlowermessage( fadetime ) { - if ( !isdefined( self.lowermessage ) ) - return; - - self notify( "lower_message_set" ); - - if ( !isdefined( fadetime ) || fadetime == 0 ) - setlowermessage( &"" ); - else - { - self endon( "disconnect" ); - self endon( "lower_message_set" ); - self.lowermessage fadeovertime( fadetime ); - self.lowermessage.alpha = 0; - self.lowertimer fadeovertime( fadetime ); - self.lowertimer.alpha = 0; - wait( fadetime ); - self setlowermessage( "" ); - } + if ( !isDefined( self.lowermessage ) ) + { + return; + } + self notify( "lower_message_set" ); + if ( !isDefined( fadetime ) || fadetime == 0 ) + { + setlowermessage( &"" ); + } + else + { + self endon( "disconnect" ); + self endon( "lower_message_set" ); + self.lowermessage fadeovertime( fadetime ); + self.lowermessage.alpha = 0; + self.lowertimer fadeovertime( fadetime ); + self.lowertimer.alpha = 0; + wait fadetime; + self setlowermessage( "" ); + } } printonteam( text, team ) { /# - assert( isdefined( level.players ) ); + assert( isDefined( level.players ) ); #/ - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - player iprintln( text ); - } + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player iprintln( text ); + } + i++; + } } printboldonteam( text, team ) { /# - assert( isdefined( level.players ) ); + assert( isDefined( level.players ) ); #/ - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - player iprintlnbold( text ); - } + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player iprintlnbold( text ); + } + i++; + } } printboldonteamarg( text, team, arg ) { /# - assert( isdefined( level.players ) ); + assert( isDefined( level.players ) ); #/ - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - player iprintlnbold( text, arg ); - } + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player iprintlnbold( text, arg ); + } + i++; + } } printonteamarg( text, team, arg ) { - } printonplayers( text, team ) { - players = level.players; - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( team ) ) - { - if ( isdefined( players[i].pers["team"] ) && players[i].pers["team"] == team ) - players[i] iprintln( text ); - - continue; - } - - players[i] iprintln( text ); - } + players = level.players; + i = 0; + while ( i < players.size ) + { + if ( isDefined( team ) ) + { + if ( isDefined( players[ i ].pers[ "team" ] ) && players[ i ].pers[ "team" ] == team ) + { + players[ i ] iprintln( text ); + } + i++; + continue; + } + else + { + players[ i ] iprintln( text ); + } + i++; + } } printandsoundoneveryone( team, enemyteam, printfriendly, printenemy, soundfriendly, soundenemy, printarg ) { - shoulddosounds = isdefined( soundfriendly ); - shoulddoenemysounds = 0; - - if ( isdefined( soundenemy ) ) - { + shoulddosounds = isDefined( soundfriendly ); + shoulddoenemysounds = 0; + if ( isDefined( soundenemy ) ) + { /# - assert( shoulddosounds ); + assert( shoulddosounds ); #/ - shoulddoenemysounds = 1; - } - - if ( !isdefined( printarg ) ) - printarg = ""; - - if ( level.splitscreen || !shoulddosounds ) - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - playerteam = player.pers["team"]; - - if ( isdefined( playerteam ) ) - { - if ( playerteam == team && isdefined( printfriendly ) && printfriendly != &"" ) - { - player iprintln( printfriendly, printarg ); - continue; - } - - if ( isdefined( printenemy ) && printenemy != &"" ) - { - if ( isdefined( enemyteam ) && playerteam == enemyteam ) - { - player iprintln( printenemy, printarg ); - continue; - } - - if ( !isdefined( enemyteam ) && playerteam != team ) - player iprintln( printenemy, printarg ); - } - } - } - - if ( shoulddosounds ) - { + shoulddoenemysounds = 1; + } + if ( !isDefined( printarg ) ) + { + printarg = ""; + } + if ( level.splitscreen || !shoulddosounds ) + { + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + playerteam = player.pers[ "team" ]; + if ( isDefined( playerteam ) ) + { + if ( playerteam == team && isDefined( printfriendly ) && printfriendly != &"" ) + { + player iprintln( printfriendly, printarg ); + i++; + continue; + } + else + { + if ( isDefined( printenemy ) && printenemy != &"" ) + { + if ( isDefined( enemyteam ) && playerteam == enemyteam ) + { + player iprintln( printenemy, printarg ); + i++; + continue; + } + else + { + if ( !isDefined( enemyteam ) && playerteam != team ) + { + player iprintln( printenemy, printarg ); + } + } + } + } + } + i++; + } + if ( shoulddosounds ) + { /# - assert( level.splitscreen ); + assert( level.splitscreen ); #/ - level.players[0] playlocalsound( soundfriendly ); - } - } - else - { + level.players[ 0 ] playlocalsound( soundfriendly ); + } + } + else + { /# - assert( shoulddosounds ); + assert( shoulddosounds ); #/ - if ( shoulddoenemysounds ) - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - playerteam = player.pers["team"]; - - if ( isdefined( playerteam ) ) - { - if ( playerteam == team ) - { - if ( isdefined( printfriendly ) && printfriendly != &"" ) - player iprintln( printfriendly, printarg ); - - player playlocalsound( soundfriendly ); - continue; - } - - if ( isdefined( enemyteam ) && playerteam == enemyteam || !isdefined( enemyteam ) && playerteam != team ) - { - if ( isdefined( printenemy ) && printenemy != &"" ) - player iprintln( printenemy, printarg ); - - player playlocalsound( soundenemy ); - } - } - } - } - else - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - playerteam = player.pers["team"]; - - if ( isdefined( playerteam ) ) - { - if ( playerteam == team ) - { - if ( isdefined( printfriendly ) && printfriendly != &"" ) - player iprintln( printfriendly, printarg ); - - player playlocalsound( soundfriendly ); - continue; - } - - if ( isdefined( printenemy ) && printenemy != &"" ) - { - if ( isdefined( enemyteam ) && playerteam == enemyteam ) - { - player iprintln( printenemy, printarg ); - continue; - } - - if ( !isdefined( enemyteam ) && playerteam != team ) - player iprintln( printenemy, printarg ); - } - } - } - } - } + if ( shoulddoenemysounds ) + { + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + playerteam = player.pers[ "team" ]; + if ( isDefined( playerteam ) ) + { + if ( playerteam == team ) + { + if ( isDefined( printfriendly ) && printfriendly != &"" ) + { + player iprintln( printfriendly, printarg ); + } + player playlocalsound( soundfriendly ); + i++; + continue; + } + else + { + if ( isDefined( enemyteam ) || playerteam == enemyteam && !isDefined( enemyteam ) && playerteam != team ) + { + if ( isDefined( printenemy ) && printenemy != &"" ) + { + player iprintln( printenemy, printarg ); + } + player playlocalsound( soundenemy ); + } + } + } + i++; + } + } + else i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + playerteam = player.pers[ "team" ]; + if ( isDefined( playerteam ) ) + { + if ( playerteam == team ) + { + if ( isDefined( printfriendly ) && printfriendly != &"" ) + { + player iprintln( printfriendly, printarg ); + } + player playlocalsound( soundfriendly ); + i++; + continue; + } + else if ( isDefined( printenemy ) && printenemy != &"" ) + { + if ( isDefined( enemyteam ) && playerteam == enemyteam ) + { + player iprintln( printenemy, printarg ); + i++; + continue; + } + else + { + if ( !isDefined( enemyteam ) && playerteam != team ) + { + player iprintln( printenemy, printarg ); + } + } + } + } + i++; + } + } } _playlocalsound( soundalias ) { - if ( level.splitscreen && !self ishost() ) - return; - - self playlocalsound( soundalias ); + if ( level.splitscreen && !self ishost() ) + { + return; + } + self playlocalsound( soundalias ); } dvarintvalue( dvar, defval, minval, maxval ) { - dvar = "scr_" + level.gametype + "_" + dvar; - - if ( getdvar( dvar ) == "" ) - { - setdvar( dvar, defval ); - return defval; - } - - value = getdvarint( dvar ); - - if ( value > maxval ) - value = maxval; - else if ( value < minval ) - value = minval; - else - return value; - - setdvar( dvar, value ); - return value; + dvar = "scr_" + level.gametype + "_" + dvar; + if ( getDvar( dvar ) == "" ) + { + setdvar( dvar, defval ); + return defval; + } + value = getDvarInt( dvar ); + if ( value > maxval ) + { + value = maxval; + } + else if ( value < minval ) + { + value = minval; + } + else + { + return value; + } + setdvar( dvar, value ); + return value; } dvarfloatvalue( dvar, defval, minval, maxval ) { - dvar = "scr_" + level.gametype + "_" + dvar; - - if ( getdvar( dvar ) == "" ) - { - setdvar( dvar, defval ); - return defval; - } - - value = getdvarfloat( dvar ); - - if ( value > maxval ) - value = maxval; - else if ( value < minval ) - value = minval; - else - return value; - - setdvar( dvar, value ); - return value; + dvar = "scr_" + level.gametype + "_" + dvar; + if ( getDvar( dvar ) == "" ) + { + setdvar( dvar, defval ); + return defval; + } + value = getDvarFloat( dvar ); + if ( value > maxval ) + { + value = maxval; + } + else if ( value < minval ) + { + value = minval; + } + else + { + return value; + } + setdvar( dvar, value ); + return value; } play_sound_on_tag( alias, tag ) { - if ( isdefined( tag ) ) - { - org = spawn( "script_origin", self gettagorigin( tag ) ); - org linkto( self, tag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); - } - else - { - org = spawn( "script_origin", ( 0, 0, 0 ) ); - org.origin = self.origin; - org.angles = self.angles; - org linkto( self ); - } - - org playsound( alias ); - wait 5.0; - org delete(); + if ( isDefined( tag ) ) + { + org = spawn( "script_origin", self gettagorigin( tag ) ); + org linkto( self, tag, ( 0, 0, 1 ), ( 0, 0, 1 ) ); + } + else + { + org = spawn( "script_origin", ( 0, 0, 1 ) ); + org.origin = self.origin; + org.angles = self.angles; + org linkto( self ); + } + org playsound( alias ); + wait 5; + org delete(); } createloopeffect( fxid ) { - ent = maps\mp\_createfx::createeffect( "loopfx", fxid ); - ent.v["delay"] = 0.5; - return ent; + ent = maps/mp/_createfx::createeffect( "loopfx", fxid ); + ent.v[ "delay" ] = 0,5; + return ent; } createoneshoteffect( fxid ) { - ent = maps\mp\_createfx::createeffect( "oneshotfx", fxid ); - ent.v["delay"] = -15; - return ent; + ent = maps/mp/_createfx::createeffect( "oneshotfx", fxid ); + ent.v[ "delay" ] = -15; + return ent; } loop_fx_sound( alias, origin, ender, timeout ) { - org = spawn( "script_origin", ( 0, 0, 0 ) ); - - if ( isdefined( ender ) ) - { - thread loop_sound_delete( ender, org ); - self endon( ender ); - } - - org.origin = origin; - org playloopsound( alias ); - - if ( !isdefined( timeout ) ) - return; - - wait( timeout ); + org = spawn( "script_origin", ( 0, 0, 1 ) ); + if ( isDefined( ender ) ) + { + thread loop_sound_delete( ender, org ); + self endon( ender ); + } + org.origin = origin; + org playloopsound( alias ); + if ( !isDefined( timeout ) ) + { + return; + } + wait timeout; } exploder_damage() { - if ( isdefined( self.v["delay"] ) ) - delay = self.v["delay"]; - else - delay = 0; - - if ( isdefined( self.v["damage_radius"] ) ) - radius = self.v["damage_radius"]; - else - radius = 128; - - damage = self.v["damage"]; - origin = self.v["origin"]; - wait( delay ); - radiusdamage( origin, radius, damage, damage ); + if ( isDefined( self.v[ "delay" ] ) ) + { + delay = self.v[ "delay" ]; + } + else + { + delay = 0; + } + if ( isDefined( self.v[ "damage_radius" ] ) ) + { + radius = self.v[ "damage_radius" ]; + } + else + { + radius = 128; + } + damage = self.v[ "damage" ]; + origin = self.v[ "origin" ]; + wait delay; + radiusdamage( origin, radius, damage, damage ); } exploder_before_load( num ) { - waittillframeend; - waittillframeend; - activate_exploder( num ); + waittillframeend; + waittillframeend; + activate_exploder( num ); } exploder_after_load( num ) { - activate_exploder( num ); + activate_exploder( num ); } getexploderid( ent ) { - if ( !isdefined( level._exploder_ids ) ) - { - level._exploder_ids = []; - level._exploder_id = 1; - } - - if ( !isdefined( level._exploder_ids[ent.v["exploder"]] ) ) - { - level._exploder_ids[ent.v["exploder"]] = level._exploder_id; - level._exploder_id++; - } - - return level._exploder_ids[ent.v["exploder"]]; + if ( !isDefined( level._exploder_ids ) ) + { + level._exploder_ids = []; + level._exploder_id = 1; + } + if ( !isDefined( level._exploder_ids[ ent.v[ "exploder" ] ] ) ) + { + level._exploder_ids[ ent.v[ "exploder" ] ] = level._exploder_id; + level._exploder_id++; + } + return level._exploder_ids[ ent.v[ "exploder" ] ]; } activate_exploder_on_clients( num ) { - if ( !isdefined( level._exploder_ids[num] ) ) - return; - - if ( !isdefined( level._client_exploders[num] ) ) - level._client_exploders[num] = 1; - - if ( !isdefined( level._client_exploder_ids[num] ) ) - level._client_exploder_ids[num] = 1; - - activateclientexploder( level._exploder_ids[num] ); + if ( !isDefined( level._exploder_ids[ num ] ) ) + { + return; + } + if ( !isDefined( level._client_exploders[ num ] ) ) + { + level._client_exploders[ num ] = 1; + } + if ( !isDefined( level._client_exploder_ids[ num ] ) ) + { + level._client_exploder_ids[ num ] = 1; + } + activateclientexploder( level._exploder_ids[ num ] ); } delete_exploder_on_clients( num ) { - if ( !isdefined( level._exploder_ids[num] ) ) - return; - - if ( !isdefined( level._client_exploders[num] ) ) - return; - - level._client_exploders[num] = undefined; - level._client_exploder_ids[num] = undefined; - deactivateclientexploder( level._exploder_ids[num] ); + if ( !isDefined( level._exploder_ids[ num ] ) ) + { + return; + } + if ( !isDefined( level._client_exploders[ num ] ) ) + { + return; + } + deactivateclientexploder( level._exploder_ids[ num ] ); } activate_individual_exploder() { - level notify( "exploder" + self.v["exploder"] ); - - if ( level.createfx_enabled || !level.clientscripts || !isdefined( level._exploder_ids[int( self.v["exploder"] )] ) || isdefined( self.v["exploder_server"] ) ) - { + level notify( "exploder" + self.v[ "exploder" ] ); + if ( !level.createfx_enabled && level.clientscripts || !isDefined( level._exploder_ids[ int( self.v[ "exploder" ] ) ] ) && isDefined( self.v[ "exploder_server" ] ) ) + { /# - println( "Exploder " + self.v["exploder"] + " created on server." ); + println( "Exploder " + self.v[ "exploder" ] + " created on server." ); #/ - if ( isdefined( self.v["firefx"] ) ) - self thread fire_effect(); - - if ( isdefined( self.v["fxid"] ) && self.v["fxid"] != "No FX" ) - self thread cannon_effect(); - else if ( isdefined( self.v["soundalias"] ) ) - self thread sound_effect(); - } - - if ( isdefined( self.v["trailfx"] ) ) - self thread trail_effect(); - - if ( isdefined( self.v["damage"] ) ) - self thread exploder_damage(); - - if ( self.v["exploder_type"] == "exploder" ) - self thread brush_show(); - else if ( self.v["exploder_type"] == "exploderchunk" || self.v["exploder_type"] == "exploderchunk visible" ) - self thread brush_throw(); - else - self thread brush_delete(); + if ( isDefined( self.v[ "firefx" ] ) ) + { + self thread fire_effect(); + } + if ( isDefined( self.v[ "fxid" ] ) && self.v[ "fxid" ] != "No FX" ) + { + self thread cannon_effect(); + } + else + { + if ( isDefined( self.v[ "soundalias" ] ) ) + { + self thread sound_effect(); + } + } + } + if ( isDefined( self.v[ "trailfx" ] ) ) + { + self thread trail_effect(); + } + if ( isDefined( self.v[ "damage" ] ) ) + { + self thread exploder_damage(); + } + if ( self.v[ "exploder_type" ] == "exploder" ) + { + self thread brush_show(); + } + else if ( self.v[ "exploder_type" ] == "exploderchunk" || self.v[ "exploder_type" ] == "exploderchunk visible" ) + { + self thread brush_throw(); + } + else + { + self thread brush_delete(); + } } trail_effect() { - self exploder_delay(); - - if ( !isdefined( self.v["trailfxtag"] ) ) - self.v["trailfxtag"] = "tag_origin"; - - temp_ent = undefined; - - if ( self.v["trailfxtag"] == "tag_origin" ) - playfxontag( level._effect[self.v["trailfx"]], self.model, self.v["trailfxtag"] ); - else - { - temp_ent = spawn( "script_model", self.model.origin ); - temp_ent setmodel( "tag_origin" ); - temp_ent linkto( self.model, self.v["trailfxtag"] ); - playfxontag( level._effect[self.v["trailfx"]], temp_ent, "tag_origin" ); - } - - if ( isdefined( self.v["trailfxsound"] ) ) - { - if ( !isdefined( temp_ent ) ) - self.model playloopsound( self.v["trailfxsound"] ); - else - temp_ent playloopsound( self.v["trailfxsound"] ); - } - - if ( isdefined( self.v["ender"] ) && isdefined( temp_ent ) ) - level thread trail_effect_ender( temp_ent, self.v["ender"] ); - - if ( !isdefined( self.v["trailfxtimeout"] ) ) - return; - - wait( self.v["trailfxtimeout"] ); - - if ( isdefined( temp_ent ) ) - temp_ent delete(); + self exploder_delay(); + if ( !isDefined( self.v[ "trailfxtag" ] ) ) + { + self.v[ "trailfxtag" ] = "tag_origin"; + } + temp_ent = undefined; + if ( self.v[ "trailfxtag" ] == "tag_origin" ) + { + playfxontag( level._effect[ self.v[ "trailfx" ] ], self.model, self.v[ "trailfxtag" ] ); + } + else + { + temp_ent = spawn( "script_model", self.model.origin ); + temp_ent setmodel( "tag_origin" ); + temp_ent linkto( self.model, self.v[ "trailfxtag" ] ); + playfxontag( level._effect[ self.v[ "trailfx" ] ], temp_ent, "tag_origin" ); + } + if ( isDefined( self.v[ "trailfxsound" ] ) ) + { + if ( !isDefined( temp_ent ) ) + { + self.model playloopsound( self.v[ "trailfxsound" ] ); + } + else + { + temp_ent playloopsound( self.v[ "trailfxsound" ] ); + } + } + if ( isDefined( self.v[ "ender" ] ) && isDefined( temp_ent ) ) + { + level thread trail_effect_ender( temp_ent, self.v[ "ender" ] ); + } + if ( !isDefined( self.v[ "trailfxtimeout" ] ) ) + { + return; + } + wait self.v[ "trailfxtimeout" ]; + if ( isDefined( temp_ent ) ) + { + temp_ent delete(); + } } trail_effect_ender( ent, ender ) { - ent endon( "death" ); - - self waittill( ender ); - - ent delete(); + ent endon( "death" ); + self waittill( ender ); + ent delete(); } activate_exploder( num ) { - num = int( num ); + num = int( num ); /# - if ( level.createfx_enabled ) - { - for ( i = 0; i < level.createfxent.size; i++ ) - { - ent = level.createfxent[i]; - - if ( !isdefined( ent ) ) - continue; - - if ( ent.v["type"] != "exploder" ) - continue; - - if ( !isdefined( ent.v["exploder"] ) ) - continue; - - if ( ent.v["exploder"] != num ) - continue; - - if ( isdefined( ent.v["exploder_server"] ) ) - client_send = 0; - - ent activate_individual_exploder(); - } - - return; - } + if ( level.createfx_enabled ) + { + i = 0; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + if ( !isDefined( ent ) ) + { + i++; + continue; + } + else if ( ent.v[ "type" ] != "exploder" ) + { + i++; + continue; + } + else if ( !isDefined( ent.v[ "exploder" ] ) ) + { + i++; + continue; + } + else if ( ent.v[ "exploder" ] != num ) + { + i++; + continue; + } + else + { + if ( isDefined( ent.v[ "exploder_server" ] ) ) + { + client_send = 0; + } + ent activate_individual_exploder(); + } + i++; + } + return; #/ - client_send = 1; - - if ( isdefined( level.createfxexploders[num] ) ) - { - for ( i = 0; i < level.createfxexploders[num].size; i++ ) - { - if ( client_send && isdefined( level.createfxexploders[num][i].v["exploder_server"] ) ) - client_send = 0; - - level.createfxexploders[num][i] activate_individual_exploder(); - } - } - - if ( level.clientscripts ) - { - if ( !level.createfx_enabled && client_send == 1 ) - activate_exploder_on_clients( num ); - } + } + client_send = 1; + while ( isDefined( level.createfxexploders[ num ] ) ) + { + i = 0; + while ( i < level.createfxexploders[ num ].size ) + { + if ( client_send && isDefined( level.createfxexploders[ num ][ i ].v[ "exploder_server" ] ) ) + { + client_send = 0; + } + level.createfxexploders[ num ][ i ] activate_individual_exploder(); + i++; + } + } + if ( level.clientscripts ) + { + if ( !level.createfx_enabled && client_send == 1 ) + { + activate_exploder_on_clients( num ); + } + } } stop_exploder( num ) { - num = int( num ); - - if ( level.clientscripts ) - { - if ( !level.createfx_enabled ) - delete_exploder_on_clients( num ); - } - - if ( isdefined( level.createfxexploders[num] ) ) - { - for ( i = 0; i < level.createfxexploders[num].size; i++ ) - { - if ( !isdefined( level.createfxexploders[num][i].looper ) ) - continue; - - level.createfxexploders[num][i].looper delete(); - } - } + num = int( num ); + if ( level.clientscripts ) + { + if ( !level.createfx_enabled ) + { + delete_exploder_on_clients( num ); + } + } + while ( isDefined( level.createfxexploders[ num ] ) ) + { + i = 0; + while ( i < level.createfxexploders[ num ].size ) + { + if ( !isDefined( level.createfxexploders[ num ][ i ].looper ) ) + { + i++; + continue; + } + else + { + level.createfxexploders[ num ][ i ].looper delete(); + } + i++; + } + } } sound_effect() { - self effect_soundalias(); + self effect_soundalias(); } effect_soundalias() { - if ( !isdefined( self.v["delay"] ) ) - self.v["delay"] = 0; - - origin = self.v["origin"]; - alias = self.v["soundalias"]; - wait( self.v["delay"] ); - play_sound_in_space( alias, origin ); + if ( !isDefined( self.v[ "delay" ] ) ) + { + self.v[ "delay" ] = 0; + } + origin = self.v[ "origin" ]; + alias = self.v[ "soundalias" ]; + wait self.v[ "delay" ]; + play_sound_in_space( alias, origin ); } play_sound_in_space( alias, origin, master ) { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - - if ( !isdefined( origin ) ) - origin = self.origin; - - org.origin = origin; - - if ( isdefined( master ) && master ) - org playsoundasmaster( alias ); - else - org playsound( alias ); - - wait 10.0; - org delete(); + org = spawn( "script_origin", ( 0, 0, 1 ) ); + if ( !isDefined( origin ) ) + { + origin = self.origin; + } + org.origin = origin; + if ( isDefined( master ) && master ) + { + org playsoundasmaster( alias ); + } + else + { + org playsound( alias ); + } + wait 10; + org delete(); } loop_sound_in_space( alias, origin, ender ) { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - - if ( !isdefined( origin ) ) - origin = self.origin; - - org.origin = origin; - org playloopsound( alias ); - - level waittill( ender ); - - org stoploopsound(); - wait 0.1; - org delete(); + org = spawn( "script_origin", ( 0, 0, 1 ) ); + if ( !isDefined( origin ) ) + { + origin = self.origin; + } + org.origin = origin; + org playloopsound( alias ); + level waittill( ender ); + org stoploopsound(); + wait 0,1; + org delete(); } fire_effect() { - if ( !isdefined( self.v["delay"] ) ) - self.v["delay"] = 0; - - delay = self.v["delay"]; - - if ( isdefined( self.v["delay_min"] ) && isdefined( self.v["delay_max"] ) ) - delay = self.v["delay_min"] + randomfloat( self.v["delay_max"] - self.v["delay_min"] ); - - forward = self.v["forward"]; - up = self.v["up"]; - org = undefined; - firefxsound = self.v["firefxsound"]; - origin = self.v["origin"]; - firefx = self.v["firefx"]; - ender = self.v["ender"]; - - if ( !isdefined( ender ) ) - ender = "createfx_effectStopper"; - - timeout = self.v["firefxtimeout"]; - firefxdelay = 0.5; - - if ( isdefined( self.v["firefxdelay"] ) ) - firefxdelay = self.v["firefxdelay"]; - - wait( delay ); - - if ( isdefined( firefxsound ) ) - level thread loop_fx_sound( firefxsound, origin, ender, timeout ); - - playfx( level._effect[firefx], self.v["origin"], forward, up ); + if ( !isDefined( self.v[ "delay" ] ) ) + { + self.v[ "delay" ] = 0; + } + delay = self.v[ "delay" ]; + if ( isDefined( self.v[ "delay_min" ] ) && isDefined( self.v[ "delay_max" ] ) ) + { + delay = self.v[ "delay_min" ] + randomfloat( self.v[ "delay_max" ] - self.v[ "delay_min" ] ); + } + forward = self.v[ "forward" ]; + up = self.v[ "up" ]; + org = undefined; + firefxsound = self.v[ "firefxsound" ]; + origin = self.v[ "origin" ]; + firefx = self.v[ "firefx" ]; + ender = self.v[ "ender" ]; + if ( !isDefined( ender ) ) + { + ender = "createfx_effectStopper"; + } + timeout = self.v[ "firefxtimeout" ]; + firefxdelay = 0,5; + if ( isDefined( self.v[ "firefxdelay" ] ) ) + { + firefxdelay = self.v[ "firefxdelay" ]; + } + wait delay; + if ( isDefined( firefxsound ) ) + { + level thread loop_fx_sound( firefxsound, origin, ender, timeout ); + } + playfx( level._effect[ firefx ], self.v[ "origin" ], forward, up ); } loop_sound_delete( ender, ent ) { - ent endon( "death" ); - - self waittill( ender ); - - ent delete(); + ent endon( "death" ); + self waittill( ender ); + ent delete(); } createexploder( fxid ) { - ent = maps\mp\_createfx::createeffect( "exploder", fxid ); - ent.v["delay"] = 0; - ent.v["exploder"] = 1; - ent.v["exploder_type"] = "normal"; - return ent; + ent = maps/mp/_createfx::createeffect( "exploder", fxid ); + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 1; + ent.v[ "exploder_type" ] = "normal"; + return ent; } getotherteam( team ) { - if ( team == "allies" ) - return "axis"; - else if ( team == "axis" ) - return "allies"; - else - return "allies"; + if ( team == "allies" ) + { + return "axis"; + } + else + { + if ( team == "axis" ) + { + return "allies"; + } + else + { + return "allies"; + } + } /# - assertmsg( "getOtherTeam: invalid team " + team ); + assertmsg( "getOtherTeam: invalid team " + team ); #/ } getteammask( team ) { - if ( !level.teambased || !isdefined( team ) || !isdefined( level.spawnsystem.ispawn_teammask[team] ) ) - return level.spawnsystem.ispawn_teammask_free; - - return level.spawnsystem.ispawn_teammask[team]; + if ( level.teambased || !isDefined( team ) && !isDefined( level.spawnsystem.ispawn_teammask[ team ] ) ) + { + return level.spawnsystem.ispawn_teammask_free; + } + return level.spawnsystem.ispawn_teammask[ team ]; } getotherteamsmask( skip_team ) { - mask = 0; - - foreach ( team in level.teams ) - { - if ( team == skip_team ) - continue; - - mask |= getteammask( team ); - } - - return mask; + mask = 0; + _a1408 = level.teams; + _k1408 = getFirstArrayKey( _a1408 ); + while ( isDefined( _k1408 ) ) + { + team = _a1408[ _k1408 ]; + if ( team == skip_team ) + { + } + else + { + mask |= getteammask( team ); + } + _k1408 = getNextArrayKey( _a1408, _k1408 ); + } + return mask; } wait_endon( waittime, endonstring, endonstring2, endonstring3, endonstring4 ) { - self endon( endonstring ); - - if ( isdefined( endonstring2 ) ) - self endon( endonstring2 ); - - if ( isdefined( endonstring3 ) ) - self endon( endonstring3 ); - - if ( isdefined( endonstring4 ) ) - self endon( endonstring4 ); - - wait( waittime ); - return 1; + self endon( endonstring ); + if ( isDefined( endonstring2 ) ) + { + self endon( endonstring2 ); + } + if ( isDefined( endonstring3 ) ) + { + self endon( endonstring3 ); + } + if ( isDefined( endonstring4 ) ) + { + self endon( endonstring4 ); + } + wait waittime; + return 1; } ismg( weapon ) { - return issubstr( weapon, "_bipod_" ); + return issubstr( weapon, "_bipod_" ); } plot_points( plotpoints, r, g, b, timer ) { /# - lastpoint = plotpoints[0]; - - if ( !isdefined( r ) ) - r = 1; - - if ( !isdefined( g ) ) - g = 1; - - if ( !isdefined( b ) ) - b = 1; - - if ( !isdefined( timer ) ) - timer = 0.05; - - for ( i = 1; i < plotpoints.size; i++ ) - { - line( lastpoint, plotpoints[i], ( r, g, b ), 1, timer ); - lastpoint = plotpoints[i]; - } + lastpoint = plotpoints[ 0 ]; + if ( !isDefined( r ) ) + { + r = 1; + } + if ( !isDefined( g ) ) + { + g = 1; + } + if ( !isDefined( b ) ) + { + b = 1; + } + if ( !isDefined( timer ) ) + { + timer = 0,05; + } + i = 1; + while ( i < plotpoints.size ) + { + line( lastpoint, plotpoints[ i ], ( r, g, b ), 1, timer ); + lastpoint = plotpoints[ i ]; + i++; #/ + } } player_flag_wait( msg ) { - while ( !self.flag[msg] ) - self waittill( msg ); + while ( !self.flag[ msg ] ) + { + self waittill( msg ); + } } player_flag_wait_either( flag1, flag2 ) { - for (;;) - { - if ( flag( flag1 ) ) - return; - - if ( flag( flag2 ) ) - return; - - self waittill_either( flag1, flag2 ); - } + for ( ;; ) + { + if ( flag( flag1 ) ) + { + return; + } + if ( flag( flag2 ) ) + { + return; + } + self waittill_either( flag1, flag2 ); + } } player_flag_waitopen( msg ) { - while ( self.flag[msg] ) - self waittill( msg ); + while ( self.flag[ msg ] ) + { + self waittill( msg ); + } } player_flag_init( message, trigger ) { - if ( !isdefined( self.flag ) ) - { - self.flag = []; - self.flags_lock = []; - } + if ( !isDefined( self.flag ) ) + { + self.flag = []; + self.flags_lock = []; + } /# - assert( !isdefined( self.flag[message] ), "Attempt to reinitialize existing message: " + message ); + assert( !isDefined( self.flag[ message ] ), "Attempt to reinitialize existing message: " + message ); #/ - self.flag[message] = 0; + self.flag[ message ] = 0; /# - self.flags_lock[message] = 0; + self.flags_lock[ message ] = 0; #/ } player_flag_set_delayed( message, delay ) { - wait( delay ); - player_flag_set( message ); + wait delay; + player_flag_set( message ); } player_flag_set( message ) { /# - assert( isdefined( self.flag[message] ), "Attempt to set a flag before calling flag_init: " + message ); - assert( self.flag[message] == self.flags_lock[message] ); - self.flags_lock[message] = 1; + assert( isDefined( self.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message ); + assert( self.flag[ message ] == self.flags_lock[ message ] ); + self.flags_lock[ message ] = 1; #/ - self.flag[message] = 1; - self notify( message ); + self.flag[ message ] = 1; + self notify( message ); } player_flag_clear( message ) { /# - assert( isdefined( self.flag[message] ), "Attempt to set a flag before calling flag_init: " + message ); - assert( self.flag[message] == self.flags_lock[message] ); - self.flags_lock[message] = 0; + assert( isDefined( self.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message ); + assert( self.flag[ message ] == self.flags_lock[ message ] ); + self.flags_lock[ message ] = 0; #/ - self.flag[message] = 0; - self notify( message ); + self.flag[ message ] = 0; + self notify( message ); } player_flag( message ) { /# - assert( isdefined( message ), "Tried to check flag but the flag was not defined." ); + assert( isDefined( message ), "Tried to check flag but the flag was not defined." ); #/ - if ( !self.flag[message] ) - return false; - - return true; + if ( !self.flag[ message ] ) + { + return 0; + } + return 1; } registerclientsys( ssysname ) { - if ( !isdefined( level._clientsys ) ) - level._clientsys = []; - - if ( level._clientsys.size >= 32 ) - { + if ( !isDefined( level._clientsys ) ) + { + level._clientsys = []; + } + if ( level._clientsys.size >= 32 ) + { /# - error( "Max num client systems exceeded." ); + error( "Max num client systems exceeded." ); #/ - return; - } - - if ( isdefined( level._clientsys[ssysname] ) ) - { + return; + } + if ( isDefined( level._clientsys[ ssysname ] ) ) + { /# - error( "Attempt to re-register client system : " + ssysname ); + error( "Attempt to re-register client system : " + ssysname ); #/ - return; - } - else - { - level._clientsys[ssysname] = spawnstruct(); - level._clientsys[ssysname].sysid = clientsysregister( ssysname ); - } + return; + } + else + { + level._clientsys[ ssysname ] = spawnstruct(); + level._clientsys[ ssysname ].sysid = clientsysregister( ssysname ); + } } setclientsysstate( ssysname, ssysstate, player ) { - if ( !isdefined( level._clientsys ) ) - { + if ( !isDefined( level._clientsys ) ) + { /# - error( "setClientSysState called before registration of any systems." ); + error( "setClientSysState called before registration of any systems." ); #/ - return; - } - - if ( !isdefined( level._clientsys[ssysname] ) ) - { + return; + } + if ( !isDefined( level._clientsys[ ssysname ] ) ) + { /# - error( "setClientSysState called on unregistered system " + ssysname ); + error( "setClientSysState called on unregistered system " + ssysname ); #/ - return; - } - - if ( isdefined( player ) ) - player clientsyssetstate( level._clientsys[ssysname].sysid, ssysstate ); - else - { - clientsyssetstate( level._clientsys[ssysname].sysid, ssysstate ); - level._clientsys[ssysname].sysstate = ssysstate; - } + return; + } + if ( isDefined( player ) ) + { + player clientsyssetstate( level._clientsys[ ssysname ].sysid, ssysstate ); + } + else + { + clientsyssetstate( level._clientsys[ ssysname ].sysid, ssysstate ); + level._clientsys[ ssysname ].sysstate = ssysstate; + } } getclientsysstate( ssysname ) { - if ( !isdefined( level._clientsys ) ) - { + if ( !isDefined( level._clientsys ) ) + { /# - error( "Cannot getClientSysState before registering any client systems." ); + error( "Cannot getClientSysState before registering any client systems." ); #/ - return ""; - } - - if ( !isdefined( level._clientsys[ssysname] ) ) - { + return ""; + } + if ( !isDefined( level._clientsys[ ssysname ] ) ) + { /# - error( "Client system " + ssysname + " cannot return state, as it is unregistered." ); + error( "Client system " + ssysname + " cannot return state, as it is unregistered." ); #/ - return ""; - } - - if ( isdefined( level._clientsys[ssysname].sysstate ) ) - return level._clientsys[ssysname].sysstate; - - return ""; + return ""; + } + if ( isDefined( level._clientsys[ ssysname ].sysstate ) ) + { + return level._clientsys[ ssysname ].sysstate; + } + return ""; } clientnotify( event ) { - if ( level.clientscripts ) - { - if ( isplayer( self ) ) - maps\mp\_utility::setclientsysstate( "levelNotify", event, self ); - else - maps\mp\_utility::setclientsysstate( "levelNotify", event ); - } + if ( level.clientscripts ) + { + if ( isplayer( self ) ) + { + maps/mp/_utility::setclientsysstate( "levelNotify", event, self ); + return; + } + else + { + maps/mp/_utility::setclientsysstate( "levelNotify", event ); + } + } } alphabet_compare( a, b ) { - list = []; - val = 1; - list["0"] = val; - val++; - list["1"] = val; - val++; - list["2"] = val; - val++; - list["3"] = val; - val++; - list["4"] = val; - val++; - list["5"] = val; - val++; - list["6"] = val; - val++; - list["7"] = val; - val++; - list["8"] = val; - val++; - list["9"] = val; - val++; - list["_"] = val; - val++; - list["a"] = val; - val++; - list["b"] = val; - val++; - list["c"] = val; - val++; - list["d"] = val; - val++; - list["e"] = val; - val++; - list["f"] = val; - val++; - list["g"] = val; - val++; - list["h"] = val; - val++; - list["i"] = val; - val++; - list["j"] = val; - val++; - list["k"] = val; - val++; - list["l"] = val; - val++; - list["m"] = val; - val++; - list["n"] = val; - val++; - list["o"] = val; - val++; - list["p"] = val; - val++; - list["q"] = val; - val++; - list["r"] = val; - val++; - list["s"] = val; - val++; - list["t"] = val; - val++; - list["u"] = val; - val++; - list["v"] = val; - val++; - list["w"] = val; - val++; - list["x"] = val; - val++; - list["y"] = val; - val++; - list["z"] = val; - val++; - a = tolower( a ); - b = tolower( b ); - val1 = 0; - - if ( isdefined( list[a] ) ) - val1 = list[a]; - - val2 = 0; - - if ( isdefined( list[b] ) ) - val2 = list[b]; - - if ( val1 > val2 ) - return "1st"; - - if ( val1 < val2 ) - return "2nd"; - - return "same"; + list = []; + val = 1; + list[ "0" ] = val; + val++; + list[ "1" ] = val; + val++; + list[ "2" ] = val; + val++; + list[ "3" ] = val; + val++; + list[ "4" ] = val; + val++; + list[ "5" ] = val; + val++; + list[ "6" ] = val; + val++; + list[ "7" ] = val; + val++; + list[ "8" ] = val; + val++; + list[ "9" ] = val; + val++; + list[ "_" ] = val; + val++; + list[ "a" ] = val; + val++; + list[ "b" ] = val; + val++; + list[ "c" ] = val; + val++; + list[ "d" ] = val; + val++; + list[ "e" ] = val; + val++; + list[ "f" ] = val; + val++; + list[ "g" ] = val; + val++; + list[ "h" ] = val; + val++; + list[ "i" ] = val; + val++; + list[ "j" ] = val; + val++; + list[ "k" ] = val; + val++; + list[ "l" ] = val; + val++; + list[ "m" ] = val; + val++; + list[ "n" ] = val; + val++; + list[ "o" ] = val; + val++; + list[ "p" ] = val; + val++; + list[ "q" ] = val; + val++; + list[ "r" ] = val; + val++; + list[ "s" ] = val; + val++; + list[ "t" ] = val; + val++; + list[ "u" ] = val; + val++; + list[ "v" ] = val; + val++; + list[ "w" ] = val; + val++; + list[ "x" ] = val; + val++; + list[ "y" ] = val; + val++; + list[ "z" ] = val; + val++; + a = tolower( a ); + b = tolower( b ); + val1 = 0; + if ( isDefined( list[ a ] ) ) + { + val1 = list[ a ]; + } + val2 = 0; + if ( isDefined( list[ b ] ) ) + { + val2 = list[ b ]; + } + if ( val1 > val2 ) + { + return "1st"; + } + if ( val1 < val2 ) + { + return "2nd"; + } + return "same"; } is_later_in_alphabet( string1, string2 ) { - count = string1.size; - - if ( count >= string2.size ) - count = string2.size; - - for ( i = 0; i < count; i++ ) - { - val = alphabet_compare( string1[i], string2[i] ); - - if ( val == "1st" ) - return 1; - - if ( val == "2nd" ) - return 0; - } - - return string1.size > string2.size; + count = string1.size; + if ( count >= string2.size ) + { + count = string2.size; + } + i = 0; + while ( i < count ) + { + val = alphabet_compare( string1[ i ], string2[ i ] ); + if ( val == "1st" ) + { + return 1; + } + if ( val == "2nd" ) + { + return 0; + } + i++; + } + return string1.size > string2.size; } alphabetize( array ) { - if ( array.size <= 1 ) - return array; - - count = 0; - - for (;;) - { - changed = 0; - - for ( i = 0; i < array.size - 1; i++ ) - { - if ( is_later_in_alphabet( array[i], array[i + 1] ) ) - { - val = array[i]; - array[i] = array[i + 1]; - array[i + 1] = val; - changed = 1; - count++; - - if ( count >= 9 ) - { - count = 0; - wait 0.05; - } - } - } - - if ( !changed ) - return array; - } - - return array; + if ( array.size <= 1 ) + { + return array; + } + count = 0; + for ( ;; ) + { + changed = 0; + i = 0; + while ( i < ( array.size - 1 ) ) + { + if ( is_later_in_alphabet( array[ i ], array[ i + 1 ] ) ) + { + val = array[ i ]; + array[ i ] = array[ i + 1 ]; + array[ i + 1 ] = val; + changed = 1; + count++; + if ( count >= 9 ) + { + count = 0; + wait 0,05; + } + } + i++; + } + if ( !changed ) + { + return array; + } + } + return array; } get_players() { - players = getplayers(); - return players; + players = getplayers(); + return players; } getfx( fx ) { /# - assert( isdefined( level._effect[fx] ), "Fx " + fx + " is not defined in level._effect." ); + assert( isDefined( level._effect[ fx ] ), "Fx " + fx + " is not defined in level._effect." ); #/ - return level._effect[fx]; + return level._effect[ fx ]; } struct_arrayspawn() { - struct = spawnstruct(); - struct.array = []; - struct.lastindex = 0; - return struct; + struct = spawnstruct(); + struct.array = []; + struct.lastindex = 0; + return struct; } structarray_add( struct, object ) { /# - assert( !isdefined( object.struct_array_index ) ); + assert( !isDefined( object.struct_array_index ) ); #/ - struct.array[struct.lastindex] = object; - object.struct_array_index = struct.lastindex; - struct.lastindex++; + struct.array[ struct.lastindex ] = object; + object.struct_array_index = struct.lastindex; + struct.lastindex++; } structarray_remove( struct, object ) { - structarray_swaptolast( struct, object ); - struct.array[struct.lastindex - 1] = undefined; - struct.lastindex--; + structarray_swaptolast( struct, object ); + struct.lastindex--; + } structarray_swaptolast( struct, object ) { - struct structarray_swap( struct.array[struct.lastindex - 1], object ); + struct structarray_swap( struct.array[ struct.lastindex - 1 ], object ); } structarray_shuffle( struct, shuffle ) { - for ( i = 0; i < shuffle; i++ ) - struct structarray_swap( struct.array[i], struct.array[randomint( struct.lastindex )] ); + i = 0; + while ( i < shuffle ) + { + struct structarray_swap( struct.array[ i ], struct.array[ randomint( struct.lastindex ) ] ); + i++; + } } structarray_swap( object1, object2 ) { - index1 = object1.struct_array_index; - index2 = object2.struct_array_index; - self.array[index2] = object1; - self.array[index1] = object2; - self.array[index1].struct_array_index = index1; - self.array[index2].struct_array_index = index2; + index1 = object1.struct_array_index; + index2 = object2.struct_array_index; + self.array[ index2 ] = object1; + self.array[ index1 ] = object2; + self.array[ index1 ].struct_array_index = index1; + self.array[ index2 ].struct_array_index = index2; } waittill_either( msg1, msg2 ) { - self endon( msg1 ); - - self waittill( msg2 ); + self endon( msg1 ); + self waittill( msg2 ); } combinearrays( array1, array2 ) { /# - assert( isdefined( array1 ) || isdefined( array2 ) ); + if ( !isDefined( array1 ) ) + { + assert( isDefined( array2 ) ); + } #/ - if ( !isdefined( array1 ) && isdefined( array2 ) ) - return array2; - - if ( !isdefined( array2 ) && isdefined( array1 ) ) - return array1; - - foreach ( elem in array2 ) - array1[array1.size] = elem; - - return array1; + if ( !isDefined( array1 ) && isDefined( array2 ) ) + { + return array2; + } + if ( !isDefined( array2 ) && isDefined( array1 ) ) + { + return array1; + } + _a1822 = array2; + _k1822 = getFirstArrayKey( _a1822 ); + while ( isDefined( _k1822 ) ) + { + elem = _a1822[ _k1822 ]; + array1[ array1.size ] = elem; + _k1822 = getNextArrayKey( _a1822, _k1822 ); + } + return array1; } getclosest( org, array, dist ) { - return comparesizes( org, array, dist, ::closerfunc ); + return comparesizes( org, array, dist, ::closerfunc ); } getclosestfx( org, fxarray, dist ) { - return comparesizesfx( org, fxarray, dist, ::closerfunc ); + return comparesizesfx( org, fxarray, dist, ::closerfunc ); } getfarthest( org, array, dist ) { - return comparesizes( org, array, dist, ::fartherfunc ); + return comparesizes( org, array, dist, ::fartherfunc ); } comparesizesfx( org, array, dist, comparefunc ) { - if ( !array.size ) - return undefined; - - if ( isdefined( dist ) ) - { - distsqr = dist * dist; - struct = undefined; - keys = getarraykeys( array ); - - for ( i = 0; i < keys.size; i++ ) - { - newdistsqr = distancesquared( array[keys[i]].v["origin"], org ); - - if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) - continue; - - distsqr = newdistsqr; - struct = array[keys[i]]; - } - - return struct; - } - - keys = getarraykeys( array ); - struct = array[keys[0]]; - distsqr = distancesquared( struct.v["origin"], org ); - - for ( i = 1; i < keys.size; i++ ) - { - newdistsqr = distancesquared( array[keys[i]].v["origin"], org ); - - if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) - continue; - - distsqr = newdistsqr; - struct = array[keys[i]]; - } - - return struct; + if ( !array.size ) + { + return undefined; + } + if ( isDefined( dist ) ) + { + distsqr = dist * dist; + struct = undefined; + keys = getarraykeys( array ); + i = 0; + while ( i < keys.size ) + { + newdistsqr = distancesquared( array[ keys[ i ] ].v[ "origin" ], org ); + if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) + { + i++; + continue; + } + else + { + distsqr = newdistsqr; + struct = array[ keys[ i ] ]; + } + i++; + } + return struct; + } + keys = getarraykeys( array ); + struct = array[ keys[ 0 ] ]; + distsqr = distancesquared( struct.v[ "origin" ], org ); + i = 1; + while ( i < keys.size ) + { + newdistsqr = distancesquared( array[ keys[ i ] ].v[ "origin" ], org ); + if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) + { + i++; + continue; + } + else + { + distsqr = newdistsqr; + struct = array[ keys[ i ] ]; + } + i++; + } + return struct; } comparesizes( org, array, dist, comparefunc ) { - if ( !array.size ) - return undefined; - - if ( isdefined( dist ) ) - { - distsqr = dist * dist; - ent = undefined; - keys = getarraykeys( array ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( !isdefined( array[keys[i]] ) ) - continue; - - newdistsqr = distancesquared( array[keys[i]].origin, org ); - - if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) - continue; - - distsqr = newdistsqr; - ent = array[keys[i]]; - } - - return ent; - } - - keys = getarraykeys( array ); - ent = array[keys[0]]; - distsqr = distancesquared( ent.origin, org ); - - for ( i = 1; i < keys.size; i++ ) - { - if ( !isdefined( array[keys[i]] ) ) - continue; - - newdistsqr = distancesquared( array[keys[i]].origin, org ); - - if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) - continue; - - distsqr = newdistsqr; - ent = array[keys[i]]; - } - - return ent; + if ( !array.size ) + { + return undefined; + } + if ( isDefined( dist ) ) + { + distsqr = dist * dist; + ent = undefined; + keys = getarraykeys( array ); + i = 0; + while ( i < keys.size ) + { + if ( !isDefined( array[ keys[ i ] ] ) ) + { + i++; + continue; + } + else newdistsqr = distancesquared( array[ keys[ i ] ].origin, org ); + if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) + { + i++; + continue; + } + else + { + distsqr = newdistsqr; + ent = array[ keys[ i ] ]; + } + i++; + } + return ent; + } + keys = getarraykeys( array ); + ent = array[ keys[ 0 ] ]; + distsqr = distancesquared( ent.origin, org ); + i = 1; + while ( i < keys.size ) + { + if ( !isDefined( array[ keys[ i ] ] ) ) + { + i++; + continue; + } + else newdistsqr = distancesquared( array[ keys[ i ] ].origin, org ); + if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) + { + i++; + continue; + } + else + { + distsqr = newdistsqr; + ent = array[ keys[ i ] ]; + } + i++; + } + return ent; } closerfunc( dist1, dist2 ) { - return dist1 >= dist2; + return dist1 >= dist2; } fartherfunc( dist1, dist2 ) { - return dist1 <= dist2; + return dist1 <= dist2; } get_array_of_closest( org, array, excluders, max, maxdist ) { - if ( !isdefined( max ) ) - max = array.size; - - if ( !isdefined( excluders ) ) - excluders = []; - - maxdists2rd = undefined; - - if ( isdefined( maxdist ) ) - maxdists2rd = maxdist * maxdist; - - dist = []; - index = []; - - for ( i = 0; i < array.size; i++ ) - { - if ( !isdefined( array[i] ) ) - continue; - - excluded = 0; - - for ( p = 0; p < excluders.size; p++ ) - { - if ( array[i] != excluders[p] ) - continue; - - excluded = 1; - break; - } - - if ( excluded ) - continue; - - length = distancesquared( org, array[i].origin ); - - if ( isdefined( maxdists2rd ) && maxdists2rd < length ) - continue; - - dist[dist.size] = length; - index[index.size] = i; - } - - for (;;) - { - change = 0; - - for ( i = 0; i < dist.size - 1; i++ ) - { - if ( dist[i] <= dist[i + 1] ) - continue; - - change = 1; - temp = dist[i]; - dist[i] = dist[i + 1]; - dist[i + 1] = temp; - temp = index[i]; - index[i] = index[i + 1]; - index[i + 1] = temp; - } - - if ( !change ) - break; - } - - newarray = []; - - if ( max > dist.size ) - max = dist.size; - - for ( i = 0; i < max; i++ ) - newarray[i] = array[index[i]]; - - return newarray; + if ( !isDefined( max ) ) + { + max = array.size; + } + if ( !isDefined( excluders ) ) + { + excluders = []; + } + maxdists2rd = undefined; + if ( isDefined( maxdist ) ) + { + maxdists2rd = maxdist * maxdist; + } + dist = []; + index = []; + i = 0; + while ( i < array.size ) + { + if ( !isDefined( array[ i ] ) ) + { + i++; + continue; + } + else excluded = 0; + p = 0; + while ( p < excluders.size ) + { + if ( array[ i ] != excluders[ p ] ) + { + p++; + continue; + } + else + { + excluded = 1; + break; + } + p++; + } + if ( excluded ) + { + i++; + continue; + } + else length = distancesquared( org, array[ i ].origin ); + if ( isDefined( maxdists2rd ) && maxdists2rd < length ) + { + i++; + continue; + } + else + { + dist[ dist.size ] = length; + index[ index.size ] = i; + } + i++; + } + for ( ;; ) + { + change = 0; + i = 0; + while ( i < ( dist.size - 1 ) ) + { + if ( dist[ i ] <= dist[ i + 1 ] ) + { + i++; + continue; + } + else + { + change = 1; + temp = dist[ i ]; + dist[ i ] = dist[ i + 1 ]; + dist[ i + 1 ] = temp; + temp = index[ i ]; + index[ i ] = index[ i + 1 ]; + index[ i + 1 ] = temp; + } + i++; + } + if ( !change ) + { + break; + } + else + { + } + } + newarray = []; + if ( max > dist.size ) + { + max = dist.size; + } + i = 0; + while ( i < max ) + { + newarray[ i ] = array[ index[ i ] ]; + i++; + } + return newarray; } set_dvar_if_unset( dvar, value, reset ) { - if ( !isdefined( reset ) ) - reset = 0; - - if ( reset || getdvar( dvar ) == "" ) - { - setdvar( dvar, value ); - return value; - } - - return getdvar( dvar ); + if ( !isDefined( reset ) ) + { + reset = 0; + } + if ( reset || getDvar( dvar ) == "" ) + { + setdvar( dvar, value ); + return value; + } + return getDvar( dvar ); } set_dvar_float_if_unset( dvar, value, reset ) { - if ( !isdefined( reset ) ) - reset = 0; - - if ( reset || getdvar( dvar ) == "" ) - setdvar( dvar, value ); - - return getdvarfloat( dvar ); + if ( !isDefined( reset ) ) + { + reset = 0; + } + if ( reset || getDvar( dvar ) == "" ) + { + setdvar( dvar, value ); + } + return getDvarFloat( dvar ); } set_dvar_int_if_unset( dvar, value, reset ) { - if ( !isdefined( reset ) ) - reset = 0; - - if ( reset || getdvar( dvar ) == "" ) - { - setdvar( dvar, value ); - return int( value ); - } - - return getdvarint( dvar ); + if ( !isDefined( reset ) ) + { + reset = 0; + } + if ( reset || getDvar( dvar ) == "" ) + { + setdvar( dvar, value ); + return int( value ); + } + return getDvarInt( dvar ); } drawcylinder( pos, rad, height, duration, stop_notify ) { /# - if ( !isdefined( duration ) ) - duration = 0; - - level thread drawcylinder_think( pos, rad, height, duration, stop_notify ); + if ( !isDefined( duration ) ) + { + duration = 0; + } + level thread drawcylinder_think( pos, rad, height, duration, stop_notify ); #/ } drawcylinder_think( pos, rad, height, seconds, stop_notify ) { /# - if ( isdefined( stop_notify ) ) - level endon( stop_notify ); - - stop_time = gettime() + seconds * 1000; - currad = rad; - curheight = height; - - for (;;) - { - if ( seconds > 0 && stop_time <= gettime() ) - return; - - for ( r = 0; r < 20; r++ ) - { - theta = r / 20 * 360; - theta2 = ( r + 1 ) / 20 * 360; - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); - } - - wait 0.05; - } + if ( isDefined( stop_notify ) ) + { + level endon( stop_notify ); + } + stop_time = getTime() + ( seconds * 1000 ); + currad = rad; + curheight = height; + for ( ;; ) + { + if ( seconds > 0 && stop_time <= getTime() ) + { + return; + } + r = 0; + while ( r < 20 ) + { + theta = ( r / 20 ) * 360; + theta2 = ( ( r + 1 ) / 20 ) * 360; + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); + r++; + } + wait 0,05; #/ + } } is_bot() { - return isplayer( self ) && isdefined( self.pers["isBot"] ) && self.pers["isBot"] != 0; + if ( isplayer( self ) && isDefined( self.pers[ "isBot" ] ) ) + { + return self.pers[ "isBot" ] != 0; + } } add_trigger_to_ent( ent ) { - if ( !isdefined( ent._triggers ) ) - ent._triggers = []; - - ent._triggers[self getentitynumber()] = 1; + if ( !isDefined( ent._triggers ) ) + { + ent._triggers = []; + } + ent._triggers[ self getentitynumber() ] = 1; } remove_trigger_from_ent( ent ) { - if ( !isdefined( ent ) ) - return; - - if ( !isdefined( ent._triggers ) ) - return; - - if ( !isdefined( ent._triggers[self getentitynumber()] ) ) - return; - - ent._triggers[self getentitynumber()] = 0; + if ( !isDefined( ent ) ) + { + return; + } + if ( !isDefined( ent._triggers ) ) + { + return; + } + if ( !isDefined( ent._triggers[ self getentitynumber() ] ) ) + { + return; + } + ent._triggers[ self getentitynumber() ] = 0; } ent_already_in_trigger( trig ) { - if ( !isdefined( self._triggers ) ) - return false; - - if ( !isdefined( self._triggers[trig getentitynumber()] ) ) - return false; - - if ( !self._triggers[trig getentitynumber()] ) - return false; - - return true; + if ( !isDefined( self._triggers ) ) + { + return 0; + } + if ( !isDefined( self._triggers[ trig getentitynumber() ] ) ) + { + return 0; + } + if ( !self._triggers[ trig getentitynumber() ] ) + { + return 0; + } + return 1; } trigger_thread_death_monitor( ent, ender ) { - ent waittill( "death" ); - - self endon( ender ); - self remove_trigger_from_ent( ent ); + ent waittill( "death" ); + self endon( ender ); + self remove_trigger_from_ent( ent ); } trigger_thread( ent, on_enter_payload, on_exit_payload ) { - ent endon( "entityshutdown" ); - ent endon( "death" ); - - if ( ent ent_already_in_trigger( self ) ) - return; - - self add_trigger_to_ent( ent ); - ender = "end_trig_death_monitor" + self getentitynumber() + " " + ent getentitynumber(); - self thread trigger_thread_death_monitor( ent, ender ); - endon_condition = "leave_trigger_" + self getentitynumber(); - - if ( isdefined( on_enter_payload ) ) - self thread [[ on_enter_payload ]]( ent, endon_condition ); - - while ( isdefined( ent ) && ent istouching( self ) ) - wait 0.01; - - ent notify( endon_condition ); - - if ( isdefined( ent ) && isdefined( on_exit_payload ) ) - self thread [[ on_exit_payload ]]( ent ); - - if ( isdefined( ent ) ) - self remove_trigger_from_ent( ent ); - - self notify( ender ); + ent endon( "entityshutdown" ); + ent endon( "death" ); + if ( ent ent_already_in_trigger( self ) ) + { + return; + } + self add_trigger_to_ent( ent ); + ender = "end_trig_death_monitor" + self getentitynumber() + " " + ent getentitynumber(); + self thread trigger_thread_death_monitor( ent, ender ); + endon_condition = "leave_trigger_" + self getentitynumber(); + if ( isDefined( on_enter_payload ) ) + { + self thread [[ on_enter_payload ]]( ent, endon_condition ); + } + while ( isDefined( ent ) && ent istouching( self ) ) + { + wait 0,01; + } + ent notify( endon_condition ); + if ( isDefined( ent ) && isDefined( on_exit_payload ) ) + { + self thread [[ on_exit_payload ]]( ent ); + } + if ( isDefined( ent ) ) + { + self remove_trigger_from_ent( ent ); + } + self notify( ender ); } isoneround() { - if ( level.roundlimit == 1 ) - return true; - - return false; + if ( level.roundlimit == 1 ) + { + return 1; + } + return 0; } isfirstround() { - if ( level.roundlimit > 1 && game["roundsplayed"] == 0 ) - return true; - - return false; + if ( level.roundlimit > 1 && game[ "roundsplayed" ] == 0 ) + { + return 1; + } + return 0; } islastround() { - if ( level.roundlimit > 1 && game["roundsplayed"] >= level.roundlimit - 1 ) - return true; - - return false; + if ( level.roundlimit > 1 && game[ "roundsplayed" ] >= ( level.roundlimit - 1 ) ) + { + return 1; + } + return 0; } waslastround() { - if ( level.forcedend ) - return true; - - if ( isdefined( level.shouldplayovertimeround ) ) - { - if ( [[ level.shouldplayovertimeround ]]() ) - { - level.nextroundisovertime = 1; - return false; - } - else if ( isdefined( game["overtime_round"] ) ) - return true; - } - - if ( hitroundlimit() || hitscorelimit() || hitroundwinlimit() ) - return true; - - return false; + if ( level.forcedend ) + { + return 1; + } + if ( isDefined( level.shouldplayovertimeround ) ) + { + if ( [[ level.shouldplayovertimeround ]]() ) + { + level.nextroundisovertime = 1; + return 0; + } + else + { + if ( isDefined( game[ "overtime_round" ] ) ) + { + return 1; + } + } + } + if ( !hitroundlimit() || hitscorelimit() && hitroundwinlimit() ) + { + return 1; + } + return 0; } hitroundlimit() { - if ( level.roundlimit <= 0 ) - return 0; - - return getroundsplayed() >= level.roundlimit; + if ( level.roundlimit <= 0 ) + { + return 0; + } + return getroundsplayed() >= level.roundlimit; } anyteamhitroundwinlimit() { - foreach ( team in level.teams ) - { - if ( getroundswon( team ) >= level.roundwinlimit ) - return true; - } - - return false; + _a2296 = level.teams; + _k2296 = getFirstArrayKey( _a2296 ); + while ( isDefined( _k2296 ) ) + { + team = _a2296[ _k2296 ]; + if ( getroundswon( team ) >= level.roundwinlimit ) + { + return 1; + } + _k2296 = getNextArrayKey( _a2296, _k2296 ); + } + return 0; } anyteamhitroundlimitwithdraws() { - tie_wins = game["roundswon"]["tie"]; - - foreach ( team in level.teams ) - { - if ( getroundswon( team ) + tie_wins >= level.roundwinlimit ) - return true; - } - - return false; + tie_wins = game[ "roundswon" ][ "tie" ]; + _a2309 = level.teams; + _k2309 = getFirstArrayKey( _a2309 ); + while ( isDefined( _k2309 ) ) + { + team = _a2309[ _k2309 ]; + if ( ( getroundswon( team ) + tie_wins ) >= level.roundwinlimit ) + { + return 1; + } + _k2309 = getNextArrayKey( _a2309, _k2309 ); + } + return 0; } getroundwinlimitwinningteam() { - max_wins = 0; - winning_team = undefined; - - foreach ( team in level.teams ) - { - wins = getroundswon( team ); - - if ( !isdefined( winning_team ) ) - { - max_wins = wins; - winning_team = team; - continue; - } - - if ( wins == max_wins ) - { - winning_team = "tie"; - continue; - } - - if ( wins > max_wins ) - { - max_wins = wins; - winning_team = team; - } - } - - return winning_team; + max_wins = 0; + winning_team = undefined; + _a2323 = level.teams; + _k2323 = getFirstArrayKey( _a2323 ); + while ( isDefined( _k2323 ) ) + { + team = _a2323[ _k2323 ]; + wins = getroundswon( team ); + if ( !isDefined( winning_team ) ) + { + max_wins = wins; + winning_team = team; + } + else if ( wins == max_wins ) + { + winning_team = "tie"; + } + else + { + if ( wins > max_wins ) + { + max_wins = wins; + winning_team = team; + } + } + _k2323 = getNextArrayKey( _a2323, _k2323 ); + } + return winning_team; } hitroundwinlimit() { - if ( !isdefined( level.roundwinlimit ) || level.roundwinlimit <= 0 ) - return false; - - if ( anyteamhitroundwinlimit() ) - return true; - - if ( anyteamhitroundlimitwithdraws() ) - { - if ( getroundwinlimitwinningteam() != "tie" ) - return true; - } - - return false; + if ( !isDefined( level.roundwinlimit ) || level.roundwinlimit <= 0 ) + { + return 0; + } + if ( anyteamhitroundwinlimit() ) + { + return 1; + } + if ( anyteamhitroundlimitwithdraws() ) + { + if ( getroundwinlimitwinningteam() != "tie" ) + { + return 1; + } + } + return 0; } anyteamhitscorelimit() { - foreach ( team in level.teams ) - { - if ( game["teamScores"][team] >= level.scorelimit ) - return true; - } - - return false; + _a2379 = level.teams; + _k2379 = getFirstArrayKey( _a2379 ); + while ( isDefined( _k2379 ) ) + { + team = _a2379[ _k2379 ]; + if ( game[ "teamScores" ][ team ] >= level.scorelimit ) + { + return 1; + } + _k2379 = getNextArrayKey( _a2379, _k2379 ); + } + return 0; } hitscorelimit() { - if ( isscoreroundbased() ) - return false; - - if ( level.scorelimit <= 0 ) - return false; - - if ( level.teambased ) - { - if ( anyteamhitscorelimit() ) - return true; - } - else - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pointstowin ) && player.pointstowin >= level.scorelimit ) - return true; - } - } - - return false; + if ( isscoreroundbased() ) + { + return 0; + } + if ( level.scorelimit <= 0 ) + { + return 0; + } + if ( level.teambased ) + { + if ( anyteamhitscorelimit() ) + { + return 1; + } + } + else + { + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( isDefined( player.pointstowin ) && player.pointstowin >= level.scorelimit ) + { + return 1; + } + i++; + } + } + return 0; } getroundswon( team ) { - return game["roundswon"][team]; + return game[ "roundswon" ][ team ]; } getotherteamsroundswon( skip_team ) { - roundswon = 0; - - foreach ( team in level.teams ) - { - if ( team == skip_team ) - continue; - - roundswon += game["roundswon"][team]; - } - - return roundswon; + roundswon = 0; + _a2423 = level.teams; + _k2423 = getFirstArrayKey( _a2423 ); + while ( isDefined( _k2423 ) ) + { + team = _a2423[ _k2423 ]; + if ( team == skip_team ) + { + } + else + { + roundswon += game[ "roundswon" ][ team ]; + } + _k2423 = getNextArrayKey( _a2423, _k2423 ); + } + return roundswon; } getroundsplayed() { - return game["roundsplayed"]; + return game[ "roundsplayed" ]; } isscoreroundbased() { - return level.scoreroundbased; + return level.scoreroundbased; } isroundbased() { - if ( level.roundlimit != 1 && level.roundwinlimit != 1 ) - return true; - - return false; + if ( level.roundlimit != 1 && level.roundwinlimit != 1 ) + { + return 1; + } + return 0; } waittillnotmoving() { - if ( self ishacked() ) - { - wait 0.05; - return; - } - - if ( self.classname == "grenade" ) - self waittill( "stationary" ); - else - { - for ( prevorigin = self.origin; 1; prevorigin = self.origin ) - { - wait 0.15; - - if ( self.origin == prevorigin ) - break; - } - } + if ( self ishacked() ) + { + wait 0,05; + return; + } + if ( self.classname == "grenade" ) + { + self waittill( "stationary" ); + } + else prevorigin = self.origin; + while ( 1 ) + { + wait 0,15; + if ( self.origin == prevorigin ) + { + return; + } + else + { + prevorigin = self.origin; + } + } } mayapplyscreeneffect() { /# - assert( isdefined( self ) ); + assert( isDefined( self ) ); #/ /# - assert( isplayer( self ) ); + assert( isplayer( self ) ); #/ - return !isdefined( self.viewlockedentity ); + return !isDefined( self.viewlockedentity ); } getdvarfloatdefault( dvarname, defaultvalue ) { - value = getdvar( dvarname ); - - if ( value != "" ) - return float( value ); - - return defaultvalue; + value = getDvar( dvarname ); + if ( value != "" ) + { + return float( value ); + } + return defaultvalue; } getdvarintdefault( dvarname, defaultvalue ) { - value = getdvar( dvarname ); - - if ( value != "" ) - return int( value ); - - return defaultvalue; + value = getDvar( dvarname ); + if ( value != "" ) + { + return int( value ); + } + return defaultvalue; } closestpointonline( point, linestart, lineend ) { - linemagsqrd = lengthsquared( lineend - linestart ); - t = ( ( point[0] - linestart[0] ) * ( lineend[0] - linestart[0] ) + ( point[1] - linestart[1] ) * ( lineend[1] - linestart[1] ) + ( point[2] - linestart[2] ) * ( lineend[2] - linestart[2] ) ) / linemagsqrd; - - if ( t < 0.0 ) - return linestart; - else if ( t > 1.0 ) - return lineend; - - start_x = linestart[0] + t * ( lineend[0] - linestart[0] ); - start_y = linestart[1] + t * ( lineend[1] - linestart[1] ); - start_z = linestart[2] + t * ( lineend[2] - linestart[2] ); - return ( start_x, start_y, start_z ); + linemagsqrd = lengthsquared( lineend - linestart ); + t = ( ( ( ( point[ 0 ] - linestart[ 0 ] ) * ( lineend[ 0 ] - linestart[ 0 ] ) ) + ( ( point[ 1 ] - linestart[ 1 ] ) * ( lineend[ 1 ] - linestart[ 1 ] ) ) ) + ( ( point[ 2 ] - linestart[ 2 ] ) * ( lineend[ 2 ] - linestart[ 2 ] ) ) ) / linemagsqrd; + if ( t < 0 ) + { + return linestart; + } + else + { + if ( t > 1 ) + { + return lineend; + } + } + start_x = linestart[ 0 ] + ( t * ( lineend[ 0 ] - linestart[ 0 ] ) ); + start_y = linestart[ 1 ] + ( t * ( lineend[ 1 ] - linestart[ 1 ] ) ); + start_z = linestart[ 2 ] + ( t * ( lineend[ 2 ] - linestart[ 2 ] ) ); + return ( start_x, start_y, start_z ); } isstrstart( string1, substr ) { - return getsubstr( string1, 0, substr.size ) == substr; + return getsubstr( string1, 0, substr.size ) == substr; } spread_array_thread( entities, process, var1, var2, var3 ) { - keys = getarraykeys( entities ); - - if ( isdefined( var3 ) ) - { - for ( i = 0; i < keys.size; i++ ) - { - entities[keys[i]] thread [[ process ]]( var1, var2, var3 ); - wait 0.1; - } - - return; - } - - if ( isdefined( var2 ) ) - { - for ( i = 0; i < keys.size; i++ ) - { - entities[keys[i]] thread [[ process ]]( var1, var2 ); - wait 0.1; - } - - return; - } - - if ( isdefined( var1 ) ) - { - for ( i = 0; i < keys.size; i++ ) - { - entities[keys[i]] thread [[ process ]]( var1 ); - wait 0.1; - } - - return; - } - - for ( i = 0; i < keys.size; i++ ) - { - entities[keys[i]] thread [[ process ]](); - wait 0.1; - } + keys = getarraykeys( entities ); + if ( isDefined( var3 ) ) + { + i = 0; + while ( i < keys.size ) + { + entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3 ); + wait 0,1; + i++; + } + return; + } + if ( isDefined( var2 ) ) + { + i = 0; + while ( i < keys.size ) + { + entities[ keys[ i ] ] thread [[ process ]]( var1, var2 ); + wait 0,1; + i++; + } + return; + } + if ( isDefined( var1 ) ) + { + i = 0; + while ( i < keys.size ) + { + entities[ keys[ i ] ] thread [[ process ]]( var1 ); + wait 0,1; + i++; + } + return; + } + i = 0; + while ( i < keys.size ) + { + entities[ keys[ i ] ] thread [[ process ]](); + wait 0,1; + i++; + } } freeze_player_controls( boolean ) { /# - assert( isdefined( boolean ), "'freeze_player_controls()' has not been passed an argument properly." ); + assert( isDefined( boolean ), "'freeze_player_controls()' has not been passed an argument properly." ); #/ - if ( boolean && isdefined( self ) ) - self freezecontrols( boolean ); - else if ( !boolean && isdefined( self ) && !level.gameended ) - self freezecontrols( boolean ); + if ( boolean && isDefined( self ) ) + { + self freezecontrols( boolean ); + } + else + { + if ( !boolean && isDefined( self ) && !level.gameended ) + { + self freezecontrols( boolean ); + } + } } gethostplayer() { - players = get_players(); - - for ( index = 0; index < players.size; index++ ) - { - if ( players[index] ishost() ) - return players[index]; - } + players = get_players(); + index = 0; + while ( index < players.size ) + { + if ( players[ index ] ishost() ) + { + return players[ index ]; + } + index++; + } } gethostplayerforbots() { - players = get_players(); - - for ( index = 0; index < players.size; index++ ) - { - if ( players[index] ishostforbots() ) - return players[index]; - } + players = get_players(); + index = 0; + while ( index < players.size ) + { + if ( players[ index ] ishostforbots() ) + { + return players[ index ]; + } + index++; + } } ispregame() { - return isdefined( level.pregame ) && level.pregame; + if ( isDefined( level.pregame ) ) + { + return level.pregame; + } } iskillstreaksenabled() { - return isdefined( level.killstreaksenabled ) && level.killstreaksenabled; + if ( isDefined( level.killstreaksenabled ) ) + { + return level.killstreaksenabled; + } } isrankenabled() { - return isdefined( level.rankenabled ) && level.rankenabled; + if ( isDefined( level.rankenabled ) ) + { + return level.rankenabled; + } } playsmokesound( position, duration, startsound, stopsound, loopsound ) { - smokesound = spawn( "script_origin", ( 0, 0, 1 ) ); - smokesound.origin = position; - smokesound playsound( startsound ); - smokesound playloopsound( loopsound ); - - if ( duration > 0.5 ) - wait( duration - 0.5 ); - - thread playsoundinspace( stopsound, position ); - smokesound stoploopsound( 0.5 ); - wait 0.5; - smokesound delete(); + smokesound = spawn( "script_origin", ( 0, 0, 1 ) ); + smokesound.origin = position; + smokesound playsound( startsound ); + smokesound playloopsound( loopsound ); + if ( duration > 0,5 ) + { + wait ( duration - 0,5 ); + } + thread playsoundinspace( stopsound, position ); + smokesound stoploopsound( 0,5 ); + wait 0,5; + smokesound delete(); } playsoundinspace( alias, origin, master ) { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - - if ( !isdefined( origin ) ) - origin = self.origin; - - org.origin = origin; - - if ( isdefined( master ) && master ) - org playsoundasmaster( alias ); - else - org playsound( alias ); - - wait 10.0; - org delete(); + org = spawn( "script_origin", ( 0, 0, 1 ) ); + if ( !isDefined( origin ) ) + { + origin = self.origin; + } + org.origin = origin; + if ( isDefined( master ) && master ) + { + org playsoundasmaster( alias ); + } + else + { + org playsound( alias ); + } + wait 10; + org delete(); } get2dyaw( start, end ) { - yaw = 0; - vector = ( end[0] - start[0], end[1] - start[1], 0 ); - return vectoangles( vector ); + yaw = 0; + vector = ( end[ 0 ] - start[ 0 ], end[ 1 ] - start[ 1 ], 0 ); + return vectoangles( vector ); } vectoangles( vector ) { - yaw = 0; - vecx = vector[0]; - vecy = vector[1]; - - if ( vecx == 0 && vecy == 0 ) - return 0; - - if ( vecy < 0.001 && vecy > -0.001 ) - vecy = 0.001; - - yaw = atan( vecx / vecy ); - - if ( vecy < 0 ) - yaw += 180; - - return 90 - yaw; + yaw = 0; + vecx = vector[ 0 ]; + vecy = vector[ 1 ]; + if ( vecx == 0 && vecy == 0 ) + { + return 0; + } + if ( vecy < 0,001 && vecy > -0,001 ) + { + vecy = 0,001; + } + yaw = atan( vecx / vecy ); + if ( vecy < 0 ) + { + yaw += 180; + } + return 90 - yaw; } deleteaftertime( time ) { /# - assert( isdefined( self ) ); + assert( isDefined( self ) ); #/ /# - assert( isdefined( time ) ); + assert( isDefined( time ) ); #/ /# - assert( time >= 0.05 ); + assert( time >= 0,05 ); #/ - self thread deleteaftertimethread( time ); + self thread deleteaftertimethread( time ); } deleteaftertimethread( time ) { - self endon( "death" ); - wait( time ); - self delete(); + self endon( "death" ); + wait time; + self delete(); } setusingremote( remotename ) { - if ( isdefined( self.carryicon ) ) - self.carryicon.alpha = 0; + if ( isDefined( self.carryicon ) ) + { + self.carryicon.alpha = 0; + } /# - assert( !self isusingremote() ); + assert( !self isusingremote() ); #/ - self.usingremote = remotename; - self disableoffhandweapons(); - self notify( "using_remote" ); + self.usingremote = remotename; + self disableoffhandweapons(); + self notify( "using_remote" ); } getremotename() { /# - assert( self isusingremote() ); + assert( self isusingremote() ); #/ - return self.usingremote; + return self.usingremote; } isusingremote() { - return isdefined( self.usingremote ); + return isDefined( self.usingremote ); } getlastweapon() { - last_weapon = undefined; - - if ( self hasweapon( self.lastnonkillstreakweapon ) ) - last_weapon = self.lastnonkillstreakweapon; - else if ( self hasweapon( self.lastdroppableweapon ) ) - last_weapon = self.lastdroppableweapon; + last_weapon = undefined; + if ( self hasweapon( self.lastnonkillstreakweapon ) ) + { + last_weapon = self.lastnonkillstreakweapon; + } + else + { + if ( self hasweapon( self.lastdroppableweapon ) ) + { + last_weapon = self.lastdroppableweapon; + } + } /# - assert( isdefined( last_weapon ) ); + assert( isDefined( last_weapon ) ); #/ - return last_weapon; + return last_weapon; } freezecontrolswrapper( frozen ) { - if ( isdefined( level.hostmigrationtimer ) ) - { - self freeze_player_controls( 1 ); - return; - } - - self freeze_player_controls( frozen ); + if ( isDefined( level.hostmigrationtimer ) ) + { + self freeze_player_controls( 1 ); + return; + } + self freeze_player_controls( frozen ); } setobjectivetext( team, text ) { - game["strings"]["objective_" + team] = text; - precachestring( text ); + game[ "strings" ][ "objective_" + team ] = text; + precachestring( text ); } setobjectivescoretext( team, text ) { - game["strings"]["objective_score_" + team] = text; - precachestring( text ); + game[ "strings" ][ "objective_score_" + team ] = text; + precachestring( text ); } setobjectivehinttext( team, text ) { - game["strings"]["objective_hint_" + team] = text; - precachestring( text ); + game[ "strings" ][ "objective_hint_" + team ] = text; + precachestring( text ); } getobjectivetext( team ) { - return game["strings"]["objective_" + team]; + return game[ "strings" ][ "objective_" + team ]; } getobjectivescoretext( team ) { - return game["strings"]["objective_score_" + team]; + return game[ "strings" ][ "objective_score_" + team ]; } getobjectivehinttext( team ) { - return game["strings"]["objective_hint_" + team]; + return game[ "strings" ][ "objective_hint_" + team ]; } registerroundswitch( minvalue, maxvalue ) { - level.roundswitch = clamp( getgametypesetting( "roundSwitch" ), minvalue, maxvalue ); - level.roundswitchmin = minvalue; - level.roundswitchmax = maxvalue; + level.roundswitch = clamp( getgametypesetting( "roundSwitch" ), minvalue, maxvalue ); + level.roundswitchmin = minvalue; + level.roundswitchmax = maxvalue; } registerroundlimit( minvalue, maxvalue ) { - level.roundlimit = clamp( getgametypesetting( "roundLimit" ), minvalue, maxvalue ); - level.roundlimitmin = minvalue; - level.roundlimitmax = maxvalue; + level.roundlimit = clamp( getgametypesetting( "roundLimit" ), minvalue, maxvalue ); + level.roundlimitmin = minvalue; + level.roundlimitmax = maxvalue; } registerroundwinlimit( minvalue, maxvalue ) { - level.roundwinlimit = clamp( getgametypesetting( "roundWinLimit" ), minvalue, maxvalue ); - level.roundwinlimitmin = minvalue; - level.roundwinlimitmax = maxvalue; + level.roundwinlimit = clamp( getgametypesetting( "roundWinLimit" ), minvalue, maxvalue ); + level.roundwinlimitmin = minvalue; + level.roundwinlimitmax = maxvalue; } registerscorelimit( minvalue, maxvalue ) { - level.scorelimit = clamp( getgametypesetting( "scoreLimit" ), minvalue, maxvalue ); - level.scorelimitmin = minvalue; - level.scorelimitmax = maxvalue; - setdvar( "ui_scorelimit", level.scorelimit ); + level.scorelimit = clamp( getgametypesetting( "scoreLimit" ), minvalue, maxvalue ); + level.scorelimitmin = minvalue; + level.scorelimitmax = maxvalue; + setdvar( "ui_scorelimit", level.scorelimit ); } registertimelimit( minvalue, maxvalue ) { - level.timelimit = clamp( getgametypesetting( "timeLimit" ), minvalue, maxvalue ); - level.timelimitmin = minvalue; - level.timelimitmax = maxvalue; - setdvar( "ui_timelimit", level.timelimit ); + level.timelimit = clamp( getgametypesetting( "timeLimit" ), minvalue, maxvalue ); + level.timelimitmin = minvalue; + level.timelimitmax = maxvalue; + setdvar( "ui_timelimit", level.timelimit ); } registernumlives( minvalue, maxvalue ) { - level.numlives = clamp( getgametypesetting( "playerNumLives" ), minvalue, maxvalue ); - level.numlivesmin = minvalue; - level.numlivesmax = maxvalue; + level.numlives = clamp( getgametypesetting( "playerNumLives" ), minvalue, maxvalue ); + level.numlivesmin = minvalue; + level.numlivesmax = maxvalue; } getplayerfromclientnum( clientnum ) { - if ( clientnum < 0 ) - return undefined; - - for ( i = 0; i < level.players.size; i++ ) - { - if ( level.players[i] getentitynumber() == clientnum ) - return level.players[i]; - } - - return undefined; + if ( clientnum < 0 ) + { + return undefined; + } + i = 0; + while ( i < level.players.size ) + { + if ( level.players[ i ] getentitynumber() == clientnum ) + { + return level.players[ i ]; + } + i++; + } + return undefined; } setclientfield( field_name, value ) { - if ( self == level ) - codesetworldclientfield( field_name, value ); - else - codesetclientfield( self, field_name, value ); + if ( self == level ) + { + codesetworldclientfield( field_name, value ); + } + else + { + codesetclientfield( self, field_name, value ); + } } setclientfieldtoplayer( field_name, value ) { - codesetplayerstateclientfield( self, field_name, value ); + codesetplayerstateclientfield( self, field_name, value ); } getclientfield( field_name ) { - if ( self == level ) - return codegetworldclientfield( field_name ); - else - return codegetclientfield( self, field_name ); + if ( self == level ) + { + return codegetworldclientfield( field_name ); + } + else + { + return codegetclientfield( self, field_name ); + } } getclientfieldtoplayer( field_name ) { - return codegetplayerstateclientfield( self, field_name ); + return codegetplayerstateclientfield( self, field_name ); } isenemyplayer( player ) { /# - assert( isdefined( player ) ); + assert( isDefined( player ) ); #/ - if ( !isplayer( player ) ) - return false; - - if ( level.teambased ) - { - if ( player.team == self.team ) - return false; - } - else if ( player == self ) - return false; - - return true; + if ( !isplayer( player ) ) + { + return 0; + } + if ( level.teambased ) + { + if ( player.team == self.team ) + { + return 0; + } + } + else + { + if ( player == self ) + { + return 0; + } + } + return 1; } getweaponclass( weapon ) { /# - assert( isdefined( weapon ) ); + assert( isDefined( weapon ) ); #/ - if ( !isdefined( weapon ) ) - return undefined; - - if ( !isdefined( level.weaponclassarray ) ) - level.weaponclassarray = []; - - if ( isdefined( level.weaponclassarray[weapon] ) ) - return level.weaponclassarray[weapon]; - - baseweaponindex = getbaseweaponitemindex( weapon ) + 1; - weaponclass = tablelookupcolumnforrow( "mp/statstable.csv", baseweaponindex, 2 ); - level.weaponclassarray[weapon] = weaponclass; - return weaponclass; + if ( !isDefined( weapon ) ) + { + return undefined; + } + if ( !isDefined( level.weaponclassarray ) ) + { + level.weaponclassarray = []; + } + if ( isDefined( level.weaponclassarray[ weapon ] ) ) + { + return level.weaponclassarray[ weapon ]; + } + baseweaponindex = getbaseweaponitemindex( weapon ) + 1; + weaponclass = tablelookupcolumnforrow( "mp/statstable.csv", baseweaponindex, 2 ); + level.weaponclassarray[ weapon ] = weaponclass; + return weaponclass; } ispressbuild() { - buildtype = getdvar( _hash_19B966D7 ); - - if ( isdefined( buildtype ) && buildtype == "press" ) - return true; - - return false; + buildtype = getDvar( #"19B966D7" ); + if ( isDefined( buildtype ) && buildtype == "press" ) + { + return 1; + } + return 0; } isflashbanged() { - return isdefined( self.flashendtime ) && gettime() < self.flashendtime; + if ( isDefined( self.flashendtime ) ) + { + return getTime() < self.flashendtime; + } } ishacked() { - return isdefined( self.hacked ) && self.hacked; + if ( isDefined( self.hacked ) ) + { + return self.hacked; + } } domaxdamage( origin, attacker, inflictor, headshot, mod ) { - if ( isdefined( self.damagedtodeath ) && self.damagedtodeath ) - return; - - if ( isdefined( self.maxhealth ) ) - damage = self.maxhealth + 1; - else - damage = self.health + 1; - - self.damagedtodeath = 1; - self dodamage( damage, origin, attacker, inflictor, headshot, mod ); + if ( isDefined( self.damagedtodeath ) && self.damagedtodeath ) + { + return; + } + if ( isDefined( self.maxhealth ) ) + { + damage = self.maxhealth + 1; + } + else + { + damage = self.health + 1; + } + self.damagedtodeath = 1; + self dodamage( damage, origin, attacker, inflictor, headshot, mod ); } diff --git a/Zombie Core/patch_zm/maps/mp/_visionset_mgr.gsc b/Zombie Core/patch_zm/maps/mp/_visionset_mgr.gsc index d19a7a1..8eddfac 100644 --- a/Zombie Core/patch_zm/maps/mp/_visionset_mgr.gsc +++ b/Zombie Core/patch_zm/maps/mp/_visionset_mgr.gsc @@ -1,451 +1,474 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; +//checked includes matches beta dump +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches beta dump { - if ( level.createfx_enabled ) - return; - - level.vsmgr_initializing = 1; - level.vsmgr_default_info_name = "none"; - level.vsmgr = []; - level thread register_type( "visionset" ); - level thread register_type( "overlay" ); - onfinalizeinitialization_callback( ::finalize_clientfields ); - level thread monitor(); - level thread onplayerconnect(); + 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 ) +vsmgr_register_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) //checked matches beta dump { - if ( level.createfx_enabled ) - return; + if ( level.createfx_enabled ) + { + return; + } + /* /# - assert( level.vsmgr_initializing, "All info registration in the visionset_mgr system must occur during the first frame while the system is initializing" ); + assert( level.vsmgr_initializing, "All info registration in the visionset_mgr system must occur during the first frame while the system is initializing" ); #/ - lower_name = tolower( name ); - validate_info( type, lower_name, priority ); - add_sorted_name_key( type, lower_name ); - add_sorted_priority_key( type, lower_name, priority ); - level.vsmgr[type].info[lower_name] = spawnstruct(); - level.vsmgr[type].info[lower_name] add_info( type, lower_name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ); - - if ( level.vsmgr[type].highest_version < version ) - level.vsmgr[type].highest_version = version; + */ + 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 ) +vsmgr_activate( type, name, player, opt_param_1, opt_param_2 ) //checked changed to match beta dump { - if ( level.vsmgr[type].info[name].state.activate_per_player ) - { - activate_per_player( type, name, player, opt_param_1, opt_param_2 ); - return; - } - - state = level.vsmgr[type].info[name].state; - - if ( state.ref_count_lerp_thread ) - { - state.ref_count++; - - if ( 1 < state.ref_count ) - 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 ); - } + 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 ) +vsmgr_deactivate( type, name, player ) //checked changed to match beta dump { - if ( level.vsmgr[type].info[name].state.activate_per_player ) - { - deactivate_per_player( type, name, player ); - return; - } + 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--; - state = level.vsmgr[type].info[name].state; - - if ( state.ref_count_lerp_thread ) - { - state.ref_count--; - - if ( 0 < state.ref_count ) - return; - } - - state notify( "deactivate" ); - players = getplayers(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - state vsmgr_set_state_inactive( players[player_index] ); + 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 ) +vsmgr_set_state_active( player, lerp ) //checked matches cerberus output { - player_entnum = player getentitynumber(); - - if ( !isdefined( self.players[player_entnum] ) ) - return; - - self.players[player_entnum].active = 1; - self.players[player_entnum].lerp = lerp; + 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 ) +vsmgr_set_state_inactive( player ) //checked matches cerberus output { - player_entnum = player getentitynumber(); - - if ( !isdefined( self.players[player_entnum] ) ) - return; - - self.players[player_entnum].active = 0; - self.players[player_entnum].lerp = 0; + 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 ) +vsmgr_timeout_lerp_thread( timeout, opt_param_2 ) //checked changed to match beta dump { - players = getplayers(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - self vsmgr_set_state_active( players[player_index], 1 ); - - wait( timeout ); - vsmgr_deactivate( self.type, self.name ); + 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 ) +vsmgr_timeout_lerp_thread_per_player( player, timeout, opt_param_2 ) //checked matches beta dump { - self vsmgr_set_state_active( player, 1 ); - wait( timeout ); - deactivate_per_player( self.type, self.name, player ); + self vsmgr_set_state_active( player, 1 ); + wait timeout; + deactivate_per_player( self.type, self.name, player ); } -vsmgr_duration_lerp_thread( duration, max_duration ) +vsmgr_duration_lerp_thread( duration, max_duration ) //checked changed to match beta dump { - start_time = gettime(); - end_time = start_time + int( duration * 1000 ); - - if ( isdefined( max_duration ) ) - start_time = end_time - int( max_duration * 1000 ); - - while ( true ) - { - lerp = calc_remaining_duration_lerp( start_time, end_time ); - - if ( 0 >= lerp ) - 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 ); + 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 ) +vsmgr_duration_lerp_thread_per_player( player, duration, max_duration ) //checked changed to match beta dump { - start_time = gettime(); - end_time = start_time + int( duration * 1000 ); - - if ( isdefined( max_duration ) ) - start_time = end_time - int( max_duration * 1000 ); - - while ( true ) - { - lerp = calc_remaining_duration_lerp( start_time, end_time ); - - if ( 0 >= lerp ) - break; - - self vsmgr_set_state_active( player, lerp ); - wait 0.05; - } - - deactivate_per_player( self.type, self.name, player ); + 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 ) +register_type( type ) //checked matches beta dump { - level.vsmgr[type] = spawnstruct(); - level.vsmgr[type].type = type; - level.vsmgr[type].in_use = 0; - level.vsmgr[type].highest_version = 0; - level.vsmgr[type].cf_slot_name = type + "_slot"; - level.vsmgr[type].cf_lerp_name = type + "_lerp"; - level.vsmgr[type].info = []; - level.vsmgr[type].sorted_name_keys = []; - level.vsmgr[type].sorted_prio_keys = []; - vsmgr_register_info( type, level.vsmgr_default_info_name, 1, 0, 1, 0, undefined ); + 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() +finalize_clientfields() //checked changed to match beta dump { - typekeys = getarraykeys( level.vsmgr ); - - for ( type_index = 0; type_index < typekeys.size; type_index++ ) - level.vsmgr[typekeys[type_index]] thread finalize_type_clientfields(); - - level.vsmgr_initializing = 0; + 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() +finalize_type_clientfields() //checked changed to match beta dump { - if ( 1 >= self.info.size ) - 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 ( 1 < self.cf_lerp_bit_count ) - registerclientfield( "toplayer", self.cf_lerp_name, self.highest_version, self.cf_lerp_bit_count, "float" ); + 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 ) +validate_info( type, name, priority ) //checked changed to match beta dump { - keys = getarraykeys( level.vsmgr ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( type == keys[i] ) - break; - } + keys = getarraykeys( level.vsmgr ); + for ( i = 0; i < keys.size; i++ ) + { + if ( type == keys[ i ] ) + { + break; + } + } + /* /# - assert( i < keys.size, "In visionset_mgr, type '" + type + "'is unknown" ); + assert( i < keys.size, "In visionset_mgr, type '" + type + "'is unknown" ); #/ - keys = getarraykeys( level.vsmgr[type].info ); - - for ( i = 0; i < keys.size; i++ ) - { + */ + keys = getarraykeys( level.vsmgr[ type ].info ); + for ( i = 0; i < keys.size; i++ ) + { + /* /# - assert( level.vsmgr[type].info[keys[i]].name != name, "In visionset_mgr of type '" + type + "': name '" + name + "' has previously been registered" ); + assert( level.vsmgr[ type ].info[ keys[ i ] ].name != name, "In visionset_mgr of type '" + type + "': name '" + name + "' has previously been registered" ); #/ /# - assert( level.vsmgr[type].info[keys[i]].priority != priority, "In visionset_mgr of type '" + type + "': priority '" + priority + "' requested for name '" + name + "' has previously been registered under name '" + level.vsmgr[type].info[keys[i]].name + "'" ); + assert( level.vsmgr[ type ].info[ keys[ i ] ].priority != priority, "In visionset_mgr of type '" + type + "': priority '" + priority + "' requested for name '" + name + "' has previously been registered under name '" + level.vsmgr[ type ].info[ keys[ i ] ].name + "'" ); #/ - } + */ + } } -add_sorted_name_key( type, name ) +add_sorted_name_key( type, name ) //checked changed to match beta dump { - for ( i = 0; i < level.vsmgr[type].sorted_name_keys.size; i++ ) - { - if ( name < level.vsmgr[type].sorted_name_keys[i] ) - break; - } - - arrayinsert( level.vsmgr[type].sorted_name_keys, name, i ); + 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 ) +add_sorted_priority_key( type, name, priority ) //checked changed to match beta dump { - for ( i = 0; i < level.vsmgr[type].sorted_prio_keys.size; i++ ) - { - if ( priority > level.vsmgr[type].info[level.vsmgr[type].sorted_prio_keys[i]].priority ) - break; - } - - arrayinsert( level.vsmgr[type].sorted_prio_keys, name, i ); + 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 ) +add_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) //checked matches beta dump { - self.type = type; - self.name = name; - self.version = version; - self.priority = priority; - self.lerp_step_count = lerp_step_count; - self.lerp_bit_count = getminbitcountfornum( lerp_step_count ); - - if ( !isdefined( ref_count_lerp_thread ) ) - ref_count_lerp_thread = 0; - - self.state = spawnstruct(); - self.state.type = type; - self.state.name = name; - self.state.activate_per_player = activate_per_player; - self.state.lerp_thread = lerp_thread; - self.state.ref_count_lerp_thread = ref_count_lerp_thread; - self.state.players = []; - - if ( ref_count_lerp_thread && !activate_per_player ) - self.state.ref_count = 0; + 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() +onplayerconnect() //checked matches beta dump { - for (;;) - { - level waittill( "connected", player ); - - player thread on_player_connect(); - } + for ( ;; ) + { + level waittill( "connected", player ); + player thread on_player_connect(); + } } -on_player_connect() +on_player_connect() //checked partially changed to match beta dump { - self._player_entnum = self getentitynumber(); - typekeys = getarraykeys( level.vsmgr ); - - for ( type_index = 0; type_index < typekeys.size; type_index++ ) - { - type = typekeys[type_index]; - - if ( !level.vsmgr[type].in_use ) - continue; - - 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 ); - } + 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() +monitor() //checked partially changed to match beta dump { - while ( level.vsmgr_initializing ) - wait 0.05; - - typekeys = getarraykeys( level.vsmgr ); - - while ( true ) - { - 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 ) - continue; - - for ( player_index = 0; player_index < players.size; player_index++ ) - { + while ( level.vsmgr_initializing ) + { + wait 0.05; + } + typekeys = getarraykeys( level.vsmgr ); + while ( 1 ) + { + wait 0.05; + waittillframeend; + players = get_players(); + for ( type_index = 0; type_index < typeKeys.size; type_index++ ) + { + type = typekeys[ type_index ]; + if ( !level.vsmgr[ type ].in_use ) + { + type_index++; + } + else + { + for ( player_index = 0; player_index < players.size; player_index++ ) + { + /* /# - if ( is_true( players[player_index].pers["isBot"] ) ) - continue; + if ( is_true( players[ player_index ].pers[ "isBot" ] ) ) + { + player_index++; + continue; #/ - update_clientfields( players[player_index], level.vsmgr[type] ); - } - } - } + } + */ + update_clientfields( players[ player_index ], level.vsmgr[ type ] ); + } + } + } + } } -get_first_active_name( type_struct ) +get_first_active_name( type_struct ) //checked partially changed to match beta dump { - size = type_struct.sorted_prio_keys.size; - - for ( prio_index = 0; prio_index < size; prio_index++ ) - { - prio_key = type_struct.sorted_prio_keys[prio_index]; - - if ( type_struct.info[prio_key].state.players[self._player_entnum].active ) - return prio_key; - } - - return level.vsmgr_default_info_name; + 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 ) +update_clientfields( player, type_struct ) //checked changed to match beta dump { - name = player get_first_active_name( type_struct ); - player setclientfieldtoplayer( type_struct.cf_slot_name, type_struct.info[name].slot_index ); - - if ( 1 < type_struct.cf_lerp_bit_count ) - player setclientfieldtoplayer( type_struct.cf_lerp_name, type_struct.info[name].state.players[player._player_entnum].lerp ); + 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 ) +lerp_thread_wrapper( func, opt_param_1, opt_param_2 ) //checked matches beta dump { - self notify( "deactivate" ); - self endon( "deactivate" ); - self [[ func ]]( opt_param_1, opt_param_2 ); + 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 ) +lerp_thread_per_player_wrapper( func, player, opt_param_1, opt_param_2 ) //checked matches beta dump { - player_entnum = player getentitynumber(); - self notify( "deactivate" ); - self endon( "deactivate" ); - self.players[player_entnum] notify( "deactivate" ); - self.players[player_entnum] endon( "deactivate" ); - player endon( "disconnect" ); - self [[ func ]]( player, opt_param_1, opt_param_2 ); + 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 ) +activate_per_player( type, name, player, opt_param_1, opt_param_2 ) //checked changed to match beta dump { - player_entnum = player getentitynumber(); - state = level.vsmgr[type].info[name].state; - - if ( state.ref_count_lerp_thread ) - { - state.players[player_entnum].ref_count++; - - if ( 1 < state.players[player_entnum].ref_count ) - 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 ); + 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 ) +deactivate_per_player( type, name, player ) //checked changed to match beta dump { - player_entnum = player getentitynumber(); - state = level.vsmgr[type].info[name].state; + 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.ref_count_lerp_thread ) - { - state.players[player_entnum].ref_count--; - - if ( 0 < state.players[player_entnum].ref_count ) - return; - } - - state vsmgr_set_state_inactive( player ); - state notify( "deactivate" ); + 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 ) +calc_remaining_duration_lerp( start_time, end_time ) //checked matches beta dump { - now = gettime(); - frac = float( end_time - now ) / float( end_time - start_time ); - return clamp( frac, 0, 1 ); + now = getTime(); + frac = float( end_time - now ) / float( end_time - start_time ); + return clamp( frac, 0, 1 ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_combat.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_combat.gsc index 655371a..54d4f91 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_combat.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_combat.gsc @@ -1,105 +1,106 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; +#include common_scripts/utility; main() { - debug_anim_print( "dog_combat::main() " ); - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); + debug_anim_print( "dog_combat::main() " ); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); /# - if ( !debug_allow_combat() ) - { - combatidle(); - return; - } + if ( !debug_allow_combat() ) + { + combatidle(); + return; #/ - if ( isdefined( level.hostmigrationtimer ) ) - { - combatidle(); - return; - } + } + if ( isDefined( level.hostmigrationtimer ) ) + { + combatidle(); + return; + } /# - assert( isdefined( self.enemy ) ); + assert( isDefined( self.enemy ) ); #/ - if ( !isalive( self.enemy ) ) - { - combatidle(); - return; - } - - if ( isplayer( self.enemy ) ) - self meleebiteattackplayer( self.enemy ); + if ( !isalive( self.enemy ) ) + { + combatidle(); + return; + } + if ( isplayer( self.enemy ) ) + { + self meleebiteattackplayer( self.enemy ); + } } combatidle() { - self set_orient_mode( "face enemy" ); - self animmode( "zonly_physics", 0 ); - idleanims = []; - idleanims[0] = "combat_attackidle"; - idleanims[1] = "combat_attackidle_bark"; - idleanims[2] = "combat_attackidle_growl"; - idleanim = random( idleanims ); - debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim ); - self setanimstate( idleanim ); - self maps\mp\animscripts\shared::donotetracks( "done" ); - debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." ); + self set_orient_mode( "face enemy" ); + self animmode( "zonly_physics", 0 ); + idleanims = []; + idleanims[ 0 ] = "combat_attackidle"; + idleanims[ 1 ] = "combat_attackidle_bark"; + idleanims[ 2 ] = "combat_attackidle_growl"; + idleanim = random( idleanims ); + debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim ); + self setanimstate( idleanim ); + self maps/mp/animscripts/shared::donotetracks( "done" ); + debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." ); } meleebiteattackplayer( player ) { - self set_orient_mode( "face enemy" ); - self animmode( "gravity", 0 ); - self.safetochangescript = 0; - - if ( use_low_attack() ) - { - self animmode( "angle deltas", 0 ); - self setanimstate( "combat_attack_player_close_range" ); - wait 0.35; - - if ( isplayer( self.enemy ) && self.enemy getstance() == "prone" ) - self meleewithoffset( vectorscale( ( 0, 0, -1 ), 9.0 ) ); - else - self melee(); - - self maps\mp\animscripts\shared::donotetracksfortime( 1.2, "done" ); - self animmode( "gravity", 0 ); - } - else - { - attack_time = 1.2 + randomfloat( 0.4 ); - debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" ); - self setanimstate( "combat_attack_run" ); - self maps\mp\animscripts\shared::donotetracksfortime( attack_time, "done", ::handlemeleebiteattacknotetracks, player ); - debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." ); - } - - self.safetochangescript = 1; - self animmode( "none", 0 ); + self set_orient_mode( "face enemy" ); + self animmode( "gravity", 0 ); + self.safetochangescript = 0; + if ( use_low_attack() ) + { + self animmode( "angle deltas", 0 ); + self setanimstate( "combat_attack_player_close_range" ); + wait 0,35; + if ( isplayer( self.enemy ) && self.enemy getstance() == "prone" ) + { + self meleewithoffset( vectorScale( ( 0, 0, -1 ), 9 ) ); + } + else + { + self melee(); + } + self maps/mp/animscripts/shared::donotetracksfortime( 1,2, "done" ); + self animmode( "gravity", 0 ); + } + else + { + attack_time = 1,2 + randomfloat( 0,4 ); + debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" ); + self setanimstate( "combat_attack_run" ); + self maps/mp/animscripts/shared::donotetracksfortime( attack_time, "done", ::handlemeleebiteattacknotetracks, player ); + debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." ); + } + self.safetochangescript = 1; + self animmode( "none", 0 ); } handlemeleebiteattacknotetracks( note, player ) { - if ( note == "dog_melee" ) - self melee( anglestoforward( self.angles ) ); + if ( note == "dog_melee" ) + { + self melee( anglesToForward( self.angles ) ); + } } use_low_attack() { - if ( isplayer( self.enemy ) ) - { - if ( self.enemy getstance() == "prone" ) - { - attack_height = self.origin[2] + 16; - - if ( self.enemy.origin[2] < attack_height ) - return true; - } - } - - return false; + if ( isplayer( self.enemy ) ) + { + if ( self.enemy getstance() == "prone" ) + { + attack_height = self.origin[ 2 ] + 16; + if ( self.enemy.origin[ 2 ] < attack_height ) + { + return 1; + } + } + } + return 0; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_death.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_death.gsc index 408d5ac..8f65047 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_death.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_death.gsc @@ -1,34 +1,30 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - debug_anim_print( "dog_death::main()" ); - self setaimanimweights( 0, 0 ); - self endon( "killanimscript" ); - - if ( isdefined( self.a.nodeath ) ) - { + debug_anim_print( "dog_death::main()" ); + self setaimanimweights( 0, 0 ); + self endon( "killanimscript" ); + if ( isDefined( self.a.nodeath ) ) + { /# - assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." ); + assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." ); #/ - wait 3; - return; - } - - self unlink(); - - if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) - self.enemy.syncedmeleetarget = undefined; - - death_anim = "death_" + getanimdirection( self.damageyaw ); + wait 3; + return; + } + self unlink(); + if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) + { + self.enemy.syncedmeleetarget = undefined; + } + death_anim = "death_" + getanimdirection( self.damageyaw ); /# - println( death_anim ); + println( death_anim ); #/ - self animmode( "gravity", 0 ); - debug_anim_print( "dog_death::main() - Setting " + death_anim ); - self setanimstate( death_anim ); - self maps\mp\animscripts\shared::donotetracks( "done" ); + self animmode( "gravity", 0 ); + debug_anim_print( "dog_death::main() - Setting " + death_anim ); + self setanimstate( death_anim ); + self maps/mp/animscripts/shared::donotetracks( "done" ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_flashed.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_flashed.gsc index ed89182..e86fde0 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_flashed.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_flashed.gsc @@ -1,28 +1,29 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; main() { - self endon( "killanimscript" ); - self endon( "stop_flashbang_effect" ); - wait( randomfloatrange( 0, 0.4 ) ); - duration = self startflashbanged() * 0.001; - self setanimstate( "flashed" ); - self maps\mp\animscripts\shared::donotetracks( "done" ); - self setflashbanged( 0 ); - self.flashed = 0; - self notify( "stop_flashbang_effect" ); + self endon( "killanimscript" ); + self endon( "stop_flashbang_effect" ); + wait randomfloatrange( 0, 0,4 ); + duration = self startflashbanged() * 0,001; + self setanimstate( "flashed" ); + self maps/mp/animscripts/shared::donotetracks( "done" ); + self setflashbanged( 0 ); + self.flashed = 0; + self notify( "stop_flashbang_effect" ); } startflashbanged() { - if ( isdefined( self.flashduration ) ) - duration = self.flashduration; - else - duration = self getflashbangedstrength() * 1000; - - self.flashendtime = gettime() + duration; - self notify( "flashed" ); - return duration; + if ( isDefined( self.flashduration ) ) + { + duration = self.flashduration; + } + else + { + duration = self getflashbangedstrength() * 1000; + } + self.flashendtime = getTime() + duration; + self notify( "flashed" ); + return duration; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_init.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_init.gsc index 26af7b0..c8439f7 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_init.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_init.gsc @@ -1,64 +1,62 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\dog_move; -#include maps\mp\animscripts\dog_combat; +#include maps/mp/animscripts/dog_combat; +#include maps/mp/animscripts/dog_move; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; main() { - level.dog_debug_orient = 0; - level.dog_debug_anims = 0; - level.dog_debug_anims_ent = 0; - level.dog_debug_turns = 0; - debug_anim_print( "dog_init::main() " ); - maps\mp\animscripts\dog_move::setup_sound_variables(); - anim_get_dvar_int( "debug_dog_sound", "0" ); - anim_get_dvar_int( "debug_dog_notetracks", "0" ); - anim_get_dvar_int( "dog_force_walk", 0 ); - anim_get_dvar_int( "dog_force_run", 0 ); - self.ignoresuppression = 1; - self.chatinitialized = 0; - self.nododgemove = 1; - level.dogrunturnspeed = 20; - level.dogrunpainspeed = 20; - self.meleeattackdist = 0; - self thread setmeleeattackdist(); - self.a = spawnstruct(); - self.a.pose = "stand"; - self.a.nextstandinghitdying = 0; - self.a.movement = "run"; - set_anim_playback_rate(); - self.suppressionthreshold = 1; - self.disablearrivals = 0; - level.dogstoppingdistsq = 3416.82; - self.stopanimdistsq = level.dogstoppingdistsq; - self.pathenemyfightdist = 512; - self settalktospecies( "dog" ); - level.lastdogmeleeplayertime = 0; - level.dogmeleeplayercounter = 0; - - if ( !isdefined( level.dog_hits_before_kill ) ) - level.dog_hits_before_kill = 1; + level.dog_debug_orient = 0; + level.dog_debug_anims = 0; + level.dog_debug_anims_ent = 0; + level.dog_debug_turns = 0; + debug_anim_print( "dog_init::main() " ); + maps/mp/animscripts/dog_move::setup_sound_variables(); + anim_get_dvar_int( "debug_dog_sound", "0" ); + anim_get_dvar_int( "debug_dog_notetracks", "0" ); + anim_get_dvar_int( "dog_force_walk", 0 ); + anim_get_dvar_int( "dog_force_run", 0 ); + self.ignoresuppression = 1; + self.chatinitialized = 0; + self.nododgemove = 1; + level.dogrunturnspeed = 20; + level.dogrunpainspeed = 20; + self.meleeattackdist = 0; + self thread setmeleeattackdist(); + self.a = spawnstruct(); + self.a.pose = "stand"; + self.a.nextstandinghitdying = 0; + self.a.movement = "run"; + set_anim_playback_rate(); + self.suppressionthreshold = 1; + self.disablearrivals = 0; + level.dogstoppingdistsq = 3416,82; + self.stopanimdistsq = level.dogstoppingdistsq; + self.pathenemyfightdist = 512; + self settalktospecies( "dog" ); + level.lastdogmeleeplayertime = 0; + level.dogmeleeplayercounter = 0; + if ( !isDefined( level.dog_hits_before_kill ) ) + { + level.dog_hits_before_kill = 1; + } } set_anim_playback_rate() { - self.animplaybackrate = 0.9 + randomfloat( 0.2 ); - self.moveplaybackrate = 1; + self.animplaybackrate = 0,9 + randomfloat( 0,2 ); + self.moveplaybackrate = 1; } setmeleeattackdist() { - self endon( "death" ); - - while ( true ) - { - self.meleeattackdist = 0; - - if ( self maps\mp\animscripts\dog_combat::use_low_attack() ) - self.meleeattackdist = 64; - - wait 1; - } + self endon( "death" ); + while ( 1 ) + { + self.meleeattackdist = 0; + if ( self maps/mp/animscripts/dog_combat::use_low_attack() ) + { + self.meleeattackdist = 64; + } + wait 1; + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_jump.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_jump.gsc index 80dd040..acfb82a 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_jump.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_jump.gsc @@ -1,15 +1,13 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - self endon( "killanimscript" ); - debug_anim_print( "dog_jump::main()" ); - self setaimanimweights( 0, 0 ); - self.safetochangescript = 0; - self setanimstate( "traverse_wallhop" ); - maps\mp\animscripts\shared::donotetracks( "done" ); - self.safetochangescript = 1; + self endon( "killanimscript" ); + debug_anim_print( "dog_jump::main()" ); + self setaimanimweights( 0, 0 ); + self.safetochangescript = 0; + self setanimstate( "traverse_wallhop" ); + maps/mp/animscripts/shared::donotetracks( "done" ); + self.safetochangescript = 1; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_move.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_move.gsc index cddef29..af8604d 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_move.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_move.gsc @@ -1,173 +1,185 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\dog_stop; +#include maps/mp/animscripts/dog_stop; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; setup_sound_variables() { - level.dog_sounds["far"] = spawnstruct(); - level.dog_sounds["close"] = spawnstruct(); - level.dog_sounds["close"].minrange = 0; - level.dog_sounds["close"].maxrange = 500; - level.dog_sounds["close"].sound = "aml_dog_bark_close"; - level.dog_sounds["close"].soundlengthplaceholder = 0.2; - level.dog_sounds["close"].aftersoundwaitmin = 0.1; - level.dog_sounds["close"].aftersoundwaitmax = 0.3; - level.dog_sounds["close"].minrangesqr = level.dog_sounds["close"].minrange * level.dog_sounds["close"].minrange; - level.dog_sounds["close"].maxrangesqr = level.dog_sounds["close"].maxrange * level.dog_sounds["close"].maxrange; - level.dog_sounds["far"].minrange = 500; - level.dog_sounds["far"].maxrange = 0; - level.dog_sounds["far"].sound = "aml_dog_bark"; - level.dog_sounds["far"].soundlengthplaceholder = 0.2; - level.dog_sounds["far"].aftersoundwaitmin = 0.1; - level.dog_sounds["far"].aftersoundwaitmax = 0.3; - level.dog_sounds["far"].minrangesqr = level.dog_sounds["far"].minrange * level.dog_sounds["far"].minrange; - level.dog_sounds["far"].maxrangesqr = level.dog_sounds["far"].maxrange * level.dog_sounds["far"].maxrange; + level.dog_sounds[ "far" ] = spawnstruct(); + level.dog_sounds[ "close" ] = spawnstruct(); + level.dog_sounds[ "close" ].minrange = 0; + level.dog_sounds[ "close" ].maxrange = 500; + level.dog_sounds[ "close" ].sound = "aml_dog_bark_close"; + level.dog_sounds[ "close" ].soundlengthplaceholder = 0,2; + level.dog_sounds[ "close" ].aftersoundwaitmin = 0,1; + level.dog_sounds[ "close" ].aftersoundwaitmax = 0,3; + level.dog_sounds[ "close" ].minrangesqr = level.dog_sounds[ "close" ].minrange * level.dog_sounds[ "close" ].minrange; + level.dog_sounds[ "close" ].maxrangesqr = level.dog_sounds[ "close" ].maxrange * level.dog_sounds[ "close" ].maxrange; + level.dog_sounds[ "far" ].minrange = 500; + level.dog_sounds[ "far" ].maxrange = 0; + level.dog_sounds[ "far" ].sound = "aml_dog_bark"; + level.dog_sounds[ "far" ].soundlengthplaceholder = 0,2; + level.dog_sounds[ "far" ].aftersoundwaitmin = 0,1; + level.dog_sounds[ "far" ].aftersoundwaitmax = 0,3; + level.dog_sounds[ "far" ].minrangesqr = level.dog_sounds[ "far" ].minrange * level.dog_sounds[ "far" ].minrange; + level.dog_sounds[ "far" ].maxrangesqr = level.dog_sounds[ "far" ].maxrange * level.dog_sounds[ "far" ].maxrange; } main() { - self endon( "killanimscript" ); - debug_anim_print( "dog_move::main()" ); - self setaimanimweights( 0, 0 ); - do_movement = 1; + self endon( "killanimscript" ); + debug_anim_print( "dog_move::main()" ); + self setaimanimweights( 0, 0 ); + do_movement = 1; /# - if ( !debug_allow_movement() ) - do_movement = 0; + if ( !debug_allow_movement() ) + { + do_movement = 0; #/ - if ( isdefined( level.hostmigrationtimer ) ) - do_movement = 0; - - if ( !isdefined( self.traversecomplete ) && !isdefined( self.skipstartmove ) && self.a.movement == "run" && do_movement ) - { - self startmove(); - blendtime = 0; - } - else - blendtime = 0.2; - - self.traversecomplete = undefined; - self.skipstartmove = undefined; - - if ( do_movement ) - { - if ( shouldrun() ) - { - debug_anim_print( "dog_move::main() - Setting move_run" ); - self setanimstate( "move_run" ); - maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" ); - debug_anim_print( "dog_move::main() - move_run wait 0.1 done " ); - } - else - { - debug_anim_print( "dog_move::main() - Setting move_start " ); - self setanimstate( "move_walk" ); - maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" ); - } - } - - self thread maps\mp\animscripts\dog_stop::lookattarget( "normal" ); - - while ( true ) - { - self moveloop(); - - if ( self.a.movement == "run" ) - { - if ( self.disablearrivals == 0 ) - self thread stopmove(); - - self waittill( "run" ); - } - } + } + if ( isDefined( level.hostmigrationtimer ) ) + { + do_movement = 0; + } + if ( !isDefined( self.traversecomplete ) && !isDefined( self.skipstartmove ) && self.a.movement == "run" && do_movement ) + { + self startmove(); + blendtime = 0; + } + else + { + blendtime = 0,2; + } + self.traversecomplete = undefined; + self.skipstartmove = undefined; + if ( do_movement ) + { + if ( shouldrun() ) + { + debug_anim_print( "dog_move::main() - Setting move_run" ); + self setanimstate( "move_run" ); + maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" ); + debug_anim_print( "dog_move::main() - move_run wait 0.1 done " ); + } + else + { + debug_anim_print( "dog_move::main() - Setting move_start " ); + self setanimstate( "move_walk" ); + maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" ); + } + } + self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" ); + while ( 1 ) + { + self moveloop(); + if ( self.a.movement == "run" ) + { + if ( self.disablearrivals == 0 ) + { + self thread stopmove(); + } + self waittill( "run" ); + } + } } moveloop() { - self endon( "killanimscript" ); - self endon( "stop_soon" ); - - while ( true ) - { - do_movement = 1; + self endon( "killanimscript" ); + self endon( "stop_soon" ); + while ( 1 ) + { + do_movement = 1; /# - if ( !debug_allow_movement() ) - do_movement = 0; + if ( !debug_allow_movement() ) + { + do_movement = 0; #/ - if ( isdefined( level.hostmigrationtimer ) ) - do_movement = 0; - - if ( !do_movement ) - { - self setaimanimweights( 0, 0 ); - self setanimstate( "stop_idle" ); - maps\mp\animscripts\shared::donotetracks( "done" ); - continue; - } - - if ( self.disablearrivals ) - self.stopanimdistsq = 0; - else - self.stopanimdistsq = level.dogstoppingdistsq; - - if ( shouldrun() ) - { - debug_anim_print( "dog_move::moveLoop() - Setting move_run" ); - self setanimstate( "move_run" ); - maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" ); - debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " ); - } - else - { - debug_anim_print( "dog_move::moveLoop() - Setting move_walk " ); - self setanimstate( "move_walk" ); - maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" ); - debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " ); - } - } + } + if ( isDefined( level.hostmigrationtimer ) ) + { + do_movement = 0; + } + while ( !do_movement ) + { + self setaimanimweights( 0, 0 ); + self setanimstate( "stop_idle" ); + maps/mp/animscripts/shared::donotetracks( "done" ); + } + if ( self.disablearrivals ) + { + self.stopanimdistsq = 0; + } + else + { + self.stopanimdistsq = level.dogstoppingdistsq; + } + if ( shouldrun() ) + { + debug_anim_print( "dog_move::moveLoop() - Setting move_run" ); + self setanimstate( "move_run" ); + maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" ); + debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " ); + continue; + } + else + { + debug_anim_print( "dog_move::moveLoop() - Setting move_walk " ); + self setanimstate( "move_walk" ); + maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" ); + debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " ); + } + } } startmove() { - debug_anim_print( "dog_move::startMove() - Setting move_start " ); - self setanimstate( "move_start" ); - maps\mp\animscripts\shared::donotetracks( "done" ); - debug_anim_print( "dog_move::startMove() - move_start notify done." ); - self animmode( "none", 0 ); - self set_orient_mode( "face motion" ); + debug_anim_print( "dog_move::startMove() - Setting move_start " ); + self setanimstate( "move_start" ); + maps/mp/animscripts/shared::donotetracks( "done" ); + debug_anim_print( "dog_move::startMove() - move_start notify done." ); + self animmode( "none", 0 ); + self set_orient_mode( "face motion" ); } stopmove() { - self endon( "killanimscript" ); - self endon( "run" ); - debug_anim_print( "dog_move::stopMove() - Setting move_stop" ); - self setanimstate( "move_stop" ); - maps\mp\animscripts\shared::donotetracks( "done" ); - debug_anim_print( "dog_move::stopMove() - move_stop notify done." ); + self endon( "killanimscript" ); + self endon( "run" ); + debug_anim_print( "dog_move::stopMove() - Setting move_stop" ); + self setanimstate( "move_stop" ); + maps/mp/animscripts/shared::donotetracks( "done" ); + debug_anim_print( "dog_move::stopMove() - move_stop notify done." ); } shouldrun() { /# - if ( getdvarint( _hash_DFB12081 ) != 0 ) - return true; - else if ( getdvarint( _hash_D5D7999B ) != 0 ) - return false; + if ( getDvarInt( #"DFB12081" ) != 0 ) + { + return 1; + } + else + { + if ( getDvarInt( #"D5D7999B" ) != 0 ) + { + return 0; #/ - if ( isdefined( self.enemy ) ) - return true; - - if ( self.lookaheaddist <= 90 ) - return false; - - angles = vectortoangles( self.lookaheaddir ); - yaw_desired = absangleclamp180( angles[1] ); - yaw = absangleclamp180( self.angles[1] ); - - if ( abs( yaw_desired - yaw ) >= 8 ) - return false; - - return true; + } + } + if ( isDefined( self.enemy ) ) + { + return 1; + } + if ( self.lookaheaddist <= 90 ) + { + return 0; + } + angles = vectorToAngle( self.lookaheaddir ); + yaw_desired = absangleclamp180( angles[ 1 ] ); + yaw = absangleclamp180( self.angles[ 1 ] ); + if ( abs( yaw_desired - yaw ) >= 8 ) + { + return 0; + } + return 1; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_pain.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_pain.gsc index 2b6fc2f..d218129 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_pain.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_pain.gsc @@ -1,28 +1,26 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - debug_anim_print( "dog_pain::main() " ); - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); - - if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) - { - self unlink(); - self.enemy.syncedmeleetarget = undefined; - } - - speed = length( self getvelocity() ); - pain_anim = getanimdirection( self.damageyaw ); - - if ( speed > level.dogrunpainspeed ) - pain_anim = "pain_run_" + pain_anim; - else - pain_anim = "pain_" + pain_anim; - - self setanimstate( pain_anim ); - self maps\mp\animscripts\shared::donotetracksfortime( 0.2, "done" ); + debug_anim_print( "dog_pain::main() " ); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); + if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) + { + self unlink(); + self.enemy.syncedmeleetarget = undefined; + } + speed = length( self getvelocity() ); + pain_anim = getanimdirection( self.damageyaw ); + if ( speed > level.dogrunpainspeed ) + { + pain_anim = "pain_run_" + pain_anim; + } + else + { + pain_anim = "pain_" + pain_anim; + } + self setanimstate( pain_anim ); + self maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_stop.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_stop.gsc index 43d1909..0b6e630 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_stop.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_stop.gsc @@ -1,129 +1,132 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; main() { - debug_anim_print( "dog_stop::main()" ); - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); - self thread lookattarget( "attackIdle" ); - - while ( true ) - { - if ( shouldattackidle() ) - { - self randomattackidle(); - maps\mp\animscripts\shared::donotetracks( "done" ); - } - else - { - self set_orient_mode( "face current" ); - debug_anim_print( "dog_stop::main() - Setting stop_idle" ); - self notify( "stop tracking" ); - self setaimanimweights( 0, 0 ); - self setanimstate( "stop_idle" ); - maps\mp\animscripts\shared::donotetracks( "done" ); - self thread lookattarget( "attackIdle" ); - } - - debug_anim_print( "dog_stop::main() - stop idle loop notify done." ); - } + debug_anim_print( "dog_stop::main()" ); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); + self thread lookattarget( "attackIdle" ); + while ( 1 ) + { + if ( shouldattackidle() ) + { + self randomattackidle(); + maps/mp/animscripts/shared::donotetracks( "done" ); + } + else + { + self set_orient_mode( "face current" ); + debug_anim_print( "dog_stop::main() - Setting stop_idle" ); + self notify( "stop tracking" ); + self setaimanimweights( 0, 0 ); + self setanimstate( "stop_idle" ); + maps/mp/animscripts/shared::donotetracks( "done" ); + self thread lookattarget( "attackIdle" ); + } + debug_anim_print( "dog_stop::main() - stop idle loop notify done." ); + } } isfacingenemy( tolerancecosangle ) { /# - assert( isdefined( self.enemy ) ); + assert( isDefined( self.enemy ) ); #/ - vectoenemy = self.enemy.origin - self.origin; - disttoenemy = length( vectoenemy ); - - if ( disttoenemy < 1 ) - return 1; - - forward = anglestoforward( self.angles ); - val1 = forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1]; - val2 = ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy; - return ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy > tolerancecosangle; + vectoenemy = self.enemy.origin - self.origin; + disttoenemy = length( vectoenemy ); + if ( disttoenemy < 1 ) + { + return 1; + } + forward = anglesToForward( self.angles ); + val1 = ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ); + val2 = ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy; + return ( ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy ) > tolerancecosangle; } randomattackidle() { - if ( isfacingenemy( -0.5 ) ) - self set_orient_mode( "face current" ); - else - self set_orient_mode( "face enemy" ); - - if ( should_growl() ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" ); - self setanimstate( "stop_attackidle_growl" ); - return; - } - - idlechance = 33; - barkchance = 66; - - if ( isdefined( self.mode ) ) - { - if ( self.mode == "growl" ) - { - idlechance = 15; - barkchance = 30; - } - else if ( self.mode == "bark" ) - { - idlechance = 15; - barkchance = 85; - } - } - - rand = randomint( 100 ); - - if ( rand < idlechance ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle" ); - self setanimstate( "stop_attackidle" ); - } - else if ( rand < barkchance ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " ); - self setanimstate( "stop_attackidle_bark" ); - } - else - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " ); - self setanimstate( "stop_attackidle_growl" ); - } + if ( isfacingenemy( -0,5 ) ) + { + self set_orient_mode( "face current" ); + } + else + { + self set_orient_mode( "face enemy" ); + } + if ( should_growl() ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" ); + self setanimstate( "stop_attackidle_growl" ); + return; + } + idlechance = 33; + barkchance = 66; + if ( isDefined( self.mode ) ) + { + if ( self.mode == "growl" ) + { + idlechance = 15; + barkchance = 30; + } + else + { + if ( self.mode == "bark" ) + { + idlechance = 15; + barkchance = 85; + } + } + } + rand = randomint( 100 ); + if ( rand < idlechance ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle" ); + self setanimstate( "stop_attackidle" ); + } + else if ( rand < barkchance ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " ); + self setanimstate( "stop_attackidle_bark" ); + } + else + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " ); + self setanimstate( "stop_attackidle_growl" ); + } } shouldattackidle() { - return isdefined( self.enemy ) && isalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 1000000; + if ( isDefined( self.enemy ) && isalive( self.enemy ) ) + { + return distancesquared( self.origin, self.enemy.origin ) < 1000000; + } } should_growl() { - if ( isdefined( self.script_growl ) ) - return 1; - - if ( !isalive( self.enemy ) ) - return 1; - - return !self cansee( self.enemy ); + if ( isDefined( self.script_growl ) ) + { + return 1; + } + if ( !isalive( self.enemy ) ) + { + return 1; + } + return !self cansee( self.enemy ); } lookattarget( lookposeset ) { - self endon( "killanimscript" ); - self endon( "stop tracking" ); - debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset ); - self.rightaimlimit = 90; - self.leftaimlimit = -90; - self.upaimlimit = 45; - self.downaimlimit = -45; - self maps\mp\animscripts\shared::setanimaimweight( 1, 0.2 ); - self maps\mp\animscripts\shared::trackloop(); + self endon( "killanimscript" ); + self endon( "stop tracking" ); + debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset ); + self.rightaimlimit = 90; + self.leftaimlimit = -90; + self.upaimlimit = 45; + self.downaimlimit = -45; + self maps/mp/animscripts/shared::setanimaimweight( 1, 0,2 ); + self maps/mp/animscripts/shared::trackloop(); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/dog_turn.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/dog_turn.gsc index 2c9f1a3..4d759cc 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_turn.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_turn.gsc @@ -1,123 +1,117 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - self endon( "killanimscript" ); - debug_turn_print( "dog_turn::main()" ); - self setaimanimweights( 0, 0 ); - self.safetochangescript = 0; - deltayaw = self getdeltaturnyaw(); - - if ( need_to_turn_around( deltayaw ) ) - turn_180( deltayaw ); - else - turn_90( deltayaw ); - - move_out_of_turn(); - self.skipstartmove = 1; - self.safetochangescript = 1; + self endon( "killanimscript" ); + debug_turn_print( "dog_turn::main()" ); + self setaimanimweights( 0, 0 ); + self.safetochangescript = 0; + deltayaw = self getdeltaturnyaw(); + if ( need_to_turn_around( deltayaw ) ) + { + turn_180( deltayaw ); + } + else + { + turn_90( deltayaw ); + } + move_out_of_turn(); + self.skipstartmove = 1; + self.safetochangescript = 1; } need_to_turn_around( deltayaw ) { - angle = getdvarfloat( "dog_turn180_angle" ); - - if ( deltayaw >= angle || deltayaw <= -1 * angle ) - { - debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " YES" ); - return true; - } - - debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " NO" ); - return false; + angle = getDvarFloat( "dog_turn180_angle" ); + if ( deltayaw >= angle || deltayaw <= ( -1 * angle ) ) + { + debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " YES" ); + return 1; + } + debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " NO" ); + return 0; } do_turn_anim( stopped_anim, run_anim, wait_time, run_wait_time ) { - speed = length( self getvelocity() ); - do_anim = stopped_anim; - - if ( level.dogrunturnspeed < speed ) - { - do_anim = run_anim; - wait_time = run_wait_time; - } - - debug_turn_print( "dog_turn::do_turn_anim() - Setting " + do_anim ); - self setanimstate( do_anim ); - maps\mp\animscripts\shared::donotetracksfortime( run_wait_time, "done" ); - debug_turn_print( "dog_turn::do_turn_anim() - done with " + do_anim + " wait time " + run_wait_time ); + speed = length( self getvelocity() ); + do_anim = stopped_anim; + if ( level.dogrunturnspeed < speed ) + { + do_anim = run_anim; + wait_time = run_wait_time; + } + debug_turn_print( "dog_turn::do_turn_anim() - Setting " + do_anim ); + self setanimstate( do_anim ); + maps/mp/animscripts/shared::donotetracksfortime( run_wait_time, "done" ); + debug_turn_print( "dog_turn::do_turn_anim() - done with " + do_anim + " wait time " + run_wait_time ); } turn_left() { - self do_turn_anim( "move_turn_left", "move_run_turn_left", 0.5, 0.5 ); + self do_turn_anim( "move_turn_left", "move_run_turn_left", 0,5, 0,5 ); } turn_right() { - self do_turn_anim( "move_turn_right", "move_run_turn_right", 0.5, 0.5 ); + self do_turn_anim( "move_turn_right", "move_run_turn_right", 0,5, 0,5 ); } turn_180_left() { - self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0.5, 0.7 ); + self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0,5, 0,7 ); } turn_180_right() { - self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0.5, 0.7 ); + self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0,5, 0,7 ); } move_out_of_turn() { - if ( self.a.movement == "run" ) - { - debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_run" ); - self setanimstate( "move_run" ); - maps\mp\animscripts\shared::donotetracksfortime( 0.1, "done" ); - debug_turn_print( "dog_turn::move_out_of_turn() - move_run wait 0.1 done " ); - } - else - { - debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_start " ); - self setanimstate( "move_walk" ); - } + if ( self.a.movement == "run" ) + { + debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_run" ); + self setanimstate( "move_run" ); + maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" ); + debug_turn_print( "dog_turn::move_out_of_turn() - move_run wait 0.1 done " ); + } + else + { + debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_start " ); + self setanimstate( "move_walk" ); + } } turn_90( deltayaw ) { - self animmode( "zonly_physics", 0 ); - debug_turn_print( "dog_turn::turn_90() deltaYaw: " + deltayaw ); - - if ( deltayaw > 0 ) - { - debug_turn_print( "dog_turn::turn_90() left", 1 ); - self turn_left(); - } - else - { - debug_turn_print( "dog_turn::turn_90() right", 1 ); - self turn_right(); - } + self animmode( "zonly_physics", 0 ); + debug_turn_print( "dog_turn::turn_90() deltaYaw: " + deltayaw ); + if ( deltayaw > 0 ) + { + debug_turn_print( "dog_turn::turn_90() left", 1 ); + self turn_left(); + } + else + { + debug_turn_print( "dog_turn::turn_90() right", 1 ); + self turn_right(); + } } turn_180( deltayaw ) { - self animmode( "zonly_physics", 0 ); - debug_turn_print( "dog_turn::turn_180() deltaYaw: " + deltayaw ); - - if ( deltayaw > 0 ) - { - debug_turn_print( "dog_turn::turn_180() left", 1 ); - self turn_180_left(); - } - else - { - debug_turn_print( "dog_turn::turn_180() right", 1 ); - self turn_180_right(); - } + self animmode( "zonly_physics", 0 ); + debug_turn_print( "dog_turn::turn_180() deltaYaw: " + deltayaw ); + if ( deltayaw > 0 ) + { + debug_turn_print( "dog_turn::turn_180() left", 1 ); + self turn_180_left(); + } + else + { + debug_turn_print( "dog_turn::turn_180() right", 1 ); + self turn_180_right(); + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/shared.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/shared.gsc index a5c4b3a..ee523c7 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/shared.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/shared.gsc @@ -1,287 +1,306 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\utility; -#include maps\mp\_utility; +#include maps/mp/_utility; +#include maps/mp/animscripts/utility; +#include common_scripts/utility; handledogsoundnotetracks( note ) { - if ( note == "sound_dogstep_run_default" ) - return true; - - prefix = getsubstr( note, 0, 5 ); - - if ( prefix != "sound" ) - return false; - - return true; + if ( note == "sound_dogstep_run_default" ) + { + return 1; + } + prefix = getsubstr( note, 0, 5 ); + if ( prefix != "sound" ) + { + return 0; + } + return 1; } growling() { - return isdefined( self.script_growl ); + return isDefined( self.script_growl ); } handlenotetrack( note, flagname, customfunction, var1 ) { /# - if ( getdvarint( _hash_6EBEB982 ) ) - println( "dog notetrack: " + flagname + " " + note + " " + gettime() ); + if ( getDvarInt( #"6EBEB982" ) ) + { + println( "dog notetrack: " + flagname + " " + note + " " + getTime() ); #/ - if ( isai( self ) && self.type == "dog" ) - { - if ( handledogsoundnotetracks( note ) ) - return; - } - - switch ( note ) - { - case "undefined": - case "finish": - case "end": - return note; - default: - if ( isdefined( customfunction ) ) - { - if ( !isdefined( var1 ) ) - return [[ customfunction ]]( note ); - else - return [[ customfunction ]]( note, var1 ); - } - - break; - } + } + if ( isai( self ) && self.type == "dog" ) + { + if ( handledogsoundnotetracks( note ) ) + { + return; + } + } + switch( note ) + { + case "end": + case "finish": + case "undefined": + return note; + default: + if ( isDefined( customfunction ) ) + { + if ( !isDefined( var1 ) ) + { + return [[ customfunction ]]( note ); + } + else + { + return [[ customfunction ]]( note, var1 ); + } + } + } + } } donotetracks( flagname, customfunction, var1 ) { - for (;;) - { - self waittill( flagname, note ); - - if ( !isdefined( note ) ) - note = "undefined"; - - val = self handlenotetrack( note, flagname, customfunction, var1 ); - - if ( isdefined( val ) ) - return val; - } + for ( ;; ) + { + self waittill( flagname, note ); + if ( !isDefined( note ) ) + { + note = "undefined"; + } + val = self handlenotetrack( note, flagname, customfunction, var1 ); + if ( isDefined( val ) ) + { + return val; + } + } } donotetracksforeverproc( notetracksfunc, flagname, killstring, customfunction, var1 ) { - if ( isdefined( killstring ) ) - self endon( killstring ); - - self endon( "killanimscript" ); - - for (;;) - { - time = gettime(); - returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); - timetaken = gettime() - time; - - if ( timetaken < 0.05 ) - { - time = gettime(); - returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); - timetaken = gettime() - time; - - if ( timetaken < 0.05 ) - { + if ( isDefined( killstring ) ) + { + self endon( killstring ); + } + self endon( "killanimscript" ); + for ( ;; ) + { + time = getTime(); + returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); + timetaken = getTime() - time; + if ( timetaken < 0,05 ) + { + time = getTime(); + returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); + timetaken = getTime() - time; + if ( timetaken < 0,05 ) + { /# - println( gettime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." ); + println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." ); #/ - wait( 0.05 - timetaken ); - } - } - } + wait ( 0,05 - timetaken ); + } + } + } } donotetracksforever( flagname, killstring, customfunction, var1 ) { - donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 ); + donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 ); } donotetracksfortimeproc( donotetracksforeverfunc, time, flagname, customfunction, ent, var1 ) { - ent endon( "stop_notetracks" ); - [[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 ); + ent endon( "stop_notetracks" ); + [[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 ); } donotetracksfortime( time, flagname, customfunction, var1 ) { - ent = spawnstruct(); - ent thread donotetracksfortimeendnotify( time ); - donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 ); + ent = spawnstruct(); + ent thread donotetracksfortimeendnotify( time ); + donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 ); } donotetracksfortimeendnotify( time ) { - wait( time ); - self notify( "stop_notetracks" ); + wait time; + self notify( "stop_notetracks" ); } trackloop() { - players = get_players(); - deltachangeperframe = 5; - aimblendtime = 0.05; - prevyawdelta = 0; - prevpitchdelta = 0; - maxyawdeltachange = 5; - maxpitchdeltachange = 5; - pitchadd = 0; - yawadd = 0; - - if ( self.type == "dog" || self.type == "zombie" || self.type == "zombie_dog" ) - { - domaxanglecheck = 0; - self.shootent = self.enemy; - } - else - { - domaxanglecheck = 1; - - if ( self.a.script == "cover_crouch" && isdefined( self.a.covermode ) && self.a.covermode == "lean" ) - pitchadd = -1 * anim.covercrouchleanpitch; - - if ( ( self.a.script == "cover_left" || self.a.script == "cover_right" ) && isdefined( self.a.cornermode ) && self.a.cornermode == "lean" ) - yawadd = self.covernode.angles[1] - self.angles[1]; - } - - yawdelta = 0; - pitchdelta = 0; - firstframe = 1; - - for (;;) - { - incranimaimweight(); - selfshootatpos = ( self.origin[0], self.origin[1], self geteye()[2] ); - shootpos = undefined; - - if ( isdefined( self.enemy ) ) - shootpos = self.enemy getshootatpos(); - - if ( !isdefined( shootpos ) ) - { - yawdelta = 0; - pitchdelta = 0; - } - else - { - vectortoshootpos = shootpos - selfshootatpos; - anglestoshootpos = vectortoangles( vectortoshootpos ); - pitchdelta = 360 - anglestoshootpos[0]; - pitchdelta = angleclamp180( pitchdelta + pitchadd ); - yawdelta = self.angles[1] - anglestoshootpos[1]; - yawdelta = angleclamp180( yawdelta + yawadd ); - } - - if ( domaxanglecheck && ( abs( yawdelta ) > 60 || abs( pitchdelta ) > 60 ) ) - { - yawdelta = 0; - pitchdelta = 0; - } - else - { - if ( yawdelta > self.rightaimlimit ) - yawdelta = self.rightaimlimit; - else if ( yawdelta < self.leftaimlimit ) - yawdelta = self.leftaimlimit; - - if ( pitchdelta > self.upaimlimit ) - pitchdelta = self.upaimlimit; - else if ( pitchdelta < self.downaimlimit ) - pitchdelta = self.downaimlimit; - } - - if ( firstframe ) - firstframe = 0; - else - { - yawdeltachange = yawdelta - prevyawdelta; - - if ( abs( yawdeltachange ) > maxyawdeltachange ) - yawdelta = prevyawdelta + maxyawdeltachange * sign( yawdeltachange ); - - pitchdeltachange = pitchdelta - prevpitchdelta; - - if ( abs( pitchdeltachange ) > maxpitchdeltachange ) - pitchdelta = prevpitchdelta + maxpitchdeltachange * sign( pitchdeltachange ); - } - - prevyawdelta = yawdelta; - prevpitchdelta = pitchdelta; - updown = 0; - leftright = 0; - - if ( yawdelta > 0 ) - { + players = get_players(); + deltachangeperframe = 5; + aimblendtime = 0,05; + prevyawdelta = 0; + prevpitchdelta = 0; + maxyawdeltachange = 5; + maxpitchdeltachange = 5; + pitchadd = 0; + yawadd = 0; + if ( self.type != "dog" || self.type == "zombie" && self.type == "zombie_dog" ) + { + domaxanglecheck = 0; + self.shootent = self.enemy; + } + else + { + domaxanglecheck = 1; + if ( self.a.script == "cover_crouch" && isDefined( self.a.covermode ) && self.a.covermode == "lean" ) + { + pitchadd = -1 * anim.covercrouchleanpitch; + } + if ( self.a.script != "cover_left" && self.a.script == "cover_right" && isDefined( self.a.cornermode ) && self.a.cornermode == "lean" ) + { + yawadd = self.covernode.angles[ 1 ] - self.angles[ 1 ]; + } + } + yawdelta = 0; + pitchdelta = 0; + firstframe = 1; + for ( ;; ) + { + incranimaimweight(); + selfshootatpos = ( self.origin[ 0 ], self.origin[ 1 ], self geteye()[ 2 ] ); + shootpos = undefined; + if ( isDefined( self.enemy ) ) + { + shootpos = self.enemy getshootatpos(); + } + if ( !isDefined( shootpos ) ) + { + yawdelta = 0; + pitchdelta = 0; + } + else + { + vectortoshootpos = shootpos - selfshootatpos; + anglestoshootpos = vectorToAngle( vectortoshootpos ); + pitchdelta = 360 - anglestoshootpos[ 0 ]; + pitchdelta = angleClamp180( pitchdelta + pitchadd ); + yawdelta = self.angles[ 1 ] - anglestoshootpos[ 1 ]; + yawdelta = angleClamp180( yawdelta + yawadd ); + } + if ( domaxanglecheck || abs( yawdelta ) > 60 && abs( pitchdelta ) > 60 ) + { + yawdelta = 0; + pitchdelta = 0; + } + else + { + if ( yawdelta > self.rightaimlimit ) + { + yawdelta = self.rightaimlimit; + } + else + { + if ( yawdelta < self.leftaimlimit ) + { + yawdelta = self.leftaimlimit; + } + } + if ( pitchdelta > self.upaimlimit ) + { + pitchdelta = self.upaimlimit; + break; + } + else + { + if ( pitchdelta < self.downaimlimit ) + { + pitchdelta = self.downaimlimit; + } + } + } + if ( firstframe ) + { + firstframe = 0; + } + else + { + yawdeltachange = yawdelta - prevyawdelta; + if ( abs( yawdeltachange ) > maxyawdeltachange ) + { + yawdelta = prevyawdelta + ( maxyawdeltachange * sign( yawdeltachange ) ); + } + pitchdeltachange = pitchdelta - prevpitchdelta; + if ( abs( pitchdeltachange ) > maxpitchdeltachange ) + { + pitchdelta = prevpitchdelta + ( maxpitchdeltachange * sign( pitchdeltachange ) ); + } + } + prevyawdelta = yawdelta; + prevpitchdelta = pitchdelta; + updown = 0; + leftright = 0; + if ( yawdelta > 0 ) + { /# - assert( yawdelta <= self.rightaimlimit ); + assert( yawdelta <= self.rightaimlimit ); #/ - weight = yawdelta / self.rightaimlimit * self.a.aimweight; - leftright = weight; - } - else if ( yawdelta < 0 ) - { + weight = ( yawdelta / self.rightaimlimit ) * self.a.aimweight; + leftright = weight; + } + else + { + if ( yawdelta < 0 ) + { /# - assert( yawdelta >= self.leftaimlimit ); + assert( yawdelta >= self.leftaimlimit ); #/ - weight = yawdelta / self.leftaimlimit * self.a.aimweight; - leftright = -1 * weight; - } - - if ( pitchdelta > 0 ) - { + weight = ( yawdelta / self.leftaimlimit ) * self.a.aimweight; + leftright = -1 * weight; + } + } + if ( pitchdelta > 0 ) + { /# - assert( pitchdelta <= self.upaimlimit ); + assert( pitchdelta <= self.upaimlimit ); #/ - weight = pitchdelta / self.upaimlimit * self.a.aimweight; - updown = weight; - } - else if ( pitchdelta < 0 ) - { + weight = ( pitchdelta / self.upaimlimit ) * self.a.aimweight; + updown = weight; + } + else + { + if ( pitchdelta < 0 ) + { /# - assert( pitchdelta >= self.downaimlimit ); + assert( pitchdelta >= self.downaimlimit ); #/ - weight = pitchdelta / self.downaimlimit * self.a.aimweight; - updown = -1 * weight; - } - - self setaimanimweights( updown, leftright ); - wait 0.05; - } + weight = ( pitchdelta / self.downaimlimit ) * self.a.aimweight; + updown = -1 * weight; + } + } + self setaimanimweights( updown, leftright ); + wait 0,05; + } } setanimaimweight( goalweight, goaltime ) { - if ( !isdefined( goaltime ) || goaltime <= 0 ) - { - self.a.aimweight = goalweight; - self.a.aimweight_start = goalweight; - self.a.aimweight_end = goalweight; - self.a.aimweight_transframes = 0; - } - else - { - self.a.aimweight = goalweight; - self.a.aimweight_start = self.a.aimweight; - self.a.aimweight_end = goalweight; - self.a.aimweight_transframes = int( goaltime * 20 ); - } - - self.a.aimweight_t = 0; + if ( !isDefined( goaltime ) || goaltime <= 0 ) + { + self.a.aimweight = goalweight; + self.a.aimweight_start = goalweight; + self.a.aimweight_end = goalweight; + self.a.aimweight_transframes = 0; + } + else + { + self.a.aimweight = goalweight; + self.a.aimweight_start = self.a.aimweight; + self.a.aimweight_end = goalweight; + self.a.aimweight_transframes = int( goaltime * 20 ); + } + self.a.aimweight_t = 0; } incranimaimweight() { - if ( self.a.aimweight_t < self.a.aimweight_transframes ) - { - self.a.aimweight_t++; - t = 1.0 * self.a.aimweight_t / self.a.aimweight_transframes; - self.a.aimweight = self.a.aimweight_start * ( 1 - t ) + self.a.aimweight_end * t; - } + if ( self.a.aimweight_t < self.a.aimweight_transframes ) + { + self.a.aimweight_t++; + t = ( 1 * self.a.aimweight_t ) / self.a.aimweight_transframes; + self.a.aimweight = ( self.a.aimweight_start * ( 1 - t ) ) + ( self.a.aimweight_end * t ); + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/traverse/shared.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/traverse/shared.gsc index 279b040..cbd7fe5 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/traverse/shared.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/traverse/shared.gsc @@ -1,207 +1,227 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; +#include common_scripts/utility; +#include maps/mp/_utility; +#include maps/mp/animscripts/utility; init_traverse() { - point = getent( self.target, "targetname" ); - - if ( isdefined( point ) ) - { - self.traverse_height = point.origin[2]; - point delete(); - } - else - { - point = getstruct( self.target, "targetname" ); - - if ( isdefined( point ) ) - self.traverse_height = point.origin[2]; - } + point = getent( self.target, "targetname" ); + if ( isDefined( point ) ) + { + self.traverse_height = point.origin[ 2 ]; + point delete(); + } + else + { + point = getstruct( self.target, "targetname" ); + if ( isDefined( point ) ) + { + self.traverse_height = point.origin[ 2 ]; + } + } } teleportthread( verticaloffset ) { - self endon( "killanimscript" ); - self notify( "endTeleportThread" ); - self endon( "endTeleportThread" ); - reps = 5; - offset = ( 0, 0, verticaloffset / reps ); - - for ( i = 0; i < reps; i++ ) - { - self teleport( self.origin + offset ); - wait 0.05; - } + self endon( "killanimscript" ); + self notify( "endTeleportThread" ); + self endon( "endTeleportThread" ); + reps = 5; + offset = ( 0, 0, verticaloffset / reps ); + i = 0; + while ( i < reps ) + { + self teleport( self.origin + offset ); + wait 0,05; + i++; + } } teleportthreadex( verticaloffset, delay, frames ) { - self endon( "killanimscript" ); - self notify( "endTeleportThread" ); - self endon( "endTeleportThread" ); - - if ( verticaloffset == 0 ) - return; - - wait( delay ); - amount = verticaloffset / frames; - - if ( amount > 10.0 ) - amount = 10.0; - else if ( amount < -10.0 ) - amount = -10.0; - - offset = ( 0, 0, amount ); - - for ( i = 0; i < frames; i++ ) - { - self teleport( self.origin + offset ); - wait 0.05; - } + self endon( "killanimscript" ); + self notify( "endTeleportThread" ); + self endon( "endTeleportThread" ); + if ( verticaloffset == 0 ) + { + return; + } + wait delay; + amount = verticaloffset / frames; + if ( amount > 10 ) + { + amount = 10; + } + else + { + if ( amount < -10 ) + { + amount = -10; + } + } + offset = ( 0, 0, amount ); + i = 0; + while ( i < frames ) + { + self teleport( self.origin + offset ); + wait 0,05; + i++; + } } dog_wall_and_window_hop( traversename, height ) { - self endon( "killanimscript" ); - self traversemode( "nogravity" ); - self traversemode( "noclip" ); - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "nogravity" ); + self traversemode( "noclip" ); + startnode = self getnegotiationstartnode(); /# - assert( isdefined( startnode ) ); + assert( isDefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[1] ); - - if ( isdefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[2]; - self thread teleportthread( realheight - height ); - } - else if ( height != 36.0 ) - self thread teleportthreadex( height - 36.0, 0.2, 7 ); - - debug_anim_print( "traverse::dog_wall_and_window_hop() - Setting " + traversename ); - self setanimstate( traversename ); - maps\mp\animscripts\shared::donotetracksfortime( 1.0, "done" ); - debug_anim_print( "traverse::dog_wall_and_window_hop() - " + traversename ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[ 1 ] ); + if ( isDefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[ 2 ]; + self thread teleportthread( realheight - height ); + } + else + { + if ( height != 36 ) + { + self thread teleportthreadex( height - 36, 0,2, 7 ); + } + } + debug_anim_print( "traverse::dog_wall_and_window_hop() - Setting " + traversename ); + self setanimstate( traversename ); + maps/mp/animscripts/shared::donotetracksfortime( 1, "done" ); + debug_anim_print( "traverse::dog_wall_and_window_hop() - " + traversename ); + self.traversecomplete = 1; } dog_jump_down( height, frames, time ) { - self endon( "killanimscript" ); - self traversemode( "noclip" ); - - if ( !isdefined( time ) ) - time = 0.3; - - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "noclip" ); + if ( !isDefined( time ) ) + { + time = 0,3; + } + startnode = self getnegotiationstartnode(); /# - assert( isdefined( startnode ) ); + assert( isDefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[1] ); - - if ( isdefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[2]; - self thread teleportthread( realheight - height ); - } - else if ( height != 40.0 ) - self thread teleportthreadex( height - 40.0, 0.1, frames ); - - debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_40" ); - self setanimstate( "traverse_jump_down_40" ); - maps\mp\animscripts\shared::donotetracksfortime( time, "done" ); - debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_40 " ); - self traversemode( "gravity" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[ 1 ] ); + if ( isDefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[ 2 ]; + self thread teleportthread( realheight - height ); + } + else + { + if ( height != 40 ) + { + self thread teleportthreadex( height - 40, 0,1, frames ); + } + } + debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_40" ); + self setanimstate( "traverse_jump_down_40" ); + maps/mp/animscripts/shared::donotetracksfortime( time, "done" ); + debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_40 " ); + self traversemode( "gravity" ); + self.traversecomplete = 1; } dog_jump_down_far( height, frames, time ) { - self endon( "killanimscript" ); - self traversemode( "noclip" ); - - if ( !isdefined( time ) ) - time = 0.3; - - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "noclip" ); + if ( !isDefined( time ) ) + { + time = 0,3; + } + startnode = self getnegotiationstartnode(); /# - assert( isdefined( startnode ) ); + assert( isDefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[1] ); - - if ( isdefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[2]; - self thread teleportthread( realheight - height ); - } - else if ( height != 80.0 ) - self thread teleportthreadex( 80.0 - height, 0.1, frames ); - - debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_80" ); - self setanimstate( "traverse_jump_down_80" ); - maps\mp\animscripts\shared::donotetracksfortime( time, "done" ); - debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_80 " ); - self traversemode( "gravity" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[ 1 ] ); + if ( isDefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[ 2 ]; + self thread teleportthread( realheight - height ); + } + else + { + if ( height != 80 ) + { + self thread teleportthreadex( 80 - height, 0,1, frames ); + } + } + debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_80" ); + self setanimstate( "traverse_jump_down_80" ); + maps/mp/animscripts/shared::donotetracksfortime( time, "done" ); + debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_80 " ); + self traversemode( "gravity" ); + self.traversecomplete = 1; } dog_jump_up( height, frames ) { - self endon( "killanimscript" ); - self traversemode( "noclip" ); - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "noclip" ); + startnode = self getnegotiationstartnode(); /# - assert( isdefined( startnode ) ); + assert( isDefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[1] ); - - if ( isdefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[2]; - self thread teleportthread( realheight - height ); - } - else if ( height != 40.0 ) - self thread teleportthreadex( height - 40.0, 0.2, frames ); - - debug_anim_print( "traverse::dog_jump_up() - Setting traverse_jump_up_40" ); - self setanimstate( "traverse_jump_up_40" ); - maps\mp\animscripts\shared::donotetracksfortime( 0.5, "done" ); - debug_anim_print( "traverse::dog_jump_up() - traverse_jump_up_40 " ); - self traversemode( "gravity" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[ 1 ] ); + if ( isDefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[ 2 ]; + self thread teleportthread( realheight - height ); + } + else + { + if ( height != 40 ) + { + self thread teleportthreadex( height - 40, 0,2, frames ); + } + } + debug_anim_print( "traverse::dog_jump_up() - Setting traverse_jump_up_40" ); + self setanimstate( "traverse_jump_up_40" ); + maps/mp/animscripts/shared::donotetracksfortime( 0,5, "done" ); + debug_anim_print( "traverse::dog_jump_up() - traverse_jump_up_40 " ); + self traversemode( "gravity" ); + self.traversecomplete = 1; } dog_jump_up_high( height, frames ) { /# - assert( self.type == "dog", "Only dogs can do this traverse currently." ); + assert( self.type == "dog", "Only dogs can do this traverse currently." ); #/ - self endon( "killanimscript" ); - self traversemode( "nogravity" ); - self traversemode( "noclip" ); - startnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "nogravity" ); + self traversemode( "noclip" ); + startnode = self getnegotiationstartnode(); /# - assert( isdefined( startnode ) ); + assert( isDefined( startnode ) ); #/ - self orientmode( "face angle", startnode.angles[1] ); - - if ( isdefined( startnode.traverse_height ) ) - { - realheight = startnode.traverse_height - startnode.origin[2]; - self thread teleportthreadex( height - 80, 0.2, frames ); - } - else if ( height != 80.0 ) - self thread teleportthreadex( height - 80.0, 0.2, frames ); - - debug_anim_print( "traverse::dog_jump_up_80() - Setting traverse_jump_up_80" ); - self setanimstate( "traverse_jump_up_80" ); - maps\mp\animscripts\shared::donotetracksfortime( 0.6, "done" ); - debug_anim_print( "traverse::dog_jump_up_80() - traverse_jump_up_80 " ); - self traversemode( "gravity" ); - self.traversecomplete = 1; + self orientmode( "face angle", startnode.angles[ 1 ] ); + if ( isDefined( startnode.traverse_height ) ) + { + realheight = startnode.traverse_height - startnode.origin[ 2 ]; + self thread teleportthreadex( height - 80, 0,2, frames ); + } + else + { + if ( height != 80 ) + { + self thread teleportthreadex( height - 80, 0,2, frames ); + } + } + debug_anim_print( "traverse::dog_jump_up_80() - Setting traverse_jump_up_80" ); + self setanimstate( "traverse_jump_up_80" ); + maps/mp/animscripts/shared::donotetracksfortime( 0,6, "done" ); + debug_anim_print( "traverse::dog_jump_up_80() - traverse_jump_up_80 " ); + self traversemode( "gravity" ); + self.traversecomplete = 1; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_mantle_over_40.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_mantle_over_40.gsc index 3a37df9..2e00566 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_mantle_over_40.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_mantle_over_40.gsc @@ -1,49 +1,44 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\traverse\shared; -#include maps\mp\animscripts\traverse\zm_shared; +#include maps/mp/animscripts/traverse/zm_shared; +#include maps/mp/animscripts/traverse/shared; main() { - traversestate = "zm_traverse_barrier"; - traversealias = "barrier_walk"; - - if ( self.has_legs ) - { - switch ( self.zombie_move_speed ) - { - case "walk_slide": - case "walk": - case "low_gravity_walk": - traversealias = "barrier_walk"; - break; - case "run_slide": - case "run": - case "low_gravity_run": - traversealias = "barrier_run"; - break; - case "super_sprint": - case "sprint_slide": - case "sprint": - case "low_gravity_sprint": - traversealias = "barrier_sprint"; - break; - default: - if ( isdefined( level.zm_mantle_over_40_move_speed_override ) ) - traversealias = self [[ level.zm_mantle_over_40_move_speed_override ]](); - else - { -/# - assertmsg( "Zombie '" + self.classname + "' move speed of '" + self.zombie_move_speed + "' is not supported for mantle_over_40." ); + traversestate = "zm_traverse_barrier"; + traversealias = "barrier_walk"; + if ( self.has_legs ) + { + switch( self.zombie_move_speed ) + { + case "low_gravity_walk": + case "walk": + case "walk_slide": + traversealias = "barrier_walk"; + break; + case "low_gravity_run": + case "run": + case "run_slide": + traversealias = "barrier_run"; + break; + case "low_gravity_sprint": + case "sprint": + case "sprint_slide": + case "super_sprint": + traversealias = "barrier_sprint"; + break; + default: + if ( isDefined( level.zm_mantle_over_40_move_speed_override ) ) + { + traversealias = self [[ level.zm_mantle_over_40_move_speed_override ]](); + } + else /# + assertmsg( "Zombie '" + self.classname + "' move speed of '" + self.zombie_move_speed + "' is not supported for mantle_over_40." ); #/ - } - } - } - else - { - traversestate = "zm_traverse_barrier_crawl"; - traversealias = "barrier_crawl"; - } - - self dotraverse( traversestate, traversealias ); + } + } + else + { + traversestate = "zm_traverse_barrier_crawl"; + traversealias = "barrier_crawl"; + } + self dotraverse( traversestate, traversealias ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_shared.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_shared.gsc index e1385ca..b1f767c 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_shared.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/traverse/zm_shared.gsc @@ -1,146 +1,151 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\animscripts\zm_shared; -#include maps\mp\animscripts\zm_run; +#include maps/mp/animscripts/zm_run; +#include maps/mp/animscripts/zm_shared; +#include common_scripts/utility; +#include maps/mp/_utility; +#include maps/mp/animscripts/utility; init_traverse() { - point = getent( self.target, "targetname" ); - - if ( isdefined( point ) ) - { - self.traverse_height = point.origin[2]; - point delete(); - } - else - { - point = getstruct( self.target, "targetname" ); - - if ( isdefined( point ) ) - self.traverse_height = point.origin[2]; - } + point = getent( self.target, "targetname" ); + if ( isDefined( point ) ) + { + self.traverse_height = point.origin[ 2 ]; + point delete(); + } + else + { + point = getstruct( self.target, "targetname" ); + if ( isDefined( point ) ) + { + self.traverse_height = point.origin[ 2 ]; + } + } } teleportthread( verticaloffset ) { - self endon( "killanimscript" ); - self notify( "endTeleportThread" ); - self endon( "endTeleportThread" ); - reps = 5; - offset = ( 0, 0, verticaloffset / reps ); - - for ( i = 0; i < reps; i++ ) - { - self teleport( self.origin + offset ); - wait 0.05; - } + self endon( "killanimscript" ); + self notify( "endTeleportThread" ); + self endon( "endTeleportThread" ); + reps = 5; + offset = ( 0, 0, verticaloffset / reps ); + i = 0; + while ( i < reps ) + { + self teleport( self.origin + offset ); + wait 0,05; + i++; + } } teleportthreadex( verticaloffset, delay, frames ) { - self endon( "killanimscript" ); - self notify( "endTeleportThread" ); - self endon( "endTeleportThread" ); - - if ( verticaloffset == 0 ) - return; - - wait( delay ); - amount = verticaloffset / frames; - - if ( amount > 10.0 ) - amount = 10.0; - else if ( amount < -10.0 ) - amount = -10.0; - - offset = ( 0, 0, amount ); - - for ( i = 0; i < frames; i++ ) - { - self teleport( self.origin + offset ); - wait 0.05; - } + self endon( "killanimscript" ); + self notify( "endTeleportThread" ); + self endon( "endTeleportThread" ); + if ( verticaloffset == 0 ) + { + return; + } + wait delay; + amount = verticaloffset / frames; + if ( amount > 10 ) + { + amount = 10; + } + else + { + if ( amount < -10 ) + { + amount = -10; + } + } + offset = ( 0, 0, amount ); + i = 0; + while ( i < frames ) + { + self teleport( self.origin + offset ); + wait 0,05; + i++; + } } handletraversealignment() { - self traversemode( "nogravity" ); - self traversemode( "noclip" ); - - if ( isdefined( self.traverseheight ) && isdefined( self.traversestartnode.traverse_height ) ) - { - currentheight = self.traversestartnode.traverse_height - self.traversestartz; - self thread teleportthread( currentheight - self.traverseheight ); - } + self traversemode( "nogravity" ); + self traversemode( "noclip" ); + if ( isDefined( self.traverseheight ) && isDefined( self.traversestartnode.traverse_height ) ) + { + currentheight = self.traversestartnode.traverse_height - self.traversestartz; + self thread teleportthread( currentheight - self.traverseheight ); + } } dosimpletraverse( traversealias, no_powerups, traversestate ) { - if ( !isdefined( traversestate ) ) - traversestate = "zm_traverse"; - - if ( isdefined( level.ignore_traverse ) ) - { - if ( self [[ level.ignore_traverse ]]() ) - return; - } - - if ( isdefined( level.zm_traversal_override ) ) - traversealias = self [[ level.zm_traversal_override ]]( traversealias ); - - if ( !self.has_legs ) - { - traversestate += "_crawl"; - traversealias += "_crawl"; - } - - self dotraverse( traversestate, traversealias, no_powerups ); + if ( !isDefined( traversestate ) ) + { + traversestate = "zm_traverse"; + } + if ( isDefined( level.ignore_traverse ) ) + { + if ( self [[ level.ignore_traverse ]]() ) + { + return; + } + } + if ( isDefined( level.zm_traversal_override ) ) + { + traversealias = self [[ level.zm_traversal_override ]]( traversealias ); + } + if ( !self.has_legs ) + { + traversestate += "_crawl"; + traversealias += "_crawl"; + } + self dotraverse( traversestate, traversealias, no_powerups ); } dotraverse( traversestate, traversealias, no_powerups ) { - self endon( "killanimscript" ); - self traversemode( "nogravity" ); - self traversemode( "noclip" ); - old_powerups = 0; - - if ( isdefined( no_powerups ) && no_powerups ) - { - old_powerups = self.no_powerups; - self.no_powerups = 1; - } - - self.is_traversing = 1; - self notify( "zombie_start_traverse" ); - self.traversestartnode = self getnegotiationstartnode(); + self endon( "killanimscript" ); + self traversemode( "nogravity" ); + self traversemode( "noclip" ); + old_powerups = 0; + if ( isDefined( no_powerups ) && no_powerups ) + { + old_powerups = self.no_powerups; + self.no_powerups = 1; + } + self.is_traversing = 1; + self notify( "zombie_start_traverse" ); + self.traversestartnode = self getnegotiationstartnode(); /# - assert( isdefined( self.traversestartnode ) ); + assert( isDefined( self.traversestartnode ) ); #/ - self orientmode( "face angle", self.traversestartnode.angles[1] ); - self.traversestartz = self.origin[2]; - - if ( isdefined( self.pre_traverse ) ) - self [[ self.pre_traverse ]](); - - self setanimstatefromasd( traversestate, traversealias ); - self maps\mp\animscripts\zm_shared::donotetracks( "traverse_anim" ); - self traversemode( "gravity" ); - self.a.nodeath = 0; - - if ( isdefined( self.post_traverse ) ) - self [[ self.post_traverse ]](); - - self maps\mp\animscripts\zm_run::needsupdate(); - - if ( !self.isdog ) - self maps\mp\animscripts\zm_run::moverun(); - - self.is_traversing = 0; - self notify( "zombie_end_traverse" ); - - if ( isdefined( no_powerups ) && no_powerups ) - self.no_powerups = old_powerups; + self orientmode( "face angle", self.traversestartnode.angles[ 1 ] ); + self.traversestartz = self.origin[ 2 ]; + if ( isDefined( self.pre_traverse ) ) + { + self [[ self.pre_traverse ]](); + } + self setanimstatefromasd( traversestate, traversealias ); + self maps/mp/animscripts/zm_shared::donotetracks( "traverse_anim" ); + self traversemode( "gravity" ); + self.a.nodeath = 0; + if ( isDefined( self.post_traverse ) ) + { + self [[ self.post_traverse ]](); + } + self maps/mp/animscripts/zm_run::needsupdate(); + if ( !self.isdog ) + { + self maps/mp/animscripts/zm_run::moverun(); + } + self.is_traversing = 0; + self notify( "zombie_end_traverse" ); + if ( isDefined( no_powerups ) && no_powerups ) + { + self.no_powerups = old_powerups; + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/utility.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/utility.gsc index 66154d0..6b325aa 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/utility.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/utility.gsc @@ -1,138 +1,166 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool anim_get_dvar_int( dvar, def ) { - return int( anim_get_dvar( dvar, def ) ); + return int( anim_get_dvar( dvar, def ) ); } anim_get_dvar( dvar, def ) { - if ( getdvar( dvar ) != "" ) - return getdvarfloat( dvar ); - else - { - setdvar( dvar, def ); - return def; - } + if ( getDvar( dvar ) != "" ) + { + return getDvarFloat( dvar ); + } + else + { + setdvar( dvar, def ); + return def; + } } set_orient_mode( mode, val1 ) { /# - if ( level.dog_debug_orient == self getentnum() ) - { - if ( isdefined( val1 ) ) - println( "DOG: Setting orient mode: " + mode + " " + val1 + " " + gettime() ); - else - println( "DOG: Setting orient mode: " + mode + " " + gettime() ); - } + if ( level.dog_debug_orient == self getentnum() ) + { + if ( isDefined( val1 ) ) + { + println( "DOG: Setting orient mode: " + mode + " " + val1 + " " + getTime() ); + } + else + { + println( "DOG: Setting orient mode: " + mode + " " + getTime() ); #/ - if ( isdefined( val1 ) ) - self orientmode( mode, val1 ); - else - self orientmode( mode ); + } + } + if ( isDefined( val1 ) ) + { + self orientmode( mode, val1 ); + } + else + { + self orientmode( mode ); + } } debug_anim_print( text ) { /# - if ( level.dog_debug_anims ) - println( text + " " + gettime() ); - - if ( level.dog_debug_anims_ent == self getentnum() ) - println( text + " " + gettime() ); + if ( level.dog_debug_anims ) + { + println( ( text + " " ) + getTime() ); + } + if ( level.dog_debug_anims_ent == self getentnum() ) + { + println( ( text + " " ) + getTime() ); #/ + } } debug_turn_print( text, line ) { /# - if ( level.dog_debug_turns == self getentnum() ) - { - duration = 200; - currentyawcolor = ( 1, 1, 1 ); - lookaheadyawcolor = ( 1, 0, 0 ); - desiredyawcolor = ( 1, 1, 0 ); - currentyaw = angleclamp180( self.angles[1] ); - desiredyaw = angleclamp180( self.desiredangle ); - lookaheaddir = self.lookaheaddir; - lookaheadangles = vectortoangles( lookaheaddir ); - lookaheadyaw = angleclamp180( lookaheadangles[1] ); - println( text + " " + gettime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw ); - } + if ( level.dog_debug_turns == self getentnum() ) + { + duration = 200; + currentyawcolor = ( 1, 0, 1 ); + lookaheadyawcolor = ( 1, 0, 1 ); + desiredyawcolor = ( 1, 0, 1 ); + currentyaw = angleClamp180( self.angles[ 1 ] ); + desiredyaw = angleClamp180( self.desiredangle ); + lookaheaddir = self.lookaheaddir; + lookaheadangles = vectorToAngle( lookaheaddir ); + lookaheadyaw = angleClamp180( lookaheadangles[ 1 ] ); + println( ( text + " " ) + getTime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw ); #/ + } } debug_allow_movement() { /# - return anim_get_dvar_int( "debug_dog_allow_movement", "1" ); + return anim_get_dvar_int( "debug_dog_allow_movement", "1" ); #/ - return 1; + return 1; } debug_allow_combat() { /# - return anim_get_dvar_int( "debug_dog_allow_combat", "1" ); + return anim_get_dvar_int( "debug_dog_allow_combat", "1" ); #/ - return 1; + return 1; } current_yaw_line_debug( duration ) { /# - currentyawcolor = []; - currentyawcolor[0] = ( 0, 0, 1 ); - currentyawcolor[1] = ( 1, 0, 1 ); - current_color_index = 0; - start_time = gettime(); - - if ( !isdefined( level.lastdebugheight ) ) - level.lastdebugheight = 15; - - while ( gettime() - start_time < 1000 ) - { - pos1 = ( self.origin[0], self.origin[1], self.origin[2] + level.lastdebugheight ); - pos2 = pos1 + vectorscale( anglestoforward( self.angles ), ( current_color_index + 1 ) * 10 ); - line( pos1, pos2, currentyawcolor[current_color_index], 0.3, 1, duration ); - current_color_index = ( current_color_index + 1 ) % currentyawcolor.size; - wait 0.05; - } - - if ( level.lastdebugheight == 15 ) - level.lastdebugheight = 30; - else - level.lastdebugheight = 15; + currentyawcolor = []; + currentyawcolor[ 0 ] = ( 1, 0, 1 ); + currentyawcolor[ 1 ] = ( 1, 0, 1 ); + current_color_index = 0; + start_time = getTime(); + if ( !isDefined( level.lastdebugheight ) ) + { + level.lastdebugheight = 15; + } + while ( ( getTime() - start_time ) < 1000 ) + { + pos1 = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + level.lastdebugheight ); + pos2 = pos1 + vectorScale( anglesToForward( self.angles ), ( current_color_index + 1 ) * 10 ); + line( pos1, pos2, currentyawcolor[ current_color_index ], 0,3, 1, duration ); + current_color_index = ( current_color_index + 1 ) % currentyawcolor.size; + wait 0,05; + } + if ( level.lastdebugheight == 15 ) + { + level.lastdebugheight = 30; + } + else + { + level.lastdebugheight = 15; #/ + } } getanimdirection( damageyaw ) { - if ( damageyaw > 135 || damageyaw <= -135 ) - return "front"; - else if ( damageyaw > 45 && damageyaw <= 135 ) - return "right"; - else if ( damageyaw > -45 && damageyaw <= 45 ) - return "back"; - else - return "left"; - - return "front"; + if ( damageyaw > 135 || damageyaw <= -135 ) + { + return "front"; + } + else + { + if ( damageyaw > 45 && damageyaw <= 135 ) + { + return "right"; + } + else + { + if ( damageyaw > -45 && damageyaw <= 45 ) + { + return "back"; + } + else + { + return "left"; + } + } + } + return "front"; } setfootstepeffect( name, fx ) { /# - assert( isdefined( name ), "Need to define the footstep surface type." ); + assert( isDefined( name ), "Need to define the footstep surface type." ); #/ /# - assert( isdefined( fx ), "Need to define the mud footstep effect." ); + assert( isDefined( fx ), "Need to define the mud footstep effect." ); #/ - if ( !isdefined( anim.optionalstepeffects ) ) - anim.optionalstepeffects = []; - - anim.optionalstepeffects[anim.optionalstepeffects.size] = name; - level._effect["step_" + name] = fx; + if ( !isDefined( anim.optionalstepeffects ) ) + { + anim.optionalstepeffects = []; + } + anim.optionalstepeffects[ anim.optionalstepeffects.size ] = name; + level._effect[ "step_" + name ] = fx; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_combat.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_combat.gsc index b1c5934..3b06ef3 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_combat.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_combat.gsc @@ -1,64 +1,71 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\animscripts\zm_melee; +#include maps/mp/animscripts/zm_melee; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; +#include common_scripts/utility; main() { - self endon( "killanimscript" ); - self endon( "melee" ); - maps\mp\animscripts\zm_utility::initialize( "zombie_combat" ); - self animmode( "zonly_physics", 0 ); - - if ( isdefined( self.combat_animmode ) ) - self [[ self.combat_animmode ]](); - - self orientmode( "face angle", self.angles[1] ); - - for (;;) - { - if ( trymelee() ) - return; - - exposedwait(); - } + self endon( "killanimscript" ); + self endon( "melee" ); + maps/mp/animscripts/zm_utility::initialize( "zombie_combat" ); + self animmode( "zonly_physics", 0 ); + if ( isDefined( self.combat_animmode ) ) + { + self [[ self.combat_animmode ]](); + } + self orientmode( "face angle", self.angles[ 1 ] ); + for ( ;; ) + { + if ( trymelee() ) + { + return; + } + exposedwait(); + } } exposedwait() { - if ( !isdefined( self.can_always_see ) && ( !isdefined( self.enemy ) || !self cansee( self.enemy ) ) ) - { - self endon( "enemy" ); - wait( 0.2 + randomfloat( 0.1 ) ); - } - else if ( !isdefined( self.enemy ) ) - { - self endon( "enemy" ); - wait( 0.2 + randomfloat( 0.1 ) ); - } - else - wait 0.05; + if ( !isDefined( self.can_always_see ) || !isDefined( self.enemy ) && !self cansee( self.enemy ) ) + { + self endon( "enemy" ); + wait ( 0,2 + randomfloat( 0,1 ) ); + } + else + { + if ( !isDefined( self.enemy ) ) + { + self endon( "enemy" ); + wait ( 0,2 + randomfloat( 0,1 ) ); + return; + } + else + { + wait 0,05; + } + } } trymelee() { - if ( isdefined( self.cant_melee ) && self.cant_melee ) - return false; - - if ( !isdefined( self.enemy ) ) - return false; - - if ( distancesquared( self.origin, self.enemy.origin ) > 262144 ) - return false; - - canmelee = maps\mp\animscripts\zm_melee::canmeleedesperate(); - - if ( !canmelee ) - return false; - - self thread maps\mp\animscripts\zm_melee::meleecombat(); - return true; + if ( isDefined( self.cant_melee ) && self.cant_melee ) + { + return 0; + } + if ( !isDefined( self.enemy ) ) + { + return 0; + } + if ( distancesquared( self.origin, self.enemy.origin ) > 262144 ) + { + return 0; + } + canmelee = maps/mp/animscripts/zm_melee::canmeleedesperate(); + if ( !canmelee ) + { + return 0; + } + self thread maps/mp/animscripts/zm_melee::meleecombat(); + return 1; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_death.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_death.gsc index 60a66b7..2c5fcc0 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_death.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_death.gsc @@ -1,408 +1,439 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\_utility; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/_utility; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; +#include common_scripts/utility; main() { - debug_anim_print( "zm_death::main()" ); - self setaimanimweights( 0, 0 ); - self endon( "killanimscript" ); - - if ( isdefined( self.deathfunction ) ) - { - successful_death = self [[ self.deathfunction ]](); - - if ( !isdefined( successful_death ) || successful_death ) - return; - } - - if ( isdefined( self.a.nodeath ) && self.a.nodeath == 1 ) - { + debug_anim_print( "zm_death::main()" ); + self setaimanimweights( 0, 0 ); + self endon( "killanimscript" ); + if ( isDefined( self.deathfunction ) ) + { + successful_death = self [[ self.deathfunction ]](); + if ( !isDefined( successful_death ) || successful_death ) + { + return; + } + } + if ( isDefined( self.a.nodeath ) && self.a.nodeath == 1 ) + { /# - assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." ); + assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." ); #/ - wait 3; - return; - } - - self unlink(); - - if ( isdefined( self.anchor ) ) - self.anchor delete(); - - if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) - self.enemy.syncedmeleetarget = undefined; - - self thread do_gib(); - - if ( isdefined( self.a.gib_ref ) && ( self.a.gib_ref == "no_legs" || self.a.gib_ref == "right_leg" || self.a.gib_ref == "left_leg" ) ) - self.has_legs = 0; - - if ( !isdefined( self.deathanim ) ) - { - self.deathanim = "zm_death"; - self.deathanim_substate = undefined; - } - - self.deathanim = append_missing_legs_suffix( self.deathanim ); - self animmode( "gravity" ); - self setanimstatefromasd( self.deathanim, self.deathanim_substate ); - - if ( !self getanimhasnotetrackfromasd( "start_ragdoll" ) ) - self thread waitforragdoll( self getanimlengthfromasd() * 0.35 ); - - if ( isdefined( self.skip_death_notetracks ) && self.skip_death_notetracks ) - self waittillmatch( "death_anim", "end" ); - else - self maps\mp\animscripts\zm_shared::donotetracks( "death_anim", self.handle_death_notetracks ); + wait 3; + return; + } + self unlink(); + if ( isDefined( self.anchor ) ) + { + self.anchor delete(); + } + if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) + { + self.enemy.syncedmeleetarget = undefined; + } + self thread do_gib(); + if ( isDefined( self.a.gib_ref ) && self.a.gib_ref != "no_legs" || self.a.gib_ref == "right_leg" && self.a.gib_ref == "left_leg" ) + { + self.has_legs = 0; + } + if ( !isDefined( self.deathanim ) ) + { + self.deathanim = "zm_death"; + self.deathanim_substate = undefined; + } + self.deathanim = append_missing_legs_suffix( self.deathanim ); + self animmode( "gravity" ); + self setanimstatefromasd( self.deathanim, self.deathanim_substate ); + if ( !self getanimhasnotetrackfromasd( "start_ragdoll" ) ) + { + self thread waitforragdoll( self getanimlengthfromasd() * 0,35 ); + } + if ( isDefined( self.skip_death_notetracks ) && self.skip_death_notetracks ) + { + self waittillmatch( "death_anim" ); + return "end"; + } + else + { + self maps/mp/animscripts/zm_shared::donotetracks( "death_anim", self.handle_death_notetracks ); + } } waitforragdoll( time ) { - wait( time ); - do_ragdoll = 1; - - if ( isdefined( self.nodeathragdoll ) && self.nodeathragdoll ) - do_ragdoll = 0; - - if ( isdefined( self ) && do_ragdoll ) - self startragdoll(); + wait time; + do_ragdoll = 1; + if ( isDefined( self.nodeathragdoll ) && self.nodeathragdoll ) + { + do_ragdoll = 0; + } + if ( isDefined( self ) && do_ragdoll ) + { + self startragdoll(); + } } on_fire_timeout() { - self endon( "death" ); - wait 12; - - if ( isdefined( self ) && isalive( self ) ) - { - self.is_on_fire = 0; - self notify( "stop_flame_damage" ); - } + self endon( "death" ); + wait 12; + if ( isDefined( self ) && isalive( self ) ) + { + self.is_on_fire = 0; + self notify( "stop_flame_damage" ); + } } flame_death_fx() { - self endon( "death" ); - - if ( isdefined( self.is_on_fire ) && self.is_on_fire ) - return; - - self.is_on_fire = 1; - self thread on_fire_timeout(); - - if ( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_torso"] ) ) - { - if ( !self.isdog ) - playfxontag( level._effect["character_fire_death_torso"], self, "J_SpineLower" ); - } - else - { + self endon( "death" ); + if ( isDefined( self.is_on_fire ) && self.is_on_fire ) + { + return; + } + self.is_on_fire = 1; + self thread on_fire_timeout(); + if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_torso" ] ) ) + { + if ( !self.isdog ) + { + playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_SpineLower" ); + } + } + else + { /# - println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_fire_death_torso\"], please set it in your levelname_fx.gsc. Use \"env/fire/fx_fire_player_torso\"" ); + println( "^3ANIMSCRIPT WARNING: You are missing level._effect["character_fire_death_torso"], please set it in your levelname_fx.gsc. Use "env/fire/fx_fire_player_torso"" ); #/ - } - - if ( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_sm"] ) ) - { - wait 1; - tagarray = []; - tagarray[0] = "J_Elbow_LE"; - tagarray[1] = "J_Elbow_RI"; - tagarray[2] = "J_Knee_RI"; - tagarray[3] = "J_Knee_LE"; - tagarray = randomize_array( tagarray ); - playfxontag( level._effect["character_fire_death_sm"], self, tagarray[0] ); - wait 1; - tagarray[0] = "J_Wrist_RI"; - tagarray[1] = "J_Wrist_LE"; - - if ( !isdefined( self.a ) || !isdefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" ) - { - tagarray[2] = "J_Ankle_RI"; - tagarray[3] = "J_Ankle_LE"; - } - - tagarray = randomize_array( tagarray ); - playfxontag( level._effect["character_fire_death_sm"], self, tagarray[0] ); - playfxontag( level._effect["character_fire_death_sm"], self, tagarray[1] ); - } - else - { + } + if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_sm" ] ) ) + { + wait 1; + tagarray = []; + tagarray[ 0 ] = "J_Elbow_LE"; + tagarray[ 1 ] = "J_Elbow_RI"; + tagarray[ 2 ] = "J_Knee_RI"; + tagarray[ 3 ] = "J_Knee_LE"; + tagarray = randomize_array( tagarray ); + playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] ); + wait 1; + tagarray[ 0 ] = "J_Wrist_RI"; + tagarray[ 1 ] = "J_Wrist_LE"; + if ( isDefined( self.a ) || !isDefined( self.a.gib_ref ) && self.a.gib_ref != "no_legs" ) + { + tagarray[ 2 ] = "J_Ankle_RI"; + tagarray[ 3 ] = "J_Ankle_LE"; + } + tagarray = randomize_array( tagarray ); + playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] ); + playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 1 ] ); + } + else + { /# - println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_fire_death_sm\"], please set it in your levelname_fx.gsc. Use \"env/fire/fx_fire_zombie_md\"" ); + println( "^3ANIMSCRIPT WARNING: You are missing level._effect["character_fire_death_sm"], please set it in your levelname_fx.gsc. Use "env/fire/fx_fire_zombie_md"" ); #/ - } + } } randomize_array( array ) { - for ( i = 0; i < array.size; i++ ) - { - j = randomint( array.size ); - temp = array[i]; - array[i] = array[j]; - array[j] = temp; - } - - return array; + i = 0; + while ( i < array.size ) + { + j = randomint( array.size ); + temp = array[ i ]; + array[ i ] = array[ j ]; + array[ j ] = temp; + i++; + } + return array; } get_tag_for_damage_location() { - tag = "J_SpineLower"; - - if ( self.damagelocation == "helmet" ) - tag = "j_head"; - else if ( self.damagelocation == "head" ) - tag = "j_head"; - else if ( self.damagelocation == "neck" ) - tag = "j_neck"; - else if ( self.damagelocation == "torso_upper" ) - tag = "j_spineupper"; - else if ( self.damagelocation == "torso_lower" ) - tag = "j_spinelower"; - else if ( self.damagelocation == "right_arm_upper" ) - tag = "j_elbow_ri"; - else if ( self.damagelocation == "left_arm_upper" ) - tag = "j_elbow_le"; - else if ( self.damagelocation == "right_arm_lower" ) - tag = "j_wrist_ri"; - else if ( self.damagelocation == "left_arm_lower" ) - tag = "j_wrist_le"; - - return tag; + tag = "J_SpineLower"; + if ( self.damagelocation == "helmet" ) + { + tag = "j_head"; + } + else if ( self.damagelocation == "head" ) + { + tag = "j_head"; + } + else if ( self.damagelocation == "neck" ) + { + tag = "j_neck"; + } + else if ( self.damagelocation == "torso_upper" ) + { + tag = "j_spineupper"; + } + else if ( self.damagelocation == "torso_lower" ) + { + tag = "j_spinelower"; + } + else if ( self.damagelocation == "right_arm_upper" ) + { + tag = "j_elbow_ri"; + } + else if ( self.damagelocation == "left_arm_upper" ) + { + tag = "j_elbow_le"; + } + else if ( self.damagelocation == "right_arm_lower" ) + { + tag = "j_wrist_ri"; + } + else + { + if ( self.damagelocation == "left_arm_lower" ) + { + tag = "j_wrist_le"; + } + } + return tag; } set_last_gib_time() { - anim notify( "stop_last_gib_time" ); - anim endon( "stop_last_gib_time" ); - wait 0.05; - anim.lastgibtime = gettime(); - anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs ); + anim notify( "stop_last_gib_time" ); + anim endon( "stop_last_gib_time" ); + wait 0,05; + anim.lastgibtime = getTime(); + anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs ); } get_gib_ref( direction ) { - if ( isdefined( self.a.gib_ref ) ) - return; + if ( isDefined( self.a.gib_ref ) ) + { + return; + } + if ( self.damagetaken < 165 ) + { + return; + } + if ( getTime() > ( anim.lastgibtime + anim.gibdelay ) && anim.totalgibs > 0 ) + { + anim.totalgibs--; - if ( self.damagetaken < 165 ) - return; - - if ( gettime() > anim.lastgibtime + anim.gibdelay && anim.totalgibs > 0 ) - { - anim.totalgibs--; - anim thread set_last_gib_time(); - refs = []; - - switch ( direction ) - { - case "right": - refs[refs.size] = "left_arm"; - refs[refs.size] = "left_leg"; - gib_ref = get_random( refs ); - break; - case "left": - refs[refs.size] = "right_arm"; - refs[refs.size] = "right_leg"; - gib_ref = get_random( refs ); - break; - case "forward": - refs[refs.size] = "right_arm"; - refs[refs.size] = "left_arm"; - refs[refs.size] = "right_leg"; - refs[refs.size] = "left_leg"; - refs[refs.size] = "guts"; - refs[refs.size] = "no_legs"; - gib_ref = get_random( refs ); - break; - case "back": - refs[refs.size] = "right_arm"; - refs[refs.size] = "left_arm"; - refs[refs.size] = "right_leg"; - refs[refs.size] = "left_leg"; - refs[refs.size] = "no_legs"; - gib_ref = get_random( refs ); - break; - default: - refs[refs.size] = "right_arm"; - refs[refs.size] = "left_arm"; - refs[refs.size] = "right_leg"; - refs[refs.size] = "left_leg"; - refs[refs.size] = "no_legs"; - refs[refs.size] = "guts"; - gib_ref = get_random( refs ); - break; - } - - self.a.gib_ref = gib_ref; - } - else - self.a.gib_ref = undefined; + anim thread set_last_gib_time(); + refs = []; + switch( direction ) + { + case "right": + refs[ refs.size ] = "left_arm"; + refs[ refs.size ] = "left_leg"; + gib_ref = get_random( refs ); + break; + case "left": + refs[ refs.size ] = "right_arm"; + refs[ refs.size ] = "right_leg"; + gib_ref = get_random( refs ); + break; + case "forward": + refs[ refs.size ] = "right_arm"; + refs[ refs.size ] = "left_arm"; + refs[ refs.size ] = "right_leg"; + refs[ refs.size ] = "left_leg"; + refs[ refs.size ] = "guts"; + refs[ refs.size ] = "no_legs"; + gib_ref = get_random( refs ); + break; + case "back": + refs[ refs.size ] = "right_arm"; + refs[ refs.size ] = "left_arm"; + refs[ refs.size ] = "right_leg"; + refs[ refs.size ] = "left_leg"; + refs[ refs.size ] = "no_legs"; + gib_ref = get_random( refs ); + break; + default: + refs[ refs.size ] = "right_arm"; + refs[ refs.size ] = "left_arm"; + refs[ refs.size ] = "right_leg"; + refs[ refs.size ] = "left_leg"; + refs[ refs.size ] = "no_legs"; + refs[ refs.size ] = "guts"; + gib_ref = get_random( refs ); + break; + } + self.a.gib_ref = gib_ref; + } + else + { + self.a.gib_ref = undefined; + } } get_random( array ) { - return array[randomint( array.size )]; + return array[ randomint( array.size ) ]; } do_gib() { - if ( !is_mature() ) - return; - - if ( !isdefined( self.a.gib_ref ) ) - return; - - if ( isdefined( self.is_on_fire ) && self.is_on_fire ) - return; - - if ( self is_zombie_gibbed() ) - return; - - self set_zombie_gibbed(); - gib_ref = self.a.gib_ref; - limb_data = get_limb_data( gib_ref ); - - if ( !isdefined( limb_data ) ) - { + if ( !is_mature() ) + { + return; + } + if ( !isDefined( self.a.gib_ref ) ) + { + return; + } + if ( isDefined( self.is_on_fire ) && self.is_on_fire ) + { + return; + } + if ( self is_zombie_gibbed() ) + { + return; + } + self set_zombie_gibbed(); + gib_ref = self.a.gib_ref; + limb_data = get_limb_data( gib_ref ); + if ( !isDefined( limb_data ) ) + { /# - println( "^3animscriptszm_death.gsc - limb_data is not setup for gib_ref on model: " + self.model + " and gib_ref of: " + self.a.gib_ref ); + println( "^3animscriptszm_death.gsc - limb_data is not setup for gib_ref on model: " + self.model + " and gib_ref of: " + self.a.gib_ref ); #/ - return; - } - - if ( !( isdefined( self.dont_throw_gib ) && self.dont_throw_gib ) ) - self thread throw_gib( limb_data["spawn_tags_array"] ); - - if ( gib_ref == "head" ) - { - self.hat_gibbed = 1; - self.head_gibbed = 1; - size = self getattachsize(); - - for ( i = 0; i < size; i++ ) - { - model = self getattachmodelname( i ); - - if ( issubstr( model, "head" ) ) - { - if ( isdefined( self.hatmodel ) ) - self detach( self.hatmodel, "" ); - - self detach( model, "" ); - - if ( isdefined( self.torsodmg5 ) ) - self attach( self.torsodmg5, "", 1 ); - - break; - } - } - } - else - { - self setmodel( limb_data["body_model"] ); - self attach( limb_data["legs_model"] ); - } + return; + } + if ( isDefined( self.dont_throw_gib ) && !self.dont_throw_gib ) + { + self thread throw_gib( limb_data[ "spawn_tags_array" ] ); + } + if ( gib_ref == "head" ) + { + self.hat_gibbed = 1; + self.head_gibbed = 1; + size = self getattachsize(); + i = 0; + while ( i < size ) + { + model = self getattachmodelname( i ); + if ( issubstr( model, "head" ) ) + { + if ( isDefined( self.hatmodel ) ) + { + self detach( self.hatmodel, "" ); + } + self detach( model, "" ); + if ( isDefined( self.torsodmg5 ) ) + { + self attach( self.torsodmg5, "", 1 ); + } + break; + } + else + { + i++; + } + } + } + else self setmodel( limb_data[ "body_model" ] ); + self attach( limb_data[ "legs_model" ] ); } precache_gib_fx() { - anim._effect["animscript_gib_fx"] = loadfx( "weapon/bullet/fx_flesh_gib_fatal_01" ); - anim._effect["animscript_gibtrail_fx"] = loadfx( "trail/fx_trail_blood_streak" ); - anim._effect["death_neckgrab_spurt"] = loadfx( "impacts/fx_flesh_hit_neck_fatal" ); + anim._effect[ "animscript_gib_fx" ] = loadfx( "weapon/bullet/fx_flesh_gib_fatal_01" ); + anim._effect[ "animscript_gibtrail_fx" ] = loadfx( "trail/fx_trail_blood_streak" ); + anim._effect[ "death_neckgrab_spurt" ] = loadfx( "impacts/fx_flesh_hit_neck_fatal" ); } get_limb_data( gib_ref ) { - temp_array = []; - - if ( "right_arm" == gib_ref && isdefined( self.torsodmg2 ) && isdefined( self.legdmg1 ) && isdefined( self.gibspawn1 ) && isdefined( self.gibspawntag1 ) ) - { - temp_array["right_arm"]["body_model"] = self.torsodmg2; - temp_array["right_arm"]["legs_model"] = self.legdmg1; - temp_array["right_arm"]["spawn_tags_array"] = []; - temp_array["right_arm"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_right_arm; - } - - if ( "left_arm" == gib_ref && isdefined( self.torsodmg3 ) && isdefined( self.legdmg1 ) && isdefined( self.gibspawn2 ) && isdefined( self.gibspawntag2 ) ) - { - temp_array["left_arm"]["body_model"] = self.torsodmg3; - temp_array["left_arm"]["legs_model"] = self.legdmg1; - temp_array["left_arm"]["spawn_tags_array"] = []; - temp_array["left_arm"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_left_arm; - } - - if ( "right_leg" == gib_ref && isdefined( self.torsodmg1 ) && isdefined( self.legdmg2 ) && isdefined( self.gibspawn3 ) && isdefined( self.gibspawntag3 ) ) - { - temp_array["right_leg"]["body_model"] = self.torsodmg1; - temp_array["right_leg"]["legs_model"] = self.legdmg2; - temp_array["right_leg"]["spawn_tags_array"] = []; - temp_array["right_leg"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_right_leg; - } - - if ( "left_leg" == gib_ref && isdefined( self.torsodmg1 ) && isdefined( self.legdmg3 ) && isdefined( self.gibspawn4 ) && isdefined( self.gibspawntag4 ) ) - { - temp_array["left_leg"]["body_model"] = self.torsodmg1; - temp_array["left_leg"]["legs_model"] = self.legdmg3; - temp_array["left_leg"]["spawn_tags_array"] = []; - temp_array["left_leg"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_left_leg; - } - - if ( "no_legs" == gib_ref && isdefined( self.torsodmg1 ) && isdefined( self.legdmg4 ) && isdefined( self.gibspawn4 ) && isdefined( self.gibspawn3 ) && isdefined( self.gibspawntag3 ) && isdefined( self.gibspawntag4 ) ) - { - temp_array["no_legs"]["body_model"] = self.torsodmg1; - temp_array["no_legs"]["legs_model"] = self.legdmg4; - temp_array["no_legs"]["spawn_tags_array"] = []; - temp_array["no_legs"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_right_leg; - temp_array["no_legs"]["spawn_tags_array"][1] = level._zombie_gib_piece_index_left_leg; - } - - if ( "guts" == gib_ref && isdefined( self.torsodmg4 ) && isdefined( self.legdmg1 ) ) - { - temp_array["guts"]["body_model"] = self.torsodmg4; - temp_array["guts"]["legs_model"] = self.legdmg1; - temp_array["guts"]["spawn_tags_array"] = []; - temp_array["guts"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_guts; - - if ( isdefined( self.gibspawn2 ) && isdefined( self.gibspawntag2 ) ) - temp_array["guts"]["spawn_tags_array"][1] = level._zombie_gib_piece_index_left_arm; - } - - if ( "head" == gib_ref && isdefined( self.torsodmg5 ) && isdefined( self.legdmg1 ) ) - { - temp_array["head"]["body_model"] = self.torsodmg5; - temp_array["head"]["legs_model"] = self.legdmg1; - temp_array["head"]["spawn_tags_array"] = []; - temp_array["head"]["spawn_tags_array"][0] = level._zombie_gib_piece_index_head; - - if ( !( isdefined( self.hat_gibbed ) && self.hat_gibbed ) && isdefined( self.gibspawn5 ) && isdefined( self.gibspawntag5 ) ) - temp_array["head"]["spawn_tags_array"][1] = level._zombie_gib_piece_index_hat; - } - - if ( isdefined( temp_array[gib_ref] ) ) - return temp_array[gib_ref]; - else - return undefined; + temp_array = []; + if ( gib_ref == "right_arm" && isDefined( self.torsodmg2 ) && isDefined( self.legdmg1 ) && isDefined( self.gibspawn1 ) && isDefined( self.gibspawntag1 ) ) + { + temp_array[ "right_arm" ][ "body_model" ] = self.torsodmg2; + temp_array[ "right_arm" ][ "legs_model" ] = self.legdmg1; + temp_array[ "right_arm" ][ "spawn_tags_array" ] = []; + temp_array[ "right_arm" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_arm; + } + if ( gib_ref == "left_arm" && isDefined( self.torsodmg3 ) && isDefined( self.legdmg1 ) && isDefined( self.gibspawn2 ) && isDefined( self.gibspawntag2 ) ) + { + temp_array[ "left_arm" ][ "body_model" ] = self.torsodmg3; + temp_array[ "left_arm" ][ "legs_model" ] = self.legdmg1; + temp_array[ "left_arm" ][ "spawn_tags_array" ] = []; + temp_array[ "left_arm" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_left_arm; + } + if ( gib_ref == "right_leg" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg2 ) && isDefined( self.gibspawn3 ) && isDefined( self.gibspawntag3 ) ) + { + temp_array[ "right_leg" ][ "body_model" ] = self.torsodmg1; + temp_array[ "right_leg" ][ "legs_model" ] = self.legdmg2; + temp_array[ "right_leg" ][ "spawn_tags_array" ] = []; + temp_array[ "right_leg" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_leg; + } + if ( gib_ref == "left_leg" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg3 ) && isDefined( self.gibspawn4 ) && isDefined( self.gibspawntag4 ) ) + { + temp_array[ "left_leg" ][ "body_model" ] = self.torsodmg1; + temp_array[ "left_leg" ][ "legs_model" ] = self.legdmg3; + temp_array[ "left_leg" ][ "spawn_tags_array" ] = []; + temp_array[ "left_leg" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_left_leg; + } + if ( gib_ref == "no_legs" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg4 ) && isDefined( self.gibspawn4 ) && isDefined( self.gibspawn3 ) && isDefined( self.gibspawntag3 ) && isDefined( self.gibspawntag4 ) ) + { + temp_array[ "no_legs" ][ "body_model" ] = self.torsodmg1; + temp_array[ "no_legs" ][ "legs_model" ] = self.legdmg4; + temp_array[ "no_legs" ][ "spawn_tags_array" ] = []; + temp_array[ "no_legs" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_leg; + temp_array[ "no_legs" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_left_leg; + } + if ( gib_ref == "guts" && isDefined( self.torsodmg4 ) && isDefined( self.legdmg1 ) ) + { + temp_array[ "guts" ][ "body_model" ] = self.torsodmg4; + temp_array[ "guts" ][ "legs_model" ] = self.legdmg1; + temp_array[ "guts" ][ "spawn_tags_array" ] = []; + temp_array[ "guts" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_guts; + if ( isDefined( self.gibspawn2 ) && isDefined( self.gibspawntag2 ) ) + { + temp_array[ "guts" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_left_arm; + } + } + if ( gib_ref == "head" && isDefined( self.torsodmg5 ) && isDefined( self.legdmg1 ) ) + { + temp_array[ "head" ][ "body_model" ] = self.torsodmg5; + temp_array[ "head" ][ "legs_model" ] = self.legdmg1; + temp_array[ "head" ][ "spawn_tags_array" ] = []; + temp_array[ "head" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_head; + if ( isDefined( self.hat_gibbed ) && !self.hat_gibbed && isDefined( self.gibspawn5 ) && isDefined( self.gibspawntag5 ) ) + { + temp_array[ "head" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_hat; + } + } + if ( isDefined( temp_array[ gib_ref ] ) ) + { + return temp_array[ gib_ref ]; + } + else + { + return undefined; + } } throw_gib( limb_tags_array ) { - if ( isdefined( limb_tags_array ) ) - { - if ( isdefined( level.track_gibs ) ) - level [[ level.track_gibs ]]( self, limb_tags_array ); - - if ( isdefined( self.launch_gib_up ) ) - self gib( "up", limb_tags_array ); - else - self gib( "normal", limb_tags_array ); - } + if ( isDefined( limb_tags_array ) ) + { + if ( isDefined( level.track_gibs ) ) + { + level [[ level.track_gibs ]]( self, limb_tags_array ); + } + if ( isDefined( self.launch_gib_up ) ) + { + self gib( "up", limb_tags_array ); + return; + } + else + { + self gib( "normal", limb_tags_array ); + } + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_combat.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_combat.gsc index a78583b..c5fed44 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_combat.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_combat.gsc @@ -1,495 +1,510 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_shared; -#include maps\mp\animscripts\dog_stop; +#include maps/mp/animscripts/dog_stop; +#include maps/mp/animscripts/utility; +#include common_scripts/utility; main() { - debug_anim_print( "dog_combat::main() " ); - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); + debug_anim_print( "dog_combat::main() " ); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); /# - if ( !debug_allow_combat() ) - { - combatidle(); - return; - } + if ( !debug_allow_combat() ) + { + combatidle(); + return; #/ - if ( isdefined( level.hostmigrationtimer ) ) - { - combatidle(); - return; - } + } + if ( isDefined( level.hostmigrationtimer ) ) + { + combatidle(); + return; + } /# - assert( isdefined( self.enemy ) ); + assert( isDefined( self.enemy ) ); #/ - if ( !isalive( self.enemy ) ) - { - combatidle(); - return; - } - - if ( isplayer( self.enemy ) ) - self meleebiteattackplayer( self.enemy ); + if ( !isalive( self.enemy ) ) + { + combatidle(); + return; + } + if ( isplayer( self.enemy ) ) + { + self meleebiteattackplayer( self.enemy ); + } } combatidle() { - self set_orient_mode( "face enemy" ); - self animmode( "zonly_physics" ); - idleanim = "zm_combat_attackidle"; - debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim ); - self setanimstatefromasd( idleanim ); - maps\mp\animscripts\zm_shared::donotetracks( "attack_combat" ); - debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." ); + self set_orient_mode( "face enemy" ); + self animmode( "zonly_physics" ); + idleanim = "zm_combat_attackidle"; + debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim ); + self setanimstatefromasd( idleanim ); + maps/mp/animscripts/zm_shared::donotetracks( "attack_combat" ); + debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." ); } shouldwaitincombatidle() { - if ( isdefined( level.hostmigrationtimer ) ) - return 1; + if ( isDefined( level.hostmigrationtimer ) ) + { + return 1; + } /# - assert( isdefined( self.enemy ) && isalive( self.enemy ) ); + if ( isDefined( self.enemy ) ) + { + assert( isalive( self.enemy ) ); + } #/ - return isdefined( self.enemy.dogattackallowtime ) && gettime() < self.enemy.dogattackallowtime; + if ( isDefined( self.enemy.dogattackallowtime ) ) + { + return getTime() < self.enemy.dogattackallowtime; + } } setnextdogattackallowtime( time ) { - self.dogattackallowtime = gettime() + time; + self.dogattackallowtime = getTime() + time; } meleebiteattackplayer( player ) { - self animmode( "gravity", 0 ); - self.safetochangescript = 0; - prepareattackplayer( player ); - attack_time = 1.2 + randomfloat( 0.4 ); - debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" ); - self setanimstatefromasd( "zm_combat_attackidle" ); - maps\mp\animscripts\zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player ); - debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." ); - self.safetochangescript = 1; - self animmode( "none", 0 ); + self animmode( "gravity", 0 ); + self.safetochangescript = 0; + prepareattackplayer( player ); + attack_time = 1,2 + randomfloat( 0,4 ); + debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" ); + self setanimstatefromasd( "zm_combat_attackidle" ); + maps/mp/animscripts/zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player ); + debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." ); + self.safetochangescript = 1; + self animmode( "none", 0 ); } meleebiteattackplayer2( player ) { - attackrangebuffer = 30; - - for (;;) - { - if ( !isalive( self.enemy ) ) - break; - - meleerange = self.meleeattackdist + attackrangebuffer; - - if ( isdefined( player.syncedmeleetarget ) && player.syncedmeleetarget != self ) - { - if ( checkendcombat( meleerange ) ) - break; - else - { - combatidle(); - continue; - } - } - - if ( self shouldwaitincombatidle() ) - { - combatidle(); - continue; - } - - self set_orient_mode( "face enemy" ); - self animmode( "gravity" ); - self.safetochangescript = 0; + attackrangebuffer = 30; + for ( ;; ) + { + if ( !isalive( self.enemy ) ) + { + break; + } + else meleerange = self.meleeattackdist + attackrangebuffer; + if ( isDefined( player.syncedmeleetarget ) && player.syncedmeleetarget != self ) + { + if ( checkendcombat( meleerange ) ) + { + break; + } + else combatidle(); + continue; + } + else + { + if ( self shouldwaitincombatidle() ) + { + combatidle(); + break; + } + else + { + self set_orient_mode( "face enemy" ); + self animmode( "gravity" ); + self.safetochangescript = 0; /# - if ( getdvarint( _hash_7B06BF0D ) ) - iprintln( "dog " + self getentnum() + " attack player " + gettime() ); + if ( getDvarInt( "debug_dog_sound" ) ) + { + iprintln( "dog " + self getentnum() + " attack player " + getTime() ); #/ - player setnextdogattackallowtime( 200 ); - - if ( dog_cant_kill_in_one_hit( player ) ) - { - level.lastdogmeleeplayertime = gettime(); - level.dogmeleeplayercounter++; - - if ( use_low_attack() ) - { - self animmode( "angle deltas" ); - self setanimstatefromasd( "zm_combat_attack_player_close_range" ); - domeleeafterwait( 0.1 ); - maps\mp\animscripts\zm_shared::donotetracksfortime( 1.4, "attack_combat" ); - self animmode( "gravity" ); - } - else - { - attack_time = 1.2 + randomfloat( 0.4 ); - debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" ); - self setanimstatefromasd( "zm_combat_attackidle" ); - domeleeafterwait( 0.1 ); - maps\mp\animscripts\zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player ); - debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." ); - } - } - else - { - self thread dog_melee_death( player ); - player.attacked_by_dog = 1; - self thread clear_player_attacked_by_dog_on_death( player ); - debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_attack_player" ); - self setanimstate( "combat_attack_player" ); - self maps\mp\animscripts\shared::donotetracks( "done", ::handlemeleefinishattacknotetracks, player ); - debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_player notify done." ); - self notify( "dog_no_longer_melee_able" ); - self setcandamage( 1 ); - self unlink(); - } - - self.safetochangescript = 1; - - if ( checkendcombat( meleerange ) ) - break; - } - - self.safetochangescript = 1; - self animmode( "none" ); + } + player setnextdogattackallowtime( 200 ); + if ( dog_cant_kill_in_one_hit( player ) ) + { + level.lastdogmeleeplayertime = getTime(); + level.dogmeleeplayercounter++; + if ( use_low_attack() ) + { + self animmode( "angle deltas" ); + self setanimstatefromasd( "zm_combat_attack_player_close_range" ); + domeleeafterwait( 0,1 ); + maps/mp/animscripts/zm_shared::donotetracksfortime( 1,4, "attack_combat" ); + self animmode( "gravity" ); + } + else + { + attack_time = 1,2 + randomfloat( 0,4 ); + debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" ); + self setanimstatefromasd( "zm_combat_attackidle" ); + domeleeafterwait( 0,1 ); + maps/mp/animscripts/zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player ); + debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." ); + } + } + else + { + self thread dog_melee_death( player ); + player.attacked_by_dog = 1; + self thread clear_player_attacked_by_dog_on_death( player ); + debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_attack_player" ); + self setanimstate( "combat_attack_player" ); + self maps/mp/animscripts/shared::donotetracks( "done", ::handlemeleefinishattacknotetracks, player ); + debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_player notify done." ); + self notify( "dog_no_longer_melee_able" ); + self setcandamage( 1 ); + self unlink(); + } + self.safetochangescript = 1; + if ( checkendcombat( meleerange ) ) + { + break; + } + } + } + else + { + } + } + self.safetochangescript = 1; + self animmode( "none" ); } domeleeafterwait( time ) { - self endon( "death" ); - wait( time ); - hitent = self melee(); - - if ( isdefined( hitent ) ) - { - if ( isplayer( hitent ) ) - hitent shellshock( "dog_bite", 1 ); - } + self endon( "death" ); + wait time; + hitent = self melee(); + if ( isDefined( hitent ) ) + { + if ( isplayer( hitent ) ) + { + hitent shellshock( "dog_bite", 1 ); + } + } } handlemeleebiteattacknotetracks2( note, player ) { - if ( note == "dog_melee" ) - self melee( anglestoforward( self.angles ) ); + if ( note == "dog_melee" ) + { + self melee( anglesToForward( self.angles ) ); + } } handlemeleebiteattacknotetracks( note, player ) { - switch ( note ) - { - case "dog_melee": - if ( !isdefined( level.dogmeleebiteattacktime ) ) - { - level.dogmeleebiteattacktime = gettime() - level.dogmeleebiteattacktimestart; - level.dogmeleebiteattacktime += 50; - } - - hitent = self melee( anglestoforward( self.angles ) ); - - if ( isdefined( hitent ) ) - { - if ( isplayer( hitent ) ) - hitent shellshock( "dog_bite", 1 ); - } - else if ( isdefined( level.dog_melee_miss ) ) - self [[ level.dog_melee_miss ]]( player ); - - break; - case "stop_tracking": - melee_time = 200; - - if ( !isdefined( level.dogmeleebiteattacktime ) ) - level.dogmeleebiteattacktimestart = gettime(); - else - melee_time = level.dogmeleebiteattacktime; - - self thread orienttoplayerdeadreckoning( player, melee_time ); - break; - } + switch( note ) + { + case "dog_melee": + if ( !isDefined( level.dogmeleebiteattacktime ) ) + { + level.dogmeleebiteattacktime = getTime() - level.dogmeleebiteattacktimestart; + level.dogmeleebiteattacktime += 50; + } + hitent = self melee( anglesToForward( self.angles ) ); + if ( isDefined( hitent ) ) + { + if ( isplayer( hitent ) ) + { + hitent shellshock( "dog_bite", 1 ); + } + } + else + { + if ( isDefined( level.dog_melee_miss ) ) + { + self [[ level.dog_melee_miss ]]( player ); + } + } + break; + case "stop_tracking": + melee_time = 200; + if ( !isDefined( level.dogmeleebiteattacktime ) ) + { + level.dogmeleebiteattacktimestart = getTime(); + } + else + { + melee_time = level.dogmeleebiteattacktime; + } + self thread orienttoplayerdeadreckoning( player, melee_time ); + break; + } } handlemeleefinishattacknotetracks( note, player ) { - switch ( note ) - { - case "dog_melee": - if ( !isdefined( level.dogmeleefinishattacktime ) ) - { - level.dogmeleefinishattacktime = gettime() - level.dogmeleefinishattacktimestart; - level.dogmeleefinishattacktime += 50; - } - - hitent = self melee( anglestoforward( self.angles ) ); - - if ( isdefined( hitent ) && isalive( player ) ) - { - if ( hitent == player ) - break; - } - else - { - attackmiss(); - return 1; - } - - break; - case "dog_early": - self notify( "dog_early_notetrack" ); - debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_early" ); - self setanimstate( "combat_attack_player_early" ); - break; - case "dog_lunge": - thread set_melee_timer( player ); - debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_lunge" ); - self setanimstate( "combat_attack_player_lunge" ); - break; - case "dogbite_damage": - self thread killplayer( player ); - break; - case "stop_tracking": - melee_time = 200; - - if ( !isdefined( level.dogmeleefinishattacktime ) ) - level.dogmeleefinishattacktimestart = gettime(); - else - melee_time = level.dogmeleefinishattacktime; - - self thread orienttoplayerdeadreckoning( player, melee_time ); - break; - } + switch( note ) + { + case "dog_melee": + if ( !isDefined( level.dogmeleefinishattacktime ) ) + { + level.dogmeleefinishattacktime = getTime() - level.dogmeleefinishattacktimestart; + level.dogmeleefinishattacktime += 50; + } + hitent = self melee( anglesToForward( self.angles ) ); + if ( isDefined( hitent ) && isalive( player ) ) + { + if ( hitent == player ) + { + break; + } + else } + else attackmiss(); + return 1; + case "dog_early": + self notify( "dog_early_notetrack" ); + debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_early" ); + self setanimstate( "combat_attack_player_early" ); + break; + case "dog_lunge": + thread set_melee_timer( player ); + debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_lunge" ); + self setanimstate( "combat_attack_player_lunge" ); + break; + case "dogbite_damage": + self thread killplayer( player ); + break; + case "stop_tracking": + melee_time = 200; + if ( !isDefined( level.dogmeleefinishattacktime ) ) + { + level.dogmeleefinishattacktimestart = getTime(); + } + else + { + melee_time = level.dogmeleefinishattacktime; + } + self thread orienttoplayerdeadreckoning( player, melee_time ); + break; + } } orienttoplayerdeadreckoning( player, time_till_bite ) { - enemy_attack_current_origin = player.origin; - enemy_attack_current_time = gettime(); - enemy_motion_time_delta = enemy_attack_current_time - self.enemy_attack_start_time; - enemy_motion_direction = enemy_attack_current_origin - self.enemy_attack_start_origin; - - if ( enemy_motion_time_delta == 0 ) - enemy_predicted_position = player.origin; - else - { - enemy_velocity = enemy_motion_direction / enemy_motion_time_delta; - enemy_predicted_position = player.origin + enemy_velocity * time_till_bite; - } - - self set_orient_mode( "face point", enemy_predicted_position ); + enemy_attack_current_origin = player.origin; + enemy_attack_current_time = getTime(); + enemy_motion_time_delta = enemy_attack_current_time - self.enemy_attack_start_time; + enemy_motion_direction = enemy_attack_current_origin - self.enemy_attack_start_origin; + if ( enemy_motion_time_delta == 0 ) + { + enemy_predicted_position = player.origin; + } + else + { + enemy_velocity = enemy_motion_direction / enemy_motion_time_delta; + enemy_predicted_position = player.origin + ( enemy_velocity * time_till_bite ); + } + self set_orient_mode( "face point", enemy_predicted_position ); } checkendcombat( meleerange ) { - if ( !isdefined( self.enemy ) ) - return 0; - - disttotargetsq = distancesquared( self.origin, self.enemy.origin ); - return disttotargetsq > meleerange * meleerange; + if ( !isDefined( self.enemy ) ) + { + return 0; + } + disttotargetsq = distancesquared( self.origin, self.enemy.origin ); + return disttotargetsq > ( meleerange * meleerange ); } use_low_attack( player ) { - height_diff = self.enemy_attack_start_origin[2] - self.origin[2]; - low_enough = 30.0; - - if ( height_diff < low_enough && self.enemy_attack_start_stance == "prone" ) - return true; - - melee_origin = ( self.origin[0], self.origin[1], self.origin[2] + 65 ); - enemy_origin = ( self.enemy.origin[0], self.enemy.origin[1], self.enemy.origin[2] + 32 ); - - if ( !bullettracepassed( melee_origin, enemy_origin, 0, self ) ) - return true; - - return false; + height_diff = self.enemy_attack_start_origin[ 2 ] - self.origin[ 2 ]; + low_enough = 30; + if ( height_diff < low_enough && self.enemy_attack_start_stance == "prone" ) + { + return 1; + } + melee_origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 65 ); + enemy_origin = ( self.enemy.origin[ 0 ], self.enemy.origin[ 1 ], self.enemy.origin[ 2 ] + 32 ); + if ( !bullettracepassed( melee_origin, enemy_origin, 0, self ) ) + { + return 1; + } + return 0; } prepareattackplayer( player ) { - level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_DO_NOTHING"; - distancetotarget = distance( self.origin, self.enemy.origin ); - targetheight = abs( self.enemy.origin[2] - self.origin[2] ); - self.enemy_attack_start_distance = distancetotarget; - self.enemy_attack_start_origin = player.origin; - self.enemy_attack_start_time = gettime(); - self.enemy_attack_start_stance = player getstance(); + level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_DO_NOTHING"; + distancetotarget = distance( self.origin, self.enemy.origin ); + targetheight = abs( self.enemy.origin[ 2 ] - self.origin[ 2 ] ); + self.enemy_attack_start_distance = distancetotarget; + self.enemy_attack_start_origin = player.origin; + self.enemy_attack_start_time = getTime(); + self.enemy_attack_start_stance = player getstance(); } attackteleportthread( offset ) { - self endon( "death" ); - self endon( "killanimscript" ); - reps = 5; - increment = ( offset[0] / reps, offset[1] / reps, offset[2] / reps ); - - for ( i = 0; i < reps; i++ ) - { - self teleport( self.origin + increment ); - wait 0.05; - } + self endon( "death" ); + self endon( "killanimscript" ); + reps = 5; + increment = ( offset[ 0 ] / reps, offset[ 1 ] / reps, offset[ 2 ] / reps ); + i = 0; + while ( i < reps ) + { + self teleport( self.origin + increment ); + wait 0,05; + i++; + } } player_attacked() { - return isalive( self ) && self meleebuttonpressed(); + if ( isalive( self ) ) + { + return self meleebuttonpressed(); + } } set_melee_timer( player ) { - wait 0.15; - self.melee_able_timer = gettime(); + wait 0,15; + self.melee_able_timer = getTime(); } clear_player_attacked_by_dog_on_death( player ) { - self waittill( "death" ); - - player.attacked_by_dog = undefined; + self waittill( "death" ); + player.attacked_by_dog = undefined; } dog_cant_kill_in_one_hit( player ) { - return 1; - - if ( isdefined( player.dogs_dont_instant_kill ) ) - { + return 1; + if ( isDefined( player.dogs_dont_instant_kill ) ) + { /# - assert( player.dogs_dont_instant_kill, "Dont set player.dogs_dont_instant_kill to false, set to undefined" ); + assert( player.dogs_dont_instant_kill, "Dont set player.dogs_dont_instant_kill to false, set to undefined" ); #/ - return 1; - } - - if ( gettime() - level.lastdogmeleeplayertime > 8000 ) - level.dogmeleeplayercounter = 0; - - return level.dogmeleeplayercounter < level.dog_hits_before_kill && player.health > 25; + return 1; + } + if ( ( getTime() - level.lastdogmeleeplayertime ) > 8000 ) + { + level.dogmeleeplayercounter = 0; + } + if ( level.dogmeleeplayercounter < level.dog_hits_before_kill ) + { + return player.health > 25; + } } dog_melee_death( player ) { - self endon( "killanimscript" ); - self endon( "dog_no_longer_melee_able" ); - pressed = 0; - press_time = anim.dog_presstime; - - self waittill( "dog_early_notetrack" ); - - while ( player player_attacked() ) - wait 0.05; - - for (;;) - { - if ( !pressed ) - { - if ( player player_attacked() ) - { - pressed = 1; - - if ( isdefined( self.melee_able_timer ) && isalive( player ) ) - { - if ( gettime() - self.melee_able_timer <= press_time ) - { - player.player_view.custom_dog_save = "neck_snap"; - self notify( "melee_stop" ); - debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" ); - self setanimstate( "combat_player_neck_snap" ); - - self waittillmatch( "done", "dog_death" ); - - debug_anim_print( "dog_combat::dog_melee_death() - combat_player_neck_snap notify done." ); - self playsound( "aml_dog_neckbreak" ); - self setcandamage( 1 ); - self.a.nodeath = 1; - dif = player.origin - self.origin; - dif = ( dif[0], dif[1], 0 ); - self dodamage( self.health + 503, self geteye() - dif, player ); - self notify( "killanimscript" ); - } - else - { - debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" ); - self setanimstate( "combat_attack_player" ); - level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_LATE"; - } - - return; - } - - level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_SOON"; - debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_miss" ); - self setanimstate( "combat_player_neck_miss" ); - return; - } - } - else if ( !player player_attacked() ) - pressed = 0; - - wait 0.05; - } + self endon( "killanimscript" ); + self endon( "dog_no_longer_melee_able" ); + pressed = 0; + press_time = anim.dog_presstime; + self waittill( "dog_early_notetrack" ); + while ( player player_attacked() ) + { + wait 0,05; + } + for ( ;; ) + { + if ( !pressed ) + { + if ( player player_attacked() ) + { + pressed = 1; + if ( isDefined( self.melee_able_timer ) && isalive( player ) ) + { + if ( ( getTime() - self.melee_able_timer ) <= press_time ) + { + player.player_view.custom_dog_save = "neck_snap"; + self notify( "melee_stop" ); + debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" ); + self setanimstate( "combat_player_neck_snap" ); + self waittillmatch( "done" ); + return "dog_death"; + debug_anim_print( "dog_combat::dog_melee_death() - combat_player_neck_snap notify done." ); + self playsound( "aml_dog_neckbreak" ); + self setcandamage( 1 ); + self.a.nodeath = 1; + dif = player.origin - self.origin; + dif = ( dif[ 0 ], dif[ 1 ], 0 ); + self dodamage( self.health + 503, self geteye() - dif, player ); + self notify( "killanimscript" ); + } + else + { + debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" ); + self setanimstate( "combat_attack_player" ); + level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_LATE"; + } + return; + } + level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_SOON"; + debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_miss" ); + self setanimstate( "combat_player_neck_miss" ); + return; + } + } + else + { + if ( !player player_attacked() ) + { + pressed = 0; + } + } + wait 0,05; + } } attackmiss() { - if ( isdefined( self.enemy ) ) - { - forward = anglestoforward( self.angles ); - dirtoenemy = self.enemy.origin - self.origin + vectorscale( forward, 50 ); - - if ( vectordot( dirtoenemy, forward ) > 0 ) - { - debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" ); - self setanimstate( "combat_attack_miss" ); - self thread maps\mp\animscripts\dog_stop::lookattarget( "normal" ); - } - else - { - self.skipstartmove = 1; - self thread attackmisstracktargetthread(); - - if ( dirtoenemy[0] * forward[1] - dirtoenemy[1] * forward[0] > 0 ) - { - debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_right" ); - self setanimstate( "combat_attack_miss_right" ); - } - else - { - debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_left" ); - self setanimstate( "combat_attack_miss_left" ); - } - } - } - else - { - debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" ); - self setanimstate( "combat_attack_miss" ); - } - - self maps\mp\animscripts\shared::donotetracks( "done" ); - debug_anim_print( "dog_combat::attackMiss() - attackMiss notify done." ); - self notify( "stop tracking" ); - debug_anim_print( "dog_combat::attackMiss() - Stopped tracking" ); + if ( isDefined( self.enemy ) ) + { + forward = anglesToForward( self.angles ); + dirtoenemy = self.enemy.origin - ( self.origin + vectorScale( forward, 50 ) ); + if ( vectordot( dirtoenemy, forward ) > 0 ) + { + debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" ); + self setanimstate( "combat_attack_miss" ); + self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" ); + } + else self.skipstartmove = 1; + self thread attackmisstracktargetthread(); + if ( ( ( dirtoenemy[ 0 ] * forward[ 1 ] ) - ( dirtoenemy[ 1 ] * forward[ 0 ] ) ) > 0 ) + { + debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_right" ); + self setanimstate( "combat_attack_miss_right" ); + } + else + { + debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_left" ); + self setanimstate( "combat_attack_miss_left" ); + } + } + else + { + debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" ); + self setanimstate( "combat_attack_miss" ); + } + self maps/mp/animscripts/shared::donotetracks( "done" ); + debug_anim_print( "dog_combat::attackMiss() - attackMiss notify done." ); + self notify( "stop tracking" ); + debug_anim_print( "dog_combat::attackMiss() - Stopped tracking" ); } attackmisstracktargetthread() { - self endon( "killanimscript" ); - wait 0.6; - self set_orient_mode( "face enemy" ); + self endon( "killanimscript" ); + wait 0,6; + self set_orient_mode( "face enemy" ); } killplayer( player ) { - self endon( "pvd_melee_interrupted" ); - player.specialdeath = 1; - player setcandamage( 1 ); - wait 1; - damage = player.health + 1; - - if ( !isalive( player ) ) - return; + self endon( "pvd_melee_interrupted" ); + player.specialdeath = 1; + player setcandamage( 1 ); + wait 1; + damage = player.health + 1; + if ( !isalive( player ) ) + { + return; + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_death.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_death.gsc index eddce21..6fec47d 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_death.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_death.gsc @@ -1,34 +1,30 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/utility; main() { - debug_anim_print( "dog_death::main()" ); - self setaimanimweights( 0, 0 ); - self endon( "killanimscript" ); - - if ( isdefined( self.a.nodeath ) ) - { + debug_anim_print( "dog_death::main()" ); + self setaimanimweights( 0, 0 ); + self endon( "killanimscript" ); + if ( isDefined( self.a.nodeath ) ) + { /# - assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." ); + assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." ); #/ - wait 3; - return; - } - - self unlink(); - - if ( isdefined( self.enemy ) && isdefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) - self.enemy.syncedmeleetarget = undefined; - - death_anim = "death_" + getanimdirection( self.damageyaw ); + wait 3; + return; + } + self unlink(); + if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self ) + { + self.enemy.syncedmeleetarget = undefined; + } + death_anim = "death_" + getanimdirection( self.damageyaw ); /# - println( death_anim ); + println( death_anim ); #/ - self animmode( "gravity" ); - debug_anim_print( "dog_death::main() - Setting " + death_anim ); - self setanimstatefromasd( death_anim ); - maps\mp\animscripts\zm_shared::donotetracks( "dead_dog" ); + self animmode( "gravity" ); + debug_anim_print( "dog_death::main() - Setting " + death_anim ); + self setanimstatefromasd( death_anim ); + maps/mp/animscripts/zm_shared::donotetracks( "dead_dog" ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_flashed.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_flashed.gsc index 0b904a3..af53db4 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_flashed.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_flashed.gsc @@ -1,8 +1,6 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool main() { - self endon( "killanimscript" ); - self endon( "stop_flashbang_effect" ); + self endon( "killanimscript" ); + self endon( "stop_flashbang_effect" ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_init.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_init.gsc index 28ba909..5d1b1ba 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_init.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_init.gsc @@ -1,59 +1,61 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\dog_move; +#include maps/mp/animscripts/dog_move; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; main() { - level.dog_debug_orient = 0; - level.dog_debug_anims = 0; - level.dog_debug_anims_ent = 0; - level.dog_debug_turns = 0; - debug_anim_print( "dog_init::main() " ); - maps\mp\animscripts\dog_move::setup_sound_variables(); - anim_get_dvar_int( "debug_dog_sound", "0" ); - anim_get_dvar_int( "debug_dog_notetracks", "0" ); - self.ignoresuppression = 1; - self.chatinitialized = 0; - self.nododgemove = 1; - level.dogattackplayerdist = 102; - level.dogattackplayercloserangedist = 102; - level.dogrunturnspeed = 20; - level.dogrunpainspeed = 20; - self.meleeattackdist = 0; - self thread setmeleeattackdist(); - self.a = spawnstruct(); - self.a.pose = "stand"; - self.a.nextstandinghitdying = 0; - self.a.movement = "walk"; - self.suppressionthreshold = 1; - self.disablearrivals = 0; - level.dogstoppingdistsq = 3416.82; - self.stopanimdistsq = level.dogstoppingdistsq; - self.pathenemyfightdist = 512; - self settalktospecies( "zombiedog" ); - level.lastdogmeleeplayertime = 0; - level.dogmeleeplayercounter = 0; - - if ( !isdefined( level.dog_hits_before_kill ) ) - level.dog_hits_before_kill = 1; + level.dog_debug_orient = 0; + level.dog_debug_anims = 0; + level.dog_debug_anims_ent = 0; + level.dog_debug_turns = 0; + debug_anim_print( "dog_init::main() " ); + maps/mp/animscripts/dog_move::setup_sound_variables(); + anim_get_dvar_int( "debug_dog_sound", "0" ); + anim_get_dvar_int( "debug_dog_notetracks", "0" ); + self.ignoresuppression = 1; + self.chatinitialized = 0; + self.nododgemove = 1; + level.dogattackplayerdist = 102; + level.dogattackplayercloserangedist = 102; + level.dogrunturnspeed = 20; + level.dogrunpainspeed = 20; + self.meleeattackdist = 0; + self thread setmeleeattackdist(); + self.a = spawnstruct(); + self.a.pose = "stand"; + self.a.nextstandinghitdying = 0; + self.a.movement = "walk"; + self.suppressionthreshold = 1; + self.disablearrivals = 0; + level.dogstoppingdistsq = 3416,82; + self.stopanimdistsq = level.dogstoppingdistsq; + self.pathenemyfightdist = 512; + self settalktospecies( "zombiedog" ); + level.lastdogmeleeplayertime = 0; + level.dogmeleeplayercounter = 0; + if ( !isDefined( level.dog_hits_before_kill ) ) + { + level.dog_hits_before_kill = 1; + } } setmeleeattackdist() { - self endon( "death" ); - - while ( true ) - { - if ( isdefined( self.enemy ) ) - { - if ( isplayer( self.enemy ) ) - self.meleeattackdist = 64; - else - self.meleeattackdist = 102; - } - - wait 1; - } + self endon( "death" ); + while ( 1 ) + { + if ( isDefined( self.enemy ) ) + { + if ( isplayer( self.enemy ) ) + { + self.meleeattackdist = 64; + break; + } + else + { + self.meleeattackdist = 102; + } + } + wait 1; + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_jump.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_jump.gsc index e990e6a..11ddcb8 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_jump.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_jump.gsc @@ -1,16 +1,14 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - self endon( "killanimscript" ); - debug_anim_print( "dog_jump::main()" ); - self setaimanimweights( 0, 0 ); - self.safetochangescript = 0; - self setanimstatefromasd( "zm_traverse_wallhop" ); - maps\mp\animscripts\zm_shared::donotetracks( "traverse_wallhop" ); - self.safetochangescript = 1; + self endon( "killanimscript" ); + debug_anim_print( "dog_jump::main()" ); + self setaimanimweights( 0, 0 ); + self.safetochangescript = 0; + self setanimstatefromasd( "zm_traverse_wallhop" ); + maps/mp/animscripts/zm_shared::donotetracks( "traverse_wallhop" ); + self.safetochangescript = 1; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_move.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_move.gsc index 5d4abd6..53dbe04 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_move.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_move.gsc @@ -1,249 +1,259 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\zm_shared; -#include maps\mp\animscripts\dog_stop; -#include maps\mp\animscripts\zm_utility; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/dog_stop; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; setup_sound_variables() { - level.dog_sounds["far"] = spawnstruct(); - level.dog_sounds["close"] = spawnstruct(); - level.dog_sounds["close"].minrange = 0; - level.dog_sounds["close"].maxrange = 500; - level.dog_sounds["close"].sound = "aml_dog_bark_close"; - level.dog_sounds["close"].soundlengthplaceholder = 0.2; - level.dog_sounds["close"].aftersoundwaitmin = 0.1; - level.dog_sounds["close"].aftersoundwaitmax = 0.3; - level.dog_sounds["close"].minrangesqr = level.dog_sounds["close"].minrange * level.dog_sounds["close"].minrange; - level.dog_sounds["close"].maxrangesqr = level.dog_sounds["close"].maxrange * level.dog_sounds["close"].maxrange; - level.dog_sounds["far"].minrange = 500; - level.dog_sounds["far"].maxrange = 0; - level.dog_sounds["far"].sound = "aml_dog_bark"; - level.dog_sounds["far"].soundlengthplaceholder = 0.2; - level.dog_sounds["far"].aftersoundwaitmin = 0.1; - level.dog_sounds["far"].aftersoundwaitmax = 0.3; - level.dog_sounds["far"].minrangesqr = level.dog_sounds["far"].minrange * level.dog_sounds["far"].minrange; - level.dog_sounds["far"].maxrangesqr = level.dog_sounds["far"].maxrange * level.dog_sounds["far"].maxrange; + level.dog_sounds[ "far" ] = spawnstruct(); + level.dog_sounds[ "close" ] = spawnstruct(); + level.dog_sounds[ "close" ].minrange = 0; + level.dog_sounds[ "close" ].maxrange = 500; + level.dog_sounds[ "close" ].sound = "aml_dog_bark_close"; + level.dog_sounds[ "close" ].soundlengthplaceholder = 0,2; + level.dog_sounds[ "close" ].aftersoundwaitmin = 0,1; + level.dog_sounds[ "close" ].aftersoundwaitmax = 0,3; + level.dog_sounds[ "close" ].minrangesqr = level.dog_sounds[ "close" ].minrange * level.dog_sounds[ "close" ].minrange; + level.dog_sounds[ "close" ].maxrangesqr = level.dog_sounds[ "close" ].maxrange * level.dog_sounds[ "close" ].maxrange; + level.dog_sounds[ "far" ].minrange = 500; + level.dog_sounds[ "far" ].maxrange = 0; + level.dog_sounds[ "far" ].sound = "aml_dog_bark"; + level.dog_sounds[ "far" ].soundlengthplaceholder = 0,2; + level.dog_sounds[ "far" ].aftersoundwaitmin = 0,1; + level.dog_sounds[ "far" ].aftersoundwaitmax = 0,3; + level.dog_sounds[ "far" ].minrangesqr = level.dog_sounds[ "far" ].minrange * level.dog_sounds[ "far" ].minrange; + level.dog_sounds[ "far" ].maxrangesqr = level.dog_sounds[ "far" ].maxrange * level.dog_sounds[ "far" ].maxrange; } main() { - self endon( "killanimscript" ); - debug_anim_print( "dog_move::main()" ); - self setaimanimweights( 0, 0 ); - do_movement = 1; + self endon( "killanimscript" ); + debug_anim_print( "dog_move::main()" ); + self setaimanimweights( 0, 0 ); + do_movement = 1; /# - if ( !debug_allow_movement() ) - do_movement = 0; + if ( !debug_allow_movement() ) + { + do_movement = 0; #/ - if ( isdefined( level.hostmigrationtimer ) ) - do_movement = 0; - - if ( !isdefined( self.traversecomplete ) && !isdefined( self.skipstartmove ) && self.a.movement == "run" && do_movement ) - { - self startmove(); - blendtime = 0; - } - else - blendtime = 0.2; - - self.traversecomplete = undefined; - self.skipstartmove = undefined; - - if ( do_movement ) - { - if ( self.a.movement == "run" ) - { - debug_anim_print( "dog_move::main() - Setting move_run" ); - self setanimstatefromasd( "zm_move_run" ); - maps\mp\animscripts\zm_shared::donotetracksfortime( 0.1, "move_run" ); - debug_anim_print( "dog_move::main() - move_run wait 0.1 done " ); - } - else - { - debug_anim_print( "dog_move::main() - Setting move_start " ); - self setanimstatefromasd( "zm_move_walk" ); - maps\mp\animscripts\zm_shared::donotetracks( "move_walk" ); - } - } - - self thread maps\mp\animscripts\dog_stop::lookattarget( "normal" ); - - while ( true ) - { - self moveloop(); - - if ( self.a.movement == "run" ) - { - if ( self.disablearrivals == 0 ) - self thread stopmove(); - - self waittill( "run" ); - } - } + } + if ( isDefined( level.hostmigrationtimer ) ) + { + do_movement = 0; + } + if ( !isDefined( self.traversecomplete ) && !isDefined( self.skipstartmove ) && self.a.movement == "run" && do_movement ) + { + self startmove(); + blendtime = 0; + } + else + { + blendtime = 0,2; + } + self.traversecomplete = undefined; + self.skipstartmove = undefined; + if ( do_movement ) + { + if ( self.a.movement == "run" ) + { + debug_anim_print( "dog_move::main() - Setting move_run" ); + self setanimstatefromasd( "zm_move_run" ); + maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_run" ); + debug_anim_print( "dog_move::main() - move_run wait 0.1 done " ); + } + else + { + debug_anim_print( "dog_move::main() - Setting move_start " ); + self setanimstatefromasd( "zm_move_walk" ); + maps/mp/animscripts/zm_shared::donotetracks( "move_walk" ); + } + } + self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" ); + while ( 1 ) + { + self moveloop(); + if ( self.a.movement == "run" ) + { + if ( self.disablearrivals == 0 ) + { + self thread stopmove(); + } + self waittill( "run" ); + } + } } moveloop() { - self endon( "killanimscript" ); - self endon( "stop_soon" ); - - while ( true ) - { - do_movement = 1; + self endon( "killanimscript" ); + self endon( "stop_soon" ); + while ( 1 ) + { + do_movement = 1; /# - if ( !debug_allow_movement() ) - do_movement = 0; + if ( !debug_allow_movement() ) + { + do_movement = 0; #/ - if ( isdefined( level.hostmigrationtimer ) ) - do_movement = 0; - - if ( !do_movement ) - { - self setaimanimweights( 0, 0 ); - self setanimstatefromasd( "zm_stop_idle" ); - maps\mp\animscripts\zm_shared::donotetracks( "stop_idle" ); - continue; - } - - if ( self.disablearrivals ) - self.stopanimdistsq = 0; - else - self.stopanimdistsq = level.dogstoppingdistsq; - - if ( self.a.movement == "run" ) - { - debug_anim_print( "dog_move::moveLoop() - Setting move_run" ); - self setanimstatefromasd( "zm_move_run" ); - maps\mp\animscripts\zm_shared::donotetracksfortime( 0.2, "move_run" ); - debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " ); - } - else - { + } + if ( isDefined( level.hostmigrationtimer ) ) + { + do_movement = 0; + } + while ( !do_movement ) + { + self setaimanimweights( 0, 0 ); + self setanimstatefromasd( "zm_stop_idle" ); + maps/mp/animscripts/zm_shared::donotetracks( "stop_idle" ); + } + if ( self.disablearrivals ) + { + self.stopanimdistsq = 0; + } + else + { + self.stopanimdistsq = level.dogstoppingdistsq; + } + if ( self.a.movement == "run" ) + { + debug_anim_print( "dog_move::moveLoop() - Setting move_run" ); + self setanimstatefromasd( "zm_move_run" ); + maps/mp/animscripts/zm_shared::donotetracksfortime( 0,2, "move_run" ); + debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " ); + continue; + } + else + { /# - assert( self.a.movement == "walk" ); + assert( self.a.movement == "walk" ); #/ - debug_anim_print( "dog_move::moveLoop() - Setting move_walk " ); - self setanimstatefromasd( "zm_move_walk" ); - maps\mp\animscripts\zm_shared::donotetracksfortime( 0.1, "move_walk" ); - - if ( self need_to_run() ) - { - self.a.movement = "run"; - self notify( "dog_running" ); - } - - debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " ); - } - } + debug_anim_print( "dog_move::moveLoop() - Setting move_walk " ); + self setanimstatefromasd( "zm_move_walk" ); + maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_walk" ); + if ( self need_to_run() ) + { + self.a.movement = "run"; + self notify( "dog_running" ); + } + debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " ); + } + } } startmovetracklookahead() { - self endon( "killanimscript" ); - - for ( i = 0; i < 2; i++ ) - { - lookaheadangle = vectortoangles( self.lookaheaddir ); - self set_orient_mode( "face angle", lookaheadangle ); - } + self endon( "killanimscript" ); + i = 0; + while ( i < 2 ) + { + lookaheadangle = vectorToAngle( self.lookaheaddir ); + self set_orient_mode( "face angle", lookaheadangle ); + i++; + } } startmove() { - debug_anim_print( "dog_move::startMove() - Setting move_start " ); - self setanimstatefromasd( "zm_move_start" ); - maps\mp\animscripts\zm_shared::donotetracks( "move_start" ); - debug_anim_print( "dog_move::startMove() - move_start notify done." ); - self animmode( "none" ); - self set_orient_mode( "face motion" ); + debug_anim_print( "dog_move::startMove() - Setting move_start " ); + self setanimstatefromasd( "zm_move_start" ); + maps/mp/animscripts/zm_shared::donotetracks( "move_start" ); + debug_anim_print( "dog_move::startMove() - move_start notify done." ); + self animmode( "none" ); + self set_orient_mode( "face motion" ); } stopmove() { - self endon( "killanimscript" ); - self endon( "run" ); - debug_anim_print( "dog_move::stopMove() - Setting move_stop" ); - self setanimstatefromasd( "zm_move_stop" ); - maps\mp\animscripts\zm_shared::donotetracks( "move_stop" ); - debug_anim_print( "dog_move::stopMove() - move_stop notify done." ); + self endon( "killanimscript" ); + self endon( "run" ); + debug_anim_print( "dog_move::stopMove() - Setting move_stop" ); + self setanimstatefromasd( "zm_move_stop" ); + maps/mp/animscripts/zm_shared::donotetracks( "move_stop" ); + debug_anim_print( "dog_move::stopMove() - move_stop notify done." ); } getenemydistancesqr() { - if ( isdefined( self.enemy ) ) - return distancesquared( self.origin, self.enemy.origin ); - - return 100000000; + if ( isDefined( self.enemy ) ) + { + return distancesquared( self.origin, self.enemy.origin ); + } + return 100000000; } getsoundkey( distancesqr ) { - keys = getarraykeys( level.dog_sounds ); - - for ( i = 0; i < keys.size; i++ ) - { - sound_set = level.dog_sounds[keys[i]]; - - if ( sound_set.minrangesqr > distancesqr ) - continue; - - if ( sound_set.maxrangesqr && sound_set.maxrangesqr < distancesqr ) - continue; - - return keys[i]; - } - - return keys[keys.size - 1]; + keys = getarraykeys( level.dog_sounds ); + i = 0; + while ( i < keys.size ) + { + sound_set = level.dog_sounds[ keys[ i ] ]; + if ( sound_set.minrangesqr > distancesqr ) + { + i++; + continue; + } + else if ( sound_set.maxrangesqr && sound_set.maxrangesqr < distancesqr ) + { + i++; + continue; + } + else + { + return keys[ i ]; + } + i++; + } + return keys[ keys.size - 1 ]; } need_to_run() { - run_dist_squared = 147456; - - if ( getdvar( _hash_C7E63BA4 ) != "" ) - { - dist = getdvarint( _hash_C7E63BA4 ); - run_dist_squared = dist * dist; - } - - run_yaw = 20; - run_pitch = 30; - run_height = 64; - - if ( self.a.movement != "walk" ) - return false; - - if ( self.health < self.maxhealth ) - return true; - - if ( !isdefined( self.enemy ) || !isalive( self.enemy ) ) - return false; - - if ( !self cansee( self.enemy ) ) - return false; - - dist = distancesquared( self.origin, self.enemy.origin ); - - if ( dist > run_dist_squared ) - return false; - - height = self.origin[2] - self.enemy.origin[2]; - - if ( abs( height ) > run_height ) - return false; - - yaw = self maps\mp\animscripts\zm_utility::absyawtoenemy(); - - if ( yaw > run_yaw ) - return false; - - pitch = angleclamp180( vectortoangles( self.origin - self.enemy.origin )[0] ); - - if ( abs( pitch ) > run_pitch ) - return false; - - return true; + run_dist_squared = 147456; + if ( getDvar( "scr_dog_run_distance" ) != "" ) + { + dist = getDvarInt( "scr_dog_run_distance" ); + run_dist_squared = dist * dist; + } + run_yaw = 20; + run_pitch = 30; + run_height = 64; + if ( self.a.movement != "walk" ) + { + return 0; + } + if ( self.health < self.maxhealth ) + { + return 1; + } + if ( !isDefined( self.enemy ) || !isalive( self.enemy ) ) + { + return 0; + } + if ( !self cansee( self.enemy ) ) + { + return 0; + } + dist = distancesquared( self.origin, self.enemy.origin ); + if ( dist > run_dist_squared ) + { + return 0; + } + height = self.origin[ 2 ] - self.enemy.origin[ 2 ]; + if ( abs( height ) > run_height ) + { + return 0; + } + yaw = self maps/mp/animscripts/zm_utility::absyawtoenemy(); + if ( yaw > run_yaw ) + { + return 0; + } + pitch = angleClamp180( vectorToAngle( self.origin - self.enemy.origin )[ 0 ] ); + if ( abs( pitch ) > run_pitch ) + { + return 0; + } + return 1; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_pain.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_pain.gsc index 3c3b7e8..b28cb45 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_pain.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_pain.gsc @@ -1,10 +1,8 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; +#include maps/mp/animscripts/utility; main() { - debug_anim_print( "dog_pain::main() " ); - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); + debug_anim_print( "dog_pain::main() " ); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_stop.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_stop.gsc index 01eb7f5..5c5dd06 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_stop.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_stop.gsc @@ -1,145 +1,148 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; main() { - debug_anim_print( "dog_stop::main()" ); - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); - self thread lookattarget( "attackIdle" ); - - while ( true ) - { - if ( shouldattackidle() ) - { - self randomattackidle(); - maps\mp\animscripts\zm_shared::donotetracks( "attack_idle", ::dogidlenotetracks ); - } - else - { - self set_orient_mode( "face current" ); - debug_anim_print( "dog_stop::main() - Setting stop_idle" ); - self notify( "stop tracking" ); - self setaimanimweights( 0, 0 ); - self setanimstatefromasd( "zm_stop_idle" ); - maps\mp\animscripts\zm_shared::donotetracksfortime( 0.2, "stop_idle", ::dogidlenotetracks ); - self thread lookattarget( "attackIdle" ); - } - - debug_anim_print( "dog_stop::main() - stop idle loop notify done." ); - } + debug_anim_print( "dog_stop::main()" ); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); + self thread lookattarget( "attackIdle" ); + while ( 1 ) + { + if ( shouldattackidle() ) + { + self randomattackidle(); + maps/mp/animscripts/zm_shared::donotetracks( "attack_idle", ::dogidlenotetracks ); + } + else + { + self set_orient_mode( "face current" ); + debug_anim_print( "dog_stop::main() - Setting stop_idle" ); + self notify( "stop tracking" ); + self setaimanimweights( 0, 0 ); + self setanimstatefromasd( "zm_stop_idle" ); + maps/mp/animscripts/zm_shared::donotetracksfortime( 0,2, "stop_idle", ::dogidlenotetracks ); + self thread lookattarget( "attackIdle" ); + } + debug_anim_print( "dog_stop::main() - stop idle loop notify done." ); + } } dogidlenotetracks( note ) { - if ( note == "breathe_fire" ) - { - if ( isdefined( level._effect["dog_breath"] ) ) - { - self.breath_fx = spawn( "script_model", self gettagorigin( "TAG_MOUTH_FX" ) ); - self.breath_fx.angles = self gettagangles( "TAG_MOUTH_FX" ); - self.breath_fx setmodel( "tag_origin" ); - self.breath_fx linkto( self, "TAG_MOUTH_FX" ); - playfxontag( level._effect["dog_breath"], self.breath_fx, "tag_origin" ); - } - } + if ( note == "breathe_fire" ) + { + if ( isDefined( level._effect[ "dog_breath" ] ) ) + { + self.breath_fx = spawn( "script_model", self gettagorigin( "TAG_MOUTH_FX" ) ); + self.breath_fx.angles = self gettagangles( "TAG_MOUTH_FX" ); + self.breath_fx setmodel( "tag_origin" ); + self.breath_fx linkto( self, "TAG_MOUTH_FX" ); + playfxontag( level._effect[ "dog_breath" ], self.breath_fx, "tag_origin" ); + } + } } isfacingenemy( tolerancecosangle ) { /# - assert( isdefined( self.enemy ) ); + assert( isDefined( self.enemy ) ); #/ - vectoenemy = self.enemy.origin - self.origin; - disttoenemy = length( vectoenemy ); - - if ( disttoenemy < 1 ) - return 1; - - forward = anglestoforward( self.angles ); - val1 = forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1]; - val2 = ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy; - return ( forward[0] * vectoenemy[0] + forward[1] * vectoenemy[1] ) / disttoenemy > tolerancecosangle; + vectoenemy = self.enemy.origin - self.origin; + disttoenemy = length( vectoenemy ); + if ( disttoenemy < 1 ) + { + return 1; + } + forward = anglesToForward( self.angles ); + val1 = ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ); + val2 = ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy; + return ( ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy ) > tolerancecosangle; } randomattackidle() { - if ( isfacingenemy( -0.5 ) ) - self set_orient_mode( "face current" ); - else - self set_orient_mode( "face enemy" ); - - if ( should_growl() ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" ); - self setanimstatefromasd( "zm_stop_attackidle_growl" ); - return; - } - - idlechance = 33; - barkchance = 66; - - if ( isdefined( self.mode ) ) - { - if ( self.mode == "growl" ) - { - idlechance = 15; - barkchance = 30; - } - else if ( self.mode == "bark" ) - { - idlechance = 15; - barkchance = 85; - } - } - - rand = randomint( 100 ); - - if ( rand < idlechance ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle" ); - self setanimstatefromasd( "zm_stop_attackidle" ); - } - else if ( rand < barkchance ) - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " ); - self setanimstatefromasd( "zm_stop_attackidle_bark" ); - } - else - { - debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " ); - self setanimstatefromasd( "zm_stop_attackidle_growl" ); - } + if ( isfacingenemy( -0,5 ) ) + { + self set_orient_mode( "face current" ); + } + else + { + self set_orient_mode( "face enemy" ); + } + if ( should_growl() ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" ); + self setanimstatefromasd( "zm_stop_attackidle_growl" ); + return; + } + idlechance = 33; + barkchance = 66; + if ( isDefined( self.mode ) ) + { + if ( self.mode == "growl" ) + { + idlechance = 15; + barkchance = 30; + } + else + { + if ( self.mode == "bark" ) + { + idlechance = 15; + barkchance = 85; + } + } + } + rand = randomint( 100 ); + if ( rand < idlechance ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle" ); + self setanimstatefromasd( "zm_stop_attackidle" ); + } + else if ( rand < barkchance ) + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " ); + self setanimstatefromasd( "zm_stop_attackidle_bark" ); + } + else + { + debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " ); + self setanimstatefromasd( "zm_stop_attackidle_growl" ); + } } shouldattackidle() { - return isdefined( self.enemy ) && isalive( self.enemy ) && distancesquared( self.origin, self.enemy.origin ) < 1000000; + if ( isDefined( self.enemy ) && isalive( self.enemy ) ) + { + return distancesquared( self.origin, self.enemy.origin ) < 1000000; + } } should_growl() { - if ( isdefined( self.script_growl ) ) - return 1; - - if ( !isalive( self.enemy ) ) - return 1; - - return !self cansee( self.enemy ); + if ( isDefined( self.script_growl ) ) + { + return 1; + } + if ( !isalive( self.enemy ) ) + { + return 1; + } + return !self cansee( self.enemy ); } lookattarget( lookposeset ) { - self endon( "killanimscript" ); - self endon( "stop tracking" ); - debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset ); - self.rightaimlimit = 90; - self.leftaimlimit = -90; - self.upaimlimit = 45; - self.downaimlimit = -45; - self maps\mp\animscripts\shared::setanimaimweight( 1, 0.2 ); - self maps\mp\animscripts\shared::trackloop(); + self endon( "killanimscript" ); + self endon( "stop tracking" ); + debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset ); + self.rightaimlimit = 90; + self.leftaimlimit = -90; + self.upaimlimit = 45; + self.downaimlimit = -45; + self maps/mp/animscripts/shared::setanimaimweight( 1, 0,2 ); + self maps/mp/animscripts/shared::trackloop(); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_turn.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_turn.gsc index f45b5d1..0cbc0cb 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_turn.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_dog_turn.gsc @@ -1,138 +1,136 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - self endon( "killanimscript" ); - debug_anim_print( "dog_turn::main()" ); - self setaimanimweights( 0, 0 ); - self.safetochangescript = 0; - deltayaw = self getdeltaturnyaw(); - - if ( need_to_turn_around( deltayaw ) ) - turn_180( deltayaw ); - else - turn_90( deltayaw ); - - move_out_of_turn(); - self.skipstartmove = 1; - self.safetochangescript = 1; + self endon( "killanimscript" ); + debug_anim_print( "dog_turn::main()" ); + self setaimanimweights( 0, 0 ); + self.safetochangescript = 0; + deltayaw = self getdeltaturnyaw(); + if ( need_to_turn_around( deltayaw ) ) + { + turn_180( deltayaw ); + } + else + { + turn_90( deltayaw ); + } + move_out_of_turn(); + self.skipstartmove = 1; + self.safetochangescript = 1; } need_to_turn_around( deltayaw ) { - angle = getdvarfloat( "dog_turn180_angle" ); - - if ( deltayaw > angle || deltayaw < -1 * angle ) - { - debug_turn_print( "need_to_turn_around: " + deltayaw + " YES" ); - return true; - } - - debug_turn_print( "need_to_turn_around: " + deltayaw + " NO" ); - return false; + angle = getDvarFloat( "dog_turn180_angle" ); + if ( deltayaw > angle || deltayaw < ( -1 * angle ) ) + { + debug_turn_print( "need_to_turn_around: " + deltayaw + " YES" ); + return 1; + } + debug_turn_print( "need_to_turn_around: " + deltayaw + " NO" ); + return 0; } do_turn_anim( stopped_anim, run_anim, wait_time, run_wait_time ) { - speed = length( self getvelocity() ); - do_anim = stopped_anim; - - if ( level.dogrunturnspeed < speed ) - { - do_anim = run_anim; - wait_time = run_wait_time; - } - - debug_anim_print( "dog_move::do_turn_anim() - Setting " + do_anim ); - self setanimstatefromasd( do_anim ); - maps\mp\animscripts\zm_shared::donotetracksfortime( run_wait_time, "move_turn" ); - debug_anim_print( "dog_move::turn_around_right() - done with " + do_anim + " wait time " + run_wait_time ); + speed = length( self getvelocity() ); + do_anim = stopped_anim; + if ( level.dogrunturnspeed < speed ) + { + do_anim = run_anim; + wait_time = run_wait_time; + } + debug_anim_print( "dog_move::do_turn_anim() - Setting " + do_anim ); + self setanimstatefromasd( do_anim ); + maps/mp/animscripts/zm_shared::donotetracksfortime( run_wait_time, "move_turn" ); + debug_anim_print( "dog_move::turn_around_right() - done with " + do_anim + " wait time " + run_wait_time ); } turn_left() { - self do_turn_anim( "move_turn_left", "move_run_turn_left", 0.5, 0.5 ); + self do_turn_anim( "move_turn_left", "move_run_turn_left", 0,5, 0,5 ); } turn_right() { - self do_turn_anim( "move_turn_right", "move_run_turn_right", 0.5, 0.5 ); + self do_turn_anim( "move_turn_right", "move_run_turn_right", 0,5, 0,5 ); } turn_180_left() { - self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0.5, 0.7 ); + self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0,5, 0,7 ); } turn_180_right() { - self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0.5, 0.7 ); + self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0,5, 0,7 ); } move_out_of_turn() { - if ( self.a.movement == "run" ) - { - debug_anim_print( "dog_move::move_out_of_turn() - Setting move_run" ); - self setanimstatefromasd( "zm_move_run" ); - maps\mp\animscripts\zm_shared::donotetracksfortime( 0.1, "move_run" ); - debug_anim_print( "dog_move::move_out_of_turn() - move_run wait 0.1 done " ); - } - else - { - debug_anim_print( "dog_move::move_out_of_turn() - Setting move_start " ); - self setanimstatefromasd( "zm_move_walk" ); - maps\mp\animscripts\zm_shared::donotetracks( "move_walk" ); - } + if ( self.a.movement == "run" ) + { + debug_anim_print( "dog_move::move_out_of_turn() - Setting move_run" ); + self setanimstatefromasd( "zm_move_run" ); + maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_run" ); + debug_anim_print( "dog_move::move_out_of_turn() - move_run wait 0.1 done " ); + } + else + { + debug_anim_print( "dog_move::move_out_of_turn() - Setting move_start " ); + self setanimstatefromasd( "zm_move_walk" ); + maps/mp/animscripts/zm_shared::donotetracks( "move_walk" ); + } } turn_90( deltayaw ) { - self animmode( "zonly_physics" ); - debug_turn_print( "turn_90 deltaYaw: " + deltayaw ); - - if ( deltayaw > getdvarfloat( "dog_turn90_angle" ) ) - { - debug_turn_print( "turn_90 left", 1 ); - self turn_left(); - } - else - { - debug_turn_print( "turn_90 right", 1 ); - self turn_right(); - } + self animmode( "zonly_physics" ); + debug_turn_print( "turn_90 deltaYaw: " + deltayaw ); + if ( deltayaw > getDvarFloat( "dog_turn90_angle" ) ) + { + debug_turn_print( "turn_90 left", 1 ); + self turn_left(); + } + else + { + debug_turn_print( "turn_90 right", 1 ); + self turn_right(); + } } turn_180( deltayaw ) { - self animmode( "zonly_physics" ); - debug_turn_print( "turn_180 deltaYaw: " + deltayaw ); - - if ( deltayaw > 177 || deltayaw < -177 ) - { - if ( randomint( 2 ) == 0 ) - { - debug_turn_print( "turn_around random right", 1 ); - self turn_180_right(); - } - else - { - debug_turn_print( "turn_around random left", 1 ); - self turn_180_left(); - } - } - else if ( deltayaw > getdvarfloat( "dog_turn180_angle" ) ) - { - debug_turn_print( "turn_around left", 1 ); - self turn_180_left(); - } - else - { - debug_turn_print( "turn_around right", 1 ); - self turn_180_right(); - } + self animmode( "zonly_physics" ); + debug_turn_print( "turn_180 deltaYaw: " + deltayaw ); + if ( deltayaw > 177 || deltayaw < -177 ) + { + if ( randomint( 2 ) == 0 ) + { + debug_turn_print( "turn_around random right", 1 ); + self turn_180_right(); + } + else + { + debug_turn_print( "turn_around random left", 1 ); + self turn_180_left(); + } + } + else + { + if ( deltayaw > getDvarFloat( "dog_turn180_angle" ) ) + { + debug_turn_print( "turn_around left", 1 ); + self turn_180_left(); + return; + } + else + { + debug_turn_print( "turn_around right", 1 ); + self turn_180_right(); + } + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_flashed.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_flashed.gsc index 719610b..bdf6899 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_flashed.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_flashed.gsc @@ -1,9 +1,6 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_init.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_init.gsc index eab3e4e..fb399ef 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_init.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_init.gsc @@ -1,165 +1,158 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\animscripts\zm_init; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/zm_init; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; +#include common_scripts/utility; main() { - self.a = spawnstruct(); - self.team = level.zombie_team; - firstinit(); - self.a.pose = "stand"; - self.a.movement = "stop"; - self.a.state = "stop"; - self.a.special = "none"; - self.a.combatendtime = gettime(); - self.a.script = "init"; - self.a.alertness = "casual"; - self.a.lastenemytime = gettime(); - self.a.forced_cover = "none"; - self.a.desired_script = "none"; - self.a.current_script = "none"; - self.a.lookangle = 0; - self.a.paintime = 0; - self.a.nextgrenadetrytime = 0; - self.walk = 0; - self.sprint = 0; - self.a.runblendtime = 0.2; - self.a.flamepaintime = 0; - self.a.postscriptfunc = undefined; - self.a.stance = "stand"; - self._animactive = 0; - self thread deathnotify(); - self.baseaccuracy = self.accuracy; - - if ( !isdefined( self.script_accuracy ) ) - self.script_accuracy = 1; - - self.a.misstime = 0; - self.a.yawtransition = "none"; - self.a.nodeath = 0; - self.a.misstime = 0; - self.a.misstimedebounce = 0; - self.a.disablepain = 0; - self.accuracystationarymod = 1; - self.chatinitialized = 0; - self.sightpostime = 0; - self.sightposleft = 1; - self.precombatrunenabled = 1; - self.is_zombie = 1; - self.a.crouchpain = 0; - self.a.nextstandinghitdying = 0; - - if ( !isdefined( self.script_forcegrenade ) ) - self.script_forcegrenade = 0; + self.a = spawnstruct(); + self.team = level.zombie_team; + firstinit(); + self.a.pose = "stand"; + self.a.movement = "stop"; + self.a.state = "stop"; + self.a.special = "none"; + self.a.combatendtime = getTime(); + self.a.script = "init"; + self.a.alertness = "casual"; + self.a.lastenemytime = getTime(); + self.a.forced_cover = "none"; + self.a.desired_script = "none"; + self.a.current_script = "none"; + self.a.lookangle = 0; + self.a.paintime = 0; + self.a.nextgrenadetrytime = 0; + self.walk = 0; + self.sprint = 0; + self.a.runblendtime = 0,2; + self.a.flamepaintime = 0; + self.a.postscriptfunc = undefined; + self.a.stance = "stand"; + self._animactive = 0; + self thread deathnotify(); + self.baseaccuracy = self.accuracy; + if ( !isDefined( self.script_accuracy ) ) + { + self.script_accuracy = 1; + } + self.a.misstime = 0; + self.a.yawtransition = "none"; + self.a.nodeath = 0; + self.a.misstime = 0; + self.a.misstimedebounce = 0; + self.a.disablepain = 0; + self.accuracystationarymod = 1; + self.chatinitialized = 0; + self.sightpostime = 0; + self.sightposleft = 1; + self.precombatrunenabled = 1; + self.is_zombie = 1; + self.a.crouchpain = 0; + self.a.nextstandinghitdying = 0; + if ( !isDefined( self.script_forcegrenade ) ) + { + self.script_forcegrenade = 0; + } /# - self.a.lastdebugprint = ""; + self.a.lastdebugprint = ""; #/ - self.lastenemysighttime = 0; - self.combattime = 0; - self.coveridleselecttime = -696969; - self.old = spawnstruct(); - self.reacquire_state = 0; - self.a.allow_shooting = 0; + self.lastenemysighttime = 0; + self.combattime = 0; + self.coveridleselecttime = -696969; + self.old = spawnstruct(); + self.reacquire_state = 0; + self.a.allow_shooting = 0; } donothing() { - } empty( one, two, three, whatever ) { - } clearenemy() { - self notify( "stop waiting for enemy to die" ); - self endon( "stop waiting for enemy to die" ); - - self.sightenemy waittill( "death" ); - - self.sightpos = undefined; - self.sighttime = 0; - self.sightenemy = undefined; + self notify( "stop waiting for enemy to die" ); + self endon( "stop waiting for enemy to die" ); + self.sightenemy waittill( "death" ); + self.sightpos = undefined; + self.sighttime = 0; + self.sightenemy = undefined; } deathnotify() { - self waittill( "death", other ); - - self notify( anim.scriptchange ); + self waittill( "death", other ); + self notify( anim.scriptchange ); } firstinit() { - if ( isdefined( anim.notfirsttime ) ) - return; - - anim.notfirsttime = 1; - anim.usefacialanims = 0; - - if ( !isdefined( anim.dog_health ) ) - anim.dog_health = 1; - - if ( !isdefined( anim.dog_presstime ) ) - anim.dog_presstime = 350; - - if ( !isdefined( anim.dog_hits_before_kill ) ) - anim.dog_hits_before_kill = 1; - - level.nextgrenadedrop = randomint( 3 ); - level.lastplayersighted = 100; - anim.defaultexception = maps\mp\animscripts\zm_init::empty; - setdvar( "scr_expDeathMayMoveCheck", "on" ); - anim.lastsidestepanim = 0; - anim.meleerange = 64; - anim.meleerangesq = anim.meleerange * anim.meleerange; - anim.standrangesq = 262144; - anim.chargerangesq = 40000; - anim.chargelongrangesq = 262144; - anim.aivsaimeleerangesq = 160000; - anim.combatmemorytimeconst = 10000; - anim.combatmemorytimerand = 6000; - anim.scriptchange = "script_change"; - anim.lastgibtime = 0; - anim.gibdelay = 3000; - anim.mingibs = 2; - anim.maxgibs = 4; - anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs ); - anim.corner_straight_yaw_limit = 36; - - if ( !isdefined( anim.optionalstepeffectfunction ) ) - { - anim.optionalstepeffects = []; - anim.optionalstepeffectfunction = ::empty; - } - - anim.notetracks = []; - maps\mp\animscripts\zm_shared::registernotetracks(); - - if ( !isdefined( level.flag ) ) - { - level.flag = []; - level.flags_lock = []; - } - - level.painai = undefined; - anim.maymovecheckenabled = 1; - anim.badplaces = []; - anim.badplaceint = 0; - anim.covercrouchleanpitch = -55; - anim.lastcarexplosiontime = -100000; + if ( isDefined( anim.notfirsttime ) ) + { + return; + } + anim.notfirsttime = 1; + anim.usefacialanims = 0; + if ( !isDefined( anim.dog_health ) ) + { + anim.dog_health = 1; + } + if ( !isDefined( anim.dog_presstime ) ) + { + anim.dog_presstime = 350; + } + if ( !isDefined( anim.dog_hits_before_kill ) ) + { + anim.dog_hits_before_kill = 1; + } + level.nextgrenadedrop = randomint( 3 ); + level.lastplayersighted = 100; + anim.defaultexception = ::empty; + setdvar( "scr_expDeathMayMoveCheck", "on" ); + anim.lastsidestepanim = 0; + anim.meleerange = 64; + anim.meleerangesq = anim.meleerange * anim.meleerange; + anim.standrangesq = 262144; + anim.chargerangesq = 40000; + anim.chargelongrangesq = 262144; + anim.aivsaimeleerangesq = 160000; + anim.combatmemorytimeconst = 10000; + anim.combatmemorytimerand = 6000; + anim.scriptchange = "script_change"; + anim.lastgibtime = 0; + anim.gibdelay = 3000; + anim.mingibs = 2; + anim.maxgibs = 4; + anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs ); + anim.corner_straight_yaw_limit = 36; + if ( !isDefined( anim.optionalstepeffectfunction ) ) + { + anim.optionalstepeffects = []; + anim.optionalstepeffectfunction = ::empty; + } + anim.notetracks = []; + maps/mp/animscripts/zm_shared::registernotetracks(); + if ( !isDefined( level.flag ) ) + { + level.flag = []; + level.flags_lock = []; + } + level.painai = undefined; + anim.maymovecheckenabled = 1; + anim.badplaces = []; + anim.badplaceint = 0; + anim.covercrouchleanpitch = -55; + anim.lastcarexplosiontime = -100000; } onplayerconnect() { - player = self; - firstinit(); - player.invul = 0; + player = self; + firstinit(); + player.invul = 0; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_jump.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_jump.gsc index 719610b..bdf6899 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_jump.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_jump.gsc @@ -1,9 +1,6 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_melee.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_melee.gsc index 1bec96e..c8cfd3c 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_melee.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_melee.gsc @@ -1,273 +1,304 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\animscripts\zm_combat; +#include maps/mp/animscripts/zm_combat; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; +#include common_scripts/utility; meleecombat() { - self endon( "end_melee" ); - self endon( "killanimscript" ); + self endon( "end_melee" ); + self endon( "killanimscript" ); /# - assert( canmeleeanyrange() ); + assert( canmeleeanyrange() ); #/ - self orientmode( "face enemy" ); - - if ( is_true( self.sliding_on_goo ) ) - self animmode( "slide" ); - else - self animmode( "zonly_physics" ); - - for (;;) - { - if ( isdefined( self.marked_for_death ) ) - return; - - if ( isdefined( self.enemy ) ) - { - angles = vectortoangles( self.enemy.origin - self.origin ); - self orientmode( "face angle", angles[1] ); - } - - if ( isdefined( self.zmb_vocals_attack ) ) - self playsound( self.zmb_vocals_attack ); - - if ( isdefined( self.nochangeduringmelee ) && self.nochangeduringmelee ) - self.safetochangescript = 0; - - if ( isdefined( self.is_inert ) && self.is_inert ) - return; - - set_zombie_melee_anim_state( self ); - - if ( isdefined( self.melee_anim_func ) ) - self thread [[ self.melee_anim_func ]](); - - while ( true ) - { - self waittill( "melee_anim", note ); - - if ( note == "end" ) - break; - else if ( note == "fire" ) - { - if ( !isdefined( self.enemy ) ) - break; - - if ( isdefined( self.dont_die_on_me ) && self.dont_die_on_me ) - break; - - self.enemy notify( "melee_swipe", self ); - oldhealth = self.enemy.health; - self melee(); - - if ( !isdefined( self.enemy ) ) - break; - - if ( self.enemy.health >= oldhealth ) - { - if ( isdefined( self.melee_miss_func ) ) - self [[ self.melee_miss_func ]](); - else if ( isdefined( level.melee_miss_func ) ) - self [[ level.melee_miss_func ]](); - } + self orientmode( "face enemy" ); + if ( is_true( self.sliding_on_goo ) ) + { + self animmode( "slide" ); + } + else + { + self animmode( "zonly_physics" ); + } + for ( ;; ) + { + if ( isDefined( self.marked_for_death ) ) + { + return; + } + if ( isDefined( self.enemy ) ) + { + angles = vectorToAngle( self.enemy.origin - self.origin ); + self orientmode( "face angle", angles[ 1 ] ); + } + if ( isDefined( self.zmb_vocals_attack ) ) + { + self playsound( self.zmb_vocals_attack ); + } + if ( isDefined( self.nochangeduringmelee ) && self.nochangeduringmelee ) + { + self.safetochangescript = 0; + } + if ( isDefined( self.is_inert ) && self.is_inert ) + { + return; + } + set_zombie_melee_anim_state( self ); + if ( isDefined( self.melee_anim_func ) ) + { + self thread [[ self.melee_anim_func ]](); + } + while ( 1 ) + { + self waittill( "melee_anim", note ); + if ( note == "end" ) + { + break; + } + else if ( note == "fire" ) + { + if ( !isDefined( self.enemy ) ) + { + break; + } + else if ( isDefined( self.dont_die_on_me ) && self.dont_die_on_me ) + { + break; + } + else + { + self.enemy notify( "melee_swipe" ); + oldhealth = self.enemy.health; + self melee(); + if ( !isDefined( self.enemy ) ) + { + break; + } + else if ( self.enemy.health >= oldhealth ) + { + if ( isDefined( self.melee_miss_func ) ) + { + self [[ self.melee_miss_func ]](); + break; + } + else + { + if ( isDefined( level.melee_miss_func ) ) + { + self [[ level.melee_miss_func ]](); + } + } + } /# - if ( getdvarint( _hash_7F11F572 ) ) - { - if ( self.enemy.health < oldhealth ) - { - zombie_eye = self geteye(); - player_eye = self.enemy geteye(); - trace = bullettrace( zombie_eye, player_eye, 1, self ); - hitpos = trace["position"]; - dist = distance( zombie_eye, hitpos ); - iprintln( "melee HIT " + dist ); - } - } + if ( getDvarInt( #"7F11F572" ) ) + { + if ( self.enemy.health < oldhealth ) + { + zombie_eye = self geteye(); + player_eye = self.enemy geteye(); + trace = bullettrace( zombie_eye, player_eye, 1, self ); + hitpos = trace[ "position" ]; + dist = distance( zombie_eye, hitpos ); + iprintln( "melee HIT " + dist ); #/ - } - else if ( note == "stop" ) - { - if ( !cancontinuetomelee() ) - break; - } - } - - if ( is_true( self.sliding_on_goo ) ) - self orientmode( "face enemy" ); - else - self orientmode( "face default" ); - - if ( isdefined( self.nochangeduringmelee ) && self.nochangeduringmelee || is_true( self.sliding_on_goo ) ) - { - if ( isdefined( self.enemy ) ) - { - dist_sq = distancesquared( self.origin, self.enemy.origin ); - - if ( dist_sq > self.meleeattackdist * self.meleeattackdist ) - { - self.safetochangescript = 1; - wait 0.1; - break; - } - - continue; - } - - self.safetochangescript = 1; - wait 0.1; - break; - } - } - - if ( is_true( self.sliding_on_goo ) ) - self animmode( "slide" ); - else - self animmode( "none" ); - - self thread maps\mp\animscripts\zm_combat::main(); + } + } + continue; + } + else + { + if ( note == "stop" ) + { + if ( !cancontinuetomelee() ) + { + break; + } + } + } + else + { + } + } + } + if ( is_true( self.sliding_on_goo ) ) + { + self orientmode( "face enemy" ); + } + else self orientmode( "face default" ); + if ( isDefined( self.nochangeduringmelee ) || self.nochangeduringmelee && is_true( self.sliding_on_goo ) ) + { + if ( isDefined( self.enemy ) ) + { + dist_sq = distancesquared( self.origin, self.enemy.origin ); + if ( dist_sq > ( self.meleeattackdist * self.meleeattackdist ) ) + { + self.safetochangescript = 1; + wait 0,1; + break; + } + else } + else self.safetochangescript = 1; + wait 0,1; + break; + } + else + { + } + } + if ( is_true( self.sliding_on_goo ) ) + { + self animmode( "slide" ); + } + else self animmode( "none" ); + self thread maps/mp/animscripts/zm_combat::main(); } cancontinuetomelee() { - return canmeleeinternal( "already started" ); + return canmeleeinternal( "already started" ); } canmeleeanyrange() { - return canmeleeinternal( "any range" ); + return canmeleeinternal( "any range" ); } canmeleedesperate() { - return canmeleeinternal( "long range" ); + return canmeleeinternal( "long range" ); } canmelee() { - return canmeleeinternal( "normal" ); + return canmeleeinternal( "normal" ); } canmeleeinternal( state ) { - if ( !issentient( self.enemy ) ) - return false; - - if ( !isalive( self.enemy ) ) - return false; - - if ( isdefined( self.disablemelee ) ) - { + if ( !issentient( self.enemy ) ) + { + return 0; + } + if ( !isalive( self.enemy ) ) + { + return 0; + } + if ( isDefined( self.disablemelee ) ) + { /# - assert( self.disablemelee ); + assert( self.disablemelee ); #/ - return false; - } - - yaw = abs( getyawtoenemy() ); - - if ( yaw > 60 && state != "already started" || yaw > 110 ) - return false; - - enemypoint = self.enemy getorigin(); - vectoenemy = enemypoint - self.origin; - self.enemydistancesq = lengthsquared( vectoenemy ); - - if ( self.enemydistancesq <= anim.meleerangesq ) - { - if ( !ismeleepathclear( vectoenemy, enemypoint ) ) - return false; - - return true; - } - - if ( state != "any range" ) - { - chargerangesq = anim.chargerangesq; - - if ( state == "long range" ) - chargerangesq = anim.chargelongrangesq; - - if ( self.enemydistancesq > chargerangesq ) - return false; - } - - if ( state == "already started" ) - return false; - - if ( isdefined( self.check_melee_path ) && self.check_melee_path ) - { - if ( !ismeleepathclear( vectoenemy, enemypoint ) ) - { - self notify( "melee_path_blocked" ); - return false; - } - } - - if ( isdefined( level.can_melee ) ) - { - if ( !self [[ level.can_melee ]]() ) - return false; - } - - return true; + return 0; + } + yaw = abs( getyawtoenemy() ); + if ( yaw > 60 || state != "already started" && yaw > 110 ) + { + return 0; + } + enemypoint = self.enemy getorigin(); + vectoenemy = enemypoint - self.origin; + self.enemydistancesq = lengthsquared( vectoenemy ); + if ( self.enemydistancesq <= anim.meleerangesq ) + { + if ( !ismeleepathclear( vectoenemy, enemypoint ) ) + { + return 0; + } + return 1; + } + if ( state != "any range" ) + { + chargerangesq = anim.chargerangesq; + if ( state == "long range" ) + { + chargerangesq = anim.chargelongrangesq; + } + if ( self.enemydistancesq > chargerangesq ) + { + return 0; + } + } + if ( state == "already started" ) + { + return 0; + } + if ( isDefined( self.check_melee_path ) && self.check_melee_path ) + { + if ( !ismeleepathclear( vectoenemy, enemypoint ) ) + { + self notify( "melee_path_blocked" ); + return 0; + } + } + if ( isDefined( level.can_melee ) ) + { + if ( !( self [[ level.can_melee ]]() ) ) + { + return 0; + } + } + return 1; } ismeleepathclear( vectoenemy, enemypoint ) { - dirtoenemy = vectornormalize( ( vectoenemy[0], vectoenemy[1], 0 ) ); - meleepoint = enemypoint - ( dirtoenemy[0] * 28, dirtoenemy[1] * 28, 0 ); - - if ( !self isingoal( meleepoint ) ) - return false; - - if ( self maymovetopoint( meleepoint ) ) - return true; - - trace1 = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 20.0 ), meleepoint + vectorscale( ( 0, 0, 1 ), 20.0 ), 1, self ); - trace2 = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 72.0 ), meleepoint + vectorscale( ( 0, 0, 1 ), 72.0 ), 1, self ); - - if ( isdefined( trace1["fraction"] ) && trace1["fraction"] == 1 && isdefined( trace2["fraction"] ) && trace2["fraction"] == 1 ) - return true; - - if ( isdefined( trace1["entity"] ) && trace1["entity"] == self.enemy && isdefined( trace2["entity"] ) && trace2["entity"] == self.enemy ) - return true; - - if ( isdefined( level.zombie_melee_in_water ) && level.zombie_melee_in_water ) - { - if ( isdefined( trace1["surfacetype"] ) && trace1["surfacetype"] == "water" && isdefined( trace2["fraction"] ) && trace2["fraction"] == 1 ) - return true; - } - - return false; + dirtoenemy = vectornormalize( ( vectoenemy[ 0 ], vectoenemy[ 1 ], 0 ) ); + meleepoint = enemypoint - ( dirtoenemy[ 0 ] * 28, dirtoenemy[ 1 ] * 28, 0 ); + if ( !self isingoal( meleepoint ) ) + { + return 0; + } + if ( self maymovetopoint( meleepoint ) ) + { + return 1; + } + trace1 = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 20 ), meleepoint + vectorScale( ( 0, 0, 1 ), 20 ), 1, self ); + trace2 = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 72 ), meleepoint + vectorScale( ( 0, 0, 1 ), 72 ), 1, self ); + if ( isDefined( trace1[ "fraction" ] ) && trace1[ "fraction" ] == 1 && isDefined( trace2[ "fraction" ] ) && trace2[ "fraction" ] == 1 ) + { + return 1; + } + if ( isDefined( trace1[ "entity" ] ) && trace1[ "entity" ] == self.enemy && isDefined( trace2[ "entity" ] ) && trace2[ "entity" ] == self.enemy ) + { + return 1; + } + if ( isDefined( level.zombie_melee_in_water ) && level.zombie_melee_in_water ) + { + if ( isDefined( trace1[ "surfacetype" ] ) && trace1[ "surfacetype" ] == "water" && isDefined( trace2[ "fraction" ] ) && trace2[ "fraction" ] == 1 ) + { + return 1; + } + } + return 0; } set_zombie_melee_anim_state( zombie ) { - if ( isdefined( level.melee_anim_state ) ) - melee_anim_state = self [[ level.melee_anim_state ]](); - - if ( !isdefined( melee_anim_state ) ) - { - if ( !zombie.has_legs && zombie.a.gib_ref == "no_legs" ) - melee_anim_state = "zm_stumpy_melee"; - else - { - switch ( zombie.zombie_move_speed ) - { - case "walk": - melee_anim_state = append_missing_legs_suffix( "zm_walk_melee" ); - break; - case "sprint": - case "run": - default: - melee_anim_state = append_missing_legs_suffix( "zm_run_melee" ); - break; - } - } - } - - zombie setanimstatefromasd( melee_anim_state ); + if ( isDefined( level.melee_anim_state ) ) + { + melee_anim_state = self [[ level.melee_anim_state ]](); + } + if ( !isDefined( melee_anim_state ) ) + { + if ( !zombie.has_legs && zombie.a.gib_ref == "no_legs" ) + { + melee_anim_state = "zm_stumpy_melee"; + break; + } + else + { + switch( zombie.zombie_move_speed ) + { + case "walk": + melee_anim_state = append_missing_legs_suffix( "zm_walk_melee" ); + break; + case "run": + case "sprint": + default: + melee_anim_state = append_missing_legs_suffix( "zm_run_melee" ); + break; + } + } +} +zombie setanimstatefromasd( melee_anim_state ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_move.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_move.gsc index a4cca2f..566ac5e 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_move.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_move.gsc @@ -1,256 +1,286 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\animscripts\zm_run; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/zm_run; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; +#include common_scripts/utility; main() { - self endon( "killanimscript" ); - self setaimanimweights( 0, 0 ); - previousscript = self.a.script; - maps\mp\animscripts\zm_utility::initialize( "zombie_move" ); - movemainloop(); + self endon( "killanimscript" ); + self setaimanimweights( 0, 0 ); + previousscript = self.a.script; + maps/mp/animscripts/zm_utility::initialize( "zombie_move" ); + movemainloop(); } movemainloop() { - self endon( "killanimscript" ); - self endon( "stop_soon" ); - self.needs_run_update = 1; - self notify( "needs_run_update" ); - self sidestepinit(); - self thread trysidestepthread(); - - for (;;) - { - self maps\mp\animscripts\zm_run::moverun(); - - if ( isdefined( self.zombie_can_sidestep ) && self.zombie_can_sidestep ) - self trysidestep(); - } + self endon( "killanimscript" ); + self endon( "stop_soon" ); + self.needs_run_update = 1; + self notify( "needs_run_update" ); + self sidestepinit(); + self thread trysidestepthread(); + for ( ;; ) + { + self maps/mp/animscripts/zm_run::moverun(); + if ( isDefined( self.zombie_can_sidestep ) && self.zombie_can_sidestep ) + { + self trysidestep(); + } + } } sidestepinit() { - self.a.steppeddir = 0; - self.a.lastsidesteptime = gettime(); + self.a.steppeddir = 0; + self.a.lastsidesteptime = getTime(); } trysidestepthread() { - self endon( "death" ); - self notify( "new_trySideStepThread" ); - self endon( "new_trySideStepThread" ); - - if ( !isdefined( self.zombie_can_sidestep ) ) - return false; - - if ( isdefined( self.zombie_can_sidestep ) && !self.zombie_can_sidestep ) - return false; - - while ( true ) - { - self trysidestep(); - wait 0.05; - } + self endon( "death" ); + self notify( "new_trySideStepThread" ); + self endon( "new_trySideStepThread" ); + if ( !isDefined( self.zombie_can_sidestep ) ) + { + return 0; + } + if ( isDefined( self.zombie_can_sidestep ) && !self.zombie_can_sidestep ) + { + return 0; + } + while ( 1 ) + { + self trysidestep(); + wait 0,05; + } } trysidestep() { - if ( isdefined( self.shouldsidestepfunc ) ) - self.sidesteptype = self [[ self.shouldsidestepfunc ]](); - else - self.sidesteptype = shouldsidestep(); - - if ( self.sidesteptype == "none" ) - { - if ( isdefined( self.zombie_can_forwardstep ) && self.zombie_can_forwardstep ) - self.sidesteptype = shouldforwardstep(); - } - - if ( self.sidesteptype == "none" ) - return false; - - self.desiredstepdir = getdesiredsidestepdir( self.sidesteptype ); - self.asd_name = "zm_" + self.sidesteptype + "_" + self.desiredstepdir; - self.substate_index = self getanimsubstatefromasd( self.asd_name ); - self.stepanim = self getanimfromasd( self.asd_name, self.substate_index ); - - if ( !self checkroomforanim( self.stepanim ) ) - return false; - - self.allowpain = 0; - self animcustom( ::dosidestep ); - - self waittill( "sidestep_done" ); - - self.allowpain = 1; + if ( isDefined( self.shouldsidestepfunc ) ) + { + self.sidesteptype = self [[ self.shouldsidestepfunc ]](); + } + else + { + self.sidesteptype = shouldsidestep(); + } + if ( self.sidesteptype == "none" ) + { + if ( isDefined( self.zombie_can_forwardstep ) && self.zombie_can_forwardstep ) + { + self.sidesteptype = shouldforwardstep(); + } + } + if ( self.sidesteptype == "none" ) + { + return 0; + } + self.desiredstepdir = getdesiredsidestepdir( self.sidesteptype ); + self.asd_name = "zm_" + self.sidesteptype + "_" + self.desiredstepdir; + self.substate_index = self getanimsubstatefromasd( self.asd_name ); + self.stepanim = self getanimfromasd( self.asd_name, self.substate_index ); + if ( !self checkroomforanim( self.stepanim ) ) + { + return 0; + } + self.allowpain = 0; + self animcustom( ::dosidestep ); + self waittill( "sidestep_done" ); + self.allowpain = 1; } getdesiredsidestepdir( sidesteptype ) { - if ( sidesteptype == "roll" || sidesteptype == "phase" ) - { - self.desiredstepdir = "forward"; - return self.desiredstepdir; - } + if ( sidesteptype == "roll" || sidesteptype == "phase" ) + { + self.desiredstepdir = "forward"; + return self.desiredstepdir; + } /# - assert( sidesteptype == "step", "Unsupported SideStepType" ); + assert( sidesteptype == "step", "Unsupported SideStepType" ); #/ - randomroll = randomfloat( 1 ); - - if ( self.a.steppeddir < 0 ) - self.desiredstepdir = "right"; - else if ( self.a.steppeddir > 0 ) - self.desiredstepdir = "left"; - else if ( randomroll < 0.5 ) - self.desiredstepdir = "right"; - else - self.desiredstepdir = "left"; - - return self.desiredstepdir; + randomroll = randomfloat( 1 ); + if ( self.a.steppeddir < 0 ) + { + self.desiredstepdir = "right"; + } + else if ( self.a.steppeddir > 0 ) + { + self.desiredstepdir = "left"; + } + else if ( randomroll < 0,5 ) + { + self.desiredstepdir = "right"; + } + else + { + self.desiredstepdir = "left"; + } + return self.desiredstepdir; } checkroomforanim( stepanim ) { - if ( !self maymovefrompointtopoint( self.origin, getanimendpos( stepanim ) ) ) - return false; - - return true; + if ( !self maymovefrompointtopoint( self.origin, getanimendpos( stepanim ) ) ) + { + return 0; + } + return 1; } shouldsidestep() { - if ( cansidestep() && isplayer( self.enemy ) && self.enemy islookingat( self ) ) - { - if ( self.zombie_move_speed != "sprint" || randomfloat( 1 ) < 0.7 ) - return "step"; - else - return "roll"; - } - - return "none"; + if ( cansidestep() && isplayer( self.enemy ) && self.enemy islookingat( self ) ) + { + if ( self.zombie_move_speed != "sprint" || randomfloat( 1 ) < 0,7 ) + { + return "step"; + } + else + { + return "roll"; + } + } + return "none"; } cansidestep() { - if ( !isdefined( self.zombie_can_sidestep ) || !self.zombie_can_sidestep ) - return false; - - if ( gettime() - self.a.lastsidesteptime < 2000 ) - return false; - - if ( !isdefined( self.enemy ) ) - return false; - - if ( self.a.pose != "stand" ) - return false; - - distsqfromenemy = distancesquared( self.origin, self.enemy.origin ); - - if ( distsqfromenemy < 4096 ) - return false; - - if ( distsqfromenemy > 1000000 ) - return false; - - if ( !isdefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 ) - return false; - - if ( abs( self getmotionangle() ) > 15 ) - return false; - - yaw = getyawtoorigin( self.enemy.origin ); - - if ( abs( yaw ) > 45 ) - return false; - - return true; + if ( !isDefined( self.zombie_can_sidestep ) || !self.zombie_can_sidestep ) + { + return 0; + } + if ( ( getTime() - self.a.lastsidesteptime ) < 2000 ) + { + return 0; + } + if ( !isDefined( self.enemy ) ) + { + return 0; + } + if ( self.a.pose != "stand" ) + { + return 0; + } + distsqfromenemy = distancesquared( self.origin, self.enemy.origin ); + if ( distsqfromenemy < 4096 ) + { + return 0; + } + if ( distsqfromenemy > 1000000 ) + { + return 0; + } + if ( !isDefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 ) + { + return 0; + } + if ( abs( self getmotionangle() ) > 15 ) + { + return 0; + } + yaw = getyawtoorigin( self.enemy.origin ); + if ( abs( yaw ) > 45 ) + { + return 0; + } + return 1; } shouldforwardstep() { - if ( canforwardstep() && isplayer( self.enemy ) ) - return "phase"; - - return "none"; + if ( canforwardstep() && isplayer( self.enemy ) ) + { + return "phase"; + } + return "none"; } canforwardstep() { - if ( isdefined( self.a.lastsidesteptime ) && gettime() - self.a.lastsidesteptime < 2000 ) - return false; - - if ( !isdefined( self.enemy ) ) - return false; - - if ( self.a.pose != "stand" ) - return false; - - distsqfromenemy = distancesquared( self.origin, self.enemy.origin ); - - if ( distsqfromenemy < 14400 ) - return false; - - if ( distsqfromenemy > 5760000 ) - return false; - - if ( !isdefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 ) - return false; - - if ( abs( self getmotionangle() ) > 15 ) - return false; - - yaw = getyawtoorigin( self.enemy.origin ); - - if ( abs( yaw ) > 45 ) - return false; - - return true; + if ( isDefined( self.a.lastsidesteptime ) && ( getTime() - self.a.lastsidesteptime ) < 2000 ) + { + return 0; + } + if ( !isDefined( self.enemy ) ) + { + return 0; + } + if ( self.a.pose != "stand" ) + { + return 0; + } + distsqfromenemy = distancesquared( self.origin, self.enemy.origin ); + if ( distsqfromenemy < 14400 ) + { + return 0; + } + if ( distsqfromenemy > 5760000 ) + { + return 0; + } + if ( !isDefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 ) + { + return 0; + } + if ( abs( self getmotionangle() ) > 15 ) + { + return 0; + } + yaw = getyawtoorigin( self.enemy.origin ); + if ( abs( yaw ) > 45 ) + { + return 0; + } + return 1; } dosidestep() { - self endon( "death" ); - self endon( "killanimscript" ); - self playsidestepanim( self.stepanim, self.sidesteptype ); + self endon( "death" ); + self endon( "killanimscript" ); + self playsidestepanim( self.stepanim, self.sidesteptype ); + if ( self.desiredstepdir == "left" ) + { + self.a.steppeddir--; - if ( self.desiredstepdir == "left" ) - self.a.steppeddir--; - else - self.a.steppeddir++; - - self.a.lastsidesteptime = gettime(); - self notify( "sidestep_done" ); + } + else + { + self.a.steppeddir++; + } + self.a.lastsidesteptime = getTime(); + self notify( "sidestep_done" ); } playsidestepanim( stepanim, sidesteptype ) { - self animmode( "gravity", 0 ); - self orientmode( "face angle", self.angles[1] ); - runblendouttime = 0.2; - - if ( isdefined( self.sidestepfunc ) ) - self thread [[ self.sidestepfunc ]]( "step_anim", stepanim ); - - self setanimstatefromasd( self.asd_name, self.substate_index ); - maps\mp\animscripts\zm_shared::donotetracks( "step_anim" ); - - if ( isalive( self ) ) - self thread facelookaheadforabit(); + self animmode( "gravity", 0 ); + self orientmode( "face angle", self.angles[ 1 ] ); + runblendouttime = 0,2; + if ( isDefined( self.sidestepfunc ) ) + { + self thread [[ self.sidestepfunc ]]( "step_anim", stepanim ); + } + self setanimstatefromasd( self.asd_name, self.substate_index ); + maps/mp/animscripts/zm_shared::donotetracks( "step_anim" ); + if ( isalive( self ) ) + { + self thread facelookaheadforabit(); + } } facelookaheadforabit() { - self endon( "death" ); - self endon( "killanimscript" ); - lookaheadangles = vectortoangles( self.lookaheaddir ); - self orientmode( "face angle", lookaheadangles[1] ); - wait 0.2; - self animmode( "normal", 0 ); - self orientmode( "face default" ); + self endon( "death" ); + self endon( "killanimscript" ); + lookaheadangles = vectorToAngle( self.lookaheaddir ); + self orientmode( "face angle", lookaheadangles[ 1 ] ); + wait 0,2; + self animmode( "normal", 0 ); + self orientmode( "face default" ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_pain.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_pain.gsc index 9d2fdb1..1de8330 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_pain.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_pain.gsc @@ -1,21 +1,18 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; +#include common_scripts/utility; main() { - self setflashbanged( 0 ); - - if ( isdefined( self.longdeathstarting ) ) - { - self waittill( "killanimscript" ); - - return; - } - - if ( self.a.disablepain ) - return; + self setflashbanged( 0 ); + if ( isDefined( self.longdeathstarting ) ) + { + self waittill( "killanimscript" ); + return; + } + if ( self.a.disablepain ) + { + return; + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_run.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_run.gsc index 1c9ff5c..f658594 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_run.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_run.gsc @@ -1,61 +1,61 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; moverun() { - self endon( "death" ); - - if ( isdefined( self.needs_run_update ) && !self.needs_run_update ) - self waittill( "needs_run_update" ); - - if ( isdefined( self.is_inert ) && self.is_inert ) - { - wait 0.1; - return; - } - - self setaimanimweights( 0, 0 ); - self setanimstatefromspeed(); - maps\mp\animscripts\zm_shared::donotetracksfortime( 0.05, "move_anim" ); - self.needs_run_update = 0; + self endon( "death" ); + if ( isDefined( self.needs_run_update ) && !self.needs_run_update ) + { + self waittill( "needs_run_update" ); + } + if ( isDefined( self.is_inert ) && self.is_inert ) + { + wait 0,1; + return; + } + self setaimanimweights( 0, 0 ); + self setanimstatefromspeed(); + maps/mp/animscripts/zm_shared::donotetracksfortime( 0,05, "move_anim" ); + self.needs_run_update = 0; } setanimstatefromspeed() { - animstate = self append_missing_legs_suffix( "zm_move_" + self.zombie_move_speed ); - - if ( isdefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" ) - animstate = "zm_move_stumpy"; - - if ( isdefined( self.preserve_asd_substates ) && self.preserve_asd_substates && animstate == self getanimstatefromasd() ) - { - substate = self getanimsubstatefromasd(); - self setanimstatefromasd( animstate, substate ); - } - else - self setanimstatefromasd( animstate ); - - if ( isdefined( self.setanimstatefromspeed ) ) - self [[ self.setanimstatefromspeed ]]( animstate, substate ); + animstate = self append_missing_legs_suffix( "zm_move_" + self.zombie_move_speed ); + if ( isDefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" ) + { + animstate = "zm_move_stumpy"; + } + if ( isDefined( self.preserve_asd_substates ) && self.preserve_asd_substates && animstate == self getanimstatefromasd() ) + { + substate = self getanimsubstatefromasd(); + self setanimstatefromasd( animstate, substate ); + } + else + { + self setanimstatefromasd( animstate ); + } + if ( isDefined( self.setanimstatefromspeed ) ) + { + self [[ self.setanimstatefromspeed ]]( animstate, substate ); + } } needsupdate() { - self.needs_run_update = 1; - self notify( "needs_run_update" ); + self.needs_run_update = 1; + self notify( "needs_run_update" ); } needsdelayedupdate() { - self endon( "death" ); - - while ( isdefined( self.needs_run_update ) && self.needs_run_update ) - wait 0.1; - - self.needs_run_update = 1; - self notify( "needs_run_update" ); + self endon( "death" ); + while ( isDefined( self.needs_run_update ) && self.needs_run_update ) + { + wait 0,1; + } + self.needs_run_update = 1; + self notify( "needs_run_update" ); } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_scripted.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_scripted.gsc index 13b6f89..8d60fe6 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_scripted.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_scripted.gsc @@ -1,39 +1,39 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool main() { - self endon( "death" ); - self notify( "killanimscript" ); - self endon( "end_sequence" ); - - if ( !isdefined( self.codescripted["animState"] ) ) - return; - - self startscriptedanim( self.codescripted["origin"], self.codescripted["angles"], self.codescripted["animState"], self.codescripted["animSubState"], self.codescripted["AnimMode"] ); - self.a.script = "scripted"; - self.codescripted = undefined; - - if ( isdefined( self.deathstring_passed ) ) - self.deathstring = self.deathstring_passed; - - self waittill( "killanimscript" ); + self endon( "death" ); + self notify( "killanimscript" ); + self endon( "end_sequence" ); + if ( !isDefined( self.codescripted[ "animState" ] ) ) + { + return; + } + self startscriptedanim( self.codescripted[ "origin" ], self.codescripted[ "angles" ], self.codescripted[ "animState" ], self.codescripted[ "animSubState" ], self.codescripted[ "AnimMode" ] ); + self.a.script = "scripted"; + self.codescripted = undefined; + if ( isDefined( self.deathstring_passed ) ) + { + self.deathstring = self.deathstring_passed; + } + self waittill( "killanimscript" ); } init( origin, angles, animstate, animsubstate, animmode ) { - self.codescripted["origin"] = origin; - self.codescripted["angles"] = angles; - self.codescripted["animState"] = animstate; - self.codescripted["animSubState"] = animsubstate; - - if ( isdefined( animmode ) ) - self.codescripted["AnimMode"] = animmode; - else - self.codescripted["AnimMode"] = "normal"; + self.codescripted[ "origin" ] = origin; + self.codescripted[ "angles" ] = angles; + self.codescripted[ "animState" ] = animstate; + self.codescripted[ "animSubState" ] = animsubstate; + if ( isDefined( animmode ) ) + { + self.codescripted[ "AnimMode" ] = animmode; + } + else + { + self.codescripted[ "AnimMode" ] = "normal"; + } } end_script() { - } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_shared.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_shared.gsc index 8c04353..0ab059c 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_shared.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_shared.gsc @@ -1,460 +1,509 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; deleteatlimit() { - wait 30.0; - self delete(); + wait 30; + self delete(); } lookatentity( looktargetentity, lookduration, lookspeed, eyesonly, interruptothers ) { - + return; } lookatposition( looktargetpos, lookduration, lookspeed, eyesonly, interruptothers ) { /# - assert( isai( self ), "Can only call this function on an AI character" ); + assert( isai( self ), "Can only call this function on an AI character" ); #/ /# - assert( self.a.targetlookinitilized == 1, "LookAtPosition called on AI that lookThread was not called on" ); + assert( self.a.targetlookinitilized == 1, "LookAtPosition called on AI that lookThread was not called on" ); #/ /# - assert( lookspeed == "casual" || lookspeed == "alert", "lookSpeed must be casual or alert" ); + if ( lookspeed != "casual" ) + { + assert( lookspeed == "alert", "lookSpeed must be casual or alert" ); + } #/ - if ( !isdefined( interruptothers ) || interruptothers == "interrupt others" || gettime() > self.a.lookendtime ) - { - self.a.looktargetpos = looktargetpos; - self.a.lookendtime = gettime() + lookduration * 1000; - - if ( lookspeed == "casual" ) - self.a.looktargetspeed = 800; - else - self.a.looktargetspeed = 1600; - - if ( isdefined( eyesonly ) && eyesonly == "eyes only" ) - self notify( "eyes look now" ); - else - self notify( "look now" ); - } + if ( isDefined( interruptothers ) || interruptothers == "interrupt others" && getTime() > self.a.lookendtime ) + { + self.a.looktargetpos = looktargetpos; + self.a.lookendtime = getTime() + ( lookduration * 1000 ); + if ( lookspeed == "casual" ) + { + self.a.looktargetspeed = 800; + } + else + { + self.a.looktargetspeed = 1600; + } + if ( isDefined( eyesonly ) && eyesonly == "eyes only" ) + { + self notify( "eyes look now" ); + return; + } + else + { + self notify( "look now" ); + } + } } lookatanimations( leftanim, rightanim ) { - self.a.lookanimationleft = leftanim; - self.a.lookanimationright = rightanim; + self.a.lookanimationleft = leftanim; + self.a.lookanimationright = rightanim; } handledogsoundnotetracks( note ) { - if ( note == "sound_dogstep_run_default" || note == "dogstep_rf" || note == "dogstep_lf" ) - { - self playsound( "fly_dog_step_run_default" ); - return true; - } - - prefix = getsubstr( note, 0, 5 ); - - if ( prefix != "sound" ) - return false; - - alias = "aml" + getsubstr( note, 5 ); - - if ( isalive( self ) ) - self thread play_sound_on_tag_endon_death( alias, "tag_eye" ); - else - self thread play_sound_in_space( alias, self gettagorigin( "tag_eye" ) ); - - return true; + if ( note != "sound_dogstep_run_default" || note == "dogstep_rf" && note == "dogstep_lf" ) + { + self playsound( "fly_dog_step_run_default" ); + return 1; + } + prefix = getsubstr( note, 0, 5 ); + if ( prefix != "sound" ) + { + return 0; + } + alias = "aml" + getsubstr( note, 5 ); + if ( isalive( self ) ) + { + self thread play_sound_on_tag_endon_death( alias, "tag_eye" ); + } + else + { + self thread play_sound_in_space( alias, self gettagorigin( "tag_eye" ) ); + } + return 1; } growling() { - return isdefined( self.script_growl ); + return isDefined( self.script_growl ); } registernotetracks() { - anim.notetracks["anim_pose = \"stand\""] = ::notetrackposestand; - anim.notetracks["anim_pose = \"crouch\""] = ::notetrackposecrouch; - anim.notetracks["anim_movement = \"stop\""] = ::notetrackmovementstop; - anim.notetracks["anim_movement = \"walk\""] = ::notetrackmovementwalk; - anim.notetracks["anim_movement = \"run\""] = ::notetrackmovementrun; - anim.notetracks["anim_alertness = causal"] = ::notetrackalertnesscasual; - anim.notetracks["anim_alertness = alert"] = ::notetrackalertnessalert; - anim.notetracks["gravity on"] = ::notetrackgravity; - anim.notetracks["gravity off"] = ::notetrackgravity; - anim.notetracks["gravity code"] = ::notetrackgravity; - anim.notetracks["bodyfall large"] = ::notetrackbodyfall; - anim.notetracks["bodyfall small"] = ::notetrackbodyfall; - anim.notetracks["footstep"] = ::notetrackfootstep; - anim.notetracks["step"] = ::notetrackfootstep; - anim.notetracks["footstep_right_large"] = ::notetrackfootstep; - anim.notetracks["footstep_right_small"] = ::notetrackfootstep; - anim.notetracks["footstep_left_large"] = ::notetrackfootstep; - anim.notetracks["footstep_left_small"] = ::notetrackfootstep; - anim.notetracks["footscrape"] = ::notetrackfootscrape; - anim.notetracks["land"] = ::notetrackland; - anim.notetracks["start_ragdoll"] = ::notetrackstartragdoll; + anim.notetracks[ "anim_pose = "stand"" ] = ::notetrackposestand; + anim.notetracks[ "anim_pose = "crouch"" ] = ::notetrackposecrouch; + anim.notetracks[ "anim_movement = "stop"" ] = ::notetrackmovementstop; + anim.notetracks[ "anim_movement = "walk"" ] = ::notetrackmovementwalk; + anim.notetracks[ "anim_movement = "run"" ] = ::notetrackmovementrun; + anim.notetracks[ "anim_alertness = causal" ] = ::notetrackalertnesscasual; + anim.notetracks[ "anim_alertness = alert" ] = ::notetrackalertnessalert; + anim.notetracks[ "gravity on" ] = ::notetrackgravity; + anim.notetracks[ "gravity off" ] = ::notetrackgravity; + anim.notetracks[ "gravity code" ] = ::notetrackgravity; + anim.notetracks[ "bodyfall large" ] = ::notetrackbodyfall; + anim.notetracks[ "bodyfall small" ] = ::notetrackbodyfall; + anim.notetracks[ "footstep" ] = ::notetrackfootstep; + anim.notetracks[ "step" ] = ::notetrackfootstep; + anim.notetracks[ "footstep_right_large" ] = ::notetrackfootstep; + anim.notetracks[ "footstep_right_small" ] = ::notetrackfootstep; + anim.notetracks[ "footstep_left_large" ] = ::notetrackfootstep; + anim.notetracks[ "footstep_left_small" ] = ::notetrackfootstep; + anim.notetracks[ "footscrape" ] = ::notetrackfootscrape; + anim.notetracks[ "land" ] = ::notetrackland; + anim.notetracks[ "start_ragdoll" ] = ::notetrackstartragdoll; } notetrackstopanim( note, flagname ) { - } notetrackstartragdoll( note, flagname ) { - if ( isdefined( self.noragdoll ) ) - return; - - self unlink(); - self startragdoll(); + if ( isDefined( self.noragdoll ) ) + { + return; + } + self unlink(); + self startragdoll(); } notetrackmovementstop( note, flagname ) { - if ( issentient( self ) ) - self.a.movement = "stop"; + if ( issentient( self ) ) + { + self.a.movement = "stop"; + } } notetrackmovementwalk( note, flagname ) { - if ( issentient( self ) ) - self.a.movement = "walk"; + if ( issentient( self ) ) + { + self.a.movement = "walk"; + } } notetrackmovementrun( note, flagname ) { - if ( issentient( self ) ) - self.a.movement = "run"; + if ( issentient( self ) ) + { + self.a.movement = "run"; + } } notetrackalertnesscasual( note, flagname ) { - if ( issentient( self ) ) - self.a.alertness = "casual"; + if ( issentient( self ) ) + { + self.a.alertness = "casual"; + } } notetrackalertnessalert( note, flagname ) { - if ( issentient( self ) ) - self.a.alertness = "alert"; + if ( issentient( self ) ) + { + self.a.alertness = "alert"; + } } notetrackposestand( note, flagname ) { - self.a.pose = "stand"; - self notify( "entered_pose" + "stand" ); + self.a.pose = "stand"; + self notify( "entered_pose" + "stand" ); } notetrackposecrouch( note, flagname ) { - self.a.pose = "crouch"; - self notify( "entered_pose" + "crouch" ); - - if ( self.a.crouchpain ) - { - self.a.crouchpain = 0; - self.health = 150; - } + self.a.pose = "crouch"; + self notify( "entered_pose" + "crouch" ); + if ( self.a.crouchpain ) + { + self.a.crouchpain = 0; + self.health = 150; + } } notetrackgravity( note, flagname ) { - if ( issubstr( note, "on" ) ) - self animmode( "gravity" ); - else if ( issubstr( note, "off" ) ) - { - self animmode( "nogravity" ); - self.nogravity = 1; - } - else if ( issubstr( note, "code" ) ) - { - self animmode( "none" ); - self.nogravity = undefined; - } + if ( issubstr( note, "on" ) ) + { + self animmode( "gravity" ); + } + else if ( issubstr( note, "off" ) ) + { + self animmode( "nogravity" ); + self.nogravity = 1; + } + else + { + if ( issubstr( note, "code" ) ) + { + self animmode( "none" ); + self.nogravity = undefined; + } + } } notetrackbodyfall( note, flagname ) { - if ( isdefined( self.groundtype ) ) - groundtype = self.groundtype; - else - groundtype = "dirt"; - - if ( issubstr( note, "large" ) ) - self playsound( "fly_bodyfall_large_" + groundtype ); - else if ( issubstr( note, "small" ) ) - self playsound( "fly_bodyfall_small_" + groundtype ); + if ( isDefined( self.groundtype ) ) + { + groundtype = self.groundtype; + } + else + { + groundtype = "dirt"; + } + if ( issubstr( note, "large" ) ) + { + self playsound( "fly_bodyfall_large_" + groundtype ); + } + else + { + if ( issubstr( note, "small" ) ) + { + self playsound( "fly_bodyfall_small_" + groundtype ); + } + } } notetrackfootstep( note, flagname ) { - if ( issubstr( note, "left" ) ) - playfootstep( "J_Ball_LE" ); - else - playfootstep( "J_BALL_RI" ); - - if ( !level.clientscripts ) - self playsound( "fly_gear_run" ); + if ( issubstr( note, "left" ) ) + { + playfootstep( "J_Ball_LE" ); + } + else + { + playfootstep( "J_BALL_RI" ); + } + if ( !level.clientscripts ) + { + self playsound( "fly_gear_run" ); + } } notetrackfootscrape( note, flagname ) { - if ( isdefined( self.groundtype ) ) - groundtype = self.groundtype; - else - groundtype = "dirt"; - - self playsound( "fly_step_scrape_" + groundtype ); + if ( isDefined( self.groundtype ) ) + { + groundtype = self.groundtype; + } + else + { + groundtype = "dirt"; + } + self playsound( "fly_step_scrape_" + groundtype ); } notetrackland( note, flagname ) { - if ( isdefined( self.groundtype ) ) - groundtype = self.groundtype; - else - groundtype = "dirt"; - - self playsound( "fly_land_npc_" + groundtype ); + if ( isDefined( self.groundtype ) ) + { + groundtype = self.groundtype; + } + else + { + groundtype = "dirt"; + } + self playsound( "fly_land_npc_" + groundtype ); } handlenotetrack( note, flagname, customfunction, var1 ) { - if ( isai( self ) && self.isdog ) - { - if ( handledogsoundnotetracks( note ) ) - return; - } - else - { - notetrackfunc = anim.notetracks[note]; - - if ( isdefined( notetrackfunc ) ) - return [[ notetrackfunc ]]( note, flagname ); - } - - switch ( note ) - { - case "undefined": - case "finish": - case "end": - if ( isai( self ) && self.a.pose == "back" ) - { - - } - - return note; - case "swish small": - self thread play_sound_in_space( "fly_gear_enemy", self gettagorigin( "TAG_WEAPON_RIGHT" ) ); - break; - case "swish large": - self thread play_sound_in_space( "fly_gear_enemy_large", self gettagorigin( "TAG_WEAPON_RIGHT" ) ); - break; - case "no death": - self.a.nodeath = 1; - break; - case "no pain": - self.allowpain = 0; - break; - case "allow pain": - self.allowpain = 1; - break; - case "anim_melee = right": - case "anim_melee = \"right\"": - self.a.meleestate = "right"; - break; - case "anim_melee = left": - case "anim_melee = \"left\"": - self.a.meleestate = "left"; - break; - case "swap taghelmet to tagleft": - if ( isdefined( self.hatmodel ) ) - { - if ( isdefined( self.helmetsidemodel ) ) - { - self detach( self.helmetsidemodel, "TAG_HELMETSIDE" ); - self.helmetsidemodel = undefined; - } - - self detach( self.hatmodel, "" ); - self attach( self.hatmodel, "TAG_WEAPON_LEFT" ); - self.hatmodel = undefined; - } - - break; - default: - if ( isdefined( customfunction ) ) - { - if ( !isdefined( var1 ) ) - return [[ customfunction ]]( note ); - else - return [[ customfunction ]]( note, var1 ); - } - - break; - } + if ( isai( self ) && self.isdog ) + { + if ( handledogsoundnotetracks( note ) ) + { + return; + } + } + else + { + notetrackfunc = anim.notetracks[ note ]; + if ( isDefined( notetrackfunc ) ) + { + return [[ notetrackfunc ]]( note, flagname ); + } + } + switch( note ) + { + case "end": + case "finish": + case "undefined": + if ( isai( self ) && self.a.pose == "back" ) + { + } + return note; + case "swish small": + self thread play_sound_in_space( "fly_gear_enemy", self gettagorigin( "TAG_WEAPON_RIGHT" ) ); + break; + case "swish large": + self thread play_sound_in_space( "fly_gear_enemy_large", self gettagorigin( "TAG_WEAPON_RIGHT" ) ); + break; + case "no death": + self.a.nodeath = 1; + break; + case "no pain": + self.allowpain = 0; + break; + case "allow pain": + self.allowpain = 1; + break; + case "anim_melee = "right"": + case "anim_melee = right": + self.a.meleestate = "right"; + break; + case "anim_melee = "left"": + case "anim_melee = left": + self.a.meleestate = "left"; + break; + case "swap taghelmet to tagleft": + if ( isDefined( self.hatmodel ) ) + { + if ( isDefined( self.helmetsidemodel ) ) + { + self detach( self.helmetsidemodel, "TAG_HELMETSIDE" ); + self.helmetsidemodel = undefined; + } + self detach( self.hatmodel, "" ); + self attach( self.hatmodel, "TAG_WEAPON_LEFT" ); + self.hatmodel = undefined; + } + break; + default: + if ( isDefined( customfunction ) ) + { + if ( !isDefined( var1 ) ) + { + return [[ customfunction ]]( note ); + } + else + { + return [[ customfunction ]]( note, var1 ); + } + } + } + } } donotetracks( flagname, customfunction, var1 ) { - for (;;) - { - self waittill( flagname, note ); - - if ( !isdefined( note ) ) - note = "undefined"; - - val = self handlenotetrack( note, flagname, customfunction, var1 ); - - if ( isdefined( val ) ) - return val; - } + for ( ;; ) + { + self waittill( flagname, note ); + if ( !isDefined( note ) ) + { + note = "undefined"; + } + val = self handlenotetrack( note, flagname, customfunction, var1 ); + if ( isDefined( val ) ) + { + return val; + } + } } donotetracksforeverproc( notetracksfunc, flagname, killstring, customfunction, var1 ) { - if ( isdefined( killstring ) ) - self endon( killstring ); - - self endon( "killanimscript" ); - - for (;;) - { - time = gettime(); - returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); - timetaken = gettime() - time; - - if ( timetaken < 0.05 ) - { - time = gettime(); - returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); - timetaken = gettime() - time; - - if ( timetaken < 0.05 ) - { + if ( isDefined( killstring ) ) + { + self endon( killstring ); + } + self endon( "killanimscript" ); + for ( ;; ) + { + time = getTime(); + returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); + timetaken = getTime() - time; + if ( timetaken < 0,05 ) + { + time = getTime(); + returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 ); + timetaken = getTime() - time; + if ( timetaken < 0,05 ) + { /# - println( gettime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." ); + println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." ); #/ - wait( 0.05 - timetaken ); - } - } - } + wait ( 0,05 - timetaken ); + } + } + } } donotetracksforever( flagname, killstring, customfunction, var1 ) { - donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 ); + donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 ); } donotetracksfortimeproc( donotetracksforeverfunc, time, flagname, customfunction, ent, var1 ) { - ent endon( "stop_notetracks" ); - [[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 ); + ent endon( "stop_notetracks" ); + [[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 ); } donotetracksfortime( time, flagname, customfunction, var1 ) { - ent = spawnstruct(); - ent thread donotetracksfortimeendnotify( time ); - donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 ); + ent = spawnstruct(); + ent thread donotetracksfortimeendnotify( time ); + donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 ); } donotetracksfortimeendnotify( time ) { - wait( time ); - self notify( "stop_notetracks" ); + wait time; + self notify( "stop_notetracks" ); } playfootstep( foot ) { - if ( !level.clientscripts ) - { - if ( !isai( self ) ) - { - self playsound( "fly_step_run_dirt" ); - return; - } - } - - groundtype = undefined; - - if ( !isdefined( self.groundtype ) ) - { - if ( !isdefined( self.lastgroundtype ) ) - { - if ( !level.clientscripts ) - self playsound( "fly_step_run_dirt" ); - - return; - } - - groundtype = self.lastgroundtype; - } - else - { - groundtype = self.groundtype; - self.lastgroundtype = self.groundtype; - } - - if ( !level.clientscripts ) - self playsound( "fly_step_run_" + groundtype ); - - [[ anim.optionalstepeffectfunction ]]( foot, groundtype ); + if ( !level.clientscripts ) + { + if ( !isai( self ) ) + { + self playsound( "fly_step_run_dirt" ); + return; + } + } + groundtype = undefined; + if ( !isDefined( self.groundtype ) ) + { + if ( !isDefined( self.lastgroundtype ) ) + { + if ( !level.clientscripts ) + { + self playsound( "fly_step_run_dirt" ); + } + return; + } + groundtype = self.lastgroundtype; + } + else + { + groundtype = self.groundtype; + self.lastgroundtype = self.groundtype; + } + if ( !level.clientscripts ) + { + self playsound( "fly_step_run_" + groundtype ); + } + [[ anim.optionalstepeffectfunction ]]( foot, groundtype ); } playfootstepeffect( foot, groundtype ) { - if ( level.clientscripts ) - return; - - for ( i = 0; i < anim.optionalstepeffects.size; i++ ) - { - if ( isdefined( self.fire_footsteps ) && self.fire_footsteps ) - groundtype = "fire"; - - if ( groundtype != anim.optionalstepeffects[i] ) - continue; - - org = self gettagorigin( foot ); - playfx( level._effect["step_" + anim.optionalstepeffects[i]], org, org + vectorscale( ( 0, 0, 1 ), 100.0 ) ); - return; - } + if ( level.clientscripts ) + { + return; + } + i = 0; + while ( i < anim.optionalstepeffects.size ) + { + if ( isDefined( self.fire_footsteps ) && self.fire_footsteps ) + { + groundtype = "fire"; + } + if ( groundtype != anim.optionalstepeffects[ i ] ) + { + i++; + continue; + } + else + { + org = self gettagorigin( foot ); + playfx( level._effect[ "step_" + anim.optionalstepeffects[ i ] ], org, org + vectorScale( ( 0, 0, 1 ), 100 ) ); + return; + } + i++; + } } movetooriginovertime( origin, time ) { - self endon( "killanimscript" ); - - if ( distancesquared( self.origin, origin ) > 256 && !self maymovetopoint( origin ) ) - { + self endon( "killanimscript" ); + if ( distancesquared( self.origin, origin ) > 256 && !self maymovetopoint( origin ) ) + { /# - println( "^1Warning: AI starting behavior for node at " + origin + " but could not move to that point." ); + println( "^1Warning: AI starting behavior for node at " + origin + " but could not move to that point." ); #/ - return; - } - - self.keepclaimednodeingoal = 1; - offset = self.origin - origin; - frames = int( time * 20 ); - offsetreduction = vectorscale( offset, 1.0 / frames ); - - for ( i = 0; i < frames; i++ ) - { - offset -= offsetreduction; - self teleport( origin + offset ); - wait 0.05; - } - - self.keepclaimednodeingoal = 0; + return; + } + self.keepclaimednodeingoal = 1; + offset = self.origin - origin; + frames = int( time * 20 ); + offsetreduction = vectorScale( offset, 1 / frames ); + i = 0; + while ( i < frames ) + { + offset -= offsetreduction; + self teleport( origin + offset ); + wait 0,05; + i++; + } + self.keepclaimednodeingoal = 0; } returntrue() { - return 1; + return 1; } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_stop.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_stop.gsc index 1026550..b1c5f11 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_stop.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_stop.gsc @@ -1,27 +1,26 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; main() { - self endon( "killanimscript" ); - - for (;;) - { - if ( isdefined( level.ignore_stop_func ) ) - { - if ( self [[ level.ignore_stop_func ]]() ) - return; - } - - if ( !self hasanimstatefromasd( "zm_idle" ) ) - return; - - animstate = maps\mp\animscripts\zm_utility::append_missing_legs_suffix( "zm_idle" ); - self setanimstatefromasd( animstate ); - maps\mp\animscripts\zm_shared::donotetracks( "idle_anim" ); - } + self endon( "killanimscript" ); + for ( ;; ) + { + if ( isDefined( level.ignore_stop_func ) ) + { + if ( self [[ level.ignore_stop_func ]]() ) + { + return; + } + } + if ( !self hasanimstatefromasd( "zm_idle" ) ) + { + return; + } + animstate = maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "zm_idle" ); + self setanimstatefromasd( animstate ); + maps/mp/animscripts/zm_shared::donotetracks( "idle_anim" ); + } } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_turn.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_turn.gsc index 719610b..bdf6899 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_turn.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_turn.gsc @@ -1,9 +1,6 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\shared; +#include maps/mp/animscripts/shared; +#include maps/mp/animscripts/utility; main() { - } diff --git a/Zombie Core/patch_zm/maps/mp/animscripts/zm_utility.gsc b/Zombie Core/patch_zm/maps/mp/animscripts/zm_utility.gsc index 4f7e208..b357ed8 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_utility.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_utility.gsc @@ -1,1122 +1,1243 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\animscripts\shared; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\zm_shared; -#include maps\mp\_utility; +#include maps/mp/_utility; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/utility; +#include maps/mp/animscripts/shared; append_missing_legs_suffix( animstate ) { - if ( isdefined( self.has_legs ) && !self.has_legs && self hasanimstatefromasd( animstate + "_crawl" ) ) - return animstate + "_crawl"; - - return animstate; + if ( isDefined( self.has_legs ) && !self.has_legs && self hasanimstatefromasd( animstate + "_crawl" ) ) + { + return animstate + "_crawl"; + } + return animstate; } initanimtree( animscript ) { - if ( animscript != "pain" && animscript != "death" ) - self.a.special = "none"; + if ( animscript != "pain" && animscript != "death" ) + { + self.a.special = "none"; + } /# - assert( isdefined( animscript ), "Animscript not specified in initAnimTree" ); + assert( isDefined( animscript ), "Animscript not specified in initAnimTree" ); #/ - self.a.script = animscript; + self.a.script = animscript; } updateanimpose() { /# - assert( self.a.movement == "stop" || self.a.movement == "walk" || self.a.movement == "run", "UpdateAnimPose " + self.a.pose + " " + self.a.movement ); + if ( self.a.movement != "stop" && self.a.movement != "walk" ) + { + assert( self.a.movement == "run", "UpdateAnimPose " + self.a.pose + " " + self.a.movement ); + } #/ - self.desired_anim_pose = undefined; + self.desired_anim_pose = undefined; } initialize( animscript ) { - if ( isdefined( self.longdeathstarting ) ) - { - if ( animscript != "pain" && animscript != "death" ) - self dodamage( self.health + 100, self.origin ); - - if ( animscript != "pain" ) - { - self.longdeathstarting = undefined; - self notify( "kill_long_death" ); - } - } - - if ( isdefined( self.a.mayonlydie ) && animscript != "death" ) - self dodamage( self.health + 100, self.origin ); - - if ( isdefined( self.a.postscriptfunc ) ) - { - scriptfunc = self.a.postscriptfunc; - self.a.postscriptfunc = undefined; - [[ scriptfunc ]]( animscript ); - } - - if ( animscript != "death" ) - self.a.nodeath = 0; - - self.isholdinggrenade = undefined; - self.covernode = undefined; - self.changingcoverpos = 0; - self.a.scriptstarttime = gettime(); - self.a.atconcealmentnode = 0; - - if ( isdefined( self.node ) && ( self.node.type == "Conceal Crouch" || self.node.type == "Conceal Stand" ) ) - self.a.atconcealmentnode = 1; - - initanimtree( animscript ); - updateanimpose(); + if ( isDefined( self.longdeathstarting ) ) + { + if ( animscript != "pain" && animscript != "death" ) + { + self dodamage( self.health + 100, self.origin ); + } + if ( animscript != "pain" ) + { + self.longdeathstarting = undefined; + self notify( "kill_long_death" ); + } + } + if ( isDefined( self.a.mayonlydie ) && animscript != "death" ) + { + self dodamage( self.health + 100, self.origin ); + } + if ( isDefined( self.a.postscriptfunc ) ) + { + scriptfunc = self.a.postscriptfunc; + self.a.postscriptfunc = undefined; + [[ scriptfunc ]]( animscript ); + } + if ( animscript != "death" ) + { + self.a.nodeath = 0; + } + self.isholdinggrenade = undefined; + self.covernode = undefined; + self.changingcoverpos = 0; + self.a.scriptstarttime = getTime(); + self.a.atconcealmentnode = 0; + if ( isDefined( self.node ) || self.node.type == "Conceal Crouch" && self.node.type == "Conceal Stand" ) + { + self.a.atconcealmentnode = 1; + } + initanimtree( animscript ); + updateanimpose(); } getnodeyawtoorigin( pos ) { - if ( isdefined( self.node ) ) - yaw = self.node.angles[1] - getyaw( pos ); - else - yaw = self.angles[1] - getyaw( pos ); - - yaw = angleclamp180( yaw ); - return yaw; + if ( isDefined( self.node ) ) + { + yaw = self.node.angles[ 1 ] - getyaw( pos ); + } + else + { + yaw = self.angles[ 1 ] - getyaw( pos ); + } + yaw = angleClamp180( yaw ); + return yaw; } getnodeyawtoenemy() { - pos = undefined; - - if ( isvalidenemy( self.enemy ) ) - pos = self.enemy.origin; - else - { - if ( isdefined( self.node ) ) - forward = anglestoforward( self.node.angles ); - else - forward = anglestoforward( self.angles ); - - forward = vectorscale( forward, 150 ); - pos = self.origin + forward; - } - - if ( isdefined( self.node ) ) - yaw = self.node.angles[1] - getyaw( pos ); - else - yaw = self.angles[1] - getyaw( pos ); - - yaw = angleclamp180( yaw ); - return yaw; + pos = undefined; + if ( isvalidenemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + if ( isDefined( self.node ) ) + { + forward = anglesToForward( self.node.angles ); + } + else + { + forward = anglesToForward( self.angles ); + } + forward = vectorScale( forward, 150 ); + pos = self.origin + forward; + } + if ( isDefined( self.node ) ) + { + yaw = self.node.angles[ 1 ] - getyaw( pos ); + } + else + { + yaw = self.angles[ 1 ] - getyaw( pos ); + } + yaw = angleClamp180( yaw ); + return yaw; } getcovernodeyawtoenemy() { - pos = undefined; - - if ( isvalidenemy( self.enemy ) ) - pos = self.enemy.origin; - else - { - forward = anglestoforward( self.covernode.angles + self.animarray["angle_step_out"][self.a.cornermode] ); - forward = vectorscale( forward, 150 ); - pos = self.origin + forward; - } - - yaw = self.covernode.angles[1] + self.animarray["angle_step_out"][self.a.cornermode] - getyaw( pos ); - yaw = angleclamp180( yaw ); - return yaw; + pos = undefined; + if ( isvalidenemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + forward = anglesToForward( self.covernode.angles + self.animarray[ "angle_step_out" ][ self.a.cornermode ] ); + forward = vectorScale( forward, 150 ); + pos = self.origin + forward; + } + yaw = ( self.covernode.angles[ 1 ] + self.animarray[ "angle_step_out" ][ self.a.cornermode ] ) - getyaw( pos ); + yaw = angleClamp180( yaw ); + return yaw; } getyawtospot( spot ) { - pos = spot; - yaw = self.angles[1] - getyaw( pos ); - yaw = angleclamp180( yaw ); - return yaw; + pos = spot; + yaw = self.angles[ 1 ] - getyaw( pos ); + yaw = angleClamp180( yaw ); + return yaw; } getyawtoenemy() { - pos = undefined; - - if ( isvalidenemy( self.enemy ) ) - pos = self.enemy.origin; - else - { - forward = anglestoforward( self.angles ); - forward = vectorscale( forward, 150 ); - pos = self.origin + forward; - } - - yaw = self.angles[1] - getyaw( pos ); - yaw = angleclamp180( yaw ); - return yaw; + pos = undefined; + if ( isvalidenemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + forward = anglesToForward( self.angles ); + forward = vectorScale( forward, 150 ); + pos = self.origin + forward; + } + yaw = self.angles[ 1 ] - getyaw( pos ); + yaw = angleClamp180( yaw ); + return yaw; } getyaw( org ) { - angles = vectortoangles( org - self.origin ); - return angles[1]; + angles = vectorToAngle( org - self.origin ); + return angles[ 1 ]; } getyaw2d( org ) { - angles = vectortoangles( ( org[0], org[1], 0 ) - ( self.origin[0], self.origin[1], 0 ) ); - return angles[1]; + angles = vectorToAngle( ( org[ 0 ], org[ 1 ], 0 ) - ( self.origin[ 0 ], self.origin[ 1 ], 0 ) ); + return angles[ 1 ]; } absyawtoenemy() { /# - assert( isvalidenemy( self.enemy ) ); + assert( isvalidenemy( self.enemy ) ); #/ - yaw = self.angles[1] - getyaw( self.enemy.origin ); - yaw = angleclamp180( yaw ); - - if ( yaw < 0 ) - yaw = -1 * yaw; - - return yaw; + yaw = self.angles[ 1 ] - getyaw( self.enemy.origin ); + yaw = angleClamp180( yaw ); + if ( yaw < 0 ) + { + yaw = -1 * yaw; + } + return yaw; } absyawtoenemy2d() { /# - assert( isvalidenemy( self.enemy ) ); + assert( isvalidenemy( self.enemy ) ); #/ - yaw = self.angles[1] - getyaw2d( self.enemy.origin ); - yaw = angleclamp180( yaw ); - - if ( yaw < 0 ) - yaw = -1 * yaw; - - return yaw; + yaw = self.angles[ 1 ] - getyaw2d( self.enemy.origin ); + yaw = angleClamp180( yaw ); + if ( yaw < 0 ) + { + yaw = -1 * yaw; + } + return yaw; } absyawtoorigin( org ) { - yaw = self.angles[1] - getyaw( org ); - yaw = angleclamp180( yaw ); - - if ( yaw < 0 ) - yaw = -1 * yaw; - - return yaw; + yaw = self.angles[ 1 ] - getyaw( org ); + yaw = angleClamp180( yaw ); + if ( yaw < 0 ) + { + yaw = -1 * yaw; + } + return yaw; } absyawtoangles( angles ) { - yaw = self.angles[1] - angles; - yaw = angleclamp180( yaw ); - - if ( yaw < 0 ) - yaw = -1 * yaw; - - return yaw; + yaw = self.angles[ 1 ] - angles; + yaw = angleClamp180( yaw ); + if ( yaw < 0 ) + { + yaw = -1 * yaw; + } + return yaw; } getyawfromorigin( org, start ) { - angles = vectortoangles( org - start ); - return angles[1]; + angles = vectorToAngle( org - start ); + return angles[ 1 ]; } getyawtotag( tag, org ) { - yaw = self gettagangles( tag )[1] - getyawfromorigin( org, self gettagorigin( tag ) ); - yaw = angleclamp180( yaw ); - return yaw; + yaw = self gettagangles( tag )[ 1 ] - getyawfromorigin( org, self gettagorigin( tag ) ); + yaw = angleClamp180( yaw ); + return yaw; } getyawtoorigin( org ) { - yaw = self.angles[1] - getyaw( org ); - yaw = angleclamp180( yaw ); - return yaw; + yaw = self.angles[ 1 ] - getyaw( org ); + yaw = angleClamp180( yaw ); + return yaw; } geteyeyawtoorigin( org ) { - yaw = self gettagangles( "TAG_EYE" )[1] - getyaw( org ); - yaw = angleclamp180( yaw ); - return yaw; + yaw = self gettagangles( "TAG_EYE" )[ 1 ] - getyaw( org ); + yaw = angleClamp180( yaw ); + return yaw; } getcovernodeyawtoorigin( org ) { - yaw = self.covernode.angles[1] + self.animarray["angle_step_out"][self.a.cornermode] - getyaw( org ); - yaw = angleclamp180( yaw ); - return yaw; + yaw = ( self.covernode.angles[ 1 ] + self.animarray[ "angle_step_out" ][ self.a.cornermode ] ) - getyaw( org ); + yaw = angleClamp180( yaw ); + return yaw; } isstanceallowedwrapper( stance ) { - if ( isdefined( self.covernode ) ) - return self.covernode doesnodeallowstance( stance ); - - return self isstanceallowed( stance ); + if ( isDefined( self.covernode ) ) + { + return self.covernode doesnodeallowstance( stance ); + } + return self isstanceallowed( stance ); } getclaimednode() { - mynode = self.node; - - if ( isdefined( mynode ) && ( self nearnode( mynode ) || isdefined( self.covernode ) && mynode == self.covernode ) ) - return mynode; - - return undefined; + mynode = self.node; + if ( isDefined( mynode ) || self nearnode( mynode ) && isDefined( self.covernode ) && mynode == self.covernode ) + { + return mynode; + } + return undefined; } getnodetype() { - mynode = getclaimednode(); - - if ( isdefined( mynode ) ) - return mynode.type; - - return "none"; + mynode = getclaimednode(); + if ( isDefined( mynode ) ) + { + return mynode.type; + } + return "none"; } getnodedirection() { - mynode = getclaimednode(); - - if ( isdefined( mynode ) ) - return mynode.angles[1]; - - return self.desiredangle; + mynode = getclaimednode(); + if ( isDefined( mynode ) ) + { + return mynode.angles[ 1 ]; + } + return self.desiredangle; } getnodeforward() { - mynode = getclaimednode(); - - if ( isdefined( mynode ) ) - return anglestoforward( mynode.angles ); - - return anglestoforward( self.angles ); + mynode = getclaimednode(); + if ( isDefined( mynode ) ) + { + return anglesToForward( mynode.angles ); + } + return anglesToForward( self.angles ); } getnodeorigin() { - mynode = getclaimednode(); - - if ( isdefined( mynode ) ) - return mynode.origin; - - return self.origin; + mynode = getclaimednode(); + if ( isDefined( mynode ) ) + { + return mynode.origin; + } + return self.origin; } safemod( a, b ) { - result = int( a ) % b; - result += b; - return result % b; + result = int( a ) % b; + result += b; + return result % b; } angleclamp( angle ) { - anglefrac = angle / 360.0; - angle = ( anglefrac - floor( anglefrac ) ) * 360.0; - return angle; + anglefrac = angle / 360; + angle = ( anglefrac - floor( anglefrac ) ) * 360; + return angle; } quadrantanimweights( yaw ) { - forwardweight = ( 90 - abs( yaw ) ) / 90; - leftweight = ( 90 - absangleclamp180( abs( yaw - 90 ) ) ) / 90; - result["front"] = 0; - result["right"] = 0; - result["back"] = 0; - result["left"] = 0; - - if ( isdefined( self.alwaysrunforward ) ) - { + forwardweight = ( 90 - abs( yaw ) ) / 90; + leftweight = ( 90 - absangleclamp180( abs( yaw - 90 ) ) ) / 90; + result[ "front" ] = 0; + result[ "right" ] = 0; + result[ "back" ] = 0; + result[ "left" ] = 0; + if ( isDefined( self.alwaysrunforward ) ) + { /# - assert( self.alwaysrunforward ); + assert( self.alwaysrunforward ); #/ - result["front"] = 1; - return result; - } - - useleans = getdvarint( "ai_useLeanRunAnimations" ); - - if ( forwardweight > 0 ) - { - result["front"] = forwardweight; - - if ( leftweight > 0 ) - result["left"] = leftweight; - else - result["right"] = -1 * leftweight; - } - else if ( useleans ) - { - result["back"] = -1 * forwardweight; - - if ( leftweight > 0 ) - result["left"] = leftweight; - else - result["right"] = -1 * leftweight; - } - else - { - backweight = -1 * forwardweight; - - if ( leftweight > backweight ) - result["left"] = 1; - else if ( leftweight < forwardweight ) - result["right"] = 1; - else - result["back"] = 1; - } - - return result; + result[ "front" ] = 1; + return result; + } + useleans = getDvarInt( "ai_useLeanRunAnimations" ); + if ( forwardweight > 0 ) + { + result[ "front" ] = forwardweight; + if ( leftweight > 0 ) + { + result[ "left" ] = leftweight; + } + else + { + result[ "right" ] = -1 * leftweight; + } + } + else if ( useleans ) + { + result[ "back" ] = -1 * forwardweight; + if ( leftweight > 0 ) + { + result[ "left" ] = leftweight; + } + else + { + result[ "right" ] = -1 * leftweight; + } + } + else backweight = -1 * forwardweight; + if ( leftweight > backweight ) + { + result[ "left" ] = 1; + } + else if ( leftweight < forwardweight ) + { + result[ "right" ] = 1; + } + else + { + result[ "back" ] = 1; + } + return result; } getquadrant( angle ) { - angle = angleclamp( angle ); - - if ( angle < 45 || angle > 315 ) - quadrant = "front"; - else if ( angle < 135 ) - quadrant = "left"; - else if ( angle < 225 ) - quadrant = "back"; - else - quadrant = "right"; - - return quadrant; + angle = angleclamp( angle ); + if ( angle < 45 || angle > 315 ) + { + quadrant = "front"; + } + else + { + if ( angle < 135 ) + { + quadrant = "left"; + } + else if ( angle < 225 ) + { + quadrant = "back"; + } + else + { + quadrant = "right"; + } + } + return quadrant; } isinset( input, set ) { - for ( i = set.size - 1; i >= 0; i-- ) - { - if ( input == set[i] ) - return true; - } + i = set.size - 1; + while ( i >= 0 ) + { + if ( input == set[ i ] ) + { + return 1; + } + i--; - return false; + } + return 0; } notifyaftertime( notifystring, killmestring, time ) { - self endon( "death" ); - self endon( killmestring ); - wait( time ); - self notify( notifystring ); + self endon( "death" ); + self endon( killmestring ); + wait time; + self notify( notifystring ); } drawstringtime( msg, org, color, timer ) { /# - maxtime = timer * 20; - - for ( i = 0; i < maxtime; i++ ) - { - print3d( org, msg, color, 1, 1 ); - wait 0.05; - } + maxtime = timer * 20; + i = 0; + while ( i < maxtime ) + { + print3d( org, msg, color, 1, 1 ); + wait 0,05; + i++; #/ + } } showlastenemysightpos( string ) { /# - self notify( "got known enemy2" ); - self endon( "got known enemy2" ); - self endon( "death" ); - - if ( !isvalidenemy( self.enemy ) ) - return; - - if ( self.enemy.team == "allies" ) - color = ( 0.4, 0.7, 1 ); - else - color = ( 1, 0.7, 0.4 ); - - while ( true ) - { - wait 0.05; - - if ( !isdefined( self.lastenemysightpos ) ) - continue; - - print3d( self.lastenemysightpos, string, color, 1, 2.15 ); - } + self notify( "got known enemy2" ); + self endon( "got known enemy2" ); + self endon( "death" ); + if ( !isvalidenemy( self.enemy ) ) + { + return; + } + if ( self.enemy.team == "allies" ) + { + color = ( 0,4, 0,7, 1 ); + } + else + { + color = ( 1, 0,7, 0,4 ); + } + while ( 1 ) + { + wait 0,05; + while ( !isDefined( self.lastenemysightpos ) ) + { + continue; + } + print3d( self.lastenemysightpos, string, color, 1, 2,15 ); #/ + } } debugtimeout() { - wait 5; - self notify( "timeout" ); + wait 5; + self notify( "timeout" ); } debugposinternal( org, string, size ) { /# - self endon( "death" ); - self notify( "stop debug " + org ); - self endon( "stop debug " + org ); - ent = spawnstruct(); - ent thread debugtimeout(); - ent endon( "timeout" ); - - if ( self.enemy.team == "allies" ) - color = ( 0.4, 0.7, 1 ); - else - color = ( 1, 0.7, 0.4 ); - - while ( true ) - { - wait 0.05; - print3d( org, string, color, 1, size ); - } + self endon( "death" ); + self notify( "stop debug " + org ); + self endon( "stop debug " + org ); + ent = spawnstruct(); + ent thread debugtimeout(); + ent endon( "timeout" ); + if ( self.enemy.team == "allies" ) + { + color = ( 0,4, 0,7, 1 ); + } + else + { + color = ( 1, 0,7, 0,4 ); + } + while ( 1 ) + { + wait 0,05; + print3d( org, string, color, 1, size ); #/ + } } debugpos( org, string ) { - thread debugposinternal( org, string, 2.15 ); + thread debugposinternal( org, string, 2,15 ); } debugpossize( org, string, size ) { - thread debugposinternal( org, string, size ); + thread debugposinternal( org, string, size ); } showdebugproc( frompoint, topoint, color, printtime ) { /# - self endon( "death" ); - timer = printtime * 20; - - for ( i = 0; i < timer; i += 1 ) - { - wait 0.05; - line( frompoint, topoint, color ); - } + self endon( "death" ); + timer = printtime * 20; + i = 0; + while ( i < timer ) + { + wait 0,05; + line( frompoint, topoint, color ); + i += 1; #/ + } } showdebugline( frompoint, topoint, color, printtime ) { - self thread showdebugproc( frompoint, topoint + vectorscale( ( 0, 0, -1 ), 5.0 ), color, printtime ); + self thread showdebugproc( frompoint, topoint + vectorScale( ( 0, 0, 1 ), 5 ), color, printtime ); } getnodeoffset( node ) { - if ( isdefined( node.offset ) ) - return node.offset; - - cover_left_crouch_offset = ( -26, 0.4, 36 ); - cover_left_stand_offset = ( -32, 7, 63 ); - cover_right_crouch_offset = ( 43.5, 11, 36 ); - cover_right_stand_offset = ( 36, 8.3, 63 ); - cover_crouch_offset = ( 3.5, -12.5, 45 ); - cover_stand_offset = ( -3.7, -22, 63 ); - cornernode = 0; - nodeoffset = ( 0, 0, 0 ); - right = anglestoright( node.angles ); - forward = anglestoforward( node.angles ); - - switch ( node.type ) - { - case "Cover Left Wide": - case "Cover Left": - if ( node isnodedontstand() && !node isnodedontcrouch() ) - nodeoffset = calculatenodeoffset( right, forward, cover_left_crouch_offset ); - else - nodeoffset = calculatenodeoffset( right, forward, cover_left_stand_offset ); - - break; - case "Cover Right Wide": - case "Cover Right": - if ( node isnodedontstand() && !node isnodedontcrouch() ) - nodeoffset = calculatenodeoffset( right, forward, cover_right_crouch_offset ); - else - nodeoffset = calculatenodeoffset( right, forward, cover_right_stand_offset ); - - break; - case "Turret": - case "Cover Stand": - case "Conceal Stand": - nodeoffset = calculatenodeoffset( right, forward, cover_stand_offset ); - break; - case "Cover Crouch Window": - case "Cover Crouch": - case "Conceal Crouch": - nodeoffset = calculatenodeoffset( right, forward, cover_crouch_offset ); - break; - } - - node.offset = nodeoffset; - return node.offset; + if ( isDefined( node.offset ) ) + { + return node.offset; + } + cover_left_crouch_offset = ( -26, 0,4, 36 ); + cover_left_stand_offset = ( -32, 7, 63 ); + cover_right_crouch_offset = ( 43,5, 11, 36 ); + cover_right_stand_offset = ( 36, 8,3, 63 ); + cover_crouch_offset = ( 3,5, -12,5, 45 ); + cover_stand_offset = ( -3,7, -22, 63 ); + cornernode = 0; + nodeoffset = ( 0, 0, 1 ); + right = anglesToRight( node.angles ); + forward = anglesToForward( node.angles ); + switch( node.type ) + { + case "Cover Left": + case "Cover Left Wide": + if ( node isnodedontstand() && !node isnodedontcrouch() ) + { + nodeoffset = calculatenodeoffset( right, forward, cover_left_crouch_offset ); + } + else + { + nodeoffset = calculatenodeoffset( right, forward, cover_left_stand_offset ); + } + break; + case "Cover Right": + case "Cover Right Wide": + if ( node isnodedontstand() && !node isnodedontcrouch() ) + { + nodeoffset = calculatenodeoffset( right, forward, cover_right_crouch_offset ); + } + else + { + nodeoffset = calculatenodeoffset( right, forward, cover_right_stand_offset ); + } + break; + case "Conceal Stand": + case "Cover Stand": + case "Turret": + nodeoffset = calculatenodeoffset( right, forward, cover_stand_offset ); + break; + case "Conceal Crouch": + case "Cover Crouch": + case "Cover Crouch Window": + nodeoffset = calculatenodeoffset( right, forward, cover_crouch_offset ); + break; + } + node.offset = nodeoffset; + return node.offset; } calculatenodeoffset( right, forward, baseoffset ) { - return vectorscale( right, baseoffset[0] ) + vectorscale( forward, baseoffset[1] ) + ( 0, 0, baseoffset[2] ); + return vectorScale( right, baseoffset[ 0 ] ) + vectorScale( forward, baseoffset[ 1 ] ) + ( 0, 0, baseoffset[ 2 ] ); } checkpitchvisibility( frompoint, topoint, atnode ) { - pitch = angleclamp180( vectortoangles( topoint - frompoint )[0] ); - - if ( abs( pitch ) > 45 ) - { - if ( isdefined( atnode ) && atnode.type != "Cover Crouch" && atnode.type != "Conceal Crouch" ) - return false; - - if ( pitch > 45 || pitch < anim.covercrouchleanpitch - 45 ) - return false; - } - - return true; + pitch = angleClamp180( vectorToAngle( topoint - frompoint )[ 0 ] ); + if ( abs( pitch ) > 45 ) + { + if ( isDefined( atnode ) && atnode.type != "Cover Crouch" && atnode.type != "Conceal Crouch" ) + { + return 0; + } + if ( pitch > 45 || pitch < ( anim.covercrouchleanpitch - 45 ) ) + { + return 0; + } + } + return 1; } showlines( start, end, end2 ) { /# - for (;;) - { - line( start, end, ( 1, 0, 0 ), 1 ); - wait 0.05; - line( start, end2, ( 0, 0, 1 ), 1 ); - wait 0.05; - } + for ( ;; ) + { + line( start, end, ( 0, 0, 1 ), 1 ); + wait 0,05; + line( start, end2, ( 0, 0, 1 ), 1 ); + wait 0,05; #/ + } } anim_array( animarray, animweights ) { - total_anims = animarray.size; - idleanim = randomint( total_anims ); + total_anims = animarray.size; + idleanim = randomint( total_anims ); /# - assert( total_anims ); + assert( total_anims ); #/ /# - assert( animarray.size == animweights.size ); + assert( animarray.size == animweights.size ); #/ - if ( total_anims == 1 ) - return animarray[0]; - - weights = 0; - total_weight = 0; - - for ( i = 0; i < total_anims; i++ ) - total_weight += animweights[i]; - - anim_play = randomfloat( total_weight ); - current_weight = 0; - - for ( i = 0; i < total_anims; i++ ) - { - current_weight += animweights[i]; - - if ( anim_play >= current_weight ) - continue; - - idleanim = i; - break; - } - - return animarray[idleanim]; + if ( total_anims == 1 ) + { + return animarray[ 0 ]; + } + weights = 0; + total_weight = 0; + i = 0; + while ( i < total_anims ) + { + total_weight += animweights[ i ]; + i++; + } + anim_play = randomfloat( total_weight ); + current_weight = 0; + i = 0; + while ( i < total_anims ) + { + current_weight += animweights[ i ]; + if ( anim_play >= current_weight ) + { + i++; + continue; + } + else + { + idleanim = i; + break; + } + i++; + } + return animarray[ idleanim ]; } notforcedcover() { - return self.a.forced_cover == "none" || self.a.forced_cover == "Show"; + if ( self.a.forced_cover != "none" ) + { + return self.a.forced_cover == "Show"; + } } forcedcover( msg ) { - return isdefined( self.a.forced_cover ) && self.a.forced_cover == msg; + if ( isDefined( self.a.forced_cover ) ) + { + return self.a.forced_cover == msg; + } } print3dtime( timer, org, msg, color, alpha, scale ) { /# - newtime = timer / 0.05; - - for ( i = 0; i < newtime; i++ ) - { - print3d( org, msg, color, alpha, scale ); - wait 0.05; - } + newtime = timer / 0,05; + i = 0; + while ( i < newtime ) + { + print3d( org, msg, color, alpha, scale ); + wait 0,05; + i++; #/ + } } print3drise( org, msg, color, alpha, scale ) { /# - newtime = 100.0; - up = 0; - org = org; - - for ( i = 0; i < newtime; i++ ) - { - up += 0.5; - print3d( org + ( 0, 0, up ), msg, color, alpha, scale ); - wait 0.05; - } + newtime = 100; + up = 0; + org = org; + i = 0; + while ( i < newtime ) + { + up += 0,5; + print3d( org + ( 0, 0, up ), msg, color, alpha, scale ); + wait 0,05; + i++; #/ + } } crossproduct( vec1, vec2 ) { - return vec1[0] * vec2[1] - vec1[1] * vec2[0] > 0; + return ( ( vec1[ 0 ] * vec2[ 1 ] ) - ( vec1[ 1 ] * vec2[ 0 ] ) ) > 0; } scriptchange() { - self.a.current_script = "none"; - self notify( anim.scriptchange ); + self.a.current_script = "none"; + self notify( anim.scriptchange ); } delayedscriptchange() { - wait 0.05; - scriptchange(); + wait 0,05; + scriptchange(); } getgrenademodel() { - return getweaponmodel( self.grenadeweapon ); + return getweaponmodel( self.grenadeweapon ); } sawenemymove( timer ) { - if ( !isdefined( timer ) ) - timer = 500; - - return gettime() - self.personalsighttime < timer; + if ( !isDefined( timer ) ) + { + timer = 500; + } + return ( getTime() - self.personalsighttime ) < timer; } canthrowgrenade() { - if ( !self.grenadeammo ) - return 0; - - if ( self.script_forcegrenade ) - return 1; - - return isplayer( self.enemy ); + if ( !self.grenadeammo ) + { + return 0; + } + if ( self.script_forcegrenade ) + { + return 1; + } + return isplayer( self.enemy ); } random_weight( array ) { - idleanim = randomint( array.size ); - - if ( array.size > 1 ) - { - anim_weight = 0; - - for ( i = 0; i < array.size; i++ ) - anim_weight += array[i]; - - anim_play = randomfloat( anim_weight ); - anim_weight = 0; - - for ( i = 0; i < array.size; i++ ) - { - anim_weight += array[i]; - - if ( anim_play < anim_weight ) - { - idleanim = i; - break; - } - } - } - - return idleanim; + idleanim = randomint( array.size ); + while ( array.size > 1 ) + { + anim_weight = 0; + i = 0; + while ( i < array.size ) + { + anim_weight += array[ i ]; + i++; + } + anim_play = randomfloat( anim_weight ); + anim_weight = 0; + i = 0; + while ( i < array.size ) + { + anim_weight += array[ i ]; + if ( anim_play < anim_weight ) + { + idleanim = i; + break; + } + else + { + i++; + } + } + } + return idleanim; } setfootstepeffect( name, fx ) { /# - assert( isdefined( name ), "Need to define the footstep surface type." ); + assert( isDefined( name ), "Need to define the footstep surface type." ); #/ /# - assert( isdefined( fx ), "Need to define the mud footstep effect." ); + assert( isDefined( fx ), "Need to define the mud footstep effect." ); #/ - if ( !isdefined( anim.optionalstepeffects ) ) - anim.optionalstepeffects = []; - - anim.optionalstepeffects[anim.optionalstepeffects.size] = name; - level._effect["step_" + name] = fx; - anim.optionalstepeffectfunction = maps\mp\animscripts\zm_shared::playfootstepeffect; + if ( !isDefined( anim.optionalstepeffects ) ) + { + anim.optionalstepeffects = []; + } + anim.optionalstepeffects[ anim.optionalstepeffects.size ] = name; + level._effect[ "step_" + name ] = fx; + anim.optionalstepeffectfunction = ::maps/mp/animscripts/zm_shared::playfootstepeffect; } persistentdebugline( start, end ) { /# - self endon( "death" ); - level notify( "newdebugline" ); - level endon( "newdebugline" ); - - for (;;) - { - line( start, end, ( 0.3, 1, 0 ), 1 ); - wait 0.05; - } + self endon( "death" ); + level notify( "newdebugline" ); + level endon( "newdebugline" ); + for ( ;; ) + { + line( start, end, ( 0,3, 1, 0 ), 1 ); + wait 0,05; #/ + } } isnodedontstand() { - return ( self.spawnflags & 4 ) == 4; + return ( self.spawnflags & 4 ) == 4; } isnodedontcrouch() { - return ( self.spawnflags & 8 ) == 8; + return ( self.spawnflags & 8 ) == 8; } doesnodeallowstance( stance ) { - if ( stance == "stand" ) - return !self isnodedontstand(); - else - { + if ( stance == "stand" ) + { + return !self isnodedontstand(); + } + else + { /# - assert( stance == "crouch" ); + assert( stance == "crouch" ); #/ - return !self isnodedontcrouch(); - } + return !self isnodedontcrouch(); + } } animarray( animname ) { /# - assert( isdefined( self.a.array ) ); + assert( isDefined( self.a.array ) ); #/ /# - if ( !isdefined( self.a.array[animname] ) ) - { - dumpanimarray(); -/# - assert( isdefined( self.a.array[animname] ), "self.a.array[ \"" + animname + "\" ] is undefined" ); + if ( !isDefined( self.a.array[ animname ] ) ) + { + dumpanimarray(); + assert( isDefined( self.a.array[ animname ] ), "self.a.array[ "" + animname + "" ] is undefined" ); #/ - } -#/ - return self.a.array[animname]; + } + return self.a.array[ animname ]; } animarrayanyexist( animname ) { /# - assert( isdefined( self.a.array ) ); + assert( isDefined( self.a.array ) ); #/ /# - if ( !isdefined( self.a.array[animname] ) ) - { - dumpanimarray(); -/# - assert( isdefined( self.a.array[animname] ), "self.a.array[ \"" + animname + "\" ] is undefined" ); + if ( !isDefined( self.a.array[ animname ] ) ) + { + dumpanimarray(); + assert( isDefined( self.a.array[ animname ] ), "self.a.array[ "" + animname + "" ] is undefined" ); #/ - } -#/ - return self.a.array[animname].size > 0; + } + return self.a.array[ animname ].size > 0; } animarraypickrandom( animname ) { /# - assert( isdefined( self.a.array ) ); + assert( isDefined( self.a.array ) ); #/ /# - if ( !isdefined( self.a.array[animname] ) ) - { - dumpanimarray(); + if ( !isDefined( self.a.array[ animname ] ) ) + { + dumpanimarray(); + assert( isDefined( self.a.array[ animname ] ), "self.a.array[ "" + animname + "" ] is undefined" ); +#/ + } /# - assert( isdefined( self.a.array[animname] ), "self.a.array[ \"" + animname + "\" ] is undefined" ); + assert( self.a.array[ animname ].size > 0 ); #/ - } -#/ -/# - assert( self.a.array[animname].size > 0 ); -#/ - if ( self.a.array[animname].size > 1 ) - index = randomint( self.a.array[animname].size ); - else - index = 0; - - return self.a.array[animname][index]; + if ( self.a.array[ animname ].size > 1 ) + { + index = randomint( self.a.array[ animname ].size ); + } + else + { + index = 0; + } + return self.a.array[ animname ][ index ]; } dumpanimarray() { /# - println( "self.a.array:" ); - keys = getarraykeys( self.a.array ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( isarray( self.a.array[keys[i]] ) ) - { - println( " array[ \"" + keys[i] + "\" ] = {array of size " + self.a.array[keys[i]].size + "}" ); - continue; - } - - println( " array[ \"" + keys[i] + "\" ] = ", self.a.array[keys[i]] ); - } + println( "self.a.array:" ); + keys = getarraykeys( self.a.array ); + i = 0; + while ( i < keys.size ) + { + if ( isarray( self.a.array[ keys[ i ] ] ) ) + { + println( " array[ "" + keys[ i ] + "" ] = {array of size " + self.a.array[ keys[ i ] ].size + "}" ); + i++; + continue; + } + else + { + println( " array[ "" + keys[ i ] + "" ] = ", self.a.array[ keys[ i ] ] ); + } + i++; #/ + } } getanimendpos( theanim ) { - movedelta = getmovedelta( theanim, 0, 1 ); - return self localtoworldcoords( movedelta ); + movedelta = getmovedelta( theanim, 0, 1 ); + return self localtoworldcoords( movedelta ); } isvalidenemy( enemy ) { - if ( !isdefined( enemy ) ) - return false; - - return true; + if ( !isDefined( enemy ) ) + { + return 0; + } + return 1; } damagelocationisany( a, b, c, d, e, f, g, h, i, j, k, ovr ) { - if ( !isdefined( a ) ) - return false; - - if ( self.damagelocation == a ) - return true; - - if ( !isdefined( b ) ) - return false; - - if ( self.damagelocation == b ) - return true; - - if ( !isdefined( c ) ) - return false; - - if ( self.damagelocation == c ) - return true; - - if ( !isdefined( d ) ) - return false; - - if ( self.damagelocation == d ) - return true; - - if ( !isdefined( e ) ) - return false; - - if ( self.damagelocation == e ) - return true; - - if ( !isdefined( f ) ) - return false; - - if ( self.damagelocation == f ) - return true; - - if ( !isdefined( g ) ) - return false; - - if ( self.damagelocation == g ) - return true; - - if ( !isdefined( h ) ) - return false; - - if ( self.damagelocation == h ) - return true; - - if ( !isdefined( i ) ) - return false; - - if ( self.damagelocation == i ) - return true; - - if ( !isdefined( j ) ) - return false; - - if ( self.damagelocation == j ) - return true; - - if ( !isdefined( k ) ) - return false; - - if ( self.damagelocation == k ) - return true; + if ( !isDefined( a ) ) + { + return 0; + } + if ( self.damagelocation == a ) + { + return 1; + } + if ( !isDefined( b ) ) + { + return 0; + } + if ( self.damagelocation == b ) + { + return 1; + } + if ( !isDefined( c ) ) + { + return 0; + } + if ( self.damagelocation == c ) + { + return 1; + } + if ( !isDefined( d ) ) + { + return 0; + } + if ( self.damagelocation == d ) + { + return 1; + } + if ( !isDefined( e ) ) + { + return 0; + } + if ( self.damagelocation == e ) + { + return 1; + } + if ( !isDefined( f ) ) + { + return 0; + } + if ( self.damagelocation == f ) + { + return 1; + } + if ( !isDefined( g ) ) + { + return 0; + } + if ( self.damagelocation == g ) + { + return 1; + } + if ( !isDefined( h ) ) + { + return 0; + } + if ( self.damagelocation == h ) + { + return 1; + } + if ( !isDefined( i ) ) + { + return 0; + } + if ( self.damagelocation == i ) + { + return 1; + } + if ( !isDefined( j ) ) + { + return 0; + } + if ( self.damagelocation == j ) + { + return 1; + } + if ( !isDefined( k ) ) + { + return 0; + } + if ( self.damagelocation == k ) + { + return 1; + } /# - assert( !isdefined( ovr ) ); + assert( !isDefined( ovr ) ); #/ - return false; + return 0; } ragdolldeath( moveanim ) { - self endon( "killanimscript" ); - lastorg = self.origin; - movevec = ( 0, 0, 0 ); - - for (;;) - { - wait 0.05; - force = distance( self.origin, lastorg ); - lastorg = self.origin; - - if ( self.health == 1 ) - { - self.a.nodeath = 1; - self startragdoll(); - wait 0.05; - physicsexplosionsphere( lastorg, 600, 0, force * 0.1 ); - self notify( "killanimscript" ); - return; - } - } + self endon( "killanimscript" ); + lastorg = self.origin; + movevec = ( 0, 0, 1 ); + for ( ;; ) + { + wait 0,05; + force = distance( self.origin, lastorg ); + lastorg = self.origin; + if ( self.health == 1 ) + { + self.a.nodeath = 1; + self startragdoll(); + wait 0,05; + physicsexplosionsphere( lastorg, 600, 0, force * 0,1 ); + self notify( "killanimscript" ); + return; + } + } } iscqbwalking() { - return isdefined( self.cqbwalking ) && self.cqbwalking; + if ( isDefined( self.cqbwalking ) ) + { + return self.cqbwalking; + } } squared( value ) { - return value * value; + return value * value; } randomizeidleset() { - self.a.idleset = randomint( 2 ); + self.a.idleset = randomint( 2 ); } getrandomintfromseed( intseed, intmax ) { /# - assert( intmax > 0 ); + assert( intmax > 0 ); #/ - index = intseed % anim.randominttablesize; - return anim.randominttable[index] % intmax; + index = intseed % anim.randominttablesize; + return anim.randominttable[ index ] % intmax; } is_banzai() { - return isdefined( self.banzai ) && self.banzai; + if ( isDefined( self.banzai ) ) + { + return self.banzai; + } } is_heavy_machine_gun() { - return isdefined( self.heavy_machine_gunner ) && self.heavy_machine_gunner; + if ( isDefined( self.heavy_machine_gunner ) ) + { + return self.heavy_machine_gunner; + } } is_zombie() { - if ( isdefined( self.is_zombie ) && self.is_zombie ) - return true; - - return false; + if ( isDefined( self.is_zombie ) && self.is_zombie ) + { + return 1; + } + return 0; } is_civilian() { - if ( isdefined( self.is_civilian ) && self.is_civilian ) - return true; - - return false; + if ( isDefined( self.is_civilian ) && self.is_civilian ) + { + return 1; + } + return 0; } is_zombie_gibbed() { - return self is_zombie() && self.gibbed; + if ( self is_zombie() ) + { + return self.gibbed; + } } set_zombie_gibbed() { - if ( self is_zombie() ) - self.gibbed = 1; + if ( self is_zombie() ) + { + self.gibbed = 1; + } } is_skeleton( skeleton ) { - if ( skeleton == "base" && issubstr( get_skeleton(), "scaled" ) ) - return 1; - - return get_skeleton() == skeleton; + if ( skeleton == "base" && issubstr( get_skeleton(), "scaled" ) ) + { + return 1; + } + return get_skeleton() == skeleton; } get_skeleton() { - if ( isdefined( self.skeleton ) ) - return self.skeleton; - else - return "base"; + if ( isDefined( self.skeleton ) ) + { + return self.skeleton; + } + else + { + return "base"; + } } debug_anim_print( text ) { /# - if ( isdefined( level.dog_debug_anims ) && level.dog_debug_anims ) - println( text + " " + gettime() ); - - if ( isdefined( level.dog_debug_anims_ent ) && level.dog_debug_anims_ent == self getentnum() ) - println( text + " " + gettime() ); + if ( isDefined( level.dog_debug_anims ) && level.dog_debug_anims ) + { + println( ( text + " " ) + getTime() ); + } + if ( isDefined( level.dog_debug_anims_ent ) && level.dog_debug_anims_ent == self getentnum() ) + { + println( ( text + " " ) + getTime() ); #/ + } } debug_turn_print( text, line ) { /# - if ( isdefined( level.dog_debug_turns ) && level.dog_debug_turns == self getentnum() ) - { - duration = 200; - currentyawcolor = ( 1, 1, 1 ); - lookaheadyawcolor = ( 1, 0, 0 ); - desiredyawcolor = ( 1, 1, 0 ); - currentyaw = angleclamp180( self.angles[1] ); - desiredyaw = angleclamp180( self.desiredangle ); - lookaheaddir = self.lookaheaddir; - lookaheadangles = vectortoangles( lookaheaddir ); - lookaheadyaw = angleclamp180( lookaheadangles[1] ); - println( text + " " + gettime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw ); - } + if ( isDefined( level.dog_debug_turns ) && level.dog_debug_turns == self getentnum() ) + { + duration = 200; + currentyawcolor = ( 0, 0, 1 ); + lookaheadyawcolor = ( 0, 0, 1 ); + desiredyawcolor = ( 0, 0, 1 ); + currentyaw = angleClamp180( self.angles[ 1 ] ); + desiredyaw = angleClamp180( self.desiredangle ); + lookaheaddir = self.lookaheaddir; + lookaheadangles = vectorToAngle( lookaheaddir ); + lookaheadyaw = angleClamp180( lookaheadangles[ 1 ] ); + println( ( text + " " ) + getTime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw ); #/ + } } play_sound_on_tag_endon_death( alias, tag ) { - maps\mp\_utility::play_sound_on_tag( alias, tag ); + maps/mp/_utility::play_sound_on_tag( alias, tag ); } play_sound_in_space( alias, origin, master ) { - org = spawn( "script_origin", ( 0, 0, 1 ) ); - - if ( !isdefined( origin ) ) - origin = self.origin; - - org.origin = origin; - - if ( isdefined( master ) && master ) - org playsoundasmaster( alias ); - else - org playsound( alias ); - - if ( isdefined( org ) ) - org delete(); + org = spawn( "script_origin", ( 0, 0, 1 ) ); + if ( !isDefined( origin ) ) + { + origin = self.origin; + } + org.origin = origin; + if ( isDefined( master ) && master ) + { + org playsoundasmaster( alias ); + } + else + { + org playsound( alias ); + } + if ( isDefined( org ) ) + { + org delete(); + } } wait_network_frame() { - if ( numremoteclients() ) - { - snapshot_ids = getsnapshotindexarray(); - - for ( acked = undefined; !isdefined( acked ); acked = snapshotacknowledged( snapshot_ids ) ) - level waittill( "snapacknowledged" ); - } - else - wait 0.1; + if ( numremoteclients() ) + { + snapshot_ids = getsnapshotindexarray(); + acked = undefined; + while ( !isDefined( acked ) ) + { + level waittill( "snapacknowledged" ); + acked = snapshotacknowledged( snapshot_ids ); + } + } + else wait 0,1; } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc index 66a5537..db8064a 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc @@ -1,215 +1,209 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\_audio; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\gametypes_zm\_globallogic_player; -#include maps\mp\gametypes_zm\_globallogic_actor; -#include maps\mp\gametypes_zm\_hostmigration; +#include maps/mp/gametypes_zm/_hostmigration; +#include maps/mp/gametypes_zm/_globallogic_actor; +#include maps/mp/gametypes_zm/_globallogic_player; +#include maps/mp/gametypes_zm/_globallogic; +#include maps/mp/_audio; +#include maps/mp/_utility; -codecallback_startgametype() +codecallback_startgametype() //checked matches cerberus output { - if ( !isdefined( level.gametypestarted ) || !level.gametypestarted ) - { - [[ level.callbackstartgametype ]](); - level.gametypestarted = 1; - } + if ( !isDefined( level.gametypestarted ) || !level.gametypestarted ) + { + [[ level.callbackstartgametype ]](); + level.gametypestarted = 1; + } } -codecallback_finalizeinitialization() +codecallback_finalizeinitialization() //checked matches cerberus output { - maps\mp\_utility::callback( "on_finalize_initialization" ); + maps/mp/_utility::callback( "on_finalize_initialization" ); } -codecallback_playerconnect() +codecallback_playerconnect() //checked matches cerberus output { - self endon( "disconnect" ); - self thread maps\mp\_audio::monitor_player_sprint(); - [[ level.callbackplayerconnect ]](); + self endon( "disconnect" ); + self thread maps/mp/_audio::monitor_player_sprint(); + [[ level.callbackplayerconnect ]](); } -codecallback_playerdisconnect() +codecallback_playerdisconnect() //checked matches cerberus output { - self notify( "disconnect" ); - client_num = self getentitynumber(); - [[ level.callbackplayerdisconnect ]](); + self notify( "disconnect" ); + level notify( "disconnect" ); + client_num = self getentitynumber(); + [[ level.callbackplayerdisconnect ]](); } -codecallback_hostmigration() +codecallback_hostmigration() //checked matches cerberus output { + /* /# - println( "****CodeCallback_HostMigration****" ); + println( "****CodeCallback_HostMigration****" ); #/ - [[ level.callbackhostmigration ]](); + */ + [[ level.callbackhostmigration ]](); } -codecallback_hostmigrationsave() +codecallback_hostmigrationsave() //checked matches cerberus output { + /* /# - println( "****CodeCallback_HostMigrationSave****" ); + println( "****CodeCallback_HostMigrationSave****" ); #/ - [[ level.callbackhostmigrationsave ]](); + */ + [[ level.callbackhostmigrationsave ]](); } -codecallback_prehostmigrationsave() +codecallback_playermigrated() //checked matches cerberus output { + /* /# - println( "****CodeCallback_PreHostMigrationSave****" ); + println( "****CodeCallback_PlayerMigrated****" ); #/ - [[ level.callbackprehostmigrationsave ]](); + */ + [[ level.callbackplayermigrated ]](); } -codecallback_playermigrated() +codecallback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //checked matches cerberus output { + self endon( "disconnect" ); + [[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ); +} + +codecallback_playerkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) //checked matches cerberus output +{ + self endon( "disconnect" ); + [[ level.callbackplayerkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ); +} + +codecallback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) //checked matches cerberus output +{ + self endon( "disconnect" ); + [[ level.callbackplayerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ); +} + +codecallback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ) //checked matches cerberus output +{ + self endon( "disconnect" ); + [[ level.callbackplayermelee ]]( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ); +} + +codecallback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //checked matches cerberus output +{ + [[ level.callbackactordamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ); +} + +codecallback_actorkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset ) //checked matches cerberus output +{ + [[ level.callbackactorkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset ); +} + +codecallback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname ) //checked matches cerberus output +{ + [[ level.callbackvehicledamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname ); +} + +codecallback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset ) //checked matches cerberus output +{ +} + +codecallback_faceeventnotify( notify_msg, ent ) //checked matches cerberus output +{ + if ( isDefined( ent ) && isDefined( ent.do_face_anims ) && ent.do_face_anims ) + { + if ( isDefined( level.face_event_handler ) && isDefined( level.face_event_handler.events[ notify_msg ] ) ) + { + ent sendfaceevent( level.face_event_handler.events[ notify_msg ] ); + } + } +} + +codecallback_menuresponse( action, arg ) //checked matches cerberus output +{ + if ( !isDefined( level.menuresponsequeue ) ) + { + level.menuresponsequeue = []; + level thread menuresponsequeuepump(); + } + index = level.menuresponsequeue.size; + level.menuresponsequeue[ index ] = spawnstruct(); + level.menuresponsequeue[ index ].action = action; + level.menuresponsequeue[ index ].arg = arg; + level.menuresponsequeue[ index ].ent = self; + level notify( "menuresponse_queue" ); +} + +menuresponsequeuepump() //checked changed to match cerberus output +{ + while ( 1 ) + { + level waittill( "menuresponse_queue" ); + level.menuresponsequeue[ 0 ].ent notify( "menuresponse", level.menuresponsequeue[0].action, level.menuresponsequeue[0].arg ); + arrayremoveindex( level.menuresponsequeue, 0, 0 ); + wait 0.05; + } +} + +setupcallbacks() //checked matches cerberus output +{ + setdefaultcallbacks(); + level.idflags_radius = 1; + level.idflags_no_armor = 2; + level.idflags_no_knockback = 4; + level.idflags_penetration = 8; + level.idflags_destructible_entity = 16; + level.idflags_shield_explosive_impact = 32; + level.idflags_shield_explosive_impact_huge = 64; + level.idflags_shield_explosive_splash = 128; + level.idflags_no_team_protection = 256; + level.idflags_no_protection = 512; + level.idflags_passthru = 1024; +} + +setdefaultcallbacks() //checked matches cerberus output +{ + level.callbackstartgametype = maps/mp/gametypes_zm/_globallogic::callback_startgametype; + level.callbackplayerconnect = maps/mp/gametypes_zm/_globallogic_player::callback_playerconnect; + level.callbackplayerdisconnect = maps/mp/gametypes_zm/_globallogic_player::callback_playerdisconnect; + level.callbackplayerdamage = maps/mp/gametypes_zm/_globallogic_player::callback_playerdamage; + level.callbackplayerkilled = maps/mp/gametypes_zm/_globallogic_player::callback_playerkilled; + level.callbackplayermelee = maps/mp/gametypes_zm/_globallogic_player::callback_playermelee; + level.callbackplayerlaststand = maps/mp/gametypes_zm/_globallogic_player::callback_playerlaststand; + level.callbackactordamage = maps/mp/gametypes_zm/_globallogic_actor::callback_actordamage; + level.callbackactorkilled = maps/mp/gametypes_zm/_globallogic_actor::callback_actorkilled; + level.callbackplayermigrated = maps/mp/gametypes_zm/_globallogic_player::callback_playermigrated; + level.callbackhostmigration = maps/mp/gametypes_zm/_hostmigration::callback_hostmigration; + level.callbackhostmigrationsave = maps/mp/gametypes_zm/_hostmigration::callback_hostmigrationsave; +} + +abortlevel() //checked matches cerberus output +{ + /* /# - println( "****CodeCallback_PlayerMigrated****" ); + println( "ERROR: Aborting level - gametype is not supported" ); #/ - [[ level.callbackplayermigrated ]](); + */ + level.callbackstartgametype = ::callbackvoid; + level.callbackplayerconnect = ::callbackvoid; + level.callbackplayerdisconnect = ::callbackvoid; + level.callbackplayerdamage = ::callbackvoid; + level.callbackplayerkilled = ::callbackvoid; + level.callbackplayerlaststand = ::callbackvoid; + level.callbackplayermelee = ::callbackvoid; + level.callbackactordamage = ::callbackvoid; + level.callbackactorkilled = ::callbackvoid; + level.callbackvehicledamage = ::callbackvoid; + setdvar( "g_gametype", "dm" ); + exitlevel( 0 ); } -codecallback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) +codecallback_glasssmash( pos, dir ) //checked matches cerberus output { - self endon( "disconnect" ); - [[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ); + level notify( "glass_smash" ); } -codecallback_playerkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) +callbackvoid() //checked matches cerberus output { - self endon( "disconnect" ); - [[ level.callbackplayerkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ); } -codecallback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) -{ - self endon( "disconnect" ); - [[ level.callbackplayerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ); -} -codecallback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ) -{ - self endon( "disconnect" ); - [[ level.callbackplayermelee ]]( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ); -} - -codecallback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) -{ - [[ level.callbackactordamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ); -} - -codecallback_actorkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset ) -{ - [[ level.callbackactorkilled ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset ); -} - -codecallback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname ) -{ - [[ level.callbackvehicledamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, damagefromunderneath, modelindex, partname ); -} - -codecallback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, timeoffset ) -{ - -} - -codecallback_faceeventnotify( notify_msg, ent ) -{ - if ( isdefined( ent ) && isdefined( ent.do_face_anims ) && ent.do_face_anims ) - { - if ( isdefined( level.face_event_handler ) && isdefined( level.face_event_handler.events[notify_msg] ) ) - ent sendfaceevent( level.face_event_handler.events[notify_msg] ); - } -} - -codecallback_menuresponse( action, arg ) -{ - if ( !isdefined( level.menuresponsequeue ) ) - { - level.menuresponsequeue = []; - level thread menuresponsequeuepump(); - } - - index = level.menuresponsequeue.size; - level.menuresponsequeue[index] = spawnstruct(); - level.menuresponsequeue[index].action = action; - level.menuresponsequeue[index].arg = arg; - level.menuresponsequeue[index].ent = self; - level notify( "menuresponse_queue" ); -} - -menuresponsequeuepump() -{ - while ( true ) - { - level waittill( "menuresponse_queue" ); - - do - { - level.menuresponsequeue[0].ent notify( "menuresponse", level.menuresponsequeue[0].action, level.menuresponsequeue[0].arg ); - arrayremoveindex( level.menuresponsequeue, 0, 0 ); - wait 0.05; - } - while ( level.menuresponsequeue.size > 0 ); - } -} - -setupcallbacks() -{ - setdefaultcallbacks(); - level.idflags_radius = 1; - level.idflags_no_armor = 2; - level.idflags_no_knockback = 4; - level.idflags_penetration = 8; - level.idflags_destructible_entity = 16; - level.idflags_shield_explosive_impact = 32; - level.idflags_shield_explosive_impact_huge = 64; - level.idflags_shield_explosive_splash = 128; - level.idflags_no_team_protection = 256; - level.idflags_no_protection = 512; - level.idflags_passthru = 1024; -} - -setdefaultcallbacks() -{ - level.callbackstartgametype = maps\mp\gametypes_zm\_globallogic::callback_startgametype; - level.callbackplayerconnect = maps\mp\gametypes_zm\_globallogic_player::callback_playerconnect; - level.callbackplayerdisconnect = maps\mp\gametypes_zm\_globallogic_player::callback_playerdisconnect; - level.callbackplayerdamage = maps\mp\gametypes_zm\_globallogic_player::callback_playerdamage; - level.callbackplayerkilled = maps\mp\gametypes_zm\_globallogic_player::callback_playerkilled; - level.callbackplayermelee = maps\mp\gametypes_zm\_globallogic_player::callback_playermelee; - level.callbackplayerlaststand = maps\mp\gametypes_zm\_globallogic_player::callback_playerlaststand; - level.callbackactordamage = maps\mp\gametypes_zm\_globallogic_actor::callback_actordamage; - level.callbackactorkilled = maps\mp\gametypes_zm\_globallogic_actor::callback_actorkilled; - level.callbackplayermigrated = maps\mp\gametypes_zm\_globallogic_player::callback_playermigrated; - level.callbackhostmigration = maps\mp\gametypes_zm\_hostmigration::callback_hostmigration; - level.callbackhostmigrationsave = maps\mp\gametypes_zm\_hostmigration::callback_hostmigrationsave; - level.callbackprehostmigrationsave = maps\mp\gametypes_zm\_hostmigration::callback_prehostmigrationsave; -} - -abortlevel() -{ -/# - println( "ERROR: Aborting level - gametype is not supported" ); -#/ - level.callbackstartgametype = ::callbackvoid; - level.callbackplayerconnect = ::callbackvoid; - level.callbackplayerdisconnect = ::callbackvoid; - level.callbackplayerdamage = ::callbackvoid; - level.callbackplayerkilled = ::callbackvoid; - level.callbackplayermelee = ::callbackvoid; - level.callbackplayerlaststand = ::callbackvoid; - level.callbackactordamage = ::callbackvoid; - level.callbackactorkilled = ::callbackvoid; - level.callbackvehicledamage = ::callbackvoid; - setdvar( "g_gametype", "dm" ); - exitlevel( 0 ); -} - -codecallback_glasssmash( pos, dir ) -{ - level notify( "glass_smash", pos, dir ); -} - -callbackvoid() -{ - -} diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_clientids.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_clientids.gsc index 7611d6b..de3aadd 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_clientids.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_clientids.gsc @@ -1,19 +1,16 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -init() +init() //checked matches cerberus output { - level.clientid = 0; - level thread onplayerconnect(); + level.clientid = 0; + level thread onplayerconnect(); } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - player.clientid = level.clientid; - level.clientid++; - } + for ( ;; ) + { + level waittill( "connecting", player ); + player.clientid = level.clientid; + level.clientid++; + } } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc index 0b61988..e16144a 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc @@ -1,166 +1,160 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -init() +init() //checked matches cerberus output { - precacheshader( "damage_feedback" ); - precacheshader( "damage_feedback_flak" ); - precacheshader( "damage_feedback_tac" ); - level thread onplayerconnect(); + precacheshader( "damage_feedback" ); + precacheshader( "damage_feedback_flak" ); + precacheshader( "damage_feedback_tac" ); + level thread onplayerconnect(); } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - player.hud_damagefeedback = newdamageindicatorhudelem( player ); - player.hud_damagefeedback.horzalign = "center"; - player.hud_damagefeedback.vertalign = "middle"; - player.hud_damagefeedback.x = -12; - player.hud_damagefeedback.y = -12; - player.hud_damagefeedback.alpha = 0; - player.hud_damagefeedback.archived = 1; - player.hud_damagefeedback setshader( "damage_feedback", 24, 48 ); - player.hitsoundtracker = 1; - } + for ( ;; ) + { + level waittill( "connecting", player ); + player.hud_damagefeedback = newdamageindicatorhudelem( player ); + player.hud_damagefeedback.horzalign = "center"; + player.hud_damagefeedback.vertalign = "middle"; + player.hud_damagefeedback.x = -12; + player.hud_damagefeedback.y = -12; + player.hud_damagefeedback.alpha = 0; + player.hud_damagefeedback.archived = 1; + player.hud_damagefeedback setshader( "damage_feedback", 24, 48 ); + player.hitsoundtracker = 1; + } } -updatedamagefeedback( mod, inflictor, perkfeedback ) +updatedamagefeedback( mod, inflictor, perkfeedback ) //checked matches cerberus output { - if ( !isplayer( self ) || sessionmodeiszombiesgame() ) - return; - - if ( isdefined( mod ) && mod != "MOD_CRUSH" && mod != "MOD_GRENADE_SPLASH" && mod != "MOD_HIT_BY_OBJECT" ) - { - if ( isdefined( inflictor ) && isdefined( inflictor.soundmod ) ) - { - switch ( inflictor.soundmod ) - { - case "player": - self thread playhitsound( mod, "mpl_hit_alert" ); - break; - case "heli": - self thread playhitsound( mod, "mpl_hit_alert_air" ); - break; - case "hpm": - self thread playhitsound( mod, "mpl_hit_alert_hpm" ); - break; - case "taser_spike": - self thread playhitsound( mod, "mpl_hit_alert_taser_spike" ); - break; - case "straferun": - case "dog": - break; - case "default_loud": - self thread playhitsound( mod, "mpl_hit_heli_gunner" ); - break; - default: - self thread playhitsound( mod, "mpl_hit_alert_low" ); - break; - } - } - else - self thread playhitsound( mod, "mpl_hit_alert_low" ); - } - - if ( isdefined( perkfeedback ) ) - { - switch ( perkfeedback ) - { - case "flakjacket": - self.hud_damagefeedback setshader( "damage_feedback_flak", 24, 48 ); - break; - case "tacticalMask": - self.hud_damagefeedback setshader( "damage_feedback_tac", 24, 48 ); - break; - } - } - else - self.hud_damagefeedback setshader( "damage_feedback", 24, 48 ); - - self.hud_damagefeedback.alpha = 1; - self.hud_damagefeedback fadeovertime( 1 ); - self.hud_damagefeedback.alpha = 0; + if ( !isplayer( self ) || sessionmodeiszombiesgame() ) + { + return; + } + if ( isDefined( mod ) && mod != "MOD_CRUSH" && mod != "MOD_GRENADE_SPLASH" && mod != "MOD_HIT_BY_OBJECT" ) + { + if ( isDefined( inflictor ) && isDefined( inflictor.soundmod ) ) + { + switch( inflictor.soundmod ) + { + case "player": + self playlocalsound( "mpl_hit_alert" ); + break; + case "heli": + self thread playhitsound( mod, "mpl_hit_alert_air" ); + break; + case "hpm": + self thread playhitsound( mod, "mpl_hit_alert_hpm" ); + break; + case "taser_spike": + self thread playhitsound( mod, "mpl_hit_alert_taser_spike" ); + break; + case "dog": + case "straferun": + case "default_loud": + self thread playhitsound( mod, "mpl_hit_heli_gunner" ); + break; + default: + self thread playhitsound( mod, "mpl_hit_alert_low" ); + break; + } + } + else + { + self playlocalsound( "mpl_hit_alert_low" ); + } + } + if ( isDefined( perkfeedback ) ) + { + switch( perkfeedback ) + { + case "flakjacket": + self.hud_damagefeedback setshader( "damage_feedback_flak", 24, 48 ); + break; + case "tacticalMask": + self.hud_damagefeedback setshader( "damage_feedback_tac", 24, 48 ); + break; + } + } + else self.hud_damagefeedback setshader( "damage_feedback", 24, 48 ); + self.hud_damagefeedback.alpha = 1; + self.hud_damagefeedback fadeovertime( 1 ); + self.hud_damagefeedback.alpha = 0; + } } -playhitsound( mod, alert ) +playhitsound( mod, alert ) //checked matches cerberus output { - self endon( "disconnect" ); - - if ( self.hitsoundtracker ) - { - self.hitsoundtracker = 0; - self playlocalsound( alert ); - wait 0.05; - self.hitsoundtracker = 1; - } + self endon( "disconnect" ); + if ( self.hitsoundtracker ) + { + self.hitsoundtracker = 0; + self playlocalsound( alert ); + wait 0.05; + self.hitsoundtracker = 1; + } } -updatespecialdamagefeedback( hitent ) +updatespecialdamagefeedback( hitent ) //checked matches cerberus output { - if ( !isplayer( self ) ) - return; - - if ( !isdefined( hitent ) ) - return; - - if ( !isplayer( hitent ) ) - return; - - wait 0.05; - - if ( !isdefined( self.directionalhitarray ) ) - { - self.directionalhitarray = []; - hitentnum = hitent getentitynumber(); - self.directionalhitarray[hitentnum] = 1; - self thread sendhitspecialeventatframeend( hitent ); - } - else - { - hitentnum = hitent getentitynumber(); - self.directionalhitarray[hitentnum] = 1; - } + if ( !isplayer( self ) ) + { + return; + } + if ( !isDefined( hitent ) ) + { + return; + } + if ( !isplayer( hitent ) ) + { + return; + } + wait 0.05; + if ( !isDefined( self.directionalhitarray ) ) + { + self.directionalhitarray = []; + hitentnum = hitent getentitynumber(); + self.directionalhitarray[ hitentnum ] = 1; + self thread sendhitspecialeventatframeend( hitent ); + } + else + { + hitentnum = hitent getentitynumber(); + self.directionalhitarray[ hitentnum ] = 1; + } } -sendhitspecialeventatframeend( hitent ) +sendhitspecialeventatframeend( hitent ) //checked changed to match cerberus output { - self endon( "disconnect" ); - waittillframeend; - enemyshit = 0; - value = 1; - entbitarray0 = 0; - - for ( i = 0; i < 32; i++ ) - { - if ( isdefined( self.directionalhitarray[i] ) && self.directionalhitarray[i] != 0 ) - { - entbitarray0 += value; - enemyshit++; - } - - value *= 2; - } - - entbitarray1 = 0; - - for ( i = 33; i < 64; i++ ) - { - if ( isdefined( self.directionalhitarray[i] ) && self.directionalhitarray[i] != 0 ) - { - entbitarray1 += value; - enemyshit++; - } - - value *= 2; - } - - if ( enemyshit ) - self directionalhitindicator( entbitarray0, entbitarray1 ); - - self.directionalhitarray = undefined; - entbitarray0 = 0; - entbitarray1 = 0; + self endon( "disconnect" ); + waittillframeend; + enemyshit = 0; + value = 1; + entbitarray0 = 0; + for ( i = 0; i < 32; i++ ) + { + if ( isDefined( self.directionalhitarray[ i ] ) && self.directionalhitarray[ i ] != 0 ) + { + entbitarray0 += value; + enemyshit++; + } + value *= 2; + } + entbitarray1 = 0; + for ( i = 33; i < 64; i++ ) + { + if ( isDefined( self.directionalhitarray[ i ] ) && self.directionalhitarray[ i ] != 0 ) + { + entbitarray1 += value; + enemyshit++; + } + value *= 2; + } + if ( enemyshit ) + { + self directionalhitindicator( entbitarray0, entbitarray1 ); + } + self.directionalhitarray = undefined; + entbitarray0 = 0; + entbitarray1 = 0; } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_dev.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_dev.gsc index 0dee973..86a3a5e 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_dev.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_dev.gsc @@ -1,90 +1,102 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; +#include maps/mp/_utility; +#include common_scripts/utility; init() { /# - for (;;) - { - updatedevsettingszm(); - wait 0.5; - } + for ( ;; ) + { + updatedevsettingszm(); + wait 0,5; #/ + } } updatedevsettingszm() { /# - if ( level.players.size > 0 ) - { - if ( getdvar( "r_streamDumpDistance" ) == "3" ) - { - if ( !isdefined( level.streamdumpteamindex ) ) - level.streamdumpteamindex = 0; - else - level.streamdumpteamindex++; - - numpoints = 0; - spawnpoints = []; - 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; - - if ( level.streamdumpteamindex < level.teams.size ) - { - structs = getstructarray( "initial_spawn", "script_noteworthy" ); - - if ( isdefined( structs ) ) - { - foreach ( struct in structs ) - { - if ( isdefined( struct.script_string ) ) - { - tokens = strtok( struct.script_string, " " ); - - foreach ( token in tokens ) - { - if ( token == match_string ) - spawnpoints[spawnpoints.size] = struct; - } - } - } - } - - if ( !isdefined( spawnpoints ) || spawnpoints.size == 0 ) - spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); - - if ( isdefined( spawnpoints ) ) - numpoints = spawnpoints.size; - } - - if ( numpoints == 0 ) - { - setdvar( "r_streamDumpDistance", "0" ); - level.streamdumpteamindex = -1; - } - else - { - averageorigin = ( 0, 0, 0 ); - averageangles = ( 0, 0, 0 ); - - foreach ( spawnpoint in spawnpoints ) - { - averageorigin += spawnpoint.origin / numpoints; - averageangles += spawnpoint.angles / numpoints; - } - - level.players[0] setplayerangles( averageangles ); - level.players[0] setorigin( averageorigin ); - wait 0.05; - setdvar( "r_streamDumpDistance", "2" ); - } - } - } + if ( level.players.size > 0 ) + { + if ( getDvar( "r_streamDumpDistance" ) == "3" ) + { + if ( !isDefined( level.streamdumpteamindex ) ) + { + level.streamdumpteamindex = 0; + } + else + { + level.streamdumpteamindex++; + } + numpoints = 0; + spawnpoints = []; + 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; + if ( level.streamdumpteamindex < level.teams.size ) + { + structs = getstructarray( "initial_spawn", "script_noteworthy" ); + while ( isDefined( structs ) ) + { + _a46 = structs; + _k46 = getFirstArrayKey( _a46 ); + while ( isDefined( _k46 ) ) + { + struct = _a46[ _k46 ]; + while ( isDefined( struct.script_string ) ) + { + tokens = strtok( struct.script_string, " " ); + _a51 = tokens; + _k51 = getFirstArrayKey( _a51 ); + while ( isDefined( _k51 ) ) + { + token = _a51[ _k51 ]; + if ( token == match_string ) + { + spawnpoints[ spawnpoints.size ] = struct; + } + _k51 = getNextArrayKey( _a51, _k51 ); + } + } + _k46 = getNextArrayKey( _a46, _k46 ); + } + } + if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 ) + { + spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); + } + if ( isDefined( spawnpoints ) ) + { + numpoints = spawnpoints.size; + } + } + if ( numpoints == 0 ) + { + setdvar( "r_streamDumpDistance", "0" ); + level.streamdumpteamindex = -1; + return; + } + else + { + averageorigin = ( 0, 0, 0 ); + averageangles = ( 0, 0, 0 ); + _a80 = spawnpoints; + _k80 = getFirstArrayKey( _a80 ); + while ( isDefined( _k80 ) ) + { + spawnpoint = _a80[ _k80 ]; + averageorigin += spawnpoint.origin / numpoints; + averageangles += spawnpoint.angles / numpoints; + _k80 = getNextArrayKey( _a80, _k80 ); + } + level.players[ 0 ] setplayerangles( averageangles ); + level.players[ 0 ] setorigin( averageorigin ); + wait 0,05; + setdvar( "r_streamDumpDistance", "2" ); #/ + } + } + } } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc index b40406b..d5054cd 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc @@ -1,2392 +1,2668 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\gametypes_zm\_hostmigration; -#include maps\mp\gametypes_zm\_tweakables; +#include maps/mp/gametypes_zm/_tweakables; +#include maps/mp/gametypes_zm/_hostmigration; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/_utility; +#include common_scripts/utility; main( allowed ) { - level.vehiclesenabled = getgametypesetting( "vehiclesEnabled" ); - level.vehiclestimed = getgametypesetting( "vehiclesTimed" ); - level.objectivepingdelay = getgametypesetting( "objectivePingTime" ); - level.nonteambasedteam = "allies"; + level.vehiclesenabled = getgametypesetting( "vehiclesEnabled" ); + level.vehiclestimed = getgametypesetting( "vehiclesTimed" ); + level.objectivepingdelay = getgametypesetting( "objectivePingTime" ); + level.nonteambasedteam = "allies"; /# - if ( level.script == "mp_vehicle_test" ) - level.vehiclesenabled = 1; + if ( level.script == "mp_vehicle_test" ) + { + level.vehiclesenabled = 1; #/ - if ( level.vehiclesenabled ) - { - allowed[allowed.size] = "vehicle"; - filter_script_vehicles_from_vehicle_descriptors( allowed ); - } + } + if ( level.vehiclesenabled ) + { + allowed[ allowed.size ] = "vehicle"; + filter_script_vehicles_from_vehicle_descriptors( allowed ); + } + entities = getentarray(); + entity_index = entities.size - 1; + while ( entity_index >= 0 ) + { + entity = entities[ entity_index ]; + if ( !entity_is_allowed( entity, allowed ) ) + { + entity delete(); + } + entity_index--; - entities = getentarray(); - - for ( entity_index = entities.size - 1; entity_index >= 0; entity_index-- ) - { - entity = entities[entity_index]; - - if ( !entity_is_allowed( entity, allowed ) ) - entity delete(); - } + } + return; } entity_is_allowed( entity, allowed_game_modes ) { - if ( isdefined( level.createfx_enabled ) && level.createfx_enabled ) - return 1; - - allowed = 1; - - if ( isdefined( entity.script_gameobjectname ) && entity.script_gameobjectname != "[all_modes]" ) - { - allowed = 0; - gameobjectnames = strtok( entity.script_gameobjectname, " " ); - - for ( i = 0; i < allowed_game_modes.size && !allowed; i++ ) - { - for ( j = 0; j < gameobjectnames.size && !allowed; j++ ) - allowed = gameobjectnames[j] == allowed_game_modes[i]; - } - } - - return allowed; + if ( isDefined( level.createfx_enabled ) && level.createfx_enabled ) + { + return 1; + } + allowed = 1; + while ( isDefined( entity.script_gameobjectname ) && entity.script_gameobjectname != "[all_modes]" ) + { + allowed = 0; + gameobjectnames = strtok( entity.script_gameobjectname, " " ); + i = 0; + while ( i < allowed_game_modes.size && !allowed ) + { + j = 0; + while ( j < gameobjectnames.size && !allowed ) + { + allowed = gameobjectnames[ j ] == allowed_game_modes[ i ]; + j++; + } + i++; + } + } + return allowed; } location_is_allowed( entity, location ) { - allowed = 1; - location_list = undefined; - - if ( isdefined( entity.script_noteworthy ) ) - location_list = entity.script_noteworthy; - - if ( isdefined( entity.script_location ) ) - location_list = entity.script_location; - - if ( isdefined( location_list ) ) - { - if ( location_list == "[all_modes]" ) - allowed = 1; - else - { - allowed = 0; - gameobjectlocations = strtok( location_list, " " ); - - for ( j = 0; j < gameobjectlocations.size; j++ ) - { - if ( gameobjectlocations[j] == location ) - { - allowed = 1; - break; - } - } - } - } - - return allowed; + allowed = 1; + location_list = undefined; + if ( isDefined( entity.script_noteworthy ) ) + { + location_list = entity.script_noteworthy; + } + if ( isDefined( entity.script_location ) ) + { + location_list = entity.script_location; + } + while ( isDefined( location_list ) ) + { + if ( location_list == "[all_modes]" ) + { + allowed = 1; + break; + } + else allowed = 0; + gameobjectlocations = strtok( location_list, " " ); + j = 0; + while ( j < gameobjectlocations.size ) + { + if ( gameobjectlocations[ j ] == location ) + { + allowed = 1; + break; + } + else + { + j++; + } + } + } + return allowed; } filter_script_vehicles_from_vehicle_descriptors( allowed_game_modes ) { - vehicle_descriptors = getentarray( "vehicle_descriptor", "targetname" ); - script_vehicles = getentarray( "script_vehicle", "classname" ); - vehicles_to_remove = []; - - for ( descriptor_index = 0; descriptor_index < vehicle_descriptors.size; descriptor_index++ ) - { - descriptor = vehicle_descriptors[descriptor_index]; - closest_distance_sq = 1000000000000.0; - closest_vehicle = undefined; - - for ( vehicle_index = 0; vehicle_index < script_vehicles.size; vehicle_index++ ) - { - vehicle = script_vehicles[vehicle_index]; - dsquared = distancesquared( vehicle getorigin(), descriptor getorigin() ); - - if ( dsquared < closest_distance_sq ) - { - closest_distance_sq = dsquared; - closest_vehicle = vehicle; - } - } - - if ( isdefined( closest_vehicle ) ) - { - if ( !entity_is_allowed( descriptor, allowed_game_modes ) ) - vehicles_to_remove[vehicles_to_remove.size] = closest_vehicle; - } - } - - for ( vehicle_index = 0; vehicle_index < vehicles_to_remove.size; vehicle_index++ ) - vehicles_to_remove[vehicle_index] delete(); + vehicle_descriptors = getentarray( "vehicle_descriptor", "targetname" ); + script_vehicles = getentarray( "script_vehicle", "classname" ); + vehicles_to_remove = []; + descriptor_index = 0; + while ( descriptor_index < vehicle_descriptors.size ) + { + descriptor = vehicle_descriptors[ descriptor_index ]; + closest_distance_sq = 1E+12; + closest_vehicle = undefined; + vehicle_index = 0; + while ( vehicle_index < script_vehicles.size ) + { + vehicle = script_vehicles[ vehicle_index ]; + dsquared = distancesquared( vehicle getorigin(), descriptor getorigin() ); + if ( dsquared < closest_distance_sq ) + { + closest_distance_sq = dsquared; + closest_vehicle = vehicle; + } + vehicle_index++; + } + if ( isDefined( closest_vehicle ) ) + { + if ( !entity_is_allowed( descriptor, allowed_game_modes ) ) + { + vehicles_to_remove[ vehicles_to_remove.size ] = closest_vehicle; + } + } + descriptor_index++; + } + vehicle_index = 0; + while ( vehicle_index < vehicles_to_remove.size ) + { + vehicles_to_remove[ vehicle_index ] delete(); + vehicle_index++; + } + return; } init() { - level.numgametypereservedobjectives = 0; - level.releasedobjectives = []; - - if ( !sessionmodeiszombiesgame() ) - { - precacheitem( "briefcase_bomb_mp" ); - precacheitem( "briefcase_bomb_defuse_mp" ); - } - - level thread onplayerconnect(); + level.numgametypereservedobjectives = 0; + level.releasedobjectives = []; + if ( !sessionmodeiszombiesgame() ) + { + precacheitem( "briefcase_bomb_mp" ); + precacheitem( "briefcase_bomb_defuse_mp" ); + } + level thread onplayerconnect(); } onplayerconnect() { - level endon( "game_ended" ); - - for (;;) - { - level waittill( "connecting", player ); - - player thread onplayerspawned(); - player thread ondisconnect(); - } + level endon( "game_ended" ); + for ( ;; ) + { + level waittill( "connecting", player ); + player thread onplayerspawned(); + player thread ondisconnect(); + } } onplayerspawned() { - self endon( "disconnect" ); - level endon( "game_ended" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self thread ondeath(); - self.touchtriggers = []; - self.carryobject = undefined; - self.claimtrigger = undefined; - self.canpickupobject = 1; - self.disabledweapon = 0; - self.killedinuse = undefined; - } + self endon( "disconnect" ); + level endon( "game_ended" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread ondeath(); + self.touchtriggers = []; + self.carryobject = undefined; + self.claimtrigger = undefined; + self.canpickupobject = 1; + self.disabledweapon = 0; + self.killedinuse = undefined; + } } ondeath() { - level endon( "game_ended" ); - self endon( "spawned_player" ); - - self waittill( "death" ); - - if ( isdefined( self.carryobject ) ) - self.carryobject thread setdropped(); + level endon( "game_ended" ); + self endon( "spawned_player" ); + self waittill( "death" ); + if ( isDefined( self.carryobject ) ) + { + self.carryobject thread setdropped(); + } } ondisconnect() { - level endon( "game_ended" ); - - self waittill( "disconnect" ); - - if ( isdefined( self.carryobject ) ) - self.carryobject thread setdropped(); + level endon( "game_ended" ); + self waittill( "disconnect" ); + if ( isDefined( self.carryobject ) ) + { + self.carryobject thread setdropped(); + } } createcarryobject( ownerteam, trigger, visuals, offset, objectivename ) { - carryobject = spawnstruct(); - carryobject.type = "carryObject"; - carryobject.curorigin = trigger.origin; - carryobject.ownerteam = ownerteam; - carryobject.entnum = trigger getentitynumber(); - - if ( issubstr( trigger.classname, "use" ) ) - carryobject.triggertype = "use"; - else - carryobject.triggertype = "proximity"; - - trigger.baseorigin = trigger.origin; - carryobject.trigger = trigger; - carryobject.useweapon = undefined; - - if ( !isdefined( offset ) ) - offset = ( 0, 0, 0 ); - - carryobject.offset3d = offset; - carryobject.newstyle = 0; - - if ( isdefined( objectivename ) ) - carryobject.newstyle = 1; - else - objectivename = &""; - - for ( index = 0; index < visuals.size; index++ ) - { - visuals[index].baseorigin = visuals[index].origin; - visuals[index].baseangles = visuals[index].angles; - } - - carryobject.visuals = visuals; - carryobject.compassicons = []; - carryobject.objid = []; - - if ( !carryobject.newstyle ) - { - foreach ( team in level.teams ) - carryobject.objid[team] = getnextobjid(); - } - - carryobject.objidpingfriendly = 0; - carryobject.objidpingenemy = 0; - level.objidstart += 2; - carryobject.objectiveid = getnextobjid(); - objective_add( carryobject.objectiveid, "invisible", carryobject.curorigin, objectivename ); - carryobject.carrier = undefined; - carryobject.isresetting = 0; - carryobject.interactteam = "none"; - carryobject.allowweapons = 0; - carryobject.visiblecarriermodel = undefined; - carryobject.worldicons = []; - carryobject.carriervisible = 0; - carryobject.visibleteam = "none"; - carryobject.worldiswaypoint = []; - carryobject.carryicon = undefined; - carryobject.ondrop = undefined; - carryobject.onpickup = undefined; - carryobject.onreset = undefined; - - if ( carryobject.triggertype == "use" ) - carryobject thread carryobjectusethink(); - else - carryobject thread carryobjectproxthink(); - - carryobject thread updatecarryobjectorigin(); - carryobject thread updatecarryobjectobjectiveorigin(); - return carryobject; + carryobject = spawnstruct(); + carryobject.type = "carryObject"; + carryobject.curorigin = trigger.origin; + carryobject.ownerteam = ownerteam; + carryobject.entnum = trigger getentitynumber(); + if ( issubstr( trigger.classname, "use" ) ) + { + carryobject.triggertype = "use"; + } + else + { + carryobject.triggertype = "proximity"; + } + trigger.baseorigin = trigger.origin; + carryobject.trigger = trigger; + carryobject.useweapon = undefined; + if ( !isDefined( offset ) ) + { + offset = ( 0, 0, 1 ); + } + carryobject.offset3d = offset; + carryobject.newstyle = 0; + if ( isDefined( objectivename ) ) + { + carryobject.newstyle = 1; + } + else + { + objectivename = &""; + } + index = 0; + while ( index < visuals.size ) + { + visuals[ index ].baseorigin = visuals[ index ].origin; + visuals[ index ].baseangles = visuals[ index ].angles; + index++; + } + carryobject.visuals = visuals; + carryobject.compassicons = []; + carryobject.objid = []; + while ( !carryobject.newstyle ) + { + _a319 = level.teams; + _k319 = getFirstArrayKey( _a319 ); + while ( isDefined( _k319 ) ) + { + team = _a319[ _k319 ]; + carryobject.objid[ team ] = getnextobjid(); + _k319 = getNextArrayKey( _a319, _k319 ); + } + } + carryobject.objidpingfriendly = 0; + carryobject.objidpingenemy = 0; + level.objidstart += 2; + carryobject.objectiveid = getnextobjid(); + objective_add( carryobject.objectiveid, "invisible", carryobject.curorigin, objectivename ); + carryobject.carrier = undefined; + carryobject.isresetting = 0; + carryobject.interactteam = "none"; + carryobject.allowweapons = 0; + carryobject.visiblecarriermodel = undefined; + carryobject.worldicons = []; + carryobject.carriervisible = 0; + carryobject.visibleteam = "none"; + carryobject.worldiswaypoint = []; + carryobject.carryicon = undefined; + carryobject.ondrop = undefined; + carryobject.onpickup = undefined; + carryobject.onreset = undefined; + if ( carryobject.triggertype == "use" ) + { + carryobject thread carryobjectusethink(); + } + else + { + carryobject thread carryobjectproxthink(); + } + carryobject thread updatecarryobjectorigin(); + carryobject thread updatecarryobjectobjectiveorigin(); + return carryobject; } carryobjectusethink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - - while ( true ) - { - self.trigger waittill( "trigger", player ); - - if ( self.isresetting ) - continue; - - if ( !isalive( player ) ) - continue; - - if ( isdefined( player.laststand ) && player.laststand ) - continue; - - if ( !self caninteractwith( player ) ) - continue; - - if ( !player.canpickupobject ) - continue; - - if ( player.throwinggrenade ) - continue; - - if ( isdefined( self.carrier ) ) - continue; - - if ( player isinvehicle() ) - continue; - - if ( player isweaponviewonlylinked() ) - continue; - - if ( !player istouching( self.trigger ) ) - continue; - - self setpickedup( player ); - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + while ( 1 ) + { + self.trigger waittill( "trigger", player ); + while ( self.isresetting ) + { + continue; + } + while ( !isalive( player ) ) + { + continue; + } + if ( isDefined( player.laststand ) && player.laststand ) + { + continue; + } + while ( !self caninteractwith( player ) ) + { + continue; + } + while ( !player.canpickupobject ) + { + continue; + } + while ( player.throwinggrenade ) + { + continue; + } + while ( isDefined( self.carrier ) ) + { + continue; + } + while ( player isinvehicle() ) + { + continue; + } + while ( player isweaponviewonlylinked() ) + { + continue; + } + while ( !player istouching( self.trigger ) ) + { + continue; + } + self setpickedup( player ); + } } carryobjectproxthink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - - while ( true ) - { - self.trigger waittill( "trigger", player ); - - if ( self.isresetting ) - continue; - - if ( !isalive( player ) ) - continue; - - if ( isdefined( player.laststand ) && player.laststand ) - continue; - - if ( !self caninteractwith( player ) ) - continue; - - if ( !player.canpickupobject ) - continue; - - if ( player.throwinggrenade ) - continue; - - if ( isdefined( self.carrier ) ) - continue; - - if ( player isinvehicle() ) - continue; - - if ( player isweaponviewonlylinked() ) - continue; - - if ( !player istouching( self.trigger ) ) - continue; - - self setpickedup( player ); - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + while ( 1 ) + { + self.trigger waittill( "trigger", player ); + while ( self.isresetting ) + { + continue; + } + while ( !isalive( player ) ) + { + continue; + } + if ( isDefined( player.laststand ) && player.laststand ) + { + continue; + } + while ( !self caninteractwith( player ) ) + { + continue; + } + while ( !player.canpickupobject ) + { + continue; + } + while ( player.throwinggrenade ) + { + continue; + } + while ( isDefined( self.carrier ) ) + { + continue; + } + while ( player isinvehicle() ) + { + continue; + } + while ( player isweaponviewonlylinked() ) + { + continue; + } + while ( !player istouching( self.trigger ) ) + { + continue; + } + self setpickedup( player ); + } } pickupobjectdelay( origin ) { - level endon( "game_ended" ); - self endon( "death" ); - self endon( "disconnect" ); - self.canpickupobject = 0; - - for (;;) - { - if ( distancesquared( self.origin, origin ) > 4096 ) - break; - - wait 0.2; - } - - self.canpickupobject = 1; + level endon( "game_ended" ); + self endon( "death" ); + self endon( "disconnect" ); + self.canpickupobject = 0; + for ( ;; ) + { + if ( distancesquared( self.origin, origin ) > 4096 ) + { + break; + } + else + { + wait 0,2; + } + } + self.canpickupobject = 1; } setpickedup( player ) { - if ( isdefined( player.carryobject ) ) - { - if ( isdefined( player.carryobject.swappable ) && player.carryobject.swappable ) - player.carryobject thread setdropped(); - else - { - if ( isdefined( self.onpickupfailed ) ) - self [[ self.onpickupfailed ]]( player ); - - return; - } - } - - player giveobject( self ); - self setcarrier( player ); - - for ( index = 0; index < self.visuals.size; index++ ) - self.visuals[index] thread hideobject(); - - self.trigger.origin += vectorscale( ( 0, 0, 1 ), 10000.0 ); - self notify( "pickup_object" ); - - if ( isdefined( self.onpickup ) ) - self [[ self.onpickup ]]( player ); - - self updatecompassicons(); - self updateworldicons(); - self updateobjective(); + if ( isDefined( player.carryobject ) ) + { + if ( isDefined( player.carryobject.swappable ) && player.carryobject.swappable ) + { + player.carryobject thread setdropped(); + } + else + { + if ( isDefined( self.onpickupfailed ) ) + { + self [[ self.onpickupfailed ]]( player ); + } + return; + } + } + player giveobject( self ); + self setcarrier( player ); + index = 0; + while ( index < self.visuals.size ) + { + self.visuals[ index ] thread hideobject(); + index++; + } + self.trigger.origin += vectorScale( ( 0, 0, 1 ), 10000 ); + self notify( "pickup_object" ); + if ( isDefined( self.onpickup ) ) + { + self [[ self.onpickup ]]( player ); + } + self updatecompassicons(); + self updateworldicons(); + self updateobjective(); } hideobject() { - radius = 32; - origin = self.origin; - grenades = getentarray( "grenade", "classname" ); - radiussq = radius * radius; - linkedgrenades = []; - linkedgrenadesindex = 0; - self hide(); - - for ( i = 0; i < grenades.size; i++ ) - { - if ( distancesquared( origin, grenades[i].origin ) < radiussq ) - { - if ( grenades[i] islinkedto( self ) ) - { - linkedgrenades[linkedgrenadesindex] = grenades[i]; - linkedgrenades[linkedgrenadesindex] unlink(); - linkedgrenadesindex++; - } - } - } - - self.origin += vectorscale( ( 0, 0, 1 ), 10000.0 ); - waittillframeend; - - for ( i = 0; i < linkedgrenadesindex; i++ ) - linkedgrenades[i] launch( vectorscale( ( 1, 1, 1 ), 5.0 ) ); + radius = 32; + origin = self.origin; + grenades = getentarray( "grenade", "classname" ); + radiussq = radius * radius; + linkedgrenades = []; + linkedgrenadesindex = 0; + self hide(); + i = 0; + while ( i < grenades.size ) + { + if ( distancesquared( origin, grenades[ i ].origin ) < radiussq ) + { + if ( grenades[ i ] islinkedto( self ) ) + { + linkedgrenades[ linkedgrenadesindex ] = grenades[ i ]; + linkedgrenades[ linkedgrenadesindex ] unlink(); + linkedgrenadesindex++; + } + } + i++; + } + self.origin += vectorScale( ( 0, 0, 1 ), 10000 ); + waittillframeend; + i = 0; + while ( i < linkedgrenadesindex ) + { + linkedgrenades[ i ] launch( vectorScale( ( 0, 0, 1 ), 5 ) ); + i++; + } } updatecarryobjectorigin() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - - if ( self.newstyle ) - return; - - objpingdelay = level.objectivepingdelay; - - for (;;) - { - if ( isdefined( self.carrier ) && level.teambased ) - { - self.curorigin = self.carrier.origin + vectorscale( ( 0, 0, 1 ), 75.0 ); - - if ( ( self.visibleteam == "friendly" || self.visibleteam == "any" ) && self.objidpingfriendly ) - { - foreach ( team in level.teams ) - { - if ( self isfriendlyteam( team ) ) - { - if ( self.objpoints[team].isshown ) - { - self.objpoints[team].alpha = self.objpoints[team].basealpha; - self.objpoints[team] fadeovertime( objpingdelay + 1.0 ); - self.objpoints[team].alpha = 0; - } - - objective_position( self.objid[team], self.curorigin ); - } - } - } - - if ( ( self.visibleteam == "enemy" || self.visibleteam == "any" ) && self.objidpingenemy ) - { - if ( !self isfriendlyteam( team ) ) - { - if ( self.objpoints[team].isshown ) - { - self.objpoints[team].alpha = self.objpoints[team].basealpha; - self.objpoints[team] fadeovertime( objpingdelay + 1.0 ); - self.objpoints[team].alpha = 0; - } - - objective_position( self.objid[team], self.curorigin ); - } - } - - self wait_endon( objpingdelay, "dropped", "reset" ); - continue; - } - - if ( isdefined( self.carrier ) ) - { - self.curorigin = self.carrier.origin + vectorscale( ( 0, 0, 1 ), 75.0 ); - wait 0.05; - continue; - } - - wait 0.05; - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + if ( self.newstyle ) + { + return; + } + objpingdelay = level.objectivepingdelay; + for ( ;; ) + { + if ( isDefined( self.carrier ) && level.teambased ) + { + self.curorigin = self.carrier.origin + vectorScale( ( 0, 0, 1 ), 75 ); + while ( self.visibleteam != "friendly" && self.visibleteam == "any" && self.objidpingfriendly ) + { + _a626 = level.teams; + _k626 = getFirstArrayKey( _a626 ); + while ( isDefined( _k626 ) ) + { + team = _a626[ _k626 ]; + if ( self isfriendlyteam( team ) ) + { + if ( self.objpoints[ team ].isshown ) + { + self.objpoints[ team ].alpha = self.objpoints[ team ].basealpha; + self.objpoints[ team ] fadeovertime( objpingdelay + 1 ); + self.objpoints[ team ].alpha = 0; + } + objective_position( self.objid[ team ], self.curorigin ); + } + _k626 = getNextArrayKey( _a626, _k626 ); + } + } + if ( self.visibleteam != "enemy" && self.visibleteam == "any" && self.objidpingenemy ) + { + if ( !self isfriendlyteam( team ) ) + { + if ( self.objpoints[ team ].isshown ) + { + self.objpoints[ team ].alpha = self.objpoints[ team ].basealpha; + self.objpoints[ team ] fadeovertime( objpingdelay + 1 ); + self.objpoints[ team ].alpha = 0; + } + objective_position( self.objid[ team ], self.curorigin ); + } + } + self wait_endon( objpingdelay, "dropped", "reset" ); + continue; + } + else + { + if ( isDefined( self.carrier ) ) + { + self.curorigin = self.carrier.origin + vectorScale( ( 0, 0, 1 ), 75 ); + wait 0,05; + break; + } + else + { + wait 0,05; + } + } + } } updatecarryobjectobjectiveorigin() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - - if ( !self.newstyle ) - return; - - objpingdelay = level.objectivepingdelay; - - for (;;) - { - if ( isdefined( self.carrier ) ) - { - self.curorigin = self.carrier.origin; - objective_position( self.objectiveid, self.curorigin ); - self wait_endon( objpingdelay, "dropped", "reset" ); - continue; - } - - objective_position( self.objectiveid, self.curorigin ); - wait 0.05; - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + if ( !self.newstyle ) + { + return; + } + objpingdelay = level.objectivepingdelay; + for ( ;; ) + { + if ( isDefined( self.carrier ) ) + { + self.curorigin = self.carrier.origin; + objective_position( self.objectiveid, self.curorigin ); + self wait_endon( objpingdelay, "dropped", "reset" ); + continue; + } + else + { + objective_position( self.objectiveid, self.curorigin ); + wait 0,05; + } + } } giveobject( object ) { /# - assert( !isdefined( self.carryobject ) ); + assert( !isDefined( self.carryobject ) ); #/ - self.carryobject = object; - self thread trackcarrier(); - - if ( !object.allowweapons ) - { - self _disableweapon(); - self thread manualdropthink(); - } - - self.disallowvehicleusage = 1; - - if ( isdefined( object.visiblecarriermodel ) ) - self maps\mp\gametypes_zm\_weapons::forcestowedweaponupdate(); - - if ( !object.newstyle ) - { - if ( isdefined( object.carryicon ) ) - { - if ( self issplitscreen() ) - { - self.carryicon = createicon( object.carryicon, 35, 35 ); - self.carryicon.x = -130; - self.carryicon.y = -90; - self.carryicon.horzalign = "right"; - self.carryicon.vertalign = "bottom"; - } - else - { - self.carryicon = createicon( object.carryicon, 50, 50 ); - - if ( !object.allowweapons ) - self.carryicon setpoint( "CENTER", "CENTER", 0, 60 ); - else - { - self.carryicon.x = 130; - self.carryicon.y = -60; - self.carryicon.horzalign = "user_left"; - self.carryicon.vertalign = "user_bottom"; - } - } - - self.carryicon.alpha = 0.75; - self.carryicon.hidewhileremotecontrolling = 1; - self.carryicon.hidewheninkillcam = 1; - } - } + self.carryobject = object; + self thread trackcarrier(); + if ( !object.allowweapons ) + { + self _disableweapon(); + self thread manualdropthink(); + } + self.disallowvehicleusage = 1; + if ( isDefined( object.visiblecarriermodel ) ) + { + self maps/mp/gametypes_zm/_weapons::forcestowedweaponupdate(); + } + if ( !object.newstyle ) + { + if ( isDefined( object.carryicon ) ) + { + if ( self issplitscreen() ) + { + self.carryicon = createicon( object.carryicon, 35, 35 ); + self.carryicon.x = -130; + self.carryicon.y = -90; + self.carryicon.horzalign = "right"; + self.carryicon.vertalign = "bottom"; + } + else self.carryicon = createicon( object.carryicon, 50, 50 ); + if ( !object.allowweapons ) + { + self.carryicon setpoint( "CENTER", "CENTER", 0, 60 ); + } + else + { + self.carryicon.x = 130; + self.carryicon.y = -60; + self.carryicon.horzalign = "user_left"; + self.carryicon.vertalign = "user_bottom"; + } + self.carryicon.alpha = 0,75; + self.carryicon.hidewhileremotecontrolling = 1; + self.carryicon.hidewheninkillcam = 1; + } + } } returnhome() { - self.isresetting = 1; - self notify( "reset" ); - - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[index].origin = self.visuals[index].baseorigin; - self.visuals[index].angles = self.visuals[index].baseangles; - self.visuals[index] show(); - } - - self.trigger.origin = self.trigger.baseorigin; - self.curorigin = self.trigger.origin; - - if ( isdefined( self.onreset ) ) - self [[ self.onreset ]](); - - self clearcarrier(); - updateworldicons(); - updatecompassicons(); - updateobjective(); - self.isresetting = 0; + self.isresetting = 1; + self notify( "reset" ); + index = 0; + while ( index < self.visuals.size ) + { + self.visuals[ index ].origin = self.visuals[ index ].baseorigin; + self.visuals[ index ].angles = self.visuals[ index ].baseangles; + self.visuals[ index ] show(); + index++; + } + self.trigger.origin = self.trigger.baseorigin; + self.curorigin = self.trigger.origin; + if ( isDefined( self.onreset ) ) + { + self [[ self.onreset ]](); + } + self clearcarrier(); + updateworldicons(); + updatecompassicons(); + updateobjective(); + self.isresetting = 0; } isobjectawayfromhome() { - if ( isdefined( self.carrier ) ) - return true; - - if ( distancesquared( self.trigger.origin, self.trigger.baseorigin ) > 4 ) - return true; - - return false; + if ( isDefined( self.carrier ) ) + { + return 1; + } + if ( distancesquared( self.trigger.origin, self.trigger.baseorigin ) > 4 ) + { + return 1; + } + return 0; } setposition( origin, angles ) { - self.isresetting = 1; - - for ( index = 0; index < self.visuals.size; index++ ) - { - visual = self.visuals[index]; - visual.origin = origin; - visual.angles = angles; - visual show(); - } - - self.trigger.origin = origin; - self.curorigin = self.trigger.origin; - self clearcarrier(); - updateworldicons(); - updatecompassicons(); - updateobjective(); - self.isresetting = 0; + self.isresetting = 1; + index = 0; + while ( index < self.visuals.size ) + { + visual = self.visuals[ index ]; + visual.origin = origin; + visual.angles = angles; + visual show(); + index++; + } + self.trigger.origin = origin; + self.curorigin = self.trigger.origin; + self clearcarrier(); + updateworldicons(); + updatecompassicons(); + updateobjective(); + self.isresetting = 0; } onplayerlaststand() { - if ( isdefined( self.carryobject ) ) - self.carryobject thread setdropped(); + if ( isDefined( self.carryobject ) ) + { + self.carryobject thread setdropped(); + } } setdropped() { - self.isresetting = 1; - self notify( "dropped" ); - startorigin = ( 0, 0, 0 ); - endorigin = ( 0, 0, 0 ); - body = undefined; - - if ( isdefined( self.carrier ) && self.carrier.team != "spectator" ) - { - startorigin = self.carrier.origin + vectorscale( ( 0, 0, 1 ), 20.0 ); - endorigin = self.carrier.origin - vectorscale( ( 0, 0, 1 ), 2000.0 ); - body = self.carrier.body; - self.visuals[0].origin = self.carrier.origin; - } - else - { - startorigin = self.safeorigin + vectorscale( ( 0, 0, 1 ), 20.0 ); - endorigin = self.safeorigin - vectorscale( ( 0, 0, 1 ), 20.0 ); - } - - trace = playerphysicstrace( startorigin, endorigin ); - angletrace = bullettrace( startorigin, endorigin, 0, body ); - droppingplayer = self.carrier; - - if ( isdefined( trace ) ) - { - tempangle = randomfloat( 360 ); - droporigin = trace; - - if ( angletrace["fraction"] < 1 && distance( angletrace["position"], trace ) < 10.0 ) - { - forward = ( cos( tempangle ), sin( tempangle ), 0 ); - forward = vectornormalize( forward - vectorscale( angletrace["normal"], vectordot( forward, angletrace["normal"] ) ) ); - dropangles = vectortoangles( forward ); - } - else - dropangles = ( 0, tempangle, 0 ); - - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[index].origin = droporigin; - self.visuals[index].angles = dropangles; - self.visuals[index] show(); - } - - self.trigger.origin = droporigin; - self.curorigin = self.trigger.origin; - self thread pickuptimeout( trace[2], startorigin[2] ); - } - else - { - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[index].origin = self.visuals[index].baseorigin; - self.visuals[index].angles = self.visuals[index].baseangles; - self.visuals[index] show(); - } - - self.trigger.origin = self.trigger.baseorigin; - self.curorigin = self.trigger.baseorigin; - } - - if ( isdefined( self.ondrop ) ) - self [[ self.ondrop ]]( droppingplayer ); - - self clearcarrier(); - self updatecompassicons(); - self updateworldicons(); - self updateobjective(); - self.isresetting = 0; + self.isresetting = 1; + self notify( "dropped" ); + startorigin = ( 0, 0, 1 ); + endorigin = ( 0, 0, 1 ); + body = undefined; + if ( isDefined( self.carrier ) && self.carrier.team != "spectator" ) + { + startorigin = self.carrier.origin + vectorScale( ( 0, 0, 1 ), 20 ); + endorigin = self.carrier.origin - vectorScale( ( 0, 0, 1 ), 2000 ); + body = self.carrier.body; + self.visuals[ 0 ].origin = self.carrier.origin; + } + else + { + startorigin = self.safeorigin + vectorScale( ( 0, 0, 1 ), 20 ); + endorigin = self.safeorigin - vectorScale( ( 0, 0, 1 ), 20 ); + } + trace = playerphysicstrace( startorigin, endorigin ); + angletrace = bullettrace( startorigin, endorigin, 0, body ); + droppingplayer = self.carrier; + if ( isDefined( trace ) ) + { + tempangle = randomfloat( 360 ); + droporigin = trace; + if ( angletrace[ "fraction" ] < 1 && distance( angletrace[ "position" ], trace ) < 10 ) + { + forward = ( cos( tempangle ), sin( tempangle ), 0 ); + forward = vectornormalize( forward - vectorScale( angletrace[ "normal" ], vectordot( forward, angletrace[ "normal" ] ) ) ); + dropangles = vectorToAngle( forward ); + } + else + { + dropangles = ( 0, tempangle, 0 ); + } + index = 0; + while ( index < self.visuals.size ) + { + self.visuals[ index ].origin = droporigin; + self.visuals[ index ].angles = dropangles; + self.visuals[ index ] show(); + index++; + } + self.trigger.origin = droporigin; + self.curorigin = self.trigger.origin; + self thread pickuptimeout( trace[ 2 ], startorigin[ 2 ] ); + } + else + { + index = 0; + while ( index < self.visuals.size ) + { + self.visuals[ index ].origin = self.visuals[ index ].baseorigin; + self.visuals[ index ].angles = self.visuals[ index ].baseangles; + self.visuals[ index ] show(); + index++; + } + self.trigger.origin = self.trigger.baseorigin; + self.curorigin = self.trigger.baseorigin; + } + if ( isDefined( self.ondrop ) ) + { + self [[ self.ondrop ]]( droppingplayer ); + } + self clearcarrier(); + self updatecompassicons(); + self updateworldicons(); + self updateobjective(); + self.isresetting = 0; } setcarrier( carrier ) { - self.carrier = carrier; - objective_setplayerusing( self.objectiveid, carrier ); - self thread updatevisibilityaccordingtoradar(); + self.carrier = carrier; + objective_setplayerusing( self.objectiveid, carrier ); + self thread updatevisibilityaccordingtoradar(); } clearcarrier() { - if ( !isdefined( self.carrier ) ) - return; - - self.carrier takeobject( self ); - objective_clearplayerusing( self.objectiveid, self.carrier ); - self.carrier = undefined; - self notify( "carrier_cleared" ); + if ( !isDefined( self.carrier ) ) + { + return; + } + self.carrier takeobject( self ); + objective_clearplayerusing( self.objectiveid, self.carrier ); + self.carrier = undefined; + self notify( "carrier_cleared" ); } shouldbereset( minz, maxz ) { - minetriggers = getentarray( "minefield", "targetname" ); - hurttriggers = getentarray( "trigger_hurt", "classname" ); - elevators = getentarray( "script_elevator", "targetname" ); - - for ( index = 0; index < minetriggers.size; index++ ) - { - if ( self.visuals[0] istouchingswept( minetriggers[index], minz, maxz ) ) - return true; - } - - for ( index = 0; index < hurttriggers.size; index++ ) - { - if ( self.visuals[0] istouchingswept( hurttriggers[index], minz, maxz ) ) - return true; - } - - for ( index = 0; index < elevators.size; index++ ) - { + minetriggers = getentarray( "minefield", "targetname" ); + hurttriggers = getentarray( "trigger_hurt", "classname" ); + elevators = getentarray( "script_elevator", "targetname" ); + index = 0; + while ( index < minetriggers.size ) + { + if ( self.visuals[ 0 ] istouchingswept( minetriggers[ index ], minz, maxz ) ) + { + return 1; + } + index++; + } + index = 0; + while ( index < hurttriggers.size ) + { + if ( self.visuals[ 0 ] istouchingswept( hurttriggers[ index ], minz, maxz ) ) + { + return 1; + } + index++; + } + index = 0; + while ( index < elevators.size ) + { /# - assert( isdefined( elevators[index].occupy_volume ) ); + assert( isDefined( elevators[ index ].occupy_volume ) ); #/ - if ( self.visuals[0] istouchingswept( elevators[index].occupy_volume, minz, maxz ) ) - return true; - } - - return false; + if ( self.visuals[ 0 ] istouchingswept( elevators[ index ].occupy_volume, minz, maxz ) ) + { + return 1; + } + index++; + } + return 0; } pickuptimeout( minz, maxz ) { - self endon( "pickup_object" ); - self endon( "stop_pickup_timeout" ); - wait 0.05; - - if ( self shouldbereset( minz, maxz ) ) - { - self returnhome(); - return; - } - - if ( isdefined( self.autoresettime ) ) - { - wait( self.autoresettime ); - - if ( !isdefined( self.carrier ) ) - self returnhome(); - } + self endon( "pickup_object" ); + self endon( "stop_pickup_timeout" ); + wait 0,05; + if ( self shouldbereset( minz, maxz ) ) + { + self returnhome(); + return; + } + if ( isDefined( self.autoresettime ) ) + { + wait self.autoresettime; + if ( !isDefined( self.carrier ) ) + { + self returnhome(); + } + } } takeobject( object ) { - if ( isdefined( self.carryicon ) ) - self.carryicon destroyelem(); - - if ( isdefined( object.visiblecarriermodel ) ) - self maps\mp\gametypes_zm\_weapons::detach_all_weapons(); - - self.carryobject = undefined; - - if ( !isalive( self ) ) - return; - - self notify( "drop_object" ); - self.disallowvehicleusage = 0; - - if ( object.triggertype == "proximity" ) - self thread pickupobjectdelay( object.trigger.origin ); - - if ( isdefined( object.visiblecarriermodel ) ) - self maps\mp\gametypes_zm\_weapons::forcestowedweaponupdate(); - - if ( !object.allowweapons ) - self _enableweapon(); + if ( isDefined( self.carryicon ) ) + { + self.carryicon destroyelem(); + } + if ( isDefined( object.visiblecarriermodel ) ) + { + self maps/mp/gametypes_zm/_weapons::detach_all_weapons(); + } + self.carryobject = undefined; + if ( !isalive( self ) ) + { + return; + } + self notify( "drop_object" ); + self.disallowvehicleusage = 0; + if ( object.triggertype == "proximity" ) + { + self thread pickupobjectdelay( object.trigger.origin ); + } + if ( isDefined( object.visiblecarriermodel ) ) + { + self maps/mp/gametypes_zm/_weapons::forcestowedweaponupdate(); + } + if ( !object.allowweapons ) + { + self _enableweapon(); + } } trackcarrier() { - level endon( "game_ended" ); - self endon( "disconnect" ); - self endon( "death" ); - self endon( "drop_object" ); - - while ( isdefined( self.carryobject ) && isalive( self ) ) - { - if ( self isonground() ) - { - trace = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 20.0 ), self.origin - vectorscale( ( 0, 0, 1 ), 20.0 ), 0, undefined ); - - if ( trace["fraction"] < 1 ) - self.carryobject.safeorigin = trace["position"]; - } - - wait 0.05; - } + level endon( "game_ended" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "drop_object" ); + while ( isDefined( self.carryobject ) && isalive( self ) ) + { + if ( self isonground() ) + { + trace = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 20 ), self.origin - vectorScale( ( 0, 0, 1 ), 20 ), 0, undefined ); + if ( trace[ "fraction" ] < 1 ) + { + self.carryobject.safeorigin = trace[ "position" ]; + } + } + wait 0,05; + } } manualdropthink() { - level endon( "game_ended" ); - self endon( "disconnect" ); - self endon( "death" ); - self endon( "drop_object" ); - - for (;;) - { - while ( self attackbuttonpressed() || self fragbuttonpressed() || self secondaryoffhandbuttonpressed() || self meleebuttonpressed() ) - wait 0.05; - - while ( !self attackbuttonpressed() && !self fragbuttonpressed() && !self secondaryoffhandbuttonpressed() && !self meleebuttonpressed() ) - wait 0.05; - - if ( isdefined( self.carryobject ) && !self usebuttonpressed() ) - self.carryobject thread setdropped(); - } + level endon( "game_ended" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "drop_object" ); + for ( ;; ) + { + while ( !self attackbuttonpressed() && !self fragbuttonpressed() || self secondaryoffhandbuttonpressed() && self meleebuttonpressed() ) + { + wait 0,05; + } + while ( !self attackbuttonpressed() && !self fragbuttonpressed() && !self secondaryoffhandbuttonpressed() && !self meleebuttonpressed() ) + { + wait 0,05; + } + if ( isDefined( self.carryobject ) && !self usebuttonpressed() ) + { + self.carryobject thread setdropped(); + } + } } createuseobject( ownerteam, trigger, visuals, offset, objectivename ) { - useobject = spawnstruct(); - useobject.type = "useObject"; - useobject.curorigin = trigger.origin; - useobject.ownerteam = ownerteam; - useobject.entnum = trigger getentitynumber(); - useobject.keyobject = undefined; - - if ( issubstr( trigger.classname, "use" ) ) - useobject.triggertype = "use"; - else - useobject.triggertype = "proximity"; - - useobject.trigger = trigger; - - for ( index = 0; index < visuals.size; index++ ) - { - visuals[index].baseorigin = visuals[index].origin; - visuals[index].baseangles = visuals[index].angles; - } - - useobject.visuals = visuals; - - if ( !isdefined( offset ) ) - offset = ( 0, 0, 0 ); - - useobject.offset3d = offset; - useobject.newstyle = 0; - - if ( isdefined( objectivename ) ) - useobject.newstyle = 1; - else - objectivename = &""; - - useobject.compassicons = []; - useobject.objid = []; - - if ( !useobject.newstyle ) - { - foreach ( team in level.teams ) - useobject.objid[team] = getnextobjid(); - - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - objective_add( useobject.objid[team], "invisible", useobject.curorigin ); - objective_team( useobject.objid[team], team ); - } - } - else - objective_add( useobject.objid[level.nonteambasedteam], "invisible", useobject.curorigin ); - } - - useobject.objectiveid = getnextobjid(); - objective_add( useobject.objectiveid, "invisible", useobject.curorigin, objectivename ); - useobject.interactteam = "none"; - useobject.worldicons = []; - useobject.visibleteam = "none"; - useobject.worldiswaypoint = []; - useobject.onuse = undefined; - useobject.oncantuse = undefined; - useobject.usetext = "default"; - useobject.usetime = 10000; - useobject clearprogress(); - useobject.decayprogress = 0; - - if ( useobject.triggertype == "proximity" ) - { - useobject.numtouching["neutral"] = 0; - useobject.numtouching["none"] = 0; - useobject.touchlist["neutral"] = []; - useobject.touchlist["none"] = []; - - foreach ( team in level.teams ) - { - useobject.numtouching[team] = 0; - useobject.touchlist[team] = []; - } - - useobject.userate = 0; - useobject.claimteam = "none"; - useobject.claimplayer = undefined; - useobject.lastclaimteam = "none"; - useobject.lastclaimtime = 0; - useobject.claimgraceperiod = 1.0; - useobject.mustmaintainclaim = 0; - useobject.cancontestclaim = 0; - useobject thread useobjectproxthink(); - } - else - { - useobject.userate = 1; - useobject thread useobjectusethink(); - } - - return useobject; + useobject = spawnstruct(); + useobject.type = "useObject"; + useobject.curorigin = trigger.origin; + useobject.ownerteam = ownerteam; + useobject.entnum = trigger getentitynumber(); + useobject.keyobject = undefined; + if ( issubstr( trigger.classname, "use" ) ) + { + useobject.triggertype = "use"; + } + else + { + useobject.triggertype = "proximity"; + } + useobject.trigger = trigger; + index = 0; + while ( index < visuals.size ) + { + visuals[ index ].baseorigin = visuals[ index ].origin; + visuals[ index ].baseangles = visuals[ index ].angles; + index++; + } + useobject.visuals = visuals; + if ( !isDefined( offset ) ) + { + offset = ( 0, 0, 1 ); + } + useobject.offset3d = offset; + useobject.newstyle = 0; + if ( isDefined( objectivename ) ) + { + useobject.newstyle = 1; + } + else + { + objectivename = &""; + } + useobject.compassicons = []; + useobject.objid = []; + if ( !useobject.newstyle ) + { + _a1185 = level.teams; + _k1185 = getFirstArrayKey( _a1185 ); + while ( isDefined( _k1185 ) ) + { + team = _a1185[ _k1185 ]; + useobject.objid[ team ] = getnextobjid(); + _k1185 = getNextArrayKey( _a1185, _k1185 ); + } + if ( level.teambased ) + { + _a1192 = level.teams; + _k1192 = getFirstArrayKey( _a1192 ); + while ( isDefined( _k1192 ) ) + { + team = _a1192[ _k1192 ]; + objective_add( useobject.objid[ team ], "invisible", useobject.curorigin ); + objective_team( useobject.objid[ team ], team ); + _k1192 = getNextArrayKey( _a1192, _k1192 ); + } + } + else objective_add( useobject.objid[ level.nonteambasedteam ], "invisible", useobject.curorigin ); + } + useobject.objectiveid = getnextobjid(); + objective_add( useobject.objectiveid, "invisible", useobject.curorigin, objectivename ); + useobject.interactteam = "none"; + useobject.worldicons = []; + useobject.visibleteam = "none"; + useobject.worldiswaypoint = []; + useobject.onuse = undefined; + useobject.oncantuse = undefined; + useobject.usetext = "default"; + useobject.usetime = 10000; + useobject clearprogress(); + useobject.decayprogress = 0; + if ( useobject.triggertype == "proximity" ) + { + useobject.numtouching[ "neutral" ] = 0; + useobject.numtouching[ "none" ] = 0; + useobject.touchlist[ "neutral" ] = []; + useobject.touchlist[ "none" ] = []; + _a1255 = level.teams; + _k1255 = getFirstArrayKey( _a1255 ); + while ( isDefined( _k1255 ) ) + { + team = _a1255[ _k1255 ]; + useobject.numtouching[ team ] = 0; + useobject.touchlist[ team ] = []; + _k1255 = getNextArrayKey( _a1255, _k1255 ); + } + useobject.userate = 0; + useobject.claimteam = "none"; + useobject.claimplayer = undefined; + useobject.lastclaimteam = "none"; + useobject.lastclaimtime = 0; + useobject.claimgraceperiod = 1; + useobject.mustmaintainclaim = 0; + useobject.cancontestclaim = 0; + useobject thread useobjectproxthink(); + } + else + { + useobject.userate = 1; + useobject thread useobjectusethink(); + } + return useobject; } setkeyobject( object ) { - if ( !isdefined( object ) ) - { - self.keyobject = undefined; - return; - } - - if ( !isdefined( self.keyobject ) ) - self.keyobject = []; - - self.keyobject[self.keyobject.size] = object; + if ( !isDefined( object ) ) + { + self.keyobject = undefined; + return; + } + if ( !isDefined( self.keyobject ) ) + { + self.keyobject = []; + } + self.keyobject[ self.keyobject.size ] = object; } haskeyobject( use ) { - for ( x = 0; x < use.keyobject.size; x++ ) - { - if ( isdefined( self.carryobject ) && isdefined( use.keyobject[x] ) && self.carryobject == use.keyobject[x] ) - return true; - } - - return false; + x = 0; + while ( x < use.keyobject.size ) + { + if ( isDefined( self.carryobject ) && isDefined( use.keyobject[ x ] ) && self.carryobject == use.keyobject[ x ] ) + { + return 1; + } + x++; + } + return 0; } useobjectusethink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - - while ( true ) - { - self.trigger waittill( "trigger", player ); - - if ( !isalive( player ) ) - continue; - - if ( !self caninteractwith( player ) ) - continue; - - if ( !player isonground() ) - continue; - - if ( player isinvehicle() ) - continue; - - if ( isdefined( self.keyobject ) && ( !isdefined( player.carryobject ) || !player haskeyobject( self ) ) ) - { - if ( isdefined( self.oncantuse ) ) - self [[ self.oncantuse ]]( player ); - - continue; - } - - result = 1; - - if ( self.usetime > 0 ) - { - if ( isdefined( self.onbeginuse ) ) - self [[ self.onbeginuse ]]( player ); - - team = player.pers["team"]; - result = self useholdthink( player ); - - if ( isdefined( self.onenduse ) ) - self [[ self.onenduse ]]( team, player, result ); - } - - if ( !result ) - continue; - - if ( isdefined( self.onuse ) ) - self [[ self.onuse ]]( player ); - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + while ( 1 ) + { + self.trigger waittill( "trigger", player ); + while ( !isalive( player ) ) + { + continue; + } + while ( !self caninteractwith( player ) ) + { + continue; + } + while ( !player isonground() ) + { + continue; + } + while ( player isinvehicle() ) + { + continue; + } + while ( isDefined( self.keyobject ) || !isDefined( player.carryobject ) && !player haskeyobject( self ) ) + { + if ( isDefined( self.oncantuse ) ) + { + self [[ self.oncantuse ]]( player ); + } + } + result = 1; + if ( self.usetime > 0 ) + { + if ( isDefined( self.onbeginuse ) ) + { + self [[ self.onbeginuse ]]( player ); + } + team = player.pers[ "team" ]; + result = self useholdthink( player ); + if ( isDefined( self.onenduse ) ) + { + self [[ self.onenduse ]]( team, player, result ); + } + } + while ( !result ) + { + continue; + } + if ( isDefined( self.onuse ) ) + { + self [[ self.onuse ]]( player ); + } + } } getearliestclaimplayer() { /# - assert( self.claimteam != "none" ); + assert( self.claimteam != "none" ); #/ - team = self.claimteam; - earliestplayer = self.claimplayer; - - if ( self.touchlist[team].size > 0 ) - { - earliesttime = undefined; - players = getarraykeys( self.touchlist[team] ); - - for ( index = 0; index < players.size; index++ ) - { - touchdata = self.touchlist[team][players[index]]; - - if ( !isdefined( earliesttime ) || touchdata.starttime < earliesttime ) - { - earliestplayer = touchdata.player; - earliesttime = touchdata.starttime; - } - } - } - - return earliestplayer; + team = self.claimteam; + earliestplayer = self.claimplayer; + while ( self.touchlist[ team ].size > 0 ) + { + earliesttime = undefined; + players = getarraykeys( self.touchlist[ team ] ); + index = 0; + while ( index < players.size ) + { + touchdata = self.touchlist[ team ][ players[ index ] ]; + if ( !isDefined( earliesttime ) || touchdata.starttime < earliesttime ) + { + earliestplayer = touchdata.player; + earliesttime = touchdata.starttime; + } + index++; + } + } + return earliestplayer; } useobjectproxthink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - self thread proxtriggerthink(); - - while ( true ) - { - if ( self.usetime && self.curprogress >= self.usetime ) - { - self clearprogress(); - creditplayer = getearliestclaimplayer(); - - if ( isdefined( self.onenduse ) ) - self [[ self.onenduse ]]( self getclaimteam(), creditplayer, isdefined( creditplayer ) ); - - if ( isdefined( creditplayer ) && isdefined( self.onuse ) ) - self [[ self.onuse ]]( creditplayer ); - - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - - if ( self.claimteam != "none" ) - { - if ( self useobjectlockedforteam( self.claimteam ) ) - { - if ( isdefined( self.onenduse ) ) - self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); - - self setclaimteam( "none" ); - self.claimplayer = undefined; - self clearprogress(); - } - else if ( self.usetime ) - { - if ( self.decayprogress && !self.numtouching[self.claimteam] ) - { - if ( isdefined( self.claimplayer ) ) - { - if ( isdefined( self.onenduse ) ) - self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); - - self.claimplayer = undefined; - } - - decayscale = 0; - - if ( self.decaytime ) - decayscale = self.usetime / self.decaytime; - - self.curprogress -= 50 * self.userate * decayscale; - - if ( self.curprogress <= 0 ) - self clearprogress(); - - self updatecurrentprogress(); - - if ( isdefined( self.onuseupdate ) ) - self [[ self.onuseupdate ]]( self getclaimteam(), self.curprogress / self.usetime, 50 * self.userate * decayscale / self.usetime ); - - if ( self.curprogress == 0 ) - self setclaimteam( "none" ); - } - else if ( !self.numtouching[self.claimteam] ) - { - if ( isdefined( self.onenduse ) ) - self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); - - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - else - { - self.curprogress += 50 * self.userate; - self updatecurrentprogress(); - - if ( isdefined( self.onuseupdate ) ) - self [[ self.onuseupdate ]]( self getclaimteam(), self.curprogress / self.usetime, 50 * self.userate / self.usetime ); - } - } - else if ( !self.mustmaintainclaim ) - { - if ( isdefined( self.onuse ) ) - self [[ self.onuse ]]( self.claimplayer ); - - if ( !self.mustmaintainclaim ) - { - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - } - else if ( !self.numtouching[self.claimteam] ) - { - if ( isdefined( self.onunoccupied ) ) - self [[ self.onunoccupied ]](); - - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - else if ( self.cancontestclaim ) - { - numother = getnumtouchingexceptteam( self.claimteam ); - - if ( numother > 0 ) - { - if ( isdefined( self.oncontested ) ) - self [[ self.oncontested ]](); - - self setclaimteam( "none" ); - self.claimplayer = undefined; - } - } - } - else if ( self.curprogress > 0 && gettime() - self.lastclaimtime > self.claimgraceperiod * 1000 ) - self clearprogress(); - - wait 0.05; - maps\mp\gametypes_zm\_hostmigration::waittillhostmigrationdone(); - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + self thread proxtriggerthink(); + while ( 1 ) + { + if ( self.usetime && self.curprogress >= self.usetime ) + { + self clearprogress(); + creditplayer = getearliestclaimplayer(); + if ( isDefined( self.onenduse ) ) + { + self [[ self.onenduse ]]( self getclaimteam(), creditplayer, isDefined( creditplayer ) ); + } + if ( isDefined( creditplayer ) && isDefined( self.onuse ) ) + { + self [[ self.onuse ]]( creditplayer ); + } + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + if ( self.claimteam != "none" ) + { + if ( self useobjectlockedforteam( self.claimteam ) ) + { + if ( isDefined( self.onenduse ) ) + { + self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); + } + self setclaimteam( "none" ); + self.claimplayer = undefined; + self clearprogress(); + } + else if ( self.usetime ) + { + if ( self.decayprogress && !self.numtouching[ self.claimteam ] ) + { + if ( isDefined( self.claimplayer ) ) + { + if ( isDefined( self.onenduse ) ) + { + self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); + } + self.claimplayer = undefined; + } + decayscale = 0; + if ( self.decaytime ) + { + decayscale = self.usetime / self.decaytime; + } + self.curprogress -= 50 * self.userate * decayscale; + if ( self.curprogress <= 0 ) + { + self clearprogress(); + } + self updatecurrentprogress(); + if ( isDefined( self.onuseupdate ) ) + { + self [[ self.onuseupdate ]]( self getclaimteam(), self.curprogress / self.usetime, ( 50 * self.userate * decayscale ) / self.usetime ); + } + if ( self.curprogress == 0 ) + { + self setclaimteam( "none" ); + } + } + else + { + if ( !self.numtouching[ self.claimteam ] ) + { + if ( isDefined( self.onenduse ) ) + { + self [[ self.onenduse ]]( self getclaimteam(), self.claimplayer, 0 ); + } + self setclaimteam( "none" ); + self.claimplayer = undefined; + break; + } + else + { + self.curprogress += 50 * self.userate; + self updatecurrentprogress(); + if ( isDefined( self.onuseupdate ) ) + { + self [[ self.onuseupdate ]]( self getclaimteam(), self.curprogress / self.usetime, ( 50 * self.userate ) / self.usetime ); + } + } + } + } + else if ( !self.mustmaintainclaim ) + { + if ( isDefined( self.onuse ) ) + { + self [[ self.onuse ]]( self.claimplayer ); + } + if ( !self.mustmaintainclaim ) + { + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + } + else if ( !self.numtouching[ self.claimteam ] ) + { + if ( isDefined( self.onunoccupied ) ) + { + self [[ self.onunoccupied ]](); + } + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + else + { + if ( self.cancontestclaim ) + { + numother = getnumtouchingexceptteam( self.claimteam ); + if ( numother > 0 ) + { + if ( isDefined( self.oncontested ) ) + { + self [[ self.oncontested ]](); + } + self setclaimteam( "none" ); + self.claimplayer = undefined; + } + } + } + } + else + { + if ( self.curprogress > 0 && ( getTime() - self.lastclaimtime ) > ( self.claimgraceperiod * 1000 ) ) + { + self clearprogress(); + } + } + wait 0,05; + maps/mp/gametypes_zm/_hostmigration::waittillhostmigrationdone(); + } } useobjectlockedforteam( team ) { - if ( isdefined( self.teamlock ) && isdefined( level.teams[team] ) ) - return self.teamlock[team]; - - return 0; + if ( isDefined( self.teamlock ) && isDefined( level.teams[ team ] ) ) + { + return self.teamlock[ team ]; + } + return 0; } canclaim( player ) { - if ( self.cancontestclaim ) - { - numother = getnumtouchingexceptteam( player.pers["team"] ); - - if ( numother != 0 ) - return false; - } - - if ( !isdefined( self.keyobject ) || isdefined( player.carryobject ) && player haskeyobject( self ) ) - return true; - - return false; + if ( self.cancontestclaim ) + { + numother = getnumtouchingexceptteam( player.pers[ "team" ] ); + if ( numother != 0 ) + { + return 0; + } + } + if ( !isDefined( self.keyobject ) || isDefined( player.carryobject ) && player haskeyobject( self ) ) + { + return 1; + } + return 0; } proxtriggerthink() { - level endon( "game_ended" ); - self.trigger endon( "destroyed" ); - entitynumber = self.entnum; - - while ( true ) - { - self.trigger waittill( "trigger", player ); - - if ( !isalive( player ) || self useobjectlockedforteam( player.pers["team"] ) ) - continue; - - if ( player isinvehicle() ) - continue; - - if ( player isweaponviewonlylinked() ) - continue; - - if ( self caninteractwith( player ) && self.claimteam == "none" ) - { - if ( self canclaim( player ) ) - { - setclaimteam( player.pers["team"] ); - self.claimplayer = player; - - if ( self.usetime && isdefined( self.onbeginuse ) ) - self [[ self.onbeginuse ]]( self.claimplayer ); - } - else if ( isdefined( self.oncantuse ) ) - self [[ self.oncantuse ]]( player ); - } - - if ( isalive( player ) && !isdefined( player.touchtriggers[entitynumber] ) ) - player thread triggertouchthink( self ); - } + level endon( "game_ended" ); + self.trigger endon( "destroyed" ); + entitynumber = self.entnum; + while ( 1 ) + { + self.trigger waittill( "trigger", player ); + if ( !isalive( player ) || self useobjectlockedforteam( player.pers[ "team" ] ) ) + { + continue; + } + while ( player isinvehicle() ) + { + continue; + } + while ( player isweaponviewonlylinked() ) + { + continue; + } + if ( self caninteractwith( player ) && self.claimteam == "none" ) + { + if ( self canclaim( player ) ) + { + setclaimteam( player.pers[ "team" ] ); + self.claimplayer = player; + if ( self.usetime && isDefined( self.onbeginuse ) ) + { + self [[ self.onbeginuse ]]( self.claimplayer ); + } + break; + } + else + { + if ( isDefined( self.oncantuse ) ) + { + self [[ self.oncantuse ]]( player ); + } + } + } + if ( isalive( player ) && !isDefined( player.touchtriggers[ entitynumber ] ) ) + { + player thread triggertouchthink( self ); + } + } } clearprogress() { - self.curprogress = 0; - self updatecurrentprogress(); - - if ( isdefined( self.onuseclear ) ) - self [[ self.onuseclear ]](); + self.curprogress = 0; + self updatecurrentprogress(); + if ( isDefined( self.onuseclear ) ) + { + self [[ self.onuseclear ]](); + } } setclaimteam( newteam ) { /# - assert( newteam != self.claimteam ); + assert( newteam != self.claimteam ); #/ - if ( self.claimteam == "none" && gettime() - self.lastclaimtime > self.claimgraceperiod * 1000 ) - self clearprogress(); - else if ( newteam != "none" && newteam != self.lastclaimteam ) - self clearprogress(); - - self.lastclaimteam = self.claimteam; - self.lastclaimtime = gettime(); - self.claimteam = newteam; - self updateuserate(); + if ( self.claimteam == "none" && ( getTime() - self.lastclaimtime ) > ( self.claimgraceperiod * 1000 ) ) + { + self clearprogress(); + } + else + { + if ( newteam != "none" && newteam != self.lastclaimteam ) + { + self clearprogress(); + } + } + self.lastclaimteam = self.claimteam; + self.lastclaimtime = getTime(); + self.claimteam = newteam; + self updateuserate(); } getclaimteam() { - return self.claimteam; + return self.claimteam; } continuetriggertouchthink( team, object ) { - if ( !isalive( self ) ) - return false; - - if ( self useobjectlockedforteam( team ) ) - return false; - - if ( self isinvehicle() ) - return false; - - if ( !self istouching( object.trigger ) ) - return false; - - return true; + if ( !isalive( self ) ) + { + return 0; + } + if ( self useobjectlockedforteam( team ) ) + { + return 0; + } + if ( self isinvehicle() ) + { + return 0; + } + if ( !self istouching( object.trigger ) ) + { + return 0; + } + return 1; } triggertouchthink( object ) { - team = self.pers["team"]; - score = 1; - object.numtouching[team] += score; - - if ( object.usetime ) - object updateuserate(); - - touchname = "player" + self.clientid; - struct = spawnstruct(); - struct.player = self; - struct.starttime = gettime(); - object.touchlist[team][touchname] = struct; - objective_setplayerusing( object.objectiveid, self ); - self.touchtriggers[object.entnum] = object.trigger; - - if ( isdefined( object.ontouchuse ) ) - object [[ object.ontouchuse ]]( self ); - - while ( self continuetriggertouchthink( team, object ) ) - { - if ( object.usetime ) - self updateproxbar( object, 0 ); - - wait 0.05; - } - - if ( isdefined( self ) ) - { - if ( object.usetime ) - self updateproxbar( object, 1 ); - - self.touchtriggers[object.entnum] = undefined; - objective_clearplayerusing( object.objectiveid, self ); - } - - if ( level.gameended ) - return; - - object.touchlist[team][touchname] = undefined; - object.numtouching[team] -= score; - - if ( object.numtouching[team] < 1 ) - object.numtouching[team] = 0; - - if ( object.usetime ) - { - if ( object.numtouching[team] <= 0 && object.curprogress >= object.usetime ) - { - object.curprogress = object.usetime - 1; - object updatecurrentprogress(); - } - } - - if ( isdefined( self ) && isdefined( object.onendtouchuse ) ) - object [[ object.onendtouchuse ]]( self ); - - object updateuserate(); + team = self.pers[ "team" ]; + score = 1; + object.numtouching[ team ] += score; + if ( object.usetime ) + { + object updateuserate(); + } + touchname = "player" + self.clientid; + struct = spawnstruct(); + struct.player = self; + struct.starttime = getTime(); + object.touchlist[ team ][ touchname ] = struct; + objective_setplayerusing( object.objectiveid, self ); + self.touchtriggers[ object.entnum ] = object.trigger; + if ( isDefined( object.ontouchuse ) ) + { + object [[ object.ontouchuse ]]( self ); + } + while ( self continuetriggertouchthink( team, object ) ) + { + if ( object.usetime ) + { + self updateproxbar( object, 0 ); + } + wait 0,05; + } + if ( isDefined( self ) ) + { + if ( object.usetime ) + { + self updateproxbar( object, 1 ); + } + objective_clearplayerusing( object.objectiveid, self ); + } + if ( level.gameended ) + { + return; + } + object.numtouching[ team ] -= score; + if ( object.numtouching[ team ] < 1 ) + { + object.numtouching[ team ] = 0; + } + if ( object.usetime ) + { + if ( object.numtouching[ team ] <= 0 && object.curprogress >= object.usetime ) + { + object.curprogress = object.usetime - 1; + object updatecurrentprogress(); + } + } + if ( isDefined( self ) && isDefined( object.onendtouchuse ) ) + { + object [[ object.onendtouchuse ]]( self ); + } + object updateuserate(); } updateproxbar( object, forceremove ) { - if ( object.newstyle ) - return; - - if ( !forceremove && object.decayprogress ) - { - if ( !object caninteractwith( self ) ) - { - if ( isdefined( self.proxbar ) ) - self.proxbar hideelem(); - - if ( isdefined( self.proxbartext ) ) - self.proxbartext hideelem(); - - return; - } - else - { - if ( !isdefined( self.proxbar ) ) - { - self.proxbar = createprimaryprogressbar(); - self.proxbar.lastuserate = -1; - } - - if ( self.pers["team"] == object.claimteam ) - { - if ( self.proxbar.bar.color != ( 1, 1, 1 ) ) - { - self.proxbar.bar.color = ( 1, 1, 1 ); - self.proxbar.lastuserate = -1; - } - } - else if ( self.proxbar.bar.color != ( 1, 0, 0 ) ) - { - self.proxbar.bar.color = ( 1, 0, 0 ); - self.proxbar.lastuserate = -1; - } - } - } - else if ( forceremove || !object caninteractwith( self ) || self.pers["team"] != object.claimteam ) - { - if ( isdefined( self.proxbar ) ) - self.proxbar hideelem(); - - if ( isdefined( self.proxbartext ) ) - self.proxbartext hideelem(); - - return; - } - - if ( !isdefined( self.proxbar ) ) - { - self.proxbar = self createprimaryprogressbar(); - self.proxbar.lastuserate = -1; - self.proxbar.lasthostmigrationstate = 0; - } - - if ( self.proxbar.hidden ) - { - self.proxbar showelem(); - self.proxbar.lastuserate = -1; - self.proxbar.lasthostmigrationstate = 0; - } - - if ( !isdefined( self.proxbartext ) ) - { - self.proxbartext = self createprimaryprogressbartext(); - self.proxbartext settext( object.usetext ); - } - - if ( self.proxbartext.hidden ) - { - self.proxbartext showelem(); - self.proxbartext settext( object.usetext ); - } - - if ( self.proxbar.lastuserate != object.userate || self.proxbar.lasthostmigrationstate != isdefined( level.hostmigrationtimer ) ) - { - if ( object.curprogress > object.usetime ) - object.curprogress = object.usetime; - - if ( object.decayprogress && self.pers["team"] != object.claimteam ) - { - if ( object.curprogress > 0 ) - { - progress = object.curprogress / object.usetime; - rate = 1000 / object.usetime * ( object.userate * -1 ); - - if ( isdefined( level.hostmigrationtimer ) ) - rate = 0; - - self.proxbar updatebar( progress, rate ); - } - } - else - { - progress = object.curprogress / object.usetime; - rate = 1000 / object.usetime * object.userate; - - if ( isdefined( level.hostmigrationtimer ) ) - rate = 0; - - self.proxbar updatebar( progress, rate ); - } - - self.proxbar.lasthostmigrationstate = isdefined( level.hostmigrationtimer ); - self.proxbar.lastuserate = object.userate; - } + if ( object.newstyle ) + { + return; + } + if ( !forceremove && object.decayprogress ) + { + if ( !object caninteractwith( self ) ) + { + if ( isDefined( self.proxbar ) ) + { + self.proxbar hideelem(); + } + if ( isDefined( self.proxbartext ) ) + { + self.proxbartext hideelem(); + } + return; + } + else if ( !isDefined( self.proxbar ) ) + { + self.proxbar = createprimaryprogressbar(); + self.proxbar.lastuserate = -1; + } + if ( self.pers[ "team" ] == object.claimteam ) + { + if ( self.proxbar.bar.color != ( 0, 0, 1 ) ) + { + self.proxbar.bar.color = ( 0, 0, 1 ); + self.proxbar.lastuserate = -1; + } + } + else + { + if ( self.proxbar.bar.color != ( 0, 0, 1 ) ) + { + self.proxbar.bar.color = ( 0, 0, 1 ); + self.proxbar.lastuserate = -1; + } + } + } + else + { + if ( !forceremove || !object caninteractwith( self ) && self.pers[ "team" ] != object.claimteam ) + { + if ( isDefined( self.proxbar ) ) + { + self.proxbar hideelem(); + } + if ( isDefined( self.proxbartext ) ) + { + self.proxbartext hideelem(); + } + return; + } + } + if ( !isDefined( self.proxbar ) ) + { + self.proxbar = self createprimaryprogressbar(); + self.proxbar.lastuserate = -1; + self.proxbar.lasthostmigrationstate = 0; + } + if ( self.proxbar.hidden ) + { + self.proxbar showelem(); + self.proxbar.lastuserate = -1; + self.proxbar.lasthostmigrationstate = 0; + } + if ( !isDefined( self.proxbartext ) ) + { + self.proxbartext = self createprimaryprogressbartext(); + self.proxbartext settext( object.usetext ); + } + if ( self.proxbartext.hidden ) + { + self.proxbartext showelem(); + self.proxbartext settext( object.usetext ); + } + if ( self.proxbar.lastuserate != object.userate || self.proxbar.lasthostmigrationstate != isDefined( level.hostmigrationtimer ) ) + { + if ( object.curprogress > object.usetime ) + { + object.curprogress = object.usetime; + } + if ( object.decayprogress && self.pers[ "team" ] != object.claimteam ) + { + if ( object.curprogress > 0 ) + { + progress = object.curprogress / object.usetime; + rate = ( 1000 / object.usetime ) * ( object.userate * -1 ); + if ( isDefined( level.hostmigrationtimer ) ) + { + rate = 0; + } + self.proxbar updatebar( progress, rate ); + } + } + else + { + progress = object.curprogress / object.usetime; + rate = ( 1000 / object.usetime ) * object.userate; + if ( isDefined( level.hostmigrationtimer ) ) + { + rate = 0; + } + self.proxbar updatebar( progress, rate ); + } + self.proxbar.lasthostmigrationstate = isDefined( level.hostmigrationtimer ); + self.proxbar.lastuserate = object.userate; + } } getnumtouchingexceptteam( ignoreteam ) { - numtouching = 0; - - foreach ( team in level.teams ) - { - if ( ignoreteam == team ) - continue; - - numtouching += self.numtouching[team]; - } - - return numtouching; + numtouching = 0; + _a1902 = level.teams; + _k1902 = getFirstArrayKey( _a1902 ); + while ( isDefined( _k1902 ) ) + { + team = _a1902[ _k1902 ]; + if ( ignoreteam == team ) + { + } + else + { + numtouching += self.numtouching[ team ]; + } + _k1902 = getNextArrayKey( _a1902, _k1902 ); + } + return numtouching; } updateuserate() { - numclaimants = self.numtouching[self.claimteam]; - numother = 0; - numother = getnumtouchingexceptteam( self.claimteam ); - self.userate = 0; - - if ( self.decayprogress ) - { - if ( numclaimants && !numother ) - self.userate = numclaimants; - else if ( !numclaimants && numother ) - self.userate = numother; - else if ( !numclaimants && !numother ) - self.userate = 0; - } - else if ( numclaimants && !numother ) - self.userate = numclaimants; - - if ( isdefined( self.onupdateuserate ) ) - self [[ self.onupdateuserate ]](); + numclaimants = self.numtouching[ self.claimteam ]; + numother = 0; + numother = getnumtouchingexceptteam( self.claimteam ); + self.userate = 0; + if ( self.decayprogress ) + { + if ( numclaimants && !numother ) + { + self.userate = numclaimants; + } + else + { + if ( !numclaimants && numother ) + { + self.userate = numother; + } + else + { + if ( !numclaimants && !numother ) + { + self.userate = 0; + } + } + } + } + else + { + if ( numclaimants && !numother ) + { + self.userate = numclaimants; + } + } + if ( isDefined( self.onupdateuserate ) ) + { + self [[ self.onupdateuserate ]](); + } } useholdthink( player ) { - player notify( "use_hold" ); - - if ( !( isdefined( self.dontlinkplayertotrigger ) && self.dontlinkplayertotrigger ) ) - { - player playerlinkto( self.trigger ); - player playerlinkedoffsetenable(); - } - - player clientclaimtrigger( self.trigger ); - player.claimtrigger = self.trigger; - useweapon = self.useweapon; - lastweapon = player getcurrentweapon(); - - if ( isdefined( useweapon ) ) - { + player notify( "use_hold" ); + if ( isDefined( self.dontlinkplayertotrigger ) && !self.dontlinkplayertotrigger ) + { + player playerlinkto( self.trigger ); + player playerlinkedoffsetenable(); + } + player clientclaimtrigger( self.trigger ); + player.claimtrigger = self.trigger; + useweapon = self.useweapon; + lastweapon = player getcurrentweapon(); + if ( isDefined( useweapon ) ) + { /# - assert( isdefined( lastweapon ) ); + assert( isDefined( lastweapon ) ); #/ - if ( lastweapon == useweapon ) - { + if ( lastweapon == useweapon ) + { /# - assert( isdefined( player.lastnonuseweapon ) ); + assert( isDefined( player.lastnonuseweapon ) ); #/ - lastweapon = player.lastnonuseweapon; - } + lastweapon = player.lastnonuseweapon; + } /# - assert( lastweapon != useweapon ); + assert( lastweapon != useweapon ); #/ - player.lastnonuseweapon = lastweapon; - player giveweapon( useweapon ); - player setweaponammostock( useweapon, 0 ); - player setweaponammoclip( useweapon, 0 ); - player switchtoweapon( useweapon ); - } - else - player _disableweapon(); - - self clearprogress(); - self.inuse = 1; - self.userate = 0; - objective_setplayerusing( self.objectiveid, player ); - player thread personalusebar( self ); - result = useholdthinkloop( player, lastweapon ); - - if ( isdefined( player ) ) - { - objective_clearplayerusing( self.objectiveid, player ); - self clearprogress(); - - if ( isdefined( player.attachedusemodel ) ) - { - player detach( player.attachedusemodel, "tag_inhand" ); - player.attachedusemodel = undefined; - } - - player notify( "done_using" ); - } - - if ( isdefined( useweapon ) && isdefined( player ) ) - player thread takeuseweapon( useweapon ); - - if ( isdefined( result ) && result ) - return true; - - if ( isdefined( player ) ) - { - player.claimtrigger = undefined; - - if ( isdefined( useweapon ) ) - { - ammo = player getweaponammoclip( lastweapon ); - - if ( lastweapon != "none" && !( isweaponequipment( lastweapon ) && player getweaponammoclip( lastweapon ) == 0 ) ) - player switchtoweapon( lastweapon ); - else - player takeweapon( useweapon ); - } - else if ( isalive( player ) ) - player _enableweapon(); - - if ( !( isdefined( self.dontlinkplayertotrigger ) && self.dontlinkplayertotrigger ) ) - player unlink(); - - if ( !isalive( player ) ) - player.killedinuse = 1; - } - - self.inuse = 0; - - if ( self.trigger.classname == "trigger_radius_use" ) - player clientreleasetrigger( self.trigger ); - else - self.trigger releaseclaimedtrigger(); - - return false; + player.lastnonuseweapon = lastweapon; + player giveweapon( useweapon ); + player setweaponammostock( useweapon, 0 ); + player setweaponammoclip( useweapon, 0 ); + player switchtoweapon( useweapon ); + } + else + { + player _disableweapon(); + } + self clearprogress(); + self.inuse = 1; + self.userate = 0; + objective_setplayerusing( self.objectiveid, player ); + player thread personalusebar( self ); + result = useholdthinkloop( player, lastweapon ); + if ( isDefined( player ) ) + { + objective_clearplayerusing( self.objectiveid, player ); + self clearprogress(); + if ( isDefined( player.attachedusemodel ) ) + { + player detach( player.attachedusemodel, "tag_inhand" ); + player.attachedusemodel = undefined; + } + player notify( "done_using" ); + } + if ( isDefined( useweapon ) && isDefined( player ) ) + { + player thread takeuseweapon( useweapon ); + } + if ( isDefined( result ) && result ) + { + return 1; + } + if ( isDefined( player ) ) + { + player.claimtrigger = undefined; + if ( isDefined( useweapon ) ) + { + ammo = player getweaponammoclip( lastweapon ); + if ( lastweapon != "none" && isweaponequipment( lastweapon ) && player getweaponammoclip( lastweapon ) != 0 ) + { + player switchtoweapon( lastweapon ); + } + else + { + player takeweapon( useweapon ); + } + } + else + { + if ( isalive( player ) ) + { + player _enableweapon(); + } + } + if ( isDefined( self.dontlinkplayertotrigger ) && !self.dontlinkplayertotrigger ) + { + player unlink(); + } + if ( !isalive( player ) ) + { + player.killedinuse = 1; + } + } + self.inuse = 0; + if ( self.trigger.classname == "trigger_radius_use" ) + { + player clientreleasetrigger( self.trigger ); + } + else + { + self.trigger releaseclaimedtrigger(); + } + return 0; } takeuseweapon( useweapon ) { - self endon( "use_hold" ); - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - while ( self getcurrentweapon() == useweapon && !self.throwinggrenade ) - wait 0.05; - - self takeweapon( useweapon ); + self endon( "use_hold" ); + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + while ( self getcurrentweapon() == useweapon && !self.throwinggrenade ) + { + wait 0,05; + } + self takeweapon( useweapon ); } continueholdthinkloop( player, waitforweapon, timedout, usetime ) { - maxwaittime = 1.5; - - if ( !isalive( player ) ) - return false; - - if ( isdefined( player.laststand ) && player.laststand ) - return false; - - if ( self.curprogress >= usetime ) - return false; - - if ( !player usebuttonpressed() ) - return false; - - if ( player.throwinggrenade ) - return false; - - if ( player meleebuttonpressed() ) - return false; - - if ( player isinvehicle() ) - return false; - - if ( player isremotecontrolling() ) - return false; - - if ( player isweaponviewonlylinked() ) - return false; - - if ( !player istouching( self.trigger ) ) - return false; - - if ( !self.userate && !waitforweapon ) - return false; - - if ( waitforweapon && timedout > maxwaittime ) - return false; - - return true; + maxwaittime = 1,5; + if ( !isalive( player ) ) + { + return 0; + } + if ( isDefined( player.laststand ) && player.laststand ) + { + return 0; + } + if ( self.curprogress >= usetime ) + { + return 0; + } + if ( !player usebuttonpressed() ) + { + return 0; + } + if ( player.throwinggrenade ) + { + return 0; + } + if ( player meleebuttonpressed() ) + { + return 0; + } + if ( player isinvehicle() ) + { + return 0; + } + if ( player isremotecontrolling() ) + { + return 0; + } + if ( player isweaponviewonlylinked() ) + { + return 0; + } + if ( !player istouching( self.trigger ) ) + { + return 0; + } + if ( !self.userate && !waitforweapon ) + { + return 0; + } + if ( waitforweapon && timedout > maxwaittime ) + { + return 0; + } + return 1; } updatecurrentprogress() { - if ( self.usetime ) - { - progress = float( self.curprogress ) / self.usetime; - objective_setprogress( self.objectiveid, clamp( progress, 0, 1 ) ); - } + if ( self.usetime ) + { + progress = float( self.curprogress ) / self.usetime; + objective_setprogress( self.objectiveid, clamp( progress, 0, 1 ) ); + } } useholdthinkloop( player, lastweapon ) { - level endon( "game_ended" ); - self endon( "disabled" ); - useweapon = self.useweapon; - waitforweapon = 1; - timedout = 0; - usetime = self.usetime; - - while ( self continueholdthinkloop( player, waitforweapon, timedout, usetime ) ) - { - timedout += 0.05; - - if ( !isdefined( useweapon ) || player getcurrentweapon() == useweapon ) - { - self.curprogress += 50 * self.userate; - self updatecurrentprogress(); - self.userate = 1; - waitforweapon = 0; - } - else - self.userate = 0; - - if ( self.curprogress >= usetime ) - { - self.inuse = 0; - player clientreleasetrigger( self.trigger ); - player.claimtrigger = undefined; - - if ( isdefined( useweapon ) ) - { - player setweaponammostock( useweapon, 1 ); - player setweaponammoclip( useweapon, 1 ); - - if ( lastweapon != "none" && !( isweaponequipment( lastweapon ) && player getweaponammoclip( lastweapon ) == 0 ) ) - player switchtoweapon( lastweapon ); - else - player takeweapon( useweapon ); - } - else - player _enableweapon(); - - if ( !( isdefined( self.dontlinkplayertotrigger ) && self.dontlinkplayertotrigger ) ) - player unlink(); - - wait 0.05; - return isalive( player ); - } - - wait 0.05; - maps\mp\gametypes_zm\_hostmigration::waittillhostmigrationdone(); - } - - return 0; + level endon( "game_ended" ); + self endon( "disabled" ); + useweapon = self.useweapon; + waitforweapon = 1; + timedout = 0; + usetime = self.usetime; + while ( self continueholdthinkloop( player, waitforweapon, timedout, usetime ) ) + { + timedout += 0,05; + if ( !isDefined( useweapon ) || player getcurrentweapon() == useweapon ) + { + self.curprogress += 50 * self.userate; + self updatecurrentprogress(); + self.userate = 1; + waitforweapon = 0; + } + else + { + self.userate = 0; + } + if ( self.curprogress >= usetime ) + { + self.inuse = 0; + player clientreleasetrigger( self.trigger ); + player.claimtrigger = undefined; + if ( isDefined( useweapon ) ) + { + player setweaponammostock( useweapon, 1 ); + player setweaponammoclip( useweapon, 1 ); + if ( lastweapon != "none" && isweaponequipment( lastweapon ) && player getweaponammoclip( lastweapon ) != 0 ) + { + player switchtoweapon( lastweapon ); + } + else + { + player takeweapon( useweapon ); + } + } + else + { + player _enableweapon(); + } + if ( isDefined( self.dontlinkplayertotrigger ) && !self.dontlinkplayertotrigger ) + { + player unlink(); + } + wait 0,05; + return isalive( player ); + } + wait 0,05; + maps/mp/gametypes_zm/_hostmigration::waittillhostmigrationdone(); + } + return 0; } personalusebar( object ) { - self endon( "disconnect" ); - - if ( object.newstyle ) - return; - - if ( isdefined( self.usebar ) ) - return; - - self.usebar = self createprimaryprogressbar(); - self.usebartext = self createprimaryprogressbartext(); - self.usebartext settext( object.usetext ); - usetime = object.usetime; - lastrate = -1; - lasthostmigrationstate = isdefined( level.hostmigrationtimer ); - - while ( isalive( self ) && object.inuse && !level.gameended ) - { - if ( lastrate != object.userate || lasthostmigrationstate != isdefined( level.hostmigrationtimer ) ) - { - if ( object.curprogress > usetime ) - object.curprogress = usetime; - - if ( object.decayprogress && self.pers["team"] != object.claimteam ) - { - if ( object.curprogress > 0 ) - { - progress = object.curprogress / usetime; - rate = 1000 / usetime * ( object.userate * -1 ); - - if ( isdefined( level.hostmigrationtimer ) ) - rate = 0; - - self.proxbar updatebar( progress, rate ); - } - } - else - { - progress = object.curprogress / usetime; - rate = 1000 / usetime * object.userate; - - if ( isdefined( level.hostmigrationtimer ) ) - rate = 0; - - self.usebar updatebar( progress, rate ); - } - - if ( !object.userate ) - { - self.usebar hideelem(); - self.usebartext hideelem(); - } - else - { - self.usebar showelem(); - self.usebartext showelem(); - } - } - - lastrate = object.userate; - lasthostmigrationstate = isdefined( level.hostmigrationtimer ); - wait 0.05; - } - - self.usebar destroyelem(); - self.usebartext destroyelem(); + self endon( "disconnect" ); + if ( object.newstyle ) + { + return; + } + if ( isDefined( self.usebar ) ) + { + return; + } + self.usebar = self createprimaryprogressbar(); + self.usebartext = self createprimaryprogressbartext(); + self.usebartext settext( object.usetext ); + usetime = object.usetime; + lastrate = -1; + lasthostmigrationstate = isDefined( level.hostmigrationtimer ); + while ( isalive( self ) && object.inuse && !level.gameended ) + { + if ( lastrate != object.userate || lasthostmigrationstate != isDefined( level.hostmigrationtimer ) ) + { + if ( object.curprogress > usetime ) + { + object.curprogress = usetime; + } + if ( object.decayprogress && self.pers[ "team" ] != object.claimteam ) + { + if ( object.curprogress > 0 ) + { + progress = object.curprogress / usetime; + rate = ( 1000 / usetime ) * ( object.userate * -1 ); + if ( isDefined( level.hostmigrationtimer ) ) + { + rate = 0; + } + self.proxbar updatebar( progress, rate ); + } + } + else + { + progress = object.curprogress / usetime; + rate = ( 1000 / usetime ) * object.userate; + if ( isDefined( level.hostmigrationtimer ) ) + { + rate = 0; + } + self.usebar updatebar( progress, rate ); + } + if ( !object.userate ) + { + self.usebar hideelem(); + self.usebartext hideelem(); + } + else + { + self.usebar showelem(); + self.usebartext showelem(); + } + } + lastrate = object.userate; + lasthostmigrationstate = isDefined( level.hostmigrationtimer ); + wait 0,05; + } + self.usebar destroyelem(); + self.usebartext destroyelem(); } updatetrigger() { - if ( self.triggertype != "use" ) - return; - - if ( self.interactteam == "none" ) - self.trigger.origin -= vectorscale( ( 0, 0, 1 ), 50000.0 ); - else if ( self.interactteam == "any" || !level.teambased ) - { - self.trigger.origin = self.curorigin; - self.trigger setteamfortrigger( "none" ); - } - else if ( self.interactteam == "friendly" ) - { - self.trigger.origin = self.curorigin; - - if ( isdefined( level.teams[self.ownerteam] ) ) - self.trigger setteamfortrigger( self.ownerteam ); - else - self.trigger.origin -= vectorscale( ( 0, 0, 1 ), 50000.0 ); - } - else if ( self.interactteam == "enemy" ) - { - self.trigger.origin = self.curorigin; - self.trigger setexcludeteamfortrigger( self.ownerteam ); - } + if ( self.triggertype != "use" ) + { + return; + } + if ( self.interactteam == "none" ) + { + self.trigger.origin -= vectorScale( ( 0, 0, 1 ), 50000 ); + } + else if ( self.interactteam == "any" || !level.teambased ) + { + self.trigger.origin = self.curorigin; + self.trigger setteamfortrigger( "none" ); + } + else + { + if ( self.interactteam == "friendly" ) + { + self.trigger.origin = self.curorigin; + if ( isDefined( level.teams[ self.ownerteam ] ) ) + { + self.trigger setteamfortrigger( self.ownerteam ); + } + else + { + self.trigger.origin -= vectorScale( ( 0, 0, 1 ), 50000 ); + } + return; + } + else + { + if ( self.interactteam == "enemy" ) + { + self.trigger.origin = self.curorigin; + self.trigger setexcludeteamfortrigger( self.ownerteam ); + } + } + } } updateobjective() { - if ( !self.newstyle ) - return; - - objective_team( self.objectiveid, self.ownerteam ); - - if ( self.visibleteam == "any" ) - { - objective_state( self.objectiveid, "active" ); - objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask["all"] ); - } - else if ( self.visibleteam == "friendly" ) - { - objective_state( self.objectiveid, "active" ); - objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask[self.ownerteam] ); - } - else if ( self.visibleteam == "enemy" ) - { - objective_state( self.objectiveid, "active" ); - objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask["all"] & ~level.spawnsystem.ispawn_teammask[self.ownerteam] ); - } - else - { - objective_state( self.objectiveid, "invisible" ); - objective_visibleteams( self.objectiveid, 0 ); - } - - if ( self.type == "carryObject" ) - { - if ( isalive( self.carrier ) ) - objective_onentity( self.objectiveid, self.carrier ); - else - objective_clearentity( self.objectiveid ); - } + if ( !self.newstyle ) + { + return; + } + objective_team( self.objectiveid, self.ownerteam ); + if ( self.visibleteam == "any" ) + { + objective_state( self.objectiveid, "active" ); + objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask[ "all" ] ); + } + else if ( self.visibleteam == "friendly" ) + { + objective_state( self.objectiveid, "active" ); + objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask[ self.ownerteam ] ); + } + else if ( self.visibleteam == "enemy" ) + { + objective_state( self.objectiveid, "active" ); + objective_visibleteams( self.objectiveid, level.spawnsystem.ispawn_teammask[ "all" ] & level.spawnsystem.ispawn_teammask[ self.ownerteam ] ); + } + else + { + objective_state( self.objectiveid, "invisible" ); + objective_visibleteams( self.objectiveid, 0 ); + } + if ( self.type == "carryObject" ) + { + if ( isalive( self.carrier ) ) + { + objective_onentity( self.objectiveid, self.carrier ); + return; + } + else + { + objective_clearentity( self.objectiveid ); + } + } } updateworldicons() { - if ( self.visibleteam == "any" ) - { - updateworldicon( "friendly", 1 ); - updateworldicon( "enemy", 1 ); - } - else if ( self.visibleteam == "friendly" ) - { - updateworldicon( "friendly", 1 ); - updateworldicon( "enemy", 0 ); - } - else if ( self.visibleteam == "enemy" ) - { - updateworldicon( "friendly", 0 ); - updateworldicon( "enemy", 1 ); - } - else - { - updateworldicon( "friendly", 0 ); - updateworldicon( "enemy", 0 ); - } + if ( self.visibleteam == "any" ) + { + updateworldicon( "friendly", 1 ); + updateworldicon( "enemy", 1 ); + } + else if ( self.visibleteam == "friendly" ) + { + updateworldicon( "friendly", 1 ); + updateworldicon( "enemy", 0 ); + } + else if ( self.visibleteam == "enemy" ) + { + updateworldicon( "friendly", 0 ); + updateworldicon( "enemy", 1 ); + } + else + { + updateworldicon( "friendly", 0 ); + updateworldicon( "enemy", 0 ); + } } updateworldicon( relativeteam, showicon ) { - } updatecompassicons() { - if ( self.visibleteam == "any" ) - { - updatecompassicon( "friendly", 1 ); - updatecompassicon( "enemy", 1 ); - } - else if ( self.visibleteam == "friendly" ) - { - updatecompassicon( "friendly", 1 ); - updatecompassicon( "enemy", 0 ); - } - else if ( self.visibleteam == "enemy" ) - { - updatecompassicon( "friendly", 0 ); - updatecompassicon( "enemy", 1 ); - } - else - { - updatecompassicon( "friendly", 0 ); - updatecompassicon( "enemy", 0 ); - } + if ( self.visibleteam == "any" ) + { + updatecompassicon( "friendly", 1 ); + updatecompassicon( "enemy", 1 ); + } + else if ( self.visibleteam == "friendly" ) + { + updatecompassicon( "friendly", 1 ); + updatecompassicon( "enemy", 0 ); + } + else if ( self.visibleteam == "enemy" ) + { + updatecompassicon( "friendly", 0 ); + updatecompassicon( "enemy", 1 ); + } + else + { + updatecompassicon( "friendly", 0 ); + updatecompassicon( "enemy", 0 ); + } } updatecompassicon( relativeteam, showicon ) { - if ( self.newstyle ) - return; - - updateteams = getupdateteams( relativeteam ); - - for ( index = 0; index < updateteams.size; index++ ) - { - showiconthisteam = showicon; - - if ( !showiconthisteam && shouldshowcompassduetoradar( updateteams[index] ) ) - showiconthisteam = 1; - - if ( level.teambased ) - objid = self.objid[updateteams[index]]; - else - objid = self.objid[level.nonteambasedteam]; - - if ( !isdefined( self.compassicons[relativeteam] ) || !showiconthisteam ) - { - objective_state( objid, "invisible" ); - continue; - } - - objective_icon( objid, self.compassicons[relativeteam] ); - objective_state( objid, "active" ); - - if ( self.type == "carryObject" ) - { - if ( isalive( self.carrier ) && !shouldpingobject( relativeteam ) ) - { - objective_onentity( objid, self.carrier ); - continue; - } - - objective_position( objid, self.curorigin ); - } - } + if ( self.newstyle ) + { + return; + } + updateteams = getupdateteams( relativeteam ); + index = 0; + while ( index < updateteams.size ) + { + showiconthisteam = showicon; + if ( !showiconthisteam && shouldshowcompassduetoradar( updateteams[ index ] ) ) + { + showiconthisteam = 1; + } + if ( level.teambased ) + { + objid = self.objid[ updateteams[ index ] ]; + } + else + { + objid = self.objid[ level.nonteambasedteam ]; + } + if ( !isDefined( self.compassicons[ relativeteam ] ) || !showiconthisteam ) + { + objective_state( objid, "invisible" ); + index++; + continue; + } + else + { + objective_icon( objid, self.compassicons[ relativeteam ] ); + objective_state( objid, "active" ); + if ( self.type == "carryObject" ) + { + if ( isalive( self.carrier ) && !shouldpingobject( relativeteam ) ) + { + objective_onentity( objid, self.carrier ); + index++; + continue; + } + else + { + objective_position( objid, self.curorigin ); + } + } + } + index++; + } } shouldpingobject( relativeteam ) { - if ( relativeteam == "friendly" && self.objidpingfriendly ) - return true; - else if ( relativeteam == "enemy" && self.objidpingenemy ) - return true; - - return false; + if ( relativeteam == "friendly" && self.objidpingfriendly ) + { + return 1; + } + else + { + if ( relativeteam == "enemy" && self.objidpingenemy ) + { + return 1; + } + } + return 0; } getupdateteams( relativeteam ) { - updateteams = []; - - if ( level.teambased ) - { - if ( relativeteam == "friendly" ) - { - foreach ( team in level.teams ) - { - if ( self isfriendlyteam( team ) ) - updateteams[updateteams.size] = team; - } - } - else if ( relativeteam == "enemy" ) - { - foreach ( team in level.teams ) - { - if ( !self isfriendlyteam( team ) ) - updateteams[updateteams.size] = team; - } - } - } - else if ( relativeteam == "friendly" ) - updateteams[updateteams.size] = level.nonteambasedteam; - else - updateteams[updateteams.size] = "axis"; - - return updateteams; + updateteams = []; + if ( level.teambased ) + { + if ( relativeteam == "friendly" ) + { + _a2526 = level.teams; + _k2526 = getFirstArrayKey( _a2526 ); + while ( isDefined( _k2526 ) ) + { + team = _a2526[ _k2526 ]; + if ( self isfriendlyteam( team ) ) + { + updateteams[ updateteams.size ] = team; + } + _k2526 = getNextArrayKey( _a2526, _k2526 ); + } + } + else while ( relativeteam == "enemy" ) + { + _a2534 = level.teams; + _k2534 = getFirstArrayKey( _a2534 ); + while ( isDefined( _k2534 ) ) + { + team = _a2534[ _k2534 ]; + if ( !self isfriendlyteam( team ) ) + { + updateteams[ updateteams.size ] = team; + } + _k2534 = getNextArrayKey( _a2534, _k2534 ); + } + } + } + else if ( relativeteam == "friendly" ) + { + updateteams[ updateteams.size ] = level.nonteambasedteam; + } + else + { + updateteams[ updateteams.size ] = "axis"; + } + return updateteams; } shouldshowcompassduetoradar( team ) { - showcompass = 0; - return showcompass; + showcompass = 0; + return showcompass; } updatevisibilityaccordingtoradar() { - self endon( "death" ); - self endon( "carrier_cleared" ); - - while ( true ) - { - level waittill( "radar_status_change" ); - - self updatecompassicons(); - } + self endon( "death" ); + self endon( "carrier_cleared" ); + while ( 1 ) + { + level waittill( "radar_status_change" ); + self updatecompassicons(); + } } setownerteam( team ) { - self.ownerteam = team; - self updatetrigger(); - self updatecompassicons(); - self updateworldicons(); - self updateobjective(); + self.ownerteam = team; + self updatetrigger(); + self updatecompassicons(); + self updateworldicons(); + self updateobjective(); } getownerteam() { - return self.ownerteam; + return self.ownerteam; } setdecaytime( time ) { - self.decaytime = int( time * 1000 ); + self.decaytime = int( time * 1000 ); } setusetime( time ) { - self.usetime = int( time * 1000 ); + self.usetime = int( time * 1000 ); } setusetext( text ) { - self.usetext = text; + self.usetext = text; } setusehinttext( text ) { - self.trigger sethintstring( text ); + self.trigger sethintstring( text ); } allowcarry( relativeteam ) { - self.interactteam = relativeteam; + self.interactteam = relativeteam; } allowuse( relativeteam ) { - self.interactteam = relativeteam; - updatetrigger(); + self.interactteam = relativeteam; + updatetrigger(); } setvisibleteam( relativeteam ) { - self.visibleteam = relativeteam; - - if ( !maps\mp\gametypes_zm\_tweakables::gettweakablevalue( "hud", "showobjicons" ) ) - self.visibleteam = "none"; - - updatecompassicons(); - updateworldicons(); - updateobjective(); + self.visibleteam = relativeteam; + if ( !maps/mp/gametypes_zm/_tweakables::gettweakablevalue( "hud", "showobjicons" ) ) + { + self.visibleteam = "none"; + } + updatecompassicons(); + updateworldicons(); + updateobjective(); } setmodelvisibility( visibility ) { - if ( visibility ) - { - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[index] show(); - - if ( self.visuals[index].classname == "script_brushmodel" || self.visuals[index].classname == "script_model" ) - self.visuals[index] thread makesolid(); - } - } - else - { - for ( index = 0; index < self.visuals.size; index++ ) - { - self.visuals[index] hide(); - - if ( self.visuals[index].classname == "script_brushmodel" || self.visuals[index].classname == "script_model" ) - { - self.visuals[index] notify( "changing_solidness" ); - self.visuals[index] notsolid(); - } - } - } + if ( visibility ) + { + index = 0; + while ( index < self.visuals.size ) + { + self.visuals[ index ] show(); + if ( self.visuals[ index ].classname == "script_brushmodel" || self.visuals[ index ].classname == "script_model" ) + { + self.visuals[ index ] thread makesolid(); + } + index++; + } + } + else index = 0; + while ( index < self.visuals.size ) + { + self.visuals[ index ] hide(); + if ( self.visuals[ index ].classname == "script_brushmodel" || self.visuals[ index ].classname == "script_model" ) + { + self.visuals[ index ] notify( "changing_solidness" ); + self.visuals[ index ] notsolid(); + } + index++; + } } makesolid() { - self endon( "death" ); - self notify( "changing_solidness" ); - self endon( "changing_solidness" ); - - while ( true ) - { - for ( i = 0; i < level.players.size; i++ ) - { - if ( level.players[i] istouching( self ) ) - break; - } - - if ( i == level.players.size ) - { - self solid(); - break; - } - - wait 0.05; - } + self endon( "death" ); + self notify( "changing_solidness" ); + self endon( "changing_solidness" ); + while ( 1 ) + { + i = 0; + while ( i < level.players.size ) + { + if ( level.players[ i ] istouching( self ) ) + { + break; + } + else + { + i++; + } + } + if ( i == level.players.size ) + { + self solid(); + return; + } + else + { + wait 0,05; + } + } } setcarriervisible( relativeteam ) { - self.carriervisible = relativeteam; + self.carriervisible = relativeteam; } setcanuse( relativeteam ) { - self.useteam = relativeteam; + self.useteam = relativeteam; } set2dicon( relativeteam, shader ) { - self.compassicons[relativeteam] = shader; - updatecompassicons(); + self.compassicons[ relativeteam ] = shader; + updatecompassicons(); } set3dicon( relativeteam, shader ) { - self.worldicons[relativeteam] = shader; - updateworldicons(); + self.worldicons[ relativeteam ] = shader; + updateworldicons(); } set3duseicon( relativeteam, shader ) { - self.worlduseicons[relativeteam] = shader; + self.worlduseicons[ relativeteam ] = shader; } set3diswaypoint( relativeteam, waypoint ) { - self.worldiswaypoint[relativeteam] = waypoint; + self.worldiswaypoint[ relativeteam ] = waypoint; } setcarryicon( shader ) { - self.carryicon = shader; + self.carryicon = shader; } setvisiblecarriermodel( visiblemodel ) { - self.visiblecarriermodel = visiblemodel; + self.visiblecarriermodel = visiblemodel; } getvisiblecarriermodel() { - return self.visiblecarriermodel; + return self.visiblecarriermodel; } destroyobject( deletetrigger, forcehide ) { - if ( !isdefined( forcehide ) ) - forcehide = 1; - - self disableobject( forcehide ); - - foreach ( visual in self.visuals ) - { - visual hide(); - visual delete(); - } - - self.trigger notify( "destroyed" ); - - if ( isdefined( deletetrigger ) && deletetrigger ) - self.trigger delete(); - else - self.trigger triggeron(); + if ( !isDefined( forcehide ) ) + { + forcehide = 1; + } + self disableobject( forcehide ); + _a2742 = self.visuals; + _k2742 = getFirstArrayKey( _a2742 ); + while ( isDefined( _k2742 ) ) + { + visual = _a2742[ _k2742 ]; + visual hide(); + visual delete(); + _k2742 = getNextArrayKey( _a2742, _k2742 ); + } + self.trigger notify( "destroyed" ); + if ( isDefined( deletetrigger ) && deletetrigger ) + { + self.trigger delete(); + } + else + { + self.trigger triggeron(); + } } disableobject( forcehide ) { - self notify( "disabled" ); - - if ( self.type == "carryObject" || isdefined( forcehide ) && forcehide ) - { - if ( isdefined( self.carrier ) ) - self.carrier takeobject( self ); - - for ( index = 0; index < self.visuals.size; index++ ) - self.visuals[index] hide(); - } - - self.trigger triggeroff(); - self setvisibleteam( "none" ); + self notify( "disabled" ); + while ( self.type == "carryObject" || isDefined( forcehide ) && forcehide ) + { + if ( isDefined( self.carrier ) ) + { + self.carrier takeobject( self ); + } + index = 0; + while ( index < self.visuals.size ) + { + self.visuals[ index ] hide(); + index++; + } + } + self.trigger triggeroff(); + self setvisibleteam( "none" ); } enableobject( forceshow ) { - if ( self.type == "carryObject" || isdefined( forceshow ) && forceshow ) - { - for ( index = 0; index < self.visuals.size; index++ ) - self.visuals[index] show(); - } - - self.trigger triggeron(); - self setvisibleteam( "any" ); + while ( self.type == "carryObject" || isDefined( forceshow ) && forceshow ) + { + index = 0; + while ( index < self.visuals.size ) + { + self.visuals[ index ] show(); + index++; + } + } + self.trigger triggeron(); + self setvisibleteam( "any" ); } getrelativeteam( team ) { - if ( self.ownerteam == "any" ) - return "friendly"; - - if ( team == self.ownerteam ) - return "friendly"; - else if ( team == getenemyteam( self.ownerteam ) ) - return "enemy"; - else - return "neutral"; + if ( self.ownerteam == "any" ) + { + return "friendly"; + } + if ( team == self.ownerteam ) + { + return "friendly"; + } + else + { + if ( team == getenemyteam( self.ownerteam ) ) + { + return "enemy"; + } + else + { + return "neutral"; + } + } } isfriendlyteam( team ) { - if ( !level.teambased ) - return true; - - if ( self.ownerteam == "any" ) - return true; - - if ( self.ownerteam == team ) - return true; - - return false; + if ( !level.teambased ) + { + return 1; + } + if ( self.ownerteam == "any" ) + { + return 1; + } + if ( self.ownerteam == team ) + { + return 1; + } + return 0; } caninteractwith( player ) { - team = player.pers["team"]; - - switch ( self.interactteam ) - { - case "none": - return false; - case "any": - return true; - case "friendly": - if ( level.teambased ) - { - if ( team == self.ownerteam ) - return true; - else - return false; - } - else if ( player == self.ownerteam ) - return true; - else - return false; - case "enemy": - if ( level.teambased ) - { - if ( team != self.ownerteam ) - return true; - else if ( isdefined( self.decayprogress ) && self.decayprogress && self.curprogress > 0 ) - return true; - else - return false; - } - else if ( player != self.ownerteam ) - return true; - else - return false; - default: + team = player.pers[ "team" ]; + switch( self.interactteam ) + { + case "none": + return 0; + case "any": + return 1; + case "friendly": + if ( level.teambased ) + { + if ( team == self.ownerteam ) + { + return 1; + } + else + { + return 0; + } + } + else + { + if ( player == self.ownerteam ) + { + return 1; + } + else + { + return 0; + } + } + case "enemy": + if ( level.teambased ) + { + if ( team != self.ownerteam ) + { + return 1; + } + else + { + if ( isDefined( self.decayprogress ) && self.decayprogress && self.curprogress > 0 ) + { + return 1; + } + else + { + return 0; + } + } + } + else + { + if ( player != self.ownerteam ) + { + return 1; + } + else + { + return 0; + } + } + default: /# - assert( 0, "invalid interactTeam" ); + assert( 0, "invalid interactTeam" ); #/ - return false; - } + return 0; + } } isteam( team ) { - if ( team == "neutral" ) - return true; - - if ( isdefined( level.teams[team] ) ) - return true; - - if ( team == "any" ) - return true; - - if ( team == "none" ) - return true; - - return false; + if ( team == "neutral" ) + { + return 1; + } + if ( isDefined( level.teams[ team ] ) ) + { + return 1; + } + if ( team == "any" ) + { + return 1; + } + if ( team == "none" ) + { + return 1; + } + return 0; } isrelativeteam( relativeteam ) { - if ( relativeteam == "friendly" ) - return true; - - if ( relativeteam == "enemy" ) - return true; - - if ( relativeteam == "any" ) - return true; - - if ( relativeteam == "none" ) - return true; - - return false; + if ( relativeteam == "friendly" ) + { + return 1; + } + if ( relativeteam == "enemy" ) + { + return 1; + } + if ( relativeteam == "any" ) + { + return 1; + } + if ( relativeteam == "none" ) + { + return 1; + } + return 0; } getenemyteam( team ) { - if ( team == "neutral" ) - return "none"; - else if ( team == "allies" ) - return "axis"; - else - return "allies"; + if ( team == "neutral" ) + { + return "none"; + } + else + { + if ( team == "allies" ) + { + return "axis"; + } + else + { + return "allies"; + } + } } getnextobjid() { - nextid = 0; - - if ( level.releasedobjectives.size > 0 ) - { - nextid = level.releasedobjectives[level.releasedobjectives.size - 1]; - level.releasedobjectives[level.releasedobjectives.size - 1] = undefined; - } - else - { - nextid = level.numgametypereservedobjectives; - level.numgametypereservedobjectives++; - } + nextid = 0; + if ( level.releasedobjectives.size > 0 ) + { + nextid = level.releasedobjectives[ level.releasedobjectives.size - 1 ]; + } + else + { + nextid = level.numgametypereservedobjectives; + level.numgametypereservedobjectives++; + } /# - assert( nextid < 32, "Ran out of objective IDs" ); + assert( nextid < 32, "Ran out of objective IDs" ); #/ - return nextid; + return nextid; } releaseobjid( objid ) { /# - assert( objid < level.numgametypereservedobjectives ); + assert( objid < level.numgametypereservedobjectives ); #/ - for ( i = 0; i < level.releasedobjectives.size; i++ ) - { - if ( objid == level.releasedobjectives[i] && objid == 31 ) - return; + i = 0; + while ( i < level.releasedobjectives.size ) + { + if ( objid == level.releasedobjectives[ i ] && objid == 31 ) + { + return; + } /# - assert( objid != level.releasedobjectives[i] ); + assert( objid != level.releasedobjectives[ i ] ); #/ - } - - level.releasedobjectives[level.releasedobjectives.size] = objid; + i++; + } + level.releasedobjectives[ level.releasedobjectives.size ] = objid; } getlabel() { - label = self.trigger.script_label; - - if ( !isdefined( label ) ) - { - label = ""; - return label; - } - - if ( label[0] != "_" ) - return "_" + label; - - return label; + label = self.trigger.script_label; + if ( !isDefined( label ) ) + { + label = ""; + return label; + } + if ( label[ 0 ] != "_" ) + { + return "_" + label; + } + return label; } mustmaintainclaim( enabled ) { - self.mustmaintainclaim = enabled; + self.mustmaintainclaim = enabled; } cancontestclaim( enabled ) { - self.cancontestclaim = enabled; + self.cancontestclaim = enabled; } setflags( flags ) { - objective_setgamemodeflags( self.objectiveid, flags ); + objective_setgamemodeflags( self.objectiveid, flags ); } getflags( flags ) { - return objective_getgamemodeflags( self.objectiveid ); + return objective_getgamemodeflags( self.objectiveid ); } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globalentities.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globalentities.gsc index df94d58..e69de29 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globalentities.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globalentities.gsc @@ -1,3 +0,0 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool - diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic.gsc index 89111dd..9af0f50 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic.gsc @@ -1,2329 +1,2741 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\_busing; -#include common_scripts\utility; -#include maps\mp\gametypes_zm\_tweakables; -#include maps\mp\gametypes_zm\_globallogic_ui; -#include maps\mp\gametypes_zm\_globallogic_audio; -#include maps\mp\gametypes_zm\_globallogic_spawn; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\gametypes_zm\_globallogic_defaults; -#include maps\mp\gametypes_zm\_hud_message; -#include maps\mp\gametypes_zm\_globallogic_utils; -#include maps\mp\_demo; -#include maps\mp\gametypes_zm\_globallogic_player; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\_music; -#include maps\mp\_challenges; -#include maps\mp\gametypes_zm\_hud; -#include maps\mp\gametypes_zm\_serversettings; -#include maps\mp\gametypes_zm\_clientids; -#include maps\mp\gametypes_zm\_weaponobjects; -#include maps\mp\gametypes_zm\_scoreboard; -#include maps\mp\gametypes_zm\_shellshock; -#include maps\mp\gametypes_zm\_spectating; -#include maps\mp\gametypes_zm\_gameobjects; -#include maps\mp\gametypes_zm\_spawnlogic; -#include maps\mp\gametypes_zm\_dev; -#include maps\mp\gametypes_zm\_hostmigration; -#include maps\mp\gametypes_zm\_globallogic; +#include maps/mp/gametypes_zm/_globallogic; +#include maps/mp/gametypes_zm/_hostmigration; +#include maps/mp/gametypes_zm/_dev; +#include maps/mp/gametypes_zm/_friendicons; +#include maps/mp/gametypes_zm/_healthoverlay; +#include maps/mp/gametypes_zm/_damagefeedback; +#include maps/mp/teams/_teams; +#include maps/mp/_decoy; +#include maps/mp/gametypes_zm/_spawnlogic; +#include maps/mp/gametypes_zm/_gameobjects; +#include maps/mp/gametypes_zm/_objpoints; +#include maps/mp/gametypes_zm/_spectating; +#include maps/mp/gametypes_zm/_deathicons; +#include maps/mp/gametypes_zm/_shellshock; +#include maps/mp/gametypes_zm/_scoreboard; +#include maps/mp/gametypes_zm/_weaponobjects; +#include maps/mp/gametypes_zm/_clientids; +#include maps/mp/gametypes_zm/_serversettings; +#include maps/mp/_challenges; +#include maps/mp/_music; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/gametypes_zm/_globallogic_player; +#include maps/mp/_demo; +#include maps/mp/killstreaks/_killstreaks; +#include maps/mp/gametypes_zm/_wager; +#include maps/mp/gametypes_zm/_persistence; +#include maps/mp/gametypes_zm/_hud; +#include maps/mp/gametypes_zm/_globallogic_utils; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/gametypes_zm/_globallogic_defaults; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/gametypes_zm/_globallogic_spawn; +#include maps/mp/_gamerep; +#include maps/mp/_gameadvertisement; +#include maps/mp/gametypes_zm/_globallogic_audio; +#include maps/mp/gametypes_zm/_class; +#include maps/mp/gametypes_zm/_globallogic_ui; +#include maps/mp/gametypes_zm/_tweakables; +#include common_scripts/utility; +#include maps/mp/_busing; +#include maps/mp/_burnplayer; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/_utility; -init() +init() //checked matches bo3 _globallogic.gsc within reason { - if ( !isdefined( level.tweakablesinitialized ) ) - maps\mp\gametypes_zm\_tweakables::init(); - init_session_mode_flags(); - level.splitscreen = issplitscreen(); - level.xenon = getdvar( "xenonGame" ) == "true"; - level.ps3 = getdvar( "ps3Game" ) == "true"; - level.wiiu = getdvar( "wiiuGame" ) == "true"; - level.onlinegame = sessionmodeisonlinegame(); - level.systemlink = sessionmodeissystemlink(); - level.console = level.xenon || level.ps3 || level.wiiu; - level.rankedmatch = gamemodeisusingxp() && !ispregame(); - level.leaguematch = gamemodeismode( level.gamemode_league_match ); - level.wagermatch = 0; - level.contractsenabled = !getgametypesetting( "disableContracts" ); - level.contractsenabled = 0; + // hack to allow maps with no scripts to run correctly + if ( !isDefined( level.tweakablesInitialized ) ) + maps\mp\gametypes_zm\_tweakables::init(); + + init_session_mode_flags(); + + level.splitscreen = isSplitScreen(); + level.xenon = 0; + level.ps3 = 0; + level.wiiu = 0; + + level.onlineGame = SessionModeIsOnlineGame(); + level.console = 1; + + level.rankedMatch = 0; + level.leagueMatch = 0; + + level.wagerMatch = false; + + level.contractsEnabled = !GetGametypeSetting( "disableContracts" ); + + level.contractsEnabled = false; + + /* /# - if ( getdvarint( "scr_forcerankedmatch" ) == 1 ) - level.rankedmatch = 1; + if ( GetDvarint( "scr_forcerankedmatch" ) == 1 ) + level.rankedMatch = true; #/ - level.script = tolower( getdvar( "mapname" ) ); - level.gametype = tolower( getdvar( "g_gametype" ) ); - level.teambased = 0; - level.teamcount = getgametypesetting( "teamCount" ); - level.multiteam = level.teamcount > 2; + */ + + level.script = toLower( GetDvar( "mapname" ) ); + level.gametype = toLower( GetDvar( "g_gametype" ) ); - if ( sessionmodeiszombiesgame() ) - { - level.zombie_team_index = level.teamcount + 1; + level.teamBased = false; + level.teamCount = GetGametypeSetting( "teamCount" ); + level.multiTeam = ( level.teamCount > 2 ); + + if ( SessionModeIsZombiesGame() ) + { + level.zombie_team_index = level.teamCount + 1; + if ( 2 == level.zombie_team_index ) + { + level.zombie_team = "axis"; + } + else + { + level.zombie_team = "team" + level.zombie_team_index; + } + } - if ( 2 == level.zombie_team_index ) - level.zombie_team = "axis"; - else - level.zombie_team = "team" + level.zombie_team_index; - } + // used to loop through all valid playing teams ( not spectator ) + // can also be used to check if a team is valid ( isdefined( level.teams[team] ) ) + // NOTE: added in the same order they are defined in code + level.teams = []; + level.teamIndex = []; + + teamCount = level.teamCount; + + level.teams[ "allies" ] = "allies"; + level.teams[ "axis" ] = "axis"; - level.teams = []; - level.teamindex = []; - teamcount = level.teamcount; - level.teams["allies"] = "allies"; - level.teams["axis"] = "axis"; - level.teamindex["neutral"] = 0; - level.teamindex["allies"] = 1; - level.teamindex["axis"] = 2; + level.teamIndex[ "neutral" ] = 0; // Neutral team set to 0 so that it can be used by objectives + level.teamIndex[ "allies" ] = 1; + level.teamIndex[ "axis" ] = 2; + + for( teamIndex = 3; teamIndex <= teamCount; teamIndex++ ) + { + level.teams[ "team" + teamIndex ] = "team" + teamIndex; + level.teamIndex[ "team" + teamIndex ] = teamIndex; + } + + level.overrideTeamScore = false; + level.overridePlayerScore = false; + level.displayHalftimeText = false; + level.displayRoundEndText = true; + + level.endGameOnScoreLimit = true; + level.endGameOnTimeLimit = true; + level.scoreRoundBased = false; + level.resetPlayerScoreEveryRound = false; + + level.gameForfeited = false; + level.forceAutoAssign = false; + + level.halftimeType = "halftime"; + level.halftimeSubCaption = &"MP_SWITCHING_SIDES_CAPS"; + + level.lastStatusTime = 0; + level.wasWinning = []; + + level.lastSlowProcessFrame = 0; + + level.placement = []; + foreach ( team in level.teams ) + { + level.placement[team] = []; + } + level.placement["all"] = []; + + level.postRoundTime = 7.0;//Kevin Sherwood changed to 9 to have enough time for music stingers + + level.inOvertime = false; + + level.defaultOffenseRadius = 560; - for ( teamindex = 3; teamindex <= teamcount; teamindex++ ) - { - level.teams["team" + teamindex] = "team" + teamindex; - level.teamindex["team" + teamindex] = teamindex; - } + level.dropTeam = GetDvarint( "sv_maxclients" ); + + level.inFinalKillcam = false; - level.overrideteamscore = 0; - level.overrideplayerscore = 0; - level.displayhalftimetext = 0; - level.displayroundendtext = 1; - level.endgameonscorelimit = 1; - level.endgameontimelimit = 1; - level.scoreroundbased = 0; - level.resetplayerscoreeveryround = 0; - level.gameforfeited = 0; - level.forceautoassign = 0; - level.halftimetype = "halftime"; - level.halftimesubcaption = &"MP_SWITCHING_SIDES_CAPS"; - level.laststatustime = 0; - level.waswinning = []; - level.lastslowprocessframe = 0; - level.placement = []; + maps\mp\gametypes_zm\_globallogic_ui::init(); - foreach ( team in level.teams ) - level.placement[team] = []; + registerDvars(); +// maps\mp\gametypes_zm\_class::initPerkDvars(); - level.placement["all"] = []; - level.postroundtime = 7.0; - level.inovertime = 0; - level.defaultoffenseradius = 560; - level.dropteam = getdvarint( "sv_maxclients" ); - level.infinalkillcam = 0; - maps\mp\gametypes_zm\_globallogic_ui::init(); - registerdvars(); - level.oldschool = getdvarint( "scr_oldschool" ) == 1; + level.oldschool = ( GetDvarint( "scr_oldschool" ) == 1 ); + if ( level.oldschool ) + { + SetDvar( "jump_height", 64 ); + SetDvar( "jump_slowdownEnable", 0 ); + SetDvar( "bg_fallDamageMinHeight", 256 ); + SetDvar( "bg_fallDamageMaxHeight", 512 ); + SetDvar( "player_clipSizeMultiplier", 2.0 ); + } - if ( level.oldschool ) - { - logstring( "game mode: oldschool" ); - setdvar( "jump_height", 64 ); - setdvar( "jump_slowdownEnable", 0 ); - setdvar( "bg_fallDamageMinHeight", 256 ); - setdvar( "bg_fallDamageMaxHeight", 512 ); - setdvar( "player_clipSizeMultiplier", 2.0 ); - } + precacheModel( "tag_origin" ); + precacheRumble( "dtp_rumble" ); + precacheRumble( "slide_rumble" ); + + precacheStatusIcon( "hud_status_dead" ); + precacheStatusIcon( "hud_status_connecting" ); + + precache_mp_leaderboards(); + + // sets up the flame fx + //maps\mp\_burnplayer::initBurnPlayer(); + + if ( !isDefined( game["tiebreaker"] ) ) + game["tiebreaker"] = false; + + maps\mp\gametypes_zm\_globallogic_audio::registerDialogGroup( "introboost", true ); + maps\mp\gametypes_zm\_globallogic_audio::registerDialogGroup( "status", true ); - precachemodel( "tag_origin" ); - precacherumble( "dtp_rumble" ); - precacherumble( "slide_rumble" ); - precachestatusicon( "hud_status_dead" ); - precachestatusicon( "hud_status_connecting" ); - precache_mp_leaderboards(); - - if ( !isdefined( game["tiebreaker"] ) ) - game["tiebreaker"] = 0; - - maps\mp\gametypes_zm\_globallogic_audio::registerdialoggroup( "item_destroyed", 1 ); - maps\mp\gametypes_zm\_globallogic_audio::registerdialoggroup( "introboost", 1 ); - maps\mp\gametypes_zm\_globallogic_audio::registerdialoggroup( "status", 1 ); + //thread maps\mp\_gameadvertisement::init(); + //thread maps\mp\_gamerep::init(); } -registerdvars() +registerDvars() //checked matches bo3 _globallogic.gsc within reason { - if ( getdvar( "scr_oldschool" ) == "" ) - setdvar( "scr_oldschool", "0" ); + if ( GetDvar( "scr_oldschool" ) == "" ) + SetDvar( "scr_oldschool", "0" ); + + makeDvarServerInfo( "scr_oldschool" ); - makedvarserverinfo( "scr_oldschool" ); + if ( GetDvar( "ui_guncycle" ) == "" ) + SetDvar( "ui_guncycle", 0 ); + + makedvarserverinfo( "ui_guncycle" ); - if ( getdvar( "ui_guncycle" ) == "" ) - setdvar( "ui_guncycle", 0 ); + if ( GetDvar( "ui_weapon_tiers" ) == "" ) + SetDvar( "ui_weapon_tiers", 0 ); + makedvarserverinfo( "ui_weapon_tiers" ); - makedvarserverinfo( "ui_guncycle" ); + SetDvar( "ui_text_endreason", ""); + makeDvarServerInfo( "ui_text_endreason", "" ); - if ( getdvar( "ui_weapon_tiers" ) == "" ) - setdvar( "ui_weapon_tiers", 0 ); + setMatchFlag( "bomb_timer", 0 ); + + setMatchFlag( "enable_popups", 1 ); + + setMatchFlag( "pregame", isPregame() ); - makedvarserverinfo( "ui_weapon_tiers" ); - setdvar( "ui_text_endreason", "" ); - makedvarserverinfo( "ui_text_endreason", "" ); - setmatchflag( "bomb_timer", 0 ); - setmatchflag( "enable_popups", 1 ); - setmatchflag( "pregame", ispregame() ); + if ( GetDvar( "scr_vehicle_damage_scalar" ) == "" ) + SetDvar( "scr_vehicle_damage_scalar", "1" ); + + level.vehicleDamageScalar = GetDvarfloat( "scr_vehicle_damage_scalar"); - if ( getdvar( "scr_vehicle_damage_scalar" ) == "" ) - setdvar( "scr_vehicle_damage_scalar", "1" ); - - level.vehicledamagescalar = getdvarfloat( "scr_vehicle_damage_scalar" ); - level.fire_audio_repeat_duration = getdvarint( _hash_917E4521 ); - level.fire_audio_random_max_duration = getdvarint( _hash_C2DCBC26 ); + level.fire_audio_repeat_duration = GetDvarint( "fire_audio_repeat_duration" ); + level.fire_audio_random_max_duration = GetDvarint( "fire_audio_random_max_duration" ); } -blank( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 ) +blank( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 ) //checked matches bo3 _globallogic.gsc within reason { - } -setupcallbacks() +SetupCallbacks() //checked matches bo3 _globallogic.gsc within reason { - level.spawnplayer = maps\mp\gametypes_zm\_globallogic_spawn::spawnplayer; - level.spawnplayerprediction = maps\mp\gametypes_zm\_globallogic_spawn::spawnplayerprediction; - level.spawnclient = maps\mp\gametypes_zm\_globallogic_spawn::spawnclient; - level.spawnspectator = maps\mp\gametypes_zm\_globallogic_spawn::spawnspectator; - level.spawnintermission = maps\mp\gametypes_zm\_globallogic_spawn::spawnintermission; - level.onplayerscore = maps\mp\gametypes_zm\_globallogic_score::default_onplayerscore; - level.onteamscore = maps\mp\gametypes_zm\_globallogic_score::default_onteamscore; - level.wavespawntimer = ::wavespawntimer; - level.spawnmessage = maps\mp\gametypes_zm\_globallogic_spawn::default_spawnmessage; - level.onspawnplayer = ::blank; - level.onspawnplayerunified = ::blank; - level.onspawnspectator = maps\mp\gametypes_zm\_globallogic_defaults::default_onspawnspectator; - level.onspawnintermission = maps\mp\gametypes_zm\_globallogic_defaults::default_onspawnintermission; - level.onrespawndelay = ::blank; - level.onforfeit = maps\mp\gametypes_zm\_globallogic_defaults::default_onforfeit; - level.ontimelimit = maps\mp\gametypes_zm\_globallogic_defaults::default_ontimelimit; - level.onscorelimit = maps\mp\gametypes_zm\_globallogic_defaults::default_onscorelimit; - level.onalivecountchange = maps\mp\gametypes_zm\_globallogic_defaults::default_onalivecountchange; - level.ondeadevent = maps\mp\gametypes_zm\_globallogic_defaults::default_ondeadevent; - level.ononeleftevent = maps\mp\gametypes_zm\_globallogic_defaults::default_ononeleftevent; - level.giveteamscore = maps\mp\gametypes_zm\_globallogic_score::giveteamscore; - level.onlastteamaliveevent = undefined; - level.gettimelimit = maps\mp\gametypes_zm\_globallogic_defaults::default_gettimelimit; - level.getteamkillpenalty = ::blank; - level.getteamkillscore = ::blank; - level.iskillboosting = maps\mp\gametypes_zm\_globallogic_score::default_iskillboosting; - level._setteamscore = maps\mp\gametypes_zm\_globallogic_score::_setteamscore; - level._setplayerscore = maps\mp\gametypes_zm\_globallogic_score::_setplayerscore; - level._getteamscore = maps\mp\gametypes_zm\_globallogic_score::_getteamscore; - level._getplayerscore = maps\mp\gametypes_zm\_globallogic_score::_getplayerscore; - level.onprecachegametype = ::blank; - level.onstartgametype = ::blank; - level.onplayerconnect = ::blank; - level.onplayerdisconnect = ::blank; - level.onplayerdamage = ::blank; - level.onplayerkilled = ::blank; - level.onplayerkilledextraunthreadedcbs = []; - level.onteamoutcomenotify = maps\mp\gametypes_zm\_hud_message::teamoutcomenotify; - level.onoutcomenotify = maps\mp\gametypes_zm\_hud_message::outcomenotify; - level.onteamwageroutcomenotify = maps\mp\gametypes_zm\_hud_message::teamwageroutcomenotify; - level.onwageroutcomenotify = maps\mp\gametypes_zm\_hud_message::wageroutcomenotify; - level.setmatchscorehudelemforteam = maps\mp\gametypes_zm\_hud_message::setmatchscorehudelemforteam; - level.onendgame = ::blank; - level.onroundendgame = maps\mp\gametypes_zm\_globallogic_defaults::default_onroundendgame; - level.onmedalawarded = ::blank; - maps\mp\gametypes_zm\_globallogic_ui::setupcallbacks(); + level.spawnPlayer = maps\mp\gametypes_zm\_globallogic_spawn::spawnPlayer; + level.spawnPlayerPrediction = maps\mp\gametypes_zm\_globallogic_spawn::spawnPlayerPrediction; + level.spawnClient = maps\mp\gametypes_zm\_globallogic_spawn::spawnClient; + level.spawnSpectator = maps\mp\gametypes_zm\_globallogic_spawn::spawnSpectator; + level.spawnIntermission = maps\mp\gametypes_zm\_globallogic_spawn::spawnIntermission; + level.onPlayerScore = maps\mp\gametypes_zm\_globallogic_score::default_onPlayerScore; + level.onTeamScore = maps\mp\gametypes_zm\_globallogic_score::default_onTeamScore; + + level.waveSpawnTimer = ::waveSpawnTimer; + level.spawnMessage = maps\mp\gametypes_zm\_globallogic_spawn::default_spawnMessage; + + level.onSpawnPlayer = ::blank; + level.onSpawnPlayerUnified = ::blank; + level.onSpawnSpectator = maps\mp\gametypes_zm\_globallogic_defaults::default_onSpawnSpectator; + level.onSpawnIntermission = maps\mp\gametypes_zm\_globallogic_defaults::default_onSpawnIntermission; + level.onRespawnDelay = ::blank; + + level.onForfeit = maps\mp\gametypes_zm\_globallogic_defaults::default_onForfeit; + level.onTimeLimit = maps\mp\gametypes_zm\_globallogic_defaults::default_onTimeLimit; + level.onScoreLimit = maps\mp\gametypes_zm\_globallogic_defaults::default_onScoreLimit; + level.onAliveCountChange = maps\mp\gametypes_zm\_globallogic_defaults::default_onAliveCountChange; + level.onDeadEvent = maps\mp\gametypes_zm\_globallogic_defaults::default_onDeadEvent; + level.onOneLeftEvent = maps\mp\gametypes_zm\_globallogic_defaults::default_onOneLeftEvent; + level.giveTeamScore = maps\mp\gametypes_zm\_globallogic_score::giveTeamScore; + level.onLastTeamAliveEvent = undefined; + + level.getTimeLimit = maps\mp\gametypes_zm\_globallogic_defaults::default_getTimeLimit; + level.getTeamKillPenalty =::blank; // maps\mp\gametypes_zm\_globallogic_defaults::default_getTeamKillPenalty; + level.getTeamKillScore = ::blank; // maps\mp\gametypes_zm\_globallogic_defaults::default_getTeamKillScore; + + level.isKillBoosting = maps\mp\gametypes_zm\_globallogic_score::default_isKillBoosting; + + level._setTeamScore = maps\mp\gametypes_zm\_globallogic_score::_setTeamScore; + level._setPlayerScore = maps\mp\gametypes_zm\_globallogic_score::_setPlayerScore; + + level._getTeamScore = maps\mp\gametypes_zm\_globallogic_score::_getTeamScore; + level._getPlayerScore = maps\mp\gametypes_zm\_globallogic_score::_getPlayerScore; + + level.onPrecacheGametype = ::blank; + level.onStartGameType = ::blank; + level.onPlayerConnect = ::blank; + level.onPlayerDisconnect = ::blank; + level.onPlayerDamage = ::blank; + level.onPlayerKilled = ::blank; + level.onPlayerKilledExtraUnthreadedCBs = []; //< Array of other CB function pointers + + level.onTeamOutcomeNotify = maps\mp\gametypes_zm\_hud_message::teamOutcomeNotify; + level.onOutcomeNotify = maps\mp\gametypes_zm\_hud_message::outcomeNotify; + level.onTeamWagerOutcomeNotify = maps\mp\gametypes_zm\_hud_message::teamWagerOutcomeNotify; + level.onWagerOutcomeNotify = maps\mp\gametypes_zm\_hud_message::wagerOutcomeNotify; + level.setMatchScoreHUDElemForTeam = maps\mp\gametypes_zm\_hud_message::setMatchScoreHUDElemForTeam; + level.onEndGame = ::blank; + level.onRoundEndGame = maps\mp\gametypes_zm\_globallogic_defaults::default_onRoundEndGame; + level.onMedalAwarded = ::blank; + + maps\mp\gametypes_zm\_globallogic_ui::SetupCallbacks(); } -precache_mp_leaderboards() +precache_mp_leaderboards() //checked matches bo3 _globallogic.gsc within reason { - if ( sessionmodeiszombiesgame() ) - return; + if( SessionModeIsZombiesGame() ) + return; - if ( !level.rankedmatch ) - return; + if( !level.rankedMatch ) + return; + + mapname = GetDvar( "mapname" ); - mapname = getdvar( "mapname" ); - globalleaderboards = "LB_MP_GB_XPPRESTIGE LB_MP_GB_TOTALXP_AT LB_MP_GB_TOTALXP_LT LB_MP_GB_WINS_AT LB_MP_GB_WINS_LT LB_MP_GB_KILLS_AT LB_MP_GB_KILLS_LT LB_MP_GB_ACCURACY_AT LB_MP_GB_ACCURACY_LT"; - gamemodeleaderboard = " LB_MP_GM_" + level.gametype; + globalLeaderboards = "LB_MP_GB_XPPRESTIGE LB_MP_GB_TOTALXP_AT LB_MP_GB_TOTALXP_LT LB_MP_GB_WINS_AT LB_MP_GB_WINS_LT LB_MP_GB_KILLS_AT LB_MP_GB_KILLS_LT LB_MP_GB_ACCURACY_AT LB_MP_GB_ACCURACY_LT"; - if ( getdvarint( _hash_46E18E53 ) ) - gamemodeleaderboard += "_HC"; - - mapleaderboard = " LB_MP_MAP_" + getsubstr( mapname, 3, mapname.size ); - precacheleaderboards( globalleaderboards + gamemodeleaderboard + mapleaderboard ); + gamemodeLeaderboard = " LB_MP_GM_" + level.gametype; + + if( getDvarInt( "g_hardcore" ) ) + gamemodeLeaderboard += "_HC"; + + mapLeaderboard = " LB_MP_MAP_" + getsubstr( mapname, 3, mapname.size ); // strip the MP_ from the map name + + precacheLeaderboards( globalLeaderboards + gamemodeLeaderboard + mapLeaderboard ); } -compareteambygamestat( gamestat, teama, teamb, previous_winner_score ) +compareTeamByGameStat( gameStat, teamA, teamB, previous_winner_score ) //checked matches bo3 _globallogic.gsc within reason { - winner = undefined; - - if ( teama == "tie" ) - { - winner = "tie"; - - if ( previous_winner_score < game[gamestat][teamb] ) - winner = teamb; - } - else if ( game[gamestat][teama] == game[gamestat][teamb] ) - winner = "tie"; - else if ( game[gamestat][teamb] > game[gamestat][teama] ) - winner = teamb; - else - winner = teama; - - return winner; + winner = undefined; + + if ( teamA == "tie" ) + { + winner = "tie"; + + if ( previous_winner_score < game[gameStat][teamB] ) + winner = teamB; + } + else if ( game[gameStat][teamA] == game[gameStat][teamB] ) + winner = "tie"; + else if ( game[gameStat][teamB] > game[gameStat][teamA] ) + winner = teamB; + else + winner = teamA; + + return winner; } -determineteamwinnerbygamestat( gamestat ) +determineTeamWinnerByGameStat( gameStat ) //checked matches bo3 _globallogic.gsc within reason { - teamkeys = getarraykeys( level.teams ); - winner = teamkeys[0]; - previous_winner_score = game[gamestat][winner]; - - for ( teamindex = 1; teamindex < teamkeys.size; teamindex++ ) - { - winner = compareteambygamestat( gamestat, winner, teamkeys[teamindex], previous_winner_score ); - - if ( winner != "tie" ) - previous_winner_score = game[gamestat][winner]; - } - - return winner; + teamKeys = GetArrayKeys(level.teams); + winner = teamKeys[0]; + previous_winner_score = game[gameStat][winner]; + + for ( teamIndex = 1; teamIndex < teamKeys.size; teamIndex++ ) + { + winner = compareTeamByGameStat( gameStat, winner, teamKeys[teamIndex], previous_winner_score); + + if ( winner != "tie" ) + { + previous_winner_score = game[gameStat][winner]; + } + } + + return winner; } -compareteambyteamscore( teama, teamb, previous_winner_score ) +compareTeamByTeamScore( teamA, teamB, previous_winner_score ) //checked matches bo3 _globallogic.gsc within reason { - winner = undefined; - teambscore = [[ level._getteamscore ]]( teamb ); + winner = undefined; + teamBScore = [[level._getTeamScore]]( teamB ); - if ( teama == "tie" ) - { - winner = "tie"; + if ( teamA == "tie" ) + { + winner = "tie"; + + if ( previous_winner_score < teamBScore ) + winner = teamB; + + return winner; + } + + teamAScore = [[level._getTeamScore]]( teamA ); - if ( previous_winner_score < teambscore ) - winner = teamb; - - return winner; - } - - teamascore = [[ level._getteamscore ]]( teama ); - - if ( teambscore == teamascore ) - winner = "tie"; - else if ( teambscore > teamascore ) - winner = teamb; - else - winner = teama; - - return winner; + if ( teamBScore == teamAScore ) + winner = "tie"; + else if ( teamBScore > teamAScore ) + winner = teamB; + else + winner = teamA; + + return winner; } -determineteamwinnerbyteamscore() +determineTeamWinnerByTeamScore( ) //checked matches bo3 _globallogic.gsc within reason { - teamkeys = getarraykeys( level.teams ); - winner = teamkeys[0]; - previous_winner_score = [[ level._getteamscore ]]( winner ); - - for ( teamindex = 1; teamindex < teamkeys.size; teamindex++ ) - { - winner = compareteambyteamscore( winner, teamkeys[teamindex], previous_winner_score ); - - if ( winner != "tie" ) - previous_winner_score = [[ level._getteamscore ]]( winner ); - } - - return winner; + teamKeys = GetArrayKeys(level.teams); + winner = teamKeys[0]; + previous_winner_score = [[level._getTeamScore]]( winner ); + + for ( teamIndex = 1; teamIndex < teamKeys.size; teamIndex++ ) + { + winner = compareTeamByTeamScore( winner, teamKeys[teamIndex], previous_winner_score); + + if ( winner != "tie" ) + { + previous_winner_score = [[level._getTeamScore]]( winner ); + } + } + + return winner; } -forceend( hostsucks ) +forceEnd(hostsucks) //checked matches bo3 _globallogic.gsc within reason { - if ( !isdefined( hostsucks ) ) - hostsucks = 0; + if ( !isDefined(hostsucks ) ) + hostsucks = false; - if ( level.hostforcedend || level.forcedend ) - return; + if ( level.hostForcedEnd || level.forcedEnd ) + return; - winner = undefined; - - if ( level.teambased ) - { - winner = determineteamwinnerbygamestat( "teamScores" ); - maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "host ended game", winner ); - } - else - { - winner = maps\mp\gametypes_zm\_globallogic_score::gethighestscoringplayer(); - - if ( isdefined( winner ) ) - logstring( "host ended game, win: " + winner.name ); - else - logstring( "host ended game, tie" ); - } - - level.forcedend = 1; - level.hostforcedend = 1; - - if ( hostsucks ) - endstring = &"MP_HOST_SUCKS"; - else if ( level.splitscreen ) - endstring = &"MP_ENDED_GAME"; - else - endstring = &"MP_HOST_ENDED_GAME"; - - setmatchflag( "disableIngameMenu", 1 ); - makedvarserverinfo( "ui_text_endreason", endstring ); - setdvar( "ui_text_endreason", endstring ); - thread endgame( winner, endstring ); + winner = undefined; + + if ( level.teamBased ) + { + winner = determineTeamWinnerByGameStat("teamScores"); + maps\mp\gametypes_zm\_globallogic_utils::logTeamWinString( "host ended game", winner ); + } + else + { + winner = maps\mp\gametypes_zm\_globallogic_score::getHighestScoringPlayer(); + if ( isDefined( winner ) ) + logString( "host ended game, win: " + winner.name ); + else + logString( "host ended game, tie" ); + } + + level.forcedEnd = true; + level.hostForcedEnd = true; + + if (hostsucks) + { + endString = &"MP_HOST_SUCKS"; + } + else + { + if ( level.splitscreen ) + endString = &"MP_ENDED_GAME"; + else + endString = &"MP_HOST_ENDED_GAME"; + } + + setMatchFlag( "disableIngameMenu", 1 ); + makeDvarServerInfo( "ui_text_endreason", endString ); + SetDvar( "ui_text_endreason", endString ); + thread endGame( winner, endString ); } -killserverpc() +killserverPc() //checked matches bo3 _globallogic.gsc within reason { - if ( level.hostforcedend || level.forcedend ) - return; - - winner = undefined; - - if ( level.teambased ) - { - winner = determineteamwinnerbygamestat( "teamScores" ); - maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "host ended game", winner ); - } - else - { - winner = maps\mp\gametypes_zm\_globallogic_score::gethighestscoringplayer(); - - if ( isdefined( winner ) ) - logstring( "host ended game, win: " + winner.name ); - else - logstring( "host ended game, tie" ); - } - - level.forcedend = 1; - level.hostforcedend = 1; - level.killserver = 1; - endstring = &"MP_HOST_ENDED_GAME"; + if ( level.hostForcedEnd || level.forcedEnd ) + return; + + winner = undefined; + + if ( level.teamBased ) + { + winner = determineTeamWinnerByGameStat("teamScores"); + maps\mp\gametypes_zm\_globallogic_utils::logTeamWinString( "host ended game", winner ); + } + else + { + winner = maps\mp\gametypes_zm\_globallogic_score::getHighestScoringPlayer(); + if ( isDefined( winner ) ) + logString( "host ended game, win: " + winner.name ); + else + logString( "host ended game, tie" ); + } + + level.forcedEnd = true; + level.hostForcedEnd = true; + + level.killserver = true; + + endString = &"MP_HOST_ENDED_GAME"; + + /* /# - println( "kill server; ending game\n" ); + PrintLn("kill server; ending game\n"); #/ - thread endgame( winner, endstring ); + */ + thread endGame( winner, endString ); } -someoneoneachteam() +someoneOnEachTeam() //checked matches bo3 _globallogic.gsc within reason { - foreach ( team in level.teams ) - { - if ( level.playercount[team] == 0 ) - return false; - } - - return true; + foreach ( team in level.teams ) + { + if ( level.playerCount[team] == 0 ) + return false; + } + + return true; } -checkifteamforfeits( team ) +checkIfTeamForfeits( team ) //checked matches bo3 _globallogic.gsc within reason { - if ( !level.everexisted[team] ) - return false; - - if ( level.playercount[team] < 1 && totalplayercount() > 0 ) - return true; - - return false; + if ( !level.everExisted[team] ) + return false; + + if ( level.playerCount[team] < 1 && totalPlayerCount() > 0 ) + { + return true; + } + + return false; } -checkforanyteamforfeit() +checkForAnyTeamForfeit() //checked matches bo3 _globallogic.gsc within reason { - foreach ( team in level.teams ) - { - if ( checkifteamforfeits( team ) ) - { - thread [[ level.onforfeit ]]( team ); - return true; - } - } - - return false; + foreach( team in level.teams ) + { + if ( checkIfTeamForfeits( team ) ) + { + //allies forfeited + thread [[level.onForfeit]]( team ); + return true; + } + } + + return false; } -dospawnqueueupdates() +doSpawnQueueUpdates() //checked matches bo3 _globallogic.gsc within reason { - foreach ( team in level.teams ) - { - if ( level.spawnqueuemodified[team] ) - [[ level.onalivecountchange ]]( team ); - } + foreach( team in level.teams ) + { + if ( level.spawnQueueModified[team] ) + { + [[level.onAliveCountChange]]( team ); + } + } } -isteamalldead( team ) +isTeamAllDead( team ) //checked changed at own discretion { - return level.everexisted[team] && !level.alivecount[team] && !level.playerlives[team]; + if ( level.everExisted[team] && !level.aliveCount[ team ] && !level.playerLives[ team ] ) + { + return 1; + } + return 0; } -areallteamsdead() +areAllTeamsDead( ) //checked matches bo3 _globallogic.gsc within reason { - foreach ( team in level.teams ) - { - if ( !isteamalldead( team ) ) - return false; - } - - return true; + foreach( team in level.teams ) + { + // if team was alive and now they are not + if ( !isTeamAllDead( team ) ) + { + return false; + } + } + + return true; } -alldeadteamcount() +allDeadTeamCount( ) //checked matches bo3 _globallogic.gsc within reason { - count = 0; - - foreach ( team in level.teams ) - { - if ( isteamalldead( team ) ) - count++; - } - - return count; + count = 0; + foreach( team in level.teams ) + { + // if team was alive and now they are not + if ( isTeamAllDead( team ) ) + { + count++; + } + } + + return count; } -dodeadeventupdates() +doDeadEventUpdates() //checked matches bo3 _globallogic.gsc within reason { - if ( level.teambased ) - { - if ( areallteamsdead() ) - { - [[ level.ondeadevent ]]( "all" ); - return true; - } + if ( level.teamBased ) + { + // if all teams were alive and now they are all dead in the same instance + if ( areAllTeamsDead( ) ) + { + [[level.onDeadEvent]]( "all" ); + return true; + } - if ( isdefined( level.onlastteamaliveevent ) ) - { - if ( alldeadteamcount() == level.teams.size - 1 ) - { - foreach ( team in level.teams ) - { - if ( !isteamalldead( team ) ) - { - [[ level.onlastteamaliveevent ]]( team ); - return true; - } - } - } - } - else - { - foreach ( team in level.teams ) - { - if ( isteamalldead( team ) ) - { - [[ level.ondeadevent ]]( team ); - return true; - } - } - } - } - else if ( totalalivecount() == 0 && totalplayerlives() == 0 && level.maxplayercount > 1 ) - { - [[ level.ondeadevent ]]( "all" ); - return true; - } - - return false; + // TODO MTEAM - invert all onDeadEvent functions to be onLastTeamAliveEvent instead + if ( isdefined( level.onLastTeamAliveEvent ) ) + { + if ( allDeadTeamCount( ) == level.teams.size - 1 ) + { + foreach( team in level.teams ) + { + // if team is alive + if ( !isTeamAllDead( team ) ) + { + [[level.onLastTeamAliveEvent]]( team ); + return true; + } + } + } + } + else + { + foreach( team in level.teams ) + { + // if team was alive and now they are not + if ( isTeamAllDead( team ) ) + { + [[level.onDeadEvent]]( team ); + return true; + } + } + } + } + else + { + // everyone is dead + if ( (totalAliveCount() == 0) && (totalPlayerLives() == 0) && level.maxPlayerCount > 1 ) + { + [[level.onDeadEvent]]( "all" ); + return true; + } + } + + return false; } -isonlyoneleftaliveonteam( team ) +isOnlyOneLeftAliveOnTeam( team ) //checked changed at own discretion { - return level.lastalivecount[team] > 1 && level.alivecount[team] == 1 && level.playerlives[team] == 1; + if ( level.lastAliveCount[team] > 1 && level.aliveCount[team] == 1 && level.playerLives[team] == 1 ) + { + return 1; + } + return 0; } -doonelefteventupdates() -{ - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - if ( isonlyoneleftaliveonteam( team ) ) - { - [[ level.ononeleftevent ]]( team ); - return true; - } - } - } - else if ( totalalivecount() == 1 && totalplayerlives() == 1 && level.maxplayercount > 1 ) - { - [[ level.ononeleftevent ]]( "all" ); - return true; - } - return false; +doOneLeftEventUpdates() //checked matches bo3 _globallogic.gsc within reason +{ + if ( level.teamBased ) + { + foreach( team in level.teams ) + { + // one "team" left + if ( isOnlyOneLeftAliveOnTeam( team ) ) + { + [[level.onOneLeftEvent]]( team ); + return true; + } + } + } + else + { + // last man standing + if ( (totalAliveCount() == 1) && (totalPlayerLives() == 1) && level.maxPlayerCount > 1 ) + { + [[level.onOneLeftEvent]]( "all" ); + return true; + } + } + + return false; } -updategameevents() +updateGameEvents() //checked matches bo3 _globallogic.gsc within reason { + /* /# - if ( getdvarint( "scr_hostmigrationtest" ) == 1 ) - return; + if( GetDvarint( "scr_hostmigrationtest" ) == 1 ) + { + return; + } #/ - if ( ( level.rankedmatch || level.wagermatch || level.leaguematch ) && !level.ingraceperiod ) - { - if ( level.teambased ) - { - if ( !level.gameforfeited ) - { - if ( game["state"] == "playing" && checkforanyteamforfeit() ) - return; - } - else if ( someoneoneachteam() ) - { - level.gameforfeited = 0; - level notify( "abort forfeit" ); - } - } - else if ( !level.gameforfeited ) - { - if ( totalplayercount() == 1 && level.maxplayercount > 1 ) - { - thread [[ level.onforfeit ]](); - return; - } - } - else if ( totalplayercount() > 1 ) - { - level.gameforfeited = 0; - level notify( "abort forfeit" ); - } - } + */ + if ( !level.inGracePeriod ) + { + if ( level.teamBased ) + { + if (!level.gameForfeited ) + { + if( game["state"] == "playing" && checkForAnyTeamForfeit() ) + { + return; + } + } + else // level.gameForfeited==true + { + if ( someoneOnEachTeam() ) + { + level.gameForfeited = false; + level notify( "abort forfeit" ); + } + } + } + else + { + if (!level.gameForfeited) + { + if ( totalPlayerCount() == 1 && level.maxPlayerCount > 1 ) + { + thread [[level.onForfeit]](); + return; + } + } + else // level.gameForfeited==true + { + if ( totalPlayerCount() > 1 ) + { + level.gameForfeited = false; + level notify( "abort forfeit" ); + } + } + } + } + + if ( !level.playerQueuedRespawn && !level.numLives && !level.inOverTime ) + return; + + if ( level.inGracePeriod ) + return; - if ( !level.playerqueuedrespawn && !level.numlives && !level.inovertime ) - return; - - if ( level.ingraceperiod ) - return; - - if ( level.playerqueuedrespawn ) - dospawnqueueupdates(); - - if ( dodeadeventupdates() ) - return; - - if ( doonelefteventupdates() ) - return; + if ( level.playerQueuedRespawn ) + { + doSpawnQueueUpdates(); + } + + if ( doDeadEventUpdates() ) + return; + + if ( doOneLeftEventUpdates() ) + return; } -matchstarttimer() -{ - visionsetnaked( "mpIntro", 0 ); - matchstarttext = createserverfontstring( "objective", 1.5 ); - matchstarttext setpoint( "CENTER", "CENTER", 0, -40 ); - matchstarttext.sort = 1001; - matchstarttext settext( game["strings"]["waiting_for_teams"] ); - matchstarttext.foreground = 0; - matchstarttext.hidewheninmenu = 1; - waitforplayers(); - matchstarttext settext( game["strings"]["match_starting_in"] ); - matchstarttimer = createserverfontstring( "objective", 2.2 ); - matchstarttimer setpoint( "CENTER", "CENTER", 0, 0 ); - matchstarttimer.sort = 1001; - matchstarttimer.color = ( 1, 1, 0 ); - matchstarttimer.foreground = 0; - matchstarttimer.hidewheninmenu = 1; - counttime = int( level.prematchperiod ); - if ( counttime >= 2 ) - { - while ( counttime > 0 && !level.gameended ) - { - matchstarttimer setvalue( counttime ); +matchStartTimer() //checked matches bo3 _globallogic.gsc within reason +{ + visionSetNaked( "mpIntro", 0 ); - if ( counttime == 2 ) - visionsetnaked( getdvar( "mapname" ), 3.0 ); + matchStartText = createServerFontString( "objective", 1.5 ); + matchStartText setPoint( "CENTER", "CENTER", 0, -40 ); + matchStartText.sort = 1001; + matchStartText setText( game["strings"]["waiting_for_teams"] ); + matchStartText.foreground = false; + matchStartText.hidewheninmenu = true; - counttime--; - wait 1.0; - } - } - else - visionsetnaked( getdvar( "mapname" ), 1.0 ); + waitForPlayers(); + matchStartText setText( game["strings"]["match_starting_in"] ); - matchstarttimer destroyelem(); - matchstarttext destroyelem(); + matchStartTimer = createServerFontString( "objective", 2.2 ); + matchStartTimer setPoint( "CENTER", "CENTER", 0, 0 ); + matchStartTimer.sort = 1001; + matchStartTimer.color = (1,1,0); + matchStartTimer.foreground = false; + matchStartTimer.hidewheninmenu = true; + + + //Since the scaling is disabled, we cant see the pulse effect by scaling. We need to change keep switching between + //some small and big font to get the pulse effect. This will be fixed when we have fixed set of different sizes fonts. + + //matchStartTimer maps\mp\gametypes_zm\_hud::fontPulseInit(); + + countTime = int( level.prematchPeriod ); + + if ( countTime >= 2 ) + { + while ( countTime > 0 && !level.gameEnded ) + { + matchStartTimer setValue( countTime ); + //matchStartTimer thread maps\mp\gametypes_zm\_hud::fontPulse( level ); + if ( countTime == 2 ) + visionSetNaked( GetDvar( "mapname" ), 3.0 ); + countTime--; + wait ( 1.0 ); + } + } + else + { + visionSetNaked( GetDvar( "mapname" ), 1.0 ); + } + + matchStartTimer destroyElem(); + matchStartText destroyElem(); } -matchstarttimerskip() +matchStartTimerSkip() //checked matches bo3 _globallogic.gsc within reason { - if ( !ispregame() ) - visionsetnaked( getdvar( "mapname" ), 0 ); - else - visionsetnaked( "mpIntro", 0 ); + if ( !isPregame() ) + visionSetNaked( GetDvar( "mapname" ), 0 ); + else + visionSetNaked( "mpIntro", 0 ); } -notifyteamwavespawn( team, time ) +notifyTeamWaveSpawn( team, time ) //checked matches bo3 _globallogic.gsc within reason { - if ( time - level.lastwave[team] > level.wavedelay[team] * 1000 ) - { - level notify( "wave_respawn_" + team ); - level.lastwave[team] = time; - level.waveplayerspawnindex[team] = 0; - } + if ( time - level.lastWave[team] > (level.waveDelay[team] * 1000) ) + { + level notify ( "wave_respawn_" + team ); + level.lastWave[team] = time; + level.wavePlayerSpawnIndex[team] = 0; + } } -wavespawntimer() +waveSpawnTimer() //checked matches bo3 _globallogic.gsc within reason { - level endon( "game_ended" ); + level endon( "game_ended" ); - while ( game["state"] == "playing" ) - { - time = gettime(); - - foreach ( team in level.teams ) - notifyteamwavespawn( team, time ); - - wait 0.05; - } + while ( game["state"] == "playing" ) + { + time = getTime(); + + foreach( team in level.teams ) + { + notifyTeamWaveSpawn( team, time ); + } + wait ( 0.05 ); + } } -hostidledout() + +hostIdledOut() //checked matches bo3 _globallogic.gsc within reason { - hostplayer = gethostplayer(); + hostPlayer = getHostPlayer(); + /* /# - if ( getdvarint( "scr_writeConfigStrings" ) == 1 || getdvarint( "scr_hostmigrationtest" ) == 1 ) - return false; + if( GetDvarint( "scr_writeconfigstrings" ) == 1 || GetDvarint( "scr_hostmigrationtest" ) == 1 ) + return false; #/ - if ( isdefined( hostplayer ) && !hostplayer.hasspawned && !isdefined( hostplayer.selectedclass ) ) - return true; + */ + // host never spawned + if ( isDefined( hostPlayer ) && !hostPlayer.hasSpawned && !isDefined( hostPlayer.selectedClass ) ) + return true; - return false; + return false; } -incrementmatchcompletionstat( gamemode, playedorhosted, stat ) +IncrementMatchCompletionStat( gameMode, playedOrHosted, stat ) //checked matches bo3 _globallogic.gsc within reason { - self adddstat( "gameHistory", gamemode, "modeHistory", playedorhosted, stat, 1 ); + self AddDStat( "gameHistory", gameMode, "modeHistory", playedOrHosted, stat, 1 ); } -setmatchcompletionstat( gamemode, playedorhosted, stat ) +SetMatchCompletionStat( gameMode, playedOrHosted, stat ) //checked matches bo3 _globallogic.gsc within reason { - self setdstat( "gameHistory", gamemode, "modeHistory", playedorhosted, stat, 1 ); + self SetDStat( "gameHistory", gameMode, "modeHistory", playedOrHosted, stat, 1 ); } -getcurrentgamemode() -{ - return "publicmatch"; +GetCurrentGameMode() //doesn't exist in bo3 _globallogic.gsc leaving in +{ + return "publicmatch"; } -displayroundend( winner, endreasontext ) +displayRoundEnd( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info { - if ( level.displayroundendtext ) - { - if ( winner == "tie" ) - maps\mp\_demo::gameresultbookmark( "round_result", level.teamindex["neutral"], level.teamindex["neutral"] ); - else - maps\mp\_demo::gameresultbookmark( "round_result", level.teamindex[winner], level.teamindex["neutral"] ); + if ( level.displayRoundEndText ) + { + if ( winner == "tie" ) + { + maps\mp\_demo::gameResultBookmark( "round_result", level.teamIndex[ "neutral" ], level.teamIndex[ "neutral" ] ); + } + else + { + maps\mp\_demo::gameResultBookmark( "round_result", level.teamIndex[ winner ], level.teamIndex[ "neutral" ] ); + } - setmatchflag( "cg_drawSpectatorMessages", 0 ); - players = level.players; + setmatchflag( "cg_drawSpectatorMessages", 0 ); + players = level.players; + index = 0; + while ( index < players.size ) + { + player = players[index]; + + if ( !isDefined( player.pers["team"] ) ) + { + player [[level.spawnIntermission]]( true ); + player closeMenu(); + player closeInGameMenu(); + index++; + continue; + } + + if ( level.wagerMatch ) + { + if ( level.teamBased ) + player thread [[level.onTeamWagerOutcomeNotify]]( winner, true, endReasonText ); + else + player thread [[level.onWagerOutcomeNotify]]( winner, endReasonText ); + } + else + { + if ( level.teamBased ) + { + player thread [[level.onTeamOutcomeNotify]]( winner, true, endReasonText ); + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "ROUND_END" ); + } + else + { + player thread [[level.onOutcomeNotify]]( winner, true, endReasonText ); + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "ROUND_END" ); + } + } + + player setClientUIVisibilityFlag( "hud_visible", 0 ); + player setClientUIVisibilityFlag( "g_compassShowEnemies", 0 ); + index++; + } + } - for ( index = 0; index < players.size; index++ ) - { - player = players[index]; - - if ( !isdefined( player.pers["team"] ) ) - { - player [[ level.spawnintermission ]]( 1 ); - player closemenu(); - player closeingamemenu(); - continue; - } - - if ( level.wagermatch ) - { - if ( level.teambased ) - player thread [[ level.onteamwageroutcomenotify ]]( winner, 1, endreasontext ); - else - player thread [[ level.onwageroutcomenotify ]]( winner, endreasontext ); - } - else if ( level.teambased ) - { - player thread [[ level.onteamoutcomenotify ]]( winner, 1, endreasontext ); - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "ROUND_END" ); - } - else - { - player thread [[ level.onoutcomenotify ]]( winner, 1, endreasontext ); - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "ROUND_END" ); - } - - player setclientuivisibilityflag( "hud_visible", 0 ); - player setclientuivisibilityflag( "g_compassShowEnemies", 0 ); - } - } - - if ( waslastround() ) - roundendwait( level.roundenddelay, 0 ); - else - { - thread maps\mp\gametypes_zm\_globallogic_audio::announceroundwinner( winner, level.roundenddelay / 4 ); - roundendwait( level.roundenddelay, 1 ); - } + if ( wasLastRound() ) + { + roundEndWait( level.roundEndDelay, false ); + } + else + { + thread maps\mp\gametypes_zm\_globallogic_audio::announceRoundWinner( winner, level.roundEndDelay / 4 ); + roundEndWait( level.roundEndDelay, true ); + } } -displayroundswitch( winner, endreasontext ) +displayRoundSwitch( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info { - switchtype = level.halftimetype; + switchType = level.halftimeType; + if ( switchType == "halftime" ) + { + if ( IsDefined( level.nextRoundIsOvertime ) && level.nextRoundIsOvertime ) + { + switchType = "overtime"; + } + else + { + if ( level.roundLimit ) + { + if ( (game["roundsplayed"] * 2) == level.roundLimit ) + switchType = "halftime"; + else + switchType = "intermission"; + } + else if ( level.scoreLimit ) + { + if ( game["roundsplayed"] == (level.scoreLimit - 1) ) + switchType = "halftime"; + else + switchType = "intermission"; + } + else + { + switchType = "intermission"; + } + } + } + + leaderdialog = maps\mp\gametypes_zm\_globallogic_audio::getRoundSwitchDialog( switchType ); + + SetMatchTalkFlag( "EveryoneHearsEveryone", 1 ); - if ( switchtype == "halftime" ) - { - if ( isdefined( level.nextroundisovertime ) && level.nextroundisovertime ) - switchtype = "overtime"; - else if ( level.roundlimit ) - { - if ( game["roundsplayed"] * 2 == level.roundlimit ) - switchtype = "halftime"; - else - switchtype = "intermission"; - } - else if ( level.scorelimit ) - { - if ( game["roundsplayed"] == level.scorelimit - 1 ) - switchtype = "halftime"; - else - switchtype = "intermission"; - } - else - switchtype = "intermission"; - } + players = level.players; + index = 0; + while ( index < players.size ) + { + player = players[index]; + + if ( !isDefined( player.pers["team"] ) ) + { + player [[level.spawnIntermission]]( true ); + player closeMenu(); + player closeInGameMenu(); + index++ + continue; + } + + player maps\mp\gametypes_zm\_globallogic_audio::leaderDialogOnPlayer( leaderdialog ); + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "ROUND_SWITCH" ); + + if ( level.wagerMatch ) + player thread [[level.onTeamWagerOutcomeNotify]]( switchType, true, level.halftimeSubCaption ); + else + player thread [[level.onTeamOutcomeNotify]]( switchType, false, level.halftimeSubCaption ); + player setClientUIVisibilityFlag( "hud_visible", 0 ); + index++; + } - leaderdialog = maps\mp\gametypes_zm\_globallogic_audio::getroundswitchdialog( switchtype ); - setmatchtalkflag( "EveryoneHearsEveryone", 1 ); - players = level.players; - - for ( index = 0; index < players.size; index++ ) - { - player = players[index]; - - if ( !isdefined( player.pers["team"] ) ) - { - player [[ level.spawnintermission ]]( 1 ); - player closemenu(); - player closeingamemenu(); - continue; - } - - player maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( leaderdialog ); - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "ROUND_SWITCH" ); - - if ( level.wagermatch ) - player thread [[ level.onteamwageroutcomenotify ]]( switchtype, 1, level.halftimesubcaption ); - else - player thread [[ level.onteamoutcomenotify ]]( switchtype, 0, level.halftimesubcaption ); - - player setclientuivisibilityflag( "hud_visible", 0 ); - } - - roundendwait( level.halftimeroundenddelay, 0 ); + roundEndWait( level.halftimeRoundEndDelay, false ); } -displaygameend( winner, endreasontext ) +displayGameEnd( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info { - setmatchtalkflag( "EveryoneHearsEveryone", 1 ); - setmatchflag( "cg_drawSpectatorMessages", 0 ); + SetMatchTalkFlag( "EveryoneHearsEveryone", 1 ); + setmatchflag( "cg_drawSpectatorMessages", 0 ); - if ( winner == "tie" ) - maps\mp\_demo::gameresultbookmark( "game_result", level.teamindex["neutral"], level.teamindex["neutral"] ); - else - maps\mp\_demo::gameresultbookmark( "game_result", level.teamindex[winner], level.teamindex["neutral"] ); + if ( winner == "tie" ) + { + maps\mp\_demo::gameResultBookmark( "game_result", level.teamIndex[ "neutral" ], level.teamIndex[ "neutral" ] ); + } + else + { + maps\mp\_demo::gameResultBookmark( "game_result", level.teamIndex[ winner ], level.teamIndex[ "neutral" ] ); + } - players = level.players; + // catching gametype, since DM forceEnd sends winner as player entity, instead of string + players = level.players; + index = 0; + while ( index < players.size ) + { + player = players[index]; + + if ( !isDefined( player.pers["team"] ) ) + { + player [[level.spawnIntermission]]( true ); + player closeMenu(); + player closeInGameMenu(); + index++; + continue; + } + + if ( level.wagerMatch ) + { + if ( level.teamBased ) + player thread [[level.onTeamWagerOutcomeNotify]]( winner, false, endReasonText ); + else + player thread [[level.onWagerOutcomeNotify]]( winner, endReasonText ); + } + else + { + if ( level.teamBased ) + { + player thread [[level.onTeamOutcomeNotify]]( winner, false, endReasonText ); + } + else + { + player thread [[level.onOutcomeNotify]]( winner, false, endReasonText ); + + if ( isDefined( winner ) && player == winner ) + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "VICTORY" ); + else if ( !level.splitScreen ) + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "LOSE" ); + } + } + + player setClientUIVisibilityFlag( "hud_visible", 0 ); + player setClientUIVisibilityFlag( "g_compassShowEnemies", 0 ); + index++; + } + + if ( level.teamBased ) + { + thread maps\mp\gametypes_zm\_globallogic_audio::announceGameWinner( winner, level.postRoundTime / 2 ); - for ( index = 0; index < players.size; index++ ) - { - player = players[index]; + players = level.players; + for ( index = 0; index < players.size; index++ ) + { + player = players[index]; + team = player.pers["team"]; + + if ( level.splitscreen ) + { + if ( winner == "tie" ) + { + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "DRAW" ); + } + else if ( winner == team ) + { + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "VICTORY" ); + } + else + { + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "LOSE" ); + } + } + else + { + if ( winner == "tie" ) + { + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "DRAW" ); + } + else if ( winner == team ) + { + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "VICTORY" ); + } + else + { + player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "LOSE" ); + } + } + } + } + + bbPrint( "session_epilogs", "reason %s", endReasonText ); - if ( !isdefined( player.pers["team"] ) ) - { - player [[ level.spawnintermission ]]( 1 ); - player closemenu(); - player closeingamemenu(); - continue; - } - - if ( level.wagermatch ) - { - if ( level.teambased ) - player thread [[ level.onteamwageroutcomenotify ]]( winner, 0, endreasontext ); - else - player thread [[ level.onwageroutcomenotify ]]( winner, endreasontext ); - } - else if ( level.teambased ) - player thread [[ level.onteamoutcomenotify ]]( winner, 0, endreasontext ); - else - { - player thread [[ level.onoutcomenotify ]]( winner, 0, endreasontext ); - - if ( isdefined( winner ) && player == winner ) - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "VICTORY" ); - else if ( !level.splitscreen ) - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "LOSE" ); - } - - player setclientuivisibilityflag( "hud_visible", 0 ); - player setclientuivisibilityflag( "g_compassShowEnemies", 0 ); - } - - if ( level.teambased ) - { - thread maps\mp\gametypes_zm\_globallogic_audio::announcegamewinner( winner, level.postroundtime / 2 ); - players = level.players; - - for ( index = 0; index < players.size; index++ ) - { - player = players[index]; - team = player.pers["team"]; - - if ( level.splitscreen ) - { - if ( winner == "tie" ) - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "DRAW" ); - else if ( winner == team ) - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "VICTORY" ); - else - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "LOSE" ); - - continue; - } - - if ( winner == "tie" ) - { - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "DRAW" ); - continue; - } - - if ( winner == team ) - { - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "VICTORY" ); - continue; - } - - player maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "LOSE" ); - } - } - - bbprint( "session_epilogs", "reason %s", endreasontext ); - bbprint( "mpmatchfacts", "gametime %d winner %s killstreakcount %d", gettime(), winner, level.killstreak_counter ); - roundendwait( level.postroundtime, 1 ); + // tagTMR: all round data aggregates that cannot be summed from other tables post-runtime + bbPrint( "mpmatchfacts", "gametime %d winner %s killstreakcount %d", gettime(), winner, level.killstreak_counter ); + + roundEndWait( level.postRoundTime, true ); } -getendreasontext() +getEndReasonText() //checked matches bo3 _globallogic.gsc within reason { - if ( hitroundlimit() || hitroundwinlimit() ) - return game["strings"]["round_limit_reached"]; - else if ( hitscorelimit() ) - return game["strings"]["score_limit_reached"]; + if ( hitRoundLimit() || hitRoundWinLimit() ) + return game["strings"]["round_limit_reached"]; + else if ( hitScoreLimit() ) + return game["strings"]["score_limit_reached"]; - if ( level.forcedend ) - { - if ( level.hostforcedend ) - return &"MP_HOST_ENDED_GAME"; - else - return &"MP_ENDED_GAME"; - } - - return game["strings"]["time_limit_reached"]; + if ( level.forcedEnd ) + { + if ( level.hostForcedEnd ) + return &"MP_HOST_ENDED_GAME"; + else + return &"MP_ENDED_GAME"; + } + return game["strings"]["time_limit_reached"]; } -resetoutcomeforallplayers() +resetOutcomeForAllPlayers() //checked matches bo3 _globallogic.gsc within reason { - players = level.players; - - for ( index = 0; index < players.size; index++ ) - { - player = players[index]; - player notify( "reset_outcome" ); - } + players = level.players; + for ( index = 0; index < players.size; index++ ) + { + player = players[index]; + player notify ( "reset_outcome" ); + } } -startnextround( winner, endreasontext ) +startNextRound( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason { - if ( !isoneround() ) - { - displayroundend( winner, endreasontext ); - maps\mp\gametypes_zm\_globallogic_utils::executepostroundevents(); + if ( !isOneRound() ) + { + displayRoundEnd( winner, endReasonText ); - if ( !waslastround() ) - { - if ( checkroundswitch() ) - displayroundswitch( winner, endreasontext ); + maps\mp\gametypes_zm\_globallogic_utils::executePostRoundEvents(); + + if ( !wasLastRound() ) + { + if ( checkRoundSwitch() ) + { + displayRoundSwitch( winner, endReasonText ); + } + + if ( IsDefined( level.nextRoundIsOvertime ) && level.nextRoundIsOvertime ) + { + if ( !IsDefined( game["overtime_round"] ) ) + { + game["overtime_round"] = 1; + } + else + { + game["overtime_round"]++; + } + } - if ( isdefined( level.nextroundisovertime ) && level.nextroundisovertime ) - { - if ( !isdefined( game["overtime_round"] ) ) - game["overtime_round"] = 1; - else - game["overtime_round"]++; - } - - setmatchtalkflag( "DeadChatWithDead", level.voip.deadchatwithdead ); - setmatchtalkflag( "DeadChatWithTeam", level.voip.deadchatwithteam ); - setmatchtalkflag( "DeadHearTeamLiving", level.voip.deadhearteamliving ); - setmatchtalkflag( "DeadHearAllLiving", level.voip.deadhearallliving ); - setmatchtalkflag( "EveryoneHearsEveryone", level.voip.everyonehearseveryone ); - setmatchtalkflag( "DeadHearKiller", level.voip.deadhearkiller ); - setmatchtalkflag( "KillersHearVictim", level.voip.killershearvictim ); - game["state"] = "playing"; - level.allowbattlechatter = getgametypesetting( "allowBattleChatter" ); - map_restart( 1 ); - return true; - } - } - - return false; + SetMatchTalkFlag( "DeadChatWithDead", level.voip.deadChatWithDead ); + SetMatchTalkFlag( "DeadChatWithTeam", level.voip.deadChatWithTeam ); + SetMatchTalkFlag( "DeadHearTeamLiving", level.voip.deadHearTeamLiving ); + SetMatchTalkFlag( "DeadHearAllLiving", level.voip.deadHearAllLiving ); + SetMatchTalkFlag( "EveryoneHearsEveryone", level.voip.everyoneHearsEveryone ); + SetMatchTalkFlag( "DeadHearKiller", level.voip.deadHearKiller ); + SetMatchTalkFlag( "KillersHearVictim", level.voip.killersHearVictim ); + + game["state"] = "playing"; + level.allowBattleChatter = GetGametypeSetting( "allowBattleChatter" ); + map_restart( true ); + return true; + } + } + return false; } -settopplayerstats() + +setTopPlayerStats( ) //doesn't exist in bo3 _globallogic.gsc leaving in { - if ( level.rankedmatch || level.wagermatch ) - { - placement = level.placement["all"]; - topthreeplayers = min( 3, placement.size ); + if( level.rankedMatch || level.wagerMatch ) + { + placement = level.placement["all"]; + topThreePlayers = min( 3, placement.size ); + + for ( index = 0; index < topThreePlayers; index++ ) + { + if ( level.placement["all"][index].score ) + { + if ( !index ) + { + level.placement["all"][index] AddPlayerStatWithGameType( "TOPPLAYER", 1 ); + level.placement["all"][index] notify( "topplayer" ); + } + else + level.placement["all"][index] notify( "nottopplayer" ); + + level.placement["all"][index] AddPlayerStatWithGameType( "TOP3", 1 ); + level.placement["all"][index] notify( "top3" ); + } + } + + for ( index = 3 ; index < placement.size ; index++ ) + { + level.placement["all"][index] notify( "nottop3" ); + level.placement["all"][index] notify( "nottopplayer" ); + } - for ( index = 0; index < topthreeplayers; index++ ) - { - if ( level.placement["all"][index].score ) - { - if ( !index ) - { - level.placement["all"][index] addplayerstatwithgametype( "TOPPLAYER", 1 ); - level.placement["all"][index] notify( "topplayer" ); - } - else - level.placement["all"][index] notify( "nottopplayer" ); - - level.placement["all"][index] addplayerstatwithgametype( "TOP3", 1 ); - level.placement["all"][index] notify( "top3" ); - } - } - - for ( index = 3; index < placement.size; index++ ) - { - level.placement["all"][index] notify( "nottop3" ); - level.placement["all"][index] notify( "nottopplayer" ); - } - - if ( level.teambased ) - { - foreach ( team in level.teams ) - settopteamstats( team ); - } - } + if ( level.teambased ) + { + foreach ( team in level.teams ) + { + setTopTeamStats(team); + } + } + } } -settopteamstats( team ) +setTopTeamStats(team) //doesn't exist in bo3 _globallogic.gsc leaving in { - placementteam = level.placement[team]; - topthreeteamplayers = min( 3, placementteam.size ); - - if ( placementteam.size < 5 ) - return; - - for ( index = 0; index < topthreeteamplayers; index++ ) - { - if ( placementteam[index].score ) - placementteam[index] addplayerstatwithgametype( "TOP3TEAM", 1 ); - } + placementTeam = level.placement[team]; + topThreeTeamPlayers = min( 3, placementTeam.size ); + // should have at least 5 players on the team + if ( placementTeam.size < 5 ) + return; + + for ( index = 0; index < topThreeTeamPlayers; index++ ) + { + if ( placementTeam[index].score ) + { + //placementTeam[index] AddPlayerStat( "BASIC_TOP_3_TEAM", 1 ); + placementTeam[index] AddPlayerStatWithGameType( "TOP3TEAM", 1 ); + } + } } -getgamelength() +getGameLength() //checked matches bo3 _globallogic.gsc within reason { - if ( !level.timelimit || level.forcedend ) - { - gamelength = maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() / 1000; - gamelength = min( gamelength, 1200 ); - } - else - gamelength = level.timelimit * 60; - - return gamelength; + if ( !level.timeLimit || level.forcedEnd ) + { + gameLength = maps\mp\gametypes_zm\_globallogic_utils::getTimePassed() / 1000; + // cap it at 20 minutes to avoid exploiting + gameLength = min( gameLength, 1200 ); + } + else + { + gameLength = level.timeLimit * 60; + } + + return gameLength; } -gamehistoryplayerquit() +gameHistoryPlayerQuit() //checked matches bo3 _globallogic.gsc within reason { - if ( !gamemodeismode( level.gamemode_public_match ) ) - return; + if ( !GameModeIsMode( level.GAMEMODE_PUBLIC_MATCH ) ) + return; + + teamScoreRatio = 0; + self GameHistoryFinishMatch( MATCH_QUIT, 0, 0, 0, 0, teamScoreRatio ); - teamscoreratio = 0; - self gamehistoryfinishmatch( 3, 0, 0, 0, 0, teamscoreratio ); + if ( IsDefined( self.pers["matchesPlayedStatsTracked"] ) ) + { + gameMode = GetCurrentGameMode(); + self IncrementMatchCompletionStat( gameMode, "played", "quit" ); + + if ( IsDefined( self.pers["matchesHostedStatsTracked"] ) ) + { + self IncrementMatchCompletionStat( gameMode, "hosted", "quit" ); + self.pers["matchesHostedStatsTracked"] = undefined; + } + + self.pers["matchesPlayedStatsTracked"] = undefined; + } + + UploadStats( self ); - if ( isdefined( self.pers["matchesPlayedStatsTracked"] ) ) - { - gamemode = getcurrentgamemode(); - self incrementmatchcompletionstat( gamemode, "played", "quit" ); - - if ( isdefined( self.pers["matchesHostedStatsTracked"] ) ) - { - self incrementmatchcompletionstat( gamemode, "hosted", "quit" ); - self.pers["matchesHostedStatsTracked"] = undefined; - } - - self.pers["matchesPlayedStatsTracked"] = undefined; - } - - uploadstats( self ); - wait 1; + // wait until the player recieves the new stats + wait(1); } -endgame( winner, endreasontext ) +endGame( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info { - if ( game["state"] == "postgame" || level.gameended ) - return; + // return if already ending via host quit or victory + if ( game["state"] == "postgame" || level.gameEnded ) + return; - if ( isdefined( level.onendgame ) ) - [[ level.onendgame ]]( winner ); + if ( isDefined( level.onEndGame ) ) + [[level.onEndGame]]( winner ); - if ( !level.wagermatch ) - setmatchflag( "enable_popups", 0 ); + //This wait was added possibly for wager match issues, but we think is no longer necessary. + //It was creating issues with multiple players calling this fuction when checking game score. In modes like HQ, + //The game score is given to every player on the team that captured the HQ, so when the points are dished out it loops through + //all players on that team and checks if the score limit has been reached. But since this wait occured before the game["state"] + //could be set to "postgame" the check score thread would send the next player that reached the score limit into this function, + //when the following code should only be hit once. If this wait turns out to be needed, we need to try pulling the game["state"] = "postgame"; + //up above the wait. + //wait 0.05; + + if ( !level.wagerMatch ) + setMatchFlag( "enable_popups", 0 ); + if ( !isdefined( level.disableOutroVisionSet ) || level.disableOutroVisionSet == false ) + { + if ( SessionModeIsZombiesGame() && level.forcedEnd ) + { + visionSetNaked( "zombie_last_stand", 2.0 ); + } + else + { + visionSetNaked( "mpOutro", 2.0 ); + } + } + + setmatchflag( "cg_drawSpectatorMessages", 0 ); + setmatchflag( "game_ended", 1 ); - if ( !isdefined( level.disableoutrovisionset ) || level.disableoutrovisionset == 0 ) - { - if ( sessionmodeiszombiesgame() && level.forcedend ) - visionsetnaked( "zombie_last_stand", 2.0 ); - else - visionsetnaked( "mpOutro", 2.0 ); - } + game["state"] = "postgame"; + level.gameEndTime = getTime(); + level.gameEnded = true; + SetDvar( "g_gameEnded", 1 ); + level.inGracePeriod = false; + level notify ( "game_ended" ); + level.allowBattleChatter = false; + maps\mp\gametypes_zm\_globallogic_audio::flushDialog(); - setmatchflag( "cg_drawSpectatorMessages", 0 ); - setmatchflag( "game_ended", 1 ); - game["state"] = "postgame"; - level.gameendtime = gettime(); - level.gameended = 1; - setdvar( "g_gameEnded", 1 ); - level.ingraceperiod = 0; - level notify( "game_ended" ); - level.allowbattlechatter = 0; - maps\mp\gametypes_zm\_globallogic_audio::flushdialog(); + if ( !IsDefined( game["overtime_round"] ) || wasLastRound() ) // Want to treat all overtime rounds as a single round + { + game["roundsplayed"]++; + game["roundwinner"][game["roundsplayed"]] = winner; + + //Added "if" check for FFA - Leif + if( level.teambased ) + { + game["roundswon"][winner]++; + } + } - if ( !isdefined( game["overtime_round"] ) || waslastround() ) - { - game["roundsplayed"]++; - game["roundwinner"][game["roundsplayed"]] = winner; + if ( isdefined( winner ) && isdefined( level.teams[winner] ) ) + { + level.finalKillCam_winner = winner; + } + else + { + level.finalKillCam_winner = "none"; + } + + setGameEndTime( 0 ); // stop/hide the timers + + updatePlacement(); - if ( level.teambased ) - game["roundswon"][winner]++; - } + updateRankedMatch( winner ); + + // freeze players + players = level.players; + + newTime = getTime(); + gameLength = getGameLength(); + + SetMatchTalkFlag( "EveryoneHearsEveryone", 1 ); - if ( isdefined( winner ) && isdefined( level.teams[winner] ) ) - level.finalkillcam_winner = winner; - else - level.finalkillcam_winner = "none"; + bbGameOver = 0; + if ( isOneRound() || wasLastRound() ) + { + bbGameOver = 1; - setgameendtime( 0 ); - updateplacement(); - updaterankedmatch( winner ); - players = level.players; - newtime = gettime(); - gamelength = getgamelength(); - setmatchtalkflag( "EveryoneHearsEveryone", 1 ); - bbgameover = 0; + if ( level.teambased ) + { + if ( winner == "tie" ) + { + recordGameResult( "draw" ); + } + else + { + recordGameResult( winner ); + } + } + else + { + if ( !isDefined( winner ) ) + { + recordGameResult( "draw" ); + } + else + { + recordGameResult( winner.team ); + } + } + } - if ( isoneround() || waslastround() ) - { - bbgameover = 1; + index = 0; + while ( index < players.size ) + { + player = players[index]; + player maps\mp\gametypes_zm\_globallogic_player::freezePlayerForRoundEnd(); + player thread roundEndDoF( 4.0 ); - if ( level.teambased ) - { - if ( winner == "tie" ) - recordgameresult( "draw" ); - else - recordgameresult( winner ); - } - else if ( !isdefined( winner ) ) - recordgameresult( "draw" ); - else - recordgameresult( winner.team ); - } + player maps\mp\gametypes_zm\_globallogic_ui::freeGameplayHudElems(); + + // Update weapon usage stats + player maps\mp\gametypes_zm\_weapons::updateWeaponTimings( newTime ); + + player bbPlayerMatchEnd( gameLength, endReasonText, bbGameOver ); - for ( index = 0; index < players.size; index++ ) - { - player = players[index]; - player maps\mp\gametypes_zm\_globallogic_player::freezeplayerforroundend(); - player thread roundenddof( 4.0 ); - player maps\mp\gametypes_zm\_globallogic_ui::freegameplayhudelems(); - player maps\mp\gametypes_zm\_weapons::updateweapontimings( newtime ); - player bbplayermatchend( gamelength, endreasontext, bbgameover ); + if( isPregame() ) + { + index++; + continue; + } - if ( ispregame() ) - continue; + if( level.rankedMatch || level.wagerMatch || level.leagueMatch ) + { + if ( isDefined( player.setPromotion ) ) + { + player setDStat( "AfterActionReportStats", "lobbyPopup", "promotion" ); + } + else + { + player setDStat( "AfterActionReportStats", "lobbyPopup", "summary" ); + } + } + index++; + } - if ( ( level.rankedmatch || level.wagermatch || level.leaguematch ) && !player issplitscreen() ) - { - if ( isdefined( player.setpromotion ) ) - { - player setdstat( "AfterActionReportStats", "lobbyPopup", "promotion" ); - continue; - } + maps\mp\_music::setmusicstate( "SILENT" ); - player setdstat( "AfterActionReportStats", "lobbyPopup", "summary" ); - } - } +// temporarily disabling round end sound call to prevent the final killcam from not having sound + if ( !level.inFinalKillcam ) + { +// clientnotify ( "snd_end_rnd" ); + } - maps\mp\_music::setmusicstate( "SILENT" ); + //maps\mp\_gamerep::gameRepUpdateInformationForRound(); +// maps\mp\gametypes_zm\_wager::finalizeWagerRound(); +// maps\mp\gametypes_zm\_gametype_variants::onRoundEnd(); + thread maps\mp\_challenges::roundEnd( winner ); - if ( !level.infinalkillcam ) - { + if ( startNextRound( winner, endReasonText ) ) + { + return; + } + + /////////////////////////////////////////// + // After this the match is really ending // + /////////////////////////////////////////// - } + if ( !isOneRound() ) + { + if ( isDefined( level.onRoundEndGame ) ) + { + winner = [[level.onRoundEndGame]]( winner ); + } - thread maps\mp\_challenges::roundend( winner ); + endReasonText = getEndReasonText(); + } + + skillUpdate( winner, level.teamBased ); + recordLeagueWinner( winner ); + + setTopPlayerStats(); + thread maps\mp\_challenges::gameEnd( winner ); - if ( startnextround( winner, endreasontext ) ) - return; + if ( ( !isDefined( level.skipGameEnd ) || !level.skipGameEnd ) && IsDefined( winner ) ) + displayGameEnd( winner, endReasonText ); + + if ( isOneRound() ) + { + maps\mp\gametypes_zm\_globallogic_utils::executePostRoundEvents(); + } + + level.intermission = true; - if ( !isoneround() ) - { - if ( isdefined( level.onroundendgame ) ) - winner = [[ level.onroundendgame ]]( winner ); + //maps\mp\_gamerep::gameRepAnalyzeAndReport(); - endreasontext = getendreasontext(); - } +// maps\mp\gametypes_zm\_wager::finalizeWagerGame(); + + SetMatchTalkFlag( "EveryoneHearsEveryone", 1 ); - skillupdate( winner, level.teambased ); - recordleaguewinner( winner ); - settopplayerstats(); - thread maps\mp\_challenges::gameend( winner ); + //regain players array since some might've disconnected during the wait above + players = level.players; + for ( index = 0; index < players.size; index++ ) + { + player = players[index]; + + recordPlayerStats( player, "presentAtEnd", 1 ); - if ( isdefined( winner ) && ( !isdefined( level.skipgameend ) || !level.skipgameend ) ) - displaygameend( winner, endreasontext ); + player closeMenu(); + player closeInGameMenu(); + player notify ( "reset_outcome" ); + player thread [[level.spawnIntermission]](); + player setClientUIVisibilityFlag( "hud_visible", 1 ); + } + //Eckert - Fading out sound + level notify ( "sfade"); + logString( "game ended" ); + + if ( !isDefined( level.skipGameEnd ) || !level.skipGameEnd ) + wait 5.0; + + exitLevel( false ); - if ( isoneround() ) - maps\mp\gametypes_zm\_globallogic_utils::executepostroundevents(); - - level.intermission = 1; - setmatchtalkflag( "EveryoneHearsEveryone", 1 ); - players = level.players; - - for ( index = 0; index < players.size; index++ ) - { - player = players[index]; - recordplayerstats( player, "presentAtEnd", 1 ); - player closemenu(); - player closeingamemenu(); - player notify( "reset_outcome" ); - player thread [[ level.spawnintermission ]](); - player setclientuivisibilityflag( "hud_visible", 1 ); - } - - level notify( "sfade" ); - logstring( "game ended" ); - - if ( !isdefined( level.skipgameend ) || !level.skipgameend ) - wait 5.0; - - exitlevel( 0 ); } -bbplayermatchend( gamelength, endreasonstring, gameover ) -{ - playerrank = getplacementforplayer( self ); - totaltimeplayed = 0; +bbPlayerMatchEnd( gameLength, endReasonString, gameOver ) // self == player //checked matches bo3 _globallogic.gsc within reason +{ + playerRank = getPlacementForPlayer( self ); + + totalTimePlayed = 0; + if ( isDefined( self.timePlayed ) && isDefined( self.timePlayed["total"] ) ) + { + totalTimePlayed = self.timePlayed["total"]; + if ( totalTimePlayed > gameLength ) + { + totalTimePlayed = gameLength; + } + } - if ( isdefined( self.timeplayed ) && isdefined( self.timeplayed["total"] ) ) - { - totaltimeplayed = self.timeplayed["total"]; + xuid = self GetXUID(); - if ( totaltimeplayed > gamelength ) - totaltimeplayed = gamelength; - } - - xuid = self getxuid(); - bbprint( "mpplayermatchfacts", "score %d momentum %d endreason %s sessionrank %d playtime %d xuid %s gameover %d team %s", self.pers["score"], self.pers["momentum"], endreasonstring, playerrank, totaltimeplayed, xuid, gameover, self.pers["team"] ); + bbPrint( "mpplayermatchfacts", "score %d momentum %d endreason %s sessionrank %d playtime %d xuid %s gameover %d team %s", + self.pers["score"], + self.pers["momentum"], + endReasonString, + playerRank, + totalTimePlayed, + xuid, + gameOver, + self.pers["team"] ); } -roundendwait( defaultdelay, matchbonus ) +roundEndWait( defaultDelay, matchBonus ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info { - notifiesdone = 0; + notifiesDone = false; + while ( !notifiesDone ) + { + players = level.players; + notifiesDone = true; + index = 0; + while ( index < players.size ) + { + if ( !isDefined( players[index].doingNotify ) || !players[index].doingNotify ) + { + index++; + continue; + } + + notifiesDone = false; + index++; + } + wait ( 0.5 ); + } - while ( !notifiesdone ) - { - players = level.players; - notifiesdone = 1; + if ( !matchBonus ) + { + wait ( defaultDelay ); + level notify ( "round_end_done" ); + return; + } - for ( index = 0; index < players.size; index++ ) - { - if ( !isdefined( players[index].doingnotify ) || !players[index].doingnotify ) - continue; + wait ( defaultDelay / 2 ); + level notify ( "give_match_bonus" ); + wait ( defaultDelay / 2 ); - notifiesdone = 0; - } - - wait 0.5; - } - - if ( !matchbonus ) - { - wait( defaultdelay ); - level notify( "round_end_done" ); - return; - } - - wait( defaultdelay / 2 ); - level notify( "give_match_bonus" ); - wait( defaultdelay / 2 ); - notifiesdone = 0; - - while ( !notifiesdone ) - { - players = level.players; - notifiesdone = 1; - - for ( index = 0; index < players.size; index++ ) - { - if ( !isdefined( players[index].doingnotify ) || !players[index].doingnotify ) - continue; - - notifiesdone = 0; - } - - wait 0.5; - } - - level notify( "round_end_done" ); + notifiesDone = false; + while ( !notifiesDone ) + { + players = level.players; + notifiesDone = true; + index = 0; + while ( index < players.size ) + { + if ( !isDefined( players[index].doingNotify ) || !players[index].doingNotify ) + index++; + continue; + + notifiesDone = false; + index++; + } + wait ( 0.5 ); + } + + level notify ( "round_end_done" ); } -roundenddof( time ) + +roundEndDOF( time ) //checked matches bo3 _globallogic.gsc within reason { - self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); + self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 ); } -checktimelimit() + +checkTimeLimit() //checked matches bo3 _globallogic.gsc within reason { - if ( isdefined( level.timelimitoverride ) && level.timelimitoverride ) - return; - - if ( game["state"] != "playing" ) - { - setgameendtime( 0 ); - return; - } - - if ( level.timelimit <= 0 ) - { - setgameendtime( 0 ); - return; - } - - if ( level.inprematchperiod ) - { - setgameendtime( 0 ); - return; - } - - if ( level.timerstopped ) - { - setgameendtime( 0 ); - return; - } - - if ( !isdefined( level.starttime ) ) - return; - - timeleft = maps\mp\gametypes_zm\_globallogic_utils::gettimeremaining(); - setgameendtime( gettime() + int( timeleft ) ); - - if ( timeleft > 0 ) - return; - - [[ level.ontimelimit ]](); + if ( isDefined( level.timeLimitOverride ) && level.timeLimitOverride ) + return; + + if ( game["state"] != "playing" ) + { + setGameEndTime( 0 ); + return; + } + + if ( level.timeLimit <= 0 ) + { + setGameEndTime( 0 ); + return; + } + + if ( level.inPrematchPeriod ) + { + setGameEndTime( 0 ); + return; + } + + if ( level.timerStopped ) + { + setGameEndTime( 0 ); + return; + } + + if ( !isdefined( level.startTime ) ) + return; + + timeLeft = maps\mp\gametypes_zm\_globallogic_utils::getTimeRemaining(); + + // want this accurate to the millisecond + setGameEndTime( getTime() + int(timeLeft) ); + + if ( timeLeft > 0 ) + return; + + [[level.onTimeLimit]](); } -allteamsunderscorelimit() +allTeamsUnderScoreLimit() //checked matches bo3 _globallogic.gsc within reason { - foreach ( team in level.teams ) - { - if ( game["teamScores"][team] >= level.scorelimit ) - return false; - } - - return true; + foreach ( team in level.teams ) + { + if ( game["teamScores"][team] >= level.scoreLimit ) + return false; + } + + return true; } -checkscorelimit() +checkScoreLimit() //checked matches bo3 _globallogic.gsc within reason { - if ( game["state"] != "playing" ) - return false; + if ( game["state"] != "playing" ) + return false; - if ( level.scorelimit <= 0 ) - return false; + if ( level.scoreLimit <= 0 ) + return false; - if ( level.teambased ) - { - if ( allteamsunderscorelimit() ) - return false; - } - else - { - if ( !isplayer( self ) ) - return false; + if ( level.teamBased ) + { + if( allTeamsUnderScoreLimit() ) + return false; + } + else + { + if ( !isPlayer( self ) ) + return false; - if ( self.score < level.scorelimit ) - return false; - } + if ( self.score < level.scoreLimit ) + return false; + } - [[ level.onscorelimit ]](); + [[level.onScoreLimit]](); } -updategametypedvars() + +updateGameTypeDvars() //checked matches bo3 _globallogic.gsc within reason { - level endon( "game_ended" ); + level endon ( "game_ended" ); + + while ( game["state"] == "playing" ) + { + roundlimit = clamp( GetGametypeSetting( "roundLimit" ), level.roundLimitMin, level.roundLimitMax ); + if ( roundlimit != level.roundlimit ) + { + level.roundlimit = roundlimit; + level notify ( "update_roundlimit" ); + } - while ( game["state"] == "playing" ) - { - roundlimit = clamp( getgametypesetting( "roundLimit" ), level.roundlimitmin, level.roundlimitmax ); + timeLimit = [[level.getTimeLimit]](); + if ( timeLimit != level.timeLimit ) + { + level.timeLimit = timeLimit; + SetDvar( "ui_timelimit", level.timeLimit ); + level notify ( "update_timelimit" ); + } + thread checkTimeLimit(); - if ( roundlimit != level.roundlimit ) - { - level.roundlimit = roundlimit; - level notify( "update_roundlimit" ); - } - - timelimit = [[ level.gettimelimit ]](); - - if ( timelimit != level.timelimit ) - { - level.timelimit = timelimit; - setdvar( "ui_timelimit", level.timelimit ); - level notify( "update_timelimit" ); - } - - thread checktimelimit(); - scorelimit = clamp( getgametypesetting( "scoreLimit" ), level.scorelimitmin, level.scorelimitmax ); - - if ( scorelimit != level.scorelimit ) - { - level.scorelimit = scorelimit; - setdvar( "ui_scorelimit", level.scorelimit ); - level notify( "update_scorelimit" ); - } - - thread checkscorelimit(); - - if ( isdefined( level.starttime ) ) - { - if ( maps\mp\gametypes_zm\_globallogic_utils::gettimeremaining() < 3000 ) - { - wait 0.1; - continue; - } - } - - wait 1; - } + scoreLimit = clamp( GetGametypeSetting( "scoreLimit" ), level.scoreLimitMin, level.scoreLimitMax ); + if ( scoreLimit != level.scoreLimit ) + { + level.scoreLimit = scoreLimit; + SetDvar( "ui_scorelimit", level.scoreLimit ); + level notify ( "update_scorelimit" ); + } + thread checkScoreLimit(); + + // make sure we check time limit right when game ends + if ( isdefined( level.startTime ) ) + { + if ( maps\mp\gametypes_zm\_globallogic_utils::getTimeRemaining() < 3000 ) + { + wait .1; + continue; + } + } + wait 1; + } } -removedisconnectedplayerfromplacement() + +removeDisconnectedPlayerFromPlacement() //checked matches bo3 _globallogic.gsc within reason { - offset = 0; - numplayers = level.placement["all"].size; - found = 0; + offset = 0; + numPlayers = level.placement["all"].size; + found = false; + for ( i = 0; i < numPlayers; i++ ) + { + if ( level.placement["all"][i] == self ) + found = true; + + if ( found ) + level.placement["all"][i] = level.placement["all"][ i + 1 ]; + } + if ( !found ) + return; + + level.placement["all"][ numPlayers - 1 ] = undefined; + //assert( level.placement["all"].size == numPlayers - 1 ); + /* + /# + maps\mp\gametypes_zm\_globallogic_utils::assertProperPlacement(); + #/ + */ + updateTeamPlacement(); + + if ( level.teamBased ) + return; + + numPlayers = level.placement["all"].size; + for ( i = 0; i < numPlayers; i++ ) + { + player = level.placement["all"][i]; + player notify( "update_outcome" ); + } + +} - for ( i = 0; i < numplayers; i++ ) - { - if ( level.placement["all"][i] == self ) - found = 1; +updatePlacement() //checked matches bo3 _globallogic.gsc within reason +{ + + if ( !level.players.size ) + return; - if ( found ) - level.placement["all"][i] = level.placement["all"][i + 1]; - } + level.placement["all"] = []; + for ( index = 0; index < level.players.size; index++ ) + { + if ( isdefined( level.teams[ level.players[index].team ] ) ) + level.placement["all"][level.placement["all"].size] = level.players[index]; + } + + placementAll = level.placement["all"]; + + for ( i = 1; i < placementAll.size; i++ ) + { + player = placementAll[i]; + playerScore = player.score; + } + + level.placement["all"] = placementAll; + /* + /# + maps\mp\gametypes_zm\_globallogic_utils::assertProperPlacement(); + #/ + */ + updateTeamPlacement(); - if ( !found ) - return; +} - level.placement["all"][numplayers - 1] = undefined; + +updateTeamPlacement() //checked matches bo3 _globallogic.gsc within reason +{ + foreach( team in level.teams ) + { + placement[team] = []; + } + placement["spectator"] = []; + + if ( !level.teamBased ) + return; + + placementAll = level.placement["all"]; + placementAllSize = placementAll.size; + + for ( i = 0; i < placementAllSize; i++ ) + { + player = placementAll[i]; + team = player.pers["team"]; + + placement[team][ placement[team].size ] = player; + } + + foreach( team in level.teams ) + { + level.placement[team] = placement[team]; + } +} + +getPlacementForPlayer( player ) //checked matches bo3 _globallogic.gsc within reason +{ + updatePlacement(); + + playerRank = -1; + placement = level.placement["all"]; + for ( placementIndex = 0; placementIndex < placement.size; placementIndex++ ) + { + if ( level.placement["all"][placementIndex] == player ) + { + playerRank = (placementIndex + 1); + break; + } + } + + return playerRank; +} + +sortDeadPlayers( team ) //checked matches bo3 _globallogic.gsc within reason +{ + // only need to sort if we are running queued respawn + if ( !level.playerQueuedRespawn ) + return; + + // sort by death time + for ( i = 1; i < level.deadPlayers[team].size; i++ ) + { + player = level.deadPlayers[team][i]; + for ( j = i - 1; j >= 0 && player.deathTime < level.deadPlayers[team][j].deathTime; j-- ) + level.deadPlayers[team][j + 1] = level.deadPlayers[team][j]; + level.deadPlayers[team][j + 1] = player; + } + + for ( i = 0; i < level.deadPlayers[team].size; i++ ) + { + if ( level.deadPlayers[team][i].spawnQueueIndex != i ) + { + level.spawnQueueModified[team] = true; + } + level.deadPlayers[team][i].spawnQueueIndex = i; + } +} + +totalAliveCount() //checked matches bo3 _globallogic.gsc within reason +{ + count = 0; + foreach( team in level.teams ) + { + count += level.aliveCount[team]; + } + return count; +} + +totalPlayerLives() //checked matches bo3 _globallogic.gsc within reason +{ + count = 0; + foreach( team in level.teams ) + { + count += level.playerLives[team]; + } + return count; +} + +totalPlayerCount() //doesn't exist in bo3 _globallogic.gsc leaving in +{ + count = 0; + foreach( team in level.teams ) + { + count += level.playerCount[team]; + } + return count; +} + +initTeamVariables( team ) //checked matches bo3 _globallogic.gsc within reason +{ + + if ( !isdefined( level.aliveCount ) ) + level.aliveCount = []; + + level.aliveCount[team] = 0; + level.lastAliveCount[team] = 0; + + level.everExisted[team] = false; + level.waveDelay[team] = 0; + level.lastWave[team] = 0; + level.wavePlayerSpawnIndex[team] = 0; + + resetTeamVariables( team ); +} + +resetTeamVariables( team ) //checked matches bo3 _globallogic.gsc within reason +{ + level.playerCount[team] = 0; + level.botsCount[team] = 0; + level.lastAliveCount[team] = level.aliveCount[team]; + level.aliveCount[team] = 0; + level.playerLives[team] = 0; + level.alivePlayers[team] = []; + level.deadPlayers[team] = []; + level.squads[team] = []; + level.spawnQueueModified[team] = false; +} + +updateTeamStatus() //checked matches bo3 _globallogic.gsc within reason changed at own discretion +{ + // run only once per frame, at the end of the frame. + level notify("updating_team_status"); + level endon("updating_team_status"); + level endon ( "game_ended" ); + waittillframeend; + + wait 0; // Required for Callback_PlayerDisconnect to complete before updateTeamStatus can execute + + if ( game["state"] == "postgame" ) + return; + + resetTimeout(); + + foreach( team in level.teams ) + { + resetTeamVariables( team ); + } + + level.activePlayers = []; + + players = level.players; + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + team = player.team; + class = player.class; + + if ( team != "spectator" && isDefined( class ) && class != "" ) + { + level.playerCount[team]++; + + if( isDefined( player.pers["isBot"] ) ) + level.botsCount[team]++; + + if ( player.sessionstate == "playing" ) + { + level.aliveCount[team]++; + level.playerLives[team]++; + player.spawnQueueIndex = -1; + + if ( isAlive( player ) ) + { + level.alivePlayers[team][level.alivePlayers[team].size] = player; + level.activeplayers[ level.activeplayers.size ] = player; + } + else + { + level.deadPlayers[team][level.deadPlayers[team].size] = player; + } + } + else + { + level.deadPlayers[team][level.deadPlayers[team].size] = player; + if ( player maps\mp\gametypes_zm\_globallogic_spawn::maySpawn() ) + level.playerLives[team]++; + } + } + } + + totalAlive = totalAliveCount(); + + if ( totalAlive > level.maxPlayerCount ) + level.maxPlayerCount = totalAlive; + + foreach( team in level.teams ) + { + if ( level.aliveCount[team] ) + level.everExisted[team] = true; + + sortDeadPlayers( team ); + } + + level updateGameEvents(); +} + +checkTeamScoreLimitSoon( team ) //checked matches bo3 _globallogic.gsc within reason +{ + //assert( IsDefined( team ) ); + + if ( level.scoreLimit <= 0 ) + return; + + if ( !level.teamBased ) + return; + + // Give the data a minute to converge/settle + if ( maps\mp\gametypes_zm\_globallogic_utils::getTimePassed() < ( 60 * 1000 ) ) + return; + + timeLeft = maps\mp\gametypes_zm\_globallogic_utils::getEstimatedTimeUntilScoreLimit( team ); + + if ( timeLeft < 1 ) + { + level notify( "match_ending_soon", "score" ); + // maps\mp\_gameadvertisement::teamScoreLimitSoon( true ); + } +} + +checkPlayerScoreLimitSoon() //checked matches bo3 _globallogic.gsc within reason +{ + //assert( IsPlayer( self ) ); + + if ( level.scoreLimit <= 0 ) + return; + + if ( level.teamBased ) + return; + + // Give the data a minute to converge/settle + if ( maps\mp\gametypes_zm\_globallogic_utils::getTimePassed() < ( 60 * 1000 ) ) + return; + + timeLeft = maps\mp\gametypes_zm\_globallogic_utils::getEstimatedTimeUntilScoreLimit( undefined ); + + if ( timeLeft < 1 ) + { + level notify( "match_ending_soon", "score" ); + // maps\mp\_gameadvertisement::teamScoreLimitSoon( true ); + } +} + +timeLimitClock() //checked doesn't exist in bo3 _globallogic.gsc leaving in +{ + level endon ( "game_ended" ); + + wait .05; + + clockObject = spawn( "script_origin", (0,0,0) ); + + while ( game["state"] == "playing" ) + { + if ( !level.timerStopped && level.timeLimit ) + { + timeLeft = maps\mp\gametypes_zm\_globallogic_utils::getTimeRemaining() / 1000; + timeLeftInt = int(timeLeft + 0.5); // adding .5 and flooring rounds it. + + if ( timeLeftInt == 601 ) + clientnotify ( "notify_10" ); + + if ( timeLeftInt == 301 ) + clientnotify ( "notify_5" ); + + if ( timeLeftInt == 60 ) + clientnotify ( "notify_1" ); + + if ( timeLeftInt == 12 ) + clientnotify ( "notify_count" ); + + if ( timeLeftInt >= 40 && timeLeftInt <= 60 ) + level notify ( "match_ending_soon", "time" ); + + if ( timeLeftInt >= 30 && timeLeftInt <= 40 ) + level notify ( "match_ending_pretty_soon", "time" ); + + if( timeLeftInt <= 32 ) + level notify ( "match_ending_vox" ); + + if ( (timeLeftInt <= 30 && timeLeftInt % 2 == 0) || timeLeftInt <= 10 ) + { + level notify ( "match_ending_very_soon", "time" ); + // don't play a tick at exactly 0 seconds, that's when something should be happening! + if ( timeLeftInt == 0 ) + break; + + clockObject playSound( "mpl_ui_timer_countdown" ); + } + + // synchronize to be exactly on the second + if ( timeLeft - floor(timeLeft) >= .05 ) + wait timeLeft - floor(timeLeft); + } + + wait ( 1.0 ); + } +} + +timeLimitClock_Intermission( waitTime ) //checked doesn't exist in bo3 _globallogic.gsc leaving in +{ + setGameEndTime( getTime() + int(waitTime*1000) ); + clockObject = spawn( "script_origin", (0,0,0) ); + + if ( waitTime >= 10.0 ) + wait ( waitTime - 10.0 ); + + for ( ;; ) + { + clockObject playSound( "mpl_ui_timer_countdown" ); + wait ( 1.0 ); + } +} + + +startGame() //checked matches bo3 _globallogic.gsc within reason +{ + thread maps\mp\gametypes_zm\_globallogic_utils::gameTimer(); + level.timerStopped = false; + // RF, disabled this, as it is not required anymore. + //thread maps\mp\gametypes_zm\_spawnlogic::spawnPerFrameUpdate(); + + SetMatchTalkFlag( "DeadChatWithDead", level.voip.deadChatWithDead ); + SetMatchTalkFlag( "DeadChatWithTeam", level.voip.deadChatWithTeam ); + SetMatchTalkFlag( "DeadHearTeamLiving", level.voip.deadHearTeamLiving ); + SetMatchTalkFlag( "DeadHearAllLiving", level.voip.deadHearAllLiving ); + SetMatchTalkFlag( "EveryoneHearsEveryone", level.voip.everyoneHearsEveryone ); + SetMatchTalkFlag( "DeadHearKiller", level.voip.deadHearKiller ); + SetMatchTalkFlag( "KillersHearVictim", level.voip.killersHearVictim ); + + prematchPeriod(); + level notify("prematch_over"); + + thread timeLimitClock(); + thread gracePeriod(); + thread watchMatchEndingSoon(); + + thread maps\mp\gametypes_zm\_globallogic_audio::musicController(); + +// thread maps\mp\gametypes_zm\_gametype_variants::onRoundBegin(); + + recordMatchBegin(); +} + + +waitForPlayers() //checked matches bo3 _globallogic.gsc within reason +{ + /* + if ( level.teamBased ) + while( !level.everExisted[ "axis" ] || !level.everExisted[ "allies" ] ) + wait ( 0.05 ); + else + while ( level.maxPlayerCount < 2 ) + wait ( 0.05 ); + */ +} + +prematchPeriod() //checked matches bo3 _globallogic.gsc within reason +{ + setMatchFlag( "hud_hardcore", level.hardcoreMode ); + + level endon( "game_ended" ); + + if ( level.prematchPeriod > 0 ) + { + thread matchStartTimer(); + + waitForPlayers(); + + wait ( level.prematchPeriod ); + } + else + { + matchStartTimerSkip(); + + wait 0.05; + } + + level.inPrematchPeriod = false; + + for ( index = 0; index < level.players.size; index++ ) + { + level.players[index] freeze_player_controls( false ); + level.players[index] enableWeapons(); + } + +// maps\mp\gametypes_zm\_wager::prematchPeriod(); + + if ( game["state"] != "playing" ) + return; +} + +gracePeriod() //checked matches bo3 _globallogic.gsc within reason +{ + level endon("game_ended"); + + if ( IsDefined( level.gracePeriodFunc ) ) + { + [[ level.gracePeriodFunc ]](); + } + else + { + wait ( level.gracePeriod ); + } + + level notify ( "grace_period_ending" ); + wait ( 0.05 ); + + level.inGracePeriod = false; + + if ( game["state"] != "playing" ) + return; + + if ( level.numLives ) + { + // Players on a team but without a weapon show as dead since they can not get in this round + players = level.players; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( !player.hasSpawned && player.sessionteam != "spectator" && !isAlive( player ) ) + player.statusicon = "hud_status_dead"; + } + } + + level thread updateTeamStatus(); +} + +watchMatchEndingSoon() //checked matches bo3 _globallogic.gsc within reason +{ + SetDvar( "xblive_matchEndingSoon", 0 ); + level waittill( "match_ending_soon", reason ); + SetDvar( "xblive_matchEndingSoon", 1 ); +} + +assertTeamVariables( ) //checked does not match bo3 _globallogic.gsc did not change +{ + // these are defined in the teamset file + if ( !level.createFX_enabled && !SessionModeIsZombiesGame() ) + { + foreach ( team in level.teams ) + { + /* + Assert( IsDefined( game["strings"][ team + "_win"] ) ); + Assert( IsDefined( game["strings"][ team + "_win_round"] ) ); + Assert( IsDefined( game["strings"][ team + "_mission_accomplished"] ) ); + Assert( IsDefined( game["strings"][ team + "_eliminated"] ) ); + Assert( IsDefined( game["strings"][ team + "_forfeited"] ) ); + Assert( IsDefined( game["strings"][ team + "_name"] ) ); + Assert( IsDefined( game["music"]["spawn_" + team] ) ); + Assert( IsDefined( game["music"]["victory_" + team] ) ); + Assert( IsDefined( game["icons"][team] ) ); + Assert( IsDefined( game["voice"][team] ) ); + */ + } + } +} + +anyTeamHasWaveDelay() //checked matches bo3 _globallogic.gsc within reason +{ + foreach ( team in level.teams ) + { + if ( level.waveDelay[team] ) + return true; + } + + return false; +} + +Callback_StartGameType() //checked matches bo3 _globallogic.gsc within reason +{ + level.prematchPeriod = 0; + level.intermission = false; + + setmatchflag( "cg_drawSpectatorMessages", 1 ); + setmatchflag( "game_ended", 0 ); + + if ( !isDefined( game["gamestarted"] ) ) + { + // defaults if not defined in level script + if ( !isDefined( game["allies"] ) ) + game["allies"] = "seals"; + if ( !isDefined( game["axis"] ) ) + game["axis"] = "pmc"; + if ( !isDefined( game["attackers"] ) ) + game["attackers"] = "allies"; + if ( !isDefined( game["defenders"] ) ) + game["defenders"] = "axis"; + + // if this hits the teams are not setup right + //assert( game["attackers"] != game["defenders"] ); + + // TODO MTEAM - need to update this valid team + foreach( team in level.teams ) + { + if ( !isDefined( game[team] ) ) + game[team] = "pmc"; + } + + if ( !isDefined( game["state"] ) ) + game["state"] = "playing"; + + precacheRumble( "damage_heavy" ); + precacheRumble( "damage_light" ); + + precacheShader( "white" ); + precacheShader( "black" ); + + makeDvarServerInfo( "scr_allies", "marines" ); + makeDvarServerInfo( "scr_axis", "nva" ); + + makeDvarServerInfo( "cg_thirdPersonAngle", 354 ); + + SetDvar( "cg_thirdPersonAngle", 354 ); + + game["strings"]["press_to_spawn"] = &"PLATFORM_PRESS_TO_SPAWN"; + if ( level.teamBased ) + { + game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_TEAMS"; + game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN"; + } + else + { + game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_PLAYERS"; + game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN"; + } + game["strings"]["match_starting_in"] = &"MP_MATCH_STARTING_IN"; + game["strings"]["spawn_next_round"] = &"MP_SPAWN_NEXT_ROUND"; + game["strings"]["waiting_to_spawn"] = &"MP_WAITING_TO_SPAWN"; + game["strings"]["waiting_to_spawn_ss"] = &"MP_WAITING_TO_SPAWN_SS"; + //game["strings"]["waiting_to_safespawn"] = &"MP_WAITING_TO_SAFESPAWN"; + game["strings"]["you_will_spawn"] = &"MP_YOU_WILL_RESPAWN"; + game["strings"]["match_starting"] = &"MP_MATCH_STARTING"; + game["strings"]["change_class"] = &"MP_CHANGE_CLASS_NEXT_SPAWN"; + game["strings"]["last_stand"] = &"MPUI_LAST_STAND"; + + game["strings"]["cowards_way"] = &"PLATFORM_COWARDS_WAY_OUT"; + + game["strings"]["tie"] = &"MP_MATCH_TIE"; + game["strings"]["round_draw"] = &"MP_ROUND_DRAW"; + + game["strings"]["enemies_eliminated"] = &"MP_ENEMIES_ELIMINATED"; + game["strings"]["score_limit_reached"] = &"MP_SCORE_LIMIT_REACHED"; + game["strings"]["round_limit_reached"] = &"MP_ROUND_LIMIT_REACHED"; + game["strings"]["time_limit_reached"] = &"MP_TIME_LIMIT_REACHED"; + game["strings"]["players_forfeited"] = &"MP_PLAYERS_FORFEITED"; + + //assertTeamVariables(); + + [[level.onPrecacheGameType]](); + + game["gamestarted"] = true; + + game["totalKills"] = 0; + + foreach( team in level.teams ) + { + game["teamScores"][team] = 0; + game["totalKillsTeam"][team] = 0; + } + + if ( !level.splitscreen && !isPreGame() ) + level.prematchPeriod = GetGametypeSetting( "prematchperiod" ); + + if ( GetDvarint( "xblive_clanmatch" ) != 0 ) + { + // TODO MTEAM is this code used anymore? + foreach( team in level.teams ) + { + game["icons"][team] = "composite_emblem_team_axis"; + } + + game["icons"]["allies"] = "composite_emblem_team_allies"; + game["icons"]["axis"] = "composite_emblem_team_axis"; + } + } + + if(!isdefined(game["timepassed"])) + game["timepassed"] = 0; + + if(!isdefined(game["roundsplayed"])) + game["roundsplayed"] = 0; + SetRoundsPlayed( game["roundsplayed"] ); + + if(!isdefined(game["roundwinner"] )) + game["roundwinner"] = []; + + if(!isdefined(game["roundswon"] )) + game["roundswon"] = []; + + if(!isdefined(game["roundswon"]["tie"] )) + game["roundswon"]["tie"] = 0; + + foreach ( team in level.teams ) + { + if(!isdefined(game["roundswon"][team] )) + game["roundswon"][team] = 0; + + level.teamSpawnPoints[team] = []; + level.spawn_point_team_class_names[team] = []; + } + + level.skipVote = false; + level.gameEnded = false; + SetDvar( "g_gameEnded", 0 ); + + level.objIDStart = 0; + level.forcedEnd = false; + level.hostForcedEnd = false; + + level.hardcoreMode = GetGametypeSetting( "hardcoreMode" ); + if ( level.hardcoreMode ) + { + logString( "game mode: hardcore" ); + + //set up friendly fire delay for hardcore + if( !isDefined(level.friendlyFireDelayTime) ) + level.friendlyFireDelayTime = 0; + } + + if ( GetDvar( "scr_max_rank" ) == "" ) + SetDvar( "scr_max_rank", "0" ); + level.rankCap = GetDvarint( "scr_max_rank" ); + + if ( GetDvar( "scr_min_prestige" ) == "" ) + { + SetDvar( "scr_min_prestige", "0" ); + } + level.minPrestige = GetDvarint( "scr_min_prestige" ); + + // this gets set to false when someone takes damage or a gametype-specific event happens. + level.useStartSpawns = true; + + level.roundScoreCarry = GetGametypeSetting( "roundscorecarry" ); + + level.allowHitMarkers = GetGametypeSetting( "allowhitmarkers" ); + level.playerQueuedRespawn = GetGametypeSetting( "playerQueuedRespawn" ); + level.playerForceRespawn = GetGametypeSetting( "playerForceRespawn" ); + + level.perksEnabled = GetGametypeSetting( "perksEnabled" ); + level.disableAttachments = GetGametypeSetting( "disableAttachments" ); + level.disableTacInsert = GetGametypeSetting( "disableTacInsert" ); + level.disableCAC = GetGametypeSetting( "disableCAC" ); + level.disableWeaponDrop = GetGametypeSetting( "disableweapondrop" ); + level.onlyHeadShots = GetGametypeSetting( "onlyHeadshots" ); + + // set to 0 to disable + level.minimumAllowedTeamKills = GetGametypeSetting( "teamKillPunishCount" ) - 1; // punishment starts at the next one + level.teamKillReducedPenalty = GetGametypeSetting( "teamKillReducedPenalty" ); + level.teamKillPointLoss = GetGametypeSetting( "teamKillPointLoss" ); + level.teamKillSpawnDelay = GetGametypeSetting( "teamKillSpawnDelay" ); + + level.deathPointLoss = GetGametypeSetting( "deathPointLoss" ); + level.leaderBonus = GetGametypeSetting( "leaderBonus" ); + level.forceRadar = GetGametypeSetting( "forceRadar" ); + level.playerSprintTime = GetGametypeSetting( "playerSprintTime" ); + level.bulletDamageScalar = GetGametypeSetting( "bulletDamageScalar" ); + + level.playerMaxHealth = GetGametypeSetting( "playerMaxHealth" ); + level.playerHealthRegenTime = GetGametypeSetting( "playerHealthRegenTime" ); + + level.playerRespawnDelay = GetGametypeSetting( "playerRespawnDelay" ); + level.playerObjectiveHeldRespawnDelay = GetGametypeSetting( "playerObjectiveHeldRespawnDelay" ); + level.waveRespawnDelay = GetGametypeSetting( "waveRespawnDelay" ); + + level.spectateType = GetGametypeSetting( "spectateType" ); + + level.voip = SpawnStruct(); + level.voip.deadChatWithDead = GetGametypeSetting( "voipDeadChatWithDead" ); + level.voip.deadChatWithTeam = GetGametypeSetting( "voipDeadChatWithTeam" ); + level.voip.deadHearAllLiving = GetGametypeSetting( "voipDeadHearAllLiving" ); + level.voip.deadHearTeamLiving = GetGametypeSetting( "voipDeadHearTeamLiving" ); + level.voip.everyoneHearsEveryone = GetGametypeSetting( "voipEveryoneHearsEveryone" ); + level.voip.deadHearKiller = GetGametypeSetting( "voipDeadHearKiller" ); + level.voip.killersHearVictim = GetGametypeSetting( "voipKillersHearVictim" ); + + if( GetDvar( "r_reflectionProbeGenerate" ) == "1" ) + level waittill( "eternity" ); + + if( SessionModeIsZombiesGame() ) + { + level.prematchPeriod = 0; + + + //thread maps\mp\gametypes_zm\_persistence::init(); + level.persistentDataInfo = []; + level.maxRecentStats = 10; + level.maxHitLocations = 19; + level.globalShotsFired = 0; + // thread maps\mp\gametypes_zm\_class::init(); + + + // thread maps\mp\gametypes_zm\_menus::init(); + thread maps\mp\gametypes_zm\_hud::init(); + thread maps\mp\gametypes_zm\_serversettings::init(); + thread maps\mp\gametypes_zm\_clientids::init(); + // thread maps\mp\teams\_teams::init(); + thread maps\mp\gametypes_zm\_weaponobjects::init(); + thread maps\mp\gametypes_zm\_scoreboard::init(); + // thread maps\mp\gametypes_zm\_killcam::init(); + thread maps\mp\gametypes_zm\_shellshock::init(); + // thread maps\mp\gametypes_zm\_deathicons::init(); + // thread maps\mp\gametypes_zm\_damagefeedback::init(); + thread maps\mp\gametypes_zm\_spectating::init(); + // thread maps\mp\gametypes_zm\_objpoints::init(); + thread maps\mp\gametypes_zm\_gameobjects::init(); + thread maps\mp\gametypes_zm\_spawnlogic::init(); + // thread maps\mp\gametypes_zm\_battlechatter_mp::init(); + // FIX ME thread maps\mp\killstreaks\_killstreaks::init(); + thread maps\mp\gametypes_zm\_globallogic_audio::init(); + //thread maps\mp\gametypes_zm\_wager::init(); + // thread maps\mp\gametypes_zm\_gametype_variants::init(); + //thread maps\mp\bots\_bot::init(); + //thread maps\mp\_decoy::init(); + } + +// if ( level.teamBased ) +// thread maps\mp\gametypes_zm\_friendicons::init(); + + thread maps\mp\gametypes_zm\_hud_message::init(); + //thread maps\mp\_multi_extracam::init(); + + stringNames = getArrayKeys( game["strings"] ); + for ( index = 0; index < stringNames.size; index++ ) + precacheString( game[ "strings" ][ stringNames[ index ] ] ); + + foreach( team in level.teams ) + { + initTeamVariables( team ); + } + + level.maxPlayerCount = 0; + level.activePlayers = []; + + level.allowAnnouncer = GetGametypeSetting( "allowAnnouncer" ); + + if ( !isDefined( level.timeLimit ) ) + registerTimeLimit( 1, 1440 ); + + if ( !isDefined( level.scoreLimit ) ) + registerScoreLimit( 1, 500 ); + + if ( !isDefined( level.roundLimit ) ) + registerRoundLimit( 0, 10 ); + + if ( !isDefined( level.roundWinLimit ) ) + registerRoundWinLimit( 0, 10 ); + + // The order the following functions are registered in are the order they will get called +// maps\mp\gametypes_zm\_globallogic_utils::registerPostRoundEvent( maps\mp\gametypes_zm\_killcam::postRoundFinalKillcam ); +// maps\mp\gametypes_zm\_globallogic_utils::registerPostRoundEvent( maps\mp\gametypes_zm\_wager::postRoundSideBet ); + + makeDvarServerInfo( "ui_scorelimit" ); + makeDvarServerInfo( "ui_timelimit" ); + makeDvarServerInfo( "ui_allow_classchange", GetDvar( "ui_allow_classchange" ) ); + + waveDelay = level.waveRespawnDelay; + if ( waveDelay && !isPreGame() ) + { + foreach ( team in level.teams ) + { + level.waveDelay[team] = waveDelay; + level.lastWave[team] = 0; + } + + level thread [[level.waveSpawnTimer]](); + } + + level.inPrematchPeriod = true; + + if ( level.prematchPeriod > 2.0 ) + level.prematchPeriod = level.prematchPeriod + (randomFloat( 4 ) - 2); // live host obfuscation + + if ( level.numLives || anyTeamHasWaveDelay() || level.playerQueuedRespawn ) + level.gracePeriod = 15; + else + level.gracePeriod = 5; + + level.inGracePeriod = true; + + level.roundEndDelay = 5; + level.halftimeRoundEndDelay = 3; + + maps\mp\gametypes_zm\_globallogic_score::updateAllTeamScores(); + + level.killstreaksenabled = 1; + + if ( GetDvar( "scr_game_rankenabled" ) == "" ) + SetDvar( "scr_game_rankenabled", true ); + level.rankEnabled = GetDvarint( "scr_game_rankenabled" ); + + if ( GetDvar( "scr_game_medalsenabled" ) == "" ) + SetDvar( "scr_game_medalsenabled", true ); + level.medalsEnabled = GetDvarint( "scr_game_medalsenabled" ); + + if( level.hardcoreMode && level.rankedMatch && GetDvar( "scr_game_friendlyFireDelay" ) == "" ) + SetDvar( "scr_game_friendlyFireDelay", true ); + level.friendlyFireDelay = GetDvarint( "scr_game_friendlyFireDelay" ); + + // level gametype and features globals should be defaulted before this, and level.onstartgametype should reset them if desired + if(GetDvar("createfx") == "") + { + [[level.onStartGameType]](); + } + + // disable killstreaks for custom game modes + if( GetDvarInt( "custom_killstreak_mode" ) == 1 ) + { + level.killstreaksenabled = 0; + } + + // this must be after onstartgametype for scr_showspawns to work when set at start of game +// /# +// thread maps\mp\gametypes_zm\_dev::init(); +// #/ + /* /# - assert( level.placement["all"].size == numplayers - 1 ); + PrintLn( "Globallogic Callback_StartGametype() isPregame() = " + isPregame() + "\n" ); #/ + */ + //level thread maps\mp\gametypes_zm\_killcam::doFinalKillcam(); + + thread startGame(); + level thread updateGameTypeDvars(); + /* /# - maps\mp\gametypes_zm\_globallogic_utils::assertproperplacement(); + if( GetDvarint( "scr_writeconfigstrings" ) == 1 ) + { + level.skipGameEnd = true; + level.roundLimit = 1; + + // let things settle + wait(1); +// level.forcedEnd = true; + thread forceEnd( false ); +// thread endgame( "tie","" ); + } + if( GetDvarint( "scr_hostmigrationtest" ) == 1 ) + { + thread ForceDebugHostMigration(); + } #/ - updateteamplacement(); + */ +} - if ( level.teambased ) - return; - numplayers = level.placement["all"].size; - for ( i = 0; i < numplayers; i++ ) - { - player = level.placement["all"][i]; - player notify( "update_outcome" ); - } -} - -updateplacement() +ForceDebugHostMigration() //doesn't exist in bo3 _globallogic.gsc leaving in { - if ( !level.players.size ) - return; - - level.placement["all"] = []; - - for ( index = 0; index < level.players.size; index++ ) - { - if ( isdefined( level.teams[level.players[index].team] ) ) - level.placement["all"][level.placement["all"].size] = level.players[index]; - } - - placementall = level.placement["all"]; - - for ( i = 1; i < placementall.size; i++ ) - { - player = placementall[i]; - playerscore = player.score; - - for ( j = i - 1; j >= 0 && ( playerscore > placementall[j].score || playerscore == placementall[j].score && player.deaths < placementall[j].deaths ); j-- ) - placementall[j + 1] = placementall[j]; - - placementall[j + 1] = player; - } - - level.placement["all"] = placementall; -/# - maps\mp\gametypes_zm\_globallogic_utils::assertproperplacement(); -#/ - updateteamplacement(); + /* + /# + while (1) + { + maps\mp\gametypes_zm\_hostmigration::waitTillHostMigrationDone(); + wait(60); + starthostmigration(); + maps\mp\gametypes_zm\_hostmigration::waitTillHostMigrationDone(); + //thread forceEnd( false ); + } + #/ + */ } -updateteamplacement() + +registerFriendlyFireDelay( dvarString, defaultValue, minValue, maxValue ) //checked matches bo3 _globallogic.gsc within reason { - foreach ( team in level.teams ) - placement[team] = []; + dvarString = ("scr_" + dvarString + "_friendlyFireDelayTime"); + if ( getDvar( dvarString ) == "" ) + { + setDvar( dvarString, defaultValue ); + } + + if ( getDvarInt( dvarString ) > maxValue ) + { + setDvar( dvarString, maxValue ); + } + else if ( getDvarInt( dvarString ) < minValue ) + { + setDvar( dvarString, minValue ); + } - placement["spectator"] = []; - - if ( !level.teambased ) - return; - - placementall = level.placement["all"]; - placementallsize = placementall.size; - - for ( i = 0; i < placementallsize; i++ ) - { - player = placementall[i]; - - if ( isdefined( player ) ) - { - team = player.pers["team"]; - placement[team][placement[team].size] = player; - } - } - - foreach ( team in level.teams ) - level.placement[team] = placement[team]; + level.friendlyFireDelayTime = getDvarInt( dvarString ); } -getplacementforplayer( player ) +checkRoundSwitch() //checked matches bo3 _globallogic.gsc within reason { - updateplacement(); - playerrank = -1; - placement = level.placement["all"]; - - for ( placementindex = 0; placementindex < placement.size; placementindex++ ) - { - if ( level.placement["all"][placementindex] == player ) - { - playerrank = placementindex + 1; - break; - } - } - - return playerrank; + if ( !isdefined( level.roundSwitch ) || !level.roundSwitch ) + { + return false; + } + if ( !isdefined( level.onRoundSwitch ) ) + { + return false; + } + + //assert( game["roundsplayed"] > 0 ); + + if ( game["roundsplayed"] % level.roundswitch == 0 ) + { + [[level.onRoundSwitch]](); + return true; + } + + return false; } -sortdeadplayers( team ) + +listenForGameEnd() //checked matches bo3 _globallogic.gsc within reason { - if ( !level.playerqueuedrespawn ) - return; + self waittill( "host_sucks_end_game" ); + //if ( level.console ) + // endparty(); + level.skipVote = true; - for ( i = 1; i < level.deadplayers[team].size; i++ ) - { - player = level.deadplayers[team][i]; - - for ( j = i - 1; j >= 0 && player.deathtime < level.deadplayers[team][j].deathtime; j-- ) - level.deadplayers[team][j + 1] = level.deadplayers[team][j]; - - level.deadplayers[team][j + 1] = player; - } - - for ( i = 0; i < level.deadplayers[team].size; i++ ) - { - if ( level.deadplayers[team][i].spawnqueueindex != i ) - level.spawnqueuemodified[team] = 1; - - level.deadplayers[team][i].spawnqueueindex = i; - } + if ( !level.gameEnded ) + { + level thread maps\mp\gametypes_zm\_globallogic::forceEnd(true); + } } -totalalivecount() + +getKillStreaks( player ) //checked matches bo3 _globallogic.gsc within reason { - count = 0; - - foreach ( team in level.teams ) - count += level.alivecount[team]; - - return count; + for ( killstreakNum = 0; killstreakNum < level.maxKillstreaks; killstreakNum++ ) + { + killstreak[ killstreakNum ] = "killstreak_null"; + } + + if ( isPlayer( player ) && !level.oldschool && ( level.disableCAC != 1 ) && + !isdefined( player.pers["isBot"] ) && isdefined(player.killstreak ) ) + { + currentKillstreak = 0; + for ( killstreakNum = 0; killstreakNum < level.maxKillstreaks; killstreakNum++ ) + { + if ( isDefined( player.killstreak[ killstreakNum ] ) ) + { + killstreak[ currentKillstreak ] = player.killstreak[ killstreakNum ]; + currentKillstreak++; + } + } + } + + return killstreak; } -totalplayerlives() +updateRankedMatch(winner) //checked matches bo3 _globallogic.gsc within reason { - count = 0; - - foreach ( team in level.teams ) - count += level.playerlives[team]; - - return count; + if ( level.rankedMatch ) + { + if ( hostIdledOut() ) + { + level.hostForcedEnd = true; + logString( "host idled out" ); + endLobby(); + } + } + if ( !level.wagerMatch && !SessionModeIsZombiesGame() ) + { + maps\mp\gametypes_zm\_globallogic_score::updateMatchBonusScores( winner ); + maps\mp\gametypes_zm\_globallogic_score::updateWinLossStats( winner ); + } } -totalplayercount() -{ - count = 0; - foreach ( team in level.teams ) - count += level.playercount[team]; - return count; -} - -initteamvariables( team ) -{ - if ( !isdefined( level.alivecount ) ) - level.alivecount = []; - - level.alivecount[team] = 0; - level.lastalivecount[team] = 0; - level.everexisted[team] = 0; - level.wavedelay[team] = 0; - level.lastwave[team] = 0; - level.waveplayerspawnindex[team] = 0; - resetteamvariables( team ); -} - -resetteamvariables( team ) -{ - level.playercount[team] = 0; - level.botscount[team] = 0; - level.lastalivecount[team] = level.alivecount[team]; - level.alivecount[team] = 0; - level.playerlives[team] = 0; - level.aliveplayers[team] = []; - level.deadplayers[team] = []; - level.squads[team] = []; - level.spawnqueuemodified[team] = 0; -} - -updateteamstatus() -{ - level notify( "updating_team_status" ); - level endon( "updating_team_status" ); - level endon( "game_ended" ); - waittillframeend; - wait 0; - - if ( game["state"] == "postgame" ) - return; - - resettimeout(); - - foreach ( team in level.teams ) - resetteamvariables( team ); - - level.activeplayers = []; - players = level.players; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( !isdefined( player ) && level.splitscreen ) - continue; - - team = player.team; - class = player.class; - - if ( team != "spectator" && ( isdefined( class ) && class != "" ) ) - { - level.playercount[team]++; - - if ( isdefined( player.pers["isBot"] ) ) - level.botscount[team]++; - - if ( player.sessionstate == "playing" ) - { - level.alivecount[team]++; - level.playerlives[team]++; - player.spawnqueueindex = -1; - - if ( isalive( player ) ) - { - level.aliveplayers[team][level.aliveplayers[team].size] = player; - level.activeplayers[level.activeplayers.size] = player; - } - else - level.deadplayers[team][level.deadplayers[team].size] = player; - - continue; - } - - level.deadplayers[team][level.deadplayers[team].size] = player; - - if ( player maps\mp\gametypes_zm\_globallogic_spawn::mayspawn() ) - level.playerlives[team]++; - } - } - - totalalive = totalalivecount(); - - if ( totalalive > level.maxplayercount ) - level.maxplayercount = totalalive; - - foreach ( team in level.teams ) - { - if ( level.alivecount[team] ) - level.everexisted[team] = 1; - - sortdeadplayers( team ); - } - - level updategameevents(); -} - -checkteamscorelimitsoon( team ) -{ -/# - assert( isdefined( team ) ); -#/ - if ( level.scorelimit <= 0 ) - return; - - if ( !level.teambased ) - return; - - if ( maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() < 60000 ) - return; - - timeleft = maps\mp\gametypes_zm\_globallogic_utils::getestimatedtimeuntilscorelimit( team ); - - if ( timeleft < 1 ) - level notify( "match_ending_soon", "score" ); -} - -checkplayerscorelimitsoon() -{ -/# - assert( isplayer( self ) ); -#/ - if ( level.scorelimit <= 0 ) - return; - - if ( level.teambased ) - return; - - if ( maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() < 60000 ) - return; - - timeleft = maps\mp\gametypes_zm\_globallogic_utils::getestimatedtimeuntilscorelimit( undefined ); - - if ( timeleft < 1 ) - level notify( "match_ending_soon", "score" ); -} - -timelimitclock() -{ - level endon( "game_ended" ); - wait 0.05; - clockobject = spawn( "script_origin", ( 0, 0, 0 ) ); - - while ( game["state"] == "playing" ) - { - if ( !level.timerstopped && level.timelimit ) - { - timeleft = maps\mp\gametypes_zm\_globallogic_utils::gettimeremaining() / 1000; - timeleftint = int( timeleft + 0.5 ); - - if ( timeleftint == 601 ) - clientnotify( "notify_10" ); - - if ( timeleftint == 301 ) - clientnotify( "notify_5" ); - - if ( timeleftint == 60 ) - clientnotify( "notify_1" ); - - if ( timeleftint == 12 ) - clientnotify( "notify_count" ); - - if ( timeleftint >= 40 && timeleftint <= 60 ) - level notify( "match_ending_soon", "time" ); - - if ( timeleftint >= 30 && timeleftint <= 40 ) - level notify( "match_ending_pretty_soon", "time" ); - - if ( timeleftint <= 32 ) - level notify( "match_ending_vox" ); - - if ( timeleftint <= 10 || timeleftint <= 30 && timeleftint % 2 == 0 ) - { - level notify( "match_ending_very_soon", "time" ); - - if ( timeleftint == 0 ) - break; - - clockobject playsound( "mpl_ui_timer_countdown" ); - } - - if ( timeleft - floor( timeleft ) >= 0.05 ) - wait( timeleft - floor( timeleft ) ); - } - - wait 1.0; - } -} - -timelimitclock_intermission( waittime ) -{ - setgameendtime( gettime() + int( waittime * 1000 ) ); - clockobject = spawn( "script_origin", ( 0, 0, 0 ) ); - - if ( waittime >= 10.0 ) - wait( waittime - 10.0 ); - - for (;;) - { - clockobject playsound( "mpl_ui_timer_countdown" ); - wait 1.0; - } -} - -startgame() -{ - thread maps\mp\gametypes_zm\_globallogic_utils::gametimer(); - level.timerstopped = 0; - setmatchtalkflag( "DeadChatWithDead", level.voip.deadchatwithdead ); - setmatchtalkflag( "DeadChatWithTeam", level.voip.deadchatwithteam ); - setmatchtalkflag( "DeadHearTeamLiving", level.voip.deadhearteamliving ); - setmatchtalkflag( "DeadHearAllLiving", level.voip.deadhearallliving ); - setmatchtalkflag( "EveryoneHearsEveryone", level.voip.everyonehearseveryone ); - setmatchtalkflag( "DeadHearKiller", level.voip.deadhearkiller ); - setmatchtalkflag( "KillersHearVictim", level.voip.killershearvictim ); - prematchperiod(); - level notify( "prematch_over" ); - thread timelimitclock(); - thread graceperiod(); - thread watchmatchendingsoon(); - thread maps\mp\gametypes_zm\_globallogic_audio::musiccontroller(); - recordmatchbegin(); -} - -waitforplayers() -{ - -} - -prematchperiod() -{ - setmatchflag( "hud_hardcore", level.hardcoremode ); - level endon( "game_ended" ); - - if ( level.prematchperiod > 0 ) - { - thread matchstarttimer(); - waitforplayers(); - wait( level.prematchperiod ); - } - else - { - matchstarttimerskip(); - wait 0.05; - } - - level.inprematchperiod = 0; - - for ( index = 0; index < level.players.size; index++ ) - { - level.players[index] freeze_player_controls( 0 ); - level.players[index] enableweapons(); - } - - if ( game["state"] != "playing" ) - return; -} - -graceperiod() -{ - level endon( "game_ended" ); - - if ( isdefined( level.graceperiodfunc ) ) - [[ level.graceperiodfunc ]](); - else - wait( level.graceperiod ); - - level notify( "grace_period_ending" ); - wait 0.05; - level.ingraceperiod = 0; - - if ( game["state"] != "playing" ) - return; - - if ( level.numlives ) - { - players = level.players; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( !player.hasspawned && player.sessionteam != "spectator" && !isalive( player ) ) - player.statusicon = "hud_status_dead"; - } - } - - level thread updateteamstatus(); -} - -watchmatchendingsoon() -{ - setdvar( "xblive_matchEndingSoon", 0 ); - - level waittill( "match_ending_soon", reason ); - - setdvar( "xblive_matchEndingSoon", 1 ); -} - -assertteamvariables() -{ - if ( !level.createfx_enabled && !sessionmodeiszombiesgame() ) - { - foreach ( team in level.teams ) - { -/# - assert( isdefined( game["strings"][team + "_win"] ) ); -#/ -/# - assert( isdefined( game["strings"][team + "_win_round"] ) ); -#/ -/# - assert( isdefined( game["strings"][team + "_mission_accomplished"] ) ); -#/ -/# - assert( isdefined( game["strings"][team + "_eliminated"] ) ); -#/ -/# - assert( isdefined( game["strings"][team + "_forfeited"] ) ); -#/ -/# - assert( isdefined( game["strings"][team + "_name"] ) ); -#/ -/# - assert( isdefined( game["music"]["spawn_" + team] ) ); -#/ -/# - assert( isdefined( game["music"]["victory_" + team] ) ); -#/ -/# - assert( isdefined( game["icons"][team] ) ); -#/ -/# - assert( isdefined( game["voice"][team] ) ); -#/ - } - } -} - -anyteamhaswavedelay() -{ - foreach ( team in level.teams ) - { - if ( level.wavedelay[team] ) - return true; - } - - return false; -} - -callback_startgametype() -{ - level.prematchperiod = 0; - level.intermission = 0; - setmatchflag( "cg_drawSpectatorMessages", 1 ); - setmatchflag( "game_ended", 0 ); - - if ( !isdefined( game["gamestarted"] ) ) - { - if ( !isdefined( game["allies"] ) ) - game["allies"] = "seals"; - - if ( !isdefined( game["axis"] ) ) - game["axis"] = "pmc"; - - if ( !isdefined( game["attackers"] ) ) - game["attackers"] = "allies"; - - if ( !isdefined( game["defenders"] ) ) - game["defenders"] = "axis"; -/# - assert( game["attackers"] != game["defenders"] ); -#/ - foreach ( team in level.teams ) - { - if ( !isdefined( game[team] ) ) - game[team] = "pmc"; - } - - if ( !isdefined( game["state"] ) ) - game["state"] = "playing"; - - precacherumble( "damage_heavy" ); - precacherumble( "damage_light" ); - precacheshader( "white" ); - precacheshader( "black" ); - makedvarserverinfo( "scr_allies", "marines" ); - makedvarserverinfo( "scr_axis", "nva" ); - makedvarserverinfo( "cg_thirdPersonAngle", 354 ); - setdvar( "cg_thirdPersonAngle", 354 ); - game["strings"]["press_to_spawn"] = &"PLATFORM_PRESS_TO_SPAWN"; - - if ( level.teambased ) - { - game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_TEAMS"; - game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN"; - } - else - { - game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_PLAYERS"; - game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN"; - } - - game["strings"]["match_starting_in"] = &"MP_MATCH_STARTING_IN"; - game["strings"]["spawn_next_round"] = &"MP_SPAWN_NEXT_ROUND"; - game["strings"]["waiting_to_spawn"] = &"MP_WAITING_TO_SPAWN"; - game["strings"]["waiting_to_spawn_ss"] = &"MP_WAITING_TO_SPAWN_SS"; - game["strings"]["you_will_spawn"] = &"MP_YOU_WILL_RESPAWN"; - game["strings"]["match_starting"] = &"MP_MATCH_STARTING"; - game["strings"]["change_class"] = &"MP_CHANGE_CLASS_NEXT_SPAWN"; - game["strings"]["last_stand"] = &"MPUI_LAST_STAND"; - game["strings"]["cowards_way"] = &"PLATFORM_COWARDS_WAY_OUT"; - game["strings"]["tie"] = &"MP_MATCH_TIE"; - game["strings"]["round_draw"] = &"MP_ROUND_DRAW"; - game["strings"]["enemies_eliminated"] = &"MP_ENEMIES_ELIMINATED"; - game["strings"]["score_limit_reached"] = &"MP_SCORE_LIMIT_REACHED"; - game["strings"]["round_limit_reached"] = &"MP_ROUND_LIMIT_REACHED"; - game["strings"]["time_limit_reached"] = &"MP_TIME_LIMIT_REACHED"; - game["strings"]["players_forfeited"] = &"MP_PLAYERS_FORFEITED"; - assertteamvariables(); - [[ level.onprecachegametype ]](); - game["gamestarted"] = 1; - game["totalKills"] = 0; - - foreach ( team in level.teams ) - { - game["teamScores"][team] = 0; - game["totalKillsTeam"][team] = 0; - } - - if ( !level.splitscreen && !ispregame() ) - level.prematchperiod = getgametypesetting( "prematchperiod" ); - - if ( getdvarint( "xblive_clanmatch" ) != 0 ) - { - foreach ( team in level.teams ) - game["icons"][team] = "composite_emblem_team_axis"; - - game["icons"]["allies"] = "composite_emblem_team_allies"; - game["icons"]["axis"] = "composite_emblem_team_axis"; - } - } - - if ( !isdefined( game["timepassed"] ) ) - game["timepassed"] = 0; - - if ( !isdefined( game["roundsplayed"] ) ) - game["roundsplayed"] = 0; - - setroundsplayed( game["roundsplayed"] ); - - if ( !isdefined( game["roundwinner"] ) ) - game["roundwinner"] = []; - - if ( !isdefined( game["roundswon"] ) ) - game["roundswon"] = []; - - if ( !isdefined( game["roundswon"]["tie"] ) ) - game["roundswon"]["tie"] = 0; - - foreach ( team in level.teams ) - { - if ( !isdefined( game["roundswon"][team] ) ) - game["roundswon"][team] = 0; - - level.teamspawnpoints[team] = []; - level.spawn_point_team_class_names[team] = []; - } - - level.skipvote = 0; - level.gameended = 0; - setdvar( "g_gameEnded", 0 ); - level.objidstart = 0; - level.forcedend = 0; - level.hostforcedend = 0; - level.hardcoremode = getgametypesetting( "hardcoreMode" ); - - if ( level.hardcoremode ) - { - logstring( "game mode: hardcore" ); - - if ( !isdefined( level.friendlyfiredelaytime ) ) - level.friendlyfiredelaytime = 0; - } - - if ( getdvar( "scr_max_rank" ) == "" ) - setdvar( "scr_max_rank", "0" ); - - level.rankcap = getdvarint( "scr_max_rank" ); - - if ( getdvar( "scr_min_prestige" ) == "" ) - setdvar( "scr_min_prestige", "0" ); - - level.minprestige = getdvarint( "scr_min_prestige" ); - level.usestartspawns = 1; - level.roundscorecarry = getgametypesetting( "roundscorecarry" ); - level.allowhitmarkers = getgametypesetting( "allowhitmarkers" ); - level.playerqueuedrespawn = getgametypesetting( "playerQueuedRespawn" ); - level.playerforcerespawn = getgametypesetting( "playerForceRespawn" ); - level.perksenabled = getgametypesetting( "perksEnabled" ); - level.disableattachments = getgametypesetting( "disableAttachments" ); - level.disabletacinsert = getgametypesetting( "disableTacInsert" ); - level.disablecac = getgametypesetting( "disableCAC" ); - level.disableweapondrop = getgametypesetting( "disableweapondrop" ); - level.onlyheadshots = getgametypesetting( "onlyHeadshots" ); - level.minimumallowedteamkills = getgametypesetting( "teamKillPunishCount" ) - 1; - level.teamkillreducedpenalty = getgametypesetting( "teamKillReducedPenalty" ); - level.teamkillpointloss = getgametypesetting( "teamKillPointLoss" ); - level.teamkillspawndelay = getgametypesetting( "teamKillSpawnDelay" ); - level.deathpointloss = getgametypesetting( "deathPointLoss" ); - level.leaderbonus = getgametypesetting( "leaderBonus" ); - level.forceradar = getgametypesetting( "forceRadar" ); - level.playersprinttime = getgametypesetting( "playerSprintTime" ); - level.bulletdamagescalar = getgametypesetting( "bulletDamageScalar" ); - level.playermaxhealth = getgametypesetting( "playerMaxHealth" ); - level.playerhealthregentime = getgametypesetting( "playerHealthRegenTime" ); - level.playerrespawndelay = getgametypesetting( "playerRespawnDelay" ); - level.playerobjectiveheldrespawndelay = getgametypesetting( "playerObjectiveHeldRespawnDelay" ); - level.waverespawndelay = getgametypesetting( "waveRespawnDelay" ); - level.spectatetype = getgametypesetting( "spectateType" ); - level.voip = spawnstruct(); - level.voip.deadchatwithdead = getgametypesetting( "voipDeadChatWithDead" ); - level.voip.deadchatwithteam = getgametypesetting( "voipDeadChatWithTeam" ); - level.voip.deadhearallliving = getgametypesetting( "voipDeadHearAllLiving" ); - level.voip.deadhearteamliving = getgametypesetting( "voipDeadHearTeamLiving" ); - level.voip.everyonehearseveryone = getgametypesetting( "voipEveryoneHearsEveryone" ); - level.voip.deadhearkiller = getgametypesetting( "voipDeadHearKiller" ); - level.voip.killershearvictim = getgametypesetting( "voipKillersHearVictim" ); - - if ( getdvar( "r_reflectionProbeGenerate" ) == "1" ) - level waittill( "eternity" ); - - if ( sessionmodeiszombiesgame() ) - { - level.prematchperiod = 0; - level.persistentdatainfo = []; - level.maxrecentstats = 10; - level.maxhitlocations = 19; - level.globalshotsfired = 0; - thread maps\mp\gametypes_zm\_hud::init(); - thread maps\mp\gametypes_zm\_serversettings::init(); - thread maps\mp\gametypes_zm\_clientids::init(); - thread maps\mp\gametypes_zm\_weaponobjects::init(); - thread maps\mp\gametypes_zm\_scoreboard::init(); - thread maps\mp\gametypes_zm\_shellshock::init(); - thread maps\mp\gametypes_zm\_spectating::init(); - thread maps\mp\gametypes_zm\_gameobjects::init(); - thread maps\mp\gametypes_zm\_spawnlogic::init(); - thread maps\mp\gametypes_zm\_globallogic_audio::init(); - } - - thread maps\mp\gametypes_zm\_hud_message::init(); - stringnames = getarraykeys( game["strings"] ); - - for ( index = 0; index < stringnames.size; index++ ) - precachestring( game["strings"][stringnames[index]] ); - - foreach ( team in level.teams ) - initteamvariables( team ); - - level.maxplayercount = 0; - level.activeplayers = []; - level.allowannouncer = getgametypesetting( "allowAnnouncer" ); - - if ( !isdefined( level.timelimit ) ) - registertimelimit( 1, 1440 ); - - if ( !isdefined( level.scorelimit ) ) - registerscorelimit( 1, 500 ); - - if ( !isdefined( level.roundlimit ) ) - registerroundlimit( 0, 10 ); - - if ( !isdefined( level.roundwinlimit ) ) - registerroundwinlimit( 0, 10 ); - - makedvarserverinfo( "ui_scorelimit" ); - makedvarserverinfo( "ui_timelimit" ); - makedvarserverinfo( "ui_allow_classchange", getdvar( "ui_allow_classchange" ) ); - wavedelay = level.waverespawndelay; - - if ( wavedelay && !ispregame() ) - { - foreach ( team in level.teams ) - { - level.wavedelay[team] = wavedelay; - level.lastwave[team] = 0; - } - - level thread [[ level.wavespawntimer ]](); - } - - level.inprematchperiod = 1; - - if ( level.prematchperiod > 2.0 ) - level.prematchperiod += randomfloat( 4 ) - 2; - - if ( level.numlives || anyteamhaswavedelay() || level.playerqueuedrespawn ) - level.graceperiod = 15; - else - level.graceperiod = 5; - - level.ingraceperiod = 1; - level.roundenddelay = 5; - level.halftimeroundenddelay = 3; - maps\mp\gametypes_zm\_globallogic_score::updateallteamscores(); - level.killstreaksenabled = 1; - - if ( getdvar( "scr_game_rankenabled" ) == "" ) - setdvar( "scr_game_rankenabled", 1 ); - - level.rankenabled = getdvarint( "scr_game_rankenabled" ); - - if ( getdvar( "scr_game_medalsenabled" ) == "" ) - setdvar( "scr_game_medalsenabled", 1 ); - - level.medalsenabled = getdvarint( "scr_game_medalsenabled" ); - - if ( level.hardcoremode && level.rankedmatch && getdvar( "scr_game_friendlyFireDelay" ) == "" ) - setdvar( "scr_game_friendlyFireDelay", 1 ); - - level.friendlyfiredelay = getdvarint( "scr_game_friendlyFireDelay" ); - - if ( getdvar( "createfx" ) == "" ) - [[ level.onstartgametype ]](); - - if ( getdvarint( _hash_826EB3B9 ) == 1 ) - level.killstreaksenabled = 0; -/# - thread maps\mp\gametypes_zm\_dev::init(); -#/ -/# - println( "Globallogic Callback_StartGametype() isPregame() = " + ispregame() + "\n" ); -#/ - thread startgame(); - level thread updategametypedvars(); -/# - if ( getdvarint( "scr_writeConfigStrings" ) == 1 ) - { - level.skipgameend = 1; - level.roundlimit = 1; - wait 1; - thread forceend( 0 ); - } - - if ( getdvarint( "scr_hostmigrationtest" ) == 1 ) - thread forcedebughostmigration(); -#/ -} - -forcedebughostmigration() -{ -/# - while ( true ) - { - maps\mp\gametypes_zm\_hostmigration::waittillhostmigrationdone(); - wait 60; - starthostmigration(); - maps\mp\gametypes_zm\_hostmigration::waittillhostmigrationdone(); - } -#/ -} - -registerfriendlyfiredelay( dvarstring, defaultvalue, minvalue, maxvalue ) -{ - dvarstring = "scr_" + dvarstring + "_friendlyFireDelayTime"; - - if ( getdvar( dvarstring ) == "" ) - setdvar( dvarstring, defaultvalue ); - - if ( getdvarint( dvarstring ) > maxvalue ) - setdvar( dvarstring, maxvalue ); - else if ( getdvarint( dvarstring ) < minvalue ) - setdvar( dvarstring, minvalue ); - - level.friendlyfiredelaytime = getdvarint( dvarstring ); -} - -checkroundswitch() -{ - if ( !isdefined( level.roundswitch ) || !level.roundswitch ) - return false; - - if ( !isdefined( level.onroundswitch ) ) - return false; -/# - assert( game["roundsplayed"] > 0 ); -#/ - if ( game["roundsplayed"] % level.roundswitch == 0 ) - { - [[ level.onroundswitch ]](); - return true; - } - - return false; -} - -listenforgameend() -{ - self waittill( "host_sucks_end_game" ); - - level.skipvote = 1; - - if ( !level.gameended ) - level thread maps\mp\gametypes_zm\_globallogic::forceend( 1 ); -} - -getkillstreaks( player ) -{ - for ( killstreaknum = 0; killstreaknum < level.maxkillstreaks; killstreaknum++ ) - killstreak[killstreaknum] = "killstreak_null"; - - if ( isplayer( player ) && !level.oldschool && level.disablecac != 1 && ( !isdefined( player.pers["isBot"] ) && isdefined( player.killstreak ) ) ) - { - currentkillstreak = 0; - - for ( killstreaknum = 0; killstreaknum < level.maxkillstreaks; killstreaknum++ ) - { - if ( isdefined( player.killstreak[killstreaknum] ) ) - { - killstreak[currentkillstreak] = player.killstreak[killstreaknum]; - currentkillstreak++; - } - } - } - - return killstreak; -} - -updaterankedmatch( winner ) -{ - if ( level.rankedmatch ) - { - if ( hostidledout() ) - { - level.hostforcedend = 1; - logstring( "host idled out" ); - endlobby(); - } - } - - if ( !level.wagermatch && !sessionmodeiszombiesgame() ) - { - maps\mp\gametypes_zm\_globallogic_score::updatematchbonusscores( winner ); - maps\mp\gametypes_zm\_globallogic_score::updatewinlossstats( winner ); - } -} diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_actor.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_actor.gsc index 9fe10ee..d572446 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_actor.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_actor.gsc @@ -1,174 +1,204 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_globallogic_player; -#include maps\mp\gametypes_zm\_globallogic_utils; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\gametypes_zm\_damagefeedback; -#include maps\mp\_challenges; +//checked includes match cerberus output +#include maps/mp/_challenges; +#include maps/mp/gametypes_zm/_damagefeedback; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/gametypes_zm/_globallogic_utils; +#include maps/mp/gametypes_zm/_globallogic_player; +#include maps/mp/_utility; -callback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) +callback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked changed to match cerberus output { - if ( game["state"] == "postgame" ) - return; - - if ( self.aiteam == "spectator" ) - return; - - if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat ) - return; - - self.idflags = idflags; - self.idflagstime = gettime(); - eattacker = maps\mp\gametypes_zm\_globallogic_player::figureoutattacker( eattacker ); - - if ( !isdefined( vdir ) ) - idflags |= level.idflags_no_knockback; - - friendly = 0; - - if ( self.health == self.maxhealth || !isdefined( self.attackers ) ) - { - self.attackers = []; - self.attackerdata = []; - self.attackerdamage = []; - } - - if ( maps\mp\gametypes_zm\_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) ) - smeansofdeath = "MOD_HEAD_SHOT"; - - if ( level.onlyheadshots ) - { - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) - return; - else if ( smeansofdeath == "MOD_HEAD_SHOT" ) - idamage = 150; - } - - if ( sweapon == "none" && isdefined( einflictor ) ) - { - if ( isdefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" ) - sweapon = "explodable_barrel_mp"; - else if ( isdefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) ) - sweapon = "destructible_car_mp"; - } - - if ( !( idflags & level.idflags_no_protection ) ) - { - if ( isplayer( eattacker ) ) - eattacker.pers["participation"]++; - - prevhealthratio = self.health / self.maxhealth; - - if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.aiteam == eattacker.pers["team"] ) - { - if ( level.friendlyfire == 0 ) - return; - else if ( level.friendlyfire == 1 ) - { - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - } - else if ( level.friendlyfire == 2 ) - return; - else if ( level.friendlyfire == 3 ) - { - idamage = int( idamage * 0.5 ); - - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - } - - friendly = 1; - } - else - { - if ( isdefined( eattacker ) && isdefined( self.script_owner ) && eattacker == self.script_owner && !level.hardcoremode ) - return; - - if ( isdefined( eattacker ) && isdefined( self.script_owner ) && isdefined( eattacker.script_owner ) && eattacker.script_owner == self.script_owner ) - return; - - if ( idamage < 1 ) - idamage = 1; - - if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) ) - eattacker thread maps\mp\gametypes_zm\_weapons::checkhit( sweapon ); - - if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isdefined( einflictor ) && isdefined( einflictor.iscooked ) ) - self.wascooked = gettime(); - else - self.wascooked = undefined; - - self.lastdamagewasfromenemy = isdefined( eattacker ) && eattacker != self; - self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - } - - if ( isdefined( eattacker ) && eattacker != self ) - { - if ( sweapon != "artillery_mp" && ( !isdefined( einflictor ) || !isai( einflictor ) ) ) - { - if ( idamage > 0 ) - eattacker thread maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor ); - } - } - } + if ( game[ "state" ] == "postgame" ) + { + return; + } + if ( self.aiteam == "spectator" ) + { + return; + } + if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( eattacker.candocombat ) && !eattacker.candocombat ) + { + return; + } + self.idflags = idflags; + self.idflagstime = getTime(); + eattacker = maps/mp/gametypes_zm/_globallogic_player::figureoutattacker( eattacker ); + if ( !isDefined( vdir ) ) + { + idflags |= level.idflags_no_knockback; + } + friendly = 0; + if ( self.health == self.maxhealth || !isDefined( self.attackers ) ) + { + self.attackers = []; + self.attackerdata = []; + self.attackerdamage = []; + } + if ( maps/mp/gametypes_zm/_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) ) + { + smeansofdeath = "MOD_HEAD_SHOT"; + } + if ( level.onlyheadshots ) + { + if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) + { + return; + } + else if ( smeansofdeath == "MOD_HEAD_SHOT" ) + { + idamage = 150; + } + } + if ( sweapon == "none" && isDefined( einflictor ) ) + { + if ( isDefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" ) + { + sweapon = "explodable_barrel_mp"; + } + else if ( isDefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) ) + { + sweapon = "destructible_car_mp"; + } + } + if ( idflags & level.idflags_no_protection ) + { + if ( isplayer( eattacker ) ) + { + eattacker.pers[ "participation" ]++; + } + prevhealthratio = self.health / self.maxhealth; + if ( level.teambased && isplayer( eattacker ) && self != eattacker && self.aiteam == eattacker.pers[ "team" ] ) + { + if ( level.friendlyfire == 0 ) + { + return; + } + else if ( level.friendlyfire == 1 ) + { + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + } + else if ( level.friendlyfire == 2 ) + { + return; + } + else if ( level.friendlyfire == 3 ) + { + idamage = int( idamage * 0,5 ); + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + } + friendly = 1; + } + else if ( isDefined( eattacker ) && isDefined( self.script_owner ) && eattacker == self.script_owner && !level.hardcoremode ) + { + return; + } + if ( isDefined( eattacker ) && isDefined( self.script_owner ) && isDefined( eattacker.script_owner ) && eattacker.script_owner == self.script_owner ) + { + return; + } + if ( idamage < 1 ) + { + idamage = 1; + } + if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( sweapon ) && !issubstr( smeansofdeath, "MOD_MELEE" ) ) + { + eattacker thread maps/mp/gametypes/_weapons::checkhit( sweapon ); + } + if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isDefined( einflictor ) && isDefined( einflictor.iscooked ) ) + { + self.wascooked = getTime(); + } + else + { + self.wascooked = undefined; + } + if ( isDefined( eattacker ) && eattacker != self ) + { + self.lastdamagewasfromenemy = 1; + } + else + { + self.lastdamagewasfromenemy = 0; + } + self finishactordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + if ( isDefined( eattacker ) && eattacker != self ) + { + if ( sweapon != "artillery_mp" && !isDefined( einflictor ) || !isai( einflictor ) ) + { + if ( idamage > 0 ) + { + eattacker thread maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor ); + } + } + } + } + /* /# - if ( getdvarint( "g_debugDamage" ) ) - println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + shitloc + ";" + boneindex + "\n" ); + if ( getDvarInt( "g_debugDamage" ) ) + { + println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + shitloc + ";" + boneindex + "\n" ); #/ - if ( 1 ) - { - lpselfnum = self getentitynumber(); - lpselfteam = self.aiteam; - lpattackerteam = ""; - - if ( isplayer( eattacker ) ) - { - lpattacknum = eattacker getentitynumber(); - lpattackguid = eattacker getguid(); - lpattackname = eattacker.name; - lpattackerteam = eattacker.pers["team"]; - } - else - { - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackerteam = "world"; - } - - logprint( "AD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); - } + } + */ + if ( 1 ) + { + lpselfnum = self getentitynumber(); + lpselfteam = self.aiteam; + lpattackerteam = ""; + if ( isplayer( eattacker ) ) + { + lpattacknum = eattacker getentitynumber(); + lpattackguid = eattacker getguid(); + lpattackname = eattacker.name; + lpattackerteam = eattacker.pers[ "team" ]; + } + else + { + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackerteam = "world"; + } + logprint( "AD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); + } } -callback_actorkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ) +callback_actorkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ) //checked matches cerberus output { - if ( game["state"] == "postgame" ) - return; - - if ( isai( attacker ) && isdefined( attacker.script_owner ) ) - { - if ( attacker.script_owner.team != self.aiteam ) - attacker = attacker.script_owner; - } - - if ( attacker.classname == "script_vehicle" && isdefined( attacker.owner ) ) - attacker = attacker.owner; - - if ( isdefined( attacker ) && isplayer( attacker ) ) - { - if ( !level.teambased || self.aiteam != attacker.pers["team"] ) - { - level.globalkillstreaksdestroyed++; - attacker addweaponstat( "dogs_mp", "destroyed", 1 ); - attacker maps\mp\_challenges::killeddog(); - } - } + if ( game[ "state" ] == "postgame" ) + { + return; + } + if ( isai( attacker ) && isDefined( attacker.script_owner ) ) + { + if ( attacker.script_owner.team != self.aiteam ) + { + attacker = attacker.script_owner; + } + } + if ( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) + { + attacker = attacker.owner; + } + if ( isDefined( attacker ) && isplayer( attacker ) ) + { + if ( !level.teambased || self.aiteam != attacker.pers[ "team" ] ) + { + level.globalkillstreaksdestroyed++; + attacker addweaponstat( "dogs_mp", "destroyed", 1 ); + attacker maps/mp/_challenges::killeddog(); + } + } } + + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_audio.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_audio.gsc index 95abc02..2618bd9 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_audio.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_audio.gsc @@ -1,910 +1,1034 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_globallogic_utils; -#include maps\mp\gametypes_zm\_globallogic_audio; -#include maps\mp\_music; +#include maps/mp/_music; +#include maps/mp/gametypes_zm/_globallogic_audio; +#include maps/mp/gametypes_zm/_globallogic_utils; +#include maps/mp/_utility; init() { - game["music"]["defeat"] = "mus_defeat"; - game["music"]["victory_spectator"] = "mus_defeat"; - game["music"]["winning"] = "mus_time_running_out_winning"; - game["music"]["losing"] = "mus_time_running_out_losing"; - game["music"]["match_end"] = "mus_match_end"; - game["music"]["victory_tie"] = "mus_defeat"; - game["music"]["suspense"] = []; - game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_01"; - game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_02"; - game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_03"; - game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_04"; - game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_05"; - game["music"]["suspense"][game["music"]["suspense"].size] = "mus_suspense_06"; - game["dialog"]["mission_success"] = "mission_success"; - game["dialog"]["mission_failure"] = "mission_fail"; - game["dialog"]["mission_draw"] = "draw"; - game["dialog"]["round_success"] = "encourage_win"; - game["dialog"]["round_failure"] = "encourage_lost"; - game["dialog"]["round_draw"] = "draw"; - game["dialog"]["timesup"] = "timesup"; - game["dialog"]["winning"] = "winning"; - game["dialog"]["losing"] = "losing"; - game["dialog"]["min_draw"] = "min_draw"; - game["dialog"]["lead_lost"] = "lead_lost"; - game["dialog"]["lead_tied"] = "tied"; - game["dialog"]["lead_taken"] = "lead_taken"; - game["dialog"]["last_alive"] = "lastalive"; - game["dialog"]["boost"] = "generic_boost"; - - if ( !isdefined( game["dialog"]["offense_obj"] ) ) - game["dialog"]["offense_obj"] = "generic_boost"; - - if ( !isdefined( game["dialog"]["defense_obj"] ) ) - game["dialog"]["defense_obj"] = "generic_boost"; - - game["dialog"]["hardcore"] = "hardcore"; - game["dialog"]["oldschool"] = "oldschool"; - game["dialog"]["highspeed"] = "highspeed"; - game["dialog"]["tactical"] = "tactical"; - game["dialog"]["challenge"] = "challengecomplete"; - game["dialog"]["promotion"] = "promotion"; - game["dialog"]["bomb_acquired"] = "sd_bomb_taken"; - game["dialog"]["bomb_taken"] = "sd_bomb_taken_taken"; - game["dialog"]["bomb_lost"] = "sd_bomb_drop"; - game["dialog"]["bomb_defused"] = "sd_bomb_defused"; - game["dialog"]["bomb_planted"] = "sd_bomb_planted"; - game["dialog"]["obj_taken"] = "securedobj"; - game["dialog"]["obj_lost"] = "lostobj"; - game["dialog"]["obj_defend"] = "defend_start"; - game["dialog"]["obj_destroy"] = "destroy_start"; - game["dialog"]["obj_capture"] = "capture_obj"; - game["dialog"]["objs_capture"] = "capture_objs"; - game["dialog"]["hq_located"] = "hq_located"; - game["dialog"]["hq_enemy_captured"] = "hq_capture"; - game["dialog"]["hq_enemy_destroyed"] = "hq_defend"; - game["dialog"]["hq_secured"] = "hq_secured"; - game["dialog"]["hq_offline"] = "hq_offline"; - game["dialog"]["hq_online"] = "hq_online"; - game["dialog"]["koth_located"] = "koth_located"; - game["dialog"]["koth_captured"] = "koth_captured"; - game["dialog"]["koth_lost"] = "koth_lost"; - game["dialog"]["koth_secured"] = "koth_secured"; - game["dialog"]["koth_contested"] = "koth_contest"; - game["dialog"]["koth_offline"] = "koth_offline"; - game["dialog"]["koth_online"] = "koth_online"; - game["dialog"]["move_to_new"] = "new_positions"; - game["dialog"]["attack"] = "attack"; - game["dialog"]["defend"] = "defend"; - game["dialog"]["offense"] = "offense"; - game["dialog"]["defense"] = "defense"; - game["dialog"]["halftime"] = "halftime"; - game["dialog"]["overtime"] = "overtime"; - game["dialog"]["side_switch"] = "switchingsides"; - game["dialog"]["flag_taken"] = "ourflag"; - game["dialog"]["flag_dropped"] = "ourflag_drop"; - game["dialog"]["flag_returned"] = "ourflag_return"; - game["dialog"]["flag_captured"] = "ourflag_capt"; - game["dialog"]["enemy_flag_taken"] = "enemyflag"; - game["dialog"]["enemy_flag_dropped"] = "enemyflag_drop"; - game["dialog"]["enemy_flag_returned"] = "enemyflag_return"; - game["dialog"]["enemy_flag_captured"] = "enemyflag_capt"; - game["dialog"]["securing_a"] = "dom_securing_a"; - game["dialog"]["securing_b"] = "dom_securing_b"; - game["dialog"]["securing_c"] = "dom_securing_c"; - game["dialog"]["securing_d"] = "dom_securing_d"; - game["dialog"]["securing_e"] = "dom_securing_e"; - game["dialog"]["securing_f"] = "dom_securing_f"; - game["dialog"]["secured_a"] = "dom_secured_a"; - game["dialog"]["secured_b"] = "dom_secured_b"; - game["dialog"]["secured_c"] = "dom_secured_c"; - game["dialog"]["secured_d"] = "dom_secured_d"; - game["dialog"]["secured_e"] = "dom_secured_e"; - game["dialog"]["secured_f"] = "dom_secured_f"; - game["dialog"]["losing_a"] = "dom_losing_a"; - game["dialog"]["losing_b"] = "dom_losing_b"; - game["dialog"]["losing_c"] = "dom_losing_c"; - game["dialog"]["losing_d"] = "dom_losing_d"; - game["dialog"]["losing_e"] = "dom_losing_e"; - game["dialog"]["losing_f"] = "dom_losing_f"; - game["dialog"]["lost_a"] = "dom_lost_a"; - game["dialog"]["lost_b"] = "dom_lost_b"; - game["dialog"]["lost_c"] = "dom_lost_c"; - game["dialog"]["lost_d"] = "dom_lost_d"; - game["dialog"]["lost_e"] = "dom_lost_e"; - game["dialog"]["lost_f"] = "dom_lost_f"; - game["dialog"]["secure_flag"] = "secure_flag"; - game["dialog"]["securing_flag"] = "securing_flag"; - game["dialog"]["losing_flag"] = "losing_flag"; - game["dialog"]["lost_flag"] = "lost_flag"; - game["dialog"]["oneflag_enemy"] = "oneflag_enemy"; - game["dialog"]["oneflag_friendly"] = "oneflag_friendly"; - game["dialog"]["lost_all"] = "dom_lock_theytake"; - game["dialog"]["secure_all"] = "dom_lock_wetake"; - game["dialog"]["squad_move"] = "squad_move"; - game["dialog"]["squad_30sec"] = "squad_30sec"; - game["dialog"]["squad_winning"] = "squad_onemin_vic"; - game["dialog"]["squad_losing"] = "squad_onemin_loss"; - game["dialog"]["squad_down"] = "squad_down"; - game["dialog"]["squad_bomb"] = "squad_bomb"; - game["dialog"]["squad_plant"] = "squad_plant"; - game["dialog"]["squad_take"] = "squad_takeobj"; - game["dialog"]["kicked"] = "player_kicked"; - game["dialog"]["sentry_destroyed"] = "dest_sentry"; - game["dialog"]["sentry_hacked"] = "kls_turret_hacked"; - game["dialog"]["microwave_destroyed"] = "dest_microwave"; - game["dialog"]["microwave_hacked"] = "kls_microwave_hacked"; - game["dialog"]["sam_destroyed"] = "dest_sam"; - game["dialog"]["tact_destroyed"] = "dest_tact"; - game["dialog"]["equipment_destroyed"] = "dest_equip"; - game["dialog"]["hacked_equip"] = "hacked_equip"; - game["dialog"]["uav_destroyed"] = "kls_u2_destroyed"; - game["dialog"]["cuav_destroyed"] = "kls_cu2_destroyed"; - level.dialoggroups = []; - level thread post_match_snapshot_watcher(); + game[ "music" ][ "defeat" ] = "mus_defeat"; + game[ "music" ][ "victory_spectator" ] = "mus_defeat"; + game[ "music" ][ "winning" ] = "mus_time_running_out_winning"; + game[ "music" ][ "losing" ] = "mus_time_running_out_losing"; + game[ "music" ][ "match_end" ] = "mus_match_end"; + game[ "music" ][ "victory_tie" ] = "mus_defeat"; + game[ "music" ][ "suspense" ] = []; + game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_01"; + game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_02"; + game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_03"; + game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_04"; + game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_05"; + game[ "music" ][ "suspense" ][ game[ "music" ][ "suspense" ].size ] = "mus_suspense_06"; + game[ "dialog" ][ "mission_success" ] = "mission_success"; + game[ "dialog" ][ "mission_failure" ] = "mission_fail"; + game[ "dialog" ][ "mission_draw" ] = "draw"; + game[ "dialog" ][ "round_success" ] = "encourage_win"; + game[ "dialog" ][ "round_failure" ] = "encourage_lost"; + game[ "dialog" ][ "round_draw" ] = "draw"; + game[ "dialog" ][ "timesup" ] = "timesup"; + game[ "dialog" ][ "winning" ] = "winning"; + game[ "dialog" ][ "losing" ] = "losing"; + game[ "dialog" ][ "min_draw" ] = "min_draw"; + game[ "dialog" ][ "lead_lost" ] = "lead_lost"; + game[ "dialog" ][ "lead_tied" ] = "tied"; + game[ "dialog" ][ "lead_taken" ] = "lead_taken"; + game[ "dialog" ][ "last_alive" ] = "lastalive"; + game[ "dialog" ][ "boost" ] = "generic_boost"; + if ( !isDefined( game[ "dialog" ][ "offense_obj" ] ) ) + { + game[ "dialog" ][ "offense_obj" ] = "generic_boost"; + } + if ( !isDefined( game[ "dialog" ][ "defense_obj" ] ) ) + { + game[ "dialog" ][ "defense_obj" ] = "generic_boost"; + } + game[ "dialog" ][ "hardcore" ] = "hardcore"; + game[ "dialog" ][ "oldschool" ] = "oldschool"; + game[ "dialog" ][ "highspeed" ] = "highspeed"; + game[ "dialog" ][ "tactical" ] = "tactical"; + game[ "dialog" ][ "challenge" ] = "challengecomplete"; + game[ "dialog" ][ "promotion" ] = "promotion"; + game[ "dialog" ][ "bomb_acquired" ] = "sd_bomb_taken"; + game[ "dialog" ][ "bomb_taken" ] = "sd_bomb_taken_taken"; + game[ "dialog" ][ "bomb_lost" ] = "sd_bomb_drop"; + game[ "dialog" ][ "bomb_defused" ] = "sd_bomb_defused"; + game[ "dialog" ][ "bomb_planted" ] = "sd_bomb_planted"; + game[ "dialog" ][ "obj_taken" ] = "securedobj"; + game[ "dialog" ][ "obj_lost" ] = "lostobj"; + game[ "dialog" ][ "obj_defend" ] = "defend_start"; + game[ "dialog" ][ "obj_destroy" ] = "destroy_start"; + game[ "dialog" ][ "obj_capture" ] = "capture_obj"; + game[ "dialog" ][ "objs_capture" ] = "capture_objs"; + game[ "dialog" ][ "hq_located" ] = "hq_located"; + game[ "dialog" ][ "hq_enemy_captured" ] = "hq_capture"; + game[ "dialog" ][ "hq_enemy_destroyed" ] = "hq_defend"; + game[ "dialog" ][ "hq_secured" ] = "hq_secured"; + game[ "dialog" ][ "hq_offline" ] = "hq_offline"; + game[ "dialog" ][ "hq_online" ] = "hq_online"; + game[ "dialog" ][ "koth_located" ] = "koth_located"; + game[ "dialog" ][ "koth_captured" ] = "koth_captured"; + game[ "dialog" ][ "koth_lost" ] = "koth_lost"; + game[ "dialog" ][ "koth_secured" ] = "koth_secured"; + game[ "dialog" ][ "koth_contested" ] = "koth_contest"; + game[ "dialog" ][ "koth_offline" ] = "koth_offline"; + game[ "dialog" ][ "koth_online" ] = "koth_online"; + game[ "dialog" ][ "move_to_new" ] = "new_positions"; + game[ "dialog" ][ "attack" ] = "attack"; + game[ "dialog" ][ "defend" ] = "defend"; + game[ "dialog" ][ "offense" ] = "offense"; + game[ "dialog" ][ "defense" ] = "defense"; + game[ "dialog" ][ "halftime" ] = "halftime"; + game[ "dialog" ][ "overtime" ] = "overtime"; + game[ "dialog" ][ "side_switch" ] = "switchingsides"; + game[ "dialog" ][ "flag_taken" ] = "ourflag"; + game[ "dialog" ][ "flag_dropped" ] = "ourflag_drop"; + game[ "dialog" ][ "flag_returned" ] = "ourflag_return"; + game[ "dialog" ][ "flag_captured" ] = "ourflag_capt"; + game[ "dialog" ][ "enemy_flag_taken" ] = "enemyflag"; + game[ "dialog" ][ "enemy_flag_dropped" ] = "enemyflag_drop"; + game[ "dialog" ][ "enemy_flag_returned" ] = "enemyflag_return"; + game[ "dialog" ][ "enemy_flag_captured" ] = "enemyflag_capt"; + game[ "dialog" ][ "securing_a" ] = "dom_securing_a"; + game[ "dialog" ][ "securing_b" ] = "dom_securing_b"; + game[ "dialog" ][ "securing_c" ] = "dom_securing_c"; + game[ "dialog" ][ "securing_d" ] = "dom_securing_d"; + game[ "dialog" ][ "securing_e" ] = "dom_securing_e"; + game[ "dialog" ][ "securing_f" ] = "dom_securing_f"; + game[ "dialog" ][ "secured_a" ] = "dom_secured_a"; + game[ "dialog" ][ "secured_b" ] = "dom_secured_b"; + game[ "dialog" ][ "secured_c" ] = "dom_secured_c"; + game[ "dialog" ][ "secured_d" ] = "dom_secured_d"; + game[ "dialog" ][ "secured_e" ] = "dom_secured_e"; + game[ "dialog" ][ "secured_f" ] = "dom_secured_f"; + game[ "dialog" ][ "losing_a" ] = "dom_losing_a"; + game[ "dialog" ][ "losing_b" ] = "dom_losing_b"; + game[ "dialog" ][ "losing_c" ] = "dom_losing_c"; + game[ "dialog" ][ "losing_d" ] = "dom_losing_d"; + game[ "dialog" ][ "losing_e" ] = "dom_losing_e"; + game[ "dialog" ][ "losing_f" ] = "dom_losing_f"; + game[ "dialog" ][ "lost_a" ] = "dom_lost_a"; + game[ "dialog" ][ "lost_b" ] = "dom_lost_b"; + game[ "dialog" ][ "lost_c" ] = "dom_lost_c"; + game[ "dialog" ][ "lost_d" ] = "dom_lost_d"; + game[ "dialog" ][ "lost_e" ] = "dom_lost_e"; + game[ "dialog" ][ "lost_f" ] = "dom_lost_f"; + game[ "dialog" ][ "secure_flag" ] = "secure_flag"; + game[ "dialog" ][ "securing_flag" ] = "securing_flag"; + game[ "dialog" ][ "losing_flag" ] = "losing_flag"; + game[ "dialog" ][ "lost_flag" ] = "lost_flag"; + game[ "dialog" ][ "oneflag_enemy" ] = "oneflag_enemy"; + game[ "dialog" ][ "oneflag_friendly" ] = "oneflag_friendly"; + game[ "dialog" ][ "lost_all" ] = "dom_lock_theytake"; + game[ "dialog" ][ "secure_all" ] = "dom_lock_wetake"; + game[ "dialog" ][ "squad_move" ] = "squad_move"; + game[ "dialog" ][ "squad_30sec" ] = "squad_30sec"; + game[ "dialog" ][ "squad_winning" ] = "squad_onemin_vic"; + game[ "dialog" ][ "squad_losing" ] = "squad_onemin_loss"; + game[ "dialog" ][ "squad_down" ] = "squad_down"; + game[ "dialog" ][ "squad_bomb" ] = "squad_bomb"; + game[ "dialog" ][ "squad_plant" ] = "squad_plant"; + game[ "dialog" ][ "squad_take" ] = "squad_takeobj"; + game[ "dialog" ][ "kicked" ] = "player_kicked"; + game[ "dialog" ][ "sentry_destroyed" ] = "dest_sentry"; + game[ "dialog" ][ "sentry_hacked" ] = "kls_turret_hacked"; + game[ "dialog" ][ "microwave_destroyed" ] = "dest_microwave"; + game[ "dialog" ][ "microwave_hacked" ] = "kls_microwave_hacked"; + game[ "dialog" ][ "sam_destroyed" ] = "dest_sam"; + game[ "dialog" ][ "tact_destroyed" ] = "dest_tact"; + game[ "dialog" ][ "equipment_destroyed" ] = "dest_equip"; + game[ "dialog" ][ "hacked_equip" ] = "hacked_equip"; + game[ "dialog" ][ "uav_destroyed" ] = "kls_u2_destroyed"; + game[ "dialog" ][ "cuav_destroyed" ] = "kls_cu2_destroyed"; + level.dialoggroups = []; + level thread post_match_snapshot_watcher(); } registerdialoggroup( group, skipifcurrentlyplayinggroup ) { - if ( !isdefined( level.dialoggroups ) ) - level.dialoggroups = []; - else if ( isdefined( level.dialoggroup[group] ) ) - { - error( "registerDialogGroup: Dialog group " + group + " already registered." ); - return; - } - - level.dialoggroup[group] = spawnstruct(); - level.dialoggroup[group].group = group; - level.dialoggroup[group].skipifcurrentlyplayinggroup = skipifcurrentlyplayinggroup; - level.dialoggroup[group].currentcount = 0; + if ( !isDefined( level.dialoggroups ) ) + { + level.dialoggroups = []; + } + else + { + if ( isDefined( level.dialoggroup[ group ] ) ) + { + error( "registerDialogGroup: Dialog group " + group + " already registered." ); + return; + } + } + level.dialoggroup[ group ] = spawnstruct(); + level.dialoggroup[ group ].group = group; + level.dialoggroup[ group ].skipifcurrentlyplayinggroup = skipifcurrentlyplayinggroup; + level.dialoggroup[ group ].currentcount = 0; } sndstartmusicsystem() { - self endon( "disconnect" ); - - if ( game["state"] == "postgame" ) - return; - - if ( game["state"] == "pregame" ) - { + self endon( "disconnect" ); + if ( game[ "state" ] == "postgame" ) + { + return; + } + if ( game[ "state" ] == "pregame" ) + { /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); #/ - wait 30; - - if ( !isdefined( level.nextmusicstate ) ) - { - self.pers["music"].currentstate = "UNDERSCORE"; - self thread suspensemusic(); - } - } - - if ( !isdefined( level.nextmusicstate ) ) - { + } + wait 30; + if ( !isDefined( level.nextmusicstate ) ) + { + self.pers[ "music" ].currentstate = "UNDERSCORE"; + self thread suspensemusic(); + } + } + if ( !isDefined( level.nextmusicstate ) ) + { /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); #/ - self.pers["music"].currentstate = "UNDERSCORE"; - self thread suspensemusic(); - } + } + self.pers[ "music" ].currentstate = "UNDERSCORE"; + self thread suspensemusic(); + } } suspensemusicforplayer() { - self endon( "disconnect" ); - self thread set_music_on_player( "UNDERSCORE", 0 ); + self endon( "disconnect" ); + self thread set_music_on_player( "UNDERSCORE", 0 ); /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Setting Music State Random Underscore " + self.pers["music"].returnstate + " On player " + self getentitynumber() ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Setting Music State Random Underscore " + self.pers[ "music" ].returnstate + " On player " + self getentitynumber() ); #/ + } } suspensemusic( random ) { - level endon( "game_ended" ); - level endon( "match_ending_soon" ); - self endon( "disconnect" ); + level endon( "game_ended" ); + level endon( "match_ending_soon" ); + self endon( "disconnect" ); /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Starting random underscore" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Starting random underscore" ); #/ - while ( true ) - { - wait( randomintrange( 25, 60 ) ); + } + while ( 1 ) + { + wait randomintrange( 25, 60 ); /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Checking for random underscore" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Checking for random underscore" ); #/ - if ( !isdefined( self.pers["music"].inque ) ) - self.pers["music"].inque = 0; - - if ( self.pers["music"].inque ) - { + } + if ( !isDefined( self.pers[ "music" ].inque ) ) + { + self.pers[ "music" ].inque = 0; + } + while ( self.pers[ "music" ].inque ) + { /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Inque no random underscore" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Inque no random underscore" ); #/ - continue; - } - - if ( !isdefined( self.pers["music"].currentstate ) ) - self.pers["music"].currentstate = "SILENT"; - - if ( randomint( 100 ) < self.underscorechance && self.pers["music"].currentstate != "ACTION" && self.pers["music"].currentstate != "TIME_OUT" ) - { - self thread suspensemusicforplayer(); - self.underscorechance -= 20; + } + } + if ( !isDefined( self.pers[ "music" ].currentstate ) ) + { + self.pers[ "music" ].currentstate = "SILENT"; + } + if ( randomint( 100 ) < self.underscorechance && self.pers[ "music" ].currentstate != "ACTION" && self.pers[ "music" ].currentstate != "TIME_OUT" ) + { + self thread suspensemusicforplayer(); + self.underscorechance -= 20; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Starting random underscore" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Starting random underscore" ); #/ - } - } + } + } + } } leaderdialogforotherteams( dialog, skip_team, squad_dialog ) { - foreach ( team in level.teams ) - { - if ( team != skip_team ) - leaderdialog( dialog, team, undefined, undefined, squad_dialog ); - } + _a339 = level.teams; + _k339 = getFirstArrayKey( _a339 ); + while ( isDefined( _k339 ) ) + { + team = _a339[ _k339 ]; + if ( team != skip_team ) + { + leaderdialog( dialog, team, undefined, undefined, squad_dialog ); + } + _k339 = getNextArrayKey( _a339, _k339 ); + } } announceroundwinner( winner, delay ) { - if ( delay > 0 ) - wait( delay ); - - if ( !isdefined( winner ) || isplayer( winner ) ) - return; - - if ( isdefined( level.teams[winner] ) ) - { - leaderdialog( "round_success", winner ); - leaderdialogforotherteams( "round_failure", winner ); - } - else - { - foreach ( team in level.teams ) - thread playsoundonplayers( "mus_round_draw" + "_" + level.teampostfix[team] ); - - leaderdialog( "round_draw" ); - } + if ( delay > 0 ) + { + wait delay; + } + if ( !isDefined( winner ) || isplayer( winner ) ) + { + return; + } + if ( isDefined( level.teams[ winner ] ) ) + { + leaderdialog( "round_success", winner ); + leaderdialogforotherteams( "round_failure", winner ); + } + else + { + _a365 = level.teams; + _k365 = getFirstArrayKey( _a365 ); + while ( isDefined( _k365 ) ) + { + team = _a365[ _k365 ]; + thread playsoundonplayers( "mus_round_draw" + "_" + level.teampostfix[ team ] ); + _k365 = getNextArrayKey( _a365, _k365 ); + } + leaderdialog( "round_draw" ); + } } announcegamewinner( winner, delay ) { - if ( delay > 0 ) - wait( delay ); - - if ( !isdefined( winner ) || isplayer( winner ) ) - return; - - if ( isdefined( level.teams[winner] ) ) - { - leaderdialog( "mission_success", winner ); - leaderdialogforotherteams( "mission_failure", winner ); - } - else - leaderdialog( "mission_draw" ); + if ( delay > 0 ) + { + wait delay; + } + if ( !isDefined( winner ) || isplayer( winner ) ) + { + return; + } + if ( isDefined( level.teams[ winner ] ) ) + { + leaderdialog( "mission_success", winner ); + leaderdialogforotherteams( "mission_failure", winner ); + } + else + { + leaderdialog( "mission_draw" ); + } } doflameaudio() { - self endon( "disconnect" ); - waittillframeend; - - if ( !isdefined( self.lastflamehurtaudio ) ) - self.lastflamehurtaudio = 0; - - currenttime = gettime(); - - if ( self.lastflamehurtaudio + level.fire_audio_repeat_duration + randomint( level.fire_audio_random_max_duration ) < currenttime ) - { - self playlocalsound( "vox_pain_small" ); - self.lastflamehurtaudio = currenttime; - } + self endon( "disconnect" ); + waittillframeend; + if ( !isDefined( self.lastflamehurtaudio ) ) + { + self.lastflamehurtaudio = 0; + } + currenttime = getTime(); + if ( ( self.lastflamehurtaudio + level.fire_audio_repeat_duration + randomint( level.fire_audio_random_max_duration ) ) < currenttime ) + { + self playlocalsound( "vox_pain_small" ); + self.lastflamehurtaudio = currenttime; + } } leaderdialog( dialog, team, group, excludelist, squaddialog ) { /# - assert( isdefined( level.players ) ); + assert( isDefined( level.players ) ); #/ - if ( level.splitscreen ) - return; - - if ( level.wagermatch ) - return; - - if ( !isdefined( team ) ) - { - dialogs = []; - - foreach ( team in level.teams ) - dialogs[team] = dialog; - - leaderdialogallteams( dialogs, group, excludelist ); - return; - } - - if ( level.splitscreen ) - { - if ( level.players.size ) - level.players[0] leaderdialogonplayer( dialog, group ); - - return; - } - - if ( isdefined( excludelist ) ) - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team && !maps\mp\gametypes_zm\_globallogic_utils::isexcluded( player, excludelist ) ) - player leaderdialogonplayer( dialog, group ); - } - } - else - { - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - player leaderdialogonplayer( dialog, group ); - } - } + if ( level.splitscreen ) + { + return; + } + if ( level.wagermatch ) + { + return; + } + if ( !isDefined( team ) ) + { + dialogs = []; + _a425 = level.teams; + _k425 = getFirstArrayKey( _a425 ); + while ( isDefined( _k425 ) ) + { + team = _a425[ _k425 ]; + dialogs[ team ] = dialog; + _k425 = getNextArrayKey( _a425, _k425 ); + } + leaderdialogallteams( dialogs, group, excludelist ); + return; + } + if ( level.splitscreen ) + { + if ( level.players.size ) + { + level.players[ 0 ] leaderdialogonplayer( dialog, group ); + } + return; + } + if ( isDefined( excludelist ) ) + { + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team && !maps/mp/gametypes_zm/_globallogic_utils::isexcluded( player, excludelist ) ) + { + player leaderdialogonplayer( dialog, group ); + } + i++; + } + } + else i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player leaderdialogonplayer( dialog, group ); + } + i++; + } } leaderdialogallteams( dialogs, group, excludelist ) { /# - assert( isdefined( level.players ) ); + assert( isDefined( level.players ) ); #/ - if ( level.splitscreen ) - return; - - if ( level.splitscreen ) - { - if ( level.players.size ) - level.players[0] leaderdialogonplayer( dialogs[level.players[0].team], group ); - - return; - } - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - team = player.pers["team"]; - - if ( !isdefined( team ) ) - continue; - - if ( !isdefined( dialogs[team] ) ) - continue; - - if ( isdefined( excludelist ) && maps\mp\gametypes_zm\_globallogic_utils::isexcluded( player, excludelist ) ) - continue; - - player leaderdialogonplayer( dialogs[team], group ); - } + if ( level.splitscreen ) + { + return; + } + if ( level.splitscreen ) + { + if ( level.players.size ) + { + level.players[ 0 ] leaderdialogonplayer( dialogs[ level.players[ 0 ].team ], group ); + } + return; + } + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + team = player.pers[ "team" ]; + if ( !isDefined( team ) ) + { + i++; + continue; + } + else if ( !isDefined( dialogs[ team ] ) ) + { + i++; + continue; + } + else if ( isDefined( excludelist ) && maps/mp/gametypes_zm/_globallogic_utils::isexcluded( player, excludelist ) ) + { + i++; + continue; + } + else + { + player leaderdialogonplayer( dialogs[ team ], group ); + } + i++; + } } flushdialog() { - foreach ( player in level.players ) - player flushdialogonplayer(); + _a495 = level.players; + _k495 = getFirstArrayKey( _a495 ); + while ( isDefined( _k495 ) ) + { + player = _a495[ _k495 ]; + player flushdialogonplayer(); + _k495 = getNextArrayKey( _a495, _k495 ); + } } flushdialogonplayer() { - self.leaderdialoggroups = []; - self.leaderdialogqueue = []; - self.leaderdialogactive = 0; - self.currentleaderdialoggroup = ""; + self.leaderdialoggroups = []; + self.leaderdialogqueue = []; + self.leaderdialogactive = 0; + self.currentleaderdialoggroup = ""; } flushgroupdialog( group ) { - foreach ( player in level.players ) - player flushgroupdialogonplayer( group ); + _a512 = level.players; + _k512 = getFirstArrayKey( _a512 ); + while ( isDefined( _k512 ) ) + { + player = _a512[ _k512 ]; + player flushgroupdialogonplayer( group ); + _k512 = getNextArrayKey( _a512, _k512 ); + } } flushgroupdialogonplayer( group ) { - self.leaderdialoggroups[group] = undefined; - - foreach ( key, dialog in self.leaderdialogqueue ) - { - if ( dialog == group ) - self.leaderdialogqueue[key] = undefined; - } + _a522 = self.leaderdialogqueue; + key = getFirstArrayKey( _a522 ); + while ( isDefined( key ) ) + { + dialog = _a522[ key ]; + if ( dialog == group ) + { + } + key = getNextArrayKey( _a522, key ); + } } addgroupdialogtoplayer( dialog, group ) { - if ( !isdefined( level.dialoggroup[group] ) ) - { - error( "leaderDialogOnPlayer: Dialog group " + group + " is not registered" ); - return 0; - } - - addtoqueue = 0; - - if ( !isdefined( self.leaderdialoggroups[group] ) ) - addtoqueue = 1; - - if ( !level.dialoggroup[group].skipifcurrentlyplayinggroup ) - { - if ( self.currentleaderdialog == dialog && self.currentleaderdialogtime + 2000 > gettime() ) - { - self.leaderdialoggroups[group] = undefined; - - foreach ( key, leader_dialog in self.leaderdialogqueue ) - { - if ( leader_dialog == group ) - { - for ( i = key + 1; i < self.leaderdialogqueue.size; i++ ) - self.leaderdialogqueue[i - 1] = self.leaderdialogqueue[i]; - - self.leaderdialogqueue[i - 1] = undefined; - break; - } - } - - return 0; - } - } - else if ( self.currentleaderdialoggroup == group ) - return 0; - - self.leaderdialoggroups[group] = dialog; - return addtoqueue; + if ( !isDefined( level.dialoggroup[ group ] ) ) + { + error( "leaderDialogOnPlayer: Dialog group " + group + " is not registered" ); + return 0; + } + addtoqueue = 0; + if ( !isDefined( self.leaderdialoggroups[ group ] ) ) + { + addtoqueue = 1; + } + if ( !level.dialoggroup[ group ].skipifcurrentlyplayinggroup ) + { + if ( self.currentleaderdialog == dialog && ( self.currentleaderdialogtime + 2000 ) > getTime() ) + { + _a552 = self.leaderdialogqueue; + key = getFirstArrayKey( _a552 ); + while ( isDefined( key ) ) + { + leader_dialog = _a552[ key ]; + if ( leader_dialog == group ) + { + i = key + 1; + while ( i < self.leaderdialogqueue.size ) + { + self.leaderdialogqueue[ i - 1 ] = self.leaderdialogqueue[ i ]; + i++; + } + break; + } + else + { + key = getNextArrayKey( _a552, key ); + } + } + return 0; + } + } + else + { + if ( self.currentleaderdialoggroup == group ) + { + return 0; + } + } + self.leaderdialoggroups[ group ] = dialog; + return addtoqueue; } testdialogqueue( group ) { /# - count = 0; - - foreach ( temp in self.leaderdialogqueue ) - { - if ( temp == group ) - count++; - } - - if ( count > 1 ) - shit = 0; + count = 0; + _a585 = self.leaderdialogqueue; + _k585 = getFirstArrayKey( _a585 ); + while ( isDefined( _k585 ) ) + { + temp = _a585[ _k585 ]; + if ( temp == group ) + { + count++; + } + _k585 = getNextArrayKey( _a585, _k585 ); + } + if ( count > 1 ) + { + shit = 0; #/ + } } leaderdialogonplayer( dialog, group ) { - team = self.pers["team"]; - - if ( level.splitscreen ) - return; - - if ( !isdefined( team ) ) - return; - - if ( !isdefined( level.teams[team] ) ) - return; - - if ( isdefined( group ) ) - { - if ( !addgroupdialogtoplayer( dialog, group ) ) - { - self testdialogqueue( group ); - return; - } - - dialog = group; - } - - if ( !self.leaderdialogactive ) - self thread playleaderdialogonplayer( dialog ); - else - self.leaderdialogqueue[self.leaderdialogqueue.size] = dialog; + team = self.pers[ "team" ]; + if ( level.splitscreen ) + { + return; + } + if ( !isDefined( team ) ) + { + return; + } + if ( !isDefined( level.teams[ team ] ) ) + { + return; + } + if ( isDefined( group ) ) + { + if ( !addgroupdialogtoplayer( dialog, group ) ) + { + self testdialogqueue( group ); + return; + } + dialog = group; + } + if ( !self.leaderdialogactive ) + { + self thread playleaderdialogonplayer( dialog ); + } + else + { + self.leaderdialogqueue[ self.leaderdialogqueue.size ] = dialog; + } } waitforsound( sound, extratime ) { - if ( !isdefined( extratime ) ) - extratime = 0.1; - - time = soundgetplaybacktime( sound ); - - if ( time < 0 ) - wait( 3.0 + extratime ); - else - wait( time * 0.001 + extratime ); + if ( !isDefined( extratime ) ) + { + extratime = 0,1; + } + time = soundgetplaybacktime( sound ); + if ( time < 0 ) + { + wait ( 3 + extratime ); + } + else + { + wait ( ( time * 0,001 ) + extratime ); + } } playleaderdialogonplayer( dialog ) { - if ( isdefined( level.allowannouncer ) && !level.allowannouncer ) - return; - - team = self.pers["team"]; - self endon( "disconnect" ); - self.leaderdialogactive = 1; - - if ( isdefined( self.leaderdialoggroups[dialog] ) ) - { - group = dialog; - dialog = self.leaderdialoggroups[group]; - self.leaderdialoggroups[group] = undefined; - self.currentleaderdialoggroup = group; - self testdialogqueue( group ); - } - - if ( level.wagermatch || !isdefined( game["voice"] ) ) - faction = "vox_wm_"; - else - faction = game["voice"][team]; - - sound_name = faction + game["dialog"][dialog]; - - if ( level.allowannouncer ) - { - self playlocalsound( sound_name ); - self.currentleaderdialog = dialog; - self.currentleaderdialogtime = gettime(); - } - - waitforsound( sound_name ); - self.leaderdialogactive = 0; - self.currentleaderdialoggroup = ""; - self.currentleaderdialog = ""; - - if ( self.leaderdialogqueue.size > 0 ) - { - nextdialog = self.leaderdialogqueue[0]; - - for ( i = 1; i < self.leaderdialogqueue.size; i++ ) - self.leaderdialogqueue[i - 1] = self.leaderdialogqueue[i]; - - self.leaderdialogqueue[i - 1] = undefined; - - if ( isdefined( self.leaderdialoggroups[dialog] ) ) - self testdialogqueue( dialog ); - - self thread playleaderdialogonplayer( nextdialog ); - } + if ( isDefined( level.allowannouncer ) && !level.allowannouncer ) + { + return; + } + team = self.pers[ "team" ]; + self endon( "disconnect" ); + self.leaderdialogactive = 1; + if ( isDefined( self.leaderdialoggroups[ dialog ] ) ) + { + group = dialog; + dialog = self.leaderdialoggroups[ group ]; + self.currentleaderdialoggroup = group; + self testdialogqueue( group ); + } + if ( level.wagermatch || !isDefined( game[ "voice" ] ) ) + { + faction = "vox_wm_"; + } + else + { + faction = game[ "voice" ][ team ]; + } + sound_name = faction + game[ "dialog" ][ dialog ]; + if ( level.allowannouncer ) + { + self playlocalsound( sound_name ); + self.currentleaderdialog = dialog; + self.currentleaderdialogtime = getTime(); + } + waitforsound( sound_name ); + self.leaderdialogactive = 0; + self.currentleaderdialoggroup = ""; + self.currentleaderdialog = ""; + if ( self.leaderdialogqueue.size > 0 ) + { + nextdialog = self.leaderdialogqueue[ 0 ]; + i = 1; + while ( i < self.leaderdialogqueue.size ) + { + self.leaderdialogqueue[ i - 1 ] = self.leaderdialogqueue[ i ]; + i++; + } + if ( isDefined( self.leaderdialoggroups[ dialog ] ) ) + { + self testdialogqueue( dialog ); + } + self thread playleaderdialogonplayer( nextdialog ); + } } isteamwinning( checkteam ) { - score = game["teamScores"][checkteam]; - - foreach ( team in level.teams ) - { - if ( team != checkteam ) - { - if ( game["teamScores"][team] >= score ) - return false; - } - } - - return true; + score = game[ "teamScores" ][ checkteam ]; + _a702 = level.teams; + _k702 = getFirstArrayKey( _a702 ); + while ( isDefined( _k702 ) ) + { + team = _a702[ _k702 ]; + if ( team != checkteam ) + { + if ( game[ "teamScores" ][ team ] >= score ) + { + return 0; + } + } + _k702 = getNextArrayKey( _a702, _k702 ); + } + return 1; } announceteamiswinning() { - foreach ( team in level.teams ) - { - if ( isteamwinning( team ) ) - { - leaderdialog( "winning", team, undefined, undefined, "squad_winning" ); - leaderdialogforotherteams( "losing", team, "squad_losing" ); - return true; - } - } - - return false; + _a716 = level.teams; + _k716 = getFirstArrayKey( _a716 ); + while ( isDefined( _k716 ) ) + { + team = _a716[ _k716 ]; + if ( isteamwinning( team ) ) + { + leaderdialog( "winning", team, undefined, undefined, "squad_winning" ); + leaderdialogforotherteams( "losing", team, "squad_losing" ); + return 1; + } + _k716 = getNextArrayKey( _a716, _k716 ); + } + return 0; } musiccontroller() { - level endon( "game_ended" ); - level thread musictimesout(); - - level waittill( "match_ending_soon" ); - - if ( islastround() || isoneround() ) - { - if ( !level.splitscreen ) - { - if ( level.teambased ) - { - if ( !announceteamiswinning() ) - leaderdialog( "min_draw" ); - } - - level waittill( "match_ending_very_soon" ); - - foreach ( team in level.teams ) - leaderdialog( "timesup", team, undefined, undefined, "squad_30sec" ); - } - } - else - { - level waittill( "match_ending_vox" ); - - leaderdialog( "timesup" ); - } + level endon( "game_ended" ); + level thread musictimesout(); + level waittill( "match_ending_soon" ); + if ( islastround() || isoneround() ) + { + while ( !level.splitscreen ) + { + if ( level.teambased ) + { + if ( !announceteamiswinning() ) + { + leaderdialog( "min_draw" ); + } + } + level waittill( "match_ending_very_soon" ); + _a751 = level.teams; + _k751 = getFirstArrayKey( _a751 ); + while ( isDefined( _k751 ) ) + { + team = _a751[ _k751 ]; + leaderdialog( "timesup", team, undefined, undefined, "squad_30sec" ); + _k751 = getNextArrayKey( _a751, _k751 ); + } + } + } + else level waittill( "match_ending_vox" ); + leaderdialog( "timesup" ); } musictimesout() { - level endon( "game_ended" ); - - level waittill( "match_ending_very_soon" ); - - thread maps\mp\gametypes_zm\_globallogic_audio::set_music_on_team( "TIME_OUT", "both", 1, 0 ); + level endon( "game_ended" ); + level waittill( "match_ending_very_soon" ); + thread maps/mp/gametypes_zm/_globallogic_audio::set_music_on_team( "TIME_OUT", "both", 1, 0 ); } actionmusicset() { - level endon( "game_ended" ); - level.playingactionmusic = 1; - wait 45; - level.playingactionmusic = 0; + level endon( "game_ended" ); + level.playingactionmusic = 1; + wait 45; + level.playingactionmusic = 0; } play_2d_on_team( alias, team ) { /# - assert( isdefined( level.players ) ); + assert( isDefined( level.players ) ); #/ - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - player playlocalsound( alias ); - } + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player playlocalsound( alias ); + } + i++; + } } set_music_on_team( state, team, save_state, return_state, wait_time ) { - if ( sessionmodeiszombiesgame() ) - return; + if ( sessionmodeiszombiesgame() ) + { + return; + } /# - assert( isdefined( level.players ) ); + assert( isDefined( level.players ) ); #/ - if ( !isdefined( team ) ) - { - team = "both"; + if ( !isDefined( team ) ) + { + team = "both"; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - team undefined: Setting to both" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - team undefined: Setting to both" ); #/ - } - - if ( !isdefined( save_state ) ) - { - save_sate = 0; + } + } + if ( !isDefined( save_state ) ) + { + save_sate = 0; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - save_sate undefined: Setting to false" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - save_sate undefined: Setting to false" ); #/ - } - - if ( !isdefined( return_state ) ) - { - return_state = 0; + } + } + if ( !isDefined( return_state ) ) + { + return_state = 0; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Music System - return_state undefined: Setting to false" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Music System - return_state undefined: Setting to false" ); #/ - } - - if ( !isdefined( wait_time ) ) - { - wait_time = 0; + } + } + if ( !isDefined( wait_time ) ) + { + wait_time = 0; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( team == "both" ) - { - player thread set_music_on_player( state, save_state, return_state, wait_time ); - continue; - } - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - { - player thread set_music_on_player( state, save_state, return_state, wait_time ); + } + } + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( team == "both" ) + { + player thread set_music_on_player( state, save_state, return_state, wait_time ); + i++; + continue; + } + else + { + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player thread set_music_on_player( state, save_state, return_state, wait_time ); /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Setting Music State " + state + " On player " + player getentitynumber() ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Setting Music State " + state + " On player " + player getentitynumber() ); #/ - } - } + } + } + } + i++; + } } set_music_on_player( state, save_state, return_state, wait_time ) { - self endon( "disconnect" ); - - if ( sessionmodeiszombiesgame() ) - return; + self endon( "disconnect" ); + if ( sessionmodeiszombiesgame() ) + { + return; + } /# - assert( isplayer( self ) ); + assert( isplayer( self ) ); #/ - if ( !isdefined( save_state ) ) - { - save_state = 0; + if ( !isDefined( save_state ) ) + { + save_state = 0; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Music System - save_sate undefined: Setting to false" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Music System - save_sate undefined: Setting to false" ); #/ - } - - if ( !isdefined( return_state ) ) - { - return_state = 0; + } + } + if ( !isDefined( return_state ) ) + { + return_state = 0; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Music System - return_state undefined: Setting to false" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Music System - return_state undefined: Setting to false" ); #/ - } - - if ( !isdefined( wait_time ) ) - { - wait_time = 0; + } + } + if ( !isDefined( wait_time ) ) + { + wait_time = 0; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - - if ( !isdefined( state ) ) - { - state = "UNDERSCORE"; + } + } + if ( !isDefined( state ) ) + { + state = "UNDERSCORE"; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - state undefined: Setting to UNDERSCORE" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - state undefined: Setting to UNDERSCORE" ); #/ - } - - maps\mp\_music::setmusicstate( state, self ); - - if ( isdefined( self.pers["music"].currentstate ) && save_state ) - { - self.pers["music"].returnstate = state; + } + } + maps/mp/_music::setmusicstate( state, self ); + if ( isDefined( self.pers[ "music" ].currentstate ) && save_state ) + { + self.pers[ "music" ].returnstate = state; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Saving Music State " + self.pers["music"].returnstate + " On " + self getentitynumber() ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Saving Music State " + self.pers[ "music" ].returnstate + " On " + self getentitynumber() ); #/ - } - - self.pers["music"].previousstate = self.pers["music"].currentstate; - self.pers["music"].currentstate = state; + } + } + self.pers[ "music" ].previousstate = self.pers[ "music" ].currentstate; + self.pers[ "music" ].currentstate = state; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Setting Music State " + state + " On player " + self getentitynumber() ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Setting Music State " + state + " On player " + self getentitynumber() ); #/ - if ( isdefined( self.pers["music"].returnstate ) && return_state ) - { + } + if ( isDefined( self.pers[ "music" ].returnstate ) && return_state ) + { /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Starting Return State " + self.pers["music"].returnstate + " On " + self getentitynumber() ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Starting Return State " + self.pers[ "music" ].returnstate + " On " + self getentitynumber() ); #/ - self set_next_music_state( self.pers["music"].returnstate, wait_time ); - } + } + self set_next_music_state( self.pers[ "music" ].returnstate, wait_time ); + } } return_music_state_player( wait_time ) { - if ( !isdefined( wait_time ) ) - { - wait_time = 0; + if ( !isDefined( wait_time ) ) + { + wait_time = 0; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - - self set_next_music_state( self.pers["music"].returnstate, wait_time ); + } + } + self set_next_music_state( self.pers[ "music" ].returnstate, wait_time ); } return_music_state_team( team, wait_time ) { - if ( !isdefined( wait_time ) ) - { - wait_time = 0; + if ( !isDefined( wait_time ) ) + { + wait_time = 0; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( team == "both" ) - { - player thread set_next_music_state( self.pers["music"].returnstate, wait_time ); - continue; - } - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - { - player thread set_next_music_state( self.pers["music"].returnstate, wait_time ); + } + } + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( team == "both" ) + { + player thread set_next_music_state( self.pers[ "music" ].returnstate, wait_time ); + i++; + continue; + } + else + { + if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player thread set_next_music_state( self.pers[ "music" ].returnstate, wait_time ); /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Setting Music State " + self.pers["music"].returnstate + " On player " + player getentitynumber() ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Setting Music State " + self.pers[ "music" ].returnstate + " On player " + player getentitynumber() ); #/ - } - } + } + } + } + i++; + } } set_next_music_state( nextstate, wait_time ) { - self endon( "disconnect" ); - self.pers["music"].nextstate = nextstate; + self endon( "disconnect" ); + self.pers[ "music" ].nextstate = nextstate; /# - if ( getdvarint( _hash_BC4784C ) > 0 ) - println( "Music System - Setting next Music State " + self.pers["music"].nextstate + " On " + self getentitynumber() ); + if ( getDvarInt( #"0BC4784C" ) > 0 ) + { + println( "Music System - Setting next Music State " + self.pers[ "music" ].nextstate + " On " + self getentitynumber() ); #/ - if ( !isdefined( self.pers["music"].inque ) ) - self.pers["music"].inque = 0; - - if ( self.pers["music"].inque ) - { - return; + } + if ( !isDefined( self.pers[ "music" ].inque ) ) + { + self.pers[ "music" ].inque = 0; + } + if ( self.pers[ "music" ].inque ) + { + return; /# - println( "Music System - Music state in que" ); + println( "Music System - Music state in que" ); #/ - } - else - { - self.pers["music"].inque = 1; - - if ( wait_time ) - wait( wait_time ); - - self set_music_on_player( self.pers["music"].nextstate, 0 ); - self.pers["music"].inque = 0; - } + } + else + { + self.pers[ "music" ].inque = 1; + if ( wait_time ) + { + wait wait_time; + } + self set_music_on_player( self.pers[ "music" ].nextstate, 0 ); + self.pers[ "music" ].inque = 0; + } } getroundswitchdialog( switchtype ) { - switch ( switchtype ) - { - case "halftime": - return "halftime"; - case "overtime": - return "overtime"; - default: - return "side_switch"; - } + switch( switchtype ) + { + case "halftime": + return "halftime"; + case "overtime": + return "overtime"; + default: + return "side_switch"; + } } post_match_snapshot_watcher() { - level waittill( "game_ended" ); - - level clientnotify( "pm" ); - - level waittill( "sfade" ); - - level clientnotify( "pmf" ); + level waittill( "game_ended" ); + level clientnotify( "pm" ); + level waittill( "sfade" ); + level clientnotify( "pmf" ); } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_defaults.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_defaults.gsc index ce88617..059642d 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_defaults.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_defaults.gsc @@ -1,220 +1,230 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_globallogic_utils; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\gametypes_zm\_globallogic_audio; -#include maps\mp\gametypes_zm\_spawnlogic; +#include maps/mp/gametypes_zm/_spawnlogic; +#include maps/mp/gametypes_zm/_globallogic_audio; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/gametypes_zm/_globallogic; +#include maps/mp/gametypes_zm/_globallogic_utils; +#include maps/mp/_utility; +#include common_scripts/utility; getwinningteamfromloser( losing_team ) { - if ( level.multiteam ) - return "tie"; - else if ( losing_team == "axis" ) - return "allies"; - - return "axis"; + if ( level.multiteam ) + { + return "tie"; + } + else + { + if ( losing_team == "axis" ) + { + return "allies"; + } + } + return "axis"; } default_onforfeit( team ) { - level.gameforfeited = 1; - level notify( "forfeit in progress" ); - level endon( "forfeit in progress" ); - level endon( "abort forfeit" ); - forfeit_delay = 20.0; - announcement( game["strings"]["opponent_forfeiting_in"], forfeit_delay, 0 ); - wait 10.0; - announcement( game["strings"]["opponent_forfeiting_in"], 10.0, 0 ); - wait 10.0; - endreason = &""; - - if ( !isdefined( team ) ) - { - setdvar( "ui_text_endreason", game["strings"]["players_forfeited"] ); - endreason = game["strings"]["players_forfeited"]; - winner = level.players[0]; - } - else if ( isdefined( level.teams[team] ) ) - { - endreason = game["strings"][team + "_forfeited"]; - setdvar( "ui_text_endreason", endreason ); - winner = getwinningteamfromloser( team ); - } - else - { + level.gameforfeited = 1; + level notify( "forfeit in progress" ); + level endon( "forfeit in progress" ); + level endon( "abort forfeit" ); + forfeit_delay = 20; + announcement( game[ "strings" ][ "opponent_forfeiting_in" ], forfeit_delay, 0 ); + wait 10; + announcement( game[ "strings" ][ "opponent_forfeiting_in" ], 10, 0 ); + wait 10; + endreason = &""; + if ( !isDefined( team ) ) + { + setdvar( "ui_text_endreason", game[ "strings" ][ "players_forfeited" ] ); + endreason = game[ "strings" ][ "players_forfeited" ]; + winner = level.players[ 0 ]; + } + else if ( isDefined( level.teams[ team ] ) ) + { + endreason = game[ "strings" ][ team + "_forfeited" ]; + setdvar( "ui_text_endreason", endreason ); + winner = getwinningteamfromloser( team ); + } + else + { /# - assert( isdefined( team ), "Forfeited team is not defined" ); + assert( isDefined( team ), "Forfeited team is not defined" ); #/ /# - assert( 0, "Forfeited team " + team + " is not allies or axis" ); + assert( 0, "Forfeited team " + team + " is not allies or axis" ); #/ - winner = "tie"; - } - - level.forcedend = 1; - - if ( isplayer( winner ) ) - logstring( "forfeit, win: " + winner getxuid() + "(" + winner.name + ")" ); - else - maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "forfeit", winner ); - - thread maps\mp\gametypes_zm\_globallogic::endgame( winner, endreason ); + winner = "tie"; + } + level.forcedend = 1; + if ( isplayer( winner ) ) + { + logstring( "forfeit, win: " + winner getxuid() + "(" + winner.name + ")" ); + } + else + { + maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "forfeit", winner ); + } + thread maps/mp/gametypes_zm/_globallogic::endgame( winner, endreason ); } default_ondeadevent( team ) { - if ( isdefined( level.teams[team] ) ) - { - eliminatedstring = game["strings"][team + "_eliminated"]; - iprintln( eliminatedstring ); - makedvarserverinfo( "ui_text_endreason", eliminatedstring ); - setdvar( "ui_text_endreason", eliminatedstring ); - winner = getwinningteamfromloser( team ); - maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "team eliminated", winner ); - thread maps\mp\gametypes_zm\_globallogic::endgame( winner, eliminatedstring ); - } - else - { - makedvarserverinfo( "ui_text_endreason", game["strings"]["tie"] ); - setdvar( "ui_text_endreason", game["strings"]["tie"] ); - maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "tie" ); - - if ( level.teambased ) - thread maps\mp\gametypes_zm\_globallogic::endgame( "tie", game["strings"]["tie"] ); - else - thread maps\mp\gametypes_zm\_globallogic::endgame( undefined, game["strings"]["tie"] ); - } + if ( isDefined( level.teams[ team ] ) ) + { + eliminatedstring = game[ "strings" ][ team + "_eliminated" ]; + iprintln( eliminatedstring ); + makedvarserverinfo( "ui_text_endreason", eliminatedstring ); + setdvar( "ui_text_endreason", eliminatedstring ); + winner = getwinningteamfromloser( team ); + maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "team eliminated", winner ); + thread maps/mp/gametypes_zm/_globallogic::endgame( winner, eliminatedstring ); + } + else makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "tie" ] ); + setdvar( "ui_text_endreason", game[ "strings" ][ "tie" ] ); + maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "tie" ); + if ( level.teambased ) + { + thread maps/mp/gametypes_zm/_globallogic::endgame( "tie", game[ "strings" ][ "tie" ] ); + } + else + { + thread maps/mp/gametypes_zm/_globallogic::endgame( undefined, game[ "strings" ][ "tie" ] ); + } } default_onalivecountchange( team ) { - } default_onroundendgame( winner ) { - return winner; + return winner; } default_ononeleftevent( team ) { - if ( !level.teambased ) - { - winner = maps\mp\gametypes_zm\_globallogic_score::gethighestscoringplayer(); - - if ( isdefined( winner ) ) - logstring( "last one alive, win: " + winner.name ); - else - logstring( "last one alive, win: unknown" ); - - thread maps\mp\gametypes_zm\_globallogic::endgame( winner, &"MP_ENEMIES_ELIMINATED" ); - } - else - { - for ( index = 0; index < level.players.size; index++ ) - { - player = level.players[index]; - - if ( !isalive( player ) ) - continue; - - if ( !isdefined( player.pers["team"] ) || player.pers["team"] != team ) - continue; - - player maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "sudden_death" ); - } - } + if ( !level.teambased ) + { + winner = maps/mp/gametypes_zm/_globallogic_score::gethighestscoringplayer(); + if ( isDefined( winner ) ) + { + logstring( "last one alive, win: " + winner.name ); + } + else + { + logstring( "last one alive, win: unknown" ); + } + thread maps/mp/gametypes_zm/_globallogic::endgame( winner, &"MP_ENEMIES_ELIMINATED" ); + } + else + { + index = 0; + while ( index < level.players.size ) + { + player = level.players[ index ]; + if ( !isalive( player ) ) + { + index++; + continue; + } + else if ( !isDefined( player.pers[ "team" ] ) || player.pers[ "team" ] != team ) + { + index++; + continue; + } + else + { + player maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "sudden_death" ); + } + index++; + } + } } default_ontimelimit() { - winner = undefined; - - if ( level.teambased ) - { - winner = maps\mp\gametypes_zm\_globallogic::determineteamwinnerbygamestat( "teamScores" ); - maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "time limit", winner ); - } - else - { - winner = maps\mp\gametypes_zm\_globallogic_score::gethighestscoringplayer(); - - if ( isdefined( winner ) ) - logstring( "time limit, win: " + winner.name ); - else - logstring( "time limit, tie" ); - } - - makedvarserverinfo( "ui_text_endreason", game["strings"]["time_limit_reached"] ); - setdvar( "ui_text_endreason", game["strings"]["time_limit_reached"] ); - thread maps\mp\gametypes_zm\_globallogic::endgame( winner, game["strings"]["time_limit_reached"] ); + winner = undefined; + if ( level.teambased ) + { + winner = maps/mp/gametypes_zm/_globallogic::determineteamwinnerbygamestat( "teamScores" ); + maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "time limit", winner ); + } + else winner = maps/mp/gametypes_zm/_globallogic_score::gethighestscoringplayer(); + if ( isDefined( winner ) ) + { + logstring( "time limit, win: " + winner.name ); + } + else + { + logstring( "time limit, tie" ); + } + makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "time_limit_reached" ] ); + setdvar( "ui_text_endreason", game[ "strings" ][ "time_limit_reached" ] ); + thread maps/mp/gametypes_zm/_globallogic::endgame( winner, game[ "strings" ][ "time_limit_reached" ] ); } default_onscorelimit() { - if ( !level.endgameonscorelimit ) - return false; - - winner = undefined; - - if ( level.teambased ) - { - winner = maps\mp\gametypes_zm\_globallogic::determineteamwinnerbygamestat( "teamScores" ); - maps\mp\gametypes_zm\_globallogic_utils::logteamwinstring( "scorelimit", winner ); - } - else - { - winner = maps\mp\gametypes_zm\_globallogic_score::gethighestscoringplayer(); - - if ( isdefined( winner ) ) - logstring( "scorelimit, win: " + winner.name ); - else - logstring( "scorelimit, tie" ); - } - - makedvarserverinfo( "ui_text_endreason", game["strings"]["score_limit_reached"] ); - setdvar( "ui_text_endreason", game["strings"]["score_limit_reached"] ); - thread maps\mp\gametypes_zm\_globallogic::endgame( winner, game["strings"]["score_limit_reached"] ); - return true; + if ( !level.endgameonscorelimit ) + { + return 0; + } + winner = undefined; + if ( level.teambased ) + { + winner = maps/mp/gametypes_zm/_globallogic::determineteamwinnerbygamestat( "teamScores" ); + maps/mp/gametypes_zm/_globallogic_utils::logteamwinstring( "scorelimit", winner ); + } + else winner = maps/mp/gametypes_zm/_globallogic_score::gethighestscoringplayer(); + if ( isDefined( winner ) ) + { + logstring( "scorelimit, win: " + winner.name ); + } + else + { + logstring( "scorelimit, tie" ); + } + makedvarserverinfo( "ui_text_endreason", game[ "strings" ][ "score_limit_reached" ] ); + setdvar( "ui_text_endreason", game[ "strings" ][ "score_limit_reached" ] ); + thread maps/mp/gametypes_zm/_globallogic::endgame( winner, game[ "strings" ][ "score_limit_reached" ] ); + return 1; } default_onspawnspectator( origin, angles ) { - if ( isdefined( origin ) && isdefined( angles ) ) - { - self spawn( origin, angles ); - return; - } - - spawnpointname = "mp_global_intermission"; - spawnpoints = getentarray( spawnpointname, "classname" ); + if ( isDefined( origin ) && isDefined( angles ) ) + { + self spawn( origin, angles ); + return; + } + spawnpointname = "mp_global_intermission"; + spawnpoints = getentarray( spawnpointname, "classname" ); /# - assert( spawnpoints.size, "There are no mp_global_intermission spawn points in the map. There must be at least one." ); + assert( spawnpoints.size, "There are no mp_global_intermission spawn points in the map. There must be at least one." ); #/ - spawnpoint = maps\mp\gametypes_zm\_spawnlogic::getspawnpoint_random( spawnpoints ); - self spawn( spawnpoint.origin, spawnpoint.angles ); + spawnpoint = maps/mp/gametypes_zm/_spawnlogic::getspawnpoint_random( spawnpoints ); + self spawn( spawnpoint.origin, spawnpoint.angles ); } default_onspawnintermission() { - spawnpointname = "mp_global_intermission"; - spawnpoints = getentarray( spawnpointname, "classname" ); - spawnpoint = spawnpoints[0]; - - if ( isdefined( spawnpoint ) ) - self spawn( spawnpoint.origin, spawnpoint.angles ); - else - { + spawnpointname = "mp_global_intermission"; + spawnpoints = getentarray( spawnpointname, "classname" ); + spawnpoint = spawnpoints[ 0 ]; + if ( isDefined( spawnpoint ) ) + { + self spawn( spawnpoint.origin, spawnpoint.angles ); + } + else + { /# - maps\mp\_utility::error( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" ); + maps/mp/_utility::error( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" ); #/ - } + } } default_gettimelimit() { - return clamp( getgametypesetting( "timeLimit" ), level.timelimitmin, level.timelimitmax ); + return clamp( getgametypesetting( "timeLimit" ), level.timelimitmin, level.timelimitmax ); } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_player.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_player.gsc index 8fa6f5b..2de5b99 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_player.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_player.gsc @@ -1,2121 +1,2238 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\gametypes_zm\_hostmigration; -#include maps\mp\gametypes_zm\_globallogic_ui; -#include maps\mp\gametypes_zm\_globallogic_spawn; -#include maps\mp\gametypes_zm\_spectating; -#include maps\mp\gametypes_zm\_globallogic_utils; -#include maps\mp\gametypes_zm\_spawning; -#include maps\mp\gametypes_zm\_hud_message; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\_demo; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\gametypes_zm\_spawnlogic; -#include maps\mp\_challenges; -#include maps\mp\gametypes_zm\_tweakables; -#include maps\mp\gametypes_zm\_globallogic_audio; +#include maps/mp/gametypes_zm/_globallogic_audio; +#include maps/mp/gametypes_zm/_tweakables; +#include maps/mp/_challenges; +#include maps/mp/gametypes_zm/_spawnlogic; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/_demo; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/gametypes_zm/_spawning; +#include maps/mp/gametypes_zm/_globallogic_utils; +#include maps/mp/gametypes_zm/_spectating; +#include maps/mp/gametypes_zm/_globallogic_spawn; +#include maps/mp/gametypes_zm/_globallogic_ui; +#include maps/mp/gametypes_zm/_hostmigration; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/gametypes_zm/_globallogic; +#include common_scripts/utility; +#include maps/mp/_utility; freezeplayerforroundend() { - self clearlowermessage(); - self closemenu(); - self closeingamemenu(); - self freeze_player_controls( 1 ); - - if ( !sessionmodeiszombiesgame() ) - currentweapon = self getcurrentweapon(); + self clearlowermessage(); + self closemenu(); + self closeingamemenu(); + self freeze_player_controls( 1 ); + if ( !sessionmodeiszombiesgame() ) + { + currentweapon = self getcurrentweapon(); + } } callback_playerconnect() { - thread notifyconnecting(); - self.statusicon = "hud_status_connecting"; - - self waittill( "begin" ); - - if ( isdefined( level.reset_clientdvars ) ) - self [[ level.reset_clientdvars ]](); - - waittillframeend; - self.statusicon = ""; - self.guid = self getguid(); - profilelog_begintiming( 4, "ship" ); - level notify( "connected", self ); - - if ( self ishost() ) - self thread maps\mp\gametypes_zm\_globallogic::listenforgameend(); - - if ( !level.splitscreen && !isdefined( self.pers["score"] ) ) - iprintln( &"MP_CONNECTED", self ); - - if ( !isdefined( self.pers["score"] ) ) - self thread maps\mp\zombies\_zm_stats::adjustrecentstats(); - - if ( gamemodeismode( level.gamemode_public_match ) && !isdefined( self.pers["matchesPlayedStatsTracked"] ) ) - { - gamemode = maps\mp\gametypes_zm\_globallogic::getcurrentgamemode(); - self maps\mp\gametypes_zm\_globallogic::incrementmatchcompletionstat( gamemode, "played", "started" ); - - if ( !isdefined( self.pers["matchesHostedStatsTracked"] ) && self islocaltohost() ) - { - self maps\mp\gametypes_zm\_globallogic::incrementmatchcompletionstat( gamemode, "hosted", "started" ); - self.pers["matchesHostedStatsTracked"] = 1; - } - - self.pers["matchesPlayedStatsTracked"] = 1; - self thread maps\mp\zombies\_zm_stats::uploadstatssoon(); - } - - lpselfnum = self getentitynumber(); - lpguid = self getguid(); - logprint( "J;" + lpguid + ";" + lpselfnum + ";" + self.name + "\n" ); - bbprint( "mpjoins", "name %s client %s", self.name, lpselfnum ); - - if ( !sessionmodeiszombiesgame() ) - self setclientuivisibilityflag( "hud_visible", 1 ); - - if ( level.forceradar == 1 ) - { - self.pers["hasRadar"] = 1; - self.hasspyplane = 1; - level.activeuavs[self getentitynumber()] = 1; - } - - if ( level.forceradar == 2 ) - self setclientuivisibilityflag( "g_compassShowEnemies", level.forceradar ); - else - self setclientuivisibilityflag( "g_compassShowEnemies", 0 ); - - self setclientplayersprinttime( level.playersprinttime ); - self setclientnumlives( level.numlives ); - makedvarserverinfo( "cg_drawTalk", 1 ); - - if ( level.hardcoremode ) - self setclientdrawtalk( 3 ); - - if ( sessionmodeiszombiesgame() ) - self [[ level.player_stats_init ]](); - else - { - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "score" ); - - if ( level.resetplayerscoreeveryround ) - self.pers["score"] = 0; - - self.score = self.pers["score"]; - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "momentum", 0 ); - self.momentum = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "momentum" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "suicides" ); - self.suicides = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "suicides" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "headshots" ); - self.headshots = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "headshots" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "challenges" ); - self.challenges = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "challenges" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "kills" ); - self.kills = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "kills" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "deaths" ); - self.deaths = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "deaths" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "assists" ); - self.assists = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "assists" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "defends", 0 ); - self.defends = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "defends" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "offends", 0 ); - self.offends = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "offends" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "plants", 0 ); - self.plants = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "plants" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "defuses", 0 ); - self.defuses = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "defuses" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "returns", 0 ); - self.returns = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "returns" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "captures", 0 ); - self.captures = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "captures" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "destructions", 0 ); - self.destructions = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "destructions" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "backstabs", 0 ); - self.backstabs = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "backstabs" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "longshots", 0 ); - self.longshots = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "longshots" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "survived", 0 ); - self.survived = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "survived" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "stabs", 0 ); - self.stabs = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "stabs" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomahawks", 0 ); - self.tomahawks = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "tomahawks" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "humiliated", 0 ); - self.humiliated = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "humiliated" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "x2score", 0 ); - self.x2score = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "x2score" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "agrkills", 0 ); - self.x2score = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "agrkills" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "hacks", 0 ); - self.x2score = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "hacks" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "sessionbans", 0 ); - self.sessionbans = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "sessionbans" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "gametypeban", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "time_played_total", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "time_played_alive", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "teamkills", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "teamkills_nostats", 0 ); - self.teamkillpunish = 0; - - if ( level.minimumallowedteamkills >= 0 && self.pers["teamkills_nostats"] > level.minimumallowedteamkills ) - self thread reduceteamkillsovertime(); - } - - if ( getdvar( "r_reflectionProbeGenerate" ) == "1" ) - level waittill( "eternity" ); - - self.killedplayerscurrent = []; - - if ( !isdefined( self.pers["best_kill_streak"] ) ) - { - self.pers["killed_players"] = []; - self.pers["killed_by"] = []; - self.pers["nemesis_tracking"] = []; - self.pers["artillery_kills"] = 0; - self.pers["dog_kills"] = 0; - self.pers["nemesis_name"] = ""; - self.pers["nemesis_rank"] = 0; - self.pers["nemesis_rankIcon"] = 0; - self.pers["nemesis_xp"] = 0; - self.pers["nemesis_xuid"] = ""; - self.pers["best_kill_streak"] = 0; - } - - if ( !isdefined( self.pers["music"] ) ) - { - self.pers["music"] = spawnstruct(); - self.pers["music"].spawn = 0; - self.pers["music"].inque = 0; - self.pers["music"].currentstate = "SILENT"; - self.pers["music"].previousstate = "SILENT"; - self.pers["music"].nextstate = "UNDERSCORE"; - self.pers["music"].returnstate = "UNDERSCORE"; - } - - self.leaderdialogqueue = []; - self.leaderdialogactive = 0; - self.leaderdialoggroups = []; - self.currentleaderdialoggroup = ""; - self.currentleaderdialog = ""; - self.currentleaderdialogtime = 0; - - if ( !isdefined( self.pers["cur_kill_streak"] ) ) - self.pers["cur_kill_streak"] = 0; - - if ( !isdefined( self.pers["cur_total_kill_streak"] ) ) - { - self.pers["cur_total_kill_streak"] = 0; - self setplayercurrentstreak( 0 ); - } - - if ( !isdefined( self.pers["totalKillstreakCount"] ) ) - self.pers["totalKillstreakCount"] = 0; - - if ( !isdefined( self.pers["killstreaksEarnedThisKillstreak"] ) ) - self.pers["killstreaksEarnedThisKillstreak"] = 0; - - if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks && !isdefined( self.pers["killstreak_quantity"] ) ) - self.pers["killstreak_quantity"] = []; - - if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks && !isdefined( self.pers["held_killstreak_ammo_count"] ) ) - self.pers["held_killstreak_ammo_count"] = []; - - self.lastkilltime = 0; - self.cur_death_streak = 0; - self disabledeathstreak(); - self.death_streak = 0; - self.kill_streak = 0; - self.gametype_kill_streak = 0; - self.spawnqueueindex = -1; - self.deathtime = 0; - self.lastgrenadesuicidetime = -1; - self.teamkillsthisround = 0; - - if ( !isdefined( level.livesdonotreset ) || !level.livesdonotreset || !isdefined( self.pers["lives"] ) ) - self.pers["lives"] = level.numlives; - - if ( !level.teambased ) - self.pers["team"] = undefined; - - self.hasspawned = 0; - self.waitingtospawn = 0; - self.wantsafespawn = 0; - self.deathcount = 0; - self.wasaliveatmatchstart = 0; - level.players[level.players.size] = self; - - if ( level.splitscreen ) - setdvar( "splitscreen_playerNum", level.players.size ); - - if ( game["state"] == "postgame" ) - { - self.pers["needteam"] = 1; - self.pers["team"] = "spectator"; - self.team = "spectator"; - self setclientuivisibilityflag( "hud_visible", 0 ); - self [[ level.spawnintermission ]](); - self closemenu(); - self closeingamemenu(); - profilelog_endtiming( 4, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); - return; - } - - if ( level.scr_zm_ui_gametype_group == "zencounter" ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "losses" ); - self updatestatratio( "wlratio", "wins", "losses" ); - - if ( gamemodeismode( level.gamemode_public_match ) ) - self maps\mp\zombies\_zm_stats::add_location_gametype_stat( level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "losses", 1 ); - } - else if ( level.scr_zm_ui_gametype_group == "zsurvival" ) - { - if ( is_true( level.should_use_cia ) ) - self luinotifyevent( &"hud_update_survival_team", 1, 2 ); - } - - level endon( "game_ended" ); - - if ( isdefined( level.hostmigrationtimer ) ) - self thread maps\mp\gametypes_zm\_hostmigration::hostmigrationtimerthink(); - - if ( level.oldschool ) - { - self.pers["class"] = undefined; - self.class = self.pers["class"]; - } - - if ( isdefined( self.pers["team"] ) ) - self.team = self.pers["team"]; - - if ( isdefined( self.pers["class"] ) ) - self.class = self.pers["class"]; - - if ( !isdefined( self.pers["team"] ) || isdefined( self.pers["needteam"] ) ) - { - self.pers["needteam"] = undefined; - self.pers["team"] = "spectator"; - self.team = "spectator"; - self.sessionstate = "dead"; - self maps\mp\gametypes_zm\_globallogic_ui::updateobjectivetext(); - [[ level.spawnspectator ]](); - - if ( level.rankedmatch ) - { - [[ level.autoassign ]]( 0 ); - self thread maps\mp\gametypes_zm\_globallogic_spawn::kickifdontspawn(); - } - else - [[ level.autoassign ]]( 0 ); - - if ( self.pers["team"] == "spectator" ) - { - self.sessionteam = "spectator"; - - if ( !level.teambased ) - self.ffateam = "spectator"; - - self thread spectate_player_watcher(); - } - - if ( level.teambased ) - { - self.sessionteam = self.pers["team"]; - - if ( !isalive( self ) ) - self.statusicon = "hud_status_dead"; - - self thread maps\mp\gametypes_zm\_spectating::setspectatepermissions(); - } - } - else if ( self.pers["team"] == "spectator" ) - { - self setclientscriptmainmenu( game["menu_class"] ); - [[ level.spawnspectator ]](); - self.sessionteam = "spectator"; - self.sessionstate = "spectator"; - - if ( !level.teambased ) - self.ffateam = "spectator"; - - self thread spectate_player_watcher(); - } - else - { - self.sessionteam = self.pers["team"]; - self.sessionstate = "dead"; - - if ( !level.teambased ) - self.ffateam = self.pers["team"]; - - self maps\mp\gametypes_zm\_globallogic_ui::updateobjectivetext(); - [[ level.spawnspectator ]](); - - if ( maps\mp\gametypes_zm\_globallogic_utils::isvalidclass( self.pers["class"] ) ) - self thread [[ level.spawnclient ]](); - else - self maps\mp\gametypes_zm\_globallogic_ui::showmainmenuforteam(); - - self thread maps\mp\gametypes_zm\_spectating::setspectatepermissions(); - } - - if ( self.sessionteam != "spectator" ) - self thread maps\mp\gametypes_zm\_spawning::onspawnplayer_unified( 1 ); - - profilelog_endtiming( 4, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); - - if ( isdefined( self.pers["isBot"] ) ) - return; + thread notifyconnecting(); + self.statusicon = "hud_status_connecting"; + self waittill( "begin" ); + if ( isDefined( level.reset_clientdvars ) ) + { + self [[ level.reset_clientdvars ]](); + } + waittillframeend; + self.statusicon = ""; + self.guid = self getguid(); + profilelog_begintiming( 4, "ship" ); + level notify( "connected" ); + if ( self ishost() ) + { + self thread maps/mp/gametypes_zm/_globallogic::listenforgameend(); + } + if ( !level.splitscreen && !isDefined( self.pers[ "score" ] ) ) + { + iprintln( &"MP_CONNECTED", self ); + } + if ( !isDefined( self.pers[ "score" ] ) ) + { + self thread maps/mp/zombies/_zm_stats::adjustrecentstats(); + } + if ( gamemodeismode( level.gamemode_public_match ) && !isDefined( self.pers[ "matchesPlayedStatsTracked" ] ) ) + { + gamemode = maps/mp/gametypes_zm/_globallogic::getcurrentgamemode(); + self maps/mp/gametypes_zm/_globallogic::incrementmatchcompletionstat( gamemode, "played", "started" ); + if ( !isDefined( self.pers[ "matchesHostedStatsTracked" ] ) && self islocaltohost() ) + { + self maps/mp/gametypes_zm/_globallogic::incrementmatchcompletionstat( gamemode, "hosted", "started" ); + self.pers[ "matchesHostedStatsTracked" ] = 1; + } + self.pers[ "matchesPlayedStatsTracked" ] = 1; + self thread maps/mp/zombies/_zm_stats::uploadstatssoon(); + } + lpselfnum = self getentitynumber(); + lpguid = self getguid(); + logprint( "J;" + lpguid + ";" + lpselfnum + ";" + self.name + "\n" ); + bbprint( "mpjoins", "name %s client %s", self.name, lpselfnum ); + if ( !sessionmodeiszombiesgame() ) + { + self setclientuivisibilityflag( "hud_visible", 1 ); + } + if ( level.forceradar == 1 ) + { + self.pers[ "hasRadar" ] = 1; + self.hasspyplane = 1; + level.activeuavs[ self getentitynumber() ] = 1; + } + if ( level.forceradar == 2 ) + { + self setclientuivisibilityflag( "g_compassShowEnemies", level.forceradar ); + } + else + { + self setclientuivisibilityflag( "g_compassShowEnemies", 0 ); + } + self setclientplayersprinttime( level.playersprinttime ); + self setclientnumlives( level.numlives ); + makedvarserverinfo( "cg_drawTalk", 1 ); + if ( level.hardcoremode ) + { + self setclientdrawtalk( 3 ); + } + if ( sessionmodeiszombiesgame() ) + { + self [[ level.player_stats_init ]](); + } + else + { + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "score" ); + if ( level.resetplayerscoreeveryround ) + { + self.pers[ "score" ] = 0; + } + self.score = self.pers[ "score" ]; + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "momentum", 0 ); + self.momentum = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "momentum" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "suicides" ); + self.suicides = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "suicides" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "headshots" ); + self.headshots = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "headshots" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "challenges" ); + self.challenges = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "challenges" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "kills" ); + self.kills = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "kills" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "deaths" ); + self.deaths = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "deaths" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "assists" ); + self.assists = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "assists" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "defends", 0 ); + self.defends = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "defends" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "offends", 0 ); + self.offends = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "offends" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "plants", 0 ); + self.plants = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "plants" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "defuses", 0 ); + self.defuses = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "defuses" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "returns", 0 ); + self.returns = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "returns" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "captures", 0 ); + self.captures = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "captures" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "destructions", 0 ); + self.destructions = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "destructions" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "backstabs", 0 ); + self.backstabs = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "backstabs" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "longshots", 0 ); + self.longshots = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "longshots" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "survived", 0 ); + self.survived = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "survived" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "stabs", 0 ); + self.stabs = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "stabs" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomahawks", 0 ); + self.tomahawks = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "tomahawks" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "humiliated", 0 ); + self.humiliated = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "humiliated" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "x2score", 0 ); + self.x2score = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "x2score" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "agrkills", 0 ); + self.x2score = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "agrkills" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "hacks", 0 ); + self.x2score = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "hacks" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sessionbans", 0 ); + self.sessionbans = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "sessionbans" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "gametypeban", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "time_played_total", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "time_played_alive", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "teamkills", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "teamkills_nostats", 0 ); + self.teamkillpunish = 0; + if ( level.minimumallowedteamkills >= 0 && self.pers[ "teamkills_nostats" ] > level.minimumallowedteamkills ) + { + self thread reduceteamkillsovertime(); + } + } + if ( getDvar( #"F7B30924" ) == "1" ) + { + level waittill( "eternity" ); + } + self.killedplayerscurrent = []; + if ( !isDefined( self.pers[ "best_kill_streak" ] ) ) + { + self.pers[ "killed_players" ] = []; + self.pers[ "killed_by" ] = []; + self.pers[ "nemesis_tracking" ] = []; + self.pers[ "artillery_kills" ] = 0; + self.pers[ "dog_kills" ] = 0; + self.pers[ "nemesis_name" ] = ""; + self.pers[ "nemesis_rank" ] = 0; + self.pers[ "nemesis_rankIcon" ] = 0; + self.pers[ "nemesis_xp" ] = 0; + self.pers[ "nemesis_xuid" ] = ""; + self.pers[ "best_kill_streak" ] = 0; + } + if ( !isDefined( self.pers[ "music" ] ) ) + { + self.pers[ "music" ] = spawnstruct(); + self.pers[ "music" ].spawn = 0; + self.pers[ "music" ].inque = 0; + self.pers[ "music" ].currentstate = "SILENT"; + self.pers[ "music" ].previousstate = "SILENT"; + self.pers[ "music" ].nextstate = "UNDERSCORE"; + self.pers[ "music" ].returnstate = "UNDERSCORE"; + } + self.leaderdialogqueue = []; + self.leaderdialogactive = 0; + self.leaderdialoggroups = []; + self.currentleaderdialoggroup = ""; + self.currentleaderdialog = ""; + self.currentleaderdialogtime = 0; + if ( !isDefined( self.pers[ "cur_kill_streak" ] ) ) + { + self.pers[ "cur_kill_streak" ] = 0; + } + if ( !isDefined( self.pers[ "cur_total_kill_streak" ] ) ) + { + self.pers[ "cur_total_kill_streak" ] = 0; + self setplayercurrentstreak( 0 ); + } + if ( !isDefined( self.pers[ "totalKillstreakCount" ] ) ) + { + self.pers[ "totalKillstreakCount" ] = 0; + } + if ( !isDefined( self.pers[ "killstreaksEarnedThisKillstreak" ] ) ) + { + self.pers[ "killstreaksEarnedThisKillstreak" ] = 0; + } + if ( isDefined( level.usingscorestreaks ) && level.usingscorestreaks && !isDefined( self.pers[ "killstreak_quantity" ] ) ) + { + self.pers[ "killstreak_quantity" ] = []; + } + if ( isDefined( level.usingscorestreaks ) && level.usingscorestreaks && !isDefined( self.pers[ "held_killstreak_ammo_count" ] ) ) + { + self.pers[ "held_killstreak_ammo_count" ] = []; + } + self.lastkilltime = 0; + self.cur_death_streak = 0; + self disabledeathstreak(); + self.death_streak = 0; + self.kill_streak = 0; + self.gametype_kill_streak = 0; + self.spawnqueueindex = -1; + self.deathtime = 0; + self.lastgrenadesuicidetime = -1; + self.teamkillsthisround = 0; + if ( isDefined( level.livesdonotreset ) || !level.livesdonotreset && !isDefined( self.pers[ "lives" ] ) ) + { + self.pers[ "lives" ] = level.numlives; + } + if ( !level.teambased ) + { + } + self.hasspawned = 0; + self.waitingtospawn = 0; + self.wantsafespawn = 0; + self.deathcount = 0; + self.wasaliveatmatchstart = 0; + level.players[ level.players.size ] = self; + if ( level.splitscreen ) + { + setdvar( "splitscreen_playerNum", level.players.size ); + } + if ( game[ "state" ] == "postgame" ) + { + self.pers[ "needteam" ] = 1; + self.pers[ "team" ] = "spectator"; + self.team = "spectator"; + self setclientuivisibilityflag( "hud_visible", 0 ); + self [[ level.spawnintermission ]](); + self closemenu(); + self closeingamemenu(); + profilelog_endtiming( 4, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); + return; + } + if ( level.scr_zm_ui_gametype_group == "zencounter" ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "losses" ); + self updatestatratio( "wlratio", "wins", "losses" ); + if ( gamemodeismode( level.gamemode_public_match ) ) + { + self maps/mp/zombies/_zm_stats::add_location_gametype_stat( level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "losses", 1 ); + } + } + else + { + if ( level.scr_zm_ui_gametype_group == "zsurvival" ) + { + if ( is_true( level.should_use_cia ) ) + { + self luinotifyevent( &"hud_update_survival_team", 1, 2 ); + } + } + } + level endon( "game_ended" ); + if ( isDefined( level.hostmigrationtimer ) ) + { + self thread maps/mp/gametypes_zm/_hostmigration::hostmigrationtimerthink(); + } + if ( level.oldschool ) + { + self.class = self.pers[ "class" ]; + } + if ( isDefined( self.pers[ "team" ] ) ) + { + self.team = self.pers[ "team" ]; + } + if ( isDefined( self.pers[ "class" ] ) ) + { + self.class = self.pers[ "class" ]; + } + if ( !isDefined( self.pers[ "team" ] ) || isDefined( self.pers[ "needteam" ] ) ) + { + self.pers[ "team" ] = "spectator"; + self.team = "spectator"; + self.sessionstate = "dead"; + self maps/mp/gametypes_zm/_globallogic_ui::updateobjectivetext(); + [[ level.spawnspectator ]](); + if ( level.rankedmatch ) + { + [[ level.autoassign ]]( 0 ); + self thread maps/mp/gametypes_zm/_globallogic_spawn::kickifdontspawn(); + } + else + { + [[ level.autoassign ]]( 0 ); + } + if ( self.pers[ "team" ] == "spectator" ) + { + self.sessionteam = "spectator"; + if ( !level.teambased ) + { + self.ffateam = "spectator"; + } + self thread spectate_player_watcher(); + } + if ( level.teambased ) + { + self.sessionteam = self.pers[ "team" ]; + if ( !isalive( self ) ) + { + self.statusicon = "hud_status_dead"; + } + self thread maps/mp/gametypes_zm/_spectating::setspectatepermissions(); + } + } + else + { + if ( self.pers[ "team" ] == "spectator" ) + { + self setclientscriptmainmenu( game[ "menu_class" ] ); + [[ level.spawnspectator ]](); + self.sessionteam = "spectator"; + self.sessionstate = "spectator"; + if ( !level.teambased ) + { + self.ffateam = "spectator"; + } + self thread spectate_player_watcher(); + } + else + { + self.sessionteam = self.pers[ "team" ]; + self.sessionstate = "dead"; + if ( !level.teambased ) + { + self.ffateam = self.pers[ "team" ]; + } + self maps/mp/gametypes_zm/_globallogic_ui::updateobjectivetext(); + [[ level.spawnspectator ]](); + if ( maps/mp/gametypes_zm/_globallogic_utils::isvalidclass( self.pers[ "class" ] ) ) + { + self thread [[ level.spawnclient ]](); + } + else + { + self maps/mp/gametypes_zm/_globallogic_ui::showmainmenuforteam(); + } + self thread maps/mp/gametypes_zm/_spectating::setspectatepermissions(); + } + } + if ( self.sessionteam != "spectator" ) + { + self thread maps/mp/gametypes_zm/_spawning::onspawnplayer_unified( 1 ); + } + profilelog_endtiming( 4, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); + if ( isDefined( self.pers[ "isBot" ] ) ) + { + return; + } } spectate_player_watcher() { - self endon( "disconnect" ); - self.watchingactiveclient = 1; - self.waitingforplayerstext = undefined; - - while ( true ) - { - if ( self.pers["team"] != "spectator" || level.gameended ) - { - self maps\mp\gametypes_zm\_hud_message::clearshoutcasterwaitingmessage(); + self endon( "disconnect" ); + self.watchingactiveclient = 1; + self.waitingforplayerstext = undefined; + while ( 1 ) + { + if ( self.pers[ "team" ] != "spectator" || level.gameended ) + { + self maps/mp/gametypes_zm/_hud_message::clearshoutcasterwaitingmessage(); /# - println( " Unfreeze controls 1" ); + println( " Unfreeze controls 1" ); #/ - self freezecontrols( 0 ); - self.watchingactiveclient = 0; - break; - } - else - { - if ( !level.splitscreen && !level.hardcoremode && getdvarint( "scr_showperksonspawn" ) == 1 && game["state"] != "postgame" && !isdefined( self.perkhudelem ) ) - { - if ( level.perksenabled == 1 ) - self maps\mp\gametypes_zm\_hud_util::showperks(); - - self thread maps\mp\gametypes_zm\_globallogic_ui::hideloadoutaftertime( 0 ); - } - - count = 0; - - for ( i = 0; i < level.players.size; i++ ) - { - if ( level.players[i].team != "spectator" ) - { - count++; - break; - } - } - - if ( count > 0 ) - { - if ( !self.watchingactiveclient ) - { - self maps\mp\gametypes_zm\_hud_message::clearshoutcasterwaitingmessage(); - self freezecontrols( 0 ); + self freezecontrols( 0 ); + self.watchingactiveclient = 0; + return; + } + else if ( !level.splitscreen && !level.hardcoremode && getDvarInt( "scr_showperksonspawn" ) == 1 && game[ "state" ] != "postgame" && !isDefined( self.perkhudelem ) ) + { + if ( level.perksenabled == 1 ) + { + self maps/mp/gametypes_zm/_hud_util::showperks(); + } + self thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutaftertime( 0 ); + } + count = 0; + i = 0; + while ( i < level.players.size ) + { + if ( level.players[ i ].team != "spectator" ) + { + count++; + break; + } + else + { + i++; + } + } + if ( count > 0 ) + { + if ( !self.watchingactiveclient ) + { + self maps/mp/gametypes_zm/_hud_message::clearshoutcasterwaitingmessage(); + self freezecontrols( 0 ); /# - println( " Unfreeze controls 2" ); + println( " Unfreeze controls 2" ); #/ - } - - self.watchingactiveclient = 1; - } - else - { - if ( self.watchingactiveclient ) - { - [[ level.onspawnspectator ]](); - self freezecontrols( 1 ); - self maps\mp\gametypes_zm\_hud_message::setshoutcasterwaitingmessage(); - } - - self.watchingactiveclient = 0; - } - - wait 0.5; - } - } + } + self.watchingactiveclient = 1; + } + else + { + if ( self.watchingactiveclient ) + { + [[ level.onspawnspectator ]](); + self freezecontrols( 1 ); + self maps/mp/gametypes_zm/_hud_message::setshoutcasterwaitingmessage(); + } + self.watchingactiveclient = 0; + } + wait 0,5; + } } callback_playermigrated() { /# - println( "Player " + self.name + " finished migrating at time " + gettime() ); + println( "Player " + self.name + " finished migrating at time " + getTime() ); #/ - if ( isdefined( self.connected ) && self.connected ) - self maps\mp\gametypes_zm\_globallogic_ui::updateobjectivetext(); - - self thread inform_clientvm_of_migration(); - level.hostmigrationreturnedplayercount++; - - if ( level.hostmigrationreturnedplayercount >= level.players.size * 2 / 3 ) - { + if ( isDefined( self.connected ) && self.connected ) + { + self maps/mp/gametypes_zm/_globallogic_ui::updateobjectivetext(); + } + self thread inform_clientvm_of_migration(); + level.hostmigrationreturnedplayercount++; + if ( level.hostmigrationreturnedplayercount >= ( ( level.players.size * 2 ) / 3 ) ) + { /# - println( "2/3 of players have finished migrating" ); + println( "2/3 of players have finished migrating" ); #/ - level notify( "hostmigration_enoughplayers" ); - } + level notify( "hostmigration_enoughplayers" ); + } } inform_clientvm_of_migration() { - self endon( "disconnect" ); - wait 1.0; - self clientnotify( "hmo" ); + self endon( "disconnect" ); + wait 1; + self clientnotify( "hmo" ); /# - println( "SERVER : Sent HMO to client " + self getentitynumber() ); + println( "SERVER : Sent HMO to client " + self getentitynumber() ); #/ } callback_playerdisconnect() { - profilelog_begintiming( 5, "ship" ); - - if ( game["state"] != "postgame" && !level.gameended ) - { - gamelength = maps\mp\gametypes_zm\_globallogic::getgamelength(); - self maps\mp\gametypes_zm\_globallogic::bbplayermatchend( gamelength, "MP_PLAYER_DISCONNECT", 0 ); - } - - self removeplayerondisconnect(); - - if ( level.splitscreen ) - { - players = level.players; - - if ( players.size <= 1 ) - level thread maps\mp\gametypes_zm\_globallogic::forceend(); - - setdvar( "splitscreen_playerNum", players.size ); - } - - if ( isdefined( self.score ) && isdefined( self.pers["team"] ) ) - { - self logstring( "team: score " + self.pers["team"] + ":" + self.score ); - level.dropteam += 1; - } - - [[ level.onplayerdisconnect ]](); - lpselfnum = self getentitynumber(); - lpguid = self getguid(); - logprint( "Q;" + lpguid + ";" + lpselfnum + ";" + self.name + "\n" ); - - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( level.players[entry] == self ) - { - while ( entry < level.players.size - 1 ) - { - level.players[entry] = level.players[entry + 1]; - entry++; - } - - level.players[entry] = undefined; - break; - } - } - - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( isdefined( level.players[entry].pers["killed_players"][self.name] ) ) - level.players[entry].pers["killed_players"][self.name] = undefined; - - if ( isdefined( level.players[entry].killedplayerscurrent[self.name] ) ) - level.players[entry].killedplayerscurrent[self.name] = undefined; - - if ( isdefined( level.players[entry].pers["killed_by"][self.name] ) ) - level.players[entry].pers["killed_by"][self.name] = undefined; - - if ( isdefined( level.players[entry].pers["nemesis_tracking"][self.name] ) ) - level.players[entry].pers["nemesis_tracking"][self.name] = undefined; - - if ( level.players[entry].pers["nemesis_name"] == self.name ) - level.players[entry] choosenextbestnemesis(); - } - - if ( level.gameended ) - self maps\mp\gametypes_zm\_globallogic::removedisconnectedplayerfromplacement(); - - level thread maps\mp\gametypes_zm\_globallogic::updateteamstatus(); - profilelog_endtiming( 5, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); + profilelog_begintiming( 5, "ship" ); + if ( game[ "state" ] != "postgame" && !level.gameended ) + { + gamelength = maps/mp/gametypes_zm/_globallogic::getgamelength(); + self maps/mp/gametypes_zm/_globallogic::bbplayermatchend( gamelength, "MP_PLAYER_DISCONNECT", 0 ); + } + self removeplayerondisconnect(); + if ( level.splitscreen ) + { + players = level.players; + if ( players.size <= 1 ) + { + level thread maps/mp/gametypes_zm/_globallogic::forceend(); + } + setdvar( "splitscreen_playerNum", players.size ); + } + if ( isDefined( self.score ) && isDefined( self.pers[ "team" ] ) ) + { + self logstring( "team: score " + self.pers[ "team" ] + ":" + self.score ); + level.dropteam += 1; + } + [[ level.onplayerdisconnect ]](); + lpselfnum = self getentitynumber(); + lpguid = self getguid(); + logprint( "Q;" + lpguid + ";" + lpselfnum + ";" + self.name + "\n" ); + entry = 0; + while ( entry < level.players.size ) + { + if ( level.players[ entry ] == self ) + { + while ( entry < ( level.players.size - 1 ) ) + { + level.players[ entry ] = level.players[ entry + 1 ]; + entry++; + } + break; + } + else + { + entry++; + } + } + entry = 0; + while ( entry < level.players.size ) + { + if ( isDefined( level.players[ entry ].pers[ "killed_players" ][ self.name ] ) ) + { + } + if ( isDefined( level.players[ entry ].killedplayerscurrent[ self.name ] ) ) + { + } + if ( isDefined( level.players[ entry ].pers[ "killed_by" ][ self.name ] ) ) + { + } + if ( isDefined( level.players[ entry ].pers[ "nemesis_tracking" ][ self.name ] ) ) + { + } + if ( level.players[ entry ].pers[ "nemesis_name" ] == self.name ) + { + level.players[ entry ] choosenextbestnemesis(); + } + entry++; + } + if ( level.gameended ) + { + self maps/mp/gametypes_zm/_globallogic::removedisconnectedplayerfromplacement(); + } + level thread maps/mp/gametypes_zm/_globallogic::updateteamstatus(); + profilelog_endtiming( 5, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); } callback_playermelee( eattacker, idamage, sweapon, vorigin, vdir, boneindex, shieldhit ) { - hit = 1; - - if ( level.teambased && self.team == eattacker.team ) - { - if ( level.friendlyfire == 0 ) - hit = 0; - } - - self finishmeleehit( eattacker, sweapon, vorigin, vdir, boneindex, shieldhit, hit ); + hit = 1; + if ( level.teambased && self.team == eattacker.team ) + { + if ( level.friendlyfire == 0 ) + { + hit = 0; + } + } + self finishmeleehit( eattacker, sweapon, vorigin, vdir, boneindex, shieldhit, hit ); } choosenextbestnemesis() { - nemesisarray = self.pers["nemesis_tracking"]; - nemesisarraykeys = getarraykeys( nemesisarray ); - nemesisamount = 0; - nemesisname = ""; - - if ( nemesisarraykeys.size > 0 ) - { - for ( i = 0; i < nemesisarraykeys.size; i++ ) - { - nemesisarraykey = nemesisarraykeys[i]; - - if ( nemesisarray[nemesisarraykey] > nemesisamount ) - { - nemesisname = nemesisarraykey; - nemesisamount = nemesisarray[nemesisarraykey]; - } - } - } - - self.pers["nemesis_name"] = nemesisname; - - if ( nemesisname != "" ) - { - for ( playerindex = 0; playerindex < level.players.size; playerindex++ ) - { - if ( level.players[playerindex].name == nemesisname ) - { - nemesisplayer = level.players[playerindex]; - self.pers["nemesis_rank"] = nemesisplayer.pers["rank"]; - self.pers["nemesis_rankIcon"] = nemesisplayer.pers["rankxp"]; - self.pers["nemesis_xp"] = nemesisplayer.pers["prestige"]; - self.pers["nemesis_xuid"] = nemesisplayer getxuid( 1 ); - break; - } - } - } - else - self.pers["nemesis_xuid"] = ""; + nemesisarray = self.pers[ "nemesis_tracking" ]; + nemesisarraykeys = getarraykeys( nemesisarray ); + nemesisamount = 0; + nemesisname = ""; + while ( nemesisarraykeys.size > 0 ) + { + i = 0; + while ( i < nemesisarraykeys.size ) + { + nemesisarraykey = nemesisarraykeys[ i ]; + if ( nemesisarray[ nemesisarraykey ] > nemesisamount ) + { + nemesisname = nemesisarraykey; + nemesisamount = nemesisarray[ nemesisarraykey ]; + } + i++; + } + } + self.pers[ "nemesis_name" ] = nemesisname; + if ( nemesisname != "" ) + { + playerindex = 0; + while ( playerindex < level.players.size ) + { + if ( level.players[ playerindex ].name == nemesisname ) + { + nemesisplayer = level.players[ playerindex ]; + self.pers[ "nemesis_rank" ] = nemesisplayer.pers[ "rank" ]; + self.pers[ "nemesis_rankIcon" ] = nemesisplayer.pers[ "rankxp" ]; + self.pers[ "nemesis_xp" ] = nemesisplayer.pers[ "prestige" ]; + self.pers[ "nemesis_xuid" ] = nemesisplayer getxuid( 1 ); + break; + } + else + { + playerindex++; + } + } + } + else self.pers[ "nemesis_xuid" ] = ""; } removeplayerondisconnect() { - for ( entry = 0; entry < level.players.size; entry++ ) - { - if ( level.players[entry] == self ) - { - while ( entry < level.players.size - 1 ) - { - level.players[entry] = level.players[entry + 1]; - entry++; - } - - level.players[entry] = undefined; - break; - } - } + entry = 0; + while ( entry < level.players.size ) + { + if ( level.players[ entry ] == self ) + { + while ( entry < ( level.players.size - 1 ) ) + { + level.players[ entry ] = level.players[ entry + 1 ]; + entry++; + } + return; + } + else + { + entry++; + } + } } custom_gamemodes_modified_damage( victim, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ) { - if ( level.onlinegame && !sessionmodeisprivate() ) - return idamage; - - if ( isdefined( eattacker ) && isdefined( eattacker.damagemodifier ) ) - idamage *= eattacker.damagemodifier; - - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) - idamage = int( idamage * level.bulletdamagescalar ); - - return idamage; + if ( level.onlinegame && !sessionmodeisprivate() ) + { + return idamage; + } + if ( isDefined( eattacker ) && isDefined( eattacker.damagemodifier ) ) + { + idamage *= eattacker.damagemodifier; + } + if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) + { + idamage = int( idamage * level.bulletdamagescalar ); + } + return idamage; } figureoutattacker( eattacker ) { - if ( isdefined( eattacker ) ) - { - if ( isai( eattacker ) && isdefined( eattacker.script_owner ) ) - { - team = self.team; - - if ( isai( self ) && isdefined( self.aiteam ) ) - team = self.aiteam; - - if ( eattacker.script_owner.team != team ) - eattacker = eattacker.script_owner; - } - - if ( eattacker.classname == "script_vehicle" && isdefined( eattacker.owner ) ) - eattacker = eattacker.owner; - else if ( eattacker.classname == "auto_turret" && isdefined( eattacker.owner ) ) - eattacker = eattacker.owner; - } - - return eattacker; + if ( isDefined( eattacker ) ) + { + if ( isai( eattacker ) && isDefined( eattacker.script_owner ) ) + { + team = self.team; + if ( isai( self ) && isDefined( self.aiteam ) ) + { + team = self.aiteam; + } + if ( eattacker.script_owner.team != team ) + { + eattacker = eattacker.script_owner; + } + } + if ( eattacker.classname == "script_vehicle" && isDefined( eattacker.owner ) ) + { + eattacker = eattacker.owner; + } + else + { + if ( eattacker.classname == "auto_turret" && isDefined( eattacker.owner ) ) + { + eattacker = eattacker.owner; + } + } + } + return eattacker; } figureoutweapon( sweapon, einflictor ) { - if ( sweapon == "none" && isdefined( einflictor ) ) - { - if ( isdefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" ) - sweapon = "explodable_barrel_mp"; - else if ( isdefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) ) - sweapon = "destructible_car_mp"; - } - - return sweapon; + if ( sweapon == "none" && isDefined( einflictor ) ) + { + if ( isDefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" ) + { + sweapon = "explodable_barrel_mp"; + } + else + { + if ( isDefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) ) + { + sweapon = "destructible_car_mp"; + } + } + } + return sweapon; } isplayerimmunetokillstreak( eattacker, sweapon ) { - if ( level.hardcoremode ) - return false; - - if ( !isdefined( eattacker ) ) - return false; - - if ( self != eattacker ) - return false; - - if ( sweapon != "straferun_gun_mp" && sweapon != "straferun_rockets_mp" ) - return false; - - return true; + if ( level.hardcoremode ) + { + return 0; + } + if ( !isDefined( eattacker ) ) + { + return 0; + } + if ( self != eattacker ) + { + return 0; + } + if ( sweapon != "straferun_gun_mp" && sweapon != "straferun_rockets_mp" ) + { + return 0; + } + return 1; } callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) { - profilelog_begintiming( 6, "ship" ); - - if ( game["state"] == "postgame" ) - return; - - if ( self.sessionteam == "spectator" ) - return; - - if ( isdefined( self.candocombat ) && !self.candocombat ) - return; - - if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat ) - return; - - if ( isdefined( level.hostmigrationtimer ) ) - return; - - if ( ( sweapon == "ai_tank_drone_gun_mp" || sweapon == "ai_tank_drone_rocket_mp" ) && !level.hardcoremode ) - { - if ( isdefined( eattacker ) && eattacker == self ) - { - if ( isdefined( einflictor ) && isdefined( einflictor.from_ai ) ) - return; - } - - if ( isdefined( eattacker ) && isdefined( eattacker.owner ) && eattacker.owner == self ) - return; - } - - if ( sweapon == "emp_grenade_mp" ) - self notify( "emp_grenaded", eattacker ); - - idamage = custom_gamemodes_modified_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ); - idamage = int( idamage ); - self.idflags = idflags; - self.idflagstime = gettime(); - eattacker = figureoutattacker( eattacker ); - pixbeginevent( "PlayerDamage flags/tweaks" ); - - if ( !isdefined( vdir ) ) - idflags |= level.idflags_no_knockback; - - friendly = 0; - - if ( self.health != self.maxhealth ) - self notify( "snd_pain_player" ); - - if ( isdefined( einflictor ) && isdefined( einflictor.script_noteworthy ) && einflictor.script_noteworthy == "ragdoll_now" ) - smeansofdeath = "MOD_FALLING"; - - if ( maps\mp\gametypes_zm\_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) && isplayer( eattacker ) ) - smeansofdeath = "MOD_HEAD_SHOT"; - - if ( level.onplayerdamage != maps\mp\gametypes_zm\_globallogic::blank ) - { - modifieddamage = [[ level.onplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - - if ( isdefined( modifieddamage ) ) - { - if ( modifieddamage <= 0 ) - return; - - idamage = modifieddamage; - } - } - - if ( level.onlyheadshots ) - { - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) - return; - else if ( smeansofdeath == "MOD_HEAD_SHOT" ) - idamage = 150; - } - - if ( isdefined( eattacker ) && isplayer( eattacker ) && self.team != eattacker.team ) - self.lastattackweapon = sweapon; - - sweapon = figureoutweapon( sweapon, einflictor ); - pixendevent(); - attackerishittingteammate = isplayer( eattacker ) && self isenemyplayer( eattacker ) == 0; - - if ( shitloc == "riotshield" ) - { - if ( attackerishittingteammate && level.friendlyfire == 0 ) - return; - - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" && !attackerishittingteammate ) - { - previous_shield_damage = self.shielddamageblocked; - self.shielddamageblocked += idamage; - - if ( isplayer( eattacker ) ) - { - eattacker.lastattackedshieldplayer = self; - eattacker.lastattackedshieldtime = gettime(); - } - - if ( self.shielddamageblocked % 400 < previous_shield_damage % 400 ) - { - score_event = "shield_blocked_damage"; - - if ( self.shielddamageblocked > 2000 ) - score_event = "shield_blocked_damage_reduced"; - } - } - - if ( idflags & level.idflags_shield_explosive_impact ) - { - shitloc = "none"; - - if ( !( idflags & level.idflags_shield_explosive_impact_huge ) ) - idamage *= 0.0; - } - else if ( idflags & level.idflags_shield_explosive_splash ) - { - if ( isdefined( einflictor ) && isdefined( einflictor.stucktoplayer ) && einflictor.stucktoplayer == self ) - idamage = 101; - - shitloc = "none"; - } - else - return; - } - - if ( isdefined( eattacker ) && eattacker != self && !friendly ) - level.usestartspawns = 0; - - pixbeginevent( "PlayerDamage log" ); + profilelog_begintiming( 6, "ship" ); + if ( game[ "state" ] == "postgame" ) + { + return; + } + if ( self.sessionteam == "spectator" ) + { + return; + } + if ( isDefined( self.candocombat ) && !self.candocombat ) + { + return; + } + if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( eattacker.candocombat ) && !eattacker.candocombat ) + { + return; + } + if ( isDefined( level.hostmigrationtimer ) ) + { + return; + } + if ( sweapon != "ai_tank_drone_gun_mp" && sweapon == "ai_tank_drone_rocket_mp" && !level.hardcoremode ) + { + if ( isDefined( eattacker ) && eattacker == self ) + { + if ( isDefined( einflictor ) && isDefined( einflictor.from_ai ) ) + { + return; + } + } + if ( isDefined( eattacker ) && isDefined( eattacker.owner ) && eattacker.owner == self ) + { + return; + } + } + if ( sweapon == "emp_grenade_mp" ) + { + self notify( "emp_grenaded" ); + } + idamage = custom_gamemodes_modified_damage( self, eattacker, idamage, smeansofdeath, sweapon, einflictor, shitloc ); + idamage = int( idamage ); + self.idflags = idflags; + self.idflagstime = getTime(); + eattacker = figureoutattacker( eattacker ); + pixbeginevent( "PlayerDamage flags/tweaks" ); + if ( !isDefined( vdir ) ) + { + idflags |= level.idflags_no_knockback; + } + friendly = 0; + if ( self.health != self.maxhealth ) + { + self notify( "snd_pain_player" ); + } + if ( isDefined( einflictor ) && isDefined( einflictor.script_noteworthy ) && einflictor.script_noteworthy == "ragdoll_now" ) + { + smeansofdeath = "MOD_FALLING"; + } + if ( maps/mp/gametypes_zm/_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) && isplayer( eattacker ) ) + { + smeansofdeath = "MOD_HEAD_SHOT"; + } + if ( level.onplayerdamage != ::maps/mp/gametypes_zm/_globallogic::blank ) + { + modifieddamage = [[ level.onplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + if ( isDefined( modifieddamage ) ) + { + if ( modifieddamage <= 0 ) + { + return; + } + idamage = modifieddamage; + } + } + if ( level.onlyheadshots ) + { + if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) + { + return; + } + else + { + if ( smeansofdeath == "MOD_HEAD_SHOT" ) + { + idamage = 150; + } + } + } + if ( isDefined( eattacker ) && isplayer( eattacker ) && self.team != eattacker.team ) + { + self.lastattackweapon = sweapon; + } + sweapon = figureoutweapon( sweapon, einflictor ); + pixendevent(); + if ( isplayer( eattacker ) ) + { + attackerishittingteammate = self isenemyplayer( eattacker ) == 0; + } + if ( shitloc == "riotshield" ) + { + if ( attackerishittingteammate && level.friendlyfire == 0 ) + { + return; + } + if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" && !attackerishittingteammate ) + { + previous_shield_damage = self.shielddamageblocked; + self.shielddamageblocked += idamage; + if ( isplayer( eattacker ) ) + { + eattacker.lastattackedshieldplayer = self; + eattacker.lastattackedshieldtime = getTime(); + } + if ( ( self.shielddamageblocked % 400 ) < ( previous_shield_damage % 400 ) ) + { + score_event = "shield_blocked_damage"; + if ( self.shielddamageblocked > 2000 ) + { + score_event = "shield_blocked_damage_reduced"; + } + } + } + if ( idflags & level.idflags_shield_explosive_impact ) + { + shitloc = "none"; + if ( idflags & level.idflags_shield_explosive_impact_huge ) + { + idamage *= 0; + } + } + else if ( idflags & level.idflags_shield_explosive_splash ) + { + if ( isDefined( einflictor ) && isDefined( einflictor.stucktoplayer ) && einflictor.stucktoplayer == self ) + { + idamage = 101; + } + shitloc = "none"; + } + else + { + return; + } + } + if ( isDefined( eattacker ) && eattacker != self && !friendly ) + { + level.usestartspawns = 0; + } + pixbeginevent( "PlayerDamage log" ); /# - if ( getdvarint( "g_debugDamage" ) ) - println( "client:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); + if ( getDvarInt( "g_debugDamage" ) ) + { + println( "client:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); #/ - if ( self.sessionstate != "dead" ) - { - lpselfnum = self getentitynumber(); - lpselfname = self.name; - lpselfteam = self.team; - lpselfguid = self getguid(); - lpattackerteam = ""; - lpattackerorigin = ( 0, 0, 0 ); - - if ( isplayer( eattacker ) ) - { - lpattacknum = eattacker getentitynumber(); - lpattackguid = eattacker getguid(); - lpattackname = eattacker.name; - lpattackerteam = eattacker.team; - lpattackerorigin = eattacker.origin; - bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", gettime(), getplayerspawnid( eattacker ), sweapon, lpattackerorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 0 ); - } - else - { - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackerteam = "world"; - bbprint( "mpattacks", "gametime %d attackerweapon %s victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", gettime(), sweapon, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 0 ); - } - - logprint( "D;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); - } - - pixendevent(); - profilelog_endtiming( 6, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); + } + if ( self.sessionstate != "dead" ) + { + lpselfnum = self getentitynumber(); + lpselfname = self.name; + lpselfteam = self.team; + lpselfguid = self getguid(); + lpattackerteam = ""; + lpattackerorigin = ( 0, 0, 0 ); + if ( isplayer( eattacker ) ) + { + lpattacknum = eattacker getentitynumber(); + lpattackguid = eattacker getguid(); + lpattackname = eattacker.name; + lpattackerteam = eattacker.team; + lpattackerorigin = eattacker.origin; + bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", getTime(), getplayerspawnid( eattacker ), sweapon, lpattackerorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 0 ); + } + else + { + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackerteam = "world"; + bbprint( "mpattacks", "gametime %d attackerweapon %s victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", getTime(), sweapon, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 0 ); + } + logprint( "D;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); + } + pixendevent(); + profilelog_endtiming( 6, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); } resetattackerlist() { - self.attackers = []; - self.attackerdata = []; - self.attackerdamage = []; - self.firsttimedamaged = 0; + self.attackers = []; + self.attackerdata = []; + self.attackerdamage = []; + self.firsttimedamaged = 0; } dodamagefeedback( sweapon, einflictor, idamage, smeansofdeath ) { - if ( !isdefined( sweapon ) ) - return false; - - if ( level.allowhitmarkers == 0 ) - return false; - - if ( level.allowhitmarkers == 1 ) - { - if ( isdefined( smeansofdeath ) && isdefined( idamage ) ) - { - if ( istacticalhitmarker( sweapon, smeansofdeath, idamage ) ) - return false; - } - } - - return true; + if ( !isDefined( sweapon ) ) + { + return 0; + } + if ( level.allowhitmarkers == 0 ) + { + return 0; + } + if ( level.allowhitmarkers == 1 ) + { + if ( isDefined( smeansofdeath ) && isDefined( idamage ) ) + { + if ( istacticalhitmarker( sweapon, smeansofdeath, idamage ) ) + { + return 0; + } + } + } + return 1; } istacticalhitmarker( sweapon, smeansofdeath, idamage ) { - if ( isgrenade( sweapon ) ) - { - if ( sweapon == "willy_pete_mp" ) - { - if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) - return true; - } - else if ( idamage == 1 ) - return true; - } - - return false; + if ( isgrenade( sweapon ) ) + { + if ( sweapon == "willy_pete_mp" ) + { + if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) + { + return 1; + } + } + else + { + if ( idamage == 1 ) + { + return 1; + } + } + } + return 0; } doperkfeedback( player, sweapon, smeansofdeath, einflictor ) { - perkfeedback = undefined; - return perkfeedback; + perkfeedback = undefined; + return perkfeedback; } isaikillstreakdamage( sweapon, einflictor ) { - switch ( sweapon ) - { - case "ai_tank_drone_rocket_mp": - return isdefined( einflictor.firedbyai ); - case "missile_swarm_projectile_mp": - return 1; - case "planemortar_mp": - return 1; - case "chopper_minigun_mp": - return 1; - case "straferun_rockets_mp": - return 1; - case "littlebird_guard_minigun_mp": - return 1; - case "cobra_20mm_comlink_mp": - return 1; - } - - return 0; + switch( sweapon ) + { + case "ai_tank_drone_rocket_mp": + return isDefined( einflictor.firedbyai ); + case "missile_swarm_projectile_mp": + return 1; + case "planemortar_mp": + return 1; + case "chopper_minigun_mp": + return 1; + case "straferun_rockets_mp": + return 1; + case "littlebird_guard_minigun_mp": + return 1; + case "cobra_20mm_comlink_mp": + return 1; + } + return 0; } finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) { - pixbeginevent( "finishPlayerDamageWrapper" ); - - if ( !level.console && idflags & level.idflags_penetration && isplayer( eattacker ) ) - { + pixbeginevent( "finishPlayerDamageWrapper" ); + if ( !level.console && idflags & level.idflags_penetration && isplayer( eattacker ) ) + { /# - println( "penetrated:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); + println( "penetrated:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); #/ - eattacker addplayerstat( "penetration_shots", 1 ); - } - - self finishplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - - if ( getdvar( "scr_csmode" ) != "" ) - self shellshock( "damage_mp", 0.2 ); - - self damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ); - pixendevent(); + eattacker addplayerstat( "penetration_shots", 1 ); + } + self finishplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + if ( getDvar( #"C8077F47" ) != "" ) + { + self shellshock( "damage_mp", 0,2 ); + } + self damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ); + pixendevent(); } allowedassistweapon( weapon ) { - return 1; + return 1; } callback_playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - profilelog_begintiming( 7, "ship" ); - self endon( "spawned" ); - self notify( "killed_player" ); + profilelog_begintiming( 7, "ship" ); + self endon( "spawned" ); + self notify( "killed_player" ); + if ( self.sessionteam == "spectator" ) + { + return; + } + if ( game[ "state" ] == "postgame" ) + { + return; + } + self needsrevive( 0 ); + if ( isDefined( self.burning ) && self.burning == 1 ) + { + self setburn( 0 ); + } + self.suicide = 0; + if ( isDefined( level.takelivesondeath ) && level.takelivesondeath == 1 ) + { + if ( self.pers[ "lives" ] ) + { + self.pers[ "lives" ]--; - if ( self.sessionteam == "spectator" ) - return; - - if ( game["state"] == "postgame" ) - return; - - self needsrevive( 0 ); - - if ( isdefined( self.burning ) && self.burning == 1 ) - self setburn( 0 ); - - self.suicide = 0; - - if ( isdefined( level.takelivesondeath ) && level.takelivesondeath == 1 ) - { - if ( self.pers["lives"] ) - { - self.pers["lives"]--; - - if ( self.pers["lives"] == 0 ) - { - level notify( "player_eliminated" ); - self notify( "player_eliminated" ); - } - } - } - - self thread flushgroupdialogonplayer( "item_destroyed" ); - sweapon = updateweapon( einflictor, sweapon ); - pixbeginevent( "PlayerKilled pre constants" ); - wasinlaststand = 0; - deathtimeoffset = 0; - lastweaponbeforedroppingintolaststand = undefined; - attackerstance = undefined; - self.laststandthislife = undefined; - self.vattackerorigin = undefined; - - if ( isdefined( self.uselaststandparams ) ) - { - self.uselaststandparams = undefined; + if ( self.pers[ "lives" ] == 0 ) + { + level notify( "player_eliminated" ); + self notify( "player_eliminated" ); + } + } + } + self thread flushgroupdialogonplayer( "item_destroyed" ); + sweapon = updateweapon( einflictor, sweapon ); + pixbeginevent( "PlayerKilled pre constants" ); + wasinlaststand = 0; + deathtimeoffset = 0; + lastweaponbeforedroppingintolaststand = undefined; + attackerstance = undefined; + self.laststandthislife = undefined; + self.vattackerorigin = undefined; + if ( isDefined( self.uselaststandparams ) ) + { + self.uselaststandparams = undefined; /# - assert( isdefined( self.laststandparams ) ); + assert( isDefined( self.laststandparams ) ); #/ - if ( !level.teambased || !isdefined( attacker ) || !isplayer( attacker ) || attacker.team != self.team || attacker == self ) - { - einflictor = self.laststandparams.einflictor; - attacker = self.laststandparams.attacker; - attackerstance = self.laststandparams.attackerstance; - idamage = self.laststandparams.idamage; - smeansofdeath = self.laststandparams.smeansofdeath; - sweapon = self.laststandparams.sweapon; - vdir = self.laststandparams.vdir; - shitloc = self.laststandparams.shitloc; - self.vattackerorigin = self.laststandparams.vattackerorigin; - deathtimeoffset = ( gettime() - self.laststandparams.laststandstarttime ) / 1000; - - if ( isdefined( self.previousprimary ) ) - { - wasinlaststand = 1; - lastweaponbeforedroppingintolaststand = self.previousprimary; - } - } - - self.laststandparams = undefined; - } - - bestplayer = undefined; - bestplayermeansofdeath = undefined; - obituarymeansofdeath = undefined; - bestplayerweapon = undefined; - obituaryweapon = undefined; - - if ( ( !isdefined( attacker ) || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" || isdefined( attacker.ismagicbullet ) && attacker.ismagicbullet == 1 || attacker == self ) && isdefined( self.attackers ) ) - { - if ( !isdefined( bestplayer ) ) - { - for ( i = 0; i < self.attackers.size; i++ ) - { - player = self.attackers[i]; - - if ( !isdefined( player ) ) - continue; - - if ( !isdefined( self.attackerdamage[player.clientid] ) || !isdefined( self.attackerdamage[player.clientid].damage ) ) - continue; - - if ( player == self || level.teambased && player.team == self.team ) - continue; - - if ( self.attackerdamage[player.clientid].lasttimedamaged + 2500 < gettime() ) - continue; - - if ( !allowedassistweapon( self.attackerdamage[player.clientid].weapon ) ) - continue; - - if ( self.attackerdamage[player.clientid].damage > 1 && !isdefined( bestplayer ) ) - { - bestplayer = player; - bestplayermeansofdeath = self.attackerdamage[player.clientid].meansofdeath; - bestplayerweapon = self.attackerdamage[player.clientid].weapon; - continue; - } - - if ( isdefined( bestplayer ) && self.attackerdamage[player.clientid].damage > self.attackerdamage[bestplayer.clientid].damage ) - { - bestplayer = player; - bestplayermeansofdeath = self.attackerdamage[player.clientid].meansofdeath; - bestplayerweapon = self.attackerdamage[player.clientid].weapon; - } - } - } - - if ( isdefined( bestplayer ) ) - self recordkillmodifier( "assistedsuicide" ); - } - - if ( isdefined( bestplayer ) ) - { - attacker = bestplayer; - obituarymeansofdeath = bestplayermeansofdeath; - obituaryweapon = bestplayerweapon; - } - - if ( isplayer( attacker ) ) - attacker.damagedplayers[self.clientid] = undefined; - - if ( maps\mp\gametypes_zm\_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) && isplayer( attacker ) ) - { - attacker playlocalsound( "prj_bullet_impact_headshot_helmet_nodie_2d" ); - smeansofdeath = "MOD_HEAD_SHOT"; - } - - self.deathtime = gettime(); - attacker = updateattacker( attacker, sweapon ); - einflictor = updateinflictor( einflictor ); - smeansofdeath = updatemeansofdeath( sweapon, smeansofdeath ); - - if ( isdefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped == 1 ) - { - self detachshieldmodel( level.carriedshieldmodel, "tag_weapon_left" ); - self.hasriotshield = 0; - self.hasriotshieldequipped = 0; - } - - self thread updateglobalbotkilledcounter(); - - if ( isplayer( attacker ) && attacker != self && ( !level.teambased || level.teambased && self.team != attacker.team ) ) - { - self addweaponstat( sweapon, "deaths", 1 ); - - if ( wasinlaststand && isdefined( lastweaponbeforedroppingintolaststand ) ) - weaponname = lastweaponbeforedroppingintolaststand; - else - weaponname = self.lastdroppableweapon; - - if ( isdefined( weaponname ) && ( issubstr( weaponname, "gl_" ) || issubstr( weaponname, "mk_" ) || issubstr( weaponname, "ft_" ) ) ) - weaponname = self.currentweapon; - - if ( isdefined( weaponname ) ) - self addweaponstat( weaponname, "deathsDuringUse", 1 ); - - if ( smeansofdeath != "MOD_FALLING" ) - attacker addweaponstat( sweapon, "kills", 1 ); - - if ( smeansofdeath == "MOD_HEAD_SHOT" ) - attacker addweaponstat( sweapon, "headshots", 1 ); - } - - if ( !isdefined( obituarymeansofdeath ) ) - obituarymeansofdeath = smeansofdeath; - - if ( !isdefined( obituaryweapon ) ) - obituaryweapon = sweapon; - - if ( !isplayer( attacker ) || self isenemyplayer( attacker ) == 0 ) - { - level notify( "reset_obituary_count" ); - level.lastobituaryplayercount = 0; - level.lastobituaryplayer = undefined; - } - else - { - if ( isdefined( level.lastobituaryplayer ) && level.lastobituaryplayer == attacker ) - level.lastobituaryplayercount++; - else - { - level notify( "reset_obituary_count" ); - level.lastobituaryplayer = attacker; - level.lastobituaryplayercount = 1; - } - - if ( level.lastobituaryplayercount >= 4 ) - { - level notify( "reset_obituary_count" ); - level.lastobituaryplayercount = 0; - level.lastobituaryplayer = undefined; - } - } - - overrideentitycamera = 0; - - if ( level.teambased && isdefined( attacker.pers ) && self.team == attacker.team && obituarymeansofdeath == "MOD_GRENADE" && level.friendlyfire == 0 ) - { - obituary( self, self, obituaryweapon, obituarymeansofdeath ); - maps\mp\_demo::bookmark( "kill", gettime(), self, self, 0, einflictor, overrideentitycamera ); - } - else - { - obituary( self, attacker, obituaryweapon, obituarymeansofdeath ); - maps\mp\_demo::bookmark( "kill", gettime(), self, attacker, 0, einflictor, overrideentitycamera ); - } - - if ( !level.ingraceperiod ) - { - self maps\mp\gametypes_zm\_weapons::dropscavengerfordeath( attacker ); - self maps\mp\gametypes_zm\_weapons::dropweaponfordeath( attacker ); - self maps\mp\gametypes_zm\_weapons::dropoffhand(); - } - - maps\mp\gametypes_zm\_spawnlogic::deathoccured( self, attacker ); - self.sessionstate = "dead"; - self.statusicon = "hud_status_dead"; - self.pers["weapon"] = undefined; - self.killedplayerscurrent = []; - self.deathcount++; + if ( !level.teambased || isDefined( attacker ) && isplayer( attacker ) || attacker.team != self.team && attacker == self ) + { + einflictor = self.laststandparams.einflictor; + attacker = self.laststandparams.attacker; + attackerstance = self.laststandparams.attackerstance; + idamage = self.laststandparams.idamage; + smeansofdeath = self.laststandparams.smeansofdeath; + sweapon = self.laststandparams.sweapon; + vdir = self.laststandparams.vdir; + shitloc = self.laststandparams.shitloc; + self.vattackerorigin = self.laststandparams.vattackerorigin; + deathtimeoffset = ( getTime() - self.laststandparams.laststandstarttime ) / 1000; + if ( isDefined( self.previousprimary ) ) + { + wasinlaststand = 1; + lastweaponbeforedroppingintolaststand = self.previousprimary; + } + } + self.laststandparams = undefined; + } + bestplayer = undefined; + bestplayermeansofdeath = undefined; + obituarymeansofdeath = undefined; + bestplayerweapon = undefined; + obituaryweapon = undefined; + if ( isDefined( attacker ) && attacker.classname != "trigger_hurt" && attacker.classname != "worldspawn" && isDefined( attacker.ismagicbullet ) && attacker.ismagicbullet != 1 && attacker == self && isDefined( self.attackers ) ) + { + while ( !isDefined( bestplayer ) ) + { + i = 0; + while ( i < self.attackers.size ) + { + player = self.attackers[ i ]; + if ( !isDefined( player ) ) + { + i++; + continue; + } + else if ( !isDefined( self.attackerdamage[ player.clientid ] ) || !isDefined( self.attackerdamage[ player.clientid ].damage ) ) + { + i++; + continue; + } + else + { + if ( player == self || level.teambased && player.team == self.team ) + { + i++; + continue; + } + else + { + if ( ( self.attackerdamage[ player.clientid ].lasttimedamaged + 2500 ) < getTime() ) + { + i++; + continue; + } + else if ( !allowedassistweapon( self.attackerdamage[ player.clientid ].weapon ) ) + { + i++; + continue; + } + else if ( self.attackerdamage[ player.clientid ].damage > 1 && !isDefined( bestplayer ) ) + { + bestplayer = player; + bestplayermeansofdeath = self.attackerdamage[ player.clientid ].meansofdeath; + bestplayerweapon = self.attackerdamage[ player.clientid ].weapon; + i++; + continue; + } + else + { + if ( isDefined( bestplayer ) && self.attackerdamage[ player.clientid ].damage > self.attackerdamage[ bestplayer.clientid ].damage ) + { + bestplayer = player; + bestplayermeansofdeath = self.attackerdamage[ player.clientid ].meansofdeath; + bestplayerweapon = self.attackerdamage[ player.clientid ].weapon; + } + } + } + } + i++; + } + } + if ( isDefined( bestplayer ) ) + { + self recordkillmodifier( "assistedsuicide" ); + } + } + if ( isDefined( bestplayer ) ) + { + attacker = bestplayer; + obituarymeansofdeath = bestplayermeansofdeath; + obituaryweapon = bestplayerweapon; + } + if ( isplayer( attacker ) ) + { + } + if ( maps/mp/gametypes_zm/_globallogic_utils::isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) && isplayer( attacker ) ) + { + attacker playlocalsound( "prj_bullet_impact_headshot_helmet_nodie_2d" ); + smeansofdeath = "MOD_HEAD_SHOT"; + } + self.deathtime = getTime(); + attacker = updateattacker( attacker, sweapon ); + einflictor = updateinflictor( einflictor ); + smeansofdeath = updatemeansofdeath( sweapon, smeansofdeath ); + if ( isDefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped == 1 ) + { + self detachshieldmodel( level.carriedshieldmodel, "tag_weapon_left" ); + self.hasriotshield = 0; + self.hasriotshieldequipped = 0; + } + self thread updateglobalbotkilledcounter(); + if ( isplayer( attacker ) && attacker != self || !level.teambased && level.teambased && self.team != attacker.team ) + { + self addweaponstat( sweapon, "deaths", 1 ); + if ( wasinlaststand && isDefined( lastweaponbeforedroppingintolaststand ) ) + { + weaponname = lastweaponbeforedroppingintolaststand; + } + else + { + weaponname = self.lastdroppableweapon; + } + if ( isDefined( weaponname ) && !issubstr( weaponname, "gl_" ) || issubstr( weaponname, "mk_" ) && issubstr( weaponname, "ft_" ) ) + { + weaponname = self.currentweapon; + } + if ( isDefined( weaponname ) ) + { + self addweaponstat( weaponname, "deathsDuringUse", 1 ); + } + if ( smeansofdeath != "MOD_FALLING" ) + { + attacker addweaponstat( sweapon, "kills", 1 ); + } + if ( smeansofdeath == "MOD_HEAD_SHOT" ) + { + attacker addweaponstat( sweapon, "headshots", 1 ); + } + } + if ( !isDefined( obituarymeansofdeath ) ) + { + obituarymeansofdeath = smeansofdeath; + } + if ( !isDefined( obituaryweapon ) ) + { + obituaryweapon = sweapon; + } + if ( !isplayer( attacker ) || self isenemyplayer( attacker ) == 0 ) + { + level notify( "reset_obituary_count" ); + level.lastobituaryplayercount = 0; + level.lastobituaryplayer = undefined; + } + else + { + if ( isDefined( level.lastobituaryplayer ) && level.lastobituaryplayer == attacker ) + { + level.lastobituaryplayercount++; + } + else + { + level notify( "reset_obituary_count" ); + level.lastobituaryplayer = attacker; + level.lastobituaryplayercount = 1; + } + if ( level.lastobituaryplayercount >= 4 ) + { + level notify( "reset_obituary_count" ); + level.lastobituaryplayercount = 0; + level.lastobituaryplayer = undefined; + } + } + overrideentitycamera = 0; + if ( level.teambased && isDefined( attacker.pers ) && self.team == attacker.team && obituarymeansofdeath == "MOD_GRENADE" && level.friendlyfire == 0 ) + { + obituary( self, self, obituaryweapon, obituarymeansofdeath ); + maps/mp/_demo::bookmark( "kill", getTime(), self, self, 0, einflictor, overrideentitycamera ); + } + else + { + obituary( self, attacker, obituaryweapon, obituarymeansofdeath ); + maps/mp/_demo::bookmark( "kill", getTime(), self, attacker, 0, einflictor, overrideentitycamera ); + } + if ( !level.ingraceperiod ) + { + self maps/mp/gametypes_zm/_weapons::dropscavengerfordeath( attacker ); + self maps/mp/gametypes_zm/_weapons::dropweaponfordeath( attacker ); + self maps/mp/gametypes_zm/_weapons::dropoffhand(); + } + maps/mp/gametypes_zm/_spawnlogic::deathoccured( self, attacker ); + self.sessionstate = "dead"; + self.statusicon = "hud_status_dead"; + self.killedplayerscurrent = []; + self.deathcount++; /# - println( "players(" + self.clientid + ") death count ++: " + self.deathcount ); + println( "players(" + self.clientid + ") death count ++: " + self.deathcount ); #/ - if ( !isdefined( self.switching_teams ) ) - { - if ( isplayer( attacker ) && level.teambased && attacker != self && self.team == attacker.team ) - { - self.pers["cur_kill_streak"] = 0; - self.pers["cur_total_kill_streak"] = 0; - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - self setplayercurrentstreak( 0 ); - } - else - { - self maps\mp\gametypes_zm\_globallogic_score::incpersstat( "deaths", 1, 1, 1 ); - self.deaths = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "deaths" ); - self updatestatratio( "kdratio", "kills", "deaths" ); - - if ( self.pers["cur_kill_streak"] > self.pers["best_kill_streak"] ) - self.pers["best_kill_streak"] = self.pers["cur_kill_streak"]; - - self.pers["kill_streak_before_death"] = self.pers["cur_kill_streak"]; - self.pers["cur_kill_streak"] = 0; - self.pers["cur_total_kill_streak"] = 0; - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - self setplayercurrentstreak( 0 ); - self.cur_death_streak++; - - if ( self.cur_death_streak > self.death_streak ) - { - if ( level.rankedmatch ) - self setdstat( "HighestStats", "death_streak", self.cur_death_streak ); - - self.death_streak = self.cur_death_streak; - } - - if ( self.cur_death_streak >= getdvarint( "perk_deathStreakCountRequired" ) ) - self enabledeathstreak(); - } - } - else - { - self.pers["totalKillstreakCount"] = 0; - self.pers["killstreaksEarnedThisKillstreak"] = 0; - } - - lpselfnum = self getentitynumber(); - lpselfname = self.name; - lpattackguid = ""; - lpattackname = ""; - lpselfteam = self.team; - lpselfguid = self getguid(); - lpattackteam = ""; - lpattackorigin = ( 0, 0, 0 ); - lpattacknum = -1; - awardassists = 0; - pixendevent(); - self resetplayermomentumondeath(); - - if ( isplayer( attacker ) ) - { - lpattackguid = attacker getguid(); - lpattackname = attacker.name; - lpattackteam = attacker.team; - lpattackorigin = attacker.origin; - - if ( attacker == self ) - { - dokillcam = 0; - self maps\mp\gametypes_zm\_globallogic_score::incpersstat( "suicides", 1 ); - self.suicides = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "suicides" ); - - if ( smeansofdeath == "MOD_SUICIDE" && shitloc == "none" && self.throwinggrenade ) - self.lastgrenadesuicidetime = gettime(); - - awardassists = 1; - self.suicide = 1; - - if ( isdefined( self.friendlydamage ) ) - { - self iprintln( &"MP_FRIENDLY_FIRE_WILL_NOT" ); - - if ( level.teamkillpointloss ) - { - scoresub = self [[ level.getteamkillscore ]]( einflictor, attacker, smeansofdeath, sweapon ); - maps\mp\gametypes_zm\_globallogic_score::_setplayerscore( attacker, maps\mp\gametypes_zm\_globallogic_score::_getplayerscore( attacker ) - scoresub ); - } - } - } - else - { - pixbeginevent( "PlayerKilled attacker" ); - lpattacknum = attacker getentitynumber(); - dokillcam = 1; - - if ( level.teambased && self.team == attacker.team && smeansofdeath == "MOD_GRENADE" && level.friendlyfire == 0 ) - { - - } - else if ( level.teambased && self.team == attacker.team ) - { - if ( !ignoreteamkills( sweapon, smeansofdeath ) ) - { - teamkill_penalty = self [[ level.getteamkillpenalty ]]( einflictor, attacker, smeansofdeath, sweapon ); - attacker maps\mp\gametypes_zm\_globallogic_score::incpersstat( "teamkills_nostats", teamkill_penalty, 0 ); - attacker maps\mp\gametypes_zm\_globallogic_score::incpersstat( "teamkills", 1 ); - attacker.teamkillsthisround++; - - if ( level.teamkillpointloss ) - { - scoresub = self [[ level.getteamkillscore ]]( einflictor, attacker, smeansofdeath, sweapon ); - maps\mp\gametypes_zm\_globallogic_score::_setplayerscore( attacker, maps\mp\gametypes_zm\_globallogic_score::_getplayerscore( attacker ) - scoresub ); - } - - if ( maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() < 5000 ) - teamkilldelay = 1; - else if ( attacker.pers["teamkills_nostats"] > 1 && maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() < 8000 + attacker.pers["teamkills_nostats"] * 1000 ) - teamkilldelay = 1; - else - teamkilldelay = attacker teamkilldelay(); - - if ( teamkilldelay > 0 ) - { - attacker.teamkillpunish = 1; - attacker suicide(); - - if ( attacker shouldteamkillkick( teamkilldelay ) ) - attacker teamkillkick(); - - attacker thread reduceteamkillsovertime(); - } - } - } - else - { - maps\mp\gametypes_zm\_globallogic_score::inctotalkills( attacker.team ); - attacker thread maps\mp\gametypes_zm\_globallogic_score::givekillstats( smeansofdeath, sweapon, self ); - - if ( isalive( attacker ) ) - { - pixbeginevent( "killstreak" ); - - if ( !isdefined( einflictor ) || !isdefined( einflictor.requireddeathcount ) || attacker.deathcount == einflictor.requireddeathcount ) - { - shouldgivekillstreak = 0; - attacker.pers["cur_total_kill_streak"]++; - attacker setplayercurrentstreak( attacker.pers["cur_total_kill_streak"] ); - - if ( isdefined( level.killstreaks ) && shouldgivekillstreak ) - { - attacker.pers["cur_kill_streak"]++; - - if ( attacker.pers["cur_kill_streak"] >= 3 ) - { - if ( attacker.pers["cur_kill_streak"] <= 30 ) - { - - } - else - { - - } - } - } - } - - pixendevent(); - } - - if ( attacker.pers["cur_kill_streak"] > attacker.kill_streak ) - { - if ( level.rankedmatch ) - attacker setdstat( "HighestStats", "kill_streak", attacker.pers["totalKillstreakCount"] ); - - attacker.kill_streak = attacker.pers["cur_kill_streak"]; - } - - killstreak = undefined; - - if ( isdefined( killstreak ) ) - { - - } - else if ( smeansofdeath == "MOD_HEAD_SHOT" ) - { - - } - else if ( smeansofdeath == "MOD_MELEE" ) - { - if ( sweapon == "riotshield_mp" ) - { - - } - else - { - - } - } - - attacker thread maps\mp\gametypes_zm\_globallogic_score::trackattackerkill( self.name, self.pers["rank"], self.pers["rankxp"], self.pers["prestige"], self getxuid( 1 ) ); - attackername = attacker.name; - self thread maps\mp\gametypes_zm\_globallogic_score::trackattackeedeath( attackername, attacker.pers["rank"], attacker.pers["rankxp"], attacker.pers["prestige"], attacker getxuid( 1 ) ); - attacker thread maps\mp\gametypes_zm\_globallogic_score::inckillstreaktracker( sweapon ); - - if ( level.teambased && attacker.team != "spectator" ) - { - if ( isai( attacker ) ) - maps\mp\gametypes_zm\_globallogic_score::giveteamscore( "kill", attacker.aiteam, attacker, self ); - else - maps\mp\gametypes_zm\_globallogic_score::giveteamscore( "kill", attacker.team, attacker, self ); - } - - scoresub = level.deathpointloss; - - if ( scoresub != 0 ) - maps\mp\gametypes_zm\_globallogic_score::_setplayerscore( self, maps\mp\gametypes_zm\_globallogic_score::_getplayerscore( self ) - scoresub ); - - level thread playkillbattlechatter( attacker, sweapon, self ); - - if ( level.teambased ) - awardassists = 1; - } - - pixendevent(); - } - } - else if ( isdefined( attacker ) && ( attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" ) ) - { - dokillcam = 0; - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackteam = "world"; - self maps\mp\gametypes_zm\_globallogic_score::incpersstat( "suicides", 1 ); - self.suicides = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "suicides" ); - awardassists = 1; - } - else - { - dokillcam = 0; - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackteam = "world"; - - if ( isdefined( einflictor ) && isdefined( einflictor.killcament ) ) - { - dokillcam = 1; - lpattacknum = self getentitynumber(); - } - - if ( isdefined( attacker ) && isdefined( attacker.team ) && isdefined( level.teams[attacker.team] ) ) - { - if ( attacker.team != self.team ) - { - if ( level.teambased ) - maps\mp\gametypes_zm\_globallogic_score::giveteamscore( "kill", attacker.team, attacker, self ); - } - } - - awardassists = 1; - } - - if ( sessionmodeiszombiesgame() ) - awardassists = 0; - - if ( awardassists ) - { - pixbeginevent( "PlayerKilled assists" ); - - if ( isdefined( self.attackers ) ) - { - for ( j = 0; j < self.attackers.size; j++ ) - { - player = self.attackers[j]; - - if ( !isdefined( player ) ) - continue; - - if ( player == attacker ) - continue; - - if ( player.team != lpattackteam ) - continue; - - damage_done = self.attackerdamage[player.clientid].damage; - player thread maps\mp\gametypes_zm\_globallogic_score::processassist( self, damage_done, self.attackerdamage[player.clientid].weapon ); - } - } - - if ( isdefined( self.lastattackedshieldplayer ) && isdefined( self.lastattackedshieldtime ) && self.lastattackedshieldplayer != attacker ) - { - if ( gettime() - self.lastattackedshieldtime < 4000 ) - self.lastattackedshieldplayer thread maps\mp\gametypes_zm\_globallogic_score::processshieldassist( self ); - } - - pixendevent(); - } - - pixbeginevent( "PlayerKilled post constants" ); - self.lastattacker = attacker; - self.lastdeathpos = self.origin; - - if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self && ( !level.teambased || attacker.team != self.team ) ) - self thread maps\mp\_challenges::playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, shitloc, attackerstance ); - else - self notify( "playerKilledChallengesProcessed" ); - - if ( isdefined( self.attackers ) ) - self.attackers = []; - - if ( isplayer( attacker ) ) - bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", gettime(), getplayerspawnid( attacker ), sweapon, lpattackorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1 ); - else - bbprint( "mpattacks", "gametime %d attackerweapon %s victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", gettime(), sweapon, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1 ); - - logprint( "K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); - attackerstring = "none"; - - if ( isplayer( attacker ) ) - attackerstring = attacker getxuid() + "(" + lpattackname + ")"; - - self logstring( "d " + smeansofdeath + "(" + sweapon + ") a:" + attackerstring + " d:" + idamage + " l:" + shitloc + " @ " + int( self.origin[0] ) + " " + int( self.origin[1] ) + " " + int( self.origin[2] ) ); - level thread maps\mp\gametypes_zm\_globallogic::updateteamstatus(); - killcamentity = self getkillcamentity( attacker, einflictor, sweapon ); - killcamentityindex = -1; - killcamentitystarttime = 0; - - if ( isdefined( killcamentity ) ) - { - killcamentityindex = killcamentity getentitynumber(); - - if ( isdefined( killcamentity.starttime ) ) - killcamentitystarttime = killcamentity.starttime; - else - killcamentitystarttime = killcamentity.birthtime; - - if ( !isdefined( killcamentitystarttime ) ) - killcamentitystarttime = 0; - } - - if ( isdefined( self.killstreak_waitamount ) && self.killstreak_waitamount > 0 ) - dokillcam = 0; - - self maps\mp\gametypes_zm\_weapons::detachcarryobjectmodel(); - died_in_vehicle = 0; - - if ( isdefined( self.diedonvehicle ) ) - died_in_vehicle = self.diedonvehicle; - - pixendevent(); - pixbeginevent( "PlayerKilled body and gibbing" ); - - if ( !died_in_vehicle ) - { - vattackerorigin = undefined; - - if ( isdefined( attacker ) ) - vattackerorigin = attacker.origin; - - ragdoll_now = 0; - - if ( isdefined( self.usingvehicle ) && self.usingvehicle && isdefined( self.vehicleposition ) && self.vehicleposition == 1 ) - ragdoll_now = 1; - - body = self cloneplayer( deathanimduration ); - self createdeadbody( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_now, body ); - } - - pixendevent(); - thread maps\mp\gametypes_zm\_globallogic_spawn::spawnqueuedclient( self.team, attacker ); - self.switching_teams = undefined; - self.joining_team = undefined; - self.leaving_team = undefined; - self thread [[ level.onplayerkilled ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); - - for ( icb = 0; icb < level.onplayerkilledextraunthreadedcbs.size; icb++ ) - self [[ level.onplayerkilledextraunthreadedcbs[icb] ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); - - self.wantsafespawn = 0; - perks = []; - killstreaks = maps\mp\gametypes_zm\_globallogic::getkillstreaks( attacker ); - - if ( !isdefined( self.killstreak_waitamount ) ) - self thread [[ level.spawnplayerprediction ]](); - - profilelog_endtiming( 7, "gs=" + game["state"] + " zom=" + sessionmodeiszombiesgame() ); - wait 0.25; - weaponclass = getweaponclass( sweapon ); - self.cancelkillcam = 0; - defaultplayerdeathwatchtime = 1.75; - - if ( isdefined( level.overrideplayerdeathwatchtimer ) ) - defaultplayerdeathwatchtime = [[ level.overrideplayerdeathwatchtimer ]]( defaultplayerdeathwatchtime ); - - maps\mp\gametypes_zm\_globallogic_utils::waitfortimeornotifies( defaultplayerdeathwatchtime ); - self notify( "death_delay_finished" ); + if ( !isDefined( self.switching_teams ) ) + { + if ( isplayer( attacker ) && level.teambased && attacker != self && self.team == attacker.team ) + { + self.pers[ "cur_kill_streak" ] = 0; + self.pers[ "cur_total_kill_streak" ] = 0; + self.pers[ "totalKillstreakCount" ] = 0; + self.pers[ "killstreaksEarnedThisKillstreak" ] = 0; + self setplayercurrentstreak( 0 ); + } + else + { + self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "deaths", 1, 1, 1 ); + self.deaths = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "deaths" ); + self updatestatratio( "kdratio", "kills", "deaths" ); + if ( self.pers[ "cur_kill_streak" ] > self.pers[ "best_kill_streak" ] ) + { + self.pers[ "best_kill_streak" ] = self.pers[ "cur_kill_streak" ]; + } + self.pers[ "kill_streak_before_death" ] = self.pers[ "cur_kill_streak" ]; + self.pers[ "cur_kill_streak" ] = 0; + self.pers[ "cur_total_kill_streak" ] = 0; + self.pers[ "totalKillstreakCount" ] = 0; + self.pers[ "killstreaksEarnedThisKillstreak" ] = 0; + self setplayercurrentstreak( 0 ); + self.cur_death_streak++; + if ( self.cur_death_streak > self.death_streak ) + { + if ( level.rankedmatch ) + { + self setdstat( "HighestStats", "death_streak", self.cur_death_streak ); + } + self.death_streak = self.cur_death_streak; + } + if ( self.cur_death_streak >= getDvarInt( "perk_deathStreakCountRequired" ) ) + { + self enabledeathstreak(); + } + } + } + else + { + self.pers[ "totalKillstreakCount" ] = 0; + self.pers[ "killstreaksEarnedThisKillstreak" ] = 0; + } + lpselfnum = self getentitynumber(); + lpselfname = self.name; + lpattackguid = ""; + lpattackname = ""; + lpselfteam = self.team; + lpselfguid = self getguid(); + lpattackteam = ""; + lpattackorigin = ( 0, 0, 0 ); + lpattacknum = -1; + awardassists = 0; + pixendevent(); + self resetplayermomentumondeath(); + if ( isplayer( attacker ) ) + { + lpattackguid = attacker getguid(); + lpattackname = attacker.name; + lpattackteam = attacker.team; + lpattackorigin = attacker.origin; + if ( attacker == self ) + { + dokillcam = 0; + self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "suicides", 1 ); + self.suicides = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "suicides" ); + if ( smeansofdeath == "MOD_SUICIDE" && shitloc == "none" && self.throwinggrenade ) + { + self.lastgrenadesuicidetime = getTime(); + } + awardassists = 1; + self.suicide = 1; + if ( isDefined( self.friendlydamage ) ) + { + self iprintln( &"MP_FRIENDLY_FIRE_WILL_NOT" ); + if ( level.teamkillpointloss ) + { + scoresub = self [[ level.getteamkillscore ]]( einflictor, attacker, smeansofdeath, sweapon ); + maps/mp/gametypes_zm/_globallogic_score::_setplayerscore( attacker, maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( attacker ) - scoresub ); + } + } + } + else + { + pixbeginevent( "PlayerKilled attacker" ); + lpattacknum = attacker getentitynumber(); + dokillcam = 1; + if ( level.teambased && self.team == attacker.team && smeansofdeath == "MOD_GRENADE" && level.friendlyfire == 0 ) + { + } + else + { + if ( level.teambased && self.team == attacker.team ) + { + if ( !ignoreteamkills( sweapon, smeansofdeath ) ) + { + teamkill_penalty = self [[ level.getteamkillpenalty ]]( einflictor, attacker, smeansofdeath, sweapon ); + attacker maps/mp/gametypes_zm/_globallogic_score::incpersstat( "teamkills_nostats", teamkill_penalty, 0 ); + attacker maps/mp/gametypes_zm/_globallogic_score::incpersstat( "teamkills", 1 ); + attacker.teamkillsthisround++; + if ( level.teamkillpointloss ) + { + scoresub = self [[ level.getteamkillscore ]]( einflictor, attacker, smeansofdeath, sweapon ); + maps/mp/gametypes_zm/_globallogic_score::_setplayerscore( attacker, maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( attacker ) - scoresub ); + } + if ( maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() < 5000 ) + { + teamkilldelay = 1; + } + else if ( attacker.pers[ "teamkills_nostats" ] > 1 && maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() < ( 8000 + ( attacker.pers[ "teamkills_nostats" ] * 1000 ) ) ) + { + teamkilldelay = 1; + } + else + { + teamkilldelay = attacker teamkilldelay(); + } + if ( teamkilldelay > 0 ) + { + attacker.teamkillpunish = 1; + attacker suicide(); + if ( attacker shouldteamkillkick( teamkilldelay ) ) + { + attacker teamkillkick(); + } + attacker thread reduceteamkillsovertime(); + } + } + } + else + { + maps/mp/gametypes_zm/_globallogic_score::inctotalkills( attacker.team ); + attacker thread maps/mp/gametypes_zm/_globallogic_score::givekillstats( smeansofdeath, sweapon, self ); + if ( isalive( attacker ) ) + { + pixbeginevent( "killstreak" ); + if ( isDefined( einflictor ) || !isDefined( einflictor.requireddeathcount ) && attacker.deathcount == einflictor.requireddeathcount ) + { + shouldgivekillstreak = 0; + attacker.pers[ "cur_total_kill_streak" ]++; + attacker setplayercurrentstreak( attacker.pers[ "cur_total_kill_streak" ] ); + if ( isDefined( level.killstreaks ) && shouldgivekillstreak ) + { + attacker.pers[ "cur_kill_streak" ]++; + if ( attacker.pers[ "cur_kill_streak" ] >= 3 ) + { + if ( attacker.pers[ "cur_kill_streak" ] <= 30 ) + { + } + } + } + } + pixendevent(); + } + if ( attacker.pers[ "cur_kill_streak" ] > attacker.kill_streak ) + { + if ( level.rankedmatch ) + { + attacker setdstat( "HighestStats", "kill_streak", attacker.pers[ "totalKillstreakCount" ] ); + } + attacker.kill_streak = attacker.pers[ "cur_kill_streak" ]; + } + killstreak = undefined; + if ( isDefined( killstreak ) ) + { + } + else if ( smeansofdeath == "MOD_HEAD_SHOT" ) + { + } + else if ( smeansofdeath == "MOD_MELEE" ) + { + if ( sweapon == "riotshield_mp" ) + { + } + } + attacker thread maps/mp/gametypes_zm/_globallogic_score::trackattackerkill( self.name, self.pers[ "rank" ], self.pers[ "rankxp" ], self.pers[ "prestige" ], self getxuid( 1 ) ); + attackername = attacker.name; + self thread maps/mp/gametypes_zm/_globallogic_score::trackattackeedeath( attackername, attacker.pers[ "rank" ], attacker.pers[ "rankxp" ], attacker.pers[ "prestige" ], attacker getxuid( 1 ) ); + attacker thread maps/mp/gametypes_zm/_globallogic_score::inckillstreaktracker( sweapon ); + if ( level.teambased && attacker.team != "spectator" ) + { + if ( isai( attacker ) ) + { + maps/mp/gametypes_zm/_globallogic_score::giveteamscore( "kill", attacker.aiteam, attacker, self ); + } + else + { + maps/mp/gametypes_zm/_globallogic_score::giveteamscore( "kill", attacker.team, attacker, self ); + } + } + scoresub = level.deathpointloss; + if ( scoresub != 0 ) + { + maps/mp/gametypes_zm/_globallogic_score::_setplayerscore( self, maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( self ) - scoresub ); + } + level thread playkillbattlechatter( attacker, sweapon, self ); + if ( level.teambased ) + { + awardassists = 1; + } + } + } + pixendevent(); + } + } + else if ( isDefined( attacker ) || attacker.classname == "trigger_hurt" && attacker.classname == "worldspawn" ) + { + dokillcam = 0; + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackteam = "world"; + self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "suicides", 1 ); + self.suicides = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "suicides" ); + awardassists = 1; + } + else + { + dokillcam = 0; + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackteam = "world"; + if ( isDefined( einflictor ) && isDefined( einflictor.killcament ) ) + { + dokillcam = 1; + lpattacknum = self getentitynumber(); + } + if ( isDefined( attacker ) && isDefined( attacker.team ) && isDefined( level.teams[ attacker.team ] ) ) + { + if ( attacker.team != self.team ) + { + if ( level.teambased ) + { + maps/mp/gametypes_zm/_globallogic_score::giveteamscore( "kill", attacker.team, attacker, self ); + } + } + } + awardassists = 1; + } + if ( sessionmodeiszombiesgame() ) + { + awardassists = 0; + } + if ( awardassists ) + { + pixbeginevent( "PlayerKilled assists" ); + while ( isDefined( self.attackers ) ) + { + j = 0; + while ( j < self.attackers.size ) + { + player = self.attackers[ j ]; + if ( !isDefined( player ) ) + { + j++; + continue; + } + else if ( player == attacker ) + { + j++; + continue; + } + else if ( player.team != lpattackteam ) + { + j++; + continue; + } + else + { + damage_done = self.attackerdamage[ player.clientid ].damage; + player thread maps/mp/gametypes_zm/_globallogic_score::processassist( self, damage_done, self.attackerdamage[ player.clientid ].weapon ); + } + j++; + } + } + if ( isDefined( self.lastattackedshieldplayer ) && isDefined( self.lastattackedshieldtime ) && self.lastattackedshieldplayer != attacker ) + { + if ( ( getTime() - self.lastattackedshieldtime ) < 4000 ) + { + self.lastattackedshieldplayer thread maps/mp/gametypes_zm/_globallogic_score::processshieldassist( self ); + } + } + pixendevent(); + } + pixbeginevent( "PlayerKilled post constants" ); + self.lastattacker = attacker; + self.lastdeathpos = self.origin; + if ( isDefined( attacker ) && isplayer( attacker ) && attacker != self || !level.teambased && attacker.team != self.team ) + { + self thread maps/mp/_challenges::playerkilled( einflictor, attacker, idamage, smeansofdeath, sweapon, shitloc, attackerstance ); + } + else + { + self notify( "playerKilledChallengesProcessed" ); + } + if ( isDefined( self.attackers ) ) + { + self.attackers = []; + } + if ( isplayer( attacker ) ) + { + bbprint( "mpattacks", "gametime %d attackerspawnid %d attackerweapon %s attackerx %d attackery %d attackerz %d victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", getTime(), getplayerspawnid( attacker ), sweapon, lpattackorigin, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1 ); + } + else + { + bbprint( "mpattacks", "gametime %d attackerweapon %s victimspawnid %d victimx %d victimy %d victimz %d damage %d damagetype %s damagelocation %s death %d", getTime(), sweapon, getplayerspawnid( self ), self.origin, idamage, smeansofdeath, shitloc, 1 ); + } + logprint( "K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); + attackerstring = "none"; + if ( isplayer( attacker ) ) + { + attackerstring = attacker getxuid() + "(" + lpattackname + ")"; + } + self logstring( "d " + smeansofdeath + "(" + sweapon + ") a:" + attackerstring + " d:" + idamage + " l:" + shitloc + " @ " + int( self.origin[ 0 ] ) + " " + int( self.origin[ 1 ] ) + " " + int( self.origin[ 2 ] ) ); + level thread maps/mp/gametypes_zm/_globallogic::updateteamstatus(); + killcamentity = self getkillcamentity( attacker, einflictor, sweapon ); + killcamentityindex = -1; + killcamentitystarttime = 0; + if ( isDefined( killcamentity ) ) + { + killcamentityindex = killcamentity getentitynumber(); + if ( isDefined( killcamentity.starttime ) ) + { + killcamentitystarttime = killcamentity.starttime; + } + else + { + killcamentitystarttime = killcamentity.birthtime; + } + if ( !isDefined( killcamentitystarttime ) ) + { + killcamentitystarttime = 0; + } + } + if ( isDefined( self.killstreak_waitamount ) && self.killstreak_waitamount > 0 ) + { + dokillcam = 0; + } + self maps/mp/gametypes_zm/_weapons::detachcarryobjectmodel(); + died_in_vehicle = 0; + if ( isDefined( self.diedonvehicle ) ) + { + died_in_vehicle = self.diedonvehicle; + } + pixendevent(); + pixbeginevent( "PlayerKilled body and gibbing" ); + if ( !died_in_vehicle ) + { + vattackerorigin = undefined; + if ( isDefined( attacker ) ) + { + vattackerorigin = attacker.origin; + } + ragdoll_now = 0; + if ( isDefined( self.usingvehicle ) && self.usingvehicle && isDefined( self.vehicleposition ) && self.vehicleposition == 1 ) + { + ragdoll_now = 1; + } + body = self cloneplayer( deathanimduration ); + self createdeadbody( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_now, body ); + } + pixendevent(); + thread maps/mp/gametypes_zm/_globallogic_spawn::spawnqueuedclient( self.team, attacker ); + self.switching_teams = undefined; + self.joining_team = undefined; + self.leaving_team = undefined; + self thread [[ level.onplayerkilled ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + icb = 0; + while ( icb < level.onplayerkilledextraunthreadedcbs.size ) + { + self [[ level.onplayerkilledextraunthreadedcbs[ icb ] ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + icb++; + } + self.wantsafespawn = 0; + perks = []; + killstreaks = maps/mp/gametypes_zm/_globallogic::getkillstreaks( attacker ); + if ( !isDefined( self.killstreak_waitamount ) ) + { + self thread [[ level.spawnplayerprediction ]](); + } + profilelog_endtiming( 7, "gs=" + game[ "state" ] + " zom=" + sessionmodeiszombiesgame() ); + wait 0,25; + weaponclass = getweaponclass( sweapon ); + self.cancelkillcam = 0; + defaultplayerdeathwatchtime = 1,75; + if ( isDefined( level.overrideplayerdeathwatchtimer ) ) + { + defaultplayerdeathwatchtime = [[ level.overrideplayerdeathwatchtimer ]]( defaultplayerdeathwatchtime ); + } + maps/mp/gametypes_zm/_globallogic_utils::waitfortimeornotifies( defaultplayerdeathwatchtime ); + self notify( "death_delay_finished" ); /# - if ( getdvarint( _hash_C1849218 ) != 0 ) - { - dokillcam = 1; - - if ( lpattacknum < 0 ) - lpattacknum = self getentitynumber(); - } + if ( getDvarInt( #"C1849218" ) != 0 ) + { + dokillcam = 1; + if ( lpattacknum < 0 ) + { + lpattacknum = self getentitynumber(); #/ - if ( game["state"] != "playing" ) - return; - - self.respawntimerstarttime = gettime(); - - if ( !self.cancelkillcam && dokillcam && level.killcam ) - { - livesleft = !( level.numlives && !self.pers["lives"] ); - timeuntilspawn = maps\mp\gametypes_zm\_globallogic_spawn::timeuntilspawn( 1 ); - willrespawnimmediately = livesleft && timeuntilspawn <= 0 && !level.playerqueuedrespawn; - } - - if ( game["state"] != "playing" ) - { - self.sessionstate = "dead"; - self.spectatorclient = -1; - self.killcamtargetentity = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - return; - } - - waittillkillstreakdone(); - - if ( maps\mp\gametypes_zm\_globallogic_utils::isvalidclass( self.class ) ) - { - timepassed = undefined; - - if ( isdefined( self.respawntimerstarttime ) ) - timepassed = ( gettime() - self.respawntimerstarttime ) / 1000; - - self thread [[ level.spawnclient ]]( timepassed ); - self.respawntimerstarttime = undefined; - } + } + } + if ( game[ "state" ] != "playing" ) + { + return; + } + self.respawntimerstarttime = getTime(); + if ( !self.cancelkillcam && dokillcam && level.killcam ) + { + if ( level.numliveslivesleft = self.pers[ "lives" ]; + timeuntilspawn = maps/mp/gametypes_zm/_globallogic_spawn::timeuntilspawn( 1 ); + && livesleft && timeuntilspawn <= 0 ) + { + willrespawnimmediately = !level.playerqueuedrespawn; + } + } + if ( game[ "state" ] != "playing" ) + { + self.sessionstate = "dead"; + self.spectatorclient = -1; + self.killcamtargetentity = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + return; + } + waittillkillstreakdone(); + if ( maps/mp/gametypes_zm/_globallogic_utils::isvalidclass( self.class ) ) + { + timepassed = undefined; + if ( isDefined( self.respawntimerstarttime ) ) + { + timepassed = ( getTime() - self.respawntimerstarttime ) / 1000; + } + self thread [[ level.spawnclient ]]( timepassed ); + self.respawntimerstarttime = undefined; + } } updateglobalbotkilledcounter() { - if ( isdefined( self.pers["isBot"] ) ) - level.globallarryskilled++; + if ( isDefined( self.pers[ "isBot" ] ) ) + { + level.globallarryskilled++; + } } waittillkillstreakdone() { - if ( isdefined( self.killstreak_waitamount ) ) - { - starttime = gettime(); - waittime = self.killstreak_waitamount * 1000; - - while ( gettime() < starttime + waittime && isdefined( self.killstreak_waitamount ) ) - wait 0.1; - - wait 2.0; - self.killstreak_waitamount = undefined; - } + if ( isDefined( self.killstreak_waitamount ) ) + { + starttime = getTime(); + waittime = self.killstreak_waitamount * 1000; + while ( getTime() < ( starttime + waittime ) && isDefined( self.killstreak_waitamount ) ) + { + wait 0,1; + } + wait 2; + self.killstreak_waitamount = undefined; + } } teamkillkick() { - self maps\mp\gametypes_zm\_globallogic_score::incpersstat( "sessionbans", 1 ); - self endon( "disconnect" ); - waittillframeend; - playlistbanquantum = maps\mp\gametypes_zm\_tweakables::gettweakablevalue( "team", "teamkillerplaylistbanquantum" ); - playlistbanpenalty = maps\mp\gametypes_zm\_tweakables::gettweakablevalue( "team", "teamkillerplaylistbanpenalty" ); - - if ( playlistbanquantum > 0 && playlistbanpenalty > 0 ) - { - timeplayedtotal = self getdstat( "playerstatslist", "time_played_total", "StatValue" ); - minutesplayed = timeplayedtotal / 60; - freebees = 2; - banallowance = int( floor( minutesplayed / playlistbanquantum ) ) + freebees; - - if ( self.sessionbans > banallowance ) - self setdstat( "playerstatslist", "gametypeban", "StatValue", timeplayedtotal + playlistbanpenalty * 60 ); - } - - if ( self is_bot() ) - level notify( "bot_kicked", self.team ); - - ban( self getentitynumber() ); - maps\mp\gametypes_zm\_globallogic_audio::leaderdialog( "kicked" ); + self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "sessionbans", 1 ); + self endon( "disconnect" ); + waittillframeend; + playlistbanquantum = maps/mp/gametypes_zm/_tweakables::gettweakablevalue( "team", "teamkillerplaylistbanquantum" ); + playlistbanpenalty = maps/mp/gametypes_zm/_tweakables::gettweakablevalue( "team", "teamkillerplaylistbanpenalty" ); + if ( playlistbanquantum > 0 && playlistbanpenalty > 0 ) + { + timeplayedtotal = self getdstat( "playerstatslist", "time_played_total", "StatValue" ); + minutesplayed = timeplayedtotal / 60; + freebees = 2; + banallowance = int( floor( minutesplayed / playlistbanquantum ) ) + freebees; + if ( self.sessionbans > banallowance ) + { + self setdstat( "playerstatslist", "gametypeban", "StatValue", timeplayedtotal + ( playlistbanpenalty * 60 ) ); + } + } + if ( self is_bot() ) + { + level notify( "bot_kicked" ); + } + ban( self getentitynumber() ); + maps/mp/gametypes_zm/_globallogic_audio::leaderdialog( "kicked" ); } teamkilldelay() { - teamkills = self.pers["teamkills_nostats"]; - - if ( level.minimumallowedteamkills < 0 || teamkills <= level.minimumallowedteamkills ) - return 0; - - exceeded = teamkills - level.minimumallowedteamkills; - return level.teamkillspawndelay * exceeded; + teamkills = self.pers[ "teamkills_nostats" ]; + if ( level.minimumallowedteamkills < 0 || teamkills <= level.minimumallowedteamkills ) + { + return 0; + } + exceeded = teamkills - level.minimumallowedteamkills; + return level.teamkillspawndelay * exceeded; } shouldteamkillkick( teamkilldelay ) { - if ( teamkilldelay && level.minimumallowedteamkills >= 0 ) - { - if ( maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() >= 5000 ) - return true; - - if ( self.pers["teamkills_nostats"] > 1 ) - return true; - } - - return false; + if ( teamkilldelay && level.minimumallowedteamkills >= 0 ) + { + if ( maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() >= 5000 ) + { + return 1; + } + if ( self.pers[ "teamkills_nostats" ] > 1 ) + { + return 1; + } + } + return 0; } reduceteamkillsovertime() { - timeperoneteamkillreduction = 20.0; - reductionpersecond = 1.0 / timeperoneteamkillreduction; - - while ( true ) - { - if ( isalive( self ) ) - { - self.pers["teamkills_nostats"] -= reductionpersecond; - - if ( self.pers["teamkills_nostats"] < level.minimumallowedteamkills ) - { - self.pers["teamkills_nostats"] = level.minimumallowedteamkills; - break; - } - } - - wait 1; - } + timeperoneteamkillreduction = 20; + reductionpersecond = 1 / timeperoneteamkillreduction; + while ( 1 ) + { + if ( isalive( self ) ) + { + self.pers[ "teamkills_nostats" ] -= reductionpersecond; + if ( self.pers[ "teamkills_nostats" ] < level.minimumallowedteamkills ) + { + self.pers[ "teamkills_nostats" ] = level.minimumallowedteamkills; + return; + } + } + else + { + wait 1; + } + } } ignoreteamkills( sweapon, smeansofdeath ) { - if ( sessionmodeiszombiesgame() ) - return true; - - if ( smeansofdeath == "MOD_MELEE" ) - return false; - - if ( sweapon == "briefcase_bomb_mp" ) - return true; - - if ( sweapon == "supplydrop_mp" ) - return true; - - return false; + if ( sessionmodeiszombiesgame() ) + { + return 1; + } + if ( smeansofdeath == "MOD_MELEE" ) + { + return 0; + } + if ( sweapon == "briefcase_bomb_mp" ) + { + return 1; + } + if ( sweapon == "supplydrop_mp" ) + { + return 1; + } + return 0; } callback_playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - } damageshellshockandrumble( eattacker, einflictor, sweapon, smeansofdeath, idamage ) { - self thread maps\mp\gametypes_zm\_weapons::onweapondamage( eattacker, einflictor, sweapon, smeansofdeath, idamage ); - self playrumbleonentity( "damage_heavy" ); + self thread maps/mp/gametypes_zm/_weapons::onweapondamage( eattacker, einflictor, sweapon, smeansofdeath, idamage ); + self playrumbleonentity( "damage_heavy" ); } createdeadbody( idamage, smeansofdeath, sweapon, shitloc, vdir, vattackerorigin, deathanimduration, einflictor, ragdoll_jib, body ) { - if ( smeansofdeath == "MOD_HIT_BY_OBJECT" && self getstance() == "prone" ) - { - self.body = body; - return; - } - - if ( isdefined( level.ragdoll_override ) && self [[ level.ragdoll_override ]]() ) - return; - - if ( ragdoll_jib || self isonladder() || self ismantling() || smeansofdeath == "MOD_CRUSH" || smeansofdeath == "MOD_HIT_BY_OBJECT" ) - body startragdoll(); - - if ( !self isonground() ) - { - if ( getdvarint( "scr_disable_air_death_ragdoll" ) == 0 ) - body startragdoll(); - } - - if ( self is_explosive_ragdoll( sweapon, einflictor ) ) - body start_explosive_ragdoll( vdir, sweapon ); - - thread delaystartragdoll( body, shitloc, vdir, sweapon, einflictor, smeansofdeath ); - self.body = body; + if ( smeansofdeath == "MOD_HIT_BY_OBJECT" && self getstance() == "prone" ) + { + self.body = body; + return; + } + if ( isDefined( level.ragdoll_override ) && self [[ level.ragdoll_override ]]() ) + { + return; + } + if ( !ragdoll_jib && !self isonladder() && !self ismantling() || smeansofdeath == "MOD_CRUSH" && smeansofdeath == "MOD_HIT_BY_OBJECT" ) + { + body startragdoll(); + } + if ( !self isonground() ) + { + if ( getDvarInt( "scr_disable_air_death_ragdoll" ) == 0 ) + { + body startragdoll(); + } + } + if ( self is_explosive_ragdoll( sweapon, einflictor ) ) + { + body start_explosive_ragdoll( vdir, sweapon ); + } + thread delaystartragdoll( body, shitloc, vdir, sweapon, einflictor, smeansofdeath ); + self.body = body; } is_explosive_ragdoll( weapon, inflictor ) { - if ( !isdefined( weapon ) ) - return false; - - if ( weapon == "destructible_car_mp" || weapon == "explodable_barrel_mp" ) - return true; - - if ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) - { - if ( isdefined( inflictor ) && isdefined( inflictor.stucktoplayer ) ) - { - if ( inflictor.stucktoplayer == self ) - return true; - } - } - - return false; + if ( !isDefined( weapon ) ) + { + return 0; + } + if ( weapon == "destructible_car_mp" || weapon == "explodable_barrel_mp" ) + { + return 1; + } + if ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) + { + if ( isDefined( inflictor ) && isDefined( inflictor.stucktoplayer ) ) + { + if ( inflictor.stucktoplayer == self ) + { + return 1; + } + } + } + return 0; } start_explosive_ragdoll( dir, weapon ) { - if ( !isdefined( self ) ) - return; - - x = randomintrange( 50, 100 ); - y = randomintrange( 50, 100 ); - z = randomintrange( 10, 20 ); - - if ( isdefined( weapon ) && ( weapon == "sticky_grenade_mp" || weapon == "explosive_bolt_mp" ) ) - { - if ( isdefined( dir ) && lengthsquared( dir ) > 0 ) - { - x = dir[0] * x; - y = dir[1] * y; - } - } - else - { - if ( cointoss() ) - x *= -1; - - if ( cointoss() ) - y *= -1; - } - - self startragdoll(); - self launchragdoll( ( x, y, z ) ); + if ( !isDefined( self ) ) + { + return; + } + x = randomintrange( 50, 100 ); + y = randomintrange( 50, 100 ); + z = randomintrange( 10, 20 ); + if ( isDefined( weapon ) || weapon == "sticky_grenade_mp" && weapon == "explosive_bolt_mp" ) + { + if ( isDefined( dir ) && lengthsquared( dir ) > 0 ) + { + x = dir[ 0 ] * x; + y = dir[ 1 ] * y; + } + } + else + { + if ( cointoss() ) + { + x *= -1; + } + if ( cointoss() ) + { + y *= -1; + } + } + self startragdoll(); + self launchragdoll( ( x, y, z ) ); } notifyconnecting() { - waittillframeend; - - if ( isdefined( self ) ) - level notify( "connecting", self ); + waittillframeend; + if ( isDefined( self ) ) + { + level notify( "connecting" ); + } } delaystartragdoll( ent, shitloc, vdir, sweapon, einflictor, smeansofdeath ) { - if ( isdefined( ent ) ) - { - deathanim = ent getcorpseanim(); - - if ( animhasnotetrack( deathanim, "ignore_ragdoll" ) ) - return; - } - - if ( level.oldschool ) - { - if ( !isdefined( vdir ) ) - vdir = ( 0, 0, 0 ); - - explosionpos = ent.origin + ( 0, 0, maps\mp\gametypes_zm\_globallogic_utils::gethitlocheight( shitloc ) ); - explosionpos -= vdir * 20; - explosionradius = 40; - explosionforce = 0.75; - - if ( smeansofdeath == "MOD_IMPACT" || smeansofdeath == "MOD_EXPLOSIVE" || issubstr( smeansofdeath, "MOD_GRENADE" ) || issubstr( smeansofdeath, "MOD_PROJECTILE" ) || shitloc == "head" || shitloc == "helmet" ) - explosionforce = 2.5; - - ent startragdoll( 1 ); - wait 0.05; - - if ( !isdefined( ent ) ) - return; - - physicsexplosionsphere( explosionpos, explosionradius, explosionradius / 2, explosionforce ); - return; - } - - wait 0.2; - - if ( !isdefined( ent ) ) - return; - - if ( ent isragdoll() ) - return; - - deathanim = ent getcorpseanim(); - startfrac = 0.35; - - if ( animhasnotetrack( deathanim, "start_ragdoll" ) ) - { - times = getnotetracktimes( deathanim, "start_ragdoll" ); - - if ( isdefined( times ) ) - startfrac = times[0]; - } - - waittime = startfrac * getanimlength( deathanim ); - wait( waittime ); - - if ( isdefined( ent ) ) - ent startragdoll( 1 ); + if ( isDefined( ent ) ) + { + deathanim = ent getcorpseanim(); + if ( animhasnotetrack( deathanim, "ignore_ragdoll" ) ) + { + return; + } + } + if ( level.oldschool ) + { + if ( !isDefined( vdir ) ) + { + vdir = ( 0, 0, 0 ); + } + explosionpos = ent.origin + ( 0, 0, maps/mp/gametypes_zm/_globallogic_utils::gethitlocheight( shitloc ) ); + explosionpos -= vdir * 20; + explosionradius = 40; + explosionforce = 0,75; + if ( smeansofdeath != "MOD_IMPACT" && smeansofdeath != "MOD_EXPLOSIVE" && !issubstr( smeansofdeath, "MOD_GRENADE" ) && !issubstr( smeansofdeath, "MOD_PROJECTILE" ) || shitloc == "head" && shitloc == "helmet" ) + { + explosionforce = 2,5; + } + ent startragdoll( 1 ); + wait 0,05; + if ( !isDefined( ent ) ) + { + return; + } + physicsexplosionsphere( explosionpos, explosionradius, explosionradius / 2, explosionforce ); + return; + } + wait 0,2; + if ( !isDefined( ent ) ) + { + return; + } + if ( ent isragdoll() ) + { + return; + } + deathanim = ent getcorpseanim(); + startfrac = 0,35; + if ( animhasnotetrack( deathanim, "start_ragdoll" ) ) + { + times = getnotetracktimes( deathanim, "start_ragdoll" ); + if ( isDefined( times ) ) + { + startfrac = times[ 0 ]; + } + } + waittime = startfrac * getanimlength( deathanim ); + wait waittime; + if ( isDefined( ent ) ) + { + ent startragdoll( 1 ); + } } trackattackerdamage( eattacker, idamage, smeansofdeath, sweapon ) { /# - assert( isplayer( eattacker ) ); + assert( isplayer( eattacker ) ); #/ - if ( self.attackerdata.size == 0 ) - self.firsttimedamaged = gettime(); - - if ( !isdefined( self.attackerdata[eattacker.clientid] ) ) - { - self.attackerdamage[eattacker.clientid] = spawnstruct(); - self.attackerdamage[eattacker.clientid].damage = idamage; - self.attackerdamage[eattacker.clientid].meansofdeath = smeansofdeath; - self.attackerdamage[eattacker.clientid].weapon = sweapon; - self.attackerdamage[eattacker.clientid].time = gettime(); - self.attackers[self.attackers.size] = eattacker; - self.attackerdata[eattacker.clientid] = 0; - } - else - { - self.attackerdamage[eattacker.clientid].damage += idamage; - self.attackerdamage[eattacker.clientid].meansofdeath = smeansofdeath; - self.attackerdamage[eattacker.clientid].weapon = sweapon; - - if ( !isdefined( self.attackerdamage[eattacker.clientid].time ) ) - self.attackerdamage[eattacker.clientid].time = gettime(); - } - - self.attackerdamage[eattacker.clientid].lasttimedamaged = gettime(); - - if ( maps\mp\gametypes_zm\_weapons::isprimaryweapon( sweapon ) ) - self.attackerdata[eattacker.clientid] = 1; + if ( self.attackerdata.size == 0 ) + { + self.firsttimedamaged = getTime(); + } + if ( !isDefined( self.attackerdata[ eattacker.clientid ] ) ) + { + self.attackerdamage[ eattacker.clientid ] = spawnstruct(); + self.attackerdamage[ eattacker.clientid ].damage = idamage; + self.attackerdamage[ eattacker.clientid ].meansofdeath = smeansofdeath; + self.attackerdamage[ eattacker.clientid ].weapon = sweapon; + self.attackerdamage[ eattacker.clientid ].time = getTime(); + self.attackers[ self.attackers.size ] = eattacker; + self.attackerdata[ eattacker.clientid ] = 0; + } + else + { + self.attackerdamage[ eattacker.clientid ].damage += idamage; + self.attackerdamage[ eattacker.clientid ].meansofdeath = smeansofdeath; + self.attackerdamage[ eattacker.clientid ].weapon = sweapon; + if ( !isDefined( self.attackerdamage[ eattacker.clientid ].time ) ) + { + self.attackerdamage[ eattacker.clientid ].time = getTime(); + } + } + self.attackerdamage[ eattacker.clientid ].lasttimedamaged = getTime(); + if ( maps/mp/gametypes_zm/_weapons::isprimaryweapon( sweapon ) ) + { + self.attackerdata[ eattacker.clientid ] = 1; + } } giveinflictorownerassist( eattacker, einflictor, idamage, smeansofdeath, sweapon ) { - if ( !isdefined( einflictor ) ) - return; - - if ( !isdefined( einflictor.owner ) ) - return; - - if ( !isdefined( einflictor.ownergetsassist ) ) - return; - - if ( !einflictor.ownergetsassist ) - return; + if ( !isDefined( einflictor ) ) + { + return; + } + if ( !isDefined( einflictor.owner ) ) + { + return; + } + if ( !isDefined( einflictor.ownergetsassist ) ) + { + return; + } + if ( !einflictor.ownergetsassist ) + { + return; + } /# - assert( isplayer( einflictor.owner ) ); + assert( isplayer( einflictor.owner ) ); #/ - self trackattackerdamage( einflictor.owner, idamage, smeansofdeath, sweapon ); + self trackattackerdamage( einflictor.owner, idamage, smeansofdeath, sweapon ); } updatemeansofdeath( sweapon, smeansofdeath ) { - switch ( sweapon ) - { - case "knife_ballistic_mp": - case "crossbow_mp": - if ( smeansofdeath != "MOD_HEAD_SHOT" && smeansofdeath != "MOD_MELEE" ) - smeansofdeath = "MOD_PISTOL_BULLET"; - - break; - case "dog_bite_mp": - smeansofdeath = "MOD_PISTOL_BULLET"; - break; - case "destructible_car_mp": - smeansofdeath = "MOD_EXPLOSIVE"; - break; - case "explodable_barrel_mp": - smeansofdeath = "MOD_EXPLOSIVE"; - break; - } - - return smeansofdeath; + switch( sweapon ) + { + case "crossbow_mp": + case "knife_ballistic_mp": + if ( smeansofdeath != "MOD_HEAD_SHOT" && smeansofdeath != "MOD_MELEE" ) + { + smeansofdeath = "MOD_PISTOL_BULLET"; + } + break; + case "dog_bite_mp": + smeansofdeath = "MOD_PISTOL_BULLET"; + break; + case "destructible_car_mp": + smeansofdeath = "MOD_EXPLOSIVE"; + break; + case "explodable_barrel_mp": + smeansofdeath = "MOD_EXPLOSIVE"; + break; + } + return smeansofdeath; } updateattacker( attacker, weapon ) { - if ( isai( attacker ) && isdefined( attacker.script_owner ) ) - { - if ( !level.teambased || attacker.script_owner.team != self.team ) - attacker = attacker.script_owner; - } - - if ( attacker.classname == "script_vehicle" && isdefined( attacker.owner ) ) - { - attacker notify( "killed", self ); - attacker = attacker.owner; - } - - if ( isai( attacker ) ) - attacker notify( "killed", self ); - - if ( isdefined( self.capturinglastflag ) && self.capturinglastflag == 1 ) - attacker.lastcapkiller = 1; - - if ( isdefined( attacker ) && isdefined( weapon ) && weapon == "planemortar_mp" ) - { - if ( !isdefined( attacker.planemortarbda ) ) - attacker.planemortarbda = 0; - - attacker.planemortarbda++; - } - - return attacker; + if ( isai( attacker ) && isDefined( attacker.script_owner ) ) + { + if ( !level.teambased || attacker.script_owner.team != self.team ) + { + attacker = attacker.script_owner; + } + } + if ( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) + { + attacker notify( "killed" ); + attacker = attacker.owner; + } + if ( isai( attacker ) ) + { + attacker notify( "killed" ); + } + if ( isDefined( self.capturinglastflag ) && self.capturinglastflag == 1 ) + { + attacker.lastcapkiller = 1; + } + if ( isDefined( attacker ) && isDefined( weapon ) && weapon == "planemortar_mp" ) + { + if ( !isDefined( attacker.planemortarbda ) ) + { + attacker.planemortarbda = 0; + } + attacker.planemortarbda++; + } + return attacker; } updateinflictor( einflictor ) { - if ( isdefined( einflictor ) && einflictor.classname == "script_vehicle" ) - { - einflictor notify( "killed", self ); - - if ( isdefined( einflictor.bda ) ) - einflictor.bda++; - } - - return einflictor; + if ( isDefined( einflictor ) && einflictor.classname == "script_vehicle" ) + { + einflictor notify( "killed" ); + if ( isDefined( einflictor.bda ) ) + { + einflictor.bda++; + } + } + return einflictor; } updateweapon( einflictor, sweapon ) { - if ( sweapon == "none" && isdefined( einflictor ) ) - { - if ( isdefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" ) - sweapon = "explodable_barrel_mp"; - else if ( isdefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) ) - sweapon = "destructible_car_mp"; - } - - return sweapon; + if ( sweapon == "none" && isDefined( einflictor ) ) + { + if ( isDefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" ) + { + sweapon = "explodable_barrel_mp"; + } + else + { + if ( isDefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) ) + { + sweapon = "destructible_car_mp"; + } + } + } + return sweapon; } getclosestkillcamentity( attacker, killcamentities, depth ) { - if ( !isdefined( depth ) ) - depth = 0; - - closestkillcament = undefined; - closestkillcamentindex = undefined; - closestkillcamentdist = undefined; - origin = undefined; - - foreach ( killcamentindex, killcament in killcamentities ) - { - if ( killcament == attacker ) - continue; - - origin = killcament.origin; - - if ( isdefined( killcament.offsetpoint ) ) - origin += killcament.offsetpoint; - - dist = distancesquared( self.origin, origin ); - - if ( !isdefined( closestkillcament ) || dist < closestkillcamentdist ) - { - closestkillcament = killcament; - closestkillcamentdist = dist; - closestkillcamentindex = killcamentindex; - } - } - - if ( depth < 3 && isdefined( closestkillcament ) ) - { - if ( !bullettracepassed( closestkillcament.origin, self.origin, 0, self ) ) - { - killcamentities[closestkillcamentindex] = undefined; - betterkillcament = getclosestkillcamentity( attacker, killcamentities, depth + 1 ); - - if ( isdefined( betterkillcament ) ) - closestkillcament = betterkillcament; - } - } - - return closestkillcament; + if ( !isDefined( depth ) ) + { + depth = 0; + } + closestkillcament = undefined; + closestkillcamentindex = undefined; + closestkillcamentdist = undefined; + origin = undefined; + _a2796 = killcamentities; + killcamentindex = getFirstArrayKey( _a2796 ); + while ( isDefined( killcamentindex ) ) + { + killcament = _a2796[ killcamentindex ]; + if ( killcament == attacker ) + { + } + else + { + origin = killcament.origin; + if ( isDefined( killcament.offsetpoint ) ) + { + origin += killcament.offsetpoint; + } + dist = distancesquared( self.origin, origin ); + if ( !isDefined( closestkillcament ) || dist < closestkillcamentdist ) + { + closestkillcament = killcament; + closestkillcamentdist = dist; + closestkillcamentindex = killcamentindex; + } + } + killcamentindex = getNextArrayKey( _a2796, killcamentindex ); + } + if ( depth < 3 && isDefined( closestkillcament ) ) + { + if ( !bullettracepassed( closestkillcament.origin, self.origin, 0, self ) ) + { + betterkillcament = getclosestkillcamentity( attacker, killcamentities, depth + 1 ); + if ( isDefined( betterkillcament ) ) + { + closestkillcament = betterkillcament; + } + } + } + return closestkillcament; } getkillcamentity( attacker, einflictor, sweapon ) { - if ( !isdefined( einflictor ) ) - return undefined; - - if ( einflictor == attacker ) - { - if ( !isdefined( einflictor.ismagicbullet ) ) - return undefined; - - if ( isdefined( einflictor.ismagicbullet ) && !einflictor.ismagicbullet ) - return undefined; - } - else if ( isdefined( level.levelspecifickillcam ) ) - { - levelspecifickillcament = self [[ level.levelspecifickillcam ]](); - - if ( isdefined( levelspecifickillcament ) ) - return levelspecifickillcament; - } - - if ( sweapon == "m220_tow_mp" ) - return undefined; - - if ( isdefined( einflictor.killcament ) ) - { - if ( einflictor.killcament == attacker ) - return undefined; - - return einflictor.killcament; - } - else if ( isdefined( einflictor.killcamentities ) ) - return getclosestkillcamentity( attacker, einflictor.killcamentities ); - - if ( isdefined( einflictor.script_gameobjectname ) && einflictor.script_gameobjectname == "bombzone" ) - return einflictor.killcament; - - return einflictor; + if ( !isDefined( einflictor ) ) + { + return undefined; + } + if ( einflictor == attacker ) + { + if ( !isDefined( einflictor.ismagicbullet ) ) + { + return undefined; + } + if ( isDefined( einflictor.ismagicbullet ) && !einflictor.ismagicbullet ) + { + return undefined; + } + } + else + { + if ( isDefined( level.levelspecifickillcam ) ) + { + levelspecifickillcament = self [[ level.levelspecifickillcam ]](); + if ( isDefined( levelspecifickillcament ) ) + { + return levelspecifickillcament; + } + } + } + if ( sweapon == "m220_tow_mp" ) + { + return undefined; + } + if ( isDefined( einflictor.killcament ) ) + { + if ( einflictor.killcament == attacker ) + { + return undefined; + } + return einflictor.killcament; + } + else + { + if ( isDefined( einflictor.killcamentities ) ) + { + return getclosestkillcamentity( attacker, einflictor.killcamentities ); + } + } + if ( isDefined( einflictor.script_gameobjectname ) && einflictor.script_gameobjectname == "bombzone" ) + { + return einflictor.killcament; + } + return einflictor; } playkillbattlechatter( attacker, sweapon, victim ) { - } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_score.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_score.gsc index a6fcf15..a5610a2 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_score.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_score.gsc @@ -1,785 +1,873 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\_bb; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\gametypes_zm\_globallogic_audio; -#include maps\mp\_challenges; -#include maps\mp\gametypes_zm\_globallogic_utils; +#include maps/mp/gametypes_zm/_globallogic_utils; +#include maps/mp/_challenges; +#include maps/mp/gametypes_zm/_globallogic_audio; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/gametypes_zm/_globallogic; +#include maps/mp/_bb; +#include maps/mp/_utility; +#include common_scripts/utility; updatematchbonusscores( winner ) { - } givematchbonus( scoretype, score ) { - } doskillupdate( winner ) { - skillupdate( winner, level.teambased ); + skillupdate( winner, level.teambased ); } gethighestscoringplayer() { - players = level.players; - winner = undefined; - tie = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( !isdefined( players[i].score ) ) - continue; - - if ( players[i].score < 1 ) - continue; - - if ( !isdefined( winner ) || players[i].score > winner.score ) - { - winner = players[i]; - tie = 0; - continue; - } - - if ( players[i].score == winner.score ) - tie = 1; - } - - if ( tie || !isdefined( winner ) ) - return undefined; - else - return winner; + players = level.players; + winner = undefined; + tie = 0; + i = 0; + while ( i < players.size ) + { + if ( !isDefined( players[ i ].score ) ) + { + i++; + continue; + } + else if ( players[ i ].score < 1 ) + { + i++; + continue; + } + else if ( !isDefined( winner ) || players[ i ].score > winner.score ) + { + winner = players[ i ]; + tie = 0; + i++; + continue; + } + else + { + if ( players[ i ].score == winner.score ) + { + tie = 1; + } + } + i++; + } + if ( tie || !isDefined( winner ) ) + { + return undefined; + } + else + { + return winner; + } } resetscorechain() { - self notify( "reset_score_chain" ); - self.scorechain = 0; - self.rankupdatetotal = 0; + self notify( "reset_score_chain" ); + self.scorechain = 0; + self.rankupdatetotal = 0; } scorechaintimer() { - self notify( "score_chain_timer" ); - self endon( "reset_score_chain" ); - self endon( "score_chain_timer" ); - self endon( "death" ); - self endon( "disconnect" ); - wait 20; - self thread resetscorechain(); + self notify( "score_chain_timer" ); + self endon( "reset_score_chain" ); + self endon( "score_chain_timer" ); + self endon( "death" ); + self endon( "disconnect" ); + wait 20; + self thread resetscorechain(); } roundtonearestfive( score ) { - rounding = score % 5; - - if ( rounding <= 2 ) - return score - rounding; - else - return score + 5 - rounding; + rounding = score % 5; + if ( rounding <= 2 ) + { + return score - rounding; + } + else + { + return score + ( 5 - rounding ); + } } giveplayermomentumnotification( score, label, descvalue, countstowardrampage ) { - rampagebonus = 0; - - if ( isdefined( level.usingrampage ) && level.usingrampage ) - { - if ( countstowardrampage ) - { - if ( !isdefined( self.scorechain ) ) - self.scorechain = 0; - - self.scorechain++; - self thread scorechaintimer(); - } - - if ( isdefined( self.scorechain ) && self.scorechain >= 999 ) - rampagebonus = roundtonearestfive( int( score * level.rampagebonusscale + 0.5 ) ); - } - - if ( score != 0 ) - self luinotifyevent( &"score_event", 3, label, score, rampagebonus ); - - score += rampagebonus; - - if ( score > 0 && self hasperk( "specialty_earnmoremomentum" ) ) - score = roundtonearestfive( int( score * getdvarfloat( "perk_killstreakMomentumMultiplier" ) + 0.5 ) ); - - _setplayermomentum( self, self.pers["momentum"] + score ); + rampagebonus = 0; + if ( isDefined( level.usingrampage ) && level.usingrampage ) + { + if ( countstowardrampage ) + { + if ( !isDefined( self.scorechain ) ) + { + self.scorechain = 0; + } + self.scorechain++; + self thread scorechaintimer(); + } + if ( isDefined( self.scorechain ) && self.scorechain >= 999 ) + { + rampagebonus = roundtonearestfive( int( ( score * level.rampagebonusscale ) + 0,5 ) ); + } + } + if ( score != 0 ) + { + self luinotifyevent( &"score_event", 3, label, score, rampagebonus ); + } + score += rampagebonus; + if ( score > 0 && self hasperk( "specialty_earnmoremomentum" ) ) + { + score = roundtonearestfive( int( ( score * getDvarFloat( "perk_killstreakMomentumMultiplier" ) ) + 0,5 ) ); + } + _setplayermomentum( self, self.pers[ "momentum" ] + score ); } resetplayermomentumondeath() { - if ( isdefined( level.usingscorestreaks ) && level.usingscorestreaks ) - { - _setplayermomentum( self, 0 ); - self thread resetscorechain(); - } + if ( isDefined( level.usingscorestreaks ) && level.usingscorestreaks ) + { + _setplayermomentum( self, 0 ); + self thread resetscorechain(); + } } giveplayermomentum( event, player, victim, weapon, descvalue ) { - } giveplayerscore( event, player, victim, weapon, descvalue ) { - scorediff = 0; - momentum = player.pers["momentum"]; - giveplayermomentum( event, player, victim, weapon, descvalue ); - newmomentum = player.pers["momentum"]; - - if ( level.overrideplayerscore ) - return 0; - - pixbeginevent( "level.onPlayerScore" ); - score = player.pers["score"]; - [[ level.onplayerscore ]]( event, player, victim ); - newscore = player.pers["score"]; - pixendevent(); - bbprint( "mpplayerscore", "spawnid %d gametime %d type %s player %s delta %d deltamomentum %d team %s", getplayerspawnid( player ), gettime(), event, player.name, newscore - score, newmomentum - momentum, player.team ); - player maps\mp\_bb::bbaddtostat( "score", newscore - score ); - - if ( score == newscore ) - return 0; - - pixbeginevent( "givePlayerScore" ); - recordplayerstats( player, "score", newscore ); - scorediff = newscore - score; - player addplayerstatwithgametype( "score", scorediff ); - - if ( isdefined( player.pers["lastHighestScore"] ) && newscore > player.pers["lastHighestScore"] ) - player setdstat( "HighestStats", "highest_score", newscore ); - - pixendevent(); - return scorediff; + scorediff = 0; + momentum = player.pers[ "momentum" ]; + giveplayermomentum( event, player, victim, weapon, descvalue ); + newmomentum = player.pers[ "momentum" ]; + if ( level.overrideplayerscore ) + { + return 0; + } + pixbeginevent( "level.onPlayerScore" ); + score = player.pers[ "score" ]; + [[ level.onplayerscore ]]( event, player, victim ); + newscore = player.pers[ "score" ]; + pixendevent(); + bbprint( "mpplayerscore", "spawnid %d gametime %d type %s player %s delta %d deltamomentum %d team %s", getplayerspawnid( player ), getTime(), event, player.name, newscore - score, newmomentum - momentum, player.team ); + player maps/mp/_bb::bbaddtostat( "score", newscore - score ); + if ( score == newscore ) + { + return 0; + } + pixbeginevent( "givePlayerScore" ); + recordplayerstats( player, "score", newscore ); + scorediff = newscore - score; + player addplayerstatwithgametype( "score", scorediff ); + if ( isDefined( player.pers[ "lastHighestScore" ] ) && newscore > player.pers[ "lastHighestScore" ] ) + { + player setdstat( "HighestStats", "highest_score", newscore ); + } + pixendevent(); + return scorediff; } default_onplayerscore( event, player, victim ) { - } _setplayerscore( player, score ) { - } _getplayerscore( player ) { - return player.pers["score"]; + return player.pers[ "score" ]; } _setplayermomentum( player, momentum ) { - momentum = clamp( momentum, 0, 2000 ); - oldmomentum = player.pers["momentum"]; - - if ( momentum == oldmomentum ) - return; - - player maps\mp\_bb::bbaddtostat( "momentum", momentum - oldmomentum ); - - if ( momentum > oldmomentum ) - { - highestmomentumcost = 0; - numkillstreaks = player.killstreak.size; - killstreaktypearray = []; - } - - player.pers["momentum"] = momentum; - player.momentum = player.pers["momentum"]; + momentum = clamp( momentum, 0, 2000 ); + oldmomentum = player.pers[ "momentum" ]; + if ( momentum == oldmomentum ) + { + return; + } + player maps/mp/_bb::bbaddtostat( "momentum", momentum - oldmomentum ); + if ( momentum > oldmomentum ) + { + highestmomentumcost = 0; + numkillstreaks = player.killstreak.size; + killstreaktypearray = []; + } + player.pers[ "momentum" ] = momentum; + player.momentum = player.pers[ "momentum" ]; } _giveplayerkillstreakinternal( player, momentum, oldmomentum, killstreaktypearray ) { - } setplayermomentumdebug() { /# - setdvar( "sv_momentumPercent", 0.0 ); - - while ( true ) - { - wait 1; - momentumpercent = getdvarfloatdefault( "sv_momentumPercent", 0.0 ); - - if ( momentumpercent != 0.0 ) - { - player = gethostplayer(); - - if ( !isdefined( player ) ) - return; - - if ( isdefined( player.killstreak ) ) - _setplayermomentum( player, int( 2000 * momentumpercent / 100 ) ); - } - } + setdvar( "sv_momentumPercent", 0 ); + while ( 1 ) + { + wait 1; + momentumpercent = getdvarfloatdefault( "sv_momentumPercent", 0 ); + if ( momentumpercent != 0 ) + { + player = gethostplayer(); + if ( !isDefined( player ) ) + { + return; + } + if ( isDefined( player.killstreak ) ) + { + _setplayermomentum( player, int( 2000 * ( momentumpercent / 100 ) ) ); + } + } #/ + } } giveteamscore( event, team, player, victim ) { - if ( level.overrideteamscore ) - return; - - pixbeginevent( "level.onTeamScore" ); - teamscore = game["teamScores"][team]; - [[ level.onteamscore ]]( event, team ); - pixendevent(); - newscore = game["teamScores"][team]; - bbprint( "mpteamscores", "gametime %d event %s team %d diff %d score %d", gettime(), event, team, newscore - teamscore, newscore ); - - if ( teamscore == newscore ) - return; - - updateteamscores( team ); - thread maps\mp\gametypes_zm\_globallogic::checkscorelimit(); + if ( level.overrideteamscore ) + { + return; + } + pixbeginevent( "level.onTeamScore" ); + teamscore = game[ "teamScores" ][ team ]; + [[ level.onteamscore ]]( event, team ); + pixendevent(); + newscore = game[ "teamScores" ][ team ]; + bbprint( "mpteamscores", "gametime %d event %s team %d diff %d score %d", getTime(), event, team, newscore - teamscore, newscore ); + if ( teamscore == newscore ) + { + return; + } + updateteamscores( team ); + thread maps/mp/gametypes_zm/_globallogic::checkscorelimit(); } giveteamscoreforobjective( team, score ) { - teamscore = game["teamScores"][team]; - onteamscore( score, team ); - newscore = game["teamScores"][team]; - bbprint( "mpteamobjscores", "gametime %d team %d diff %d score %d", gettime(), team, newscore - teamscore, newscore ); - - if ( teamscore == newscore ) - return; - - updateteamscores( team ); - thread maps\mp\gametypes_zm\_globallogic::checkscorelimit(); + teamscore = game[ "teamScores" ][ team ]; + onteamscore( score, team ); + newscore = game[ "teamScores" ][ team ]; + bbprint( "mpteamobjscores", "gametime %d team %d diff %d score %d", getTime(), team, newscore - teamscore, newscore ); + if ( teamscore == newscore ) + { + return; + } + updateteamscores( team ); + thread maps/mp/gametypes_zm/_globallogic::checkscorelimit(); } _setteamscore( team, teamscore ) { - if ( teamscore == game["teamScores"][team] ) - return; - - game["teamScores"][team] = teamscore; - updateteamscores( team ); - thread maps\mp\gametypes_zm\_globallogic::checkscorelimit(); + if ( teamscore == game[ "teamScores" ][ team ] ) + { + return; + } + game[ "teamScores" ][ team ] = teamscore; + updateteamscores( team ); + thread maps/mp/gametypes_zm/_globallogic::checkscorelimit(); } resetteamscores() { - if ( !isdefined( level.roundscorecarry ) || level.roundscorecarry == 0 || maps\mp\_utility::isfirstround() ) - { - foreach ( team in level.teams ) - game["teamScores"][team] = 0; - } - - maps\mp\gametypes_zm\_globallogic_score::updateallteamscores(); + while ( isDefined( level.roundscorecarry ) || level.roundscorecarry == 0 && maps/mp/_utility::isfirstround() ) + { + _a591 = level.teams; + _k591 = getFirstArrayKey( _a591 ); + while ( isDefined( _k591 ) ) + { + team = _a591[ _k591 ]; + game[ "teamScores" ][ team ] = 0; + _k591 = getNextArrayKey( _a591, _k591 ); + } + } + maps/mp/gametypes_zm/_globallogic_score::updateallteamscores(); } resetallscores() { - resetteamscores(); - resetplayerscores(); + resetteamscores(); + resetplayerscores(); } resetplayerscores() { - players = level.players; - winner = undefined; - tie = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( players[i].pers["score"] ) ) - _setplayerscore( players[i], 0 ); - } + players = level.players; + winner = undefined; + tie = 0; + i = 0; + while ( i < players.size ) + { + if ( isDefined( players[ i ].pers[ "score" ] ) ) + { + _setplayerscore( players[ i ], 0 ); + } + i++; + } } updateteamscores( team ) { - setteamscore( team, game["teamScores"][team] ); - level thread maps\mp\gametypes_zm\_globallogic::checkteamscorelimitsoon( team ); + setteamscore( team, game[ "teamScores" ][ team ] ); + level thread maps/mp/gametypes_zm/_globallogic::checkteamscorelimitsoon( team ); } updateallteamscores() { - foreach ( team in level.teams ) - updateteamscores( team ); + _a629 = level.teams; + _k629 = getFirstArrayKey( _a629 ); + while ( isDefined( _k629 ) ) + { + team = _a629[ _k629 ]; + updateteamscores( team ); + _k629 = getNextArrayKey( _a629, _k629 ); + } } _getteamscore( team ) { - return game["teamScores"][team]; + return game[ "teamScores" ][ team ]; } gethighestteamscoreteam() { - score = 0; - winning_teams = []; - - foreach ( team in level.teams ) - { - team_score = game["teamScores"][team]; - - if ( team_score > score ) - { - score = team_score; - winning_teams = []; - } - - if ( team_score == score ) - winning_teams[team] = team; - } - - return winning_teams; + score = 0; + winning_teams = []; + _a645 = level.teams; + _k645 = getFirstArrayKey( _a645 ); + while ( isDefined( _k645 ) ) + { + team = _a645[ _k645 ]; + team_score = game[ "teamScores" ][ team ]; + if ( team_score > score ) + { + score = team_score; + winning_teams = []; + } + if ( team_score == score ) + { + winning_teams[ team ] = team; + } + _k645 = getNextArrayKey( _a645, _k645 ); + } + return winning_teams; } areteamarraysequal( teamsa, teamsb ) { - if ( teamsa.size != teamsb.size ) - return false; - - foreach ( team in teamsa ) - { - if ( !isdefined( teamsb[team] ) ) - return false; - } - - return true; + if ( teamsa.size != teamsb.size ) + { + return 0; + } + _a668 = teamsa; + _k668 = getFirstArrayKey( _a668 ); + while ( isDefined( _k668 ) ) + { + team = _a668[ _k668 ]; + if ( !isDefined( teamsb[ team ] ) ) + { + return 0; + } + _k668 = getNextArrayKey( _a668, _k668 ); + } + return 1; } onteamscore( score, team ) { - game["teamScores"][team] += score; - - if ( level.scorelimit && game["teamScores"][team] > level.scorelimit ) - game["teamScores"][team] = level.scorelimit; - - if ( level.splitscreen ) - return; - - if ( level.scorelimit == 1 ) - return; - - iswinning = gethighestteamscoreteam(); - - if ( iswinning.size == 0 ) - return; - - if ( gettime() - level.laststatustime < 5000 ) - return; - - if ( areteamarraysequal( iswinning, level.waswinning ) ) - return; - - level.laststatustime = gettime(); - - if ( iswinning.size == 1 ) - { - foreach ( team in iswinning ) - { - if ( isdefined( level.waswinning[team] ) ) - { - if ( level.waswinning.size == 1 ) - continue; - } - - maps\mp\gametypes_zm\_globallogic_audio::leaderdialog( "lead_taken", team, "status" ); - } - } - - if ( level.waswinning.size == 1 ) - { - foreach ( team in level.waswinning ) - { - if ( isdefined( iswinning[team] ) ) - { - if ( iswinning.size == 1 ) - continue; - - if ( level.waswinning.size > 1 ) - continue; - } - - maps\mp\gametypes_zm\_globallogic_audio::leaderdialog( "lead_lost", team, "status" ); - } - } - - level.waswinning = iswinning; + game[ "teamScores" ][ team ] += score; + if ( level.scorelimit && game[ "teamScores" ][ team ] > level.scorelimit ) + { + game[ "teamScores" ][ team ] = level.scorelimit; + } + if ( level.splitscreen ) + { + return; + } + if ( level.scorelimit == 1 ) + { + return; + } + iswinning = gethighestteamscoreteam(); + if ( iswinning.size == 0 ) + { + return; + } + if ( ( getTime() - level.laststatustime ) < 5000 ) + { + return; + } + if ( areteamarraysequal( iswinning, level.waswinning ) ) + { + return; + } + level.laststatustime = getTime(); + while ( iswinning.size == 1 ) + { + _a707 = iswinning; + _k707 = getFirstArrayKey( _a707 ); + while ( isDefined( _k707 ) ) + { + team = _a707[ _k707 ]; + if ( isDefined( level.waswinning[ team ] ) ) + { + if ( level.waswinning.size == 1 ) + { + } + } + else + { + maps/mp/gametypes_zm/_globallogic_audio::leaderdialog( "lead_taken", team, "status" ); + } + _k707 = getNextArrayKey( _a707, _k707 ); + } + } + while ( level.waswinning.size == 1 ) + { + _a726 = level.waswinning; + _k726 = getFirstArrayKey( _a726 ); + while ( isDefined( _k726 ) ) + { + team = _a726[ _k726 ]; + if ( isDefined( iswinning[ team ] ) ) + { + if ( iswinning.size == 1 ) + { + } + else if ( level.waswinning.size > 1 ) + { + } + } + else + { + maps/mp/gametypes_zm/_globallogic_audio::leaderdialog( "lead_lost", team, "status" ); + } + _k726 = getNextArrayKey( _a726, _k726 ); + } + } + level.waswinning = iswinning; } default_onteamscore( event, team ) { - } initpersstat( dataname, record_stats, init_to_stat_value ) { - if ( !isdefined( self.pers[dataname] ) ) - self.pers[dataname] = 0; - - if ( !isdefined( record_stats ) || record_stats == 1 ) - recordplayerstats( self, dataname, int( self.pers[dataname] ) ); - - if ( isdefined( init_to_stat_value ) && init_to_stat_value == 1 ) - self.pers[dataname] = self getdstat( "PlayerStatsList", dataname, "StatValue" ); + if ( !isDefined( self.pers[ dataname ] ) ) + { + self.pers[ dataname ] = 0; + } + if ( !isDefined( record_stats ) || record_stats == 1 ) + { + recordplayerstats( self, dataname, int( self.pers[ dataname ] ) ); + } + if ( isDefined( init_to_stat_value ) && init_to_stat_value == 1 ) + { + self.pers[ dataname ] = self getdstat( "PlayerStatsList", dataname, "StatValue" ); + } } getpersstat( dataname ) { - return self.pers[dataname]; + return self.pers[ dataname ]; } incpersstat( dataname, increment, record_stats, includegametype ) { - pixbeginevent( "incPersStat" ); - self.pers[dataname] += increment; - - if ( isdefined( includegametype ) && includegametype ) - self addplayerstatwithgametype( dataname, increment ); - else - self addplayerstat( dataname, increment ); - - if ( !isdefined( record_stats ) || record_stats == 1 ) - self thread threadedrecordplayerstats( dataname ); - - pixendevent(); + pixbeginevent( "incPersStat" ); + self.pers[ dataname ] += increment; + if ( isDefined( includegametype ) && includegametype ) + { + self addplayerstatwithgametype( dataname, increment ); + } + else + { + self addplayerstat( dataname, increment ); + } + if ( !isDefined( record_stats ) || record_stats == 1 ) + { + self thread threadedrecordplayerstats( dataname ); + } + pixendevent(); } threadedrecordplayerstats( dataname ) { - self endon( "disconnect" ); - waittillframeend; - recordplayerstats( self, dataname, self.pers[dataname] ); + self endon( "disconnect" ); + waittillframeend; + recordplayerstats( self, dataname, self.pers[ dataname ] ); } updatewinstats( winner ) { - } updatelossstats( loser ) { - loser addplayerstatwithgametype( "losses", 1 ); - loser updatestatratio( "wlratio", "wins", "losses" ); - loser notify( "loss" ); + loser addplayerstatwithgametype( "losses", 1 ); + loser updatestatratio( "wlratio", "wins", "losses" ); + loser notify( "loss" ); } updatetiestats( loser ) { - loser addplayerstatwithgametype( "losses", -1 ); - loser addplayerstatwithgametype( "ties", 1 ); - loser updatestatratio( "wlratio", "wins", "losses" ); - loser setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); - loser notify( "tie" ); + loser addplayerstatwithgametype( "losses", -1 ); + loser addplayerstatwithgametype( "ties", 1 ); + loser updatestatratio( "wlratio", "wins", "losses" ); + loser setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); + loser notify( "tie" ); } updatewinlossstats( winner ) { - if ( !waslastround() && !level.hostforcedend ) - return; - - players = level.players; - - if ( !isdefined( winner ) || isdefined( winner ) && !isplayer( winner ) && winner == "tie" ) - { - for ( i = 0; i < players.size; i++ ) - { - if ( !isdefined( players[i].pers["team"] ) ) - continue; - - if ( level.hostforcedend && players[i] ishost() ) - continue; - - updatetiestats( players[i] ); - } - } - else if ( isplayer( winner ) ) - { - if ( level.hostforcedend && winner ishost() ) - return; - - updatewinstats( winner ); - } - else - { - for ( i = 0; i < players.size; i++ ) - { - if ( !isdefined( players[i].pers["team"] ) ) - continue; - - if ( level.hostforcedend && players[i] ishost() ) - continue; - - if ( winner == "tie" ) - { - updatetiestats( players[i] ); - continue; - } - - if ( players[i].pers["team"] == winner ) - { - updatewinstats( players[i] ); - continue; - } - - players[i] setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); - } - } + if ( !waslastround() && !level.hostforcedend ) + { + return; + } + players = level.players; + if ( !isDefined( winner ) || isDefined( winner ) && !isplayer( winner ) && winner == "tie" ) + { + i = 0; + while ( i < players.size ) + { + if ( !isDefined( players[ i ].pers[ "team" ] ) ) + { + i++; + continue; + } + else if ( level.hostforcedend && players[ i ] ishost() ) + { + i++; + continue; + } + else + { + updatetiestats( players[ i ] ); + } + i++; + } + } + else if ( isplayer( winner ) ) + { + if ( level.hostforcedend && winner ishost() ) + { + return; + } + updatewinstats( winner ); + } + else + { + i = 0; + while ( i < players.size ) + { + if ( !isDefined( players[ i ].pers[ "team" ] ) ) + { + i++; + continue; + } + else if ( level.hostforcedend && players[ i ] ishost() ) + { + i++; + continue; + } + else + { + if ( winner == "tie" ) + { + updatetiestats( players[ i ] ); + i++; + continue; + } + else if ( players[ i ].pers[ "team" ] == winner ) + { + updatewinstats( players[ i ] ); + i++; + continue; + } + else + { + players[ i ] setdstat( "playerstatslist", "cur_win_streak", "StatValue", 0 ); + } + } + i++; + } + } } backupandclearwinstreaks() { - } restorewinstreaks( winner ) { - } inckillstreaktracker( sweapon ) { - self endon( "disconnect" ); - waittillframeend; - - if ( sweapon == "artillery_mp" ) - self.pers["artillery_kills"]++; - - if ( sweapon == "dog_bite_mp" ) - self.pers["dog_kills"]++; + self endon( "disconnect" ); + waittillframeend; + if ( sweapon == "artillery_mp" ) + { + self.pers[ "artillery_kills" ]++; + } + if ( sweapon == "dog_bite_mp" ) + { + self.pers[ "dog_kills" ]++; + } } trackattackerkill( name, rank, xp, prestige, xuid ) { - self endon( "disconnect" ); - attacker = self; - waittillframeend; - pixbeginevent( "trackAttackerKill" ); - - if ( !isdefined( attacker.pers["killed_players"][name] ) ) - attacker.pers["killed_players"][name] = 0; - - if ( !isdefined( attacker.killedplayerscurrent[name] ) ) - attacker.killedplayerscurrent[name] = 0; - - if ( !isdefined( attacker.pers["nemesis_tracking"][name] ) ) - attacker.pers["nemesis_tracking"][name] = 0; - - attacker.pers["killed_players"][name]++; - attacker.killedplayerscurrent[name]++; - attacker.pers["nemesis_tracking"][name] += 1.0; - - if ( attacker.pers["nemesis_name"] == name ) - attacker maps\mp\_challenges::killednemesis(); - - if ( attacker.pers["nemesis_name"] == "" || attacker.pers["nemesis_tracking"][name] > attacker.pers["nemesis_tracking"][attacker.pers["nemesis_name"]] ) - { - attacker.pers["nemesis_name"] = name; - attacker.pers["nemesis_rank"] = rank; - attacker.pers["nemesis_rankIcon"] = prestige; - attacker.pers["nemesis_xp"] = xp; - attacker.pers["nemesis_xuid"] = xuid; - } - else if ( isdefined( attacker.pers["nemesis_name"] ) && attacker.pers["nemesis_name"] == name ) - { - attacker.pers["nemesis_rank"] = rank; - attacker.pers["nemesis_xp"] = xp; - } - - pixendevent(); + self endon( "disconnect" ); + attacker = self; + waittillframeend; + pixbeginevent( "trackAttackerKill" ); + if ( !isDefined( attacker.pers[ "killed_players" ][ name ] ) ) + { + attacker.pers[ "killed_players" ][ name ] = 0; + } + if ( !isDefined( attacker.killedplayerscurrent[ name ] ) ) + { + attacker.killedplayerscurrent[ name ] = 0; + } + if ( !isDefined( attacker.pers[ "nemesis_tracking" ][ name ] ) ) + { + attacker.pers[ "nemesis_tracking" ][ name ] = 0; + } + attacker.pers[ "killed_players" ][ name ]++; + attacker.killedplayerscurrent[ name ]++; + attacker.pers[ "nemesis_tracking" ][ name ] += 1; + if ( attacker.pers[ "nemesis_name" ] == name ) + { + attacker maps/mp/_challenges::killednemesis(); + } + if ( attacker.pers[ "nemesis_name" ] == "" || attacker.pers[ "nemesis_tracking" ][ name ] > attacker.pers[ "nemesis_tracking" ][ attacker.pers[ "nemesis_name" ] ] ) + { + attacker.pers[ "nemesis_name" ] = name; + attacker.pers[ "nemesis_rank" ] = rank; + attacker.pers[ "nemesis_rankIcon" ] = prestige; + attacker.pers[ "nemesis_xp" ] = xp; + attacker.pers[ "nemesis_xuid" ] = xuid; + } + else + { + if ( isDefined( attacker.pers[ "nemesis_name" ] ) && attacker.pers[ "nemesis_name" ] == name ) + { + attacker.pers[ "nemesis_rank" ] = rank; + attacker.pers[ "nemesis_xp" ] = xp; + } + } + pixendevent(); } trackattackeedeath( attackername, rank, xp, prestige, xuid ) { - self endon( "disconnect" ); - waittillframeend; - pixbeginevent( "trackAttackeeDeath" ); - - if ( !isdefined( self.pers["killed_by"][attackername] ) ) - self.pers["killed_by"][attackername] = 0; - - self.pers["killed_by"][attackername]++; - - if ( !isdefined( self.pers["nemesis_tracking"][attackername] ) ) - self.pers["nemesis_tracking"][attackername] = 0; - - self.pers["nemesis_tracking"][attackername] += 1.5; - - if ( self.pers["nemesis_name"] == "" || self.pers["nemesis_tracking"][attackername] > self.pers["nemesis_tracking"][self.pers["nemesis_name"]] ) - { - self.pers["nemesis_name"] = attackername; - self.pers["nemesis_rank"] = rank; - self.pers["nemesis_rankIcon"] = prestige; - self.pers["nemesis_xp"] = xp; - self.pers["nemesis_xuid"] = xuid; - } - else if ( isdefined( self.pers["nemesis_name"] ) && self.pers["nemesis_name"] == attackername ) - { - self.pers["nemesis_rank"] = rank; - self.pers["nemesis_xp"] = xp; - } - - if ( self.pers["nemesis_name"] == attackername && self.pers["nemesis_tracking"][attackername] >= 2 ) - self setclientuivisibilityflag( "killcam_nemesis", 1 ); - else - self setclientuivisibilityflag( "killcam_nemesis", 0 ); - - pixendevent(); + self endon( "disconnect" ); + waittillframeend; + pixbeginevent( "trackAttackeeDeath" ); + if ( !isDefined( self.pers[ "killed_by" ][ attackername ] ) ) + { + self.pers[ "killed_by" ][ attackername ] = 0; + } + self.pers[ "killed_by" ][ attackername ]++; + if ( !isDefined( self.pers[ "nemesis_tracking" ][ attackername ] ) ) + { + self.pers[ "nemesis_tracking" ][ attackername ] = 0; + } + self.pers[ "nemesis_tracking" ][ attackername ] += 1,5; + if ( self.pers[ "nemesis_name" ] == "" || self.pers[ "nemesis_tracking" ][ attackername ] > self.pers[ "nemesis_tracking" ][ self.pers[ "nemesis_name" ] ] ) + { + self.pers[ "nemesis_name" ] = attackername; + self.pers[ "nemesis_rank" ] = rank; + self.pers[ "nemesis_rankIcon" ] = prestige; + self.pers[ "nemesis_xp" ] = xp; + self.pers[ "nemesis_xuid" ] = xuid; + } + else + { + if ( isDefined( self.pers[ "nemesis_name" ] ) && self.pers[ "nemesis_name" ] == attackername ) + { + self.pers[ "nemesis_rank" ] = rank; + self.pers[ "nemesis_xp" ] = xp; + } + } + if ( self.pers[ "nemesis_name" ] == attackername && self.pers[ "nemesis_tracking" ][ attackername ] >= 2 ) + { + self setclientuivisibilityflag( "killcam_nemesis", 1 ); + } + else + { + self setclientuivisibilityflag( "killcam_nemesis", 0 ); + } + pixendevent(); } default_iskillboosting() { - return 0; + return 0; } givekillstats( smeansofdeath, sweapon, evictim ) { - self endon( "disconnect" ); - waittillframeend; - - if ( level.rankedmatch && self [[ level.iskillboosting ]]() ) - { + self endon( "disconnect" ); + waittillframeend; + if ( level.rankedmatch && self [[ level.iskillboosting ]]() ) + { /# - self iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" ); + self iprintlnbold( "GAMETYPE DEBUG: NOT GIVING YOU OFFENSIVE CREDIT AS BOOSTING PREVENTION" ); #/ - return; - } - - pixbeginevent( "giveKillStats" ); - self maps\mp\gametypes_zm\_globallogic_score::incpersstat( "kills", 1, 1, 1 ); - self.kills = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "kills" ); - self updatestatratio( "kdratio", "kills", "deaths" ); - attacker = self; - - if ( smeansofdeath == "MOD_HEAD_SHOT" ) - { - attacker thread incpersstat( "headshots", 1, 1, 0 ); - attacker.headshots = attacker.pers["headshots"]; - evictim recordkillmodifier( "headshot" ); - } - - pixendevent(); + return; + } + pixbeginevent( "giveKillStats" ); + self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "kills", 1, 1, 1 ); + self.kills = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "kills" ); + self updatestatratio( "kdratio", "kills", "deaths" ); + attacker = self; + if ( smeansofdeath == "MOD_HEAD_SHOT" ) + { + attacker thread incpersstat( "headshots", 1, 1, 0 ); + attacker.headshots = attacker.pers[ "headshots" ]; + evictim recordkillmodifier( "headshot" ); + } + pixendevent(); } inctotalkills( team ) { - if ( level.teambased && isdefined( level.teams[team] ) ) - game["totalKillsTeam"][team]++; - - game["totalKills"]++; + if ( level.teambased && isDefined( level.teams[ team ] ) ) + { + game[ "totalKillsTeam" ][ team ]++; + } + game[ "totalKills" ]++; } setinflictorstat( einflictor, eattacker, sweapon ) { - if ( !isdefined( eattacker ) ) - return; - - if ( !isdefined( einflictor ) ) - { - eattacker addweaponstat( sweapon, "hits", 1 ); - return; - } - - if ( !isdefined( einflictor.playeraffectedarray ) ) - einflictor.playeraffectedarray = []; - - foundnewplayer = 1; - - for ( i = 0; i < einflictor.playeraffectedarray.size; i++ ) - { - if ( einflictor.playeraffectedarray[i] == self ) - { - foundnewplayer = 0; - break; - } - } - - if ( foundnewplayer ) - { - einflictor.playeraffectedarray[einflictor.playeraffectedarray.size] = self; - - if ( sweapon == "concussion_grenade_mp" || sweapon == "tabun_gas_mp" ) - eattacker addweaponstat( sweapon, "used", 1 ); - - eattacker addweaponstat( sweapon, "hits", 1 ); - } + if ( !isDefined( eattacker ) ) + { + return; + } + if ( !isDefined( einflictor ) ) + { + eattacker addweaponstat( sweapon, "hits", 1 ); + return; + } + if ( !isDefined( einflictor.playeraffectedarray ) ) + { + einflictor.playeraffectedarray = []; + } + foundnewplayer = 1; + i = 0; + while ( i < einflictor.playeraffectedarray.size ) + { + if ( einflictor.playeraffectedarray[ i ] == self ) + { + foundnewplayer = 0; + break; + } + else + { + i++; + } + } + if ( foundnewplayer ) + { + einflictor.playeraffectedarray[ einflictor.playeraffectedarray.size ] = self; + if ( sweapon == "concussion_grenade_mp" || sweapon == "tabun_gas_mp" ) + { + eattacker addweaponstat( sweapon, "used", 1 ); + } + eattacker addweaponstat( sweapon, "hits", 1 ); + } } processshieldassist( killedplayer ) { - self endon( "disconnect" ); - killedplayer endon( "disconnect" ); - wait 0.05; - maps\mp\gametypes_zm\_globallogic_utils::waittillslowprocessallowed(); - - if ( !isdefined( level.teams[self.pers["team"]] ) ) - return; - - if ( self.pers["team"] == killedplayer.pers["team"] ) - return; - - if ( !level.teambased ) - return; - - self maps\mp\gametypes_zm\_globallogic_score::incpersstat( "assists", 1, 1, 1 ); - self.assists = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "assists" ); + self endon( "disconnect" ); + killedplayer endon( "disconnect" ); + wait 0,05; + maps/mp/gametypes_zm/_globallogic_utils::waittillslowprocessallowed(); + if ( !isDefined( level.teams[ self.pers[ "team" ] ] ) ) + { + return; + } + if ( self.pers[ "team" ] == killedplayer.pers[ "team" ] ) + { + return; + } + if ( !level.teambased ) + { + return; + } + self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "assists", 1, 1, 1 ); + self.assists = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "assists" ); } processassist( killedplayer, damagedone, weapon ) { - self endon( "disconnect" ); - killedplayer endon( "disconnect" ); - wait 0.05; - maps\mp\gametypes_zm\_globallogic_utils::waittillslowprocessallowed(); - - if ( !isdefined( level.teams[self.pers["team"]] ) ) - return; - - if ( self.pers["team"] == killedplayer.pers["team"] ) - return; - - if ( !level.teambased ) - return; - - assist_level = "assist"; - assist_level_value = int( ceil( damagedone / 25 ) ); - - if ( assist_level_value < 1 ) - assist_level_value = 1; - else if ( assist_level_value > 3 ) - assist_level_value = 3; - - assist_level = assist_level + "_" + assist_level_value * 25; - self maps\mp\gametypes_zm\_globallogic_score::incpersstat( "assists", 1, 1, 1 ); - self.assists = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "assists" ); - - switch ( weapon ) - { - case "concussion_grenade_mp": - assist_level = "assist_concussion"; - break; - case "flash_grenade_mp": - assist_level = "assist_flash"; - break; - case "emp_grenade_mp": - assist_level = "assist_emp"; - break; - case "proximity_grenade_mp": - case "proximity_grenade_aoe_mp": - assist_level = "assist_proximity"; - break; - } - - self maps\mp\_challenges::assisted(); + self endon( "disconnect" ); + killedplayer endon( "disconnect" ); + wait 0,05; + maps/mp/gametypes_zm/_globallogic_utils::waittillslowprocessallowed(); + if ( !isDefined( level.teams[ self.pers[ "team" ] ] ) ) + { + return; + } + if ( self.pers[ "team" ] == killedplayer.pers[ "team" ] ) + { + return; + } + if ( !level.teambased ) + { + return; + } + assist_level = "assist"; + assist_level_value = int( ceil( damagedone / 25 ) ); + if ( assist_level_value < 1 ) + { + assist_level_value = 1; + } + else + { + if ( assist_level_value > 3 ) + { + assist_level_value = 3; + } + } + assist_level = ( assist_level + "_" ) + ( assist_level_value * 25 ); + self maps/mp/gametypes_zm/_globallogic_score::incpersstat( "assists", 1, 1, 1 ); + self.assists = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "assists" ); + switch( weapon ) + { + case "concussion_grenade_mp": + assist_level = "assist_concussion"; + break; + case "flash_grenade_mp": + assist_level = "assist_flash"; + break; + case "emp_grenade_mp": + assist_level = "assist_emp"; + break; + case "proximity_grenade_aoe_mp": + case "proximity_grenade_mp": + assist_level = "assist_proximity"; + break; + } + self maps/mp/_challenges::assisted(); } xpratethread() { /# - #/ } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_spawn.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_spawn.gsc index f3a43b6..d429a9d 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_spawn.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_spawn.gsc @@ -1,885 +1,951 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_globallogic_player; -#include maps\mp\gametypes_zm\_spawning; -#include maps\mp\gametypes_zm\_globallogic_audio; -#include maps\mp\gametypes_zm\_globallogic_utils; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\gametypes_zm\_hud_message; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\gametypes_zm\_globallogic_ui; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\gametypes_zm\_spectating; -#include maps\mp\gametypes_zm\_hostmigration; -#include maps\mp\gametypes_zm\_globallogic_defaults; -#include maps\mp\gametypes_zm\_spawnlogic; +#include maps/mp/gametypes_zm/_spawnlogic; +#include maps/mp/gametypes_zm/_globallogic_defaults; +#include maps/mp/gametypes_zm/_hostmigration; +#include maps/mp/gametypes_zm/_spectating; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/gametypes_zm/_globallogic_ui; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/gametypes_zm/_globallogic; +#include maps/mp/gametypes_zm/_globallogic_utils; +#include maps/mp/gametypes_zm/_globallogic_audio; +#include maps/mp/gametypes_zm/_spawning; +#include maps/mp/gametypes_zm/_globallogic_player; +#include maps/mp/_utility; +#include common_scripts/utility; -timeuntilspawn( includeteamkilldelay ) +timeuntilspawn( includeteamkilldelay ) //checked matches cerberus output { - if ( level.ingraceperiod && !self.hasspawned ) - return 0; - - respawndelay = 0; - - if ( self.hasspawned ) - { - result = self [[ level.onrespawndelay ]](); - - if ( isdefined( result ) ) - respawndelay = result; - else - respawndelay = level.playerrespawndelay; - - if ( includeteamkilldelay && ( isdefined( self.teamkillpunish ) && self.teamkillpunish ) ) - respawndelay += maps\mp\gametypes_zm\_globallogic_player::teamkilldelay(); - } - - wavebased = level.waverespawndelay > 0; - - if ( wavebased ) - return self timeuntilwavespawn( respawndelay ); - - return respawndelay; + if ( level.ingraceperiod && !self.hasspawned ) + { + return 0; + } + respawndelay = 0; + if ( self.hasspawned ) + { + result = self [[ level.onrespawndelay ]](); + if ( isDefined( result ) ) + { + respawndelay = result; + } + else + { + respawndelay = level.playerrespawndelay; + } + if ( includeteamkilldelay && isDefined( self.teamkillpunish ) && self.teamkillpunish ) + { + respawndelay += maps/mp/gametypes_zm/_globallogic_player::teamkilldelay(); + } + } + wavebased = level.waverespawndelay > 0; + if ( wavebased ) + { + return self timeuntilwavespawn( respawndelay ); + } + return respawndelay; } -allteamshaveexisted() +allteamshaveexisted() //checked changed to match cerberus output { - foreach ( team in level.teams ) - { - if ( !level.everexisted[team] ) - return false; - } - - return true; + foreach ( team in level.teams ) + { + if ( !level.everexisted[ team ] ) + { + return 0; + } + } + return 1; } -mayspawn() +mayspawn() //checked partially changed to match cerberus output changed at own discretion { - if ( isdefined( level.mayspawn ) && !self [[ level.mayspawn ]]() ) - return false; - - if ( level.inovertime ) - return false; - - if ( level.playerqueuedrespawn && !isdefined( self.allowqueuespawn ) && !level.ingraceperiod && !level.usestartspawns ) - return false; - - if ( level.numlives ) - { - if ( level.teambased ) - gamehasstarted = allteamshaveexisted(); - else - gamehasstarted = level.maxplayercount > 1 || !isoneround() && !isfirstround(); - - if ( !self.pers["lives"] && gamehasstarted ) - return false; - else if ( gamehasstarted ) - { - if ( !level.ingraceperiod && !self.hasspawned && !level.wagermatch ) - return false; - } - } - - return true; + if ( isDefined( level.mayspawn ) && !( self [[ level.mayspawn ]]() ) ) + { + return 0; + } + if ( level.inovertime ) + { + return 0; + } + if ( level.playerqueuedrespawn && !isDefined( self.allowqueuespawn ) && !level.ingraceperiod && !level.usestartspawns ) + { + return 0; + } + if ( level.numlives ) + { + if ( level.teambased ) + { + gamehasstarted = allteamshaveexisted(); + } + else + { + gamehasstarted = level.maxplayercount > 1; + if ( gamehasstarted == 0 ) + { + if ( !isoneround() && !isfirstround() ) + { + gamehasstarted = 1; + } + else + { + gamehasstarted = 0; + } + } + } + if ( !self.pers[ "lives" ] && gamehasstarted ) + { + return 0; + } + else if ( gamehasstarted ) + { + if ( !level.ingraceperiod && !self.hasspawned && !level.wagermatch ) + { + return 0; + } + } + } + return 1; } -timeuntilwavespawn( minimumwait ) +timeuntilwavespawn( minimumwait ) //checked matches cerberus output { - earliestspawntime = gettime() + minimumwait * 1000; - lastwavetime = level.lastwave[self.pers["team"]]; - wavedelay = level.wavedelay[self.pers["team"]] * 1000; - - if ( wavedelay == 0 ) - return 0; - - numwavespassedearliestspawntime = ( earliestspawntime - lastwavetime ) / wavedelay; - numwaves = ceil( numwavespassedearliestspawntime ); - timeofspawn = lastwavetime + numwaves * wavedelay; - - if ( isdefined( self.wavespawnindex ) ) - timeofspawn += 50 * self.wavespawnindex; - - return ( timeofspawn - gettime() ) / 1000; + earliestspawntime = getTime() + ( minimumwait * 1000 ); + lastwavetime = level.lastwave[ self.pers[ "team" ] ]; + wavedelay = level.wavedelay[ self.pers[ "team" ] ] * 1000; + if ( wavedelay == 0 ) + { + return 0; + } + numwavespassedearliestspawntime = ( earliestspawntime - lastwavetime ) / wavedelay; + numwaves = ceil( numwavespassedearliestspawntime ); + timeofspawn = lastwavetime + ( numwaves * wavedelay ); + if ( isDefined( self.wavespawnindex ) ) + { + timeofspawn += 50 * self.wavespawnindex; + } + return ( timeofspawn - getTime() ) / 1000; } -stoppoisoningandflareonspawn() +stoppoisoningandflareonspawn() //checked matches cerberus output { - self endon( "disconnect" ); - self.inpoisonarea = 0; - self.inburnarea = 0; - self.inflarevisionarea = 0; - self.ingroundnapalm = 0; + self endon( "disconnect" ); + self.inpoisonarea = 0; + self.inburnarea = 0; + self.inflarevisionarea = 0; + self.ingroundnapalm = 0; } -spawnplayerprediction() +spawnplayerprediction() //checked changed to match cerberus output dvar taken from beta dump { - self endon( "disconnect" ); - self endon( "end_respawn" ); - self endon( "game_ended" ); - self endon( "joined_spectators" ); - self endon( "spawned" ); - - while ( true ) - { - wait 0.5; - - if ( isdefined( level.onspawnplayerunified ) && getdvarint( _hash_CF6EEB8B ) == 0 ) - maps\mp\gametypes_zm\_spawning::onspawnplayer_unified( 1 ); - else - self [[ level.onspawnplayer ]]( 1 ); - } + self endon( "disconnect" ); + self endon( "end_respawn" ); + self endon( "game_ended" ); + self endon( "joined_spectators" ); + self endon( "spawned" ); + while ( 1 ) + { + wait 0.5; + if ( isDefined( level.onspawnplayerunified ) && getDvarInt( "scr_disableunifiedspawning" ) == 0 ) + { + maps/mp/gametypes_zm/_spawning::onspawnplayer_unified( 1 ); + } + else + { + self [[ level.onspawnplayer ]]( 1 ); + } + } } -giveloadoutlevelspecific( team, class ) +giveloadoutlevelspecific( team, class ) //checked matches cerberus output { - pixbeginevent( "giveLoadoutLevelSpecific" ); - - if ( isdefined( level.givecustomcharacters ) ) - self [[ level.givecustomcharacters ]](); - - if ( isdefined( level.givecustomloadout ) ) - self [[ level.givecustomloadout ]](); - - pixendevent(); + pixbeginevent( "giveLoadoutLevelSpecific" ); + if ( isDefined( level.givecustomcharacters ) ) + { + self [[ level.givecustomcharacters ]](); + } + if ( isDefined( level.givecustomloadout ) ) + { + self [[ level.givecustomloadout ]](); + } + pixendevent(); } -spawnplayer() +spawnplayer() //checked matches cerberus output dvars taken from beta dump { - pixbeginevent( "spawnPlayer_preUTS" ); - self endon( "disconnect" ); - self endon( "joined_spectators" ); - self notify( "spawned" ); - level notify( "player_spawned" ); - self notify( "end_respawn" ); - self setspawnvariables(); - - if ( !self.hasspawned ) - { - self.underscorechance = 70; - self thread maps\mp\gametypes_zm\_globallogic_audio::sndstartmusicsystem(); - } - - if ( level.teambased ) - self.sessionteam = self.team; - else - { - self.sessionteam = "none"; - self.ffateam = self.team; - } - - hadspawned = self.hasspawned; - self.sessionstate = "playing"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.statusicon = ""; - self.damagedplayers = []; - - if ( getdvarint( "scr_csmode" ) > 0 ) - self.maxhealth = getdvarint( "scr_csmode" ); - else - self.maxhealth = level.playermaxhealth; - - self.health = self.maxhealth; - self.friendlydamage = undefined; - self.hasspawned = 1; - self.spawntime = gettime(); - self.afk = 0; - - if ( self.pers["lives"] && ( !isdefined( level.takelivesondeath ) || level.takelivesondeath == 0 ) ) - { - self.pers["lives"]--; - - if ( self.pers["lives"] == 0 ) - { - level notify( "player_eliminated" ); - self notify( "player_eliminated" ); - } - } - - self.laststand = undefined; - self.revivingteammate = 0; - self.burning = undefined; - self.nextkillstreakfree = undefined; - self.activeuavs = 0; - self.activecounteruavs = 0; - self.activesatellites = 0; - self.deathmachinekills = 0; - self.disabledweapon = 0; - self resetusability(); - self maps\mp\gametypes_zm\_globallogic_player::resetattackerlist(); - self.diedonvehicle = undefined; - - if ( !self.wasaliveatmatchstart ) - { - if ( level.ingraceperiod || maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() < 20000 ) - self.wasaliveatmatchstart = 1; - } - - self setdepthoffield( 0, 0, 512, 512, 4, 0 ); - self resetfov(); - pixbeginevent( "onSpawnPlayer" ); - - if ( isdefined( level.onspawnplayerunified ) && getdvarint( _hash_CF6EEB8B ) == 0 ) - self [[ level.onspawnplayerunified ]](); - else - self [[ level.onspawnplayer ]]( 0 ); - - if ( isdefined( level.playerspawnedcb ) ) - self [[ level.playerspawnedcb ]](); - - pixendevent(); - pixendevent(); - level thread maps\mp\gametypes_zm\_globallogic::updateteamstatus(); - pixbeginevent( "spawnPlayer_postUTS" ); - self thread stoppoisoningandflareonspawn(); - self stopburning(); + pixbeginevent( "spawnPlayer_preUTS" ); + self endon( "disconnect" ); + self endon( "joined_spectators" ); + self notify( "spawned" ); + level notify( "player_spawned" ); + self notify( "end_respawn" ); + self setspawnvariables(); + if ( !self.hasspawned ) + { + self.underscorechance = 70; + self thread maps/mp/gametypes_zm/_globallogic_audio::sndstartmusicsystem(); + } + if ( level.teambased ) + { + self.sessionteam = self.team; + } + else + { + self.sessionteam = "none"; + self.ffateam = self.team; + } + hadspawned = self.hasspawned; + self.sessionstate = "playing"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.statusicon = ""; + self.damagedplayers = []; + if ( getDvarInt( "scr_csmode" ) > 0 ) + { + self.maxhealth = getDvarInt( "scr_csmode" ); + } + else + { + self.maxhealth = level.playermaxhealth; + } + self.health = self.maxhealth; + self.friendlydamage = undefined; + self.hasspawned = 1; + self.spawntime = getTime(); + self.afk = 0; + if ( self.pers[ "lives" ] && !isDefined( level.takelivesondeath ) || level.takelivesondeath == 0 ) + { + self.pers[ "lives" ]--; + if ( self.pers[ "lives" ] == 0 ) + { + level notify( "player_eliminated" ); + self notify( "player_eliminated" ); + } + } + self.laststand = undefined; + self.revivingteammate = 0; + self.burning = undefined; + self.nextkillstreakfree = undefined; + self.activeuavs = 0; + self.activecounteruavs = 0; + self.activesatellites = 0; + self.deathmachinekills = 0; + self.disabledweapon = 0; + self resetusability(); + self maps/mp/gametypes_zm/_globallogic_player::resetattackerlist(); + self.diedonvehicle = undefined; + if ( !self.wasaliveatmatchstart ) + { + if ( level.ingraceperiod || maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() < 20000 ) + { + self.wasaliveatmatchstart = 1; + } + } + self setdepthoffield( 0, 0, 512, 512, 4, 0 ); + self resetfov(); + pixbeginevent( "onSpawnPlayer" ); + if ( isDefined( level.onspawnplayerunified ) && getDvarInt( "scr_disableunifiedspawning" ) == 0 ) + { + self [[ level.onspawnplayerunified ]](); + } + else + { + self [[ level.onspawnplayer ]]( 0 ); + } + if ( isDefined( level.playerspawnedcb ) ) + { + self [[ level.playerspawnedcb ]](); + } + pixendevent(); + pixendevent(); + level thread maps/mp/gametypes_zm/_globallogic::updateteamstatus(); + pixbeginevent( "spawnPlayer_postUTS" ); + self thread stoppoisoningandflareonspawn(); + self stopburning(); + /* /# - assert( maps\mp\gametypes_zm\_globallogic_utils::isvalidclass( self.class ) ); + assert( maps/mp/gametypes_zm/_globallogic_utils::isvalidclass( self.class ) ); #/ - self giveloadoutlevelspecific( self.team, self.class ); - - if ( level.inprematchperiod ) - { - self freeze_player_controls( 1 ); - team = self.pers["team"]; - - if ( isdefined( self.pers["music"].spawn ) && self.pers["music"].spawn == 0 ) - { - if ( level.wagermatch ) - music = "SPAWN_WAGER"; - else - music = game["music"]["spawn_" + team]; - - self thread maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( music, 0, 0 ); - self.pers["music"].spawn = 1; - } - - if ( level.splitscreen ) - { - if ( isdefined( level.playedstartingmusic ) ) - music = undefined; - else - level.playedstartingmusic = 1; - } - - if ( !isdefined( level.disableprematchmessages ) || level.disableprematchmessages == 0 ) - { - thread maps\mp\gametypes_zm\_hud_message::showinitialfactionpopup( team ); - hintmessage = getobjectivehinttext( self.pers["team"] ); - - if ( isdefined( hintmessage ) ) - self thread maps\mp\gametypes_zm\_hud_message::hintmessage( hintmessage ); - - if ( isdefined( game["dialog"]["gametype"] ) && ( !level.splitscreen || self == level.players[0] ) ) - { - if ( !isdefined( level.infinalfight ) || !level.infinalfight ) - { - if ( level.hardcoremode ) - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "gametype_hardcore" ); - else - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "gametype" ); - } - } - - if ( team == game["attackers"] ) - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "offense_obj", "introboost" ); - else - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "defense_obj", "introboost" ); - } - } - else - { - self freeze_player_controls( 0 ); - self enableweapons(); - - if ( !hadspawned && game["state"] == "playing" ) - { - pixbeginevent( "sound" ); - team = self.team; - - if ( isdefined( self.pers["music"].spawn ) && self.pers["music"].spawn == 0 ) - { - self thread maps\mp\gametypes_zm\_globallogic_audio::set_music_on_player( "SPAWN_SHORT", 0, 0 ); - self.pers["music"].spawn = 1; - } - - if ( level.splitscreen ) - { - if ( isdefined( level.playedstartingmusic ) ) - music = undefined; - else - level.playedstartingmusic = 1; - } - - if ( !isdefined( level.disableprematchmessages ) || level.disableprematchmessages == 0 ) - { - thread maps\mp\gametypes_zm\_hud_message::showinitialfactionpopup( team ); - hintmessage = getobjectivehinttext( self.pers["team"] ); - - if ( isdefined( hintmessage ) ) - self thread maps\mp\gametypes_zm\_hud_message::hintmessage( hintmessage ); - - if ( isdefined( game["dialog"]["gametype"] ) && ( !level.splitscreen || self == level.players[0] ) ) - { - if ( !isdefined( level.infinalfight ) || !level.infinalfight ) - { - if ( level.hardcoremode ) - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "gametype_hardcore" ); - else - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "gametype" ); - } - } - - if ( team == game["attackers"] ) - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "offense_obj", "introboost" ); - else - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "defense_obj", "introboost" ); - } - - pixendevent(); - } - } - - if ( getdvar( "scr_showperksonspawn" ) == "" ) - setdvar( "scr_showperksonspawn", "0" ); - - if ( level.hardcoremode ) - setdvar( "scr_showperksonspawn", "0" ); - - if ( !level.splitscreen && getdvarint( "scr_showperksonspawn" ) == 1 && game["state"] != "postgame" ) - { - pixbeginevent( "showperksonspawn" ); - - if ( level.perksenabled == 1 ) - self maps\mp\gametypes_zm\_hud_util::showperks(); - - self thread maps\mp\gametypes_zm\_globallogic_ui::hideloadoutaftertime( 3.0 ); - self thread maps\mp\gametypes_zm\_globallogic_ui::hideloadoutondeath(); - pixendevent(); - } - - if ( isdefined( self.pers["momentum"] ) ) - self.momentum = self.pers["momentum"]; - - pixendevent(); - waittillframeend; - self notify( "spawned_player" ); - self logstring( "S " + self.origin[0] + " " + self.origin[1] + " " + self.origin[2] ); - setdvar( "scr_selecting_location", "" ); + */ + self giveloadoutlevelspecific( self.team, self.class ); + if ( level.inprematchperiod ) + { + self freeze_player_controls( 1 ); + team = self.pers[ "team" ]; + if ( isDefined( self.pers[ "music" ].spawn ) && self.pers[ "music" ].spawn == 0 ) + { + if ( level.wagermatch ) + { + music = "SPAWN_WAGER"; + } + else + { + music = game[ "music" ][ "spawn_" + team ]; + } + self thread maps/mp/gametypes_zm/_globallogic_audio::set_music_on_player( music, 0, 0 ); + self.pers[ "music" ].spawn = 1; + } + if ( level.splitscreen ) + { + if ( isDefined( level.playedstartingmusic ) ) + { + music = undefined; + } + else + { + level.playedstartingmusic = 1; + } + } + if ( !isDefined( level.disableprematchmessages ) || level.disableprematchmessages == 0 ) + { + thread maps/mp/gametypes_zm/_hud_message::showinitialfactionpopup( team ); + hintmessage = getobjectivehinttext( self.pers[ "team" ] ); + if ( isDefined( hintmessage ) ) + { + self thread maps/mp/gametypes_zm/_hud_message::hintmessage( hintmessage ); + } + if ( isDefined( game[ "dialog" ][ "gametype" ] ) && !level.splitscreen || self == level.players[ 0 ] ) + { + if ( !isDefined( level.infinalfight ) || !level.infinalfight ) + { + if ( level.hardcoremode ) + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "gametype_hardcore" ); + } + else + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "gametype" ); + } + } + } + if ( team == game[ "attackers" ] ) + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "offense_obj", "introboost" ); + } + else + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "defense_obj", "introboost" ); + } + } + } + else + { + self freeze_player_controls( 0 ); + self enableweapons(); + if ( !hadspawned && game[ "state" ] == "playing" ) + { + pixbeginevent( "sound" ); + team = self.team; + if ( isDefined( self.pers[ "music" ].spawn ) && self.pers[ "music" ].spawn == 0 ) + { + self thread maps/mp/gametypes_zm/_globallogic_audio::set_music_on_player( "SPAWN_SHORT", 0, 0 ); + self.pers[ "music" ].spawn = 1; + } + if ( level.splitscreen ) + { + if ( isDefined( level.playedstartingmusic ) ) + { + music = undefined; + } + else + { + level.playedstartingmusic = 1; + } + } + if ( !isDefined( level.disableprematchmessages ) || level.disableprematchmessages == 0 ) + { + thread maps/mp/gametypes_zm/_hud_message::showinitialfactionpopup( team ); + hintmessage = getobjectivehinttext( self.pers[ "team" ] ); + if ( isDefined( hintmessage ) ) + { + self thread maps/mp/gametypes_zm/_hud_message::hintmessage( hintmessage ); + } + if ( isDefined( game[ "dialog" ][ "gametype" ] ) || !level.splitscreen && self == level.players[ 0 ] ) + { + if ( !isDefined( level.infinalfight ) || !level.infinalfight ) + { + if ( level.hardcoremode ) + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "gametype_hardcore" ); + } + else + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "gametype" ); + } + } + } + if ( team == game[ "attackers" ] ) + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "offense_obj", "introboost" ); + } + else + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "defense_obj", "introboost" ); + } + } + pixendevent(); + } + } + if ( getDvar( "scr_showperksonspawn" ) == "" ) + { + setdvar( "scr_showperksonspawn", "0" ); + } + if ( level.hardcoremode ) + { + setdvar( "scr_showperksonspawn", "0" ); + } + if ( !level.splitscreen && getDvarInt( "scr_showperksonspawn" ) == 1 && game[ "state" ] != "postgame" ) + { + pixbeginevent( "showperksonspawn" ); + if ( level.perksenabled == 1 ) + { + self maps/mp/gametypes_zm/_hud_util::showperks(); + } + self thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutaftertime( 3 ); + self thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutondeath(); + pixendevent(); + } + if ( isDefined( self.pers[ "momentum" ] ) ) + { + self.momentum = self.pers[ "momentum" ]; + } + pixendevent(); + waittillframeend; + self notify( "spawned_player" ); + self logstring( "S " + self.origin[ 0 ] + " " + self.origin[ 1 ] + " " + self.origin[ 2 ] ); + setdvar( "scr_selecting_location", "" ); + /* /# - if ( getdvarint( _hash_F8D00F60 ) > 0 ) - self thread maps\mp\gametypes_zm\_globallogic_score::xpratethread(); + if ( getDvarInt( "scr_xprate" ) > 0 ) + { + self thread maps/mp/gametypes_zm/_globallogic_score::xpratethread(); #/ - self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); - - if ( game["state"] == "postgame" ) - { + } + */ + self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); + if ( game[ "state" ] == "postgame" ) + { + /* /# - assert( !level.intermission ); + assert( !level.intermission ); #/ - self maps\mp\gametypes_zm\_globallogic_player::freezeplayerforroundend(); - } + */ + self maps/mp/gametypes_zm/_globallogic_player::freezeplayerforroundend(); + } } -spawnspectator( origin, angles ) +spawnspectator( origin, angles ) //checked matches cerberus output { - self notify( "spawned" ); - self notify( "end_respawn" ); - in_spawnspectator( origin, angles ); + self notify( "spawned" ); + self notify( "end_respawn" ); + in_spawnspectator( origin, angles ); } -respawn_asspectator( origin, angles ) +respawn_asspectator( origin, angles ) //checked matches cerberus output { - in_spawnspectator( origin, angles ); + in_spawnspectator( origin, angles ); } -in_spawnspectator( origin, angles ) +in_spawnspectator( origin, angles ) //checked matches cerberus output { - pixmarker( "BEGIN: in_spawnSpectator" ); - self setspawnvariables(); - - if ( self.pers["team"] == "spectator" ) - self clearlowermessage(); - - self.sessionstate = "spectator"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.friendlydamage = undefined; - - if ( self.pers["team"] == "spectator" ) - self.statusicon = ""; - else - self.statusicon = "hud_status_dead"; - - maps\mp\gametypes_zm\_spectating::setspectatepermissionsformachine(); - [[ level.onspawnspectator ]]( origin, angles ); - - if ( level.teambased && !level.splitscreen ) - self thread spectatorthirdpersonness(); - - level thread maps\mp\gametypes_zm\_globallogic::updateteamstatus(); - pixmarker( "END: in_spawnSpectator" ); + pixmarker( "BEGIN: in_spawnSpectator" ); + self setspawnvariables(); + if ( self.pers[ "team" ] == "spectator" ) + { + self clearlowermessage(); + } + self.sessionstate = "spectator"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + if ( self.pers[ "team" ] == "spectator" ) + { + self.statusicon = ""; + } + else + { + self.statusicon = "hud_status_dead"; + } + maps/mp/gametypes_zm/_spectating::setspectatepermissionsformachine(); + [[ level.onspawnspectator ]]( origin, angles ); + if ( level.teambased && !level.splitscreen ) + { + self thread spectatorthirdpersonness(); + } + level thread maps/mp/gametypes_zm/_globallogic::updateteamstatus(); + pixmarker( "END: in_spawnSpectator" ); } -spectatorthirdpersonness() +spectatorthirdpersonness() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "spawned" ); - self notify( "spectator_thirdperson_thread" ); - self endon( "spectator_thirdperson_thread" ); - self.spectatingthirdperson = 0; + self endon( "disconnect" ); + self endon( "spawned" ); + self notify( "spectator_thirdperson_thread" ); + self endon( "spectator_thirdperson_thread" ); + self.spectatingthirdperson = 0; } -forcespawn( time ) +forcespawn( time ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "spawned" ); - - if ( !isdefined( time ) ) - time = 60; - - wait( time ); - - if ( self.hasspawned ) - return; - - if ( self.pers["team"] == "spectator" ) - return; - - if ( !maps\mp\gametypes_zm\_globallogic_utils::isvalidclass( self.pers["class"] ) ) - { - self.pers["class"] = "CLASS_CUSTOM1"; - self.class = self.pers["class"]; - } - - self maps\mp\gametypes_zm\_globallogic_ui::closemenus(); - self thread [[ level.spawnclient ]](); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "spawned" ); + if ( !isDefined( time ) ) + { + time = 60; + } + wait time; + if ( self.hasspawned ) + { + return; + } + if ( self.pers[ "team" ] == "spectator" ) + { + return; + } + if ( !maps/mp/gametypes_zm/_globallogic_utils::isvalidclass( self.pers[ "class" ] ) ) + { + self.pers[ "class" ] = "CLASS_CUSTOM1"; + self.class = self.pers[ "class" ]; + } + self maps/mp/gametypes_zm/_globallogic_ui::closemenus(); + self thread [[ level.spawnclient ]](); } -kickifdontspawn() +kickifdontspawn() //checked matches cerberus output { + /* /# - if ( getdvarint( "scr_hostmigrationtest" ) == 1 ) - return; + if ( getDvarInt( "scr_hostmigrationtest" ) == 1 ) + { + return; #/ - if ( self ishost() ) - return; - - self kickifidontspawninternal(); + } + */ + if ( self ishost() ) + { + return; + } + self kickifidontspawninternal(); } -kickifidontspawninternal() +kickifidontspawninternal() //checked matches cerberus output dvars taken from beta dump { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "spawned" ); - waittime = 90; - - if ( getdvar( _hash_4257CF5C ) != "" ) - waittime = getdvarfloat( _hash_4257CF5C ); - - mintime = 45; - - if ( getdvar( _hash_DF057E0 ) != "" ) - mintime = getdvarfloat( _hash_DF057E0 ); - - starttime = gettime(); - kickwait( waittime ); - timepassed = ( gettime() - starttime ) / 1000; - - if ( timepassed < waittime - 0.1 && timepassed < mintime ) - return; - - if ( self.hasspawned ) - return; - - if ( sessionmodeisprivate() ) - return; - - if ( self.pers["team"] == "spectator" ) - return; - - kick( self getentitynumber() ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "spawned" ); + waittime = 90; + if ( getDvar( "scr_kick_time" ) != "" ) + { + waittime = getDvarFloat( "scr_kick_time" ); + } + mintime = 45; + if ( getDvar( scr_kick_mintime) != "" ) + { + mintime = getDvarFloat( scr_kick_mintime); + } + starttime = getTime(); + kickwait( waittime ); + timepassed = ( getTime() - starttime ) / 1000; + if ( timepassed < ( waittime - 0.1 ) && timepassed < mintime ) + { + return; + } + if ( self.hasspawned ) + { + return; + } + if ( sessionmodeisprivate() ) + { + return; + } + if ( self.pers[ "team" ] == "spectator" ) + { + return; + } + kick( self getentitynumber() ); } -kickwait( waittime ) +kickwait( waittime ) //checked matches cerberus output { - level endon( "game_ended" ); - maps\mp\gametypes_zm\_hostmigration::waitlongdurationwithhostmigrationpause( waittime ); + level endon( "game_ended" ); + maps/mp/gametypes_zm/_hostmigration::waitlongdurationwithhostmigrationpause( waittime ); } -spawninterroundintermission() +spawninterroundintermission() //checked matches cerberus output { - self notify( "spawned" ); - self notify( "end_respawn" ); - self setspawnvariables(); - self clearlowermessage(); - self freeze_player_controls( 0 ); - self.sessionstate = "spectator"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.friendlydamage = undefined; - self maps\mp\gametypes_zm\_globallogic_defaults::default_onspawnintermission(); - self setorigin( self.origin ); - self setplayerangles( self.angles ); - self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); + self notify( "spawned" ); + self notify( "end_respawn" ); + self setspawnvariables(); + self clearlowermessage(); + self freeze_player_controls( 0 ); + self.sessionstate = "spectator"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + self maps/mp/gametypes_zm/_globallogic_defaults::default_onspawnintermission(); + self setorigin( self.origin ); + self setplayerangles( self.angles ); + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); } -spawnintermission( usedefaultcallback ) +spawnintermission( usedefaultcallback ) //checked changed to match cerberus output { - self notify( "spawned" ); - self notify( "end_respawn" ); - self endon( "disconnect" ); - self setspawnvariables(); - self clearlowermessage(); - self freeze_player_controls( 0 ); - - if ( level.rankedmatch && waslastround() ) - { - if ( self.postgamemilestones || self.postgamecontracts || self.postgamepromotion ) - { - if ( self.postgamepromotion ) - self playlocalsound( "mus_level_up" ); - else if ( self.postgamecontracts ) - self playlocalsound( "mus_challenge_complete" ); - else if ( self.postgamemilestones ) - self playlocalsound( "mus_contract_complete" ); - - self closeingamemenu(); - self openmenu( game["menu_endgameupdate"] ); - waittime = 4.0; - - while ( waittime ) - { - wait 0.25; - waittime -= 0.25; - self openmenu( game["menu_endgameupdate"] ); - } - - self closemenu(); - } - } - - self.sessionstate = "intermission"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.friendlydamage = undefined; - - if ( isdefined( usedefaultcallback ) && usedefaultcallback ) - maps\mp\gametypes_zm\_globallogic_defaults::default_onspawnintermission(); - else - [[ level.onspawnintermission ]](); - - self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); + self notify( "spawned" ); + self notify( "end_respawn" ); + self endon( "disconnect" ); + self setspawnvariables(); + self clearlowermessage(); + self freeze_player_controls( 0 ); + if ( level.rankedmatch && waslastround() ) + { + if ( self.postgamemilestones || self.postgamecontracts || self.postgamepromotion ) + { + if ( self.postgamepromotion ) + { + self playlocalsound( "mus_level_up" ); + } + else if ( self.postgamecontracts ) + { + self playlocalsound( "mus_challenge_complete" ); + } + else + { + if ( self.postgamemilestones ) + { + self playlocalsound( "mus_contract_complete" ); + } + } + self closeingamemenu(); + self openmenu( game[ "menu_endgameupdate" ] ); + waittime = 4; + while ( waittime ) + { + wait 0.25; + waittime -= 0.25; + self openmenu( game[ "menu_endgameupdate" ] ); + } + self closemenu(); + } + } + self.sessionstate = "intermission"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + if ( isDefined( usedefaultcallback ) && usedefaultcallback ) + { + maps/mp/gametypes_zm/_globallogic_defaults::default_onspawnintermission(); + } + else + { + [[ level.onspawnintermission ]](); + } + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); } -spawnqueuedclientonteam( team ) +spawnqueuedclientonteam( team ) //checked partially changed to match cerberus output see info.md { - player_to_spawn = undefined; - - for ( i = 0; i < level.deadplayers[team].size; i++ ) - { - player = level.deadplayers[team][i]; - - if ( player.waitingtospawn ) - continue; - - player_to_spawn = player; - break; - } - - if ( isdefined( player_to_spawn ) ) - { - player_to_spawn.allowqueuespawn = 1; - player_to_spawn maps\mp\gametypes_zm\_globallogic_ui::closemenus(); - player_to_spawn thread [[ level.spawnclient ]](); - } + player_to_spawn = undefined; + for ( i = 0; i < level.deadplayers[team].size; i++ ) + { + player = level.deadplayers[ team ][ i ]; + if ( player.waitingtospawn ) + { + } + else + { + player_to_spawn = player; + break; + } + } + if ( isDefined( player_to_spawn ) ) + { + player_to_spawn.allowqueuespawn = 1; + player_to_spawn maps/mp/gametypes_zm/_globallogic_ui::closemenus(); + player_to_spawn thread [[ level.spawnclient ]](); + } } -spawnqueuedclient( dead_player_team, killer ) +spawnqueuedclient( dead_player_team, killer ) //checked partially changed to match cerberus output see info.md { - if ( !level.playerqueuedrespawn ) - return; - - maps\mp\gametypes_zm\_globallogic_utils::waittillslowprocessallowed(); - spawn_team = undefined; - - if ( isdefined( killer ) && isdefined( killer.team ) && isdefined( level.teams[killer.team] ) ) - spawn_team = killer.team; - - if ( isdefined( spawn_team ) ) - { - spawnqueuedclientonteam( spawn_team ); - return; - } - - foreach ( team in level.teams ) - { - if ( team == dead_player_team ) - continue; - - spawnqueuedclientonteam( team ); - } + if ( !level.playerqueuedrespawn ) + { + return; + } + maps/mp/gametypes_zm/_globallogic_utils::waittillslowprocessallowed(); + spawn_team = undefined; + if ( isDefined( killer ) && isDefined( killer.team ) && isDefined( level.teams[ killer.team ] ) ) + { + spawn_team = killer.team; + } + if ( isDefined( spawn_team ) ) + { + spawnqueuedclientonteam( spawn_team ); + return; + } + foreach ( team in level.teams ) + { + if ( team == dead_player_team ) + { + } + else + { + spawnqueuedclientonteam( team ); + } + } } -allteamsnearscorelimit() +allteamsnearscorelimit() //checked changed to match cerberus output { - if ( !level.teambased ) - return false; - - if ( level.scorelimit <= 1 ) - return false; - - foreach ( team in level.teams ) - { - if ( !( game["teamScores"][team] >= level.scorelimit - 1 ) ) - return false; - } - - return true; + if ( !level.teambased ) + { + return 0; + } + if ( level.scorelimit <= 1 ) + { + return 0; + } + foreach ( team in level.teams ) + { + if ( !( game[ "teamScores" ][ team ] >= ( level.scoreLimit - 1 ) ) ) + { + return 0; + } + } + return 1; } -shouldshowrespawnmessage() +shouldshowrespawnmessage() //checked matches cerberus output { - if ( waslastround() ) - return false; - - if ( isoneround() ) - return false; - - if ( isdefined( level.livesdonotreset ) && level.livesdonotreset ) - return false; - - if ( allteamsnearscorelimit() ) - return false; - - return true; + if ( waslastround() ) + { + return 0; + } + if ( isoneround() ) + { + return 0; + } + if ( isDefined( level.livesdonotreset ) && level.livesdonotreset ) + { + return 0; + } + if ( allteamsnearscorelimit() ) + { + return 0; + } + return 1; } -default_spawnmessage() +default_spawnmessage() //checked matches cerberus output { - setlowermessage( game["strings"]["spawn_next_round"] ); - self thread maps\mp\gametypes_zm\_globallogic_ui::removespawnmessageshortly( 3 ); + setlowermessage( game[ "strings" ][ "spawn_next_round" ] ); + self thread maps/mp/gametypes_zm/_globallogic_ui::removespawnmessageshortly( 3 ); } -showspawnmessage() +showspawnmessage() //checked matches cerberus output { - if ( shouldshowrespawnmessage() ) - self thread [[ level.spawnmessage ]](); + if ( shouldshowrespawnmessage() ) + { + self thread [[ level.spawnmessage ]](); + } } -spawnclient( timealreadypassed ) +spawnclient( timealreadypassed ) //checked matches cerberus output { - pixbeginevent( "spawnClient" ); + pixbeginevent( "spawnClient" ); + /* /# - assert( isdefined( self.team ) ); + assert( isDefined( self.team ) ); #/ /# - assert( maps\mp\gametypes_zm\_globallogic_utils::isvalidclass( self.class ) ); + assert( maps/mp/gametypes_zm/_globallogic_utils::isvalidclass( self.class ) ); #/ - if ( !self mayspawn() ) - { - currentorigin = self.origin; - currentangles = self.angles; - self showspawnmessage(); - self thread [[ level.spawnspectator ]]( currentorigin + vectorscale( ( 0, 0, 1 ), 60.0 ), currentangles ); - pixendevent(); - return; - } - - if ( self.waitingtospawn ) - { - pixendevent(); - return; - } - - self.waitingtospawn = 1; - self.allowqueuespawn = undefined; - self waitandspawnclient( timealreadypassed ); - - if ( isdefined( self ) ) - self.waitingtospawn = 0; - - pixendevent(); + */ + if ( !self mayspawn() ) + { + currentorigin = self.origin; + currentangles = self.angles; + self showspawnmessage(); + self thread [[ level.spawnspectator ]]( currentorigin + vectorScale( ( 0, 0, 1 ), 60 ), currentangles ); + pixendevent(); + return; + } + if ( self.waitingtospawn ) + { + pixendevent(); + return; + } + self.waitingtospawn = 1; + self.allowqueuespawn = undefined; + self waitandspawnclient( timealreadypassed ); + if ( isDefined( self ) ) + { + self.waitingtospawn = 0; + } + pixendevent(); } -waitandspawnclient( timealreadypassed ) +waitandspawnclient( timealreadypassed ) //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "end_respawn" ); - level endon( "game_ended" ); - - if ( !isdefined( timealreadypassed ) ) - timealreadypassed = 0; - - spawnedasspectator = 0; - - if ( isdefined( self.teamkillpunish ) && self.teamkillpunish ) - { - teamkilldelay = maps\mp\gametypes_zm\_globallogic_player::teamkilldelay(); - - if ( teamkilldelay > timealreadypassed ) - { - teamkilldelay -= timealreadypassed; - timealreadypassed = 0; - } - else - { - timealreadypassed -= teamkilldelay; - teamkilldelay = 0; - } - - if ( teamkilldelay > 0 ) - { - setlowermessage( &"MP_FRIENDLY_FIRE_WILL_NOT", teamkilldelay ); - self thread respawn_asspectator( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), self.angles ); - spawnedasspectator = 1; - wait( teamkilldelay ); - } - - self.teamkillpunish = 0; - } - - if ( !isdefined( self.wavespawnindex ) && isdefined( level.waveplayerspawnindex[self.team] ) ) - { - self.wavespawnindex = level.waveplayerspawnindex[self.team]; - level.waveplayerspawnindex[self.team]++; - } - - timeuntilspawn = timeuntilspawn( 0 ); - - if ( timeuntilspawn > timealreadypassed ) - { - timeuntilspawn -= timealreadypassed; - timealreadypassed = 0; - } - else - { - timealreadypassed -= timeuntilspawn; - timeuntilspawn = 0; - } - - if ( timeuntilspawn > 0 ) - { - if ( level.playerqueuedrespawn ) - setlowermessage( game["strings"]["you_will_spawn"], timeuntilspawn ); - else if ( self issplitscreen() ) - setlowermessage( game["strings"]["waiting_to_spawn_ss"], timeuntilspawn, 1 ); - else - setlowermessage( game["strings"]["waiting_to_spawn"], timeuntilspawn ); - - if ( !spawnedasspectator ) - { - spawnorigin = self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ); - spawnangles = self.angles; - - if ( isdefined( level.useintermissionpointsonwavespawn ) && [[ level.useintermissionpointsonwavespawn ]]() == 1 ) - { - spawnpoint = maps\mp\gametypes_zm\_spawnlogic::getrandomintermissionpoint(); - - if ( isdefined( spawnpoint ) ) - { - spawnorigin = spawnpoint.origin; - spawnangles = spawnpoint.angles; - } - } - - self thread respawn_asspectator( spawnorigin, spawnangles ); - } - - spawnedasspectator = 1; - self maps\mp\gametypes_zm\_globallogic_utils::waitfortimeornotify( timeuntilspawn, "force_spawn" ); - self notify( "stop_wait_safe_spawn_button" ); - } - - wavebased = level.waverespawndelay > 0; - - if ( !level.playerforcerespawn && self.hasspawned && !wavebased && !self.wantsafespawn && !level.playerqueuedrespawn ) - { - setlowermessage( game["strings"]["press_to_spawn"] ); - - if ( !spawnedasspectator ) - self thread respawn_asspectator( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), self.angles ); - - spawnedasspectator = 1; - self waitrespawnorsafespawnbutton(); - } - - self.waitingtospawn = 0; - self clearlowermessage(); - self.wavespawnindex = undefined; - self.respawntimerstarttime = undefined; - self thread [[ level.spawnplayer ]](); + self endon( "disconnect" ); + self endon( "end_respawn" ); + level endon( "game_ended" ); + if ( !isDefined( timealreadypassed ) ) + { + timealreadypassed = 0; + } + spawnedasspectator = 0; + if ( isDefined( self.teamkillpunish ) && self.teamkillpunish ) + { + teamkilldelay = maps/mp/gametypes_zm/_globallogic_player::teamkilldelay(); + if ( teamkilldelay > timealreadypassed ) + { + teamkilldelay -= timealreadypassed; + timealreadypassed = 0; + } + else + { + timealreadypassed -= teamkilldelay; + teamkilldelay = 0; + } + if ( teamkilldelay > 0 ) + { + setlowermessage( &"MP_FRIENDLY_FIRE_WILL_NOT", teamkilldelay ); + self thread respawn_asspectator( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), self.angles ); + spawnedasspectator = 1; + wait teamkilldelay; + } + self.teamkillpunish = 0; + } + if ( !isDefined( self.wavespawnindex ) && isDefined( level.waveplayerspawnindex[ self.team ] ) ) + { + self.wavespawnindex = level.waveplayerspawnindex[ self.team ]; + level.waveplayerspawnindex[ self.team ]++; + } + timeuntilspawn = timeuntilspawn( 0 ); + if ( timeuntilspawn > timealreadypassed ) + { + timeuntilspawn -= timealreadypassed; + timealreadypassed = 0; + } + else + { + timealreadypassed -= timeuntilspawn; + timeuntilspawn = 0; + } + if ( timeuntilspawn > 0 ) + { + if ( level.playerqueuedrespawn ) + { + setlowermessage( game[ "strings" ][ "you_will_spawn" ], timeuntilspawn ); + } + else if ( self issplitscreen() ) + { + setlowermessage( game[ "strings" ][ "waiting_to_spawn_ss" ], timeuntilspawn, 1 ); + } + else + { + setlowermessage( game[ "strings" ][ "waiting_to_spawn" ], timeuntilspawn ); + } + if ( !spawnedasspectator ) + { + spawnorigin = self.origin + vectorScale( ( 0, 0, 1 ), 60 ); + spawnangles = self.angles; + if ( isDefined( level.useintermissionpointsonwavespawn ) && [[ level.useintermissionpointsonwavespawn ]]() == 1 ) + { + spawnpoint = maps/mp/gametypes_zm/_spawnlogic::getrandomintermissionpoint(); + if ( isDefined( spawnpoint ) ) + { + spawnorigin = spawnpoint.origin; + spawnangles = spawnpoint.angles; + } + } + self thread respawn_asspectator( spawnorigin, spawnangles ); + } + spawnedasspectator = 1; + self maps/mp/gametypes_zm/_globallogic_utils::waitfortimeornotify( timeuntilspawn, "force_spawn" ); + self notify( "stop_wait_safe_spawn_button" ); + } + wavebased = level.waverespawndelay > 0; + if ( !level.playerforcerespawn && self.hasspawned && !wavebased && !self.wantsafespawn && !level.playerqueuedrespawn ) + { + setlowermessage( game[ "strings" ][ "press_to_spawn" ] ); + if ( !spawnedasspectator ) + { + self thread respawn_asspectator( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), self.angles ); + } + spawnedasspectator = 1; + self waitrespawnorsafespawnbutton(); + } + self.waitingtospawn = 0; + self clearlowermessage(); + self.wavespawnindex = undefined; + self.respawntimerstarttime = undefined; + self thread [[ level.spawnplayer ]](); } -waitrespawnorsafespawnbutton() +waitrespawnorsafespawnbutton() //checked changed to match cerberus output { - self endon( "disconnect" ); - self endon( "end_respawn" ); - - while ( true ) - { - if ( self usebuttonpressed() ) - break; - - wait 0.05; - } + self endon( "disconnect" ); + self endon( "end_respawn" ); + while ( 1 ) + { + if ( self usebuttonpressed() ) + { + return; + } + wait 0.05; + } } -waitinspawnqueue() +waitinspawnqueue() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "end_respawn" ); - - if ( !level.ingraceperiod && !level.usestartspawns ) - { - currentorigin = self.origin; - currentangles = self.angles; - self thread [[ level.spawnspectator ]]( currentorigin + vectorscale( ( 0, 0, 1 ), 60.0 ), currentangles ); - - self waittill( "queue_respawn" ); - } + self endon( "disconnect" ); + self endon( "end_respawn" ); + if ( !level.ingraceperiod && !level.usestartspawns ) + { + currentorigin = self.origin; + currentangles = self.angles; + self thread [[ level.spawnspectator ]]( currentorigin + vectorScale( ( 0, 0, 1 ), 60 ), currentangles ); + self waittill( "queue_respawn" ); + } } -setthirdperson( value ) +setthirdperson( value ) //checked matches cerberus output { - if ( !level.console ) - return; - - if ( !isdefined( self.spectatingthirdperson ) || value != self.spectatingthirdperson ) - { - self.spectatingthirdperson = value; - - if ( value ) - { - self setclientthirdperson( 1 ); - self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); - } - else - { - self setclientthirdperson( 0 ); - self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); - } - - self resetfov(); - } + if ( !level.console ) + { + return; + } + if ( !isDefined( self.spectatingthirdperson ) || value != self.spectatingthirdperson ) + { + self.spectatingthirdperson = value; + if ( value ) + { + self setclientthirdperson( 1 ); + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); + } + else + { + self setclientthirdperson( 0 ); + self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); + } + self resetfov(); + } } -setspawnvariables() +setspawnvariables() //checked matches cerberus output { - resettimeout(); - self stopshellshock(); - self stoprumble( "damage_heavy" ); + resettimeout(); + self stopshellshock(); + self stoprumble( "damage_heavy" ); } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_ui.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_ui.gsc index 868e1c3..00d91fe 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_ui.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_ui.gsc @@ -1,494 +1,544 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\gametypes_zm\_spectating; -#include maps\mp\gametypes_zm\_globallogic_player; +#include maps/mp/gametypes_zm/_globallogic_player; +#include maps/mp/gametypes_zm/_spectating; +#include maps/mp/gametypes_zm/_globallogic; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/_utility; init() { - precachestring( &"MP_HALFTIME" ); - precachestring( &"MP_OVERTIME" ); - precachestring( &"MP_ROUNDEND" ); - precachestring( &"MP_INTERMISSION" ); - precachestring( &"MP_SWITCHING_SIDES_CAPS" ); - precachestring( &"MP_FRIENDLY_FIRE_WILL_NOT" ); - precachestring( &"MP_RAMPAGE" ); - precachestring( &"medal_received" ); - precachestring( &"killstreak_received" ); - precachestring( &"prox_grenade_notify" ); - precachestring( &"player_callout" ); - precachestring( &"score_event" ); - precachestring( &"rank_up" ); - precachestring( &"gun_level_complete" ); - precachestring( &"challenge_complete" ); - - if ( sessionmodeiszombiesgame() ) - precachestring( &"hud_update_survival_team" ); - - if ( level.splitscreen ) - precachestring( &"MP_ENDED_GAME" ); - else - precachestring( &"MP_HOST_ENDED_GAME" ); + precachestring( &"MP_HALFTIME" ); + precachestring( &"MP_OVERTIME" ); + precachestring( &"MP_ROUNDEND" ); + precachestring( &"MP_INTERMISSION" ); + precachestring( &"MP_SWITCHING_SIDES_CAPS" ); + precachestring( &"MP_FRIENDLY_FIRE_WILL_NOT" ); + precachestring( &"MP_RAMPAGE" ); + precachestring( &"medal_received" ); + precachestring( &"killstreak_received" ); + precachestring( &"prox_grenade_notify" ); + precachestring( &"player_callout" ); + precachestring( &"score_event" ); + precachestring( &"rank_up" ); + precachestring( &"gun_level_complete" ); + precachestring( &"challenge_complete" ); + if ( sessionmodeiszombiesgame() ) + { + precachestring( &"hud_update_survival_team" ); + } + if ( level.splitscreen ) + { + precachestring( &"MP_ENDED_GAME" ); + } + else + { + precachestring( &"MP_HOST_ENDED_GAME" ); + } } setupcallbacks() { - level.autoassign = ::menuautoassign; - level.spectator = ::menuspectator; - level.class = ::menuclass; - level.teammenu = ::menuteam; + level.autoassign = ::menuautoassign; + level.spectator = ::menuspectator; + level.class = ::menuclass; + level.teammenu = ::menuteam; } hideloadoutaftertime( delay ) { - self endon( "disconnect" ); - self endon( "perks_hidden" ); - wait( delay ); - self thread hideallperks( 0.4 ); - self notify( "perks_hidden" ); + self endon( "disconnect" ); + self endon( "perks_hidden" ); + wait delay; + self thread hideallperks( 0,4 ); + self notify( "perks_hidden" ); } hideloadoutondeath() { - self endon( "disconnect" ); - self endon( "perks_hidden" ); - - self waittill( "death" ); - - self hideallperks(); - self notify( "perks_hidden" ); + self endon( "disconnect" ); + self endon( "perks_hidden" ); + self waittill( "death" ); + self hideallperks(); + self notify( "perks_hidden" ); } hideloadoutonkill() { - self endon( "disconnect" ); - self endon( "death" ); - self endon( "perks_hidden" ); - - self waittill( "killed_player" ); - - self hideallperks(); - self notify( "perks_hidden" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "perks_hidden" ); + self waittill( "killed_player" ); + self hideallperks(); + self notify( "perks_hidden" ); } freegameplayhudelems() { - if ( isdefined( self.perkicon ) ) - { - for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) - { - if ( isdefined( self.perkicon[numspecialties] ) ) - { - self.perkicon[numspecialties] destroyelem(); - self.perkname[numspecialties] destroyelem(); - } - } - } - - if ( isdefined( self.perkhudelem ) ) - self.perkhudelem destroyelem(); - - if ( isdefined( self.killstreakicon ) ) - { - if ( isdefined( self.killstreakicon[0] ) ) - self.killstreakicon[0] destroyelem(); - - if ( isdefined( self.killstreakicon[1] ) ) - self.killstreakicon[1] destroyelem(); - - if ( isdefined( self.killstreakicon[2] ) ) - self.killstreakicon[2] destroyelem(); - - if ( isdefined( self.killstreakicon[3] ) ) - self.killstreakicon[3] destroyelem(); - - if ( isdefined( self.killstreakicon[4] ) ) - self.killstreakicon[4] destroyelem(); - } - - self notify( "perks_hidden" ); - - if ( isdefined( self.lowermessage ) ) - self.lowermessage destroyelem(); - - if ( isdefined( self.lowertimer ) ) - self.lowertimer destroyelem(); - - if ( isdefined( self.proxbar ) ) - self.proxbar destroyelem(); - - if ( isdefined( self.proxbartext ) ) - self.proxbartext destroyelem(); - - if ( isdefined( self.carryicon ) ) - self.carryicon destroyelem(); + while ( isDefined( self.perkicon ) ) + { + numspecialties = 0; + while ( numspecialties < level.maxspecialties ) + { + if ( isDefined( self.perkicon[ numspecialties ] ) ) + { + self.perkicon[ numspecialties ] destroyelem(); + self.perkname[ numspecialties ] destroyelem(); + } + numspecialties++; + } + } + if ( isDefined( self.perkhudelem ) ) + { + self.perkhudelem destroyelem(); + } + if ( isDefined( self.killstreakicon ) ) + { + if ( isDefined( self.killstreakicon[ 0 ] ) ) + { + self.killstreakicon[ 0 ] destroyelem(); + } + if ( isDefined( self.killstreakicon[ 1 ] ) ) + { + self.killstreakicon[ 1 ] destroyelem(); + } + if ( isDefined( self.killstreakicon[ 2 ] ) ) + { + self.killstreakicon[ 2 ] destroyelem(); + } + if ( isDefined( self.killstreakicon[ 3 ] ) ) + { + self.killstreakicon[ 3 ] destroyelem(); + } + if ( isDefined( self.killstreakicon[ 4 ] ) ) + { + self.killstreakicon[ 4 ] destroyelem(); + } + } + self notify( "perks_hidden" ); + if ( isDefined( self.lowermessage ) ) + { + self.lowermessage destroyelem(); + } + if ( isDefined( self.lowertimer ) ) + { + self.lowertimer destroyelem(); + } + if ( isDefined( self.proxbar ) ) + { + self.proxbar destroyelem(); + } + if ( isDefined( self.proxbartext ) ) + { + self.proxbartext destroyelem(); + } + if ( isDefined( self.carryicon ) ) + { + self.carryicon destroyelem(); + } } teamplayercountsequal( playercounts ) { - count = undefined; - - foreach ( team in level.teams ) - { - if ( !isdefined( count ) ) - { - count = playercounts[team]; - continue; - } - - if ( count != playercounts[team] ) - return false; - } - - return true; + count = undefined; + _a150 = level.teams; + _k150 = getFirstArrayKey( _a150 ); + while ( isDefined( _k150 ) ) + { + team = _a150[ _k150 ]; + if ( !isDefined( count ) ) + { + count = playercounts[ team ]; + } + else + { + if ( count != playercounts[ team ] ) + { + return 0; + } + } + _k150 = getNextArrayKey( _a150, _k150 ); + } + return 1; } teamwithlowestplayercount( playercounts, ignore_team ) { - count = 9999; - lowest_team = undefined; - - foreach ( team in level.teams ) - { - if ( count > playercounts[team] ) - { - count = playercounts[team]; - lowest_team = team; - } - } - - return lowest_team; + count = 9999; + lowest_team = undefined; + _a169 = level.teams; + _k169 = getFirstArrayKey( _a169 ); + while ( isDefined( _k169 ) ) + { + team = _a169[ _k169 ]; + if ( count > playercounts[ team ] ) + { + count = playercounts[ team ]; + lowest_team = team; + } + _k169 = getNextArrayKey( _a169, _k169 ); + } + return lowest_team; } menuautoassign( comingfrommenu ) { - teamkeys = getarraykeys( level.teams ); - assignment = teamkeys[randomint( teamkeys.size )]; - self closemenus(); - - if ( isdefined( level.forceallallies ) && level.forceallallies ) - assignment = "allies"; - else if ( level.teambased ) - { - if ( getdvarint( "party_autoteams" ) == 1 ) - { - if ( level.allow_teamchange == "1" && ( self.hasspawned || comingfrommenu ) ) - assignment = ""; - else - { - team = getassignedteam( self ); - - switch ( team ) - { - case "1": - assignment = teamkeys[1]; - break; - case "2": - assignment = teamkeys[0]; - break; - case "3": - assignment = teamkeys[2]; - break; - case "4": - if ( !isdefined( level.forceautoassign ) || !level.forceautoassign ) - { - self setclientscriptmainmenu( game["menu_class"] ); - return; - } - default: - assignment = ""; - - if ( isdefined( level.teams[team] ) ) - assignment = team; - else if ( team == "spectator" && !level.forceautoassign ) - { - self setclientscriptmainmenu( game["menu_class"] ); - return; - } - } - } - } - - if ( assignment == "" || getdvarint( "party_autoteams" ) == 0 ) - { - if ( sessionmodeiszombiesgame() ) - assignment = "allies"; - } - - if ( assignment == self.pers["team"] && ( self.sessionstate == "playing" || self.sessionstate == "dead" ) ) - { - self beginclasschoice(); - return; - } - } - else if ( getdvarint( "party_autoteams" ) == 1 ) - { - if ( level.allow_teamchange != "1" || !self.hasspawned && !comingfrommenu ) - { - team = getassignedteam( self ); - - if ( isdefined( level.teams[team] ) ) - assignment = team; - else if ( team == "spectator" && !level.forceautoassign ) - { - self setclientscriptmainmenu( game["menu_class"] ); - return; - } - } - } - - if ( assignment != self.pers["team"] && ( self.sessionstate == "playing" || self.sessionstate == "dead" ) ) - { - self.switching_teams = 1; - self.joining_team = assignment; - self.leaving_team = self.pers["team"]; - self suicide(); - } - - self.pers["team"] = assignment; - self.team = assignment; - self.pers["class"] = undefined; - self.class = undefined; - self.pers["weapon"] = undefined; - self.pers["savedmodel"] = undefined; - self updateobjectivetext(); - - if ( level.teambased ) - self.sessionteam = assignment; - else - { - self.sessionteam = "none"; - self.ffateam = assignment; - } - - if ( !isalive( self ) ) - self.statusicon = "hud_status_dead"; - - self notify( "joined_team" ); - level notify( "joined_team" ); - self notify( "end_respawn" ); - self beginclasschoice(); - self setclientscriptmainmenu( game["menu_class"] ); + teamkeys = getarraykeys( level.teams ); + assignment = teamkeys[ randomint( teamkeys.size ) ]; + self closemenus(); + if ( isDefined( level.forceallallies ) && level.forceallallies ) + { + assignment = "allies"; + } + else + { + if ( level.teambased ) + { + if ( getDvarInt( "party_autoteams" ) == 1 ) + { + if ( level.allow_teamchange == "1" || self.hasspawned && comingfrommenu ) + { + assignment = ""; + break; + } + else + { + team = getassignedteam( self ); + switch( team ) + { + case 1: + assignment = teamkeys[ 1 ]; + break; + case 2: + assignment = teamkeys[ 0 ]; + break; + case 3: + assignment = teamkeys[ 2 ]; + break; + case 4: + if ( !isDefined( level.forceautoassign ) || !level.forceautoassign ) + { + self setclientscriptmainmenu( game[ "menu_class" ] ); + return; + } + default: + assignment = ""; + if ( isDefined( level.teams[ team ] ) ) + { + assignment = team; + } + else + { + if ( team == "spectator" && !level.forceautoassign ) + { + self setclientscriptmainmenu( game[ "menu_class" ] ); + return; + } + } + } + } + } + if ( assignment == "" || getDvarInt( "party_autoteams" ) == 0 ) + { + if ( sessionmodeiszombiesgame() ) + { + assignment = "allies"; + } + } + if ( assignment == self.pers[ "team" ] || self.sessionstate == "playing" && self.sessionstate == "dead" ) + { + self beginclasschoice(); + return; + } + } + else if ( getDvarInt( "party_autoteams" ) == 1 ) + { + if ( level.allow_teamchange != "1" || !self.hasspawned && !comingfrommenu ) + { + team = getassignedteam( self ); + if ( isDefined( level.teams[ team ] ) ) + { + assignment = team; + } + else + { + if ( team == "spectator" && !level.forceautoassign ) + { + self setclientscriptmainmenu( game[ "menu_class" ] ); + return; + } + } + } + } + } + if ( assignment != self.pers[ "team" ] || self.sessionstate == "playing" && self.sessionstate == "dead" ) + { + self.switching_teams = 1; + self.joining_team = assignment; + self.leaving_team = self.pers[ "team" ]; + self suicide(); + } + self.pers[ "team" ] = assignment; + self.team = assignment; + self.class = undefined; + self updateobjectivetext(); + if ( level.teambased ) + { + self.sessionteam = assignment; + } + else + { + self.sessionteam = "none"; + self.ffateam = assignment; + } + if ( !isalive( self ) ) + { + self.statusicon = "hud_status_dead"; + } + self notify( "joined_team" ); + level notify( "joined_team" ); + self notify( "end_respawn" ); + self beginclasschoice(); + self setclientscriptmainmenu( game[ "menu_class" ] ); } teamscoresequal() { - score = undefined; - - foreach ( team in level.teams ) - { - if ( !isdefined( score ) ) - { - score = getteamscore( team ); - continue; - } - - if ( score != getteamscore( team ) ) - return false; - } - - return true; + score = undefined; + _a413 = level.teams; + _k413 = getFirstArrayKey( _a413 ); + while ( isDefined( _k413 ) ) + { + team = _a413[ _k413 ]; + if ( !isDefined( score ) ) + { + score = getteamscore( team ); + } + else + { + if ( score != getteamscore( team ) ) + { + return 0; + } + } + _k413 = getNextArrayKey( _a413, _k413 ); + } + return 1; } teamwithlowestscore() { - score = 99999999; - lowest_team = undefined; - - foreach ( team in level.teams ) - { - if ( score > getteamscore( team ) ) - lowest_team = team; - } - - return lowest_team; + score = 99999999; + lowest_team = undefined; + _a432 = level.teams; + _k432 = getFirstArrayKey( _a432 ); + while ( isDefined( _k432 ) ) + { + team = _a432[ _k432 ]; + if ( score > getteamscore( team ) ) + { + lowest_team = team; + } + _k432 = getNextArrayKey( _a432, _k432 ); + } + return lowest_team; } pickteamfromscores( teams ) { - assignment = "allies"; - - if ( teamscoresequal() ) - assignment = teams[randomint( teams.size )]; - else - assignment = teamwithlowestscore(); - - return assignment; + assignment = "allies"; + if ( teamscoresequal() ) + { + assignment = teams[ randomint( teams.size ) ]; + } + else + { + assignment = teamwithlowestscore(); + } + return assignment; } getsplitscreenteam() { - for ( index = 0; index < level.players.size; index++ ) - { - if ( !isdefined( level.players[index] ) ) - continue; - - if ( level.players[index] == self ) - continue; - - if ( !self isplayeronsamemachine( level.players[index] ) ) - continue; - - team = level.players[index].sessionteam; - - if ( team != "spectator" ) - return team; - } - - return ""; + index = 0; + while ( index < level.players.size ) + { + if ( !isDefined( level.players[ index ] ) ) + { + index++; + continue; + } + else if ( level.players[ index ] == self ) + { + index++; + continue; + } + else if ( !self isplayeronsamemachine( level.players[ index ] ) ) + { + index++; + continue; + } + else + { + team = level.players[ index ].sessionteam; + if ( team != "spectator" ) + { + return team; + } + } + index++; + } + return ""; } updateobjectivetext() { - if ( sessionmodeiszombiesgame() || self.pers["team"] == "spectator" ) - { - self setclientcgobjectivetext( "" ); - return; - } - - if ( level.scorelimit > 0 ) - self setclientcgobjectivetext( getobjectivescoretext( self.pers["team"] ) ); - else - self setclientcgobjectivetext( getobjectivetext( self.pers["team"] ) ); + if ( sessionmodeiszombiesgame() || self.pers[ "team" ] == "spectator" ) + { + self setclientcgobjectivetext( "" ); + return; + } + if ( level.scorelimit > 0 ) + { + self setclientcgobjectivetext( getobjectivescoretext( self.pers[ "team" ] ) ); + } + else + { + self setclientcgobjectivetext( getobjectivetext( self.pers[ "team" ] ) ); + } } closemenus() { - self closemenu(); - self closeingamemenu(); + self closemenu(); + self closeingamemenu(); } beginclasschoice( forcenewchoice ) { /# - assert( isdefined( level.teams[self.pers["team"]] ) ); + assert( isDefined( level.teams[ self.pers[ "team" ] ] ) ); #/ - team = self.pers["team"]; - - if ( level.disablecac == 1 ) - { - self.pers["class"] = level.defaultclass; - self.class = level.defaultclass; - - if ( self.sessionstate != "playing" && game["state"] == "playing" ) - self thread [[ level.spawnclient ]](); - - level thread maps\mp\gametypes_zm\_globallogic::updateteamstatus(); - self thread maps\mp\gametypes_zm\_spectating::setspectatepermissionsformachine(); - return; - } - - if ( level.wagermatch ) - self openmenu( game["menu_changeclass_wager"] ); - else if ( getdvarint( "barebones_class_mode" ) ) - self openmenu( game["menu_changeclass_barebones"] ); - else - self openmenu( game["menu_changeclass_" + team] ); + team = self.pers[ "team" ]; + if ( level.disablecac == 1 ) + { + self.pers[ "class" ] = level.defaultclass; + self.class = level.defaultclass; + if ( self.sessionstate != "playing" && game[ "state" ] == "playing" ) + { + self thread [[ level.spawnclient ]](); + } + level thread maps/mp/gametypes_zm/_globallogic::updateteamstatus(); + self thread maps/mp/gametypes_zm/_spectating::setspectatepermissionsformachine(); + return; + } + if ( level.wagermatch ) + { + self openmenu( game[ "menu_changeclass_wager" ] ); + } + else if ( getDvarInt( "barebones_class_mode" ) ) + { + self openmenu( game[ "menu_changeclass_barebones" ] ); + } + else + { + self openmenu( game[ "menu_changeclass_" + team ] ); + } } showmainmenuforteam() { /# - assert( isdefined( level.teams[self.pers["team"]] ) ); + assert( isDefined( level.teams[ self.pers[ "team" ] ] ) ); #/ - team = self.pers["team"]; - - if ( level.wagermatch ) - self openmenu( game["menu_changeclass_wager"] ); - else - self openmenu( game["menu_changeclass_" + team] ); + team = self.pers[ "team" ]; + if ( level.wagermatch ) + { + self openmenu( game[ "menu_changeclass_wager" ] ); + } + else + { + self openmenu( game[ "menu_changeclass_" + team ] ); + } } menuteam( team ) { - self closemenus(); - - if ( !level.console && level.allow_teamchange == "0" && ( isdefined( self.hasdonecombat ) && self.hasdonecombat ) ) - return; - - if ( self.pers["team"] != team ) - { - if ( level.ingraceperiod && ( !isdefined( self.hasdonecombat ) || !self.hasdonecombat ) ) - self.hasspawned = 0; - - if ( self.sessionstate == "playing" ) - { - self.switching_teams = 1; - self.joining_team = team; - self.leaving_team = self.pers["team"]; - self suicide(); - } - - self.pers["team"] = team; - self.team = team; - self.pers["class"] = undefined; - self.class = undefined; - self.pers["weapon"] = undefined; - self.pers["savedmodel"] = undefined; - self updateobjectivetext(); - - if ( level.teambased ) - self.sessionteam = team; - else - { - self.sessionteam = "none"; - self.ffateam = team; - } - - self setclientscriptmainmenu( game["menu_class"] ); - self notify( "joined_team" ); - level notify( "joined_team" ); - self notify( "end_respawn" ); - } - - self beginclasschoice(); + self closemenus(); + if ( !level.console && level.allow_teamchange == "0" && isDefined( self.hasdonecombat ) && self.hasdonecombat ) + { + return; + } + if ( self.pers[ "team" ] != team ) + { + if ( level.ingraceperiod || !isDefined( self.hasdonecombat ) && !self.hasdonecombat ) + { + self.hasspawned = 0; + } + if ( self.sessionstate == "playing" ) + { + self.switching_teams = 1; + self.joining_team = team; + self.leaving_team = self.pers[ "team" ]; + self suicide(); + } + self.pers[ "team" ] = team; + self.team = team; + self.class = undefined; + self updateobjectivetext(); + if ( level.teambased ) + { + self.sessionteam = team; + } + else + { + self.sessionteam = "none"; + self.ffateam = team; + } + self setclientscriptmainmenu( game[ "menu_class" ] ); + self notify( "joined_team" ); + level notify( "joined_team" ); + self notify( "end_respawn" ); + } + self beginclasschoice(); } menuspectator() { - self closemenus(); - - if ( self.pers["team"] != "spectator" ) - { - if ( isalive( self ) ) - { - self.switching_teams = 1; - self.joining_team = "spectator"; - self.leaving_team = self.pers["team"]; - self suicide(); - } - - self.pers["team"] = "spectator"; - self.team = "spectator"; - self.pers["class"] = undefined; - self.class = undefined; - self.pers["weapon"] = undefined; - self.pers["savedmodel"] = undefined; - self updateobjectivetext(); - self.sessionteam = "spectator"; - - if ( !level.teambased ) - self.ffateam = "spectator"; - - [[ level.spawnspectator ]](); - self thread maps\mp\gametypes_zm\_globallogic_player::spectate_player_watcher(); - self setclientscriptmainmenu( game["menu_class"] ); - self notify( "joined_spectators" ); - } + self closemenus(); + if ( self.pers[ "team" ] != "spectator" ) + { + if ( isalive( self ) ) + { + self.switching_teams = 1; + self.joining_team = "spectator"; + self.leaving_team = self.pers[ "team" ]; + self suicide(); + } + self.pers[ "team" ] = "spectator"; + self.team = "spectator"; + self.class = undefined; + self updateobjectivetext(); + self.sessionteam = "spectator"; + if ( !level.teambased ) + { + self.ffateam = "spectator"; + } + [[ level.spawnspectator ]](); + self thread maps/mp/gametypes_zm/_globallogic_player::spectate_player_watcher(); + self setclientscriptmainmenu( game[ "menu_class" ] ); + self notify( "joined_spectators" ); + } } menuclass( response ) { - self closemenus(); + self closemenus(); } removespawnmessageshortly( delay ) { - self endon( "disconnect" ); - waittillframeend; - self endon( "end_respawn" ); - wait( delay ); - self clearlowermessage( 2.0 ); + self endon( "disconnect" ); + waittillframeend; + self endon( "end_respawn" ); + wait delay; + self clearlowermessage( 2 ); } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_utils.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_utils.gsc index 0350113..4de74a7 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_utils.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_utils.gsc @@ -1,435 +1,478 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_hud_message; -#include maps\mp\gametypes_zm\_hostmigration; -#include maps\mp\gametypes_zm\_globallogic_score; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/gametypes_zm/_hostmigration; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/_utility; waittillslowprocessallowed() { - while ( level.lastslowprocessframe == gettime() ) - wait 0.05; - - level.lastslowprocessframe = gettime(); + while ( level.lastslowprocessframe == getTime() ) + { + wait 0,05; + } + level.lastslowprocessframe = getTime(); } testmenu() { - self endon( "death" ); - self endon( "disconnect" ); - - for (;;) - { - wait 10.0; - notifydata = spawnstruct(); - notifydata.titletext = &"MP_CHALLENGE_COMPLETED"; - notifydata.notifytext = "wheee"; - notifydata.sound = "mp_challenge_complete"; - self thread maps\mp\gametypes_zm\_hud_message::notifymessage( notifydata ); - } + self endon( "death" ); + self endon( "disconnect" ); + for ( ;; ) + { + wait 10; + notifydata = spawnstruct(); + notifydata.titletext = &"MP_CHALLENGE_COMPLETED"; + notifydata.notifytext = "wheee"; + notifydata.sound = "mp_challenge_complete"; + self thread maps/mp/gametypes_zm/_hud_message::notifymessage( notifydata ); + } } testshock() { - self endon( "death" ); - self endon( "disconnect" ); - - for (;;) - { - wait 3.0; - numshots = randomint( 6 ); - - for ( i = 0; i < numshots; i++ ) - { - iprintlnbold( numshots ); - self shellshock( "frag_grenade_mp", 0.2 ); - wait 0.1; - } - } + self endon( "death" ); + self endon( "disconnect" ); + for ( ;; ) + { + wait 3; + numshots = randomint( 6 ); + i = 0; + while ( i < numshots ) + { + iprintlnbold( numshots ); + self shellshock( "frag_grenade_mp", 0,2 ); + wait 0,1; + i++; + } + } } testhps() { - self endon( "death" ); - self endon( "disconnect" ); - hps = []; - hps[hps.size] = "radar_mp"; - hps[hps.size] = "artillery_mp"; - hps[hps.size] = "dogs_mp"; - - for (;;) - { - hp = "radar_mp"; - wait 20.0; - } + self endon( "death" ); + self endon( "disconnect" ); + hps = []; + hps[ hps.size ] = "radar_mp"; + hps[ hps.size ] = "artillery_mp"; + hps[ hps.size ] = "dogs_mp"; + for ( ;; ) + { + hp = "radar_mp"; + wait 20; + } } timeuntilroundend() { - if ( level.gameended ) - { - timepassed = ( gettime() - level.gameendtime ) / 1000; - timeremaining = level.postroundtime - timepassed; - - if ( timeremaining < 0 ) - return 0; - - return timeremaining; - } - - if ( level.inovertime ) - return undefined; - - if ( level.timelimit <= 0 ) - return undefined; - - if ( !isdefined( level.starttime ) ) - return undefined; - - timepassed = ( gettimepassed() - level.starttime ) / 1000; - timeremaining = level.timelimit * 60 - timepassed; - return timeremaining + level.postroundtime; + if ( level.gameended ) + { + timepassed = ( getTime() - level.gameendtime ) / 1000; + timeremaining = level.postroundtime - timepassed; + if ( timeremaining < 0 ) + { + return 0; + } + return timeremaining; + } + if ( level.inovertime ) + { + return undefined; + } + if ( level.timelimit <= 0 ) + { + return undefined; + } + if ( !isDefined( level.starttime ) ) + { + return undefined; + } + timepassed = ( gettimepassed() - level.starttime ) / 1000; + timeremaining = ( level.timelimit * 60 ) - timepassed; + return timeremaining + level.postroundtime; } gettimeremaining() { - return level.timelimit * 60 * 1000 - gettimepassed(); + return ( ( level.timelimit * 60 ) * 1000 ) - gettimepassed(); } registerpostroundevent( eventfunc ) { - if ( !isdefined( level.postroundevents ) ) - level.postroundevents = []; - - level.postroundevents[level.postroundevents.size] = eventfunc; + if ( !isDefined( level.postroundevents ) ) + { + level.postroundevents = []; + } + level.postroundevents[ level.postroundevents.size ] = eventfunc; } executepostroundevents() { - if ( !isdefined( level.postroundevents ) ) - return; - - for ( i = 0; i < level.postroundevents.size; i++ ) - [[ level.postroundevents[i] ]](); + if ( !isDefined( level.postroundevents ) ) + { + return; + } + i = 0; + while ( i < level.postroundevents.size ) + { + [[ level.postroundevents[ i ] ]](); + i++; + } } getvalueinrange( value, minvalue, maxvalue ) { - if ( value > maxvalue ) - return maxvalue; - else if ( value < minvalue ) - return minvalue; - else - return value; + if ( value > maxvalue ) + { + return maxvalue; + } + else + { + if ( value < minvalue ) + { + return minvalue; + } + else + { + return value; + } + } } assertproperplacement() { /# - numplayers = level.placement["all"].size; - - for ( i = 0; i < numplayers - 1; i++ ) - { - if ( isdefined( level.placement["all"][i] ) && isdefined( level.placement["all"][i + 1] ) ) - { - if ( level.placement["all"][i].score < level.placement["all"][i + 1].score ) - { - println( "^1Placement array:" ); - - for ( i = 0; i < numplayers; i++ ) - { - player = level.placement["all"][i]; - println( "^1" + i + ". " + player.name + ": " + player.score ); - } -/# - assertmsg( "Placement array was not properly sorted" ); -#/ - break; - } - } - } + numplayers = level.placement[ "all" ].size; + i = 0; + while ( i < ( numplayers - 1 ) ) + { + if ( isDefined( level.placement[ "all" ][ i ] ) && isDefined( level.placement[ "all" ][ i + 1 ] ) ) + { + if ( level.placement[ "all" ][ i ].score < level.placement[ "all" ][ i + 1 ].score ) + { + println( "^1Placement array:" ); + i = 0; + while ( i < numplayers ) + { + player = level.placement[ "all" ][ i ]; + println( "^1" + i + ". " + player.name + ": " + player.score ); + i++; + } + assertmsg( "Placement array was not properly sorted" ); + return; + } + } + else + { + i++; #/ + } + } } isvalidclass( class ) { - if ( level.oldschool || sessionmodeiszombiesgame() ) - { + if ( level.oldschool || sessionmodeiszombiesgame() ) + { /# - assert( !isdefined( class ) ); + assert( !isDefined( class ) ); #/ - return 1; - } - - return isdefined( class ) && class != ""; + return 1; + } + if ( isDefined( class ) ) + { + return class != ""; + } } playtickingsound( gametype_tick_sound ) { - self endon( "death" ); - self endon( "stop_ticking" ); - level endon( "game_ended" ); - time = level.bombtimer; - - while ( true ) - { - self playsound( gametype_tick_sound ); - - if ( time > 10 ) - { - time -= 1; - wait 1; - } - else if ( time > 4 ) - { - time -= 0.5; - wait 0.5; - } - else if ( time > 1 ) - { - time -= 0.4; - wait 0.4; - } - else - { - time -= 0.3; - wait 0.3; - } - - maps\mp\gametypes_zm\_hostmigration::waittillhostmigrationdone(); - } + self endon( "death" ); + self endon( "stop_ticking" ); + level endon( "game_ended" ); + time = level.bombtimer; + while ( 1 ) + { + self playsound( gametype_tick_sound ); + if ( time > 10 ) + { + time -= 1; + wait 1; + } + else if ( time > 4 ) + { + time -= 0,5; + wait 0,5; + } + else if ( time > 1 ) + { + time -= 0,4; + wait 0,4; + } + else + { + time -= 0,3; + wait 0,3; + } + maps/mp/gametypes_zm/_hostmigration::waittillhostmigrationdone(); + } } stoptickingsound() { - self notify( "stop_ticking" ); + self notify( "stop_ticking" ); } gametimer() { - level endon( "game_ended" ); - - level waittill( "prematch_over" ); - - level.starttime = gettime(); - level.discardtime = 0; - - if ( isdefined( game["roundMillisecondsAlreadyPassed"] ) ) - { - level.starttime -= game["roundMillisecondsAlreadyPassed"]; - game["roundMillisecondsAlreadyPassed"] = undefined; - } - - prevtime = gettime(); - - while ( game["state"] == "playing" ) - { - if ( !level.timerstopped ) - game["timepassed"] += gettime() - prevtime; - - prevtime = gettime(); - wait 1.0; - } + level endon( "game_ended" ); + level waittill( "prematch_over" ); + level.starttime = getTime(); + level.discardtime = 0; + if ( isDefined( game[ "roundMillisecondsAlreadyPassed" ] ) ) + { + level.starttime -= game[ "roundMillisecondsAlreadyPassed" ]; + } + prevtime = getTime(); + while ( game[ "state" ] == "playing" ) + { + if ( !level.timerstopped ) + { + game[ "timepassed" ] += getTime() - prevtime; + } + prevtime = getTime(); + wait 1; + } } gettimepassed() { - if ( !isdefined( level.starttime ) ) - return 0; - - if ( level.timerstopped ) - return level.timerpausetime - level.starttime - level.discardtime; - else - return gettime() - level.starttime - level.discardtime; + if ( !isDefined( level.starttime ) ) + { + return 0; + } + if ( level.timerstopped ) + { + return level.timerpausetime - level.starttime - level.discardtime; + } + else + { + return getTime() - level.starttime - level.discardtime; + } } pausetimer() { - if ( level.timerstopped ) - return; - - level.timerstopped = 1; - level.timerpausetime = gettime(); + if ( level.timerstopped ) + { + return; + } + level.timerstopped = 1; + level.timerpausetime = getTime(); } resumetimer() { - if ( !level.timerstopped ) - return; - - level.timerstopped = 0; - level.discardtime += gettime() - level.timerpausetime; + if ( !level.timerstopped ) + { + return; + } + level.timerstopped = 0; + level.discardtime += getTime() - level.timerpausetime; } getscoreremaining( team ) { /# - assert( isplayer( self ) || isdefined( team ) ); + if ( !isplayer( self ) ) + { + assert( isDefined( team ) ); + } #/ - scorelimit = level.scorelimit; - - if ( isplayer( self ) ) - return scorelimit - maps\mp\gametypes_zm\_globallogic_score::_getplayerscore( self ); - else - return scorelimit - getteamscore( team ); + scorelimit = level.scorelimit; + if ( isplayer( self ) ) + { + return scorelimit - maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( self ); + } + else + { + return scorelimit - getteamscore( team ); + } } getscoreperminute( team ) { /# - assert( isplayer( self ) || isdefined( team ) ); + if ( !isplayer( self ) ) + { + assert( isDefined( team ) ); + } #/ - scorelimit = level.scorelimit; - timelimit = level.timelimit; - minutespassed = gettimepassed() / 60000 + 0.0001; - - if ( isplayer( self ) ) - return maps\mp\gametypes_zm\_globallogic_score::_getplayerscore( self ) / minutespassed; - else - return getteamscore( team ) / minutespassed; + scorelimit = level.scorelimit; + timelimit = level.timelimit; + minutespassed = ( gettimepassed() / 60000 ) + 0,0001; + if ( isplayer( self ) ) + { + return maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( self ) / minutespassed; + } + else + { + return getteamscore( team ) / minutespassed; + } } getestimatedtimeuntilscorelimit( team ) { /# - assert( isplayer( self ) || isdefined( team ) ); + if ( !isplayer( self ) ) + { + assert( isDefined( team ) ); + } #/ - scoreperminute = self getscoreperminute( team ); - scoreremaining = self getscoreremaining( team ); - - if ( !scoreperminute ) - return 999999; - - return scoreremaining / scoreperminute; + scoreperminute = self getscoreperminute( team ); + scoreremaining = self getscoreremaining( team ); + if ( !scoreperminute ) + { + return 999999; + } + return scoreremaining / scoreperminute; } rumbler() { - self endon( "disconnect" ); - - while ( true ) - { - wait 0.1; - self playrumbleonentity( "damage_heavy" ); - } + self endon( "disconnect" ); + while ( 1 ) + { + wait 0,1; + self playrumbleonentity( "damage_heavy" ); + } } waitfortimeornotify( time, notifyname ) { - self endon( notifyname ); - wait( time ); + self endon( notifyname ); + wait time; } waitfortimeornotifynoartillery( time, notifyname ) { - self endon( notifyname ); - wait( time ); - - while ( isdefined( level.artilleryinprogress ) ) - { + self endon( notifyname ); + wait time; + while ( isDefined( level.artilleryinprogress ) ) + { /# - assert( level.artilleryinprogress ); + assert( level.artilleryinprogress ); #/ - wait 0.25; - } + wait 0,25; + } } isheadshot( sweapon, shitloc, smeansofdeath, einflictor ) { - if ( shitloc != "head" && shitloc != "helmet" ) - return false; - - switch ( smeansofdeath ) - { - case "MOD_MELEE": - case "MOD_BAYONET": - return false; - case "MOD_IMPACT": - if ( sweapon != "knife_ballistic_mp" ) - return false; - } - - return true; + if ( shitloc != "head" && shitloc != "helmet" ) + { + return 0; + } + switch( smeansofdeath ) + { + case "MOD_BAYONET": + case "MOD_MELEE": + return 0; + case "MOD_IMPACT": + if ( sweapon != "knife_ballistic_mp" ) + { + return 0; + } + } + return 1; } gethitlocheight( shitloc ) { - switch ( shitloc ) - { - case "neck": - case "helmet": - case "head": - return 60; - case "torso_upper": - case "right_hand": - case "right_arm_upper": - case "right_arm_lower": - case "left_hand": - case "left_arm_upper": - case "left_arm_lower": - case "gun": - return 48; - case "torso_lower": - return 40; - case "right_leg_upper": - case "left_leg_upper": - return 32; - case "right_leg_lower": - case "left_leg_lower": - return 10; - case "right_foot": - case "left_foot": - return 5; - } - - return 48; + switch( shitloc ) + { + case "head": + case "helmet": + case "neck": + return 60; + case "gun": + case "left_arm_lower": + case "left_arm_upper": + case "left_hand": + case "right_arm_lower": + case "right_arm_upper": + case "right_hand": + case "torso_upper": + return 48; + case "torso_lower": + return 40; + case "left_leg_upper": + case "right_leg_upper": + return 32; + case "left_leg_lower": + case "right_leg_lower": + return 10; + case "left_foot": + case "right_foot": + return 5; + } + return 48; } debugline( start, end ) { /# - for ( i = 0; i < 50; i++ ) - { - line( start, end ); - wait 0.05; - } + i = 0; + while ( i < 50 ) + { + line( start, end ); + wait 0,05; + i++; #/ + } } isexcluded( entity, entitylist ) { - for ( index = 0; index < entitylist.size; index++ ) - { - if ( entity == entitylist[index] ) - return true; - } - - return false; + index = 0; + while ( index < entitylist.size ) + { + if ( entity == entitylist[ index ] ) + { + return 1; + } + index++; + } + return 0; } waitfortimeornotifies( desireddelay ) { - startedwaiting = gettime(); - waitedtime = ( gettime() - startedwaiting ) / 1000; - - if ( waitedtime < desireddelay ) - { - wait( desireddelay - waitedtime ); - return desireddelay; - } - else - return waitedtime; + startedwaiting = getTime(); + waitedtime = ( getTime() - startedwaiting ) / 1000; + if ( waitedtime < desireddelay ) + { + wait ( desireddelay - waitedtime ); + return desireddelay; + } + else + { + return waitedtime; + } } logteamwinstring( wintype, winner ) { - log_string = wintype; - - if ( isdefined( winner ) ) - log_string = log_string + ", win: " + winner; - - foreach ( team in level.teams ) - log_string = log_string + ", " + team + ": " + game["teamScores"][team]; - - logstring( log_string ); + log_string = wintype; + if ( isDefined( winner ) ) + { + log_string = ( log_string + ", win: " ) + winner; + } + _a469 = level.teams; + _k469 = getFirstArrayKey( _a469 ); + while ( isDefined( _k469 ) ) + { + team = _a469[ _k469 ]; + log_string = ( log_string + ", " ) + team + ": " + game[ "teamScores" ][ team ]; + _k469 = getNextArrayKey( _a469, _k469 ); + } + logstring( log_string ); } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_vehicle.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_vehicle.gsc index 2880978..9bfb41d 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_vehicle.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic_vehicle.gsc @@ -1,381 +1,471 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\gametypes_zm\_globallogic_player; -#include maps\mp\gametypes_zm\_damagefeedback; +#include maps/mp/gametypes_zm/_damagefeedback; +#include maps/mp/gametypes_zm/_globallogic_player; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/_utility; callback_vehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname ) { - self.idflags = idflags; - self.idflagstime = gettime(); - - if ( game["state"] == "postgame" ) - return; - - if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat ) - return; - - if ( !isdefined( vdir ) ) - idflags |= level.idflags_no_knockback; - - friendly = 0; - - if ( isdefined( self.maxhealth ) && self.health == self.maxhealth || !isdefined( self.attackers ) ) - { - self.attackers = []; - self.attackerdata = []; - self.attackerdamage = []; - } - - if ( sweapon == "none" && isdefined( einflictor ) ) - { - if ( isdefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" ) - sweapon = "explodable_barrel_mp"; - else if ( isdefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) ) - sweapon = "destructible_car_mp"; - } - - if ( !( idflags & level.idflags_no_protection ) ) - { - if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) ) - return; - - if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) - { - - } - else if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_GRENADE" ) - { - idamage *= getvehicleprojectilescalar( sweapon ); - idamage = int( idamage ); - - if ( idamage == 0 ) - return; - } - else if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) - { - idamage *= getvehicleunderneathsplashscalar( sweapon ); - idamage = int( idamage ); - - if ( idamage == 0 ) - return; - } - - idamage *= level.vehicledamagescalar; - idamage = int( idamage ); - - if ( isplayer( eattacker ) ) - eattacker.pers["participation"]++; - - prevhealthratio = self.health / self.maxhealth; - - if ( isdefined( self.owner ) && isplayer( self.owner ) ) - team = self.owner.pers["team"]; - - if ( level.teambased && isplayer( eattacker ) && team == eattacker.pers["team"] ) - { - if ( level.friendlyfire == 0 ) - { - if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) ) - return; - - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 1 ); - } - else if ( level.friendlyfire == 1 ) - { - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 ); - } - else if ( level.friendlyfire == 2 ) - { - if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) ) - return; - - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 1 ); - } - else if ( level.friendlyfire == 3 ) - { - idamage = int( idamage * 0.5 ); - - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 ); - } - - friendly = 1; - } - else - { - if ( !level.teambased && isdefined( self.targetname ) && self.targetname == "rcbomb" ) - { - - } - else if ( isdefined( self.owner ) && isdefined( eattacker ) && self.owner == eattacker ) - return; - - if ( idamage < 1 ) - idamage = 1; - - if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( sweapon ) ) - eattacker thread maps\mp\gametypes_zm\_weapons::checkhit( sweapon ); - - if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isdefined( einflictor.iscooked ) ) - self.wascooked = gettime(); - else - self.wascooked = undefined; - - attacker_seat = undefined; - - if ( isdefined( eattacker ) ) - attacker_seat = self getoccupantseat( eattacker ); - - self.lastdamagewasfromenemy = isdefined( eattacker ) && !isdefined( attacker_seat ); - self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 ); - - if ( level.gametype == "hack" && sweapon != "emp_grenade_mp" ) - idamage = 0; - } - - if ( isdefined( eattacker ) && eattacker != self ) - { - if ( maps\mp\gametypes_zm\_globallogic_player::dodamagefeedback( sweapon, einflictor ) ) - { - if ( idamage > 0 ) - eattacker thread maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor ); - } - } - } + self.idflags = idflags; + self.idflagstime = getTime(); + if ( game[ "state" ] == "postgame" ) + { + return; + } + if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( eattacker.candocombat ) && !eattacker.candocombat ) + { + return; + } + if ( !isDefined( vdir ) ) + { + idflags |= level.idflags_no_knockback; + } + friendly = 0; + if ( isDefined( self.maxhealth ) || self.health == self.maxhealth && !isDefined( self.attackers ) ) + { + self.attackers = []; + self.attackerdata = []; + self.attackerdamage = []; + } + if ( sweapon == "none" && isDefined( einflictor ) ) + { + if ( isDefined( einflictor.targetname ) && einflictor.targetname == "explodable_barrel" ) + { + sweapon = "explodable_barrel_mp"; + } + else + { + if ( isDefined( einflictor.destructible_type ) && issubstr( einflictor.destructible_type, "vehicle_" ) ) + { + sweapon = "destructible_car_mp"; + } + } + } + if ( idflags & level.idflags_no_protection ) + { + if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) ) + { + return; + } + if ( smeansofdeath == "MOD_PISTOL_BULLET" || smeansofdeath == "MOD_RIFLE_BULLET" ) + { + } + else + { + if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_GRENADE" ) + { + idamage *= getvehicleprojectilescalar( sweapon ); + idamage = int( idamage ); + if ( idamage == 0 ) + { + return; + } + } + else + { + if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) + { + idamage *= getvehicleunderneathsplashscalar( sweapon ); + idamage = int( idamage ); + if ( idamage == 0 ) + { + return; + } + } + } + } + idamage *= level.vehicledamagescalar; + idamage = int( idamage ); + if ( isplayer( eattacker ) ) + { + eattacker.pers[ "participation" ]++; + } + prevhealthratio = self.health / self.maxhealth; + if ( isDefined( self.owner ) && isplayer( self.owner ) ) + { + team = self.owner.pers[ "team" ]; + } + if ( level.teambased && isplayer( eattacker ) && team == eattacker.pers[ "team" ] ) + { + if ( level.friendlyfire == 0 ) + { + if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) ) + { + return; + } + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 1 ); + } + else if ( level.friendlyfire == 1 ) + { + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 ); + } + else if ( level.friendlyfire == 2 ) + { + if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) ) + { + return; + } + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 1 ); + } + else + { + if ( level.friendlyfire == 3 ) + { + idamage = int( idamage * 0,5 ); + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 ); + } + } + friendly = 1; + } + else + { + if ( !level.teambased && isDefined( self.targetname ) && self.targetname == "rcbomb" ) + { + } + else + { + if ( isDefined( self.owner ) && isDefined( eattacker ) && self.owner == eattacker ) + { + return; + } + } + if ( idamage < 1 ) + { + idamage = 1; + } + if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( sweapon ) ) + { + eattacker thread maps/mp/gametypes_zm/_weapons::checkhit( sweapon ); + } + if ( issubstr( smeansofdeath, "MOD_GRENADE" ) && isDefined( einflictor.iscooked ) ) + { + self.wascooked = getTime(); + } + else + { + self.wascooked = undefined; + } + attacker_seat = undefined; + if ( isDefined( eattacker ) ) + { + attacker_seat = self getoccupantseat( eattacker ); + } + if ( isDefined( eattacker ) ) + { + self.lastdamagewasfromenemy = !isDefined( attacker_seat ); + } + self finishvehicledamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, damagefromunderneath, modelindex, partname, 0 ); + if ( level.gametype == "hack" && sweapon != "emp_grenade_mp" ) + { + idamage = 0; + } + } + if ( isDefined( eattacker ) && eattacker != self ) + { + if ( maps/mp/gametypes_zm/_globallogic_player::dodamagefeedback( sweapon, einflictor ) ) + { + if ( idamage > 0 ) + { + eattacker thread maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback( smeansofdeath, einflictor ); + } + } + } + } /# - if ( getdvarint( "g_debugDamage" ) ) - println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); + if ( getDvarInt( "g_debugDamage" ) ) + { + println( "actor:" + self getentitynumber() + " health:" + self.health + " attacker:" + eattacker.clientid + " inflictor is player:" + isplayer( einflictor ) + " damage:" + idamage + " hitLoc:" + shitloc ); #/ - if ( 1 ) - { - lpselfnum = self getentitynumber(); - lpselfteam = ""; - lpattackerteam = ""; - - if ( isplayer( eattacker ) ) - { - lpattacknum = eattacker getentitynumber(); - lpattackguid = eattacker getguid(); - lpattackname = eattacker.name; - lpattackerteam = eattacker.pers["team"]; - } - else - { - lpattacknum = -1; - lpattackguid = ""; - lpattackname = ""; - lpattackerteam = "world"; - } - - logprint( "VD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); - } + } + if ( 1 ) + { + lpselfnum = self getentitynumber(); + lpselfteam = ""; + lpattackerteam = ""; + if ( isplayer( eattacker ) ) + { + lpattacknum = eattacker getentitynumber(); + lpattackguid = eattacker getguid(); + lpattackname = eattacker.name; + lpattackerteam = eattacker.pers[ "team" ]; + } + else + { + lpattacknum = -1; + lpattackguid = ""; + lpattackname = ""; + lpattackerteam = "world"; + } + logprint( "VD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sweapon + ";" + idamage + ";" + smeansofdeath + ";" + shitloc + "\n" ); + } } callback_vehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ) { - idamage = 0; - finnerdamage = 0; - fouterdamage = 0; - self.idflags = idflags; - self.idflagstime = gettime(); - - if ( game["state"] == "postgame" ) - return; - - if ( isdefined( eattacker ) && isplayer( eattacker ) && isdefined( eattacker.candocombat ) && !eattacker.candocombat ) - return; - - friendly = 0; - - if ( !( idflags & level.idflags_no_protection ) ) - { - if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) ) - return; - - if ( smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE_SPLASH" || smeansofdeath == "MOD_EXPLOSIVE" ) - { - scalar = getvehicleprojectilesplashscalar( sweapon ); - idamage = int( idamage * scalar ); - finnerdamage *= scalar; - fouterdamage *= scalar; - - if ( finnerdamage == 0 ) - return; - - if ( idamage < 1 ) - idamage = 1; - } - - occupant_team = undefined; - - if ( level.teambased && isplayer( eattacker ) && occupant_team == eattacker.pers["team"] ) - { - if ( level.friendlyfire == 0 ) - { - if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) ) - return; - - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); - } - else if ( level.friendlyfire == 1 ) - { - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); - } - else if ( level.friendlyfire == 2 ) - { - if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) ) - return; - - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); - } - else if ( level.friendlyfire == 3 ) - { - idamage = int( idamage * 0.5 ); - - if ( idamage < 1 ) - idamage = 1; - - self.lastdamagewasfromenemy = 0; - self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); - } - - friendly = 1; - } - else - { - if ( idamage < 1 ) - idamage = 1; - - self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); - } - } + idamage = 0; + finnerdamage = 0; + fouterdamage = 0; + self.idflags = idflags; + self.idflagstime = getTime(); + if ( game[ "state" ] == "postgame" ) + { + return; + } + if ( isDefined( eattacker ) && isplayer( eattacker ) && isDefined( eattacker.candocombat ) && !eattacker.candocombat ) + { + return; + } + friendly = 0; + if ( idflags & level.idflags_no_protection ) + { + if ( self isvehicleimmunetodamage( idflags, smeansofdeath, sweapon ) ) + { + return; + } + if ( smeansofdeath != "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE_SPLASH" && smeansofdeath == "MOD_EXPLOSIVE" ) + { + scalar = getvehicleprojectilesplashscalar( sweapon ); + idamage = int( idamage * scalar ); + finnerdamage *= scalar; + fouterdamage *= scalar; + if ( finnerdamage == 0 ) + { + return; + } + if ( idamage < 1 ) + { + idamage = 1; + } + } + occupant_team = undefined; + if ( level.teambased && isplayer( eattacker ) && occupant_team == eattacker.pers[ "team" ] ) + { + if ( level.friendlyfire == 0 ) + { + if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) ) + { + return; + } + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); + } + else if ( level.friendlyfire == 1 ) + { + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); + } + else if ( level.friendlyfire == 2 ) + { + if ( !allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) ) + { + return; + } + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); + } + else + { + if ( level.friendlyfire == 3 ) + { + idamage = int( idamage * 0,5 ); + if ( idamage < 1 ) + { + idamage = 1; + } + self.lastdamagewasfromenemy = 0; + self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); + } + } + friendly = 1; + return; + } + else + { + if ( idamage < 1 ) + { + idamage = 1; + } + self finishvehicleradiusdamage( einflictor, eattacker, idamage, finnerdamage, fouterdamage, idflags, smeansofdeath, sweapon, vpoint, fradius, fconeanglecos, vconedir, psoffsettime ); + } + } } vehiclecrush() { - self endon( "disconnect" ); - - if ( isdefined( level._effect ) && isdefined( level._effect["tanksquish"] ) ) - playfx( level._effect["tanksquish"], self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ) ); - - self playsound( "chr_crunch" ); + self endon( "disconnect" ); + if ( isDefined( level._effect ) && isDefined( level._effect[ "tanksquish" ] ) ) + { + playfx( level._effect[ "tanksquish" ], self.origin + vectorScale( ( 0, 0, 1 ), 30 ) ); + } + self playsound( "chr_crunch" ); } getvehicleprojectilescalar( sweapon ) { - if ( sweapon == "satchel_charge_mp" ) - scale = 1; - else if ( sweapon == "sticky_grenade_mp" ) - scale = 1; - else if ( sweapon == "claymore_mp" ) - scale = 1; - else if ( sweapon == "remote_missile_missile_mp" ) - scale = 10.0; - else if ( sweapon == "remote_mortar_missile_mp" ) - scale = 10.0; - else if ( sweapon == "smaw_mp" ) - scale = 0.2; - else if ( sweapon == "fhj18_mp" ) - scale = 0.2; - else if ( issubstr( sweapon, "gl_" ) ) - scale = 1; - else if ( issubstr( sweapon, "turret_mp" ) ) - scale = 1; - else if ( issubstr( sweapon, "grenade" ) ) - scale = 1; - else - scale = 1; - - return scale; + if ( sweapon == "satchel_charge_mp" ) + { + scale = 1; + } + else if ( sweapon == "sticky_grenade_mp" ) + { + scale = 1; + } + else if ( sweapon == "claymore_mp" ) + { + scale = 1; + } + else if ( sweapon == "remote_missile_missile_mp" ) + { + scale = 10; + } + else if ( sweapon == "remote_mortar_missile_mp" ) + { + scale = 10; + } + else if ( sweapon == "smaw_mp" ) + { + scale = 0,2; + } + else if ( sweapon == "fhj18_mp" ) + { + scale = 0,2; + } + else if ( issubstr( sweapon, "gl_" ) ) + { + scale = 1; + } + else if ( issubstr( sweapon, "turret_mp" ) ) + { + scale = 1; + } + else if ( issubstr( sweapon, "grenade" ) ) + { + scale = 1; + } + else + { + scale = 1; + } + return scale; } getvehicleprojectilesplashscalar( sweapon ) { - if ( sweapon == "satchel_charge_mp" ) - scale = 1; - else if ( sweapon == "sticky_grenade_mp" ) - scale = 1; - else if ( sweapon == "claymore_mp" ) - scale = 1; - else if ( sweapon == "remote_missile_missile_mp" ) - scale = 10.0; - else if ( sweapon == "remote_mortar_missile_mp" ) - scale = 4.0; - else if ( sweapon == "chopper_minigun_mp" ) - scale = 0.5; - else if ( issubstr( sweapon, "gl_" ) ) - scale = 0.5; - else if ( issubstr( sweapon, "turrent_mp" ) ) - scale = 0.1; - else if ( issubstr( sweapon, "grenade" ) ) - scale = 1; - else - scale = 1; - - return scale; + if ( sweapon == "satchel_charge_mp" ) + { + scale = 1; + } + else if ( sweapon == "sticky_grenade_mp" ) + { + scale = 1; + } + else if ( sweapon == "claymore_mp" ) + { + scale = 1; + } + else if ( sweapon == "remote_missile_missile_mp" ) + { + scale = 10; + } + else if ( sweapon == "remote_mortar_missile_mp" ) + { + scale = 4; + } + else if ( sweapon == "chopper_minigun_mp" ) + { + scale = 0,5; + } + else if ( issubstr( sweapon, "gl_" ) ) + { + scale = 0,5; + } + else if ( issubstr( sweapon, "turrent_mp" ) ) + { + scale = 0,1; + } + else if ( issubstr( sweapon, "grenade" ) ) + { + scale = 1; + } + else + { + scale = 1; + } + return scale; } getvehicleunderneathsplashscalar( sweapon ) { - if ( sweapon == "satchel_charge_mp" ) - { - scale = 10.0; - scale *= 3.0; - } - else - scale = 1.0; - - return scale; + if ( sweapon == "satchel_charge_mp" ) + { + scale = 10; + scale *= 3; + } + else + { + scale = 1; + } + return scale; } getvehiclebulletdamage( sweapon ) { - if ( issubstr( sweapon, "ptrs41_" ) ) - idamage = 25; - else if ( issubstr( sweapon, "gunner" ) ) - idamage = 5; - else if ( issubstr( sweapon, "mg42_bipod" ) || issubstr( sweapon, "30cal_bipod" ) ) - idamage = 5; - else - idamage = 1; - - return idamage; + if ( issubstr( sweapon, "ptrs41_" ) ) + { + idamage = 25; + } + else if ( issubstr( sweapon, "gunner" ) ) + { + idamage = 5; + } + else if ( issubstr( sweapon, "mg42_bipod" ) || issubstr( sweapon, "30cal_bipod" ) ) + { + idamage = 5; + } + else + { + idamage = 1; + } + return idamage; } allowfriendlyfiredamage( einflictor, eattacker, smeansofdeath, sweapon ) { - if ( isdefined( self.allowfriendlyfiredamageoverride ) ) - return [[ self.allowfriendlyfiredamageoverride ]]( einflictor, eattacker, smeansofdeath, sweapon ); - - vehicle = eattacker getvehicleoccupied(); - return 0; + if ( isDefined( self.allowfriendlyfiredamageoverride ) ) + { + return [[ self.allowfriendlyfiredamageoverride ]]( einflictor, eattacker, smeansofdeath, sweapon ); + } + vehicle = eattacker getvehicleoccupied(); + return 0; } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gv_actions.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gv_actions.gsc index 125b60c..0b42480 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gv_actions.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gv_actions.gsc @@ -1,873 +1,995 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\gametypes_zm\_globallogic_ui; +#include maps/mp/gametypes_zm/_globallogic_ui; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/gametypes_zm/_globallogic; +#include common_scripts/utility; +#include maps/mp/_utility; initializeactionarray() { - level.gametypeactions = []; - level.gametypeactions["GiveAmmo"] = ::dogiveammo; - level.gametypeactions["RemoveAmmo"] = ::doremoveammo; - level.gametypeactions["PlaySound"] = ::doplaysound; - level.gametypeactions["EnableUAV"] = ::doenableuav; - level.gametypeactions["GiveScore"] = ::dogivescore; - level.gametypeactions["RemoveScore"] = ::doremovescore; - level.gametypeactions["SetHeader"] = ::dosetheader; - level.gametypeactions["SetSubHeader"] = ::dosetsubheader; - level.gametypeactions["DisplayMessage"] = ::dodisplaymessage; - level.gametypeactions["GiveHealth"] = ::dogivehealth; - level.gametypeactions["RemoveHealth"] = ::doremovehealth; - level.gametypeactions["SetHealthRegen"] = ::dosethealthregen; - level.gametypeactions["ChangeClass"] = ::dochangeclass; - level.gametypeactions["ChangeTeam"] = ::dochangeteam; - level.gametypeactions["GivePerk"] = ::dogiveperk; - level.gametypeactions["RemovePerk"] = ::doremoveperk; - level.gametypeactions["GiveInvuln"] = ::dogiveinvuln; - level.gametypeactions["RemoveInvuln"] = ::doremoveinvuln; - level.gametypeactions["SetDamageModifier"] = ::dosetdamagemodifier; - level.gametypeactions["GiveKillstreak"] = ::dogivekillstreak; - level.gametypeactions["RemoveKillstreak"] = ::doremovekillstreak; - level.gametypeactions["GiveLives"] = ::dogivelives; - level.gametypeactions["RemoveLives"] = ::doremovelives; - level.gametypeactions["ScaleMoveSpeed"] = ::doscalemovespeed; - level.gametypeactions["ShowOnRadar"] = ::doshowonradar; - level.conditionals = []; - level.conditionals["Equals"] = ::equals; - level.conditionals["=="] = ::equals; - level.conditionals["!="] = ::notequals; - level.conditionals["<"] = ::lessthan; - level.conditionals["<="] = ::lessthanequals; - level.conditionals[">"] = ::greaterthan; - level.conditionals[">="] = ::greaterthanequals; - level.conditionals["InPlace"] = ::inplace; - level.conditionallefthandside = []; - level.conditionallefthandside["PlayersLeft"] = ::playersleft; - level.conditionallefthandside["RoundsPlayed"] = ::roundsplayed; - level.conditionallefthandside["HitBy"] = ::hitby; - level.conditionallefthandside["PlayersClass"] = ::playersclass; - level.conditionallefthandside["VictimsClass"] = ::playersclass; - level.conditionallefthandside["AttackersClass"] = ::attackersclass; - level.conditionallefthandside["PlayersPlace"] = ::playersplace; - level.conditionallefthandside["VictimsPlace"] = ::playersplace; - level.conditionallefthandside["AttackersPlace"] = ::attackersplace; - level.targets = []; - level.targets["Everyone"] = ::gettargeteveryone; - level.targets["PlayersLeft"] = ::gettargetplayersleft; - level.targets["PlayersEliminated"] = ::gettargetplayerseliminated; - level.targets["PlayersTeam"] = ::gettargetplayersteam; - level.targets["VictimsTeam"] = ::gettargetplayersteam; - level.targets["OtherTeam"] = ::gettargetotherteam; - level.targets["AttackersTeam"] = ::gettargetotherteam; - level.targets["PlayersLeftOnPlayersTeam"] = ::gettargetplayersleftonplayersteam; - level.targets["PlayersLeftOnOtherTeam"] = ::gettargetplayersleftonotherteam; - level.targets["PlayersLeftOnVictimsTeam"] = ::gettargetplayersleftonplayersteam; - level.targets["PlayersLeftOnAttackersTeam"] = ::gettargetplayersleftonotherteam; - level.targets["PlayersEliminatedOnPlayersTeam"] = ::gettargetplayerseliminatedonplayersteam; - level.targets["PlayersEliminatedOnOtherTeam"] = ::gettargetplayerseliminatedonotherteam; - level.targets["PlayersEliminatedOnVictimsTeam"] = ::gettargetplayerseliminatedonplayersteam; - level.targets["PlayersEliminatedOnAttackersTeam"] = ::gettargetplayerseliminatedonotherteam; - level.targets["AssistingPlayers"] = ::getassistingplayers; + level.gametypeactions = []; + level.gametypeactions[ "GiveAmmo" ] = ::dogiveammo; + level.gametypeactions[ "RemoveAmmo" ] = ::doremoveammo; + level.gametypeactions[ "PlaySound" ] = ::doplaysound; + level.gametypeactions[ "EnableUAV" ] = ::doenableuav; + level.gametypeactions[ "GiveScore" ] = ::dogivescore; + level.gametypeactions[ "RemoveScore" ] = ::doremovescore; + level.gametypeactions[ "SetHeader" ] = ::dosetheader; + level.gametypeactions[ "SetSubHeader" ] = ::dosetsubheader; + level.gametypeactions[ "DisplayMessage" ] = ::dodisplaymessage; + level.gametypeactions[ "GiveHealth" ] = ::dogivehealth; + level.gametypeactions[ "RemoveHealth" ] = ::doremovehealth; + level.gametypeactions[ "SetHealthRegen" ] = ::dosethealthregen; + level.gametypeactions[ "ChangeClass" ] = ::dochangeclass; + level.gametypeactions[ "ChangeTeam" ] = ::dochangeteam; + level.gametypeactions[ "GivePerk" ] = ::dogiveperk; + level.gametypeactions[ "RemovePerk" ] = ::doremoveperk; + level.gametypeactions[ "GiveInvuln" ] = ::dogiveinvuln; + level.gametypeactions[ "RemoveInvuln" ] = ::doremoveinvuln; + level.gametypeactions[ "SetDamageModifier" ] = ::dosetdamagemodifier; + level.gametypeactions[ "GiveKillstreak" ] = ::dogivekillstreak; + level.gametypeactions[ "RemoveKillstreak" ] = ::doremovekillstreak; + level.gametypeactions[ "GiveLives" ] = ::dogivelives; + level.gametypeactions[ "RemoveLives" ] = ::doremovelives; + level.gametypeactions[ "ScaleMoveSpeed" ] = ::doscalemovespeed; + level.gametypeactions[ "ShowOnRadar" ] = ::doshowonradar; + level.conditionals = []; + level.conditionals[ "Equals" ] = ::equals; + level.conditionals[ "==" ] = ::equals; + level.conditionals[ "!=" ] = ::notequals; + level.conditionals[ "<" ] = ::lessthan; + level.conditionals[ "<=" ] = ::lessthanequals; + level.conditionals[ ">" ] = ::greaterthan; + level.conditionals[ ">=" ] = ::greaterthanequals; + level.conditionals[ "InPlace" ] = ::inplace; + level.conditionallefthandside = []; + level.conditionallefthandside[ "PlayersLeft" ] = ::playersleft; + level.conditionallefthandside[ "RoundsPlayed" ] = ::roundsplayed; + level.conditionallefthandside[ "HitBy" ] = ::hitby; + level.conditionallefthandside[ "PlayersClass" ] = ::playersclass; + level.conditionallefthandside[ "VictimsClass" ] = ::playersclass; + level.conditionallefthandside[ "AttackersClass" ] = ::attackersclass; + level.conditionallefthandside[ "PlayersPlace" ] = ::playersplace; + level.conditionallefthandside[ "VictimsPlace" ] = ::playersplace; + level.conditionallefthandside[ "AttackersPlace" ] = ::attackersplace; + level.targets = []; + level.targets[ "Everyone" ] = ::gettargeteveryone; + level.targets[ "PlayersLeft" ] = ::gettargetplayersleft; + level.targets[ "PlayersEliminated" ] = ::gettargetplayerseliminated; + level.targets[ "PlayersTeam" ] = ::gettargetplayersteam; + level.targets[ "VictimsTeam" ] = ::gettargetplayersteam; + level.targets[ "OtherTeam" ] = ::gettargetotherteam; + level.targets[ "AttackersTeam" ] = ::gettargetotherteam; + level.targets[ "PlayersLeftOnPlayersTeam" ] = ::gettargetplayersleftonplayersteam; + level.targets[ "PlayersLeftOnOtherTeam" ] = ::gettargetplayersleftonotherteam; + level.targets[ "PlayersLeftOnVictimsTeam" ] = ::gettargetplayersleftonplayersteam; + level.targets[ "PlayersLeftOnAttackersTeam" ] = ::gettargetplayersleftonotherteam; + level.targets[ "PlayersEliminatedOnPlayersTeam" ] = ::gettargetplayerseliminatedonplayersteam; + level.targets[ "PlayersEliminatedOnOtherTeam" ] = ::gettargetplayerseliminatedonotherteam; + level.targets[ "PlayersEliminatedOnVictimsTeam" ] = ::gettargetplayerseliminatedonplayersteam; + level.targets[ "PlayersEliminatedOnAttackersTeam" ] = ::gettargetplayerseliminatedonotherteam; + level.targets[ "AssistingPlayers" ] = ::getassistingplayers; } equals( param1, param2 ) { - return param1 == param2; + return param1 == param2; } notequals( param1, param2 ) { - return param1 != param2; + return param1 != param2; } lessthan( param1, param2 ) { - return param1 < param2; + return param1 < param2; } lessthanequals( param1, param2 ) { - return param1 <= param2; + return param1 <= param2; } greaterthan( param1, param2 ) { - return param1 > param2; + return param1 > param2; } greaterthanequals( param1, param2 ) { - return param1 >= param2; + return param1 >= param2; } inplace( param1, param2 ) { - if ( param1 == param2 ) - return true; - - if ( param2 == "top3" && param1 == "first" ) - return true; - - return false; + if ( param1 == param2 ) + { + return 1; + } + if ( param2 == "top3" && param1 == "first" ) + { + return 1; + } + return 0; } playersleft( rule ) { - return 0; + return 0; } roundsplayed( rule ) { - return game["roundsplayed"] + 1; + return game[ "roundsplayed" ] + 1; } hitby( rule ) { - meansofdeath = rule.target["MeansOfDeath"]; - weapon = rule.target["Weapon"]; - - if ( !isdefined( meansofdeath ) || !isdefined( weapon ) ) - return undefined; - - switch ( weapon ) - { - case "knife_ballistic_mp": - return "knife"; - } - - switch ( meansofdeath ) - { - case "MOD_RIFLE_BULLET": - case "MOD_PISTOL_BULLET": - return "bullet"; - case "MOD_MELEE": - case "MOD_BAYONET": - return "knife"; - case "MOD_HEAD_SHOT": - return "headshot"; - case "MOD_PROJECTILE_SPLASH": - case "MOD_PROJECTILE": - case "MOD_GRENADE_SPLASH": - case "MOD_GRENADE": - case "MOD_EXPLOSIVE": - return "explosive"; - } - - return undefined; + meansofdeath = rule.target[ "MeansOfDeath" ]; + weapon = rule.target[ "Weapon" ]; + if ( !isDefined( meansofdeath ) || !isDefined( weapon ) ) + { + return undefined; + } + switch( weapon ) + { + case "knife_ballistic_mp": + return "knife"; + } + switch( meansofdeath ) + { + case "MOD_PISTOL_BULLET": + case "MOD_RIFLE_BULLET": + return "bullet"; + case "MOD_BAYONET": + case "MOD_MELEE": + return "knife"; + case "MOD_HEAD_SHOT": + return "headshot"; + case "MOD_EXPLOSIVE": + case "MOD_GRENADE": + case "MOD_GRENADE_SPLASH": + case "MOD_PROJECTILE": + case "MOD_PROJECTILE_SPLASH": + return "explosive"; + } + return undefined; } getplayersclass( player ) { - return player.pers["class"]; + return player.pers[ "class" ]; } playersclass( rule ) { - player = rule.target["Player"]; - return getplayersclass( player ); + player = rule.target[ "Player" ]; + return getplayersclass( player ); } attackersclass( rule ) { - player = rule.target["Attacker"]; - return getplayersclass( player ); + player = rule.target[ "Attacker" ]; + return getplayersclass( player ); } getplayersplace( player ) { - maps\mp\gametypes_zm\_globallogic::updateplacement(); - - if ( !isdefined( level.placement["all"] ) ) - return; - - for ( place = 0; place < level.placement["all"].size; place++ ) - { - if ( level.placement["all"][place] == player ) - break; - } - - place++; - - if ( place == 1 ) - return "first"; - else if ( place <= 3 ) - return "top3"; - else if ( place == level.placement["all"].size ) - return "last"; - - return "middle"; + maps/mp/gametypes_zm/_globallogic::updateplacement(); + if ( !isDefined( level.placement[ "all" ] ) ) + { + return; + } + place = 0; + while ( place < level.placement[ "all" ].size ) + { + if ( level.placement[ "all" ][ place ] == player ) + { + place++; + continue; + } + else + { + place++; + } + } + place++; + if ( place == 1 ) + { + return "first"; + } + else + { + if ( place <= 3 ) + { + return "top3"; + } + else + { + if ( place == level.placement[ "all" ].size ) + { + return "last"; + } + } + } + return "middle"; } playersplace( rule ) { - player = rule.target["Player"]; - return getplayersplace( player ); + player = rule.target[ "Player" ]; + return getplayersplace( player ); } attackersplace( rule ) { - player = rule.target["Attacker"]; - return getplayersplace( player ); + player = rule.target[ "Attacker" ]; + return getplayersplace( player ); } gettargeteveryone( rule ) { - return level.players; + return level.players; } gettargetplayersleft( rule ) { - return 0; + return 0; } gettargetplayerseliminated( rule ) { - return 0; + return 0; } gettargetplayersteam( rule ) { - player = rule.target["Player"]; - - if ( !isdefined( player ) ) - return []; - - return getplayersonteam( level.players, player.pers["team"] ); + player = rule.target[ "Player" ]; + if ( !isDefined( player ) ) + { + return []; + } + return getplayersonteam( level.players, player.pers[ "team" ] ); } gettargetotherteam( rule ) { - player = rule.target["Player"]; - - if ( !isdefined( player ) ) - return []; - - return getplayersonteam( level.players, getotherteam( player.pers["team"] ) ); + player = rule.target[ "Player" ]; + if ( !isDefined( player ) ) + { + return []; + } + return getplayersonteam( level.players, getotherteam( player.pers[ "team" ] ) ); } gettargetplayersleftonplayersteam( rule ) { - return []; + return []; } gettargetplayersleftonotherteam( rule ) { - return []; + return []; } gettargetplayerseliminatedonplayersteam( rule ) { - return []; + return []; } gettargetplayerseliminatedonotherteam( rule ) { - return []; + return []; } getassistingplayers( rule ) { - assisters = []; - attacker = rule.target["Attacker"]; - - if ( !isdefined( rule.target["Assisters"] ) || !isdefined( attacker ) ) - return assisters; - - for ( j = 0; j < rule.target["Assisters"].size; j++ ) - { - player = rule.target["Assisters"][j]; - - if ( !isdefined( player ) ) - continue; - - if ( player == attacker ) - continue; - - assisters[assisters.size] = player; - } - - return assisters; + assisters = []; + attacker = rule.target[ "Attacker" ]; + if ( !isDefined( rule.target[ "Assisters" ] ) || !isDefined( attacker ) ) + { + return assisters; + } + j = 0; + while ( j < rule.target[ "Assisters" ].size ) + { + player = rule.target[ "Assisters" ][ j ]; + if ( !isDefined( player ) ) + { + j++; + continue; + } + else if ( player == attacker ) + { + j++; + continue; + } + else + { + assisters[ assisters.size ] = player; + } + j++; + } + return assisters; } executegametypeeventrule( rule ) { - if ( !aregametypeeventruleconditionalsmet( rule ) ) - return; - - if ( !isdefined( level.gametypeactions[rule.action] ) ) - { + if ( !aregametypeeventruleconditionalsmet( rule ) ) + { + return; + } + if ( !isDefined( level.gametypeactions[ rule.action ] ) ) + { /# - error( "GAMETYPE VARIANTS - unknown action: " + rule.action + "!" ); + error( "GAMETYPE VARIANTS - unknown action: " + rule.action + "!" ); #/ - return; - } - - thread internalexecuterule( rule ); + return; + } + thread internalexecuterule( rule ); } internalexecuterule( rule ) { - } aregametypeeventruleconditionalsmet( rule ) { - if ( !isdefined( rule.conditionals ) || rule.conditionals.size == 0 ) - return 1; - - combinedresult = 1; - - if ( rule.conditionaleval == "OR" ) - combinedresult = 0; - - for ( i = 0; i < rule.conditionals.size; i++ ) - { - conditionalresult = evaluategametypeeventruleconditional( rule, rule.conditionals[i] ); - - switch ( rule.conditionaleval ) - { - case "AND": - combinedresult = combinedresult && conditionalresult; - break; - case "OR": - combinedresult = combinedresult || conditionalresult; - break; - } - - if ( rule.conditionaleval == "AND" && !combinedresult ) - break; - - if ( rule.conditionaleval == "OR" && combinedresult ) - break; - } - - return combinedresult; + if ( !isDefined( rule.conditionals ) || rule.conditionals.size == 0 ) + { + return 1; + } + combinedresult = 1; + if ( rule.conditionaleval == "OR" ) + { + combinedresult = 0; + } + i = 0; + while ( i < rule.conditionals.size ) + { + conditionalresult = evaluategametypeeventruleconditional( rule, rule.conditionals[ i ] ); + switch( rule.conditionaleval ) + { + case "AND": + if ( combinedresult ) + { + combinedresult = conditionalresult; + } + break; + case "OR": + if ( !combinedresult ) + { + combinedresult = conditionalresult; + } + break; + } + if ( rule.conditionaleval == "AND" && !combinedresult ) + { + break; + } + else + { + if ( rule.conditionaleval == "OR" && combinedresult ) + { + break; + } + else + { + i++; + } + } + } + return combinedresult; } evaluategametypeeventruleconditional( rule, conditional ) { - if ( !isdefined( conditional.lhs ) || !isdefined( conditional.operand ) || !isdefined( conditional.rhs ) ) - return 0; - - if ( !isdefined( level.conditionallefthandside[conditional.lhs] ) ) - return 0; - - lhsvalue = [[ level.conditionallefthandside[conditional.lhs] ]]( rule ); - - if ( !isdefined( lhsvalue ) || !isdefined( level.conditionals[conditional.operand] ) ) - return 0; - - return [[ level.conditionals[conditional.operand] ]]( lhsvalue, conditional.rhs ); + if ( isDefined( conditional.lhs ) || !isDefined( conditional.operand ) && !isDefined( conditional.rhs ) ) + { + return 0; + } + if ( !isDefined( level.conditionallefthandside[ conditional.lhs ] ) ) + { + return 0; + } + lhsvalue = [[ level.conditionallefthandside[ conditional.lhs ] ]]( rule ); + if ( !isDefined( lhsvalue ) || !isDefined( level.conditionals[ conditional.operand ] ) ) + { + return 0; + } + return [[ level.conditionals[ conditional.operand ] ]]( lhsvalue, conditional.rhs ); } getplayersonteam( players, team ) { - playersonteam = []; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( player.pers["team"] == team ) - playersonteam[playersonteam.size] = player; - } - - return playersonteam; + playersonteam = []; + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + if ( player.pers[ "team" ] == team ) + { + playersonteam[ playersonteam.size ] = player; + } + i++; + } + return playersonteam; } gettargetsforgametypeeventrule( rule ) { - targets = []; - - if ( !isdefined( rule.targetname ) ) - return targets; - - if ( isdefined( rule.target[rule.targetname] ) ) - targets[targets.size] = rule.target[rule.targetname]; - else if ( isdefined( level.targets[rule.targetname] ) ) - targets = [[ level.targets[rule.targetname] ]]( rule ); - - return targets; + targets = []; + if ( !isDefined( rule.targetname ) ) + { + return targets; + } + if ( isDefined( rule.target[ rule.targetname ] ) ) + { + targets[ targets.size ] = rule.target[ rule.targetname ]; + } + else + { + if ( isDefined( level.targets[ rule.targetname ] ) ) + { + targets = [[ level.targets[ rule.targetname ] ]]( rule ); + } + } + return targets; } doesrulehavevalidparam( rule ) { - return isdefined( rule.params ) && isarray( rule.params ) && rule.params.size > 0; + if ( isDefined( rule.params ) && isarray( rule.params ) ) + { + return rule.params.size > 0; + } } sortplayersbylivesdescending( players ) { - if ( !isdefined( players ) ) - return undefined; + if ( !isDefined( players ) ) + { + return undefined; + } + swapped = 1; + n = players.size; + while ( swapped ) + { + swapped = 0; + i = 0; + while ( i < ( n - 1 ) ) + { + if ( players[ i ].pers[ "lives" ] < players[ i + 1 ].pers[ "lives" ] ) + { + temp = players[ i ]; + players[ i ] = players[ i + 1 ]; + players[ i + 1 ] = temp; + swapped = 1; + } + i++; + } + n--; - swapped = 1; - - for ( n = players.size; swapped; n-- ) - { - swapped = 0; - - for ( i = 0; i < n - 1; i++ ) - { - if ( players[i].pers["lives"] < players[i + 1].pers["lives"] ) - { - temp = players[i]; - players[i] = players[i + 1]; - players[i + 1] = temp; - swapped = 1; - } - } - } - - return players; + } + return players; } giveammo( players, amount ) { - for ( i = 0; i < players.size; i++ ) - { - wait 0.5; - player = players[i]; - currentweapon = player getcurrentweapon(); - clipammo = player getweaponammoclip( currentweapon ); - player setweaponammoclip( currentweapon, clipammo + amount ); - } + i = 0; + while ( i < players.size ) + { + wait 0,5; + player = players[ i ]; + currentweapon = player getcurrentweapon(); + clipammo = player getweaponammoclip( currentweapon ); + player setweaponammoclip( currentweapon, clipammo + amount ); + i++; + } } dogiveammo( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - targets = gettargetsforgametypeeventrule( rule ); - giveammo( targets, rule.params[0] ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + targets = gettargetsforgametypeeventrule( rule ); + giveammo( targets, rule.params[ 0 ] ); } doremoveammo( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - targets = gettargetsforgametypeeventrule( rule ); - giveammo( targets, 0 - rule.params[0] ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + targets = gettargetsforgametypeeventrule( rule ); + giveammo( targets, 0 - rule.params[ 0 ] ); } doplaysound( rule ) { - if ( doesrulehavevalidparam( rule ) ) - playsoundonplayers( rule.params[0] ); + if ( doesrulehavevalidparam( rule ) ) + { + playsoundonplayers( rule.params[ 0 ] ); + } } doenableuav( rule ) { - targets = gettargetsforgametypeeventrule( rule ); - - for ( targetindex = 0; targetindex < targets.size; targetindex++ ) - { - targets[targetindex].pers["hasRadar"] = 1; - targets[targetindex].hasspyplane = 1; - } + targets = gettargetsforgametypeeventrule( rule ); + targetindex = 0; + while ( targetindex < targets.size ) + { + targets[ targetindex ].pers[ "hasRadar" ] = 1; + targets[ targetindex ].hasspyplane = 1; + targetindex++; + } } givescore( players, amount ) { - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - score = maps\mp\gametypes_zm\_globallogic_score::_getplayerscore( player ); - maps\mp\gametypes_zm\_globallogic_score::_setplayerscore( player, score + amount ); - } + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + score = maps/mp/gametypes_zm/_globallogic_score::_getplayerscore( player ); + maps/mp/gametypes_zm/_globallogic_score::_setplayerscore( player, score + amount ); + i++; + } } dogivescore( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - targets = gettargetsforgametypeeventrule( rule ); - givescore( targets, rule.params[0] ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + targets = gettargetsforgametypeeventrule( rule ); + givescore( targets, rule.params[ 0 ] ); } doremovescore( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - targets = gettargetsforgametypeeventrule( rule ); - givescore( targets, 0 - rule.params[0] ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + targets = gettargetsforgametypeeventrule( rule ); + givescore( targets, 0 - rule.params[ 0 ] ); } dosetheader( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - targets = gettargetsforgametypeeventrule( rule ); - - for ( targetindex = 0; targetindex < targets.size; targetindex++ ) - { - target = targets[targetindex]; - displaytextonhudelem( target, target.customgametypeheader, rule.params[0], rule.params[1], "gv_header", rule.params[2] ); - } + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + targets = gettargetsforgametypeeventrule( rule ); + targetindex = 0; + while ( targetindex < targets.size ) + { + target = targets[ targetindex ]; + displaytextonhudelem( target, target.customgametypeheader, rule.params[ 0 ], rule.params[ 1 ], "gv_header", rule.params[ 2 ] ); + targetindex++; + } } dosetsubheader( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - targets = gettargetsforgametypeeventrule( rule ); - - for ( targetindex = 0; targetindex < targets.size; targetindex++ ) - { - target = targets[targetindex]; - displaytextonhudelem( target, target.customgametypesubheader, rule.params[0], rule.params[1], "gv_subheader", rule.params[2] ); - } + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + targets = gettargetsforgametypeeventrule( rule ); + targetindex = 0; + while ( targetindex < targets.size ) + { + target = targets[ targetindex ]; + displaytextonhudelem( target, target.customgametypesubheader, rule.params[ 0 ], rule.params[ 1 ], "gv_subheader", rule.params[ 2 ] ); + targetindex++; + } } displaytextonhudelem( target, texthudelem, text, secondstodisplay, notifyname, valueparam ) { - texthudelem.alpha = 1; - - if ( isdefined( valueparam ) ) - texthudelem settext( text, valueparam ); - else - texthudelem settext( text ); - - if ( !isdefined( secondstodisplay ) || secondstodisplay <= 0 ) - { - target.doingnotify = 0; - target notify( notifyname ); - return; - } - - target thread fadecustomgametypehudelem( texthudelem, secondstodisplay, notifyname ); + texthudelem.alpha = 1; + if ( isDefined( valueparam ) ) + { + texthudelem settext( text, valueparam ); + } + else + { + texthudelem settext( text ); + } + if ( !isDefined( secondstodisplay ) || secondstodisplay <= 0 ) + { + target.doingnotify = 0; + target notify( notifyname ); + return; + } + target thread fadecustomgametypehudelem( texthudelem, secondstodisplay, notifyname ); } fadecustomgametypehudelem( hudelem, seconds, notifyname ) { - self endon( "disconnect" ); - self notify( notifyname ); - self endon( notifyname ); - - if ( seconds <= 0 ) - return; - - self.doingnotify = 1; - wait( seconds ); - - while ( hudelem.alpha > 0 ) - { - hudelem.alpha -= 0.05; - - if ( hudelem.alpha < 0 ) - hudelem.alpha = 0; - - wait 0.05; - } - - self.doingnotify = 0; + self endon( "disconnect" ); + self notify( notifyname ); + self endon( notifyname ); + if ( seconds <= 0 ) + { + return; + } + self.doingnotify = 1; + wait seconds; + while ( hudelem.alpha > 0 ) + { + hudelem.alpha -= 0,05; + if ( hudelem.alpha < 0 ) + { + hudelem.alpha = 0; + } + wait 0,05; + } + self.doingnotify = 0; } dodisplaymessage( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - targets = gettargetsforgametypeeventrule( rule ); - - for ( targetindex = 0; targetindex < targets.size; targetindex++ ) - thread announcemessage( targets[targetindex], rule.params[0], 2.0 ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + targets = gettargetsforgametypeeventrule( rule ); + targetindex = 0; + while ( targetindex < targets.size ) + { + thread announcemessage( targets[ targetindex ], rule.params[ 0 ], 2 ); + targetindex++; + } } announcemessage( target, messagetext, time ) { - target endon( "disconnect" ); - clientannouncement( target, messagetext, int( time * 1000 ) ); - - if ( time == 0 ) - time = getdvarfloat( _hash_E8C4FC20 ); - - target.doingnotify = 1; - wait( time ); - target.doingnotify = 0; + target endon( "disconnect" ); + clientannouncement( target, messagetext, int( time * 1000 ) ); + if ( time == 0 ) + { + time = getDvarFloat( #"E8C4FC20" ); + } + target.doingnotify = 1; + wait time; + target.doingnotify = 0; } givehealth( players, amount ) { - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - player.health += amount; - } + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + player.health += amount; + i++; + } } dogivehealth( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - givehealth( gettargetsforgametypeeventrule( rule ), rule.params[0] ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + givehealth( gettargetsforgametypeeventrule( rule ), rule.params[ 0 ] ); } doremovehealth( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - givehealth( gettargetsforgametypeeventrule( rule ), 0 - rule.params[0] ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + givehealth( gettargetsforgametypeeventrule( rule ), 0 - rule.params[ 0 ] ); } dosethealthregen( rule ) { - targets = gettargetsforgametypeeventrule( rule ); - - for ( targetindex = 0; targetindex < targets.size; targetindex++ ) - { - player = targets[targetindex]; - player.regenrate = rule.params[0]; - } + targets = gettargetsforgametypeeventrule( rule ); + targetindex = 0; + while ( targetindex < targets.size ) + { + player = targets[ targetindex ]; + player.regenrate = rule.params[ 0 ]; + targetindex++; + } } dochangeclass( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } } dochangeteam( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - team = rule.params[0]; - teamkeys = getarraykeys( level.teams ); - targets = gettargetsforgametypeeventrule( rule ); - - for ( targetindex = 0; targetindex < targets.size; targetindex++ ) - { - target = targets[targetindex]; - - if ( target.pers["team"] == team ) - continue; - - if ( team == "toggle" ) - { - team = teamkeys[randomint( teamkeys.size )]; - - for ( teamindex = 0; teamindex < teamkeys.size; teamindex++ ) - { - if ( target.pers["team"] == teamkeys[teamindex] ) - { - team = teamkeys[( teamindex + 1 ) % teamkeys.size]; - break; - } - } - } - - target.pers["team"] = team; - target.team = team; - - if ( level.teambased ) - target.sessionteam = team; - else - target.sessionteam = "none"; - - target notify( "joined_team" ); - level notify( "joined_team" ); - } + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + team = rule.params[ 0 ]; + teamkeys = getarraykeys( level.teams ); + targets = gettargetsforgametypeeventrule( rule ); + targetindex = 0; + while ( targetindex < targets.size ) + { + target = targets[ targetindex ]; + if ( target.pers[ "team" ] == team ) + { + targetindex++; + continue; + } + else + { + while ( team == "toggle" ) + { + team = teamkeys[ randomint( teamkeys.size ) ]; + teamindex = 0; + while ( teamindex < teamkeys.size ) + { + if ( target.pers[ "team" ] == teamkeys[ teamindex ] ) + { + team = teamkeys[ ( teamindex + 1 ) % teamkeys.size ]; + break; + } + else + { + teamindex++; + } + } + } + target.pers[ "team" ] = team; + target.team = team; + if ( level.teambased ) + { + target.sessionteam = team; + } + else + { + target.sessionteam = "none"; + } + target notify( "joined_team" ); + level notify( "joined_team" ); + } + targetindex++; + } } displayperk( player, imagename ) { - index = 0; - - if ( isdefined( player.perkicon ) ) - { - index = -1; - - for ( i = 0; i < player.perkicon.size; i++ ) - { - if ( player.perkicon[i].alpha == 0 ) - { - index = i; - break; - } - } - - if ( index == -1 ) - return; - } - - player maps\mp\gametypes_zm\_hud_util::showperk( index, imagename, 10 ); - player thread maps\mp\gametypes_zm\_globallogic_ui::hideloadoutaftertime( 3.0 ); - player thread maps\mp\gametypes_zm\_globallogic_ui::hideloadoutondeath(); + index = 0; + if ( isDefined( player.perkicon ) ) + { + index = -1; + i = 0; + while ( i < player.perkicon.size ) + { + if ( player.perkicon[ i ].alpha == 0 ) + { + index = i; + break; + } + else + { + i++; + } + } + if ( index == -1 ) + { + return; + } + } + player maps/mp/gametypes_zm/_hud_util::showperk( index, imagename, 10 ); + player thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutaftertime( 3 ); + player thread maps/mp/gametypes_zm/_globallogic_ui::hideloadoutondeath(); } setorunsetperk( players, perks, shouldset ) { - if ( level.perksenabled == 0 ) - return; - - if ( perks.size < 2 ) - return; - - hasperkalready = 0; - imagename = perks[perks.size - 1]; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - for ( perkindex = 0; perkindex < perks.size - 1; perkindex++ ) - { - perk = perks[perkindex]; - - if ( player hasperk( perk ) ) - hasperkalready = 1; - - if ( shouldset ) - { - player setperk( perk ); - continue; - } - - player unsetperk( perk ); - } - - if ( shouldset && !hasperkalready && getdvarint( "scr_showperksonspawn" ) == 1 ) - displayperk( player, imagename ); - } + if ( level.perksenabled == 0 ) + { + return; + } + if ( perks.size < 2 ) + { + return; + } + hasperkalready = 0; + imagename = perks[ perks.size - 1 ]; + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + perkindex = 0; + while ( perkindex < ( perks.size - 1 ) ) + { + perk = perks[ perkindex ]; + if ( player hasperk( perk ) ) + { + hasperkalready = 1; + } + if ( shouldset ) + { + player setperk( perk ); + perkindex++; + continue; + } + else + { + player unsetperk( perk ); + } + perkindex++; + } + if ( shouldset && !hasperkalready && getDvarInt( "scr_showperksonspawn" ) == 1 ) + { + displayperk( player, imagename ); + } + i++; + } } dogiveperk( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - setorunsetperk( gettargetsforgametypeeventrule( rule ), rule.params, 1 ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + setorunsetperk( gettargetsforgametypeeventrule( rule ), rule.params, 1 ); } doremoveperk( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - setorunsetperk( gettargetsforgametypeeventrule( rule ), rule.params, 0 ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + setorunsetperk( gettargetsforgametypeeventrule( rule ), rule.params, 0 ); } giveorremovekillstreak( rule, shouldgive ) { - } dogivekillstreak( rule ) { - giveorremovekillstreak( rule, 1 ); + giveorremovekillstreak( rule, 1 ); } doremovekillstreak( rule ) { - giveorremovekillstreak( rule, 0 ); + giveorremovekillstreak( rule, 0 ); } givelives( players, amount ) { - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - player.pers["lives"] += amount; - - if ( player.pers["lives"] < 0 ) - player.pers["lives"] = 0; - } + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + player.pers[ "lives" ] += amount; + if ( player.pers[ "lives" ] < 0 ) + { + player.pers[ "lives" ] = 0; + } + i++; + } } dogivelives( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - givelives( gettargetsforgametypeeventrule( rule ), rule.params[0] ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + givelives( gettargetsforgametypeeventrule( rule ), rule.params[ 0 ] ); } doremovelives( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - givelives( gettargetsforgametypeeventrule( rule ), 0 - rule.params[0] ); + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + givelives( gettargetsforgametypeeventrule( rule ), 0 - rule.params[ 0 ] ); } giveorremoveinvuln( players, shouldgiveinvuln ) { - for ( i = 0; i < players.size; i++ ) - player = players[i]; + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + i++; + } } dogiveinvuln( rule ) { - giveorremoveinvuln( gettargetsforgametypeeventrule( rule ), 1 ); + giveorremoveinvuln( gettargetsforgametypeeventrule( rule ), 1 ); } doremoveinvuln( rule ) { - giveorremoveinvuln( gettargetsforgametypeeventrule( rule ), 0 ); + giveorremoveinvuln( gettargetsforgametypeeventrule( rule ), 0 ); } dosetdamagemodifier( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - players = gettargetsforgametypeeventrule( rule ); - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - player.damagemodifier = rule.params[0]; - } + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + players = gettargetsforgametypeeventrule( rule ); + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + player.damagemodifier = rule.params[ 0 ]; + i++; + } } doscalemovespeed( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - movespeedscale = rule.params[0]; - targets = gettargetsforgametypeeventrule( rule ); - - for ( targetindex = 0; targetindex < targets.size; targetindex++ ) - { - target = targets[targetindex]; - target.movementspeedmodifier = movespeedscale * target getmovespeedscale(); - - if ( target.movementspeedmodifier < 0.1 ) - target.movementspeedmodifier = 0.1; - else if ( target.movementspeedmodifier > 4.0 ) - target.movementspeedmodifier = 4.0; - - target setmovespeedscale( target.movementspeedmodifier ); - } + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + movespeedscale = rule.params[ 0 ]; + targets = gettargetsforgametypeeventrule( rule ); + targetindex = 0; + while ( targetindex < targets.size ) + { + target = targets[ targetindex ]; + target.movementspeedmodifier = movespeedscale * target getmovespeedscale(); + if ( target.movementspeedmodifier < 0,1 ) + { + target.movementspeedmodifier = 0,1; + } + else + { + if ( target.movementspeedmodifier > 4 ) + { + target.movementspeedmodifier = 4; + } + } + target setmovespeedscale( target.movementspeedmodifier ); + targetindex++; + } } doshowonradar( rule ) { - if ( !doesrulehavevalidparam( rule ) ) - return; - - targets = gettargetsforgametypeeventrule( rule ); - - for ( targetindex = 0; targetindex < targets.size; targetindex++ ) - { - if ( rule.params[0] == "enable" ) - { - targets[targetindex] setperk( "specialty_showonradar" ); - continue; - } - - targets[targetindex] unsetperk( "specialty_showonradar" ); - } + if ( !doesrulehavevalidparam( rule ) ) + { + return; + } + targets = gettargetsforgametypeeventrule( rule ); + targetindex = 0; + while ( targetindex < targets.size ) + { + if ( rule.params[ 0 ] == "enable" ) + { + targets[ targetindex ] setperk( "specialty_showonradar" ); + targetindex++; + continue; + } + else + { + targets[ targetindex ] unsetperk( "specialty_showonradar" ); + } + targetindex++; + } } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc index 6dff600..6e75ac6 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc @@ -1,280 +1,276 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\gametypes_zm\_globallogic_player; +#include maps/mp/gametypes/_globallogic_player; -init() +init() //checked matches cerberus output { - precacheshader( "overlay_low_health" ); - level.healthoverlaycutoff = 0.55; - regentime = level.playerhealthregentime; - level.playerhealth_regularregendelay = regentime * 1000; - level.healthregendisabled = level.playerhealth_regularregendelay <= 0; - level thread onplayerconnect(); + precacheshader( "overlay_low_health" ); + level.healthoverlaycutoff = 0.55; + regentime = level.playerhealthregentime; + level.playerhealth_regularregendelay = regentime * 1000; + level.healthregendisabled = level.playerhealth_regularregendelay <= 0; + level thread onplayerconnect(); } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - player thread onplayerspawned(); - player thread onplayerkilled(); - player thread onjoinedteam(); - player thread onjoinedspectators(); - player thread onplayerdisconnect(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player thread onplayerspawned(); + player thread onplayerkilled(); + player thread onjoinedteam(); + player thread onjoinedspectators(); + player thread onplayerdisconnect(); + } } -onjoinedteam() +onjoinedteam() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "joined_team" ); - - self notify( "end_healthregen" ); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "joined_team" ); + self notify( "end_healthregen" ); + } } -onjoinedspectators() +onjoinedspectators() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "joined_spectators" ); - - self notify( "end_healthregen" ); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "joined_spectators" ); + self notify( "end_healthregen" ); + } } -onplayerspawned() +onplayerspawned() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self thread playerhealthregen(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread playerhealthregen(); + } } -onplayerkilled() +onplayerkilled() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "killed_player" ); - - self notify( "end_healthregen" ); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "killed_player" ); + self notify( "end_healthregen" ); + } } -onplayerdisconnect() +onplayerdisconnect() //checked matches cerberus output { - self waittill( "disconnect" ); - - self notify( "end_healthregen" ); + self waittill( "disconnect" ); + self notify( "end_healthregen" ); } -playerhealthregen() +playerhealthregen() //checked changed to match cerberus output { - self endon( "end_healthregen" ); - - if ( self.health <= 0 ) - { + self endon( "end_healthregen" ); + if ( self.health <= 0 ) + { + /* /# - assert( !isalive( self ) ); + assert( !isalive( self ) ); #/ - return; - } - - maxhealth = self.health; - oldhealth = maxhealth; - player = self; - health_add = 0; - regenrate = 0.1; - usetrueregen = 0; - veryhurt = 0; - player.breathingstoptime = -10000; - thread playerbreathingsound( maxhealth * 0.35 ); - thread playerheartbeatsound( maxhealth * 0.35 ); - lastsoundtime_recover = 0; - hurttime = 0; - newhealth = 0; - - for (;;) - { - wait 0.05; - - if ( isdefined( player.regenrate ) ) - { - regenrate = player.regenrate; - usetrueregen = 1; - } - - if ( player.health == maxhealth ) - { - veryhurt = 0; - self.atbrinkofdeath = 0; - continue; - } - - if ( player.health <= 0 ) - return; - - if ( isdefined( player.laststand ) && player.laststand ) - continue; - - wasveryhurt = veryhurt; - ratio = player.health / maxhealth; - - if ( ratio <= level.healthoverlaycutoff ) - { - veryhurt = 1; - self.atbrinkofdeath = 1; - - if ( !wasveryhurt ) - hurttime = gettime(); - } - - if ( player.health >= oldhealth ) - { - regentime = level.playerhealth_regularregendelay; - - if ( player hasperk( "specialty_healthregen" ) ) - regentime = int( regentime / getdvarfloat( "perk_healthRegenMultiplier" ) ); - - if ( gettime() - hurttime < regentime ) - continue; - - if ( level.healthregendisabled ) - continue; - - if ( gettime() - lastsoundtime_recover > regentime ) - { - lastsoundtime_recover = gettime(); - self notify( "snd_breathing_better" ); - } - - if ( veryhurt ) - { - newhealth = ratio; - veryhurttime = 3000; - - if ( player hasperk( "specialty_healthregen" ) ) - veryhurttime = int( veryhurttime / getdvarfloat( "perk_healthRegenMultiplier" ) ); - - if ( gettime() > hurttime + veryhurttime ) - newhealth += regenrate; - } - else if ( usetrueregen ) - newhealth = ratio + regenrate; - else - newhealth = 1; - - if ( newhealth >= 1.0 ) - { - self maps\mp\gametypes_zm\_globallogic_player::resetattackerlist(); - newhealth = 1.0; - } - - if ( newhealth <= 0 ) - return; - - player setnormalhealth( newhealth ); - change = player.health - oldhealth; - - if ( change > 0 ) - player decayplayerdamages( change ); - - oldhealth = player.health; - continue; - } - - oldhealth = player.health; - health_add = 0; - hurttime = gettime(); - player.breathingstoptime = hurttime + 6000; - } + */ + return; + } + maxhealth = self.health; + oldhealth = maxhealth; + player = self; + health_add = 0; + regenrate = 0.1; + usetrueregen = 0; + veryhurt = 0; + player.breathingstoptime = -10000; + thread playerbreathingsound( maxhealth * 0.35 ); + thread playerheartbeatsound( maxhealth * 0.35 ); + lastsoundtime_recover = 0; + hurttime = 0; + newhealth = 0; + for ( ;; ) + { + wait 0.05; + if ( isDefined( player.regenrate ) ) + { + regenrate = player.regenrate; + usetrueregen = 1; + } + if ( player.health == maxhealth ) + { + veryhurt = 0; + self.atbrinkofdeath = 0; + continue; + } + if ( player.health <= 0 ) + { + return; + } + if ( isDefined( player.laststand ) && player.laststand ) + { + continue; + } + wasveryhurt = veryhurt; + ratio = player.health / maxhealth; + if ( ratio <= level.healthoverlaycutoff ) + { + veryhurt = 1; + self.atbrinkofdeath = 1; + if ( !wasveryhurt ) + { + hurttime = getTime(); + } + } + if ( player.health >= oldhealth ) + { + regentime = level.playerhealth_regularregendelay; + if ( player hasperk( "specialty_healthregen" ) ) + { + regentime = int( regentime / getDvarFloat( "perk_healthRegenMultiplier" ) ); + } + if ( ( getTime() - hurttime ) < regentime ) + { + continue; + } + else if ( level.healthregendisabled ) + { + continue; + } + else if ( ( getTime() - lastsoundtime_recover ) > regentime ) + { + lastsoundtime_recover = getTime(); + self notify( "snd_breathing_better" ); + } + if ( veryhurt ) + { + newhealth = ratio; + veryhurttime = 3000; + if ( player hasperk( "specialty_healthregen" ) ) + { + veryhurttime = int( veryhurttime / getDvarFloat( "perk_healthRegenMultiplier" ) ); + } + if ( getTime() > ( hurttime + veryhurttime ) ) + { + newhealth += regenrate; + } + } + else if ( usetrueregen ) + { + newhealth = ratio + regenrate; + } + else + { + newhealth = 1; + } + if ( newhealth >= 1 ) + { + self maps/mp/gametypes/_globallogic_player::resetattackerlist(); + newhealth = 1; + } + if ( newhealth <= 0 ) + { + return; + } + player setnormalhealth( newhealth ); + change = player.health - oldhealth; + if ( change > 0 ) + { + player decayplayerdamages( change ); + } + oldhealth = player.health; + continue; + } + oldhealth = player.health; + health_add = 0; + hurttime = getTime(); + player.breathingstoptime = hurttime + 6000; + } } -decayplayerdamages( decay ) +decayplayerdamages( decay ) //checked partially changed to match cerberus output //continues in for loops bad see github for more info { - if ( !isdefined( self.attackerdamage ) ) - return; - - for ( i = 0; i < self.attackerdamage.size; i++ ) - { - if ( !isdefined( self.attackerdamage[i] ) || !isdefined( self.attackerdamage[i].damage ) ) - continue; - - self.attackerdamage[i].damage -= decay; - - if ( self.attackerdamage[i].damage < 0 ) - self.attackerdamage[i].damage = 0; - } + if ( !isDefined( self.attackerdamage ) ) + { + return; + } + i = 0; + while ( i < self.attackerdamage.size ) + { + if ( !isDefined( self.attackerdamage[ i ] ) || !isDefined( self.attackerdamage[ i ].damage ) ) + { + i++; + continue; + } + self.attackerdamage[ i ].damage -= decay; + if ( self.attackerdamage[ i ].damage < 0 ) + { + self.attackerdamage[ i ].damage = 0; + } + i++; + } } -playerbreathingsound( healthcap ) +playerbreathingsound( healthcap ) //checked changed to match cerberus output { - self endon( "end_healthregen" ); - wait 2; - player = self; - - for (;;) - { - wait 0.2; - - if ( player.health <= 0 ) - return; - - if ( player.health >= healthcap ) - continue; - - if ( level.healthregendisabled && gettime() > player.breathingstoptime ) - continue; - - player notify( "snd_breathing_hurt" ); - wait 0.784; - wait( 0.1 + randomfloat( 0.8 ) ); - } + self endon( "end_healthregen" ); + wait 2; + player = self; + for ( ;; ) + { + wait 0.2; + if ( player.health <= 0 ) + { + return; + } + if ( player.health >= healthcap ) + { + continue; + } + else if ( level.healthregendisabled && getTime() > player.breathingstoptime ) + { + continue; + } + player notify( "snd_breathing_hurt" ); + wait 0.784; + wait ( 0.1 + randomfloat( 0.8 ) ); + } } -playerheartbeatsound( healthcap ) +playerheartbeatsound( healthcap ) //checked changed to match cerberus output { - self endon( "end_healthregen" ); - self.hearbeatwait = 0.2; - wait 2; - player = self; - - for (;;) - { - wait 0.2; - - if ( player.health <= 0 ) - return; - - if ( player.health >= healthcap ) - { - self.hearbeatwait = 0.3; - continue; - } - - if ( level.healthregendisabled && gettime() > player.breathingstoptime ) - { - self.hearbeatwait = 0.3; - continue; - } - - player playlocalsound( "mpl_player_heartbeat" ); - wait( self.hearbeatwait ); - - if ( self.hearbeatwait <= 0.6 ) - self.hearbeatwait += 0.1; - } + self endon( "end_healthregen" ); + self.hearbeatwait = 0.2; + wait 2; + player = self; + for ( ;; ) + { + wait 0.2; + if ( player.health <= 0 ) + { + return; + } + if ( player.health >= healthcap ) + { + self.hearbeatwait = 0.3; + continue; + } + else if ( level.healthregendisabled && getTime() > player.breathingstoptime ) + { + self.hearbeatwait = 0.3; + continue; + } + player playlocalsound( "mpl_player_heartbeat" ); + wait self.hearbeatwait; + if ( self.hearbeatwait <= 0.6 ) + { + self.hearbeatwait += 0.1; + } + } } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc index 29a7b9d..2fdd0a0 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc @@ -1,516 +1,571 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\gametypes_zm\_hud; -#include maps\mp\zombies\_zm; +#include maps/mp/gametypes_zm/_hud; +#include maps/mp/gametypes_zm/_hud_util; +#include common_scripts/utility; +#include maps/mp/_utility; -debug_script_structs() +debug_script_structs() //dev call did not check { + /* /# - if ( isdefined( level.struct ) ) - { - println( "*** Num structs " + level.struct.size ); - println( "" ); - - for ( i = 0; i < level.struct.size; i++ ) - { - struct = level.struct[i]; - - if ( isdefined( struct.targetname ) ) - { - println( "---" + i + " : " + struct.targetname ); - continue; - } - - println( "---" + i + " : " + "NONE" ); - } - } - else - println( "*** No structs defined." ); + if ( isDefined( level.struct ) ) + { + println( "*** Num structs " + level.struct.size ); + println( "" ); + i = 0; + while ( i < level.struct.size ) + { + struct = level.struct[ i ]; + if ( isDefined( struct.targetname ) ) + { + println( "---" + i + " : " + struct.targetname ); + i++; + continue; + } + else + { + println( "---" + i + " : " + "NONE" ); + } + i++; + } + } + else println( "*** No structs defined." ); #/ + */ } -updatetimerpausedness() +updatetimerpausedness() //checked matches cerberus output { - shouldbestopped = isdefined( level.hostmigrationtimer ); - - if ( !level.timerstopped && shouldbestopped ) - { - level.timerstopped = 1; - level.timerpausetime = gettime(); - } - else if ( level.timerstopped && !shouldbestopped ) - { - level.timerstopped = 0; - level.discardtime += gettime() - level.timerpausetime; - } + shouldbestopped = isDefined( level.hostmigrationtimer ); + if ( !level.timerstopped && shouldbestopped ) + { + level.timerstopped = 1; + level.timerpausetime = getTime(); + } + else if ( level.timerstopped && !shouldbestopped ) + { + level.timerstopped = 0; + level.discardtime += getTime() - level.timerpausetime; + } } -callback_hostmigrationsave() +callback_hostmigrationsave() //checked matches cerberus output { - } -callback_prehostmigrationsave() +callback_prehostmigrationsave() //checked matches cerberus output { - undo_link_changes(); - disablezombies( 1 ); - - if ( is_true( level._hm_should_pause_spawning ) ) - flag_set( "spawn_zombies" ); - - for ( i = 0; i < level.players.size; i++ ) - level.players[i] enableinvulnerability(); + undo_link_changes(); + disablezombies(1); + if ( is_true( level._hm_should_pause_spawning ) ) + { + flag_set( "spawn_zombies" ); + } + for ( i = 0; i < level.players.size; i++ ) + { + level.players[ i ] enableinvulnerability(); + } } -pausetimer() +pausetimer() //checked matches cerberus output { - level.migrationtimerpausetime = gettime(); + level.migrationtimerpausetime = getTime(); } -resumetimer() +resumetimer() //checked matches cerberus output { - level.discardtime += gettime() - level.migrationtimerpausetime; + level.discardtime += getTime() - level.migrationtimerpausetime; } -locktimer() +locktimer() //checked matches cerberus output { - level endon( "host_migration_begin" ); - level endon( "host_migration_end" ); - - for (;;) - { - currtime = gettime(); - wait 0.05; - - if ( !level.timerstopped && isdefined( level.discardtime ) ) - level.discardtime += gettime() - currtime; - } + level endon( "host_migration_begin" ); + level endon( "host_migration_end" ); + for ( ;; ) + { + currtime = getTime(); + wait 0.05; + if ( !level.timerstopped && isDefined( level.discardtime ) ) + { + level.discardtime += getTime() - currtime; + } + } } -callback_hostmigration() +callback_hostmigration() //checked changed to match cerberus output { - redo_link_changes(); - setslowmotion( 1, 1, 0 ); - makedvarserverinfo( "ui_guncycle", 0 ); - level.hostmigrationreturnedplayercount = 0; + redo_link_changes(); + setslowmotion( 1, 1, 0 ); + makedvarserverinfo( "ui_guncycle", 0 ); + level.hostmigrationreturnedplayercount = 0; + if ( level.gameended ) + { + /* + /# + println("Migration starting at time " + GetTime() + ", but game has ended, so no countdown."); + #/ + */ + return; + } + sethostmigrationstatus(1); + level notify( "host_migration_begin" ); + for ( i = 0; i < level.players.size; i++ ) + { + if ( isdefined( level.hostmigration_link_entity_callback ) ) + { + if ( !isdefined( level.players[ i ]._host_migration_link_entity ) ) + { + level.players[i]._host_migration_link_entity = level.players[ i ] [[ level.hostmigration_link_entity_callback ]](); + } + } + level.players[ i ] thread hostmigrationtimerthink(); + } + if ( isdefined( level.hostmigration_ai_link_entity_callback ) ) + { + zombies = getaiarray(level.zombie_team); + if ( isdefined( zombies ) && zombies.size > 0 ) + { + foreach(zombie in zombies) + { + if ( !isdefined( zombie._host_migration_link_entity ) ) + { + zombie._host_migration_link_entity = zombie [[ level.hostmigration_ai_link_entity_callback ]](); + } + } + } + } + else if ( level.inprematchperiod ) + { + level waittill("prematch_over"); + } + /* + /# + println( "Migration starting at time " + GetTime() ); + #/ + */ + level.hostmigrationtimer = 1; + thread locktimer(); + zombies = getaiarray( level.zombie_team ); + if ( isdefined( zombies ) && zombies.size > 0 ) + { + foreach ( zombie in zombies ) + { + if ( isdefined(zombie._host_migration_link_entity ) ) + { + ent = spawn( "script_origin", zombie.origin ); + ent.angles = zombie.angles; + zombie linkto(ent); + ent linkto( zombie._host_migration_link_entity, "tag_origin", zombie._host_migration_link_entity worldtolocalcoords( ent.origin ), ent.angles + zombie._host_migration_link_entity.angles ); + zombie._host_migration_link_helper = ent; + zombie linkto( zombie._host_migration_link_helper ); + } + } + } + level endon( "host_migration_begin" ); + level._hm_should_pause_spawning = flag( "spawn_zombies" ); + if ( level._hm_should_pause_spawning ) + { + flag_clear( "spawn_zombies" ); + } + hostmigrationwait(); + foreach ( player in level.players ) + { + player thread post_migration_become_vulnerable(); + } + zombies = getaiarray( level.zombie_team ); + if ( isdefined( zombies ) && zombies.size > 0 ) + { + foreach ( zombie in zombies ) + { + if ( isdefined(zombie._host_migration_link_entity ) ) + { + zombie unlink(); + zombie._host_migration_link_helper delete(); + zombie._host_migration_link_helper = undefined; + zombie._host_migration_link_entity = undefined; + } + } + } + enablezombies(1); + if ( level._hm_should_pause_spawning ) + { + flag_set( "spawn_zombies" ); + } + level.hostmigrationtimer = undefined; + level._hm_should_pause_spawning = undefined; + sethostmigrationstatus( 0 ); + /* + /# + println("Migration finished at time " + GetTime()); + #/ + */ + level notify( "host_migration_end" ); +} - if ( level.gameended ) - { +post_migration_become_vulnerable() //checked matches cerberus output +{ + self endon( "disconnect" ); + wait( 3 ); + self disableinvulnerability(); +} + +matchstarttimerconsole_internal( counttime, matchstarttimer ) //checked matches cerberus output +{ + waittillframeend; + visionsetnaked( "mpIntro", 0 ); + level endon( "match_start_timer_beginning" ); + while ( counttime > 0 && !level.gameended ) + { + matchstarttimer thread maps/mp/gametypes_zm/_hud::fontpulse( level ); + wait ( matchstarttimer.inframes * 0.05 ); + matchstarttimer setvalue( counttime ); + counttime--; + wait ( 1 - ( matchstarttimer.inframes * 0.05 ) ); + } +} + +matchstarttimerconsole( type, duration ) //checked matches cerberus output +{ + level notify( "match_start_timer_beginning" ); + wait 0,05; + matchstarttext = createserverfontstring( "objective", 1.5 ); + matchstarttext setpoint( "CENTER", "CENTER", 0, -40 ); + matchstarttext.sort = 1001; + matchstarttext settext( game[ "strings" ][ "waiting_for_teams" ] ); + matchstarttext.foreground = 0; + matchstarttext.hidewheninmenu = 1; + matchstarttext settext( game[ "strings" ][ type ] ); + matchstarttimer = createserverfontstring( "objective", 2.2 ); + matchstarttimer setpoint( "CENTER", "CENTER", 0, 0 ); + matchstarttimer.sort = 1001; + matchstarttimer.color = ( 1, 1, 0 ); + matchstarttimer.foreground = 0; + matchstarttimer.hidewheninmenu = 1; + matchstarttimer maps/mp/gametypes_zm/_hud::fontpulseinit(); + counttime = int( duration ); + if ( counttime >= 2 ) + { + matchstarttimerconsole_internal( counttime, matchstarttimer ); + } + matchstarttimer destroyelem(); + matchstarttext destroyelem(); +} + +hostmigrationwait() //checked matches cerberus output may need to check order of operations +{ + level endon( "game_ended" ); + if ( level.hostmigrationreturnedplayercount < ( ( level.players.size * 2 ) / 3 ) ) + { + thread matchstarttimerconsole( "waiting_for_teams", 20 ); + hostmigrationwaitforplayers(); + } + level notify( "host_migration_countdown_begin" ); + thread matchstarttimerconsole( "match_starting_in", 5 ); + wait 5; +} + +hostmigrationwaitforplayers() //checked matches cerberus output +{ + level endon( "hostmigration_enoughplayers" ); + wait 15; +} + +hostmigrationtimerthink_internal() //checked matches cerberus output +{ + level endon( "host_migration_begin" ); + level endon( "host_migration_end" ); + self.hostmigrationcontrolsfrozen = 0; + while ( !isalive( self ) ) + { + self waittill( "spawned" ); + } + if ( isdefined( self._host_migration_link_entity ) ) + { + ent = spawn( "script_origin", self.origin ); + ent.angles = self.angles; + self linkto( ent ); + ent linkto( self._host_migration_link_entity, "tag_origin", self._host_migration_link_entity worldtolocalcoords( ent.origin ), ent.angles + self._host_migration_link_entity.angles ); + self._host_migration_link_helper = ent; + /* + /# + println( "Linking player to ent " + self._host_migration_link_entity.targetname ); + #/ + */ + } + self.hostmigrationcontrolsfrozen = 1; + self freezecontrols( 1 ); + level waittill( "host_migration_end" ); +} + +hostmigrationtimerthink() //checked matches cerberus output +{ + self endon( "disconnect" ); + level endon( "host_migration_begin" ); + hostmigrationtimerthink_internal(); + if ( self.hostmigrationcontrolsfrozen ) + { + self freezecontrols( 0 ); + self.hostmigrationcontrolsfrozen = 0; + /* + /# + println(" Host migration unfreeze controls"); + #/ + */ + } + if ( isdefined( self._host_migration_link_entity ) ) + { + self unlink(); + self._host_migration_link_helper delete(); + self._host_migration_link_helper = undefined; + if ( isdefined( self._host_migration_link_entity._post_host_migration_thread ) ) + { + self thread [[ self._host_migration_link_entity._post_host_migration_thread ]]( self._host_migration_link_entity ); + } + self._host_migration_link_entity = undefined; + } +} + +waittillhostmigrationdone() //checked matches cerberus output +{ + if ( !isDefined( level.hostmigrationtimer ) ) + { + return 0; + } + starttime = getTime(); + level waittill( "host_migration_end" ); + return getTime() - starttime; +} + +waittillhostmigrationstarts( duration ) //checked matches cerberus output +{ + if ( isDefined( level.hostmigrationtimer ) ) + { + return; + } + level endon( "host_migration_begin" ); + wait duration; +} + +waitlongdurationwithhostmigrationpause( duration ) //checked matches cerberus output may need to check order of operations +{ + if ( duration == 0 ) + { + return; + } + /* /# - println( "Migration starting at time " + gettime() + ", but game has ended, so no countdown." ); + assert( duration > 0 ); #/ - return; - } - - sethostmigrationstatus( 1 ); - level notify( "host_migration_begin" ); - - for ( i = 0; i < level.players.size; i++ ) - { - if ( isdefined( level.hostmigration_link_entity_callback ) ) - { - if ( !isdefined( level.players[i]._host_migration_link_entity ) ) - level.players[i]._host_migration_link_entity = level.players[i] [[ level.hostmigration_link_entity_callback ]](); - } - - level.players[i] thread hostmigrationtimerthink(); - } - - if ( isdefined( level.hostmigration_ai_link_entity_callback ) ) - { - zombies = getaiarray( level.zombie_team ); - - if ( isdefined( zombies ) && zombies.size > 0 ) - { - foreach ( zombie in zombies ) - { - if ( !isdefined( zombie._host_migration_link_entity ) ) - zombie._host_migration_link_entity = zombie [[ level.hostmigration_ai_link_entity_callback ]](); - } - } - } - - if ( level.inprematchperiod ) - level waittill( "prematch_over" ); + */ + starttime = getTime(); + endtime = getTime() + ( duration * 1000 ); + while ( getTime() < endtime ) + { + waittillhostmigrationstarts( ( endtime - getTime() ) / 1000 ); + if ( isDefined( level.hostmigrationtimer ) ) + { + timepassed = waittillhostmigrationdone(); + endtime += timepassed; + } + } + /* /# - println( "Migration starting at time " + gettime() ); + if ( getTime() != endtime ) + { + println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO endtime = " + endtime ); #/ - level.hostmigrationtimer = 1; - thread locktimer(); - zombies = getaiarray( level.zombie_team ); + } + */ + waittillhostmigrationdone(); + return getTime() - starttime; +} - if ( isdefined( zombies ) && zombies.size > 0 ) - { - foreach ( zombie in zombies ) - { - if ( isdefined( zombie._host_migration_link_entity ) ) - { - ent = spawn( "script_origin", zombie.origin ); - ent.angles = zombie.angles; - zombie linkto( ent ); - ent linkto( zombie._host_migration_link_entity, "tag_origin", zombie._host_migration_link_entity worldtolocalcoords( ent.origin ), ent.angles + zombie._host_migration_link_entity.angles ); - zombie._host_migration_link_helper = ent; - zombie linkto( zombie._host_migration_link_helper ); - } - } - } - - level endon( "host_migration_begin" ); - level._hm_should_pause_spawning = flag( "spawn_zombies" ); - - if ( level._hm_should_pause_spawning ) - flag_clear( "spawn_zombies" ); - - hostmigrationwait(); - - foreach ( player in level.players ) - player thread post_migration_become_vulnerable(); - - zombies = getaiarray( level.zombie_team ); - - if ( isdefined( zombies ) && zombies.size > 0 ) - { - foreach ( zombie in zombies ) - { - if ( isdefined( zombie._host_migration_link_entity ) ) - { - zombie unlink(); - zombie._host_migration_link_helper delete(); - zombie._host_migration_link_helper = undefined; - zombie._host_migration_link_entity = undefined; - } - } - } - - enablezombies( 1 ); - - if ( level._hm_should_pause_spawning ) - flag_set( "spawn_zombies" ); - - level.hostmigrationtimer = undefined; - level._hm_should_pause_spawning = undefined; - sethostmigrationstatus( 0 ); +waitlongdurationwithhostmigrationpauseemp( duration ) //checked matches cerberus output may need to check order of operations +{ + if ( duration == 0 ) + { + return; + } + /* /# - println( "Migration finished at time " + gettime() ); + assert( duration > 0 ); #/ - level notify( "host_migration_end" ); -} - -post_migration_become_vulnerable() -{ - self endon( "disconnect" ); - wait 3; - self disableinvulnerability(); -} - -matchstarttimerconsole_internal( counttime, matchstarttimer ) -{ - waittillframeend; - level endon( "match_start_timer_beginning" ); - - while ( counttime > 0 && !level.gameended ) - { - matchstarttimer thread maps\mp\gametypes_zm\_hud::fontpulse( level ); - wait( matchstarttimer.inframes * 0.05 ); - matchstarttimer setvalue( counttime ); - counttime--; - wait( 1 - matchstarttimer.inframes * 0.05 ); - } -} - -matchstarttimerconsole( type, duration ) -{ - level notify( "match_start_timer_beginning" ); - wait 0.05; - matchstarttext = createserverfontstring( "objective", 1.5 ); - matchstarttext setpoint( "CENTER", "CENTER", 0, -40 ); - matchstarttext.sort = 1001; - matchstarttext settext( game["strings"]["waiting_for_teams"] ); - matchstarttext.foreground = 0; - matchstarttext.hidewheninmenu = 1; - matchstarttext settext( game["strings"][type] ); - matchstarttimer = createserverfontstring( "objective", 2.2 ); - matchstarttimer setpoint( "CENTER", "CENTER", 0, 0 ); - matchstarttimer.sort = 1001; - matchstarttimer.color = ( 1, 1, 0 ); - matchstarttimer.foreground = 0; - matchstarttimer.hidewheninmenu = 1; - matchstarttimer maps\mp\gametypes_zm\_hud::fontpulseinit(); - counttime = int( duration ); - - if ( counttime >= 2 ) - matchstarttimerconsole_internal( counttime, matchstarttimer ); - else - { - - } - - matchstarttimer destroyelem(); - matchstarttext destroyelem(); -} - -hostmigrationwait() -{ - level endon( "game_ended" ); - - if ( level.hostmigrationreturnedplayercount < level.players.size * 2 / 3 ) - { - thread matchstarttimerconsole( "waiting_for_teams", 20.0 ); - hostmigrationwaitforplayers(); - } - - thread matchstarttimerconsole( "match_starting_in", 5.0 ); - wait 5; -} - -hostmigrationwaitforplayers() -{ - level endon( "hostmigration_enoughplayers" ); - wait 15; -} - -hostmigrationtimerthink_internal() -{ - level endon( "host_migration_begin" ); - level endon( "host_migration_end" ); - self.hostmigrationcontrolsfrozen = 0; - - while ( !isalive( self ) ) - self waittill( "spawned" ); - - if ( isdefined( self._host_migration_link_entity ) ) - { - ent = spawn( "script_origin", self.origin ); - ent.angles = self.angles; - self linkto( ent ); - ent linkto( self._host_migration_link_entity, "tag_origin", self._host_migration_link_entity worldtolocalcoords( ent.origin ), ent.angles + self._host_migration_link_entity.angles ); - self._host_migration_link_helper = ent; + */ + starttime = getTime(); + empendtime = getTime() + ( duration * 1000 ); + level.empendtime = empendtime; + while ( getTime() < empendtime ) + { + waittillhostmigrationstarts( ( empendtime - getTime() ) / 1000 ); + if ( isDefined( level.hostmigrationtimer ) ) + { + timepassed = waittillhostmigrationdone(); + if ( isDefined( empendtime ) ) + { + empendtime += timepassed; + } + } + } + /* /# - println( "Linking player to ent " + self._host_migration_link_entity.targetname ); + if ( getTime() != empendtime ) + { + println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO empendtime = " + empendtime ); #/ - } - - self.hostmigrationcontrolsfrozen = 1; - self freezecontrols( 1 ); - - level waittill( "host_migration_end" ); + } + */ + waittillhostmigrationdone(); + level.empendtime = undefined; + return getTime() - starttime; } -hostmigrationtimerthink() +waitlongdurationwithgameendtimeupdate( duration ) //checked matches cerberus output may need to check order of operations { - self endon( "disconnect" ); - level endon( "host_migration_begin" ); - hostmigrationtimerthink_internal(); - - if ( self.hostmigrationcontrolsfrozen ) - { - self freezecontrols( 0 ); - self.hostmigrationcontrolsfrozen = 0; + if ( duration == 0 ) + { + return; + } + /* /# - println( " Host migration unfreeze controls" ); + assert( duration > 0 ); #/ - } - - if ( isdefined( self._host_migration_link_entity ) ) - { - self unlink(); - self._host_migration_link_helper delete(); - self._host_migration_link_helper = undefined; - - if ( isdefined( self._host_migration_link_entity._post_host_migration_thread ) ) - self thread [[ self._host_migration_link_entity._post_host_migration_thread ]]( self._host_migration_link_entity ); - - self._host_migration_link_entity = undefined; - } -} - -waittillhostmigrationdone() -{ - if ( !isdefined( level.hostmigrationtimer ) ) - return 0; - - starttime = gettime(); - - level waittill( "host_migration_end" ); - - return gettime() - starttime; -} - -waittillhostmigrationstarts( duration ) -{ - if ( isdefined( level.hostmigrationtimer ) ) - return; - - level endon( "host_migration_begin" ); - wait( duration ); -} - -waitlongdurationwithhostmigrationpause( duration ) -{ - if ( duration == 0 ) - return; + */ + starttime = getTime(); + endtime = getTime() + ( duration * 1000 ); + while ( getTime() < endtime ) + { + waittillhostmigrationstarts( ( endtime - getTime() ) / 1000 ); + while ( isDefined( level.hostmigrationtimer ) ) + { + endtime += 1000; + setgameendtime( int( endtime ) ); + wait 1; + } + } + /* /# - assert( duration > 0 ); + if ( getTime() != endtime ) + { + println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO endtime = " + endtime ); #/ - starttime = gettime(); - - for ( endtime = gettime() + duration * 1000; gettime() < endtime; endtime += timepassed ) - { - waittillhostmigrationstarts( ( endtime - gettime() ) / 1000 ); - asm_cond( isdefined( level.hostmigrationtimer ), loc_157F ); - timepassed = waittillhostmigrationdone(); - } - - if ( gettime() != endtime ) - { -/# - println( "SCRIPT WARNING: gettime() = " + gettime() + " NOT EQUAL TO endtime = " + endtime ); -#/ - } - - waittillhostmigrationdone(); - return gettime() - starttime; + } + */ + while ( isDefined( level.hostmigrationtimer ) ) + { + endtime += 1000; + setgameendtime( int( endtime ) ); + wait 1; + } + return getTime() - starttime; } -waitlongdurationwithgameendtimeupdate( duration ) +find_alternate_player_place( v_origin, min_radius, max_radius, max_height, ignore_targetted_nodes ) //checked partially changed to match cerberus output //continue in for loop bad see github for more info { - if ( duration == 0 ) - return; -/# - assert( duration > 0 ); -#/ - starttime = gettime(); - endtime = gettime() + duration * 1000; - - while ( gettime() < endtime ) - { - waittillhostmigrationstarts( ( endtime - gettime() ) / 1000 ); - - while ( isdefined( level.hostmigrationtimer ) ) - { - endtime += 1000; - setgameendtime( int( endtime ) ); - wait 1; - } - } -/# - if ( gettime() != endtime ) - println( "SCRIPT WARNING: gettime() = " + gettime() + " NOT EQUAL TO endtime = " + endtime ); -#/ - while ( isdefined( level.hostmigrationtimer ) ) - { - endtime += 1000; - setgameendtime( int( endtime ) ); - wait 1; - } - - return gettime() - starttime; + 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--; + } + } + return found_node; } -find_alternate_player_place( v_origin, min_radius, max_radius, max_height, ignore_targetted_nodes ) +hostmigration_put_player_in_better_place() //checked changed to match cerberus output { - 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; - - for ( i = index; i >= 0; i-- ) - { - n_node = a_nodes[i]; - - if ( ignore_targetted_nodes == 1 ) - { - if ( isdefined( n_node.target ) ) - 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; - } - } - } - } - } - } - - return found_node; + spawnpoint = undefined; + spawnpoint = find_alternate_player_place( self.origin, 50, 150, 64, 1 ); + if ( !isdefined(spawnpoint ) ) + { + spawnpoint = find_alternate_player_place( self.origin, 150, 400, 64, 1 ); + } + if ( !isdefined(spawnpoint ) ) + { + spawnpoint = find_alternate_player_place( self.origin, 50, 400, 256, 0 ); + } + 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 ( token == match_string ) + { + spawnpoints[ spawnpoints.size ] = struct; + } + i++; + } + } + } + } + else 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 ); + } + if ( isdefined( spawnpoint ) ) + { + self setorigin( spawnpoint.origin ); + } } -hostmigration_put_player_in_better_place() -{ - spawnpoint = undefined; - spawnpoint = find_alternate_player_place( self.origin, 50, 150, 64, 1 ); - - if ( !isdefined( spawnpoint ) ) - spawnpoint = find_alternate_player_place( self.origin, 150, 400, 64, 1 ); - - if ( !isdefined( spawnpoint ) ) - spawnpoint = find_alternate_player_place( self.origin, 50, 400, 256, 0 ); - - 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, " " ); - - foreach ( token in tokens ) - { - if ( token == match_string ) - spawnpoints[spawnpoints.size] = struct; - } - } - } - } - - 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 ); - } - - if ( isdefined( spawnpoint ) ) - self setorigin( spawnpoint.origin ); -} diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud.gsc index bb49ab9..80198e4 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud.gsc @@ -1,160 +1,161 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -init() +init() //checked changed to match cerberus output { - precacheshader( "progress_bar_bg" ); - precacheshader( "progress_bar_fg" ); - precacheshader( "progress_bar_fill" ); - precacheshader( "score_bar_bg" ); - level.uiparent = spawnstruct(); - level.uiparent.horzalign = "left"; - level.uiparent.vertalign = "top"; - level.uiparent.alignx = "left"; - level.uiparent.aligny = "top"; - level.uiparent.x = 0; - level.uiparent.y = 0; - level.uiparent.width = 0; - level.uiparent.height = 0; - level.uiparent.children = []; - level.fontheight = 12; - - foreach ( team in level.teams ) - level.hud[team] = spawnstruct(); - - level.primaryprogressbary = -61; - level.primaryprogressbarx = 0; - level.primaryprogressbarheight = 9; - level.primaryprogressbarwidth = 120; - level.primaryprogressbartexty = -75; - level.primaryprogressbartextx = 0; - level.primaryprogressbarfontsize = 1.4; - level.primaryprogressbarx_ss = 20; - level.primaryprogressbartextx_ss = 20; - level.primaryprogressbary_ss = 30; - level.primaryprogressbartexty_ss = 33; - level.primaryprogressbarheight_ss = 2; - level.secondaryprogressbary = -85; - level.secondaryprogressbarx = 0; - level.secondaryprogressbarheight = 9; - level.secondaryprogressbarwidth = 120; - level.secondaryprogressbartexty = -100; - level.secondaryprogressbartextx = 0; - level.secondaryprogressbarfontsize = 1.4; - level.secondaryprogressbarx_ss = 20; - level.secondaryprogressbartextx_ss = 20; - level.secondaryprogressbary_ss = 15; - level.secondaryprogressbartexty_ss = 0; - level.secondaryprogressbarheight_ss = 2; - level.teamprogressbary = 32; - level.teamprogressbarheight = 14; - level.teamprogressbarwidth = 192; - level.teamprogressbartexty = 8; - level.teamprogressbarfontsize = 1.65; - setdvar( "ui_generic_status_bar", 0 ); - level.lowertextyalign = "BOTTOM"; - level.lowertexty = -42; - level.lowertextfontsize = 1.4; - level.lowertextyalign_ss = "CENTER"; - level.lowertexty_ss = 40; - level.lowertextfontsize_ss = 1.4; + precacheshader( "progress_bar_bg" ); + precacheshader( "progress_bar_fg" ); + precacheshader( "progress_bar_fill" ); + precacheshader( "score_bar_bg" ); + level.uiparent = spawnstruct(); + level.uiparent.horzalign = "left"; + level.uiparent.vertalign = "top"; + level.uiparent.alignx = "left"; + level.uiparent.aligny = "top"; + level.uiparent.x = 0; + level.uiparent.y = 0; + level.uiparent.width = 0; + level.uiparent.height = 0; + level.uiparent.children = []; + level.fontheight = 12; + foreach ( team in level.teams ) + { + level.hud[ team ] = spawnstruct(); + } + level.primaryprogressbary = -61; + level.primaryprogressbarx = 0; + level.primaryprogressbarheight = 9; + level.primaryprogressbarwidth = 120; + level.primaryprogressbartexty = -75; + level.primaryprogressbartextx = 0; + level.primaryprogressbarfontsize = 1.4; + level.primaryprogressbarx_ss = 20; + level.primaryprogressbartextx_ss = 20; + level.primaryprogressbary_ss = 30; + level.primaryprogressbartexty_ss = 33; + level.primaryprogressbarheight_ss = 2; + level.secondaryprogressbary = -85; + level.secondaryprogressbarx = 0; + level.secondaryprogressbarheight = 9; + level.secondaryprogressbarwidth = 120; + level.secondaryprogressbartexty = -100; + level.secondaryprogressbartextx = 0; + level.secondaryprogressbarfontsize = 1.4; + level.secondaryprogressbarx_ss = 20; + level.secondaryprogressbartextx_ss = 20; + level.secondaryprogressbary_ss = 15; + level.secondaryprogressbartexty_ss = 0; + level.secondaryprogressbarheight_ss = 2; + level.teamprogressbary = 32; + level.teamprogressbarheight = 14; + level.teamprogressbarwidth = 192; + level.teamprogressbartexty = 8; + level.teamprogressbarfontsize = 1.65; + setdvar("ui_generic_status_bar", 0); + level.lowertextyalign = "BOTTOM"; + level.lowertexty = -42; + level.lowertextfontsize = 1.4; + level.lowertextyalign_ss = "CENTER"; + level.lowertexty_ss = 40; + level.lowertextfontsize_ss = 1.4; } -fontpulseinit() +fontpulseinit() //checked matches cerberus output { - self.basefontscale = self.fontscale; - self.maxfontscale = self.fontscale * 2; - self.inframes = 1.5; - self.outframes = 3; + self.basefontscale = self.fontscale; + self.maxfontscale = self.fontscale * 2; + self.inframes = 1.5; + self.outframes = 3; } -fontpulse( player ) +fontpulse( player ) //checked matches cerberus output { - self notify( "fontPulse" ); - self endon( "fontPulse" ); - self endon( "death" ); - player endon( "disconnect" ); - player endon( "joined_team" ); - player endon( "joined_spectators" ); - - if ( self.outframes == 0 ) - self.fontscale = 0.01; - else - self.fontscale = self.fontscale; - - if ( self.inframes > 0 ) - { - self changefontscaleovertime( self.inframes * 0.05 ); - self.fontscale = self.maxfontscale; - wait( self.inframes * 0.05 ); - } - else - { - self.fontscale = self.maxfontscale; - self.alpha = 0; - self fadeovertime( self.outframes * 0.05 ); - self.alpha = 1; - } - - if ( self.outframes > 0 ) - { - self changefontscaleovertime( self.outframes * 0.05 ); - self.fontscale = self.basefontscale; - } + self notify( "fontPulse" ); + self endon( "fontPulse" ); + self endon( "death" ); + player endon( "disconnect" ); + player endon( "joined_team" ); + player endon( "joined_spectators" ); + if ( self.outframes == 0 ) + { + self.fontscale = 0.01; + } + else + { + self.fontscale = self.fontscale; + } + if ( self.inframes > 0 ) + { + self changefontscaleovertime( self.inframes * 0.05 ); + self.fontscale = self.maxfontscale; + wait ( self.inframes * 0.05 ); + } + else + { + self.fontscale = self.maxfontscale; + self.alpha = 0; + self fadeovertime( self.outframes * 0.05 ); + self.alpha = 1; + } + if ( self.outframes > 0 ) + { + self changefontscaleovertime( self.outframes * 0.05 ); + self.fontscale = self.basefontscale; + } } -fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername, n_sort ) +fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername ) //checked matches cerberus output { - if ( !isdefined( n_sort ) ) - n_sort = 50; - - wait( startwait ); - - if ( !isdefined( self ) ) - return; - - if ( !isdefined( self.blackscreen ) ) - self.blackscreen = newclienthudelem( self ); - - self.blackscreen.x = 0; - self.blackscreen.y = 0; - self.blackscreen.horzalign = "fullscreen"; - self.blackscreen.vertalign = "fullscreen"; - self.blackscreen.foreground = 0; - self.blackscreen.hidewhendead = 0; - self.blackscreen.hidewheninmenu = 1; - self.blackscreen.sort = n_sort; - - if ( isdefined( shadername ) ) - self.blackscreen setshader( shadername, 640, 480 ); - else - self.blackscreen setshader( "black", 640, 480 ); - - self.blackscreen.alpha = 0; - - if ( fadeintime > 0 ) - self.blackscreen fadeovertime( fadeintime ); - - self.blackscreen.alpha = 1; - wait( fadeintime ); - - if ( !isdefined( self.blackscreen ) ) - return; - - wait( blackscreenwait ); - - if ( !isdefined( self.blackscreen ) ) - return; - - if ( fadeouttime > 0 ) - self.blackscreen fadeovertime( fadeouttime ); - - self.blackscreen.alpha = 0; - wait( fadeouttime ); - - if ( isdefined( self.blackscreen ) ) - { - self.blackscreen destroy(); - self.blackscreen = undefined; - } + wait startwait; + if ( !isDefined( self ) ) + { + return; + } + if ( !isDefined( self.blackscreen ) ) + { + self.blackscreen = newclienthudelem( self ); + } + self.blackscreen.x = 0; + self.blackscreen.y = 0; + self.blackscreen.horzalign = "fullscreen"; + self.blackscreen.vertalign = "fullscreen"; + self.blackscreen.foreground = 0; + self.blackscreen.hidewhendead = 0; + self.blackscreen.hidewheninmenu = 1; + self.blackscreen.immunetodemogamehudsettings = 1; + self.blackscreen.sort = 50; + if ( isDefined( shadername ) ) + { + self.blackscreen setshader( shadername, 640, 480 ); + } + else + { + self.blackscreen setshader( "black", 640, 480 ); + } + self.blackscreen.alpha = 0; + if ( fadeintime > 0 ) + { + self.blackscreen fadeovertime( fadeintime ); + } + self.blackscreen.alpha = 1; + wait fadeintime; + if ( !isDefined( self.blackscreen ) ) + { + return; + } + wait blackscreenwait; + if ( !isDefined( self.blackscreen ) ) + { + return; + } + if ( fadeouttime > 0 ) + { + self.blackscreen fadeovertime( fadeouttime ); + } + self.blackscreen.alpha = 0; + wait fadeouttime; + if ( isDefined( self.blackscreen ) ) + { + self.blackscreen destroy(); + self.blackscreen = undefined; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_message.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_message.gsc index 255f6ba..2425d13 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_message.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_message.gsc @@ -1,1253 +1,1359 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\gametypes_zm\_hud_message; -#include maps\mp\_music; -#include maps\mp\gametypes_zm\_globallogic_audio; -#include maps\mp\_utility; +#include maps/mp/_utility; +#include maps/mp/gametypes_zm/_globallogic_audio; +#include maps/mp/_music; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/gametypes_zm/_hud_util; init() { - precachestring( &"MENU_POINTS" ); - precachestring( &"MP_FIRSTPLACE_NAME" ); - precachestring( &"MP_SECONDPLACE_NAME" ); - precachestring( &"MP_THIRDPLACE_NAME" ); - precachestring( &"MP_WAGER_PLACE_NAME" ); - precachestring( &"MP_MATCH_BONUS_IS" ); - precachestring( &"MP_CODPOINTS_MATCH_BONUS_IS" ); - precachestring( &"MP_WAGER_WINNINGS_ARE" ); - precachestring( &"MP_WAGER_SIDEBET_WINNINGS_ARE" ); - precachestring( &"MP_WAGER_IN_THE_MONEY" ); - precachestring( &"faction_popup" ); - game["strings"]["draw"] = &"MP_DRAW_CAPS"; - game["strings"]["round_draw"] = &"MP_ROUND_DRAW_CAPS"; - game["strings"]["round_win"] = &"MP_ROUND_WIN_CAPS"; - game["strings"]["round_loss"] = &"MP_ROUND_LOSS_CAPS"; - game["strings"]["victory"] = &"MP_VICTORY_CAPS"; - game["strings"]["defeat"] = &"MP_DEFEAT_CAPS"; - game["strings"]["game_over"] = &"MP_GAME_OVER_CAPS"; - game["strings"]["halftime"] = &"MP_HALFTIME_CAPS"; - game["strings"]["overtime"] = &"MP_OVERTIME_CAPS"; - game["strings"]["roundend"] = &"MP_ROUNDEND_CAPS"; - game["strings"]["intermission"] = &"MP_INTERMISSION_CAPS"; - game["strings"]["side_switch"] = &"MP_SWITCHING_SIDES_CAPS"; - game["strings"]["match_bonus"] = &"MP_MATCH_BONUS_IS"; - game["strings"]["codpoints_match_bonus"] = &"MP_CODPOINTS_MATCH_BONUS_IS"; - game["strings"]["wager_winnings"] = &"MP_WAGER_WINNINGS_ARE"; - game["strings"]["wager_sidebet_winnings"] = &"MP_WAGER_SIDEBET_WINNINGS_ARE"; - game["strings"]["wager_inthemoney"] = &"MP_WAGER_IN_THE_MONEY_CAPS"; - game["strings"]["wager_loss"] = &"MP_WAGER_LOSS_CAPS"; - game["strings"]["wager_topwinners"] = &"MP_WAGER_TOPWINNERS"; - game["menu_endgameupdate"] = "endgameupdate"; - precachemenu( game["menu_endgameupdate"] ); - level thread onplayerconnect(); + precachestring( &"MENU_POINTS" ); + precachestring( &"MP_FIRSTPLACE_NAME" ); + precachestring( &"MP_SECONDPLACE_NAME" ); + precachestring( &"MP_THIRDPLACE_NAME" ); + precachestring( &"MP_WAGER_PLACE_NAME" ); + precachestring( &"MP_MATCH_BONUS_IS" ); + precachestring( &"MP_CODPOINTS_MATCH_BONUS_IS" ); + precachestring( &"MP_WAGER_WINNINGS_ARE" ); + precachestring( &"MP_WAGER_SIDEBET_WINNINGS_ARE" ); + precachestring( &"MP_WAGER_IN_THE_MONEY" ); + precachestring( &"faction_popup" ); + game[ "strings" ][ "draw" ] = &"MP_DRAW_CAPS"; + game[ "strings" ][ "round_draw" ] = &"MP_ROUND_DRAW_CAPS"; + game[ "strings" ][ "round_win" ] = &"MP_ROUND_WIN_CAPS"; + game[ "strings" ][ "round_loss" ] = &"MP_ROUND_LOSS_CAPS"; + game[ "strings" ][ "victory" ] = &"MP_VICTORY_CAPS"; + game[ "strings" ][ "defeat" ] = &"MP_DEFEAT_CAPS"; + game[ "strings" ][ "game_over" ] = &"MP_GAME_OVER_CAPS"; + game[ "strings" ][ "halftime" ] = &"MP_HALFTIME_CAPS"; + game[ "strings" ][ "overtime" ] = &"MP_OVERTIME_CAPS"; + game[ "strings" ][ "roundend" ] = &"MP_ROUNDEND_CAPS"; + game[ "strings" ][ "intermission" ] = &"MP_INTERMISSION_CAPS"; + game[ "strings" ][ "side_switch" ] = &"MP_SWITCHING_SIDES_CAPS"; + game[ "strings" ][ "match_bonus" ] = &"MP_MATCH_BONUS_IS"; + game[ "strings" ][ "codpoints_match_bonus" ] = &"MP_CODPOINTS_MATCH_BONUS_IS"; + game[ "strings" ][ "wager_winnings" ] = &"MP_WAGER_WINNINGS_ARE"; + game[ "strings" ][ "wager_sidebet_winnings" ] = &"MP_WAGER_SIDEBET_WINNINGS_ARE"; + game[ "strings" ][ "wager_inthemoney" ] = &"MP_WAGER_IN_THE_MONEY_CAPS"; + game[ "strings" ][ "wager_loss" ] = &"MP_WAGER_LOSS_CAPS"; + game[ "strings" ][ "wager_topwinners" ] = &"MP_WAGER_TOPWINNERS"; + game[ "menu_endgameupdate" ] = "endgameupdate"; + precachemenu( game[ "menu_endgameupdate" ] ); + level thread onplayerconnect(); } onplayerconnect() { - for (;;) - { - level waittill( "connecting", player ); - - player thread hintmessagedeaththink(); - player thread lowermessagethink(); - player thread initnotifymessage(); - player thread initcustomgametypeheader(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player thread hintmessagedeaththink(); + player thread lowermessagethink(); + player thread initnotifymessage(); + player thread initcustomgametypeheader(); + } } initcustomgametypeheader() { - font = "default"; - titlesize = 2.5; - self.customgametypeheader = createfontstring( font, titlesize ); - self.customgametypeheader setpoint( "TOP", undefined, 0, 30 ); - self.customgametypeheader.glowalpha = 1; - self.customgametypeheader.hidewheninmenu = 1; - self.customgametypeheader.archived = 0; - self.customgametypeheader.color = ( 1, 1, 0.6 ); - self.customgametypeheader.alpha = 1; - titlesize = 2.0; - self.customgametypesubheader = createfontstring( font, titlesize ); - self.customgametypesubheader setparent( self.customgametypeheader ); - self.customgametypesubheader setpoint( "TOP", "BOTTOM", 0, 0 ); - self.customgametypesubheader.glowalpha = 1; - self.customgametypesubheader.hidewheninmenu = 1; - self.customgametypesubheader.archived = 0; - self.customgametypesubheader.color = ( 1, 1, 0.6 ); - self.customgametypesubheader.alpha = 1; + font = "default"; + titlesize = 2,5; + self.customgametypeheader = createfontstring( font, titlesize ); + self.customgametypeheader setpoint( "TOP", undefined, 0, 30 ); + self.customgametypeheader.glowalpha = 1; + self.customgametypeheader.hidewheninmenu = 1; + self.customgametypeheader.archived = 0; + self.customgametypeheader.color = ( 1, 1, 0,6 ); + self.customgametypeheader.alpha = 1; + titlesize = 2; + self.customgametypesubheader = createfontstring( font, titlesize ); + self.customgametypesubheader setparent( self.customgametypeheader ); + self.customgametypesubheader setpoint( "TOP", "BOTTOM", 0, 0 ); + self.customgametypesubheader.glowalpha = 1; + self.customgametypesubheader.hidewheninmenu = 1; + self.customgametypesubheader.archived = 0; + self.customgametypesubheader.color = ( 1, 1, 0,6 ); + self.customgametypesubheader.alpha = 1; } hintmessage( hinttext, duration ) { - notifydata = spawnstruct(); - notifydata.notifytext = hinttext; - notifydata.duration = duration; - notifymessage( notifydata ); + notifydata = spawnstruct(); + notifydata.notifytext = hinttext; + notifydata.duration = duration; + notifymessage( notifydata ); } hintmessageplayers( players, hinttext, duration ) { - notifydata = spawnstruct(); - notifydata.notifytext = hinttext; - notifydata.duration = duration; - - for ( i = 0; i < players.size; i++ ) - players[i] notifymessage( notifydata ); + notifydata = spawnstruct(); + notifydata.notifytext = hinttext; + notifydata.duration = duration; + i = 0; + while ( i < players.size ) + { + players[ i ] notifymessage( notifydata ); + i++; + } } showinitialfactionpopup( team ) { - self luinotifyevent( &"faction_popup", 1, game["strings"][team + "_name"] ); - maps\mp\gametypes_zm\_hud_message::oldnotifymessage( undefined, undefined, undefined, undefined ); + self luinotifyevent( &"faction_popup", 1, game[ "strings" ][ team + "_name" ] ); + maps/mp/gametypes_zm/_hud_message::oldnotifymessage( undefined, undefined, undefined, undefined ); } initnotifymessage() { - if ( !sessionmodeiszombiesgame() ) - { - if ( self issplitscreen() ) - { - titlesize = 2.0; - textsize = 1.4; - iconsize = 24; - font = "extrabig"; - point = "TOP"; - relativepoint = "BOTTOM"; - yoffset = 30; - xoffset = 30; - } - else - { - titlesize = 2.5; - textsize = 1.75; - iconsize = 30; - font = "extrabig"; - point = "TOP"; - relativepoint = "BOTTOM"; - yoffset = 0; - xoffset = 0; - } - } - else if ( self issplitscreen() ) - { - titlesize = 2.0; - textsize = 1.4; - iconsize = 24; - font = "extrabig"; - point = "TOP"; - relativepoint = "BOTTOM"; - yoffset = 30; - xoffset = 30; - } - else - { - titlesize = 2.5; - textsize = 1.75; - iconsize = 30; - font = "extrabig"; - point = "BOTTOM LEFT"; - relativepoint = "TOP"; - yoffset = 0; - xoffset = 0; - } - - self.notifytitle = createfontstring( font, titlesize ); - self.notifytitle setpoint( point, undefined, xoffset, yoffset ); - self.notifytitle.glowalpha = 1; - self.notifytitle.hidewheninmenu = 1; - self.notifytitle.archived = 0; - self.notifytitle.alpha = 0; - self.notifytext = createfontstring( font, textsize ); - self.notifytext setparent( self.notifytitle ); - self.notifytext setpoint( point, relativepoint, 0, 0 ); - self.notifytext.glowalpha = 1; - self.notifytext.hidewheninmenu = 1; - self.notifytext.archived = 0; - self.notifytext.alpha = 0; - self.notifytext2 = createfontstring( font, textsize ); - self.notifytext2 setparent( self.notifytitle ); - self.notifytext2 setpoint( point, relativepoint, 0, 0 ); - self.notifytext2.glowalpha = 1; - self.notifytext2.hidewheninmenu = 1; - self.notifytext2.archived = 0; - self.notifytext2.alpha = 0; - self.notifyicon = createicon( "white", iconsize, iconsize ); - self.notifyicon setparent( self.notifytext2 ); - self.notifyicon setpoint( point, relativepoint, 0, 0 ); - self.notifyicon.hidewheninmenu = 1; - self.notifyicon.archived = 0; - self.notifyicon.alpha = 0; - self.doingnotify = 0; - self.notifyqueue = []; + if ( !sessionmodeiszombiesgame() ) + { + if ( self issplitscreen() ) + { + titlesize = 2; + textsize = 1,4; + iconsize = 24; + font = "extrabig"; + point = "TOP"; + relativepoint = "BOTTOM"; + yoffset = 30; + xoffset = 30; + } + else + { + titlesize = 2,5; + textsize = 1,75; + iconsize = 30; + font = "extrabig"; + point = "TOP"; + relativepoint = "BOTTOM"; + yoffset = 0; + xoffset = 0; + } + } + else if ( self issplitscreen() ) + { + titlesize = 2; + textsize = 1,4; + iconsize = 24; + font = "extrabig"; + point = "TOP"; + relativepoint = "BOTTOM"; + yoffset = 30; + xoffset = 30; + } + else + { + titlesize = 2,5; + textsize = 1,75; + iconsize = 30; + font = "extrabig"; + point = "BOTTOM LEFT"; + relativepoint = "TOP"; + yoffset = 0; + xoffset = 0; + } + self.notifytitle = createfontstring( font, titlesize ); + self.notifytitle setpoint( point, undefined, xoffset, yoffset ); + self.notifytitle.glowalpha = 1; + self.notifytitle.hidewheninmenu = 1; + self.notifytitle.archived = 0; + self.notifytitle.alpha = 0; + self.notifytext = createfontstring( font, textsize ); + self.notifytext setparent( self.notifytitle ); + self.notifytext setpoint( point, relativepoint, 0, 0 ); + self.notifytext.glowalpha = 1; + self.notifytext.hidewheninmenu = 1; + self.notifytext.archived = 0; + self.notifytext.alpha = 0; + self.notifytext2 = createfontstring( font, textsize ); + self.notifytext2 setparent( self.notifytitle ); + self.notifytext2 setpoint( point, relativepoint, 0, 0 ); + self.notifytext2.glowalpha = 1; + self.notifytext2.hidewheninmenu = 1; + self.notifytext2.archived = 0; + self.notifytext2.alpha = 0; + self.notifyicon = createicon( "white", iconsize, iconsize ); + self.notifyicon setparent( self.notifytext2 ); + self.notifyicon setpoint( point, relativepoint, 0, 0 ); + self.notifyicon.hidewheninmenu = 1; + self.notifyicon.archived = 0; + self.notifyicon.alpha = 0; + self.doingnotify = 0; + self.notifyqueue = []; } oldnotifymessage( titletext, notifytext, iconname, glowcolor, sound, duration ) { - if ( level.wagermatch && !level.teambased ) - return; - - notifydata = spawnstruct(); - notifydata.titletext = titletext; - notifydata.notifytext = notifytext; - notifydata.iconname = iconname; - notifydata.sound = sound; - notifydata.duration = duration; - self.startmessagenotifyqueue[self.startmessagenotifyqueue.size] = notifydata; - self notify( "received award" ); + if ( level.wagermatch && !level.teambased ) + { + return; + } + notifydata = spawnstruct(); + notifydata.titletext = titletext; + notifydata.notifytext = notifytext; + notifydata.iconname = iconname; + notifydata.sound = sound; + notifydata.duration = duration; + self.startmessagenotifyqueue[ self.startmessagenotifyqueue.size ] = notifydata; + self notify( "received award" ); } notifymessage( notifydata ) { - self endon( "death" ); - self endon( "disconnect" ); - self.messagenotifyqueue[self.messagenotifyqueue.size] = notifydata; - self notify( "received award" ); + self endon( "death" ); + self endon( "disconnect" ); + self.messagenotifyqueue[ self.messagenotifyqueue.size ] = notifydata; + self notify( "received award" ); } shownotifymessage( notifydata, duration ) { - self endon( "disconnect" ); - self.doingnotify = 1; - waitrequirevisibility( 0 ); - self notify( "notifyMessageBegin", duration ); - self thread resetoncancel(); - - if ( isdefined( notifydata.sound ) ) - self playlocalsound( notifydata.sound ); - - if ( isdefined( notifydata.musicstate ) ) - self maps\mp\_music::setmusicstate( notifydata.music ); - - if ( isdefined( notifydata.leadersound ) ) - self maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( notifydata.leadersound ); - - if ( isdefined( notifydata.glowcolor ) ) - glowcolor = notifydata.glowcolor; - else - glowcolor = ( 0, 0, 0 ); - - if ( isdefined( notifydata.color ) ) - color = notifydata.color; - else - color = ( 1, 1, 1 ); - - anchorelem = self.notifytitle; - - if ( isdefined( notifydata.titletext ) ) - { - if ( isdefined( notifydata.titlelabel ) ) - self.notifytitle.label = notifydata.titlelabel; - else - self.notifytitle.label = &""; - - if ( isdefined( notifydata.titlelabel ) && !isdefined( notifydata.titleisstring ) ) - self.notifytitle setvalue( notifydata.titletext ); - else - self.notifytitle settext( notifydata.titletext ); - - self.notifytitle setcod7decodefx( 200, int( duration * 1000 ), 600 ); - self.notifytitle.glowcolor = glowcolor; - self.notifytitle.color = color; - self.notifytitle.alpha = 1; - } - - if ( isdefined( notifydata.notifytext ) ) - { - if ( isdefined( notifydata.textlabel ) ) - self.notifytext.label = notifydata.textlabel; - else - self.notifytext.label = &""; - - if ( isdefined( notifydata.textlabel ) && !isdefined( notifydata.textisstring ) ) - self.notifytext setvalue( notifydata.notifytext ); - else - self.notifytext settext( notifydata.notifytext ); - - self.notifytext setcod7decodefx( 100, int( duration * 1000 ), 600 ); - self.notifytext.glowcolor = glowcolor; - self.notifytext.color = color; - self.notifytext.alpha = 1; - anchorelem = self.notifytext; - } - - if ( isdefined( notifydata.notifytext2 ) ) - { - if ( self issplitscreen() ) - { - if ( isdefined( notifydata.text2label ) ) - self iprintlnbold( notifydata.text2label, notifydata.notifytext2 ); - else - self iprintlnbold( notifydata.notifytext2 ); - } - else - { - self.notifytext2 setparent( anchorelem ); - - if ( isdefined( notifydata.text2label ) ) - self.notifytext2.label = notifydata.text2label; - else - self.notifytext2.label = &""; - - self.notifytext2 settext( notifydata.notifytext2 ); - self.notifytext2 setpulsefx( 100, int( duration * 1000 ), 1000 ); - self.notifytext2.glowcolor = glowcolor; - self.notifytext2.color = color; - self.notifytext2.alpha = 1; - anchorelem = self.notifytext2; - } - } - - if ( isdefined( notifydata.iconname ) ) - { - iconwidth = 60; - iconheight = 60; - - if ( isdefined( notifydata.iconwidth ) ) - iconwidth = notifydata.iconwidth; - - if ( isdefined( notifydata.iconheight ) ) - iconheight = notifydata.iconheight; - - self.notifyicon setparent( anchorelem ); - self.notifyicon setshader( notifydata.iconname, iconwidth, iconheight ); - self.notifyicon.alpha = 0; - self.notifyicon fadeovertime( 1.0 ); - self.notifyicon.alpha = 1; - waitrequirevisibility( duration ); - self.notifyicon fadeovertime( 0.75 ); - self.notifyicon.alpha = 0; - } - else - waitrequirevisibility( duration ); - - self notify( "notifyMessageDone" ); - self.doingnotify = 0; + self endon( "disconnect" ); + self.doingnotify = 1; + waitrequirevisibility( 0 ); + self notify( "notifyMessageBegin" ); + self thread resetoncancel(); + if ( isDefined( notifydata.sound ) ) + { + self playlocalsound( notifydata.sound ); + } + if ( isDefined( notifydata.musicstate ) ) + { + self maps/mp/_music::setmusicstate( notifydata.music ); + } + if ( isDefined( notifydata.leadersound ) ) + { + self maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( notifydata.leadersound ); + } + if ( isDefined( notifydata.glowcolor ) ) + { + glowcolor = notifydata.glowcolor; + } + else + { + glowcolor = ( 1, 1, 1 ); + } + if ( isDefined( notifydata.color ) ) + { + color = notifydata.color; + } + else + { + color = ( 1, 1, 1 ); + } + anchorelem = self.notifytitle; + if ( isDefined( notifydata.titletext ) ) + { + if ( isDefined( notifydata.titlelabel ) ) + { + self.notifytitle.label = notifydata.titlelabel; + } + else + { + self.notifytitle.label = &""; + } + if ( isDefined( notifydata.titlelabel ) && !isDefined( notifydata.titleisstring ) ) + { + self.notifytitle setvalue( notifydata.titletext ); + } + else + { + self.notifytitle settext( notifydata.titletext ); + } + self.notifytitle setcod7decodefx( 200, int( duration * 1000 ), 600 ); + self.notifytitle.glowcolor = glowcolor; + self.notifytitle.color = color; + self.notifytitle.alpha = 1; + } + if ( isDefined( notifydata.notifytext ) ) + { + if ( isDefined( notifydata.textlabel ) ) + { + self.notifytext.label = notifydata.textlabel; + } + else + { + self.notifytext.label = &""; + } + if ( isDefined( notifydata.textlabel ) && !isDefined( notifydata.textisstring ) ) + { + self.notifytext setvalue( notifydata.notifytext ); + } + else + { + self.notifytext settext( notifydata.notifytext ); + } + self.notifytext setcod7decodefx( 100, int( duration * 1000 ), 600 ); + self.notifytext.glowcolor = glowcolor; + self.notifytext.color = color; + self.notifytext.alpha = 1; + anchorelem = self.notifytext; + } + if ( isDefined( notifydata.notifytext2 ) ) + { + if ( self issplitscreen() ) + { + if ( isDefined( notifydata.text2label ) ) + { + self iprintlnbold( notifydata.text2label, notifydata.notifytext2 ); + } + else + { + self iprintlnbold( notifydata.notifytext2 ); + } + } + else + { + self.notifytext2 setparent( anchorelem ); + if ( isDefined( notifydata.text2label ) ) + { + self.notifytext2.label = notifydata.text2label; + } + else + { + self.notifytext2.label = &""; + } + self.notifytext2 settext( notifydata.notifytext2 ); + self.notifytext2 setpulsefx( 100, int( duration * 1000 ), 1000 ); + self.notifytext2.glowcolor = glowcolor; + self.notifytext2.color = color; + self.notifytext2.alpha = 1; + anchorelem = self.notifytext2; + } + } + if ( isDefined( notifydata.iconname ) ) + { + iconwidth = 60; + iconheight = 60; + if ( isDefined( notifydata.iconwidth ) ) + { + iconwidth = notifydata.iconwidth; + } + if ( isDefined( notifydata.iconheight ) ) + { + iconheight = notifydata.iconheight; + } + self.notifyicon setparent( anchorelem ); + self.notifyicon setshader( notifydata.iconname, iconwidth, iconheight ); + self.notifyicon.alpha = 0; + self.notifyicon fadeovertime( 1 ); + self.notifyicon.alpha = 1; + waitrequirevisibility( duration ); + self.notifyicon fadeovertime( 0,75 ); + self.notifyicon.alpha = 0; + } + else + { + waitrequirevisibility( duration ); + } + self notify( "notifyMessageDone" ); + self.doingnotify = 0; } waitrequirevisibility( waittime ) { - interval = 0.05; - - while ( !self canreadtext() ) - wait( interval ); - - while ( waittime > 0 ) - { - wait( interval ); - - if ( self canreadtext() ) - waittime -= interval; - } + interval = 0,05; + while ( !self canreadtext() ) + { + wait interval; + } + while ( waittime > 0 ) + { + wait interval; + if ( self canreadtext() ) + { + waittime -= interval; + } + } } canreadtext() { - return 1; + return 1; } resetondeath() { - self endon( "notifyMessageDone" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - self waittill( "death" ); - - resetnotify(); + self endon( "notifyMessageDone" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self waittill( "death" ); + resetnotify(); } resetoncancel() { - self notify( "resetOnCancel" ); - self endon( "resetOnCancel" ); - self endon( "notifyMessageDone" ); - self endon( "disconnect" ); - - level waittill( "cancel_notify" ); - - resetnotify(); + self notify( "resetOnCancel" ); + self endon( "resetOnCancel" ); + self endon( "notifyMessageDone" ); + self endon( "disconnect" ); + level waittill( "cancel_notify" ); + resetnotify(); } resetnotify() { - self.notifytitle.alpha = 0; - self.notifytext.alpha = 0; - self.notifyicon.alpha = 0; - self.doingnotify = 0; + self.notifytitle.alpha = 0; + self.notifytext.alpha = 0; + self.notifyicon.alpha = 0; + self.doingnotify = 0; } hintmessagedeaththink() { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "death" ); - - if ( isdefined( self.hintmessage ) ) - self.hintmessage destroyelem(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "death" ); + if ( isDefined( self.hintmessage ) ) + { + self.hintmessage destroyelem(); + } + } } lowermessagethink() { - self endon( "disconnect" ); - self.lowermessage = createfontstring( "default", level.lowertextfontsize ); - self.lowermessage setpoint( "CENTER", level.lowertextyalign, 0, level.lowertexty ); - self.lowermessage settext( "" ); - self.lowermessage.archived = 0; - timerfontsize = 1.5; - - if ( self issplitscreen() ) - timerfontsize = 1.4; - - self.lowertimer = createfontstring( "default", timerfontsize ); - self.lowertimer setparent( self.lowermessage ); - self.lowertimer setpoint( "TOP", "BOTTOM", 0, 0 ); - self.lowertimer settext( "" ); - self.lowertimer.archived = 0; + self endon( "disconnect" ); + self.lowermessage = createfontstring( "default", level.lowertextfontsize ); + self.lowermessage setpoint( "CENTER", level.lowertextyalign, 0, level.lowertexty ); + self.lowermessage settext( "" ); + self.lowermessage.archived = 0; + timerfontsize = 1,5; + if ( self issplitscreen() ) + { + timerfontsize = 1,4; + } + self.lowertimer = createfontstring( "default", timerfontsize ); + self.lowertimer setparent( self.lowermessage ); + self.lowertimer setpoint( "TOP", "BOTTOM", 0, 0 ); + self.lowertimer settext( "" ); + self.lowertimer.archived = 0; } setmatchscorehudelemforteam( team ) { - if ( level.roundscorecarry ) - self setvalue( getteamscore( team ) ); - else - self setvalue( getroundswon( team ) ); + if ( level.roundscorecarry ) + { + self setvalue( getteamscore( team ) ); + } + else + { + self setvalue( getroundswon( team ) ); + } } teamoutcomenotify( winner, isround, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - team = self.pers["team"]; - - if ( isdefined( team ) && team == "spectator" ) - { - for ( i = 0; i < level.players.size; i++ ) - { - if ( self.currentspectatingclient == level.players[i].clientid ) - { - team = level.players[i].pers["team"]; - break; - } - } - } - - if ( !isdefined( team ) || !isdefined( level.teams[team] ) ) - team = "allies"; - - while ( self.doingnotify ) - wait 0.05; - - self endon( "reset_outcome" ); - headerfont = "extrabig"; - font = "default"; - - if ( self issplitscreen() ) - { - titlesize = 2.0; - textsize = 1.5; - iconsize = 30; - spacing = 10; - } - else - { - titlesize = 3.0; - textsize = 2.0; - iconsize = 70; - spacing = 25; - } - - duration = 60000; - outcometitle = createfontstring( headerfont, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, 30 ); - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometext = createfontstring( font, 2.0 ); - outcometext setparent( outcometitle ); - outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); - outcometext.glowalpha = 1; - outcometext.hidewheninmenu = 0; - outcometext.archived = 0; - - if ( winner == "halftime" ) - { - outcometitle settext( game["strings"]["halftime"] ); - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "intermission" ) - { - outcometitle settext( game["strings"]["intermission"] ); - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "roundend" ) - { - outcometitle settext( game["strings"]["roundend"] ); - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "overtime" ) - { - outcometitle settext( game["strings"]["overtime"] ); - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "tie" ) - { - if ( isround ) - outcometitle settext( game["strings"]["round_draw"] ); - else - outcometitle settext( game["strings"]["draw"] ); - - outcometitle.color = ( 0.29, 0.61, 0.7 ); - winner = "allies"; - } - else if ( isdefined( self.pers["team"] ) && winner == team ) - { - if ( isround ) - outcometitle settext( game["strings"]["round_win"] ); - else - outcometitle settext( game["strings"]["victory"] ); - - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else - { - if ( isround ) - outcometitle settext( game["strings"]["round_loss"] ); - else - outcometitle settext( game["strings"]["defeat"] ); - - outcometitle.color = ( 0.73, 0.29, 0.19 ); - } - - outcometext settext( endreasontext ); - outcometitle setcod7decodefx( 200, duration, 600 ); - outcometext setpulsefx( 100, duration, 1000 ); - iconspacing = 100; - currentx = ( level.teamcount - 1 ) * -1 * iconspacing / 2; - teamicons = []; - teamicons[team] = createicon( game["icons"][team], iconsize, iconsize ); - teamicons[team] setparent( outcometext ); - teamicons[team] setpoint( "TOP", "BOTTOM", currentx, spacing ); - teamicons[team].hidewheninmenu = 0; - teamicons[team].archived = 0; - teamicons[team].alpha = 0; - teamicons[team] fadeovertime( 0.5 ); - teamicons[team].alpha = 1; - currentx += iconspacing; - - foreach ( enemyteam in level.teams ) - { - if ( team == enemyteam ) - continue; - - teamicons[enemyteam] = createicon( game["icons"][enemyteam], iconsize, iconsize ); - teamicons[enemyteam] setparent( outcometext ); - teamicons[enemyteam] setpoint( "TOP", "BOTTOM", currentx, spacing ); - teamicons[enemyteam].hidewheninmenu = 0; - teamicons[enemyteam].archived = 0; - teamicons[enemyteam].alpha = 0; - teamicons[enemyteam] fadeovertime( 0.5 ); - teamicons[enemyteam].alpha = 1; - currentx += iconspacing; - } - - teamscores = []; - teamscores[team] = createfontstring( font, titlesize ); - teamscores[team] setparent( teamicons[team] ); - teamscores[team] setpoint( "TOP", "BOTTOM", 0, spacing ); - teamscores[team].glowalpha = 1; - - if ( isround ) - teamscores[team] setvalue( getteamscore( team ) ); - else - teamscores[team] [[ level.setmatchscorehudelemforteam ]]( team ); - - teamscores[team].hidewheninmenu = 0; - teamscores[team].archived = 0; - teamscores[team] setpulsefx( 100, duration, 1000 ); - - foreach ( enemyteam in level.teams ) - { - if ( team == enemyteam ) - continue; - - teamscores[enemyteam] = createfontstring( headerfont, titlesize ); - teamscores[enemyteam] setparent( teamicons[enemyteam] ); - teamscores[enemyteam] setpoint( "TOP", "BOTTOM", 0, spacing ); - teamscores[enemyteam].glowalpha = 1; - - if ( isround ) - teamscores[enemyteam] setvalue( getteamscore( enemyteam ) ); - else - teamscores[enemyteam] [[ level.setmatchscorehudelemforteam ]]( enemyteam ); - - teamscores[enemyteam].hidewheninmenu = 0; - teamscores[enemyteam].archived = 0; - teamscores[enemyteam] setpulsefx( 100, duration, 1000 ); - } - - font = "objective"; - matchbonus = undefined; - - if ( isdefined( self.matchbonus ) ) - { - matchbonus = createfontstring( font, 2.0 ); - matchbonus setparent( outcometext ); - matchbonus setpoint( "TOP", "BOTTOM", 0, iconsize + spacing * 3 + teamscores[team].height ); - matchbonus.glowalpha = 1; - matchbonus.hidewheninmenu = 0; - matchbonus.archived = 0; - matchbonus.label = game["strings"]["match_bonus"]; - matchbonus setvalue( self.matchbonus ); - } - - self thread resetoutcomenotify( teamicons, teamscores, outcometitle, outcometext ); + self endon( "disconnect" ); + self notify( "reset_outcome" ); + team = self.pers[ "team" ]; + while ( isDefined( team ) && team == "spectator" ) + { + i = 0; + while ( i < level.players.size ) + { + if ( self.currentspectatingclient == level.players[ i ].clientid ) + { + team = level.players[ i ].pers[ "team" ]; + break; + } + else + { + i++; + } + } + } + if ( !isDefined( team ) || !isDefined( level.teams[ team ] ) ) + { + team = "allies"; + } + while ( self.doingnotify ) + { + wait 0,05; + } + self endon( "reset_outcome" ); + headerfont = "extrabig"; + font = "default"; + if ( self issplitscreen() ) + { + titlesize = 2; + textsize = 1,5; + iconsize = 30; + spacing = 10; + } + else + { + titlesize = 3; + textsize = 2; + iconsize = 70; + spacing = 25; + } + duration = 60000; + outcometitle = createfontstring( headerfont, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, 30 ); + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometext = createfontstring( font, 2 ); + outcometext setparent( outcometitle ); + outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); + outcometext.glowalpha = 1; + outcometext.hidewheninmenu = 0; + outcometext.archived = 0; + if ( winner == "halftime" ) + { + outcometitle settext( game[ "strings" ][ "halftime" ] ); + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "intermission" ) + { + outcometitle settext( game[ "strings" ][ "intermission" ] ); + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "roundend" ) + { + outcometitle settext( game[ "strings" ][ "roundend" ] ); + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "overtime" ) + { + outcometitle settext( game[ "strings" ][ "overtime" ] ); + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "tie" ) + { + if ( isround ) + { + outcometitle settext( game[ "strings" ][ "round_draw" ] ); + } + else + { + outcometitle settext( game[ "strings" ][ "draw" ] ); + } + outcometitle.color = ( 0,29, 0,61, 0,7 ); + winner = "allies"; + } + else if ( isDefined( self.pers[ "team" ] ) && winner == team ) + { + if ( isround ) + { + outcometitle settext( game[ "strings" ][ "round_win" ] ); + } + else + { + outcometitle settext( game[ "strings" ][ "victory" ] ); + } + outcometitle.color = ( 0,42, 0,68, 0,46 ); + } + else + { + if ( isround ) + { + outcometitle settext( game[ "strings" ][ "round_loss" ] ); + } + else + { + outcometitle settext( game[ "strings" ][ "defeat" ] ); + } + outcometitle.color = ( 0,73, 0,29, 0,19 ); + } + outcometext settext( endreasontext ); + outcometitle setcod7decodefx( 200, duration, 600 ); + outcometext setpulsefx( 100, duration, 1000 ); + iconspacing = 100; + currentx = ( ( level.teamcount - 1 ) * -1 * iconspacing ) / 2; + teamicons = []; + teamicons[ team ] = createicon( game[ "icons" ][ team ], iconsize, iconsize ); + teamicons[ team ] setparent( outcometext ); + teamicons[ team ] setpoint( "TOP", "BOTTOM", currentx, spacing ); + teamicons[ team ].hidewheninmenu = 0; + teamicons[ team ].archived = 0; + teamicons[ team ].alpha = 0; + teamicons[ team ] fadeovertime( 0,5 ); + teamicons[ team ].alpha = 1; + currentx += iconspacing; + _a607 = level.teams; + _k607 = getFirstArrayKey( _a607 ); + while ( isDefined( _k607 ) ) + { + enemyteam = _a607[ _k607 ]; + if ( team == enemyteam ) + { + } + else + { + teamicons[ enemyteam ] = createicon( game[ "icons" ][ enemyteam ], iconsize, iconsize ); + teamicons[ enemyteam ] setparent( outcometext ); + teamicons[ enemyteam ] setpoint( "TOP", "BOTTOM", currentx, spacing ); + teamicons[ enemyteam ].hidewheninmenu = 0; + teamicons[ enemyteam ].archived = 0; + teamicons[ enemyteam ].alpha = 0; + teamicons[ enemyteam ] fadeovertime( 0,5 ); + teamicons[ enemyteam ].alpha = 1; + currentx += iconspacing; + } + _k607 = getNextArrayKey( _a607, _k607 ); + } + teamscores = []; + teamscores[ team ] = createfontstring( font, titlesize ); + teamscores[ team ] setparent( teamicons[ team ] ); + teamscores[ team ] setpoint( "TOP", "BOTTOM", 0, spacing ); + teamscores[ team ].glowalpha = 1; + if ( isround ) + { + teamscores[ team ] setvalue( getteamscore( team ) ); + } + else + { + teamscores[ team ] [[ level.setmatchscorehudelemforteam ]]( team ); + } + teamscores[ team ].hidewheninmenu = 0; + teamscores[ team ].archived = 0; + teamscores[ team ] setpulsefx( 100, duration, 1000 ); + _a641 = level.teams; + _k641 = getFirstArrayKey( _a641 ); + while ( isDefined( _k641 ) ) + { + enemyteam = _a641[ _k641 ]; + if ( team == enemyteam ) + { + } + else + { + teamscores[ enemyteam ] = createfontstring( headerfont, titlesize ); + teamscores[ enemyteam ] setparent( teamicons[ enemyteam ] ); + teamscores[ enemyteam ] setpoint( "TOP", "BOTTOM", 0, spacing ); + teamscores[ enemyteam ].glowalpha = 1; + if ( isround ) + { + teamscores[ enemyteam ] setvalue( getteamscore( enemyteam ) ); + } + else + { + teamscores[ enemyteam ] [[ level.setmatchscorehudelemforteam ]]( enemyteam ); + } + teamscores[ enemyteam ].hidewheninmenu = 0; + teamscores[ enemyteam ].archived = 0; + teamscores[ enemyteam ] setpulsefx( 100, duration, 1000 ); + } + _k641 = getNextArrayKey( _a641, _k641 ); + } + font = "objective"; + matchbonus = undefined; + if ( isDefined( self.matchbonus ) ) + { + matchbonus = createfontstring( font, 2 ); + matchbonus setparent( outcometext ); + matchbonus setpoint( "TOP", "BOTTOM", 0, iconsize + ( spacing * 3 ) + teamscores[ team ].height ); + matchbonus.glowalpha = 1; + matchbonus.hidewheninmenu = 0; + matchbonus.archived = 0; + matchbonus.label = game[ "strings" ][ "match_bonus" ]; + matchbonus setvalue( self.matchbonus ); + } + self thread resetoutcomenotify( teamicons, teamscores, outcometitle, outcometext ); } teamoutcomenotifyzombie( winner, isround, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - team = self.pers["team"]; - - if ( isdefined( team ) && team == "spectator" ) - { - for ( i = 0; i < level.players.size; i++ ) - { - if ( self.currentspectatingclient == level.players[i].clientid ) - { - team = level.players[i].pers["team"]; - break; - } - } - } - - if ( !isdefined( team ) || !isdefined( level.teams[team] ) ) - team = "allies"; - - while ( self.doingnotify ) - wait 0.05; - - self endon( "reset_outcome" ); - - if ( self issplitscreen() ) - { - titlesize = 2.0; - spacing = 10; - font = "default"; - } - else - { - titlesize = 3.0; - spacing = 50; - font = "objective"; - } - - outcometitle = createfontstring( font, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, spacing ); - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometitle settext( endreasontext ); - outcometitle setpulsefx( 100, 60000, 1000 ); - self thread resetoutcomenotify( undefined, undefined, outcometitle ); + self endon( "disconnect" ); + self notify( "reset_outcome" ); + team = self.pers[ "team" ]; + while ( isDefined( team ) && team == "spectator" ) + { + i = 0; + while ( i < level.players.size ) + { + if ( self.currentspectatingclient == level.players[ i ].clientid ) + { + team = level.players[ i ].pers[ "team" ]; + break; + } + else + { + i++; + } + } + } + if ( !isDefined( team ) || !isDefined( level.teams[ team ] ) ) + { + team = "allies"; + } + while ( self.doingnotify ) + { + wait 0,05; + } + self endon( "reset_outcome" ); + if ( self issplitscreen() ) + { + titlesize = 2; + spacing = 10; + font = "default"; + } + else + { + titlesize = 3; + spacing = 50; + font = "objective"; + } + outcometitle = createfontstring( font, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, spacing ); + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometitle settext( endreasontext ); + outcometitle setpulsefx( 100, 60000, 1000 ); + self thread resetoutcomenotify( undefined, undefined, outcometitle ); } outcomenotify( winner, isroundend, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - - while ( self.doingnotify ) - wait 0.05; - - self endon( "reset_outcome" ); - headerfont = "extrabig"; - font = "default"; - - if ( self issplitscreen() ) - { - titlesize = 2.0; - winnersize = 1.5; - othersize = 1.5; - iconsize = 30; - spacing = 10; - } - else - { - titlesize = 3.0; - winnersize = 2.0; - othersize = 1.5; - iconsize = 30; - spacing = 20; - } - - duration = 60000; - players = level.placement["all"]; - outcometitle = createfontstring( headerfont, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, spacing ); - - if ( !maps\mp\_utility::isoneround() && !isroundend ) - outcometitle settext( game["strings"]["game_over"] ); - else if ( isdefined( players[1] ) && players[0].score == players[1].score && players[0].deaths == players[1].deaths && ( self == players[0] || self == players[1] ) ) - outcometitle settext( game["strings"]["tie"] ); - else if ( isdefined( players[2] ) && players[0].score == players[2].score && players[0].deaths == players[2].deaths && self == players[2] ) - outcometitle settext( game["strings"]["tie"] ); - else if ( isdefined( players[0] ) && self == players[0] ) - { - outcometitle settext( game["strings"]["victory"] ); - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else - { - outcometitle settext( game["strings"]["defeat"] ); - outcometitle.color = ( 0.73, 0.29, 0.19 ); - } - - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometitle setcod7decodefx( 200, duration, 600 ); - outcometext = createfontstring( font, 2.0 ); - outcometext setparent( outcometitle ); - outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); - outcometext.glowalpha = 1; - outcometext.hidewheninmenu = 0; - outcometext.archived = 0; - outcometext settext( endreasontext ); - firsttitle = createfontstring( font, winnersize ); - firsttitle setparent( outcometext ); - firsttitle setpoint( "TOP", "BOTTOM", 0, spacing ); - firsttitle.glowalpha = 1; - firsttitle.hidewheninmenu = 0; - firsttitle.archived = 0; - - if ( isdefined( players[0] ) ) - { - firsttitle.label = &"MP_FIRSTPLACE_NAME"; - firsttitle setplayernamestring( players[0] ); - firsttitle setcod7decodefx( 175, duration, 600 ); - } - - secondtitle = createfontstring( font, othersize ); - secondtitle setparent( firsttitle ); - secondtitle setpoint( "TOP", "BOTTOM", 0, spacing ); - secondtitle.glowalpha = 1; - secondtitle.hidewheninmenu = 0; - secondtitle.archived = 0; - - if ( isdefined( players[1] ) ) - { - secondtitle.label = &"MP_SECONDPLACE_NAME"; - secondtitle setplayernamestring( players[1] ); - secondtitle setcod7decodefx( 175, duration, 600 ); - } - - thirdtitle = createfontstring( font, othersize ); - thirdtitle setparent( secondtitle ); - thirdtitle setpoint( "TOP", "BOTTOM", 0, spacing ); - thirdtitle setparent( secondtitle ); - thirdtitle.glowalpha = 1; - thirdtitle.hidewheninmenu = 0; - thirdtitle.archived = 0; - - if ( isdefined( players[2] ) ) - { - thirdtitle.label = &"MP_THIRDPLACE_NAME"; - thirdtitle setplayernamestring( players[2] ); - thirdtitle setcod7decodefx( 175, duration, 600 ); - } - - matchbonus = createfontstring( font, 2.0 ); - matchbonus setparent( thirdtitle ); - matchbonus setpoint( "TOP", "BOTTOM", 0, spacing ); - matchbonus.glowalpha = 1; - matchbonus.hidewheninmenu = 0; - matchbonus.archived = 0; - - if ( isdefined( self.matchbonus ) ) - { - matchbonus.label = game["strings"]["match_bonus"]; - matchbonus setvalue( self.matchbonus ); - } - - self thread updateoutcome( firsttitle, secondtitle, thirdtitle ); - self thread resetoutcomenotify( undefined, undefined, outcometitle, outcometext, firsttitle, secondtitle, thirdtitle, matchbonus ); + self endon( "disconnect" ); + self notify( "reset_outcome" ); + while ( self.doingnotify ) + { + wait 0,05; + } + self endon( "reset_outcome" ); + headerfont = "extrabig"; + font = "default"; + if ( self issplitscreen() ) + { + titlesize = 2; + winnersize = 1,5; + othersize = 1,5; + iconsize = 30; + spacing = 10; + } + else + { + titlesize = 3; + winnersize = 2; + othersize = 1,5; + iconsize = 30; + spacing = 20; + } + duration = 60000; + players = level.placement[ "all" ]; + outcometitle = createfontstring( headerfont, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, spacing ); + if ( !maps/mp/_utility::isoneround() && !isroundend ) + { + outcometitle settext( game[ "strings" ][ "game_over" ] ); + } + else + { + if ( isDefined( players[ 1 ] ) && players[ 0 ].score == players[ 1 ].score && players[ 0 ].deaths == players[ 1 ].deaths || self == players[ 0 ] && self == players[ 1 ] ) + { + outcometitle settext( game[ "strings" ][ "tie" ] ); + } + else + { + if ( isDefined( players[ 2 ] ) && players[ 0 ].score == players[ 2 ].score && players[ 0 ].deaths == players[ 2 ].deaths && self == players[ 2 ] ) + { + outcometitle settext( game[ "strings" ][ "tie" ] ); + } + else + { + if ( isDefined( players[ 0 ] ) && self == players[ 0 ] ) + { + outcometitle settext( game[ "strings" ][ "victory" ] ); + outcometitle.color = ( 0,42, 0,68, 0,46 ); + } + else + { + outcometitle settext( game[ "strings" ][ "defeat" ] ); + outcometitle.color = ( 0,73, 0,29, 0,19 ); + } + } + } + } + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometitle setcod7decodefx( 200, duration, 600 ); + outcometext = createfontstring( font, 2 ); + outcometext setparent( outcometitle ); + outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); + outcometext.glowalpha = 1; + outcometext.hidewheninmenu = 0; + outcometext.archived = 0; + outcometext settext( endreasontext ); + firsttitle = createfontstring( font, winnersize ); + firsttitle setparent( outcometext ); + firsttitle setpoint( "TOP", "BOTTOM", 0, spacing ); + firsttitle.glowalpha = 1; + firsttitle.hidewheninmenu = 0; + firsttitle.archived = 0; + if ( isDefined( players[ 0 ] ) ) + { + firsttitle.label = &"MP_FIRSTPLACE_NAME"; + firsttitle setplayernamestring( players[ 0 ] ); + firsttitle setcod7decodefx( 175, duration, 600 ); + } + secondtitle = createfontstring( font, othersize ); + secondtitle setparent( firsttitle ); + secondtitle setpoint( "TOP", "BOTTOM", 0, spacing ); + secondtitle.glowalpha = 1; + secondtitle.hidewheninmenu = 0; + secondtitle.archived = 0; + if ( isDefined( players[ 1 ] ) ) + { + secondtitle.label = &"MP_SECONDPLACE_NAME"; + secondtitle setplayernamestring( players[ 1 ] ); + secondtitle setcod7decodefx( 175, duration, 600 ); + } + thirdtitle = createfontstring( font, othersize ); + thirdtitle setparent( secondtitle ); + thirdtitle setpoint( "TOP", "BOTTOM", 0, spacing ); + thirdtitle setparent( secondtitle ); + thirdtitle.glowalpha = 1; + thirdtitle.hidewheninmenu = 0; + thirdtitle.archived = 0; + if ( isDefined( players[ 2 ] ) ) + { + thirdtitle.label = &"MP_THIRDPLACE_NAME"; + thirdtitle setplayernamestring( players[ 2 ] ); + thirdtitle setcod7decodefx( 175, duration, 600 ); + } + matchbonus = createfontstring( font, 2 ); + matchbonus setparent( thirdtitle ); + matchbonus setpoint( "TOP", "BOTTOM", 0, spacing ); + matchbonus.glowalpha = 1; + matchbonus.hidewheninmenu = 0; + matchbonus.archived = 0; + if ( isDefined( self.matchbonus ) ) + { + matchbonus.label = game[ "strings" ][ "match_bonus" ]; + matchbonus setvalue( self.matchbonus ); + } + self thread updateoutcome( firsttitle, secondtitle, thirdtitle ); + self thread resetoutcomenotify( undefined, undefined, outcometitle, outcometext, firsttitle, secondtitle, thirdtitle, matchbonus ); } wageroutcomenotify( winner, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - - while ( self.doingnotify ) - wait 0.05; - - setmatchflag( "enable_popups", 0 ); - self endon( "reset_outcome" ); - headerfont = "extrabig"; - font = "objective"; - - if ( self issplitscreen() ) - { - titlesize = 2.0; - winnersize = 1.5; - othersize = 1.5; - iconsize = 30; - spacing = 2; - } - else - { - titlesize = 3.0; - winnersize = 2.0; - othersize = 1.5; - iconsize = 30; - spacing = 20; - } - - halftime = 0; - - if ( isdefined( level.sidebet ) && level.sidebet ) - halftime = 1; - - duration = 60000; - players = level.placement["all"]; - outcometitle = createfontstring( headerfont, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, spacing ); - - if ( halftime ) - { - outcometitle settext( game["strings"]["intermission"] ); - outcometitle.color = ( 1, 1, 0 ); - outcometitle.glowcolor = ( 1, 0, 0 ); - } - else if ( isdefined( level.dontcalcwagerwinnings ) && level.dontcalcwagerwinnings == 1 ) - { - outcometitle settext( game["strings"]["wager_topwinners"] ); - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else if ( isdefined( self.wagerwinnings ) && self.wagerwinnings > 0 ) - { - outcometitle settext( game["strings"]["wager_inthemoney"] ); - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else - { - outcometitle settext( game["strings"]["wager_loss"] ); - outcometitle.color = ( 0.73, 0.29, 0.19 ); - } - - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometitle setcod7decodefx( 200, duration, 600 ); - outcometext = createfontstring( font, 2.0 ); - outcometext setparent( outcometitle ); - outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); - outcometext.glowalpha = 1; - outcometext.hidewheninmenu = 0; - outcometext.archived = 0; - outcometext settext( endreasontext ); - playernamehudelems = []; - playercphudelems = []; - numplayers = players.size; - - for ( i = 0; i < numplayers; i++ ) - { - if ( !halftime && isdefined( players[i] ) ) - { - secondtitle = createfontstring( font, othersize ); - - if ( playernamehudelems.size == 0 ) - { - secondtitle setparent( outcometext ); - secondtitle setpoint( "TOP_LEFT", "BOTTOM", -175, spacing * 3 ); - } - else - { - secondtitle setparent( playernamehudelems[playernamehudelems.size - 1] ); - secondtitle setpoint( "TOP_LEFT", "BOTTOM_LEFT", 0, spacing ); - } - - secondtitle.glowalpha = 1; - secondtitle.hidewheninmenu = 0; - secondtitle.archived = 0; - secondtitle.label = &"MP_WAGER_PLACE_NAME"; - secondtitle.playernum = i; - secondtitle setplayernamestring( players[i] ); - playernamehudelems[playernamehudelems.size] = secondtitle; - secondcp = createfontstring( font, othersize ); - secondcp setparent( secondtitle ); - secondcp setpoint( "TOP_RIGHT", "TOP_LEFT", 350, 0 ); - secondcp.glowalpha = 1; - secondcp.hidewheninmenu = 0; - secondcp.archived = 0; - secondcp.label = &"MENU_POINTS"; - secondcp.currentvalue = 0; - - if ( isdefined( players[i].wagerwinnings ) ) - secondcp.targetvalue = players[i].wagerwinnings; - else - secondcp.targetvalue = 0; - - if ( secondcp.targetvalue > 0 ) - secondcp.color = ( 0.42, 0.68, 0.46 ); - - secondcp setvalue( 0 ); - playercphudelems[playercphudelems.size] = secondcp; - } - } - - self thread updatewageroutcome( playernamehudelems, playercphudelems ); - self thread resetwageroutcomenotify( playernamehudelems, playercphudelems, outcometitle, outcometext ); - - if ( halftime ) - return; - - stillupdating = 1; - countupduration = 2; - cpincrement = 9999; - - if ( isdefined( playercphudelems[0] ) ) - { - cpincrement = int( playercphudelems[0].targetvalue / ( countupduration / 0.05 ) ); - - if ( cpincrement < 1 ) - cpincrement = 1; - } - - while ( stillupdating ) - { - stillupdating = 0; - - for ( i = 0; i < playercphudelems.size; i++ ) - { - if ( isdefined( playercphudelems[i] ) && playercphudelems[i].currentvalue < playercphudelems[i].targetvalue ) - { - playercphudelems[i].currentvalue += cpincrement; - - if ( playercphudelems[i].currentvalue > playercphudelems[i].targetvalue ) - playercphudelems[i].currentvalue = playercphudelems[i].targetvalue; - - playercphudelems[i] setvalue( playercphudelems[i].currentvalue ); - stillupdating = 1; - } - } - - wait 0.05; - } + self endon( "disconnect" ); + self notify( "reset_outcome" ); + while ( self.doingnotify ) + { + wait 0,05; + } + setmatchflag( "enable_popups", 0 ); + self endon( "reset_outcome" ); + headerfont = "extrabig"; + font = "objective"; + if ( self issplitscreen() ) + { + titlesize = 2; + winnersize = 1,5; + othersize = 1,5; + iconsize = 30; + spacing = 2; + } + else + { + titlesize = 3; + winnersize = 2; + othersize = 1,5; + iconsize = 30; + spacing = 20; + } + halftime = 0; + if ( isDefined( level.sidebet ) && level.sidebet ) + { + halftime = 1; + } + duration = 60000; + players = level.placement[ "all" ]; + outcometitle = createfontstring( headerfont, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, spacing ); + if ( halftime ) + { + outcometitle settext( game[ "strings" ][ "intermission" ] ); + outcometitle.color = ( 1, 1, 1 ); + outcometitle.glowcolor = ( 1, 1, 1 ); + } + else if ( isDefined( level.dontcalcwagerwinnings ) && level.dontcalcwagerwinnings == 1 ) + { + outcometitle settext( game[ "strings" ][ "wager_topwinners" ] ); + outcometitle.color = ( 0,42, 0,68, 0,46 ); + } + else + { + if ( isDefined( self.wagerwinnings ) && self.wagerwinnings > 0 ) + { + outcometitle settext( game[ "strings" ][ "wager_inthemoney" ] ); + outcometitle.color = ( 0,42, 0,68, 0,46 ); + } + else + { + outcometitle settext( game[ "strings" ][ "wager_loss" ] ); + outcometitle.color = ( 0,73, 0,29, 0,19 ); + } + } + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometitle setcod7decodefx( 200, duration, 600 ); + outcometext = createfontstring( font, 2 ); + outcometext setparent( outcometitle ); + outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); + outcometext.glowalpha = 1; + outcometext.hidewheninmenu = 0; + outcometext.archived = 0; + outcometext settext( endreasontext ); + playernamehudelems = []; + playercphudelems = []; + numplayers = players.size; + i = 0; + while ( i < numplayers ) + { + if ( !halftime && isDefined( players[ i ] ) ) + { + secondtitle = createfontstring( font, othersize ); + if ( playernamehudelems.size == 0 ) + { + secondtitle setparent( outcometext ); + secondtitle setpoint( "TOP_LEFT", "BOTTOM", -175, spacing * 3 ); + } + else + { + secondtitle setparent( playernamehudelems[ playernamehudelems.size - 1 ] ); + secondtitle setpoint( "TOP_LEFT", "BOTTOM_LEFT", 0, spacing ); + } + secondtitle.glowalpha = 1; + secondtitle.hidewheninmenu = 0; + secondtitle.archived = 0; + secondtitle.label = &"MP_WAGER_PLACE_NAME"; + secondtitle.playernum = i; + secondtitle setplayernamestring( players[ i ] ); + playernamehudelems[ playernamehudelems.size ] = secondtitle; + secondcp = createfontstring( font, othersize ); + secondcp setparent( secondtitle ); + secondcp setpoint( "TOP_RIGHT", "TOP_LEFT", 350, 0 ); + secondcp.glowalpha = 1; + secondcp.hidewheninmenu = 0; + secondcp.archived = 0; + secondcp.label = &"MENU_POINTS"; + secondcp.currentvalue = 0; + if ( isDefined( players[ i ].wagerwinnings ) ) + { + secondcp.targetvalue = players[ i ].wagerwinnings; + } + else + { + secondcp.targetvalue = 0; + } + if ( secondcp.targetvalue > 0 ) + { + secondcp.color = ( 0,42, 0,68, 0,46 ); + } + secondcp setvalue( 0 ); + playercphudelems[ playercphudelems.size ] = secondcp; + } + i++; + } + self thread updatewageroutcome( playernamehudelems, playercphudelems ); + self thread resetwageroutcomenotify( playernamehudelems, playercphudelems, outcometitle, outcometext ); + if ( halftime ) + { + return; + } + stillupdating = 1; + countupduration = 2; + cpincrement = 9999; + if ( isDefined( playercphudelems[ 0 ] ) ) + { + cpincrement = int( playercphudelems[ 0 ].targetvalue / ( countupduration / 0,05 ) ); + if ( cpincrement < 1 ) + { + cpincrement = 1; + } + } + while ( stillupdating ) + { + stillupdating = 0; + i = 0; + while ( i < playercphudelems.size ) + { + if ( isDefined( playercphudelems[ i ] ) && playercphudelems[ i ].currentvalue < playercphudelems[ i ].targetvalue ) + { + playercphudelems[ i ].currentvalue += cpincrement; + if ( playercphudelems[ i ].currentvalue > playercphudelems[ i ].targetvalue ) + { + playercphudelems[ i ].currentvalue = playercphudelems[ i ].targetvalue; + } + playercphudelems[ i ] setvalue( playercphudelems[ i ].currentvalue ); + stillupdating = 1; + } + i++; + } + wait 0,05; + } } teamwageroutcomenotify( winner, isroundend, endreasontext ) { - self endon( "disconnect" ); - self notify( "reset_outcome" ); - team = self.pers["team"]; - - if ( !isdefined( team ) || !isdefined( level.teams[team] ) ) - team = "allies"; - - wait 0.05; - - while ( self.doingnotify ) - wait 0.05; - - self endon( "reset_outcome" ); - headerfont = "extrabig"; - font = "objective"; - - if ( self issplitscreen() ) - { - titlesize = 2.0; - textsize = 1.5; - iconsize = 30; - spacing = 10; - } - else - { - titlesize = 3.0; - textsize = 2.0; - iconsize = 70; - spacing = 15; - } - - halftime = 0; - - if ( isdefined( level.sidebet ) && level.sidebet ) - halftime = 1; - - duration = 60000; - outcometitle = createfontstring( headerfont, titlesize ); - outcometitle setpoint( "TOP", undefined, 0, spacing ); - outcometitle.glowalpha = 1; - outcometitle.hidewheninmenu = 0; - outcometitle.archived = 0; - outcometext = createfontstring( font, 2.0 ); - outcometext setparent( outcometitle ); - outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); - outcometext.glowalpha = 1; - outcometext.hidewheninmenu = 0; - outcometext.archived = 0; - - if ( winner == "tie" ) - { - if ( isroundend ) - outcometitle settext( game["strings"]["round_draw"] ); - else - outcometitle settext( game["strings"]["draw"] ); - - outcometitle.color = ( 1, 1, 1 ); - winner = "allies"; - } - else if ( winner == "overtime" ) - { - outcometitle settext( game["strings"]["overtime"] ); - outcometitle.color = ( 1, 1, 1 ); - } - else if ( isdefined( self.pers["team"] ) && winner == team ) - { - if ( isroundend ) - outcometitle settext( game["strings"]["round_win"] ); - else - outcometitle settext( game["strings"]["victory"] ); - - outcometitle.color = ( 0.42, 0.68, 0.46 ); - } - else - { - if ( isroundend ) - outcometitle settext( game["strings"]["round_loss"] ); - else - outcometitle settext( game["strings"]["defeat"] ); - - outcometitle.color = ( 0.73, 0.29, 0.19 ); - } - - if ( !isdefined( level.dontshowendreason ) || !level.dontshowendreason ) - outcometext settext( endreasontext ); - - outcometitle setpulsefx( 100, duration, 1000 ); - outcometext setpulsefx( 100, duration, 1000 ); - teamicons = []; - teamicons[team] = createicon( game["icons"][team], iconsize, iconsize ); - teamicons[team] setparent( outcometext ); - teamicons[team] setpoint( "TOP", "BOTTOM", -60, spacing ); - teamicons[team].hidewheninmenu = 0; - teamicons[team].archived = 0; - teamicons[team].alpha = 0; - teamicons[team] fadeovertime( 0.5 ); - teamicons[team].alpha = 1; - - foreach ( enemyteam in level.teams ) - { - if ( team == enemyteam ) - continue; - - teamicons[enemyteam] = createicon( game["icons"][enemyteam], iconsize, iconsize ); - teamicons[enemyteam] setparent( outcometext ); - teamicons[enemyteam] setpoint( "TOP", "BOTTOM", 60, spacing ); - teamicons[enemyteam].hidewheninmenu = 0; - teamicons[enemyteam].archived = 0; - teamicons[enemyteam].alpha = 0; - teamicons[enemyteam] fadeovertime( 0.5 ); - teamicons[enemyteam].alpha = 1; - } - - teamscores = []; - teamscores[team] = createfontstring( font, titlesize ); - teamscores[team] setparent( teamicons[team] ); - teamscores[team] setpoint( "TOP", "BOTTOM", 0, spacing ); - teamscores[team].glowalpha = 1; - teamscores[team] setvalue( getteamscore( team ) ); - teamscores[team].hidewheninmenu = 0; - teamscores[team].archived = 0; - teamscores[team] setpulsefx( 100, duration, 1000 ); - - foreach ( enemyteam in level.teams ) - { - if ( team == enemyteam ) - continue; - - teamscores[enemyteam] = createfontstring( font, titlesize ); - teamscores[enemyteam] setparent( teamicons[enemyteam] ); - teamscores[enemyteam] setpoint( "TOP", "BOTTOM", 0, spacing ); - teamscores[enemyteam].glowalpha = 1; - teamscores[enemyteam] setvalue( getteamscore( enemyteam ) ); - teamscores[enemyteam].hidewheninmenu = 0; - teamscores[enemyteam].archived = 0; - teamscores[enemyteam] setpulsefx( 100, duration, 1000 ); - } - - matchbonus = undefined; - sidebetwinnings = undefined; - - if ( !isroundend && !halftime && isdefined( self.wagerwinnings ) ) - { - matchbonus = createfontstring( font, 2.0 ); - matchbonus setparent( outcometext ); - matchbonus setpoint( "TOP", "BOTTOM", 0, iconsize + spacing * 3 + teamscores[team].height ); - matchbonus.glowalpha = 1; - matchbonus.hidewheninmenu = 0; - matchbonus.archived = 0; - matchbonus.label = game["strings"]["wager_winnings"]; - matchbonus setvalue( self.wagerwinnings ); - - if ( isdefined( game["side_bets"] ) && game["side_bets"] ) - { - sidebetwinnings = createfontstring( font, 2.0 ); - sidebetwinnings setparent( matchbonus ); - sidebetwinnings setpoint( "TOP", "BOTTOM", 0, spacing ); - sidebetwinnings.glowalpha = 1; - sidebetwinnings.hidewheninmenu = 0; - sidebetwinnings.archived = 0; - sidebetwinnings.label = game["strings"]["wager_sidebet_winnings"]; - sidebetwinnings setvalue( self.pers["wager_sideBetWinnings"] ); - } - } - - self thread resetoutcomenotify( teamicons, teamscores, outcometitle, outcometext, matchbonus, sidebetwinnings ); + self endon( "disconnect" ); + self notify( "reset_outcome" ); + team = self.pers[ "team" ]; + if ( !isDefined( team ) || !isDefined( level.teams[ team ] ) ) + { + team = "allies"; + } + wait 0,05; + while ( self.doingnotify ) + { + wait 0,05; + } + self endon( "reset_outcome" ); + headerfont = "extrabig"; + font = "objective"; + if ( self issplitscreen() ) + { + titlesize = 2; + textsize = 1,5; + iconsize = 30; + spacing = 10; + } + else + { + titlesize = 3; + textsize = 2; + iconsize = 70; + spacing = 15; + } + halftime = 0; + if ( isDefined( level.sidebet ) && level.sidebet ) + { + halftime = 1; + } + duration = 60000; + outcometitle = createfontstring( headerfont, titlesize ); + outcometitle setpoint( "TOP", undefined, 0, spacing ); + outcometitle.glowalpha = 1; + outcometitle.hidewheninmenu = 0; + outcometitle.archived = 0; + outcometext = createfontstring( font, 2 ); + outcometext setparent( outcometitle ); + outcometext setpoint( "TOP", "BOTTOM", 0, 0 ); + outcometext.glowalpha = 1; + outcometext.hidewheninmenu = 0; + outcometext.archived = 0; + if ( winner == "tie" ) + { + if ( isroundend ) + { + outcometitle settext( game[ "strings" ][ "round_draw" ] ); + } + else + { + outcometitle settext( game[ "strings" ][ "draw" ] ); + } + outcometitle.color = ( 1, 1, 1 ); + winner = "allies"; + } + else if ( winner == "overtime" ) + { + outcometitle settext( game[ "strings" ][ "overtime" ] ); + outcometitle.color = ( 1, 1, 1 ); + } + else if ( isDefined( self.pers[ "team" ] ) && winner == team ) + { + if ( isroundend ) + { + outcometitle settext( game[ "strings" ][ "round_win" ] ); + } + else + { + outcometitle settext( game[ "strings" ][ "victory" ] ); + } + outcometitle.color = ( 0,42, 0,68, 0,46 ); + } + else + { + if ( isroundend ) + { + outcometitle settext( game[ "strings" ][ "round_loss" ] ); + } + else + { + outcometitle settext( game[ "strings" ][ "defeat" ] ); + } + outcometitle.color = ( 0,73, 0,29, 0,19 ); + } + if ( !isDefined( level.dontshowendreason ) || !level.dontshowendreason ) + { + outcometext settext( endreasontext ); + } + outcometitle setpulsefx( 100, duration, 1000 ); + outcometext setpulsefx( 100, duration, 1000 ); + teamicons = []; + teamicons[ team ] = createicon( game[ "icons" ][ team ], iconsize, iconsize ); + teamicons[ team ] setparent( outcometext ); + teamicons[ team ] setpoint( "TOP", "BOTTOM", -60, spacing ); + teamicons[ team ].hidewheninmenu = 0; + teamicons[ team ].archived = 0; + teamicons[ team ].alpha = 0; + teamicons[ team ] fadeovertime( 0,5 ); + teamicons[ team ].alpha = 1; + _a1171 = level.teams; + _k1171 = getFirstArrayKey( _a1171 ); + while ( isDefined( _k1171 ) ) + { + enemyteam = _a1171[ _k1171 ]; + if ( team == enemyteam ) + { + } + else + { + teamicons[ enemyteam ] = createicon( game[ "icons" ][ enemyteam ], iconsize, iconsize ); + teamicons[ enemyteam ] setparent( outcometext ); + teamicons[ enemyteam ] setpoint( "TOP", "BOTTOM", 60, spacing ); + teamicons[ enemyteam ].hidewheninmenu = 0; + teamicons[ enemyteam ].archived = 0; + teamicons[ enemyteam ].alpha = 0; + teamicons[ enemyteam ] fadeovertime( 0,5 ); + teamicons[ enemyteam ].alpha = 1; + } + _k1171 = getNextArrayKey( _a1171, _k1171 ); + } + teamscores = []; + teamscores[ team ] = createfontstring( font, titlesize ); + teamscores[ team ] setparent( teamicons[ team ] ); + teamscores[ team ] setpoint( "TOP", "BOTTOM", 0, spacing ); + teamscores[ team ].glowalpha = 1; + teamscores[ team ] setvalue( getteamscore( team ) ); + teamscores[ team ].hidewheninmenu = 0; + teamscores[ team ].archived = 0; + teamscores[ team ] setpulsefx( 100, duration, 1000 ); + _a1197 = level.teams; + _k1197 = getFirstArrayKey( _a1197 ); + while ( isDefined( _k1197 ) ) + { + enemyteam = _a1197[ _k1197 ]; + if ( team == enemyteam ) + { + } + else + { + teamscores[ enemyteam ] = createfontstring( font, titlesize ); + teamscores[ enemyteam ] setparent( teamicons[ enemyteam ] ); + teamscores[ enemyteam ] setpoint( "TOP", "BOTTOM", 0, spacing ); + teamscores[ enemyteam ].glowalpha = 1; + teamscores[ enemyteam ] setvalue( getteamscore( enemyteam ) ); + teamscores[ enemyteam ].hidewheninmenu = 0; + teamscores[ enemyteam ].archived = 0; + teamscores[ enemyteam ] setpulsefx( 100, duration, 1000 ); + } + _k1197 = getNextArrayKey( _a1197, _k1197 ); + } + matchbonus = undefined; + sidebetwinnings = undefined; + if ( !isroundend && !halftime && isDefined( self.wagerwinnings ) ) + { + matchbonus = createfontstring( font, 2 ); + matchbonus setparent( outcometext ); + matchbonus setpoint( "TOP", "BOTTOM", 0, iconsize + ( spacing * 3 ) + teamscores[ team ].height ); + matchbonus.glowalpha = 1; + matchbonus.hidewheninmenu = 0; + matchbonus.archived = 0; + matchbonus.label = game[ "strings" ][ "wager_winnings" ]; + matchbonus setvalue( self.wagerwinnings ); + if ( isDefined( game[ "side_bets" ] ) && game[ "side_bets" ] ) + { + sidebetwinnings = createfontstring( font, 2 ); + sidebetwinnings setparent( matchbonus ); + sidebetwinnings setpoint( "TOP", "BOTTOM", 0, spacing ); + sidebetwinnings.glowalpha = 1; + sidebetwinnings.hidewheninmenu = 0; + sidebetwinnings.archived = 0; + sidebetwinnings.label = game[ "strings" ][ "wager_sidebet_winnings" ]; + sidebetwinnings setvalue( self.pers[ "wager_sideBetWinnings" ] ); + } + } + self thread resetoutcomenotify( teamicons, teamscores, outcometitle, outcometext, matchbonus, sidebetwinnings ); } destroyhudelem( hudelem ) { - if ( isdefined( hudelem ) ) - hudelem destroyelem(); + if ( isDefined( hudelem ) ) + { + hudelem destroyelem(); + } } resetoutcomenotify( hudelemlist1, hudelemlist2, hudelem3, hudelem4, hudelem5, hudelem6, hudelem7, hudelem8, hudelem9, hudelem10 ) { - self endon( "disconnect" ); - - self waittill( "reset_outcome" ); - - destroyhudelem( hudelem3 ); - destroyhudelem( hudelem4 ); - destroyhudelem( hudelem5 ); - destroyhudelem( hudelem6 ); - destroyhudelem( hudelem7 ); - destroyhudelem( hudelem8 ); - destroyhudelem( hudelem9 ); - destroyhudelem( hudelem10 ); - - if ( isdefined( hudelemlist1 ) ) - { - foreach ( elem in hudelemlist1 ) - destroyhudelem( elem ); - } - - if ( isdefined( hudelemlist2 ) ) - { - foreach ( elem in hudelemlist2 ) - destroyhudelem( elem ); - } + self endon( "disconnect" ); + self waittill( "reset_outcome" ); + destroyhudelem( hudelem3 ); + destroyhudelem( hudelem4 ); + destroyhudelem( hudelem5 ); + destroyhudelem( hudelem6 ); + destroyhudelem( hudelem7 ); + destroyhudelem( hudelem8 ); + destroyhudelem( hudelem9 ); + destroyhudelem( hudelem10 ); + while ( isDefined( hudelemlist1 ) ) + { + _a1263 = hudelemlist1; + _k1263 = getFirstArrayKey( _a1263 ); + while ( isDefined( _k1263 ) ) + { + elem = _a1263[ _k1263 ]; + destroyhudelem( elem ); + _k1263 = getNextArrayKey( _a1263, _k1263 ); + } + } + while ( isDefined( hudelemlist2 ) ) + { + _a1271 = hudelemlist2; + _k1271 = getFirstArrayKey( _a1271 ); + while ( isDefined( _k1271 ) ) + { + elem = _a1271[ _k1271 ]; + destroyhudelem( elem ); + _k1271 = getNextArrayKey( _a1271, _k1271 ); + } + } } resetwageroutcomenotify( playernamehudelems, playercphudelems, outcometitle, outcometext ) { - self endon( "disconnect" ); + self endon( "disconnect" ); + self waittill( "reset_outcome" ); + i = playernamehudelems.size - 1; + while ( i >= 0 ) + { + if ( isDefined( playernamehudelems[ i ] ) ) + { + playernamehudelems[ i ] destroy(); + } + i--; - self waittill( "reset_outcome" ); + } + i = playercphudelems.size - 1; + while ( i >= 0 ) + { + if ( isDefined( playercphudelems[ i ] ) ) + { + playercphudelems[ i ] destroy(); + } + i--; - for ( i = playernamehudelems.size - 1; i >= 0; i-- ) - { - if ( isdefined( playernamehudelems[i] ) ) - playernamehudelems[i] destroy(); - } - - for ( i = playercphudelems.size - 1; i >= 0; i-- ) - { - if ( isdefined( playercphudelems[i] ) ) - playercphudelems[i] destroy(); - } - - if ( isdefined( outcometext ) ) - outcometext destroy(); - - if ( isdefined( outcometitle ) ) - outcometitle destroy(); + } + if ( isDefined( outcometext ) ) + { + outcometext destroy(); + } + if ( isDefined( outcometitle ) ) + { + outcometitle destroy(); + } } updateoutcome( firsttitle, secondtitle, thirdtitle ) { - self endon( "disconnect" ); - self endon( "reset_outcome" ); - - while ( true ) - { - self waittill( "update_outcome" ); - - players = level.placement["all"]; - - if ( isdefined( firsttitle ) && isdefined( players[0] ) ) - firsttitle setplayernamestring( players[0] ); - else if ( isdefined( firsttitle ) ) - firsttitle.alpha = 0; - - if ( isdefined( secondtitle ) && isdefined( players[1] ) ) - secondtitle setplayernamestring( players[1] ); - else if ( isdefined( secondtitle ) ) - secondtitle.alpha = 0; - - if ( isdefined( thirdtitle ) && isdefined( players[2] ) ) - thirdtitle setplayernamestring( players[2] ); - else if ( isdefined( thirdtitle ) ) - thirdtitle.alpha = 0; - } + self endon( "disconnect" ); + self endon( "reset_outcome" ); + while ( 1 ) + { + self waittill( "update_outcome" ); + players = level.placement[ "all" ]; + if ( isDefined( firsttitle ) && isDefined( players[ 0 ] ) ) + { + firsttitle setplayernamestring( players[ 0 ] ); + } + else + { + if ( isDefined( firsttitle ) ) + { + firsttitle.alpha = 0; + } + } + if ( isDefined( secondtitle ) && isDefined( players[ 1 ] ) ) + { + secondtitle setplayernamestring( players[ 1 ] ); + } + else + { + if ( isDefined( secondtitle ) ) + { + secondtitle.alpha = 0; + } + } + if ( isDefined( thirdtitle ) && isDefined( players[ 2 ] ) ) + { + thirdtitle setplayernamestring( players[ 2 ] ); + continue; + } + else + { + if ( isDefined( thirdtitle ) ) + { + thirdtitle.alpha = 0; + } + } + } } updatewageroutcome( playernamehudelems, playercphudelems ) { - self endon( "disconnect" ); - self endon( "reset_outcome" ); - - while ( true ) - { - self waittill( "update_outcome" ); - - players = level.placement["all"]; - - for ( i = 0; i < playernamehudelems.size; i++ ) - { - if ( isdefined( playernamehudelems[i] ) && isdefined( players[playernamehudelems[i].playernum] ) ) - { - playernamehudelems[i] setplayernamestring( players[playernamehudelems[i].playernum] ); - continue; - } - - if ( isdefined( playernamehudelems[i] ) ) - playernamehudelems[i].alpha = 0; - - if ( isdefined( playercphudelems[i] ) ) - playercphudelems[i].alpha = 0; - } - } + self endon( "disconnect" ); + self endon( "reset_outcome" ); + while ( 1 ) + { + self waittill( "update_outcome" ); + players = level.placement[ "all" ]; + i = 0; + while ( i < playernamehudelems.size ) + { + if ( isDefined( playernamehudelems[ i ] ) && isDefined( players[ playernamehudelems[ i ].playernum ] ) ) + { + playernamehudelems[ i ] setplayernamestring( players[ playernamehudelems[ i ].playernum ] ); + i++; + continue; + } + else + { + if ( isDefined( playernamehudelems[ i ] ) ) + { + playernamehudelems[ i ].alpha = 0; + } + if ( isDefined( playercphudelems[ i ] ) ) + { + playercphudelems[ i ].alpha = 0; + } + } + i++; + } + } } setshoutcasterwaitingmessage() { - if ( !isdefined( self.waitingforplayerstext ) ) - { - self.waitingforplayerstext = createfontstring( "objective", 2.5 ); - self.waitingforplayerstext setpoint( "CENTER", "CENTER", 0, -80 ); - self.waitingforplayerstext.sort = 1001; - self.waitingforplayerstext settext( &"MP_WAITING_FOR_PLAYERS_SHOUTCASTER" ); - self.waitingforplayerstext.foreground = 0; - self.waitingforplayerstext.hidewheninmenu = 1; - } + if ( !isDefined( self.waitingforplayerstext ) ) + { + self.waitingforplayerstext = createfontstring( "objective", 2,5 ); + self.waitingforplayerstext setpoint( "CENTER", "CENTER", 0, -80 ); + self.waitingforplayerstext.sort = 1001; + self.waitingforplayerstext settext( &"MP_WAITING_FOR_PLAYERS_SHOUTCASTER" ); + self.waitingforplayerstext.foreground = 0; + self.waitingforplayerstext.hidewheninmenu = 1; + } } clearshoutcasterwaitingmessage() { - if ( isdefined( self.waitingforplayerstext ) ) - { - destroyhudelem( self.waitingforplayerstext ); - self.waitingforplayerstext = undefined; - } + if ( isDefined( self.waitingforplayerstext ) ) + { + destroyhudelem( self.waitingforplayerstext ); + self.waitingforplayerstext = undefined; + } } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_util.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_util.gsc index 189914b..16b74f2 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_util.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud_util.gsc @@ -1,1072 +1,1152 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; +#include maps/mp/_utility; setparent( element ) { - if ( isdefined( self.parent ) && self.parent == element ) - return; - - if ( isdefined( self.parent ) ) - self.parent removechild( self ); - - self.parent = element; - self.parent addchild( self ); - - if ( isdefined( self.point ) ) - self setpoint( self.point, self.relativepoint, self.xoffset, self.yoffset ); - else - self setpoint( "TOP" ); + if ( isDefined( self.parent ) && self.parent == element ) + { + return; + } + if ( isDefined( self.parent ) ) + { + self.parent removechild( self ); + } + self.parent = element; + self.parent addchild( self ); + if ( isDefined( self.point ) ) + { + self setpoint( self.point, self.relativepoint, self.xoffset, self.yoffset ); + } + else + { + self setpoint( "TOP" ); + } } getparent() { - return self.parent; + return self.parent; } addchild( element ) { - element.index = self.children.size; - self.children[self.children.size] = element; + element.index = self.children.size; + self.children[ self.children.size ] = element; } removechild( element ) { - element.parent = undefined; - - if ( self.children[self.children.size - 1] != element ) - { - self.children[element.index] = self.children[self.children.size - 1]; - self.children[element.index].index = element.index; - } - - self.children[self.children.size - 1] = undefined; - element.index = undefined; + element.parent = undefined; + if ( self.children[ self.children.size - 1 ] != element ) + { + self.children[ element.index ] = self.children[ self.children.size - 1 ]; + self.children[ element.index ].index = element.index; + } + element.index = undefined; } setpoint( point, relativepoint, xoffset, yoffset, movetime ) { - if ( !isdefined( movetime ) ) - movetime = 0; - - element = self getparent(); - - if ( movetime ) - self moveovertime( movetime ); - - if ( !isdefined( xoffset ) ) - xoffset = 0; - - self.xoffset = xoffset; - - if ( !isdefined( yoffset ) ) - yoffset = 0; - - self.yoffset = yoffset; - self.point = point; - self.alignx = "center"; - self.aligny = "middle"; - - switch ( point ) - { - case "CENTER": - break; - case "TOP": - self.aligny = "top"; - break; - case "BOTTOM": - self.aligny = "bottom"; - break; - case "LEFT": - self.alignx = "left"; - break; - case "RIGHT": - self.alignx = "right"; - break; - case "TOP_RIGHT": - case "TOPRIGHT": - self.aligny = "top"; - self.alignx = "right"; - break; - case "TOP_LEFT": - case "TOPLEFT": - self.aligny = "top"; - self.alignx = "left"; - break; - case "TOPCENTER": - self.aligny = "top"; - self.alignx = "center"; - break; - case "BOTTOM_RIGHT": - case "BOTTOM RIGHT": - self.aligny = "bottom"; - self.alignx = "right"; - break; - case "BOTTOM_LEFT": - case "BOTTOM LEFT": - self.aligny = "bottom"; - self.alignx = "left"; - break; - default: + if ( !isDefined( movetime ) ) + { + movetime = 0; + } + element = self getparent(); + if ( movetime ) + { + self moveovertime( movetime ); + } + if ( !isDefined( xoffset ) ) + { + xoffset = 0; + } + self.xoffset = xoffset; + if ( !isDefined( yoffset ) ) + { + yoffset = 0; + } + self.yoffset = yoffset; + self.point = point; + self.alignx = "center"; + self.aligny = "middle"; + switch( point ) + { + case "CENTER": + break; + case "TOP": + self.aligny = "top"; + break; + case "BOTTOM": + self.aligny = "bottom"; + break; + case "LEFT": + self.alignx = "left"; + break; + case "RIGHT": + self.alignx = "right"; + break; + case "TOPRIGHT": + case "TOP_RIGHT": + self.aligny = "top"; + self.alignx = "right"; + break; + case "TOPLEFT": + case "TOP_LEFT": + self.aligny = "top"; + self.alignx = "left"; + break; + case "TOPCENTER": + self.aligny = "top"; + self.alignx = "center"; + break; + case "BOTTOM RIGHT": + case "BOTTOM_RIGHT": + self.aligny = "bottom"; + self.alignx = "right"; + break; + case "BOTTOM LEFT": + case "BOTTOM_LEFT": + self.aligny = "bottom"; + self.alignx = "left"; + break; + default: /# - println( "^3Warning: unknown point passed to setPoint(): " + point ); + println( "^3Warning: unknown point passed to setPoint(): " + point ); #/ - break; - } - - if ( !isdefined( relativepoint ) ) - relativepoint = point; - - self.relativepoint = relativepoint; - relativex = "center"; - relativey = "middle"; - - switch ( relativepoint ) - { - case "CENTER": - break; - case "TOP": - relativey = "top"; - break; - case "BOTTOM": - relativey = "bottom"; - break; - case "LEFT": - relativex = "left"; - break; - case "RIGHT": - relativex = "right"; - break; - case "TOP_RIGHT": - case "TOPRIGHT": - relativey = "top"; - relativex = "right"; - break; - case "TOP_LEFT": - case "TOPLEFT": - relativey = "top"; - relativex = "left"; - break; - case "TOPCENTER": - relativey = "top"; - relativex = "center"; - break; - case "BOTTOM_RIGHT": - case "BOTTOM RIGHT": - relativey = "bottom"; - relativex = "right"; - break; - case "BOTTOM_LEFT": - case "BOTTOM LEFT": - relativey = "bottom"; - relativex = "left"; - break; - default: + break; + } + if ( !isDefined( relativepoint ) ) + { + relativepoint = point; + } + self.relativepoint = relativepoint; + relativex = "center"; + relativey = "middle"; + switch( relativepoint ) + { + case "CENTER": + break; + case "TOP": + relativey = "top"; + break; + case "BOTTOM": + relativey = "bottom"; + break; + case "LEFT": + relativex = "left"; + break; + case "RIGHT": + relativex = "right"; + break; + case "TOPRIGHT": + case "TOP_RIGHT": + relativey = "top"; + relativex = "right"; + break; + case "TOPLEFT": + case "TOP_LEFT": + relativey = "top"; + relativex = "left"; + break; + case "TOPCENTER": + relativey = "top"; + relativex = "center"; + break; + case "BOTTOM RIGHT": + case "BOTTOM_RIGHT": + relativey = "bottom"; + relativex = "right"; + break; + case "BOTTOM LEFT": + case "BOTTOM_LEFT": + relativey = "bottom"; + relativex = "left"; + break; + default: /# - println( "^3Warning: unknown relativePoint passed to setPoint(): " + relativepoint ); + println( "^3Warning: unknown relativePoint passed to setPoint(): " + relativepoint ); #/ - break; - } - - if ( element == level.uiparent ) - { - self.horzalign = relativex; - self.vertalign = relativey; - } - else - { - self.horzalign = element.horzalign; - self.vertalign = element.vertalign; - } - - if ( relativex == element.alignx ) - { - offsetx = 0; - xfactor = 0; - } - else if ( relativex == "center" || element.alignx == "center" ) - { - offsetx = int( element.width / 2 ); - - if ( relativex == "left" || element.alignx == "right" ) - xfactor = -1; - else - xfactor = 1; - } - else - { - offsetx = element.width; - - if ( relativex == "left" ) - xfactor = -1; - else - xfactor = 1; - } - - self.x = element.x + offsetx * xfactor; - - if ( relativey == element.aligny ) - { - offsety = 0; - yfactor = 0; - } - else if ( relativey == "middle" || element.aligny == "middle" ) - { - offsety = int( element.height / 2 ); - - if ( relativey == "top" || element.aligny == "bottom" ) - yfactor = -1; - else - yfactor = 1; - } - else - { - offsety = element.height; - - if ( relativey == "top" ) - yfactor = -1; - else - yfactor = 1; - } - - self.y = element.y + offsety * yfactor; - self.x += self.xoffset; - self.y += self.yoffset; - - switch ( self.elemtype ) - { - case "bar": - setpointbar( point, relativepoint, xoffset, yoffset ); - self.barframe setparent( self getparent() ); - self.barframe setpoint( point, relativepoint, xoffset, yoffset ); - break; - } - - self updatechildren(); + break; + } + if ( element == level.uiparent ) + { + self.horzalign = relativex; + self.vertalign = relativey; + } + else + { + self.horzalign = element.horzalign; + self.vertalign = element.vertalign; + } + if ( relativex == element.alignx ) + { + offsetx = 0; + xfactor = 0; + } + else if ( relativex == "center" || element.alignx == "center" ) + { + offsetx = int( element.width / 2 ); + if ( relativex == "left" || element.alignx == "right" ) + { + xfactor = -1; + } + else + { + xfactor = 1; + } + } + else + { + offsetx = element.width; + if ( relativex == "left" ) + { + xfactor = -1; + } + else + { + xfactor = 1; + } + } + self.x = element.x + ( offsetx * xfactor ); + if ( relativey == element.aligny ) + { + offsety = 0; + yfactor = 0; + } + else if ( relativey == "middle" || element.aligny == "middle" ) + { + offsety = int( element.height / 2 ); + if ( relativey == "top" || element.aligny == "bottom" ) + { + yfactor = -1; + } + else + { + yfactor = 1; + } + } + else + { + offsety = element.height; + if ( relativey == "top" ) + { + yfactor = -1; + } + else + { + yfactor = 1; + } + } + self.y = element.y + ( offsety * yfactor ); + self.x += self.xoffset; + self.y += self.yoffset; + switch( self.elemtype ) + { + case "bar": + setpointbar( point, relativepoint, xoffset, yoffset ); + self.barframe setparent( self getparent() ); + self.barframe setpoint( point, relativepoint, xoffset, yoffset ); + break; + } + self updatechildren(); } setpointbar( point, relativepoint, xoffset, yoffset ) { - self.bar.horzalign = self.horzalign; - self.bar.vertalign = self.vertalign; - self.bar.alignx = "left"; - self.bar.aligny = self.aligny; - self.bar.y = self.y; - - if ( self.alignx == "left" ) - self.bar.x = self.x; - else if ( self.alignx == "right" ) - self.bar.x = self.x - self.width; - else - self.bar.x = self.x - int( self.width / 2 ); - - if ( self.aligny == "top" ) - self.bar.y = self.y; - else if ( self.aligny == "bottom" ) - self.bar.y = self.y; - - self updatebar( self.bar.frac ); + self.bar.horzalign = self.horzalign; + self.bar.vertalign = self.vertalign; + self.bar.alignx = "left"; + self.bar.aligny = self.aligny; + self.bar.y = self.y; + if ( self.alignx == "left" ) + { + self.bar.x = self.x; + } + else if ( self.alignx == "right" ) + { + self.bar.x = self.x - self.width; + } + else + { + self.bar.x = self.x - int( self.width / 2 ); + } + if ( self.aligny == "top" ) + { + self.bar.y = self.y; + } + else + { + if ( self.aligny == "bottom" ) + { + self.bar.y = self.y; + } + } + self updatebar( self.bar.frac ); } updatebar( barfrac, rateofchange ) { - if ( self.elemtype == "bar" ) - updatebarscale( barfrac, rateofchange ); + if ( self.elemtype == "bar" ) + { + updatebarscale( barfrac, rateofchange ); + } } updatebarscale( barfrac, rateofchange ) { - barwidth = int( self.width * barfrac + 0.5 ); - - if ( !barwidth ) - barwidth = 1; - - self.bar.frac = barfrac; - self.bar setshader( self.bar.shader, barwidth, self.height ); + barwidth = int( ( self.width * barfrac ) + 0,5 ); + if ( !barwidth ) + { + barwidth = 1; + } + self.bar.frac = barfrac; + self.bar setshader( self.bar.shader, barwidth, self.height ); /# - assert( barwidth <= self.width, "barWidth <= self.width: " + barwidth + " <= " + self.width + " - barFrac was " + barfrac ); + assert( barwidth <= self.width, "barWidth <= self.width: " + barwidth + " <= " + self.width + " - barFrac was " + barfrac ); #/ - if ( isdefined( rateofchange ) && barwidth < self.width ) - { - if ( rateofchange > 0 ) - { + if ( isDefined( rateofchange ) && barwidth < self.width ) + { + if ( rateofchange > 0 ) + { /# - assert( ( 1 - barfrac ) / rateofchange > 0, "barFrac: " + barfrac + "rateOfChange: " + rateofchange ); + assert( ( ( 1 - barfrac ) / rateofchange ) > 0, "barFrac: " + barfrac + "rateOfChange: " + rateofchange ); #/ - self.bar scaleovertime( ( 1 - barfrac ) / rateofchange, self.width, self.height ); - } - else if ( rateofchange < 0 ) - { + self.bar scaleovertime( ( 1 - barfrac ) / rateofchange, self.width, self.height ); + } + else + { + if ( rateofchange < 0 ) + { /# - assert( barfrac / -1 * rateofchange > 0, "barFrac: " + barfrac + "rateOfChange: " + rateofchange ); + assert( ( barfrac / ( -1 * rateofchange ) ) > 0, "barFrac: " + barfrac + "rateOfChange: " + rateofchange ); #/ - self.bar scaleovertime( barfrac / -1 * rateofchange, 1, self.height ); - } - } - - self.bar.rateofchange = rateofchange; - self.bar.lastupdatetime = gettime(); + self.bar scaleovertime( barfrac / ( -1 * rateofchange ), 1, self.height ); + } + } + } + self.bar.rateofchange = rateofchange; + self.bar.lastupdatetime = getTime(); } createfontstring( font, fontscale ) { - fontelem = newclienthudelem( self ); - fontelem.elemtype = "font"; - fontelem.font = font; - fontelem.fontscale = fontscale; - fontelem.x = 0; - fontelem.y = 0; - fontelem.width = 0; - fontelem.height = int( level.fontheight * fontscale ); - fontelem.xoffset = 0; - fontelem.yoffset = 0; - fontelem.children = []; - fontelem setparent( level.uiparent ); - fontelem.hidden = 0; - return fontelem; + fontelem = newclienthudelem( self ); + fontelem.elemtype = "font"; + fontelem.font = font; + fontelem.fontscale = fontscale; + fontelem.x = 0; + fontelem.y = 0; + fontelem.width = 0; + fontelem.height = int( level.fontheight * fontscale ); + fontelem.xoffset = 0; + fontelem.yoffset = 0; + fontelem.children = []; + fontelem setparent( level.uiparent ); + fontelem.hidden = 0; + return fontelem; } createserverfontstring( font, fontscale, team ) { - if ( isdefined( team ) ) - fontelem = newteamhudelem( team ); - else - fontelem = newhudelem(); - - fontelem.elemtype = "font"; - fontelem.font = font; - fontelem.fontscale = fontscale; - fontelem.x = 0; - fontelem.y = 0; - fontelem.width = 0; - fontelem.height = int( level.fontheight * fontscale ); - fontelem.xoffset = 0; - fontelem.yoffset = 0; - fontelem.children = []; - fontelem setparent( level.uiparent ); - fontelem.hidden = 0; - return fontelem; + if ( isDefined( team ) ) + { + fontelem = newteamhudelem( team ); + } + else + { + fontelem = newhudelem(); + } + fontelem.elemtype = "font"; + fontelem.font = font; + fontelem.fontscale = fontscale; + fontelem.x = 0; + fontelem.y = 0; + fontelem.width = 0; + fontelem.height = int( level.fontheight * fontscale ); + fontelem.xoffset = 0; + fontelem.yoffset = 0; + fontelem.children = []; + fontelem setparent( level.uiparent ); + fontelem.hidden = 0; + return fontelem; } createservertimer( font, fontscale, team ) { - if ( isdefined( team ) ) - timerelem = newteamhudelem( team ); - else - timerelem = newhudelem(); - - timerelem.elemtype = "timer"; - timerelem.font = font; - timerelem.fontscale = fontscale; - timerelem.x = 0; - timerelem.y = 0; - timerelem.width = 0; - timerelem.height = int( level.fontheight * fontscale ); - timerelem.xoffset = 0; - timerelem.yoffset = 0; - timerelem.children = []; - timerelem setparent( level.uiparent ); - timerelem.hidden = 0; - return timerelem; + if ( isDefined( team ) ) + { + timerelem = newteamhudelem( team ); + } + else + { + timerelem = newhudelem(); + } + timerelem.elemtype = "timer"; + timerelem.font = font; + timerelem.fontscale = fontscale; + timerelem.x = 0; + timerelem.y = 0; + timerelem.width = 0; + timerelem.height = int( level.fontheight * fontscale ); + timerelem.xoffset = 0; + timerelem.yoffset = 0; + timerelem.children = []; + timerelem setparent( level.uiparent ); + timerelem.hidden = 0; + return timerelem; } createclienttimer( font, fontscale ) { - timerelem = newclienthudelem( self ); - timerelem.elemtype = "timer"; - timerelem.font = font; - timerelem.fontscale = fontscale; - timerelem.x = 0; - timerelem.y = 0; - timerelem.width = 0; - timerelem.height = int( level.fontheight * fontscale ); - timerelem.xoffset = 0; - timerelem.yoffset = 0; - timerelem.children = []; - timerelem setparent( level.uiparent ); - timerelem.hidden = 0; - return timerelem; + timerelem = newclienthudelem( self ); + timerelem.elemtype = "timer"; + timerelem.font = font; + timerelem.fontscale = fontscale; + timerelem.x = 0; + timerelem.y = 0; + timerelem.width = 0; + timerelem.height = int( level.fontheight * fontscale ); + timerelem.xoffset = 0; + timerelem.yoffset = 0; + timerelem.children = []; + timerelem setparent( level.uiparent ); + timerelem.hidden = 0; + return timerelem; } createicon( shader, width, height ) { - iconelem = newclienthudelem( self ); - iconelem.elemtype = "icon"; - iconelem.x = 0; - iconelem.y = 0; - iconelem.width = width; - iconelem.height = height; - iconelem.xoffset = 0; - iconelem.yoffset = 0; - iconelem.children = []; - iconelem setparent( level.uiparent ); - iconelem.hidden = 0; - - if ( isdefined( shader ) ) - iconelem setshader( shader, width, height ); - - return iconelem; + iconelem = newclienthudelem( self ); + iconelem.elemtype = "icon"; + iconelem.x = 0; + iconelem.y = 0; + iconelem.width = width; + iconelem.height = height; + iconelem.xoffset = 0; + iconelem.yoffset = 0; + iconelem.children = []; + iconelem setparent( level.uiparent ); + iconelem.hidden = 0; + if ( isDefined( shader ) ) + { + iconelem setshader( shader, width, height ); + } + return iconelem; } createservericon( shader, width, height, team ) { - if ( isdefined( team ) ) - iconelem = newteamhudelem( team ); - else - iconelem = newhudelem(); - - iconelem.elemtype = "icon"; - iconelem.x = 0; - iconelem.y = 0; - iconelem.width = width; - iconelem.height = height; - iconelem.xoffset = 0; - iconelem.yoffset = 0; - iconelem.children = []; - iconelem setparent( level.uiparent ); - iconelem.hidden = 0; - - if ( isdefined( shader ) ) - iconelem setshader( shader, width, height ); - - return iconelem; + if ( isDefined( team ) ) + { + iconelem = newteamhudelem( team ); + } + else + { + iconelem = newhudelem(); + } + iconelem.elemtype = "icon"; + iconelem.x = 0; + iconelem.y = 0; + iconelem.width = width; + iconelem.height = height; + iconelem.xoffset = 0; + iconelem.yoffset = 0; + iconelem.children = []; + iconelem setparent( level.uiparent ); + iconelem.hidden = 0; + if ( isDefined( shader ) ) + { + iconelem setshader( shader, width, height ); + } + return iconelem; } createserverbar( color, width, height, flashfrac, team, selected ) { - if ( isdefined( team ) ) - barelem = newteamhudelem( team ); - else - barelem = newhudelem(); - - barelem.x = 0; - barelem.y = 0; - barelem.frac = 0; - barelem.color = color; - barelem.sort = -2; - barelem.shader = "progress_bar_fill"; - barelem setshader( "progress_bar_fill", width, height ); - barelem.hidden = 0; - - if ( isdefined( flashfrac ) ) - barelem.flashfrac = flashfrac; - - if ( isdefined( team ) ) - barelemframe = newteamhudelem( team ); - else - barelemframe = newhudelem(); - - barelemframe.elemtype = "icon"; - barelemframe.x = 0; - barelemframe.y = 0; - barelemframe.width = width; - barelemframe.height = height; - barelemframe.xoffset = 0; - barelemframe.yoffset = 0; - barelemframe.bar = barelem; - barelemframe.barframe = barelemframe; - barelemframe.children = []; - barelemframe.sort = -1; - barelemframe.color = ( 1, 1, 1 ); - barelemframe setparent( level.uiparent ); - - if ( isdefined( selected ) ) - barelemframe setshader( "progress_bar_fg_sel", width, height ); - else - barelemframe setshader( "progress_bar_fg", width, height ); - - barelemframe.hidden = 0; - - if ( isdefined( team ) ) - barelembg = newteamhudelem( team ); - else - barelembg = newhudelem(); - - barelembg.elemtype = "bar"; - barelembg.x = 0; - barelembg.y = 0; - barelembg.width = width; - barelembg.height = height; - barelembg.xoffset = 0; - barelembg.yoffset = 0; - barelembg.bar = barelem; - barelembg.barframe = barelemframe; - barelembg.children = []; - barelembg.sort = -3; - barelembg.color = ( 0, 0, 0 ); - barelembg.alpha = 0.5; - barelembg setparent( level.uiparent ); - barelembg setshader( "progress_bar_bg", width, height ); - barelembg.hidden = 0; - return barelembg; + if ( isDefined( team ) ) + { + barelem = newteamhudelem( team ); + } + else + { + barelem = newhudelem(); + } + barelem.x = 0; + barelem.y = 0; + barelem.frac = 0; + barelem.color = color; + barelem.sort = -2; + barelem.shader = "progress_bar_fill"; + barelem setshader( "progress_bar_fill", width, height ); + barelem.hidden = 0; + if ( isDefined( flashfrac ) ) + { + barelem.flashfrac = flashfrac; + } + if ( isDefined( team ) ) + { + barelemframe = newteamhudelem( team ); + } + else + { + barelemframe = newhudelem(); + } + barelemframe.elemtype = "icon"; + barelemframe.x = 0; + barelemframe.y = 0; + barelemframe.width = width; + barelemframe.height = height; + barelemframe.xoffset = 0; + barelemframe.yoffset = 0; + barelemframe.bar = barelem; + barelemframe.barframe = barelemframe; + barelemframe.children = []; + barelemframe.sort = -1; + barelemframe.color = ( 1, 0, 0 ); + barelemframe setparent( level.uiparent ); + if ( isDefined( selected ) ) + { + barelemframe setshader( "progress_bar_fg_sel", width, height ); + } + else + { + barelemframe setshader( "progress_bar_fg", width, height ); + } + barelemframe.hidden = 0; + if ( isDefined( team ) ) + { + barelembg = newteamhudelem( team ); + } + else + { + barelembg = newhudelem(); + } + barelembg.elemtype = "bar"; + barelembg.x = 0; + barelembg.y = 0; + barelembg.width = width; + barelembg.height = height; + barelembg.xoffset = 0; + barelembg.yoffset = 0; + barelembg.bar = barelem; + barelembg.barframe = barelemframe; + barelembg.children = []; + barelembg.sort = -3; + barelembg.color = ( 1, 0, 0 ); + barelembg.alpha = 0,5; + barelembg setparent( level.uiparent ); + barelembg setshader( "progress_bar_bg", width, height ); + barelembg.hidden = 0; + return barelembg; } createbar( color, width, height, flashfrac ) { - barelem = newclienthudelem( self ); - barelem.x = 0; - barelem.y = 0; - barelem.frac = 0; - barelem.color = color; - barelem.sort = -2; - barelem.shader = "progress_bar_fill"; - barelem setshader( "progress_bar_fill", width, height ); - barelem.hidden = 0; - - if ( isdefined( flashfrac ) ) - barelem.flashfrac = flashfrac; - - barelemframe = newclienthudelem( self ); - barelemframe.elemtype = "icon"; - barelemframe.x = 0; - barelemframe.y = 0; - barelemframe.width = width; - barelemframe.height = height; - barelemframe.xoffset = 0; - barelemframe.yoffset = 0; - barelemframe.bar = barelem; - barelemframe.barframe = barelemframe; - barelemframe.children = []; - barelemframe.sort = -1; - barelemframe.color = ( 1, 1, 1 ); - barelemframe setparent( level.uiparent ); - barelemframe.hidden = 0; - barelembg = newclienthudelem( self ); - barelembg.elemtype = "bar"; - - if ( !self issplitscreen() ) - { - barelembg.x = -2; - barelembg.y = -2; - } - - barelembg.width = width; - barelembg.height = height; - barelembg.xoffset = 0; - barelembg.yoffset = 0; - barelembg.bar = barelem; - barelembg.barframe = barelemframe; - barelembg.children = []; - barelembg.sort = -3; - barelembg.color = ( 0, 0, 0 ); - barelembg.alpha = 0.5; - barelembg setparent( level.uiparent ); - - if ( !self issplitscreen() ) - barelembg setshader( "progress_bar_bg", width + 4, height + 4 ); - else - barelembg setshader( "progress_bar_bg", width + 0, height + 0 ); - - barelembg.hidden = 0; - return barelembg; + barelem = newclienthudelem( self ); + barelem.x = 0; + barelem.y = 0; + barelem.frac = 0; + barelem.color = color; + barelem.sort = -2; + barelem.shader = "progress_bar_fill"; + barelem setshader( "progress_bar_fill", width, height ); + barelem.hidden = 0; + if ( isDefined( flashfrac ) ) + { + barelem.flashfrac = flashfrac; + } + barelemframe = newclienthudelem( self ); + barelemframe.elemtype = "icon"; + barelemframe.x = 0; + barelemframe.y = 0; + barelemframe.width = width; + barelemframe.height = height; + barelemframe.xoffset = 0; + barelemframe.yoffset = 0; + barelemframe.bar = barelem; + barelemframe.barframe = barelemframe; + barelemframe.children = []; + barelemframe.sort = -1; + barelemframe.color = ( 1, 0, 0 ); + barelemframe setparent( level.uiparent ); + barelemframe.hidden = 0; + barelembg = newclienthudelem( self ); + barelembg.elemtype = "bar"; + if ( !self issplitscreen() ) + { + barelembg.x = -2; + barelembg.y = -2; + } + barelembg.width = width; + barelembg.height = height; + barelembg.xoffset = 0; + barelembg.yoffset = 0; + barelembg.bar = barelem; + barelembg.barframe = barelemframe; + barelembg.children = []; + barelembg.sort = -3; + barelembg.color = ( 1, 0, 0 ); + barelembg.alpha = 0,5; + barelembg setparent( level.uiparent ); + if ( !self issplitscreen() ) + { + barelembg setshader( "progress_bar_bg", width + 4, height + 4 ); + } + else + { + barelembg setshader( "progress_bar_bg", width + 0, height + 0 ); + } + barelembg.hidden = 0; + return barelembg; } getcurrentfraction() { - frac = self.bar.frac; - - if ( isdefined( self.bar.rateofchange ) ) - { - frac += ( gettime() - self.bar.lastupdatetime ) * self.bar.rateofchange; - - if ( frac > 1 ) - frac = 1; - - if ( frac < 0 ) - frac = 0; - } - - return frac; + frac = self.bar.frac; + if ( isDefined( self.bar.rateofchange ) ) + { + frac += ( getTime() - self.bar.lastupdatetime ) * self.bar.rateofchange; + if ( frac > 1 ) + { + frac = 1; + } + if ( frac < 0 ) + { + frac = 0; + } + } + return frac; } createprimaryprogressbar() { - bar = undefined; - - if ( self issplitscreen() ) - { - bar = self createbar( ( 1, 1, 1 ), level.primaryprogressbarwidth, level.primaryprogressbarheight_ss ); - bar setpoint( "TOP", undefined, level.primaryprogressbarx_ss, level.primaryprogressbary_ss ); - } - else - { - bar = self createbar( ( 1, 1, 1 ), level.primaryprogressbarwidth, level.primaryprogressbarheight ); - bar setpoint( "CENTER", undefined, level.primaryprogressbarx, level.primaryprogressbary ); - } - - return bar; + bar = undefined; + if ( self issplitscreen() ) + { + bar = self createbar( ( 1, 0, 0 ), level.primaryprogressbarwidth, level.primaryprogressbarheight_ss ); + bar setpoint( "TOP", undefined, level.primaryprogressbarx_ss, level.primaryprogressbary_ss ); + } + else + { + bar = self createbar( ( 1, 0, 0 ), level.primaryprogressbarwidth, level.primaryprogressbarheight ); + bar setpoint( "CENTER", undefined, level.primaryprogressbarx, level.primaryprogressbary ); + } + return bar; } createprimaryprogressbartext() { - text = createfontstring( "objective", level.primaryprogressbarfontsize ); - - if ( self issplitscreen() ) - text setpoint( "TOP", undefined, level.primaryprogressbartextx_ss, level.primaryprogressbartexty_ss ); - else - text setpoint( "CENTER", undefined, level.primaryprogressbartextx, level.primaryprogressbartexty ); - - text.sort = -1; - return text; + text = createfontstring( "objective", level.primaryprogressbarfontsize ); + if ( self issplitscreen() ) + { + text setpoint( "TOP", undefined, level.primaryprogressbartextx_ss, level.primaryprogressbartexty_ss ); + } + else + { + text setpoint( "CENTER", undefined, level.primaryprogressbartextx, level.primaryprogressbartexty ); + } + text.sort = -1; + return text; } createsecondaryprogressbar() { - secondaryprogressbarheight = getdvarintdefault( "scr_secondaryProgressBarHeight", level.secondaryprogressbarheight ); - secondaryprogressbarx = getdvarintdefault( "scr_secondaryProgressBarX", level.secondaryprogressbarx ); - secondaryprogressbary = getdvarintdefault( "scr_secondaryProgressBarY", level.secondaryprogressbary ); - secondaryprogressbarheight_ss = getdvarintdefault( "scr_secondaryProgressBarHeight", level.secondaryprogressbarheight_ss ); - secondaryprogressbarx_ss = getdvarintdefault( "scr_secondaryProgressBarX", level.secondaryprogressbarx_ss ); - secondaryprogressbary_ss = getdvarintdefault( "scr_secondaryProgressBarY", level.secondaryprogressbary_ss ); - bar = undefined; - - if ( self issplitscreen() ) - { - bar = self createbar( ( 1, 1, 1 ), level.secondaryprogressbarwidth, secondaryprogressbarheight_ss ); - bar setpoint( "TOP", undefined, secondaryprogressbarx_ss, secondaryprogressbary_ss ); - } - else - { - bar = self createbar( ( 1, 1, 1 ), level.secondaryprogressbarwidth, secondaryprogressbarheight ); - bar setpoint( "CENTER", undefined, secondaryprogressbarx, secondaryprogressbary ); - } - - return bar; + secondaryprogressbarheight = getdvarintdefault( "scr_secondaryProgressBarHeight", level.secondaryprogressbarheight ); + secondaryprogressbarx = getdvarintdefault( "scr_secondaryProgressBarX", level.secondaryprogressbarx ); + secondaryprogressbary = getdvarintdefault( "scr_secondaryProgressBarY", level.secondaryprogressbary ); + secondaryprogressbarheight_ss = getdvarintdefault( "scr_secondaryProgressBarHeight", level.secondaryprogressbarheight_ss ); + secondaryprogressbarx_ss = getdvarintdefault( "scr_secondaryProgressBarX", level.secondaryprogressbarx_ss ); + secondaryprogressbary_ss = getdvarintdefault( "scr_secondaryProgressBarY", level.secondaryprogressbary_ss ); + bar = undefined; + if ( self issplitscreen() ) + { + bar = self createbar( ( 1, 0, 0 ), level.secondaryprogressbarwidth, secondaryprogressbarheight_ss ); + bar setpoint( "TOP", undefined, secondaryprogressbarx_ss, secondaryprogressbary_ss ); + } + else + { + bar = self createbar( ( 1, 0, 0 ), level.secondaryprogressbarwidth, secondaryprogressbarheight ); + bar setpoint( "CENTER", undefined, secondaryprogressbarx, secondaryprogressbary ); + } + return bar; } createsecondaryprogressbartext() { - secondaryprogressbartextx = getdvarintdefault( "scr_btx", level.secondaryprogressbartextx ); - secondaryprogressbartexty = getdvarintdefault( "scr_bty", level.secondaryprogressbartexty ); - secondaryprogressbartextx_ss = getdvarintdefault( "scr_btx", level.secondaryprogressbartextx_ss ); - secondaryprogressbartexty_ss = getdvarintdefault( "scr_bty", level.secondaryprogressbartexty_ss ); - text = createfontstring( "objective", level.primaryprogressbarfontsize ); - - if ( self issplitscreen() ) - text setpoint( "TOP", undefined, secondaryprogressbartextx_ss, secondaryprogressbartexty_ss ); - else - text setpoint( "CENTER", undefined, secondaryprogressbartextx, secondaryprogressbartexty ); - - text.sort = -1; - return text; + secondaryprogressbartextx = getdvarintdefault( "scr_btx", level.secondaryprogressbartextx ); + secondaryprogressbartexty = getdvarintdefault( "scr_bty", level.secondaryprogressbartexty ); + secondaryprogressbartextx_ss = getdvarintdefault( "scr_btx", level.secondaryprogressbartextx_ss ); + secondaryprogressbartexty_ss = getdvarintdefault( "scr_bty", level.secondaryprogressbartexty_ss ); + text = createfontstring( "objective", level.primaryprogressbarfontsize ); + if ( self issplitscreen() ) + { + text setpoint( "TOP", undefined, secondaryprogressbartextx_ss, secondaryprogressbartexty_ss ); + } + else + { + text setpoint( "CENTER", undefined, secondaryprogressbartextx, secondaryprogressbartexty ); + } + text.sort = -1; + return text; } createteamprogressbar( team ) { - bar = createserverbar( ( 1, 0, 0 ), level.teamprogressbarwidth, level.teamprogressbarheight, undefined, team ); - bar setpoint( "TOP", undefined, 0, level.teamprogressbary ); - return bar; + bar = createserverbar( ( 1, 0, 0 ), level.teamprogressbarwidth, level.teamprogressbarheight, undefined, team ); + bar setpoint( "TOP", undefined, 0, level.teamprogressbary ); + return bar; } createteamprogressbartext( team ) { - text = createserverfontstring( "default", level.teamprogressbarfontsize, team ); - text setpoint( "TOP", undefined, 0, level.teamprogressbartexty ); - return text; + text = createserverfontstring( "default", level.teamprogressbarfontsize, team ); + text setpoint( "TOP", undefined, 0, level.teamprogressbartexty ); + return text; } setflashfrac( flashfrac ) { - self.bar.flashfrac = flashfrac; + self.bar.flashfrac = flashfrac; } hideelem() { - if ( self.hidden ) - return; - - self.hidden = 1; - - if ( self.alpha != 0 ) - self.alpha = 0; - - if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) - { - self.bar.hidden = 1; - - if ( self.bar.alpha != 0 ) - self.bar.alpha = 0; - - self.barframe.hidden = 1; - - if ( self.barframe.alpha != 0 ) - self.barframe.alpha = 0; - } + if ( self.hidden ) + { + return; + } + self.hidden = 1; + if ( self.alpha != 0 ) + { + self.alpha = 0; + } + if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) + { + self.bar.hidden = 1; + if ( self.bar.alpha != 0 ) + { + self.bar.alpha = 0; + } + self.barframe.hidden = 1; + if ( self.barframe.alpha != 0 ) + { + self.barframe.alpha = 0; + } + } } showelem() { - if ( !self.hidden ) - return; - - self.hidden = 0; - - if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) - { - if ( self.alpha != 0.5 ) - self.alpha = 0.5; - - self.bar.hidden = 0; - - if ( self.bar.alpha != 1 ) - self.bar.alpha = 1; - - self.barframe.hidden = 0; - - if ( self.barframe.alpha != 1 ) - self.barframe.alpha = 1; - } - else if ( self.alpha != 1 ) - self.alpha = 1; + if ( !self.hidden ) + { + return; + } + self.hidden = 0; + if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) + { + if ( self.alpha != 0,5 ) + { + self.alpha = 0,5; + } + self.bar.hidden = 0; + if ( self.bar.alpha != 1 ) + { + self.bar.alpha = 1; + } + self.barframe.hidden = 0; + if ( self.barframe.alpha != 1 ) + { + self.barframe.alpha = 1; + } + } + else + { + if ( self.alpha != 1 ) + { + self.alpha = 1; + } + } } flashthread() { - self endon( "death" ); - - if ( !self.hidden ) - self.alpha = 1; - - while ( true ) - { - if ( self.frac >= self.flashfrac ) - { - if ( !self.hidden ) - { - self fadeovertime( 0.3 ); - self.alpha = 0.2; - wait 0.35; - self fadeovertime( 0.3 ); - self.alpha = 1; - } - - wait 0.7; - } - else - { - if ( !self.hidden && self.alpha != 1 ) - self.alpha = 1; - - wait 0.05; - } - } + self endon( "death" ); + if ( !self.hidden ) + { + self.alpha = 1; + } + while ( 1 ) + { + if ( self.frac >= self.flashfrac ) + { + if ( !self.hidden ) + { + self fadeovertime( 0,3 ); + self.alpha = 0,2; + wait 0,35; + self fadeovertime( 0,3 ); + self.alpha = 1; + } + wait 0,7; + continue; + } + else + { + if ( !self.hidden && self.alpha != 1 ) + { + self.alpha = 1; + } + wait 0,05; + } + } } destroyelem() { - tempchildren = []; - - for ( index = 0; index < self.children.size; index++ ) - { - if ( isdefined( self.children[index] ) ) - tempchildren[tempchildren.size] = self.children[index]; - } - - for ( index = 0; index < tempchildren.size; index++ ) - tempchildren[index] setparent( self getparent() ); - - if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) - { - self.bar destroy(); - self.barframe destroy(); - } - - self destroy(); + tempchildren = []; + index = 0; + while ( index < self.children.size ) + { + if ( isDefined( self.children[ index ] ) ) + { + tempchildren[ tempchildren.size ] = self.children[ index ]; + } + index++; + } + index = 0; + while ( index < tempchildren.size ) + { + tempchildren[ index ] setparent( self getparent() ); + index++; + } + if ( self.elemtype == "bar" || self.elemtype == "bar_shader" ) + { + self.bar destroy(); + self.barframe destroy(); + } + self destroy(); } seticonshader( shader ) { - self setshader( shader, self.width, self.height ); + self setshader( shader, self.width, self.height ); } setwidth( width ) { - self.width = width; + self.width = width; } setheight( height ) { - self.height = height; + self.height = height; } setsize( width, height ) { - self.width = width; - self.height = height; + self.width = width; + self.height = height; } updatechildren() { - for ( index = 0; index < self.children.size; index++ ) - { - child = self.children[index]; - child setpoint( child.point, child.relativepoint, child.xoffset, child.yoffset ); - } + index = 0; + while ( index < self.children.size ) + { + child = self.children[ index ]; + child setpoint( child.point, child.relativepoint, child.xoffset, child.yoffset ); + index++; + } } createloadouticon( verindex, horindex, xpos, ypos ) { - iconsize = 32; - - if ( level.splitscreen ) - ypos -= 80 + iconsize * ( 3 - verindex ); - else - ypos -= 90 + iconsize * ( 3 - verindex ); - - if ( level.splitscreen ) - xpos -= 5 + iconsize * horindex; - else - xpos -= 10 + iconsize * horindex; - - icon = createicon( "white", iconsize, iconsize ); - icon setpoint( "BOTTOM RIGHT", "BOTTOM RIGHT", xpos, ypos ); - icon.horzalign = "user_right"; - icon.vertalign = "user_bottom"; - icon.archived = 0; - icon.foreground = 0; - return icon; + iconsize = 32; + if ( level.splitscreen ) + { + ypos -= 80 + ( iconsize * ( 3 - verindex ) ); + } + else + { + ypos -= 90 + ( iconsize * ( 3 - verindex ) ); + } + if ( level.splitscreen ) + { + xpos -= 5 + ( iconsize * horindex ); + } + else + { + xpos -= 10 + ( iconsize * horindex ); + } + icon = createicon( "white", iconsize, iconsize ); + icon setpoint( "BOTTOM RIGHT", "BOTTOM RIGHT", xpos, ypos ); + icon.horzalign = "user_right"; + icon.vertalign = "user_bottom"; + icon.archived = 0; + icon.foreground = 0; + return icon; } setloadouticoncoords( verindex, horindex, xpos, ypos ) { - iconsize = 32; - - if ( level.splitscreen ) - ypos -= 80 + iconsize * ( 3 - verindex ); - else - ypos -= 90 + iconsize * ( 3 - verindex ); - - if ( level.splitscreen ) - xpos -= 5 + iconsize * horindex; - else - xpos -= 10 + iconsize * horindex; - - self setpoint( "BOTTOM RIGHT", "BOTTOM RIGHT", xpos, ypos ); - self.horzalign = "user_right"; - self.vertalign = "user_bottom"; - self.archived = 0; - self.foreground = 0; - self.alpha = 1; + iconsize = 32; + if ( level.splitscreen ) + { + ypos -= 80 + ( iconsize * ( 3 - verindex ) ); + } + else + { + ypos -= 90 + ( iconsize * ( 3 - verindex ) ); + } + if ( level.splitscreen ) + { + xpos -= 5 + ( iconsize * horindex ); + } + else + { + xpos -= 10 + ( iconsize * horindex ); + } + self setpoint( "BOTTOM RIGHT", "BOTTOM RIGHT", xpos, ypos ); + self.horzalign = "user_right"; + self.vertalign = "user_bottom"; + self.archived = 0; + self.foreground = 0; + self.alpha = 1; } setloadouttextcoords( xcoord ) { - self setpoint( "RIGHT", "LEFT", xcoord, 0 ); + self setpoint( "RIGHT", "LEFT", xcoord, 0 ); } createloadouttext( icon, xcoord ) { - text = createfontstring( "small", 1 ); - text setparent( icon ); - text setpoint( "RIGHT", "LEFT", xcoord, 0 ); - text.archived = 0; - text.alignx = "right"; - text.aligny = "middle"; - text.foreground = 0; - return text; + text = createfontstring( "small", 1 ); + text setparent( icon ); + text setpoint( "RIGHT", "LEFT", xcoord, 0 ); + text.archived = 0; + text.alignx = "right"; + text.aligny = "middle"; + text.foreground = 0; + return text; } showloadoutattribute( iconelem, icon, alpha, textelem, text ) { - iconsize = 32; - iconelem.alpha = alpha; - - if ( alpha ) - iconelem setshader( icon, iconsize, iconsize ); - - if ( isdefined( textelem ) ) - { - textelem.alpha = alpha; - - if ( alpha ) - textelem settext( text ); - } + iconsize = 32; + iconelem.alpha = alpha; + if ( alpha ) + { + iconelem setshader( icon, iconsize, iconsize ); + } + if ( isDefined( textelem ) ) + { + textelem.alpha = alpha; + if ( alpha ) + { + textelem settext( text ); + } + } } hideloadoutattribute( iconelem, fadetime, textelem, hidetextonly ) { - if ( isdefined( fadetime ) ) - { - if ( !isdefined( hidetextonly ) || !hidetextonly ) - iconelem fadeovertime( fadetime ); - - if ( isdefined( textelem ) ) - textelem fadeovertime( fadetime ); - } - - if ( !isdefined( hidetextonly ) || !hidetextonly ) - iconelem.alpha = 0; - - if ( isdefined( textelem ) ) - textelem.alpha = 0; + if ( isDefined( fadetime ) ) + { + if ( !isDefined( hidetextonly ) || !hidetextonly ) + { + iconelem fadeovertime( fadetime ); + } + if ( isDefined( textelem ) ) + { + textelem fadeovertime( fadetime ); + } + } + if ( !isDefined( hidetextonly ) || !hidetextonly ) + { + iconelem.alpha = 0; + } + if ( isDefined( textelem ) ) + { + textelem.alpha = 0; + } } showperks() { - ypos = 40; - - if ( !isdefined( self.perkhudelem ) ) - self.perkhudelem = createloadouticon( 0, 0, 200, ypos ); - else - self.perkhudelem setloadouticoncoords( 0, 0, 200, ypos ); - - self.perkhudelem setperks( self ); - self.perkhudelem.x = -10; - self.perkhudelem.alpha = 0; - self.perkhudelem fadeovertime( 0.4 ); - self.perkhudelem.alpha = 1; - self.perkhudelem.hidewheninmenu = 1; + ypos = 40; + if ( !isDefined( self.perkhudelem ) ) + { + self.perkhudelem = createloadouticon( 0, 0, 200, ypos ); + } + else + { + self.perkhudelem setloadouticoncoords( 0, 0, 200, ypos ); + } + self.perkhudelem setperks( self ); + self.perkhudelem.x = -10; + self.perkhudelem.alpha = 0; + self.perkhudelem fadeovertime( 0,4 ); + self.perkhudelem.alpha = 1; + self.perkhudelem.hidewheninmenu = 1; } showperk( index, perk, ypos ) { /# - assert( game["state"] != "postgame" ); + assert( game[ "state" ] != "postgame" ); #/ - if ( !isdefined( self.perkicon ) ) - { - self.perkicon = []; - self.perkname = []; - } - - if ( !isdefined( self.perkicon[index] ) ) - { + if ( !isDefined( self.perkicon ) ) + { + self.perkicon = []; + self.perkname = []; + } + if ( !isDefined( self.perkicon[ index ] ) ) + { /# - assert( !isdefined( self.perkname[index] ) ); + assert( !isDefined( self.perkname[ index ] ) ); #/ - self.perkicon[index] = createloadouticon( index, 0, 200, ypos ); - self.perkname[index] = createloadouttext( self.perkicon[index], 160 ); - } - else - { - self.perkicon[index] setloadouticoncoords( index, 0, 200, ypos ); - self.perkname[index] setloadouttextcoords( 160 ); - } - - if ( perk == "perk_null" || perk == "weapon_null" || perk == "specialty_null" ) - alpha = 0; - else - { + self.perkicon[ index ] = createloadouticon( index, 0, 200, ypos ); + self.perkname[ index ] = createloadouttext( self.perkicon[ index ], 160 ); + } + else + { + self.perkicon[ index ] setloadouticoncoords( index, 0, 200, ypos ); + self.perkname[ index ] setloadouttextcoords( 160 ); + } + if ( perk != "perk_null" || perk == "weapon_null" && perk == "specialty_null" ) + { + alpha = 0; + } + else + { /# - assert( isdefined( level.perknames[perk] ), perk ); + assert( isDefined( level.perknames[ perk ] ), perk ); #/ - alpha = 1; - } - - showloadoutattribute( self.perkicon[index], perk, alpha, self.perkname[index], level.perknames[perk] ); - self.perkicon[index] moveovertime( 0.3 ); - self.perkicon[index].x = -5; - self.perkicon[index].hidewheninmenu = 1; - self.perkname[index] moveovertime( 0.3 ); - self.perkname[index].x = -40; - self.perkname[index].hidewheninmenu = 1; + alpha = 1; + } + showloadoutattribute( self.perkicon[ index ], perk, alpha, self.perkname[ index ], level.perknames[ perk ] ); + self.perkicon[ index ] moveovertime( 0,3 ); + self.perkicon[ index ].x = -5; + self.perkicon[ index ].hidewheninmenu = 1; + self.perkname[ index ] moveovertime( 0,3 ); + self.perkname[ index ].x = -40; + self.perkname[ index ].hidewheninmenu = 1; } hideperks( fadetime ) { - if ( level.perksenabled == 1 ) - { - if ( game["state"] == "postgame" ) - { + if ( level.perksenabled == 1 ) + { + if ( game[ "state" ] == "postgame" ) + { /# - assert( !isdefined( self.perkhudelem ) ); + assert( !isDefined( self.perkhudelem ) ); #/ - return; - } - } + return; + } + } /# - assert( isdefined( self.perkhudelem ) ); + assert( isDefined( self.perkhudelem ) ); #/ - if ( isdefined( self.perkhudelem ) ) - hideloadoutattribute( self.perkhudelem, fadetime ); + if ( isDefined( self.perkhudelem ) ) + { + hideloadoutattribute( self.perkhudelem, fadetime ); + } } hideperk( index, fadetime, hidetextonly ) { - if ( !isdefined( fadetime ) ) - fadetime = 0.05; - - if ( level.perksenabled == 1 ) - { - if ( game["state"] == "postgame" ) - { - if ( isdefined( self.perkicon ) ) - { + if ( !isDefined( fadetime ) ) + { + fadetime = 0,05; + } + if ( level.perksenabled == 1 ) + { + if ( game[ "state" ] == "postgame" ) + { + if ( isDefined( self.perkicon ) ) + { /# - assert( !isdefined( self.perkicon[index] ) ); + assert( !isDefined( self.perkicon[ index ] ) ); #/ /# - assert( !isdefined( self.perkname[index] ) ); + assert( !isDefined( self.perkname[ index ] ) ); #/ - } - - return; - } + } + return; + } /# - assert( isdefined( self.perkicon[index] ) ); + assert( isDefined( self.perkicon[ index ] ) ); #/ /# - assert( isdefined( self.perkname[index] ) ); + assert( isDefined( self.perkname[ index ] ) ); #/ - if ( isdefined( self.perkicon ) && isdefined( self.perkicon[index] ) && isdefined( self.perkname ) && isdefined( self.perkname[index] ) ) - hideloadoutattribute( self.perkicon[index], fadetime, self.perkname[index], hidetextonly ); - } + if ( isDefined( self.perkicon ) && isDefined( self.perkicon[ index ] ) && isDefined( self.perkname ) && isDefined( self.perkname[ index ] ) ) + { + hideloadoutattribute( self.perkicon[ index ], fadetime, self.perkname[ index ], hidetextonly ); + } + } } hideallperks( fadetime, hidetextonly ) { - if ( level.perksenabled == 1 ) - hideperks( fadetime ); + if ( level.perksenabled == 1 ) + { + hideperks( fadetime ); + } } showkillstreak( index, killstreak, xpos, ypos ) { /# - assert( game["state"] != "postgame" ); + assert( game[ "state" ] != "postgame" ); #/ - if ( !isdefined( self.killstreakicon ) ) - self.killstreakicon = []; - - if ( !isdefined( self.killstreakicon[index] ) ) - self.killstreakicon[index] = createloadouticon( 3, self.killstreak.size - 1 - index, xpos, ypos ); - - if ( killstreak == "killstreak_null" || killstreak == "weapon_null" ) - alpha = 0; - else - { + if ( !isDefined( self.killstreakicon ) ) + { + self.killstreakicon = []; + } + if ( !isDefined( self.killstreakicon[ index ] ) ) + { + self.killstreakicon[ index ] = createloadouticon( 3, ( self.killstreak.size - 1 ) - index, xpos, ypos ); + } + if ( killstreak == "killstreak_null" || killstreak == "weapon_null" ) + { + alpha = 0; + } + else + { /# - assert( isdefined( level.killstreakicons[killstreak] ), killstreak ); + assert( isDefined( level.killstreakicons[ killstreak ] ), killstreak ); #/ - alpha = 1; - } - - showloadoutattribute( self.killstreakicon[index], level.killstreakicons[killstreak], alpha ); + alpha = 1; + } + showloadoutattribute( self.killstreakicon[ index ], level.killstreakicons[ killstreak ], alpha ); } hidekillstreak( index, fadetime ) { - if ( iskillstreaksenabled() ) - { - if ( game["state"] == "postgame" ) - { + if ( iskillstreaksenabled() ) + { + if ( game[ "state" ] == "postgame" ) + { /# - assert( !isdefined( self.killstreakicon[index] ) ); + assert( !isDefined( self.killstreakicon[ index ] ) ); #/ - return; - } + return; + } /# - assert( isdefined( self.killstreakicon[index] ) ); + assert( isDefined( self.killstreakicon[ index ] ) ); #/ - hideloadoutattribute( self.killstreakicon[index], fadetime ); - } + hideloadoutattribute( self.killstreakicon[ index ], fadetime ); + } } setgamemodeinfopoint() { - self.x = 5; - self.y = 120; - self.horzalign = "user_left"; - self.vertalign = "user_top"; - self.alignx = "left"; - self.aligny = "top"; + self.x = 5; + self.y = 120; + self.horzalign = "user_left"; + self.vertalign = "user_top"; + self.alignx = "left"; + self.aligny = "top"; } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_menus.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_menus.gsc index e68c67c..c6a8a1c 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_menus.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_menus.gsc @@ -1,174 +1,167 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\gametypes_zm\_rank; +#include maps/mp/gametypes_zm/_rank; +#include maps/mp/gametypes_zm/_globallogic; +#include maps/mp/_utility; -init() +init() //checked changed to match cerberus output { - precachestring( &"open_ingame_menu" ); - game["menu_team"] = "team_marinesopfor"; - game["menu_initteam_allies"] = "initteam_marines"; - game["menu_initteam_axis"] = "initteam_opfor"; - game["menu_class"] = "class"; - game["menu_changeclass"] = "changeclass"; - game["menu_changeclass_offline"] = "changeclass"; - game["menu_wager_side_bet"] = "sidebet"; - game["menu_wager_side_bet_player"] = "sidebet_player"; - game["menu_changeclass_wager"] = "changeclass_wager"; - game["menu_changeclass_custom"] = "changeclass_custom"; - game["menu_changeclass_barebones"] = "changeclass_barebones"; - - foreach ( team in level.teams ) - game["menu_changeclass_" + team] = "changeclass"; - - game["menu_controls"] = "ingame_controls"; - game["menu_options"] = "ingame_options"; - game["menu_leavegame"] = "popup_leavegame"; - precachemenu( game["menu_controls"] ); - precachemenu( game["menu_options"] ); - precachemenu( game["menu_leavegame"] ); - precachemenu( "scoreboard" ); - precachemenu( "spectate" ); - precachemenu( game["menu_team"] ); - precachemenu( game["menu_changeclass_allies"] ); - precachemenu( game["menu_initteam_allies"] ); - precachemenu( game["menu_changeclass_axis"] ); - precachemenu( game["menu_class"] ); - precachemenu( game["menu_changeclass"] ); - precachemenu( game["menu_initteam_axis"] ); - precachemenu( game["menu_changeclass_offline"] ); - precachemenu( game["menu_changeclass_wager"] ); - precachemenu( game["menu_changeclass_custom"] ); - precachemenu( game["menu_changeclass_barebones"] ); - precachemenu( game["menu_wager_side_bet"] ); - precachemenu( game["menu_wager_side_bet_player"] ); - precachestring( &"MP_HOST_ENDED_GAME" ); - precachestring( &"MP_HOST_ENDGAME_RESPONSE" ); - level thread onplayerconnect(); + precachestring( &"open_ingame_menu" ); + game[ "menu_team" ] = "team_marinesopfor"; + game[ "menu_initteam_allies" ] = "initteam_marines"; + game[ "menu_initteam_axis" ] = "initteam_opfor"; + game[ "menu_class" ] = "class"; + game[ "menu_changeclass" ] = "changeclass"; + game[ "menu_changeclass_offline" ] = "changeclass"; + game[ "menu_wager_side_bet" ] = "sidebet"; + game[ "menu_wager_side_bet_player" ] = "sidebet_player"; + game[ "menu_changeclass_wager" ] = "changeclass_wager"; + game[ "menu_changeclass_custom" ] = "changeclass_custom"; + game[ "menu_changeclass_barebones" ] = "changeclass_barebones"; + foreach ( team in level.teams ) + { + game[ "menu_changeclass_" + team ] = "changeclass"; + } + game[ "menu_controls" ] = "ingame_controls"; + game[ "menu_options" ] = "ingame_options"; + game[ "menu_leavegame" ] = "popup_leavegame"; + precachemenu( game[ "menu_controls" ] ); + precachemenu( game[ "menu_options" ] ); + precachemenu( game[ "menu_leavegame" ] ); + precachemenu( "scoreboard" ); + precachemenu( "spectate" ); + precachemenu( game[ "menu_team" ] ); + precachemenu( game[ "menu_changeclass_allies" ] ); + precachemenu( game[ "menu_initteam_allies" ] ); + precachemenu( game[ "menu_changeclass_axis" ] ); + precachemenu( game[ "menu_class" ] ); + precachemenu( game[ "menu_changeclass" ] ); + precachemenu( game[ "menu_initteam_axis" ] ); + precachemenu( game[ "menu_changeclass_offline" ] ); + precachemenu( game[ "menu_changeclass_wager" ] ); + precachemenu( game[ "menu_changeclass_custom" ] ); + precachemenu( game[ "menu_changeclass_barebones" ] ); + precachemenu( game[ "menu_wager_side_bet" ] ); + precachemenu( game[ "menu_wager_side_bet_player" ] ); + precachestring( &"MP_HOST_ENDED_GAME" ); + precachestring( &"MP_HOST_ENDGAME_RESPONSE" ); + level thread onplayerconnect(); } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - player thread onmenuresponse(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player thread onmenuresponse(); + } } -onmenuresponse() +onmenuresponse() //checked changed to match cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "menuresponse", menu, response ); - - if ( response == "back" ) - { - self closemenu(); - self closeingamemenu(); - - if ( level.console ) - { - if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_team"] || menu == game["menu_controls"] ) - { - if ( isdefined( level.teams[self.pers["team"]] ) ) - self openmenu( game["menu_class"] ); - } - } - - continue; - } - - if ( response == "changeteam" && level.allow_teamchange == "1" ) - { - self closemenu(); - self closeingamemenu(); - self openmenu( game["menu_team"] ); - } - - if ( response == "changeclass_marines_splitscreen" ) - self openmenu( "changeclass_marines_splitscreen" ); - - if ( response == "changeclass_opfor_splitscreen" ) - self openmenu( "changeclass_opfor_splitscreen" ); - - if ( response == "endgame" ) - { - if ( self issplitscreen() ) - { - level.skipvote = 1; - - if ( !level.gameended ) - level thread maps\mp\gametypes_zm\_globallogic::forceend(); - } - - continue; - } - - if ( response == "killserverpc" ) - { - level thread maps\mp\gametypes_zm\_globallogic::killserverpc(); - continue; - } - - if ( response == "endround" ) - { - if ( !level.gameended ) - level thread maps\mp\gametypes_zm\_globallogic::forceend(); - else - { - self closemenu(); - self closeingamemenu(); - self iprintln( &"MP_HOST_ENDGAME_RESPONSE" ); - } - - continue; - } - - if ( menu == game["menu_team"] && level.allow_teamchange == "1" ) - { - switch ( response ) - { - case "autoassign": - self [[ level.autoassign ]]( 1 ); - break; - case "spectator": - self [[ level.spectator ]](); - break; - default: - self [[ level.teammenu ]]( response ); - break; - } - - continue; - } - - if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_changeclass_wager"] || menu == game["menu_changeclass_custom"] || menu == game["menu_changeclass_barebones"] ) - { - self closemenu(); - self closeingamemenu(); - - if ( level.rankedmatch && issubstr( response, "custom" ) ) - { - if ( self isitemlocked( maps\mp\gametypes_zm\_rank::getitemindex( "feature_cac" ) ) ) - kick( self getentitynumber() ); - } - - self.selectedclass = 1; - self [[ level.class ]]( response ); - continue; - } - - if ( menu == "spectate" ) - { - player = getplayerfromclientnum( int( response ) ); - - if ( isdefined( player ) ) - self setcurrentspectatorclient( player ); - } - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "menuresponse", menu, response ); + if ( response == "back" ) + { + self closemenu(); + self closeingamemenu(); + if ( level.console ) + { + if ( menu == game[ "menu_changeclass" ] || menu == game[ "menu_changeclass_offline" ] || menu == game[ "menu_team" ] || menu == game[ "menu_controls" ] ) + { + if ( isDefined( level.teams[ self.pers[ "team" ] ] ) ) + { + self openmenu( game[ "menu_class" ] ); + } + } + } + continue; + } + if ( response == "changeteam" && level.allow_teamchange == "1" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game[ "menu_team" ] ); + } + if ( response == "changeclass_marines_splitscreen" ) + { + self openmenu( "changeclass_marines_splitscreen" ); + } + if ( response == "changeclass_opfor_splitscreen" ) + { + self openmenu( "changeclass_opfor_splitscreen" ); + } + if ( response == "endgame" ) + { + if ( level.splitscreen ) + { + level.skipvote = 1; + if ( !level.gameended ) + { + level thread maps/mp/gametypes_zm/_globallogic::forceend(); + } + } + continue; + } + if ( response == "killserverpc" ) + { + level thread maps/mp/gametypes_zm/_globallogic::killserverpc(); + continue; + } + if ( response == "endround" ) + { + if ( !level.gameended ) + { + self gamehistoryplayerquit(); + level thread maps/mp/gametypes_zm/_globallogic::forceend(); + } + else + { + self closemenu(); + self closeingamemenu(); + self iprintln( &"MP_HOST_ENDGAME_RESPONSE" ); + } + continue; + } + if ( menu == game[ "menu_team" ] && level.allow_teamchange == "1" ) + { + switch( response ) + { + case "autoassign": + self [[ level.autoassign ]]( 1 ); + break; + case "spectator": + self [[ level.spectator ]](); + break; + default: + self [[ level.teammenu ]]( response ); + break; + } + continue; + } + if ( menu == game[ "menu_changeclass" ] || menu == game[ "menu_changeclass_offline" ] || menu == game[ "menu_changeclass_wager" ] || menu == game[ "menu_changeclass_custom" ] || menu == game[ "menu_changeclass_barebones" ] ) + { + self closemenu(); + self closeingamemenu(); + if ( level.rankedmatch && issubstr( response, "custom" ) ) + { + if ( self isitemlocked( maps/mp/gametypes_zm/_rank::getitemindex( "feature_cac" ) ) ) + { + kick( self getentitynumber() ); + } + } + self.selectedclass = 1; + self [[ level.class ]]( response ); + continue; + } + if ( menu == "spectate" ) + { + player = getplayerfromclientnum( int( response ) ); + if ( isDefined( player ) ) + { + self setcurrentspectatorclient( player ); + } + } + } } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_perplayer.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_perplayer.gsc index eac9f10..a95a168 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_perplayer.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_perplayer.gsc @@ -1,179 +1,185 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; +#include maps/mp/_utility; -init( id, playerbegincallback, playerendcallback ) +init( id, playerbegincallback, playerendcallback ) //checked matches cerberus output { - precacheshader( "objpoint_default" ); - handler = spawnstruct(); - handler.id = id; - handler.playerbegincallback = playerbegincallback; - handler.playerendcallback = playerendcallback; - handler.enabled = 0; - handler.players = []; - thread onplayerconnect( handler ); - level.handlerglobalflagval = 0; - return handler; + precacheshader( "objpoint_default" ); + handler = spawnstruct(); + handler.id = id; + handler.playerbegincallback = playerbegincallback; + handler.playerendcallback = playerendcallback; + handler.enabled = 0; + handler.players = []; + thread onplayerconnect( handler ); + level.handlerglobalflagval = 0; + return handler; } -enable( handler ) +enable( handler ) //checked partially changed to match cerberus output didn't change while loop to for loop to prevent infinite loop continue bug { - if ( handler.enabled ) - return; - - handler.enabled = 1; - level.handlerglobalflagval++; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i].handlerflagval = level.handlerglobalflagval; - - players = handler.players; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i].handlerflagval != level.handlerglobalflagval ) - continue; - - if ( players[i].handlers[handler.id].ready ) - players[i] handleplayer( handler ); - } + if ( handler.enabled ) + { + return; + } + handler.enabled = 1; + level.handlerglobalflagval++; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ].handlerflagval = level.handlerglobalflagval; + } + players = handler.players; + i = 0; + while ( i < players.size ) + { + if ( players[ i ].handlerflagval != level.handlerglobalflagval ) + { + i++; + continue; + } + if ( players[ i ].handlers[ handler.id ].ready ) + { + players[ i ] handleplayer( handler ); + } + i++; + } +} + +disable( handler ) //checked partially changed to match cerberus output didn't change while loop to for loop to prevent infinite loop continue bug +{ + if ( !handler.enabled ) + { + return; + } + handler.enabled = 0; + level.handlerglobalflagval++; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ].handlerflagval = level.handlerglobalflagval; + } + players = handler.players; + i = 0; + while ( i < players.size ) + { + if ( players[ i ].handlerflagval != level.handlerglobalflagval ) + { + i++; + continue; + } + if ( players[ i ].handlers[ handler.id ].ready ) + { + players[ i ] unhandleplayer( handler, 0, 0 ); + } + i++; + } } -disable( handler ) +onplayerconnect( handler ) //checked matches cerberus output { - if ( !handler.enabled ) - return; - - handler.enabled = 0; - level.handlerglobalflagval++; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i].handlerflagval = level.handlerglobalflagval; - - players = handler.players; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i].handlerflagval != level.handlerglobalflagval ) - continue; - - if ( players[i].handlers[handler.id].ready ) - players[i] unhandleplayer( handler, 0, 0 ); - } + for ( ;; ) + { + level waittill( "connecting", player ); + if ( !isDefined( player.handlers ) ) + { + player.handlers = []; + } + player.handlers[ handler.id ] = spawnstruct(); + player.handlers[ handler.id ].ready = 0; + player.handlers[ handler.id ].handled = 0; + player.handlerflagval = -1; + handler.players[ handler.players.size ] = player; + player thread onplayerdisconnect( handler ); + player thread onplayerspawned( handler ); + player thread onjoinedteam( handler ); + player thread onjoinedspectators( handler ); + player thread onplayerkilled( handler ); + } } -onplayerconnect( handler ) +onplayerdisconnect( handler ) //checked changed to match cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - if ( !isdefined( player.handlers ) ) - player.handlers = []; - - player.handlers[handler.id] = spawnstruct(); - player.handlers[handler.id].ready = 0; - player.handlers[handler.id].handled = 0; - player.handlerflagval = -1; - handler.players[handler.players.size] = player; - player thread onplayerdisconnect( handler ); - player thread onplayerspawned( handler ); - player thread onjoinedteam( handler ); - player thread onjoinedspectators( handler ); - player thread onplayerkilled( handler ); - } + self waittill( "disconnect" ); + newplayers = []; + for ( i = 0; i < handler.players.size; i++ ) + { + if ( handler.players[ i ] != self ) + { + newplayers[ newplayers.size ] = handler.players[ i ]; + } + } + handler.players = newplayers; + self thread unhandleplayer( handler, 1, 1 ); } -onplayerdisconnect( handler ) +onjoinedteam( handler ) //checked matches cerberus output { - self waittill( "disconnect" ); - - newplayers = []; - - for ( i = 0; i < handler.players.size; i++ ) - { - if ( handler.players[i] != self ) - newplayers[newplayers.size] = handler.players[i]; - } - - handler.players = newplayers; - self thread unhandleplayer( handler, 1, 1 ); + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "joined_team" ); + self thread unhandleplayer( handler, 1, 0 ); + } } -onjoinedteam( handler ) +onjoinedspectators( handler ) //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "joined_team" ); - - self thread unhandleplayer( handler, 1, 0 ); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "joined_spectators" ); + self thread unhandleplayer( handler, 1, 0 ); + } } -onjoinedspectators( handler ) +onplayerspawned( handler ) //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "joined_spectators" ); - - self thread unhandleplayer( handler, 1, 0 ); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread handleplayer( handler ); + } } -onplayerspawned( handler ) +onplayerkilled( handler ) //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self thread handleplayer( handler ); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "killed_player" ); + self thread unhandleplayer( handler, 1, 0 ); + } } -onplayerkilled( handler ) +handleplayer( handler ) //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "killed_player" ); - - self thread unhandleplayer( handler, 1, 0 ); - } + self.handlers[ handler.id ].ready = 1; + if ( !handler.enabled ) + { + return; + } + if ( self.handlers[ handler.id ].handled ) + { + return; + } + self.handlers[ handler.id ].handled = 1; + self thread [[ handler.playerbegincallback ]](); } -handleplayer( handler ) +unhandleplayer( handler, unsetready, disconnected ) //checked matches cerberus output { - self.handlers[handler.id].ready = 1; - - if ( !handler.enabled ) - return; - - if ( self.handlers[handler.id].handled ) - return; - - self.handlers[handler.id].handled = 1; - self thread [[ handler.playerbegincallback ]](); + if ( !disconnected && unsetready ) + { + self.handlers[ handler.id ].ready = 0; + } + if ( !self.handlers[ handler.id ].handled ) + { + return; + } + if ( !disconnected ) + { + self.handlers[ handler.id ].handled = 0; + } + self thread [[ handler.playerendcallback ]]( disconnected ); } -unhandleplayer( handler, unsetready, disconnected ) -{ - if ( !disconnected && unsetready ) - self.handlers[handler.id].ready = 0; - - if ( !self.handlers[handler.id].handled ) - return; - - if ( !disconnected ) - self.handlers[handler.id].handled = 0; - - self thread [[ handler.playerendcallback ]]( disconnected ); -} diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc index 8b412b7..9ff2831 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc @@ -1,27 +1,25 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -init() +init() //checked matches cerberus output { - setdvar( "g_ScoresColor_Spectator", ".25 .25 .25" ); - setdvar( "g_ScoresColor_Free", ".76 .78 .10" ); - setdvar( "g_teamColor_MyTeam", ".4 .7 .4" ); - setdvar( "g_teamColor_EnemyTeam", "1 .315 0.35" ); - setdvar( "g_teamColor_MyTeamAlt", ".35 1 1" ); - setdvar( "g_teamColor_EnemyTeamAlt", "1 .5 0" ); - setdvar( "g_teamColor_Squad", ".315 0.35 1" ); - - if ( level.createfx_enabled ) - return; - - if ( sessionmodeiszombiesgame() ) - { - setdvar( "g_TeamIcon_Axis", "faction_cia" ); - setdvar( "g_TeamIcon_Allies", "faction_cdc" ); - } - else - { - setdvar( "g_TeamIcon_Axis", game["icons"]["axis"] ); - setdvar( "g_TeamIcon_Allies", game["icons"]["allies"] ); - } + setdvar( "g_ScoresColor_Spectator", ".25 .25 .25" ); + setdvar( "g_ScoresColor_Free", ".76 .78 .10" ); + setdvar( "g_teamColor_MyTeam", ".4 .7 .4" ); + setdvar( "g_teamColor_EnemyTeam", "1 .315 0.35" ); + setdvar( "g_teamColor_MyTeamAlt", ".35 1 1" ); + setdvar( "g_teamColor_EnemyTeamAlt", "1 .5 0" ); + setdvar( "g_teamColor_Squad", ".315 0.35 1" ); + if ( level.createfx_enabled ) + { + return; + } + if ( sessionmodeiszombiesgame() ) + { + setdvar( "g_TeamIcon_Axis", "faction_cia" ); + setdvar( "g_TeamIcon_Allies", "faction_cdc" ); + } + else + { + setdvar( "g_TeamIcon_Axis", game[ "icons" ][ "axis" ] ); + setdvar( "g_TeamIcon_Allies", game[ "icons" ][ "allies" ] ); + } } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_serversettings.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_serversettings.gsc index ff5002b..cb34b8a 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_serversettings.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_serversettings.gsc @@ -1,191 +1,202 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -init() +init() //checked matches cerberus output { - level.hostname = getdvar( "sv_hostname" ); - - if ( level.hostname == "" ) - level.hostname = "CoDHost"; - - setdvar( "sv_hostname", level.hostname ); - setdvar( "ui_hostname", level.hostname ); - makedvarserverinfo( "ui_hostname", "CoDHost" ); - level.motd = getdvar( "scr_motd" ); - - if ( level.motd == "" ) - level.motd = ""; - - setdvar( "scr_motd", level.motd ); - setdvar( "ui_motd", level.motd ); - makedvarserverinfo( "ui_motd", "" ); - level.allowvote = getdvar( "g_allowVote" ); - - if ( level.allowvote == "" ) - level.allowvote = "1"; - - setdvar( "g_allowvote", level.allowvote ); - setdvar( "ui_allowvote", level.allowvote ); - makedvarserverinfo( "ui_allowvote", "1" ); - level.allow_teamchange = "0"; - - if ( sessionmodeisprivate() || !sessionmodeisonlinegame() ) - level.allow_teamchange = "1"; - - setdvar( "ui_allow_teamchange", level.allow_teamchange ); - level.friendlyfire = getgametypesetting( "friendlyfiretype" ); - setdvar( "ui_friendlyfire", level.friendlyfire ); - makedvarserverinfo( "ui_friendlyfire", "0" ); - - if ( getdvar( "scr_mapsize" ) == "" ) - setdvar( "scr_mapsize", "64" ); - else if ( getdvarfloat( "scr_mapsize" ) >= 64 ) - setdvar( "scr_mapsize", "64" ); - else if ( getdvarfloat( "scr_mapsize" ) >= 32 ) - setdvar( "scr_mapsize", "32" ); - else if ( getdvarfloat( "scr_mapsize" ) >= 16 ) - setdvar( "scr_mapsize", "16" ); - else - setdvar( "scr_mapsize", "8" ); - - level.mapsize = getdvarfloat( "scr_mapsize" ); - constraingametype( getdvar( "g_gametype" ) ); - constrainmapsize( level.mapsize ); - - for (;;) - { - updateserversettings(); - wait 5; - } + level.hostname = getDvar( "sv_hostname" ); + if ( level.hostname == "" ) + { + level.hostname = "CoDHost"; + } + setdvar( "sv_hostname", level.hostname ); + setdvar( "ui_hostname", level.hostname ); + makedvarserverinfo( "ui_hostname", "CoDHost" ); + level.motd = getDvar( "scr_motd" ); + if ( level.motd == "" ) + { + level.motd = ""; + } + setdvar( "scr_motd", level.motd ); + setdvar( "ui_motd", level.motd ); + makedvarserverinfo( "ui_motd", "" ); + level.allowvote = getDvar( "g_allowVote" ); + if ( level.allowvote == "" ) + { + level.allowvote = "1"; + } + setdvar( "g_allowvote", level.allowvote ); + setdvar( "ui_allowvote", level.allowvote ); + makedvarserverinfo( "ui_allowvote", "1" ); + level.allow_teamchange = "0"; + if ( sessionmodeisprivate() || !sessionmodeisonlinegame() ) + { + level.allow_teamchange = "1"; + } + setdvar( "ui_allow_teamchange", level.allow_teamchange ); + level.friendlyfire = getgametypesetting( "friendlyfiretype" ); + setdvar( "ui_friendlyfire", level.friendlyfire ); + makedvarserverinfo( "ui_friendlyfire", "0" ); + if ( getDvar( "scr_mapsize" ) == "" ) + { + setdvar( "scr_mapsize", "64" ); + } + else if ( getDvarFloat( "scr_mapsize" ) >= 64 ) + { + setdvar( "scr_mapsize", "64" ); + } + else if ( getDvarFloat( "scr_mapsize" ) >= 32 ) + { + setdvar( "scr_mapsize", "32" ); + } + else if ( getDvarFloat( "scr_mapsize" ) >= 16 ) + { + setdvar( "scr_mapsize", "16" ); + } + else + { + setdvar( "scr_mapsize", "8" ); + } + level.mapsize = getDvarFloat( "scr_mapsize" ); + constraingametype( getDvar( "g_gametype" ) ); + constrainmapsize( level.mapsize ); + for ( ;; ) + { + updateserversettings(); + wait 5; + } } -updateserversettings() +updateserversettings() //checked matches cerberus output { - sv_hostname = getdvar( "sv_hostname" ); - - if ( level.hostname != sv_hostname ) - { - level.hostname = sv_hostname; - setdvar( "ui_hostname", level.hostname ); - } - - scr_motd = getdvar( "scr_motd" ); - - if ( level.motd != scr_motd ) - { - level.motd = scr_motd; - setdvar( "ui_motd", level.motd ); - } - - g_allowvote = getdvar( "g_allowVote" ); - - if ( level.allowvote != g_allowvote ) - { - level.allowvote = g_allowvote; - setdvar( "ui_allowvote", level.allowvote ); - } - - scr_friendlyfire = getgametypesetting( "friendlyfiretype" ); - - if ( level.friendlyfire != scr_friendlyfire ) - { - level.friendlyfire = scr_friendlyfire; - setdvar( "ui_friendlyfire", level.friendlyfire ); - } + sv_hostname = getDvar( "sv_hostname" ); + if ( level.hostname != sv_hostname ) + { + level.hostname = sv_hostname; + setdvar( "ui_hostname", level.hostname ); + } + scr_motd = getDvar( "scr_motd" ); + if ( level.motd != scr_motd ) + { + level.motd = scr_motd; + setdvar( "ui_motd", level.motd ); + } + g_allowvote = getDvar( "g_allowVote" ); + if ( level.allowvote != g_allowvote ) + { + level.allowvote = g_allowvote; + setdvar( "ui_allowvote", level.allowvote ); + } + scr_friendlyfire = getgametypesetting( "friendlyfiretype" ); + if ( level.friendlyfire != scr_friendlyfire ) + { + level.friendlyfire = scr_friendlyfire; + setdvar( "ui_friendlyfire", level.friendlyfire ); + } } -constraingametype( gametype ) +constraingametype( gametype ) //checked partially changed to match cerberus output did not change while loop to for for loop because of infinite loop caused by continues { - entities = getentarray(); - - for ( i = 0; i < entities.size; i++ ) - { - entity = entities[i]; - - if ( gametype == "dm" ) - { - if ( isdefined( entity.script_gametype_dm ) && entity.script_gametype_dm != "1" ) - entity delete(); - - continue; - } - - if ( gametype == "tdm" ) - { - if ( isdefined( entity.script_gametype_tdm ) && entity.script_gametype_tdm != "1" ) - entity delete(); - - continue; - } - - if ( gametype == "ctf" ) - { - if ( isdefined( entity.script_gametype_ctf ) && entity.script_gametype_ctf != "1" ) - entity delete(); - - continue; - } - - if ( gametype == "hq" ) - { - if ( isdefined( entity.script_gametype_hq ) && entity.script_gametype_hq != "1" ) - entity delete(); - - continue; - } - - if ( gametype == "sd" ) - { - if ( isdefined( entity.script_gametype_sd ) && entity.script_gametype_sd != "1" ) - entity delete(); - - continue; - } - - if ( gametype == "koth" ) - { - if ( isdefined( entity.script_gametype_koth ) && entity.script_gametype_koth != "1" ) - entity delete(); - } - } + entities = getentarray(); + i = 0; + while ( i < entities.size ) + { + entity = entities[ i ]; + if ( gametype == "dm" ) + { + if ( isDefined( entity.script_gametype_dm ) && entity.script_gametype_dm != "1" ) + { + entity delete(); + } + i++; + continue; + } + if ( gametype == "tdm" ) + { + if ( isDefined( entity.script_gametype_tdm ) && entity.script_gametype_tdm != "1" ) + { + entity delete(); + } + i++; + continue; + } + if ( gametype == "ctf" ) + { + if ( isDefined( entity.script_gametype_ctf ) && entity.script_gametype_ctf != "1" ) + { + entity delete(); + } + i++; + continue; + } + if ( gametype == "hq" ) + { + if ( isDefined( entity.script_gametype_hq ) && entity.script_gametype_hq != "1" ) + { + entity delete(); + } + i++; + continue; + } + if ( gametype == "sd" ) + { + if ( isDefined( entity.script_gametype_sd ) && entity.script_gametype_sd != "1" ) + { + entity delete(); + } + i++; + continue; + } + if ( gametype == "koth" ) + { + if ( isDefined( entity.script_gametype_koth ) && entity.script_gametype_koth != "1" ) + { + entity delete(); + } + } + i++; + } } -constrainmapsize( mapsize ) +constrainmapsize( mapsize ) //checked partially changed to match cerberus output did not change while loop to for for loop because of infinite loop caused by continues { - entities = getentarray(); - - for ( i = 0; i < entities.size; i++ ) - { - entity = entities[i]; - - if ( int( mapsize ) == 8 ) - { - if ( isdefined( entity.script_mapsize_08 ) && entity.script_mapsize_08 != "1" ) - entity delete(); - - continue; - } - - if ( int( mapsize ) == 16 ) - { - if ( isdefined( entity.script_mapsize_16 ) && entity.script_mapsize_16 != "1" ) - entity delete(); - - continue; - } - - if ( int( mapsize ) == 32 ) - { - if ( isdefined( entity.script_mapsize_32 ) && entity.script_mapsize_32 != "1" ) - entity delete(); - - continue; - } - - if ( int( mapsize ) == 64 ) - { - if ( isdefined( entity.script_mapsize_64 ) && entity.script_mapsize_64 != "1" ) - entity delete(); - } - } + entities = getentarray(); + i = 0; + while ( i < entities.size ) + { + entity = entities[ i ]; + if ( int( mapsize ) == 8 ) + { + if ( isDefined( entity.script_mapsize_08 ) && entity.script_mapsize_08 != "1" ) + { + entity delete(); + } + i++; + continue; + } + if ( int( mapsize ) == 16 ) + { + if ( isDefined( entity.script_mapsize_16 ) && entity.script_mapsize_16 != "1" ) + { + entity delete(); + } + i++; + continue; + } + if ( int( mapsize ) == 32 ) + { + if ( isDefined( entity.script_mapsize_32 ) && entity.script_mapsize_32 != "1" ) + { + entity delete(); + } + i++; + continue; + } + if ( int( mapsize ) == 64 ) + { + if ( isDefined( entity.script_mapsize_64 ) && entity.script_mapsize_64 != "1" ) + { + entity delete(); + } + } + i++; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_shellshock.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_shellshock.gsc index 31ded74..c718e80 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_shellshock.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_shellshock.gsc @@ -1,56 +1,65 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - precacheshellshock( "frag_grenade_mp" ); - precacheshellshock( "damage_mp" ); - precacherumble( "artillery_rumble" ); - precacherumble( "grenade_rumble" ); + precacheshellshock( "frag_grenade_mp" ); + precacheshellshock( "damage_mp" ); + precacherumble( "artillery_rumble" ); + precacherumble( "grenade_rumble" ); } shellshockondamage( cause, damage ) { - if ( cause == "MOD_EXPLOSIVE" || cause == "MOD_GRENADE" || cause == "MOD_GRENADE_SPLASH" || cause == "MOD_PROJECTILE" || cause == "MOD_PROJECTILE_SPLASH" ) - { - time = 0; - - if ( damage >= 90 ) - time = 4; - else if ( damage >= 50 ) - time = 3; - else if ( damage >= 25 ) - time = 2; - else if ( damage > 10 ) - time = 2; - - if ( time ) - { - if ( self mayapplyscreeneffect() ) - self shellshock( "frag_grenade_mp", 0.5 ); - } - } + if ( cause != "MOD_EXPLOSIVE" && cause != "MOD_GRENADE" && cause != "MOD_GRENADE_SPLASH" || cause == "MOD_PROJECTILE" && cause == "MOD_PROJECTILE_SPLASH" ) + { + time = 0; + if ( damage >= 90 ) + { + time = 4; + } + else if ( damage >= 50 ) + { + time = 3; + } + else if ( damage >= 25 ) + { + time = 2; + } + else + { + if ( damage > 10 ) + { + time = 2; + } + } + if ( time ) + { + if ( self mayapplyscreeneffect() ) + { + self shellshock( "frag_grenade_mp", 0.5 ); + } + } + } } endondeath() { - self waittill( "death" ); - - waittillframeend; - self notify( "end_explode" ); + self waittill( "death" ); + waittillframeend; + self notify( "end_explode" ); } endontimer( timer ) { - self endon( "disconnect" ); - wait( timer ); - self notify( "end_on_timer" ); + self endon( "disconnect" ); + wait timer; + self notify( "end_on_timer" ); } rcbomb_earthquake( position ) { - playrumbleonposition( "grenade_rumble", position ); - earthquake( 0.5, 0.5, self.origin, 512 ); + playrumbleonposition( "grenade_rumble", position ); + earthquake( 0.5, 0.5, self.origin, 512 ); } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawning.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawning.gsc index 62459dc..ce29a09 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawning.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawning.gsc @@ -1,957 +1,1073 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\gametypes_zm\_spawnlogic; +#include maps/mp/gametypes_zm/_spawnlogic; +#include common_scripts/utility; +#include maps/mp/_utility; init() { - if ( !isdefined( level.gamemodespawndvars ) ) - level.gamemodespawndvars = ::default_gamemodespawndvars; - - level init_spawn_system(); - level.recently_deceased = []; - - foreach ( team in level.teams ) - level.recently_deceased[team] = spawn_array_struct(); - - level thread onplayerconnect(); - - if ( getdvar( _hash_AD6C19FE ) == "" ) - level.spawn_visibility_check_max = 20; - else - level.spawn_visibility_check_max = getdvarint( _hash_AD6C19FE ); - - level.spawnprotectiontime = getgametypesetting( "spawnprotectiontime" ); + if ( !isDefined( level.gamemodespawndvars ) ) + { + level.gamemodespawndvars = ::default_gamemodespawndvars; + } + level init_spawn_system(); + level.recently_deceased = []; + _a74 = level.teams; + _k74 = getFirstArrayKey( _a74 ); + while ( isDefined( _k74 ) ) + { + team = _a74[ _k74 ]; + level.recently_deceased[ team ] = spawn_array_struct(); + _k74 = getNextArrayKey( _a74, _k74 ); + } + level thread onplayerconnect(); + if ( getDvar( #"AD6C19FE" ) == "" ) + { + level.spawn_visibility_check_max = 20; + } + else + { + level.spawn_visibility_check_max = getDvarInt( #"AD6C19FE" ); + } + level.spawnprotectiontime = getgametypesetting( "spawnprotectiontime" ); /# - setdvar( "scr_debug_spawn_player", "" ); - setdvar( "scr_debug_render_spawn_data", "1" ); - setdvar( "scr_debug_render_snapshotmode", "0" ); - setdvar( "scr_spawn_point_test_mode", "0" ); - level.test_spawn_point_index = 0; - setdvar( "scr_debug_render_spawn_text", "1" ); + setdvar( "scr_debug_spawn_player", "" ); + setdvar( "scr_debug_render_spawn_data", "1" ); + setdvar( "scr_debug_render_snapshotmode", "0" ); + setdvar( "scr_spawn_point_test_mode", "0" ); + level.test_spawn_point_index = 0; + setdvar( "scr_debug_render_spawn_text", "1" ); #/ + return; } default_gamemodespawndvars( reset_dvars ) { - } init_spawn_system() { - level.spawnsystem = spawnstruct(); - spawnsystem = level.spawnsystem; - level get_player_spawning_dvars( 1 ); - level thread initialize_player_spawning_dvars(); - spawnsystem.einfluencer_shape_sphere = 0; - spawnsystem.einfluencer_shape_cylinder = 1; - spawnsystem.einfluencer_type_normal = 0; - spawnsystem.einfluencer_type_player = 1; - spawnsystem.einfluencer_type_weapon = 2; - spawnsystem.einfluencer_type_dog = 3; - spawnsystem.einfluencer_type_vehicle = 4; - spawnsystem.einfluencer_type_game_mode = 6; - spawnsystem.einfluencer_type_enemy_spawned = 7; - spawnsystem.einfluencer_curve_constant = 0; - spawnsystem.einfluencer_curve_linear = 1; - spawnsystem.einfluencer_curve_steep = 2; - spawnsystem.einfluencer_curve_inverse_linear = 3; - spawnsystem.einfluencer_curve_negative_to_positive = 4; - spawnsystem.ispawn_teammask = []; - spawnsystem.ispawn_teammask_free = 1; - spawnsystem.ispawn_teammask["free"] = spawnsystem.ispawn_teammask_free; - all = spawnsystem.ispawn_teammask_free; - count = 1; - - foreach ( team in level.teams ) - { - spawnsystem.ispawn_teammask[team] = 1 << count; - all |= spawnsystem.ispawn_teammask[team]; - count++; - } - - spawnsystem.ispawn_teammask["all"] = all; + level.spawnsystem = spawnstruct(); + spawnsystem = level.spawnsystem; + level get_player_spawning_dvars( 1 ); + level thread initialize_player_spawning_dvars(); + spawnsystem.einfluencer_shape_sphere = 0; + spawnsystem.einfluencer_shape_cylinder = 1; + spawnsystem.einfluencer_type_normal = 0; + spawnsystem.einfluencer_type_player = 1; + spawnsystem.einfluencer_type_weapon = 2; + spawnsystem.einfluencer_type_dog = 3; + spawnsystem.einfluencer_type_vehicle = 4; + spawnsystem.einfluencer_type_game_mode = 6; + spawnsystem.einfluencer_type_enemy_spawned = 7; + spawnsystem.einfluencer_curve_constant = 0; + spawnsystem.einfluencer_curve_linear = 1; + spawnsystem.einfluencer_curve_steep = 2; + spawnsystem.einfluencer_curve_inverse_linear = 3; + spawnsystem.einfluencer_curve_negative_to_positive = 4; + spawnsystem.ispawn_teammask = []; + spawnsystem.ispawn_teammask_free = 1; + spawnsystem.ispawn_teammask[ "free" ] = spawnsystem.ispawn_teammask_free; + all = spawnsystem.ispawn_teammask_free; + count = 1; + _a146 = level.teams; + _k146 = getFirstArrayKey( _a146 ); + while ( isDefined( _k146 ) ) + { + team = _a146[ _k146 ]; + spawnsystem.ispawn_teammask[ team ] = 1 << count; + all |= spawnsystem.ispawn_teammask[ team ]; + count++; + _k146 = getNextArrayKey( _a146, _k146 ); + } + spawnsystem.ispawn_teammask[ "all" ] = all; } onplayerconnect() { - level endon( "game_ended" ); - - for (;;) - { - level waittill( "connecting", player ); - - player setentertime( gettime() ); - player thread onplayerspawned(); - player thread ondisconnect(); - player thread onteamchange(); - player thread ongrenadethrow(); - } + level endon( "game_ended" ); + for ( ;; ) + { + level waittill( "connecting", player ); + player setentertime( getTime() ); + player thread onplayerspawned(); + player thread ondisconnect(); + player thread onteamchange(); + player thread ongrenadethrow(); + } } onplayerspawned() { - self endon( "disconnect" ); - level endon( "game_ended" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self thread initialspawnprotection( "specialty_nottargetedbyairsupport", 1 ); - self thread initialspawnprotection( "specialty_nokillstreakreticle", 0 ); - self thread initialspawnprotection( "specialty_nottargettedbysentry", 0 ); - - if ( isdefined( self.pers["hasRadar"] ) && self.pers["hasRadar"] ) - self.hasspyplane = 1; - - self enable_player_influencers( 1 ); - self thread ondeath(); - } + self endon( "disconnect" ); + level endon( "game_ended" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread initialspawnprotection( "specialty_nottargetedbyairsupport", 1 ); + self thread initialspawnprotection( "specialty_nokillstreakreticle", 0 ); + self thread initialspawnprotection( "specialty_nottargettedbysentry", 0 ); + if ( isDefined( self.pers[ "hasRadar" ] ) && self.pers[ "hasRadar" ] ) + { + self.hasspyplane = 1; + } + self enable_player_influencers( 1 ); + self thread ondeath(); + } } ondeath() { - self endon( "disconnect" ); - level endon( "game_ended" ); - - self waittill( "death" ); - - self enable_player_influencers( 0 ); - self create_body_influencers(); + self endon( "disconnect" ); + level endon( "game_ended" ); + self waittill( "death" ); + self enable_player_influencers( 0 ); + self create_body_influencers(); } onteamchange() { - self endon( "disconnect" ); - level endon( "game_ended" ); - - while ( true ) - { - self waittill( "joined_team" ); - - self player_influencers_set_team(); - wait 0.05; - } + self endon( "disconnect" ); + level endon( "game_ended" ); + while ( 1 ) + { + self waittill( "joined_team" ); + self player_influencers_set_team(); + wait 0,05; + } } ongrenadethrow() { - self endon( "disconnect" ); - level endon( "game_ended" ); - - while ( true ) - { - self waittill( "grenade_fire", grenade, weaponname ); - - level thread create_grenade_influencers( self.pers["team"], weaponname, grenade ); - wait 0.05; - } + self endon( "disconnect" ); + level endon( "game_ended" ); + while ( 1 ) + { + self waittill( "grenade_fire", grenade, weaponname ); + level thread create_grenade_influencers( self.pers[ "team" ], weaponname, grenade ); + wait 0,05; + } } ondisconnect() { - level endon( "game_ended" ); - - self waittill( "disconnect" ); + level endon( "game_ended" ); + self waittill( "disconnect" ); } get_score_curve_index( curve ) { - switch ( curve ) - { - case "linear": - return level.spawnsystem.einfluencer_curve_linear; - case "steep": - return level.spawnsystem.einfluencer_curve_steep; - case "inverse_linear": - return level.spawnsystem.einfluencer_curve_linear; - case "negative_to_positive": - return level.spawnsystem.einfluencer_curve_negative_to_positive; - case "constant": - default: - return level.spawnsystem.einfluencer_curve_constant; - } + switch( curve ) + { + case "linear": + return level.spawnsystem.einfluencer_curve_linear; + case "steep": + return level.spawnsystem.einfluencer_curve_steep; + case "inverse_linear": + return level.spawnsystem.einfluencer_curve_linear; + case "negative_to_positive": + return level.spawnsystem.einfluencer_curve_negative_to_positive; + case "constant": + default: + return level.spawnsystem.einfluencer_curve_constant; + } } get_influencer_type_index( curve ) { - } create_player_influencers() { /# - assert( !isdefined( self.influencer_enemy_sphere ) ); + assert( !isDefined( self.influencer_enemy_sphere ) ); #/ /# - assert( !isdefined( self.influencer_weapon_cylinder ) ); + assert( !isDefined( self.influencer_weapon_cylinder ) ); #/ /# - assert( !level.teambased || !isdefined( self.influencer_friendly_sphere ) ); + if ( level.teambased ) + { + assert( !isDefined( self.influencer_friendly_sphere ) ); + } #/ /# - assert( !level.teambased || !isdefined( self.influencer_friendly_cylinder ) ); + if ( level.teambased ) + { + assert( !isDefined( self.influencer_friendly_cylinder ) ); + } #/ - if ( !level.teambased ) - { - team_mask = level.spawnsystem.ispawn_teammask_free; - other_team_mask = level.spawnsystem.ispawn_teammask_free; - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else if ( isdefined( self.pers["team"] ) ) - { - team = self.pers["team"]; - team_mask = getteammask( team ); - other_team_mask = getotherteamsmask( team ); - weapon_team_mask = getotherteamsmask( team ); - } - else - { - team_mask = 0; - other_team_mask = 0; - weapon_team_mask = 0; - } - - if ( level.hardcoremode ) - weapon_team_mask |= team_mask; - - angles = self.angles; - origin = self.origin; - up = ( 0, 0, 1 ); - forward = ( 1, 0, 0 ); - cylinder_forward = up; - cylinder_up = forward; - self.influencer_enemy_sphere = addsphereinfluencer( level.spawnsystem.einfluencer_type_player, origin, level.spawnsystem.enemy_influencer_radius, level.spawnsystem.enemy_influencer_score, other_team_mask, "enemy,r,s", get_score_curve_index( level.spawnsystem.enemy_influencer_score_curve ), 0, self ); - - if ( level.teambased ) - { - cylinder_up = -1.0 * forward; - self.influencer_friendly_sphere = addsphereinfluencer( level.spawnsystem.einfluencer_type_player, origin, level.spawnsystem.friend_weak_influencer_radius, level.spawnsystem.friend_weak_influencer_score, team_mask, "friend_weak,r,s", get_score_curve_index( level.spawnsystem.friend_weak_influencer_score_curve ), 0, self ); - } - - self.spawn_influencers_created = 1; - - if ( !isdefined( self.pers["team"] ) || self.pers["team"] == "spectator" ) - self enable_player_influencers( 0 ); + if ( !level.teambased ) + { + team_mask = level.spawnsystem.ispawn_teammask_free; + other_team_mask = level.spawnsystem.ispawn_teammask_free; + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else if ( isDefined( self.pers[ "team" ] ) ) + { + team = self.pers[ "team" ]; + team_mask = getteammask( team ); + other_team_mask = getotherteamsmask( team ); + weapon_team_mask = getotherteamsmask( team ); + } + else + { + team_mask = 0; + other_team_mask = 0; + weapon_team_mask = 0; + } + if ( level.hardcoremode ) + { + weapon_team_mask |= team_mask; + } + angles = self.angles; + origin = self.origin; + up = ( 0, 0, 0 ); + forward = ( 0, 0, 0 ); + cylinder_forward = up; + cylinder_up = forward; + self.influencer_enemy_sphere = addsphereinfluencer( level.spawnsystem.einfluencer_type_player, origin, level.spawnsystem.enemy_influencer_radius, level.spawnsystem.enemy_influencer_score, other_team_mask, "enemy,r,s", get_score_curve_index( level.spawnsystem.enemy_influencer_score_curve ), 0, self ); + if ( level.teambased ) + { + cylinder_up = -1 * forward; + self.influencer_friendly_sphere = addsphereinfluencer( level.spawnsystem.einfluencer_type_player, origin, level.spawnsystem.friend_weak_influencer_radius, level.spawnsystem.friend_weak_influencer_score, team_mask, "friend_weak,r,s", get_score_curve_index( level.spawnsystem.friend_weak_influencer_score_curve ), 0, self ); + } + self.spawn_influencers_created = 1; + if ( !isDefined( self.pers[ "team" ] ) || self.pers[ "team" ] == "spectator" ) + { + self enable_player_influencers( 0 ); + } } remove_player_influencers() { - if ( level.teambased && isdefined( self.influencer_friendly_sphere ) ) - { - removeinfluencer( self.influencer_friendly_sphere ); - self.influencer_friendly_sphere = undefined; - } - - if ( level.teambased && isdefined( self.influencer_friendly_cylinder ) ) - { - removeinfluencer( self.influencer_friendly_cylinder ); - self.influencer_friendly_cylinder = undefined; - } - - if ( isdefined( self.influencer_enemy_sphere ) ) - { - removeinfluencer( self.influencer_enemy_sphere ); - self.influencer_enemy_sphere = undefined; - } - - if ( isdefined( self.influencer_weapon_cylinder ) ) - { - removeinfluencer( self.influencer_weapon_cylinder ); - self.influencer_weapon_cylinder = undefined; - } + if ( level.teambased && isDefined( self.influencer_friendly_sphere ) ) + { + removeinfluencer( self.influencer_friendly_sphere ); + self.influencer_friendly_sphere = undefined; + } + if ( level.teambased && isDefined( self.influencer_friendly_cylinder ) ) + { + removeinfluencer( self.influencer_friendly_cylinder ); + self.influencer_friendly_cylinder = undefined; + } + if ( isDefined( self.influencer_enemy_sphere ) ) + { + removeinfluencer( self.influencer_enemy_sphere ); + self.influencer_enemy_sphere = undefined; + } + if ( isDefined( self.influencer_weapon_cylinder ) ) + { + removeinfluencer( self.influencer_weapon_cylinder ); + self.influencer_weapon_cylinder = undefined; + } } enable_player_influencers( enabled ) { - if ( !isdefined( self.spawn_influencers_created ) ) - self create_player_influencers(); - - if ( isdefined( self.influencer_friendly_sphere ) ) - enableinfluencer( self.influencer_friendly_sphere, enabled ); - - if ( isdefined( self.influencer_friendly_cylinder ) ) - enableinfluencer( self.influencer_friendly_cylinder, enabled ); - - if ( isdefined( self.influencer_enemy_sphere ) ) - enableinfluencer( self.influencer_enemy_sphere, enabled ); - - if ( isdefined( self.influencer_weapon_cylinder ) ) - enableinfluencer( self.influencer_weapon_cylinder, enabled ); + if ( !isDefined( self.spawn_influencers_created ) ) + { + self create_player_influencers(); + } + if ( isDefined( self.influencer_friendly_sphere ) ) + { + enableinfluencer( self.influencer_friendly_sphere, enabled ); + } + if ( isDefined( self.influencer_friendly_cylinder ) ) + { + enableinfluencer( self.influencer_friendly_cylinder, enabled ); + } + if ( isDefined( self.influencer_enemy_sphere ) ) + { + enableinfluencer( self.influencer_enemy_sphere, enabled ); + } + if ( isDefined( self.influencer_weapon_cylinder ) ) + { + enableinfluencer( self.influencer_weapon_cylinder, enabled ); + } } player_influencers_set_team() { - if ( !level.teambased ) - { - team_mask = level.spawnsystem.ispawn_teammask_free; - other_team_mask = level.spawnsystem.ispawn_teammask_free; - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - } - else - { - team = self.pers["team"]; - team_mask = getteammask( team ); - other_team_mask = getotherteamsmask( team ); - weapon_team_mask = getotherteamsmask( team ); - } - - if ( level.friendlyfire != 0 && level.teambased ) - weapon_team_mask |= team_mask; - - if ( isdefined( self.influencer_friendly_sphere ) ) - setinfluencerteammask( self.influencer_friendly_sphere, team_mask ); - - if ( isdefined( self.influencer_friendly_cylinder ) ) - setinfluencerteammask( self.influencer_friendly_cylinder, team_mask ); - - if ( isdefined( self.influencer_enemy_sphere ) ) - setinfluencerteammask( self.influencer_enemy_sphere, other_team_mask ); - - if ( isdefined( self.influencer_weapon_cylinder ) ) - setinfluencerteammask( self.influencer_weapon_cylinder, weapon_team_mask ); + if ( !level.teambased ) + { + team_mask = level.spawnsystem.ispawn_teammask_free; + other_team_mask = level.spawnsystem.ispawn_teammask_free; + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + team = self.pers[ "team" ]; + team_mask = getteammask( team ); + other_team_mask = getotherteamsmask( team ); + weapon_team_mask = getotherteamsmask( team ); + } + if ( level.friendlyfire != 0 && level.teambased ) + { + weapon_team_mask |= team_mask; + } + if ( isDefined( self.influencer_friendly_sphere ) ) + { + setinfluencerteammask( self.influencer_friendly_sphere, team_mask ); + } + if ( isDefined( self.influencer_friendly_cylinder ) ) + { + setinfluencerteammask( self.influencer_friendly_cylinder, team_mask ); + } + if ( isDefined( self.influencer_enemy_sphere ) ) + { + setinfluencerteammask( self.influencer_enemy_sphere, other_team_mask ); + } + if ( isDefined( self.influencer_weapon_cylinder ) ) + { + setinfluencerteammask( self.influencer_weapon_cylinder, weapon_team_mask ); + } } create_body_influencers() { - if ( level.teambased ) - team_mask = getteammask( self.pers["team"] ); - else - team_mask = level.spawnsystem.ispawn_teammask_free; - - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.dead_friend_influencer_radius, level.spawnsystem.dead_friend_influencer_score, team_mask, "dead_friend,r,s", get_score_curve_index( level.spawnsystem.dead_friend_influencer_score_curve ), level.spawnsystem.dead_friend_influencer_timeout_seconds ); + if ( level.teambased ) + { + team_mask = getteammask( self.pers[ "team" ] ); + } + else + { + team_mask = level.spawnsystem.ispawn_teammask_free; + } + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.dead_friend_influencer_radius, level.spawnsystem.dead_friend_influencer_score, team_mask, "dead_friend,r,s", get_score_curve_index( level.spawnsystem.dead_friend_influencer_score_curve ), level.spawnsystem.dead_friend_influencer_timeout_seconds ); } create_grenade_influencers( parent_team, weaponname, grenade ) { - pixbeginevent( "create_grenade_influencers" ); - - if ( !level.teambased ) - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - else - { - weapon_team_mask = getotherteamsmask( parent_team ); - - if ( level.friendlyfire ) - weapon_team_mask |= getteammask( parent_team ); - } - - if ( issubstr( weaponname, "napalmblob" ) || issubstr( weaponname, "gl_" ) ) - { - pixendevent(); - return; - } - - timeout = 0; - - if ( weaponname == "tabun_gas_mp" ) - timeout = 7.0; - - if ( isdefined( grenade.origin ) ) - { - if ( weaponname == "claymore_mp" || weaponname == "bouncingbetty_mp" ) - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, grenade.origin, level.spawnsystem.claymore_influencer_radius, level.spawnsystem.claymore_influencer_score, weapon_team_mask, "claymore,r,s", get_score_curve_index( level.spawnsystem.claymore_influencer_score_curve ), timeout, grenade ); - else - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, grenade.origin, level.spawnsystem.grenade_influencer_radius, level.spawnsystem.grenade_influencer_score, weapon_team_mask, "grenade,r,s", get_score_curve_index( level.spawnsystem.grenade_influencer_score_curve ), timeout, grenade ); - } - - pixendevent(); + pixbeginevent( "create_grenade_influencers" ); + if ( !level.teambased ) + { + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + weapon_team_mask = getotherteamsmask( parent_team ); + if ( level.friendlyfire ) + { + weapon_team_mask |= getteammask( parent_team ); + } + } + if ( issubstr( weaponname, "napalmblob" ) || issubstr( weaponname, "gl_" ) ) + { + pixendevent(); + return; + } + timeout = 0; + if ( weaponname == "tabun_gas_mp" ) + { + timeout = 7; + } + if ( isDefined( grenade.origin ) ) + { + if ( weaponname == "claymore_mp" || weaponname == "bouncingbetty_mp" ) + { + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, grenade.origin, level.spawnsystem.claymore_influencer_radius, level.spawnsystem.claymore_influencer_score, weapon_team_mask, "claymore,r,s", get_score_curve_index( level.spawnsystem.claymore_influencer_score_curve ), timeout, grenade ); + } + else + { + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, grenade.origin, level.spawnsystem.grenade_influencer_radius, level.spawnsystem.grenade_influencer_score, weapon_team_mask, "grenade,r,s", get_score_curve_index( level.spawnsystem.grenade_influencer_score_curve ), timeout, grenade ); + } + } + pixendevent(); } create_napalm_fire_influencers( point, direction, parent_team, duration ) { - timeout = duration; - weapon_team_mask = 0; - offset = vectorscale( anglestoforward( direction ), 1100 ); - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point + 2.0 * offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point + offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); - addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point - offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); + timeout = duration; + weapon_team_mask = 0; + offset = vectorScale( anglesToForward( direction ), 1100 ); + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point + ( 2 * offset ), level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point + offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); + addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, point - offset, level.spawnsystem.napalm_influencer_radius, level.spawnsystem.napalm_influencer_score, weapon_team_mask, "napalm,r,s", get_score_curve_index( level.spawnsystem.napalm_influencer_score_curve ), timeout ); } create_auto_turret_influencer( point, parent_team, angles ) { - if ( !level.teambased ) - weapon_team_mask = level.spawnsystem.ispawn_teammask_free; - else - weapon_team_mask = getotherteamsmask( parent_team ); - - projected_point = point + vectorscale( anglestoforward( angles ), level.spawnsystem.auto_turret_influencer_radius * 0.7 ); - influencerid = addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, projected_point, level.spawnsystem.auto_turret_influencer_radius, level.spawnsystem.auto_turret_influencer_score, weapon_team_mask, "auto_turret,r,s", get_score_curve_index( level.spawnsystem.auto_turret_influencer_score_curve ) ); - return influencerid; + if ( !level.teambased ) + { + weapon_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + weapon_team_mask = getotherteamsmask( parent_team ); + } + projected_point = point + vectorScale( anglesToForward( angles ), level.spawnsystem.auto_turret_influencer_radius * 0,7 ); + influencerid = addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, projected_point, level.spawnsystem.auto_turret_influencer_radius, level.spawnsystem.auto_turret_influencer_score, weapon_team_mask, "auto_turret,r,s", get_score_curve_index( level.spawnsystem.auto_turret_influencer_score_curve ) ); + return influencerid; } create_dog_influencers() { - if ( !level.teambased ) - dog_enemy_team_mask = level.spawnsystem.ispawn_teammask_free; - else - dog_enemy_team_mask = getotherteamsmask( self.aiteam ); - - addsphereinfluencer( level.spawnsystem.einfluencer_type_dog, self.origin, level.spawnsystem.dog_influencer_radius, level.spawnsystem.dog_influencer_score, dog_enemy_team_mask, "dog,r,s", get_score_curve_index( level.spawnsystem.dog_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + { + dog_enemy_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + dog_enemy_team_mask = getotherteamsmask( self.aiteam ); + } + addsphereinfluencer( level.spawnsystem.einfluencer_type_dog, self.origin, level.spawnsystem.dog_influencer_radius, level.spawnsystem.dog_influencer_score, dog_enemy_team_mask, "dog,r,s", get_score_curve_index( level.spawnsystem.dog_influencer_score_curve ), 0, self ); } create_helicopter_influencers( parent_team ) { - if ( !level.teambased ) - team_mask = level.spawnsystem.ispawn_teammask_free; - else - team_mask = getotherteamsmask( parent_team ); - - self.influencer_helicopter_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.helicopter_influencer_radius, level.spawnsystem.helicopter_influencer_length, level.spawnsystem.helicopter_influencer_score, team_mask, "helicopter,r,s", get_score_curve_index( level.spawnsystem.helicopter_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + { + team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + team_mask = getotherteamsmask( parent_team ); + } + self.influencer_helicopter_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.helicopter_influencer_radius, level.spawnsystem.helicopter_influencer_length, level.spawnsystem.helicopter_influencer_score, team_mask, "helicopter,r,s", get_score_curve_index( level.spawnsystem.helicopter_influencer_score_curve ), 0, self ); } remove_helicopter_influencers() { - if ( isdefined( self.influencer_helicopter_cylinder ) ) - removeinfluencer( self.influencer_helicopter_cylinder ); - - self.influencer_helicopter_cylinder = undefined; + if ( isDefined( self.influencer_helicopter_cylinder ) ) + { + removeinfluencer( self.influencer_helicopter_cylinder ); + } + self.influencer_helicopter_cylinder = undefined; } create_tvmissile_influencers( parent_team ) { - if ( !level.teambased || is_hardcore() ) - team_mask = level.spawnsystem.ispawn_teammask_free; - else - team_mask = getotherteamsmask( parent_team ); - - self.influencer_tvmissile_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.tvmissile_influencer_radius, level.spawnsystem.tvmissile_influencer_length, level.spawnsystem.tvmissile_influencer_score, team_mask, "tvmissile,r,s", get_score_curve_index( level.spawnsystem.tvmissile_influencer_score_curve ), 0, self ); + if ( !level.teambased || is_hardcore() ) + { + team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + team_mask = getotherteamsmask( parent_team ); + } + self.influencer_tvmissile_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.tvmissile_influencer_radius, level.spawnsystem.tvmissile_influencer_length, level.spawnsystem.tvmissile_influencer_score, team_mask, "tvmissile,r,s", get_score_curve_index( level.spawnsystem.tvmissile_influencer_score_curve ), 0, self ); } remove_tvmissile_influencers() { - if ( isdefined( self.influencer_tvmissile_cylinder ) ) - removeinfluencer( self.influencer_tvmissile_cylinder ); - - self.influencer_tvmissile_cylinder = undefined; + if ( isDefined( self.influencer_tvmissile_cylinder ) ) + { + removeinfluencer( self.influencer_tvmissile_cylinder ); + } + self.influencer_tvmissile_cylinder = undefined; } create_artillery_influencers( point, radius ) { - weapon_team_mask = 0; - - if ( radius < 0 ) - thisradius = level.spawnsystem.artillery_influencer_radius; - else - thisradius = radius; - - return addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, point + vectorscale( ( 0, 0, -1 ), 2000.0 ), ( 1, 0, 0 ), ( 0, 0, 1 ), thisradius, 5000, level.spawnsystem.artillery_influencer_score, weapon_team_mask, "artillery,s,r", get_score_curve_index( level.spawnsystem.artillery_influencer_score_curve ), 7 ); + weapon_team_mask = 0; + if ( radius < 0 ) + { + thisradius = level.spawnsystem.artillery_influencer_radius; + } + else + { + thisradius = radius; + } + return addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, point + vectorScale( ( 0, 0, 0 ), 2000 ), ( 0, 0, 0 ), ( 0, 0, 0 ), thisradius, 5000, level.spawnsystem.artillery_influencer_score, weapon_team_mask, "artillery,s,r", get_score_curve_index( level.spawnsystem.artillery_influencer_score_curve ), 7 ); } create_vehicle_influencers() { - weapon_team_mask = 0; - vehicleradius = 144; - cylinderlength = level.spawnsystem.vehicle_influencer_lead_seconds; - up = ( 0, 0, 1 ); - forward = ( 1, 0, 0 ); - cylinder_forward = up; - cylinder_up = forward; - return addcylinderinfluencer( level.spawnsystem.einfluencer_type_vehicle, self.origin, cylinder_forward, cylinder_up, vehicleradius, cylinderlength, level.spawnsystem.vehicle_influencer_score, weapon_team_mask, "vehicle,s", get_score_curve_index( level.spawnsystem.vehicle_influencer_score_curve ), 0, self ); + weapon_team_mask = 0; + vehicleradius = 144; + cylinderlength = level.spawnsystem.vehicle_influencer_lead_seconds; + up = ( 0, 0, 0 ); + forward = ( 0, 0, 0 ); + cylinder_forward = up; + cylinder_up = forward; + return addcylinderinfluencer( level.spawnsystem.einfluencer_type_vehicle, self.origin, cylinder_forward, cylinder_up, vehicleradius, cylinderlength, level.spawnsystem.vehicle_influencer_score, weapon_team_mask, "vehicle,s", get_score_curve_index( level.spawnsystem.vehicle_influencer_score_curve ), 0, self ); } create_rcbomb_influencers( team ) { - if ( !level.teambased ) - other_team_mask = level.spawnsystem.ispawn_teammask_free; - else - other_team_mask = getotherteamsmask( team ); - - return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.rcbomb_influencer_radius, level.spawnsystem.rcbomb_influencer_score, other_team_mask, "rcbomb,r,s", get_score_curve_index( level.spawnsystem.rcbomb_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + { + other_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + other_team_mask = getotherteamsmask( team ); + } + return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.rcbomb_influencer_radius, level.spawnsystem.rcbomb_influencer_score, other_team_mask, "rcbomb,r,s", get_score_curve_index( level.spawnsystem.rcbomb_influencer_score_curve ), 0, self ); } create_qrdrone_influencers( team ) { - if ( !level.teambased ) - other_team_mask = level.spawnsystem.ispawn_teammask_free; - else - other_team_mask = getotherteamsmask( team ); - - self.influencer_qrdrone_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.qrdrone_cylinder_influencer_radius, level.spawnsystem.qrdrone_cylinder_influencer_length, level.spawnsystem.qrdrone_cylinder_influencer_score, other_team_mask, "qrdrone_cyl,r,s", get_score_curve_index( level.spawnsystem.qrdrone_cylinder_influencer_score_curve ), 0, self ); - return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.qrdrone_influencer_radius, level.spawnsystem.qrdrone_influencer_score, other_team_mask, "qrdrone,r,s", get_score_curve_index( level.spawnsystem.qrdrone_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + { + other_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + other_team_mask = getotherteamsmask( team ); + } + self.influencer_qrdrone_cylinder = addcylinderinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, ( 0, 0, 0 ), ( 0, 0, 0 ), level.spawnsystem.qrdrone_cylinder_influencer_radius, level.spawnsystem.qrdrone_cylinder_influencer_length, level.spawnsystem.qrdrone_cylinder_influencer_score, other_team_mask, "qrdrone_cyl,r,s", get_score_curve_index( level.spawnsystem.qrdrone_cylinder_influencer_score_curve ), 0, self ); + return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.qrdrone_influencer_radius, level.spawnsystem.qrdrone_influencer_score, other_team_mask, "qrdrone,r,s", get_score_curve_index( level.spawnsystem.qrdrone_influencer_score_curve ), 0, self ); } create_aitank_influencers( team ) { - if ( !level.teambased ) - other_team_mask = level.spawnsystem.ispawn_teammask_free; - else - other_team_mask = getotherteamsmask( team ); - - return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.aitank_influencer_radius, level.spawnsystem.aitank_influencer_score, other_team_mask, "aitank,r,s", get_score_curve_index( level.spawnsystem.aitank_influencer_score_curve ), 0, self ); + if ( !level.teambased ) + { + other_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + other_team_mask = getotherteamsmask( team ); + } + return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, self.origin, level.spawnsystem.aitank_influencer_radius, level.spawnsystem.aitank_influencer_score, other_team_mask, "aitank,r,s", get_score_curve_index( level.spawnsystem.aitank_influencer_score_curve ), 0, self ); } create_pegasus_influencer( origin, team ) { - if ( !level.teambased ) - other_team_mask = level.spawnsystem.ispawn_teammask_free; - else - other_team_mask = getotherteamsmask( team ); - - return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, origin, level.spawnsystem.pegasus_influencer_radius, level.spawnsystem.pegasus_influencer_score, other_team_mask, "pegasus,r,s", get_score_curve_index( level.spawnsystem.pegasus_influencer_score_curve ), 0 ); + if ( !level.teambased ) + { + other_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + other_team_mask = getotherteamsmask( team ); + } + return addsphereinfluencer( level.spawnsystem.einfluencer_type_normal, origin, level.spawnsystem.pegasus_influencer_radius, level.spawnsystem.pegasus_influencer_score, other_team_mask, "pegasus,r,s", get_score_curve_index( level.spawnsystem.pegasus_influencer_score_curve ), 0 ); } create_map_placed_influencers() { - staticinfluencerents = getentarray( "mp_uspawn_influencer", "classname" ); - - for ( i = 0; i < staticinfluencerents.size; i++ ) - { - staticinfluencerent = staticinfluencerents[i]; - - if ( isdefined( staticinfluencerent.script_gameobjectname ) && staticinfluencerent.script_gameobjectname == "twar" ) - continue; - - create_map_placed_influencer( staticinfluencerent ); - } + staticinfluencerents = getentarray( "mp_uspawn_influencer", "classname" ); + i = 0; + while ( i < staticinfluencerents.size ) + { + staticinfluencerent = staticinfluencerents[ i ]; + if ( isDefined( staticinfluencerent.script_gameobjectname ) && staticinfluencerent.script_gameobjectname == "twar" ) + { + i++; + continue; + } + else + { + create_map_placed_influencer( staticinfluencerent ); + } + i++; + } } create_map_placed_influencer( influencer_entity, optional_score_override ) { - influencer_id = -1; - - if ( isdefined( influencer_entity.script_shape ) && isdefined( influencer_entity.script_score ) && isdefined( influencer_entity.script_score_curve ) ) - { - switch ( influencer_entity.script_shape ) - { - case "sphere": - if ( isdefined( influencer_entity.radius ) ) - { - if ( isdefined( optional_score_override ) ) - score = optional_score_override; - else - score = influencer_entity.script_score; - - influencer_id = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, influencer_entity.origin, influencer_entity.radius, score, getteammask( influencer_entity.script_team ), "*map_defined", get_score_curve_index( influencer_entity.script_score_curve ) ); - } - else - { + influencer_id = -1; + if ( isDefined( influencer_entity.script_shape ) && isDefined( influencer_entity.script_score ) && isDefined( influencer_entity.script_score_curve ) ) + { + switch( influencer_entity.script_shape ) + { + case "sphere": + if ( isDefined( influencer_entity.radius ) ) + { + if ( isDefined( optional_score_override ) ) + { + score = optional_score_override; + } + else + { + score = influencer_entity.script_score; + } + influencer_id = addsphereinfluencer( level.spawnsystem.einfluencer_type_game_mode, influencer_entity.origin, influencer_entity.radius, score, getteammask( influencer_entity.script_team ), "*map_defined", get_score_curve_index( influencer_entity.script_score_curve ) ); + } + else + { /# - assertmsg( "Radiant-placed sphere spawn influencers require 'radius' parameter" ); + assertmsg( "Radiant-placed sphere spawn influencers require 'radius' parameter" ); #/ - } - - break; - case "cylinder": - if ( isdefined( influencer_entity.radius ) && isdefined( influencer_entity.height ) ) - { - if ( isdefined( optional_score_override ) ) - score = optional_score_override; - else - score = influencer_entity.script_score; - - influencer_id = addcylinderinfluencer( level.spawnsystem.einfluencer_type_game_mode, influencer_entity.origin, anglestoforward( influencer_entity.angles ), anglestoup( influencer_entity.angles ), influencer_entity.radius, influencer_entity.height, score, getteammask( influencer_entity.script_team ), "*map_defined", get_score_curve_index( influencer_entity.script_score_curve ) ); - } - else - { + } + break; + case "cylinder": + if ( isDefined( influencer_entity.radius ) && isDefined( influencer_entity.height ) ) + { + if ( isDefined( optional_score_override ) ) + { + score = optional_score_override; + } + else + { + score = influencer_entity.script_score; + } + influencer_id = addcylinderinfluencer( level.spawnsystem.einfluencer_type_game_mode, influencer_entity.origin, anglesToForward( influencer_entity.angles ), anglesToUp( influencer_entity.angles ), influencer_entity.radius, influencer_entity.height, score, getteammask( influencer_entity.script_team ), "*map_defined", get_score_curve_index( influencer_entity.script_score_curve ) ); + } + else + { /# - assertmsg( "Radiant-placed cylinder spawn influencers require 'radius' and 'height' parameters" ); + assertmsg( "Radiant-placed cylinder spawn influencers require 'radius' and 'height' parameters" ); #/ - } - - break; - default: + } + break; + default: /# - assertmsg( "Unsupported script_shape value (\"" + influencer_entity.script_shape + "\") for unified spawning system static influencer. Supported shapes are \"cylinder\" and \"sphere\"." ); + assertmsg( "Unsupported script_shape value ("" + influencer_entity.script_shape + "") for unified spawning system static influencer. Supported shapes are "cylinder" and "sphere"." ); #/ - break; - } - } - else - { + break; + } + } + else + { /# - assertmsg( "Radiant-placed spawn influencers require 'script_shape', 'script_score' and 'script_score_curve' parameters" ); + assertmsg( "Radiant-placed spawn influencers require 'script_shape', 'script_score' and 'script_score_curve' parameters" ); #/ - } - - return influencer_id; + } + return influencer_id; } create_enemy_spawned_influencers( origin, team ) { - if ( !level.teambased ) - other_team_mask = level.spawnsystem.ispawn_teammask_free; - else - other_team_mask = getotherteamsmask( team ); - - return addsphereinfluencer( level.spawnsystem.einfluencer_type_enemy_spawned, origin, level.spawnsystem.enemy_spawned_influencer_radius, level.spawnsystem.enemy_spawned_influencer_score, other_team_mask, "enemy_spawned,r,s", get_score_curve_index( level.spawnsystem.enemy_spawned_influencer_score_curve ), 7 ); + if ( !level.teambased ) + { + other_team_mask = level.spawnsystem.ispawn_teammask_free; + } + else + { + other_team_mask = getotherteamsmask( team ); + } + return addsphereinfluencer( level.spawnsystem.einfluencer_type_enemy_spawned, origin, level.spawnsystem.enemy_spawned_influencer_radius, level.spawnsystem.enemy_spawned_influencer_score, other_team_mask, "enemy_spawned,r,s", get_score_curve_index( level.spawnsystem.enemy_spawned_influencer_score_curve ), 7 ); } updateallspawnpoints() { - foreach ( team in level.teams ) - gatherspawnentities( team ); - - clearspawnpoints(); - - if ( level.teambased ) - { - foreach ( team in level.teams ) - addspawnpoints( team, level.unified_spawn_points[team].a ); - } - else - { - foreach ( team in level.teams ) - addspawnpoints( "free", level.unified_spawn_points[team].a ); - } - - remove_unused_spawn_entities(); + _a1046 = level.teams; + _k1046 = getFirstArrayKey( _a1046 ); + while ( isDefined( _k1046 ) ) + { + team = _a1046[ _k1046 ]; + gatherspawnentities( team ); + _k1046 = getNextArrayKey( _a1046, _k1046 ); + } + clearspawnpoints(); + if ( level.teambased ) + { + _a1055 = level.teams; + _k1055 = getFirstArrayKey( _a1055 ); + while ( isDefined( _k1055 ) ) + { + team = _a1055[ _k1055 ]; + addspawnpoints( team, level.unified_spawn_points[ team ].a ); + _k1055 = getNextArrayKey( _a1055, _k1055 ); + } + } + else _a1062 = level.teams; + _k1062 = getFirstArrayKey( _a1062 ); + while ( isDefined( _k1062 ) ) + { + team = _a1062[ _k1062 ]; + addspawnpoints( "free", level.unified_spawn_points[ team ].a ); + _k1062 = getNextArrayKey( _a1062, _k1062 ); + } + remove_unused_spawn_entities(); } initialize_player_spawning_dvars() { /# - reset_dvars = 1; - - while ( true ) - { - get_player_spawning_dvars( reset_dvars ); - reset_dvars = 0; - wait 2; - } + reset_dvars = 1; + while ( 1 ) + { + get_player_spawning_dvars( reset_dvars ); + reset_dvars = 0; + wait 2; #/ + } } get_player_spawning_dvars( reset_dvars ) { - k_player_height = get_player_height(); - player_height_times_10 = "" + 10.0 * k_player_height; - ss = level.spawnsystem; - player_influencer_radius = 15.0 * k_player_height; - player_influencer_score = 150.0; - dog_influencer_radius = 10.0 * k_player_height; - dog_influencer_score = 150.0; - ss.script_based_influencer_system = set_dvar_int_if_unset( "scr_script_based_influencer_system", "0", reset_dvars ); - ss.randomness_range = set_dvar_float_if_unset( "scr_spawn_randomness_range", "10", reset_dvars ); - ss.objective_facing_bonus = set_dvar_float_if_unset( "scr_spawn_objective_facing_bonus", "50", reset_dvars ); - ss.friend_weak_influencer_score = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_score", "10", reset_dvars ); - ss.friend_weak_influencer_score_curve = set_dvar_if_unset( "scr_spawn_friend_weak_influencer_score_curve", "steep", reset_dvars ); - ss.friend_weak_influencer_radius = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_radius", player_height_times_10, reset_dvars ); - ss.enemy_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_score", "-150", reset_dvars ); - ss.enemy_influencer_score_curve = set_dvar_if_unset( "scr_spawn_enemy_influencer_score_curve", "steep", reset_dvars ); - ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); - ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_timeout_seconds", "15", reset_dvars ); - ss.dead_friend_influencer_count = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_count", "7", reset_dvars ); - ss.dead_friend_influencer_score = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_score", "-100", reset_dvars ); - ss.dead_friend_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dead_friend_influencer_score_curve", "steep", reset_dvars ); - ss.dead_friend_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_radius", player_height_times_10, reset_dvars ); - ss.vehicle_influencer_score = set_dvar_float_if_unset( "scr_spawn_vehicle_influencer_score", "-50", reset_dvars ); - ss.vehicle_influencer_score_curve = set_dvar_if_unset( "scr_spawn_vehicle_influencer_score_curve", "linear", reset_dvars ); - ss.vehicle_influencer_lead_seconds = set_dvar_float_if_unset( "scr_spawn_vehicle_influencer_lead_seconds", "3", reset_dvars ); - ss.dog_influencer_score = set_dvar_float_if_unset( "scr_spawn_dog_influencer_score", "-150", reset_dvars ); - ss.dog_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dog_influencer_score_curve", "steep", reset_dvars ); - ss.dog_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dog_influencer_radius", "" + 15.0 * k_player_height, reset_dvars ); - ss.artillery_influencer_score = set_dvar_float_if_unset( "scr_spawn_artillery_influencer_score", "-600", reset_dvars ); - ss.artillery_influencer_score_curve = set_dvar_if_unset( "scr_spawn_artillery_influencer_score_curve", "linear", reset_dvars ); - ss.artillery_influencer_radius = set_dvar_float_if_unset( "scr_spawn_artillery_influencer_radius", "1200", reset_dvars ); - ss.grenade_influencer_score = set_dvar_float_if_unset( "scr_spawn_grenade_influencer_score", "-300", reset_dvars ); - ss.grenade_influencer_score_curve = set_dvar_if_unset( "scr_spawn_grenade_influencer_score_curve", "linear", reset_dvars ); - ss.grenade_influencer_radius = set_dvar_float_if_unset( "scr_spawn_grenade_influencer_radius", "" + 8.0 * k_player_height, reset_dvars ); - ss.grenade_endpoint_influencer_score = set_dvar_float_if_unset( "scr_spawn_grenade_endpoint_influencer_score", "-300", reset_dvars ); - ss.grenade_endpoint_influencer_score_curve = set_dvar_if_unset( "scr_spawn_grenade_endpoint_influencer_score_curve", "linear", reset_dvars ); - ss.grenade_endpoint_influencer_radius = set_dvar_float_if_unset( "scr_spawn_grenade_endpoint_influencer_radius", "" + 8.0 * k_player_height, reset_dvars ); - ss.claymore_influencer_score = set_dvar_float_if_unset( "scr_spawn_claymore_influencer_score", "-150", reset_dvars ); - ss.claymore_influencer_score_curve = set_dvar_if_unset( "scr_spawn_claymore_influencer_score_curve", "steep", reset_dvars ); - ss.claymore_influencer_radius = set_dvar_float_if_unset( "scr_spawn_claymore_influencer_radius", "" + 9.0 * k_player_height, reset_dvars ); - ss.napalm_influencer_score = set_dvar_float_if_unset( "scr_spawn_napalm_influencer_score", "-500", reset_dvars ); - ss.napalm_influencer_score_curve = set_dvar_if_unset( "scr_spawn_napalm_influencer_score_curve", "linear", reset_dvars ); - ss.napalm_influencer_radius = set_dvar_float_if_unset( "scr_spawn_napalm_influencer_radius", "" + 750, reset_dvars ); - ss.auto_turret_influencer_score = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_score", "-650", reset_dvars ); - ss.auto_turret_influencer_score_curve = set_dvar_if_unset( "scr_spawn_auto_turret_influencer_score_curve", "linear", reset_dvars ); - ss.auto_turret_influencer_radius = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_radius", "" + 1200, reset_dvars ); - ss.rcbomb_influencer_score = set_dvar_float_if_unset( "scr_spawn_rcbomb_influencer_score", "-200", reset_dvars ); - ss.rcbomb_influencer_score_curve = set_dvar_if_unset( "scr_spawn_rcbomb_influencer_score_curve", "steep", reset_dvars ); - ss.rcbomb_influencer_radius = set_dvar_float_if_unset( "scr_spawn_rcbomb_influencer_radius", "" + 25.0 * k_player_height, reset_dvars ); - ss.qrdrone_influencer_score = set_dvar_float_if_unset( "scr_spawn_qrdrone_influencer_score", "-200", reset_dvars ); - ss.qrdrone_influencer_score_curve = set_dvar_if_unset( "scr_spawn_qrdrone_influencer_score_curve", "steep", reset_dvars ); - ss.qrdrone_influencer_radius = set_dvar_float_if_unset( "scr_spawn_qrdrone_influencer_radius", "" + 25.0 * k_player_height, reset_dvars ); - ss.qrdrone_cylinder_influencer_score = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_score", "-300", reset_dvars ); - ss.qrdrone_cylinder_influencer_score_curve = set_dvar_if_unset( "scr_spawn_qrdrone_cylinder_influencer_score_curve", "linear", reset_dvars ); - ss.qrdrone_cylinder_influencer_radius = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_radius", 1000, reset_dvars ); - ss.qrdrone_cylinder_influencer_length = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_length", 2000, reset_dvars ); - ss.aitank_influencer_score = set_dvar_float_if_unset( "scr_spawn_aitank_influencer_score", "-200", reset_dvars ); - ss.aitank_influencer_score_curve = set_dvar_if_unset( "scr_spawn_aitank_influencer_score_curve", "linear", reset_dvars ); - ss.aitank_influencer_radius = set_dvar_float_if_unset( "scr_spawn_aitank_influencer_radius", "" + 25.0 * k_player_height, reset_dvars ); - ss.enemy_spawned_influencer_score_curve = set_dvar_if_unset( "scr_spawn_enemy_spawned_influencer_score_curve", "constant", reset_dvars ); - - if ( level.teambased ) - { - ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-200", reset_dvars ); - ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 1100, reset_dvars ); - } - else - { - ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-100", reset_dvars ); - ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 400, reset_dvars ); - } - - ss.helicopter_influencer_score = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_score", "-500", reset_dvars ); - ss.helicopter_influencer_score_curve = set_dvar_if_unset( "scr_spawn_helicopter_influencer_score_curve", "linear", reset_dvars ); - ss.helicopter_influencer_radius = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_radius", "" + 2000, reset_dvars ); - ss.helicopter_influencer_length = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_length", "" + 3500, reset_dvars ); - ss.tvmissile_influencer_score = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_score", "-400", reset_dvars ); - ss.tvmissile_influencer_score_curve = set_dvar_if_unset( "scr_spawn_tvmissile_influencer_score_curve", "linear", reset_dvars ); - ss.tvmissile_influencer_radius = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_radius", "" + 2000, reset_dvars ); - ss.tvmissile_influencer_length = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_length", "" + 3000, reset_dvars ); - ss.pegasus_influencer_score = set_dvar_float_if_unset( "scr_spawn_pegasus_influencer_score", "-250", reset_dvars ); - ss.pegasus_influencer_score_curve = set_dvar_if_unset( "scr_spawn_pegasus_influencer_score_curve", "linear", reset_dvars ); - ss.pegasus_influencer_radius = set_dvar_float_if_unset( "scr_spawn_pegasus_influencer_radius", "" + 20.0 * k_player_height, reset_dvars ); - - if ( !isdefined( ss.unifiedsideswitching ) ) - ss.unifiedsideswitching = 1; - - set_dvar_int_if_unset( "spawnsystem_allow_non_team_spawns", "0", reset_dvars ); - [[ level.gamemodespawndvars ]]( reset_dvars ); - - if ( isdefined( level.levelspawndvars ) ) - [[ level.levelspawndvars ]]( reset_dvars ); - - setspawnpointrandomvariation( ss.randomness_range ); + k_player_height = get_player_height(); + player_height_times_10 = "" + ( 10 * k_player_height ); + ss = level.spawnsystem; + player_influencer_radius = 15 * k_player_height; + player_influencer_score = 150; + dog_influencer_radius = 10 * k_player_height; + dog_influencer_score = 150; + ss.script_based_influencer_system = set_dvar_int_if_unset( "scr_script_based_influencer_system", "0", reset_dvars ); + ss.randomness_range = set_dvar_float_if_unset( "scr_spawn_randomness_range", "10", reset_dvars ); + ss.objective_facing_bonus = set_dvar_float_if_unset( "scr_spawn_objective_facing_bonus", "50", reset_dvars ); + ss.friend_weak_influencer_score = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_score", "10", reset_dvars ); + ss.friend_weak_influencer_score_curve = set_dvar_if_unset( "scr_spawn_friend_weak_influencer_score_curve", "steep", reset_dvars ); + ss.friend_weak_influencer_radius = set_dvar_float_if_unset( "scr_spawn_friend_weak_influencer_radius", player_height_times_10, reset_dvars ); + ss.enemy_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_score", "-150", reset_dvars ); + ss.enemy_influencer_score_curve = set_dvar_if_unset( "scr_spawn_enemy_influencer_score_curve", "steep", reset_dvars ); + ss.enemy_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_influencer_radius", "2600", reset_dvars ); + ss.dead_friend_influencer_timeout_seconds = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_timeout_seconds", "15", reset_dvars ); + ss.dead_friend_influencer_count = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_count", "7", reset_dvars ); + ss.dead_friend_influencer_score = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_score", "-100", reset_dvars ); + ss.dead_friend_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dead_friend_influencer_score_curve", "steep", reset_dvars ); + ss.dead_friend_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dead_friend_influencer_radius", player_height_times_10, reset_dvars ); + ss.vehicle_influencer_score = set_dvar_float_if_unset( "scr_spawn_vehicle_influencer_score", "-50", reset_dvars ); + ss.vehicle_influencer_score_curve = set_dvar_if_unset( "scr_spawn_vehicle_influencer_score_curve", "linear", reset_dvars ); + ss.vehicle_influencer_lead_seconds = set_dvar_float_if_unset( "scr_spawn_vehicle_influencer_lead_seconds", "3", reset_dvars ); + ss.dog_influencer_score = set_dvar_float_if_unset( "scr_spawn_dog_influencer_score", "-150", reset_dvars ); + ss.dog_influencer_score_curve = set_dvar_if_unset( "scr_spawn_dog_influencer_score_curve", "steep", reset_dvars ); + ss.dog_influencer_radius = set_dvar_float_if_unset( "scr_spawn_dog_influencer_radius", "" + ( 15 * k_player_height ), reset_dvars ); + ss.artillery_influencer_score = set_dvar_float_if_unset( "scr_spawn_artillery_influencer_score", "-600", reset_dvars ); + ss.artillery_influencer_score_curve = set_dvar_if_unset( "scr_spawn_artillery_influencer_score_curve", "linear", reset_dvars ); + ss.artillery_influencer_radius = set_dvar_float_if_unset( "scr_spawn_artillery_influencer_radius", "1200", reset_dvars ); + ss.grenade_influencer_score = set_dvar_float_if_unset( "scr_spawn_grenade_influencer_score", "-300", reset_dvars ); + ss.grenade_influencer_score_curve = set_dvar_if_unset( "scr_spawn_grenade_influencer_score_curve", "linear", reset_dvars ); + ss.grenade_influencer_radius = set_dvar_float_if_unset( "scr_spawn_grenade_influencer_radius", "" + ( 8 * k_player_height ), reset_dvars ); + ss.grenade_endpoint_influencer_score = set_dvar_float_if_unset( "scr_spawn_grenade_endpoint_influencer_score", "-300", reset_dvars ); + ss.grenade_endpoint_influencer_score_curve = set_dvar_if_unset( "scr_spawn_grenade_endpoint_influencer_score_curve", "linear", reset_dvars ); + ss.grenade_endpoint_influencer_radius = set_dvar_float_if_unset( "scr_spawn_grenade_endpoint_influencer_radius", "" + ( 8 * k_player_height ), reset_dvars ); + ss.claymore_influencer_score = set_dvar_float_if_unset( "scr_spawn_claymore_influencer_score", "-150", reset_dvars ); + ss.claymore_influencer_score_curve = set_dvar_if_unset( "scr_spawn_claymore_influencer_score_curve", "steep", reset_dvars ); + ss.claymore_influencer_radius = set_dvar_float_if_unset( "scr_spawn_claymore_influencer_radius", "" + ( 9 * k_player_height ), reset_dvars ); + ss.napalm_influencer_score = set_dvar_float_if_unset( "scr_spawn_napalm_influencer_score", "-500", reset_dvars ); + ss.napalm_influencer_score_curve = set_dvar_if_unset( "scr_spawn_napalm_influencer_score_curve", "linear", reset_dvars ); + ss.napalm_influencer_radius = set_dvar_float_if_unset( "scr_spawn_napalm_influencer_radius", "" + 750, reset_dvars ); + ss.auto_turret_influencer_score = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_score", "-650", reset_dvars ); + ss.auto_turret_influencer_score_curve = set_dvar_if_unset( "scr_spawn_auto_turret_influencer_score_curve", "linear", reset_dvars ); + ss.auto_turret_influencer_radius = set_dvar_float_if_unset( "scr_spawn_auto_turret_influencer_radius", "" + 1200, reset_dvars ); + ss.rcbomb_influencer_score = set_dvar_float_if_unset( "scr_spawn_rcbomb_influencer_score", "-200", reset_dvars ); + ss.rcbomb_influencer_score_curve = set_dvar_if_unset( "scr_spawn_rcbomb_influencer_score_curve", "steep", reset_dvars ); + ss.rcbomb_influencer_radius = set_dvar_float_if_unset( "scr_spawn_rcbomb_influencer_radius", "" + ( 25 * k_player_height ), reset_dvars ); + ss.qrdrone_influencer_score = set_dvar_float_if_unset( "scr_spawn_qrdrone_influencer_score", "-200", reset_dvars ); + ss.qrdrone_influencer_score_curve = set_dvar_if_unset( "scr_spawn_qrdrone_influencer_score_curve", "steep", reset_dvars ); + ss.qrdrone_influencer_radius = set_dvar_float_if_unset( "scr_spawn_qrdrone_influencer_radius", "" + ( 25 * k_player_height ), reset_dvars ); + ss.qrdrone_cylinder_influencer_score = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_score", "-300", reset_dvars ); + ss.qrdrone_cylinder_influencer_score_curve = set_dvar_if_unset( "scr_spawn_qrdrone_cylinder_influencer_score_curve", "linear", reset_dvars ); + ss.qrdrone_cylinder_influencer_radius = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_radius", 1000, reset_dvars ); + ss.qrdrone_cylinder_influencer_length = set_dvar_float_if_unset( "scr_spawn_qrdrone_cylinder_influencer_length", 2000, reset_dvars ); + ss.aitank_influencer_score = set_dvar_float_if_unset( "scr_spawn_aitank_influencer_score", "-200", reset_dvars ); + ss.aitank_influencer_score_curve = set_dvar_if_unset( "scr_spawn_aitank_influencer_score_curve", "linear", reset_dvars ); + ss.aitank_influencer_radius = set_dvar_float_if_unset( "scr_spawn_aitank_influencer_radius", "" + ( 25 * k_player_height ), reset_dvars ); + ss.enemy_spawned_influencer_score_curve = set_dvar_if_unset( "scr_spawn_enemy_spawned_influencer_score_curve", "constant", reset_dvars ); + if ( level.teambased ) + { + ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-200", reset_dvars ); + ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 1100, reset_dvars ); + } + else + { + ss.enemy_spawned_influencer_score = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_score", "-100", reset_dvars ); + ss.enemy_spawned_influencer_radius = set_dvar_float_if_unset( "scr_spawn_enemy_spawned_influencer_radius", "" + 400, reset_dvars ); + } + ss.helicopter_influencer_score = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_score", "-500", reset_dvars ); + ss.helicopter_influencer_score_curve = set_dvar_if_unset( "scr_spawn_helicopter_influencer_score_curve", "linear", reset_dvars ); + ss.helicopter_influencer_radius = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_radius", "" + 2000, reset_dvars ); + ss.helicopter_influencer_length = set_dvar_float_if_unset( "scr_spawn_helicopter_influencer_length", "" + 3500, reset_dvars ); + ss.tvmissile_influencer_score = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_score", "-400", reset_dvars ); + ss.tvmissile_influencer_score_curve = set_dvar_if_unset( "scr_spawn_tvmissile_influencer_score_curve", "linear", reset_dvars ); + ss.tvmissile_influencer_radius = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_radius", "" + 2000, reset_dvars ); + ss.tvmissile_influencer_length = set_dvar_float_if_unset( "scr_spawn_tvmissile_influencer_length", "" + 3000, reset_dvars ); + ss.pegasus_influencer_score = set_dvar_float_if_unset( "scr_spawn_pegasus_influencer_score", "-250", reset_dvars ); + ss.pegasus_influencer_score_curve = set_dvar_if_unset( "scr_spawn_pegasus_influencer_score_curve", "linear", reset_dvars ); + ss.pegasus_influencer_radius = set_dvar_float_if_unset( "scr_spawn_pegasus_influencer_radius", "" + ( 20 * k_player_height ), reset_dvars ); + if ( !isDefined( ss.unifiedsideswitching ) ) + { + ss.unifiedsideswitching = 1; + } + set_dvar_int_if_unset( "spawnsystem_allow_non_team_spawns", "0", reset_dvars ); + [[ level.gamemodespawndvars ]]( reset_dvars ); + if ( isDefined( level.levelspawndvars ) ) + { + [[ level.levelspawndvars ]]( reset_dvars ); + } + setspawnpointrandomvariation( ss.randomness_range ); } level_use_unified_spawning( use ) { - } onspawnplayer_unified( predictedspawn ) { - if ( !isdefined( predictedspawn ) ) - predictedspawn = 0; + if ( !isDefined( predictedspawn ) ) + { + predictedspawn = 0; + } /# - if ( getdvarint( "scr_spawn_point_test_mode" ) != 0 ) - { - spawn_point = get_debug_spawnpoint( self ); - self spawn( spawn_point.origin, spawn_point.angles ); - return; - } + if ( getDvarInt( "scr_spawn_point_test_mode" ) != 0 ) + { + spawn_point = get_debug_spawnpoint( self ); + self spawn( spawn_point.origin, spawn_point.angles ); + return; #/ - use_new_spawn_system = 0; - initial_spawn = 1; - - if ( isdefined( self.uspawn_already_spawned ) ) - initial_spawn = !self.uspawn_already_spawned; - - if ( level.usestartspawns ) - use_new_spawn_system = 0; - - if ( level.gametype == "sd" ) - use_new_spawn_system = 0; - - set_dvar_if_unset( "scr_spawn_force_unified", "0" ); - [[ level.onspawnplayer ]]( predictedspawn ); - - if ( !predictedspawn ) - self.uspawn_already_spawned = 1; + } + use_new_spawn_system = 0; + initial_spawn = 1; + if ( isDefined( self.uspawn_already_spawned ) ) + { + initial_spawn = !self.uspawn_already_spawned; + } + if ( level.usestartspawns ) + { + use_new_spawn_system = 0; + } + if ( level.gametype == "sd" ) + { + use_new_spawn_system = 0; + } + set_dvar_if_unset( "scr_spawn_force_unified", "0" ); + [[ level.onspawnplayer ]]( predictedspawn ); + if ( !predictedspawn ) + { + self.uspawn_already_spawned = 1; + } + return; } getspawnpoint( player_entity, predictedspawn ) { - if ( !isdefined( predictedspawn ) ) - predictedspawn = 0; - - if ( level.teambased ) - { - point_team = player_entity.pers["team"]; - influencer_team = player_entity.pers["team"]; - } - else - { - point_team = "free"; - influencer_team = "free"; - } - - if ( level.teambased && isdefined( game["switchedsides"] ) && game["switchedsides"] && level.spawnsystem.unifiedsideswitching ) - point_team = getotherteam( point_team ); - - best_spawn_entity = get_best_spawnpoint( point_team, influencer_team, player_entity, predictedspawn ); - - if ( !predictedspawn ) - player_entity.last_spawn_origin = best_spawn_entity.origin; - - return best_spawn_entity; + if ( !isDefined( predictedspawn ) ) + { + predictedspawn = 0; + } + if ( level.teambased ) + { + point_team = player_entity.pers[ "team" ]; + influencer_team = player_entity.pers[ "team" ]; + } + else + { + point_team = "free"; + influencer_team = "free"; + } + if ( level.teambased && isDefined( game[ "switchedsides" ] ) && game[ "switchedsides" ] && level.spawnsystem.unifiedsideswitching ) + { + point_team = getotherteam( point_team ); + } + best_spawn_entity = get_best_spawnpoint( point_team, influencer_team, player_entity, predictedspawn ); + if ( !predictedspawn ) + { + player_entity.last_spawn_origin = best_spawn_entity.origin; + } + return best_spawn_entity; } get_debug_spawnpoint( player ) { - if ( level.teambased ) - team = player.pers["team"]; - else - team = "free"; - - index = level.test_spawn_point_index; - level.test_spawn_point_index++; - - if ( team == "free" ) - { - spawn_counts = 0; - - foreach ( team in level.teams ) - spawn_counts += level.unified_spawn_points[team].a.size; - - if ( level.test_spawn_point_index >= spawn_counts ) - level.test_spawn_point_index = 0; - - count = 0; - - foreach ( team in level.teams ) - { - size = level.unified_spawn_points[team].a.size; - - if ( level.test_spawn_point_index < count + size ) - return level.unified_spawn_points[team].a[level.test_spawn_point_index - count]; - - count += size; - } - } - else - { - if ( level.test_spawn_point_index >= level.unified_spawn_points[team].a.size ) - level.test_spawn_point_index = 0; - - return level.unified_spawn_points[team].a[level.test_spawn_point_index]; - } + if ( level.teambased ) + { + team = player.pers[ "team" ]; + } + else + { + team = "free"; + } + index = level.test_spawn_point_index; + level.test_spawn_point_index++; + if ( team == "free" ) + { + spawn_counts = 0; + _a1409 = level.teams; + _k1409 = getFirstArrayKey( _a1409 ); + while ( isDefined( _k1409 ) ) + { + team = _a1409[ _k1409 ]; + spawn_counts += level.unified_spawn_points[ team ].a.size; + _k1409 = getNextArrayKey( _a1409, _k1409 ); + } + if ( level.test_spawn_point_index >= spawn_counts ) + { + level.test_spawn_point_index = 0; + } + count = 0; + _a1420 = level.teams; + _k1420 = getFirstArrayKey( _a1420 ); + while ( isDefined( _k1420 ) ) + { + team = _a1420[ _k1420 ]; + size = level.unified_spawn_points[ team ].a.size; + if ( level.test_spawn_point_index < ( count + size ) ) + { + return level.unified_spawn_points[ team ].a[ level.test_spawn_point_index - count ]; + } + count += size; + _k1420 = getNextArrayKey( _a1420, _k1420 ); + } + } + else if ( level.test_spawn_point_index >= level.unified_spawn_points[ team ].a.size ) + { + level.test_spawn_point_index = 0; + } + return level.unified_spawn_points[ team ].a[ level.test_spawn_point_index ]; } get_best_spawnpoint( point_team, influencer_team, player, predictedspawn ) { - if ( level.teambased ) - vis_team_mask = getotherteamsmask( player.pers["team"] ); - else - vis_team_mask = level.spawnsystem.ispawn_teammask_free; - - scored_spawn_points = getsortedspawnpoints( point_team, influencer_team, vis_team_mask, player, predictedspawn ); + if ( level.teambased ) + { + vis_team_mask = getotherteamsmask( player.pers[ "team" ] ); + } + else + { + vis_team_mask = level.spawnsystem.ispawn_teammask_free; + } + scored_spawn_points = getsortedspawnpoints( point_team, influencer_team, vis_team_mask, player, predictedspawn ); /# - assert( scored_spawn_points.size > 0 ); + assert( scored_spawn_points.size > 0 ); #/ /# - assert( scored_spawn_points.size == 1 ); + assert( scored_spawn_points.size == 1 ); #/ - if ( !predictedspawn ) - bbprint( "mpspawnpointsused", "reason %s x %d y %d z %d", "point used", scored_spawn_points[0].origin ); - - return scored_spawn_points[0]; + if ( !predictedspawn ) + { + bbprint( "mpspawnpointsused", "reason %s x %d y %d z %d", "point used", scored_spawn_points[ 0 ].origin ); + } + return scored_spawn_points[ 0 ]; } gatherspawnentities( player_team ) { - if ( !isdefined( level.unified_spawn_points ) ) - level.unified_spawn_points = []; - else if ( isdefined( level.unified_spawn_points[player_team] ) ) - return level.unified_spawn_points[player_team]; - - spawn_entities_s = spawn_array_struct(); - spawn_entities_s.a = getentarray( "mp_uspawn_point", "classname" ); - - if ( !isdefined( spawn_entities_s.a ) ) - spawn_entities_s.a = []; - - legacy_spawn_points = maps\mp\gametypes_zm\_spawnlogic::getteamspawnpoints( player_team ); - - for ( legacy_spawn_index = 0; legacy_spawn_index < legacy_spawn_points.size; legacy_spawn_index++ ) - spawn_entities_s.a[spawn_entities_s.a.size] = legacy_spawn_points[legacy_spawn_index]; - - level.unified_spawn_points[player_team] = spawn_entities_s; - return spawn_entities_s; + if ( !isDefined( level.unified_spawn_points ) ) + { + level.unified_spawn_points = []; + } + else + { + if ( isDefined( level.unified_spawn_points[ player_team ] ) ) + { + return level.unified_spawn_points[ player_team ]; + } + } + spawn_entities_s = spawn_array_struct(); + spawn_entities_s.a = getentarray( "mp_uspawn_point", "classname" ); + if ( !isDefined( spawn_entities_s.a ) ) + { + spawn_entities_s.a = []; + } + legacy_spawn_points = maps/mp/gametypes_zm/_spawnlogic::getteamspawnpoints( player_team ); + legacy_spawn_index = 0; + while ( legacy_spawn_index < legacy_spawn_points.size ) + { + spawn_entities_s.a[ spawn_entities_s.a.size ] = legacy_spawn_points[ legacy_spawn_index ]; + legacy_spawn_index++; + } + level.unified_spawn_points[ player_team ] = spawn_entities_s; + return spawn_entities_s; } is_hardcore() { - return isdefined( level.hardcoremode ) && level.hardcoremode; + if ( isDefined( level.hardcoremode ) ) + { + return level.hardcoremode; + } } teams_have_enmity( team1, team2 ) { - if ( !isdefined( team1 ) || !isdefined( team2 ) || level.gametype == "dm" ) - return 1; - - return team1 != "neutral" && team2 != "neutral" && team1 != team2; + if ( isDefined( team1 ) || !isDefined( team2 ) && level.gametype == "dm" ) + { + return 1; + } + if ( team1 != "neutral" && team2 != "neutral" ) + { + return team1 != team2; + } } remove_unused_spawn_entities() { - spawn_entity_types = []; - spawn_entity_types[spawn_entity_types.size] = "mp_dm_spawn"; - spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_allies_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn_axis_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_tdm_spawn"; - spawn_entity_types[spawn_entity_types.size] = "mp_ctf_spawn_allies_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_ctf_spawn_axis_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_ctf_spawn_allies"; - spawn_entity_types[spawn_entity_types.size] = "mp_ctf_spawn_axis"; - spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn_allies_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn_axis_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_dom_spawn"; - spawn_entity_types[spawn_entity_types.size] = "mp_sab_spawn_allies_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_sab_spawn_axis_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_sab_spawn_allies"; - spawn_entity_types[spawn_entity_types.size] = "mp_sab_spawn_axis"; - spawn_entity_types[spawn_entity_types.size] = "mp_sd_spawn_attacker"; - spawn_entity_types[spawn_entity_types.size] = "mp_sd_spawn_defender"; - spawn_entity_types[spawn_entity_types.size] = "mp_twar_spawn_axis_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_twar_spawn_allies_start"; - spawn_entity_types[spawn_entity_types.size] = "mp_twar_spawn"; - - for ( i = 0; i < spawn_entity_types.size; i++ ) - { - if ( spawn_point_class_name_being_used( spawn_entity_types[i] ) ) - continue; - - spawnpoints = maps\mp\gametypes_zm\_spawnlogic::getspawnpointarray( spawn_entity_types[i] ); - delete_all_spawns( spawnpoints ); - } + spawn_entity_types = []; + spawn_entity_types[ spawn_entity_types.size ] = "mp_dm_spawn"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_allies_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn_axis_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_tdm_spawn"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_allies_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_axis_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_allies"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_ctf_spawn_axis"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_allies_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn_axis_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_dom_spawn"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_allies_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_axis_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_allies"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_sab_spawn_axis"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_sd_spawn_attacker"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_sd_spawn_defender"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn_axis_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn_allies_start"; + spawn_entity_types[ spawn_entity_types.size ] = "mp_twar_spawn"; + i = 0; + while ( i < spawn_entity_types.size ) + { + if ( spawn_point_class_name_being_used( spawn_entity_types[ i ] ) ) + { + i++; + continue; + } + else + { + spawnpoints = maps/mp/gametypes_zm/_spawnlogic::getspawnpointarray( spawn_entity_types[ i ] ); + delete_all_spawns( spawnpoints ); + } + i++; + } } delete_all_spawns( spawnpoints ) { - for ( i = 0; i < spawnpoints.size; i++ ) - spawnpoints[i] delete(); + i = 0; + while ( i < spawnpoints.size ) + { + spawnpoints[ i ] delete(); + i++; + } } spawn_point_class_name_being_used( name ) { - if ( !isdefined( level.spawn_point_class_names ) ) - return false; - - for ( i = 0; i < level.spawn_point_class_names.size; i++ ) - { - if ( level.spawn_point_class_names[i] == name ) - return true; - } - - return false; + if ( !isDefined( level.spawn_point_class_names ) ) + { + return 0; + } + i = 0; + while ( i < level.spawn_point_class_names.size ) + { + if ( level.spawn_point_class_names[ i ] == name ) + { + return 1; + } + i++; + } + return 0; } codecallback_updatespawnpoints() { - foreach ( team in level.teams ) - maps\mp\gametypes_zm\_spawnlogic::rebuildspawnpoints( team ); - - level.unified_spawn_points = undefined; - updateallspawnpoints(); + _a1624 = level.teams; + _k1624 = getFirstArrayKey( _a1624 ); + while ( isDefined( _k1624 ) ) + { + team = _a1624[ _k1624 ]; + maps/mp/gametypes_zm/_spawnlogic::rebuildspawnpoints( team ); + _k1624 = getNextArrayKey( _a1624, _k1624 ); + } + level.unified_spawn_points = undefined; + updateallspawnpoints(); } initialspawnprotection( specialtyname, spawnmonitorspeed ) { - self endon( "death" ); - self endon( "disconnect" ); - - if ( !isdefined( level.spawnprotectiontime ) || level.spawnprotectiontime == 0 ) - return; - - if ( specialtyname == "specialty_nottargetedbyairsupport" ) - { - self.specialty_nottargetedbyairsupport = 1; - wait( level.spawnprotectiontime ); - self.specialty_nottargetedbyairsupport = undefined; - } - else if ( !self hasperk( specialtyname ) ) - { - self setperk( specialtyname ); - wait( level.spawnprotectiontime ); - self unsetperk( specialtyname ); - } + self endon( "death" ); + self endon( "disconnect" ); + if ( !isDefined( level.spawnprotectiontime ) || level.spawnprotectiontime == 0 ) + { + return; + } + if ( specialtyname == "specialty_nottargetedbyairsupport" ) + { + self.specialty_nottargetedbyairsupport = 1; + wait level.spawnprotectiontime; + self.specialty_nottargetedbyairsupport = undefined; + } + else + { + if ( !self hasperk( specialtyname ) ) + { + self setperk( specialtyname ); + wait level.spawnprotectiontime; + self unsetperk( specialtyname ); + } + } } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc index f69cdc5..ba21d0f 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc @@ -1,2160 +1,2496 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_callbacksetup; -#include maps\mp\gametypes_zm\_gameobjects; -#include maps\mp\gametypes_zm\_spawnlogic; +#include maps/mp/gametypes_zm/_spawnlogic; +#include maps/mp/gametypes_zm/_gameobjects; +#include maps/mp/gametypes_zm/_callbacksetup; +#include maps/mp/_utility; +#include common_scripts/utility; onplayerconnect() { - for (;;) - level waittill( "connected", player ); + for ( ;; ) + { + level waittill( "connected", player ); + } } findboxcenter( mins, maxs ) { - center = ( 0, 0, 0 ); - center = maxs - mins; - center = ( center[0] / 2, center[1] / 2, center[2] / 2 ) + mins; - return center; + center = ( -1, -1, -1 ); + center = maxs - mins; + center = ( center[ 0 ] / 2, center[ 1 ] / 2, center[ 2 ] / 2 ) + mins; + return center; } expandmins( mins, point ) { - if ( mins[0] > point[0] ) - mins = ( point[0], mins[1], mins[2] ); - - if ( mins[1] > point[1] ) - mins = ( mins[0], point[1], mins[2] ); - - if ( mins[2] > point[2] ) - mins = ( mins[0], mins[1], point[2] ); - - return mins; + if ( mins[ 0 ] > point[ 0 ] ) + { + mins = ( point[ 0 ], mins[ 1 ], mins[ 2 ] ); + } + if ( mins[ 1 ] > point[ 1 ] ) + { + mins = ( mins[ 0 ], point[ 1 ], mins[ 2 ] ); + } + if ( mins[ 2 ] > point[ 2 ] ) + { + mins = ( mins[ 0 ], mins[ 1 ], point[ 2 ] ); + } + return mins; } expandmaxs( maxs, point ) { - if ( maxs[0] < point[0] ) - maxs = ( point[0], maxs[1], maxs[2] ); - - if ( maxs[1] < point[1] ) - maxs = ( maxs[0], point[1], maxs[2] ); - - if ( maxs[2] < point[2] ) - maxs = ( maxs[0], maxs[1], point[2] ); - - return maxs; + if ( maxs[ 0 ] < point[ 0 ] ) + { + maxs = ( point[ 0 ], maxs[ 1 ], maxs[ 2 ] ); + } + if ( maxs[ 1 ] < point[ 1 ] ) + { + maxs = ( maxs[ 0 ], point[ 1 ], maxs[ 2 ] ); + } + if ( maxs[ 2 ] < point[ 2 ] ) + { + maxs = ( maxs[ 0 ], maxs[ 1 ], point[ 2 ] ); + } + return maxs; } addspawnpointsinternal( team, spawnpointname ) { - oldspawnpoints = []; - - if ( level.teamspawnpoints[team].size ) - oldspawnpoints = level.teamspawnpoints[team]; - - level.teamspawnpoints[team] = getspawnpointarray( spawnpointname ); - - if ( !isdefined( level.spawnpoints ) ) - level.spawnpoints = []; - - for ( index = 0; index < level.teamspawnpoints[team].size; index++ ) - { - spawnpoint = level.teamspawnpoints[team][index]; - - if ( !isdefined( spawnpoint.inited ) ) - { - spawnpoint spawnpointinit(); - level.spawnpoints[level.spawnpoints.size] = spawnpoint; - } - } - - for ( index = 0; index < oldspawnpoints.size; index++ ) - { - origin = oldspawnpoints[index].origin; - level.spawnmins = expandmins( level.spawnmins, origin ); - level.spawnmaxs = expandmaxs( level.spawnmaxs, origin ); - level.teamspawnpoints[team][level.teamspawnpoints[team].size] = oldspawnpoints[index]; - } - - if ( !level.teamspawnpoints[team].size ) - { + oldspawnpoints = []; + if ( level.teamspawnpoints[ team ].size ) + { + oldspawnpoints = level.teamspawnpoints[ team ]; + } + level.teamspawnpoints[ team ] = getspawnpointarray( spawnpointname ); + if ( !isDefined( level.spawnpoints ) ) + { + level.spawnpoints = []; + } + index = 0; + while ( index < level.teamspawnpoints[ team ].size ) + { + spawnpoint = level.teamspawnpoints[ team ][ index ]; + if ( !isDefined( spawnpoint.inited ) ) + { + spawnpoint spawnpointinit(); + level.spawnpoints[ level.spawnpoints.size ] = spawnpoint; + } + index++; + } + index = 0; + while ( index < oldspawnpoints.size ) + { + origin = oldspawnpoints[ index ].origin; + level.spawnmins = expandmins( level.spawnmins, origin ); + level.spawnmaxs = expandmaxs( level.spawnmaxs, origin ); + level.teamspawnpoints[ team ][ level.teamspawnpoints[ team ].size ] = oldspawnpoints[ index ]; + index++; + } + if ( !level.teamspawnpoints[ team ].size ) + { /# - println( "^1ERROR: No " + spawnpointname + " spawnpoints found in level!" ); + println( "^1ERROR: No " + spawnpointname + " spawnpoints found in level!" ); #/ - maps\mp\gametypes_zm\_callbacksetup::abortlevel(); - wait 1; - return; - } + maps/mp/gametypes_zm/_callbacksetup::abortlevel(); + wait 1; + return; + } } clearspawnpoints() { - foreach ( team in level.teams ) - level.teamspawnpoints[team] = []; - - level.spawnpoints = []; - level.unified_spawn_points = undefined; + _a87 = level.teams; + _k87 = getFirstArrayKey( _a87 ); + while ( isDefined( _k87 ) ) + { + team = _a87[ _k87 ]; + level.teamspawnpoints[ team ] = []; + _k87 = getNextArrayKey( _a87, _k87 ); + } + level.spawnpoints = []; + level.unified_spawn_points = undefined; } addspawnpoints( team, spawnpointname ) { - addspawnpointclassname( spawnpointname ); - addspawnpointteamclassname( team, spawnpointname ); - addspawnpointsinternal( team, spawnpointname ); + addspawnpointclassname( spawnpointname ); + addspawnpointteamclassname( team, spawnpointname ); + addspawnpointsinternal( team, spawnpointname ); } rebuildspawnpoints( team ) { - level.teamspawnpoints[team] = []; - - for ( index = 0; index < level.spawn_point_team_class_names[team].size; index++ ) - addspawnpointsinternal( team, level.spawn_point_team_class_names[team][index] ); + level.teamspawnpoints[ team ] = []; + index = 0; + while ( index < level.spawn_point_team_class_names[ team ].size ) + { + addspawnpointsinternal( team, level.spawn_point_team_class_names[ team ][ index ] ); + index++; + } } placespawnpoints( spawnpointname ) { - addspawnpointclassname( spawnpointname ); - spawnpoints = getspawnpointarray( spawnpointname ); + addspawnpointclassname( spawnpointname ); + spawnpoints = getspawnpointarray( spawnpointname ); /# - if ( !isdefined( level.extraspawnpointsused ) ) - level.extraspawnpointsused = []; + if ( !isDefined( level.extraspawnpointsused ) ) + { + level.extraspawnpointsused = []; #/ - if ( !spawnpoints.size ) - { + } + if ( !spawnpoints.size ) + { /# - println( "^1No " + spawnpointname + " spawnpoints found in level!" ); + println( "^1No " + spawnpointname + " spawnpoints found in level!" ); #/ - maps\mp\gametypes_zm\_callbacksetup::abortlevel(); - wait 1; - return; - } - - for ( index = 0; index < spawnpoints.size; index++ ) - { - spawnpoints[index] spawnpointinit(); + maps/mp/gametypes_zm/_callbacksetup::abortlevel(); + wait 1; + return; + } + index = 0; + while ( index < spawnpoints.size ) + { + spawnpoints[ index ] spawnpointinit(); /# - spawnpoints[index].fakeclassname = spawnpointname; - level.extraspawnpointsused[level.extraspawnpointsused.size] = spawnpoints[index]; + spawnpoints[ index ].fakeclassname = spawnpointname; + level.extraspawnpointsused[ level.extraspawnpointsused.size ] = spawnpoints[ index ]; #/ - } + index++; + } } dropspawnpoints( spawnpointname ) { - spawnpoints = getspawnpointarray( spawnpointname ); - - if ( !spawnpoints.size ) - { + spawnpoints = getspawnpointarray( spawnpointname ); + if ( !spawnpoints.size ) + { /# - println( "^1No " + spawnpointname + " spawnpoints found in level!" ); + println( "^1No " + spawnpointname + " spawnpoints found in level!" ); #/ - return; - } - - for ( index = 0; index < spawnpoints.size; index++ ) - spawnpoints[index] placespawnpoint(); + return; + } + index = 0; + while ( index < spawnpoints.size ) + { + spawnpoints[ index ] placespawnpoint(); + index++; + } } addspawnpointclassname( spawnpointclassname ) { - if ( !isdefined( level.spawn_point_class_names ) ) - level.spawn_point_class_names = []; - - level.spawn_point_class_names[level.spawn_point_class_names.size] = spawnpointclassname; + if ( !isDefined( level.spawn_point_class_names ) ) + { + level.spawn_point_class_names = []; + } + level.spawn_point_class_names[ level.spawn_point_class_names.size ] = spawnpointclassname; } addspawnpointteamclassname( team, spawnpointclassname ) { - level.spawn_point_team_class_names[team][level.spawn_point_team_class_names[team].size] = spawnpointclassname; + level.spawn_point_team_class_names[ team ][ level.spawn_point_team_class_names[ team ].size ] = spawnpointclassname; } getspawnpointarray( classname ) { - spawnpoints = getentarray( classname, "classname" ); - - if ( !isdefined( level.extraspawnpoints ) || !isdefined( level.extraspawnpoints[classname] ) ) - return spawnpoints; - - for ( i = 0; i < level.extraspawnpoints[classname].size; i++ ) - spawnpoints[spawnpoints.size] = level.extraspawnpoints[classname][i]; - - return spawnpoints; + spawnpoints = getentarray( classname, "classname" ); + if ( !isDefined( level.extraspawnpoints ) || !isDefined( level.extraspawnpoints[ classname ] ) ) + { + return spawnpoints; + } + i = 0; + while ( i < level.extraspawnpoints[ classname ].size ) + { + spawnpoints[ spawnpoints.size ] = level.extraspawnpoints[ classname ][ i ]; + i++; + } + return spawnpoints; } spawnpointinit() { - spawnpoint = self; - origin = spawnpoint.origin; - - if ( !level.spawnminsmaxsprimed ) - { - level.spawnmins = origin; - level.spawnmaxs = origin; - level.spawnminsmaxsprimed = 1; - } - else - { - level.spawnmins = expandmins( level.spawnmins, origin ); - level.spawnmaxs = expandmaxs( level.spawnmaxs, origin ); - } - - spawnpoint placespawnpoint(); - spawnpoint.forward = anglestoforward( spawnpoint.angles ); - spawnpoint.sighttracepoint = spawnpoint.origin + vectorscale( ( 0, 0, 1 ), 50.0 ); - spawnpoint.inited = 1; + spawnpoint = self; + origin = spawnpoint.origin; + if ( !level.spawnminsmaxsprimed ) + { + level.spawnmins = origin; + level.spawnmaxs = origin; + level.spawnminsmaxsprimed = 1; + } + else + { + level.spawnmins = expandmins( level.spawnmins, origin ); + level.spawnmaxs = expandmaxs( level.spawnmaxs, origin ); + } + spawnpoint placespawnpoint(); + spawnpoint.forward = anglesToForward( spawnpoint.angles ); + spawnpoint.sighttracepoint = spawnpoint.origin + vectorScale( ( -1, -1, -1 ), 50 ); + spawnpoint.inited = 1; } getteamspawnpoints( team ) { - return level.teamspawnpoints[team]; + return level.teamspawnpoints[ team ]; } getspawnpoint_final( spawnpoints, useweights ) { - bestspawnpoint = undefined; - - if ( !isdefined( spawnpoints ) || spawnpoints.size == 0 ) - return undefined; - - if ( !isdefined( useweights ) ) - useweights = 1; - - if ( useweights ) - { - bestspawnpoint = getbestweightedspawnpoint( spawnpoints ); - thread spawnweightdebug( spawnpoints ); - } - else - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( isdefined( self.lastspawnpoint ) && self.lastspawnpoint == spawnpoints[i] ) - continue; - - if ( positionwouldtelefrag( spawnpoints[i].origin ) ) - continue; - - bestspawnpoint = spawnpoints[i]; - break; - } - - if ( !isdefined( bestspawnpoint ) ) - { - if ( isdefined( self.lastspawnpoint ) && !positionwouldtelefrag( self.lastspawnpoint.origin ) ) - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( spawnpoints[i] == self.lastspawnpoint ) - { - bestspawnpoint = spawnpoints[i]; - break; - } - } - } - } - } - - if ( !isdefined( bestspawnpoint ) ) - { - if ( useweights ) - bestspawnpoint = spawnpoints[randomint( spawnpoints.size )]; - else - bestspawnpoint = spawnpoints[0]; - } - - self finalizespawnpointchoice( bestspawnpoint ); + bestspawnpoint = undefined; + if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 ) + { + return undefined; + } + if ( !isDefined( useweights ) ) + { + useweights = 1; + } + if ( useweights ) + { + bestspawnpoint = getbestweightedspawnpoint( spawnpoints ); + thread spawnweightdebug( spawnpoints ); + } + else i = 0; + while ( i < spawnpoints.size ) + { + if ( isDefined( self.lastspawnpoint ) && self.lastspawnpoint == spawnpoints[ i ] ) + { + i++; + continue; + } + else + { + if ( positionwouldtelefrag( spawnpoints[ i ].origin ) ) + { + i++; + continue; + } + else + { + bestspawnpoint = spawnpoints[ i ]; + break; + } + } + i++; + } + while ( !isDefined( bestspawnpoint ) ) + { + while ( isDefined( self.lastspawnpoint ) && !positionwouldtelefrag( self.lastspawnpoint.origin ) ) + { + i = 0; + while ( i < spawnpoints.size ) + { + if ( spawnpoints[ i ] == self.lastspawnpoint ) + { + bestspawnpoint = spawnpoints[ i ]; + break; + } + else + { + i++; + } + } + } + } + if ( !isDefined( bestspawnpoint ) ) + { + if ( useweights ) + { + bestspawnpoint = spawnpoints[ randomint( spawnpoints.size ) ]; + } + else + { + bestspawnpoint = spawnpoints[ 0 ]; + } + } + self finalizespawnpointchoice( bestspawnpoint ); /# - self storespawndata( spawnpoints, useweights, bestspawnpoint ); + self storespawndata( spawnpoints, useweights, bestspawnpoint ); #/ - return bestspawnpoint; + return bestspawnpoint; } finalizespawnpointchoice( spawnpoint ) { - time = gettime(); - self.lastspawnpoint = spawnpoint; - self.lastspawntime = time; - spawnpoint.lastspawnedplayer = self; - spawnpoint.lastspawntime = time; + time = getTime(); + self.lastspawnpoint = spawnpoint; + self.lastspawntime = time; + spawnpoint.lastspawnedplayer = self; + spawnpoint.lastspawntime = time; } getbestweightedspawnpoint( spawnpoints ) { - maxsighttracedspawnpoints = 3; - - for ( try = 0; try <= maxsighttracedspawnpoints; try++ ) - { - bestspawnpoints = []; - bestweight = undefined; - bestspawnpoint = undefined; - - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( !isdefined( bestweight ) || spawnpoints[i].weight > bestweight ) - { - if ( positionwouldtelefrag( spawnpoints[i].origin ) ) - continue; - - bestspawnpoints = []; - bestspawnpoints[0] = spawnpoints[i]; - bestweight = spawnpoints[i].weight; - continue; - } - - if ( spawnpoints[i].weight == bestweight ) - { - if ( positionwouldtelefrag( spawnpoints[i].origin ) ) - continue; - - bestspawnpoints[bestspawnpoints.size] = spawnpoints[i]; - } - } - - if ( bestspawnpoints.size == 0 ) - return undefined; - - bestspawnpoint = bestspawnpoints[randomint( bestspawnpoints.size )]; - - if ( try == maxsighttracedspawnpoints ) - return bestspawnpoint; - - if ( isdefined( bestspawnpoint.lastsighttracetime ) && bestspawnpoint.lastsighttracetime == gettime() ) - return bestspawnpoint; - - if ( !lastminutesighttraces( bestspawnpoint ) ) - return bestspawnpoint; - - penalty = getlospenalty(); + maxsighttracedspawnpoints = 3; + try = 0; + while ( try <= maxsighttracedspawnpoints ) + { + bestspawnpoints = []; + bestweight = undefined; + bestspawnpoint = undefined; + i = 0; + while ( i < spawnpoints.size ) + { + if ( !isDefined( bestweight ) || spawnpoints[ i ].weight > bestweight ) + { + if ( positionwouldtelefrag( spawnpoints[ i ].origin ) ) + { + i++; + continue; + } + else bestspawnpoints = []; + bestspawnpoints[ 0 ] = spawnpoints[ i ]; + bestweight = spawnpoints[ i ].weight; + i++; + continue; + } + else + { + if ( spawnpoints[ i ].weight == bestweight ) + { + if ( positionwouldtelefrag( spawnpoints[ i ].origin ) ) + { + i++; + continue; + } + else + { + bestspawnpoints[ bestspawnpoints.size ] = spawnpoints[ i ]; + } + } + } + i++; + } + if ( bestspawnpoints.size == 0 ) + { + return undefined; + } + bestspawnpoint = bestspawnpoints[ randomint( bestspawnpoints.size ) ]; + if ( try == maxsighttracedspawnpoints ) + { + return bestspawnpoint; + } + if ( isDefined( bestspawnpoint.lastsighttracetime ) && bestspawnpoint.lastsighttracetime == getTime() ) + { + return bestspawnpoint; + } + if ( !lastminutesighttraces( bestspawnpoint ) ) + { + return bestspawnpoint; + } + penalty = getlospenalty(); /# - if ( level.storespawndata || level.debugspawning ) - bestspawnpoint.spawndata[bestspawnpoint.spawndata.size] = "Last minute sight trace: -" + penalty; + if ( level.storespawndata || level.debugspawning ) + { + bestspawnpoint.spawndata[ bestspawnpoint.spawndata.size ] = "Last minute sight trace: -" + penalty; #/ - bestspawnpoint.weight -= penalty; - bestspawnpoint.lastsighttracetime = gettime(); - } + } + bestspawnpoint.weight -= penalty; + bestspawnpoint.lastsighttracetime = getTime(); + try++; + } } checkbad( spawnpoint ) { /# - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( !isalive( player ) || player.sessionstate != "playing" ) - continue; - - if ( level.teambased && player.team == self.team ) - continue; - - losexists = bullettracepassed( player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, 0, undefined ); - - if ( losexists ) - thread badspawnline( spawnpoint.sighttracepoint, player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), self.name, player.name ); - } + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( !isalive( player ) || player.sessionstate != "playing" ) + { + i++; + continue; + } + else + { + if ( level.teambased && player.team == self.team ) + { + i++; + continue; + } + else + { + losexists = bullettracepassed( player.origin + vectorScale( ( -1, -1, -1 ), 50 ), spawnpoint.sighttracepoint, 0, undefined ); + if ( losexists ) + { + thread badspawnline( spawnpoint.sighttracepoint, player.origin + vectorScale( ( -1, -1, -1 ), 50 ), self.name, player.name ); + } + } + } + i++; #/ + } } badspawnline( start, end, name1, name2 ) { /# - dist = distance( start, end ); - - for ( i = 0; i < 200; i++ ) - { - line( start, end, ( 1, 0, 0 ) ); - print3d( start, "Bad spawn! " + name1 + ", dist = " + dist ); - print3d( end, name2 ); - wait 0.05; - } + dist = distance( start, end ); + i = 0; + while ( i < 200 ) + { + line( start, end, ( -1, -1, -1 ) ); + print3d( start, "Bad spawn! " + name1 + ", dist = " + dist ); + print3d( end, name2 ); + wait 0,05; + i++; #/ + } } storespawndata( spawnpoints, useweights, bestspawnpoint ) { /# - if ( !isdefined( level.storespawndata ) || !level.storespawndata ) - return; - - level.storespawndata = getdvarint( "scr_recordspawndata" ); - - if ( !level.storespawndata ) - return; - - if ( !isdefined( level.spawnid ) ) - { - level.spawngameid = randomint( 100 ); - level.spawnid = 0; - } - - if ( bestspawnpoint.classname == "mp_global_intermission" ) - return; - - level.spawnid++; - file = openfile( "spawndata.txt", "append" ); - fprintfields( file, level.spawngameid + "." + level.spawnid + "," + spawnpoints.size + "," + self.name ); - - for ( i = 0; i < spawnpoints.size; i++ ) - { - str = vectostr( spawnpoints[i].origin ) + ","; - - if ( spawnpoints[i] == bestspawnpoint ) - str += "1,"; - else - str += "0,"; - - if ( !useweights ) - str += "0,"; - else - str += ( spawnpoints[i].weight + "," ); - - if ( !isdefined( spawnpoints[i].spawndata ) ) - spawnpoints[i].spawndata = []; - - if ( !isdefined( spawnpoints[i].sightchecks ) ) - spawnpoints[i].sightchecks = []; - - str += ( spawnpoints[i].spawndata.size + "," ); - - for ( j = 0; j < spawnpoints[i].spawndata.size; j++ ) - str += ( spawnpoints[i].spawndata[j] + "," ); - - str += ( spawnpoints[i].sightchecks.size + "," ); - - for ( j = 0; j < spawnpoints[i].sightchecks.size; j++ ) - str += ( spawnpoints[i].sightchecks[j].penalty + "," + vectostr( spawnpoints[i].origin ) + "," ); - - fprintfields( file, str ); - } - - obj = spawnstruct(); - getallalliedandenemyplayers( obj ); - numallies = 0; - numenemies = 0; - str = ""; - - for ( i = 0; i < obj.allies.size; i++ ) - { - if ( obj.allies[i] == self ) - continue; - - numallies++; - str += ( vectostr( obj.allies[i].origin ) + "," ); - } - - for ( i = 0; i < obj.enemies.size; i++ ) - { - numenemies++; - str += ( vectostr( obj.enemies[i].origin ) + "," ); - } - - str = numallies + "," + numenemies + "," + str; - fprintfields( file, str ); - otherdata = []; - - if ( isdefined( level.bombguy ) ) - { - index = otherdata.size; - otherdata[index] = spawnstruct(); - otherdata[index].origin = level.bombguy.origin + vectorscale( ( 0, 0, 1 ), 20.0 ); - otherdata[index].text = "Bomb holder"; - } - else if ( isdefined( level.bombpos ) ) - { - index = otherdata.size; - otherdata[index] = spawnstruct(); - otherdata[index].origin = level.bombpos; - otherdata[index].text = "Bomb"; - } - - if ( isdefined( level.flags ) ) - { - for ( i = 0; i < level.flags.size; i++ ) - { - index = otherdata.size; - otherdata[index] = spawnstruct(); - otherdata[index].origin = level.flags[i].origin; - otherdata[index].text = level.flags[i].useobj maps\mp\gametypes_zm\_gameobjects::getownerteam() + " flag"; - } - } - - str = otherdata.size + ","; - - for ( i = 0; i < otherdata.size; i++ ) - str += ( vectostr( otherdata[i].origin ) + "," + otherdata[i].text + "," ); - - fprintfields( file, str ); - closefile( file ); - thisspawnid = level.spawngameid + "." + level.spawnid; - - if ( isdefined( self.thisspawnid ) ) - { - - } - - self.thisspawnid = thisspawnid; + if ( !isDefined( level.storespawndata ) || !level.storespawndata ) + { + return; + } + level.storespawndata = getDvarInt( "scr_recordspawndata" ); + if ( !level.storespawndata ) + { + return; + } + if ( !isDefined( level.spawnid ) ) + { + level.spawngameid = randomint( 100 ); + level.spawnid = 0; + } + if ( bestspawnpoint.classname == "mp_global_intermission" ) + { + return; + } + level.spawnid++; + file = openfile( "spawndata.txt", "append" ); + fprintfields( file, ( level.spawngameid + "." ) + level.spawnid + "," + spawnpoints.size + "," + self.name ); + i = 0; + while ( i < spawnpoints.size ) + { + str = vectostr( spawnpoints[ i ].origin ) + ","; + if ( spawnpoints[ i ] == bestspawnpoint ) + { + str += "1,"; + } + else + { + str += "0,"; + } + if ( !useweights ) + { + str += "0,"; + } + else + { + str += spawnpoints[ i ].weight + ","; + } + if ( !isDefined( spawnpoints[ i ].spawndata ) ) + { + spawnpoints[ i ].spawndata = []; + } + if ( !isDefined( spawnpoints[ i ].sightchecks ) ) + { + spawnpoints[ i ].sightchecks = []; + } + str += spawnpoints[ i ].spawndata.size + ","; + j = 0; + while ( j < spawnpoints[ i ].spawndata.size ) + { + str += spawnpoints[ i ].spawndata[ j ] + ","; + j++; + } + str += spawnpoints[ i ].sightchecks.size + ","; + j = 0; + while ( j < spawnpoints[ i ].sightchecks.size ) + { + str += ( spawnpoints[ i ].sightchecks[ j ].penalty + "," ) + vectostr( spawnpoints[ i ].origin ) + ","; + j++; + } + fprintfields( file, str ); + i++; + } + obj = spawnstruct(); + getallalliedandenemyplayers( obj ); + numallies = 0; + numenemies = 0; + str = ""; + i = 0; + while ( i < obj.allies.size ) + { + if ( obj.allies[ i ] == self ) + { + i++; + continue; + } + else + { + numallies++; + str += vectostr( obj.allies[ i ].origin ) + ","; + } + i++; + } + i = 0; + while ( i < obj.enemies.size ) + { + numenemies++; + str += vectostr( obj.enemies[ i ].origin ) + ","; + i++; + } + str = ( numallies + "," ) + numenemies + "," + str; + fprintfields( file, str ); + otherdata = []; + if ( isDefined( level.bombguy ) ) + { + index = otherdata.size; + otherdata[ index ] = spawnstruct(); + otherdata[ index ].origin = level.bombguy.origin + vectorScale( ( -1, -1, -1 ), 20 ); + otherdata[ index ].text = "Bomb holder"; + } + else + { + if ( isDefined( level.bombpos ) ) + { + index = otherdata.size; + otherdata[ index ] = spawnstruct(); + otherdata[ index ].origin = level.bombpos; + otherdata[ index ].text = "Bomb"; + } + } + while ( isDefined( level.flags ) ) + { + i = 0; + while ( i < level.flags.size ) + { + index = otherdata.size; + otherdata[ index ] = spawnstruct(); + otherdata[ index ].origin = level.flags[ i ].origin; + otherdata[ index ].text = level.flags[ i ].useobj maps/mp/gametypes_zm/_gameobjects::getownerteam() + " flag"; + i++; + } + } + str = otherdata.size + ","; + i = 0; + while ( i < otherdata.size ) + { + str += vectostr( otherdata[ i ].origin ) + "," + otherdata[ i ].text + ","; + i++; + } + fprintfields( file, str ); + closefile( file ); + thisspawnid = ( level.spawngameid + "." ) + level.spawnid; + if ( isDefined( self.thisspawnid ) ) + { + } + self.thisspawnid = thisspawnid; #/ } readspawndata( desiredid, relativepos ) { /# - file = openfile( "spawndata.txt", "read" ); - - if ( file < 0 ) - return; - - oldspawndata = level.curspawndata; - level.curspawndata = undefined; - prev = undefined; - prevthisplayer = undefined; - lookingfornextthisplayer = 0; - lookingfornext = 0; - - if ( isdefined( relativepos ) && !isdefined( oldspawndata ) ) - return; - - while ( true ) - { - if ( freadln( file ) <= 0 ) - break; - - data = spawnstruct(); - data.id = fgetarg( file, 0 ); - numspawns = int( fgetarg( file, 1 ) ); - - if ( numspawns > 256 ) - break; - - data.playername = fgetarg( file, 2 ); - data.spawnpoints = []; - data.friends = []; - data.enemies = []; - data.otherdata = []; - - for ( i = 0; i < numspawns; i++ ) - { - if ( freadln( file ) <= 0 ) - break; - - spawnpoint = spawnstruct(); - spawnpoint.origin = strtovec( fgetarg( file, 0 ) ); - spawnpoint.winner = int( fgetarg( file, 1 ) ); - spawnpoint.weight = int( fgetarg( file, 2 ) ); - spawnpoint.data = []; - spawnpoint.sightchecks = []; - - if ( i == 0 ) - { - data.minweight = spawnpoint.weight; - data.maxweight = spawnpoint.weight; - } - else - { - if ( spawnpoint.weight < data.minweight ) - data.minweight = spawnpoint.weight; - - if ( spawnpoint.weight > data.maxweight ) - data.maxweight = spawnpoint.weight; - } - - argnum = 4; - numdata = int( fgetarg( file, 3 ) ); - - if ( numdata > 256 ) - break; - - for ( j = 0; j < numdata; j++ ) - { - spawnpoint.data[spawnpoint.data.size] = fgetarg( file, argnum ); - argnum++; - } - - numsightchecks = int( fgetarg( file, argnum ) ); - argnum++; - - if ( numsightchecks > 256 ) - break; - - for ( j = 0; j < numsightchecks; j++ ) - { - index = spawnpoint.sightchecks.size; - spawnpoint.sightchecks[index] = spawnstruct(); - spawnpoint.sightchecks[index].penalty = int( fgetarg( file, argnum ) ); - argnum++; - spawnpoint.sightchecks[index].origin = strtovec( fgetarg( file, argnum ) ); - argnum++; - } - - data.spawnpoints[data.spawnpoints.size] = spawnpoint; - } - - if ( !isdefined( data.minweight ) ) - { - data.minweight = -1; - data.maxweight = 0; - } - - if ( data.minweight == data.maxweight ) - data.minweight -= 1; - - if ( freadln( file ) <= 0 ) - break; - - numfriends = int( fgetarg( file, 0 ) ); - numenemies = int( fgetarg( file, 1 ) ); - - if ( numfriends > 32 || numenemies > 32 ) - break; - - argnum = 2; - - for ( i = 0; i < numfriends; i++ ) - { - data.friends[data.friends.size] = strtovec( fgetarg( file, argnum ) ); - argnum++; - } - - for ( i = 0; i < numenemies; i++ ) - { - data.enemies[data.enemies.size] = strtovec( fgetarg( file, argnum ) ); - argnum++; - } - - if ( freadln( file ) <= 0 ) - break; - - numotherdata = int( fgetarg( file, 0 ) ); - argnum = 1; - - for ( i = 0; i < numotherdata; i++ ) - { - otherdata = spawnstruct(); - otherdata.origin = strtovec( fgetarg( file, argnum ) ); - argnum++; - otherdata.text = fgetarg( file, argnum ); - argnum++; - data.otherdata[data.otherdata.size] = otherdata; - } - - if ( isdefined( relativepos ) ) - { - if ( relativepos == "prevthisplayer" ) - { - if ( data.id == oldspawndata.id ) - { - level.curspawndata = prevthisplayer; - break; - } - } - else if ( relativepos == "prev" ) - { - if ( data.id == oldspawndata.id ) - { - level.curspawndata = prev; - break; - } - } - else if ( relativepos == "nextthisplayer" ) - { - if ( lookingfornextthisplayer ) - { - level.curspawndata = data; - break; - } - else if ( data.id == oldspawndata.id ) - lookingfornextthisplayer = 1; - } - else if ( relativepos == "next" ) - { - if ( lookingfornext ) - { - level.curspawndata = data; - break; - } - else if ( data.id == oldspawndata.id ) - lookingfornext = 1; - } - } - else if ( data.id == desiredid ) - { - level.curspawndata = data; - break; - } - - prev = data; - - if ( isdefined( oldspawndata ) && data.playername == oldspawndata.playername ) - prevthisplayer = data; - } - - closefile( file ); + file = openfile( "spawndata.txt", "read" ); + if ( file < 0 ) + { + return; + } + oldspawndata = level.curspawndata; + level.curspawndata = undefined; + prev = undefined; + prevthisplayer = undefined; + lookingfornextthisplayer = 0; + lookingfornext = 0; + if ( isDefined( relativepos ) && !isDefined( oldspawndata ) ) + { + return; + } + while ( 1 ) + { + if ( freadln( file ) <= 0 ) + { + break; + } + else data = spawnstruct(); + data.id = fgetarg( file, 0 ); + numspawns = int( fgetarg( file, 1 ) ); + if ( numspawns > 256 ) + { + break; + } + else data.playername = fgetarg( file, 2 ); + data.spawnpoints = []; + data.friends = []; + data.enemies = []; + data.otherdata = []; + i = 0; + while ( i < numspawns ) + { + if ( freadln( file ) <= 0 ) + { + break; + } + else spawnpoint = spawnstruct(); + spawnpoint.origin = strtovec( fgetarg( file, 0 ) ); + spawnpoint.winner = int( fgetarg( file, 1 ) ); + spawnpoint.weight = int( fgetarg( file, 2 ) ); + spawnpoint.data = []; + spawnpoint.sightchecks = []; + if ( i == 0 ) + { + data.minweight = spawnpoint.weight; + data.maxweight = spawnpoint.weight; + } + else + { + if ( spawnpoint.weight < data.minweight ) + { + data.minweight = spawnpoint.weight; + } + if ( spawnpoint.weight > data.maxweight ) + { + data.maxweight = spawnpoint.weight; + } + } + argnum = 4; + numdata = int( fgetarg( file, 3 ) ); + if ( numdata > 256 ) + { + break; + } + else j = 0; + while ( j < numdata ) + { + spawnpoint.data[ spawnpoint.data.size ] = fgetarg( file, argnum ); + argnum++; + j++; + } + numsightchecks = int( fgetarg( file, argnum ) ); + argnum++; + if ( numsightchecks > 256 ) + { + break; + } + else + { + j = 0; + while ( j < numsightchecks ) + { + index = spawnpoint.sightchecks.size; + spawnpoint.sightchecks[ index ] = spawnstruct(); + spawnpoint.sightchecks[ index ].penalty = int( fgetarg( file, argnum ) ); + argnum++; + spawnpoint.sightchecks[ index ].origin = strtovec( fgetarg( file, argnum ) ); + argnum++; + j++; + } + data.spawnpoints[ data.spawnpoints.size ] = spawnpoint; + i++; + } + } + if ( !isDefined( data.minweight ) ) + { + data.minweight = -1; + data.maxweight = 0; + } + if ( data.minweight == data.maxweight ) + { + data.minweight -= 1; + } + if ( freadln( file ) <= 0 ) + { + break; + } + else numfriends = int( fgetarg( file, 0 ) ); + numenemies = int( fgetarg( file, 1 ) ); + if ( numfriends > 32 || numenemies > 32 ) + { + break; + } + else + { + argnum = 2; + i = 0; + while ( i < numfriends ) + { + data.friends[ data.friends.size ] = strtovec( fgetarg( file, argnum ) ); + argnum++; + i++; + } + i = 0; + while ( i < numenemies ) + { + data.enemies[ data.enemies.size ] = strtovec( fgetarg( file, argnum ) ); + argnum++; + i++; + } + if ( freadln( file ) <= 0 ) + { + break; + } + else numotherdata = int( fgetarg( file, 0 ) ); + argnum = 1; + i = 0; + while ( i < numotherdata ) + { + otherdata = spawnstruct(); + otherdata.origin = strtovec( fgetarg( file, argnum ) ); + argnum++; + otherdata.text = fgetarg( file, argnum ); + argnum++; + data.otherdata[ data.otherdata.size ] = otherdata; + i++; + } + if ( isDefined( relativepos ) ) + { + if ( relativepos == "prevthisplayer" ) + { + if ( data.id == oldspawndata.id ) + { + level.curspawndata = prevthisplayer; + break; + } + else } + else if ( relativepos == "prev" ) + { + if ( data.id == oldspawndata.id ) + { + level.curspawndata = prev; + break; + } + else } + else if ( relativepos == "nextthisplayer" ) + { + if ( lookingfornextthisplayer ) + { + level.curspawndata = data; + break; + } + else if ( data.id == oldspawndata.id ) + { + lookingfornextthisplayer = 1; + } + } + else if ( relativepos == "next" ) + { + if ( lookingfornext ) + { + level.curspawndata = data; + break; + } + else if ( data.id == oldspawndata.id ) + { + lookingfornext = 1; + } + } + } + else + { + if ( data.id == desiredid ) + { + level.curspawndata = data; + break; + } + } + else + { + prev = data; + if ( isDefined( oldspawndata ) && data.playername == oldspawndata.playername ) + { + prevthisplayer = data; + } + } + } + } + closefile( file ); #/ } drawspawndata() { /# - level notify( "drawing_spawn_data" ); - level endon( "drawing_spawn_data" ); - textoffset = vectorscale( ( 0, 0, -1 ), 12.0 ); - - while ( true ) - { - if ( !isdefined( level.curspawndata ) ) - { - wait 0.5; - continue; - } - - for ( i = 0; i < level.curspawndata.friends.size; i++ ) - print3d( level.curspawndata.friends[i], "=)", ( 0.5, 1, 0.5 ), 1, 5 ); - - for ( i = 0; i < level.curspawndata.enemies.size; i++ ) - print3d( level.curspawndata.enemies[i], "=(", ( 1, 0.5, 0.5 ), 1, 5 ); - - for ( i = 0; i < level.curspawndata.otherdata.size; i++ ) - print3d( level.curspawndata.otherdata[i].origin, level.curspawndata.otherdata[i].text, ( 0.5, 0.75, 1 ), 1, 2 ); - - for ( i = 0; i < level.curspawndata.spawnpoints.size; i++ ) - { - sp = level.curspawndata.spawnpoints[i]; - orig = sp.sighttracepoint; - - if ( sp.winner ) - { - print3d( orig, level.curspawndata.playername + " spawned here", ( 0.5, 0.5, 1 ), 1, 2 ); - orig += textoffset; - } - - amnt = ( sp.weight - level.curspawndata.minweight ) / ( level.curspawndata.maxweight - level.curspawndata.minweight ); - print3d( orig, "Weight: " + sp.weight, ( 1 - amnt, amnt, 0.5 ) ); - orig += textoffset; - - for ( j = 0; j < sp.data.size; j++ ) - { - print3d( orig, sp.data[j], ( 1, 1, 1 ) ); - orig += textoffset; - } - - for ( j = 0; j < sp.sightchecks.size; j++ ) - { - print3d( orig, "Sightchecks: -" + sp.sightchecks[j].penalty, ( 1, 0.5, 0.5 ) ); - orig += textoffset; - } - } - - wait 0.05; - } + level notify( "drawing_spawn_data" ); + level endon( "drawing_spawn_data" ); + textoffset = vectorScale( ( -1, -1, -1 ), 12 ); + while ( 1 ) + { + while ( !isDefined( level.curspawndata ) ) + { + wait 0,5; + } + i = 0; + while ( i < level.curspawndata.friends.size ) + { + print3d( level.curspawndata.friends[ i ], "=)", ( 0,5, 1, 0,5 ), 1, 5 ); + i++; + } + i = 0; + while ( i < level.curspawndata.enemies.size ) + { + print3d( level.curspawndata.enemies[ i ], "=(", ( 1, 0,5, 0,5 ), 1, 5 ); + i++; + } + i = 0; + while ( i < level.curspawndata.otherdata.size ) + { + print3d( level.curspawndata.otherdata[ i ].origin, level.curspawndata.otherdata[ i ].text, ( 0,5, 0,75, 1 ), 1, 2 ); + i++; + } + i = 0; + while ( i < level.curspawndata.spawnpoints.size ) + { + sp = level.curspawndata.spawnpoints[ i ]; + orig = sp.sighttracepoint; + if ( sp.winner ) + { + print3d( orig, level.curspawndata.playername + " spawned here", ( 0,5, 0,5, 1 ), 1, 2 ); + orig += textoffset; + } + amnt = ( sp.weight - level.curspawndata.minweight ) / ( level.curspawndata.maxweight - level.curspawndata.minweight ); + print3d( orig, "Weight: " + sp.weight, ( 1 - amnt, amnt, 0,5 ) ); + orig += textoffset; + j = 0; + while ( j < sp.data.size ) + { + print3d( orig, sp.data[ j ], ( -1, -1, -1 ) ); + orig += textoffset; + j++; + } + j = 0; + while ( j < sp.sightchecks.size ) + { + print3d( orig, "Sightchecks: -" + sp.sightchecks[ j ].penalty, ( 1, 0,5, 0,5 ) ); + orig += textoffset; + j++; + } + i++; + } + wait 0,05; #/ + } } vectostr( vec ) { /# - return int( vec[0] ) + "/" + int( vec[1] ) + "/" + int( vec[2] ); + return int( vec[ 0 ] ) + "/" + int( vec[ 1 ] ) + "/" + int( vec[ 2 ] ); #/ } strtovec( str ) { /# - parts = strtok( str, "/" ); - - if ( parts.size != 3 ) - return ( 0, 0, 0 ); - - return ( int( parts[0] ), int( parts[1] ), int( parts[2] ) ); + parts = strtok( str, "/" ); + if ( parts.size != 3 ) + { + return ( -1, -1, -1 ); + } + return ( int( parts[ 0 ] ), int( parts[ 1 ] ), int( parts[ 2 ] ) ); #/ } getspawnpoint_random( spawnpoints ) { - if ( !isdefined( spawnpoints ) ) - return undefined; - - for ( i = 0; i < spawnpoints.size; i++ ) - { - j = randomint( spawnpoints.size ); - spawnpoint = spawnpoints[i]; - spawnpoints[i] = spawnpoints[j]; - spawnpoints[j] = spawnpoint; - } - - return getspawnpoint_final( spawnpoints, 0 ); + if ( !isDefined( spawnpoints ) ) + { + return undefined; + } + i = 0; + while ( i < spawnpoints.size ) + { + j = randomint( spawnpoints.size ); + spawnpoint = spawnpoints[ i ]; + spawnpoints[ i ] = spawnpoints[ j ]; + spawnpoints[ j ] = spawnpoint; + i++; + } + return getspawnpoint_final( spawnpoints, 0 ); } getallotherplayers() { - aliveplayers = []; - - for ( i = 0; i < level.players.size; i++ ) - { - if ( !isdefined( level.players[i] ) ) - continue; - - player = level.players[i]; - - if ( player.sessionstate != "playing" || player == self ) - continue; - - if ( isdefined( level.customalivecheck ) ) - { - if ( ![[ level.customalivecheck ]]( player ) ) - continue; - } - - aliveplayers[aliveplayers.size] = player; - } - - return aliveplayers; + aliveplayers = []; + i = 0; + while ( i < level.players.size ) + { + if ( !isDefined( level.players[ i ] ) ) + { + i++; + continue; + } + else player = level.players[ i ]; + if ( player.sessionstate != "playing" || player == self ) + { + i++; + continue; + } + else + { + if ( isDefined( level.customalivecheck ) ) + { + if ( !( [[ level.customalivecheck ]]( player ) ) ) + { + i++; + continue; + } + } + else + { + aliveplayers[ aliveplayers.size ] = player; + } + } + i++; + } + return aliveplayers; } getallalliedandenemyplayers( obj ) { - if ( level.teambased ) - { + if ( level.teambased ) + { /# - assert( isdefined( level.teams[self.team] ) ); + assert( isDefined( level.teams[ self.team ] ) ); #/ - obj.allies = []; - obj.enemies = []; - - for ( i = 0; i < level.players.size; i++ ) - { - if ( !isdefined( level.players[i] ) ) - continue; - - player = level.players[i]; - - if ( player.sessionstate != "playing" || player == self ) - continue; - - if ( isdefined( level.customalivecheck ) ) - { - if ( ![[ level.customalivecheck ]]( player ) ) - continue; - } - - if ( player.team == self.team ) - { - obj.allies[obj.allies.size] = player; - continue; - } - - obj.enemies[obj.enemies.size] = player; - } - } - else - { - obj.allies = []; - obj.enemies = level.activeplayers; - } + obj.allies = []; + obj.enemies = []; + i = 0; + while ( i < level.players.size ) + { + if ( !isDefined( level.players[ i ] ) ) + { + i++; + continue; + } + else player = level.players[ i ]; + if ( player.sessionstate != "playing" || player == self ) + { + i++; + continue; + } + else + { + if ( isDefined( level.customalivecheck ) ) + { + if ( !( [[ level.customalivecheck ]]( player ) ) ) + { + i++; + continue; + } + } + else if ( player.team == self.team ) + { + obj.allies[ obj.allies.size ] = player; + i++; + continue; + } + else + { + obj.enemies[ obj.enemies.size ] = player; + } + } + i++; + } + } + else obj.allies = []; + obj.enemies = level.activeplayers; } initweights( spawnpoints ) { - for ( i = 0; i < spawnpoints.size; i++ ) - spawnpoints[i].weight = 0; + i = 0; + while ( i < spawnpoints.size ) + { + spawnpoints[ i ].weight = 0; + i++; + } /# - if ( level.storespawndata || level.debugspawning ) - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - spawnpoints[i].spawndata = []; - spawnpoints[i].sightchecks = []; - } - } + while ( level.storespawndata || level.debugspawning ) + { + i = 0; + while ( i < spawnpoints.size ) + { + spawnpoints[ i ].spawndata = []; + spawnpoints[ i ].sightchecks = []; + i++; #/ + } + } } spawnpointupdate_zm( spawnpoint ) { - foreach ( team in level.teams ) - { - spawnpoint.distsum[team] = 0; - spawnpoint.enemydistsum[team] = 0; - } - - players = get_players(); - spawnpoint.numplayersatlastupdate = players.size; - - foreach ( player in players ) - { - if ( !isdefined( player ) ) - continue; - - if ( player.sessionstate != "playing" ) - continue; - - if ( isdefined( level.customalivecheck ) ) - { - if ( ![[ level.customalivecheck ]]( player ) ) - continue; - } - - dist = distance( spawnpoint.origin, player.origin ); - spawnpoint.distsum[player.team] += dist; - - foreach ( team in level.teams ) - { - if ( team != player.team ) - spawnpoint.enemydistsum[team] += dist; - } - } + _a906 = level.teams; + _k906 = getFirstArrayKey( _a906 ); + while ( isDefined( _k906 ) ) + { + team = _a906[ _k906 ]; + spawnpoint.distsum[ team ] = 0; + spawnpoint.enemydistsum[ team ] = 0; + _k906 = getNextArrayKey( _a906, _k906 ); + } + players = get_players(); + spawnpoint.numplayersatlastupdate = players.size; + _a913 = players; + _k913 = getFirstArrayKey( _a913 ); + while ( isDefined( _k913 ) ) + { + player = _a913[ _k913 ]; + if ( !isDefined( player ) ) + { + } + else if ( player.sessionstate != "playing" ) + { + } + else if ( isDefined( level.customalivecheck ) ) + { + if ( !( [[ level.customalivecheck ]]( player ) ) ) + { + } + } + else + { + dist = distance( spawnpoint.origin, player.origin ); + spawnpoint.distsum[ player.team ] += dist; + _a924 = level.teams; + _k924 = getFirstArrayKey( _a924 ); + while ( isDefined( _k924 ) ) + { + team = _a924[ _k924 ]; + if ( team != player.team ) + { + spawnpoint.enemydistsum[ team ] += dist; + } + _k924 = getNextArrayKey( _a924, _k924 ); + } + } + _k913 = getNextArrayKey( _a913, _k913 ); + } } getspawnpoint_nearteam( spawnpoints, favoredspawnpoints, forceallydistanceweight, forceenemydistanceweight ) { - if ( !isdefined( spawnpoints ) ) - return undefined; + if ( !isDefined( spawnpoints ) ) + { + return undefined; + } /# - if ( getdvar( "scr_spawn_randomly" ) == "" ) - setdvar( "scr_spawn_randomly", "0" ); - - if ( getdvar( "scr_spawn_randomly" ) == "1" ) - return getspawnpoint_random( spawnpoints ); + if ( getDvar( "scr_spawn_randomly" ) == "" ) + { + setdvar( "scr_spawn_randomly", "0" ); + } + if ( getDvar( "scr_spawn_randomly" ) == "1" ) + { + return getspawnpoint_random( spawnpoints ); #/ - if ( getdvarint( "scr_spawnsimple" ) > 0 ) - return getspawnpoint_random( spawnpoints ); - - spawnlogic_begin(); - k_favored_spawn_point_bonus = 25000; - initweights( spawnpoints ); - obj = spawnstruct(); - getallalliedandenemyplayers( obj ); - numplayers = obj.allies.size + obj.enemies.size; - allieddistanceweight = 2; - - if ( isdefined( forceallydistanceweight ) ) - allieddistanceweight = forceallydistanceweight; - - enemydistanceweight = 1; - - if ( isdefined( forceenemydistanceweight ) ) - enemydistanceweight = forceenemydistanceweight; - - myteam = self.team; - - for ( i = 0; i < spawnpoints.size; i++ ) - { - spawnpoint = spawnpoints[i]; - spawnpointupdate_zm( spawnpoint ); - - if ( !isdefined( spawnpoint.numplayersatlastupdate ) ) - spawnpoint.numplayersatlastupdate = 0; - - if ( spawnpoint.numplayersatlastupdate > 0 ) - { - allydistsum = spawnpoint.distsum[myteam]; - enemydistsum = spawnpoint.enemydistsum[myteam]; - spawnpoint.weight = ( enemydistanceweight * enemydistsum - allieddistanceweight * allydistsum ) / spawnpoint.numplayersatlastupdate; + } + if ( getDvarInt( "scr_spawnsimple" ) > 0 ) + { + return getspawnpoint_random( spawnpoints ); + } + spawnlogic_begin(); + k_favored_spawn_point_bonus = 25000; + initweights( spawnpoints ); + obj = spawnstruct(); + getallalliedandenemyplayers( obj ); + numplayers = obj.allies.size + obj.enemies.size; + allieddistanceweight = 2; + if ( isDefined( forceallydistanceweight ) ) + { + allieddistanceweight = forceallydistanceweight; + } + enemydistanceweight = 1; + if ( isDefined( forceenemydistanceweight ) ) + { + enemydistanceweight = forceenemydistanceweight; + } + myteam = self.team; + i = 0; + while ( i < spawnpoints.size ) + { + spawnpoint = spawnpoints[ i ]; + spawnpointupdate_zm( spawnpoint ); + if ( !isDefined( spawnpoint.numplayersatlastupdate ) ) + { + spawnpoint.numplayersatlastupdate = 0; + } + if ( spawnpoint.numplayersatlastupdate > 0 ) + { + allydistsum = spawnpoint.distsum[ myteam ]; + enemydistsum = spawnpoint.enemydistsum[ myteam ]; + spawnpoint.weight = ( ( enemydistanceweight * enemydistsum ) - ( allieddistanceweight * allydistsum ) ) / spawnpoint.numplayersatlastupdate; /# - if ( level.storespawndata || level.debugspawning ) - spawnpoint.spawndata[spawnpoint.spawndata.size] = "Base weight: " + int( spawnpoint.weight ) + " = (" + enemydistanceweight + "*" + int( enemydistsum ) + " - " + allieddistanceweight + "*" + int( allydistsum ) + ") / " + spawnpoint.numplayersatlastupdate; + if ( level.storespawndata || level.debugspawning ) + { + spawnpoint.spawndata[ spawnpoint.spawndata.size ] = "Base weight: " + int( spawnpoint.weight ) + " = (" + enemydistanceweight + "*" + int( enemydistsum ) + " - " + allieddistanceweight + "*" + int( allydistsum ) + ") / " + spawnpoint.numplayersatlastupdate; #/ - continue; - } - - spawnpoint.weight = 0; + } + i++; + continue; + } + else + { + spawnpoint.weight = 0; /# - if ( level.storespawndata || level.debugspawning ) - spawnpoint.spawndata[spawnpoint.spawndata.size] = "Base weight: 0"; + if ( level.storespawndata || level.debugspawning ) + { + spawnpoint.spawndata[ spawnpoint.spawndata.size ] = "Base weight: 0"; #/ - } - - if ( isdefined( favoredspawnpoints ) ) - { - for ( i = 0; i < favoredspawnpoints.size; i++ ) - { - if ( isdefined( favoredspawnpoints[i].weight ) ) - { - favoredspawnpoints[i].weight += k_favored_spawn_point_bonus; - continue; - } - - favoredspawnpoints[i].weight = k_favored_spawn_point_bonus; - } - } - - avoidsamespawn( spawnpoints ); - avoidspawnreuse( spawnpoints, 1 ); - avoidweapondamage( spawnpoints ); - avoidvisibleenemies( spawnpoints, 1 ); - result = getspawnpoint_final( spawnpoints ); + } + } + i++; + } + while ( isDefined( favoredspawnpoints ) ) + { + i = 0; + while ( i < favoredspawnpoints.size ) + { + if ( isDefined( favoredspawnpoints[ i ].weight ) ) + { + favoredspawnpoints[ i ].weight += k_favored_spawn_point_bonus; + i++; + continue; + } + else + { + favoredspawnpoints[ i ].weight = k_favored_spawn_point_bonus; + } + i++; + } + } + avoidsamespawn( spawnpoints ); + avoidspawnreuse( spawnpoints, 1 ); + avoidweapondamage( spawnpoints ); + avoidvisibleenemies( spawnpoints, 1 ); + result = getspawnpoint_final( spawnpoints ); /# - if ( getdvar( "scr_spawn_showbad" ) == "" ) - setdvar( "scr_spawn_showbad", "0" ); - - if ( getdvar( "scr_spawn_showbad" ) == "1" ) - checkbad( result ); + if ( getDvar( "scr_spawn_showbad" ) == "" ) + { + setdvar( "scr_spawn_showbad", "0" ); + } + if ( getDvar( "scr_spawn_showbad" ) == "1" ) + { + checkbad( result ); #/ - return result; + } + return result; } getspawnpoint_dm( spawnpoints ) { - if ( !isdefined( spawnpoints ) ) - return undefined; - - spawnlogic_begin(); - initweights( spawnpoints ); - aliveplayers = getallotherplayers(); - idealdist = 1600; - baddist = 1200; - - if ( aliveplayers.size > 0 ) - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - totaldistfromideal = 0; - nearbybadamount = 0; - - for ( j = 0; j < aliveplayers.size; j++ ) - { - dist = distance( spawnpoints[i].origin, aliveplayers[j].origin ); - - if ( dist < baddist ) - nearbybadamount += ( baddist - dist ) / baddist; - - distfromideal = abs( dist - idealdist ); - totaldistfromideal += distfromideal; - } - - avgdistfromideal = totaldistfromideal / aliveplayers.size; - welldistancedamount = ( idealdist - avgdistfromideal ) / idealdist; - spawnpoints[i].weight = welldistancedamount - nearbybadamount * 2 + randomfloat( 0.2 ); - } - } - - avoidsamespawn( spawnpoints ); - avoidspawnreuse( spawnpoints, 0 ); - avoidweapondamage( spawnpoints ); - avoidvisibleenemies( spawnpoints, 0 ); - return getspawnpoint_final( spawnpoints ); + if ( !isDefined( spawnpoints ) ) + { + return undefined; + } + spawnlogic_begin(); + initweights( spawnpoints ); + aliveplayers = getallotherplayers(); + idealdist = 1600; + baddist = 1200; + while ( aliveplayers.size > 0 ) + { + i = 0; + while ( i < spawnpoints.size ) + { + totaldistfromideal = 0; + nearbybadamount = 0; + j = 0; + while ( j < aliveplayers.size ) + { + dist = distance( spawnpoints[ i ].origin, aliveplayers[ j ].origin ); + if ( dist < baddist ) + { + nearbybadamount += ( baddist - dist ) / baddist; + } + distfromideal = abs( dist - idealdist ); + totaldistfromideal += distfromideal; + j++; + } + avgdistfromideal = totaldistfromideal / aliveplayers.size; + welldistancedamount = ( idealdist - avgdistfromideal ) / idealdist; + spawnpoints[ i ].weight = ( welldistancedamount - ( nearbybadamount * 2 ) ) + randomfloat( 0,2 ); + i++; + } + } + avoidsamespawn( spawnpoints ); + avoidspawnreuse( spawnpoints, 0 ); + avoidweapondamage( spawnpoints ); + avoidvisibleenemies( spawnpoints, 0 ); + return getspawnpoint_final( spawnpoints ); } getspawnpoint_turned( spawnpoints, idealdist, baddist, idealdistteam, baddistteam ) { - if ( !isdefined( spawnpoints ) ) - return undefined; - - spawnlogic_begin(); - initweights( spawnpoints ); - aliveplayers = getallotherplayers(); - - if ( !isdefined( idealdist ) ) - idealdist = 1600; - - if ( !isdefined( idealdistteam ) ) - idealdistteam = 1200; - - if ( !isdefined( baddist ) ) - baddist = 1200; - - if ( !isdefined( baddistteam ) ) - baddistteam = 600; - - myteam = self.team; - - if ( aliveplayers.size > 0 ) - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - totaldistfromideal = 0; - nearbybadamount = 0; - - for ( j = 0; j < aliveplayers.size; j++ ) - { - dist = distance( spawnpoints[i].origin, aliveplayers[j].origin ); - distfromideal = 0; - - if ( aliveplayers[j].team == myteam ) - { - if ( dist < baddistteam ) - nearbybadamount += ( baddistteam - dist ) / baddistteam; - - distfromideal = abs( dist - idealdistteam ); - } - else - { - if ( dist < baddist ) - nearbybadamount += ( baddist - dist ) / baddist; - - distfromideal = abs( dist - idealdist ); - } - - totaldistfromideal += distfromideal; - } - - avgdistfromideal = totaldistfromideal / aliveplayers.size; - welldistancedamount = ( idealdist - avgdistfromideal ) / idealdist; - spawnpoints[i].weight = welldistancedamount - nearbybadamount * 2 + randomfloat( 0.2 ); - } - } - - avoidsamespawn( spawnpoints ); - avoidspawnreuse( spawnpoints, 0 ); - avoidweapondamage( spawnpoints ); - avoidvisibleenemies( spawnpoints, 0 ); - return getspawnpoint_final( spawnpoints ); + if ( !isDefined( spawnpoints ) ) + { + return undefined; + } + spawnlogic_begin(); + initweights( spawnpoints ); + aliveplayers = getallotherplayers(); + if ( !isDefined( idealdist ) ) + { + idealdist = 1600; + } + if ( !isDefined( idealdistteam ) ) + { + idealdistteam = 1200; + } + if ( !isDefined( baddist ) ) + { + baddist = 1200; + } + if ( !isDefined( baddistteam ) ) + { + baddistteam = 600; + } + myteam = self.team; + while ( aliveplayers.size > 0 ) + { + i = 0; + while ( i < spawnpoints.size ) + { + totaldistfromideal = 0; + nearbybadamount = 0; + j = 0; + while ( j < aliveplayers.size ) + { + dist = distance( spawnpoints[ i ].origin, aliveplayers[ j ].origin ); + distfromideal = 0; + if ( aliveplayers[ j ].team == myteam ) + { + if ( dist < baddistteam ) + { + nearbybadamount += ( baddistteam - dist ) / baddistteam; + } + distfromideal = abs( dist - idealdistteam ); + } + else + { + if ( dist < baddist ) + { + nearbybadamount += ( baddist - dist ) / baddist; + } + distfromideal = abs( dist - idealdist ); + } + totaldistfromideal += distfromideal; + j++; + } + avgdistfromideal = totaldistfromideal / aliveplayers.size; + welldistancedamount = ( idealdist - avgdistfromideal ) / idealdist; + spawnpoints[ i ].weight = ( welldistancedamount - ( nearbybadamount * 2 ) ) + randomfloat( 0,2 ); + i++; + } + } + avoidsamespawn( spawnpoints ); + avoidspawnreuse( spawnpoints, 0 ); + avoidweapondamage( spawnpoints ); + avoidvisibleenemies( spawnpoints, 0 ); + return getspawnpoint_final( spawnpoints ); } spawnlogic_begin() { /# - level.storespawndata = getdvarint( "scr_recordspawndata" ); - level.debugspawning = getdvarint( "scr_spawnpointdebug" ) > 0; + level.storespawndata = getDvarInt( "scr_recordspawndata" ); + level.debugspawning = getDvarInt( "scr_spawnpointdebug" ) > 0; #/ } init() { /# - if ( getdvar( "scr_recordspawndata" ) == "" ) - setdvar( "scr_recordspawndata", 0 ); - - level.storespawndata = getdvarint( "scr_recordspawndata" ); - - if ( getdvar( "scr_killbots" ) == "" ) - setdvar( "scr_killbots", 0 ); - - if ( getdvar( "scr_killbottimer" ) == "" ) - setdvar( "scr_killbottimer", 0.25 ); - - thread loopbotspawns(); + if ( getDvar( "scr_recordspawndata" ) == "" ) + { + setdvar( "scr_recordspawndata", 0 ); + } + level.storespawndata = getDvarInt( "scr_recordspawndata" ); + if ( getDvar( "scr_killbots" ) == "" ) + { + setdvar( "scr_killbots", 0 ); + } + if ( getDvar( "scr_killbottimer" ) == "" ) + { + setdvar( "scr_killbottimer", 0,25 ); + } + thread loopbotspawns(); #/ - level.spawnlogic_deaths = []; - level.spawnlogic_spawnkills = []; - level.players = []; - level.grenades = []; - level.pipebombs = []; - level.spawnmins = ( 0, 0, 0 ); - level.spawnmaxs = ( 0, 0, 0 ); - level.spawnminsmaxsprimed = 0; - - if ( isdefined( level.safespawns ) ) - { - for ( i = 0; i < level.safespawns.size; i++ ) - level.safespawns[i] spawnpointinit(); - } - - if ( getdvar( "scr_spawn_enemyavoiddist" ) == "" ) - setdvar( "scr_spawn_enemyavoiddist", "800" ); - - if ( getdvar( "scr_spawn_enemyavoidweight" ) == "" ) - setdvar( "scr_spawn_enemyavoidweight", "0" ); + level.spawnlogic_deaths = []; + level.spawnlogic_spawnkills = []; + level.players = []; + level.grenades = []; + level.pipebombs = []; + level.spawnmins = ( -1, -1, -1 ); + level.spawnmaxs = ( -1, -1, -1 ); + level.spawnminsmaxsprimed = 0; + while ( isDefined( level.safespawns ) ) + { + i = 0; + while ( i < level.safespawns.size ) + { + level.safespawns[ i ] spawnpointinit(); + i++; + } + } + if ( getDvar( "scr_spawn_enemyavoiddist" ) == "" ) + { + setdvar( "scr_spawn_enemyavoiddist", "800" ); + } + if ( getDvar( "scr_spawn_enemyavoidweight" ) == "" ) + { + setdvar( "scr_spawn_enemyavoidweight", "0" ); + } /# - if ( getdvar( "scr_spawnsimple" ) == "" ) - setdvar( "scr_spawnsimple", "0" ); - - if ( getdvar( "scr_spawnpointdebug" ) == "" ) - setdvar( "scr_spawnpointdebug", "0" ); - - if ( getdvarint( "scr_spawnpointdebug" ) > 0 ) - { - thread showdeathsdebug(); - thread updatedeathinfodebug(); - thread profiledebug(); - } - - if ( level.storespawndata ) - thread allowspawndatareading(); - - if ( getdvar( "scr_spawnprofile" ) == "" ) - setdvar( "scr_spawnprofile", "0" ); - - thread watchspawnprofile(); - thread spawngraphcheck(); + if ( getDvar( "scr_spawnsimple" ) == "" ) + { + setdvar( "scr_spawnsimple", "0" ); + } + if ( getDvar( "scr_spawnpointdebug" ) == "" ) + { + setdvar( "scr_spawnpointdebug", "0" ); + } + if ( getDvarInt( "scr_spawnpointdebug" ) > 0 ) + { + thread showdeathsdebug(); + thread updatedeathinfodebug(); + thread profiledebug(); + } + if ( level.storespawndata ) + { + thread allowspawndatareading(); + } + if ( getDvar( "scr_spawnprofile" ) == "" ) + { + setdvar( "scr_spawnprofile", "0" ); + } + thread watchspawnprofile(); + thread spawngraphcheck(); #/ } watchspawnprofile() { /# - while ( true ) - { - while ( true ) - { - if ( getdvarint( "scr_spawnprofile" ) > 0 ) - break; - - wait 0.05; - } - - thread spawnprofile(); - - while ( true ) - { - if ( getdvarint( "scr_spawnprofile" ) <= 0 ) - break; - - wait 0.05; - } - - level notify( "stop_spawn_profile" ); - } + while ( 1 ) + { + while ( 1 ) + { + if ( getDvarInt( "scr_spawnprofile" ) > 0 ) + { + break; + } + else + { + wait 0,05; + } + } + thread spawnprofile(); + while ( 1 ) + { + if ( getDvarInt( "scr_spawnprofile" ) <= 0 ) + { + break; + } + else + { + wait 0,05; + } + } + level notify( "stop_spawn_profile" ); #/ + } } spawnprofile() { /# - level endon( "stop_spawn_profile" ); - - while ( true ) - { - if ( level.players.size > 0 && level.spawnpoints.size > 0 ) - { - playernum = randomint( level.players.size ); - player = level.players[playernum]; - attempt = 1; - - while ( !isdefined( player ) && attempt < level.players.size ) - { - playernum = ( playernum + 1 ) % level.players.size; - attempt++; - player = level.players[playernum]; - } - - player getspawnpoint_nearteam( level.spawnpoints ); - } - - wait 0.05; - } + level endon( "stop_spawn_profile" ); + while ( 1 ) + { + if ( level.players.size > 0 && level.spawnpoints.size > 0 ) + { + playernum = randomint( level.players.size ); + player = level.players[ playernum ]; + attempt = 1; + while ( !isDefined( player ) && attempt < level.players.size ) + { + playernum = ( playernum + 1 ) % level.players.size; + attempt++; + player = level.players[ playernum ]; + } + player getspawnpoint_nearteam( level.spawnpoints ); + } + wait 0,05; #/ + } } spawngraphcheck() { /# - while ( true ) - { - if ( getdvarint( _hash_C25B6B47 ) < 1 ) - { - wait 3; - continue; - } - - thread spawngraph(); - return; - } + while ( 1 ) + { + while ( getDvarInt( #"C25B6B47" ) < 1 ) + { + wait 3; + } + thread spawngraph(); + return; #/ + } } spawngraph() { /# - w = 20; - h = 20; - weightscale = 0.1; - fakespawnpoints = []; - corners = getentarray( "minimap_corner", "targetname" ); - - if ( corners.size != 2 ) - { - println( "^1 can't spawn graph: no minimap corners" ); - return; - } - - min = corners[0].origin; - max = corners[0].origin; - - if ( corners[1].origin[0] > max[0] ) - max = ( corners[1].origin[0], max[1], max[2] ); - else - min = ( corners[1].origin[0], min[1], min[2] ); - - if ( corners[1].origin[1] > max[1] ) - max = ( max[0], corners[1].origin[1], max[2] ); - else - min = ( min[0], corners[1].origin[1], min[2] ); - - i = 0; - - for ( y = 0; y < h; y++ ) - { - yamnt = y / ( h - 1 ); - - for ( x = 0; x < w; x++ ) - { - xamnt = x / ( w - 1 ); - fakespawnpoints[i] = spawnstruct(); - fakespawnpoints[i].origin = ( min[0] * xamnt + max[0] * ( 1 - xamnt ), min[1] * yamnt + max[1] * ( 1 - yamnt ), min[2] ); - fakespawnpoints[i].angles = ( 0, 0, 0 ); - fakespawnpoints[i].forward = anglestoforward( fakespawnpoints[i].angles ); - fakespawnpoints[i].sighttracepoint = fakespawnpoints[i].origin; - i++; - } - } - - didweights = 0; - - while ( true ) - { - spawni = 0; - numiters = 5; - - for ( i = 0; i < numiters; i++ ) - { - if ( !level.players.size || !isdefined( level.players[0].team ) || level.players[0].team == "spectator" || !isdefined( level.players[0].class ) ) - break; - - endspawni = spawni + fakespawnpoints.size / numiters; - - if ( i == numiters - 1 ) - endspawni = fakespawnpoints.size; - - while ( spawni < endspawni ) - { - spawnpointupdate( fakespawnpoints[spawni] ); - spawni++; - } - - if ( didweights ) - level.players[0] drawspawngraph( fakespawnpoints, w, h, weightscale ); - - wait 0.05; - } - - if ( !level.players.size || !isdefined( level.players[0].team ) || level.players[0].team == "spectator" || !isdefined( level.players[0].class ) ) - { - wait 1; - continue; - } - - level.players[0] getspawnpoint_nearteam( fakespawnpoints ); - - for ( i = 0; i < fakespawnpoints.size; i++ ) - setupspawngraphpoint( fakespawnpoints[i], weightscale ); - - didweights = 1; - level.players[0] drawspawngraph( fakespawnpoints, w, h, weightscale ); - wait 0.05; - } + w = 20; + h = 20; + weightscale = 0,1; + fakespawnpoints = []; + corners = getentarray( "minimap_corner", "targetname" ); + if ( corners.size != 2 ) + { + println( "^1 can't spawn graph: no minimap corners" ); + return; + } + min = corners[ 0 ].origin; + max = corners[ 0 ].origin; + if ( corners[ 1 ].origin[ 0 ] > max[ 0 ] ) + { + max = ( corners[ 1 ].origin[ 0 ], max[ 1 ], max[ 2 ] ); + } + else + { + min = ( corners[ 1 ].origin[ 0 ], min[ 1 ], min[ 2 ] ); + } + if ( corners[ 1 ].origin[ 1 ] > max[ 1 ] ) + { + max = ( max[ 0 ], corners[ 1 ].origin[ 1 ], max[ 2 ] ); + } + else + { + min = ( min[ 0 ], corners[ 1 ].origin[ 1 ], min[ 2 ] ); + } + i = 0; + y = 0; + while ( y < h ) + { + yamnt = y / ( h - 1 ); + x = 0; + while ( x < w ) + { + xamnt = x / ( w - 1 ); + fakespawnpoints[ i ] = spawnstruct(); + fakespawnpoints[ i ].origin = ( ( min[ 0 ] * xamnt ) + ( max[ 0 ] * ( 1 - xamnt ) ), ( min[ 1 ] * yamnt ) + ( max[ 1 ] * ( 1 - yamnt ) ), min[ 2 ] ); + fakespawnpoints[ i ].angles = ( -1, -1, -1 ); + fakespawnpoints[ i ].forward = anglesToForward( fakespawnpoints[ i ].angles ); + fakespawnpoints[ i ].sighttracepoint = fakespawnpoints[ i ].origin; + i++; + x++; + } + y++; + } + didweights = 0; + while ( 1 ) + { + spawni = 0; + numiters = 5; + i = 0; + while ( i < numiters ) + { + if ( level.players.size && isDefined( level.players[ 0 ].team ) || level.players[ 0 ].team == "spectator" && !isDefined( level.players[ 0 ].class ) ) + { + break; + } + else + { + endspawni = spawni + ( fakespawnpoints.size / numiters ); + if ( i == ( numiters - 1 ) ) + { + endspawni = fakespawnpoints.size; + } + while ( spawni < endspawni ) + { + spawnpointupdate( fakespawnpoints[ spawni ] ); + spawni++; + } + if ( didweights ) + { + level.players[ 0 ] drawspawngraph( fakespawnpoints, w, h, weightscale ); + } + wait 0,05; + i++; + } + } + while ( level.players.size && isDefined( level.players[ 0 ].team ) || level.players[ 0 ].team == "spectator" && !isDefined( level.players[ 0 ].class ) ) + { + wait 1; + } + level.players[ 0 ] getspawnpoint_nearteam( fakespawnpoints ); + i = 0; + while ( i < fakespawnpoints.size ) + { + setupspawngraphpoint( fakespawnpoints[ i ], weightscale ); + i++; + } + didweights = 1; + level.players[ 0 ] drawspawngraph( fakespawnpoints, w, h, weightscale ); + wait 0,05; #/ + } } drawspawngraph( fakespawnpoints, w, h, weightscale ) { /# - i = 0; - - for ( y = 0; y < h; y++ ) - { - yamnt = y / ( h - 1 ); - - for ( x = 0; x < w; x++ ) - { - xamnt = x / ( w - 1 ); - - if ( y > 0 ) - spawngraphline( fakespawnpoints[i], fakespawnpoints[i - w], weightscale ); - - if ( x > 0 ) - spawngraphline( fakespawnpoints[i], fakespawnpoints[i - 1], weightscale ); - - i++; - } - } + i = 0; + y = 0; + while ( y < h ) + { + yamnt = y / ( h - 1 ); + x = 0; + while ( x < w ) + { + xamnt = x / ( w - 1 ); + if ( y > 0 ) + { + spawngraphline( fakespawnpoints[ i ], fakespawnpoints[ i - w ], weightscale ); + } + if ( x > 0 ) + { + spawngraphline( fakespawnpoints[ i ], fakespawnpoints[ i - 1 ], weightscale ); + } + i++; + x++; + } + y++; #/ + } } setupspawngraphpoint( s1, weightscale ) { /# - s1.visible = 1; - - if ( s1.weight < -1000 / weightscale ) - s1.visible = 0; + s1.visible = 1; + if ( s1.weight < ( -1000 / weightscale ) ) + { + s1.visible = 0; #/ + } } spawngraphline( s1, s2, weightscale ) { /# - if ( !s1.visible || !s2.visible ) - return; - - p1 = s1.origin + ( 0, 0, s1.weight * weightscale + 100 ); - p2 = s2.origin + ( 0, 0, s2.weight * weightscale + 100 ); - line( p1, p2, ( 1, 1, 1 ) ); + if ( !s1.visible || !s2.visible ) + { + return; + } + p1 = s1.origin + ( 0, 0, ( s1.weight * weightscale ) + 100 ); + p2 = s2.origin + ( 0, 0, ( s2.weight * weightscale ) + 100 ); + line( p1, p2, ( -1, -1, -1 ) ); #/ } loopbotspawns() { /# - while ( true ) - { - if ( getdvarint( "scr_killbots" ) < 1 ) - { - wait 3; - continue; - } - - if ( !isdefined( level.players ) ) - { - wait 0.05; - continue; - } - - bots = []; - - for ( i = 0; i < level.players.size; i++ ) - { - if ( !isdefined( level.players[i] ) ) - continue; - - if ( level.players[i].sessionstate == "playing" && issubstr( level.players[i].name, "bot" ) ) - bots[bots.size] = level.players[i]; - } - - if ( bots.size > 0 ) - { - if ( getdvarint( "scr_killbots" ) == 1 ) - { - killer = bots[randomint( bots.size )]; - victim = bots[randomint( bots.size )]; - victim thread [[ level.callbackplayerdamage ]]( killer, killer, 1000, 0, "MOD_RIFLE_BULLET", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0, 0 ); - } - else - { - numkills = getdvarint( "scr_killbots" ); - lastvictim = undefined; - - for ( index = 0; index < numkills; index++ ) - { - killer = bots[randomint( bots.size )]; - - for ( victim = bots[randomint( bots.size )]; isdefined( lastvictim ) && victim == lastvictim; victim = bots[randomint( bots.size )] ) - { - - } - - victim thread [[ level.callbackplayerdamage ]]( killer, killer, 1000, 0, "MOD_RIFLE_BULLET", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0, 0 ); - lastvictim = victim; - } - } - } - - if ( getdvar( "scr_killbottimer" ) != "" ) - wait( getdvarfloat( "scr_killbottimer" ) ); - else - wait 0.05; - } + while ( 1 ) + { + while ( getDvarInt( "scr_killbots" ) < 1 ) + { + wait 3; + } + while ( !isDefined( level.players ) ) + { + wait 0,05; + } + bots = []; + i = 0; + while ( i < level.players.size ) + { + if ( !isDefined( level.players[ i ] ) ) + { + i++; + continue; + } + else + { + if ( level.players[ i ].sessionstate == "playing" && issubstr( level.players[ i ].name, "bot" ) ) + { + bots[ bots.size ] = level.players[ i ]; + } + } + i++; + } + while ( bots.size > 0 ) + { + if ( getDvarInt( "scr_killbots" ) == 1 ) + { + killer = bots[ randomint( bots.size ) ]; + victim = bots[ randomint( bots.size ) ]; + victim thread [[ level.callbackplayerdamage ]]( killer, killer, 1000, 0, "MOD_RIFLE_BULLET", "none", ( -1, -1, -1 ), ( -1, -1, -1 ), "none", 0, 0 ); + break; + } + else + { + numkills = getDvarInt( "scr_killbots" ); + lastvictim = undefined; + index = 0; + while ( index < numkills ) + { + killer = bots[ randomint( bots.size ) ]; + victim = bots[ randomint( bots.size ) ]; + while ( isDefined( lastvictim ) && victim == lastvictim ) + { + victim = bots[ randomint( bots.size ) ]; + } + victim thread [[ level.callbackplayerdamage ]]( killer, killer, 1000, 0, "MOD_RIFLE_BULLET", "none", ( -1, -1, -1 ), ( -1, -1, -1 ), "none", 0, 0 ); + lastvictim = victim; + index++; + } + } + } + if ( getDvar( "scr_killbottimer" ) != "" ) + { + wait getDvarFloat( "scr_killbottimer" ); + continue; + } + else + { + wait 0,05; + } #/ + } } allowspawndatareading() { /# - setdvar( "scr_showspawnid", "" ); - prevval = getdvar( "scr_showspawnid" ); - prevrelval = getdvar( "scr_spawnidcycle" ); - readthistime = 0; - - while ( true ) - { - val = getdvar( "scr_showspawnid" ); - relval = undefined; - - if ( !isdefined( val ) || val == prevval ) - { - relval = getdvar( "scr_spawnidcycle" ); - - if ( isdefined( relval ) && relval != "" ) - setdvar( "scr_spawnidcycle", "" ); - else - { - wait 0.5; - continue; - } - } - - prevval = val; - readthistime = 0; - readspawndata( val, relval ); - - if ( !isdefined( level.curspawndata ) ) - println( "No spawn data to draw." ); - else - println( "Drawing spawn ID " + level.curspawndata.id ); - - thread drawspawndata(); - } + setdvar( "scr_showspawnid", "" ); + prevval = getDvar( "scr_showspawnid" ); + prevrelval = getDvar( "scr_spawnidcycle" ); + readthistime = 0; + while ( 1 ) + { + val = getDvar( "scr_showspawnid" ); + relval = undefined; + while ( !isDefined( val ) || val == prevval ) + { + relval = getDvar( "scr_spawnidcycle" ); + if ( isDefined( relval ) && relval != "" ) + { + setdvar( "scr_spawnidcycle", "" ); + break; + } + else + { + wait 0,5; + } + } + prevval = val; + readthistime = 0; + readspawndata( val, relval ); + if ( !isDefined( level.curspawndata ) ) + { + println( "No spawn data to draw." ); + } + else + { + println( "Drawing spawn ID " + level.curspawndata.id ); + } + thread drawspawndata(); #/ + } } showdeathsdebug() { /# - while ( true ) - { - if ( getdvar( "scr_spawnpointdebug" ) == "0" ) - { - wait 3; - continue; - } - - time = gettime(); - - for ( i = 0; i < level.spawnlogic_deaths.size; i++ ) - { - if ( isdefined( level.spawnlogic_deaths[i].los ) ) - line( level.spawnlogic_deaths[i].org, level.spawnlogic_deaths[i].killorg, ( 1, 0, 0 ) ); - else - line( level.spawnlogic_deaths[i].org, level.spawnlogic_deaths[i].killorg, ( 1, 1, 1 ) ); - - killer = level.spawnlogic_deaths[i].killer; - - if ( isdefined( killer ) && isalive( killer ) ) - line( level.spawnlogic_deaths[i].killorg, killer.origin, ( 0.4, 0.4, 0.8 ) ); - } - - for ( p = 0; p < level.players.size; p++ ) - { - if ( !isdefined( level.players[p] ) ) - continue; - - if ( isdefined( level.players[p].spawnlogic_killdist ) ) - print3d( level.players[p].origin + vectorscale( ( 0, 0, 1 ), 64.0 ), level.players[p].spawnlogic_killdist, ( 1, 1, 1 ) ); - } - - oldspawnkills = level.spawnlogic_spawnkills; - level.spawnlogic_spawnkills = []; - - for ( i = 0; i < oldspawnkills.size; i++ ) - { - spawnkill = oldspawnkills[i]; - - if ( spawnkill.dierwasspawner ) - { - line( spawnkill.spawnpointorigin, spawnkill.dierorigin, ( 0.4, 0.5, 0.4 ) ); - line( spawnkill.dierorigin, spawnkill.killerorigin, ( 0, 1, 1 ) ); - print3d( spawnkill.dierorigin + vectorscale( ( 0, 0, 1 ), 32.0 ), "SPAWNKILLED!", ( 0, 1, 1 ) ); - } - else - { - line( spawnkill.spawnpointorigin, spawnkill.killerorigin, ( 0.4, 0.5, 0.4 ) ); - line( spawnkill.killerorigin, spawnkill.dierorigin, ( 0, 1, 1 ) ); - print3d( spawnkill.dierorigin + vectorscale( ( 0, 0, 1 ), 32.0 ), "SPAWNDIED!", ( 0, 1, 1 ) ); - } - - if ( time - spawnkill.time < 60000 ) - level.spawnlogic_spawnkills[level.spawnlogic_spawnkills.size] = oldspawnkills[i]; - } - - wait 0.05; - } + while ( 1 ) + { + while ( getDvar( "scr_spawnpointdebug" ) == "0" ) + { + wait 3; + } + time = getTime(); + i = 0; + while ( i < level.spawnlogic_deaths.size ) + { + if ( isDefined( level.spawnlogic_deaths[ i ].los ) ) + { + line( level.spawnlogic_deaths[ i ].org, level.spawnlogic_deaths[ i ].killorg, ( -1, -1, -1 ) ); + } + else + { + line( level.spawnlogic_deaths[ i ].org, level.spawnlogic_deaths[ i ].killorg, ( -1, -1, -1 ) ); + } + killer = level.spawnlogic_deaths[ i ].killer; + if ( isDefined( killer ) && isalive( killer ) ) + { + line( level.spawnlogic_deaths[ i ].killorg, killer.origin, ( 0,4, 0,4, 0,8 ) ); + } + i++; + } + p = 0; + while ( p < level.players.size ) + { + if ( !isDefined( level.players[ p ] ) ) + { + p++; + continue; + } + else + { + if ( isDefined( level.players[ p ].spawnlogic_killdist ) ) + { + print3d( level.players[ p ].origin + vectorScale( ( -1, -1, -1 ), 64 ), level.players[ p ].spawnlogic_killdist, ( -1, -1, -1 ) ); + } + } + p++; + } + oldspawnkills = level.spawnlogic_spawnkills; + level.spawnlogic_spawnkills = []; + i = 0; + while ( i < oldspawnkills.size ) + { + spawnkill = oldspawnkills[ i ]; + if ( spawnkill.dierwasspawner ) + { + line( spawnkill.spawnpointorigin, spawnkill.dierorigin, ( 0,4, 0,5, 0,4 ) ); + line( spawnkill.dierorigin, spawnkill.killerorigin, ( 0, 1, 1 ) ); + print3d( spawnkill.dierorigin + vectorScale( ( -1, -1, -1 ), 32 ), "SPAWNKILLED!", ( 0, 1, 1 ) ); + } + else + { + line( spawnkill.spawnpointorigin, spawnkill.killerorigin, ( 0,4, 0,5, 0,4 ) ); + line( spawnkill.killerorigin, spawnkill.dierorigin, ( 0, 1, 1 ) ); + print3d( spawnkill.dierorigin + vectorScale( ( -1, -1, -1 ), 32 ), "SPAWNDIED!", ( 0, 1, 1 ) ); + } + if ( ( time - spawnkill.time ) < 60000 ) + { + level.spawnlogic_spawnkills[ level.spawnlogic_spawnkills.size ] = oldspawnkills[ i ]; + } + i++; + } + wait 0,05; #/ + } } updatedeathinfodebug() { - while ( true ) - { - if ( getdvar( "scr_spawnpointdebug" ) == "0" ) - { - wait 3; - continue; - } - - updatedeathinfo(); - wait 3; - } + while ( 1 ) + { + while ( getDvar( "scr_spawnpointdebug" ) == "0" ) + { + wait 3; + } + updatedeathinfo(); + wait 3; + } } spawnweightdebug( spawnpoints ) { - level notify( "stop_spawn_weight_debug" ); - level endon( "stop_spawn_weight_debug" ); + level notify( "stop_spawn_weight_debug" ); + level endon( "stop_spawn_weight_debug" ); /# - while ( true ) - { - if ( getdvar( "scr_spawnpointdebug" ) == "0" ) - { - wait 3; - continue; - } - - textoffset = vectorscale( ( 0, 0, -1 ), 12.0 ); - - for ( i = 0; i < spawnpoints.size; i++ ) - { - amnt = 1 * ( 1 - spawnpoints[i].weight / -100000 ); - - if ( amnt < 0 ) - amnt = 0; - - if ( amnt > 1 ) - amnt = 1; - - orig = spawnpoints[i].origin + vectorscale( ( 0, 0, 1 ), 80.0 ); - print3d( orig, int( spawnpoints[i].weight ), ( 1, amnt, 0.5 ) ); - orig += textoffset; - - if ( isdefined( spawnpoints[i].spawndata ) ) - { - for ( j = 0; j < spawnpoints[i].spawndata.size; j++ ) - { - print3d( orig, spawnpoints[i].spawndata[j], vectorscale( ( 1, 1, 1 ), 0.5 ) ); - orig += textoffset; - } - } - - if ( isdefined( spawnpoints[i].sightchecks ) ) - { - for ( j = 0; j < spawnpoints[i].sightchecks.size; j++ ) - { - if ( spawnpoints[i].sightchecks[j].penalty == 0 ) - continue; - - print3d( orig, "Sight to enemy: -" + spawnpoints[i].sightchecks[j].penalty, vectorscale( ( 1, 1, 1 ), 0.5 ) ); - orig += textoffset; - } - } - } - - wait 0.05; - } + while ( 1 ) + { + while ( getDvar( "scr_spawnpointdebug" ) == "0" ) + { + wait 3; + } + textoffset = vectorScale( ( -1, -1, -1 ), 12 ); + i = 0; + while ( i < spawnpoints.size ) + { + amnt = 1 * ( 1 - ( spawnpoints[ i ].weight / -100000 ) ); + if ( amnt < 0 ) + { + amnt = 0; + } + if ( amnt > 1 ) + { + amnt = 1; + } + orig = spawnpoints[ i ].origin + vectorScale( ( -1, -1, -1 ), 80 ); + print3d( orig, int( spawnpoints[ i ].weight ), ( 1, amnt, 0,5 ) ); + orig += textoffset; + while ( isDefined( spawnpoints[ i ].spawndata ) ) + { + j = 0; + while ( j < spawnpoints[ i ].spawndata.size ) + { + print3d( orig, spawnpoints[ i ].spawndata[ j ], vectorScale( ( -1, -1, -1 ), 0,5 ) ); + orig += textoffset; + j++; + } + } + while ( isDefined( spawnpoints[ i ].sightchecks ) ) + { + j = 0; + while ( j < spawnpoints[ i ].sightchecks.size ) + { + if ( spawnpoints[ i ].sightchecks[ j ].penalty == 0 ) + { + j++; + continue; + } + else + { + print3d( orig, "Sight to enemy: -" + spawnpoints[ i ].sightchecks[ j ].penalty, vectorScale( ( -1, -1, -1 ), 0,5 ) ); + orig += textoffset; + } + j++; + } + } + i++; + } + wait 0,05; #/ + } } profiledebug() { - while ( true ) - { - if ( getdvar( _hash_6A99E750 ) != "1" ) - { - wait 3; - continue; - } - - for ( i = 0; i < level.spawnpoints.size; i++ ) - level.spawnpoints[i].weight = randomint( 10000 ); - - if ( level.players.size > 0 ) - level.players[randomint( level.players.size )] getspawnpoint_nearteam( level.spawnpoints ); - - wait 0.05; - } + while ( 1 ) + { + while ( getDvar( #"6A99E750" ) != "1" ) + { + wait 3; + } + i = 0; + while ( i < level.spawnpoints.size ) + { + level.spawnpoints[ i ].weight = randomint( 10000 ); + i++; + } + if ( level.players.size > 0 ) + { + level.players[ randomint( level.players.size ) ] getspawnpoint_nearteam( level.spawnpoints ); + } + wait 0,05; + } } debugnearbyplayers( players, origin ) { /# - if ( getdvar( "scr_spawnpointdebug" ) == "0" ) - return; - - starttime = gettime(); - - while ( true ) - { - for ( i = 0; i < players.size; i++ ) - line( players[i].origin, origin, ( 0.5, 1, 0.5 ) ); - - if ( gettime() - starttime > 5000 ) - return; - - wait 0.05; - } + if ( getDvar( "scr_spawnpointdebug" ) == "0" ) + { + return; + } + starttime = getTime(); + while ( 1 ) + { + i = 0; + while ( i < players.size ) + { + line( players[ i ].origin, origin, ( 0,5, 1, 0,5 ) ); + i++; + } + if ( ( getTime() - starttime ) > 5000 ) + { + return; + } + wait 0,05; #/ + } } deathoccured( dier, killer ) { - } checkforsimilardeaths( deathinfo ) { - for ( i = 0; i < level.spawnlogic_deaths.size; i++ ) - { - if ( level.spawnlogic_deaths[i].killer == deathinfo.killer ) - { - dist = distance( level.spawnlogic_deaths[i].org, deathinfo.org ); - - if ( dist > 200 ) - continue; - - dist = distance( level.spawnlogic_deaths[i].killorg, deathinfo.killorg ); - - if ( dist > 200 ) - continue; - - level.spawnlogic_deaths[i].remove = 1; - } - } + i = 0; + while ( i < level.spawnlogic_deaths.size ) + { + if ( level.spawnlogic_deaths[ i ].killer == deathinfo.killer ) + { + dist = distance( level.spawnlogic_deaths[ i ].org, deathinfo.org ); + if ( dist > 200 ) + { + i++; + continue; + } + else dist = distance( level.spawnlogic_deaths[ i ].killorg, deathinfo.killorg ); + if ( dist > 200 ) + { + i++; + continue; + } + else + { + level.spawnlogic_deaths[ i ].remove = 1; + } + } + i++; + } } updatedeathinfo() { - time = gettime(); - - for ( i = 0; i < level.spawnlogic_deaths.size; i++ ) - { - deathinfo = level.spawnlogic_deaths[i]; - - if ( time - deathinfo.time > 90000 || !isdefined( deathinfo.killer ) || !isalive( deathinfo.killer ) || !isdefined( level.teams[deathinfo.killer.team] ) || distance( deathinfo.killer.origin, deathinfo.killorg ) > 400 ) - level.spawnlogic_deaths[i].remove = 1; - } - - oldarray = level.spawnlogic_deaths; - level.spawnlogic_deaths = []; - start = 0; - - if ( oldarray.size - 1024 > 0 ) - start = oldarray.size - 1024; - - for ( i = start; i < oldarray.size; i++ ) - { - if ( !isdefined( oldarray[i].remove ) ) - level.spawnlogic_deaths[level.spawnlogic_deaths.size] = oldarray[i]; - } + time = getTime(); + i = 0; + while ( i < level.spawnlogic_deaths.size ) + { + deathinfo = level.spawnlogic_deaths[ i ]; + if ( ( time - deathinfo.time ) > 90000 && isDefined( deathinfo.killer ) && isalive( deathinfo.killer ) || !isDefined( level.teams[ deathinfo.killer.team ] ) && distance( deathinfo.killer.origin, deathinfo.killorg ) > 400 ) + { + level.spawnlogic_deaths[ i ].remove = 1; + } + i++; + } + oldarray = level.spawnlogic_deaths; + level.spawnlogic_deaths = []; + start = 0; + if ( ( oldarray.size - 1024 ) > 0 ) + { + start = oldarray.size - 1024; + } + i = start; + while ( i < oldarray.size ) + { + if ( !isDefined( oldarray[ i ].remove ) ) + { + level.spawnlogic_deaths[ level.spawnlogic_deaths.size ] = oldarray[ i ]; + } + i++; + } } ispointvulnerable( playerorigin ) { - pos = self.origin + level.bettymodelcenteroffset; - playerpos = playerorigin + vectorscale( ( 0, 0, 1 ), 32.0 ); - distsqrd = distancesquared( pos, playerpos ); - forward = anglestoforward( self.angles ); - - if ( distsqrd < level.bettydetectionradius * level.bettydetectionradius ) - { - playerdir = vectornormalize( playerpos - pos ); - angle = acos( vectordot( playerdir, forward ) ); - - if ( angle < level.bettydetectionconeangle ) - return true; - } - - return false; + pos = self.origin + level.bettymodelcenteroffset; + playerpos = playerorigin + vectorScale( ( -1, -1, -1 ), 32 ); + distsqrd = distancesquared( pos, playerpos ); + forward = anglesToForward( self.angles ); + if ( distsqrd < ( level.bettydetectionradius * level.bettydetectionradius ) ) + { + playerdir = vectornormalize( playerpos - pos ); + angle = acos( vectordot( playerdir, forward ) ); + if ( angle < level.bettydetectionconeangle ) + { + return 1; + } + } + return 0; } avoidweapondamage( spawnpoints ) { - if ( getdvar( _hash_FB71FB7 ) == "0" ) - return; - - weapondamagepenalty = 100000; - - if ( getdvar( _hash_76B8F046 ) != "" && getdvar( _hash_76B8F046 ) != "0" ) - weapondamagepenalty = getdvarfloat( _hash_76B8F046 ); - - mingrenadedistsquared = 62500; - - for ( i = 0; i < spawnpoints.size; i++ ) - { - for ( j = 0; j < level.grenades.size; j++ ) - { - if ( !isdefined( level.grenades[j] ) ) - continue; - - if ( distancesquared( spawnpoints[i].origin, level.grenades[j].origin ) < mingrenadedistsquared ) - { - spawnpoints[i].weight -= weapondamagepenalty; + if ( getDvar( #"0FB71FB7" ) == "0" ) + { + return; + } + weapondamagepenalty = 100000; + if ( getDvar( #"76B8F046" ) != "" && getDvar( #"76B8F046" ) != "0" ) + { + weapondamagepenalty = getDvarFloat( #"76B8F046" ); + } + mingrenadedistsquared = 62500; + i = 0; + while ( i < spawnpoints.size ) + { + j = 0; + while ( j < level.grenades.size ) + { + if ( !isDefined( level.grenades[ j ] ) ) + { + j++; + continue; + } + else + { + if ( distancesquared( spawnpoints[ i ].origin, level.grenades[ j ].origin ) < mingrenadedistsquared ) + { + spawnpoints[ i ].weight -= weapondamagepenalty; /# - if ( level.storespawndata || level.debugspawning ) - spawnpoints[i].spawndata[spawnpoints[i].spawndata.size] = "Was near grenade: -" + int( weapondamagepenalty ); + if ( level.storespawndata || level.debugspawning ) + { + spawnpoints[ i ].spawndata[ spawnpoints[ i ].spawndata.size ] = "Was near grenade: -" + int( weapondamagepenalty ); #/ - } - } - } + } + } + } + j++; + } + i++; + } } spawnperframeupdate() { - spawnpointindex = 0; - - while ( true ) - { - wait 0.05; - - if ( !isdefined( level.spawnpoints ) ) - return; - - spawnpointindex = ( spawnpointindex + 1 ) % level.spawnpoints.size; - spawnpoint = level.spawnpoints[spawnpointindex]; - spawnpointupdate( spawnpoint ); - } + spawnpointindex = 0; + while ( 1 ) + { + wait 0,05; + if ( !isDefined( level.spawnpoints ) ) + { + return; + } + spawnpointindex = ( spawnpointindex + 1 ) % level.spawnpoints.size; + spawnpoint = level.spawnpoints[ spawnpointindex ]; + spawnpointupdate( spawnpoint ); + } } getnonteamsum( skip_team, sums ) { - value = 0; - - foreach ( team in level.teams ) - { - if ( team == skip_team ) - continue; - - value += sums[team]; - } - - return value; + value = 0; + _a1986 = level.teams; + _k1986 = getFirstArrayKey( _a1986 ); + while ( isDefined( _k1986 ) ) + { + team = _a1986[ _k1986 ]; + if ( team == skip_team ) + { + } + else + { + value += sums[ team ]; + } + _k1986 = getNextArrayKey( _a1986, _k1986 ); + } + return value; } getnonteammindist( skip_team, mindists ) { - dist = 9999999; - - foreach ( team in level.teams ) - { - if ( team == skip_team ) - continue; - - if ( dist > mindists[team] ) - dist = mindists[team]; - } - - return dist; + dist = 9999999; + _a2000 = level.teams; + _k2000 = getFirstArrayKey( _a2000 ); + while ( isDefined( _k2000 ) ) + { + team = _a2000[ _k2000 ]; + if ( team == skip_team ) + { + } + else + { + if ( dist > mindists[ team ] ) + { + dist = mindists[ team ]; + } + } + _k2000 = getNextArrayKey( _a2000, _k2000 ); + } + return dist; } spawnpointupdate( spawnpoint ) { - if ( level.teambased ) - { - sights = []; - - foreach ( team in level.teams ) - { - spawnpoint.enemysights[team] = 0; - sights[team] = 0; - spawnpoint.nearbyplayers[team] = []; - } - } - else - { - spawnpoint.enemysights = 0; - spawnpoint.nearbyplayers["all"] = []; - } - - spawnpointdir = spawnpoint.forward; - debug = 0; + if ( level.teambased ) + { + sights = []; + _a2018 = level.teams; + _k2018 = getFirstArrayKey( _a2018 ); + while ( isDefined( _k2018 ) ) + { + team = _a2018[ _k2018 ]; + spawnpoint.enemysights[ team ] = 0; + sights[ team ] = 0; + spawnpoint.nearbyplayers[ team ] = []; + _k2018 = getNextArrayKey( _a2018, _k2018 ); + } + } + else spawnpoint.enemysights = 0; + spawnpoint.nearbyplayers[ "all" ] = []; + spawnpointdir = spawnpoint.forward; + debug = 0; /# - debug = getdvarint( "scr_spawnpointdebug" ) > 0; + debug = getDvarInt( "scr_spawnpointdebug" ) > 0; #/ - mindist = []; - distsum = []; - - if ( !level.teambased ) - mindist["all"] = 9999999; - - foreach ( team in level.teams ) - { - spawnpoint.distsum[team] = 0; - spawnpoint.enemydistsum[team] = 0; - spawnpoint.minenemydist[team] = 9999999; - mindist[team] = 9999999; - } - - spawnpoint.numplayersatlastupdate = 0; - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( player.sessionstate != "playing" ) - continue; - - diff = player.origin - spawnpoint.origin; - diff = ( diff[0], diff[1], 0 ); - dist = length( diff ); - team = "all"; - - if ( level.teambased ) - team = player.team; - - if ( dist < 1024 ) - spawnpoint.nearbyplayers[team][spawnpoint.nearbyplayers[team].size] = player; - - if ( dist < mindist[team] ) - mindist[team] = dist; - - distsum[team] += dist; - spawnpoint.numplayersatlastupdate++; - pdir = anglestoforward( player.angles ); - - if ( vectordot( spawnpointdir, diff ) < 0 && vectordot( pdir, diff ) > 0 ) - continue; - - losexists = bullettracepassed( player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, 0, undefined ); - spawnpoint.lastsighttracetime = gettime(); - - if ( losexists ) - { - if ( level.teambased ) - sights[player.team]++; - else - spawnpoint.enemysights++; + mindist = []; + distsum = []; + if ( !level.teambased ) + { + mindist[ "all" ] = 9999999; + } + _a2047 = level.teams; + _k2047 = getFirstArrayKey( _a2047 ); + while ( isDefined( _k2047 ) ) + { + team = _a2047[ _k2047 ]; + spawnpoint.distsum[ team ] = 0; + spawnpoint.enemydistsum[ team ] = 0; + spawnpoint.minenemydist[ team ] = 9999999; + mindist[ team ] = 9999999; + _k2047 = getNextArrayKey( _a2047, _k2047 ); + } + spawnpoint.numplayersatlastupdate = 0; + i = 0; + while ( i < level.players.size ) + { + player = level.players[ i ]; + if ( player.sessionstate != "playing" ) + { + i++; + continue; + } + else diff = player.origin - spawnpoint.origin; + diff = ( diff[ 0 ], diff[ 1 ], 0 ); + dist = length( diff ); + team = "all"; + if ( level.teambased ) + { + team = player.team; + } + if ( dist < 1024 ) + { + spawnpoint.nearbyplayers[ team ][ spawnpoint.nearbyplayers[ team ].size ] = player; + } + if ( dist < mindist[ team ] ) + { + mindist[ team ] = dist; + } + distsum[ team ] += dist; + spawnpoint.numplayersatlastupdate++; + pdir = anglesToForward( player.angles ); + if ( vectordot( spawnpointdir, diff ) < 0 && vectordot( pdir, diff ) > 0 ) + { + i++; + continue; + } + else + { + losexists = bullettracepassed( player.origin + vectorScale( ( -1, -1, -1 ), 50 ), spawnpoint.sighttracepoint, 0, undefined ); + spawnpoint.lastsighttracetime = getTime(); + if ( losexists ) + { + if ( level.teambased ) + { + sights[ player.team ]++; + } + else + { + spawnpoint.enemysights++; + } /# - if ( debug ) - line( player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, ( 0.5, 1, 0.5 ) ); + if ( debug ) + { + line( player.origin + vectorScale( ( -1, -1, -1 ), 50 ), spawnpoint.sighttracepoint, ( 0,5, 1, 0,5 ) ); #/ - } - } - - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - spawnpoint.enemysights[team] = getnonteamsum( team, sights ); - spawnpoint.minenemydist[team] = getnonteammindist( team, mindist ); - spawnpoint.distsum[team] = distsum[team]; - spawnpoint.enemydistsum[team] = getnonteamsum( team, distsum ); - } - } - else - { - spawnpoint.distsum["all"] = distsum["all"]; - spawnpoint.enemydistsum["all"] = distsum["all"]; - spawnpoint.minenemydist["all"] = mindist["all"]; - } + } + } + } + i++; + } + if ( level.teambased ) + { + _a2128 = level.teams; + _k2128 = getFirstArrayKey( _a2128 ); + while ( isDefined( _k2128 ) ) + { + team = _a2128[ _k2128 ]; + spawnpoint.enemysights[ team ] = getnonteamsum( team, sights ); + spawnpoint.minenemydist[ team ] = getnonteammindist( team, mindist ); + spawnpoint.distsum[ team ] = distsum[ team ]; + spawnpoint.enemydistsum[ team ] = getnonteamsum( team, distsum ); + _k2128 = getNextArrayKey( _a2128, _k2128 ); + } + } + else spawnpoint.distsum[ "all" ] = distsum[ "all" ]; + spawnpoint.enemydistsum[ "all" ] = distsum[ "all" ]; + spawnpoint.minenemydist[ "all" ] = mindist[ "all" ]; } getlospenalty() { - if ( getdvar( _hash_CACDB8AA ) != "" && getdvar( _hash_CACDB8AA ) != "0" ) - return getdvarfloat( _hash_CACDB8AA ); - - return 100000; + if ( getDvar( #"CACDB8AA" ) != "" && getDvar( #"CACDB8AA" ) != "0" ) + { + return getDvarFloat( #"CACDB8AA" ); + } + return 100000; } lastminutesighttraces( spawnpoint ) { - if ( !isdefined( spawnpoint.nearbyplayers ) ) - return false; - - closest = undefined; - closestdistsq = undefined; - secondclosest = undefined; - secondclosestdistsq = undefined; - - foreach ( team in spawnpoint.nearbyplayers ) - { - if ( team == self.team ) - continue; - - for ( i = 0; i < spawnpoint.nearbyplayers[team].size; i++ ) - { - player = spawnpoint.nearbyplayers[team][i]; - - if ( !isdefined( player ) ) - continue; - - if ( player.sessionstate != "playing" ) - continue; - - if ( player == self ) - continue; - - distsq = distancesquared( spawnpoint.origin, player.origin ); - - if ( !isdefined( closest ) || distsq < closestdistsq ) - { - secondclosest = closest; - secondclosestdistsq = closestdistsq; - closest = player; - closestdistsq = distsq; - continue; - } - - if ( !isdefined( secondclosest ) || distsq < secondclosestdistsq ) - { - secondclosest = player; - secondclosestdistsq = distsq; - } - } - } - - if ( isdefined( closest ) ) - { - if ( bullettracepassed( closest.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, 0, undefined ) ) - return true; - } - - if ( isdefined( secondclosest ) ) - { - if ( bullettracepassed( secondclosest.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, 0, undefined ) ) - return true; - } - - return false; + if ( !isDefined( spawnpoint.nearbyplayers ) ) + { + return 0; + } + closest = undefined; + closestdistsq = undefined; + secondclosest = undefined; + secondclosestdistsq = undefined; + _a2162 = spawnpoint.nearbyplayers; + _k2162 = getFirstArrayKey( _a2162 ); + while ( isDefined( _k2162 ) ) + { + team = _a2162[ _k2162 ]; + if ( team == self.team ) + { + } + else + { + i = 0; + while ( i < spawnpoint.nearbyplayers[ team ].size ) + { + player = spawnpoint.nearbyplayers[ team ][ i ]; + if ( !isDefined( player ) ) + { + i++; + continue; + } + else if ( player.sessionstate != "playing" ) + { + i++; + continue; + } + else if ( player == self ) + { + i++; + continue; + } + else distsq = distancesquared( spawnpoint.origin, player.origin ); + if ( !isDefined( closest ) || distsq < closestdistsq ) + { + secondclosest = closest; + secondclosestdistsq = closestdistsq; + closest = player; + closestdistsq = distsq; + i++; + continue; + } + else + { + if ( !isDefined( secondclosest ) || distsq < secondclosestdistsq ) + { + secondclosest = player; + secondclosestdistsq = distsq; + } + } + i++; + } + } + _k2162 = getNextArrayKey( _a2162, _k2162 ); + } + if ( isDefined( closest ) ) + { + if ( bullettracepassed( closest.origin + vectorScale( ( -1, -1, -1 ), 50 ), spawnpoint.sighttracepoint, 0, undefined ) ) + { + return 1; + } + } + if ( isDefined( secondclosest ) ) + { + if ( bullettracepassed( secondclosest.origin + vectorScale( ( -1, -1, -1 ), 50 ), spawnpoint.sighttracepoint, 0, undefined ) ) + { + return 1; + } + } + return 0; } avoidvisibleenemies( spawnpoints, teambased ) { - if ( getdvar( _hash_FB71FB7 ) == "0" ) - return; - - lospenalty = getlospenalty(); - mindistteam = self.team; - - if ( teambased ) - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( !isdefined( spawnpoints[i].enemysights ) ) - continue; - - penalty = lospenalty * spawnpoints[i].enemysights[self.team]; - spawnpoints[i].weight -= penalty; + if ( getDvar( #"0FB71FB7" ) == "0" ) + { + return; + } + lospenalty = getlospenalty(); + mindistteam = self.team; + if ( teambased ) + { + i = 0; + while ( i < spawnpoints.size ) + { + if ( !isDefined( spawnpoints[ i ].enemysights ) ) + { + i++; + continue; + } + else + { + penalty = lospenalty * spawnpoints[ i ].enemysights[ self.team ]; + spawnpoints[ i ].weight -= penalty; /# - if ( level.storespawndata || level.debugspawning ) - { - index = spawnpoints[i].sightchecks.size; - spawnpoints[i].sightchecks[index] = spawnstruct(); - spawnpoints[i].sightchecks[index].penalty = penalty; - } + if ( level.storespawndata || level.debugspawning ) + { + index = spawnpoints[ i ].sightchecks.size; + spawnpoints[ i ].sightchecks[ index ] = spawnstruct(); + spawnpoints[ i ].sightchecks[ index ].penalty = penalty; #/ - } - } - else - { - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( !isdefined( spawnpoints[i].enemysights ) ) - continue; - - penalty = lospenalty * spawnpoints[i].enemysights; - spawnpoints[i].weight -= penalty; + } + } + i++; + } + } + else i = 0; + while ( i < spawnpoints.size ) + { + if ( !isDefined( spawnpoints[ i ].enemysights ) ) + { + i++; + continue; + } + else + { + penalty = lospenalty * spawnpoints[ i ].enemysights; + spawnpoints[ i ].weight -= penalty; /# - if ( level.storespawndata || level.debugspawning ) - { - index = spawnpoints[i].sightchecks.size; - spawnpoints[i].sightchecks[index] = spawnstruct(); - spawnpoints[i].sightchecks[index].penalty = penalty; - } + if ( level.storespawndata || level.debugspawning ) + { + index = spawnpoints[ i ].sightchecks.size; + spawnpoints[ i ].sightchecks[ index ] = spawnstruct(); + spawnpoints[ i ].sightchecks[ index ].penalty = penalty; #/ - } - - mindistteam = "all"; - } - - avoidweight = getdvarfloat( "scr_spawn_enemyavoidweight" ); - - if ( avoidweight != 0 ) - { - nearbyenemyouterrange = getdvarfloat( "scr_spawn_enemyavoiddist" ); - nearbyenemyouterrangesq = nearbyenemyouterrange * nearbyenemyouterrange; - nearbyenemypenalty = 1500 * avoidweight; - nearbyenemyminorpenalty = 800 * avoidweight; - lastattackerorigin = vectorscale( ( -1, -1, -1 ), 99999.0 ); - lastdeathpos = vectorscale( ( -1, -1, -1 ), 99999.0 ); - - if ( isalive( self.lastattacker ) ) - lastattackerorigin = self.lastattacker.origin; - - if ( isdefined( self.lastdeathpos ) ) - lastdeathpos = self.lastdeathpos; - - for ( i = 0; i < spawnpoints.size; i++ ) - { - mindist = spawnpoints[i].minenemydist[mindistteam]; - - if ( mindist < nearbyenemyouterrange * 2 ) - { - penalty = nearbyenemyminorpenalty * ( 1 - mindist / nearbyenemyouterrange * 2 ); - - if ( mindist < nearbyenemyouterrange ) - penalty += nearbyenemypenalty * ( 1 - mindist / nearbyenemyouterrange ); - - if ( penalty > 0 ) - { - spawnpoints[i].weight -= penalty; + } + } + i++; + } + mindistteam = "all"; + avoidweight = getDvarFloat( "scr_spawn_enemyavoidweight" ); + while ( avoidweight != 0 ) + { + nearbyenemyouterrange = getDvarFloat( "scr_spawn_enemyavoiddist" ); + nearbyenemyouterrangesq = nearbyenemyouterrange * nearbyenemyouterrange; + nearbyenemypenalty = 1500 * avoidweight; + nearbyenemyminorpenalty = 800 * avoidweight; + lastattackerorigin = vectorScale( ( -1, -1, -1 ), 99999 ); + lastdeathpos = vectorScale( ( -1, -1, -1 ), 99999 ); + if ( isalive( self.lastattacker ) ) + { + lastattackerorigin = self.lastattacker.origin; + } + if ( isDefined( self.lastdeathpos ) ) + { + lastdeathpos = self.lastdeathpos; + } + i = 0; + while ( i < spawnpoints.size ) + { + mindist = spawnpoints[ i ].minenemydist[ mindistteam ]; + if ( mindist < ( nearbyenemyouterrange * 2 ) ) + { + penalty = nearbyenemyminorpenalty * ( 1 - ( mindist / ( nearbyenemyouterrange * 2 ) ) ); + if ( mindist < nearbyenemyouterrange ) + { + penalty += nearbyenemypenalty * ( 1 - ( mindist / nearbyenemyouterrange ) ); + } + if ( penalty > 0 ) + { + spawnpoints[ i ].weight -= penalty; /# - if ( level.storespawndata || level.debugspawning ) - spawnpoints[i].spawndata[spawnpoints[i].spawndata.size] = "Nearest enemy at " + int( spawnpoints[i].minenemydist[mindistteam] ) + " units: -" + int( penalty ); + if ( level.storespawndata || level.debugspawning ) + { + spawnpoints[ i ].spawndata[ spawnpoints[ i ].spawndata.size ] = "Nearest enemy at " + int( spawnpoints[ i ].minenemydist[ mindistteam ] ) + " units: -" + int( penalty ); #/ - } - } - } - } + } + } + } + i++; + } + } } avoidspawnreuse( spawnpoints, teambased ) { - if ( getdvar( _hash_FB71FB7 ) == "0" ) - return; - - time = gettime(); - maxtime = 10000; - maxdistsq = 1048576; - - for ( i = 0; i < spawnpoints.size; i++ ) - { - spawnpoint = spawnpoints[i]; - - if ( !isdefined( spawnpoint.lastspawnedplayer ) || !isdefined( spawnpoint.lastspawntime ) || !isalive( spawnpoint.lastspawnedplayer ) ) - continue; - - if ( spawnpoint.lastspawnedplayer == self ) - continue; - - if ( teambased && spawnpoint.lastspawnedplayer.team == self.team ) - continue; - - timepassed = time - spawnpoint.lastspawntime; - - if ( timepassed < maxtime ) - { - distsq = distancesquared( spawnpoint.lastspawnedplayer.origin, spawnpoint.origin ); - - if ( distsq < maxdistsq ) - { - worsen = 5000 * ( 1 - distsq / maxdistsq ) * ( 1 - timepassed / maxtime ); - spawnpoint.weight -= worsen; + if ( getDvar( #"0FB71FB7" ) == "0" ) + { + return; + } + time = getTime(); + maxtime = 10000; + maxdistsq = 1048576; + i = 0; + while ( i < spawnpoints.size ) + { + spawnpoint = spawnpoints[ i ]; + if ( isDefined( spawnpoint.lastspawnedplayer ) || !isDefined( spawnpoint.lastspawntime ) && !isalive( spawnpoint.lastspawnedplayer ) ) + { + i++; + continue; + } + else + { + if ( spawnpoint.lastspawnedplayer == self ) + { + i++; + continue; + } + else if ( teambased && spawnpoint.lastspawnedplayer.team == self.team ) + { + i++; + continue; + } + else + { + timepassed = time - spawnpoint.lastspawntime; + if ( timepassed < maxtime ) + { + distsq = distancesquared( spawnpoint.lastspawnedplayer.origin, spawnpoint.origin ); + if ( distsq < maxdistsq ) + { + worsen = ( 5000 * ( 1 - ( distsq / maxdistsq ) ) ) * ( 1 - ( timepassed / maxtime ) ); + spawnpoint.weight -= worsen; /# - if ( level.storespawndata || level.debugspawning ) - spawnpoint.spawndata[spawnpoint.spawndata.size] = "Was recently used: -" + worsen; + if ( level.storespawndata || level.debugspawning ) + { + spawnpoint.spawndata[ spawnpoint.spawndata.size ] = "Was recently used: -" + worsen; #/ - } - else - spawnpoint.lastspawnedplayer = undefined; - - continue; - } - - spawnpoint.lastspawnedplayer = undefined; - } + } + } + else + { + spawnpoint.lastspawnedplayer = undefined; + } + i++; + continue; + } + else + { + spawnpoint.lastspawnedplayer = undefined; + } + } + } + i++; + } } avoidsamespawn( spawnpoints ) { - if ( getdvar( _hash_FB71FB7 ) == "0" ) - return; - - if ( !isdefined( self.lastspawnpoint ) ) - return; - - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( spawnpoints[i] == self.lastspawnpoint ) - { - spawnpoints[i].weight -= 50000; + if ( getDvar( #"0FB71FB7" ) == "0" ) + { + return; + } + if ( !isDefined( self.lastspawnpoint ) ) + { + return; + } + i = 0; + while ( i < spawnpoints.size ) + { + if ( spawnpoints[ i ] == self.lastspawnpoint ) + { + spawnpoints[ i ].weight -= 50000; /# - if ( level.storespawndata || level.debugspawning ) - spawnpoints[i].spawndata[spawnpoints[i].spawndata.size] = "Was last spawnpoint: -50000"; + if ( level.storespawndata || level.debugspawning ) + { + spawnpoints[ i ].spawndata[ spawnpoints[ i ].spawndata.size ] = "Was last spawnpoint: -50000"; #/ - break; - } - } + } + return; + } + else + { + i++; + } + } } getrandomintermissionpoint() { - spawnpoints = getentarray( "mp_global_intermission", "classname" ); - - if ( !spawnpoints.size ) - spawnpoints = getentarray( "info_player_start", "classname" ); + spawnpoints = getentarray( "mp_global_intermission", "classname" ); + if ( !spawnpoints.size ) + { + spawnpoints = getentarray( "info_player_start", "classname" ); + } /# - assert( spawnpoints.size ); + assert( spawnpoints.size ); #/ - spawnpoint = maps\mp\gametypes_zm\_spawnlogic::getspawnpoint_random( spawnpoints ); - return spawnpoint; + spawnpoint = maps/mp/gametypes_zm/_spawnlogic::getspawnpoint_random( spawnpoints ); + return spawnpoint; } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spectating.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spectating.gsc index adeb9fa..0752b8d 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spectating.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spectating.gsc @@ -1,228 +1,251 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -init() +init() //checked changed to match cerberus output { - foreach ( team in level.teams ) - level.spectateoverride[team] = spawnstruct(); - - level thread onplayerconnect(); + foreach ( team in level.teams ) + { + level.spectateoverride[ team ] = spawnstruct(); + } + level thread onplayerconnect(); } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - player thread onjoinedteam(); - player thread onjoinedspectators(); - player thread onplayerspawned(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player thread onjoinedteam(); + player thread onjoinedspectators(); + player thread onplayerspawned(); + } } -onplayerspawned() +onplayerspawned() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self setspectatepermissions(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self setspectatepermissions(); + } } -onjoinedteam() +onjoinedteam() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "joined_team" ); - - self setspectatepermissionsformachine(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "joined_team" ); + self setspectatepermissionsformachine(); + } } -onjoinedspectators() +onjoinedspectators() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "joined_spectators" ); - - self setspectatepermissionsformachine(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "joined_spectators" ); + self setspectatepermissionsformachine(); + } } -updatespectatesettings() +updatespectatesettings() //checked changed to match cerberus output { - level endon( "game_ended" ); - - for ( index = 0; index < level.players.size; index++ ) - level.players[index] setspectatepermissions(); + level endon( "game_ended" ); + for ( index = 0; index < level.players.size; index++ ) + { + level.players[ index ] setspectatepermissions(); + } } -getsplitscreenteam() +getsplitscreenteam() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info { - for ( index = 0; index < level.players.size; index++ ) - { - if ( !isdefined( level.players[index] ) ) - continue; - - if ( level.players[index] == self ) - continue; - - if ( !self isplayeronsamemachine( level.players[index] ) ) - continue; - - team = level.players[index].sessionteam; - - if ( team != "spectator" ) - return team; - } - - return self.sessionteam; + index = 0; + while ( index < level.players.size ) + { + if ( !isDefined( level.players[ index ] ) ) + { + index++; + continue; + } + if ( level.players[ index ] == self ) + { + index++; + continue; + } + if ( !self isplayeronsamemachine( level.players[ index ] ) ) + { + index++; + continue; + } + team = level.players[ index ].sessionteam; + if ( team != "spectator" ) + { + return team; + } + index++; + } + return self.sessionteam; } -otherlocalplayerstillalive() +otherlocalplayerstillalive() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info { - for ( index = 0; index < level.players.size; index++ ) - { - if ( !isdefined( level.players[index] ) ) - continue; - - if ( level.players[index] == self ) - continue; - - if ( !self isplayeronsamemachine( level.players[index] ) ) - continue; - - if ( isalive( level.players[index] ) ) - return true; - } - - return false; + index = 0; + while ( index < level.players.size ) + { + if ( !isDefined( level.players[ index ] ) ) + { + index++; + continue; + } + if ( level.players[ index ] == self ) + { + index++; + continue; + } + if ( !self isplayeronsamemachine( level.players[ index ] ) ) + { + index++; + continue; + } + if ( isalive( level.players[ index ] ) ) + { + return 1; + } + index++; + } + return 0; } -allowspectateallteams( allow ) +allowspectateallteams( allow ) //checked changed to match cerberus output { - foreach ( team in level.teams ) - self allowspectateteam( team, allow ); + foreach ( team in level.teams ) + { + self allowspectateteam( team, allow ); + } } -allowspectateallteamsexceptteam( skip_team, allow ) +allowspectateallteamsexceptteam( skip_team, allow ) //checked partially changed to match cerberus output did not use continue in foreach see github for more info { - foreach ( team in level.teams ) - { - if ( team == skip_team ) - continue; - - self allowspectateteam( team, allow ); - } + foreach ( team in level.teams ) + { + if ( team == skip_team ) + { + } + else + { + self allowspectateteam( team, allow ); + } + } } -setspectatepermissions() +setspectatepermissions() //checked changed to match cerberus output { - team = self.sessionteam; - - if ( team == "spectator" ) - { - if ( self issplitscreen() && !level.splitscreen ) - team = getsplitscreenteam(); - - if ( team == "spectator" ) - { - self allowspectateallteams( 1 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 1 ); - self allowspectateteam( "localplayers", 1 ); - return; - } - } - - spectatetype = level.spectatetype; - - switch ( spectatetype ) - { - case "0": - self allowspectateallteams( 0 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 1 ); - self allowspectateteam( "localplayers", 0 ); - break; - case "3": - if ( self issplitscreen() && self otherlocalplayerstillalive() ) - { - self allowspectateallteams( 0 ); - self allowspectateteam( "none", 0 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "localplayers", 1 ); - break; - } - case "1": - if ( !level.teambased ) - { - self allowspectateallteams( 1 ); - self allowspectateteam( "none", 1 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "localplayers", 1 ); - } - else if ( isdefined( team ) && isdefined( level.teams[team] ) ) - { - self allowspectateteam( team, 1 ); - self allowspectateallteamsexceptteam( team, 0 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 0 ); - self allowspectateteam( "localplayers", 1 ); - } - else - { - self allowspectateallteams( 0 ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 0 ); - self allowspectateteam( "localplayers", 1 ); - } - - break; - case "2": - self allowspectateallteams( 1 ); - self allowspectateteam( "freelook", 1 ); - self allowspectateteam( "none", 1 ); - self allowspectateteam( "localplayers", 1 ); - break; - } - - if ( isdefined( team ) && isdefined( level.teams[team] ) ) - { - if ( isdefined( level.spectateoverride[team].allowfreespectate ) ) - self allowspectateteam( "freelook", 1 ); - - if ( isdefined( level.spectateoverride[team].allowenemyspectate ) ) - self allowspectateallteamsexceptteam( team, 1 ); - } + team = self.sessionteam; + if ( team == "spectator" ) + { + if ( self issplitscreen() && !level.splitscreen ) + { + team = getsplitscreenteam(); + } + if ( team == "spectator" ) + { + self allowspectateallteams( 1 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 1 ); + self allowspectateteam( "localplayers", 1 ); + return; + } + } + spectatetype = level.spectatetype; + switch( spectatetype ) + { + case 0: + self allowspectateallteams( 0 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 1 ); + self allowspectateteam( "localplayers", 0 ); + break; + case 3: + if ( self issplitscreen() && self otherlocalplayerstillalive() ) + { + self allowspectateallteams( 0 ); + self allowspectateteam( "none", 0 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "localplayers", 1 ); + break; + } + case 1: + if ( !level.teambased ) + { + self allowspectateallteams( 1 ); + self allowspectateteam( "none", 1 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "localplayers", 1 ); + } + else if ( isDefined( team ) && isDefined( level.teams[ team ] ) ) + { + self allowspectateteam( team, 1 ); + self allowspectateallteamsexceptteam( team, 0 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 0 ); + self allowspectateteam( "localplayers", 1 ); + } + else + { + self allowspectateallteams( 0 ); + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 0 ); + self allowspectateteam( "localplayers", 1 ); + } + break; + case 2: + self allowspectateallteams( 1 ); + self allowspectateteam( "freelook", 1 ); + self allowspectateteam( "none", 1 ); + self allowspectateteam( "localplayers", 1 ); + break; + } + if ( isDefined( team ) && isDefined( level.teams[ team ] ) ) + { + if ( isDefined( level.spectateoverride[ team ].allowfreespectate ) ) + { + self allowspectateteam( "freelook", 1 ); + } + if ( isDefined( level.spectateoverride[ team ].allowenemyspectate ) ) + { + self allowspectateallteamsexceptteam( team, 1 ); + } + } } -setspectatepermissionsformachine() +setspectatepermissionsformachine() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info { - self setspectatepermissions(); - - if ( !self issplitscreen() ) - return; - - for ( index = 0; index < level.players.size; index++ ) - { - if ( !isdefined( level.players[index] ) ) - continue; - - if ( level.players[index] == self ) - continue; - - if ( !self isplayeronsamemachine( level.players[index] ) ) - continue; - - level.players[index] setspectatepermissions(); - } + self setspectatepermissions(); + if ( !self issplitscreen() ) + { + return; + } + index = 0; + while ( index < level.players.size ) + { + if ( !isDefined( level.players[ index ] ) ) + { + index++; + continue; + } + else if ( level.players[ index ] == self ) + { + index++; + continue; + } + else if ( !self isplayeronsamemachine( level.players[ index ] ) ) + { + index++; + continue; + } + level.players[ index ] setspectatepermissions(); + index++; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_tweakables.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_tweakables.gsc index 13f1269..307f7a6 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_tweakables.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_tweakables.gsc @@ -1,382 +1,401 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; +#include maps/mp/_utility; -gettweakabledvarvalue( category, name ) +gettweakabledvarvalue( category, name ) //checked matches cerberus output { - switch ( category ) - { - case "rule": - dvar = level.rules[name].dvar; - break; - case "game": - dvar = level.gametweaks[name].dvar; - break; - case "team": - dvar = level.teamtweaks[name].dvar; - break; - case "player": - dvar = level.playertweaks[name].dvar; - break; - case "class": - dvar = level.classtweaks[name].dvar; - break; - case "weapon": - dvar = level.weapontweaks[name].dvar; - break; - case "killstreak": - dvar = level.hardpointtweaks[name].dvar; - break; - case "hud": - dvar = level.hudtweaks[name].dvar; - break; - default: - dvar = undefined; - break; - } + switch( category ) + { + case "rule": + dvar = level.rules[ name ].dvar; + break; + case "game": + dvar = level.gametweaks[ name ].dvar; + break; + case "team": + dvar = level.teamtweaks[ name ].dvar; + break; + case "player": + dvar = level.playertweaks[ name ].dvar; + break; + case "class": + dvar = level.classtweaks[ name ].dvar; + break; + case "weapon": + dvar = level.weapontweaks[ name ].dvar; + break; + case "killstreak": + dvar = level.hardpointtweaks[ name ].dvar; + break; + case "hud": + dvar = level.hudtweaks[ name ].dvar; + break; + default: + dvar = undefined; + break; + } + /* /# - assert( isdefined( dvar ) ); + assert( isDefined( dvar ) ); #/ - value = getdvarint( dvar ); - return value; + */ + value = getDvarInt( dvar ); + return value; } -gettweakabledvar( category, name ) +gettweakabledvar( category, name ) //checked matches cerberus output { - switch ( category ) - { - case "rule": - value = level.rules[name].dvar; - break; - case "game": - value = level.gametweaks[name].dvar; - break; - case "team": - value = level.teamtweaks[name].dvar; - break; - case "player": - value = level.playertweaks[name].dvar; - break; - case "class": - value = level.classtweaks[name].dvar; - break; - case "weapon": - value = level.weapontweaks[name].dvar; - break; - case "killstreak": - value = level.hardpointtweaks[name].dvar; - break; - case "hud": - value = level.hudtweaks[name].dvar; - break; - default: - value = undefined; - break; - } + switch( category ) + { + case "rule": + value = level.rules[ name ].dvar; + break; + case "game": + value = level.gametweaks[ name ].dvar; + break; + case "team": + value = level.teamtweaks[ name ].dvar; + break; + case "player": + value = level.playertweaks[ name ].dvar; + break; + case "class": + value = level.classtweaks[ name ].dvar; + break; + case "weapon": + value = level.weapontweaks[ name ].dvar; + break; + case "killstreak": + value = level.hardpointtweaks[ name ].dvar; + break; + case "hud": + value = level.hudtweaks[ name ].dvar; + break; + default: + value = undefined; + break; + } + /* /# - assert( isdefined( value ) ); + assert( isDefined( value ) ); #/ - return value; + */ + return value; } -gettweakablevalue( category, name ) +gettweakablevalue( category, name ) //checked matches cerberus output { - switch ( category ) - { - case "rule": - value = level.rules[name].value; - break; - case "game": - value = level.gametweaks[name].value; - break; - case "team": - value = level.teamtweaks[name].value; - break; - case "player": - value = level.playertweaks[name].value; - break; - case "class": - value = level.classtweaks[name].value; - break; - case "weapon": - value = level.weapontweaks[name].value; - break; - case "killstreak": - value = level.hardpointtweaks[name].value; - break; - case "hud": - value = level.hudtweaks[name].value; - break; - default: - value = undefined; - break; - } - - overridedvar = "scr_" + level.gametype + "_" + category + "_" + name; - - if ( getdvar( overridedvar ) != "" ) - return getdvarint( overridedvar ); + switch( category ) + { + case "rule": + value = level.rules[ name ].value; + break; + case "game": + value = level.gametweaks[ name ].value; + break; + case "team": + value = level.teamtweaks[ name ].value; + break; + case "player": + value = level.playertweaks[ name ].value; + break; + case "class": + value = level.classtweaks[ name ].value; + break; + case "weapon": + value = level.weapontweaks[ name ].value; + break; + case "killstreak": + value = level.hardpointtweaks[ name ].value; + break; + case "hud": + value = level.hudtweaks[ name ].value; + break; + default: + value = undefined; + break; + } + overridedvar = "scr_" + level.gametype + "_" + category + "_" + name; + if ( getDvar( overridedvar ) != "" ) + { + return getDvarInt( overridedvar ); + } + /* /# - assert( isdefined( value ) ); + assert( isDefined( value ) ); #/ - return value; + */ + return value; } -gettweakablelastvalue( category, name ) +gettweakablelastvalue( category, name ) //checked matches cerberus output { - switch ( category ) - { - case "rule": - value = level.rules[name].lastvalue; - break; - case "game": - value = level.gametweaks[name].lastvalue; - break; - case "team": - value = level.teamtweaks[name].lastvalue; - break; - case "player": - value = level.playertweaks[name].lastvalue; - break; - case "class": - value = level.classtweaks[name].lastvalue; - break; - case "weapon": - value = level.weapontweaks[name].lastvalue; - break; - case "killstreak": - value = level.hardpointtweaks[name].lastvalue; - break; - case "hud": - value = level.hudtweaks[name].lastvalue; - break; - default: - value = undefined; - break; - } + switch( category ) + { + case "rule": + value = level.rules[ name ].lastvalue; + break; + case "game": + value = level.gametweaks[ name ].lastvalue; + break; + case "team": + value = level.teamtweaks[ name ].lastvalue; + break; + case "player": + value = level.playertweaks[ name ].lastvalue; + break; + case "class": + value = level.classtweaks[ name ].lastvalue; + break; + case "weapon": + value = level.weapontweaks[ name ].lastvalue; + break; + case "killstreak": + value = level.hardpointtweaks[ name ].lastvalue; + break; + case "hud": + value = level.hudtweaks[ name ].lastvalue; + break; + default: + value = undefined; + break; + } + /* /# - assert( isdefined( value ) ); + assert( isDefined( value ) ); #/ - return value; + */ + return value; } -settweakablevalue( category, name, value ) +settweakablevalue( category, name, value ) //checked matches cerberus output { - switch ( category ) - { - case "rule": - dvar = level.rules[name].dvar; - break; - case "game": - dvar = level.gametweaks[name].dvar; - break; - case "team": - dvar = level.teamtweaks[name].dvar; - break; - case "player": - dvar = level.playertweaks[name].dvar; - break; - case "class": - dvar = level.classtweaks[name].dvar; - break; - case "weapon": - dvar = level.weapontweaks[name].dvar; - break; - case "killstreak": - dvar = level.hardpointtweaks[name].dvar; - break; - case "hud": - dvar = level.hudtweaks[name].dvar; - break; - default: - dvar = undefined; - break; - } - - setdvar( dvar, value ); + switch( category ) + { + case "rule": + dvar = level.rules[ name ].dvar; + break; + case "game": + dvar = level.gametweaks[ name ].dvar; + break; + case "team": + dvar = level.teamtweaks[ name ].dvar; + break; + case "player": + dvar = level.playertweaks[ name ].dvar; + break; + case "class": + dvar = level.classtweaks[ name ].dvar; + break; + case "weapon": + dvar = level.weapontweaks[ name ].dvar; + break; + case "killstreak": + dvar = level.hardpointtweaks[ name ].dvar; + break; + case "hud": + dvar = level.hudtweaks[ name ].dvar; + break; + default: + dvar = undefined; + break; + } + setdvar( dvar, value ); } -settweakablelastvalue( category, name, value ) +settweakablelastvalue( category, name, value ) //checked changed to match cerberus output { - switch ( category ) - { - case "rule": - level.rules[name].lastvalue = value; - break; - case "game": - level.gametweaks[name].lastvalue = value; - break; - case "team": - level.teamtweaks[name].lastvalue = value; - break; - case "player": - level.playertweaks[name].lastvalue = value; - break; - case "class": - level.classtweaks[name].lastvalue = value; - break; - case "weapon": - level.weapontweaks[name].lastvalue = value; - break; - case "killstreak": - level.hardpointtweaks[name].lastvalue = value; - break; - case "hud": - level.hudtweaks[name].lastvalue = value; - break; - default: - break; - } + switch( category ) + { + case "rule": + level.rules[ name ].lastvalue = value; + break; + case "game": + level.gametweaks[ name ].lastvalue = value; + break; + case "team": + level.teamtweaks[ name ].lastvalue = value; + break; + case "player": + level.playertweaks[ name ].lastvalue = value; + break; + case "class": + level.classtweaks[ name ].lastvalue = value; + break; + case "weapon": + level.weapontweaks[ name ].lastvalue = value; + break; + case "killstreak": + level.hardpointtweaks[ name ].lastvalue = value; + break; + case "hud": + level.hudtweaks[ name ].lastvalue = value; + break; + default: + break; + } } -registertweakable( category, name, dvar, value ) +registertweakable( category, name, dvar, value ) //checked matches cerberus output { - if ( isstring( value ) ) - { - if ( getdvar( dvar ) == "" ) - setdvar( dvar, value ); - else - value = getdvar( dvar ); - } - else if ( getdvar( dvar ) == "" ) - setdvar( dvar, value ); - else - value = getdvarint( dvar ); - - switch ( category ) - { - case "rule": - if ( !isdefined( level.rules[name] ) ) - level.rules[name] = spawnstruct(); - - level.rules[name].value = value; - level.rules[name].lastvalue = value; - level.rules[name].dvar = dvar; - break; - case "game": - if ( !isdefined( level.gametweaks[name] ) ) - level.gametweaks[name] = spawnstruct(); - - level.gametweaks[name].value = value; - level.gametweaks[name].lastvalue = value; - level.gametweaks[name].dvar = dvar; - break; - case "team": - if ( !isdefined( level.teamtweaks[name] ) ) - level.teamtweaks[name] = spawnstruct(); - - level.teamtweaks[name].value = value; - level.teamtweaks[name].lastvalue = value; - level.teamtweaks[name].dvar = dvar; - break; - case "player": - if ( !isdefined( level.playertweaks[name] ) ) - level.playertweaks[name] = spawnstruct(); - - level.playertweaks[name].value = value; - level.playertweaks[name].lastvalue = value; - level.playertweaks[name].dvar = dvar; - break; - case "class": - if ( !isdefined( level.classtweaks[name] ) ) - level.classtweaks[name] = spawnstruct(); - - level.classtweaks[name].value = value; - level.classtweaks[name].lastvalue = value; - level.classtweaks[name].dvar = dvar; - break; - case "weapon": - if ( !isdefined( level.weapontweaks[name] ) ) - level.weapontweaks[name] = spawnstruct(); - - level.weapontweaks[name].value = value; - level.weapontweaks[name].lastvalue = value; - level.weapontweaks[name].dvar = dvar; - break; - case "killstreak": - if ( !isdefined( level.hardpointtweaks[name] ) ) - level.hardpointtweaks[name] = spawnstruct(); - - level.hardpointtweaks[name].value = value; - level.hardpointtweaks[name].lastvalue = value; - level.hardpointtweaks[name].dvar = dvar; - break; - case "hud": - if ( !isdefined( level.hudtweaks[name] ) ) - level.hudtweaks[name] = spawnstruct(); - - level.hudtweaks[name].value = value; - level.hudtweaks[name].lastvalue = value; - level.hudtweaks[name].dvar = dvar; - break; - } + if ( isstring( value ) ) + { + if ( getDvar( dvar ) == "" ) + { + setdvar( dvar, value ); + } + else + { + value = getDvar( dvar ); + } + } + else if ( getDvar( dvar ) == "" ) + { + setdvar( dvar, value ); + } + else + { + value = getDvarInt( dvar ); + } + switch( category ) + { + case "rule": + if ( !isDefined( level.rules[ name ] ) ) + { + level.rules[ name ] = spawnstruct(); + } + level.rules[ name ].value = value; + level.rules[ name ].lastvalue = value; + level.rules[ name ].dvar = dvar; + break; + case "game": + if ( !isDefined( level.gametweaks[ name ] ) ) + { + level.gametweaks[ name ] = spawnstruct(); + } + level.gametweaks[ name ].value = value; + level.gametweaks[ name ].lastvalue = value; + level.gametweaks[ name ].dvar = dvar; + break; + case "team": + if ( !isDefined( level.teamtweaks[ name ] ) ) + { + level.teamtweaks[ name ] = spawnstruct(); + } + level.teamtweaks[ name ].value = value; + level.teamtweaks[ name ].lastvalue = value; + level.teamtweaks[ name ].dvar = dvar; + break; + case "player": + if ( !isDefined( level.playertweaks[ name ] ) ) + { + level.playertweaks[ name ] = spawnstruct(); + } + level.playertweaks[ name ].value = value; + level.playertweaks[ name ].lastvalue = value; + level.playertweaks[ name ].dvar = dvar; + break; + case "class": + if ( !isDefined( level.classtweaks[ name ] ) ) + { + level.classtweaks[ name ] = spawnstruct(); + } + level.classtweaks[ name ].value = value; + level.classtweaks[ name ].lastvalue = value; + level.classtweaks[ name ].dvar = dvar; + break; + case "weapon": + if ( !isDefined( level.weapontweaks[ name ] ) ) + { + level.weapontweaks[ name ] = spawnstruct(); + } + level.weapontweaks[ name ].value = value; + level.weapontweaks[ name ].lastvalue = value; + level.weapontweaks[ name ].dvar = dvar; + break; + case "killstreak": + if ( !isDefined( level.hardpointtweaks[ name ] ) ) + { + level.hardpointtweaks[ name ] = spawnstruct(); + } + level.hardpointtweaks[ name ].value = value; + level.hardpointtweaks[ name ].lastvalue = value; + level.hardpointtweaks[ name ].dvar = dvar; + break; + case "hud": + if ( !isDefined( level.hudtweaks[ name ] ) ) + { + level.hudtweaks[ name ] = spawnstruct(); + } + level.hudtweaks[ name ].value = value; + level.hudtweaks[ name ].lastvalue = value; + level.hudtweaks[ name ].dvar = dvar; + break; + } } -init() +init() //checked matches cerberus output { - level.clienttweakables = []; - level.tweakablesinitialized = 1; - level.rules = []; - level.gametweaks = []; - level.teamtweaks = []; - level.playertweaks = []; - level.classtweaks = []; - level.weapontweaks = []; - level.hardpointtweaks = []; - level.hudtweaks = []; - registertweakable( "game", "arcadescoring", "scr_game_arcadescoring", 0 ); - registertweakable( "game", "difficulty", "scr_game_difficulty", 1 ); - registertweakable( "game", "pinups", "scr_game_pinups", 0 ); - registertweakable( "team", "teamkillerplaylistbanquantum", "scr_team_teamkillerplaylistbanquantum", 0 ); - registertweakable( "team", "teamkillerplaylistbanpenalty", "scr_team_teamkillerplaylistbanpenalty", 0 ); - registertweakable( "player", "allowrevive", "scr_player_allowrevive", 1 ); - registertweakable( "weapon", "allowfrag", "scr_weapon_allowfrags", 1 ); - registertweakable( "weapon", "allowsmoke", "scr_weapon_allowsmoke", 1 ); - registertweakable( "weapon", "allowflash", "scr_weapon_allowflash", 1 ); - registertweakable( "weapon", "allowc4", "scr_weapon_allowc4", 1 ); - registertweakable( "weapon", "allowsatchel", "scr_weapon_allowsatchel", 1 ); - registertweakable( "weapon", "allowbetty", "scr_weapon_allowbetty", 1 ); - registertweakable( "weapon", "allowrpgs", "scr_weapon_allowrpgs", 1 ); - registertweakable( "weapon", "allowmines", "scr_weapon_allowmines", 1 ); - registertweakable( "hud", "showobjicons", "ui_hud_showobjicons", 1 ); - setclienttweakable( "hud", "showobjicons" ); - registertweakable( "killstreak", "allowradar", "scr_hardpoint_allowradar", 1 ); - registertweakable( "killstreak", "allowradardirection", "scr_hardpoint_allowradardirection", 1 ); - registertweakable( "killstreak", "allowcounteruav", "scr_hardpoint_allowcounteruav", 1 ); - registertweakable( "killstreak", "allowdogs", "scr_hardpoint_allowdogs", 1 ); - registertweakable( "killstreak", "allowhelicopter_comlink", "scr_hardpoint_allowhelicopter_comlink", 1 ); - registertweakable( "killstreak", "allowrcbomb", "scr_hardpoint_allowrcbomb", 1 ); - registertweakable( "killstreak", "allowauto_turret", "scr_hardpoint_allowauto_turret", 1 ); - level thread updateuitweakables(); + level.clienttweakables = []; + level.tweakablesinitialized = 1; + level.rules = []; + level.gametweaks = []; + level.teamtweaks = []; + level.playertweaks = []; + level.classtweaks = []; + level.weapontweaks = []; + level.hardpointtweaks = []; + level.hudtweaks = []; + registertweakable( "game", "arcadescoring", "scr_game_arcadescoring", 0 ); + registertweakable( "game", "difficulty", "scr_game_difficulty", 1 ); + registertweakable( "game", "pinups", "scr_game_pinups", 0 ); + registertweakable( "team", "teamkillerplaylistbanquantum", "scr_team_teamkillerplaylistbanquantum", 0 ); + registertweakable( "team", "teamkillerplaylistbanpenalty", "scr_team_teamkillerplaylistbanpenalty", 0 ); + registertweakable( "player", "allowrevive", "scr_player_allowrevive", 1 ); + registertweakable( "weapon", "allowfrag", "scr_weapon_allowfrags", 1 ); + registertweakable( "weapon", "allowsmoke", "scr_weapon_allowsmoke", 1 ); + registertweakable( "weapon", "allowflash", "scr_weapon_allowflash", 1 ); + registertweakable( "weapon", "allowc4", "scr_weapon_allowc4", 1 ); + registertweakable( "weapon", "allowsatchel", "scr_weapon_allowsatchel", 1 ); + registertweakable( "weapon", "allowbetty", "scr_weapon_allowbetty", 1 ); + registertweakable( "weapon", "allowrpgs", "scr_weapon_allowrpgs", 1 ); + registertweakable( "weapon", "allowmines", "scr_weapon_allowmines", 1 ); + registertweakable( "hud", "showobjicons", "ui_hud_showobjicons", 1 ); + setclienttweakable( "hud", "showobjicons" ); + registertweakable( "killstreak", "allowradar", "scr_hardpoint_allowradar", 1 ); + registertweakable( "killstreak", "allowradardirection", "scr_hardpoint_allowradardirection", 1 ); + registertweakable( "killstreak", "allowcounteruav", "scr_hardpoint_allowcounteruav", 1 ); + registertweakable( "killstreak", "allowdogs", "scr_hardpoint_allowdogs", 1 ); + registertweakable( "killstreak", "allowhelicopter_comlink", "scr_hardpoint_allowhelicopter_comlink", 1 ); + registertweakable( "killstreak", "allowrcbomb", "scr_hardpoint_allowrcbomb", 1 ); + registertweakable( "killstreak", "allowauto_turret", "scr_hardpoint_allowauto_turret", 1 ); + level thread updateuitweakables(); } -setclienttweakable( category, name ) +setclienttweakable( category, name ) //checked matches cerberus output { - level.clienttweakables[level.clienttweakables.size] = name; + level.clienttweakables[ level.clienttweakables.size ] = name; } -updateuitweakables() +updateuitweakables() //checked changed to match cerberus output { - for (;;) - { - for ( index = 0; index < level.clienttweakables.size; index++ ) - { - clienttweakable = level.clienttweakables[index]; - curvalue = gettweakabledvarvalue( "hud", clienttweakable ); - lastvalue = gettweakablelastvalue( "hud", clienttweakable ); - - if ( curvalue != lastvalue ) - { - updateserverdvar( gettweakabledvar( "hud", clienttweakable ), curvalue ); - settweakablelastvalue( "hud", clienttweakable, curvalue ); - } - } - - wait 1.0; - } + for ( ;; ) + { + for ( index = 0; index < level.clienttweakables.size; index++ ) + { + clienttweakable = level.clienttweakables[ index ]; + curvalue = gettweakabledvarvalue( "hud", clienttweakable ); + lastvalue = gettweakablelastvalue( "hud", clienttweakable ); + if ( curvalue != lastvalue ) + { + updateserverdvar( gettweakabledvar( "hud", clienttweakable ), curvalue ); + settweakablelastvalue( "hud", clienttweakable, curvalue ); + } + } + wait 1; + } } -updateserverdvar( dvar, value ) +updateserverdvar( dvar, value ) //checked matches cerberus output { - makedvarserverinfo( dvar, value ); + makedvarserverinfo( dvar, value ); } + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc index d4dd932..3d9b204 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapon_utils.gsc @@ -1,111 +1,124 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; +#include maps/mp/killstreaks/_killstreaks; +#include maps/mp/_utility; +#include common_scripts/utility; -isgrenadelauncherweapon( weapon ) +isgrenadelauncherweapon( weapon ) //checked matches cerberus output { - if ( getsubstr( weapon, 0, 3 ) == "gl_" ) - return true; - - switch ( weapon ) - { - case "xm25_mp": - case "china_lake_mp": - return true; - default: - return false; - } + if ( getsubstr( weapon, 0, 3 ) == "gl_" ) + { + return 1; + } + switch( weapon ) + { + case "china_lake_mp": + case "xm25_mp": + return 1; + default: + return 0; + } } -isdumbrocketlauncherweapon( weapon ) +isdumbrocketlauncherweapon( weapon ) //checked matches cerberus output { - switch ( weapon ) - { - case "rpg_mp": - case "m220_tow_mp": - return true; - default: - return false; - } + switch( weapon ) + { + case "m220_tow_mp": + case "rpg_mp": + return 1; + default: + return 0; + } } -isguidedrocketlauncherweapon( weapon ) +isguidedrocketlauncherweapon( weapon ) //checked matches cerberus output { - switch ( weapon ) - { - case "smaw_mp": - case "m72_law_mp": - case "m202_flash_mp": - case "javelin_mp": - case "fhj18_mp": - return true; - default: - return false; - } + switch( weapon ) + { + case "fhj18_mp": + case "javelin_mp": + case "m202_flash_mp": + case "m72_law_mp": + case "smaw_mp": + return 1; + default: + return 0; + } } -isrocketlauncherweapon( weapon ) +isrocketlauncherweapon( weapon ) //checked matches cerberus output { - if ( isdumbrocketlauncherweapon( weapon ) ) - return true; - - if ( isguidedrocketlauncherweapon( weapon ) ) - return true; - - return false; + if ( isdumbrocketlauncherweapon( weapon ) ) + { + return 1; + } + if ( isguidedrocketlauncherweapon( weapon ) ) + { + return 1; + } + return 0; } -islauncherweapon( weapon ) +islauncherweapon( weapon ) //checked matches cerberus output { - if ( isrocketlauncherweapon( weapon ) ) - return true; - - if ( isgrenadelauncherweapon( weapon ) ) - return true; - - return false; + if ( isrocketlauncherweapon( weapon ) ) + { + return 1; + } + if ( isgrenadelauncherweapon( weapon ) ) + { + return 1; + } + return 0; } isreducedteamkillweapon( weapon ) { - switch ( weapon ) - { - case "planemortar_mp": - return true; - default: - return false; - } + switch( weapon ) + { + case "planemortar_mp": + return 1; + default: + return 0; + } } -ishackweapon( weapon ) +ishackweapon( weapon ) //checked matches cerberus output { - return 0; + return 0; } -ispistol( weapon ) +ispistol( weapon ) //checked changed at own discretion { - return isdefined( level.side_arm_array[weapon] ); + if ( isDefined( level.side_arm_array[ weapon ] ) ) + { + return 1; + } + return 0; } -isflashorstunweapon( weapon ) +isflashorstunweapon( weapon ) //checked matches cerberus output { - if ( isdefined( weapon ) ) - { - switch ( weapon ) - { - case "proximity_grenade_mp": - case "proximity_grenade_aoe_mp": - case "flash_grenade_mp": - case "concussion_grenade_mp": - return true; - } - } - - return false; + if ( isDefined( weapon ) ) + { + switch( weapon ) + { + case "concussion_grenade_mp": + case "flash_grenade_mp": + case "proximity_grenade_aoe_mp": + case "proximity_grenade_mp": + return 1; + } + } + return 0; } -isflashorstundamage( weapon, meansofdeath ) +isflashorstundamage( weapon, meansofdeath ) //checked changed at own discretion { - return isflashorstunweapon( weapon ) && ( meansofdeath == "MOD_GRENADE_SPLASH" || meansofdeath == "MOD_GAS" ); + if ( ( meansofdeath == "MOD_GAS" || meansofdeath == "MOD_GRENADE_SPLASH" ) && isflashorstunweapon( weapon ) ) + { + return 1; + } + return 0; } + + diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc index 7e286a5..8953fc5 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc @@ -1,2203 +1,2435 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\_ballistic_knife; -#include maps\mp\_challenges; -#include maps\mp\gametypes_zm\_weaponobjects; -#include maps\mp\gametypes_zm\_globallogic_player; -#include maps\mp\gametypes_zm\_damagefeedback; -#include maps\mp\gametypes_zm\_globallogic_audio; +#include maps/mp/gametypes_zm/_globallogic_audio; +#include maps/mp/gametypes_zm/_damagefeedback; +#include maps/mp/gametypes_zm/_globallogic_player; +#include maps/mp/gametypes_zm/_weaponobjects; +#include maps/mp/_challenges; +#include maps/mp/_ballistic_knife; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/_utility; +#include common_scripts/utility; init() { /# - debug = weapons_get_dvar_int( "scr_weaponobject_debug", "0" ); + debug = weapons_get_dvar_int( "scr_weaponobject_debug", "0" ); #/ - coneangle = weapons_get_dvar_int( "scr_weaponobject_coneangle", "70" ); - mindist = weapons_get_dvar_int( "scr_weaponobject_mindist", "20" ); - graceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod", "0.6" ); - radius = weapons_get_dvar_int( "scr_weaponobject_radius", "192" ); - level thread onplayerconnect(); - level.watcherweapons = []; - level.watcherweapons = getwatcherweapons(); - level.watcherweaponnames = []; - level.watcherweaponnames = getwatchernames( level.watcherweapons ); - level.retrievableweapons = []; - level.retrievableweapons = getretrievableweapons(); - level.retrievableweaponnames = []; - level.retrievableweaponnames = getwatchernames( level.retrievableweapons ); - level.weaponobjects_headicon_offset = []; - level.weaponobjects_headicon_offset["default"] = vectorscale( ( 0, 0, 1 ), 20.0 ); - level.weaponobjectexplodethisframe = 0; - - if ( getdvar( "scr_deleteexplosivesonspawn" ) == "" ) - setdvar( "scr_deleteexplosivesonspawn", 1 ); - - level.deleteexplosivesonspawn = getdvarint( "scr_deleteexplosivesonspawn" ); - - if ( sessionmodeiszombiesgame() ) - return; - - precachestring( &"MP_DEFUSING_EXPLOSIVE" ); - level.claymorefxid = loadfx( "weapon/claymore/fx_claymore_laser" ); - level._equipment_spark_fx = loadfx( "weapon/grenade/fx_spark_disabled_weapon" ); - level._equipment_emp_destroy_fx = loadfx( "weapon/emp/fx_emp_explosion_equip" ); - level._equipment_explode_fx = loadfx( "explosions/fx_exp_equipment" ); - level._equipment_explode_fx_lg = loadfx( "explosions/fx_exp_equipment_lg" ); - level._effect["powerLight"] = loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" ); - setupretrievablehintstrings(); - level.weaponobjects_headicon_offset["acoustic_sensor_mp"] = vectorscale( ( 0, 0, 1 ), 25.0 ); - level.weaponobjects_headicon_offset["sensor_grenade_mp"] = vectorscale( ( 0, 0, 1 ), 25.0 ); - level.weaponobjects_headicon_offset["camera_spike_mp"] = vectorscale( ( 0, 0, 1 ), 35.0 ); - level.weaponobjects_headicon_offset["claymore_mp"] = vectorscale( ( 0, 0, 1 ), 20.0 ); - level.weaponobjects_headicon_offset["bouncingbetty_mp"] = vectorscale( ( 0, 0, 1 ), 20.0 ); - level.weaponobjects_headicon_offset["satchel_charge_mp"] = vectorscale( ( 0, 0, 1 ), 10.0 ); - level.weaponobjects_headicon_offset["scrambler_mp"] = vectorscale( ( 0, 0, 1 ), 20.0 ); - level.weaponobjects_headicon_offset["trophy_system_mp"] = vectorscale( ( 0, 0, 1 ), 20.0 ); - level.weaponobjects_hacker_trigger_width = 32; - level.weaponobjects_hacker_trigger_height = 32; + coneangle = weapons_get_dvar_int( "scr_weaponobject_coneangle", "70" ); + mindist = weapons_get_dvar_int( "scr_weaponobject_mindist", "20" ); + graceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod", "0.6" ); + radius = weapons_get_dvar_int( "scr_weaponobject_radius", "192" ); + level thread onplayerconnect(); + level.watcherweapons = []; + level.watcherweapons = getwatcherweapons(); + level.watcherweaponnames = []; + level.watcherweaponnames = getwatchernames( level.watcherweapons ); + level.retrievableweapons = []; + level.retrievableweapons = getretrievableweapons(); + level.retrievableweaponnames = []; + level.retrievableweaponnames = getwatchernames( level.retrievableweapons ); + level.weaponobjects_headicon_offset = []; + level.weaponobjects_headicon_offset[ "default" ] = vectorScale( ( 0, 0, 1 ), 20 ); + level.weaponobjectexplodethisframe = 0; + if ( getDvar( "scr_deleteexplosivesonspawn" ) == "" ) + { + setdvar( "scr_deleteexplosivesonspawn", 1 ); + } + level.deleteexplosivesonspawn = getDvarInt( "scr_deleteexplosivesonspawn" ); + if ( sessionmodeiszombiesgame() ) + { + return; + } + precachestring( &"MP_DEFUSING_EXPLOSIVE" ); + level.claymorefxid = loadfx( "weapon/claymore/fx_claymore_laser" ); + level._equipment_spark_fx = loadfx( "weapon/grenade/fx_spark_disabled_weapon" ); + level._equipment_emp_destroy_fx = loadfx( "weapon/emp/fx_emp_explosion_equip" ); + level._equipment_explode_fx = loadfx( "explosions/fx_exp_equipment" ); + level._equipment_explode_fx_lg = loadfx( "explosions/fx_exp_equipment_lg" ); + level._effect[ "powerLight" ] = loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" ); + setupretrievablehintstrings(); + level.weaponobjects_headicon_offset[ "acoustic_sensor_mp" ] = vectorScale( ( 0, 0, 1 ), 25 ); + level.weaponobjects_headicon_offset[ "sensor_grenade_mp" ] = vectorScale( ( 0, 0, 1 ), 25 ); + level.weaponobjects_headicon_offset[ "camera_spike_mp" ] = vectorScale( ( 0, 0, 1 ), 35 ); + level.weaponobjects_headicon_offset[ "claymore_mp" ] = vectorScale( ( 0, 0, 1 ), 20 ); + level.weaponobjects_headicon_offset[ "bouncingbetty_mp" ] = vectorScale( ( 0, 0, 1 ), 20 ); + level.weaponobjects_headicon_offset[ "satchel_charge_mp" ] = vectorScale( ( 0, 0, 1 ), 10 ); + level.weaponobjects_headicon_offset[ "scrambler_mp" ] = vectorScale( ( 0, 0, 1 ), 20 ); + level.weaponobjects_headicon_offset[ "trophy_system_mp" ] = vectorScale( ( 0, 0, 1 ), 20 ); + level.weaponobjects_hacker_trigger_width = 32; + level.weaponobjects_hacker_trigger_height = 32; } getwatchernames( weapons ) { - names = []; - - foreach ( index, weapon in weapons ) - names[index] = getsubstr( weapon, 0, weapon.size - 3 ); - - return names; + names = []; + _a73 = weapons; + index = getFirstArrayKey( _a73 ); + while ( isDefined( index ) ) + { + weapon = _a73[ index ]; + names[ index ] = getsubstr( weapon, 0, weapon.size - 3 ); + index = getNextArrayKey( _a73, index ); + } + return names; } weapons_get_dvar_int( dvar, def ) { - return int( weapons_get_dvar( dvar, def ) ); + return int( weapons_get_dvar( dvar, def ) ); } weapons_get_dvar( dvar, def ) { - if ( getdvar( dvar ) != "" ) - return getdvarfloat( dvar ); - else - { - setdvar( dvar, def ); - return def; - } + if ( getDvar( dvar ) != "" ) + { + return getDvarFloat( dvar ); + } + else + { + setdvar( dvar, def ); + return def; + } } setupretrievablehintstrings() { - createretrievablehint( "hatchet", &"MP_HATCHET_PICKUP" ); - createretrievablehint( "claymore", &"MP_CLAYMORE_PICKUP" ); - createretrievablehint( "bouncingbetty", &"MP_BOUNCINGBETTY_PICKUP" ); - createretrievablehint( "trophy_system", &"MP_TROPHY_SYSTEM_PICKUP" ); - createretrievablehint( "acoustic_sensor", &"MP_ACOUSTIC_SENSOR_PICKUP" ); - createretrievablehint( "camera_spike", &"MP_CAMERA_SPIKE_PICKUP" ); - createretrievablehint( "satchel_charge", &"MP_SATCHEL_CHARGE_PICKUP" ); - createretrievablehint( "scrambler", &"MP_SCRAMBLER_PICKUP" ); - createdestroyhint( "trophy_system", &"MP_TROPHY_SYSTEM_DESTROY" ); - createdestroyhint( "sensor_grenade", &"MP_SENSOR_GRENADE_DESTROY" ); - createhackerhint( "claymore_mp", &"MP_CLAYMORE_HACKING" ); - createhackerhint( "bouncingbetty_mp", &"MP_BOUNCINGBETTY_HACKING" ); - createhackerhint( "trophy_system_mp", &"MP_TROPHY_SYSTEM_HACKING" ); - createhackerhint( "acoustic_sensor_mp", &"MP_ACOUSTIC_SENSOR_HACKING" ); - createhackerhint( "camera_spike_mp", &"MP_CAMERA_SPIKE_HACKING" ); - createhackerhint( "satchel_charge_mp", &"MP_SATCHEL_CHARGE_HACKING" ); - createhackerhint( "scrambler_mp", &"MP_SCRAMBLER_HACKING" ); + createretrievablehint( "hatchet", &"MP_HATCHET_PICKUP" ); + createretrievablehint( "claymore", &"MP_CLAYMORE_PICKUP" ); + createretrievablehint( "bouncingbetty", &"MP_BOUNCINGBETTY_PICKUP" ); + createretrievablehint( "trophy_system", &"MP_TROPHY_SYSTEM_PICKUP" ); + createretrievablehint( "acoustic_sensor", &"MP_ACOUSTIC_SENSOR_PICKUP" ); + createretrievablehint( "camera_spike", &"MP_CAMERA_SPIKE_PICKUP" ); + createretrievablehint( "satchel_charge", &"MP_SATCHEL_CHARGE_PICKUP" ); + createretrievablehint( "scrambler", &"MP_SCRAMBLER_PICKUP" ); + createdestroyhint( "trophy_system", &"MP_TROPHY_SYSTEM_DESTROY" ); + createdestroyhint( "sensor_grenade", &"MP_SENSOR_GRENADE_DESTROY" ); + createhackerhint( "claymore_mp", &"MP_CLAYMORE_HACKING" ); + createhackerhint( "bouncingbetty_mp", &"MP_BOUNCINGBETTY_HACKING" ); + createhackerhint( "trophy_system_mp", &"MP_TROPHY_SYSTEM_HACKING" ); + createhackerhint( "acoustic_sensor_mp", &"MP_ACOUSTIC_SENSOR_HACKING" ); + createhackerhint( "camera_spike_mp", &"MP_CAMERA_SPIKE_HACKING" ); + createhackerhint( "satchel_charge_mp", &"MP_SATCHEL_CHARGE_HACKING" ); + createhackerhint( "scrambler_mp", &"MP_SCRAMBLER_HACKING" ); } onplayerconnect() { - if ( isdefined( level._weaponobjects_on_player_connect_override ) ) - { - level thread [[ level._weaponobjects_on_player_connect_override ]](); - return; - } - - for (;;) - { - level waittill( "connecting", player ); - - player.usedweapons = 0; - player.hits = 0; - player thread onplayerspawned(); - } + if ( isDefined( level._weaponobjects_on_player_connect_override ) ) + { + level thread [[ level._weaponobjects_on_player_connect_override ]](); + return; + } + for ( ;; ) + { + level waittill( "connecting", player ); + player.usedweapons = 0; + player.hits = 0; + player thread onplayerspawned(); + } } onplayerspawned() { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - pixbeginevent( "onPlayerSpawned" ); - - if ( !isdefined( self.watchersinitialized ) ) - { - self createbasewatchers(); - self setupretrievablewatcher(); - self thread watchweaponobjectusage(); - self.watchersinitialized = 1; - } - - self resetwatchers(); - pixendevent(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + pixbeginevent( "onPlayerSpawned" ); + if ( !isDefined( self.watchersinitialized ) ) + { + self createbasewatchers(); + self setupretrievablewatcher(); + self thread watchweaponobjectusage(); + self.watchersinitialized = 1; + } + self resetwatchers(); + pixendevent(); + } } resetwatchers() { - if ( !isdefined( self.weaponobjectwatcherarray ) ) - return undefined; - - team = self.team; - - foreach ( watcher in self.weaponobjectwatcherarray ) - resetweaponobjectwatcher( watcher, team ); + if ( !isDefined( self.weaponobjectwatcherarray ) ) + { + return undefined; + } + team = self.team; + _a199 = self.weaponobjectwatcherarray; + _k199 = getFirstArrayKey( _a199 ); + while ( isDefined( _k199 ) ) + { + watcher = _a199[ _k199 ]; + resetweaponobjectwatcher( watcher, team ); + _k199 = getNextArrayKey( _a199, _k199 ); + } } createbasewatchers() { - foreach ( index, weapon in level.watcherweapons ) - self createweaponobjectwatcher( level.watcherweaponnames[index], weapon, self.team ); - - foreach ( index, weapon in level.retrievableweapons ) - self createweaponobjectwatcher( level.retrievableweaponnames[index], weapon, self.team ); + _a208 = level.watcherweapons; + index = getFirstArrayKey( _a208 ); + while ( isDefined( index ) ) + { + weapon = _a208[ index ]; + self createweaponobjectwatcher( level.watcherweaponnames[ index ], weapon, self.team ); + index = getNextArrayKey( _a208, index ); + } + _a214 = level.retrievableweapons; + index = getFirstArrayKey( _a214 ); + while ( isDefined( index ) ) + { + weapon = _a214[ index ]; + self createweaponobjectwatcher( level.retrievableweaponnames[ index ], weapon, self.team ); + index = getNextArrayKey( _a214, index ); + } } setupretrievablewatcher() { - for ( i = 0; i < level.retrievableweapons.size; i++ ) - { - watcher = getweaponobjectwatcherbyweapon( level.retrievableweapons[i] ); - - if ( !isdefined( watcher.onspawnretrievetriggers ) ) - watcher.onspawnretrievetriggers = ::onspawnretrievableweaponobject; - - if ( !isdefined( watcher.ondestroyed ) ) - watcher.ondestroyed = ::ondestroyed; - - if ( !isdefined( watcher.pickup ) ) - watcher.pickup = ::pickup; - } + i = 0; + while ( i < level.retrievableweapons.size ) + { + watcher = getweaponobjectwatcherbyweapon( level.retrievableweapons[ i ] ); + if ( !isDefined( watcher.onspawnretrievetriggers ) ) + { + watcher.onspawnretrievetriggers = ::onspawnretrievableweaponobject; + } + if ( !isDefined( watcher.ondestroyed ) ) + { + watcher.ondestroyed = ::ondestroyed; + } + if ( !isDefined( watcher.pickup ) ) + { + watcher.pickup = ::pickup; + } + i++; + } } createballisticknifewatcher() { - watcher = self createuseweaponobjectwatcher( "knife_ballistic", "knife_ballistic_mp", self.team ); - watcher.onspawn = maps\mp\_ballistic_knife::onspawn; - watcher.detonate = ::deleteent; - watcher.onspawnretrievetriggers = maps\mp\_ballistic_knife::onspawnretrievetrigger; - watcher.storedifferentobject = 1; + watcher = self createuseweaponobjectwatcher( "knife_ballistic", "knife_ballistic_mp", self.team ); + watcher.onspawn = ::maps/mp/_ballistic_knife::onspawn; + watcher.detonate = ::deleteent; + watcher.onspawnretrievetriggers = ::maps/mp/_ballistic_knife::onspawnretrievetrigger; + watcher.storedifferentobject = 1; } createhatchetwatcher() { - watcher = self createuseweaponobjectwatcher( "hatchet", "hatchet_mp", self.team ); - watcher.detonate = ::deleteent; - watcher.onspawn = ::voidonspawn; - watcher.onspawnretrievetriggers = ::onspawnhatchettrigger; + watcher = self createuseweaponobjectwatcher( "hatchet", "hatchet_mp", self.team ); + watcher.detonate = ::deleteent; + watcher.onspawn = ::voidonspawn; + watcher.onspawnretrievetriggers = ::onspawnhatchettrigger; } createtactinsertwatcher() { - watcher = self createuseweaponobjectwatcher( "tactical_insertion", "tactical_insertion_mp", self.team ); - watcher.playdestroyeddialog = 0; + watcher = self createuseweaponobjectwatcher( "tactical_insertion", "tactical_insertion_mp", self.team ); + watcher.playdestroyeddialog = 0; } creatercbombwatcher() { - } createqrdronewatcher() { - } createplayerhelicopterwatcher() { - watcher = self createuseweaponobjectwatcher( "helicopter_player", "helicopter_player_mp", self.team ); - watcher.altdetonate = 1; - watcher.headicon = 0; + watcher = self createuseweaponobjectwatcher( "helicopter_player", "helicopter_player_mp", self.team ); + watcher.altdetonate = 1; + watcher.headicon = 0; } createclaymorewatcher() { - watcher = self createproximityweaponobjectwatcher( "claymore", "claymore_mp", self.team ); - watcher.watchforfire = 1; - watcher.detonate = ::claymoredetonate; - watcher.activatesound = "wpn_claymore_alert"; - watcher.hackable = 1; - watcher.hackertoolradius = level.claymorehackertoolradius; - watcher.hackertooltimems = level.claymorehackertooltimems; - watcher.reconmodel = "t6_wpn_claymore_world_detect"; - watcher.ownergetsassist = 1; - detectionconeangle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); - watcher.detectiondot = cos( detectionconeangle ); - watcher.detectionmindist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); - watcher.detectiongraceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); - watcher.detonateradius = weapons_get_dvar_int( "scr_weaponobject_radius" ); - watcher.stun = ::weaponstun; - watcher.stuntime = 5; + watcher = self createproximityweaponobjectwatcher( "claymore", "claymore_mp", self.team ); + watcher.watchforfire = 1; + watcher.detonate = ::claymoredetonate; + watcher.activatesound = "wpn_claymore_alert"; + watcher.hackable = 1; + watcher.hackertoolradius = level.claymorehackertoolradius; + watcher.hackertooltimems = level.claymorehackertooltimems; + watcher.reconmodel = "t6_wpn_claymore_world_detect"; + watcher.ownergetsassist = 1; + detectionconeangle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); + watcher.detectiondot = cos( detectionconeangle ); + watcher.detectionmindist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); + watcher.detectiongraceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); + watcher.detonateradius = weapons_get_dvar_int( "scr_weaponobject_radius" ); + watcher.stun = ::weaponstun; + watcher.stuntime = 5; } waittillnotmoving_and_notstunned() { - for ( prevorigin = self.origin; 1; prevorigin = self.origin ) - { - wait 0.15; - - if ( self.origin == prevorigin && !self isstunned() ) - break; - } + prevorigin = self.origin; + while ( 1 ) + { + wait 0,15; + if ( self.origin == prevorigin && !self isstunned() ) + { + return; + } + else + { + prevorigin = self.origin; + } + } } voidonspawn( unused0, unused1 ) { - } deleteent( attacker, emp ) { - self delete(); + self delete(); } clearfxondeath( fx ) { - fx endon( "death" ); - self waittill_any( "death", "hacked" ); - fx delete(); + fx endon( "death" ); + self waittill_any( "death", "hacked" ); + fx delete(); } deleteweaponobjectarray() { - if ( isdefined( self.objectarray ) ) - { - for ( i = 0; i < self.objectarray.size; i++ ) - { - if ( isdefined( self.objectarray[i] ) ) - self.objectarray[i] delete(); - } - } - - self.objectarray = []; + while ( isDefined( self.objectarray ) ) + { + i = 0; + while ( i < self.objectarray.size ) + { + if ( isDefined( self.objectarray[ i ] ) ) + { + self.objectarray[ i ] delete(); + } + i++; + } + } + self.objectarray = []; } claymoredetonate( attacker, weaponname ) { - from_emp = 0; - - if ( !isdefined( from_emp ) || !from_emp ) - { - if ( isdefined( attacker ) ) - { - if ( level.teambased && attacker.team != self.owner.team || attacker != self.owner ) - attacker maps\mp\_challenges::destroyedexplosive(); - } - } - - maps\mp\gametypes_zm\_weaponobjects::weapondetonate( attacker, weaponname ); + from_emp = 0; + if ( !isDefined( from_emp ) || !from_emp ) + { + if ( isDefined( attacker ) ) + { + if ( level.teambased || attacker.team != self.owner.team && attacker != self.owner ) + { + attacker maps/mp/_challenges::destroyedexplosive(); + } + } + } + maps/mp/gametypes_zm/_weaponobjects::weapondetonate( attacker, weaponname ); } weapondetonate( attacker, weaponname ) { - from_emp = 0; - - if ( from_emp ) - { - self delete(); - return; - } - - if ( isdefined( attacker ) ) - self detonate( attacker ); - else if ( isdefined( self.owner ) && isplayer( self.owner ) ) - self detonate( self.owner ); - else - self detonate(); + from_emp = 0; + if ( from_emp ) + { + self delete(); + return; + } + if ( isDefined( attacker ) ) + { + self detonate( attacker ); + } + else if ( isDefined( self.owner ) && isplayer( self.owner ) ) + { + self detonate( self.owner ); + } + else + { + self detonate(); + } } waitanddetonate( object, delay, attacker, weaponname ) { - object endon( "death" ); - object endon( "hacked" ); - from_emp = 0; - - if ( from_emp ) - { - object setclientflag( 15 ); - object setclientflag( 9 ); - object.stun_fx = 1; - - if ( isdefined( object.name ) && object.name == "qrdrone_turret_mp" ) - playfx( level._equipment_emp_destroy_fx, object.origin + ( 0, 0, 0 ), ( 0, randomfloat( 360 ), 0 ) ); - else - playfx( level._equipment_emp_destroy_fx, object.origin + vectorscale( ( 0, 0, 1 ), 5.0 ), ( 0, randomfloat( 360 ), 0 ) ); - - delay = 1.1; - } - - if ( delay ) - wait( delay ); - - if ( isdefined( object.detonated ) && object.detonated == 1 ) - return; - - if ( !isdefined( self.detonate ) ) - return; - - if ( isdefined( attacker ) && isplayer( attacker ) && isdefined( attacker.pers["team"] ) && isdefined( object.owner ) && isdefined( object.owner.pers["team"] ) ) - { - if ( level.teambased ) - { - if ( attacker.pers["team"] != object.owner.pers["team"] ) - attacker notify( "destroyed_explosive" ); - } - else if ( attacker != object.owner ) - attacker notify( "destroyed_explosive" ); - } - - object.detonated = 1; - object [[ self.detonate ]]( attacker, weaponname ); + object endon( "death" ); + object endon( "hacked" ); + from_emp = 0; + if ( from_emp ) + { + object setclientflag( 15 ); + object setclientflag( 9 ); + object.stun_fx = 1; + if ( isDefined( object.name ) && object.name == "qrdrone_turret_mp" ) + { + playfx( level._equipment_emp_destroy_fx, object.origin + ( 0, 0, 1 ), ( 0, randomfloat( 360 ), 0 ) ); + } + else + { + playfx( level._equipment_emp_destroy_fx, object.origin + vectorScale( ( 0, 0, 1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) ); + } + delay = 1,1; + } + if ( delay ) + { + wait delay; + } + if ( isDefined( object.detonated ) && object.detonated == 1 ) + { + return; + } + if ( !isDefined( self.detonate ) ) + { + return; + } + if ( isDefined( attacker ) && isplayer( attacker ) && isDefined( attacker.pers[ "team" ] ) && isDefined( object.owner ) && isDefined( object.owner.pers[ "team" ] ) ) + { + if ( level.teambased ) + { + if ( attacker.pers[ "team" ] != object.owner.pers[ "team" ] ) + { + attacker notify( "destroyed_explosive" ); + } + } + else + { + if ( attacker != object.owner ) + { + attacker notify( "destroyed_explosive" ); + } + } + } + object.detonated = 1; + object [[ self.detonate ]]( attacker, weaponname ); } detonateweaponobjectarray( forcedetonation, weapon ) { - undetonated = []; - - if ( isdefined( self.objectarray ) ) - { - for ( i = 0; i < self.objectarray.size; i++ ) - { - if ( isdefined( self.objectarray[i] ) ) - { - if ( self.objectarray[i] isstunned() && forcedetonation == 0 ) - { - undetonated[undetonated.size] = self.objectarray[i]; - continue; - } - - if ( isdefined( weapon ) ) - { - if ( weapon ishacked() && weapon.name != self.objectarray[i].name ) - { - undetonated[undetonated.size] = self.objectarray[i]; - continue; - } - else if ( self.objectarray[i] ishacked() && weapon.name != self.objectarray[i].name ) - { - undetonated[undetonated.size] = self.objectarray[i]; - continue; - } - } - - self thread waitanddetonate( self.objectarray[i], 0.1, undefined, weapon ); - } - } - } - - self.objectarray = undetonated; + undetonated = []; + while ( isDefined( self.objectarray ) ) + { + i = 0; + while ( i < self.objectarray.size ) + { + if ( isDefined( self.objectarray[ i ] ) ) + { + if ( self.objectarray[ i ] isstunned() && forcedetonation == 0 ) + { + undetonated[ undetonated.size ] = self.objectarray[ i ]; + i++; + continue; + } + else + { + if ( isDefined( weapon ) ) + { + if ( weapon ishacked() && weapon.name != self.objectarray[ i ].name ) + { + undetonated[ undetonated.size ] = self.objectarray[ i ]; + i++; + continue; + } + else if ( self.objectarray[ i ] ishacked() && weapon.name != self.objectarray[ i ].name ) + { + undetonated[ undetonated.size ] = self.objectarray[ i ]; + i++; + continue; + } + } + else + { + self thread waitanddetonate( self.objectarray[ i ], 0,1, undefined, weapon ); + } + } + } + i++; + } + } + self.objectarray = undetonated; } addweaponobjecttowatcher( watchername, weapon ) { - watcher = getweaponobjectwatcher( watchername ); + watcher = getweaponobjectwatcher( watchername ); /# - assert( isdefined( watcher ), "Weapon object watcher " + watchername + " does not exist" ); + assert( isDefined( watcher ), "Weapon object watcher " + watchername + " does not exist" ); #/ - self addweaponobject( watcher, weapon ); + self addweaponobject( watcher, weapon ); } addweaponobject( watcher, weapon ) { - if ( !isdefined( watcher.storedifferentobject ) ) - watcher.objectarray[watcher.objectarray.size] = weapon; - - weapon.owner = self; - weapon.detonated = 0; - weapon.name = watcher.weapon; - - if ( isdefined( watcher.ondamage ) ) - weapon thread [[ watcher.ondamage ]]( watcher ); - else - weapon thread weaponobjectdamage( watcher ); - - weapon.ownergetsassist = watcher.ownergetsassist; - - if ( isdefined( watcher.onspawn ) ) - weapon thread [[ watcher.onspawn ]]( watcher, self ); - - if ( isdefined( watcher.onspawnfx ) ) - weapon thread [[ watcher.onspawnfx ]](); - - if ( isdefined( watcher.reconmodel ) ) - weapon thread attachreconmodel( watcher.reconmodel, self ); - - if ( isdefined( watcher.onspawnretrievetriggers ) ) - weapon thread [[ watcher.onspawnretrievetriggers ]]( watcher, self ); - - if ( watcher.hackable ) - weapon thread hackerinit( watcher ); - - if ( isdefined( watcher.stun ) ) - weapon thread watchscramble( watcher ); - - if ( watcher.playdestroyeddialog ) - { - weapon thread playdialogondeath( self ); - weapon thread watchobjectdamage( self ); - } - - if ( watcher.deleteonkillbrush ) - weapon thread deleteonkillbrush( self ); + if ( !isDefined( watcher.storedifferentobject ) ) + { + watcher.objectarray[ watcher.objectarray.size ] = weapon; + } + weapon.owner = self; + weapon.detonated = 0; + weapon.name = watcher.weapon; + if ( isDefined( watcher.ondamage ) ) + { + weapon thread [[ watcher.ondamage ]]( watcher ); + } + else + { + weapon thread weaponobjectdamage( watcher ); + } + weapon.ownergetsassist = watcher.ownergetsassist; + if ( isDefined( watcher.onspawn ) ) + { + weapon thread [[ watcher.onspawn ]]( watcher, self ); + } + if ( isDefined( watcher.onspawnfx ) ) + { + weapon thread [[ watcher.onspawnfx ]](); + } + if ( isDefined( watcher.reconmodel ) ) + { + weapon thread attachreconmodel( watcher.reconmodel, self ); + } + if ( isDefined( watcher.onspawnretrievetriggers ) ) + { + weapon thread [[ watcher.onspawnretrievetriggers ]]( watcher, self ); + } + if ( watcher.hackable ) + { + weapon thread hackerinit( watcher ); + } + if ( isDefined( watcher.stun ) ) + { + weapon thread watchscramble( watcher ); + } + if ( watcher.playdestroyeddialog ) + { + weapon thread playdialogondeath( self ); + weapon thread watchobjectdamage( self ); + } + if ( watcher.deleteonkillbrush ) + { + weapon thread deleteonkillbrush( self ); + } } watchscramble( watcher ) { - } deleteweaponobjecthelper( weapon_ent ) { - if ( !isdefined( weapon_ent.name ) ) - return; - - watcher = self getweaponobjectwatcherbyweapon( weapon_ent.name ); - - if ( !isdefined( watcher ) ) - return; - - watcher.objectarray = deleteweaponobject( watcher, weapon_ent ); + if ( !isDefined( weapon_ent.name ) ) + { + return; + } + watcher = self getweaponobjectwatcherbyweapon( weapon_ent.name ); + if ( !isDefined( watcher ) ) + { + return; + } + watcher.objectarray = deleteweaponobject( watcher, weapon_ent ); } deleteweaponobject( watcher, weapon_ent ) { - temp_objectarray = watcher.objectarray; - watcher.objectarray = []; - j = 0; - - for ( i = 0; i < temp_objectarray.size; i++ ) - { - if ( !isdefined( temp_objectarray[i] ) || temp_objectarray[i] == weapon_ent ) - continue; - - watcher.objectarray[j] = temp_objectarray[i]; - j++; - } - - return watcher.objectarray; + temp_objectarray = watcher.objectarray; + watcher.objectarray = []; + j = 0; + i = 0; + while ( i < temp_objectarray.size ) + { + if ( !isDefined( temp_objectarray[ i ] ) || temp_objectarray[ i ] == weapon_ent ) + { + i++; + continue; + } + else + { + watcher.objectarray[ j ] = temp_objectarray[ i ]; + j++; + } + i++; + } + return watcher.objectarray; } weaponobjectdamage( watcher ) { - self endon( "death" ); - self endon( "hacked" ); - self setcandamage( 1 ); - self.maxhealth = 100000; - self.health = self.maxhealth; - attacker = undefined; - - while ( true ) - { - self waittill( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, weaponname, idflags ); - - if ( isdefined( weaponname ) ) - { - switch ( weaponname ) - { - case "proximity_grenade_mp": - case "flash_grenade_mp": - case "concussion_grenade_mp": - if ( watcher.stuntime > 0 ) - self thread stunstart( watcher, watcher.stuntime ); - - if ( level.teambased && self.owner.team != attacker.team ) - { - if ( maps\mp\gametypes_zm\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - attacker maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback(); - } - else if ( !level.teambased && self.owner != attacker ) - { - if ( maps\mp\gametypes_zm\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - attacker maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback(); - } - - continue; - case "willy_pete_mp": - continue; - case "emp_grenade_mp": - if ( level.teambased && self.owner.team != attacker.team ) - { - if ( maps\mp\gametypes_zm\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - attacker maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback(); - } - else if ( !level.teambased && self.owner != attacker ) - { - if ( maps\mp\gametypes_zm\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - attacker maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback(); - } - - break; - default: - break; - } - } - - if ( !isplayer( attacker ) && isdefined( attacker.owner ) ) - attacker = attacker.owner; - - if ( level.teambased && isplayer( attacker ) ) - { - if ( !level.hardcoremode && self.owner.team == attacker.pers["team"] && self.owner != attacker ) - continue; - } - - if ( maps\mp\gametypes_zm\_globallogic_player::dodamagefeedback( weaponname, attacker ) ) - attacker maps\mp\gametypes_zm\_damagefeedback::updatedamagefeedback(); - - if ( !isvehicle( self ) && !friendlyfirecheck( self.owner, attacker ) ) - continue; - - break; - } - - if ( level.weaponobjectexplodethisframe ) - wait( 0.1 + randomfloat( 0.4 ) ); - else - wait 0.05; - - if ( !isdefined( self ) ) - return; - - level.weaponobjectexplodethisframe = 1; - thread resetweaponobjectexplodethisframe(); - - if ( isdefined( type ) && ( issubstr( type, "MOD_GRENADE_SPLASH" ) || issubstr( type, "MOD_GRENADE" ) || issubstr( type, "MOD_EXPLOSIVE" ) ) ) - self.waschained = 1; - - if ( isdefined( idflags ) && idflags & level.idflags_penetration ) - self.wasdamagedfrombulletpenetration = 1; - - self.wasdamaged = 1; - watcher thread waitanddetonate( self, 0.0, attacker, weaponname ); + self endon( "death" ); + self endon( "hacked" ); + self setcandamage( 1 ); + self.maxhealth = 100000; + self.health = self.maxhealth; + attacker = undefined; + for ( ;; ) + { + while ( 1 ) + { + self waittill( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, weaponname, idflags ); + if ( isDefined( weaponname ) ) + { + switch( weaponname ) + { + case "concussion_grenade_mp": + case "flash_grenade_mp": + case "proximity_grenade_mp": + if ( watcher.stuntime > 0 ) + { + self thread stunstart( watcher, watcher.stuntime ); + } + if ( level.teambased && self.owner.team != attacker.team ) + { + if ( maps/mp/gametypes_zm/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + { + attacker maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback(); + } + continue; + } + else + { + if ( !level.teambased && self.owner != attacker ) + { + if ( maps/mp/gametypes_zm/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + { + attacker maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback(); + } + } + } + } + case "willy_pete_mp": + } + case "emp_grenade_mp": + if ( level.teambased && self.owner.team != attacker.team ) + { + if ( maps/mp/gametypes_zm/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + { + attacker maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback(); + } + } + else if ( !level.teambased && self.owner != attacker ) + { + if ( maps/mp/gametypes_zm/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + { + attacker maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback(); + } + } + break; + break; + default: + } + } + if ( !isplayer( attacker ) && isDefined( attacker.owner ) ) + { + attacker = attacker.owner; + } + while ( level.teambased && isplayer( attacker ) ) + { + while ( !level.hardcoremode && self.owner.team == attacker.pers[ "team" ] && self.owner != attacker ) + { + continue; + } + } + if ( maps/mp/gametypes_zm/_globallogic_player::dodamagefeedback( weaponname, attacker ) ) + { + attacker maps/mp/gametypes_zm/_damagefeedback::updatedamagefeedback(); + } + if ( !isvehicle( self ) && !friendlyfirecheck( self.owner, attacker ) ) + { + continue; + } + } + if ( level.weaponobjectexplodethisframe ) + { + wait ( 0,1 + randomfloat( 0,4 ) ); + } + else wait 0,05; + if ( !isDefined( self ) ) + { + return; + } + level.weaponobjectexplodethisframe = 1; + thread resetweaponobjectexplodethisframe(); + if ( isDefined( type ) && !issubstr( type, "MOD_GRENADE_SPLASH" ) || issubstr( type, "MOD_GRENADE" ) && issubstr( type, "MOD_EXPLOSIVE" ) ) + { + self.waschained = 1; + } + if ( isDefined( idflags ) && idflags & level.idflags_penetration ) + { + self.wasdamagedfrombulletpenetration = 1; + } + self.wasdamaged = 1; + watcher thread waitanddetonate( self, 0, attacker, weaponname ); + } + } } playdialogondeath( owner ) { - owner endon( "death" ); - owner endon( "disconnect" ); - self endon( "hacked" ); - - self waittill( "death" ); - - if ( isdefined( self.playdialog ) && self.playdialog ) - owner maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" ); + owner endon( "death" ); + owner endon( "disconnect" ); + self endon( "hacked" ); + self waittill( "death" ); + if ( isDefined( self.playdialog ) && self.playdialog ) + { + owner maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" ); + } } watchobjectdamage( owner ) { - owner endon( "death" ); - owner endon( "disconnect" ); - self endon( "hacked" ); - self endon( "death" ); - - while ( true ) - { - self waittill( "damage", damage, attacker ); - - if ( isdefined( attacker ) && isplayer( attacker ) && attacker != owner ) - self.playdialog = 1; - else - self.playdialog = 0; - } + owner endon( "death" ); + owner endon( "disconnect" ); + self endon( "hacked" ); + self endon( "death" ); + while ( 1 ) + { + self waittill( "damage", damage, attacker ); + if ( isDefined( attacker ) && isplayer( attacker ) && attacker != owner ) + { + self.playdialog = 1; + continue; + } + else + { + self.playdialog = 0; + } + } } stunstart( watcher, time ) { - self endon( "death" ); - - if ( self isstunned() ) - return; - - if ( isdefined( self.camerahead ) ) - self.camerahead setclientflag( 9 ); - - self setclientflag( 9 ); - - if ( isdefined( watcher.stun ) ) - self thread [[ watcher.stun ]](); - - if ( watcher.name == "rcbomb" ) - self.owner freezecontrolswrapper( 1 ); - - if ( isdefined( time ) ) - wait( time ); - else - return; - - if ( watcher.name == "rcbomb" ) - self.owner freezecontrolswrapper( 0 ); - - self stunstop(); + self endon( "death" ); + if ( self isstunned() ) + { + return; + } + if ( isDefined( self.camerahead ) ) + { + self.camerahead setclientflag( 9 ); + } + self setclientflag( 9 ); + if ( isDefined( watcher.stun ) ) + { + self thread [[ watcher.stun ]](); + } + if ( watcher.name == "rcbomb" ) + { + self.owner freezecontrolswrapper( 1 ); + } + if ( isDefined( time ) ) + { + wait time; + } + else + { + return; + } + if ( watcher.name == "rcbomb" ) + { + self.owner freezecontrolswrapper( 0 ); + } + self stunstop(); } stunstop() { - self notify( "not_stunned" ); - - if ( isdefined( self.camerahead ) ) - self.camerahead clearclientflag( 9 ); - - self clearclientflag( 9 ); + self notify( "not_stunned" ); + if ( isDefined( self.camerahead ) ) + { + self.camerahead clearclientflag( 9 ); + } + self clearclientflag( 9 ); } weaponstun() { - self endon( "death" ); - self endon( "not_stunned" ); - origin = self gettagorigin( "tag_fx" ); - - if ( !isdefined( origin ) ) - origin = self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); - - self.stun_fx = spawn( "script_model", origin ); - self.stun_fx setmodel( "tag_origin" ); - self thread stunfxthink( self.stun_fx ); - wait 0.1; - playfxontag( level._equipment_spark_fx, self.stun_fx, "tag_origin" ); - self.stun_fx playsound( "dst_disable_spark" ); + self endon( "death" ); + self endon( "not_stunned" ); + origin = self gettagorigin( "tag_fx" ); + if ( !isDefined( origin ) ) + { + origin = self.origin + vectorScale( ( 0, 0, 1 ), 10 ); + } + self.stun_fx = spawn( "script_model", origin ); + self.stun_fx setmodel( "tag_origin" ); + self thread stunfxthink( self.stun_fx ); + wait 0,1; + playfxontag( level._equipment_spark_fx, self.stun_fx, "tag_origin" ); + self.stun_fx playsound( "dst_disable_spark" ); } stunfxthink( fx ) { - fx endon( "death" ); - self waittill_any( "death", "not_stunned" ); - fx delete(); + fx endon( "death" ); + self waittill_any( "death", "not_stunned" ); + fx delete(); } isstunned() { - return isdefined( self.stun_fx ); + return isDefined( self.stun_fx ); } resetweaponobjectexplodethisframe() { - wait 0.05; - level.weaponobjectexplodethisframe = 0; + wait 0,05; + level.weaponobjectexplodethisframe = 0; } getweaponobjectwatcher( name ) { - if ( !isdefined( self.weaponobjectwatcherarray ) ) - return undefined; - - for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) - { - if ( self.weaponobjectwatcherarray[watcher].name == name ) - return self.weaponobjectwatcherarray[watcher]; - } - - return undefined; + if ( !isDefined( self.weaponobjectwatcherarray ) ) + { + return undefined; + } + watcher = 0; + while ( watcher < self.weaponobjectwatcherarray.size ) + { + if ( self.weaponobjectwatcherarray[ watcher ].name == name ) + { + return self.weaponobjectwatcherarray[ watcher ]; + } + watcher++; + } + return undefined; } getweaponobjectwatcherbyweapon( weapon ) { - if ( !isdefined( self.weaponobjectwatcherarray ) ) - return undefined; - - for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) - { - if ( isdefined( self.weaponobjectwatcherarray[watcher].weapon ) && self.weaponobjectwatcherarray[watcher].weapon == weapon ) - return self.weaponobjectwatcherarray[watcher]; - - if ( isdefined( self.weaponobjectwatcherarray[watcher].weapon ) && isdefined( self.weaponobjectwatcherarray[watcher].altweapon ) && self.weaponobjectwatcherarray[watcher].altweapon == weapon ) - return self.weaponobjectwatcherarray[watcher]; - } - - return undefined; + if ( !isDefined( self.weaponobjectwatcherarray ) ) + { + return undefined; + } + watcher = 0; + while ( watcher < self.weaponobjectwatcherarray.size ) + { + if ( isDefined( self.weaponobjectwatcherarray[ watcher ].weapon ) && self.weaponobjectwatcherarray[ watcher ].weapon == weapon ) + { + return self.weaponobjectwatcherarray[ watcher ]; + } + if ( isDefined( self.weaponobjectwatcherarray[ watcher ].weapon ) && isDefined( self.weaponobjectwatcherarray[ watcher ].altweapon ) && self.weaponobjectwatcherarray[ watcher ].altweapon == weapon ) + { + return self.weaponobjectwatcherarray[ watcher ]; + } + watcher++; + } + return undefined; } resetweaponobjectwatcher( watcher, ownerteam ) { - if ( level.deleteexplosivesonspawn == 1 ) - { - self notify( "weapon_object_destroyed" ); - watcher deleteweaponobjectarray(); - } - - watcher.ownerteam = ownerteam; + if ( level.deleteexplosivesonspawn == 1 ) + { + self notify( "weapon_object_destroyed" ); + watcher deleteweaponobjectarray(); + } + watcher.ownerteam = ownerteam; } createweaponobjectwatcher( name, weapon, ownerteam ) { - if ( !isdefined( self.weaponobjectwatcherarray ) ) - self.weaponobjectwatcherarray = []; - - weaponobjectwatcher = getweaponobjectwatcher( name ); - - if ( !isdefined( weaponobjectwatcher ) ) - { - weaponobjectwatcher = spawnstruct(); - self.weaponobjectwatcherarray[self.weaponobjectwatcherarray.size] = weaponobjectwatcher; - weaponobjectwatcher.name = name; - weaponobjectwatcher.type = "use"; - weaponobjectwatcher.weapon = weapon; - weaponobjectwatcher.weaponidx = getweaponindexfromname( weapon ); - weaponobjectwatcher.watchforfire = 0; - weaponobjectwatcher.hackable = 0; - weaponobjectwatcher.altdetonate = 0; - weaponobjectwatcher.detectable = 1; - weaponobjectwatcher.headicon = 1; - weaponobjectwatcher.stuntime = 0; - weaponobjectwatcher.activatesound = undefined; - weaponobjectwatcher.ignoredirection = undefined; - weaponobjectwatcher.immediatedetonation = undefined; - weaponobjectwatcher.deploysound = getweaponfiresound( weaponobjectwatcher.weaponidx ); - weaponobjectwatcher.deploysoundplayer = getweaponfiresoundplayer( weaponobjectwatcher.weaponidx ); - weaponobjectwatcher.pickupsound = getweaponpickupsound( weaponobjectwatcher.weaponidx ); - weaponobjectwatcher.pickupsoundplayer = getweaponpickupsoundplayer( weaponobjectwatcher.weaponidx ); - weaponobjectwatcher.altweapon = undefined; - weaponobjectwatcher.ownergetsassist = 0; - weaponobjectwatcher.playdestroyeddialog = 1; - weaponobjectwatcher.deleteonkillbrush = 1; - weaponobjectwatcher.deleteondifferentobjectspawn = 1; - weaponobjectwatcher.enemydestroy = 0; - weaponobjectwatcher.onspawn = undefined; - weaponobjectwatcher.onspawnfx = undefined; - weaponobjectwatcher.onspawnretrievetriggers = undefined; - weaponobjectwatcher.ondetonated = undefined; - weaponobjectwatcher.detonate = undefined; - weaponobjectwatcher.stun = undefined; - weaponobjectwatcher.ondestroyed = undefined; - - if ( !isdefined( weaponobjectwatcher.objectarray ) ) - weaponobjectwatcher.objectarray = []; - } - - resetweaponobjectwatcher( weaponobjectwatcher, ownerteam ); - return weaponobjectwatcher; + if ( !isDefined( self.weaponobjectwatcherarray ) ) + { + self.weaponobjectwatcherarray = []; + } + weaponobjectwatcher = getweaponobjectwatcher( name ); + if ( !isDefined( weaponobjectwatcher ) ) + { + weaponobjectwatcher = spawnstruct(); + self.weaponobjectwatcherarray[ self.weaponobjectwatcherarray.size ] = weaponobjectwatcher; + weaponobjectwatcher.name = name; + weaponobjectwatcher.type = "use"; + weaponobjectwatcher.weapon = weapon; + weaponobjectwatcher.weaponidx = getweaponindexfromname( weapon ); + weaponobjectwatcher.watchforfire = 0; + weaponobjectwatcher.hackable = 0; + weaponobjectwatcher.altdetonate = 0; + weaponobjectwatcher.detectable = 1; + weaponobjectwatcher.headicon = 1; + weaponobjectwatcher.stuntime = 0; + weaponobjectwatcher.activatesound = undefined; + weaponobjectwatcher.ignoredirection = undefined; + weaponobjectwatcher.immediatedetonation = undefined; + weaponobjectwatcher.deploysound = getweaponfiresound( weaponobjectwatcher.weaponidx ); + weaponobjectwatcher.deploysoundplayer = getweaponfiresoundplayer( weaponobjectwatcher.weaponidx ); + weaponobjectwatcher.pickupsound = getweaponpickupsound( weaponobjectwatcher.weaponidx ); + weaponobjectwatcher.pickupsoundplayer = getweaponpickupsoundplayer( weaponobjectwatcher.weaponidx ); + weaponobjectwatcher.altweapon = undefined; + weaponobjectwatcher.ownergetsassist = 0; + weaponobjectwatcher.playdestroyeddialog = 1; + weaponobjectwatcher.deleteonkillbrush = 1; + weaponobjectwatcher.deleteondifferentobjectspawn = 1; + weaponobjectwatcher.enemydestroy = 0; + weaponobjectwatcher.onspawn = undefined; + weaponobjectwatcher.onspawnfx = undefined; + weaponobjectwatcher.onspawnretrievetriggers = undefined; + weaponobjectwatcher.ondetonated = undefined; + weaponobjectwatcher.detonate = undefined; + weaponobjectwatcher.stun = undefined; + weaponobjectwatcher.ondestroyed = undefined; + if ( !isDefined( weaponobjectwatcher.objectarray ) ) + { + weaponobjectwatcher.objectarray = []; + } + } + resetweaponobjectwatcher( weaponobjectwatcher, ownerteam ); + return weaponobjectwatcher; } createuseweaponobjectwatcher( name, weapon, ownerteam ) { - weaponobjectwatcher = createweaponobjectwatcher( name, weapon, ownerteam ); - weaponobjectwatcher.type = "use"; - weaponobjectwatcher.onspawn = ::onspawnuseweaponobject; - return weaponobjectwatcher; + weaponobjectwatcher = createweaponobjectwatcher( name, weapon, ownerteam ); + weaponobjectwatcher.type = "use"; + weaponobjectwatcher.onspawn = ::onspawnuseweaponobject; + return weaponobjectwatcher; } createproximityweaponobjectwatcher( name, weapon, ownerteam ) { - weaponobjectwatcher = createweaponobjectwatcher( name, weapon, ownerteam ); - weaponobjectwatcher.type = "proximity"; - weaponobjectwatcher.onspawn = ::onspawnproximityweaponobject; - detectionconeangle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); - weaponobjectwatcher.detectiondot = cos( detectionconeangle ); - weaponobjectwatcher.detectionmindist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); - weaponobjectwatcher.detectiongraceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); - weaponobjectwatcher.detonateradius = weapons_get_dvar_int( "scr_weaponobject_radius" ); - return weaponobjectwatcher; + weaponobjectwatcher = createweaponobjectwatcher( name, weapon, ownerteam ); + weaponobjectwatcher.type = "proximity"; + weaponobjectwatcher.onspawn = ::onspawnproximityweaponobject; + detectionconeangle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); + weaponobjectwatcher.detectiondot = cos( detectionconeangle ); + weaponobjectwatcher.detectionmindist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); + weaponobjectwatcher.detectiongraceperiod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); + weaponobjectwatcher.detonateradius = weapons_get_dvar_int( "scr_weaponobject_radius" ); + return weaponobjectwatcher; } commononspawnuseweaponobject( watcher, owner ) { - if ( watcher.detectable ) - { - if ( isdefined( watcher.ismovable ) && watcher.ismovable ) - self thread weaponobjectdetectionmovable( owner.pers["team"] ); - else - self thread weaponobjectdetectiontrigger_wait( owner.pers["team"] ); - - if ( watcher.headicon && level.teambased ) - { - self waittillnotmoving(); - offset = level.weaponobjects_headicon_offset["default"]; - - if ( isdefined( level.weaponobjects_headicon_offset[self.name] ) ) - offset = level.weaponobjects_headicon_offset[self.name]; - } - } + if ( watcher.detectable ) + { + if ( isDefined( watcher.ismovable ) && watcher.ismovable ) + { + self thread weaponobjectdetectionmovable( owner.pers[ "team" ] ); + } + else + { + self thread weaponobjectdetectiontrigger_wait( owner.pers[ "team" ] ); + } + if ( watcher.headicon && level.teambased ) + { + self waittillnotmoving(); + offset = level.weaponobjects_headicon_offset[ "default" ]; + if ( isDefined( level.weaponobjects_headicon_offset[ self.name ] ) ) + { + offset = level.weaponobjects_headicon_offset[ self.name ]; + } + } + } } onspawnuseweaponobject( watcher, owner ) { - self commononspawnuseweaponobject( watcher, owner ); + self commononspawnuseweaponobject( watcher, owner ); } onspawnproximityweaponobject( watcher, owner ) { - self thread commononspawnuseweaponobject( watcher, owner ); - self thread proximityweaponobjectdetonation( watcher ); + self thread commononspawnuseweaponobject( watcher, owner ); + self thread proximityweaponobjectdetonation( watcher ); /# - if ( getdvarint( "scr_weaponobject_debug" ) ) - self thread proximityweaponobjectdebug( watcher ); + if ( getDvarInt( #"38868733" ) ) + { + self thread proximityweaponobjectdebug( watcher ); #/ + } } watchweaponobjectusage() { - self endon( "disconnect" ); - - if ( !isdefined( self.weaponobjectwatcherarray ) ) - self.weaponobjectwatcherarray = []; - - self thread watchweaponobjectspawn(); - self thread watchweaponprojectileobjectspawn(); - self thread watchweaponobjectdetonation(); - self thread watchweaponobjectaltdetonation(); - self thread watchweaponobjectaltdetonate(); - self thread deleteweaponobjectson(); + self endon( "disconnect" ); + if ( !isDefined( self.weaponobjectwatcherarray ) ) + { + self.weaponobjectwatcherarray = []; + } + self thread watchweaponobjectspawn(); + self thread watchweaponprojectileobjectspawn(); + self thread watchweaponobjectdetonation(); + self thread watchweaponobjectaltdetonation(); + self thread watchweaponobjectaltdetonate(); + self thread deleteweaponobjectson(); } watchweaponobjectspawn() { - self notify( "watchWeaponObjectSpawn" ); - self endon( "watchWeaponObjectSpawn" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "grenade_fire", weapon, weapname ); - - switch ( weapname ) - { - case "tactical_insertion_mp": - case "scrambler_mp": - case "camera_spike_mp": - case "bouncingbetty_mp": - case "acoustic_sensor_mp": - break; - case "trophy_system_mp": - case "sensor_grenade_mp": - case "satchel_charge_mp": - case "proximity_grenade_mp": - case "claymore_mp": - case "bouncingbetty_mp": - for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) - { - if ( self.weaponobjectwatcherarray[i].weapon != weapname ) - continue; - - objectarray_size = self.weaponobjectwatcherarray[i].objectarray.size; - - for ( j = 0; j < objectarray_size; j++ ) - { - if ( !isdefined( self.weaponobjectwatcherarray[i].objectarray[j] ) ) - self.weaponobjectwatcherarray[i].objectarray = deleteweaponobject( self.weaponobjectwatcherarray[i], weapon ); - } - - numallowed = 2; - - if ( weapname == "proximity_grenade_mp" ) - numallowed = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances" ); - - if ( isdefined( self.weaponobjectwatcherarray[i].detonate ) && self.weaponobjectwatcherarray[i].objectarray.size > numallowed - 1 ) - self.weaponobjectwatcherarray[i] thread waitanddetonate( self.weaponobjectwatcherarray[i].objectarray[0], 0.1, undefined, weapname ); - } - - break; - default: - break; - } - - if ( !self ishacked() ) - { - if ( weapname == "claymore_mp" || weapname == "satchel_charge_mp" || weapname == "bouncingbetty_mp" ) - self addweaponstat( weapname, "used", 1 ); - } - - watcher = getweaponobjectwatcherbyweapon( weapname ); - - if ( isdefined( watcher ) ) - self addweaponobject( watcher, weapon ); - } + self notify( "watchWeaponObjectSpawn" ); + self endon( "watchWeaponObjectSpawn" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "grenade_fire", weapon, weapname ); + switch( weapname ) + { + case "acoustic_sensor_mp": + case "bouncingbetty_mp": + case "camera_spike_mp": + case "scrambler_mp": + case "tactical_insertion_mp": + break; + case "bouncingbetty_mp": + case "claymore_mp": + case "proximity_grenade_mp": + case "satchel_charge_mp": + case "sensor_grenade_mp": + case "trophy_system_mp": + i = 0; + while ( i < self.weaponobjectwatcherarray.size ) + { + if ( self.weaponobjectwatcherarray[ i ].weapon != weapname ) + { + i++; + continue; + } + else + { + objectarray_size = self.weaponobjectwatcherarray[ i ].objectarray.size; + j = 0; + while ( j < objectarray_size ) + { + if ( !isDefined( self.weaponobjectwatcherarray[ i ].objectarray[ j ] ) ) + { + self.weaponobjectwatcherarray[ i ].objectarray = deleteweaponobject( self.weaponobjectwatcherarray[ i ], weapon ); + } + j++; + } + numallowed = 2; + if ( weapname == "proximity_grenade_mp" ) + { + numallowed = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances" ); + } + if ( isDefined( self.weaponobjectwatcherarray[ i ].detonate ) && self.weaponobjectwatcherarray[ i ].objectarray.size > ( numallowed - 1 ) ) + { + self.weaponobjectwatcherarray[ i ] thread waitanddetonate( self.weaponobjectwatcherarray[ i ].objectarray[ 0 ], 0,1, undefined, weapname ); + } + } + i++; + } + default: + } + if ( !self ishacked() ) + { + if ( weapname != "claymore_mp" || weapname == "satchel_charge_mp" && weapname == "bouncingbetty_mp" ) + { + self addweaponstat( weapname, "used", 1 ); + } + } + watcher = getweaponobjectwatcherbyweapon( weapname ); + if ( isDefined( watcher ) ) + { + self addweaponobject( watcher, weapon ); + } + } + } + } } watchweaponprojectileobjectspawn() { - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "missile_fire", weapon, weapname ); - - watcher = getweaponobjectwatcherbyweapon( weapname ); - - if ( isdefined( watcher ) ) - { - self addweaponobject( watcher, weapon ); - objectarray_size = watcher.objectarray.size; - - for ( j = 0; j < objectarray_size; j++ ) - { - if ( !isdefined( watcher.objectarray[j] ) ) - watcher.objectarray = deleteweaponobject( watcher, weapon ); - } - - if ( isdefined( watcher.detonate ) && watcher.objectarray.size > 1 ) - watcher thread waitanddetonate( watcher.objectarray[0], 0.1 ); - } - } + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "missile_fire", weapon, weapname ); + watcher = getweaponobjectwatcherbyweapon( weapname ); + if ( isDefined( watcher ) ) + { + self addweaponobject( watcher, weapon ); + objectarray_size = watcher.objectarray.size; + j = 0; + while ( j < objectarray_size ) + { + if ( !isDefined( watcher.objectarray[ j ] ) ) + { + watcher.objectarray = deleteweaponobject( watcher, weapon ); + } + j++; + } + if ( isDefined( watcher.detonate ) && watcher.objectarray.size > 1 ) + { + watcher thread waitanddetonate( watcher.objectarray[ 0 ], 0,1 ); + } + } + } } proximityweaponobjectdebug( watcher ) { /# - self waittillnotmoving(); - self thread showcone( acos( watcher.detectiondot ), watcher.detonateradius, ( 1, 0.85, 0 ) ); - self thread showcone( 60, 256, ( 1, 0, 0 ) ); + self waittillnotmoving(); + self thread showcone( acos( watcher.detectiondot ), watcher.detonateradius, ( 1, 0,85, 0 ) ); + self thread showcone( 60, 256, ( 0, 0, 1 ) ); #/ } vectorcross( v1, v2 ) { /# - return ( v1[1] * v2[2] - v1[2] * v2[1], v1[2] * v2[0] - v1[0] * v2[2], v1[0] * v2[1] - v1[1] * v2[0] ); + return ( ( v1[ 1 ] * v2[ 2 ] ) - ( v1[ 2 ] * v2[ 1 ] ), ( v1[ 2 ] * v2[ 0 ] ) - ( v1[ 0 ] * v2[ 2 ] ), ( v1[ 0 ] * v2[ 1 ] ) - ( v1[ 1 ] * v2[ 0 ] ) ); #/ } showcone( angle, range, color ) { /# - self endon( "death" ); - start = self.origin; - forward = anglestoforward( self.angles ); - right = vectorcross( forward, ( 0, 0, 1 ) ); - up = vectorcross( forward, right ); - fullforward = forward * range * cos( angle ); - sideamnt = range * sin( angle ); - - while ( true ) - { - prevpoint = ( 0, 0, 0 ); - - for ( i = 0; i <= 20; i++ ) - { - coneangle = i / 20.0 * 360; - point = start + fullforward + sideamnt * ( right * cos( coneangle ) + up * sin( coneangle ) ); - - if ( i > 0 ) - { - line( start, point, color ); - line( prevpoint, point, color ); - } - - prevpoint = point; - } - - wait 0.05; - } + self endon( "death" ); + start = self.origin; + forward = anglesToForward( self.angles ); + right = vectorcross( forward, ( 0, 0, 1 ) ); + up = vectorcross( forward, right ); + fullforward = forward * range * cos( angle ); + sideamnt = range * sin( angle ); + while ( 1 ) + { + prevpoint = ( 0, 0, 1 ); + i = 0; + while ( i <= 20 ) + { + coneangle = ( i / 20 ) * 360; + point = ( start + fullforward ) + ( sideamnt * ( ( right * cos( coneangle ) ) + ( up * sin( coneangle ) ) ) ); + if ( i > 0 ) + { + line( start, point, color ); + line( prevpoint, point, color ); + } + prevpoint = point; + i++; + } + wait 0,05; #/ + } } weaponobjectdetectionmovable( ownerteam ) { - self endon( "end_detection" ); - level endon( "game_ended" ); - self endon( "death" ); - self endon( "hacked" ); - - if ( level.oldschool ) - return; - - if ( !level.teambased ) - return; - - self.detectid = "rcBomb" + gettime() + randomint( 1000000 ); - - while ( !level.gameended ) - { - wait 1; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( isai( player ) ) - continue; - - if ( isdefined( self.model_name ) && player hasperk( "specialty_detectexplosive" ) ) - { - switch ( self.model_name ) - { - case "t6_wpn_claymore_world_detect": - case "t6_wpn_c4_world_detect": - break; - default: - continue; - } - } - else - continue; - - if ( player.team == ownerteam ) - continue; - - if ( isdefined( player.bombsquadids[self.detectid] ) ) - continue; - } - } + self endon( "end_detection" ); + level endon( "game_ended" ); + self endon( "death" ); + self endon( "hacked" ); + if ( level.oldschool ) + { + return; + } + if ( !level.teambased ) + { + return; + } + self.detectid = "rcBomb" + getTime() + randomint( 1000000 ); + while ( !level.gameended ) + { + wait 1; + players = get_players(); + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + if ( isai( player ) ) + { + i++; + continue; + } + else if ( isDefined( self.model_name ) && player hasperk( "specialty_detectexplosive" ) ) + { + switch( self.model_name ) + { + case "t6_wpn_c4_world_detect": + case "t6_wpn_claymore_world_detect": + break; + default: + } + } + else if ( player.team == ownerteam ) + { + i++; + continue; + } + else if ( isDefined( player.bombsquadids[ self.detectid ] ) ) + { + i++; + continue; + } + i++; + } + } + } } seticonpos( item, icon, heightincrease ) { - icon.x = item.origin[0]; - icon.y = item.origin[1]; - icon.z = item.origin[2] + heightincrease; + icon.x = item.origin[ 0 ]; + icon.y = item.origin[ 1 ]; + icon.z = item.origin[ 2 ] + heightincrease; } weaponobjectdetectiontrigger_wait( ownerteam ) { - self endon( "death" ); - self endon( "hacked" ); - waittillnotmoving(); - - if ( level.oldschool ) - return; - - self thread weaponobjectdetectiontrigger( ownerteam ); + self endon( "death" ); + self endon( "hacked" ); + waittillnotmoving(); + if ( level.oldschool ) + { + return; + } + self thread weaponobjectdetectiontrigger( ownerteam ); } weaponobjectdetectiontrigger( ownerteam ) { - trigger = spawn( "trigger_radius", self.origin - vectorscale( ( 0, 0, 1 ), 128.0 ), 0, 512, 256 ); - trigger.detectid = "trigger" + gettime() + randomint( 1000000 ); - trigger sethintlowpriority( 1 ); - self waittill_any( "death", "hacked" ); - trigger notify( "end_detection" ); - - if ( isdefined( trigger.bombsquadicon ) ) - trigger.bombsquadicon destroy(); - - trigger delete(); + trigger = spawn( "trigger_radius", self.origin - vectorScale( ( 0, 0, 1 ), 128 ), 0, 512, 256 ); + trigger.detectid = "trigger" + getTime() + randomint( 1000000 ); + trigger sethintlowpriority( 1 ); + self waittill_any( "death", "hacked" ); + trigger notify( "end_detection" ); + if ( isDefined( trigger.bombsquadicon ) ) + { + trigger.bombsquadicon destroy(); + } + trigger delete(); } hackertriggersetvisibility( owner ) { - self endon( "death" ); + self endon( "death" ); /# - assert( isplayer( owner ) ); + assert( isplayer( owner ) ); #/ - ownerteam = owner.pers["team"]; - - for (;;) - { - if ( level.teambased ) - { - self setvisibletoallexceptteam( ownerteam ); - self setexcludeteamfortrigger( ownerteam ); - } - else - { - self setvisibletoall(); - self setteamfortrigger( "none" ); - } - - self setinvisibletoplayer( owner ); - level waittill_any( "player_spawned", "joined_team" ); - } + ownerteam = owner.pers[ "team" ]; + for ( ;; ) + { + if ( level.teambased ) + { + self setvisibletoallexceptteam( ownerteam ); + self setexcludeteamfortrigger( ownerteam ); + } + else + { + self setvisibletoall(); + self setteamfortrigger( "none" ); + } + self setinvisibletoplayer( owner ); + level waittill_any( "player_spawned", "joined_team" ); + } } hackernotmoving() { - self endon( "death" ); - self waittillnotmoving(); - self notify( "landed" ); + self endon( "death" ); + self waittillnotmoving(); + self notify( "landed" ); } hackerinit( watcher ) { - self thread hackernotmoving(); - event = self waittill_any_return( "death", "landed" ); - - if ( event == "death" ) - return; - - triggerorigin = self.origin; - - if ( isdefined( self.name ) && self.name == "satchel_charge_mp" ) - triggerorigin = self gettagorigin( "tag_fx" ); - - self.hackertrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height ); + self thread hackernotmoving(); + event = self waittill_any_return( "death", "landed" ); + if ( event == "death" ) + { + return; + } + triggerorigin = self.origin; + if ( isDefined( self.name ) && self.name == "satchel_charge_mp" ) + { + triggerorigin = self gettagorigin( "tag_fx" ); + } + self.hackertrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height ); /# - #/ - self.hackertrigger sethintlowpriority( 1 ); - self.hackertrigger setcursorhint( "HINT_NOICON", self ); - self.hackertrigger setignoreentfortrigger( self ); - self.hackertrigger enablelinkto(); - self.hackertrigger linkto( self ); - - if ( isdefined( level.hackerhints[self.name] ) ) - self.hackertrigger sethintstring( level.hackerhints[self.name].hint ); - else - self.hackertrigger sethintstring( &"MP_GENERIC_HACKING" ); - - self.hackertrigger setperkfortrigger( "specialty_disarmexplosive" ); - self.hackertrigger thread hackertriggersetvisibility( self.owner ); - self thread hackerthink( self.hackertrigger, watcher ); + self.hackertrigger sethintlowpriority( 1 ); + self.hackertrigger setcursorhint( "HINT_NOICON", self ); + self.hackertrigger setignoreentfortrigger( self ); + self.hackertrigger enablelinkto(); + self.hackertrigger linkto( self ); + if ( isDefined( level.hackerhints[ self.name ] ) ) + { + self.hackertrigger sethintstring( level.hackerhints[ self.name ].hint ); + } + else + { + self.hackertrigger sethintstring( &"MP_GENERIC_HACKING" ); + } + self.hackertrigger setperkfortrigger( "specialty_disarmexplosive" ); + self.hackertrigger thread hackertriggersetvisibility( self.owner ); + self thread hackerthink( self.hackertrigger, watcher ); } hackerthink( trigger, watcher ) { - self endon( "death" ); - - for (;;) - { - trigger waittill( "trigger", player, instant ); - - if ( !isdefined( instant ) && !trigger hackerresult( player, self.owner ) ) - continue; - - self.owner hackerremoveweapon( self ); - self.owner maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "hacked_equip", "item_destroyed" ); - self.hacked = 1; - self setmissileowner( player ); - self setteam( player.pers["team"] ); - self.owner = player; - - if ( isweaponequipment( self.name ) ) - { - - } - - if ( self.name == "satchel_charge_mp" && isdefined( player.lowermessage ) ) - { - player.lowermessage settext( &"PLATFORM_SATCHEL_CHARGE_DOUBLE_TAP" ); - player.lowermessage.alpha = 1; - player.lowermessage fadeovertime( 2.0 ); - player.lowermessage.alpha = 0; - } - - self notify( "hacked", player ); - level notify( "hacked", self, player ); - - if ( self.name == "camera_spike_mp" && isdefined( self.camerahead ) ) - self.camerahead notify( "hacked", player ); + self endon( "death" ); + for ( ;; ) + { + trigger waittill( "trigger", player, instant ); + if ( !isDefined( instant ) && !trigger hackerresult( player, self.owner ) ) + { + continue; + } + else + { + self.owner hackerremoveweapon( self ); + self.owner maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "hacked_equip", "item_destroyed" ); + self.hacked = 1; + self setmissileowner( player ); + self setteam( player.pers[ "team" ] ); + self.owner = player; + if ( isweaponequipment( self.name ) ) + { + } + if ( self.name == "satchel_charge_mp" && isDefined( player.lowermessage ) ) + { + player.lowermessage settext( &"PLATFORM_SATCHEL_CHARGE_DOUBLE_TAP" ); + player.lowermessage.alpha = 1; + player.lowermessage fadeovertime( 2 ); + player.lowermessage.alpha = 0; + } + self notify( "hacked" ); + level notify( "hacked" ); + if ( self.name == "camera_spike_mp" && isDefined( self.camerahead ) ) + { + self.camerahead notify( "hacked" ); + } /# - #/ - if ( isdefined( watcher.stun ) ) - { - self thread stunstart( watcher, 0.75 ); - wait 0.75; - } - else - wait 0.05; - - if ( isdefined( player ) && player.sessionstate == "playing" ) - player notify( "grenade_fire", self, self.name ); - else - watcher thread waitanddetonate( self, 0.0 ); - - return; - } + if ( isDefined( watcher.stun ) ) + { + self thread stunstart( watcher, 0,75 ); + wait 0,75; + } + else + { + wait 0,05; + } + if ( isDefined( player ) && player.sessionstate == "playing" ) + { + player notify( "grenade_fire" ); + } + else + { + watcher thread waitanddetonate( self, 0 ); + } + return; + } + } } ishacked() { - return isdefined( self.hacked ) && self.hacked; + if ( isDefined( self.hacked ) ) + { + return self.hacked; + } } hackerunfreezeplayer( player ) { - self endon( "hack_done" ); - - self waittill( "death" ); - - if ( isdefined( player ) ) - { - player freeze_player_controls( 0 ); - player enableweapons(); - } + self endon( "hack_done" ); + self waittill( "death" ); + if ( isDefined( player ) ) + { + player freeze_player_controls( 0 ); + player enableweapons(); + } } hackerresult( player, owner ) { - success = 1; - time = gettime(); - hacktime = getdvarfloat( "perk_disarmExplosiveTime" ); - - if ( !canhack( player, owner, 1 ) ) - return 0; - - self thread hackerunfreezeplayer( player ); - - while ( time + hacktime * 1000 > gettime() ) - { - if ( !canhack( player, owner, 0 ) ) - { - success = 0; - break; - } - - if ( !player usebuttonpressed() ) - { - success = 0; - break; - } - - if ( !isdefined( self ) ) - { - success = 0; - break; - } - - player freeze_player_controls( 1 ); - player disableweapons(); - - if ( !isdefined( self.progressbar ) ) - { - self.progressbar = player createprimaryprogressbar(); - self.progressbar.lastuserate = -1; - self.progressbar showelem(); - self.progressbar updatebar( 0.01, 1 / hacktime ); - self.progresstext = player createprimaryprogressbartext(); - self.progresstext settext( &"MP_HACKING" ); - self.progresstext showelem(); - player playlocalsound( "evt_hacker_hacking" ); - } - - wait 0.05; - } - - if ( isdefined( player ) ) - { - player freeze_player_controls( 0 ); - player enableweapons(); - } - - if ( isdefined( self.progressbar ) ) - { - self.progressbar destroyelem(); - self.progresstext destroyelem(); - } - - if ( isdefined( self ) ) - self notify( "hack_done" ); - - return success; + success = 1; + time = getTime(); + hacktime = getDvarFloat( "perk_disarmExplosiveTime" ); + if ( !canhack( player, owner, 1 ) ) + { + return 0; + } + self thread hackerunfreezeplayer( player ); + while ( ( time + ( hacktime * 1000 ) ) > getTime() ) + { + if ( !canhack( player, owner, 0 ) ) + { + success = 0; + break; + } + else if ( !player usebuttonpressed() ) + { + success = 0; + break; + } + else if ( !isDefined( self ) ) + { + success = 0; + break; + } + else + { + player freeze_player_controls( 1 ); + player disableweapons(); + if ( !isDefined( self.progressbar ) ) + { + self.progressbar = player createprimaryprogressbar(); + self.progressbar.lastuserate = -1; + self.progressbar showelem(); + self.progressbar updatebar( 0,01, 1 / hacktime ); + self.progresstext = player createprimaryprogressbartext(); + self.progresstext settext( &"MP_HACKING" ); + self.progresstext showelem(); + player playlocalsound( "evt_hacker_hacking" ); + } + wait 0,05; + } + } + if ( isDefined( player ) ) + { + player freeze_player_controls( 0 ); + player enableweapons(); + } + if ( isDefined( self.progressbar ) ) + { + self.progressbar destroyelem(); + self.progresstext destroyelem(); + } + if ( isDefined( self ) ) + { + self notify( "hack_done" ); + } + return success; } canhack( player, owner, weapon_check ) { - if ( !isdefined( player ) ) - return false; - - if ( !isplayer( player ) ) - return false; - - if ( !isalive( player ) ) - return false; - - if ( !isdefined( owner ) ) - return false; - - if ( owner == player ) - return false; - - if ( level.teambased && player.team == owner.team ) - return false; - - if ( isdefined( player.isdefusing ) && player.isdefusing ) - return false; - - if ( isdefined( player.isplanting ) && player.isplanting ) - return false; - - if ( isdefined( player.proxbar ) && !player.proxbar.hidden ) - return false; - - if ( isdefined( player.revivingteammate ) && player.revivingteammate == 1 ) - return false; - - if ( !player isonground() ) - return false; - - if ( player isinvehicle() ) - return false; - - if ( player isweaponviewonlylinked() ) - return false; - - if ( !player hasperk( "specialty_disarmexplosive" ) ) - return false; - - if ( player isempjammed() ) - return false; - - if ( isdefined( player.laststand ) && player.laststand ) - return false; - - if ( weapon_check ) - { - if ( player isthrowinggrenade() ) - return false; - - if ( player isswitchingweapons() ) - return false; - - if ( player ismeleeing() ) - return false; - - weapon = player getcurrentweapon(); - - if ( !isdefined( weapon ) ) - return false; - - if ( weapon == "none" ) - return false; - - if ( isweaponequipment( weapon ) && player isfiring() ) - return false; - - if ( isweaponspecificuse( weapon ) ) - return false; - } - - return true; + if ( !isDefined( player ) ) + { + return 0; + } + if ( !isplayer( player ) ) + { + return 0; + } + if ( !isalive( player ) ) + { + return 0; + } + if ( !isDefined( owner ) ) + { + return 0; + } + if ( owner == player ) + { + return 0; + } + if ( level.teambased && player.team == owner.team ) + { + return 0; + } + if ( isDefined( player.isdefusing ) && player.isdefusing ) + { + return 0; + } + if ( isDefined( player.isplanting ) && player.isplanting ) + { + return 0; + } + if ( isDefined( player.proxbar ) && !player.proxbar.hidden ) + { + return 0; + } + if ( isDefined( player.revivingteammate ) && player.revivingteammate == 1 ) + { + return 0; + } + if ( !player isonground() ) + { + return 0; + } + if ( player isinvehicle() ) + { + return 0; + } + if ( player isweaponviewonlylinked() ) + { + return 0; + } + if ( !player hasperk( "specialty_disarmexplosive" ) ) + { + return 0; + } + if ( player isempjammed() ) + { + return 0; + } + if ( isDefined( player.laststand ) && player.laststand ) + { + return 0; + } + if ( weapon_check ) + { + if ( player isthrowinggrenade() ) + { + return 0; + } + if ( player isswitchingweapons() ) + { + return 0; + } + if ( player ismeleeing() ) + { + return 0; + } + weapon = player getcurrentweapon(); + if ( !isDefined( weapon ) ) + { + return 0; + } + if ( weapon == "none" ) + { + return 0; + } + if ( isweaponequipment( weapon ) && player isfiring() ) + { + return 0; + } + if ( isweaponspecificuse( weapon ) ) + { + return 0; + } + } + return 1; } hackerremoveweapon( weapon ) { - for ( i = 0; i < self.weaponobjectwatcherarray.size; i++ ) - { - if ( self.weaponobjectwatcherarray[i].weapon != weapon.name ) - continue; - - objectarray_size = self.weaponobjectwatcherarray[i].objectarray.size; - - for ( j = 0; j < objectarray_size; j++ ) - self.weaponobjectwatcherarray[i].objectarray = deleteweaponobject( self.weaponobjectwatcherarray[i], weapon ); - - return; - } + i = 0; + while ( i < self.weaponobjectwatcherarray.size ) + { + if ( self.weaponobjectwatcherarray[ i ].weapon != weapon.name ) + { + i++; + continue; + } + else + { + objectarray_size = self.weaponobjectwatcherarray[ i ].objectarray.size; + j = 0; + while ( j < objectarray_size ) + { + self.weaponobjectwatcherarray[ i ].objectarray = deleteweaponobject( self.weaponobjectwatcherarray[ i ], weapon ); + j++; + } + return; + } + i++; + } } proximityweaponobjectdetonation( watcher ) { - self endon( "death" ); - self endon( "hacked" ); - self waittillnotmoving(); - - if ( isdefined( watcher.activationdelay ) ) - wait( watcher.activationdelay ); - - damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - watcher.detonateradius ), level.aitriggerspawnflags | level.vehicletriggerspawnflags, watcher.detonateradius, watcher.detonateradius * 2 ); - damagearea enablelinkto(); - damagearea linkto( self ); - self thread deleteondeath( damagearea ); - up = anglestoup( self.angles ); - traceorigin = self.origin + up; - - while ( true ) - { - damagearea waittill( "trigger", ent ); - - if ( getdvarint( "scr_weaponobject_debug" ) != 1 ) - { - if ( isdefined( self.owner ) && ent == self.owner ) - continue; - - if ( isdefined( self.owner ) && isvehicle( ent ) && isdefined( ent.owner ) && self.owner == ent.owner ) - continue; - - if ( !friendlyfirecheck( self.owner, ent, 0 ) ) - continue; - } - - if ( lengthsquared( ent getvelocity() ) < 10 && !isdefined( watcher.immediatedetonation ) ) - continue; - - if ( !ent shouldaffectweaponobject( self, watcher ) ) - continue; - - if ( self isstunned() ) - continue; - - if ( isplayer( ent ) && !isalive( ent ) ) - continue; - - if ( ent damageconetrace( traceorigin, self ) > 0 ) - break; - } - - if ( isdefined( watcher.activatesound ) ) - self playsound( watcher.activatesound ); - - if ( isdefined( watcher.activatefx ) ) - self setclientflag( 4 ); - - ent thread deathdodger( watcher.detectiongraceperiod ); - wait( watcher.detectiongraceperiod ); - - if ( isplayer( ent ) && ent hasperk( "specialty_delayexplosive" ) ) - wait( getdvarfloat( "perk_delayExplosiveTime" ) ); - - self.origin = traceorigin; - - if ( isdefined( self.owner ) && isplayer( self.owner ) ) - self [[ watcher.detonate ]]( self.owner ); - else - self [[ watcher.detonate ]](); + self endon( "death" ); + self endon( "hacked" ); + self waittillnotmoving(); + if ( isDefined( watcher.activationdelay ) ) + { + wait watcher.activationdelay; + } + damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - watcher.detonateradius ), level.aitriggerspawnflags | level.vehicletriggerspawnflags, watcher.detonateradius, watcher.detonateradius * 2 ); + damagearea enablelinkto(); + damagearea linkto( self ); + self thread deleteondeath( damagearea ); + up = anglesToUp( self.angles ); + traceorigin = self.origin + up; + while ( 1 ) + { + damagearea waittill( "trigger", ent ); + while ( getDvarInt( #"38868733" ) != 1 ) + { + if ( isDefined( self.owner ) && ent == self.owner ) + { + continue; + } + while ( isDefined( self.owner ) && isvehicle( ent ) && isDefined( ent.owner ) && self.owner == ent.owner ) + { + continue; + } + while ( !friendlyfirecheck( self.owner, ent, 0 ) ) + { + continue; + } + } + if ( lengthsquared( ent getvelocity() ) < 10 && !isDefined( watcher.immediatedetonation ) ) + { + continue; + } + while ( !ent shouldaffectweaponobject( self, watcher ) ) + { + continue; + } + while ( self isstunned() ) + { + continue; + } + if ( isplayer( ent ) && !isalive( ent ) ) + { + continue; + } + if ( ent damageconetrace( traceorigin, self ) > 0 ) + { + break; + } + else + { + } + } + if ( isDefined( watcher.activatesound ) ) + { + self playsound( watcher.activatesound ); + } + if ( isDefined( watcher.activatefx ) ) + { + self setclientflag( 4 ); + } + ent thread deathdodger( watcher.detectiongraceperiod ); + wait watcher.detectiongraceperiod; + if ( isplayer( ent ) && ent hasperk( "specialty_delayexplosive" ) ) + { + wait getDvarFloat( "perk_delayExplosiveTime" ); + } + self.origin = traceorigin; + if ( isDefined( self.owner ) && isplayer( self.owner ) ) + { + self [[ watcher.detonate ]]( self.owner ); + } + else self [[ watcher.detonate ]](); } shouldaffectweaponobject( object, watcher ) { - pos = self.origin + vectorscale( ( 0, 0, 1 ), 32.0 ); - - if ( isdefined( watcher.ignoredirection ) ) - return 1; - - dirtopos = pos - object.origin; - objectforward = anglestoforward( object.angles ); - dist = vectordot( dirtopos, objectforward ); - - if ( dist < watcher.detectionmindist ) - return 0; - - dirtopos = vectornormalize( dirtopos ); - dot = vectordot( dirtopos, objectforward ); - return dot > watcher.detectiondot; + pos = self.origin + vectorScale( ( 0, 0, 1 ), 32 ); + if ( isDefined( watcher.ignoredirection ) ) + { + return 1; + } + dirtopos = pos - object.origin; + objectforward = anglesToForward( object.angles ); + dist = vectordot( dirtopos, objectforward ); + if ( dist < watcher.detectionmindist ) + { + return 0; + } + dirtopos = vectornormalize( dirtopos ); + dot = vectordot( dirtopos, objectforward ); + return dot > watcher.detectiondot; } deathdodger( graceperiod ) { - self endon( "death" ); - self endon( "disconnect" ); - wait( 0.2 + graceperiod ); - self notify( "death_dodger" ); + self endon( "death" ); + self endon( "disconnect" ); + wait ( 0,2 + graceperiod ); + self notify( "death_dodger" ); } deleteondeath( ent ) { - self waittill_any( "death", "hacked" ); - wait 0.05; - - if ( isdefined( ent ) ) - ent delete(); + self waittill_any( "death", "hacked" ); + wait 0,05; + if ( isDefined( ent ) ) + { + ent delete(); + } } deleteonkillbrush( player ) { - player endon( "disconnect" ); - self endon( "death" ); - self endon( "stationary" ); - killbrushes = getentarray( "trigger_hurt", "classname" ); - - while ( true ) - { - for ( i = 0; i < killbrushes.size; i++ ) - { - if ( self istouching( killbrushes[i] ) ) - { - if ( self.origin[2] > player.origin[2] ) - break; - - if ( isdefined( self ) ) - self delete(); - - return; - } - } - - wait 0.1; - } + player endon( "disconnect" ); + self endon( "death" ); + self endon( "stationary" ); + killbrushes = getentarray( "trigger_hurt", "classname" ); + while ( 1 ) + { + i = 0; + while ( i < killbrushes.size ) + { + if ( self istouching( killbrushes[ i ] ) ) + { + if ( self.origin[ 2 ] > player.origin[ 2 ] ) + { + break; + } + else + { + if ( isDefined( self ) ) + { + self delete(); + } + return; + } + i++; + } + } + wait 0,1; + } } watchweaponobjectaltdetonation() { - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "alt_detonate" ); - - if ( !isalive( self ) ) - continue; - - for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) - { - if ( self.weaponobjectwatcherarray[watcher].altdetonate ) - self.weaponobjectwatcherarray[watcher] detonateweaponobjectarray( 0 ); - } - } + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "alt_detonate" ); + while ( !isalive( self ) ) + { + continue; + } + watcher = 0; + while ( watcher < self.weaponobjectwatcherarray.size ) + { + if ( self.weaponobjectwatcherarray[ watcher ].altdetonate ) + { + self.weaponobjectwatcherarray[ watcher ] detonateweaponobjectarray( 0 ); + } + watcher++; + } + } } watchweaponobjectaltdetonate() { - self endon( "disconnect" ); - self endon( "detonated" ); - level endon( "game_ended" ); - buttontime = 0; - - for (;;) - { - self waittill( "doubletap_detonate" ); - - if ( !isalive( self ) ) - continue; - - self notify( "alt_detonate" ); - wait 0.05; - } + self endon( "disconnect" ); + self endon( "detonated" ); + level endon( "game_ended" ); + buttontime = 0; + for ( ;; ) + { + self waittill( "doubletap_detonate" ); + if ( !isalive( self ) ) + { + continue; + } + else + { + self notify( "alt_detonate" ); + wait 0,05; + } + } } watchweaponobjectdetonation() { - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "detonate" ); - - if ( self isusingoffhand() ) - weap = self getcurrentoffhand(); - else - weap = self getcurrentweapon(); - - watcher = getweaponobjectwatcherbyweapon( weap ); - - if ( isdefined( watcher ) ) - watcher detonateweaponobjectarray( 0 ); - } + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "detonate" ); + if ( self isusingoffhand() ) + { + weap = self getcurrentoffhand(); + } + else + { + weap = self getcurrentweapon(); + } + watcher = getweaponobjectwatcherbyweapon( weap ); + if ( isDefined( watcher ) ) + { + watcher detonateweaponobjectarray( 0 ); + } + } } deleteweaponobjectson() { - while ( true ) - { - msg = self waittill_any_return( "disconnect", "joined_team", "joined_spectators", "death" ); - - if ( msg == "death" ) - continue; - - if ( !isdefined( self.weaponobjectwatcherarray ) ) - return; - - watchers = []; - - for ( watcher = 0; watcher < self.weaponobjectwatcherarray.size; watcher++ ) - { - weaponobjectwatcher = spawnstruct(); - watchers[watchers.size] = weaponobjectwatcher; - weaponobjectwatcher.objectarray = []; - - if ( isdefined( self.weaponobjectwatcherarray[watcher].objectarray ) ) - weaponobjectwatcher.objectarray = self.weaponobjectwatcherarray[watcher].objectarray; - } - - wait 0.05; - - for ( watcher = 0; watcher < watchers.size; watcher++ ) - watchers[watcher] deleteweaponobjectarray(); - - if ( msg == "disconnect" ) - return; - } + while ( 1 ) + { + msg = self waittill_any_return( "disconnect", "joined_team", "joined_spectators", "death" ); + while ( msg == "death" ) + { + continue; + } + if ( !isDefined( self.weaponobjectwatcherarray ) ) + { + return; + } + watchers = []; + watcher = 0; + while ( watcher < self.weaponobjectwatcherarray.size ) + { + weaponobjectwatcher = spawnstruct(); + watchers[ watchers.size ] = weaponobjectwatcher; + weaponobjectwatcher.objectarray = []; + if ( isDefined( self.weaponobjectwatcherarray[ watcher ].objectarray ) ) + { + weaponobjectwatcher.objectarray = self.weaponobjectwatcherarray[ watcher ].objectarray; + } + watcher++; + } + wait 0,05; + watcher = 0; + while ( watcher < watchers.size ) + { + watchers[ watcher ] deleteweaponobjectarray(); + watcher++; + } + if ( msg == "disconnect" ) + { + return; + } + } } saydamaged( orig, amount ) { /# - for ( i = 0; i < 60; i++ ) - { - print3d( orig, "damaged! " + amount ); - wait 0.05; - } + i = 0; + while ( i < 60 ) + { + print3d( orig, "damaged! " + amount ); + wait 0,05; + i++; #/ + } } showheadicon( trigger ) { - triggerdetectid = trigger.detectid; - useid = -1; - - for ( index = 0; index < 4; index++ ) - { - detectid = self.bombsquadicons[index].detectid; - - if ( detectid == triggerdetectid ) - return; - - if ( detectid == "" ) - useid = index; - } - - if ( useid < 0 ) - return; - - self.bombsquadids[triggerdetectid] = 1; - self.bombsquadicons[useid].x = trigger.origin[0]; - self.bombsquadicons[useid].y = trigger.origin[1]; - self.bombsquadicons[useid].z = trigger.origin[2] + 24 + 128; - self.bombsquadicons[useid] fadeovertime( 0.25 ); - self.bombsquadicons[useid].alpha = 1; - self.bombsquadicons[useid].detectid = trigger.detectid; - - while ( isalive( self ) && isdefined( trigger ) && self istouching( trigger ) ) - wait 0.05; - - if ( !isdefined( self ) ) - return; - - self.bombsquadicons[useid].detectid = ""; - self.bombsquadicons[useid] fadeovertime( 0.25 ); - self.bombsquadicons[useid].alpha = 0; - self.bombsquadids[triggerdetectid] = undefined; + triggerdetectid = trigger.detectid; + useid = -1; + index = 0; + while ( index < 4 ) + { + detectid = self.bombsquadicons[ index ].detectid; + if ( detectid == triggerdetectid ) + { + return; + } + if ( detectid == "" ) + { + useid = index; + } + index++; + } + if ( useid < 0 ) + { + return; + } + self.bombsquadids[ triggerdetectid ] = 1; + self.bombsquadicons[ useid ].x = trigger.origin[ 0 ]; + self.bombsquadicons[ useid ].y = trigger.origin[ 1 ]; + self.bombsquadicons[ useid ].z = trigger.origin[ 2 ] + 24 + 128; + self.bombsquadicons[ useid ] fadeovertime( 0,25 ); + self.bombsquadicons[ useid ].alpha = 1; + self.bombsquadicons[ useid ].detectid = trigger.detectid; + while ( isalive( self ) && isDefined( trigger ) && self istouching( trigger ) ) + { + wait 0,05; + } + if ( !isDefined( self ) ) + { + return; + } + self.bombsquadicons[ useid ].detectid = ""; + self.bombsquadicons[ useid ] fadeovertime( 0,25 ); + self.bombsquadicons[ useid ].alpha = 0; } friendlyfirecheck( owner, attacker, forcedfriendlyfirerule ) { - if ( !isdefined( owner ) ) - return true; - - if ( !level.teambased ) - return true; - - friendlyfirerule = level.friendlyfire; - - if ( isdefined( forcedfriendlyfirerule ) ) - friendlyfirerule = forcedfriendlyfirerule; - - if ( friendlyfirerule != 0 ) - return true; - - if ( attacker == owner ) - return true; - - if ( isplayer( attacker ) ) - { - if ( !isdefined( attacker.pers["team"] ) ) - return true; - - if ( attacker.pers["team"] != owner.pers["team"] ) - return true; - } - else if ( isai( attacker ) ) - { - if ( attacker.aiteam != owner.pers["team"] ) - return true; - } - else if ( isvehicle( attacker ) ) - { - if ( isdefined( attacker.owner ) && isplayer( attacker.owner ) ) - { - if ( attacker.owner.pers["team"] != owner.pers["team"] ) - return true; - } - } - - return false; + if ( !isDefined( owner ) ) + { + return 1; + } + if ( !level.teambased ) + { + return 1; + } + friendlyfirerule = level.friendlyfire; + if ( isDefined( forcedfriendlyfirerule ) ) + { + friendlyfirerule = forcedfriendlyfirerule; + } + if ( friendlyfirerule != 0 ) + { + return 1; + } + if ( attacker == owner ) + { + return 1; + } + if ( isplayer( attacker ) ) + { + if ( !isDefined( attacker.pers[ "team" ] ) ) + { + return 1; + } + if ( attacker.pers[ "team" ] != owner.pers[ "team" ] ) + { + return 1; + } + } + else + { + if ( isai( attacker ) ) + { + if ( attacker.aiteam != owner.pers[ "team" ] ) + { + return 1; + } + } + else + { + if ( isvehicle( attacker ) ) + { + if ( isDefined( attacker.owner ) && isplayer( attacker.owner ) ) + { + if ( attacker.owner.pers[ "team" ] != owner.pers[ "team" ] ) + { + return 1; + } + } + } + } + } + return 0; } onspawnhatchettrigger( watcher, player ) { - self endon( "death" ); - self setowner( player ); - self setteam( player.pers["team"] ); - self.owner = player; - self.oldangles = self.angles; - self waittillnotmoving(); - waittillframeend; - - if ( player.pers["team"] == "spectator" ) - return; - - triggerorigin = self.origin; - triggerparentent = undefined; - - if ( isdefined( self.stucktoplayer ) ) - { - if ( isalive( self.stucktoplayer ) || !isdefined( self.stucktoplayer.body ) ) - { - if ( isalive( self.stucktoplayer ) ) - { - triggerparentent = self; - self unlink(); - self.angles = self.oldangles; - self launch( vectorscale( ( 1, 1, 1 ), 5.0 ) ); - self waittillnotmoving(); - waittillframeend; - } - else - triggerparentent = self.stucktoplayer; - } - else - triggerparentent = self.stucktoplayer.body; - } - - if ( isdefined( triggerparentent ) ) - triggerorigin = triggerparentent.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); - - self.hatchetpickuptrigger = spawn( "trigger_radius", triggerorigin, 0, 50, 50 ); - self.hatchetpickuptrigger enablelinkto(); - self.hatchetpickuptrigger linkto( self ); - - if ( isdefined( triggerparentent ) ) - self.hatchetpickuptrigger linkto( triggerparentent ); - - self thread watchhatchettrigger( self.hatchetpickuptrigger, watcher.pickup, watcher.pickupsoundplayer, watcher.pickupsound ); + self endon( "death" ); + self setowner( player ); + self setteam( player.pers[ "team" ] ); + self.owner = player; + self.oldangles = self.angles; + self waittillnotmoving(); + waittillframeend; + if ( player.pers[ "team" ] == "spectator" ) + { + return; + } + triggerorigin = self.origin; + triggerparentent = undefined; + if ( isDefined( self.stucktoplayer ) ) + { + if ( isalive( self.stucktoplayer ) || !isDefined( self.stucktoplayer.body ) ) + { + if ( isalive( self.stucktoplayer ) ) + { + triggerparentent = self; + self unlink(); + self.angles = self.oldangles; + self launch( vectorScale( ( 0, 0, 1 ), 5 ) ); + self waittillnotmoving(); + waittillframeend; + } + else + { + triggerparentent = self.stucktoplayer; + } + } + else + { + triggerparentent = self.stucktoplayer.body; + } + } + if ( isDefined( triggerparentent ) ) + { + triggerorigin = triggerparentent.origin + vectorScale( ( 0, 0, 1 ), 10 ); + } + self.hatchetpickuptrigger = spawn( "trigger_radius", triggerorigin, 0, 50, 50 ); + self.hatchetpickuptrigger enablelinkto(); + self.hatchetpickuptrigger linkto( self ); + if ( isDefined( triggerparentent ) ) + { + self.hatchetpickuptrigger linkto( triggerparentent ); + } + self thread watchhatchettrigger( self.hatchetpickuptrigger, watcher.pickup, watcher.pickupsoundplayer, watcher.pickupsound ); /# - thread switch_team( self, watcher.weapon, player ); + thread switch_team( self, watcher.weapon, player ); #/ - self thread watchshutdown( player ); + self thread watchshutdown( player ); } watchhatchettrigger( trigger, callback, playersoundonuse, npcsoundonuse ) { - self endon( "delete" ); - self endon( "hacked" ); - - while ( true ) - { - trigger waittill( "trigger", player ); - - if ( !isalive( player ) ) - continue; - - if ( !player isonground() ) - continue; - - if ( isdefined( trigger.claimedby ) && player != trigger.claimedby ) - continue; - - if ( !player hasweapon( self.name ) ) - continue; - - curr_ammo = player getweaponammostock( "hatchet_mp" ); - maxammo = weaponmaxammo( "hatchet_mp" ); - - if ( player.grenadetypeprimary == "hatchet_mp" ) - maxammo = player.grenadetypeprimarycount; - else if ( isdefined( player.grenadetypesecondary ) && player.grenadetypesecondary == "hatchet_mp" ) - maxammo = player.grenadetypesecondarycount; - - if ( curr_ammo >= maxammo ) - continue; - - if ( isdefined( playersoundonuse ) ) - player playlocalsound( playersoundonuse ); - - if ( isdefined( npcsoundonuse ) ) - player playsound( npcsoundonuse ); - - self thread [[ callback ]]( player ); - } + self endon( "delete" ); + self endon( "hacked" ); + while ( 1 ) + { + trigger waittill( "trigger", player ); + while ( !isalive( player ) ) + { + continue; + } + while ( !player isonground() ) + { + continue; + } + if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) + { + continue; + } + while ( !player hasweapon( self.name ) ) + { + continue; + } + curr_ammo = player getweaponammostock( "hatchet_mp" ); + maxammo = weaponmaxammo( "hatchet_mp" ); + if ( player.grenadetypeprimary == "hatchet_mp" ) + { + maxammo = player.grenadetypeprimarycount; + } + else + { + if ( isDefined( player.grenadetypesecondary ) && player.grenadetypesecondary == "hatchet_mp" ) + { + maxammo = player.grenadetypesecondarycount; + } + } + while ( curr_ammo >= maxammo ) + { + continue; + } + if ( isDefined( playersoundonuse ) ) + { + player playlocalsound( playersoundonuse ); + } + if ( isDefined( npcsoundonuse ) ) + { + player playsound( npcsoundonuse ); + } + self thread [[ callback ]]( player ); + } } onspawnretrievableweaponobject( watcher, player ) { - self endon( "death" ); - self endon( "hacked" ); - - if ( ishacked() ) - { - self thread watchshutdown( player ); - return; - } - - self setowner( player ); - self setteam( player.pers["team"] ); - self.owner = player; - self.oldangles = self.angles; - self waittillnotmoving(); - - if ( isdefined( watcher.activationdelay ) ) - wait( watcher.activationdelay ); - - waittillframeend; - - if ( player.pers["team"] == "spectator" ) - return; - - triggerorigin = self.origin; - triggerparentent = undefined; - - if ( isdefined( self.stucktoplayer ) ) - { - if ( isalive( self.stucktoplayer ) || !isdefined( self.stucktoplayer.body ) ) - triggerparentent = self.stucktoplayer; - else - triggerparentent = self.stucktoplayer.body; - } - - if ( isdefined( triggerparentent ) ) - triggerorigin = triggerparentent.origin + vectorscale( ( 0, 0, 1 ), 10.0 ); - else - { - up = anglestoup( self.angles ); - triggerorigin = self.origin + up; - } - - if ( isdefined( watcher.adjusttriggerorigin ) ) - triggerorigin = self [[ watcher.adjusttriggerorigin ]]( triggerorigin ); - - self.pickuptrigger = spawn( "trigger_radius_use", triggerorigin ); - self.pickuptrigger sethintlowpriority( 1 ); - self.pickuptrigger setcursorhint( "HINT_NOICON", self ); - self.pickuptrigger enablelinkto(); - self.pickuptrigger linkto( self ); - self.pickuptrigger setinvisibletoall(); - self.pickuptrigger setvisibletoplayer( player ); - - if ( isdefined( level.retrievehints[watcher.name] ) ) - self.pickuptrigger sethintstring( level.retrievehints[watcher.name].hint ); - else - self.pickuptrigger sethintstring( &"MP_GENERIC_PICKUP" ); - - if ( level.teambased ) - self.pickuptrigger setteamfortrigger( player.pers["team"] ); - else - self.pickuptrigger setteamfortrigger( "none" ); - - if ( isdefined( triggerparentent ) ) - self.pickuptrigger linkto( triggerparentent ); - - if ( watcher.enemydestroy ) - { - self.enemytrigger = spawn( "trigger_radius_use", triggerorigin ); - self.enemytrigger setcursorhint( "HINT_NOICON", self ); - self.enemytrigger enablelinkto(); - self.enemytrigger linkto( self ); - self.enemytrigger setinvisibletoplayer( player ); - - if ( level.teambased ) - { - self.enemytrigger setexcludeteamfortrigger( player.team ); - self.enemytrigger.triggerteamignore = self.team; - } - - if ( isdefined( level.destroyhints[watcher.name] ) ) - self.enemytrigger sethintstring( level.destroyhints[watcher.name].hint ); - else - self.enemytrigger sethintstring( &"MP_GENERIC_DESTROY" ); - - self thread watchusetrigger( self.enemytrigger, watcher.ondestroyed ); - } - - self thread watchusetrigger( self.pickuptrigger, watcher.pickup, watcher.pickupsoundplayer, watcher.pickupsound ); + self endon( "death" ); + self endon( "hacked" ); + if ( ishacked() ) + { + self thread watchshutdown( player ); + return; + } + self setowner( player ); + self setteam( player.pers[ "team" ] ); + self.owner = player; + self.oldangles = self.angles; + self waittillnotmoving(); + if ( isDefined( watcher.activationdelay ) ) + { + wait watcher.activationdelay; + } + waittillframeend; + if ( player.pers[ "team" ] == "spectator" ) + { + return; + } + triggerorigin = self.origin; + triggerparentent = undefined; + if ( isDefined( self.stucktoplayer ) ) + { + if ( isalive( self.stucktoplayer ) || !isDefined( self.stucktoplayer.body ) ) + { + triggerparentent = self.stucktoplayer; + } + else + { + triggerparentent = self.stucktoplayer.body; + } + } + if ( isDefined( triggerparentent ) ) + { + triggerorigin = triggerparentent.origin + vectorScale( ( 0, 0, 1 ), 10 ); + } + else + { + up = anglesToUp( self.angles ); + triggerorigin = self.origin + up; + } + if ( isDefined( watcher.adjusttriggerorigin ) ) + { + triggerorigin = self [[ watcher.adjusttriggerorigin ]]( triggerorigin ); + } + self.pickuptrigger = spawn( "trigger_radius_use", triggerorigin ); + self.pickuptrigger sethintlowpriority( 1 ); + self.pickuptrigger setcursorhint( "HINT_NOICON", self ); + self.pickuptrigger enablelinkto(); + self.pickuptrigger linkto( self ); + self.pickuptrigger setinvisibletoall(); + self.pickuptrigger setvisibletoplayer( player ); + if ( isDefined( level.retrievehints[ watcher.name ] ) ) + { + self.pickuptrigger sethintstring( level.retrievehints[ watcher.name ].hint ); + } + else + { + self.pickuptrigger sethintstring( &"MP_GENERIC_PICKUP" ); + } + if ( level.teambased ) + { + self.pickuptrigger setteamfortrigger( player.pers[ "team" ] ); + } + else + { + self.pickuptrigger setteamfortrigger( "none" ); + } + if ( isDefined( triggerparentent ) ) + { + self.pickuptrigger linkto( triggerparentent ); + } + if ( watcher.enemydestroy ) + { + self.enemytrigger = spawn( "trigger_radius_use", triggerorigin ); + self.enemytrigger setcursorhint( "HINT_NOICON", self ); + self.enemytrigger enablelinkto(); + self.enemytrigger linkto( self ); + self.enemytrigger setinvisibletoplayer( player ); + if ( level.teambased ) + { + self.enemytrigger setexcludeteamfortrigger( player.team ); + self.enemytrigger.triggerteamignore = self.team; + } + if ( isDefined( level.destroyhints[ watcher.name ] ) ) + { + self.enemytrigger sethintstring( level.destroyhints[ watcher.name ].hint ); + } + else + { + self.enemytrigger sethintstring( &"MP_GENERIC_DESTROY" ); + } + self thread watchusetrigger( self.enemytrigger, watcher.ondestroyed ); + } + self thread watchusetrigger( self.pickuptrigger, watcher.pickup, watcher.pickupsoundplayer, watcher.pickupsound ); /# - thread switch_team( self, watcher.weapon, player ); + thread switch_team( self, watcher.weapon, player ); #/ - if ( isdefined( watcher.pickup_trigger_listener ) ) - self thread [[ watcher.pickup_trigger_listener ]]( self.pickuptrigger, player ); - - self thread watchshutdown( player ); + if ( isDefined( watcher.pickup_trigger_listener ) ) + { + self thread [[ watcher.pickup_trigger_listener ]]( self.pickuptrigger, player ); + } + self thread watchshutdown( player ); } watch_trigger_visibility( triggers, weap_name ) { - self notify( "watchTriggerVisibility" ); - self endon( "watchTriggerVisibility" ); - self endon( "death" ); - self endon( "hacked" ); - max_ammo = weaponmaxammo( weap_name ); - start_ammo = weaponstartammo( weap_name ); - ammo_to_check = 0; - - while ( true ) - { - players = level.players; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] hasweapon( weap_name ) ) - { - ammo_to_check = max_ammo; - - if ( self.owner == players[i] ) - { - curr_ammo = players[i] getweaponammostock( weap_name ) + players[i] getweaponammoclip( weap_name ); - - if ( weap_name == "hatchet_mp" ) - curr_ammo = players[i] getweaponammostock( weap_name ); - - if ( curr_ammo < ammo_to_check ) - { - triggers["owner_pickup"] setvisibletoplayer( players[i] ); - triggers["enemy_pickup"] setinvisibletoplayer( players[i] ); - } - else - { - triggers["owner_pickup"] setinvisibletoplayer( players[i] ); - triggers["enemy_pickup"] setinvisibletoplayer( players[i] ); - } - } - else - { - curr_ammo = players[i] getweaponammostock( weap_name ) + players[i] getweaponammoclip( weap_name ); - - if ( weap_name == "hatchet_mp" ) - curr_ammo = players[i] getweaponammostock( weap_name ); - - if ( curr_ammo < ammo_to_check ) - { - triggers["owner_pickup"] setinvisibletoplayer( players[i] ); - triggers["enemy_pickup"] setvisibletoplayer( players[i] ); - } - else - { - triggers["owner_pickup"] setinvisibletoplayer( players[i] ); - triggers["enemy_pickup"] setinvisibletoplayer( players[i] ); - } - } - - continue; - } - - triggers["owner_pickup"] setinvisibletoplayer( players[i] ); - triggers["enemy_pickup"] setinvisibletoplayer( players[i] ); - } - - wait 0.05; - } + self notify( "watchTriggerVisibility" ); + self endon( "watchTriggerVisibility" ); + self endon( "death" ); + self endon( "hacked" ); + max_ammo = weaponmaxammo( weap_name ); + start_ammo = weaponstartammo( weap_name ); + ammo_to_check = 0; + while ( 1 ) + { + players = level.players; + i = 0; + while ( i < players.size ) + { + if ( players[ i ] hasweapon( weap_name ) ) + { + ammo_to_check = max_ammo; + if ( self.owner == players[ i ] ) + { + curr_ammo = players[ i ] getweaponammostock( weap_name ) + players[ i ] getweaponammoclip( weap_name ); + if ( weap_name == "hatchet_mp" ) + { + curr_ammo = players[ i ] getweaponammostock( weap_name ); + } + if ( curr_ammo < ammo_to_check ) + { + triggers[ "owner_pickup" ] setvisibletoplayer( players[ i ] ); + triggers[ "enemy_pickup" ] setinvisibletoplayer( players[ i ] ); + } + else + { + triggers[ "owner_pickup" ] setinvisibletoplayer( players[ i ] ); + triggers[ "enemy_pickup" ] setinvisibletoplayer( players[ i ] ); + } + } + else curr_ammo = players[ i ] getweaponammostock( weap_name ) + players[ i ] getweaponammoclip( weap_name ); + if ( weap_name == "hatchet_mp" ) + { + curr_ammo = players[ i ] getweaponammostock( weap_name ); + } + if ( curr_ammo < ammo_to_check ) + { + triggers[ "owner_pickup" ] setinvisibletoplayer( players[ i ] ); + triggers[ "enemy_pickup" ] setvisibletoplayer( players[ i ] ); + } + else + { + triggers[ "owner_pickup" ] setinvisibletoplayer( players[ i ] ); + triggers[ "enemy_pickup" ] setinvisibletoplayer( players[ i ] ); + } + i++; + continue; + } + else + { + triggers[ "owner_pickup" ] setinvisibletoplayer( players[ i ] ); + triggers[ "enemy_pickup" ] setinvisibletoplayer( players[ i ] ); + } + i++; + } + wait 0,05; + } } destroyent() { - self delete(); + self delete(); } pickup( player ) { - if ( self.name != "hatchet_mp" && isdefined( self.owner ) && self.owner != player ) - return; - - self.playdialog = 0; - self destroyent(); - player giveweapon( self.name ); - clip_ammo = player getweaponammoclip( self.name ); - clip_max_ammo = weaponclipsize( self.name ); - - if ( clip_ammo < clip_max_ammo ) - clip_ammo++; - - player setweaponammoclip( self.name, clip_ammo ); + if ( self.name != "hatchet_mp" && isDefined( self.owner ) && self.owner != player ) + { + return; + } + self.playdialog = 0; + self destroyent(); + player giveweapon( self.name ); + clip_ammo = player getweaponammoclip( self.name ); + clip_max_ammo = weaponclipsize( self.name ); + if ( clip_ammo < clip_max_ammo ) + { + clip_ammo++; + } + player setweaponammoclip( self.name, clip_ammo ); } ondestroyed( attacker ) { - playfx( level._effect["tacticalInsertionFizzle"], self.origin ); - self playsound( "dst_tac_insert_break" ); - self.owner maps\mp\gametypes_zm\_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" ); - self delete(); + playfx( level._effect[ "tacticalInsertionFizzle" ], self.origin ); + self playsound( "dst_tac_insert_break" ); + self.owner maps/mp/gametypes_zm/_globallogic_audio::leaderdialogonplayer( "equipment_destroyed", "item_destroyed" ); + self delete(); } watchshutdown( player ) { - self waittill_any( "death", "hacked" ); - pickuptrigger = self.pickuptrigger; - hackertrigger = self.hackertrigger; - hatchetpickuptrigger = self.hatchetpickuptrigger; - enemytrigger = self.enemytrigger; - - if ( isdefined( pickuptrigger ) ) - pickuptrigger delete(); - - if ( isdefined( hackertrigger ) ) - { - if ( isdefined( hackertrigger.progressbar ) ) - { - hackertrigger.progressbar destroyelem(); - hackertrigger.progresstext destroyelem(); - } - - hackertrigger delete(); - } - - if ( isdefined( hatchetpickuptrigger ) ) - hatchetpickuptrigger delete(); - - if ( isdefined( enemytrigger ) ) - enemytrigger delete(); + self waittill_any( "death", "hacked" ); + pickuptrigger = self.pickuptrigger; + hackertrigger = self.hackertrigger; + hatchetpickuptrigger = self.hatchetpickuptrigger; + enemytrigger = self.enemytrigger; + if ( isDefined( pickuptrigger ) ) + { + pickuptrigger delete(); + } + if ( isDefined( hackertrigger ) ) + { + if ( isDefined( hackertrigger.progressbar ) ) + { + hackertrigger.progressbar destroyelem(); + hackertrigger.progresstext destroyelem(); + } + hackertrigger delete(); + } + if ( isDefined( hatchetpickuptrigger ) ) + { + hatchetpickuptrigger delete(); + } + if ( isDefined( enemytrigger ) ) + { + enemytrigger delete(); + } } watchusetrigger( trigger, callback, playersoundonuse, npcsoundonuse ) { - self endon( "delete" ); - self endon( "hacked" ); - - while ( true ) - { - trigger waittill( "trigger", player ); - - if ( !isalive( player ) ) - continue; - - if ( !player isonground() ) - continue; - - if ( isdefined( trigger.triggerteam ) && player.pers["team"] != trigger.triggerteam ) - continue; - - if ( isdefined( trigger.triggerteamignore ) && player.team == trigger.triggerteamignore ) - continue; - - if ( isdefined( trigger.claimedby ) && player != trigger.claimedby ) - continue; - - grenade = player.throwinggrenade; - isequipment = isweaponequipment( player getcurrentweapon() ); - - if ( isdefined( isequipment ) && isequipment ) - grenade = 0; - - if ( player usebuttonpressed() && !grenade && !player meleebuttonpressed() ) - { - if ( isdefined( playersoundonuse ) ) - player playlocalsound( playersoundonuse ); - - if ( isdefined( npcsoundonuse ) ) - player playsound( npcsoundonuse ); - - self thread [[ callback ]]( player ); - } - } + self endon( "delete" ); + self endon( "hacked" ); + while ( 1 ) + { + trigger waittill( "trigger", player ); + while ( !isalive( player ) ) + { + continue; + } + while ( !player isonground() ) + { + continue; + } + if ( isDefined( trigger.triggerteam ) && player.pers[ "team" ] != trigger.triggerteam ) + { + continue; + } + if ( isDefined( trigger.triggerteamignore ) && player.team == trigger.triggerteamignore ) + { + continue; + } + if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) + { + continue; + } + grenade = player.throwinggrenade; + isequipment = isweaponequipment( player getcurrentweapon() ); + if ( isDefined( isequipment ) && isequipment ) + { + grenade = 0; + } + if ( player usebuttonpressed() && !grenade && !player meleebuttonpressed() ) + { + if ( isDefined( playersoundonuse ) ) + { + player playlocalsound( playersoundonuse ); + } + if ( isDefined( npcsoundonuse ) ) + { + player playsound( npcsoundonuse ); + } + self thread [[ callback ]]( player ); + } + } } createretrievablehint( name, hint ) { - retrievehint = spawnstruct(); - retrievehint.name = name; - retrievehint.hint = hint; - level.retrievehints[name] = retrievehint; + retrievehint = spawnstruct(); + retrievehint.name = name; + retrievehint.hint = hint; + level.retrievehints[ name ] = retrievehint; } createhackerhint( name, hint ) { - hackerhint = spawnstruct(); - hackerhint.name = name; - hackerhint.hint = hint; - level.hackerhints[name] = hackerhint; + hackerhint = spawnstruct(); + hackerhint.name = name; + hackerhint.hint = hint; + level.hackerhints[ name ] = hackerhint; } createdestroyhint( name, hint ) { - destroyhint = spawnstruct(); - destroyhint.name = name; - destroyhint.hint = hint; - level.destroyhints[name] = destroyhint; + destroyhint = spawnstruct(); + destroyhint.name = name; + destroyhint.hint = hint; + level.destroyhints[ name ] = destroyhint; } attachreconmodel( modelname, owner ) { - if ( !isdefined( self ) ) - return; - - reconmodel = spawn( "script_model", self.origin ); - reconmodel.angles = self.angles; - reconmodel setmodel( modelname ); - reconmodel.model_name = modelname; - reconmodel linkto( self ); - reconmodel setcontents( 0 ); - reconmodel resetreconmodelvisibility( owner ); - reconmodel thread watchreconmodelfordeath( self ); - reconmodel thread resetreconmodelonevent( "joined_team", owner ); - reconmodel thread resetreconmodelonevent( "player_spawned", owner ); + if ( !isDefined( self ) ) + { + return; + } + reconmodel = spawn( "script_model", self.origin ); + reconmodel.angles = self.angles; + reconmodel setmodel( modelname ); + reconmodel.model_name = modelname; + reconmodel linkto( self ); + reconmodel setcontents( 0 ); + reconmodel resetreconmodelvisibility( owner ); + reconmodel thread watchreconmodelfordeath( self ); + reconmodel thread resetreconmodelonevent( "joined_team", owner ); + reconmodel thread resetreconmodelonevent( "player_spawned", owner ); } resetreconmodelvisibility( owner ) { - if ( !isdefined( self ) ) - return; - - self setinvisibletoall(); - self setforcenocull(); - - if ( !isdefined( owner ) ) - return; - - for ( i = 0; i < level.players.size; i++ ) - { - if ( !level.players[i] hasperk( "specialty_detectexplosive" ) && !level.players[i] hasperk( "specialty_showenemyequipment" ) ) - continue; - - if ( level.players[i].team == "spectator" ) - continue; - - hasreconmodel = 0; - - if ( level.players[i] hasperk( "specialty_detectexplosive" ) ) - { - switch ( self.model_name ) - { - case "t6_wpn_claymore_world_detect": - case "t6_wpn_c4_world_detect": - hasreconmodel = 1; - break; - default: - break; - } - } - - if ( level.players[i] hasperk( "specialty_showenemyequipment" ) ) - { - switch ( self.model_name ) - { - case "t6_wpn_trophy_system_world_detect": - case "t6_wpn_taser_mine_world_detect": - case "t6_wpn_tac_insert_detect": - case "t6_wpn_motion_sensor_world_detect": - case "t6_wpn_claymore_world_detect": - case "t6_wpn_c4_world_detect": - case "t6_wpn_bouncing_betty_world_detect": - case "t5_weapon_scrambler_world_detect": - hasreconmodel = 1; - break; - default: - break; - } - } - - if ( !hasreconmodel ) - continue; - - isenemy = 1; - - if ( level.teambased ) - { - if ( level.players[i].team == owner.team ) - isenemy = 0; - } - else if ( level.players[i] == owner ) - isenemy = 0; - - if ( isenemy ) - self setvisibletoplayer( level.players[i] ); - } + if ( !isDefined( self ) ) + { + return; + } + self setinvisibletoall(); + self setforcenocull(); + if ( !isDefined( owner ) ) + { + return; + } + i = 0; + while ( i < level.players.size ) + { + if ( !level.players[ i ] hasperk( "specialty_detectexplosive" ) && !level.players[ i ] hasperk( "specialty_showenemyequipment" ) ) + { + i++; + continue; + } + else + { + if ( level.players[ i ].team == "spectator" ) + { + i++; + continue; + } + else hasreconmodel = 0; + if ( level.players[ i ] hasperk( "specialty_detectexplosive" ) ) + { + switch( self.model_name ) + { + case "t6_wpn_c4_world_detect": + case "t6_wpn_claymore_world_detect": + hasreconmodel = 1; + break; + break; + default: + } + } + if ( level.players[ i ] hasperk( "specialty_showenemyequipment" ) ) + { + switch( self.model_name ) + { + case "t5_weapon_scrambler_world_detect": + case "t6_wpn_bouncing_betty_world_detect": + case "t6_wpn_c4_world_detect": + case "t6_wpn_claymore_world_detect": + case "t6_wpn_motion_sensor_world_detect": + case "t6_wpn_tac_insert_detect": + case "t6_wpn_taser_mine_world_detect": + case "t6_wpn_trophy_system_world_detect": + hasreconmodel = 1; + break; + break; + default: + } + } + if ( !hasreconmodel ) + { + i++; + continue; + } + else isenemy = 1; + if ( level.teambased ) + { + if ( level.players[ i ].team == owner.team ) + { + isenemy = 0; + } + } + else + { + if ( level.players[ i ] == owner ) + { + isenemy = 0; + } + } + if ( isenemy ) + { + self setvisibletoplayer( level.players[ i ] ); + } + } + i++; + } + } + } } watchreconmodelfordeath( parentent ) { - self endon( "death" ); - parentent waittill_any( "death", "hacked" ); - self delete(); + self endon( "death" ); + parentent waittill_any( "death", "hacked" ); + self delete(); } resetreconmodelonevent( eventname, owner ) { - self endon( "death" ); - - for (;;) - { - level waittill( eventname, newowner ); - - if ( isdefined( newowner ) ) - owner = newowner; - - self resetreconmodelvisibility( owner ); - } + self endon( "death" ); + for ( ;; ) + { + level waittill( eventname, newowner ); + if ( isDefined( newowner ) ) + { + owner = newowner; + } + self resetreconmodelvisibility( owner ); + } } switch_team( entity, weapon_name, owner ) { /# - #/ } diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapons.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapons.gsc index 7af1be4..55c93d4 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapons.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapons.gsc @@ -1,1916 +1,1950 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_weapon_utils; -#include maps\mp\gametypes_zm\_weaponobjects; -#include maps\mp\_sticky_grenade; -#include maps\mp\_bb; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\_challenges; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\gametypes_zm\_globallogic_utils; -#include maps\mp\gametypes_zm\_shellshock; -#include maps\mp\gametypes_zm\_gameobjects; +//checked includes changed to match cerberus output +#include maps/mp/gametypes_zm/_gameobjects; +#include maps/mp/gametypes_zm/_shellshock; +#include maps/mp/gametypes_zm/_globallogic_utils; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/_challenges; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/_bb; +#include maps/mp/_sticky_grenade; +#include maps/mp/gametypes_zm/_weaponobjects; +#include maps/mp/gametypes_zm/_weapon_utils; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +//whole script first checked as mp version then checked againt zm version + +init() //checked changed to match cerberus output { - precacheitem( "knife_mp" ); - precacheitem( "knife_held_mp" ); - precacheitem( "dogs_mp" ); - precacheitem( "dog_bite_mp" ); - precacheitem( "explosive_bolt_mp" ); - precachemodel( "t6_wpn_claymore_world_detect" ); - precachemodel( "t6_wpn_c4_world_detect" ); - precachemodel( "t5_weapon_scrambler_world_detect" ); - precachemodel( "t6_wpn_tac_insert_detect" ); - precachemodel( "t6_wpn_taser_mine_world_detect" ); - precachemodel( "t6_wpn_motion_sensor_world_detect" ); - precachemodel( "t6_wpn_trophy_system_world_detect" ); - precachemodel( "t6_wpn_bouncing_betty_world_detect" ); - precachemodel( "t5_weapon_camera_head_world" ); - precacheitem( "scavenger_item_mp" ); - precacheitem( "scavenger_item_hack_mp" ); - precacheshader( "hud_scavenger_pickup" ); - precacheshellshock( "default" ); - precacheshellshock( "concussion_grenade_mp" ); - precacheshellshock( "tabun_gas_mp" ); - precacheshellshock( "tabun_gas_nokick_mp" ); - precacheshellshock( "proximity_grenade" ); - precacheshellshock( "proximity_grenade_exit" ); - level.missileentities = []; - level.hackertooltargets = []; - - if ( !isdefined( level.grenadelauncherdudtime ) ) - level.grenadelauncherdudtime = 0; - - if ( !isdefined( level.throwngrenadedudtime ) ) - level.throwngrenadedudtime = 0; - - level thread onplayerconnect(); - maps\mp\gametypes_zm\_weaponobjects::init(); - - if ( !is_false( level._uses_sticky_grenades ) ) - maps\mp\_sticky_grenade::init(); + precacheitem( "knife_mp" ); + precacheitem( "knife_held_mp" ); + precacheitem( "dogs_mp" ); + precacheitem( "dog_bite_mp" ); + precacheitem( "explosive_bolt_mp" ); + precachemodel( "t6_wpn_claymore_world_detect" ); + precachemodel( "t6_wpn_c4_world_detect" ); + precachemodel( "t5_weapon_scrambler_world_detect" ); + precachemodel( "t6_wpn_tac_insert_detect" ); + precachemodel( "t6_wpn_taser_mine_world_detect" ); + precachemodel( "t6_wpn_motion_sensor_world_detect" ); + precachemodel( "t6_wpn_trophy_system_world_detect" ); + precachemodel( "t6_wpn_bouncing_betty_world_detect" ); + precachemodel( "t6_wpn_tac_insert_world" ); + precachemodel( "t6_wpn_shield_stow_world" ); + precachemodel( "t6_wpn_shield_carry_world" ); + precachemodel( "t5_weapon_camera_head_world" ); + precacheitem( "scavenger_item_mp" ); + precacheitem( "scavenger_item_hack_mp" ); + precacheshader( "hud_scavenger_pickup" ); + precacheshellshock( "default" ); + precacheshellshock( "concussion_grenade_mp" ); + precacheshellshock( "tabun_gas_mp" ); + precacheshellshock( "tabun_gas_nokick_mp" ); + precacheshellshock( "proximity_grenade" ); + precacheshellshock( "proximity_grenade_exit" ); + level.missileentities = []; + level.hackertooltargets = []; + if ( !isdefined( level.grenadelauncherdudtime ) ) + { + level.grenadelauncherdudtime = 0; + } + if ( !isdefined(level.throwngrenadedudtime ) ) + { + level.throwngrenadedudtime = 0; + } + level thread onplayerconnect(); + maps/mp/gametypes_zm/_weaponobjects::init(); + if ( !is_false( level._uses_sticky_grenades ) ) + { + maps/mp/_sticky_grenade::init(); + } } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - player.usedweapons = 0; - player.lastfiretime = 0; - player.hits = 0; - player scavenger_hud_create(); - player thread onplayerspawned(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player.usedweapons = 0; + player.lastfiretime = 0; + player.hits = 0; + player scavenger_hud_create(); + player thread onplayerspawned(); + } } -onplayerspawned() +onplayerspawned() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self.concussionendtime = 0; - self.hasdonecombat = 0; - self.shielddamageblocked = 0; - self thread watchweaponusage(); - self thread watchgrenadeusage(); - self thread watchmissileusage(); - self thread watchweaponchange(); - self thread watchturretuse(); - self thread watchriotshielduse(); - self thread trackweapon(); - self.droppeddeathweapon = undefined; - self.tookweaponfrom = []; - self.pickedupweaponkills = []; - self thread updatestowedweapon(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self.concussionendtime = 0; + self.scavenged = 0; + self.hasdonecombat = 0; + self.shielddamageblocked = 0; + self thread watchweaponusage(); + self thread watchgrenadeusage(); + self thread watchmissileusage(); + self thread watchweaponchange(); + self thread watchturretuse(); + self thread watchriotshielduse(); + self thread trackweapon(); + self.droppeddeathweapon = undefined; + self.tookweaponfrom = []; + self.pickedupweaponkills = []; + self thread updatestowedweapon(); + } } -watchturretuse() +watchturretuse() //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "turretownerchange", turret ); - - self thread watchfortowfire( turret ); - } + self endon( "death" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "turretownerchange", turret ); + self thread watchfortowfire( turret ); + } } -watchfortowfire( turret ) +watchfortowfire( turret ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "turretownerchange" ); - - while ( true ) - { - self waittill( "turret_tow_fire" ); - - self thread watchmissleunlink( turret ); - - self waittill( "turret_tow_unlink" ); - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "turretownerchange" ); + while ( 1 ) + { + self waittill( "turret_tow_fire" ); + self thread watchmissleunlink( turret ); + self waittill( "turret_tow_unlink" ); + } } -watchmissleunlink( turret ) +watchmissleunlink( turret ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "turretownerchange" ); - - self waittill( "turret_tow_unlink" ); - - self relinktoturret( turret ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "turretownerchange" ); + self waittill( "turret_tow_unlink" ); + self relinktoturret( turret ); } -watchweaponchange() +watchweaponchange() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self.lastdroppableweapon = self getcurrentweapon(); - self.hitsthismag = []; - weapon = self getcurrentweapon(); - - if ( isprimaryweapon( weapon ) && !isdefined( self.hitsthismag[weapon] ) ) - self.hitsthismag[weapon] = weaponclipsize( weapon ); - - while ( true ) - { - previous_weapon = self getcurrentweapon(); - - self waittill( "weapon_change", newweapon ); - - if ( maydropweapon( newweapon ) ) - self.lastdroppableweapon = newweapon; - - if ( newweapon != "none" ) - { - if ( ( isprimaryweapon( newweapon ) || issidearm( newweapon ) ) && !isdefined( self.hitsthismag[newweapon] ) ) - self.hitsthismag[newweapon] = weaponclipsize( newweapon ); - } - } + self endon( "death" ); + self endon( "disconnect" ); + self.lastdroppableweapon = self getcurrentweapon(); + self.hitsthismag = []; + weapon = self getcurrentweapon(); + if ( isprimaryweapon( weapon ) && !isDefined( self.hitsthismag[ weapon ] ) ) + { + self.hitsthismag[ weapon ] = weaponclipsize( weapon ); + } + self.lastweaponchange = 0; + while ( 1 ) + { + previous_weapon = self getcurrentweapon(); + self waittill( "weapon_change", newweapon ); + if ( maydropweapon( newweapon ) ) + { + self.lastdroppableweapon = newweapon; + self.lastweaponchange = getTime(); + } + if ( newweapon != "none" ) + { + if ( !isprimaryweapon( newweapon ) || issidearm( newweapon ) && !isDefined( self.hitsthismag[ newweapon ] ) ) + { + self.hitsthismag[ newweapon ] = weaponclipsize( newweapon ); + } + } + } } -watchriotshielduse() +watchriotshielduse() //checked changed to match cerberus output { - } -updatelastheldweapontimings( newtime ) +updatelastheldweapontimings( newtime ) //checked matches cerberus output { - if ( isdefined( self.currentweapon ) && isdefined( self.currentweaponstarttime ) ) - { - totaltime = int( ( newtime - self.currentweaponstarttime ) / 1000 ); - - if ( totaltime > 0 ) - { - self addweaponstat( self.currentweapon, "timeUsed", totaltime ); - self.currentweaponstarttime = newtime; - } - } + if ( isDefined( self.currentweapon ) && isDefined( self.currentweaponstarttime ) ) + { + totaltime = int( ( newtime - self.currentweaponstarttime ) / 1000 ); + if ( totaltime > 0 ) + { + self addweaponstat( self.currentweapon, "timeUsed", totaltime ); + self.currentweaponstarttime = newtime; + } + } } -updateweapontimings( newtime ) +updateweapontimings( newtime ) //checked changed to match beta dump { - if ( self is_bot() ) - return; - - updatelastheldweapontimings( newtime ); - - if ( !isdefined( self.staticweaponsstarttime ) ) - return; - - totaltime = int( ( newtime - self.staticweaponsstarttime ) / 1000 ); - - if ( totaltime < 0 ) - return; - - self.staticweaponsstarttime = newtime; - - if ( isdefined( self.weapon_array_grenade ) ) - { - for ( i = 0; i < self.weapon_array_grenade.size; i++ ) - self addweaponstat( self.weapon_array_grenade[i], "timeUsed", totaltime ); - } - - if ( isdefined( self.weapon_array_inventory ) ) - { - for ( i = 0; i < self.weapon_array_inventory.size; i++ ) - self addweaponstat( self.weapon_array_inventory[i], "timeUsed", totaltime ); - } - - if ( isdefined( self.killstreak ) ) - { - for ( i = 0; i < self.killstreak.size; i++ ) - { - killstreakweapon = level.menureferenceforkillstreak[self.killstreak[i]]; - - if ( isdefined( killstreakweapon ) ) - self addweaponstat( killstreakweapon, "timeUsed", totaltime ); - } - } - - if ( level.rankedmatch && level.perksenabled ) - { - perksindexarray = []; - specialtys = self.specialty; - - if ( !isdefined( specialtys ) ) - return; - - if ( !isdefined( self.class ) ) - return; - - if ( isdefined( self.class_num ) ) - { - for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) - { - perk = self getloadoutitem( self.class_num, "specialty" + ( numspecialties + 1 ) ); - - if ( perk != 0 ) - perksindexarray[perk] = 1; - } - - perkindexarraykeys = getarraykeys( perksindexarray ); - - for ( i = 0; i < perkindexarraykeys.size; i++ ) - { - if ( perksindexarray[perkindexarraykeys[i]] == 1 ) - self adddstat( "itemStats", perkindexarraykeys[i], "stats", "timeUsed", "statValue", totaltime ); - } - } - } + if ( self is_bot() ) + { + return; + } + updatelastheldweapontimings( newtime ); + if ( !isDefined( self.staticweaponsstarttime ) ) + { + return; + } + totaltime = int( ( newtime - self.staticweaponsstarttime ) / 1000 ); + if ( totaltime < 0 ) + { + return; + } + self.staticweaponsstarttime = newtime; + if ( isDefined( self.weapon_array_grenade ) ) + { + for(i = 0; i < self.weapon_array_grenade.size; i++) + { + self addweaponstat( self.weapon_array_grenade[ i ], "timeUsed", totaltime ); + } + } + if ( isDefined( self.weapon_array_inventory ) ) + { + for(i = 0; i < self.weapon_array_inventory.size; i++) + { + self addweaponstat( self.weapon_array_inventory[ i ], "timeUsed", totaltime ); + } + } + if ( isDefined( self.killstreak ) ) + { + for ( i = 0; i < self.killstreak.size; i++ ) + { + killstreakweapon = level.menureferenceforkillstreak[ self.killstreak[ i ] ]; + if ( isDefined( killstreakweapon ) ) + { + self addweaponstat( killstreakweapon, "timeUsed", totaltime ); + } + } + } + if ( level.rankedmatch && level.perksenabled ) + { + perksindexarray = []; + specialtys = self.specialty; + if ( !isDefined( specialtys ) ) + { + return; + } + if ( !isDefined( self.class ) ) + { + return; + } + if ( isDefined( self.class_num ) ) + { + for ( numspecialties = 0; numspecialties < level.maxspecialties; numspecialties++ ) + { + perk = self getloadoutitem( self.class_num, "specialty" + ( numspecialties + 1 ) ); + if ( perk != 0 ) + { + perksindexarray[ perk ] = 1; + } + } + perkindexarraykeys = getarraykeys( perksindexarray ); + for ( i = 0; i < perkindexarraykeys.size; i++ ) + { + if ( perksindexarray[ perkindexarraykeys[ i ] ] == 1 ) + { + self adddstat( "itemStats", perkindexarraykeys[ i ], "stats", "timeUsed", "statValue", totaltime ); + } + } + } + } } -trackweapon() +trackweapon() //checked changed to match beta dump { - currentweapon = self getcurrentweapon(); - currenttime = gettime(); - spawnid = getplayerspawnid( self ); - - while ( true ) - { - event = self waittill_any_return( "weapon_change", "death", "disconnect" ); - newtime = gettime(); - - if ( event == "weapon_change" ) - { - self maps\mp\_bb::commitweapondata( spawnid, currentweapon, currenttime ); - newweapon = self getcurrentweapon(); - - if ( newweapon != "none" && newweapon != currentweapon ) - { - updatelastheldweapontimings( newtime ); - currentweapon = newweapon; - currenttime = newtime; - } - } - else - { - if ( event != "disconnect" ) - { - self maps\mp\_bb::commitweapondata( spawnid, currentweapon, currenttime ); - updateweapontimings( newtime ); - } - - return; - } - } + currentweapon = self getcurrentweapon(); + currenttime = getTime(); + spawnid = getplayerspawnid( self ); + while ( 1 ) + { + event = self waittill_any_return( "weapon_change", "death", "disconnect" ); + newtime = getTime(); + if ( event == "weapon_change" ) + { + self maps/mp/_bb::commitweapondata( spawnid, currentweapon, currenttime ); + newweapon = self getcurrentweapon(); + if ( newweapon != "none" && newweapon != currentweapon ) + { + updatelastheldweapontimings( newtime ); + currentweapon = newweapon; + currenttime = newtime; + } + } + else + { + if ( event != "disconnect" && isDefined( self ) ) + { + self maps/mp/_bb::commitweapondata( spawnid, currentweapon, currenttime ); + updateweapontimings( newtime ); + } + return; + } + } } -maydropweapon( weapon ) +maydropweapon( weapon ) //checked matches cerberus output { - if ( level.disableweapondrop == 1 ) - return false; - - if ( weapon == "none" ) - return false; - - if ( ishackweapon( weapon ) ) - return false; - - invtype = weaponinventorytype( weapon ); - - if ( invtype != "primary" ) - return false; - - if ( weapon == "none" ) - return false; - - return true; + if ( level.disableweapondrop == 1 ) + { + return 0; + } + if ( weapon == "none" ) + { + return 0; + } + if ( ishackweapon( weapon ) ) + { + return 0; + } + invtype = weaponinventorytype( weapon ); + if ( invtype != "primary" ) + { + return 0; + } + if ( weapon == "none" ) + { + return 0; + } + return 1; } -dropweaponfordeath( attacker ) +dropweaponfordeath( attacker, sweapon, smeansofdeath ) //checked matches cerberus output dvars taken from beta dump { - if ( level.disableweapondrop == 1 ) - return; - - weapon = self.lastdroppableweapon; - - if ( isdefined( self.droppeddeathweapon ) ) - return; - - if ( !isdefined( weapon ) ) - { + if ( level.disableweapondrop == 1 ) + { + return; + } + weapon = self.lastdroppableweapon; + if ( isDefined( self.droppeddeathweapon ) ) + { + return; + } + if ( !isDefined( weapon ) ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: not defined" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: not defined" ); #/ - return; - } - - if ( weapon == "none" ) - { + } + */ + return; + } + if ( weapon == "none" ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: weapon == none" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: weapon == none" ); #/ - return; - } - - if ( !self hasweapon( weapon ) ) - { + } + */ + return; + } + if ( !self hasweapon( weapon ) ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); #/ - return; - } - - if ( !self anyammoforweaponmodes( weapon ) ) - { + } + */ + return; + } + if ( !self anyammoforweaponmodes( weapon ) ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: no ammo for weapon modes" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: no ammo for weapon modes" ); #/ - return; - } - - if ( !shoulddroplimitedweapon( weapon, self ) ) - return; - - clipammo = self getweaponammoclip( weapon ); - stockammo = self getweaponammostock( weapon ); - clip_and_stock_ammo = clipammo + stockammo; - - if ( !clip_and_stock_ammo ) - { + } + */ + return; + } + if ( !shoulddroplimitedweapon( weapon, self ) ) + { + return; + } + clipammo = self getweaponammoclip( weapon ); + stockammo = self getweaponammostock( weapon ); + clip_and_stock_ammo = clipammo + stockammo; + if ( !clip_and_stock_ammo ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: no ammo" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: no ammo" ); #/ - return; - } - - stockmax = weaponmaxammo( weapon ); - - if ( stockammo > stockmax ) - stockammo = stockmax; - - item = self dropitem( weapon ); - - if ( !isdefined( item ) ) - { + } + */ + return; + } + stockmax = weaponmaxammo( weapon ); + if ( stockammo > stockmax ) + { + stockammo = stockmax; + } + item = self dropitem( weapon ); + if ( !isDefined( item ) ) + { + /* /# - iprintlnbold( "dropItem: was not able to drop weapon " + weapon ); + iprintlnbold( "dropItem: was not able to drop weapon " + weapon ); #/ - return; - } + */ + return; + } + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "dropped weapon: " + weapon ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "dropped weapon: " + weapon ); #/ - droplimitedweapon( weapon, self, item ); - self.droppeddeathweapon = 1; - item itemweaponsetammo( clipammo, stockammo ); - item.owner = self; - item.ownersattacker = attacker; - item thread watchpickup(); - item thread deletepickupafterawhile(); + } + */ + droplimitedweapon( weapon, self, item ); + self.droppeddeathweapon = 1; + item itemweaponsetammo( clipammo, stockammo ); + item.owner = self; + item.ownersattacker = attacker; + item.sweapon = sweapon; + item.smeansofdeath = smeansofdeath; + item thread watchpickup(); + item thread deletepickupafterawhile(); } -dropweapontoground( weapon ) +dropweapontoground( weapon ) //checked changed to match cerberus output dvars taken from beta dump { - if ( !isdefined( weapon ) ) - { + if ( !isDefined( weapon ) ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: not defined" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: not defined" ); #/ - return; - } - - if ( weapon == "none" ) - { + } + */ + return; + } + if ( weapon == "none" ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: weapon == none" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: weapon == none" ); #/ - return; - } - - if ( !self hasweapon( weapon ) ) - { + } + */ + return; + } + if ( !self hasweapon( weapon ) ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); #/ - return; - } - - if ( !self anyammoforweaponmodes( weapon ) ) - { + } + */ + return; + } + if ( !self anyammoforweaponmodes( weapon ) ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: no ammo for weapon modes" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: no ammo for weapon modes" ); #/ - switch ( weapon ) - { - case "mp40_blinged_mp": - case "minigun_mp": - case "m32_mp": - case "m220_tow_mp": - case "m202_flash_mp": - self takeweapon( weapon ); - break; - default: - break; - } - - return; - } - - if ( !shoulddroplimitedweapon( weapon, self ) ) - return; - - clipammo = self getweaponammoclip( weapon ); - stockammo = self getweaponammostock( weapon ); - clip_and_stock_ammo = clipammo + stockammo; - - if ( !clip_and_stock_ammo ) - { + } + */ + switch( weapon ) + { + case "m202_flash_mp": + case "m220_tow_mp": + case "m32_mp": + case "minigun_mp": + case "mp40_blinged_mp": + self takeweapon( weapon ); + break; + default: + break; + } + if ( !shoulddroplimitedweapon( weapon, self ) ) + { + return; + } + clipammo = self getweaponammoclip( weapon ); + stockammo = self getweaponammostock( weapon ); + clip_and_stock_ammo = clipammo + stockammo; + if ( !clip_and_stock_ammo ) + { + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "didn't drop weapon: no ammo" ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "didn't drop weapon: no ammo" ); #/ - return; - } - - stockmax = weaponmaxammo( weapon ); - - if ( stockammo > stockmax ) - stockammo = stockmax; - - item = self dropitem( weapon ); + } + */ + return; + } + stockmax = weaponmaxammo( weapon ); + if ( stockammo > stockmax ) + { + stockammo = stockmax; + } + item = self dropitem( weapon ); + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "dropped weapon: " + weapon ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "dropped weapon: " + weapon ); #/ - droplimitedweapon( weapon, self, item ); - item itemweaponsetammo( clipammo, stockammo ); - item.owner = self; - item thread watchpickup(); - item thread deletepickupafterawhile(); + } + */ + droplimitedweapon( weapon, self, item ); + item itemweaponsetammo( clipammo, stockammo ); + item.owner = self; + item thread watchpickup(); + item thread deletepickupafterawhile(); + } } -deletepickupafterawhile() +deletepickupafterawhile() //checked matches cerberus output { - self endon( "death" ); - wait 60; - - if ( !isdefined( self ) ) - return; - - self delete(); + self endon( "death" ); + wait 60; + if ( !isDefined( self ) ) + { + return; + } + self delete(); } -getitemweaponname() +getitemweaponname() //checked matches cerberus output { - classname = self.classname; + classname = self.classname; + /* /# - assert( getsubstr( classname, 0, 7 ) == "weapon_" ); + assert( getsubstr( classname, 0, 7 ) == "weapon_" ); #/ - weapname = getsubstr( classname, 7 ); - return weapname; + */ + weapname = getsubstr( classname, 7 ); + return weapname; } -watchpickup() +watchpickup() //checked changed to match cerberus output dvar taken from beta dump { - self endon( "death" ); - weapname = self getitemweaponname(); - - while ( true ) - { - self waittill( "trigger", player, droppeditem ); - - if ( isdefined( droppeditem ) ) - break; - } + self endon( "death" ); + weapname = self getitemweaponname(); + while ( + { + self waittill( "trigger", player, droppeditem ); + if ( isdefined( droppeditem ) ) + { + break; + } + } + /* /# - if ( getdvar( _hash_8F7FC88 ) == "1" ) - println( "picked up weapon: " + weapname + ", " + isdefined( self.ownersattacker ) ); + if ( getDvar( "scr_dropdebug" ) == "1" ) + { + println( "picked up weapon: " + weapname + ", " + isDefined( self.ownersattacker ) ); +#/ + } +/# + assert( isDefined( player.tookweaponfrom ) ); #/ /# - assert( isdefined( player.tookweaponfrom ) ); + assert( isDefined( player.pickedupweaponkills ) ); +#/ + */ + droppedweaponname = droppeditem getitemweaponname(); + if ( isDefined( player.tookweaponfrom[ droppedweaponname ] ) ) + { + droppeditem.owner = player.tookweaponfrom[ droppedweaponname ]; + droppeditem.ownersattacker = player; + player.tookweaponfrom[ droppedweaponname ] = undefined; + } + droppeditem thread watchpickup(); + if ( isDefined( self.ownersattacker ) && self.ownersattacker == player ) + { + player.tookweaponfrom[ weapname ].previousowner = self.owner; + player.pickedupweaponkills[ weapname ] = 0; + } + else + { + player.tookweaponfrom[ weapname ] = undefined; + player.pickedupweaponkills[ weapname ] = undefined; + } +} + +itemremoveammofromaltmodes() //checked matches cerberus output +{ + origweapname = self getitemweaponname(); + curweapname = weaponaltweaponname( origweapname ); + altindex = 1; + while ( curweapname != "none" && curweapname != origweapname ) + { + self itemweaponsetammo( 0, 0, altindex ); + curweapname = weaponaltweaponname( curweapname ); + altindex++; + } +} + +dropoffhand() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +{ + grenadetypes = []; + index = 0; + while ( index < grenadetypes.size ) + { + if ( !self hasweapon( grenadetypes[ index ] ) ) + { + index++; + continue; + } + count = self getammocount( grenadetypes[ index ] ); + if ( !count ) + { + index++; + continue; + } + self dropitem( grenadetypes[ index ] ); + index++; + } +} + +watchweaponusage() //checked changed to match cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + self.usedkillstreakweapon = []; + self.usedkillstreakweapon[ "minigun_mp" ] = 0; + self.usedkillstreakweapon[ "m32_mp" ] = 0; + self.usedkillstreakweapon[ "m202_flash_mp" ] = 0; + self.usedkillstreakweapon[ "m220_tow_mp" ] = 0; + self.usedkillstreakweapon[ "mp40_blinged_mp" ] = 0; + self.killstreaktype = []; + self.killstreaktype[ "minigun_mp" ] = "minigun_mp"; + self.killstreaktype[ "m32_mp" ] = "m32_mp"; + self.killstreaktype[ "m202_flash_mp" ] = "m202_flash_mp"; + self.killstreaktype[ "m220_tow_mp" ] = "m220_tow_mp"; + self.killstreaktype[ "mp40_blinged_mp" ] = "mp40_blinged_drop_mp"; + for ( ;; ) + { + self waittill( "weapon_fired", curweapon ); + self.lastfiretime = getTime(); + self.hasdonecombat = 1; + if ( maps/mp/gametypes_zm/_weapons::isprimaryweapon( curweapon ) || maps/mp/gametypes_zm/_weapons::issidearm( curweapon ) ) + { + if ( isDefined( self.hitsthismag[ curweapon ] ) ) + { + self thread updatemagshots( curweapon ); + } + } + switch ( weaponclass( curweapon ) ) + { + case "rifle": + if ( curweapon == "crossbow_mp" ) + { + level.globalcrossbowfired++; + } + if ( curweapon == "crossbow_explosive_mp" ) + { + level.globalcrossbowfired++; + self addweaponstat( curweapon, "shots", 1 ); + self thread begingrenadetracking(); + break; + } + case "mg": + case "pistol": + case "pistol spread": + case "smg": + case "spread": + self trackweaponfire( curweapon ); + level.globalshotsfired++; + break; + case "grenade": + case "rocketlauncher": + self addweaponstat( curweapon, "shots", 1 ); + break; + default: + break; + } + } +} + +updatemagshots( weaponname ) //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "updateMagShots_" + weaponname ); + self.hitsthismag[ weaponname ]--; + + wait 0.05; + self.hitsthismag[ weaponname ] = weaponclipsize( weaponname ); +} + +checkhitsthismag( weaponname ) //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + self notify( "updateMagShots_" + weaponname ); + waittillframeend; + if ( isDefined( self.hitsthismag[ weaponname ] ) && self.hitsthismag[ weaponname ] == 0 ) + { + if ( !sessionmodeiszombiesgame() ) + { + weaponclass = getweaponclass( weaponname ); + maps/mp/_challenges::fullclipnomisses( weaponclass, weaponname ); + } + self.hitsthismag[ weaponname ] = weaponclipsize( weaponname ); + } +} + +trackweaponfire( curweapon ) //checked changed to match cerberus output +{ + shotsfired = 1; + if ( isdefined( self.laststandparams ) && self.laststandparams.laststandstarttime == GetTime() ) + { + self.hits = 0; + return; + } + pixbeginevent( "trackWeaponFire" ); + if ( is_true( level.pers_upgrade_sniper ) ) + { + maps/mp/zombies/_zm_pers_upgrades_functions::pers_sniper_player_fires( curweapon, self.hits ); + } + self addweaponstat( curweapon, "shots", shotsfired ); + self addweaponstat( curweapon, "hits", self.hits ); + if ( isdefined( level.add_client_stat ) ) + { + self [[ level.add_client_stat ]]( "total_shots", shotsfired ); + self [[ level.add_client_stat ]]( "hits", self.hits ); + } + else + { + self addplayerstat( "total_shots", shotsfired ); + self addplayerstat( "hits", self.hits ); + self addplayerstat( "misses", int( max( 0, shotsfired - self.hits ) ) ); + } + self incrementplayerstat( "total_shots", shotsfired ); + self incrementplayerstat( "hits", self.hits ); + self incrementplayerstat( "misses", int( max( 0, shotsfired - self.hits ) ) ); + self maps/mp/_bb::bbaddtostat( "shots", shotsfired ); + self maps/mp/_bb::bbaddtostat( "hits", self.hits ); + self.hits = 0; + pixendevent(); +} + +checkhit( sweapon ) //checked changed to match cerberus output +{ + switch ( weaponclass( sweapon ) ) + { + case "mg": + case "pistol": + case "rifle": + case "smg": + self.hits++; + break; + case "pistol spread": + case "spread": + self.hits = 1; + break; + default: + break; + } + waittillframeend; + if ( isDefined( self ) && isDefined( self.hitsthismag ) && isDefined( self.hitsthismag[ sweapon ] ) ) + { + self thread checkhitsthismag( sweapon ); + } + if(sweapon == "bazooka_mp" || isstrstart(sweapon, "t34") || isstrstart(sweapon, "panzer")) + { + self addweaponstat(sweapon, "hits", 1); + } +} + +watchgrenadeusage() //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + self.throwinggrenade = 0; + self.gotpullbacknotify = 0; + self thread beginothergrenadetracking(); + self thread watchforthrowbacks(); + self thread watchforgrenadeduds(); + self thread watchforgrenadelauncherduds(); + for ( ;; ) + { + self waittill( "grenade_pullback", weaponname ); + self addweaponstat( weaponname, "shots", 1 ); + self.hasdonecombat = 1; + self.throwinggrenade = 1; + self.gotpullbacknotify = 1; + if ( weaponname == "satchel_charge_mp" ) + { + self thread beginsatcheltracking(); + } + self thread begingrenadetracking(); + } +} + +watchmissileusage() //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + for ( ;; ) + { + self waittill( "missile_fire", missile, weapon_name ); + self.hasdonecombat = 1; + /* +/# + assert( isDefined( missile ) ); +#/ + */ + level.missileentities[ level.missileentities.size ] = missile; + missile thread watchmissiledeath(); + } +} + +watchmissiledeath() //checked matches cerberus output +{ + self waittill( "death" ); + arrayremovevalue( level.missileentities, self ); +} + +dropweaponstoground( origin, radius ) //checked changed to match cerberus output +{ + weapons = getdroppedweapons(); + for ( i = 0; i < weapons.size; i++ ) + { + if ( distancesquared( origin, weapons[ i ].origin ) < ( radius * radius ) ) + { + trace = bullettrace( weapons[ i ].origin, weapons[ i ].origin + vectorScale( ( 0, 0, -1 ), 2000 ), 0, weapons[ i ] ); + weapons[ i ].origin = trace[ "position" ]; + } + } +} + +dropgrenadestoground( origin, radius ) //checked changed to match cerberus output +{ + grenades = getentarray( "grenade", "classname" ); + for ( i = 0; i < grenades.size; i++ ) + { + if ( distancesquared( origin, grenades[ i ].origin ) < ( radius * radius ) ) + { + grenades[ i ] launch( vectorScale( ( 1, 1, 1 ), 5 ) ); + } + } +} + +watchgrenadecancel() //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "grenade_fire" ); + self waittill( "weapon_change", weapon ); + self.throwinggrenade = 0; + self.gotpullbacknotify = 0; +} + +begingrenadetracking() //checked changed to match cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "grenade_throw_cancelled" ); + starttime = getTime(); + self thread watchgrenadecancel(); + self waittill( "grenade_fire", grenade, weaponname ); + /* +/# + assert( isDefined( grenade ) ); +#/ + */ + level.missileentities[ level.missileentities.size ] = grenade; + grenade thread watchmissiledeath(); + if ( grenade maps/mp/_utility::ishacked() ) + { + return; + } + bbprint( "mpequipmentuses", "gametime %d spawnid %d weaponname %s", getTime(), getplayerspawnid( self ), weaponname ); + if ( ( getTime() - starttime ) > 1000 ) + { + grenade.iscooked = 1; + } + switch( weaponname ) + { + case "frag_grenade_zm": + case "sticky_grenade_zm": + self addweaponstat( weaponname, "used", 1 ); + case "explosive_bolt_zm": + grenade.originalowner = self; + break; + } + if ( weaponname == "sticky_grenade_zm" || weaponname == "frag_grenade_zm" ) + { + grenade setteam( self.pers[ "team" ] ); + grenade setowner( self ); + } + self.throwinggrenade = 0; +} + +beginothergrenadetracking() //checked matches cerberus output +{ +} + +checkstucktoplayer( deleteonteamchange, awardscoreevent, weaponname ) //checked matches cerberus output +{ + self endon( "death" ); + self waittill( "stuck_to_player", player ); + if ( isDefined( player ) ) + { + if ( deleteonteamchange ) + { + self thread stucktoplayerteamchange( player ); + } + if ( awardscoreevent && isDefined( self.originalowner ) ) + { + } + self.stucktoplayer = player; + } +} + +checkhatchetbounce() //checked matches cerberus output +{ + self endon( "stuck_to_player" ); + self endon( "death" ); + self waittill( "grenade_bounce" ); + self.bounced = 1; +} + +stucktoplayerteamchange( player ) //checked matches cerberus output +{ + self endon( "death" ); + player endon( "disconnect" ); + originalteam = player.pers[ "team" ]; + while ( 1 ) + { + player waittill( "joined_team" ); + if ( player.pers[ "team" ] != originalteam ) + { + self detonate(); + return; + } + } +} + +beginsatcheltracking() //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + self waittill_any( "grenade_fire", "weapon_change" ); + self.throwinggrenade = 0; +} + +watchforthrowbacks() //checked changed to match cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "grenade_fire", grenade, weapname ); + if ( self.gotpullbacknotify ) + { + self.gotpullbacknotify = 0; + continue; + } + if ( !issubstr( weapname, "frag_" ) ) + { + continue; + } + grenade.threwback = 1; + grenade.originalowner = self; + } +} + +registergrenadelauncherduddvar( dvarstring, defaultvalue, minvalue, maxvalue ) //checked changed to match cerberus output +{ + dvarstring = "scr_" + dvarstring + "_grenadeLauncherDudTime"; + if ( GetDvar( dvarstring ) == "" ) + { + setdvar( dvarstring, defaultvalue ); + } + if ( GetDvarInt( dvarstring ) > maxvalue ) + { + setdvar( dvarstring, maxvalue ); + } + else if ( GetDvarInt( dvarstring ) < minvalue ) + { + setdvar( dvarstring, minvalue ); + } + level.grenadelauncherdudtimedvar = dvarstring; + level.grenadelauncherdudtimemin = minvalue; + level.grenadelauncherdudtimemax = maxvalue; + level.grenadelauncherdudtime = GetDvarInt( level.grenadelauncherdudtimedvar ); +} + +registerthrowngrenadeduddvar( dvarstring, defaultvalue, minvalue, maxvalue ) //checked changed to match cerberus output +{ + dvarstring = "scr_" + dvarstring + "_thrownGrenadeDudTime"; + if ( getDvar( dvarstring ) == "" ) + { + setdvar( dvarstring, defaultvalue ); + } + if ( getDvarInt( dvarstring ) > maxvalue ) + { + setdvar( dvarstring, maxvalue ); + } + else if ( getDvarInt( dvarstring ) < minvalue ) + { + setdvar( dvarstring, minvalue ); + } + level.throwngrenadedudtimedvar = dvarstring; + level.throwngrenadedudtimemin = minvalue; + level.throwngrenadedudtimemax = maxvalue; + level.throwngrenadedudtime = getDvarInt( level.throwngrenadedudtimedvar ); +} + +registerkillstreakdelay( dvarstring, defaultvalue, minvalue, maxvalue ) //checked changed to match cerberus output +{ + dvarstring = "scr_" + dvarstring + "_killstreakDelayTime"; + if ( getDvar( dvarstring ) == "" ) + { + setdvar( dvarstring, defaultvalue ); + } + if ( getDvarInt( dvarstring ) > maxvalue ) + { + setdvar( dvarstring, maxvalue ); + } + else if ( getDvarInt( dvarstring ) < minvalue ) + { + setdvar( dvarstring, minvalue ); + } + level.killstreakrounddelay = getDvarInt( dvarstring ); +} + +turngrenadeintoadud( weapname, isthrowngrenade, player ) //checked changed to match cerberus output +{ + if ( level.grenadelauncherdudtime >= ( maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() / 1000 ) && !isthrowngrenade ) + { + if ( issubstr( weapname, "gl_" ) || weapname == "china_lake_mp" ) + { + timeleft = int( level.grenadelauncherdudtime - ( maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() / 1000 ) ); + if ( !timeleft ) + { + timeleft = 1; + } + player iprintlnbold( &"MP_LAUNCHER_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); + self makegrenadedud(); + } + } + else if ( level.throwngrenadedudtime >= ( maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() / 1000 ) && isthrowngrenade ) + { + if ( weapname == "frag_grenade_mp" || weapname == "sticky_grenade_mp" ) + { + if ( isDefined( player.suicide ) && player.suicide ) + { + return; + } + timeleft = int( level.throwngrenadedudtime - ( maps/mp/gametypes_zm/_globallogic_utils::gettimepassed() / 1000 ) ); + if ( !timeleft ) + { + timeleft = 1; + } + player iprintlnbold( &"MP_GRENADE_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); + self makegrenadedud(); + } + } +} + +watchforgrenadeduds() //checked matches cerberus output +{ + self endon( "spawned_player" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "grenade_fire", grenade, weapname ); + grenade turngrenadeintoadud( weapname, 1, self ); + } +} + +watchforgrenadelauncherduds() //checked matches cerberus output +{ + self endon( "spawned_player" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "grenade_launcher_fire", grenade, weapname ); + grenade turngrenadeintoadud( weapname, 0, self ); + } +} + +getdamageableents( pos, radius, dolos, startradius ) //checked partially changed to match cerberus output did not use continue in for loop and foreach see github for more info +{ + ents = []; + if ( !isDefined( dolos ) ) + { + dolos = 0; + } + if ( !isDefined( startradius ) ) + { + startradius = 0; + } + players = level.players; + for ( i = 0; i < players.size; i++ ) + { + if ( !isalive( players[ i ] ) || players[ i ].sessionstate != "playing" ) + { + } + else + { + playerpos = players[ i ].origin + vectorScale( ( 0, 0, 1 ), 32 ); + distsq = distancesquared( pos, playerpos ); + if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, playerpos, startradius, undefined ) ) + { + newent = spawnstruct(); + newent.isplayer = 1; + newent.isadestructable = 0; + newent.isadestructible = 0; + newent.isactor = 0; + newent.entity = players[ i ]; + newent.damagecenter = playerpos; + ents[ ents.size ] = newent; + } + } + } + grenades = getentarray( "grenade", "classname" ); + for ( i = 0; i < grenades.size; i++ ) + { + entpos = grenades[ i ].origin; + distsq = distancesquared( pos, entpos ); + if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, entpos, startradius, grenades[ i ] ) ) + { + newent = spawnstruct(); + newent.isplayer = 0; + newent.isadestructable = 0; + newent.isadestructible = 0; + newent.isactor = 0; + newent.entity = grenades[ i ]; + newent.damagecenter = entpos; + ents[ ents.size ] = newent; + } + } + destructibles = getentarray( "destructible", "targetname" ); + for ( i = 0; i < destructibles.size; i++ ) + { + entpos = destructibles[ i ].origin; + distsq = distancesquared( pos, entpos ); + if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, entpos, startradius, destructibles[ i ] ) ) + { + newent = spawnstruct(); + newent.isplayer = 0; + newent.isadestructable = 0; + newent.isadestructible = 1; + newent.isactor = 0; + newent.entity = destructibles[ i ]; + newent.damagecenter = entpos; + ents[ ents.size ] = newent; + } + } + destructables = getentarray( "destructable", "targetname" ); + for ( i = 0; i < destructables.size; i++ ) + { + entpos = destructables[ i ].origin; + distsq = distancesquared( pos, entpos ); + if ( distsq < ( radius * radius ) || !dolos && weapondamagetracepassed( pos, entpos, startradius, destructables[ i ] ) ) + { + newent = spawnstruct(); + newent.isplayer = 0; + newent.isadestructable = 1; + newent.isadestructible = 0; + newent.isactor = 0; + newent.entity = destructables[ i ]; + newent.damagecenter = entpos; + ents[ ents.size ] = newent; + } + } + return ents; +} + +weapondamagetracepassed( from, to, startradius, ignore ) //checked matches cerberus output +{ + trace = weapondamagetrace( from, to, startradius, ignore ); + return trace[ "fraction" ] == 1; +} + +weapondamagetrace( from, to, startradius, ignore ) //checked changed to match cerberus output +{ + midpos = undefined; + diff = to - from; + if ( lengthsquared( diff ) < ( startradius * startradius ) ) + { + midpos = to; + } + dir = vectornormalize( diff ); + midpos = from + ( dir[ 0 ] * startradius, dir[ 1 ] * startradius, dir[ 2 ] * startradius ); + trace = bullettrace( midpos, to, 0, ignore ); + if ( getDvarInt( "scr_damage_debug" ) != 0 ) + { + if ( trace[ "fraction" ] == 1 ) + { + thread debugline( midpos, to, ( 1, 1, 1 ) ); + } + else + { + thread debugline( midpos, trace[ "position" ], ( 1, 0.9, 0.8 ) ); + thread debugline( trace[ "position" ], to, ( 1, 0.4, 0.3 ) ); + } + } + return trace; +} + +damageent( einflictor, eattacker, idamage, smeansofdeath, sweapon, damagepos, damagedir ) //checked does not match cerberus output matches beta dump +{ + if ( self.isplayer ) + { + self.damageorigin = damagepos; + self.entity thread [[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, 0, smeansofdeath, sweapon, damagepos, damagedir, "none", 0, 0 ); + } + else if ( self.isactor ) + { + self.damageorigin = damagepos; + self.entity thread [[ level.callbackactordamage ]]( einflictor, eattacker, idamage, 0, smeansofdeath, sweapon, damagepos, damagedir, "none", 0, 0 ); + } + else if ( self.isadestructible ) + { + self.damageorigin = damagepos; + self.entity dodamage( idamage, damagepos, eattacker, einflictor, 0, smeansofdeath, 0, sweapon ); + } + else + { + if ( self.isadestructable || sweapon == "claymore_mp" && sweapon == "airstrike_mp" ) + { + return; + } + self.entity damage_notify_wrapper( idamage, eattacker, ( 0, 0, 0 ), ( 0, 0, 0 ), "mod_explosive", "", "" ); + } +} + +debugline( a, b, color ) //checked changed to match cerberus output +{ + /* +/# + for ( i = 0; i < 600; i++ ) + { + line( a, b, color ); + wait 0.05; +#/ + } + */ +} + +onweapondamage( eattacker, einflictor, sweapon, meansofdeath, damage ) //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + switch( sweapon ) + { + case "concussion_grenade_mp": + radius = 512; + if ( self == eattacker ) + { + radius *= 0.5; + } + scale = 1 - ( distance( self.origin, einflictor.origin ) / radius ); + if ( scale < 0 ) + { + scale = 0; + } + time = 2 + ( 4 * scale ); + wait 0.05; + if ( self hasperk( "specialty_stunprotection" ) ) + { + time *= 0.1; + } + self thread playconcussionsound( time ); + if ( self mayapplyscreeneffect() ) + { + self shellshock( "concussion_grenade_mp", time, 0 ); + } + self.concussionendtime = getTime() + ( time * 1000 ); + break; + default: + maps/mp/gametypes_zm/_shellshock::shellshockondamage( meansofdeath, damage ); + break; + } +} + +playconcussionsound( duration ) //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + concussionsound = spawn( "script_origin", ( 0, 0, 1 ) ); + concussionsound.origin = self.origin; + concussionsound linkto( self ); + concussionsound thread deleteentonownerdeath( self ); + concussionsound playsound( "" ); + concussionsound playloopsound( "" ); + if ( duration > 0.5 ) + { + wait ( duration - 0.5 ); + } + concussionsound playsound( "" ); + concussionsound stoploopsound( 0.5 ); + wait 0.5; + concussionsound notify( "delete" ); + concussionsound delete(); +} + +deleteentonownerdeath( owner ) //checked matches cerberus output +{ + self endon( "delete" ); + owner waittill( "death" ); + self delete(); +} + +monitor_dog_special_grenades() //checked matches cerberus output +{ +} + +isprimaryweapon( weaponname ) //checked matches cerberus output +{ + return isDefined( level.primary_weapon_array[ weaponname ] ); +} + +issidearm( weaponname ) //checked matches cerberus output +{ + return isDefined( level.side_arm_array[ weaponname ] ); +} + +isinventory( weaponname ) //checked matches cerberus output +{ + return isDefined( level.inventory_array[ weaponname ] ); +} + +isgrenade( weaponname ) //checked matches cerberus output +{ + return isDefined( level.grenade_array[ weaponname ] ); +} + +isexplosivebulletweapon( weaponname ) //checked changed to match cerberus output +{ + if ( weaponname == "chopper_minigun_mp" || weaponname == "cobra_20mm_mp" || weaponname == "littlebird_guard_minigun_mp" || weaponname == "cobra_20mm_comlink_mp" ) + { + return 1; + } + return 0; +} + +getweaponclass_array( current ) //checked changed to match cerberus output +{ + if ( isprimaryweapon( current ) ) + { + return level.primary_weapon_array; + } + else if ( issidearm( current ) ) + { + return level.side_arm_array; + } + else if ( isgrenade( current ) ) + { + return level.grenade_array; + } + else + { + return level.inventory_array; + } +} + +updatestowedweapon() //checked partially changed to match cerberus output did not use for loop see github for more info +{ + self endon( "spawned" ); + self endon( "killed_player" ); + self endon( "disconnect" ); + self.tag_stowed_back = undefined; + self.tag_stowed_hip = undefined; + team = self.pers[ "team" ]; + class = self.pers[ "class" ]; + while ( 1 ) + { + self waittill( "weapon_change", newweapon ); + self.weapon_array_primary = []; + self.weapon_array_sidearm = []; + self.weapon_array_grenade = []; + self.weapon_array_inventory = []; + weaponslist = self getweaponslist(); + idx = 0; + while ( idx < weaponslist.size ) + { + switch( weaponslist[ idx ] ) + { + case "m202_flash_mp": + case "m220_tow_mp": + case "m32_mp": + case "minigun_mp": + case "mp40_blinged_mp": + case "zipline_mp": + idx++; + continue; + default: + break; + } + if ( isprimaryweapon( weaponslist[ idx ] ) ) + { + self.weapon_array_primary[ self.weapon_array_primary.size ] = weaponslist[ idx ]; + idx++; + continue; + } + if ( issidearm( weaponslist[ idx ] ) ) + { + self.weapon_array_sidearm[ self.weapon_array_sidearm.size ] = weaponslist[ idx ]; + idx++; + continue; + } + if ( isgrenade( weaponslist[ idx ] ) ) + { + self.weapon_array_grenade[ self.weapon_array_grenade.size ] = weaponslist[ idx ]; + idx++; + continue; + } + if ( isinventory( weaponslist[ idx ] ) ) + { + self.weapon_array_inventory[ self.weapon_array_inventory.size ] = weaponslist[ idx ]; + idx++; + continue; + } + if ( isweaponprimary( weaponslist[ idx ] ) ) + { + self.weapon_array_primary[ self.weapon_array_primary.size ] = weaponslist[ idx ]; + } + idx++; + } + detach_all_weapons(); + stow_on_back(); + stow_on_hip(); + } +} + +forcestowedweaponupdate() //checked matches cerberus output +{ + detach_all_weapons(); + stow_on_back(); + stow_on_hip(); +} + +detachcarryobjectmodel() //checked matches cerberus output +{ + if ( isDefined( self.carryobject ) && isDefined( self.carryobject maps/mp/gametypes_zm/_gameobjects::getvisiblecarriermodel() ) ) + { + if ( isDefined( self.tag_stowed_back ) ) + { + self detach( self.tag_stowed_back, "tag_stowed_back" ); + self.tag_stowed_back = undefined; + } + } +} + +detach_all_weapons() //checked matches cerberus output +{ + if ( isDefined( self.tag_stowed_back ) ) + { + clear_weapon = 1; + if ( isDefined( self.carryobject ) ) + { + carriermodel = self.carryobject maps/mp/gametypes_zm/_gameobjects::getvisiblecarriermodel(); + if ( isDefined( carriermodel ) && carriermodel == self.tag_stowed_back ) + { + self detach( self.tag_stowed_back, "tag_stowed_back" ); + clear_weapon = 0; + } + } + if ( clear_weapon ) + { + self clearstowedweapon(); + } + self.tag_stowed_back = undefined; + } + if ( isDefined( self.tag_stowed_hip ) ) + { + detach_model = getweaponmodel( self.tag_stowed_hip ); + self detach( detach_model, "tag_stowed_hip_rear" ); + self.tag_stowed_hip = undefined; + } +} + +non_stowed_weapon( weapon ) //checked matches cerberus output +{ + if ( self hasweapon( "knife_ballistic_mp" ) && weapon != "knife_ballistic_mp" ) + { + return 1; + } + if ( self hasweapon( "knife_held_mp" ) && weapon != "knife_held_mp" ) + { + return 1; + } + return 0; +} + +stow_on_back( current ) //checked partially changed to match cerberus output did not use for loop see github for more info +{ + current = self getcurrentweapon(); + currentalt = self getcurrentweaponaltweapon(); + self.tag_stowed_back = undefined; + weaponoptions = 0; + index_weapon = ""; + if ( isDefined( self.carryobject ) && isDefined( self.carryobject maps/mp/gametypes_zm/_gameobjects::getvisiblecarriermodel() ) ) + { + self.tag_stowed_back = self.carryobject maps/mp/gametypes_zm/_gameobjects::getvisiblecarriermodel(); + self attach( self.tag_stowed_back, "tag_stowed_back", 1 ); + return; + } + if ( non_stowed_weapon( current ) || self.hasriotshield ) + { + return; + } + if ( current != "none" ) + { + if ( issubstr( current, "gl_" ) || issubstr( temp_index_weapon, "gl_" ) || issubstr( current, "mk_" ) || issubstr( temp_index_weapon, "mk_" ) || issubstr( current, "dualoptic_" ) || issubstr( temp_index_weapon, "dualoptic_" ) || issubstr( current, "ft_" ) || issubstr( temp_index_weapon, "ft_" ) ) + { + index_weapon_tok = strtok( temp_index_weapon, "_" ); + current_tok = strtok( current, "_" ); + for ( i = 0; i < index_weapon_tok.size; i++ ) + { + if ( !issubstr( current, index_weapon_tok[ i ] ) || index_weapon_tok.size != current_tok.size ) + { + i = 0; + break; + } + } + if ( i == index_weapon_tok.size ) + { + continue; + } + } + index_weapon = temp_index_weapon; + /* +/# + assert( isDefined( self.curclass ), "Player missing current class" ); +#/ + */ + if ( issubstr( index_weapon, self.pers[ "primaryWeapon" ] ) && issubstr( self.curclass, "CUSTOM" ) ) + { + self.tag_stowed_back = getweaponmodel( index_weapon ); + } + else + { + stowedmodelindex = getweaponstowedmodel( index_weapon ); + self.tag_stowed_back = getweaponmodel( index_weapon, stowedmodelindex ); + } + if ( issubstr( self.curclass, "CUSTOM" ) ) + { + weaponoptions = self calcweaponoptions( self.class_num, 0 ); + } + idx++; + } + if ( !isDefined( self.tag_stowed_back ) ) + { + return; + } + self setstowedweapon( index_weapon ); +} + +stow_on_hip() //checked partially changed to match cerberus output did not use for loop see github for more info +{ + current = self getcurrentweapon(); + self.tag_stowed_hip = undefined; + idx = 0; + while ( idx < self.weapon_array_inventory.size ) + { + if ( self.weapon_array_inventory[ idx ] == current ) + { + idx++; + continue; + } + if ( !self getweaponammostock( self.weapon_array_inventory[ idx ] ) ) + { + idx++; + continue; + } + self.tag_stowed_hip = self.weapon_array_inventory[ idx ]; + idx++; + } + if ( !isDefined( self.tag_stowed_hip ) ) + { + return; + } + if ( self.tag_stowed_hip != "satchel_charge_mp" || self.tag_stowed_hip == "claymore_mp" && self.tag_stowed_hip == "bouncingbetty_mp" ) + { + self.tag_stowed_hip = undefined; + return; + } + weapon_model = getweaponmodel( self.tag_stowed_hip ); + self attach( weapon_model, "tag_stowed_hip_rear", 1 ); +} + +stow_inventory( inventories, current ) //checked matches cerberus output +{ + if ( isDefined( self.inventory_tag ) ) + { + detach_model = getweaponmodel( self.inventory_tag ); + self detach( detach_model, "tag_stowed_hip_rear" ); + self.inventory_tag = undefined; + } + if ( !isDefined( inventories[ 0 ] ) || self getweaponammostock( inventories[ 0 ] ) == 0 ) + { + return; + } + if ( inventories[ 0 ] != current ) + { + self.inventory_tag = inventories[ 0 ]; + weapon_model = getweaponmodel( self.inventory_tag ); + self attach( weapon_model, "tag_stowed_hip_rear", 1 ); + } +} + +weapons_get_dvar_int( dvar, def ) //checked matches cerberus output +{ + return int( weapons_get_dvar( dvar, def ) ); +} + +weapons_get_dvar( dvar, def ) //checked matches cerberus output +{ + if ( getDvar( dvar ) != "" ) + { + return getDvarFloat( dvar ); + } + else + { + setdvar( dvar, def ); + return def; + } +} + +player_is_driver() //checked matches cerberus output +{ + if ( !isalive( self ) ) + { + return 0; + } + if ( self isremotecontrolling() ) + { + return 0; + } + vehicle = self getvehicleoccupied(); + if ( isDefined( vehicle ) ) + { + seat = vehicle getoccupantseat( self ); + if ( isDefined( seat ) && seat == 0 ) + { + return 1; + } + } + return 0; +} + +loadout_get_class_num() //checked matches cerberus output +{ + /* +/# + assert( isplayer( self ) ); #/ /# - assert( isdefined( player.pickedupweaponkills ) ); + assert( isDefined( self.class ) ); #/ - droppedweaponname = droppeditem getitemweaponname(); - - if ( isdefined( player.tookweaponfrom[droppedweaponname] ) ) - { - droppeditem.owner = player.tookweaponfrom[droppedweaponname]; - droppeditem.ownersattacker = player; - player.tookweaponfrom[droppedweaponname] = undefined; - } - - droppeditem thread watchpickup(); - - if ( isdefined( self.ownersattacker ) && self.ownersattacker == player ) - { - player.tookweaponfrom[weapname] = self.owner; - player.pickedupweaponkills[weapname] = 0; - } - else - { - player.tookweaponfrom[weapname] = undefined; - player.pickedupweaponkills[weapname] = undefined; - } + */ + if ( isDefined( level.classtoclassnum[ self.class ] ) ) + { + return level.classtoclassnum[ self.class ]; + } + class_num = int( self.class[ self.class.size - 1 ] ) - 1; + if ( class_num == -1 ) + { + class_num = 9; + } + return class_num; } -itemremoveammofromaltmodes() +loadout_get_offhand_weapon( stat ) //checked matches cerberus output { - origweapname = self getitemweaponname(); - curweapname = weaponaltweaponname( origweapname ); - - for ( altindex = 1; curweapname != "none" && curweapname != origweapname; altindex++ ) - { - self itemweaponsetammo( 0, 0, altindex ); - curweapname = weaponaltweaponname( curweapname ); - } -} - -dropoffhand() -{ - grenadetypes = []; - - for ( index = 0; index < grenadetypes.size; index++ ) - { - if ( !self hasweapon( grenadetypes[index] ) ) - continue; - - count = self getammocount( grenadetypes[index] ); - - if ( !count ) - continue; - - self dropitem( grenadetypes[index] ); - } -} - -watchweaponusage() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - self.usedkillstreakweapon = []; - self.usedkillstreakweapon["minigun_mp"] = 0; - self.usedkillstreakweapon["m32_mp"] = 0; - self.usedkillstreakweapon["m202_flash_mp"] = 0; - self.usedkillstreakweapon["m220_tow_mp"] = 0; - self.usedkillstreakweapon["mp40_blinged_mp"] = 0; - self.killstreaktype = []; - self.killstreaktype["minigun_mp"] = "minigun_mp"; - self.killstreaktype["m32_mp"] = "m32_mp"; - self.killstreaktype["m202_flash_mp"] = "m202_flash_mp"; - self.killstreaktype["m220_tow_mp"] = "m220_tow_mp"; - self.killstreaktype["mp40_blinged_mp"] = "mp40_blinged_drop_mp"; - - for (;;) - { - self waittill( "weapon_fired", curweapon ); - - self.lastfiretime = gettime(); - self.hasdonecombat = 1; - - if ( maps\mp\gametypes_zm\_weapons::isprimaryweapon( curweapon ) || maps\mp\gametypes_zm\_weapons::issidearm( curweapon ) ) - { - if ( isdefined( self.hitsthismag[curweapon] ) ) - self thread updatemagshots( curweapon ); - } - - switch ( weaponclass( curweapon ) ) - { - case "rifle": - if ( curweapon == "crossbow_explosive_mp" ) - { - level.globalcrossbowfired++; - self addweaponstat( curweapon, "shots", 1 ); - self thread begingrenadetracking(); - continue; - } - case "spread": - case "smg": - case "pistol": - case "mg": - self trackweaponfire( curweapon ); - level.globalshotsfired++; - continue; - case "rocketlauncher": - case "grenade": - self addweaponstat( curweapon, "shots", 1 ); - continue; - default: - continue; - } - } -} - -updatemagshots( weaponname ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "updateMagShots_" + weaponname ); - self.hitsthismag[weaponname]--; - wait 0.05; - self.hitsthismag[weaponname] = weaponclipsize( weaponname ); -} - -checkhitsthismag( weaponname ) -{ - self endon( "death" ); - self endon( "disconnect" ); - self notify( "updateMagShots_" + weaponname ); - waittillframeend; - - if ( isdefined( self.hitsthismag[weaponname] ) && self.hitsthismag[weaponname] == 0 ) - { - if ( !sessionmodeiszombiesgame() ) - { - weaponclass = getweaponclass( weaponname ); - maps\mp\_challenges::fullclipnomisses( weaponclass, weaponname ); - } - - self.hitsthismag[weaponname] = weaponclipsize( weaponname ); - } -} - -trackweaponfire( curweapon ) -{ - shotsfired = 1; - - if ( isdefined( self.laststandparams ) && self.laststandparams.laststandstarttime == gettime() ) - { - self.hits = 0; - return; - } - - pixbeginevent( "trackWeaponFire" ); - - if ( is_true( level.pers_upgrade_sniper ) ) - maps\mp\zombies\_zm_pers_upgrades_functions::pers_sniper_player_fires( curweapon, self.hits ); - - self addweaponstat( curweapon, "shots", shotsfired ); - self addweaponstat( curweapon, "hits", self.hits ); - - if ( isdefined( level.add_client_stat ) ) - { - self [[ level.add_client_stat ]]( "total_shots", shotsfired ); - self [[ level.add_client_stat ]]( "hits", self.hits ); - } - else - { - self addplayerstat( "total_shots", shotsfired ); - self addplayerstat( "hits", self.hits ); - self addplayerstat( "misses", int( max( 0, shotsfired - self.hits ) ) ); - } - - self incrementplayerstat( "total_shots", shotsfired ); - self incrementplayerstat( "hits", self.hits ); - self incrementplayerstat( "misses", int( max( 0, shotsfired - self.hits ) ) ); - self maps\mp\_bb::bbaddtostat( "shots", shotsfired ); - self maps\mp\_bb::bbaddtostat( "hits", self.hits ); - self.hits = 0; - pixendevent(); -} - -checkhit( sweapon ) -{ - switch ( weaponclass( sweapon ) ) - { - case "smg": - case "rifle": - case "pistol": - case "mg": - self.hits++; - break; - case "spread": - case "pistol spread": - self.hits = 1; - break; - default: - break; - } - - waittillframeend; - - if ( isdefined( self.hitsthismag ) && isdefined( self.hitsthismag[sweapon] ) ) - self thread checkhitsthismag( sweapon ); - - if ( sweapon == "bazooka_mp" || isstrstart( sweapon, "t34" ) || isstrstart( sweapon, "panzer" ) ) - self addweaponstat( sweapon, "hits", 1 ); -} - -watchgrenadeusage() -{ - self endon( "death" ); - self endon( "disconnect" ); - self.throwinggrenade = 0; - self.gotpullbacknotify = 0; - self thread beginothergrenadetracking(); - self thread watchforthrowbacks(); - self thread watchforgrenadeduds(); - self thread watchforgrenadelauncherduds(); - - for (;;) - { - self waittill( "grenade_pullback", weaponname ); - - self addweaponstat( weaponname, "shots", 1 ); - self.hasdonecombat = 1; - self.throwinggrenade = 1; - self.gotpullbacknotify = 1; - - if ( weaponname == "satchel_charge_mp" ) - self thread beginsatcheltracking(); - - self thread begingrenadetracking(); - } -} - -watchmissileusage() -{ - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - for (;;) - { - self waittill( "missile_fire", missile, weapon_name ); - - self.hasdonecombat = 1; + if ( isDefined( level.givecustomloadout ) ) + { + return "weapon_null_mp"; + } + /* /# - assert( isdefined( missile ) ); + assert( isDefined( self.class_num ) ); #/ - level.missileentities[level.missileentities.size] = missile; - missile thread watchmissiledeath(); - } + */ + if ( isDefined( self.class_num ) ) + { + index = self maps/mp/gametypes_zm/_class::getloadoutitemfromddlstats( self.class_num, stat ); + if ( isDefined( level.tbl_weaponids[ index ] ) && isDefined( level.tbl_weaponids[ index ][ "reference" ] ) ) + { + return level.tbl_weaponids[ index ][ "reference" ] + "_mp"; + } + } + return "weapon_null_mp"; } -watchmissiledeath() +loadout_get_offhand_count( stat ) //checked matches cerberus output { - self waittill( "death" ); - - arrayremovevalue( level.missileentities, self ); -} - -dropweaponstoground( origin, radius ) -{ - weapons = getdroppedweapons(); - - for ( i = 0; i < weapons.size; i++ ) - { - if ( distancesquared( origin, weapons[i].origin ) < radius * radius ) - { - trace = bullettrace( weapons[i].origin, weapons[i].origin + vectorscale( ( 0, 0, -1 ), 2000.0 ), 0, weapons[i] ); - weapons[i].origin = trace["position"]; - } - } -} - -dropgrenadestoground( origin, radius ) -{ - grenades = getentarray( "grenade", "classname" ); - - for ( i = 0; i < grenades.size; i++ ) - { - if ( distancesquared( origin, grenades[i].origin ) < radius * radius ) - grenades[i] launch( vectorscale( ( 1, 1, 1 ), 5.0 ) ); - } -} - -watchgrenadecancel() -{ - self endon( "death" ); - self endon( "disconnect" ); - self endon( "grenade_fire" ); - - self waittill( "weapon_change" ); - - self.throwinggrenade = 0; - self.gotpullbacknotify = 0; -} - -begingrenadetracking() -{ - self endon( "death" ); - self endon( "disconnect" ); - starttime = gettime(); - self thread watchgrenadecancel(); - - self waittill( "grenade_fire", grenade, weaponname ); + count = 0; + if ( isDefined( level.givecustomloadout ) ) + { + return 0; + } + /* /# - assert( isdefined( grenade ) ); + assert( isDefined( self.class_num ) ); #/ - level.missileentities[level.missileentities.size] = grenade; - grenade thread watchmissiledeath(); - - if ( grenade maps\mp\gametypes_zm\_weaponobjects::ishacked() ) - return; - - bbprint( "mpequipmentuses", "gametime %d spawnid %d weaponname %s", gettime(), getplayerspawnid( self ), weaponname ); - - if ( gettime() - starttime > 1000 ) - grenade.iscooked = 1; - - switch ( weaponname ) - { - case "sticky_grenade_zm": - case "frag_grenade_zm": - self addweaponstat( weaponname, "used", 1 ); - case "explosive_bolt_zm": - grenade.originalowner = self; - break; - } - - if ( weaponname == "sticky_grenade_zm" || weaponname == "frag_grenade_zm" ) - { - grenade setteam( self.pers["team"] ); - grenade setowner( self ); - } - - self.throwinggrenade = 0; + */ + if ( isDefined( self.class_num ) ) + { + count = self maps/mp/gametypes_zm/_class::getloadoutitemfromddlstats( self.class_num, stat ); + } + return count; } -beginothergrenadetracking() +scavenger_think() //checked partially changed to match cerberus output did not use for loops see github for more info { - + self endon( "death" ); + self waittill( "scavenger", player ); + primary_weapons = player getweaponslistprimaries(); + offhand_weapons_and_alts = array_exclude( player getweaponslist( 1 ), primary_weapons ); + arrayremovevalue( offhand_weapons_and_alts, "knife_mp" ); + offhand_weapons_and_alts = array_reverse( offhand_weapons_and_alts ); + player playsound( "fly_equipment_pickup_npc" ); + player playlocalsound( "fly_equipment_pickup_plr" ); + player.scavenger_icon.alpha = 1; + player.scavenger_icon fadeovertime( 2,5 ); + player.scavenger_icon.alpha = 0; + loadout_primary = player loadout_get_offhand_weapon( "primarygrenade" ); + loadout_primary_count = player loadout_get_offhand_count( "primarygrenadecount" ); + loadout_secondary = player loadout_get_offhand_weapon( "specialgrenade" ); + loadout_secondary_count = player loadout_get_offhand_count( "specialgrenadeCount" ); + i = 0; + while ( i < offhand_weapons_and_alts.size ) + { + weapon = offhand_weapons_and_alts[ i ]; + if ( ishackweapon( weapon ) ) + { + i++; + continue; + } + switch ( weapon ) + { + case "satchel_charge_mp": + if ( player maps/mp/gametypes_zm/_weaponobjects::anyobjectsinworld( weapon ) ) + { + break; + } + case "bouncingbetty_mp": + case "claymore_mp": + case "frag_grenade_mp": + case "hatchet_mp": + case "sticky_grenade_mp": + if ( isDefined( player.grenadetypeprimarycount ) && player.grenadetypeprimarycount < 1 ) + { + break; + } + case "concussion_grenade_mp": + case "emp_grenade_mp": + case "flash_grenade_mp": + case "nightingale_mp": + case "pda_hack_mp": + case "proximity_grenade_mp": + case "sensor_grenade_mp": + case "tabun_gas_mp": + case "trophy_system_mp": + case "willy_pete_mp": + if ( isDefined( player.grenadetypesecondarycount ) && player.grenadetypesecondarycount < 1 ) + { + break; + } + maxammo = weaponmaxammo( weapon ); + stock = player getweaponammostock( weapon ); + if ( isDefined( level.customloadoutscavenge ) ) + { + maxammo = self [[ level.customloadoutscavenge ]]( weapon ); + } + else if ( weapon == loadout_primary ) + { + maxammo = loadout_primary_count; + } + else if ( weapon == loadout_secondary ) + { + maxammo = loadout_secondary_count; + } + if ( stock < maxammo ) + { + ammo = stock + 1; + if ( ammo > maxammo ) + { + ammo = maxammo; + } + player setweaponammostock( weapon, ammo ); + player.scavenged = 1; + player thread maps/mp/_challenges::scavengedgrenade(); + } + break; + } + i++; + } + i = 0; + while ( i < primary_weapons.size ) + { + weapon = primary_weapons[ i ]; + if ( ishackweapon( weapon ) || weapon == "kniferang_mp" ) + { + i++; + continue; + } + stock = player getweaponammostock( weapon ); + start = player getfractionstartammo( weapon ); + clip = weaponclipsize( weapon ); + clip *= getdvarfloatdefault( "scavenger_clip_multiplier", 1 ); + clip = int( clip ); + maxammo = weaponmaxammo( weapon ); + if ( stock < ( maxammo - clip ) ) + { + ammo = stock + clip; + player setweaponammostock( weapon, ammo ); + player.scavenged = 1; + exit_early = 1; + i++; + continue; + } + player setweaponammostock( weapon, maxammo ); + player.scavenged = 1; + exit_early = 1; + i++; + } } -checkstucktoplayer( deleteonteamchange, awardscoreevent, weaponname ) +scavenger_hud_create() //checked matches cerberus output { - self endon( "death" ); - - self waittill( "stuck_to_player", player ); - - if ( isdefined( player ) ) - { - if ( deleteonteamchange ) - self thread stucktoplayerteamchange( player ); - - if ( awardscoreevent && isdefined( self.originalowner ) ) - { - if ( self.originalowner isenemyplayer( player ) ) - { - - } - } - - self.stucktoplayer = player; - } + if ( level.wagermatch ) + { + return; + } + self.scavenger_icon = newclienthudelem( self ); + self.scavenger_icon.horzalign = "center"; + self.scavenger_icon.vertalign = "middle"; + self.scavenger_icon.alpha = 0; + width = 48; + height = 24; + if ( level.splitscreen ) + { + width = int( width * 0.5 ); + height = int( height * 0.5 ); + } + self.scavenger_icon.x = ( width * -1 ) / 2; + self.scavenger_icon.y = 16; + self.scavenger_icon setshader( "hud_scavenger_pickup", width, height ); } -checkhatchetbounce() +dropscavengerfordeath( attacker ) //checked matches cerberus output { - self endon( "stuck_to_player" ); - self endon( "death" ); - - self waittill( "grenade_bounce" ); - - self.bounced = 1; + if ( sessionmodeiszombiesgame() ) + { + return; + } + if ( level.wagermatch ) + { + return; + } + if ( !isDefined( attacker ) ) + { + return; + } + if ( attacker == self ) + { + return; + } + if ( level.gametype == "hack" ) + { + item = self dropscavengeritem( "scavenger_item_hack_mp" ); + } + else if ( isplayer( attacker ) && attacker hasperk( "specialty_scavenger" ) ) + { + item = self dropscavengeritem( "scavenger_item_mp" ); + } + else + { + return; + } + item thread scavenger_think(); } -stucktoplayerteamchange( player ) +addlimitedweapon( weapon_name, owner, num_drops ) //checked matches cerberus output { - self endon( "death" ); - player endon( "disconnect" ); - originalteam = player.pers["team"]; - - while ( true ) - { - player waittill( "joined_team" ); - - if ( player.pers["team"] != originalteam ) - { - self detonate(); - return; - } - } + limited_info = spawnstruct(); + limited_info.weapon = weapon_name; + limited_info.drops = num_drops; + owner.limited_info = limited_info; } -beginsatcheltracking() +shoulddroplimitedweapon( weapon_name, owner ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self waittill_any( "grenade_fire", "weapon_change" ); - self.throwinggrenade = 0; + limited_info = owner.limited_info; + if ( !isDefined( limited_info ) ) + { + return 1; + } + if ( limited_info.weapon != weapon_name ) + { + return 1; + } + if ( limited_info.drops <= 0 ) + { + return 0; + } + return 1; } -watchforthrowbacks() +droplimitedweapon( weapon_name, owner, item ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - - for (;;) - { - self waittill( "grenade_fire", grenade, weapname ); - - if ( self.gotpullbacknotify ) - { - self.gotpullbacknotify = 0; - continue; - } - - if ( !issubstr( weapname, "frag_" ) ) - continue; - - grenade.threwback = 1; - grenade.originalowner = self; - } + limited_info = owner.limited_info; + if ( !isDefined( limited_info ) ) + { + return; + } + if ( limited_info.weapon != weapon_name ) + { + return; + } + limited_info.drops -= 1; + owner.limited_info = undefined; + item thread limitedpickup( limited_info ); } -registergrenadelauncherduddvar( dvarstring, defaultvalue, minvalue, maxvalue ) +limitedpickup( limited_info ) //checked matches cerberus output { - dvarstring = "scr_" + dvarstring + "_grenadeLauncherDudTime"; - - if ( getdvar( dvarstring ) == "" ) - setdvar( dvarstring, defaultvalue ); - - if ( getdvarint( dvarstring ) > maxvalue ) - setdvar( dvarstring, maxvalue ); - else if ( getdvarint( dvarstring ) < minvalue ) - setdvar( dvarstring, minvalue ); - - level.grenadelauncherdudtimedvar = dvarstring; - level.grenadelauncherdudtimemin = minvalue; - level.grenadelauncherdudtimemax = maxvalue; - level.grenadelauncherdudtime = getdvarint( level.grenadelauncherdudtimedvar ); + self endon( "death" ); + self waittill( "trigger", player, item ); + if ( !isDefined( item ) ) + { + return; + } + player.limited_info = limited_info; } -registerthrowngrenadeduddvar( dvarstring, defaultvalue, minvalue, maxvalue ) -{ - dvarstring = "scr_" + dvarstring + "_thrownGrenadeDudTime"; - if ( getdvar( dvarstring ) == "" ) - setdvar( dvarstring, defaultvalue ); - - if ( getdvarint( dvarstring ) > maxvalue ) - setdvar( dvarstring, maxvalue ); - else if ( getdvarint( dvarstring ) < minvalue ) - setdvar( dvarstring, minvalue ); - - level.throwngrenadedudtimedvar = dvarstring; - level.throwngrenadedudtimemin = minvalue; - level.throwngrenadedudtimemax = maxvalue; - level.throwngrenadedudtime = getdvarint( level.throwngrenadedudtimedvar ); -} - -registerkillstreakdelay( dvarstring, defaultvalue, minvalue, maxvalue ) -{ - dvarstring = "scr_" + dvarstring + "_killstreakDelayTime"; - - if ( getdvar( dvarstring ) == "" ) - setdvar( dvarstring, defaultvalue ); - - if ( getdvarint( dvarstring ) > maxvalue ) - setdvar( dvarstring, maxvalue ); - else if ( getdvarint( dvarstring ) < minvalue ) - setdvar( dvarstring, minvalue ); - - level.killstreakrounddelay = getdvarint( dvarstring ); -} - -turngrenadeintoadud( weapname, isthrowngrenade, player ) -{ - if ( level.grenadelauncherdudtime >= maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() / 1000 && !isthrowngrenade ) - { - if ( issubstr( weapname, "gl_" ) || weapname == "china_lake_mp" ) - { - timeleft = int( level.grenadelauncherdudtime - maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() / 1000 ); - - if ( !timeleft ) - timeleft = 1; - - player iprintlnbold( &"MP_LAUNCHER_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); - self makegrenadedud(); - } - } - else if ( level.throwngrenadedudtime >= maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() / 1000 && isthrowngrenade ) - { - if ( weapname == "frag_grenade_mp" || weapname == "sticky_grenade_mp" ) - { - if ( isdefined( player.suicide ) && player.suicide ) - return; - - timeleft = int( level.throwngrenadedudtime - maps\mp\gametypes_zm\_globallogic_utils::gettimepassed() / 1000 ); - - if ( !timeleft ) - timeleft = 1; - - player iprintlnbold( &"MP_GRENADE_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); - self makegrenadedud(); - } - } -} - -watchforgrenadeduds() -{ - self endon( "spawned_player" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "grenade_fire", grenade, weapname ); - - grenade turngrenadeintoadud( weapname, 1, self ); - } -} - -watchforgrenadelauncherduds() -{ - self endon( "spawned_player" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "grenade_launcher_fire", grenade, weapname ); - - grenade turngrenadeintoadud( weapname, 0, self ); - } -} - -getdamageableents( pos, radius, dolos, startradius ) -{ - ents = []; - - if ( !isdefined( dolos ) ) - dolos = 0; - - if ( !isdefined( startradius ) ) - startradius = 0; - - players = level.players; - - for ( i = 0; i < players.size; i++ ) - { - if ( !isalive( players[i] ) || players[i].sessionstate != "playing" ) - continue; - - playerpos = players[i].origin + vectorscale( ( 0, 0, 1 ), 32.0 ); - distsq = distancesquared( pos, playerpos ); - - if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, playerpos, startradius, undefined ) ) ) - { - newent = spawnstruct(); - newent.isplayer = 1; - newent.isadestructable = 0; - newent.isadestructible = 0; - newent.isactor = 0; - newent.entity = players[i]; - newent.damagecenter = playerpos; - ents[ents.size] = newent; - } - } - - grenades = getentarray( "grenade", "classname" ); - - for ( i = 0; i < grenades.size; i++ ) - { - entpos = grenades[i].origin; - distsq = distancesquared( pos, entpos ); - - if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, entpos, startradius, grenades[i] ) ) ) - { - newent = spawnstruct(); - newent.isplayer = 0; - newent.isadestructable = 0; - newent.isadestructible = 0; - newent.isactor = 0; - newent.entity = grenades[i]; - newent.damagecenter = entpos; - ents[ents.size] = newent; - } - } - - destructibles = getentarray( "destructible", "targetname" ); - - for ( i = 0; i < destructibles.size; i++ ) - { - entpos = destructibles[i].origin; - distsq = distancesquared( pos, entpos ); - - if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, entpos, startradius, destructibles[i] ) ) ) - { - newent = spawnstruct(); - newent.isplayer = 0; - newent.isadestructable = 0; - newent.isadestructible = 1; - newent.isactor = 0; - newent.entity = destructibles[i]; - newent.damagecenter = entpos; - ents[ents.size] = newent; - } - } - - destructables = getentarray( "destructable", "targetname" ); - - for ( i = 0; i < destructables.size; i++ ) - { - entpos = destructables[i].origin; - distsq = distancesquared( pos, entpos ); - - if ( distsq < radius * radius && ( !dolos || weapondamagetracepassed( pos, entpos, startradius, destructables[i] ) ) ) - { - newent = spawnstruct(); - newent.isplayer = 0; - newent.isadestructable = 1; - newent.isadestructible = 0; - newent.isactor = 0; - newent.entity = destructables[i]; - newent.damagecenter = entpos; - ents[ents.size] = newent; - } - } - - return ents; -} - -weapondamagetracepassed( from, to, startradius, ignore ) -{ - trace = weapondamagetrace( from, to, startradius, ignore ); - return trace["fraction"] == 1; -} - -weapondamagetrace( from, to, startradius, ignore ) -{ - midpos = undefined; - diff = to - from; - - if ( lengthsquared( diff ) < startradius * startradius ) - midpos = to; - - dir = vectornormalize( diff ); - midpos = from + ( dir[0] * startradius, dir[1] * startradius, dir[2] * startradius ); - trace = bullettrace( midpos, to, 0, ignore ); - - if ( getdvarint( _hash_A1C40B1 ) != 0 ) - { - if ( trace["fraction"] == 1 ) - thread debugline( midpos, to, ( 1, 1, 1 ) ); - else - { - thread debugline( midpos, trace["position"], ( 1, 0.9, 0.8 ) ); - thread debugline( trace["position"], to, ( 1, 0.4, 0.3 ) ); - } - } - - return trace; -} - -damageent( einflictor, eattacker, idamage, smeansofdeath, sweapon, damagepos, damagedir ) -{ - if ( self.isplayer ) - { - self.damageorigin = damagepos; - self.entity thread [[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, 0, smeansofdeath, sweapon, damagepos, damagedir, "none", 0, 0 ); - } - else if ( self.isactor ) - { - self.damageorigin = damagepos; - self.entity thread [[ level.callbackactordamage ]]( einflictor, eattacker, idamage, 0, smeansofdeath, sweapon, damagepos, damagedir, "none", 0, 0 ); - } - else if ( self.isadestructible ) - { - self.damageorigin = damagepos; - self.entity dodamage( idamage, damagepos, eattacker, einflictor, 0, smeansofdeath, 0, sweapon ); - } - else - { - if ( self.isadestructable && ( sweapon == "claymore_mp" || sweapon == "airstrike_mp" ) ) - return; - - self.entity damage_notify_wrapper( idamage, eattacker, ( 0, 0, 0 ), ( 0, 0, 0 ), "mod_explosive", "", "" ); - } -} - -debugline( a, b, color ) -{ -/# - for ( i = 0; i < 600; i++ ) - { - line( a, b, color ); - wait 0.05; - } -#/ -} - -onweapondamage( eattacker, einflictor, sweapon, meansofdeath, damage ) -{ - self endon( "death" ); - self endon( "disconnect" ); - - switch ( sweapon ) - { - case "concussion_grenade_mp": - radius = 512; - - if ( self == eattacker ) - radius *= 0.5; - - scale = 1 - distance( self.origin, einflictor.origin ) / radius; - - if ( scale < 0 ) - scale = 0; - - time = 2 + 4 * scale; - wait 0.05; - - if ( self hasperk( "specialty_stunprotection" ) ) - time *= 0.1; - - self thread playconcussionsound( time ); - - if ( self mayapplyscreeneffect() ) - self shellshock( "concussion_grenade_mp", time, 0 ); - - self.concussionendtime = gettime() + time * 1000; - break; - default: - maps\mp\gametypes_zm\_shellshock::shellshockondamage( meansofdeath, damage ); - break; - } -} - -playconcussionsound( duration ) -{ - self endon( "death" ); - self endon( "disconnect" ); - concussionsound = spawn( "script_origin", ( 0, 0, 1 ) ); - concussionsound.origin = self.origin; - concussionsound linkto( self ); - concussionsound thread deleteentonownerdeath( self ); - concussionsound playsound( "" ); - concussionsound playloopsound( "" ); - - if ( duration > 0.5 ) - wait( duration - 0.5 ); - - concussionsound playsound( "" ); - concussionsound stoploopsound( 0.5 ); - wait 0.5; - concussionsound notify( "delete" ); - concussionsound delete(); -} - -deleteentonownerdeath( owner ) -{ - self endon( "delete" ); - - owner waittill( "death" ); - - self delete(); -} - -monitor_dog_special_grenades() -{ - -} - -isprimaryweapon( weaponname ) -{ - return isdefined( level.primary_weapon_array[weaponname] ); -} - -issidearm( weaponname ) -{ - return isdefined( level.side_arm_array[weaponname] ); -} - -isinventory( weaponname ) -{ - return isdefined( level.inventory_array[weaponname] ); -} - -isgrenade( weaponname ) -{ - return isdefined( level.grenade_array[weaponname] ); -} - -isexplosivebulletweapon( weaponname ) -{ - if ( weaponname == "chopper_minigun_mp" || weaponname == "cobra_20mm_mp" || weaponname == "littlebird_guard_minigun_mp" || weaponname == "cobra_20mm_comlink_mp" ) - return true; - - return false; -} - -getweaponclass_array( current ) -{ - if ( isprimaryweapon( current ) ) - return level.primary_weapon_array; - else if ( issidearm( current ) ) - return level.side_arm_array; - else if ( isgrenade( current ) ) - return level.grenade_array; - else - return level.inventory_array; -} - -updatestowedweapon() -{ - self endon( "spawned" ); - self endon( "killed_player" ); - self endon( "disconnect" ); - self.tag_stowed_back = undefined; - self.tag_stowed_hip = undefined; - team = self.pers["team"]; - class = self.pers["class"]; - - while ( true ) - { - self waittill( "weapon_change", newweapon ); - - self.weapon_array_primary = []; - self.weapon_array_sidearm = []; - self.weapon_array_grenade = []; - self.weapon_array_inventory = []; - weaponslist = self getweaponslist(); - - for ( idx = 0; idx < weaponslist.size; idx++ ) - { - switch ( weaponslist[idx] ) - { - case "zipline_mp": - case "mp40_blinged_mp": - case "minigun_mp": - case "m32_mp": - case "m220_tow_mp": - case "m202_flash_mp": - continue; - default: - break; - } - - if ( isprimaryweapon( weaponslist[idx] ) ) - { - self.weapon_array_primary[self.weapon_array_primary.size] = weaponslist[idx]; - continue; - } - - if ( issidearm( weaponslist[idx] ) ) - { - self.weapon_array_sidearm[self.weapon_array_sidearm.size] = weaponslist[idx]; - continue; - } - - if ( isgrenade( weaponslist[idx] ) ) - { - self.weapon_array_grenade[self.weapon_array_grenade.size] = weaponslist[idx]; - continue; - } - - if ( isinventory( weaponslist[idx] ) ) - { - self.weapon_array_inventory[self.weapon_array_inventory.size] = weaponslist[idx]; - continue; - } - - if ( isweaponprimary( weaponslist[idx] ) ) - self.weapon_array_primary[self.weapon_array_primary.size] = weaponslist[idx]; - } - - detach_all_weapons(); - stow_on_back(); - stow_on_hip(); - } -} - -forcestowedweaponupdate() -{ - detach_all_weapons(); - stow_on_back(); - stow_on_hip(); -} - -detachcarryobjectmodel() -{ - if ( isdefined( self.carryobject ) && isdefined( self.carryobject maps\mp\gametypes_zm\_gameobjects::getvisiblecarriermodel() ) ) - { - if ( isdefined( self.tag_stowed_back ) ) - { - self detach( self.tag_stowed_back, "tag_stowed_back" ); - self.tag_stowed_back = undefined; - } - } -} - -detach_all_weapons() -{ - if ( isdefined( self.tag_stowed_back ) ) - { - clear_weapon = 1; - - if ( isdefined( self.carryobject ) ) - { - carriermodel = self.carryobject maps\mp\gametypes_zm\_gameobjects::getvisiblecarriermodel(); - - if ( isdefined( carriermodel ) && carriermodel == self.tag_stowed_back ) - { - self detach( self.tag_stowed_back, "tag_stowed_back" ); - clear_weapon = 0; - } - } - - if ( clear_weapon ) - self clearstowedweapon(); - - self.tag_stowed_back = undefined; - } - - if ( isdefined( self.tag_stowed_hip ) ) - { - detach_model = getweaponmodel( self.tag_stowed_hip ); - self detach( detach_model, "tag_stowed_hip_rear" ); - self.tag_stowed_hip = undefined; - } -} - -non_stowed_weapon( weapon ) -{ - if ( self hasweapon( "knife_ballistic_mp" ) && weapon != "knife_ballistic_mp" ) - return true; - - if ( self hasweapon( "knife_held_mp" ) && weapon != "knife_held_mp" ) - return true; - - return false; -} - -stow_on_back( current ) -{ - current = self getcurrentweapon(); - self.tag_stowed_back = undefined; - weaponoptions = 0; - index_weapon = ""; - - if ( isdefined( self.carryobject ) && isdefined( self.carryobject maps\mp\gametypes_zm\_gameobjects::getvisiblecarriermodel() ) ) - { - self.tag_stowed_back = self.carryobject maps\mp\gametypes_zm\_gameobjects::getvisiblecarriermodel(); - self attach( self.tag_stowed_back, "tag_stowed_back", 1 ); - return; - } - else if ( non_stowed_weapon( current ) || self.hasriotshield ) - return; - else - { - for ( idx = 0; idx < self.weapon_array_primary.size; idx++ ) - { - temp_index_weapon = self.weapon_array_primary[idx]; -/# - assert( isdefined( temp_index_weapon ), "Primary weapon list corrupted." ); -#/ - if ( temp_index_weapon == current ) - continue; - - if ( current == "none" ) - continue; - - if ( issubstr( current, "gl_" ) || issubstr( temp_index_weapon, "gl_" ) || issubstr( current, "mk_" ) || issubstr( temp_index_weapon, "mk_" ) || issubstr( current, "dualoptic_" ) || issubstr( temp_index_weapon, "dualoptic_" ) || issubstr( current, "ft_" ) || issubstr( temp_index_weapon, "ft_" ) ) - { - index_weapon_tok = strtok( temp_index_weapon, "_" ); - current_tok = strtok( current, "_" ); - - for ( i = 0; i < index_weapon_tok.size; i++ ) - { - if ( !issubstr( current, index_weapon_tok[i] ) || index_weapon_tok.size != current_tok.size ) - { - i = 0; - break; - } - } - - if ( i == index_weapon_tok.size ) - continue; - } - - index_weapon = temp_index_weapon; -/# - assert( isdefined( self.curclass ), "Player missing current class" ); -#/ - if ( issubstr( index_weapon, self.pers["primaryWeapon"] ) && issubstr( self.curclass, "CUSTOM" ) ) - self.tag_stowed_back = getweaponmodel( index_weapon, self getloadoutitem( self.class_num, "primarycamo" ) ); - else - { - stowedmodelindex = getweaponstowedmodel( index_weapon ); - self.tag_stowed_back = getweaponmodel( index_weapon, stowedmodelindex ); - } - - if ( issubstr( self.curclass, "CUSTOM" ) ) - weaponoptions = self calcweaponoptions( self.class_num, 0 ); - } - } - - if ( !isdefined( self.tag_stowed_back ) ) - return; - - self setstowedweapon( index_weapon ); -} - -stow_on_hip() -{ - current = self getcurrentweapon(); - self.tag_stowed_hip = undefined; - - for ( idx = 0; idx < self.weapon_array_inventory.size; idx++ ) - { - if ( self.weapon_array_inventory[idx] == current ) - continue; - - if ( !self getweaponammostock( self.weapon_array_inventory[idx] ) ) - continue; - - self.tag_stowed_hip = self.weapon_array_inventory[idx]; - } - - if ( !isdefined( self.tag_stowed_hip ) ) - return; - - if ( self.tag_stowed_hip == "satchel_charge_mp" || self.tag_stowed_hip == "claymore_mp" || self.tag_stowed_hip == "bouncingbetty_mp" ) - { - self.tag_stowed_hip = undefined; - return; - } - - weapon_model = getweaponmodel( self.tag_stowed_hip ); - self attach( weapon_model, "tag_stowed_hip_rear", 1 ); -} - -stow_inventory( inventories, current ) -{ - if ( isdefined( self.inventory_tag ) ) - { - detach_model = getweaponmodel( self.inventory_tag ); - self detach( detach_model, "tag_stowed_hip_rear" ); - self.inventory_tag = undefined; - } - - if ( !isdefined( inventories[0] ) || self getweaponammostock( inventories[0] ) == 0 ) - return; - - if ( inventories[0] != current ) - { - self.inventory_tag = inventories[0]; - weapon_model = getweaponmodel( self.inventory_tag ); - self attach( weapon_model, "tag_stowed_hip_rear", 1 ); - } -} - -weapons_get_dvar_int( dvar, def ) -{ - return int( weapons_get_dvar( dvar, def ) ); -} - -weapons_get_dvar( dvar, def ) -{ - if ( getdvar( dvar ) != "" ) - return getdvarfloat( dvar ); - else - { - setdvar( dvar, def ); - return def; - } -} - -player_is_driver() -{ - if ( !isalive( self ) ) - return false; - - if ( self isremotecontrolling() ) - return false; - - vehicle = self getvehicleoccupied(); - - if ( isdefined( vehicle ) ) - { - seat = vehicle getoccupantseat( self ); - - if ( isdefined( seat ) && seat == 0 ) - return true; - } - - return false; -} - -loadout_get_class_num() -{ -/# - assert( isplayer( self ) ); -#/ -/# - assert( isdefined( self.class ) ); -#/ - if ( isdefined( level.classtoclassnum[self.class] ) ) - return level.classtoclassnum[self.class]; - - class_num = int( self.class[self.class.size - 1] ) - 1; - - if ( -1 == class_num ) - class_num = 9; - - return class_num; -} - -loadout_get_offhand_weapon( stat ) -{ - if ( isdefined( level.givecustomloadout ) ) - return "weapon_null_mp"; - - class_num = self loadout_get_class_num(); - index = 0; - - if ( isdefined( level.tbl_weaponids[index] ) && isdefined( level.tbl_weaponids[index]["reference"] ) ) - return level.tbl_weaponids[index]["reference"] + "_mp"; - - return "weapon_null_mp"; -} - -loadout_get_offhand_count( stat ) -{ - if ( isdefined( level.givecustomloadout ) ) - return 0; - - class_num = self loadout_get_class_num(); - count = 0; - return count; -} - -scavenger_think() -{ - self endon( "death" ); - - self waittill( "scavenger", player ); - - primary_weapons = player getweaponslistprimaries(); - offhand_weapons_and_alts = array_exclude( player getweaponslist( 1 ), primary_weapons ); - arrayremovevalue( offhand_weapons_and_alts, "knife_mp" ); - player playsound( "fly_equipment_pickup_npc" ); - player playlocalsound( "fly_equipment_pickup_plr" ); - player.scavenger_icon.alpha = 1; - player.scavenger_icon fadeovertime( 2.5 ); - player.scavenger_icon.alpha = 0; - scavenger_lethal_proc = 1; - scavenger_tactical_proc = 1; - - if ( !isdefined( player.scavenger_lethal_proc ) ) - { - player.scavenger_lethal_proc = 0; - player.scavenger_tactical_proc = 0; - } - - loadout_primary = player loadout_get_offhand_weapon( "primarygrenade" ); - loadout_primary_count = player loadout_get_offhand_count( "primarygrenadecount" ); - loadout_secondary = player loadout_get_offhand_weapon( "specialgrenade" ); - loadout_secondary_count = player loadout_get_offhand_count( "specialgrenadeCount" ); - - for ( i = 0; i < offhand_weapons_and_alts.size; i++ ) - { - weapon = offhand_weapons_and_alts[i]; - - if ( ishackweapon( weapon ) ) - continue; - - switch ( weapon ) - { - case "sticky_grenade_mp": - case "satchel_charge_mp": - case "hatchet_mp": - case "frag_grenade_mp": - case "claymore_mp": - case "bouncingbetty_mp": - if ( isdefined( player.grenadetypeprimarycount ) && player.grenadetypeprimarycount < 1 ) - continue; - - if ( player getweaponammostock( weapon ) != loadout_primary_count ) - { - if ( player.scavenger_lethal_proc < scavenger_lethal_proc ) - { - player.scavenger_lethal_proc++; - continue; - } - - player.scavenger_lethal_proc = 0; - player.scavenger_tactical_proc = 0; - } - case "willy_pete_mp": - case "trophy_system_mp": - case "tabun_gas_mp": - case "sensor_grenade_mp": - case "proximity_grenade_mp": - case "pda_hack_mp": - case "nightingale_mp": - case "flash_grenade_mp": - case "emp_grenade_mp": - case "concussion_grenade_mp": - if ( isdefined( player.grenadetypesecondarycount ) && player.grenadetypesecondarycount < 1 ) - continue; - - if ( weapon == loadout_secondary && player getweaponammostock( weapon ) != loadout_secondary_count ) - { - if ( player.scavenger_tactical_proc < scavenger_tactical_proc ) - { - player.scavenger_tactical_proc++; - continue; - } - - player.scavenger_tactical_proc = 0; - player.scavenger_lethal_proc = 0; - } - - maxammo = weaponmaxammo( weapon ); - stock = player getweaponammostock( weapon ); - - if ( isdefined( level.customloadoutscavenge ) ) - maxammo = self [[ level.customloadoutscavenge ]]( weapon ); - else if ( weapon == loadout_primary ) - maxammo = loadout_primary_count; - else if ( weapon == loadout_secondary ) - maxammo = loadout_secondary_count; - - if ( stock < maxammo ) - { - ammo = stock + 1; - - if ( ammo > maxammo ) - ammo = maxammo; - - player setweaponammostock( weapon, ammo ); - player thread maps\mp\_challenges::scavengedgrenade(); - } - - continue; - default: - if ( islauncherweapon( weapon ) ) - { - stock = player getweaponammostock( weapon ); - start = player getfractionstartammo( weapon ); - clip = weaponclipsize( weapon ); - clip *= getdvarfloatdefault( "scavenger_clip_multiplier", 2 ); - clip = int( clip ); - maxammo = weaponmaxammo( weapon ); - - if ( stock < maxammo - clip ) - { - ammo = stock + clip; - player setweaponammostock( weapon, ammo ); - } - else - player setweaponammostock( weapon, maxammo ); - } - - continue; - } - } - - for ( i = 0; i < primary_weapons.size; i++ ) - { - weapon = primary_weapons[i]; - - if ( ishackweapon( weapon ) || weapon == "kniferang_mp" ) - continue; - - stock = player getweaponammostock( weapon ); - start = player getfractionstartammo( weapon ); - clip = weaponclipsize( weapon ); - clip *= getdvarfloatdefault( "scavenger_clip_multiplier", 2 ); - clip = int( clip ); - maxammo = weaponmaxammo( weapon ); - - if ( stock < maxammo - clip ) - { - ammo = stock + clip; - player setweaponammostock( weapon, ammo ); - continue; - } - - player setweaponammostock( weapon, maxammo ); - } -} - -scavenger_hud_create() -{ - if ( level.wagermatch ) - return; - - self.scavenger_icon = newclienthudelem( self ); - self.scavenger_icon.horzalign = "center"; - self.scavenger_icon.vertalign = "middle"; - self.scavenger_icon.x = -16; - self.scavenger_icon.y = 16; - self.scavenger_icon.alpha = 0; - width = 32; - height = 16; - - if ( self issplitscreen() ) - { - width = int( width * 0.5 ); - height = int( height * 0.5 ); - self.scavenger_icon.x = -8; - } - - self.scavenger_icon setshader( "hud_scavenger_pickup", width, height ); -} - -dropscavengerfordeath( attacker ) -{ - if ( sessionmodeiszombiesgame() ) - return; - - if ( level.wagermatch ) - return; - - if ( !isdefined( attacker ) ) - return; - - if ( attacker == self ) - return; - - if ( level.gametype == "hack" ) - item = self dropscavengeritem( "scavenger_item_hack_mp" ); - else - item = self dropscavengeritem( "scavenger_item_mp" ); - - item thread scavenger_think(); -} - -addlimitedweapon( weapon_name, owner, num_drops ) -{ - limited_info = spawnstruct(); - limited_info.weapon = weapon_name; - limited_info.drops = num_drops; - owner.limited_info = limited_info; -} - -shoulddroplimitedweapon( weapon_name, owner ) -{ - limited_info = owner.limited_info; - - if ( !isdefined( limited_info ) ) - return true; - - if ( limited_info.weapon != weapon_name ) - return true; - - if ( limited_info.drops <= 0 ) - return false; - - return true; -} - -droplimitedweapon( weapon_name, owner, item ) -{ - limited_info = owner.limited_info; - - if ( !isdefined( limited_info ) ) - return; - - if ( limited_info.weapon != weapon_name ) - return; - - limited_info.drops -= 1; - owner.limited_info = undefined; - item thread limitedpickup( limited_info ); -} - -limitedpickup( limited_info ) -{ - self endon( "death" ); - - self waittill( "trigger", player, item ); - - if ( !isdefined( item ) ) - return; - - player.limited_info = limited_info; -} diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_zm_gametype.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_zm_gametype.gsc index 8dc9b9e..f2f6fb0 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_zm_gametype.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_zm_gametype.gsc @@ -1,1943 +1,2010 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include common_scripts\utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\gametypes_zm\_globallogic; -#include maps\mp\gametypes_zm\_callbacksetup; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\gametypes_zm\_gameobjects; -#include maps\mp\gametypes_zm\_globallogic_spawn; -#include maps\mp\gametypes_zm\_globallogic_defaults; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\gametypes_zm\_hud_message; -#include maps\mp\gametypes_zm\_globallogic_ui; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_audio_announcer; -#include maps\mp\gametypes_zm\_hud; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\gametypes_zm\_spawning; -#include maps\mp\zombies\_zm_blockers; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\zombies\_zm_game_module; -#include maps\mp\zombies\_zm_spawner; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_game_module; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_blockers; +#include maps/mp/gametypes_zm/_spawning; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/gametypes_zm/_hud; +#include maps/mp/zombies/_zm_audio_announcer; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/gametypes_zm/_globallogic_ui; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/gametypes_zm/_globallogic_defaults; +#include maps/mp/gametypes_zm/_globallogic_spawn; +#include maps/mp/gametypes_zm/_gameobjects; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/gametypes_zm/_callbacksetup; +#include maps/mp/gametypes_zm/_globallogic; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/_utility; + +main() //checked matches cerberus output +{ + maps/mp/gametypes_zm/_globallogic::init(); + maps/mp/gametypes_zm/_callbacksetup::setupcallbacks(); + globallogic_setupdefault_zombiecallbacks(); + menu_init(); + registerroundlimit( 1, 1 ); + registertimelimit( 0, 0 ); + registerscorelimit( 0, 0 ); + registerroundwinlimit( 0, 0 ); + registernumlives( 1, 1 ); + maps/mp/gametypes_zm/_weapons::registergrenadelauncherduddvar( level.gametype, 10, 0, 1440 ); + maps/mp/gametypes_zm/_weapons::registerthrowngrenadeduddvar( level.gametype, 0, 0, 1440 ); + maps/mp/gametypes_zm/_weapons::registerkillstreakdelay( level.gametype, 0, 0, 1440 ); + maps/mp/gametypes_zm/_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); + level.takelivesondeath = 1; + level.teambased = 1; + level.disableprematchmessages = 1; + level.disablemomentum = 1; + level.overrideteamscore = 0; + level.overrideplayerscore = 0; + level.displayhalftimetext = 0; + level.displayroundendtext = 0; + level.allowannouncer = 0; + level.endgameonscorelimit = 0; + level.endgameontimelimit = 0; + level.resetplayerscoreeveryround = 1; + level.doprematch = 0; + level.nopersistence = 1; + level.scoreroundbased = 0; + level.forceautoassign = 1; + level.dontshowendreason = 1; + level.forceallallies = 0; + level.allow_teamchange = 0; + setdvar( "scr_disable_team_selection", 1 ); + makedvarserverinfo( "scr_disable_team_selection", 1 ); + setmatchflag( "hud_zombie", 1 ); + setdvar( "scr_disable_weapondrop", 1 ); + setdvar( "scr_xpscale", 0 ); + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::blank; + level.onspawnplayerunified = ::onspawnplayerunified; + level.onroundendgame = ::onroundendgame; + level.mayspawn = ::mayspawn; + set_game_var( "ZM_roundLimit", 1 ); + set_game_var( "ZM_scoreLimit", 1 ); + set_game_var( "_team1_num", 0 ); + set_game_var( "_team2_num", 0 ); + map_name = level.script; + mode = getDvar( "ui_gametype" ); + if ( !isDefined( mode ) && isDefined( level.default_game_mode ) || mode == "" && isDefined( level.default_game_mode ) ) + { + mode = level.default_game_mode; + } + set_gamemode_var_once( "mode", mode ); + set_game_var_once( "side_selection", 1 ); + location = getDvar( "ui_zm_mapstartlocation" ); + if ( location == "" && isDefined( level.default_start_location ) ) + { + location = level.default_start_location; + } + set_gamemode_var_once( "location", location ); + set_gamemode_var_once( "randomize_mode", getDvarInt( "zm_rand_mode" ) ); + set_gamemode_var_once( "randomize_location", getDvarInt( "zm_rand_loc" ) ); + set_gamemode_var_once( "team_1_score", 0 ); + set_gamemode_var_once( "team_2_score", 0 ); + set_gamemode_var_once( "current_round", 0 ); + set_gamemode_var_once( "rules_read", 0 ); + set_game_var_once( "switchedsides", 0 ); + gametype = getDvar( "ui_gametype" ); + game[ "dialog" ][ "gametype" ] = gametype + "_start"; + game[ "dialog" ][ "gametype_hardcore" ] = gametype + "_start"; + game[ "dialog" ][ "offense_obj" ] = "generic_boost"; + game[ "dialog" ][ "defense_obj" ] = "generic_boost"; + set_gamemode_var( "pre_init_zombie_spawn_func", undefined ); + set_gamemode_var( "post_init_zombie_spawn_func", undefined ); + set_gamemode_var( "match_end_notify", undefined ); + set_gamemode_var( "match_end_func", undefined ); + setscoreboardcolumns( "score", "kills", "downs", "revives", "headshots" ); + onplayerconnect_callback( ::onplayerconnect_check_for_hotjoin ); +} + +game_objects_allowed( mode, location ) //checked partially changed to match cerberus output changed at own discretion +{ + allowed[ 0 ] = mode; + entities = getentarray(); + i = 0; + while ( i < entities.size ) + { + if ( isDefined( entities[ i ].script_gameobjectname ) ) + { + isallowed = maps/mp/gametypes_zm/_gameobjects::entity_is_allowed( entities[ i ], allowed ); + isvalidlocation = maps/mp/gametypes_zm/_gameobjects::location_is_allowed( entities[ i ], location ); + if ( !isallowed || !isvalidlocation && !is_classic() ) + { + if ( isDefined( entities[ i ].spawnflags ) && entities[ i ].spawnflags == 1 ) + { + if ( isDefined( entities[ i ].classname ) && entities[ i ].classname != "trigger_multiple" ) + { + entities[ i ] connectpaths(); + } + } + entities[ i ] delete(); + i++; + continue; + } + if ( isDefined( entities[ i ].script_vector ) ) + { + entities[ i ] moveto( entities[ i ].origin + entities[ i ].script_vector, 0.05 ); + entities[ i ] waittill( "movedone" ); + if ( isDefined( entities[ i ].spawnflags ) && entities[ i ].spawnflags == 1 ) + { + entities[ i ] disconnectpaths(); + } + i++; + continue; + } + if ( isDefined( entities[ i ].spawnflags ) && entities[ i ].spawnflags == 1 ) + { + if ( isDefined( entities[ i ].classname ) && entities[ i ].classname != "trigger_multiple" ) + { + entities[ i ] connectpaths(); + } + } + } + i++; + } +} + +post_init_gametype() //checked matches cerberus output +{ + if ( isDefined( level.gamemode_map_postinit ) ) + { + if ( isDefined( level.gamemode_map_postinit[ level.scr_zm_ui_gametype ] ) ) + { + [[ level.gamemode_map_postinit[ level.scr_zm_ui_gametype ] ]](); + } + } +} + +post_gametype_main( mode ) //checked matches cerberus output +{ + set_game_var( "ZM_roundWinLimit", get_game_var( "ZM_roundLimit" ) * 0.5 ); + level.roundlimit = get_game_var( "ZM_roundLimit" ); + if ( isDefined( level.gamemode_map_preinit ) ) + { + if ( isDefined( level.gamemode_map_preinit[ mode ] ) ) + { + [[ level.gamemode_map_preinit[ mode ] ]](); + } + } +} + +globallogic_setupdefault_zombiecallbacks() //checked matches cerberus output +{ + level.spawnplayer = maps/mp/gametypes_zm/_globallogic_spawn::spawnplayer; + level.spawnplayerprediction = maps/mp/gametypes_zm/_globallogic_spawn::spawnplayerprediction; + level.spawnclient = maps/mp/gametypes_zm/_globallogic_spawn::spawnclient; + level.spawnspectator = maps/mp/gametypes_zm/_globallogic_spawn::spawnspectator; + level.spawnintermission = maps/mp/gametypes_zm/_globallogic_spawn::spawnintermission; + level.onplayerscore = ::blank; + level.onteamscore = ::blank; + + //doesn't exist in any dump or any other script no idea what its trying to override to + level.wavespawntimer = maps/mp/gametypes_zm/_globallogic::wavespawntimer; + level.onspawnplayer = ::blank; + level.onspawnplayerunified = ::blank; + level.onspawnspectator = ::onspawnspectator; + level.onspawnintermission = ::onspawnintermission; + level.onrespawndelay = ::blank; + level.onforfeit = ::blank; + level.ontimelimit = ::blank; + level.onscorelimit = ::blank; + level.ondeadevent = ::ondeadevent; + level.ononeleftevent = ::blank; + level.giveteamscore = ::blank; + level.giveplayerscore = ::blank; + level.gettimelimit = maps/mp/gametypes_zm/_globallogic_defaults::default_gettimelimit; + level.getteamkillpenalty = ::blank; + level.getteamkillscore = ::blank; + level.iskillboosting = ::blank; + level._setteamscore = maps/mp/gametypes_zm/_globallogic_score::_setteamscore; + level._setplayerscore = ::blank; + level._getteamscore = ::blank; + level._getplayerscore = ::blank; + level.onprecachegametype = ::blank; + level.onstartgametype = ::blank; + level.onplayerconnect = ::blank; + level.onplayerdisconnect = ::onplayerdisconnect; + level.onplayerdamage = ::blank; + level.onplayerkilled = ::blank; + level.onplayerkilledextraunthreadedcbs = []; + level.onteamoutcomenotify = maps/mp/gametypes_zm/_hud_message::teamoutcomenotifyzombie; + level.onoutcomenotify = ::blank; + level.onteamwageroutcomenotify = ::blank; + level.onwageroutcomenotify = ::blank; + level.onendgame = ::onendgame; + level.onroundendgame = ::blank; + level.onmedalawarded = ::blank; + level.autoassign = maps/mp/gametypes_zm/_globallogic_ui::menuautoassign; + level.spectator = maps/mp/gametypes_zm/_globallogic_ui::menuspectator; + level.class = maps/mp/gametypes_zm/_globallogic_ui::menuclass; + level.allies = ::menuallieszombies; + level.teammenu = maps/mp/gametypes_zm/_globallogic_ui::menuteam; + level.callbackactorkilled = ::blank; + level.callbackvehicledamage = ::blank; +} + +setup_standard_objects( location ) //checked partially used cerberus output +{ + structs = getstructarray( "game_mode_object" ); + i = 0; + while ( i < structs.size ) + { + if ( isdefined( structs[ i ].script_noteworthy ) && structs[ i ].script_noteworthy != location ) + { + i++; + continue; + } + if ( isdefined( structs[ i ].script_string ) ) + { + keep = 0; + tokens = strtok( structs[ i ].script_string, " " ); + foreach ( token in tokens ) + { + if ( token == level.scr_zm_ui_gametype && token != "zstandard" ) + { + keep = 1; + continue; + } + else if ( token == "zstandard" ) + { + keep = 1; + } + } + if ( !keep ) + { + i++; + continue; + } + } + barricade = spawn( "script_model", structs[ i ].origin ); + barricade.angles = structs[ i ].angles; + barricade setmodel( structs[ i ].script_parameters ); + i++; + } + objects = getentarray(); + i = 0; + while ( i < objects.size ) + { + if ( !objects[ i ] is_survival_object() ) + { + i++; + continue; + } + if ( isdefined( objects[ i ].spawnflags ) && objects[ i ].spawnflags == 1 && objects[ i ].classname != "trigger_multiple" ) + { + objects[ i ] connectpaths(); + } + objects[ i ] delete(); + i++; + } + if ( isdefined( level._classic_setup_func ) ) + { + [[ level._classic_setup_func ]](); + } +} + + +is_survival_object() //checked changed to cerberus output +{ + if ( !isdefined( self.script_parameters ) ) + { + return 0; + } + tokens = strtok( self.script_parameters, " " ); + remove = 0; + foreach ( token in tokens ) + { + if ( token == "survival_remove" ) + { + remove = 1; + } + } + return remove; +} + +game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) //checked partially changed output to cerberus output +{ + self.last_damage_from_zombie_or_player = 0; + if ( isDefined( eattacker ) ) + { + if ( isplayer( eattacker ) && eattacker == self ) + { + return; + } + if ( isDefined( eattacker.is_zombie ) || eattacker.is_zombie && isplayer( eattacker ) ) + { + self.last_damage_from_zombie_or_player = 1; + } + } + if ( is_true( self._being_shellshocked ) || self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return; + } + if ( isplayer( eattacker ) && isDefined( eattacker._encounters_team ) && eattacker._encounters_team != self._encounters_team ) + { + if ( is_true( self.hasriotshield ) && isDefined( vdir ) ) + { + if ( is_true( self.hasriotshieldequipped ) ) + { + if ( self maps/mp/zombies/_zm::player_shield_facing_attacker( vdir, 0.2 ) && isDefined( self.player_shield_apply_damage ) ) + { + return; + } + } + else if ( !isdefined( self.riotshieldentity ) ) + { + if ( !self maps/mp/zombies/_zm::player_shield_facing_attacker( vdir, -0.2 ) && isdefined( self.player_shield_apply_damage ) ) + { + return; + } + } + } + if ( isDefined( level._game_module_player_damage_grief_callback ) ) + { + self [[ level._game_module_player_damage_grief_callback ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + } + if ( isDefined( level._effect[ "butterflies" ] ) ) + { + if ( isDefined( sweapon ) && weapontype( sweapon ) == "grenade" ) + { + playfx( level._effect[ "butterflies" ], self.origin + vectorScale( ( 1, 1, 1 ), 40 ) ); + } + else + { + playfx( level._effect[ "butterflies" ], vpoint, vdir ); + } + } + self thread do_game_mode_shellshock(); + self playsound( "zmb_player_hit_ding" ); + } +} + +do_game_mode_shellshock() //checked matched cerberus output +{ + self endon( "disconnect" ); + self._being_shellshocked = 1; + self shellshock( "grief_stab_zm", 0.75 ); + wait 0.75; + self._being_shellshocked = 0; +} + +add_map_gamemode( mode, preinit_func, precache_func, main_func ) //checked matches cerberus output +{ + if ( !isDefined( level.gamemode_map_location_init ) ) + { + level.gamemode_map_location_init = []; + } + if ( !isDefined( level.gamemode_map_location_main ) ) + { + level.gamemode_map_location_main = []; + } + if ( !isDefined( level.gamemode_map_preinit ) ) + { + level.gamemode_map_preinit = []; + } + if ( !isDefined( level.gamemode_map_postinit ) ) + { + level.gamemode_map_postinit = []; + } + if ( !isDefined( level.gamemode_map_precache ) ) + { + level.gamemode_map_precache = []; + } + if ( !isDefined( level.gamemode_map_main ) ) + { + level.gamemode_map_main = []; + } + level.gamemode_map_preinit[ mode ] = preinit_func; + level.gamemode_map_main[ mode ] = main_func; + level.gamemode_map_precache[ mode ] = precache_func; + level.gamemode_map_location_precache[ mode ] = []; + level.gamemode_map_location_main[ mode ] = []; +} + +add_map_location_gamemode( mode, location, precache_func, main_func ) //checked matches cerberus output +{ + if ( !isDefined( level.gamemode_map_location_precache[ mode ] ) ) + { + /* +/# + println( "*** ERROR : " + mode + " has not been added to the map using add_map_gamemode." ); +#/ + */ + return; + } + level.gamemode_map_location_precache[ mode ][ location ] = precache_func; + level.gamemode_map_location_main[ mode ][ location ] = main_func; +} + +rungametypeprecache( gamemode ) //checked matches cerberus output +{ + if ( !isDefined( level.gamemode_map_location_main ) || !isDefined( level.gamemode_map_location_main[ gamemode ] ) ) + { + return; + } + if ( isDefined( level.gamemode_map_precache ) ) + { + if ( isDefined( level.gamemode_map_precache[ gamemode ] ) ) + { + [[ level.gamemode_map_precache[ gamemode ] ]](); + } + } + if ( isDefined( level.gamemode_map_location_precache ) ) + { + if ( isDefined( level.gamemode_map_location_precache[ gamemode ] ) ) + { + loc = getDvar( "ui_zm_mapstartlocation" ); + if ( loc == "" && isDefined( level.default_start_location ) ) + { + loc = level.default_start_location; + } + if ( isDefined( level.gamemode_map_location_precache[ gamemode ][ loc ] ) ) + { + [[ level.gamemode_map_location_precache[ gamemode ][ loc ] ]](); + } + } + } + if ( isDefined( level.precachecustomcharacters ) ) + { + self [[ level.precachecustomcharacters ]](); + } +} + +rungametypemain( gamemode, mode_main_func, use_round_logic ) //checked matches cerberus output +{ + if ( !isDefined( level.gamemode_map_location_main ) || !isDefined( level.gamemode_map_location_main[ gamemode ] ) ) + { + return; + } + level thread game_objects_allowed( get_gamemode_var( "mode" ), get_gamemode_var( "location" ) ); + if ( isDefined( level.gamemode_map_main ) ) + { + if ( isDefined( level.gamemode_map_main[ gamemode ] ) ) + { + level thread [[ level.gamemode_map_main[ gamemode ] ]](); + } + } + if ( isDefined( level.gamemode_map_location_main ) ) + { + if ( isDefined( level.gamemode_map_location_main[ gamemode ] ) ) + { + loc = getDvar( "ui_zm_mapstartlocation" ); + if ( loc == "" && isDefined( level.default_start_location ) ) + { + loc = level.default_start_location; + } + if ( isDefined( level.gamemode_map_location_main[ gamemode ][ loc ] ) ) + { + level thread [[ level.gamemode_map_location_main[ gamemode ][ loc ] ]](); + } + } + } + if ( isDefined( mode_main_func ) ) + { + if ( is_true( use_round_logic ) ) + { + level thread round_logic( mode_main_func ); + } + else + { + level thread non_round_logic( mode_main_func ); + } + } + level thread game_end_func(); +} + + +round_logic( mode_logic_func ) //checked matches cerberus output +{ + level.skit_vox_override = 1; + if ( isDefined( level.flag[ "start_zombie_round_logic" ] ) ) + { + flag_wait( "start_zombie_round_logic" ); + } + flag_wait( "start_encounters_match_logic" ); + if ( !isDefined( game[ "gamemode_match" ][ "rounds" ] ) ) + { + game[ "gamemode_match" ][ "rounds" ] = []; + } + set_gamemode_var_once( "current_round", 0 ); + set_gamemode_var_once( "team_1_score", 0 ); + set_gamemode_var_once( "team_2_score", 0 ); + if ( is_true( is_encounter() ) ) + { + [[ level._setteamscore ]]( "allies", get_gamemode_var( "team_2_score" ) ); + [[ level._setteamscore ]]( "axis", get_gamemode_var( "team_1_score" ) ); + } + flag_set( "pregame" ); + waittillframeend; + level.gameended = 0; + cur_round = get_gamemode_var( "current_round" ); + set_gamemode_var( "current_round", cur_round + 1 ); + game[ "gamemode_match" ][ "rounds" ][ cur_round ] = spawnstruct(); + game[ "gamemode_match" ][ "rounds" ][ cur_round ].mode = getDvar( "ui_gametype" ); + level thread [[ mode_logic_func ]](); + flag_wait( "start_encounters_match_logic" ); + level.gamestarttime = getTime(); + level.gamelengthtime = undefined; + level notify( "clear_hud_elems" ); + level waittill( "game_module_ended", winner ); + game[ "gamemode_match" ][ "rounds" ][ cur_round ].winner = winner; + level thread kill_all_zombies(); + level.gameendtime = getTime(); + level.gamelengthtime = level.gameendtime - level.gamestarttime; + level.gameended = 1; + if ( winner == "A" ) + { + score = get_gamemode_var( "team_1_score" ); + set_gamemode_var( "team_1_score", score + 1 ); + } + else + { + score = get_gamemode_var( "team_2_score" ); + set_gamemode_var( "team_2_score", score + 1 ); + } + if ( is_true( is_encounter() ) ) + { + [[ level._setteamscore ]]( "allies", get_gamemode_var( "team_2_score" ) ); + [[ level._setteamscore ]]( "axis", get_gamemode_var( "team_1_score" ) ); + if ( get_gamemode_var( "team_1_score" ) == get_gamemode_var( "team_2_score" ) ) + { + level thread maps/mp/zombies/_zm_audio::zmbvoxcrowdonteam( "win" ); + level thread maps/mp/zombies/_zm_audio_announcer::announceroundwinner( "tied" ); + } + else + { + level thread maps/mp/zombies/_zm_audio::zmbvoxcrowdonteam( "win", winner, "lose" ); + level thread maps/mp/zombies/_zm_audio_announcer::announceroundwinner( winner ); + } + } + level thread delete_corpses(); + level delay_thread( 5, ::revive_laststand_players ); + level notify( "clear_hud_elems" ); + while ( startnextzmround( winner ) ) + { + level clientnotify( "gme" ); + while ( 1 ) + { + wait 1; + } + } + level.match_is_ending = 1; + if ( is_true( is_encounter() ) ) + { + matchwonteam = ""; + if ( get_gamemode_var( "team_1_score" ) > get_gamemode_var( "team_2_score" ) ) + { + matchwonteam = "A"; + } + else + { + matchwonteam = "B"; + } + level thread maps/mp/zombies/_zm_audio::zmbvoxcrowdonteam( "win", matchwonteam, "lose" ); + level thread maps/mp/zombies/_zm_audio_announcer::announcematchwinner( matchwonteam ); + level create_final_score(); + track_encounters_win_stats( matchwonteam ); + } + maps/mp/zombies/_zm::intermission(); + level.can_revive_game_module = undefined; + level notify( "end_game" ); +} + +end_rounds_early( winner ) //checked matches cerberus output +{ + level.forcedend = 1; + cur_round = get_gamemode_var( "current_round" ); + set_gamemode_var( "ZM_roundLimit", cur_round ); + if ( isDefined( winner ) ) + { + level notify( "game_module_ended", winner ); + } + else + { + level notify( "end_game" ); + } +} + + +checkzmroundswitch() //checked matches cerberus output +{ + if ( !isDefined( level.zm_roundswitch ) || !level.zm_roundswitch ) + { + return 0; + } + + return 1; + return 0; +} + +create_hud_scoreboard( duration, fade ) //checked matches cerberus output +{ + level endon( "end_game" ); + level thread module_hud_full_screen_overlay(); + level thread module_hud_team_1_score( duration, fade ); + level thread module_hud_team_2_score( duration, fade ); + level thread module_hud_round_num( duration, fade ); + respawn_spectators_and_freeze_players(); + waittill_any_or_timeout( duration, "clear_hud_elems" ); +} + +respawn_spectators_and_freeze_players() //checked changed to match cerberus output +{ + players = get_players(); + foreach ( player in players ) + { + if ( player.sessionstate == "spectator" ) + { + if ( isdefined( player.spectate_hud ) ) + { + player.spectate_hud destroy(); + } + player [[ level.spawnplayer ]](); + } + player freeze_player_controls( 1 ); + } +} + +module_hud_team_1_score( duration, fade ) //checked matches cerberus output +{ + level._encounters_score_1 = newhudelem(); + level._encounters_score_1.x = 0; + level._encounters_score_1.y = 260; + level._encounters_score_1.alignx = "center"; + level._encounters_score_1.horzalign = "center"; + level._encounters_score_1.vertalign = "top"; + level._encounters_score_1.font = "default"; + level._encounters_score_1.fontscale = 2.3; + level._encounters_score_1.color = ( 1, 1, 1 ); + level._encounters_score_1.foreground = 1; + level._encounters_score_1 settext( "Team CIA: " + get_gamemode_var( "team_1_score" ) ); + level._encounters_score_1.alpha = 0; + level._encounters_score_1.sort = 11; + level._encounters_score_1 fadeovertime( fade ); + level._encounters_score_1.alpha = 1; + level waittill_any_or_timeout( duration, "clear_hud_elems" ); + level._encounters_score_1 fadeovertime( fade ); + level._encounters_score_1.alpha = 0; + wait fade; + level._encounters_score_1 destroy(); +} + +module_hud_team_2_score( duration, fade ) //checked matches cerberus output +{ + level._encounters_score_2 = newhudelem(); + level._encounters_score_2.x = 0; + level._encounters_score_2.y = 290; + level._encounters_score_2.alignx = "center"; + level._encounters_score_2.horzalign = "center"; + level._encounters_score_2.vertalign = "top"; + level._encounters_score_2.font = "default"; + level._encounters_score_2.fontscale = 2.3; + level._encounters_score_2.color = ( 1, 1, 1 ); + level._encounters_score_2.foreground = 1; + level._encounters_score_2 settext( "Team CDC: " + get_gamemode_var( "team_2_score" ) ); + level._encounters_score_2.alpha = 0; + level._encounters_score_2.sort = 12; + level._encounters_score_2 fadeovertime( fade ); + level._encounters_score_2.alpha = 1; + level waittill_any_or_timeout( duration, "clear_hud_elems" ); + level._encounters_score_2 fadeovertime( fade ); + level._encounters_score_2.alpha = 0; + wait fade; + level._encounters_score_2 destroy(); +} + +module_hud_round_num( duration, fade ) //checked matches cerberus output +{ + level._encounters_round_num = newhudelem(); + level._encounters_round_num.x = 0; + level._encounters_round_num.y = 60; + level._encounters_round_num.alignx = "center"; + level._encounters_round_num.horzalign = "center"; + level._encounters_round_num.vertalign = "top"; + level._encounters_round_num.font = "default"; + level._encounters_round_num.fontscale = 2.3; + level._encounters_round_num.color = ( 1, 1, 1 ); + level._encounters_round_num.foreground = 1; + level._encounters_round_num settext( "Round: ^5" + get_gamemode_var( "current_round" ) + 1 + " / " + get_game_var( "ZM_roundLimit" ) ); + level._encounters_round_num.alpha = 0; + level._encounters_round_num.sort = 13; + level._encounters_round_num fadeovertime( fade ); + level._encounters_round_num.alpha = 1; + level waittill_any_or_timeout( duration, "clear_hud_elems" ); + level._encounters_round_num fadeovertime( fade ); + level._encounters_round_num.alpha = 0; + wait fade; + level._encounters_round_num destroy(); +} + +createtimer() //checked matches cerberus output +{ + flag_waitopen( "pregame" ); + elem = newhudelem(); + elem.hidewheninmenu = 1; + elem.horzalign = "center"; + elem.vertalign = "top"; + elem.alignx = "center"; + elem.aligny = "middle"; + elem.x = 0; + elem.y = 0; + elem.foreground = 1; + elem.font = "default"; + elem.fontscale = 1.5; + elem.color = ( 1, 1, 1 ); + elem.alpha = 2; + elem thread maps/mp/gametypes_zm/_hud::fontpulseinit(); + if ( is_true( level.timercountdown ) ) + { + elem settenthstimer( level.timelimit * 60 ); + } + else + { + elem settenthstimerup( 0.1 ); + } + level.game_module_timer = elem; + level waittill( "game_module_ended" ); + elem destroy(); +} + +revive_laststand_players() //checked changed to match cerberus output +{ + if ( is_true( level.match_is_ending ) ) + { + return; + } + players = get_players(); + foreach ( player in players ) + { + if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + player thread maps/mp/zombies/_zm_laststand::auto_revive( player ); + } + } +} + +team_icon_winner( elem ) //checked matches cerberus output +{ + og_x = elem.x; + og_y = elem.y; + elem.sort = 1; + elem scaleovertime( 0.75, 150, 150 ); + elem moveovertime( 0.75 ); + elem.horzalign = "center"; + elem.vertalign = "middle"; + elem.x = 0; + elem.y = 0; + elem.alpha = 0.7; + wait 0.75; +} + +delete_corpses() //checked changed to match cerberus output +{ + corpses = getcorpsearray(); + for(x = 0; x < corpses.size; x++) + { + corpses[x] delete(); + } +} + +track_encounters_win_stats( matchwonteam ) //checked did not change to match cerberus output +{ + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ]._encounters_team == matchwonteam ) + { + players[ i ] maps/mp/zombies/_zm_stats::increment_client_stat( "wins" ); + players[ i ] maps/mp/zombies/_zm_stats::add_client_stat( "losses", -1 ); + players[ i ] adddstat( "skill_rating", 1 ); + players[ i ] setdstat( "skill_variance", 1 ); + if ( gamemodeismode( level.gamemode_public_match ) ) + { + players[ i ] maps/mp/zombies/_zm_stats::add_location_gametype_stat( level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "wins", 1 ); + players[ i ] maps/mp/zombies/_zm_stats::add_location_gametype_stat( level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "losses", -1 ); + } + } + else + { + players[ i ] setdstat( "skill_rating", 0 ); + players[ i ] setdstat( "skill_variance", 1 ); + } + players[ i ] updatestatratio( "wlratio", "wins", "losses" ); + i++; + } +} + +non_round_logic( mode_logic_func ) //checked matches cerberus output +{ + level thread [[ mode_logic_func ]](); +} + +game_end_func() //checked matches cerberus output +{ + if ( !isDefined( get_gamemode_var( "match_end_notify" ) ) && !isDefined( get_gamemode_var( "match_end_func" ) ) ) + { + return; + } + level waittill( get_gamemode_var( "match_end_notify" ), winning_team ); + level thread [[ get_gamemode_var( "match_end_func" ) ]]( winning_team ); +} + +setup_classic_gametype() //checked did not change to match cerberus output +{ + ents = getentarray(); + i = 0; + while ( i < ents.size ) + { + if ( isDefined( ents[ i ].script_parameters ) ) + { + parameters = strtok( ents[ i ].script_parameters, " " ); + should_remove = 0; + foreach ( parm in parameters ) + { + if ( parm == "survival_remove" ) + { + should_remove = 1; + } + } + if ( should_remove ) + { + ents[ i ] delete(); + } + } + i++; + } + structs = getstructarray( "game_mode_object" ); + i = 0; + while ( i < structs.size ) + { + if ( !isdefined( structs[ i ].script_string ) ) + { + i++; + continue; + } + tokens = strtok( structs[ i ].script_string, " " ); + spawn_object = 0; + foreach ( parm in tokens ) + { + if ( parm == "survival" ) + { + spawn_object = 1; + } + } + if ( !spawn_object ) + { + i++; + continue; + } + barricade = spawn( "script_model", structs[ i ].origin ); + barricade.angles = structs[ i ].angles; + barricade setmodel( structs[ i ].script_parameters ); + i++; + } + unlink_meat_traversal_nodes(); +} + +zclassic_main() //checked matches cerberus output +{ + level thread setup_classic_gametype(); + level thread maps/mp/zombies/_zm::round_start(); +} + +unlink_meat_traversal_nodes() //checked changed to match cerberus output +{ + meat_town_nodes = getnodearray( "meat_town_barrier_traversals", "targetname" ); + meat_tunnel_nodes = getnodearray( "meat_tunnel_barrier_traversals", "targetname" ); + meat_farm_nodes = getnodearray( "meat_farm_barrier_traversals", "targetname" ); + nodes = arraycombine( meat_town_nodes, meat_tunnel_nodes, 1, 0 ); + traversal_nodes = arraycombine( nodes, meat_farm_nodes, 1, 0 ); + foreach ( node in traversal_nodes ) + { + end_node = getnode( node.target, "targetname" ); + unlink_nodes( node, end_node ); + } +} + +canplayersuicide() //checked matches cerberus output +{ + return self hasperk( "specialty_scavenger" ); +} + +onplayerdisconnect() //checked matches cerberus output +{ + if ( isDefined( level.game_mode_custom_onplayerdisconnect ) ) + { + level [[ level.game_mode_custom_onplayerdisconnect ]]( self ); + } + level thread maps/mp/zombies/_zm::check_quickrevive_for_hotjoin( 1 ); + self maps/mp/zombies/_zm_laststand::add_weighted_down(); + level maps/mp/zombies/_zm::checkforalldead( self ); +} + +ondeadevent( team ) //checked matches cerberus output +{ + thread maps/mp/gametypes_zm/_globallogic::endgame( level.zombie_team, "" ); +} + +onspawnintermission() //checked matches cerberus output +{ + spawnpointname = "info_intermission"; + spawnpoints = getentarray( spawnpointname, "classname" ); + if ( spawnpoints.size < 1 ) + { + /* +/# + println( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" ); +#/ + */ + return; + } + spawnpoint = spawnpoints[ randomint( spawnpoints.size ) ]; + if ( isDefined( spawnpoint ) ) + { + self spawn( spawnpoint.origin, spawnpoint.angles ); + } +} + +onspawnspectator( origin, angles ) //checked matches cerberus output +{ +} + +mayspawn() //checked matches cerberus output +{ + if ( isDefined( level.custommayspawnlogic ) ) + { + return self [[ level.custommayspawnlogic ]](); + } + if ( self.pers[ "lives" ] == 0 ) + { + level notify( "player_eliminated" ); + self notify( "player_eliminated" ); + return 0; + } + return 1; +} + +onstartgametype() //checked matches cerberus output +{ + setclientnamemode( "auto_change" ); + level.displayroundendtext = 0; + maps/mp/gametypes_zm/_spawning::create_map_placed_influencers(); + if ( !isoneround() ) + { + level.displayroundendtext = 1; + if ( isscoreroundbased() ) + { + maps/mp/gametypes_zm/_globallogic_score::resetteamscores(); + } + } +} + +module_hud_full_screen_overlay() //checked matches cerberus output +{ + fadetoblack = newhudelem(); + fadetoblack.x = 0; + fadetoblack.y = 0; + fadetoblack.horzalign = "fullscreen"; + fadetoblack.vertalign = "fullscreen"; + fadetoblack setshader( "black", 640, 480 ); + fadetoblack.color = ( 1, 1, 1 ); + fadetoblack.alpha = 1; + fadetoblack.foreground = 1; + fadetoblack.sort = 0; + if ( is_encounter() || getDvar( "ui_gametype" ) == "zcleansed" ) + { + level waittill_any_or_timeout( 25, "start_fullscreen_fade_out" ); + } + else + { + level waittill_any_or_timeout( 25, "start_zombie_round_logic" ); + } + fadetoblack fadeovertime( 2 ); + fadetoblack.alpha = 0; + wait 2.1; + fadetoblack destroy(); +} + +create_final_score() //checked matches cerberus output +{ + level endon( "end_game" ); + level thread module_hud_team_winer_score(); + wait 2; +} + +module_hud_team_winer_score() //checked changed to match cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] thread create_module_hud_team_winer_score(); + if ( isDefined( players[ i ]._team_hud ) && isDefined( players[ i ]._team_hud[ "team" ] ) ) + { + players[ i ] thread team_icon_winner( players[ i ]._team_hud[ "team" ] ); + } + if ( isDefined( level.lock_player_on_team_score ) && level.lock_player_on_team_score ) + { + players[ i ] freezecontrols( 1 ); + players[ i ] takeallweapons(); + players[ i ] setclientuivisibilityflag( "hud_visible", 0 ); + players[ i ].sessionstate = "spectator"; + players[ i ].spectatorclient = -1; + players[ i ].maxhealth = players[ i ].health; + players[ i ].shellshocked = 0; + players[ i ].inwater = 0; + players[ i ].friendlydamage = undefined; + players[ i ].hasspawned = 1; + players[ i ].spawntime = getTime(); + players[ i ].afk = 0; + players[ i ] detachall(); + } + } + level thread maps/mp/zombies/_zm_audio::change_zombie_music( "match_over" ); +} + +create_module_hud_team_winer_score() //checked changed to match cerberus output +{ + self._team_winer_score = newclienthudelem( self ); + self._team_winer_score.x = 0; + self._team_winer_score.y = 70; + self._team_winer_score.alignx = "center"; + self._team_winer_score.horzalign = "center"; + self._team_winer_score.vertalign = "middle"; + self._team_winer_score.font = "default"; + self._team_winer_score.fontscale = 15; + self._team_winer_score.color = ( 0, 1, 0 ); + self._team_winer_score.foreground = 1; + if ( self._encounters_team == "B" && get_gamemode_var( "team_2_score" ) > get_gamemode_var( "team_1_score" ) ) + { + self._team_winer_score settext( &"ZOMBIE_MATCH_WON" ); + } + else + { + if ( self._encounters_team == "B" && get_gamemode_var( "team_2_score" ) < get_gamemode_var( "team_1_score" ) ) + { + self._team_winer_score.color = ( 1, 0, 0 ); + self._team_winer_score settext( &"ZOMBIE_MATCH_LOST" ); + } + } + if ( self._encounters_team == "A" && get_gamemode_var( "team_1_score" ) > get_gamemode_var( "team_2_score" ) ) + { + self._team_winer_score settext( &"ZOMBIE_MATCH_WON" ); + } + else + { + if ( self._encounters_team == "A" && get_gamemode_var( "team_1_score" ) < get_gamemode_var( "team_2_score" ) ) + { + self._team_winer_score.color = ( 1, 0, 0 ); + self._team_winer_score settext( &"ZOMBIE_MATCH_LOST" ); + } + } + self._team_winer_score.alpha = 0; + self._team_winer_score.sort = 12; + self._team_winer_score fadeovertime( 0.25 ); + self._team_winer_score.alpha = 1; + wait 2; + self._team_winer_score fadeovertime( 0.25 ); + self._team_winer_score.alpha = 0; + wait 0.25; + self._team_winer_score destroy(); +} + +displayroundend( round_winner ) //checked changed to match cerberus output +{ + players = get_players(); + foreach(player in players) + { + player thread module_hud_round_end( round_winner ); + if ( isdefined( player._team_hud ) && isdefined( player._team_hud[ "team" ] ) ) + { + player thread team_icon_winner( player._team_hud[ "team" ] ); + } + player freeze_player_controls( 1 ); + } + level thread maps/mp/zombies/_zm_audio::change_zombie_music( "round_end" ); + level thread maps/mp/zombies/_zm_audio::zmbvoxcrowdonteam( "clap" ); + level thread play_sound_2d( "zmb_air_horn" ); + wait 2; +} + +module_hud_round_end( round_winner ) //checked changed to match cerberus output +{ + self endon( "disconnect" ); + self._team_winner_round = newclienthudelem( self ); + self._team_winner_round.x = 0; + self._team_winner_round.y = 50; + self._team_winner_round.alignx = "center"; + self._team_winner_round.horzalign = "center"; + self._team_winner_round.vertalign = "middle"; + self._team_winner_round.font = "default"; + self._team_winner_round.fontscale = 15; + self._team_winner_round.color = ( 1, 1, 1 ); + self._team_winner_round.foreground = 1; + if ( self._encounters_team == round_winner ) + { + self._team_winner_round.color = ( 0, 1, 0 ); + self._team_winner_round settext( "YOU WIN" ); + } + else + { + self._team_winner_round.color = ( 1, 0, 0 ); + self._team_winner_round settext( "YOU LOSE" ); + } + self._team_winner_round.alpha = 0; + self._team_winner_round.sort = 12; + self._team_winner_round fadeovertime( 0.25 ); + self._team_winner_round.alpha = 1; + wait 1.5; + self._team_winner_round fadeovertime( 0.25 ); + self._team_winner_round.alpha = 0; + wait 0.25; + self._team_winner_round destroy(); +} + +displayroundswitch() //checked changed to match cerberus output +{ + level._round_changing_sides = newhudelem(); + level._round_changing_sides.x = 0; + level._round_changing_sides.y = 60; + level._round_changing_sides.alignx = "center"; + level._round_changing_sides.horzalign = "center"; + level._round_changing_sides.vertalign = "middle"; + level._round_changing_sides.font = "default"; + level._round_changing_sides.fontscale = 2.3; + level._round_changing_sides.color = ( 1, 1, 1 ); + level._round_changing_sides.foreground = 1; + level._round_changing_sides.sort = 12; + fadetoblack = newhudelem(); + fadetoblack.x = 0; + fadetoblack.y = 0; + fadetoblack.horzalign = "fullscreen"; + fadetoblack.vertalign = "fullscreen"; + fadetoblack setshader( "black", 640, 480 ); + fadetoblack.color = ( 0, 0, 0 ); + fadetoblack.alpha = 1; + level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "side_switch" ); + level._round_changing_sides settext( "CHANGING SIDES" ); + level._round_changing_sides fadeovertime( 0.25 ); + level._round_changing_sides.alpha = 1; + wait 1; + fadetoblack fadeovertime( 1 ); + level._round_changing_sides fadeovertime( 0.25 ); + level._round_changing_sides.alpha = 0; + fadetoblack.alpha = 0; + wait 0.25; + level._round_changing_sides destroy(); + fadetoblack destroy(); +} + +module_hud_create_team_name() //checked matches cerberus ouput +{ + if ( !is_encounter() ) + { + return; + } + if ( !isDefined( self._team_hud ) ) + { + self._team_hud = []; + } + if ( isDefined( self._team_hud[ "team" ] ) ) + { + self._team_hud[ "team" ] destroy(); + } + elem = newclienthudelem( self ); + elem.hidewheninmenu = 1; + elem.alignx = "center"; + elem.aligny = "middle"; + elem.horzalign = "center"; + elem.vertalign = "middle"; + elem.x = 0; + elem.y = 0; + if ( isDefined( level.game_module_team_name_override_og_x ) ) + { + elem.og_x = level.game_module_team_name_override_og_x; + } + else + { + elem.og_x = 85; + } + elem.og_y = -40; + elem.foreground = 1; + elem.font = "default"; + elem.color = ( 1, 1, 1 ); + elem.sort = 1; + elem.alpha = 0.7; + elem setshader( game[ "icons" ][ self.team ], 150, 150 ); + self._team_hud[ "team" ] = elem; +} + +nextzmhud( winner ) //checked matches cerberus output +{ + displayroundend( winner ); + create_hud_scoreboard( 1, 0.25 ); + if ( checkzmroundswitch() ) + { + displayroundswitch(); + } +} + +startnextzmround( winner ) //checked matches cerberus output +{ + if ( !isonezmround() ) + { + if ( !waslastzmround() ) + { + nextzmhud( winner ); + setmatchtalkflag( "DeadChatWithDead", level.voip.deadchatwithdead ); + setmatchtalkflag( "DeadChatWithTeam", level.voip.deadchatwithteam ); + setmatchtalkflag( "DeadHearTeamLiving", level.voip.deadhearteamliving ); + setmatchtalkflag( "DeadHearAllLiving", level.voip.deadhearallliving ); + setmatchtalkflag( "EveryoneHearsEveryone", level.voip.everyonehearseveryone ); + setmatchtalkflag( "DeadHearKiller", level.voip.deadhearkiller ); + setmatchtalkflag( "KillersHearVictim", level.voip.killershearvictim ); + game[ "state" ] = "playing"; + level.allowbattlechatter = getgametypesetting( "allowBattleChatter" ); + if ( is_true( level.zm_switchsides_on_roundswitch ) ) + { + set_game_var( "switchedsides", !get_game_var( "switchedsides" ) ); + } + map_restart( 1 ); + return 1; + } + } + return 0; +} + +start_round() //checked changed to match cerberus output +{ + flag_clear( "start_encounters_match_logic" ); + if ( !isDefined( level._module_round_hud ) ) + { + level._module_round_hud = newhudelem(); + level._module_round_hud.x = 0; + level._module_round_hud.y = 70; + level._module_round_hud.alignx = "center"; + level._module_round_hud.horzalign = "center"; + level._module_round_hud.vertalign = "middle"; + level._module_round_hud.font = "default"; + level._module_round_hud.fontscale = 2.3; + level._module_round_hud.color = ( 1, 1, 1 ); + level._module_round_hud.foreground = 1; + level._module_round_hud.sort = 0; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] freeze_player_controls( 1 ); + } + level._module_round_hud.alpha = 1; + label = &"Next Round Starting In ^2"; + level._module_round_hud.label = label; + level._module_round_hud settimer( 3 ); + level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "countdown" ); + level thread maps/mp/zombies/_zm_audio::zmbvoxcrowdonteam( "clap" ); + level thread maps/mp/zombies/_zm_audio::change_zombie_music( "round_start" ); + level notify( "start_fullscreen_fade_out" ); + wait 2; + level._module_round_hud fadeovertime( 1 ); + level._module_round_hud.alpha = 0; + wait 1; + level thread play_sound_2d( "zmb_air_horn" ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] freeze_player_controls( 0 ); + players[ i ] sprintuprequired(); + } + flag_set( "start_encounters_match_logic" ); + flag_clear( "pregame" ); + level._module_round_hud destroy(); +} + +isonezmround() //checked matches cerberus output +{ + if ( get_game_var( "ZM_roundLimit" ) == 1 ) + { + return 1; + } + return 0; +} + +waslastzmround() //checked changed to match cerberus output +{ + if ( is_true( level.forcedend ) ) + { + return 1; + } + if ( hitzmroundlimit() || hitzmscorelimit() || hitzmroundwinlimit() ) + { + return 1; + } + return 0; +} + +hitzmroundlimit() //checked matches cerberus output +{ + if ( get_game_var( "ZM_roundLimit" ) <= 0 ) + { + return 0; + } + return getzmroundsplayed() >= get_game_var( "ZM_roundLimit" ); +} + +hitzmroundwinlimit() //checked matches cerberus output +{ + if ( !isDefined( get_game_var( "ZM_roundWinLimit" ) ) || get_game_var( "ZM_roundWinLimit" ) <= 0 ) + { + return 0; + } + if ( get_gamemode_var( "team_1_score" ) >= get_game_var( "ZM_roundWinLimit" ) || get_gamemode_var( "team_2_score" ) >= get_game_var( "ZM_roundWinLimit" ) ) + { + return 1; + } + if ( get_gamemode_var( "team_1_score" ) >= get_game_var( "ZM_roundWinLimit" ) || get_gamemode_var( "team_2_score" ) >= get_game_var( "ZM_roundWinLimit" ) ) + { + if ( get_gamemode_var( "team_1_score" ) != get_gamemode_var( "team_2_score" ) ) + { + return 1; + } + } + return 0; +} + +hitzmscorelimit() //checked matches cerberus output +{ + if ( get_game_var( "ZM_scoreLimit" ) <= 0 ) + { + return 0; + } + if ( is_encounter() ) + { + if ( get_gamemode_var( "team_1_score" ) >= get_game_var( "ZM_scoreLimit" ) || get_gamemode_var( "team_2_score" ) >= get_game_var( "ZM_scoreLimit" ) ) + { + return 1; + } + } + return 0; +} + +getzmroundsplayed() //checked matches cerberus output +{ + return get_gamemode_var( "current_round" ); +} + +onspawnplayerunified() //checked matches cerberus output +{ + onspawnplayer( 0 ); +} + +onspawnplayer( predictedspawn ) //fixed checked changed partially to match cerberus output +{ + if ( !isDefined( predictedspawn ) ) + { + predictedspawn = 0; + } + pixbeginevent( "ZSURVIVAL:onSpawnPlayer" ); + self.usingobj = undefined; + self.is_zombie = 0; + if ( isDefined( level.custom_spawnplayer ) && is_true( self.player_initialized ) ) + { + self [[ level.custom_spawnplayer ]](); + return; + } + if ( isDefined( level.customspawnlogic ) ) + { + self [[ level.customspawnlogic ]]( predictedspawn ); + if ( predictedspawn ) + { + return; + } + } + else + { + if ( flag( "begin_spawning" ) ) + { + 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 ) ) + { + for ( i = 0; i < structs.size; i++ ) + { + if ( isdefined( structs[ i ].script_string ) ) + { + tokens = strtok( structs[ i ].script_string, " " ); + foreach ( token in tokens ) + { + if ( token == match_string ) + { + spawnpoints[ spawnpoints.size ] = structs[ i ]; + } + } + } + } + } + if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 ) + { + spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); + } + spawnpoint = maps/mp/zombies/_zm::getfreespawnpoint( spawnpoints, self ); + + } + if ( predictedspawn ) + { + self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); + return; + } + else + { + self spawn( spawnpoint.origin, spawnpoint.angles, "zsurvival" ); + } + } + self.entity_num = self getentitynumber(); + self thread maps/mp/zombies/_zm::onplayerspawned(); + self thread maps/mp/zombies/_zm::player_revive_monitor(); + self freezecontrols( 1 ); + self.spectator_respawn = spawnpoint; + self.score = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "score" ); + self.pers[ "participation" ] = 0; + + self.score_total = self.score; + self.old_score = self.score; + self.player_initialized = 0; + self.zombification_time = 0; + self.enabletext = 1; + self thread maps/mp/zombies/_zm_blockers::rebuild_barrier_reward_reset(); + if ( !is_true( level.host_ended_game ) ) + { + self freeze_player_controls( 0 ); + self enableweapons(); + } + if ( isDefined( level.game_mode_spawn_player_logic ) ) + { + spawn_in_spectate = [[ level.game_mode_spawn_player_logic ]](); + if ( spawn_in_spectate ) + { + self delay_thread( 0.05, maps/mp/zombies/_zm::spawnspectator ); + } + } + pixendevent(); +} + + +get_player_spawns_for_gametype() //fixed checked partially changed to match cerberus output +{ + 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; + player_spawns = []; + structs = getstructarray("player_respawn_point", "targetname"); + i = 0; + while ( i < structs.size ) + { + if ( isdefined( structs[ i ].script_string ) ) + { + tokens = strtok( structs[ i ].script_string, " " ); + foreach ( token in tokens ) + { + if ( token == match_string ) + { + player_spawns[ player_spawns.size ] = structs[ i ]; + } + } + i++; + continue; + } + player_spawns[ player_spawns.size ] = structs[ i ]; + i++; + } + return player_spawns; +} + +onendgame( winningteam ) //checked matches cerberus output +{ +} + +onroundendgame( roundwinner ) //checked matches cerberus output +{ + if ( game[ "roundswon" ][ "allies" ] == game[ "roundswon" ][ "axis" ] ) + { + winner = "tie"; + } + else if ( game[ "roundswon" ][ "axis" ] > game[ "roundswon" ][ "allies" ] ) + { + winner = "axis"; + } + else + { + winner = "allies"; + } + return winner; +} + +menu_init() //checked matches cerberus output +{ + game[ "menu_team" ] = "team_marinesopfor"; + game[ "menu_changeclass_allies" ] = "changeclass"; + game[ "menu_initteam_allies" ] = "initteam_marines"; + game[ "menu_changeclass_axis" ] = "changeclass"; + game[ "menu_initteam_axis" ] = "initteam_opfor"; + game[ "menu_class" ] = "class"; + game[ "menu_changeclass" ] = "changeclass"; + game[ "menu_changeclass_offline" ] = "changeclass"; + game[ "menu_wager_side_bet" ] = "sidebet"; + game[ "menu_wager_side_bet_player" ] = "sidebet_player"; + game[ "menu_changeclass_wager" ] = "changeclass_wager"; + game[ "menu_changeclass_custom" ] = "changeclass_custom"; + game[ "menu_changeclass_barebones" ] = "changeclass_barebones"; + game[ "menu_controls" ] = "ingame_controls"; + game[ "menu_options" ] = "ingame_options"; + game[ "menu_leavegame" ] = "popup_leavegame"; + game[ "menu_restartgamepopup" ] = "restartgamepopup"; + precachemenu( game[ "menu_controls" ] ); + precachemenu( game[ "menu_options" ] ); + precachemenu( game[ "menu_leavegame" ] ); + precachemenu( game[ "menu_restartgamepopup" ] ); + precachemenu( "scoreboard" ); + precachemenu( game[ "menu_team" ] ); + precachemenu( game[ "menu_changeclass_allies" ] ); + precachemenu( game[ "menu_initteam_allies" ] ); + precachemenu( game[ "menu_changeclass_axis" ] ); + precachemenu( game[ "menu_class" ] ); + precachemenu( game[ "menu_changeclass" ] ); + precachemenu( game[ "menu_initteam_axis" ] ); + precachemenu( game[ "menu_changeclass_offline" ] ); + precachemenu( game[ "menu_changeclass_wager" ] ); + precachemenu( game[ "menu_changeclass_custom" ] ); + precachemenu( game[ "menu_changeclass_barebones" ] ); + precachemenu( game[ "menu_wager_side_bet" ] ); + precachemenu( game[ "menu_wager_side_bet_player" ] ); + precachestring( &"MP_HOST_ENDED_GAME" ); + precachestring( &"MP_HOST_ENDGAME_RESPONSE" ); + level thread menu_onplayerconnect(); +} + +menu_onplayerconnect() //checked matches cerberus output +{ + for ( ;; ) + { + level waittill( "connecting", player ); + player thread menu_onmenuresponse(); + } +} + +menu_onmenuresponse() //checked changed to match cerberus output +{ + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "menuresponse", menu, response ); + if ( response == "back" ) + { + self closemenu(); + self closeingamemenu(); + if ( level.console ) + { + if ( game[ "menu_changeclass" ] != menu && game[ "menu_changeclass_offline" ] != menu || menu == game[ "menu_team" ] && menu == game[ "menu_controls" ] ) + { + if ( self.pers[ "team" ] == "allies" ) + { + self openmenu( game[ "menu_class" ] ); + } + if ( self.pers[ "team" ] == "axis" ) + { + self openmenu( game[ "menu_class" ] ); + } + } + } + continue; + } + if ( response == "changeteam" && level.allow_teamchange == "1" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game[ "menu_team" ] ); + } + if ( response == "changeclass_marines" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game[ "menu_changeclass_allies" ] ); + continue; + } + if ( response == "changeclass_opfor" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game[ "menu_changeclass_axis" ] ); + continue; + } + if ( response == "changeclass_wager" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game[ "menu_changeclass_wager" ] ); + continue; + } + if ( response == "changeclass_custom" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game[ "menu_changeclass_custom" ] ); + continue; + } + if ( response == "changeclass_barebones" ) + { + self closemenu(); + self closeingamemenu(); + self openmenu( game[ "menu_changeclass_barebones" ] ); + continue; + } + if ( response == "changeclass_marines_splitscreen" ) + { + self openmenu( "changeclass_marines_splitscreen" ); + } + if ( response == "changeclass_opfor_splitscreen" ) + { + self openmenu( "changeclass_opfor_splitscreen" ); + } + if ( response == "endgame" ) + { + if ( self issplitscreen() ) + { + level.skipvote = 1; + if ( is_true( level.gameended ) ) + { + self maps/mp/zombies/_zm_laststand::add_weighted_down(); + self maps/mp/zombies/_zm_stats::increment_client_stat( "deaths" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "deaths" ); + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); + level.host_ended_game = 1; + maps/mp/zombies/_zm_game_module::freeze_players( 1 ); + level notify( "end_game" ); + } + } + continue; + } + if ( response == "restart_level_zm" ) + { + self maps/mp/zombies/_zm_laststand::add_weighted_down(); + self maps/mp/zombies/_zm_stats::increment_client_stat( "deaths" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "deaths" ); + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); + missionfailed(); + } + if ( response == "killserverpc" ) + { + level thread maps/mp/gametypes_zm/_globallogic::killserverpc(); + continue; + } + if ( response == "endround" ) + { + if ( is_true( level.gameended ) ) + { + self maps/mp/gametypes_zm/_globallogic::gamehistoryplayerquit(); + self maps/mp/zombies/_zm_laststand::add_weighted_down(); + self closemenu(); + self closeingamemenu(); + level.host_ended_game = 1; + maps/mp/zombies/_zm_game_module::freeze_players( 1 ); + level notify( "end_game" ); + } + else + { + self closemenu(); + self closeingamemenu(); + self iprintln( &"MP_HOST_ENDGAME_RESPONSE" ); + } + continue; + } + if ( menu == game[ "menu_team" ] && level.allow_teamchange == "1" ) + { + switch( response ) + { + case "allies": + self [[ level.allies ]](); + break; + case "axis": + self [[ level.teammenu ]]( response ); + break; + case "autoassign": + self [[ level.autoassign ]]( 1 ); + break; + case "spectator": + self [[ level.spectator ]](); + break; + } + continue; + } + else + { + if ( game[ "menu_changeclass" ] != menu && game[ "menu_changeclass_offline" ] != menu && game[ "menu_changeclass_wager" ] != menu || menu == game[ "menu_changeclass_custom" ] && menu == game[ "menu_changeclass_barebones" ] ) + { + self closemenu(); + self closeingamemenu(); + if ( level.rankedmatch && issubstr( response, "custom" ) ) + { + } + self.selectedclass = 1; + self [[ level.class ]]( response ); + } + } + } +} + + +menuallieszombies() //checked changed to match cerberus output +{ + self maps/mp/gametypes_zm/_globallogic_ui::closemenus(); + if ( !level.console && level.allow_teamchange == "0" && is_true( self.hasdonecombat ) ) + { + return; + } + if ( self.pers[ "team" ] != "allies" ) + { + if ( level.ingraceperiod && !isDefined( self.hasdonecombat ) || !self.hasdonecombat ) + { + self.hasspawned = 0; + } + if ( self.sessionstate == "playing" ) + { + self.switching_teams = 1; + self.joining_team = "allies"; + self.leaving_team = self.pers[ "team" ]; + self suicide(); + } + self.pers["team"] = "allies"; + self.team = "allies"; + self.pers["class"] = undefined; + self.class = undefined; + self.pers["weapon"] = undefined; + self.pers["savedmodel"] = undefined; + self updateobjectivetext(); + if ( level.teambased ) + { + self.sessionteam = "allies"; + } + else + { + self.sessionteam = "none"; + self.ffateam = "allies"; + } + self setclientscriptmainmenu( game[ "menu_class" ] ); + self notify( "joined_team" ); + level notify( "joined_team" ); + self notify( "end_respawn" ); + } +} + + +custom_spawn_init_func() //checked matches cerberus output +{ + array_thread( level.zombie_spawners, ::add_spawn_function, maps/mp/zombies/_zm_spawner::zombie_spawn_init ); + array_thread( level.zombie_spawners, ::add_spawn_function, level._zombies_round_spawn_failsafe ); +} + +kill_all_zombies() //changed to match cerberus output +{ + ai = getaiarray( level.zombie_team ); + foreach ( zombie in ai ) + { + if ( isdefined( zombie ) ) + { + zombie dodamage( zombie.maxhealth * 2, zombie.origin, zombie, zombie, "none", "MOD_SUICIDE" ); + wait 0.05; + } + } +} + +init() //checked matches cerberus output +{ + + flag_init( "pregame" ); + flag_set( "pregame" ); + level thread onplayerconnect(); +} + +onplayerconnect() //checked matches cerberus output +{ + for ( ;; ) + { + level waittill( "connected", player ); + player thread onplayerspawned(); + if ( isDefined( level.game_module_onplayerconnect ) ) + { + player [[ level.game_module_onplayerconnect ]](); + } + } +} + +onplayerspawned() //checked partially changed to cerberus output +{ + level endon( "end_game" ); + self endon( "disconnect" ); + for ( ;; ) + { + self waittill_either( "spawned_player", "fake_spawned_player" ); + if ( isDefined( level.match_is_ending ) && level.match_is_ending ) + { + return; + } + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + self thread maps/mp/zombies/_zm_laststand::auto_revive( self ); + } + if ( isDefined( level.custom_player_fake_death_cleanup ) ) + { + self [[ level.custom_player_fake_death_cleanup ]](); + } + self setstance( "stand" ); + self.zmbdialogqueue = []; + self.zmbdialogactive = 0; + self.zmbdialoggroups = []; + self.zmbdialoggroup = ""; + if ( is_encounter() ) + { + if ( self.team == "axis" ) + { + self.characterindex = 0; + self._encounters_team = "A"; + self._team_name = &"ZOMBIE_RACE_TEAM_1"; + } + else + { + self.characterindex = 1; + self._encounters_team = "B"; + self._team_name = &"ZOMBIE_RACE_TEAM_2"; + } + } + self takeallweapons(); + if ( isDefined( level.givecustomcharacters ) ) + { + self [[ level.givecustomcharacters ]](); + } + self giveweapon( "knife_zm" ); + if ( isDefined( level.onplayerspawned_restore_previous_weapons ) && isDefined( level.isresetting_grief ) && level.isresetting_grief ) + { + weapons_restored = self [[ level.onplayerspawned_restore_previous_weapons ]](); + } + if ( isDefined( weapons_restored ) && !weapons_restored || !isDefined( weapons_restored ) ) + { + self give_start_weapon( 1 ); + } + weapons_restored = 0; + if ( isDefined( level._team_loadout ) ) + { + self giveweapon( level._team_loadout ); + self switchtoweapon( level._team_loadout ); + } + if ( isDefined( level.gamemode_post_spawn_logic ) ) + { + self [[ level.gamemode_post_spawn_logic ]](); + } + } +} + +wait_for_players() //checked matches cerberus output +{ + level endon( "end_race" ); + if ( getDvarInt( "party_playerCount" ) == 1 ) + { + flag_wait( "start_zombie_round_logic" ); + return; + } + while ( !flag_exists( "start_zombie_round_logic" ) ) + { + wait 0.05; + } + while ( !flag( "start_zombie_round_logic" ) && isDefined( level._module_connect_hud ) ) + { + level._module_connect_hud.alpha = 0; + level._module_connect_hud.sort = 12; + level._module_connect_hud fadeovertime( 1 ); + level._module_connect_hud.alpha = 1; + wait 1.5; + level._module_connect_hud fadeovertime( 1 ); + level._module_connect_hud.alpha = 0; + wait 1.5; + } + if ( isDefined( level._module_connect_hud ) ) + { + level._module_connect_hud destroy(); + } +} + +onplayerconnect_check_for_hotjoin() //checked matches cerberus output +{ +/* +/# + if ( getDvarInt( #"EA6D219A" ) > 0 ) + { + return; +#/ + } +*/ + map_logic_exists = level flag_exists( "start_zombie_round_logic" ); + map_logic_started = flag( "start_zombie_round_logic" ); + if ( map_logic_exists && map_logic_started ) + { + self thread hide_gump_loading_for_hotjoiners(); + } +} + +hide_gump_loading_for_hotjoiners() //checked matches cerberus output +{ + self endon( "disconnect" ); + self.rebuild_barrier_reward = 1; + self.is_hotjoining = 1; + num = self getsnapshotackindex(); + while ( num == self getsnapshotackindex() ) + { + wait 0.25; + } + wait 0.5; + self maps/mp/zombies/_zm::spawnspectator(); + self.is_hotjoining = 0; + self.is_hotjoin = 1; + if ( is_true( level.intermission ) || is_true( level.host_ended_game ) ) + { + setclientsysstate( "levelNotify", "zi", self ); + self setclientthirdperson( 0 ); + self resetfov(); + self.health = 100; + self thread [[ level.custom_intermission ]](); + } +} + +blank() +{ + //empty function +} + + + main() { - maps\mp\gametypes_zm\_globallogic::init(); - maps\mp\gametypes_zm\_callbacksetup::setupcallbacks(); - globallogic_setupdefault_zombiecallbacks(); - menu_init(); - registerroundlimit( 1, 1 ); - registertimelimit( 0, 0 ); - registerscorelimit( 0, 0 ); - registerroundwinlimit( 0, 0 ); - registernumlives( 1, 1 ); - maps\mp\gametypes_zm\_weapons::registergrenadelauncherduddvar( level.gametype, 10, 0, 1440 ); - maps\mp\gametypes_zm\_weapons::registerthrowngrenadeduddvar( level.gametype, 0, 0, 1440 ); - maps\mp\gametypes_zm\_weapons::registerkillstreakdelay( level.gametype, 0, 0, 1440 ); - maps\mp\gametypes_zm\_globallogic::registerfriendlyfiredelay( level.gametype, 15, 0, 1440 ); - level.takelivesondeath = 1; - level.teambased = 1; - level.disableprematchmessages = 1; - level.disablemomentum = 1; - level.overrideteamscore = 0; - level.overrideplayerscore = 0; - level.displayhalftimetext = 0; - level.displayroundendtext = 0; - level.allowannouncer = 0; - level.endgameonscorelimit = 0; - level.endgameontimelimit = 0; - level.resetplayerscoreeveryround = 1; - level.doprematch = 0; - level.nopersistence = 1; - level.scoreroundbased = 0; - level.forceautoassign = 1; - level.dontshowendreason = 1; - level.forceallallies = 0; - level.allow_teamchange = 0; - setdvar( "scr_disable_team_selection", 1 ); - makedvarserverinfo( "scr_disable_team_selection", 1 ); - setmatchflag( "hud_zombie", 1 ); - setdvar( "scr_disable_weapondrop", 1 ); - setdvar( "scr_xpscale", 0 ); - level.onstartgametype = ::onstartgametype; - level.onspawnplayer = ::blank; - level.onspawnplayerunified = ::onspawnplayerunified; - level.onroundendgame = ::onroundendgame; - level.mayspawn = ::mayspawn; - set_game_var( "ZM_roundLimit", 1 ); - set_game_var( "ZM_scoreLimit", 1 ); - set_game_var( "_team1_num", 0 ); - set_game_var( "_team2_num", 0 ); - map_name = level.script; - mode = getdvar( "ui_gametype" ); - - if ( ( !isdefined( mode ) || mode == "" ) && isdefined( level.default_game_mode ) ) - mode = level.default_game_mode; - - set_gamemode_var_once( "mode", mode ); - set_game_var_once( "side_selection", 1 ); - location = getdvar( _hash_C955B4CD ); - - if ( location == "" && isdefined( level.default_start_location ) ) - location = level.default_start_location; - - set_gamemode_var_once( "location", location ); - set_gamemode_var_once( "randomize_mode", getdvarint( _hash_5D1D04D4 ) ); - set_gamemode_var_once( "randomize_location", getdvarint( _hash_D446AE4D ) ); - set_gamemode_var_once( "team_1_score", 0 ); - set_gamemode_var_once( "team_2_score", 0 ); - set_gamemode_var_once( "current_round", 0 ); - set_gamemode_var_once( "rules_read", 0 ); - set_game_var_once( "switchedsides", 0 ); - gametype = getdvar( "ui_gametype" ); - game["dialog"]["gametype"] = gametype + "_start"; - game["dialog"]["gametype_hardcore"] = gametype + "_start"; - game["dialog"]["offense_obj"] = "generic_boost"; - game["dialog"]["defense_obj"] = "generic_boost"; - set_gamemode_var( "pre_init_zombie_spawn_func", undefined ); - set_gamemode_var( "post_init_zombie_spawn_func", undefined ); - set_gamemode_var( "match_end_notify", undefined ); - set_gamemode_var( "match_end_func", undefined ); - setscoreboardcolumns( "score", "kills", "downs", "revives", "headshots" ); - onplayerconnect_callback( ::onplayerconnect_check_for_hotjoin ); -} - -game_objects_allowed( mode, location ) -{ - allowed[0] = mode; - entities = getentarray(); - - foreach ( entity in entities ) - { - if ( isdefined( entity.script_gameobjectname ) ) - { - isallowed = maps\mp\gametypes_zm\_gameobjects::entity_is_allowed( entity, allowed ); - isvalidlocation = maps\mp\gametypes_zm\_gameobjects::location_is_allowed( entity, location ); - - if ( !isallowed || !isvalidlocation && !is_classic() ) - { - if ( isdefined( entity.spawnflags ) && entity.spawnflags == 1 ) - { - if ( isdefined( entity.classname ) && entity.classname != "trigger_multiple" ) - entity connectpaths(); - } - - entity delete(); - continue; - } - - if ( isdefined( entity.script_vector ) ) - { - entity moveto( entity.origin + entity.script_vector, 0.05 ); - - entity waittill( "movedone" ); - - if ( isdefined( entity.spawnflags ) && entity.spawnflags == 1 ) - entity disconnectpaths(); - - continue; - } - - if ( isdefined( entity.spawnflags ) && entity.spawnflags == 1 ) - { - if ( isdefined( entity.classname ) && entity.classname != "trigger_multiple" ) - entity connectpaths(); - } - } - } -} - -post_init_gametype() -{ - if ( isdefined( level.gamemode_map_postinit ) ) - { - if ( isdefined( level.gamemode_map_postinit[level.scr_zm_ui_gametype] ) ) - [[ level.gamemode_map_postinit[level.scr_zm_ui_gametype] ]](); - } -} - -post_gametype_main( mode ) -{ - set_game_var( "ZM_roundWinLimit", get_game_var( "ZM_roundLimit" ) * 0.5 ); - level.roundlimit = get_game_var( "ZM_roundLimit" ); - - if ( isdefined( level.gamemode_map_preinit ) ) - { - if ( isdefined( level.gamemode_map_preinit[mode] ) ) - [[ level.gamemode_map_preinit[mode] ]](); - } -} - -globallogic_setupdefault_zombiecallbacks() -{ - level.spawnplayer = maps\mp\gametypes_zm\_globallogic_spawn::spawnplayer; - level.spawnplayerprediction = maps\mp\gametypes_zm\_globallogic_spawn::spawnplayerprediction; - level.spawnclient = maps\mp\gametypes_zm\_globallogic_spawn::spawnclient; - level.spawnspectator = maps\mp\gametypes_zm\_globallogic_spawn::spawnspectator; - level.spawnintermission = maps\mp\gametypes_zm\_globallogic_spawn::spawnintermission; - level.onplayerscore = ::blank; - level.onteamscore = ::blank; - level.wavespawntimer = ::wavespawntimer; - level.onspawnplayer = ::blank; - level.onspawnplayerunified = ::blank; - level.onspawnspectator = ::onspawnspectator; - level.onspawnintermission = ::onspawnintermission; - level.onrespawndelay = ::blank; - level.onforfeit = ::blank; - level.ontimelimit = ::blank; - level.onscorelimit = ::blank; - level.ondeadevent = ::ondeadevent; - level.ononeleftevent = ::blank; - level.giveteamscore = ::blank; - level.giveplayerscore = ::blank; - level.gettimelimit = maps\mp\gametypes_zm\_globallogic_defaults::default_gettimelimit; - level.getteamkillpenalty = ::blank; - level.getteamkillscore = ::blank; - level.iskillboosting = ::blank; - level._setteamscore = maps\mp\gametypes_zm\_globallogic_score::_setteamscore; - level._setplayerscore = ::blank; - level._getteamscore = ::blank; - level._getplayerscore = ::blank; - level.onprecachegametype = ::blank; - level.onstartgametype = ::blank; - level.onplayerconnect = ::blank; - level.onplayerdisconnect = ::onplayerdisconnect; - level.onplayerdamage = ::blank; - level.onplayerkilled = ::blank; - level.onplayerkilledextraunthreadedcbs = []; - level.onteamoutcomenotify = maps\mp\gametypes_zm\_hud_message::teamoutcomenotifyzombie; - level.onoutcomenotify = ::blank; - level.onteamwageroutcomenotify = ::blank; - level.onwageroutcomenotify = ::blank; - level.onendgame = ::onendgame; - level.onroundendgame = ::blank; - level.onmedalawarded = ::blank; - level.autoassign = maps\mp\gametypes_zm\_globallogic_ui::menuautoassign; - level.spectator = maps\mp\gametypes_zm\_globallogic_ui::menuspectator; - level.class = maps\mp\gametypes_zm\_globallogic_ui::menuclass; - level.allies = ::menuallieszombies; - level.teammenu = maps\mp\gametypes_zm\_globallogic_ui::menuteam; - level.callbackactorkilled = ::blank; - level.callbackvehicledamage = ::blank; -} - -setup_standard_objects( location ) -{ - structs = getstructarray( "game_mode_object" ); - - foreach ( struct in structs ) - { - if ( isdefined( struct.script_noteworthy ) && struct.script_noteworthy != location ) - continue; - - if ( isdefined( struct.script_string ) ) - { - keep = 0; - tokens = strtok( struct.script_string, " " ); - - foreach ( token in tokens ) - { - if ( token == level.scr_zm_ui_gametype && token != "zstandard" ) - { - keep = 1; - continue; - } - - if ( token == "zstandard" ) - keep = 1; - } - - if ( !keep ) - continue; - } - - barricade = spawn( "script_model", struct.origin ); - barricade.angles = struct.angles; - barricade setmodel( struct.script_parameters ); - } - - objects = getentarray(); - - foreach ( object in objects ) - { - if ( !object is_survival_object() ) - continue; - - if ( isdefined( object.spawnflags ) && object.spawnflags == 1 && object.classname != "trigger_multiple" ) - object connectpaths(); - - object delete(); - } - - if ( isdefined( level._classic_setup_func ) ) - [[ level._classic_setup_func ]](); -} - -is_survival_object() -{ - if ( !isdefined( self.script_parameters ) ) - return 0; - - tokens = strtok( self.script_parameters, " " ); - remove = 0; - - foreach ( token in tokens ) - { - if ( token == "survival_remove" ) - remove = 1; - } - - return remove; -} - -game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) -{ - self.last_damage_from_zombie_or_player = 0; - - if ( isdefined( eattacker ) ) - { - if ( isplayer( eattacker ) && eattacker == self ) - return; - - if ( isdefined( eattacker.is_zombie ) && eattacker.is_zombie || isplayer( eattacker ) ) - self.last_damage_from_zombie_or_player = 1; - } - - if ( isdefined( self._being_shellshocked ) && self._being_shellshocked || self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - return; - - if ( isplayer( eattacker ) && isdefined( eattacker._encounters_team ) && eattacker._encounters_team != self._encounters_team ) - { - if ( isdefined( self.hasriotshield ) && self.hasriotshield && isdefined( vdir ) ) - { - if ( isdefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped ) - { - if ( self maps\mp\zombies\_zm::player_shield_facing_attacker( vdir, 0.2 ) && isdefined( self.player_shield_apply_damage ) ) - return; - } - else if ( !isdefined( self.riotshieldentity ) ) - { - if ( !self maps\mp\zombies\_zm::player_shield_facing_attacker( vdir, -0.2 ) && isdefined( self.player_shield_apply_damage ) ) - return; - } - } - - if ( isdefined( level._game_module_player_damage_grief_callback ) ) - self [[ level._game_module_player_damage_grief_callback ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - - if ( isdefined( level._effect["butterflies"] ) ) - { - if ( isdefined( sweapon ) && weapontype( sweapon ) == "grenade" ) - playfx( level._effect["butterflies"], self.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); - else - playfx( level._effect["butterflies"], vpoint, vdir ); - } - - self thread do_game_mode_shellshock(); - self playsound( "zmb_player_hit_ding" ); - } -} - -do_game_mode_shellshock() -{ - self endon( "disconnect" ); - self._being_shellshocked = 1; - self shellshock( "grief_stab_zm", 0.75 ); - wait 0.75; - self._being_shellshocked = 0; -} - -add_map_gamemode( mode, preinit_func, precache_func, main_func ) -{ - if ( !isdefined( level.gamemode_map_location_init ) ) - level.gamemode_map_location_init = []; - - if ( !isdefined( level.gamemode_map_location_main ) ) - level.gamemode_map_location_main = []; - - if ( !isdefined( level.gamemode_map_preinit ) ) - level.gamemode_map_preinit = []; - - if ( !isdefined( level.gamemode_map_postinit ) ) - level.gamemode_map_postinit = []; - - if ( !isdefined( level.gamemode_map_precache ) ) - level.gamemode_map_precache = []; - - if ( !isdefined( level.gamemode_map_main ) ) - level.gamemode_map_main = []; - - level.gamemode_map_preinit[mode] = preinit_func; - level.gamemode_map_main[mode] = main_func; - level.gamemode_map_precache[mode] = precache_func; - level.gamemode_map_location_precache[mode] = []; - level.gamemode_map_location_main[mode] = []; -} - -add_map_location_gamemode( mode, location, precache_func, main_func ) -{ - if ( !isdefined( level.gamemode_map_location_precache[mode] ) ) - { -/# - println( "*** ERROR : " + mode + " has not been added to the map using add_map_gamemode." ); -#/ - return; - } - - level.gamemode_map_location_precache[mode][location] = precache_func; - level.gamemode_map_location_main[mode][location] = main_func; -} - -rungametypeprecache( gamemode ) -{ - if ( !isdefined( level.gamemode_map_location_main ) || !isdefined( level.gamemode_map_location_main[gamemode] ) ) - return; - - if ( isdefined( level.gamemode_map_precache ) ) - { - if ( isdefined( level.gamemode_map_precache[gamemode] ) ) - [[ level.gamemode_map_precache[gamemode] ]](); - } - - if ( isdefined( level.gamemode_map_location_precache ) ) - { - if ( isdefined( level.gamemode_map_location_precache[gamemode] ) ) - { - loc = getdvar( _hash_C955B4CD ); - - if ( loc == "" && isdefined( level.default_start_location ) ) - loc = level.default_start_location; - - if ( isdefined( level.gamemode_map_location_precache[gamemode][loc] ) ) - [[ level.gamemode_map_location_precache[gamemode][loc] ]](); - } - } - - if ( isdefined( level.precachecustomcharacters ) ) - self [[ level.precachecustomcharacters ]](); -} - -rungametypemain( gamemode, mode_main_func, use_round_logic ) -{ - if ( !isdefined( level.gamemode_map_location_main ) || !isdefined( level.gamemode_map_location_main[gamemode] ) ) - return; - - level thread game_objects_allowed( get_gamemode_var( "mode" ), get_gamemode_var( "location" ) ); - - if ( isdefined( level.gamemode_map_main ) ) - { - if ( isdefined( level.gamemode_map_main[gamemode] ) ) - level thread [[ level.gamemode_map_main[gamemode] ]](); - } - - if ( isdefined( level.gamemode_map_location_main ) ) - { - if ( isdefined( level.gamemode_map_location_main[gamemode] ) ) - { - loc = getdvar( _hash_C955B4CD ); - - if ( loc == "" && isdefined( level.default_start_location ) ) - loc = level.default_start_location; - - if ( isdefined( level.gamemode_map_location_main[gamemode][loc] ) ) - level thread [[ level.gamemode_map_location_main[gamemode][loc] ]](); - } - } - - if ( isdefined( mode_main_func ) ) - { - if ( isdefined( use_round_logic ) && use_round_logic ) - level thread round_logic( mode_main_func ); - else - level thread non_round_logic( mode_main_func ); - } - - level thread game_end_func(); -} - -round_logic( mode_logic_func ) -{ - level.skit_vox_override = 1; - - if ( isdefined( level.flag["start_zombie_round_logic"] ) ) - flag_wait( "start_zombie_round_logic" ); - - flag_wait( "start_encounters_match_logic" ); - - if ( !isdefined( game["gamemode_match"]["rounds"] ) ) - game["gamemode_match"]["rounds"] = []; - - set_gamemode_var_once( "current_round", 0 ); - set_gamemode_var_once( "team_1_score", 0 ); - set_gamemode_var_once( "team_2_score", 0 ); - - if ( isdefined( is_encounter() ) && is_encounter() ) - { - [[ level._setteamscore ]]( "allies", get_gamemode_var( "team_2_score" ) ); - [[ level._setteamscore ]]( "axis", get_gamemode_var( "team_1_score" ) ); - } - - flag_set( "pregame" ); - waittillframeend; - level.gameended = 0; - cur_round = get_gamemode_var( "current_round" ); - set_gamemode_var( "current_round", cur_round + 1 ); - game["gamemode_match"]["rounds"][cur_round] = spawnstruct(); - game["gamemode_match"]["rounds"][cur_round].mode = getdvar( "ui_gametype" ); - level thread [[ mode_logic_func ]](); - flag_wait( "start_encounters_match_logic" ); - level.gamestarttime = gettime(); - level.gamelengthtime = undefined; - level notify( "clear_hud_elems" ); - - level waittill( "game_module_ended", winner ); - - game["gamemode_match"]["rounds"][cur_round].winner = winner; - level thread kill_all_zombies(); - level.gameendtime = gettime(); - level.gamelengthtime = level.gameendtime - level.gamestarttime; - level.gameended = 1; - - if ( winner == "A" ) - { - score = get_gamemode_var( "team_1_score" ); - set_gamemode_var( "team_1_score", score + 1 ); - } - else - { - score = get_gamemode_var( "team_2_score" ); - set_gamemode_var( "team_2_score", score + 1 ); - } - - if ( isdefined( is_encounter() ) && is_encounter() ) - { - [[ level._setteamscore ]]( "allies", get_gamemode_var( "team_2_score" ) ); - [[ level._setteamscore ]]( "axis", get_gamemode_var( "team_1_score" ) ); - - if ( get_gamemode_var( "team_1_score" ) == get_gamemode_var( "team_2_score" ) ) - { - level thread maps\mp\zombies\_zm_audio::zmbvoxcrowdonteam( "win" ); - level thread maps\mp\zombies\_zm_audio_announcer::announceroundwinner( "tied" ); - } - else - { - level thread maps\mp\zombies\_zm_audio::zmbvoxcrowdonteam( "win", winner, "lose" ); - level thread maps\mp\zombies\_zm_audio_announcer::announceroundwinner( winner ); - } - } - - level thread delete_corpses(); - level delay_thread( 5, ::revive_laststand_players ); - level notify( "clear_hud_elems" ); - - if ( startnextzmround( winner ) ) - { - level clientnotify( "gme" ); - - while ( true ) - wait 1; - } - - level.match_is_ending = 1; - - if ( isdefined( is_encounter() ) && is_encounter() ) - { - matchwonteam = ""; - - if ( get_gamemode_var( "team_1_score" ) > get_gamemode_var( "team_2_score" ) ) - matchwonteam = "A"; - else - matchwonteam = "B"; - - level thread maps\mp\zombies\_zm_audio::zmbvoxcrowdonteam( "win", matchwonteam, "lose" ); - level thread maps\mp\zombies\_zm_audio_announcer::announcematchwinner( matchwonteam ); - level create_final_score(); - track_encounters_win_stats( matchwonteam ); - } - - maps\mp\zombies\_zm::intermission(); - level.can_revive_game_module = undefined; - level notify( "end_game" ); -} - -end_rounds_early( winner ) -{ - level.forcedend = 1; - cur_round = get_gamemode_var( "current_round" ); - set_gamemode_var( "ZM_roundLimit", cur_round ); - - if ( isdefined( winner ) ) - level notify( "game_module_ended", winner ); - else - level notify( "end_game" ); -} - -checkzmroundswitch() -{ - if ( !isdefined( level.zm_roundswitch ) || !level.zm_roundswitch ) - return false; -/# - assert( get_gamemode_var( "current_round" ) > 0 ); -#/ - return true; - return false; -} - -create_hud_scoreboard( duration, fade ) -{ - level endon( "end_game" ); - level thread module_hud_full_screen_overlay(); - level thread module_hud_team_1_score( duration, fade ); - level thread module_hud_team_2_score( duration, fade ); - level thread module_hud_round_num( duration, fade ); - respawn_spectators_and_freeze_players(); - waittill_any_or_timeout( duration, "clear_hud_elems" ); -} - -respawn_spectators_and_freeze_players() -{ - players = get_players(); - - foreach ( player in players ) - { - if ( player.sessionstate == "spectator" ) - { - if ( isdefined( player.spectate_hud ) ) - player.spectate_hud destroy(); - - player [[ level.spawnplayer ]](); - } - - player freeze_player_controls( 1 ); - } -} - -module_hud_team_1_score( duration, fade ) -{ - level._encounters_score_1 = newhudelem(); - level._encounters_score_1.x = 0; - level._encounters_score_1.y = 260; - level._encounters_score_1.alignx = "center"; - level._encounters_score_1.horzalign = "center"; - level._encounters_score_1.vertalign = "top"; - level._encounters_score_1.font = "default"; - level._encounters_score_1.fontscale = 2.3; - level._encounters_score_1.color = ( 1, 1, 1 ); - level._encounters_score_1.foreground = 1; - level._encounters_score_1 settext( "Team CIA: " + get_gamemode_var( "team_1_score" ) ); - level._encounters_score_1.alpha = 0; - level._encounters_score_1.sort = 11; - level._encounters_score_1 fadeovertime( fade ); - level._encounters_score_1.alpha = 1; - level waittill_any_or_timeout( duration, "clear_hud_elems" ); - level._encounters_score_1 fadeovertime( fade ); - level._encounters_score_1.alpha = 0; - wait( fade ); - level._encounters_score_1 destroy(); -} - -module_hud_team_2_score( duration, fade ) -{ - level._encounters_score_2 = newhudelem(); - level._encounters_score_2.x = 0; - level._encounters_score_2.y = 290; - level._encounters_score_2.alignx = "center"; - level._encounters_score_2.horzalign = "center"; - level._encounters_score_2.vertalign = "top"; - level._encounters_score_2.font = "default"; - level._encounters_score_2.fontscale = 2.3; - level._encounters_score_2.color = ( 1, 1, 1 ); - level._encounters_score_2.foreground = 1; - level._encounters_score_2 settext( "Team CDC: " + get_gamemode_var( "team_2_score" ) ); - level._encounters_score_2.alpha = 0; - level._encounters_score_2.sort = 12; - level._encounters_score_2 fadeovertime( fade ); - level._encounters_score_2.alpha = 1; - level waittill_any_or_timeout( duration, "clear_hud_elems" ); - level._encounters_score_2 fadeovertime( fade ); - level._encounters_score_2.alpha = 0; - wait( fade ); - level._encounters_score_2 destroy(); -} - -module_hud_round_num( duration, fade ) -{ - level._encounters_round_num = newhudelem(); - level._encounters_round_num.x = 0; - level._encounters_round_num.y = 60; - level._encounters_round_num.alignx = "center"; - level._encounters_round_num.horzalign = "center"; - level._encounters_round_num.vertalign = "top"; - level._encounters_round_num.font = "default"; - level._encounters_round_num.fontscale = 2.3; - level._encounters_round_num.color = ( 1, 1, 1 ); - level._encounters_round_num.foreground = 1; - level._encounters_round_num settext( "Round: ^5" + ( get_gamemode_var( "current_round" ) + 1 ) + " / " + get_game_var( "ZM_roundLimit" ) ); - level._encounters_round_num.alpha = 0; - level._encounters_round_num.sort = 13; - level._encounters_round_num fadeovertime( fade ); - level._encounters_round_num.alpha = 1; - level waittill_any_or_timeout( duration, "clear_hud_elems" ); - level._encounters_round_num fadeovertime( fade ); - level._encounters_round_num.alpha = 0; - wait( fade ); - level._encounters_round_num destroy(); -} - -createtimer() -{ - flag_waitopen( "pregame" ); - elem = newhudelem(); - elem.hidewheninmenu = 1; - elem.horzalign = "center"; - elem.vertalign = "top"; - elem.alignx = "center"; - elem.aligny = "middle"; - elem.x = 0; - elem.y = 0; - elem.foreground = 1; - elem.font = "default"; - elem.fontscale = 1.5; - elem.color = ( 1, 1, 1 ); - elem.alpha = 2; - elem thread maps\mp\gametypes_zm\_hud::fontpulseinit(); - - if ( isdefined( level.timercountdown ) && level.timercountdown ) - elem settenthstimer( level.timelimit * 60 ); - else - elem settenthstimerup( 0.1 ); - - level.game_module_timer = elem; - - level waittill( "game_module_ended" ); - - elem destroy(); -} - -revive_laststand_players() -{ - if ( isdefined( level.match_is_ending ) && level.match_is_ending ) - return; - - players = get_players(); - - foreach ( player in players ) - { - if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - player thread maps\mp\zombies\_zm_laststand::auto_revive( player ); - } -} - -team_icon_winner( elem ) -{ - og_x = elem.x; - og_y = elem.y; - elem.sort = 1; - elem scaleovertime( 0.75, 150, 150 ); - elem moveovertime( 0.75 ); - elem.horzalign = "center"; - elem.vertalign = "middle"; - elem.x = 0; - elem.y = 0; - elem.alpha = 0.7; - wait 0.75; -} - -delete_corpses() -{ - corpses = getcorpsearray(); - - for ( x = 0; x < corpses.size; x++ ) - corpses[x] delete(); -} - -track_encounters_win_stats( matchwonteam ) -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i]._encounters_team == matchwonteam ) - { - players[i] maps\mp\zombies\_zm_stats::increment_client_stat( "wins" ); - players[i] maps\mp\zombies\_zm_stats::add_client_stat( "losses", -1 ); - players[i] adddstat( "skill_rating", 1.0 ); - players[i] setdstat( "skill_variance", 1.0 ); - - if ( gamemodeismode( level.gamemode_public_match ) ) - { - players[i] maps\mp\zombies\_zm_stats::add_location_gametype_stat( level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "wins", 1 ); - players[i] maps\mp\zombies\_zm_stats::add_location_gametype_stat( level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "losses", -1 ); - } - } - else - { - players[i] setdstat( "skill_rating", 0.0 ); - players[i] setdstat( "skill_variance", 1.0 ); - } - - players[i] updatestatratio( "wlratio", "wins", "losses" ); - } -} - -non_round_logic( mode_logic_func ) -{ - level thread [[ mode_logic_func ]](); -} - -game_end_func() -{ - if ( !isdefined( get_gamemode_var( "match_end_notify" ) ) && !isdefined( get_gamemode_var( "match_end_func" ) ) ) - return; - - level waittill( get_gamemode_var( "match_end_notify" ), winning_team ); - - level thread [[ get_gamemode_var( "match_end_func" ) ]]( winning_team ); -} - -setup_classic_gametype() -{ - ents = getentarray(); - - foreach ( ent in ents ) - { - if ( isdefined( ent.script_parameters ) ) - { - parameters = strtok( ent.script_parameters, " " ); - should_remove = 0; - - foreach ( parm in parameters ) - { - if ( parm == "survival_remove" ) - should_remove = 1; - } - - if ( should_remove ) - ent delete(); - } - } - - structs = getstructarray( "game_mode_object" ); - - foreach ( struct in structs ) - { - if ( !isdefined( struct.script_string ) ) - continue; - - tokens = strtok( struct.script_string, " " ); - spawn_object = 0; - - foreach ( parm in tokens ) - { - if ( parm == "survival" ) - spawn_object = 1; - } - - if ( !spawn_object ) - continue; - - barricade = spawn( "script_model", struct.origin ); - barricade.angles = struct.angles; - barricade setmodel( struct.script_parameters ); - } - - unlink_meat_traversal_nodes(); -} - -zclassic_main() -{ - level thread setup_classic_gametype(); - level thread maps\mp\zombies\_zm::round_start(); -} - -unlink_meat_traversal_nodes() -{ - meat_town_nodes = getnodearray( "meat_town_barrier_traversals", "targetname" ); - meat_tunnel_nodes = getnodearray( "meat_tunnel_barrier_traversals", "targetname" ); - meat_farm_nodes = getnodearray( "meat_farm_barrier_traversals", "targetname" ); - nodes = arraycombine( meat_town_nodes, meat_tunnel_nodes, 1, 0 ); - traversal_nodes = arraycombine( nodes, meat_farm_nodes, 1, 0 ); - - foreach ( node in traversal_nodes ) - { - end_node = getnode( node.target, "targetname" ); - unlink_nodes( node, end_node ); - } -} - -canplayersuicide() -{ - return self hasperk( "specialty_scavenger" ); -} - -onplayerdisconnect() -{ - if ( isdefined( level.game_mode_custom_onplayerdisconnect ) ) - level [[ level.game_mode_custom_onplayerdisconnect ]]( self ); - - level thread maps\mp\zombies\_zm::check_quickrevive_for_hotjoin( 1 ); - self maps\mp\zombies\_zm_laststand::add_weighted_down(); - level maps\mp\zombies\_zm::checkforalldead( self ); -} - -ondeadevent( team ) -{ - thread maps\mp\gametypes_zm\_globallogic::endgame( level.zombie_team, "" ); -} - -onspawnintermission() -{ - spawnpointname = "info_intermission"; - spawnpoints = getentarray( spawnpointname, "classname" ); - - if ( spawnpoints.size < 1 ) - { -/# - println( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" ); -#/ - return; - } - - spawnpoint = spawnpoints[randomint( spawnpoints.size )]; - - if ( isdefined( spawnpoint ) ) - self spawn( spawnpoint.origin, spawnpoint.angles ); -} - -onspawnspectator( origin, angles ) -{ - -} - -mayspawn() -{ - if ( isdefined( level.custommayspawnlogic ) ) - return self [[ level.custommayspawnlogic ]](); - - if ( self.pers["lives"] == 0 ) - { - level notify( "player_eliminated" ); - self notify( "player_eliminated" ); - return 0; - } - - return 1; -} - -onstartgametype() -{ - setclientnamemode( "auto_change" ); - level.displayroundendtext = 0; - maps\mp\gametypes_zm\_spawning::create_map_placed_influencers(); - - if ( !isoneround() ) - { - level.displayroundendtext = 1; - - if ( isscoreroundbased() ) - maps\mp\gametypes_zm\_globallogic_score::resetteamscores(); - } -} - -module_hud_full_screen_overlay() -{ - fadetoblack = newhudelem(); - fadetoblack.x = 0; - fadetoblack.y = 0; - fadetoblack.horzalign = "fullscreen"; - fadetoblack.vertalign = "fullscreen"; - fadetoblack setshader( "black", 640, 480 ); - fadetoblack.color = ( 0, 0, 0 ); - fadetoblack.alpha = 1; - fadetoblack.foreground = 1; - fadetoblack.sort = 0; - - if ( is_encounter() || getdvar( "ui_gametype" ) == "zcleansed" ) - level waittill_any_or_timeout( 25, "start_fullscreen_fade_out" ); - else - level waittill_any_or_timeout( 25, "start_zombie_round_logic" ); - - fadetoblack fadeovertime( 2.0 ); - fadetoblack.alpha = 0; - wait 2.1; - fadetoblack destroy(); -} - -create_final_score() -{ - level endon( "end_game" ); - level thread module_hud_team_winer_score(); - wait 2; -} - -module_hud_team_winer_score() -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - players[i] thread create_module_hud_team_winer_score(); - - if ( isdefined( players[i]._team_hud ) && isdefined( players[i]._team_hud["team"] ) ) - players[i] thread team_icon_winner( players[i]._team_hud["team"] ); - - if ( isdefined( level.lock_player_on_team_score ) && level.lock_player_on_team_score ) - { - players[i] freezecontrols( 1 ); - players[i] takeallweapons(); - players[i] setclientuivisibilityflag( "hud_visible", 0 ); - players[i].sessionstate = "spectator"; - players[i].spectatorclient = -1; - players[i].maxhealth = players[i].health; - players[i].shellshocked = 0; - players[i].inwater = 0; - players[i].friendlydamage = undefined; - players[i].hasspawned = 1; - players[i].spawntime = gettime(); - players[i].afk = 0; - players[i] detachall(); - } - } - - level thread maps\mp\zombies\_zm_audio::change_zombie_music( "match_over" ); -} - -create_module_hud_team_winer_score() -{ - self._team_winer_score = newclienthudelem( self ); - self._team_winer_score.x = 0; - self._team_winer_score.y = 70; - self._team_winer_score.alignx = "center"; - self._team_winer_score.horzalign = "center"; - self._team_winer_score.vertalign = "middle"; - self._team_winer_score.font = "default"; - self._team_winer_score.fontscale = 15; - self._team_winer_score.color = ( 0, 1, 0 ); - self._team_winer_score.foreground = 1; - - if ( self._encounters_team == "B" && get_gamemode_var( "team_2_score" ) > get_gamemode_var( "team_1_score" ) ) - self._team_winer_score settext( &"ZOMBIE_MATCH_WON" ); - else if ( self._encounters_team == "B" && get_gamemode_var( "team_2_score" ) < get_gamemode_var( "team_1_score" ) ) - { - self._team_winer_score.color = ( 1, 0, 0 ); - self._team_winer_score settext( &"ZOMBIE_MATCH_LOST" ); - } - - if ( self._encounters_team == "A" && get_gamemode_var( "team_1_score" ) > get_gamemode_var( "team_2_score" ) ) - self._team_winer_score settext( &"ZOMBIE_MATCH_WON" ); - else if ( self._encounters_team == "A" && get_gamemode_var( "team_1_score" ) < get_gamemode_var( "team_2_score" ) ) - { - self._team_winer_score.color = ( 1, 0, 0 ); - self._team_winer_score settext( &"ZOMBIE_MATCH_LOST" ); - } - - self._team_winer_score.alpha = 0; - self._team_winer_score.sort = 12; - self._team_winer_score fadeovertime( 0.25 ); - self._team_winer_score.alpha = 1; - wait 2; - self._team_winer_score fadeovertime( 0.25 ); - self._team_winer_score.alpha = 0; - wait 0.25; - self._team_winer_score destroy(); -} - -displayroundend( round_winner ) -{ - players = get_players(); - - foreach ( player in players ) - { - player thread module_hud_round_end( round_winner ); - - if ( isdefined( player._team_hud ) && isdefined( player._team_hud["team"] ) ) - player thread team_icon_winner( player._team_hud["team"] ); - - player freeze_player_controls( 1 ); - } - - level thread maps\mp\zombies\_zm_audio::change_zombie_music( "round_end" ); - level thread maps\mp\zombies\_zm_audio::zmbvoxcrowdonteam( "clap" ); - level thread play_sound_2d( "zmb_air_horn" ); - wait 2.0; -} - -module_hud_round_end( round_winner ) -{ - self endon( "disconnect" ); - self._team_winner_round = newclienthudelem( self ); - self._team_winner_round.x = 0; - self._team_winner_round.y = 50; - self._team_winner_round.alignx = "center"; - self._team_winner_round.horzalign = "center"; - self._team_winner_round.vertalign = "middle"; - self._team_winner_round.font = "default"; - self._team_winner_round.fontscale = 15; - self._team_winner_round.color = ( 1, 1, 1 ); - self._team_winner_round.foreground = 1; - - if ( self._encounters_team == round_winner ) - { - self._team_winner_round.color = ( 0, 1, 0 ); - self._team_winner_round settext( "YOU WIN" ); - } - else - { - self._team_winner_round.color = ( 1, 0, 0 ); - self._team_winner_round settext( "YOU LOSE" ); - } - - self._team_winner_round.alpha = 0; - self._team_winner_round.sort = 12; - self._team_winner_round fadeovertime( 0.25 ); - self._team_winner_round.alpha = 1; - wait 1.5; - self._team_winner_round fadeovertime( 0.25 ); - self._team_winner_round.alpha = 0; - wait 0.25; - self._team_winner_round destroy(); -} - -displayroundswitch() -{ - level._round_changing_sides = newhudelem(); - level._round_changing_sides.x = 0; - level._round_changing_sides.y = 60; - level._round_changing_sides.alignx = "center"; - level._round_changing_sides.horzalign = "center"; - level._round_changing_sides.vertalign = "middle"; - level._round_changing_sides.font = "default"; - level._round_changing_sides.fontscale = 2.3; - level._round_changing_sides.color = ( 1, 1, 1 ); - level._round_changing_sides.foreground = 1; - level._round_changing_sides.sort = 12; - fadetoblack = newhudelem(); - fadetoblack.x = 0; - fadetoblack.y = 0; - fadetoblack.horzalign = "fullscreen"; - fadetoblack.vertalign = "fullscreen"; - fadetoblack setshader( "black", 640, 480 ); - fadetoblack.color = ( 0, 0, 0 ); - fadetoblack.alpha = 1; - level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "side_switch" ); - level._round_changing_sides settext( "CHANGING SIDES" ); - level._round_changing_sides fadeovertime( 0.25 ); - level._round_changing_sides.alpha = 1; - wait 1.0; - fadetoblack fadeovertime( 1.0 ); - level._round_changing_sides fadeovertime( 0.25 ); - level._round_changing_sides.alpha = 0; - fadetoblack.alpha = 0; - wait 0.25; - level._round_changing_sides destroy(); - fadetoblack destroy(); -} - -module_hud_create_team_name() -{ - if ( !is_encounter() ) - return; - - if ( !isdefined( self._team_hud ) ) - self._team_hud = []; - - if ( isdefined( self._team_hud["team"] ) ) - self._team_hud["team"] destroy(); - - elem = newclienthudelem( self ); - elem.hidewheninmenu = 1; - elem.alignx = "center"; - elem.aligny = "middle"; - elem.horzalign = "center"; - elem.vertalign = "middle"; - elem.x = 0; - elem.y = 0; - - if ( isdefined( level.game_module_team_name_override_og_x ) ) - elem.og_x = level.game_module_team_name_override_og_x; - else - elem.og_x = 85; - - elem.og_y = -40; - elem.foreground = 1; - elem.font = "default"; - elem.color = ( 1, 1, 1 ); - elem.sort = 1; - elem.alpha = 0.7; - elem setshader( game["icons"][self.team], 150, 150 ); - self._team_hud["team"] = elem; -} - -nextzmhud( winner ) -{ - displayroundend( winner ); - create_hud_scoreboard( 1.0, 0.25 ); - - if ( checkzmroundswitch() ) - displayroundswitch(); -} - -startnextzmround( winner ) -{ - if ( !isonezmround() ) - { - if ( !waslastzmround() ) - { - nextzmhud( winner ); - setmatchtalkflag( "DeadChatWithDead", level.voip.deadchatwithdead ); - setmatchtalkflag( "DeadChatWithTeam", level.voip.deadchatwithteam ); - setmatchtalkflag( "DeadHearTeamLiving", level.voip.deadhearteamliving ); - setmatchtalkflag( "DeadHearAllLiving", level.voip.deadhearallliving ); - setmatchtalkflag( "EveryoneHearsEveryone", level.voip.everyonehearseveryone ); - setmatchtalkflag( "DeadHearKiller", level.voip.deadhearkiller ); - setmatchtalkflag( "KillersHearVictim", level.voip.killershearvictim ); - game["state"] = "playing"; - level.allowbattlechatter = getgametypesetting( "allowBattleChatter" ); - - if ( isdefined( level.zm_switchsides_on_roundswitch ) && level.zm_switchsides_on_roundswitch ) - set_game_var( "switchedsides", !get_game_var( "switchedsides" ) ); - - map_restart( 1 ); - return true; - } - } - - return false; -} - -start_round() -{ - flag_clear( "start_encounters_match_logic" ); - - if ( !isdefined( level._module_round_hud ) ) - { - level._module_round_hud = newhudelem(); - level._module_round_hud.x = 0; - level._module_round_hud.y = 70; - level._module_round_hud.alignx = "center"; - level._module_round_hud.horzalign = "center"; - level._module_round_hud.vertalign = "middle"; - level._module_round_hud.font = "default"; - level._module_round_hud.fontscale = 2.3; - level._module_round_hud.color = ( 1, 1, 1 ); - level._module_round_hud.foreground = 1; - level._module_round_hud.sort = 0; - } - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] freeze_player_controls( 1 ); - - level._module_round_hud.alpha = 1; - label = &"Next Round Starting In ^2"; - level._module_round_hud.label = label; - level._module_round_hud settimer( 3 ); - level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "countdown" ); - level thread maps\mp\zombies\_zm_audio::zmbvoxcrowdonteam( "clap" ); - level thread maps\mp\zombies\_zm_audio::change_zombie_music( "round_start" ); - level notify( "start_fullscreen_fade_out" ); - wait 2; - level._module_round_hud fadeovertime( 1 ); - level._module_round_hud.alpha = 0; - wait 1; - level thread play_sound_2d( "zmb_air_horn" ); - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - players[i] freeze_player_controls( 0 ); - players[i] sprintuprequired(); - } - - flag_set( "start_encounters_match_logic" ); - flag_clear( "pregame" ); - level._module_round_hud destroy(); -} - -isonezmround() -{ - if ( get_game_var( "ZM_roundLimit" ) == 1 ) - return true; - - return false; -} - -waslastzmround() -{ - if ( isdefined( level.forcedend ) && level.forcedend ) - return true; - - if ( hitzmroundlimit() || hitzmscorelimit() || hitzmroundwinlimit() ) - return true; - - return false; -} - -hitzmroundlimit() -{ - if ( get_game_var( "ZM_roundLimit" ) <= 0 ) - return 0; - - return getzmroundsplayed() >= get_game_var( "ZM_roundLimit" ); -} - -hitzmroundwinlimit() -{ - if ( !isdefined( get_game_var( "ZM_roundWinLimit" ) ) || get_game_var( "ZM_roundWinLimit" ) <= 0 ) - return false; - - if ( get_gamemode_var( "team_1_score" ) >= get_game_var( "ZM_roundWinLimit" ) || get_gamemode_var( "team_2_score" ) >= get_game_var( "ZM_roundWinLimit" ) ) - return true; - - if ( get_gamemode_var( "team_1_score" ) >= get_game_var( "ZM_roundWinLimit" ) || get_gamemode_var( "team_2_score" ) >= get_game_var( "ZM_roundWinLimit" ) ) - { - if ( get_gamemode_var( "team_1_score" ) != get_gamemode_var( "team_2_score" ) ) - return true; - } - - return false; -} - -hitzmscorelimit() -{ - if ( get_game_var( "ZM_scoreLimit" ) <= 0 ) - return false; - - if ( is_encounter() ) - { - if ( get_gamemode_var( "team_1_score" ) >= get_game_var( "ZM_scoreLimit" ) || get_gamemode_var( "team_2_score" ) >= get_game_var( "ZM_scoreLimit" ) ) - return true; - } - - return false; -} - -getzmroundsplayed() -{ - return get_gamemode_var( "current_round" ); -} - -onspawnplayerunified() -{ - onspawnplayer( 0 ); -} - -onspawnplayer( predictedspawn ) -{ - if ( !isdefined( predictedspawn ) ) - predictedspawn = 0; - - pixbeginevent( "ZSURVIVAL:onSpawnPlayer" ); - self.usingobj = undefined; - self.is_zombie = 0; - - if ( isdefined( level.custom_spawnplayer ) && ( isdefined( self.player_initialized ) && self.player_initialized ) ) - { - self [[ level.custom_spawnplayer ]](); - return; - } - - if ( isdefined( level.customspawnlogic ) ) - { -/# - println( "ZM >> USE CUSTOM SPAWNING" ); -#/ - spawnpoint = self [[ level.customspawnlogic ]]( predictedspawn ); - - if ( predictedspawn ) - return; - } - else - { -/# - println( "ZM >> USE STANDARD SPAWNING" ); -#/ - if ( flag( "begin_spawning" ) ) - { - spawnpoint = maps\mp\zombies\_zm::check_for_valid_spawn_near_team( self, 1 ); -/# - if ( !isdefined( spawnpoint ) ) - println( "ZM >> WARNING UNABLE TO FIND RESPAWN POINT NEAR TEAM - USING INITIAL SPAWN POINTS" ); -#/ - } - - 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, " " ); - - foreach ( token in tokens ) - { - if ( token == match_string ) - spawnpoints[spawnpoints.size] = struct; - } - } - } - } - - 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 ); - } - - if ( predictedspawn ) - { - self predictspawnpoint( spawnpoint.origin, spawnpoint.angles ); - return; - } - else - self spawn( spawnpoint.origin, spawnpoint.angles, "zsurvival" ); - } - - self.entity_num = self getentitynumber(); - self thread maps\mp\zombies\_zm::onplayerspawned(); - self thread maps\mp\zombies\_zm::player_revive_monitor(); - self freezecontrols( 1 ); - self.spectator_respawn = spawnpoint; - self.score = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "score" ); - self.pers["participation"] = 0; -/# - if ( getdvarint( _hash_FA81816F ) >= 1 ) - self.score = 100000; -#/ - self.score_total = self.score; - self.old_score = self.score; - self.player_initialized = 0; - self.zombification_time = 0; - self.enabletext = 1; - self thread maps\mp\zombies\_zm_blockers::rebuild_barrier_reward_reset(); - - if ( !( isdefined( level.host_ended_game ) && level.host_ended_game ) ) - { - self freeze_player_controls( 0 ); - self enableweapons(); - } - - if ( isdefined( level.game_mode_spawn_player_logic ) ) - { - spawn_in_spectate = [[ level.game_mode_spawn_player_logic ]](); - - if ( spawn_in_spectate ) - self delay_thread( 0.05, maps\mp\zombies\_zm::spawnspectator ); - } - - pixendevent(); -} - -get_player_spawns_for_gametype() -{ - 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; - player_spawns = []; - structs = getstructarray( "player_respawn_point", "targetname" ); - - foreach ( struct in structs ) - { - if ( isdefined( struct.script_string ) ) - { - tokens = strtok( struct.script_string, " " ); - - foreach ( token in tokens ) - { - if ( token == match_string ) - player_spawns[player_spawns.size] = struct; - } - - continue; - } - - player_spawns[player_spawns.size] = struct; - } - - return player_spawns; -} - -onendgame( winningteam ) -{ - -} - -onroundendgame( roundwinner ) -{ - if ( game["roundswon"]["allies"] == game["roundswon"]["axis"] ) - winner = "tie"; - else if ( game["roundswon"]["axis"] > game["roundswon"]["allies"] ) - winner = "axis"; - else - winner = "allies"; - - return winner; -} - -menu_init() -{ - game["menu_team"] = "team_marinesopfor"; - game["menu_changeclass_allies"] = "changeclass"; - game["menu_initteam_allies"] = "initteam_marines"; - game["menu_changeclass_axis"] = "changeclass"; - game["menu_initteam_axis"] = "initteam_opfor"; - game["menu_class"] = "class"; - game["menu_changeclass"] = "changeclass"; - game["menu_changeclass_offline"] = "changeclass"; - game["menu_wager_side_bet"] = "sidebet"; - game["menu_wager_side_bet_player"] = "sidebet_player"; - game["menu_changeclass_wager"] = "changeclass_wager"; - game["menu_changeclass_custom"] = "changeclass_custom"; - game["menu_changeclass_barebones"] = "changeclass_barebones"; - game["menu_controls"] = "ingame_controls"; - game["menu_options"] = "ingame_options"; - game["menu_leavegame"] = "popup_leavegame"; - game["menu_restartgamepopup"] = "restartgamepopup"; - precachemenu( game["menu_controls"] ); - precachemenu( game["menu_options"] ); - precachemenu( game["menu_leavegame"] ); - precachemenu( game["menu_restartgamepopup"] ); - precachemenu( "scoreboard" ); - precachemenu( game["menu_team"] ); - precachemenu( game["menu_changeclass_allies"] ); - precachemenu( game["menu_initteam_allies"] ); - precachemenu( game["menu_changeclass_axis"] ); - precachemenu( game["menu_class"] ); - precachemenu( game["menu_changeclass"] ); - precachemenu( game["menu_initteam_axis"] ); - precachemenu( game["menu_changeclass_offline"] ); - precachemenu( game["menu_changeclass_wager"] ); - precachemenu( game["menu_changeclass_custom"] ); - precachemenu( game["menu_changeclass_barebones"] ); - precachemenu( game["menu_wager_side_bet"] ); - precachemenu( game["menu_wager_side_bet_player"] ); - precachestring( &"MP_HOST_ENDED_GAME" ); - precachestring( &"MP_HOST_ENDGAME_RESPONSE" ); - level thread menu_onplayerconnect(); -} - -menu_onplayerconnect() -{ - for (;;) - { - level waittill( "connecting", player ); - - player thread menu_onmenuresponse(); - } -} - -menu_onmenuresponse() -{ - self endon( "disconnect" ); - - for (;;) - { - self waittill( "menuresponse", menu, response ); - - if ( response == "back" ) - { - self closemenu(); - self closeingamemenu(); - - if ( level.console ) - { - if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_team"] || menu == game["menu_controls"] ) - { - if ( self.pers["team"] == "allies" ) - self openmenu( game["menu_class"] ); - - if ( self.pers["team"] == "axis" ) - self openmenu( game["menu_class"] ); - } - } - - continue; - } - - if ( response == "changeteam" && level.allow_teamchange == "1" ) - { - self closemenu(); - self closeingamemenu(); - self openmenu( game["menu_team"] ); - } - - if ( response == "changeclass_marines" ) - { - self closemenu(); - self closeingamemenu(); - self openmenu( game["menu_changeclass_allies"] ); - continue; - } - - if ( response == "changeclass_opfor" ) - { - self closemenu(); - self closeingamemenu(); - self openmenu( game["menu_changeclass_axis"] ); - continue; - } - - if ( response == "changeclass_wager" ) - { - self closemenu(); - self closeingamemenu(); - self openmenu( game["menu_changeclass_wager"] ); - continue; - } - - if ( response == "changeclass_custom" ) - { - self closemenu(); - self closeingamemenu(); - self openmenu( game["menu_changeclass_custom"] ); - continue; - } - - if ( response == "changeclass_barebones" ) - { - self closemenu(); - self closeingamemenu(); - self openmenu( game["menu_changeclass_barebones"] ); - continue; - } - - if ( response == "changeclass_marines_splitscreen" ) - self openmenu( "changeclass_marines_splitscreen" ); - - if ( response == "changeclass_opfor_splitscreen" ) - self openmenu( "changeclass_opfor_splitscreen" ); - - if ( response == "endgame" ) - { - if ( self issplitscreen() ) - { - level.skipvote = 1; - - if ( !( isdefined( level.gameended ) && level.gameended ) ) - { - self maps\mp\zombies\_zm_laststand::add_weighted_down(); - self maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "deaths" ); - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); - level.host_ended_game = 1; - maps\mp\zombies\_zm_game_module::freeze_players( 1 ); - level notify( "end_game" ); - } - } - - continue; - } - - if ( response == "restart_level_zm" ) - { - self maps\mp\zombies\_zm_laststand::add_weighted_down(); - self maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "deaths" ); - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); - missionfailed(); - } - - if ( response == "killserverpc" ) - { - level thread maps\mp\gametypes_zm\_globallogic::killserverpc(); - continue; - } - - if ( response == "endround" ) - { - if ( !( isdefined( level.gameended ) && level.gameended ) ) - { - self maps\mp\gametypes_zm\_globallogic::gamehistoryplayerquit(); - self maps\mp\zombies\_zm_laststand::add_weighted_down(); - self closemenu(); - self closeingamemenu(); - level.host_ended_game = 1; - maps\mp\zombies\_zm_game_module::freeze_players( 1 ); - level notify( "end_game" ); - } - else - { - self closemenu(); - self closeingamemenu(); - self iprintln( &"MP_HOST_ENDGAME_RESPONSE" ); - } - - continue; - } - - if ( menu == game["menu_team"] && level.allow_teamchange == "1" ) - { - switch ( response ) - { - case "allies": - self [[ level.allies ]](); - break; - case "axis": - self [[ level.teammenu ]]( response ); - break; - case "autoassign": - self [[ level.autoassign ]]( 1 ); - break; - case "spectator": - self [[ level.spectator ]](); - break; - } - - continue; - } - - if ( menu == game["menu_changeclass"] || menu == game["menu_changeclass_offline"] || menu == game["menu_changeclass_wager"] || menu == game["menu_changeclass_custom"] || menu == game["menu_changeclass_barebones"] ) - { - self closemenu(); - self closeingamemenu(); - - if ( level.rankedmatch && issubstr( response, "custom" ) ) - { - - } - - self.selectedclass = 1; - self [[ level.class ]]( response ); - } - } -} - -menuallieszombies() -{ - self maps\mp\gametypes_zm\_globallogic_ui::closemenus(); - - if ( !level.console && level.allow_teamchange == "0" && ( isdefined( self.hasdonecombat ) && self.hasdonecombat ) ) - return; - - if ( self.pers["team"] != "allies" ) - { - if ( level.ingraceperiod && ( !isdefined( self.hasdonecombat ) || !self.hasdonecombat ) ) - self.hasspawned = 0; - - if ( self.sessionstate == "playing" ) - { - self.switching_teams = 1; - self.joining_team = "allies"; - self.leaving_team = self.pers["team"]; - self suicide(); - } - - self.pers["team"] = "allies"; - self.team = "allies"; - self.pers["class"] = undefined; - self.class = undefined; - self.pers["weapon"] = undefined; - self.pers["savedmodel"] = undefined; - self updateobjectivetext(); - - if ( level.teambased ) - self.sessionteam = "allies"; - else - { - self.sessionteam = "none"; - self.ffateam = "allies"; - } - - self setclientscriptmainmenu( game["menu_class"] ); - self notify( "joined_team" ); - level notify( "joined_team" ); - self notify( "end_respawn" ); - } -} - -custom_spawn_init_func() -{ - array_thread( level.zombie_spawners, ::add_spawn_function, maps\mp\zombies\_zm_spawner::zombie_spawn_init ); - array_thread( level.zombie_spawners, ::add_spawn_function, level._zombies_round_spawn_failsafe ); -} - -kill_all_zombies() -{ - ai = getaiarray( level.zombie_team ); - - foreach ( zombie in ai ) - { - if ( isdefined( zombie ) ) - { - zombie dodamage( zombie.maxhealth * 2, zombie.origin, zombie, zombie, "none", "MOD_SUICIDE" ); - wait 0.05; - } - } + replaceFunc( maps/mp/gametypes/dem::isscoreboosting, ::always_false ); + replaceFunc( maps/mp/gametypes/dom::isscoreboosting, ::always_false ); + replaceFunc( maps/mp/gametypes/koth::isscoreboosting, ::always_false ); } init() { - flag_init( "pregame" ); - flag_set( "pregame" ); - level thread onplayerconnect(); + level.isKillBoosting = ::always_false; } -onplayerconnect() +always_false() { - for (;;) - { - level waittill( "connected", player ); - - player thread onplayerspawned(); - - if ( isdefined( level.game_module_onplayerconnect ) ) - player [[ level.game_module_onplayerconnect ]](); - } + return false; } -onplayerspawned() -{ - level endon( "end_game" ); - self endon( "disconnect" ); - for (;;) - { - self waittill_either( "spawned_player", "fake_spawned_player" ); - if ( isdefined( level.match_is_ending ) && level.match_is_ending ) - return; - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - self thread maps\mp\zombies\_zm_laststand::auto_revive( self ); - if ( isdefined( level.custom_player_fake_death_cleanup ) ) - self [[ level.custom_player_fake_death_cleanup ]](); - self setstance( "stand" ); - self.zmbdialogqueue = []; - self.zmbdialogactive = 0; - self.zmbdialoggroups = []; - self.zmbdialoggroup = ""; - if ( is_encounter() ) - { - if ( self.team == "axis" ) - { - self.characterindex = 0; - self._encounters_team = "A"; - self._team_name = &"ZOMBIE_RACE_TEAM_1"; - } - else - { - self.characterindex = 1; - self._encounters_team = "B"; - self._team_name = &"ZOMBIE_RACE_TEAM_2"; - } - } - - self takeallweapons(); - - if ( isdefined( level.givecustomcharacters ) ) - self [[ level.givecustomcharacters ]](); - - self giveweapon( "knife_zm" ); - - if ( isdefined( level.onplayerspawned_restore_previous_weapons ) && ( isdefined( level.isresetting_grief ) && level.isresetting_grief ) ) - weapons_restored = self [[ level.onplayerspawned_restore_previous_weapons ]](); - - if ( !( isdefined( weapons_restored ) && weapons_restored ) ) - self give_start_weapon( 1 ); - - weapons_restored = 0; - - if ( isdefined( level._team_loadout ) ) - { - self giveweapon( level._team_loadout ); - self switchtoweapon( level._team_loadout ); - } - - if ( isdefined( level.gamemode_post_spawn_logic ) ) - self [[ level.gamemode_post_spawn_logic ]](); - } -} - -wait_for_players() -{ - level endon( "end_race" ); - - if ( getdvarint( "party_playerCount" ) == 1 ) - { - flag_wait( "start_zombie_round_logic" ); - return; - } - - while ( !flag_exists( "start_zombie_round_logic" ) ) - wait 0.05; - - while ( !flag( "start_zombie_round_logic" ) && isdefined( level._module_connect_hud ) ) - { - level._module_connect_hud.alpha = 0; - level._module_connect_hud.sort = 12; - level._module_connect_hud fadeovertime( 1.0 ); - level._module_connect_hud.alpha = 1; - wait 1.5; - level._module_connect_hud fadeovertime( 1.0 ); - level._module_connect_hud.alpha = 0; - wait 1.5; - } - - if ( isdefined( level._module_connect_hud ) ) - level._module_connect_hud destroy(); -} - -onplayerconnect_check_for_hotjoin() -{ -/# - if ( getdvarint( _hash_EA6D219A ) > 0 ) - return; -#/ - map_logic_exists = level flag_exists( "start_zombie_round_logic" ); - map_logic_started = flag( "start_zombie_round_logic" ); - - if ( map_logic_exists && map_logic_started ) - self thread hide_gump_loading_for_hotjoiners(); -} - -hide_gump_loading_for_hotjoiners() -{ - self endon( "disconnect" ); - self.rebuild_barrier_reward = 1; - self.is_hotjoining = 1; - num = self getsnapshotackindex(); - - while ( num == self getsnapshotackindex() ) - wait 0.25; - - wait 0.5; - self maps\mp\zombies\_zm::spawnspectator(); - self.is_hotjoining = 0; - self.is_hotjoin = 1; - - if ( is_true( level.intermission ) || is_true( level.host_ended_game ) ) - { - setclientsysstate( "levelNotify", "zi", self ); - self setclientthirdperson( 0 ); - self resetfov(); - self.health = 100; - self thread [[ level.custom_intermission ]](); - } -} diff --git a/Zombie Core/patch_zm/maps/mp/gametypes_zm/zclassic.gsc b/Zombie Core/patch_zm/maps/mp/gametypes_zm/zclassic.gsc index bb3a391..615725b 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/zclassic.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/zclassic.gsc @@ -1,31 +1,30 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include common_scripts\utility; -#include maps\mp\gametypes_zm\_zm_gametype; -#include maps\mp\zombies\_zm_stats; +#include maps/mp/zombies/_zm_stats; +#include common_scripts/utility; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/_utility; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/zombies/_zm_stats; main() { - maps\mp\gametypes_zm\_zm_gametype::main(); - level.onprecachegametype = ::onprecachegametype; - level.onstartgametype = ::onstartgametype; - level._game_module_custom_spawn_init_func = maps\mp\gametypes_zm\_zm_gametype::custom_spawn_init_func; - level._game_module_stat_update_func = maps\mp\zombies\_zm_stats::survival_classic_custom_stat_update; - maps\mp\gametypes_zm\_zm_gametype::post_gametype_main( "zclassic" ); + maps/mp/gametypes_zm/_zm_gametype::main(); + level.onprecachegametype = ::onprecachegametype; + level.onstartgametype = ::onstartgametype; + level._game_module_custom_spawn_init_func = ::custom_spawn_init_func; + level._game_module_stat_update_func = ::survival_classic_custom_stat_update; + maps/mp/gametypes_zm/_zm_gametype::post_gametype_main( "zclassic" ); } onprecachegametype() { - level.playersuicideallowed = 1; - level.canplayersuicide = ::canplayersuicide; - level.suicide_weapon = "death_self_zm"; - precacheitem( "death_self_zm" ); - maps\mp\gametypes_zm\_zm_gametype::rungametypeprecache( "zclassic" ); + level.playersuicideallowed = 1; + level.canplayersuicide = ::canplayersuicide; + level.suicide_weapon = "death_self_zm"; + precacheitem( "death_self_zm" ); + maps/mp/gametypes_zm/_zm_gametype::rungametypeprecache( "zclassic" ); } onstartgametype() { - maps\mp\gametypes_zm\_zm_gametype::rungametypemain( "zclassic", maps\mp\gametypes_zm\_zm_gametype::zclassic_main ); -} + maps/mp/gametypes_zm/_zm_gametype::rungametypemain( "zclassic", ::zclassic_main ); +} \ No newline at end of file diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_load.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_load.gsc index 62bef28..95dd465 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_load.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_load.gsc @@ -1,481 +1,510 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\_script_gen; -#include maps\mp\_interactive_objects; -#include maps\mp\_audio; -#include maps\mp\_busing; -#include maps\mp\_music; -#include maps\mp\_fxanim; -#include maps\mp\_serverfaceanim_mp; -#include maps\mp\_art; -#include maps\mp\_createfx; -#include maps\mp\_global_fx; -#include maps\mp\_demo; -#include maps\mp\zombies\_load; -#include maps\mp\animscripts\utility; -#include maps\mp\animscripts\traverse\shared; -#include maps\mp\gametypes_zm\_spawnlogic; +//checked includes changed to match cerberus output +#include maps/mp/gametypes_zm/_spawnlogic; +#include maps/mp/animscripts/traverse/shared; +#include maps/mp/animscripts/utility; +#include maps/mp/zombies/_load; +#include maps/mp/_demo; +#include maps/mp/_global_fx; +#include maps/mp/_createfx; +#include maps/mp/_art; +#include maps/mp/_serverfaceanim_mp; +#include maps/mp/_fxanim; +#include maps/mp/_music; +#include maps/mp/_busing; +#include maps/mp/_audio; +#include maps/mp/_interactive_objects; +#include maps/mp/_script_gen; +#include maps/mp/_utility; +#include common_scripts/utility; -main( bscriptgened, bcsvgened, bsgenabled ) +main( bscriptgened, bcsvgened, bsgenabled ) //checked partially changed to match cerberus output { - if ( !isdefined( level.script_gen_dump_reasons ) ) - level.script_gen_dump_reasons = []; - - if ( !isdefined( bsgenabled ) ) - level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "First run"; - - if ( !isdefined( bcsvgened ) ) - bcsvgened = 0; - - level.bcsvgened = bcsvgened; - - if ( !isdefined( bscriptgened ) ) - bscriptgened = 0; - else - bscriptgened = 1; - - level.bscriptgened = bscriptgened; - level._loadstarted = 1; - struct_class_init(); - level.clientscripts = getdvar( "cg_usingClientScripts" ) != ""; - level._client_exploders = []; - level._client_exploder_ids = []; - - if ( !isdefined( level.flag ) ) - { - level.flag = []; - level.flags_lock = []; - } - - if ( !isdefined( level.timeofday ) ) - level.timeofday = "day"; - - flag_init( "scriptgen_done" ); - level.script_gen_dump_reasons = []; - - if ( !isdefined( level.script_gen_dump ) ) - { - level.script_gen_dump = []; - level.script_gen_dump_reasons[0] = "First run"; - } - - if ( !isdefined( level.script_gen_dump2 ) ) - level.script_gen_dump2 = []; - - if ( isdefined( level.createfxent ) && isdefined( level.script ) ) - script_gen_dump_addline( "maps\mp\createfx\" + level.script + "_fx::main();", level.script + "_fx" ); - - if ( isdefined( level.script_gen_dump_preload ) ) - { - for ( i = 0; i < level.script_gen_dump_preload.size; i++ ) - script_gen_dump_addline( level.script_gen_dump_preload[i].string, level.script_gen_dump_preload[i].signature ); - } - - if ( getdvar( "scr_RequiredMapAspectratio" ) == "" ) - setdvar( "scr_RequiredMapAspectratio", "1" ); - - setdvar( "r_waterFogTest", 0 ); - precacherumble( "reload_small" ); - precacherumble( "reload_medium" ); - precacherumble( "reload_large" ); - precacherumble( "reload_clipin" ); - precacherumble( "reload_clipout" ); - precacherumble( "reload_rechamber" ); - precacherumble( "pullout_small" ); - precacherumble( "buzz_high" ); - precacherumble( "riotshield_impact" ); - registerclientsys( "levelNotify" ); - level.aitriggerspawnflags = getaitriggerflags(); - level.vehicletriggerspawnflags = getvehicletriggerflags(); - level.physicstracemaskphysics = 1; - level.physicstracemaskvehicle = 2; - level.physicstracemaskwater = 4; - level.physicstracemaskclip = 8; - level.physicstracecontentsvehicleclip = 16; - level.createfx_enabled = getdvar( "createfx" ) != ""; - level thread start_intro_screen_zm(); - thread maps\mp\_interactive_objects::init(); - maps\mp\_audio::init(); - thread maps\mp\_busing::businit(); - thread maps\mp\_music::music_init(); - thread maps\mp\_fxanim::init(); - thread maps\mp\_serverfaceanim_mp::init(); - - if ( level.createfx_enabled ) - setinitialplayersconnected(); - - visionsetnight( "default_night" ); - setup_traversals(); - maps\mp\_art::main(); - setupexploders(); - parse_structs(); - thread footsteps(); + if ( !isDefined( level.script_gen_dump_reasons ) ) + { + level.script_gen_dump_reasons = []; + } + if ( !isDefined( bsgenabled ) ) + { + level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "First run"; + } + if ( !isDefined( bcsvgened ) ) + { + bcsvgened = 0; + } + level.bcsvgened = bcsvgened; + if ( !isDefined( bscriptgened ) ) + { + bscriptgened = 0; + } + else + { + bscriptgened = 1; + } + level.bscriptgened = bscriptgened; + level._loadstarted = 1; + struct_class_init(); + if ( getDvar( "cg_usingClientScripts" ) != "" ) //changed at own discretion + { + level.clientscripts = getDvar( "cg_usingClientScripts" ); + } + + level._client_exploders = []; + level._client_exploder_ids = []; + if ( !isDefined( level.flag ) ) + { + level.flag = []; + level.flags_lock = []; + } + if ( !isDefined( level.timeofday ) ) + { + level.timeofday = "day"; + } + flag_init( "scriptgen_done" ); + level.script_gen_dump_reasons = []; + if ( !isDefined( level.script_gen_dump ) ) + { + level.script_gen_dump = []; + level.script_gen_dump_reasons[ 0 ] = "First run"; + } + if ( !isDefined( level.script_gen_dump2 ) ) + { + level.script_gen_dump2 = []; + } + if ( isDefined( level.createfxent ) && isDefined( level.script ) ) + { + script_gen_dump_addline( "maps\\mp\\createfx\\" + level.script + "_fx::main();", level.script + "_fx" ); + } + if ( isDefined( level.script_gen_dump_preload ) ) + { + for ( i = 0; i < level.script_gen_dump_preload.size; i++ ) + { + script_gen_dump_addline( level.script_gen_dump_preload[ i ].string, level.script_gen_dump_preload[ i ].signature ); + } + } + if ( getDvar( "scr_RequiredMapAspectratio" ) == "" ) + { + setdvar( "scr_RequiredMapAspectratio", "1" ); + } + setdvar( "r_waterFogTest", 0 ); + precacherumble( "reload_small" ); + precacherumble( "reload_medium" ); + precacherumble( "reload_large" ); + precacherumble( "reload_clipin" ); + precacherumble( "reload_clipout" ); + precacherumble( "reload_rechamber" ); + precacherumble( "pullout_small" ); + precacherumble( "buzz_high" ); + precacherumble( "riotshield_impact" ); + registerclientsys( "levelNotify" ); + level.aitriggerspawnflags = getaitriggerflags(); + level.vehicletriggerspawnflags = getvehicletriggerflags(); + level.physicstracemaskphysics = 1; + level.physicstracemaskvehicle = 2; + level.physicstracemaskwater = 4; + level.physicstracemaskclip = 8; + level.physicstracecontentsvehicleclip = 16; + if ( getDvar( "createfx" ) != "" ) + { + level.createfx_enabled = getDvar( "createfx" ); + } + level thread start_intro_screen_zm(); + thread maps/mp/_interactive_objects::init(); + maps/mp/_audio::init(); + thread maps/mp/_busing::businit(); + thread maps/mp/_music::music_init(); + thread maps/mp/_fxanim::init(); + thread maps/mp/_serverfaceanim_mp::init(); + if ( level.createfx_enabled ) + { + setinitialplayersconnected(); + } + visionsetnight( "default_night" ); + setup_traversals(); + maps/mp/_art::main(); + setupexploders(); + parse_structs(); + thread footsteps(); + /* /# - level thread level_notify_listener(); - level thread client_notify_listener(); + level thread level_notify_listener(); + level thread client_notify_listener(); #/ - thread maps\mp\_createfx::fx_init(); - - if ( level.createfx_enabled ) - { - calculate_map_center(); - maps\mp\_createfx::createfx(); - } - - if ( getdvar( "r_reflectionProbeGenerate" ) == "1" ) - { - maps\mp\_global_fx::main(); - - level waittill( "eternity" ); - } - - thread maps\mp\_global_fx::main(); - maps\mp\_demo::init(); - - for ( p = 0; p < 6; p++ ) - { - switch ( p ) - { - case "0": - triggertype = "trigger_multiple"; - break; - case "1": - triggertype = "trigger_once"; - break; - case "2": - triggertype = "trigger_use"; - break; - case "3": - triggertype = "trigger_radius"; - break; - case "4": - triggertype = "trigger_lookat"; - break; - default: + */ + thread maps/mp/_createfx::fx_init(); + if ( level.createfx_enabled ) + { + calculate_map_center(); + maps/mp/_createfx::createfx(); + } + if ( getDvar( "r_reflectionProbeGenerate" ) == "1" ) + { + maps/mp/_global_fx::main(); + level waittill( "eternity" ); + } + thread maps/mp/_global_fx::main(); + maps/mp/_demo::init(); + for ( p = 0; p < 6; p++ ) + { + switch( p ) + { + case 0: + triggertype = "trigger_multiple"; + break; + case 1: + triggertype = "trigger_once"; + break; + case 2: + triggertype = "trigger_use"; + break; + case 3: + triggertype = "trigger_radius"; + break; + case 4: + triggertype = "trigger_lookat"; + break; + default: + /* /# - assert( p == 5 ); + assert( p == 5 ); #/ - triggertype = "trigger_damage"; - break; - } - - triggers = getentarray( triggertype, "classname" ); - - for ( i = 0; i < triggers.size; i++ ) - { - if ( isdefined( triggers[i].script_prefab_exploder ) ) - triggers[i].script_exploder = triggers[i].script_prefab_exploder; - - if ( isdefined( triggers[i].script_exploder ) ) - level thread maps\mp\zombies\_load::exploder_load( triggers[i] ); - } - } + */ + triggertype = "trigger_damage"; + break; + } + triggers = getentarray( triggertype, "classname" ); + for ( i = 0; i < triggers.size; i++ ) + { + if ( isDefined( triggers[ i ].script_prefab_exploder ) ) + { + triggers[ i ].script_exploder = triggers[ i ].script_prefab_exploder; + } + if ( isDefined( triggers[ i ].script_exploder ) ) + { + level thread maps/mp/zombies/_load::exploder_load( triggers[ i ] ); + } + } + } } -level_notify_listener() +level_notify_listener() //checked matches cerberus output { - while ( true ) - { - val = getdvar( "level_notify" ); - - if ( val != "" ) - { - level notify( val ); - setdvar( "level_notify", "" ); - } - - wait 0.2; - } + while ( 1 ) + { + val = getDvar( "level_notify" ); + if ( val != "" ) + { + level notify( val ); + setdvar( "level_notify", "" ); + } + wait 0.2; + } } -client_notify_listener() +client_notify_listener() //checked matches cerberus output { - while ( true ) - { - val = getdvar( "client_notify" ); - - if ( val != "" ) - { - clientnotify( val ); - setdvar( "client_notify", "" ); - } - - wait 0.2; - } + while ( 1 ) + { + val = getDvar( "client_notify" ); + if ( val != "" ) + { + clientnotify( val ); + setdvar( "client_notify", "" ); + } + wait 0.2; + } } -footsteps() +footsteps() //checked matches cerberus output { - if ( is_true( level.fx_exclude_footsteps ) ) - return; - - maps\mp\animscripts\utility::setfootstepeffect( "asphalt", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "brick", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "carpet", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "cloth", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "concrete", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "dirt", loadfx( "bio/player/fx_footstep_sand" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "foliage", loadfx( "bio/player/fx_footstep_sand" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "gravel", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "grass", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "metal", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "mud", loadfx( "bio/player/fx_footstep_mud" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "paper", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "plaster", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "rock", loadfx( "bio/player/fx_footstep_dust" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "sand", loadfx( "bio/player/fx_footstep_sand" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "water", loadfx( "bio/player/fx_footstep_water" ) ); - maps\mp\animscripts\utility::setfootstepeffect( "wood", loadfx( "bio/player/fx_footstep_dust" ) ); + if ( is_true( level.fx_exclude_footsteps ) ) + { + return; + } + maps/mp/animscripts/utility::setfootstepeffect( "asphalt", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "brick", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "carpet", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "cloth", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "concrete", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "dirt", loadfx( "bio/player/fx_footstep_sand" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "foliage", loadfx( "bio/player/fx_footstep_sand" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "gravel", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "grass", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "metal", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "mud", loadfx( "bio/player/fx_footstep_mud" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "paper", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "plaster", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "rock", loadfx( "bio/player/fx_footstep_dust" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "sand", loadfx( "bio/player/fx_footstep_sand" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "water", loadfx( "bio/player/fx_footstep_water" ) ); + maps/mp/animscripts/utility::setfootstepeffect( "wood", loadfx( "bio/player/fx_footstep_dust" ) ); } -parse_structs() +parse_structs() //checked matches cerberus output { - for ( i = 0; i < level.struct.size; i++ ) - { - if ( isdefined( level.struct[i].targetname ) ) - { - if ( level.struct[i].targetname == "flak_fire_fx" ) - { - level._effect["flak20_fire_fx"] = loadfx( "weapon/tracer/fx_tracer_flak_single_noExp" ); - level._effect["flak38_fire_fx"] = loadfx( "weapon/tracer/fx_tracer_quad_20mm_Flak38_noExp" ); - level._effect["flak_cloudflash_night"] = loadfx( "weapon/flak/fx_flak_cloudflash_night" ); - level._effect["flak_burst_single"] = loadfx( "weapon/flak/fx_flak_single_day_dist" ); - } - - if ( level.struct[i].targetname == "fake_fire_fx" ) - level._effect["distant_muzzleflash"] = loadfx( "weapon/muzzleflashes/heavy" ); - - if ( level.struct[i].targetname == "spotlight_fx" ) - level._effect["spotlight_beam"] = loadfx( "env/light/fx_ray_spotlight_md" ); - } - } + for ( i = 0; i < level.struct.size; i++ ) + { + if ( isDefined( level.struct[ i ].targetname ) ) + { + if ( level.struct[ i ].targetname == "flak_fire_fx" ) + { + level._effect[ "flak20_fire_fx" ] = loadfx( "weapon/tracer/fx_tracer_flak_single_noExp" ); + level._effect[ "flak38_fire_fx" ] = loadfx( "weapon/tracer/fx_tracer_quad_20mm_Flak38_noExp" ); + level._effect[ "flak_cloudflash_night" ] = loadfx( "weapon/flak/fx_flak_cloudflash_night" ); + level._effect[ "flak_burst_single" ] = loadfx( "weapon/flak/fx_flak_single_day_dist" ); + } + if ( level.struct[ i ].targetname == "fake_fire_fx" ) + { + level._effect[ "distant_muzzleflash" ] = loadfx( "weapon/muzzleflashes/heavy" ); + } + if ( level.struct[ i ].targetname == "spotlight_fx" ) + { + level._effect[ "spotlight_beam" ] = loadfx( "env/light/fx_ray_spotlight_md" ); + } + } + } } -exploder_load( trigger ) +exploder_load( trigger ) //checked matches cerberus output { - level endon( "killexplodertridgers" + trigger.script_exploder ); - - trigger waittill( "trigger" ); - - if ( isdefined( trigger.script_chance ) && randomfloat( 1 ) > trigger.script_chance ) - { - if ( isdefined( trigger.script_delay ) ) - wait( trigger.script_delay ); - else - wait 4; - - level thread exploder_load( trigger ); - return; - } - - maps\mp\_utility::exploder( trigger.script_exploder ); - level notify( "killexplodertridgers" + trigger.script_exploder ); + level endon( "killexplodertridgers" + trigger.script_exploder ); + trigger waittill( "trigger" ); + if ( isDefined( trigger.script_chance ) && randomfloat( 1 ) > trigger.script_chance ) + { + if ( isDefined( trigger.script_delay ) ) + { + wait trigger.script_delay; + } + else + { + wait 4; + } + level thread exploder_load( trigger ); + return; + } + maps/mp/_utility::exploder( trigger.script_exploder ); + level notify( "killexplodertridgers" + trigger.script_exploder ); } -setupexploders() +setupexploders() //checked partially changed to match cerberus output { - ents = getentarray( "script_brushmodel", "classname" ); - smodels = getentarray( "script_model", "classname" ); - - for ( i = 0; i < smodels.size; i++ ) - ents[ents.size] = smodels[i]; - - for ( i = 0; i < ents.size; i++ ) - { - if ( isdefined( ents[i].script_prefab_exploder ) ) - ents[i].script_exploder = ents[i].script_prefab_exploder; - - if ( isdefined( ents[i].script_exploder ) ) - { - if ( ents[i].model == "fx" && ( !isdefined( ents[i].targetname ) || ents[i].targetname != "exploderchunk" ) ) - { - ents[i] hide(); - continue; - } - - if ( isdefined( ents[i].targetname ) && ents[i].targetname == "exploder" ) - { - ents[i] hide(); - ents[i] notsolid(); - continue; - } - - if ( isdefined( ents[i].targetname ) && ents[i].targetname == "exploderchunk" ) - { - ents[i] hide(); - ents[i] notsolid(); - } - } - } - - script_exploders = []; - potentialexploders = getentarray( "script_brushmodel", "classname" ); - - for ( i = 0; i < potentialexploders.size; i++ ) - { - if ( isdefined( potentialexploders[i].script_prefab_exploder ) ) - potentialexploders[i].script_exploder = potentialexploders[i].script_prefab_exploder; - - if ( isdefined( potentialexploders[i].script_exploder ) ) - script_exploders[script_exploders.size] = potentialexploders[i]; - } - - potentialexploders = getentarray( "script_model", "classname" ); - - for ( i = 0; i < potentialexploders.size; i++ ) - { - if ( isdefined( potentialexploders[i].script_prefab_exploder ) ) - potentialexploders[i].script_exploder = potentialexploders[i].script_prefab_exploder; - - if ( isdefined( potentialexploders[i].script_exploder ) ) - script_exploders[script_exploders.size] = potentialexploders[i]; - } - - potentialexploders = getentarray( "item_health", "classname" ); - - for ( i = 0; i < potentialexploders.size; i++ ) - { - if ( isdefined( potentialexploders[i].script_prefab_exploder ) ) - potentialexploders[i].script_exploder = potentialexploders[i].script_prefab_exploder; - - if ( isdefined( potentialexploders[i].script_exploder ) ) - script_exploders[script_exploders.size] = potentialexploders[i]; - } - - if ( !isdefined( level.createfxent ) ) - level.createfxent = []; - - acceptabletargetnames = []; - acceptabletargetnames["exploderchunk visible"] = 1; - acceptabletargetnames["exploderchunk"] = 1; - acceptabletargetnames["exploder"] = 1; - - for ( i = 0; i < script_exploders.size; i++ ) - { - exploder = script_exploders[i]; - ent = createexploder( exploder.script_fxid ); - ent.v = []; - ent.v["origin"] = exploder.origin; - ent.v["angles"] = exploder.angles; - ent.v["delay"] = exploder.script_delay; - ent.v["firefx"] = exploder.script_firefx; - ent.v["firefxdelay"] = exploder.script_firefxdelay; - ent.v["firefxsound"] = exploder.script_firefxsound; - ent.v["firefxtimeout"] = exploder.script_firefxtimeout; - ent.v["earthquake"] = exploder.script_earthquake; - ent.v["damage"] = exploder.script_damage; - ent.v["damage_radius"] = exploder.script_radius; - ent.v["soundalias"] = exploder.script_soundalias; - ent.v["repeat"] = exploder.script_repeat; - ent.v["delay_min"] = exploder.script_delay_min; - ent.v["delay_max"] = exploder.script_delay_max; - ent.v["target"] = exploder.target; - ent.v["ender"] = exploder.script_ender; - ent.v["type"] = "exploder"; - - if ( !isdefined( exploder.script_fxid ) ) - ent.v["fxid"] = "No FX"; - else - ent.v["fxid"] = exploder.script_fxid; - - ent.v["exploder"] = exploder.script_exploder; + ents = getentarray( "script_brushmodel", "classname" ); + smodels = getentarray( "script_model", "classname" ); + for ( i = 0; i < smodels.size; i++ ) + { + ents[ ents.size ] = smodels[ i ]; + } + i = 0; + while ( i < ents.size ) + { + if ( isDefined( ents[ i ].script_prefab_exploder ) ) + { + ents[ i ].script_exploder = ents[ i ].script_prefab_exploder; + } + if ( isDefined( ents[ i ].script_exploder ) ) + { + if ( ents[ i ].model == "fx" || !isDefined( ents[ i ].targetname ) && ents[ i ].targetname != "exploderchunk" ) + { + ents[ i ] hide(); + i++; + continue; + } + if ( isDefined( ents[ i ].targetname ) && ents[ i ].targetname == "exploder" ) + { + ents[ i ] hide(); + ents[ i ] notsolid(); + i++; + continue; + } + if ( isDefined( ents[ i ].targetname ) && ents[ i ].targetname == "exploderchunk" ) + { + ents[ i ] hide(); + ents[ i ] notsolid(); + } + } + i++; + } + script_exploders = []; + potentialexploders = getentarray( "script_brushmodel", "classname" ); + for ( i = 0; i < potentialexploders.size; i++ ) + { + if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) ) + { + potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder; + } + if ( isDefined( potentialexploders[ i ].script_exploder ) ) + { + script_exploders[ script_exploders.size ] = potentialexploders[ i ]; + } + } + potentialexploders = getentarray( "script_model", "classname" ); + for ( i = 0; i < potentialexploders.size; i++ ) + { + if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) ) + { + potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder; + } + if ( isDefined( potentialexploders[ i ].script_exploder ) ) + { + script_exploders[ script_exploders.size ] = potentialexploders[ i ]; + } + } + potentialexploders = getentarray( "item_health", "classname" ); + for ( i = 0; i < potentialexploders.size; i++ ) + { + if ( isDefined( potentialexploders[ i ].script_prefab_exploder ) ) + { + potentialexploders[ i ].script_exploder = potentialexploders[ i ].script_prefab_exploder; + } + if ( isDefined( potentialexploders[ i ].script_exploder ) ) + { + script_exploders[ script_exploders.size ] = potentialexploders[ i ]; + } + } + if ( !isDefined( level.createfxent ) ) + { + level.createfxent = []; + } + acceptabletargetnames = []; + acceptabletargetnames[ "exploderchunk visible" ] = 1; + acceptabletargetnames[ "exploderchunk" ] = 1; + acceptabletargetnames[ "exploder" ] = 1; + for ( i = 0; i < script_exploders.size; i++ ) + { + exploder = script_exploders[ i ]; + ent = createexploder( exploder.script_fxid ); + ent.v = []; + ent.v[ "origin" ] = exploder.origin; + ent.v[ "angles" ] = exploder.angles; + ent.v[ "delay" ] = exploder.script_delay; + ent.v[ "firefx" ] = exploder.script_firefx; + ent.v[ "firefxdelay" ] = exploder.script_firefxdelay; + ent.v[ "firefxsound" ] = exploder.script_firefxsound; + ent.v[ "firefxtimeout" ] = exploder.script_firefxtimeout; + ent.v[ "earthquake" ] = exploder.script_earthquake; + ent.v[ "damage" ] = exploder.script_damage; + ent.v[ "damage_radius" ] = exploder.script_radius; + ent.v[ "soundalias" ] = exploder.script_soundalias; + ent.v[ "repeat" ] = exploder.script_repeat; + ent.v[ "delay_min" ] = exploder.script_delay_min; + ent.v[ "delay_max" ] = exploder.script_delay_max; + ent.v[ "target" ] = exploder.target; + ent.v[ "ender" ] = exploder.script_ender; + ent.v[ "type" ] = "exploder"; + if ( !isDefined( exploder.script_fxid ) ) + { + ent.v[ "fxid" ] = "No FX"; + } + else + { + ent.v[ "fxid" ] = exploder.script_fxid; + } + ent.v[ "exploder" ] = exploder.script_exploder; + /* /# - assert( isdefined( exploder.script_exploder ), "Exploder at origin " + exploder.origin + " has no script_exploder" ); + assert( isDefined( exploder.script_exploder ), "Exploder at origin " + exploder.origin + " has no script_exploder" ); #/ - if ( !isdefined( ent.v["delay"] ) ) - ent.v["delay"] = 0; - - if ( isdefined( exploder.target ) ) - { - org = getent( ent.v["target"], "targetname" ).origin; - ent.v["angles"] = vectortoangles( org - ent.v["origin"] ); - } - - if ( exploder.classname == "script_brushmodel" || isdefined( exploder.model ) ) - { - ent.model = exploder; - ent.model.disconnect_paths = exploder.script_disconnectpaths; - } - - if ( isdefined( exploder.targetname ) && isdefined( acceptabletargetnames[exploder.targetname] ) ) - ent.v["exploder_type"] = exploder.targetname; - else - ent.v["exploder_type"] = "normal"; - - ent maps\mp\_createfx::post_entity_creation_function(); - } - - level.createfxexploders = []; - - for ( i = 0; i < level.createfxent.size; i++ ) - { - ent = level.createfxent[i]; - - if ( ent.v["type"] != "exploder" ) - continue; - - ent.v["exploder_id"] = getexploderid( ent ); - - if ( !isdefined( level.createfxexploders[ent.v["exploder"]] ) ) - level.createfxexploders[ent.v["exploder"]] = []; - - level.createfxexploders[ent.v["exploder"]][level.createfxexploders[ent.v["exploder"]].size] = ent; - } + */ + if ( !isDefined( ent.v[ "delay" ] ) ) + { + ent.v[ "delay" ] = 0; + } + if ( isDefined( exploder.target ) ) + { + org = getent( ent.v[ "target" ], "targetname" ).origin; + ent.v[ "angles" ] = vectorToAngles( org - ent.v[ "origin" ] ); + } + if ( exploder.classname == "script_brushmodel" || isDefined( exploder.model ) ) + { + ent.model = exploder; + ent.model.disconnect_paths = exploder.script_disconnectpaths; + } + if ( isDefined( exploder.targetname ) && isDefined( acceptabletargetnames[ exploder.targetname ] ) ) + { + ent.v[ "exploder_type" ] = exploder.targetname; + } + else + { + ent.v[ "exploder_type" ] = "normal"; + } + ent maps/mp/_createfx::post_entity_creation_function(); + } + level.createfxexploders = []; + i = 0; + while ( i < level.createfxent.size ) + { + ent = level.createfxent[ i ]; + if ( ent.v[ "type" ] != "exploder" ) + { + i++; + continue; + } + ent.v[ "exploder_id" ] = getexploderid( ent ); + if ( !isDefined( level.createfxexploders[ ent.v[ "exploder" ] ] ) ) + { + level.createfxexploders[ ent.v[ "exploder" ] ] = []; + } + level.createfxexploders[ ent.v[ "exploder" ] ][ level.createfxexploders[ ent.v[ "exploder" ] ].size ] = ent; + i++; + } } -setup_traversals() +setup_traversals() //checked changed to match cerberus output { - potential_traverse_nodes = getallnodes(); - - for ( i = 0; i < potential_traverse_nodes.size; i++ ) - { - node = potential_traverse_nodes[i]; - - if ( node.type == "Begin" ) - node maps\mp\animscripts\traverse\shared::init_traverse(); - } + potential_traverse_nodes = getallnodes(); + for ( i = 0; i < potential_traverse_nodes.size; i++ ) + { + node = potential_traverse_nodes[ i ]; + if ( node.type == "Begin" ) + { + node maps/mp/animscripts/traverse/shared::init_traverse(); + } + } } -calculate_map_center() +calculate_map_center() //checked matches cerberus output { - if ( !isdefined( level.mapcenter ) ) - { - level.nodesmins = ( 0, 0, 0 ); - level.nodesmaxs = ( 0, 0, 0 ); - level.mapcenter = maps\mp\gametypes_zm\_spawnlogic::findboxcenter( level.nodesmins, level.nodesmaxs ); + if ( !isDefined( level.mapcenter ) ) + { + level.nodesmins = ( 0, 0, 0 ); + level.nodesmaxs = ( 0, 0, 0 ); + level.mapcenter = maps/mp/gametypes_zm/_spawnlogic::findboxcenter( level.nodesmins, level.nodesmaxs ); + /* /# - println( "map center: ", level.mapcenter ); + println( "map center: ", level.mapcenter ); #/ - setmapcenter( level.mapcenter ); - } + */ + setmapcenter( level.mapcenter ); + } } -start_intro_screen_zm() +start_intro_screen_zm() //checked changed to match cerberus output { - if ( level.createfx_enabled ) - return; - - if ( !isdefined( level.introscreen ) ) - { - level.introscreen = newhudelem(); - level.introscreen.x = 0; - level.introscreen.y = 0; - level.introscreen.horzalign = "fullscreen"; - level.introscreen.vertalign = "fullscreen"; - level.introscreen.foreground = 0; - level.introscreen setshader( "black", 640, 480 ); - level.introscreen.immunetodemogamehudsettings = 1; - level.introscreen.immunetodemofreecamera = 1; - wait 0.05; - } - - level.introscreen.alpha = 1; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] freezecontrols( 1 ); - - wait 1; + if ( level.createfx_enabled ) + { + return; + } + if ( !isDefined( level.introscreen ) ) + { + level.introscreen = newhudelem(); + level.introscreen.x = 0; + level.introscreen.y = 0; + level.introscreen.horzalign = "fullscreen"; + level.introscreen.vertalign = "fullscreen"; + level.introscreen.foreground = 0; + level.introscreen setshader( "black", 640, 480 ); + level.introscreen.immunetodemogamehudsettings = 1; + level.introscreen.immunetodemofreecamera = 1; + wait 0.05; + } + level.introscreen.alpha = 1; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] freezecontrols( 1 ); + } + wait 1; } + + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm.gsc index 939f1a8..ef6b809 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm.gsc @@ -1,5428 +1,5619 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_ffotd; -#include maps\mp\zombies\_zm; -#include maps\mp\_visionset_mgr; -#include maps\mp\zombies\_zm_devgui; -#include maps\mp\zombies\_zm_zonemgr; -#include maps\mp\zombies\_zm_unitrigger; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_blockers; -#include maps\mp\zombies\_zm_bot; -#include maps\mp\zombies\_zm_clone; -#include maps\mp\zombies\_zm_buildables; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_magicbox; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\zombies\_zm_playerhealth; -#include maps\mp\zombies\_zm_power; -#include maps\mp\zombies\_zm_powerups; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_spawner; -#include maps\mp\zombies\_zm_gump; -#include maps\mp\zombies\_zm_timer; -#include maps\mp\zombies\_zm_traps; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_tombstone; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_pers_upgrades; -#include maps\mp\gametypes_zm\_zm_gametype; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\_demo; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\zombies\_zm_melee_weapon; -#include maps\mp\zombies\_zm_ai_dogs; -#include maps\mp\zombies\_zm_pers_upgrades_system; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\zombies\_zm_ai_basic; -#include maps\mp\zombies\_zm_game_module; - -init() -{ - level.player_out_of_playable_area_monitor = 1; - level.player_too_many_weapons_monitor = 1; - level.player_too_many_weapons_monitor_func = ::player_too_many_weapons_monitor; - level.player_too_many_players_check = 1; - level.player_too_many_players_check_func = ::player_too_many_players_check; - level._use_choke_weapon_hints = 1; - level._use_choke_blockers = 1; - level.passed_introscreen = 0; - - if ( !isdefined( level.custom_ai_type ) ) - level.custom_ai_type = []; - - level.custom_ai_spawn_check_funcs = []; - level.spawn_funcs = []; - level.spawn_funcs["allies"] = []; - level.spawn_funcs["axis"] = []; - level.spawn_funcs["team3"] = []; - level thread maps\mp\zombies\_zm_ffotd::main_start(); - level.zombiemode = 1; - level.revivefeature = 0; - level.swimmingfeature = 0; - level.calc_closest_player_using_paths = 0; - level.zombie_melee_in_water = 1; - level.put_timed_out_zombies_back_in_queue = 1; - level.use_alternate_poi_positioning = 1; - level.zmb_laugh_alias = "zmb_laugh_richtofen"; - level.sndannouncerisrich = 1; - level.scr_zm_ui_gametype = getdvar( "ui_gametype" ); - level.scr_zm_ui_gametype_group = getdvar( _hash_6B64B9B4 ); - level.scr_zm_map_start_location = getdvar( _hash_C955B4CD ); - level.curr_gametype_affects_rank = 0; - gametype = tolower( getdvar( "g_gametype" ) ); - - if ( "zclassic" == gametype || "zstandard" == gametype ) - level.curr_gametype_affects_rank = 1; - - level.grenade_multiattack_bookmark_count = 1; - level.rampage_bookmark_kill_times_count = 3; - level.rampage_bookmark_kill_times_msec = 6000; - level.rampage_bookmark_kill_times_delay = 6000; - level thread watch_rampage_bookmark(); - - if ( !isdefined( level._zombies_round_spawn_failsafe ) ) - level._zombies_round_spawn_failsafe = maps\mp\zombies\_zm::round_spawn_failsafe; - - level.zombie_visionset = "zombie_neutral"; - - if ( getdvar( _hash_5DF80895 ) == "1" ) - level.zombie_anim_intro = 1; - else - level.zombie_anim_intro = 0; - - precache_shaders(); - precache_models(); - precacherumble( "explosion_generic" ); - precacherumble( "dtp_rumble" ); - precacherumble( "slide_rumble" ); - precache_zombie_leaderboards(); - level._zombie_gib_piece_index_all = 0; - level._zombie_gib_piece_index_right_arm = 1; - level._zombie_gib_piece_index_left_arm = 2; - level._zombie_gib_piece_index_right_leg = 3; - level._zombie_gib_piece_index_left_leg = 4; - level._zombie_gib_piece_index_head = 5; - level._zombie_gib_piece_index_guts = 6; - level._zombie_gib_piece_index_hat = 7; - - if ( !isdefined( level.zombie_ai_limit ) ) - level.zombie_ai_limit = 24; - - if ( !isdefined( level.zombie_actor_limit ) ) - level.zombie_actor_limit = 31; - - maps\mp\_visionset_mgr::init(); - init_dvars(); - init_strings(); - init_levelvars(); - init_sounds(); - init_shellshocks(); - init_flags(); - init_client_flags(); - registerclientfield( "world", "zombie_power_on", 1, 1, "int" ); - - if ( !( isdefined( level._no_navcards ) && level._no_navcards ) ) - { - if ( level.scr_zm_ui_gametype_group == "zclassic" && !level.createfx_enabled ) - { - registerclientfield( "allplayers", "navcard_held", 1, 4, "int" ); - level.navcards = []; - level.navcards[0] = "navcard_held_zm_transit"; - level.navcards[1] = "navcard_held_zm_highrise"; - level.navcards[2] = "navcard_held_zm_buried"; - level thread setup_player_navcard_hud(); - } - } - - register_offhand_weapons_for_level_defaults(); - level thread drive_client_connected_notifies(); -/# - maps\mp\zombies\_zm_devgui::init(); -#/ - maps\mp\zombies\_zm_zonemgr::init(); - maps\mp\zombies\_zm_unitrigger::init(); - maps\mp\zombies\_zm_audio::init(); - maps\mp\zombies\_zm_blockers::init(); - maps\mp\zombies\_zm_bot::init(); - maps\mp\zombies\_zm_clone::init(); - maps\mp\zombies\_zm_buildables::init(); - maps\mp\zombies\_zm_equipment::init(); - maps\mp\zombies\_zm_laststand::init(); - maps\mp\zombies\_zm_magicbox::init(); - maps\mp\zombies\_zm_perks::init(); - maps\mp\zombies\_zm_playerhealth::init(); - maps\mp\zombies\_zm_power::init(); - maps\mp\zombies\_zm_powerups::init(); - maps\mp\zombies\_zm_score::init(); - maps\mp\zombies\_zm_spawner::init(); - maps\mp\zombies\_zm_gump::init(); - maps\mp\zombies\_zm_timer::init(); - maps\mp\zombies\_zm_traps::init(); - maps\mp\zombies\_zm_weapons::init(); - init_function_overrides(); - level thread last_stand_pistol_rank_init(); - level thread maps\mp\zombies\_zm_tombstone::init(); - level thread post_all_players_connected(); - init_utility(); - maps\mp\_utility::registerclientsys( "lsm" ); - maps\mp\zombies\_zm_stats::init(); - initializestattracking(); - - if ( get_players().size <= 1 ) - incrementcounter( "global_solo_games", 1 ); - else if ( level.systemlink ) - incrementcounter( "global_systemlink_games", 1 ); - else if ( getdvarint( "splitscreen_playerCount" ) == get_players().size ) - incrementcounter( "global_splitscreen_games", 1 ); - else - incrementcounter( "global_coop_games", 1 ); - - onplayerconnect_callback( ::zm_on_player_connect ); - maps\mp\zombies\_zm_pers_upgrades::pers_upgrade_init(); - set_demo_intermission_point(); - level thread maps\mp\zombies\_zm_ffotd::main_end(); - level thread track_players_intersection_tracker(); - level thread onallplayersready(); - level thread startunitriggers(); - level thread maps\mp\gametypes_zm\_zm_gametype::post_init_gametype(); -} - -post_main() -{ - level thread init_custom_ai_type(); -} - -startunitriggers() -{ - flag_wait_any( "start_zombie_round_logic", "start_encounters_match_logic" ); - level thread maps\mp\zombies\_zm_unitrigger::main(); -} - -drive_client_connected_notifies() -{ - while ( true ) - { - level waittill( "connected", player ); - - player reset_rampage_bookmark_kill_times(); - player callback( "on_player_connect" ); - } -} - -fade_out_intro_screen_zm( hold_black_time, fade_out_time, destroyed_afterwards ) -{ - if ( !isdefined( level.introscreen ) ) - { - level.introscreen = newhudelem(); - level.introscreen.x = 0; - level.introscreen.y = 0; - level.introscreen.horzalign = "fullscreen"; - level.introscreen.vertalign = "fullscreen"; - level.introscreen.foreground = 0; - level.introscreen setshader( "black", 640, 480 ); - level.introscreen.immunetodemogamehudsettings = 1; - level.introscreen.immunetodemofreecamera = 1; - wait 0.05; - } - - level.introscreen.alpha = 1; - - if ( isdefined( hold_black_time ) ) - wait( hold_black_time ); - else - wait 0.2; - - if ( !isdefined( fade_out_time ) ) - fade_out_time = 1.5; - - level.introscreen fadeovertime( fade_out_time ); - level.introscreen.alpha = 0; - wait 1.6; - level.passed_introscreen = 1; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - players[i] setclientuivisibilityflag( "hud_visible", 1 ); - - if ( !( isdefined( level.host_ended_game ) && level.host_ended_game ) ) - { - if ( isdefined( level.player_movement_suppressed ) ) - { - players[i] freezecontrols( level.player_movement_suppressed ); -/# - println( " Unfreeze controls 4" ); -#/ - continue; - } - - if ( !( isdefined( players[i].hostmigrationcontrolsfrozen ) && players[i].hostmigrationcontrolsfrozen ) ) - { - players[i] freezecontrols( 0 ); -/# - println( " Unfreeze controls 5" ); -#/ - } - } - } - - if ( destroyed_afterwards == 1 ) - level.introscreen destroy(); - - flag_set( "initial_blackscreen_passed" ); -} - -onallplayersready() -{ - timeout = gettime() + 5000; - - while ( getnumexpectedplayers() == 0 && gettime() < timeout ) - wait 0.1; -/# - println( "ZM >> player_count_expected=" + getnumexpectedplayers() ); -#/ - player_count_actual = 0; - - while ( getnumconnectedplayers() < getnumexpectedplayers() || player_count_actual != getnumexpectedplayers() ) - { - players = get_players(); - player_count_actual = 0; - - for ( i = 0; i < players.size; i++ ) - { - players[i] freezecontrols( 1 ); - - if ( players[i].sessionstate == "playing" ) - player_count_actual++; - } -/# - println( "ZM >> Num Connected =" + getnumconnectedplayers() + " Expected : " + getnumexpectedplayers() ); -#/ - wait 0.1; - } - - setinitialplayersconnected(); -/# - println( "ZM >> We have all players - START ZOMBIE LOGIC" ); -#/ - if ( 1 == getnumconnectedplayers() && getdvarint( _hash_B0FB65D0 ) == 1 ) - { - level thread add_bots(); - flag_set( "initial_players_connected" ); - } - else - { - players = get_players(); - - if ( players.size == 1 ) - { - flag_set( "solo_game" ); - level.solo_lives_given = 0; - - foreach ( player in players ) - player.lives = 0; - - level maps\mp\zombies\_zm::set_default_laststand_pistol( 1 ); - } - - flag_set( "initial_players_connected" ); - - while ( !aretexturesloaded() ) - wait 0.05; - - thread start_zombie_logic_in_x_sec( 3.0 ); - } - - fade_out_intro_screen_zm( 5.0, 1.5, 1 ); -} - -start_zombie_logic_in_x_sec( time_to_wait ) -{ - wait( time_to_wait ); - flag_set( "start_zombie_round_logic" ); -} - -getallotherplayers() -{ - aliveplayers = []; - - for ( i = 0; i < level.players.size; i++ ) - { - if ( !isdefined( level.players[i] ) ) - continue; - - player = level.players[i]; - - if ( player.sessionstate != "playing" || player == self ) - continue; - - aliveplayers[aliveplayers.size] = player; - } - - return aliveplayers; -} - -getfreespawnpoint( spawnpoints, player ) -{ - if ( !isdefined( spawnpoints ) ) - { -/# - iprintlnbold( "ZM >> No free spawn points in map" ); -#/ - return undefined; - } - - if ( !isdefined( game["spawns_randomized"] ) ) - { - game["spawns_randomized"] = 1; - spawnpoints = array_randomize( spawnpoints ); - random_chance = randomint( 100 ); - - if ( random_chance > 50 ) - set_game_var( "side_selection", 1 ); - else - set_game_var( "side_selection", 2 ); - } - - side_selection = get_game_var( "side_selection" ); - - if ( get_game_var( "switchedsides" ) ) - { - if ( side_selection == 2 ) - side_selection = 1; - else if ( side_selection == 1 ) - side_selection = 2; - } - - if ( isdefined( player ) && isdefined( player.team ) ) - { - for ( i = 0; isdefined( spawnpoints ) && i < spawnpoints.size; i++ ) - { - asm_cond( player.team == "allies" && isdefined( spawnpoints[i].script_int ) && spawnpoints[i].script_int == 1, loc_90B8 ); - arrayremovevalue( spawnpoints, spawnpoints[i] ); - i = 0; - asm_jump( loc_90FF ); - asm_cond( player.team != "allies" && isdefined( spawnpoints[i].script_int ) && spawnpoints[i].script_int == 2, loc_90FC ); - arrayremovevalue( spawnpoints, spawnpoints[i] ); - i = 0; - asm_jump( loc_90FF ); - } - } - - if ( !isdefined( self.playernum ) ) - { - if ( self.team == "allies" ) - { - self.playernum = get_game_var( "_team1_num" ); - set_game_var( "_team1_num", self.playernum + 1 ); - } - else - { - self.playernum = get_game_var( "_team2_num" ); - set_game_var( "_team2_num", self.playernum + 1 ); - } - } - - for ( j = 0; j < spawnpoints.size; j++ ) - { - if ( !isdefined( spawnpoints[j].en_num ) ) - { - for ( m = 0; m < spawnpoints.size; m++ ) - spawnpoints[m].en_num = m; - } - - if ( spawnpoints[j].en_num == self.playernum ) - return spawnpoints[j]; - } - - return spawnpoints[0]; -} - -delete_in_createfx() -{ - exterior_goals = getstructarray( "exterior_goal", "targetname" ); - - for ( i = 0; i < exterior_goals.size; i++ ) - { - if ( !isdefined( exterior_goals[i].target ) ) - continue; - - targets = getentarray( exterior_goals[i].target, "targetname" ); - - for ( j = 0; j < targets.size; j++ ) - targets[j] self_delete(); - } - - if ( isdefined( level.level_createfx_callback_thread ) ) - level thread [[ level.level_createfx_callback_thread ]](); -} - -add_bots() -{ - for ( host = gethostplayer(); !isdefined( host ); host = gethostplayer() ) - wait 0.05; - - wait 4.0; - zbot_spawn(); - setdvar( "bot_AllowMovement", "1" ); - setdvar( "bot_PressAttackBtn", "1" ); - setdvar( "bot_PressMeleeBtn", "1" ); - - while ( get_players().size < 2 ) - wait 0.05; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - players[i] freezecontrols( 0 ); -/# - println( " Unfreeze controls 6" ); -#/ - } - - level.numberbotsadded = 1; - flag_set( "start_zombie_round_logic" ); -} - -zbot_spawn() -{ - player = gethostplayer(); - spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); - spawnpoint = getfreespawnpoint( spawnpoints ); - bot = addtestclient(); - - if ( !isdefined( bot ) ) - { -/# - println( "Could not add test client" ); -#/ - return; - } - - bot.pers["isBot"] = 1; - bot.equipment_enabled = 0; - yaw = spawnpoint.angles[1]; - bot thread zbot_spawn_think( spawnpoint.origin, yaw ); - return bot; -} - -zbot_spawn_think( origin, yaw ) -{ - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self setorigin( origin ); - angles = ( 0, yaw, 0 ); - self setplayerangles( angles ); - } -} - -post_all_players_connected() -{ - level thread end_game(); - flag_wait( "start_zombie_round_logic" ); -/# - println( "sessions: mapname=", level.script, " gametype zom isserver 1 player_count=", get_players().size ); -#/ - level thread clear_mature_blood(); - level thread round_end_monitor(); - - if ( !level.zombie_anim_intro ) - { - if ( isdefined( level._round_start_func ) ) - level thread [[ level._round_start_func ]](); - } - - level thread players_playing(); - disablegrenadesuicide(); - level.startinvulnerabletime = getdvarint( _hash_4E44E32D ); - - if ( !isdefined( level.music_override ) ) - level.music_override = 0; -} - -init_custom_ai_type() -{ - if ( isdefined( level.custom_ai_type ) ) - { - for ( i = 0; i < level.custom_ai_type.size; i++ ) - [[ level.custom_ai_type[i] ]](); - } -} - -zombiemode_melee_miss() -{ - if ( isdefined( self.enemy.curr_pay_turret ) ) - self.enemy dodamage( getdvarint( "ai_meleeDamage" ), self.origin, self, self, "none", "melee" ); -} - -player_track_ammo_count() -{ - self notify( "stop_ammo_tracking" ); - self endon( "disconnect" ); - self endon( "stop_ammo_tracking" ); - ammolowcount = 0; - ammooutcount = 0; - - while ( true ) - { - wait 0.5; - weap = self getcurrentweapon(); - - if ( !isdefined( weap ) || weap == "none" || !can_track_ammo( weap ) ) - continue; - - if ( self getammocount( weap ) > 5 || self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - ammooutcount = 0; - ammolowcount = 0; - continue; - } - - if ( self getammocount( weap ) > 0 ) - { - if ( ammolowcount < 1 ) - { - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "ammo_low" ); - ammolowcount++; - } - } - else if ( ammooutcount < 1 ) - { - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "ammo_out" ); - ammooutcount++; - } - - wait 20; - } -} - -can_track_ammo( weap ) -{ - if ( !isdefined( weap ) ) - return false; - - switch ( weap ) - { - case "zombie_tazer_flourish": - case "zombie_sickle_flourish": - case "zombie_knuckle_crack": - case "zombie_fists_zm": - case "zombie_builder_zm": - case "zombie_bowie_flourish": - case "time_bomb_zm": - case "time_bomb_detonator_zm": - case "tazer_knuckles_zm": - case "tazer_knuckles_upgraded_zm": - case "slowgun_zm": - case "slowgun_upgraded_zm": - case "screecher_arms_zm": - case "riotshield_zm": - case "none": - case "no_hands_zm": - case "lower_equip_gasmask_zm": - case "humangun_zm": - case "humangun_upgraded_zm": - case "equip_gasmask_zm": - case "equip_dieseldrone_zm": - case "death_throe_zm": - case "chalk_draw_zm": - case "alcatraz_shield_zm": - return false; - default: - if ( is_zombie_perk_bottle( weap ) || is_placeable_mine( weap ) || is_equipment( weap ) || issubstr( weap, "knife_ballistic_" ) || getsubstr( weap, 0, 3 ) == "gl_" || weaponfuellife( weap ) > 0 || weap == level.revive_tool ) - return false; - } - - return true; -} - -spawn_vo() -{ - wait 1; - players = get_players(); - - if ( players.size > 1 ) - { - player = random( players ); - index = maps\mp\zombies\_zm_weapons::get_player_index( player ); - player thread spawn_vo_player( index, players.size ); - } -} - -spawn_vo_player( index, num ) -{ - sound = "plr_" + index + "_vox_" + num + "play"; - self playsoundwithnotify( sound, "sound_done" ); - - self waittill( "sound_done" ); -} - -precache_shaders() -{ - precacheshader( "hud_chalk_1" ); - precacheshader( "hud_chalk_2" ); - precacheshader( "hud_chalk_3" ); - precacheshader( "hud_chalk_4" ); - precacheshader( "hud_chalk_5" ); - precacheshader( "zom_icon_community_pot" ); - precacheshader( "zom_icon_community_pot_strip" ); - precacheshader( "zom_icon_player_life" ); - precacheshader( "waypoint_revive" ); -} - -precache_models() -{ - precachemodel( "p_zom_win_bars_01_vert04_bend_180" ); - precachemodel( "p_zom_win_bars_01_vert01_bend_180" ); - precachemodel( "p_zom_win_bars_01_vert04_bend" ); - precachemodel( "p_zom_win_bars_01_vert01_bend" ); - precachemodel( "p_zom_win_cell_bars_01_vert04_bent" ); - precachemodel( "p_zom_win_cell_bars_01_vert01_bent" ); - precachemodel( "tag_origin" ); - precachemodel( "zombie_z_money_icon" ); - - if ( isdefined( level.precachecustomcharacters ) ) - self [[ level.precachecustomcharacters ]](); -} - -init_shellshocks() -{ - level.player_killed_shellshock = "zombie_death"; - precacheshellshock( level.player_killed_shellshock ); - precacheshellshock( "pain" ); - precacheshellshock( "explosion" ); -} - -init_strings() -{ - precachestring( &"ZOMBIE_WEAPONCOSTAMMO" ); - precachestring( &"ZOMBIE_ROUND" ); - precachestring( &"SCRIPT_PLUS" ); - precachestring( &"ZOMBIE_GAME_OVER" ); - precachestring( &"ZOMBIE_SURVIVED_ROUND" ); - precachestring( &"ZOMBIE_SURVIVED_ROUNDS" ); - precachestring( &"ZOMBIE_SURVIVED_NOMANS" ); - precachestring( &"ZOMBIE_EXTRA_LIFE" ); - add_zombie_hint( "undefined", &"ZOMBIE_UNDEFINED" ); - add_zombie_hint( "default_treasure_chest", &"ZOMBIE_RANDOM_WEAPON_COST" ); - add_zombie_hint( "default_treasure_chest_950", &"ZOMBIE_RANDOM_WEAPON_950" ); - add_zombie_hint( "powerup_fire_sale_cost", &"ZOMBIE_FIRE_SALE_COST" ); - add_zombie_hint( "default_buy_barrier_piece_10", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_10" ); - add_zombie_hint( "default_buy_barrier_piece_20", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_20" ); - add_zombie_hint( "default_buy_barrier_piece_50", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_50" ); - add_zombie_hint( "default_buy_barrier_piece_100", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_100" ); - add_zombie_hint( "default_reward_barrier_piece", &"ZOMBIE_BUTTON_REWARD_BARRIER" ); - add_zombie_hint( "default_reward_barrier_piece_10", &"ZOMBIE_BUTTON_REWARD_BARRIER_10" ); - add_zombie_hint( "default_reward_barrier_piece_20", &"ZOMBIE_BUTTON_REWARD_BARRIER_20" ); - add_zombie_hint( "default_reward_barrier_piece_30", &"ZOMBIE_BUTTON_REWARD_BARRIER_30" ); - add_zombie_hint( "default_reward_barrier_piece_40", &"ZOMBIE_BUTTON_REWARD_BARRIER_40" ); - add_zombie_hint( "default_reward_barrier_piece_50", &"ZOMBIE_BUTTON_REWARD_BARRIER_50" ); - add_zombie_hint( "default_buy_debris", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_COST" ); - add_zombie_hint( "default_buy_debris_100", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_100" ); - add_zombie_hint( "default_buy_debris_200", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_200" ); - add_zombie_hint( "default_buy_debris_250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_250" ); - add_zombie_hint( "default_buy_debris_500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_500" ); - add_zombie_hint( "default_buy_debris_750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_750" ); - add_zombie_hint( "default_buy_debris_1000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1000" ); - add_zombie_hint( "default_buy_debris_1250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1250" ); - add_zombie_hint( "default_buy_debris_1500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1500" ); - add_zombie_hint( "default_buy_debris_1750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1750" ); - add_zombie_hint( "default_buy_debris_2000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_2000" ); - add_zombie_hint( "default_buy_debris_3000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_3000" ); - add_zombie_hint( "default_buy_door", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_COST" ); - add_zombie_hint( "default_buy_door_close", &"ZOMBIE_BUTTON_BUY_CLOSE_DOOR" ); - add_zombie_hint( "default_buy_door_100", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_100" ); - add_zombie_hint( "default_buy_door_200", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_200" ); - add_zombie_hint( "default_buy_door_250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_250" ); - add_zombie_hint( "default_buy_door_500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_500" ); - add_zombie_hint( "default_buy_door_750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_750" ); - add_zombie_hint( "default_buy_door_1000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1000" ); - add_zombie_hint( "default_buy_door_1250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1250" ); - add_zombie_hint( "default_buy_door_1500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1500" ); - add_zombie_hint( "default_buy_door_1750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1750" ); - add_zombie_hint( "default_buy_door_2000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_2000" ); - add_zombie_hint( "default_buy_door_2500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_2500" ); - add_zombie_hint( "default_buy_door_3000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_3000" ); - add_zombie_hint( "default_buy_door_4000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_4000" ); - add_zombie_hint( "default_buy_door_8000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_8000" ); - add_zombie_hint( "default_buy_door_16000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_16000" ); - add_zombie_hint( "default_buy_area", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_COST" ); - add_zombie_hint( "default_buy_area_100", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_100" ); - add_zombie_hint( "default_buy_area_200", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_200" ); - add_zombie_hint( "default_buy_area_250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_250" ); - add_zombie_hint( "default_buy_area_500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_500" ); - add_zombie_hint( "default_buy_area_750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_750" ); - add_zombie_hint( "default_buy_area_1000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1000" ); - add_zombie_hint( "default_buy_area_1250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1250" ); - add_zombie_hint( "default_buy_area_1500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1500" ); - add_zombie_hint( "default_buy_area_1750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1750" ); - add_zombie_hint( "default_buy_area_2000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_2000" ); -} - -init_sounds() -{ - add_sound( "end_of_round", "mus_zmb_round_over" ); - add_sound( "end_of_game", "mus_zmb_game_over" ); - add_sound( "chalk_one_up", "mus_zmb_chalk" ); - add_sound( "purchase", "zmb_cha_ching" ); - add_sound( "no_purchase", "zmb_no_cha_ching" ); - add_sound( "playerzombie_usebutton_sound", "zmb_zombie_vocals_attack" ); - add_sound( "playerzombie_attackbutton_sound", "zmb_zombie_vocals_attack" ); - add_sound( "playerzombie_adsbutton_sound", "zmb_zombie_vocals_attack" ); - add_sound( "zombie_head_gib", "zmb_zombie_head_gib" ); - add_sound( "rebuild_barrier_piece", "zmb_repair_boards" ); - add_sound( "rebuild_barrier_metal_piece", "zmb_metal_repair" ); - add_sound( "rebuild_barrier_hover", "zmb_boards_float" ); - add_sound( "debris_hover_loop", "zmb_couch_loop" ); - add_sound( "break_barrier_piece", "zmb_break_boards" ); - add_sound( "grab_metal_bar", "zmb_bar_pull" ); - add_sound( "break_metal_bar", "zmb_bar_break" ); - add_sound( "drop_metal_bar", "zmb_bar_drop" ); - add_sound( "blocker_end_move", "zmb_board_slam" ); - add_sound( "barrier_rebuild_slam", "zmb_board_slam" ); - add_sound( "bar_rebuild_slam", "zmb_bar_repair" ); - add_sound( "zmb_rock_fix", "zmb_break_rock_barrier_fix" ); - add_sound( "zmb_vent_fix", "evt_vent_slat_repair" ); - add_sound( "door_slide_open", "zmb_door_slide_open" ); - add_sound( "door_rotate_open", "zmb_door_slide_open" ); - add_sound( "debris_move", "zmb_weap_wall" ); - add_sound( "open_chest", "zmb_lid_open" ); - add_sound( "music_chest", "zmb_music_box" ); - add_sound( "close_chest", "zmb_lid_close" ); - add_sound( "weapon_show", "zmb_weap_wall" ); - add_sound( "break_stone", "break_stone" ); -} - -init_levelvars() -{ - level.is_zombie_level = 1; - level.laststandpistol = "m1911_zm"; - level.default_laststandpistol = "m1911_zm"; - level.default_solo_laststandpistol = "m1911_upgraded_zm"; - level.start_weapon = "m1911_zm"; - level.first_round = 1; - level.start_round = getgametypesetting( "startRound" ); - level.round_number = level.start_round; - level.enable_magic = getgametypesetting( "magic" ); - level.headshots_only = getgametypesetting( "headshotsonly" ); - level.player_starting_points = level.round_number * 500; - level.round_start_time = 0; - level.pro_tips_start_time = 0; - level.intermission = 0; - level.dog_intermission = 0; - level.zombie_total = 0; - level.total_zombies_killed = 0; - level.hudelem_count = 0; - level.zombie_spawn_locations = []; - level.zombie_rise_spawners = []; - level.current_zombie_array = []; - level.current_zombie_count = 0; - level.zombie_total_subtract = 0; - level.destructible_callbacks = []; - level.zombie_vars = []; - - foreach ( team in level.teams ) - level.zombie_vars[team] = []; - - difficulty = 1; - column = int( difficulty ) + 1; - set_zombie_var( "zombie_health_increase", 100, 0, column ); - set_zombie_var( "zombie_health_increase_multiplier", 0.1, 1, column ); - set_zombie_var( "zombie_health_start", 150, 0, column ); - set_zombie_var( "zombie_spawn_delay", 2.0, 1, column ); - set_zombie_var( "zombie_new_runner_interval", 10, 0, column ); - set_zombie_var( "zombie_move_speed_multiplier", 8, 0, column ); - set_zombie_var( "zombie_move_speed_multiplier_easy", 2, 0, column ); - set_zombie_var( "zombie_max_ai", 24, 0, column ); - set_zombie_var( "zombie_ai_per_player", 6, 0, column ); - set_zombie_var( "below_world_check", -1000 ); - set_zombie_var( "spectators_respawn", 1 ); - set_zombie_var( "zombie_use_failsafe", 1 ); - set_zombie_var( "zombie_between_round_time", 10 ); - set_zombie_var( "zombie_intermission_time", 15 ); - set_zombie_var( "game_start_delay", 0, 0, column ); - set_zombie_var( "penalty_no_revive", 0.1, 1, column ); - set_zombie_var( "penalty_died", 0.0, 1, column ); - set_zombie_var( "penalty_downed", 0.05, 1, column ); - set_zombie_var( "starting_lives", 1, 0, column ); - set_zombie_var( "zombie_score_kill_4player", 50 ); - set_zombie_var( "zombie_score_kill_3player", 50 ); - set_zombie_var( "zombie_score_kill_2player", 50 ); - set_zombie_var( "zombie_score_kill_1player", 50 ); - set_zombie_var( "zombie_score_kill_4p_team", 30 ); - set_zombie_var( "zombie_score_kill_3p_team", 35 ); - set_zombie_var( "zombie_score_kill_2p_team", 45 ); - set_zombie_var( "zombie_score_kill_1p_team", 0 ); - set_zombie_var( "zombie_score_damage_normal", 10 ); - set_zombie_var( "zombie_score_damage_light", 10 ); - set_zombie_var( "zombie_score_bonus_melee", 80 ); - set_zombie_var( "zombie_score_bonus_head", 50 ); - set_zombie_var( "zombie_score_bonus_neck", 20 ); - set_zombie_var( "zombie_score_bonus_torso", 10 ); - set_zombie_var( "zombie_score_bonus_burn", 10 ); - set_zombie_var( "zombie_flame_dmg_point_delay", 500 ); - set_zombie_var( "zombify_player", 0 ); - - if ( issplitscreen() ) - set_zombie_var( "zombie_timer_offset", 280 ); - - level thread init_player_levelvars(); - level.gamedifficulty = getgametypesetting( "zmDifficulty" ); - - if ( level.gamedifficulty == 0 ) - level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier_easy"]; - else - level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier"]; - - if ( level.round_number == 1 ) - level.zombie_move_speed = 1; - else - { - for ( i = 1; i <= level.round_number; i++ ) - { - timer = level.zombie_vars["zombie_spawn_delay"]; - - if ( timer > 0.08 ) - { - level.zombie_vars["zombie_spawn_delay"] = timer * 0.95; - continue; - } - - if ( timer < 0.08 ) - level.zombie_vars["zombie_spawn_delay"] = 0.08; - } - } - - level.speed_change_max = 0; - level.speed_change_num = 0; -} - -init_player_levelvars() -{ - flag_wait( "start_zombie_round_logic" ); - difficulty = 1; - column = int( difficulty ) + 1; - - for ( i = 0; i < 8; i++ ) - { - points = 500; - - if ( i > 3 ) - points = 3000; - - points = set_zombie_var( "zombie_score_start_" + ( i + 1 ) + "p", points, 0, column ); - } -} - -init_dvars() -{ - if ( getdvar( _hash_FA91EA91 ) == "" ) - setdvar( "zombie_debug", "0" ); - - if ( getdvar( _hash_B0FB65D0 ) == "" ) - setdvar( "scr_zm_enable_bots", "0" ); - - if ( getdvar( _hash_FA81816F ) == "" ) - setdvar( "zombie_cheat", "0" ); - - if ( level.script != "zombie_cod5_prototype" ) - setdvar( "magic_chest_movable", "1" ); - - setdvar( "revive_trigger_radius", "75" ); - setdvar( "player_lastStandBleedoutTime", "45" ); - setdvar( "scr_deleteexplosivesonspawn", "0" ); -} - -init_function_overrides() -{ - level.callbackplayerdamage = ::callback_playerdamage; - level.overrideplayerdamage = ::player_damage_override; - level.callbackplayerkilled = ::player_killed_override; - level.playerlaststand_func = ::player_laststand; - level.callbackplayerlaststand = ::callback_playerlaststand; - level.prevent_player_damage = ::player_prevent_damage; - level.callbackactorkilled = ::actor_killed_override; - level.callbackactordamage = ::actor_damage_override_wrapper; - level.custom_introscreen = ::zombie_intro_screen; - level.custom_intermission = ::player_intermission; - level.global_damage_func = maps\mp\zombies\_zm_spawner::zombie_damage; - level.global_damage_func_ads = maps\mp\zombies\_zm_spawner::zombie_damage_ads; - level.reset_clientdvars = ::onplayerconnect_clientdvars; - level.zombie_last_stand = ::last_stand_pistol_swap; - level.zombie_last_stand_pistol_memory = ::last_stand_save_pistol_ammo; - level.zombie_last_stand_ammo_return = ::last_stand_restore_pistol_ammo; - level.player_becomes_zombie = ::zombify_player; - level.validate_enemy_path_length = ::default_validate_enemy_path_length; -} - -callback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) -{ - self endon( "disconnect" ); - [[ maps\mp\zombies\_zm_laststand::playerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); -} - -codecallback_destructibleevent( event, param1, param2, param3 ) -{ - if ( event == "broken" ) - { - notify_type = param1; - attacker = param2; - weapon = param3; - - if ( isdefined( level.destructible_callbacks[notify_type] ) ) - self thread [[ level.destructible_callbacks[notify_type] ]]( notify_type, attacker ); - - self notify( event, notify_type, attacker ); - } - else if ( event == "breakafter" ) - { - piece = param1; - time = param2; - damage = param3; - self thread breakafter( time, damage, piece ); - } -} - -breakafter( time, damage, piece ) -{ - self notify( "breakafter" ); - self endon( "breakafter" ); - wait( time ); - self dodamage( damage, self.origin, undefined, undefined ); -} - -callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) -{ -/# - println( "ZM Callback_PlayerDamage" + idamage + "\n" ); -#/ - if ( isdefined( eattacker ) && isplayer( eattacker ) && eattacker.sessionteam == self.sessionteam && !eattacker hasperk( "specialty_noname" ) && !( isdefined( self.is_zombie ) && self.is_zombie ) ) - { - self process_friendly_fire_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - - if ( self != eattacker ) - { -/# - println( "Exiting - players can't hurt each other." ); -#/ - return; - } - else if ( smeansofdeath != "MOD_GRENADE_SPLASH" && smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_EXPLOSIVE" && smeansofdeath != "MOD_PROJECTILE" && smeansofdeath != "MOD_PROJECTILE_SPLASH" && smeansofdeath != "MOD_BURNED" && smeansofdeath != "MOD_SUICIDE" ) - { -/# - println( "Exiting - damage type verbotten." ); -#/ - return; - } - } - - if ( isdefined( level.pers_upgrade_insta_kill ) && level.pers_upgrade_insta_kill ) - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_insta_kill_melee_swipe( smeansofdeath, eattacker ); - - if ( isdefined( self.overrideplayerdamage ) ) - idamage = self [[ self.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - else if ( isdefined( level.overrideplayerdamage ) ) - idamage = self [[ level.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); -/# - assert( isdefined( idamage ), "You must return a value from a damage override function." ); -#/ - if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) - { - maxhealth = self.maxhealth; - self.health += idamage; - self.maxhealth = maxhealth; - } - - if ( isdefined( self.divetoprone ) && self.divetoprone == 1 ) - { - if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) - { - dist = distance2d( vpoint, self.origin ); - - if ( dist > 32 ) - { - dot_product = vectordot( anglestoforward( self.angles ), vdir ); - - if ( dot_product > 0 ) - idamage = int( idamage * 0.5 ); - } - } - } -/# - println( "CB PD" ); -#/ - if ( isdefined( level.prevent_player_damage ) ) - { - if ( self [[ level.prevent_player_damage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) ) - return; - } - - idflags |= level.idflags_no_knockback; - - if ( idamage > 0 && shitloc == "riotshield" ) - shitloc = "torso_upper"; -/# - println( "Finishplayerdamage wrapper." ); -#/ - self finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); -} - -finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) -{ - self finishplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); -} - -register_player_friendly_fire_callback( callback ) -{ - if ( !isdefined( level.player_friendly_fire_callbacks ) ) - level.player_friendly_fire_callbacks = []; - - level.player_friendly_fire_callbacks[level.player_friendly_fire_callbacks.size] = callback; -} - -process_friendly_fire_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) -{ - if ( isdefined( level.player_friendly_fire_callbacks ) ) - { - foreach ( callback in level.player_friendly_fire_callbacks ) - self [[ callback ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - } -} - -init_flags() -{ - flag_init( "solo_game" ); - flag_init( "start_zombie_round_logic" ); - flag_init( "start_encounters_match_logic" ); - flag_init( "spawn_point_override" ); - flag_init( "power_on" ); - flag_init( "crawler_round" ); - flag_init( "spawn_zombies", 1 ); - flag_init( "dog_round" ); - flag_init( "begin_spawning" ); - flag_init( "end_round_wait" ); - flag_init( "wait_and_revive" ); - flag_init( "instant_revive" ); - flag_init( "initial_blackscreen_passed" ); - flag_init( "initial_players_connected" ); -} - -init_client_flags() -{ - if ( isdefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) - { - level._zombie_scriptmover_flag_board_horizontal_fx = 14; - level._zombie_scriptmover_flag_board_vertical_fx = 13; - } - - if ( isdefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) - level._zombie_scriptmover_flag_rock_fx = 12; - - level._zombie_player_flag_cloak_weapon = 14; - - if ( !( isdefined( level.disable_deadshot_clientfield ) && level.disable_deadshot_clientfield ) ) - registerclientfield( "toplayer", "deadshot_perk", 1, 1, "int" ); - - registerclientfield( "actor", "zombie_riser_fx", 1, 1, "int" ); - - if ( !( isdefined( level._no_water_risers ) && level._no_water_risers ) ) - registerclientfield( "actor", "zombie_riser_fx_water", 1, 1, "int" ); - - if ( isdefined( level._foliage_risers ) && level._foliage_risers ) - registerclientfield( "actor", "zombie_riser_fx_foliage", 12000, 1, "int" ); - - if ( isdefined( level.risers_use_low_gravity_fx ) && level.risers_use_low_gravity_fx ) - registerclientfield( "actor", "zombie_riser_fx_lowg", 1, 1, "int" ); -} - -init_fx() -{ - level.createfx_callback_thread = ::delete_in_createfx; - level._effect["wood_chunk_destory"] = loadfx( "impacts/fx_large_woodhit" ); - level._effect["fx_zombie_bar_break"] = loadfx( "maps/zombie/fx_zombie_bar_break" ); - level._effect["fx_zombie_bar_break_lite"] = loadfx( "maps/zombie/fx_zombie_bar_break_lite" ); - - if ( !( isdefined( level.fx_exclude_edge_fog ) && level.fx_exclude_edge_fog ) ) - level._effect["edge_fog"] = loadfx( "maps/zombie/fx_fog_zombie_amb" ); - - level._effect["chest_light"] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_glow" ); - - if ( !( isdefined( level.fx_exclude_default_eye_glow ) && level.fx_exclude_default_eye_glow ) ) - level._effect["eye_glow"] = loadfx( "misc/fx_zombie_eye_single" ); - - level._effect["headshot"] = loadfx( "impacts/fx_flesh_hit" ); - level._effect["headshot_nochunks"] = loadfx( "misc/fx_zombie_bloodsplat" ); - level._effect["bloodspurt"] = loadfx( "misc/fx_zombie_bloodspurt" ); - - if ( !( isdefined( level.fx_exclude_tesla_head_light ) && level.fx_exclude_tesla_head_light ) ) - level._effect["tesla_head_light"] = loadfx( "maps/zombie/fx_zombie_tesla_neck_spurt" ); - - level._effect["zombie_guts_explosion"] = loadfx( "maps/zombie/fx_zmb_tranzit_torso_explo" ); - level._effect["rise_burst_water"] = loadfx( "maps/zombie/fx_mp_zombie_hand_dirt_burst" ); - level._effect["rise_billow_water"] = loadfx( "maps/zombie/fx_mp_zombie_body_dirt_billowing" ); - level._effect["rise_dust_water"] = loadfx( "maps/zombie/fx_mp_zombie_body_dust_falling" ); - level._effect["rise_burst"] = loadfx( "maps/zombie/fx_mp_zombie_hand_dirt_burst" ); - level._effect["rise_billow"] = loadfx( "maps/zombie/fx_mp_zombie_body_dirt_billowing" ); - level._effect["rise_dust"] = loadfx( "maps/zombie/fx_mp_zombie_body_dust_falling" ); - level._effect["fall_burst"] = loadfx( "maps/zombie/fx_mp_zombie_hand_dirt_burst" ); - level._effect["fall_billow"] = loadfx( "maps/zombie/fx_mp_zombie_body_dirt_billowing" ); - level._effect["fall_dust"] = loadfx( "maps/zombie/fx_mp_zombie_body_dust_falling" ); - level._effect["character_fire_death_sm"] = loadfx( "env/fire/fx_fire_zombie_md" ); - level._effect["character_fire_death_torso"] = loadfx( "env/fire/fx_fire_zombie_torso" ); - - if ( !( isdefined( level.fx_exclude_default_explosion ) && level.fx_exclude_default_explosion ) ) - level._effect["def_explosion"] = loadfx( "explosions/fx_default_explosion" ); - - if ( !( isdefined( level._uses_default_wallbuy_fx ) && !level._uses_default_wallbuy_fx ) ) - { - level._effect["870mcs_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_870mcs" ); - level._effect["ak74u_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_ak74u" ); - level._effect["beretta93r_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_berreta93r" ); - level._effect["bowie_knife_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_bowie" ); - level._effect["claymore_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_claymore" ); - level._effect["m14_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_m14" ); - level._effect["m16_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_m16" ); - level._effect["mp5k_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_mp5k" ); - level._effect["rottweil72_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_olympia" ); - } - - if ( !( isdefined( level._uses_sticky_grenades ) && !level._uses_sticky_grenades ) ) - { - if ( !( isdefined( level.disable_fx_zmb_wall_buy_semtex ) && level.disable_fx_zmb_wall_buy_semtex ) ) - level._effect["sticky_grenade_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_semtex" ); - } - - if ( !( isdefined( level._uses_taser_knuckles ) && !level._uses_taser_knuckles ) ) - level._effect["tazer_knuckles_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_taseknuck" ); - - if ( isdefined( level.buildable_wallbuy_weapons ) ) - level._effect["dynamic_wallbuy_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_question" ); - - if ( !( isdefined( level.disable_fx_upgrade_aquired ) && level.disable_fx_upgrade_aquired ) ) - level._effect["upgrade_aquired"] = loadfx( "maps/zombie/fx_zmb_tanzit_upgrade" ); -} - -zombie_intro_screen( string1, string2, string3, string4, string5 ) -{ - flag_wait( "start_zombie_round_logic" ); -} - -players_playing() -{ - players = get_players(); - level.players_playing = players.size; - wait 20; - players = get_players(); - level.players_playing = players.size; -} - -onplayerconnect_clientdvars() -{ - self setclientcompass( 0 ); - self setclientthirdperson( 0 ); - self resetfov(); - self setclientthirdpersonangle( 0 ); - self setclientammocounterhide( 1 ); - self setclientminiscoreboardhide( 1 ); - self setclienthudhardcore( 0 ); - self setclientplayerpushamount( 1 ); - self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); - self setclientaimlockonpitchstrength( 0.0 ); - self maps\mp\zombies\_zm_laststand::player_getup_setup(); -} - -checkforalldead( excluded_player ) -{ - players = get_players(); - count = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( excluded_player ) && excluded_player == players[i] ) - continue; - - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( players[i].sessionstate == "spectator" ) ) - count++; - } - - if ( count == 0 && !( isdefined( level.no_end_game_check ) && level.no_end_game_check ) ) - level notify( "end_game" ); -} - -onplayerspawned() -{ - self endon( "disconnect" ); - self notify( "stop_onPlayerSpawned" ); - self endon( "stop_onPlayerSpawned" ); - - for (;;) - { - self waittill( "spawned_player" ); - - if ( !( isdefined( level.host_ended_game ) && level.host_ended_game ) ) - { - self freezecontrols( 0 ); -/# - println( " Unfreeze controls 7" ); -#/ - } - - self.hits = 0; - self init_player_offhand_weapons(); - lethal_grenade = self get_player_lethal_grenade(); - - if ( !self hasweapon( lethal_grenade ) ) - { - self giveweapon( lethal_grenade ); - self setweaponammoclip( lethal_grenade, 0 ); - } - - self recordplayerrevivezombies( self ); -/# - if ( getdvarint( _hash_FA81816F ) >= 1 && getdvarint( _hash_FA81816F ) <= 3 ) - self enableinvulnerability(); -#/ - self setactionslot( 3, "altMode" ); - self playerknockback( 0 ); - self setclientthirdperson( 0 ); - self resetfov(); - self setclientthirdpersonangle( 0 ); - self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); - self cameraactivate( 0 ); - self.num_perks = 0; - self.on_lander_last_stand = undefined; - self setblur( 0, 0.1 ); - self.zmbdialogqueue = []; - self.zmbdialogactive = 0; - self.zmbdialoggroups = []; - self.zmbdialoggroup = ""; - - if ( isdefined( level.player_out_of_playable_area_monitor ) && level.player_out_of_playable_area_monitor ) - self thread player_out_of_playable_area_monitor(); - - if ( isdefined( level.player_too_many_weapons_monitor ) && level.player_too_many_weapons_monitor ) - self thread [[ level.player_too_many_weapons_monitor_func ]](); - - if ( isdefined( level.player_too_many_players_check ) && level.player_too_many_players_check ) - level thread [[ level.player_too_many_players_check_func ]](); - - self.disabled_perks = []; - - if ( isdefined( self.player_initialized ) ) - { - if ( self.player_initialized == 0 ) - { - self.player_initialized = 1; - self giveweapon( self get_player_lethal_grenade() ); - self setweaponammoclip( self get_player_lethal_grenade(), 0 ); - self setclientammocounterhide( 0 ); - self setclientminiscoreboardhide( 0 ); - self.is_drinking = 0; - self thread player_zombie_breadcrumb(); - self thread player_monitor_travel_dist(); - self thread player_monitor_time_played(); - - if ( isdefined( level.custom_player_track_ammo_count ) ) - self thread [[ level.custom_player_track_ammo_count ]](); - else - self thread player_track_ammo_count(); - - self thread shock_onpain(); - self thread player_grenade_watcher(); - self maps\mp\zombies\_zm_laststand::revive_hud_create(); - - if ( isdefined( level.zm_gamemodule_spawn_func ) ) - self thread [[ level.zm_gamemodule_spawn_func ]](); - - self thread player_spawn_protection(); - - if ( !isdefined( self.lives ) ) - self.lives = 0; - } - } - } -} - -player_spawn_protection() -{ - self endon( "disconnect" ); - x = 0; - - while ( x < 60 ) - { - self.ignoreme = 1; - x++; - wait 0.05; - } - - self.ignoreme = 0; -} - -spawn_life_brush( origin, radius, height ) -{ - life_brush = spawn( "trigger_radius", origin, 0, radius, height ); - life_brush.script_noteworthy = "life_brush"; - return life_brush; -} - -in_life_brush() -{ - life_brushes = getentarray( "life_brush", "script_noteworthy" ); - - if ( !isdefined( life_brushes ) ) - return false; - - for ( i = 0; i < life_brushes.size; i++ ) - { - if ( self istouching( life_brushes[i] ) ) - return true; - } - - return false; -} - -spawn_kill_brush( origin, radius, height ) -{ - kill_brush = spawn( "trigger_radius", origin, 0, radius, height ); - kill_brush.script_noteworthy = "kill_brush"; - return kill_brush; -} - -in_kill_brush() -{ - kill_brushes = getentarray( "kill_brush", "script_noteworthy" ); - - if ( !isdefined( kill_brushes ) ) - return false; - - for ( i = 0; i < kill_brushes.size; i++ ) - { - if ( self istouching( kill_brushes[i] ) ) - return true; - } - - return false; -} - -in_enabled_playable_area() -{ - playable_area = getentarray( "player_volume", "script_noteworthy" ); - - if ( !isdefined( playable_area ) ) - return false; - - for ( i = 0; i < playable_area.size; i++ ) - { - if ( maps\mp\zombies\_zm_zonemgr::zone_is_enabled( playable_area[i].targetname ) && self istouching( playable_area[i] ) ) - return true; - } - - return false; -} - -get_player_out_of_playable_area_monitor_wait_time() -{ -/# - if ( isdefined( level.check_kill_thread_every_frame ) && level.check_kill_thread_every_frame ) - return 0.05; -#/ - return 3; -} - -player_out_of_playable_area_monitor() -{ - self notify( "stop_player_out_of_playable_area_monitor" ); - self endon( "stop_player_out_of_playable_area_monitor" ); - self endon( "disconnect" ); - level endon( "end_game" ); - - while ( !isdefined( self.characterindex ) ) - wait 0.05; - - wait( 0.15 * self.characterindex ); - - while ( true ) - { - if ( self.sessionstate == "spectator" ) - { - wait( get_player_out_of_playable_area_monitor_wait_time() ); - continue; - } - - if ( is_true( level.hostmigration_occured ) ) - { - wait( get_player_out_of_playable_area_monitor_wait_time() ); - continue; - } - - if ( !self in_life_brush() && ( self in_kill_brush() || !self in_enabled_playable_area() ) ) - { - if ( !isdefined( level.player_out_of_playable_area_monitor_callback ) || self [[ level.player_out_of_playable_area_monitor_callback ]]() ) - { -/# - if ( isdefined( level.kill_thread_test_mode ) && level.kill_thread_test_mode ) - { - iprintlnbold( "out of playable" ); - wait( get_player_out_of_playable_area_monitor_wait_time() ); - continue; - } - - if ( self isinmovemode( "ufo", "noclip" ) || isdefined( level.disable_kill_thread ) && level.disable_kill_thread || getdvarint( _hash_FA81816F ) > 0 ) - { - wait( get_player_out_of_playable_area_monitor_wait_time() ); - continue; - } -#/ - self maps\mp\zombies\_zm_stats::increment_map_cheat_stat( "cheat_out_of_playable" ); - self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_out_of_playable", 0 ); - self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 ); - self playlocalsound( level.zmb_laugh_alias ); - wait 0.5; - - if ( get_players().size == 1 && flag( "solo_game" ) && ( isdefined( self.waiting_to_revive ) && self.waiting_to_revive ) ) - level notify( "end_game" ); - else - { - self disableinvulnerability(); - self.lives = 0; - self dodamage( self.health + 1000, self.origin ); - self.bleedout_time = 0; - } - } - } - - wait( get_player_out_of_playable_area_monitor_wait_time() ); - } -} - -get_player_too_many_weapons_monitor_wait_time() -{ - return 3; -} - -player_too_many_weapons_monitor_takeaway_simultaneous( primary_weapons_to_take ) -{ - self endon( "player_too_many_weapons_monitor_takeaway_sequence_done" ); - self waittill_any( "player_downed", "replace_weapon_powerup" ); - - for ( i = 0; i < primary_weapons_to_take.size; i++ ) - self takeweapon( primary_weapons_to_take[i] ); - - self maps\mp\zombies\_zm_score::minus_to_player_score( self.score ); - self give_start_weapon( 0 ); - - if ( !self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - self decrement_is_drinking(); - else if ( flag( "solo_game" ) ) - self.score_lost_when_downed = 0; - - self notify( "player_too_many_weapons_monitor_takeaway_sequence_done" ); -} - -player_too_many_weapons_monitor_takeaway_sequence( primary_weapons_to_take ) -{ - self thread player_too_many_weapons_monitor_takeaway_simultaneous( primary_weapons_to_take ); - self endon( "player_downed" ); - self endon( "replace_weapon_powerup" ); - self increment_is_drinking(); - score_decrement = round_up_to_ten( int( self.score / ( primary_weapons_to_take.size + 1 ) ) ); - - for ( i = 0; i < primary_weapons_to_take.size; i++ ) - { - self playlocalsound( level.zmb_laugh_alias ); - self switchtoweapon( primary_weapons_to_take[i] ); - self maps\mp\zombies\_zm_score::minus_to_player_score( score_decrement ); - wait 3; - self takeweapon( primary_weapons_to_take[i] ); - } - - self playlocalsound( level.zmb_laugh_alias ); - self maps\mp\zombies\_zm_score::minus_to_player_score( self.score ); - wait 1; - self give_start_weapon( 1 ); - self decrement_is_drinking(); - self notify( "player_too_many_weapons_monitor_takeaway_sequence_done" ); -} - -player_too_many_weapons_monitor() -{ - self notify( "stop_player_too_many_weapons_monitor" ); - self endon( "stop_player_too_many_weapons_monitor" ); - self endon( "disconnect" ); - level endon( "end_game" ); - scalar = self.characterindex; - - if ( !isdefined( scalar ) ) - scalar = self getentitynumber(); - - wait( 0.15 * scalar ); - - while ( true ) - { - if ( self has_powerup_weapon() || self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || self.sessionstate == "spectator" ) - { - wait( get_player_too_many_weapons_monitor_wait_time() ); - continue; - } -/# - if ( getdvarint( _hash_FA81816F ) > 0 ) - { - wait( get_player_too_many_weapons_monitor_wait_time() ); - continue; - } -#/ - weapon_limit = get_player_weapon_limit( self ); - primaryweapons = self getweaponslistprimaries(); - - if ( primaryweapons.size > weapon_limit ) - { - self maps\mp\zombies\_zm_weapons::take_fallback_weapon(); - primaryweapons = self getweaponslistprimaries(); - } - - primary_weapons_to_take = []; - - for ( i = 0; i < primaryweapons.size; i++ ) - { - if ( maps\mp\zombies\_zm_weapons::is_weapon_included( primaryweapons[i] ) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded( primaryweapons[i] ) ) - primary_weapons_to_take[primary_weapons_to_take.size] = primaryweapons[i]; - } - - if ( primary_weapons_to_take.size > weapon_limit ) - { - if ( !isdefined( level.player_too_many_weapons_monitor_callback ) || self [[ level.player_too_many_weapons_monitor_callback ]]( primary_weapons_to_take ) ) - { - self maps\mp\zombies\_zm_stats::increment_map_cheat_stat( "cheat_too_many_weapons" ); - self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_too_many_weapons", 0 ); - self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 ); - self thread player_too_many_weapons_monitor_takeaway_sequence( primary_weapons_to_take ); - - self waittill( "player_too_many_weapons_monitor_takeaway_sequence_done" ); - } - } - - wait( get_player_too_many_weapons_monitor_wait_time() ); - } -} - -player_monitor_travel_dist() -{ - self endon( "disconnect" ); - self notify( "stop_player_monitor_travel_dist" ); - self endon( "stop_player_monitor_travel_dist" ); - - for ( prevpos = self.origin; 1; prevpos = self.origin ) - { - wait 0.1; - self.pers["distance_traveled"] += distance( self.origin, prevpos ); - } -} - -player_monitor_time_played() -{ - self endon( "disconnect" ); - self notify( "stop_player_monitor_time_played" ); - self endon( "stop_player_monitor_time_played" ); - flag_wait( "start_zombie_round_logic" ); - - for (;;) - { - wait 1.0; - maps\mp\zombies\_zm_stats::increment_client_stat( "time_played_total" ); - } -} - -reset_rampage_bookmark_kill_times() -{ - if ( !isdefined( self.rampage_bookmark_kill_times ) ) - { - self.rampage_bookmark_kill_times = []; - self.ignore_rampage_kill_times = 0; - } - - for ( i = 0; i < level.rampage_bookmark_kill_times_count; i++ ) - self.rampage_bookmark_kill_times[i] = 0; -} - -add_rampage_bookmark_kill_time() -{ - now = gettime(); - - if ( now <= self.ignore_rampage_kill_times ) - return; - - oldest_index = 0; - oldest_time = now + 1; - - for ( i = 0; i < level.rampage_bookmark_kill_times_count; i++ ) - { - if ( !self.rampage_bookmark_kill_times[i] ) - { - oldest_index = i; - break; - continue; - } - - if ( oldest_time > self.rampage_bookmark_kill_times[i] ) - { - oldest_index = i; - oldest_time = self.rampage_bookmark_kill_times[i]; - } - } - - self.rampage_bookmark_kill_times[oldest_index] = now; -} - -watch_rampage_bookmark() -{ - while ( true ) - { - wait 0.05; - waittillframeend; - now = gettime(); - oldest_allowed = now - level.rampage_bookmark_kill_times_msec; - players = get_players(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - { - player = players[player_index]; -/# - if ( isdefined( player.pers["isBot"] ) && player.pers["isBot"] ) - continue; -#/ - for ( time_index = 0; time_index < level.rampage_bookmark_kill_times_count; time_index++ ) - { - if ( !player.rampage_bookmark_kill_times[time_index] ) - { - break; - continue; - } - - if ( oldest_allowed > player.rampage_bookmark_kill_times[time_index] ) - { - player.rampage_bookmark_kill_times[time_index] = 0; - break; - } - } - - if ( time_index >= level.rampage_bookmark_kill_times_count ) - { - maps\mp\_demo::bookmark( "zm_player_rampage", gettime(), player ); - player reset_rampage_bookmark_kill_times(); - player.ignore_rampage_kill_times = now + level.rampage_bookmark_kill_times_delay; - } - } - } -} - -player_grenade_multiattack_bookmark_watcher( grenade ) -{ - self endon( "disconnect" ); - waittillframeend; - - if ( !isdefined( grenade ) ) - return; - - inflictorentnum = grenade getentitynumber(); - inflictorenttype = grenade getentitytype(); - inflictorbirthtime = 0; - - if ( isdefined( grenade.birthtime ) ) - inflictorbirthtime = grenade.birthtime; - - ret_val = grenade waittill_any_timeout( 15, "explode" ); - - if ( !isdefined( self ) || isdefined( ret_val ) && "timeout" == ret_val ) - return; - - self.grenade_multiattack_count = 0; - self.grenade_multiattack_ent = undefined; - waittillframeend; - - if ( !isdefined( self ) ) - return; - - count = level.grenade_multiattack_bookmark_count; - - if ( isdefined( grenade.grenade_multiattack_bookmark_count ) && grenade.grenade_multiattack_bookmark_count ) - count = grenade.grenade_multiattack_bookmark_count; - - bookmark_string = "zm_player_grenade_multiattack"; - - if ( isdefined( grenade.use_grenade_special_long_bookmark ) && grenade.use_grenade_special_long_bookmark ) - bookmark_string = "zm_player_grenade_special_long"; - else if ( isdefined( grenade.use_grenade_special_bookmark ) && grenade.use_grenade_special_bookmark ) - bookmark_string = "zm_player_grenade_special"; - - if ( count <= self.grenade_multiattack_count && isdefined( self.grenade_multiattack_ent ) ) - adddemobookmark( level.bookmark[bookmark_string], gettime(), self getentitynumber(), 255, 0, inflictorentnum, inflictorenttype, inflictorbirthtime, 0, self.grenade_multiattack_ent getentitynumber() ); - - self.grenade_multiattack_count = 0; -} - -player_grenade_watcher() -{ - self endon( "disconnect" ); - self notify( "stop_player_grenade_watcher" ); - self endon( "stop_player_grenade_watcher" ); - self.grenade_multiattack_count = 0; - - while ( true ) - { - self waittill( "grenade_fire", grenade, weapname ); - - if ( isdefined( grenade ) && isalive( grenade ) ) - grenade.team = self.team; - - self thread player_grenade_multiattack_bookmark_watcher( grenade ); - - if ( isdefined( level.grenade_watcher ) ) - self [[ level.grenade_watcher ]]( grenade, weapname ); - } -} - -player_prevent_damage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) -{ - if ( !isdefined( einflictor ) || !isdefined( eattacker ) ) - return false; - - if ( einflictor == self || eattacker == self ) - return false; - - if ( isdefined( einflictor ) && isdefined( einflictor.team ) ) - { - if ( !( isdefined( einflictor.damage_own_team ) && einflictor.damage_own_team ) ) - { - if ( einflictor.team == self.team ) - return true; - } - } - - return false; -} - -player_revive_monitor() -{ - self endon( "disconnect" ); - self notify( "stop_player_revive_monitor" ); - self endon( "stop_player_revive_monitor" ); - - while ( true ) - { - self waittill( "player_revived", reviver ); - - self playsoundtoplayer( "zmb_character_revived", self ); - - if ( isdefined( level.isresetting_grief ) && level.isresetting_grief ) - continue; - - bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "revived", self.origin ); - - if ( isdefined( reviver ) ) - { - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "revive_up" ); - points = self.score_lost_when_downed; -/# - println( "ZM >> LAST STAND - points = " + points ); -#/ - reviver maps\mp\zombies\_zm_score::player_add_points( "reviver", points ); - self.score_lost_when_downed = 0; - } - } -} - -laststand_giveback_player_perks() -{ - if ( isdefined( self.laststand_perks ) ) - { - lost_perk_index = int( -1 ); - - if ( self.laststand_perks.size > 1 ) - lost_perk_index = randomint( self.laststand_perks.size - 1 ); - - for ( i = 0; i < self.laststand_perks.size; i++ ) - { - if ( self hasperk( self.laststand_perks[i] ) ) - continue; - - if ( i == lost_perk_index ) - continue; - - maps\mp\zombies\_zm_perks::give_perk( self.laststand_perks[i] ); - } - } -} - -remote_revive_watch() -{ - self endon( "death" ); - self endon( "player_revived" ); - - for ( keep_checking = 1; keep_checking; keep_checking = 0 ) - { - self waittill( "remote_revive", reviver ); - - asm_cond( reviver.team == self.team, loc_C024 ); - } - - self maps\mp\zombies\_zm_laststand::remote_revive( reviver ); -} - -remove_deadshot_bottle() -{ - wait 0.05; - - if ( isdefined( self.lastactiveweapon ) && self.lastactiveweapon == "zombie_perk_bottle_deadshot" ) - self.lastactiveweapon = "none"; -} - -take_additionalprimaryweapon() -{ - weapon_to_take = undefined; - - if ( isdefined( self._retain_perks ) && self._retain_perks || isdefined( self._retain_perks_array ) && ( isdefined( self._retain_perks_array["specialty_additionalprimaryweapon"] ) && self._retain_perks_array["specialty_additionalprimaryweapon"] ) ) - return weapon_to_take; - - primary_weapons_that_can_be_taken = []; - primaryweapons = self getweaponslistprimaries(); - - for ( i = 0; i < primaryweapons.size; i++ ) - { - if ( maps\mp\zombies\_zm_weapons::is_weapon_included( primaryweapons[i] ) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded( primaryweapons[i] ) ) - primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size] = primaryweapons[i]; - } - - pwtcbt = primary_weapons_that_can_be_taken.size; - - while ( pwtcbt >= 3 ) - { - weapon_to_take = primary_weapons_that_can_be_taken[pwtcbt - 1]; - pwtcbt--; - - if ( weapon_to_take == self getcurrentweapon() ) - self switchtoweapon( primary_weapons_that_can_be_taken[0] ); - - self takeweapon( weapon_to_take ); - } - - return weapon_to_take; -} - -player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) -{ -/# - println( "ZM >> LAST STAND - player_laststand called" ); -#/ - b_alt_visionset = 0; - self allowjump( 0 ); - currweapon = self getcurrentweapon(); - statweapon = currweapon; - - if ( is_alt_weapon( statweapon ) ) - statweapon = weaponaltweaponname( statweapon ); - - self addweaponstat( statweapon, "deathsDuringUse", 1 ); - - if ( isdefined( self.hasperkspecialtytombstone ) && self.hasperkspecialtytombstone ) - self.laststand_perks = maps\mp\zombies\_zm_tombstone::tombstone_save_perks( self ); - - if ( isdefined( self.pers_upgrades_awarded["perk_lose"] ) && self.pers_upgrades_awarded["perk_lose"] ) - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_save(); - - players = get_players(); - - if ( players.size == 1 && flag( "solo_game" ) ) - { - if ( self.lives > 0 && self hasperk( "specialty_quickrevive" ) ) - self thread wait_and_revive(); - } - - if ( self hasperk( "specialty_additionalprimaryweapon" ) ) - self.weapon_taken_by_losing_specialty_additionalprimaryweapon = take_additionalprimaryweapon(); - - if ( isdefined( self.hasperkspecialtytombstone ) && self.hasperkspecialtytombstone ) - { - self [[ level.tombstone_laststand_func ]](); - self thread [[ level.tombstone_spawn_func ]](); - self.hasperkspecialtytombstone = undefined; - self notify( "specialty_scavenger_stop" ); - } - - self clear_is_drinking(); - self thread remove_deadshot_bottle(); - self thread remote_revive_watch(); - self maps\mp\zombies\_zm_score::player_downed_penalty(); - self disableoffhandweapons(); - self thread last_stand_grenade_save_and_return(); - - if ( smeansofdeath != "MOD_SUICIDE" && smeansofdeath != "MOD_FALLING" ) - { - if ( !( isdefined( self.intermission ) && self.intermission ) ) - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "revive_down" ); - else if ( isdefined( level.custom_player_death_vo_func ) && !self [[ level.custom_player_death_vo_func ]]() ) - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "exert_death" ); - } - - bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "downed", self.origin ); - - if ( isdefined( level._zombie_minigun_powerup_last_stand_func ) ) - self thread [[ level._zombie_minigun_powerup_last_stand_func ]](); - - if ( isdefined( level._zombie_tesla_powerup_last_stand_func ) ) - self thread [[ level._zombie_tesla_powerup_last_stand_func ]](); - - if ( self hasperk( "specialty_grenadepulldeath" ) ) - { - b_alt_visionset = 1; - - if ( isdefined( level.custom_laststand_func ) ) - self thread [[ level.custom_laststand_func ]](); - } - - if ( isdefined( self.intermission ) && self.intermission ) - { - bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "died", self.origin ); - wait 0.5; - self stopsounds(); - - level waittill( "forever" ); - } - - if ( !b_alt_visionset ) - visionsetlaststand( "zombie_last_stand", 1 ); -} - -failsafe_revive_give_back_weapons( excluded_player ) -{ - for ( i = 0; i < 10; i++ ) - { - wait 0.05; - players = get_players(); - - foreach ( player in players ) - { - if ( player == excluded_player || !isdefined( player.reviveprogressbar ) || player maps\mp\zombies\_zm_laststand::is_reviving_any() ) - continue; -/# - iprintlnbold( "FAILSAFE CLEANING UP REVIVE HUD AND GUN" ); -#/ - player maps\mp\zombies\_zm_laststand::revive_give_back_weapons( "none" ); - - if ( isdefined( player.reviveprogressbar ) ) - player.reviveprogressbar maps\mp\gametypes_zm\_hud_util::destroyelem(); - - if ( isdefined( player.revivetexthud ) ) - player.revivetexthud destroy(); - } - } -} - -spawnspectator() -{ - self endon( "disconnect" ); - self endon( "spawned_spectator" ); - self notify( "spawned" ); - self notify( "end_respawn" ); - - if ( level.intermission ) - return; - - if ( isdefined( level.no_spectator ) && level.no_spectator ) - { - wait 3; - exitlevel(); - } - - self.is_zombie = 1; - level thread failsafe_revive_give_back_weapons( self ); - self notify( "zombified" ); - - if ( isdefined( self.revivetrigger ) ) - { - self.revivetrigger delete(); - self.revivetrigger = undefined; - } - - self.zombification_time = gettime(); - resettimeout(); - self stopshellshock(); - self stoprumble( "damage_heavy" ); - self.sessionstate = "spectator"; - self.spectatorclient = -1; - self.maxhealth = self.health; - self.shellshocked = 0; - self.inwater = 0; - self.friendlydamage = undefined; - self.hasspawned = 1; - self.spawntime = gettime(); - self.afk = 0; -/# - println( "*************************Zombie Spectator***" ); -#/ - self detachall(); - - if ( isdefined( level.custom_spectate_permissions ) ) - self [[ level.custom_spectate_permissions ]](); - else - self setspectatepermissions( 1 ); - - self thread spectator_thread(); - self spawn( self.origin, self.angles ); - self notify( "spawned_spectator" ); -} - -setspectatepermissions( ison ) -{ - self allowspectateteam( "allies", ison && self.team == "allies" ); - self allowspectateteam( "axis", ison && self.team == "axis" ); - self allowspectateteam( "freelook", 0 ); - self allowspectateteam( "none", 0 ); -} - -spectator_thread() -{ - self endon( "disconnect" ); - self endon( "spawned_player" ); -} - -spectator_toggle_3rd_person() -{ - self endon( "disconnect" ); - self endon( "spawned_player" ); - third_person = 1; - self set_third_person( 1 ); -} - -set_third_person( value ) -{ - if ( value ) - { - self setclientthirdperson( 1 ); - self setclientthirdpersonangle( 354 ); - self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); - } - else - { - self setclientthirdperson( 0 ); - self setclientthirdpersonangle( 0 ); - self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); - } - - self resetfov(); -} - -last_stand_revive() -{ - level endon( "between_round_over" ); - players = get_players(); - laststand_count = 0; - - foreach ( player in players ) - { - if ( !is_player_valid( player ) ) - laststand_count++; - } - - if ( laststand_count == players.size ) - { - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() && players[i].revivetrigger.beingrevived == 0 ) - players[i] maps\mp\zombies\_zm_laststand::auto_revive( players[i] ); - } - } -} - -last_stand_pistol_rank_init() -{ - level.pistol_values = []; - level.pistol_values[level.pistol_values.size] = "m1911_zm"; - level.pistol_values[level.pistol_values.size] = "c96_zm"; - level.pistol_values[level.pistol_values.size] = "cz75_zm"; - level.pistol_values[level.pistol_values.size] = "cz75dw_zm"; - level.pistol_values[level.pistol_values.size] = "kard_zm"; - level.pistol_values[level.pistol_values.size] = "fiveseven_zm"; - level.pistol_values[level.pistol_values.size] = "beretta93r_zm"; - level.pistol_values[level.pistol_values.size] = "beretta93r_extclip_zm"; - level.pistol_values[level.pistol_values.size] = "fivesevendw_zm"; - level.pistol_values[level.pistol_values.size] = "rnma_zm"; - level.pistol_values[level.pistol_values.size] = "python_zm"; - level.pistol_values[level.pistol_values.size] = "judge_zm"; - level.pistol_values[level.pistol_values.size] = "cz75_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "cz75dw_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "kard_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "fiveseven_upgraded_zm"; - level.pistol_value_solo_replace_below = level.pistol_values.size - 1; - level.pistol_values[level.pistol_values.size] = "m1911_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "c96_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "beretta93r_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "beretta93r_extclip_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "fivesevendw_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "rnma_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "python_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "judge_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "ray_gun_zm"; - level.pistol_values[level.pistol_values.size] = "raygun_mark2_zm"; - level.pistol_values[level.pistol_values.size] = "freezegun_zm"; - level.pistol_values[level.pistol_values.size] = "ray_gun_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "raygun_mark2_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "freezegun_upgraded_zm"; - level.pistol_values[level.pistol_values.size] = "microwavegundw_zm"; - level.pistol_values[level.pistol_values.size] = "microwavegundw_upgraded_zm"; -} - -last_stand_pistol_swap() -{ - if ( self has_powerup_weapon() ) - self.lastactiveweapon = "none"; - - if ( !self hasweapon( self.laststandpistol ) ) - self giveweapon( self.laststandpistol ); - - ammoclip = weaponclipsize( self.laststandpistol ); - doubleclip = ammoclip * 2; - - if ( isdefined( self._special_solo_pistol_swap ) && self._special_solo_pistol_swap || self.laststandpistol == level.default_solo_laststandpistol && !self.hadpistol ) - { - self._special_solo_pistol_swap = 0; - self.hadpistol = 0; - self setweaponammostock( self.laststandpistol, doubleclip ); - } - else if ( flag( "solo_game" ) && self.laststandpistol == level.default_solo_laststandpistol ) - self setweaponammostock( self.laststandpistol, doubleclip ); - else if ( self.laststandpistol == level.default_laststandpistol ) - self setweaponammostock( self.laststandpistol, doubleclip ); - else if ( self.laststandpistol == "ray_gun_zm" || self.laststandpistol == "ray_gun_upgraded_zm" ) - { - if ( self.stored_weapon_info[self.laststandpistol].total_amt >= ammoclip ) - { - self setweaponammoclip( self.laststandpistol, ammoclip ); - self.stored_weapon_info[self.laststandpistol].given_amt = ammoclip; - } - else - { - self setweaponammoclip( self.laststandpistol, self.stored_weapon_info[self.laststandpistol].total_amt ); - self.stored_weapon_info[self.laststandpistol].given_amt = self.stored_weapon_info[self.laststandpistol].total_amt; - } - - self setweaponammostock( self.laststandpistol, 0 ); - } - else if ( self.stored_weapon_info[self.laststandpistol].stock_amt >= doubleclip ) - { - self setweaponammostock( self.laststandpistol, doubleclip ); - self.stored_weapon_info[self.laststandpistol].given_amt = doubleclip + self.stored_weapon_info[self.laststandpistol].clip_amt + self.stored_weapon_info[self.laststandpistol].left_clip_amt; - } - else - { - self setweaponammostock( self.laststandpistol, self.stored_weapon_info[self.laststandpistol].stock_amt ); - self.stored_weapon_info[self.laststandpistol].given_amt = self.stored_weapon_info[self.laststandpistol].total_amt; - } - - self switchtoweapon( self.laststandpistol ); -} - -last_stand_best_pistol() -{ - pistol_array = []; - current_weapons = self getweaponslistprimaries(); - - for ( i = 0; i < current_weapons.size; i++ ) - { - class = weaponclass( current_weapons[i] ); - - if ( issubstr( current_weapons[i], "knife_ballistic_" ) ) - class = "knife"; - - if ( class == "pistol" || class == "pistolspread" || class == "pistol spread" ) - { - if ( current_weapons[i] != level.default_laststandpistol && !flag( "solo_game" ) || !flag( "solo_game" ) && current_weapons[i] != level.default_solo_laststandpistol ) - { - if ( self getammocount( current_weapons[i] ) <= 0 ) - continue; - } - - pistol_array_index = pistol_array.size; - pistol_array[pistol_array_index] = spawnstruct(); - pistol_array[pistol_array_index].gun = current_weapons[i]; - pistol_array[pistol_array_index].value = 0; - - for ( j = 0; j < level.pistol_values.size; j++ ) - { - if ( level.pistol_values[j] == current_weapons[i] ) - { - pistol_array[pistol_array_index].value = j; - break; - } - } - } - } - - self.laststandpistol = last_stand_compare_pistols( pistol_array ); -} - -last_stand_compare_pistols( struct_array ) -{ - if ( !isarray( struct_array ) || struct_array.size <= 0 ) - { - self.hadpistol = 0; - - if ( isdefined( self.stored_weapon_info ) ) - { - stored_weapon_info = getarraykeys( self.stored_weapon_info ); - - for ( j = 0; j < stored_weapon_info.size; j++ ) - { - if ( stored_weapon_info[j] == level.laststandpistol ) - self.hadpistol = 1; - } - } - - return level.laststandpistol; - } - - highest_score_pistol = struct_array[0]; - - for ( i = 1; i < struct_array.size; i++ ) - { - if ( struct_array[i].value > highest_score_pistol.value ) - highest_score_pistol = struct_array[i]; - } - - if ( flag( "solo_game" ) ) - { - self._special_solo_pistol_swap = 0; - - if ( highest_score_pistol.value <= level.pistol_value_solo_replace_below ) - { - self.hadpistol = 0; - self._special_solo_pistol_swap = 1; - - if ( isdefined( level.force_solo_quick_revive ) && level.force_solo_quick_revive && ( !self hasperk( "specialty_quickrevive" ) && !self hasperk( "specialty_quickrevive" ) ) ) - return highest_score_pistol.gun; - else - return level.laststandpistol; - } - else - return highest_score_pistol.gun; - } - else - return highest_score_pistol.gun; -} - -last_stand_save_pistol_ammo() -{ - weapon_inventory = self getweaponslist( 1 ); - self.stored_weapon_info = []; - - for ( i = 0; i < weapon_inventory.size; i++ ) - { - weapon = weapon_inventory[i]; - class = weaponclass( weapon ); - - if ( issubstr( weapon, "knife_ballistic_" ) ) - class = "knife"; - - if ( class == "pistol" || class == "pistolspread" || class == "pistol spread" ) - { - self.stored_weapon_info[weapon] = spawnstruct(); - self.stored_weapon_info[weapon].clip_amt = self getweaponammoclip( weapon ); - self.stored_weapon_info[weapon].left_clip_amt = 0; - dual_wield_name = weapondualwieldweaponname( weapon ); - - if ( "none" != dual_wield_name ) - self.stored_weapon_info[weapon].left_clip_amt = self getweaponammoclip( dual_wield_name ); - - self.stored_weapon_info[weapon].stock_amt = self getweaponammostock( weapon ); - self.stored_weapon_info[weapon].total_amt = self.stored_weapon_info[weapon].clip_amt + self.stored_weapon_info[weapon].left_clip_amt + self.stored_weapon_info[weapon].stock_amt; - self.stored_weapon_info[weapon].given_amt = 0; - } - } - - self last_stand_best_pistol(); -} - -last_stand_restore_pistol_ammo() -{ - self.weapon_taken_by_losing_specialty_additionalprimaryweapon = undefined; - - if ( !isdefined( self.stored_weapon_info ) ) - return; - - weapon_inventory = self getweaponslist( 1 ); - weapon_to_restore = getarraykeys( self.stored_weapon_info ); - - for ( i = 0; i < weapon_inventory.size; i++ ) - { - weapon = weapon_inventory[i]; - - if ( weapon != self.laststandpistol ) - continue; - - for ( j = 0; j < weapon_to_restore.size; j++ ) - { - check_weapon = weapon_to_restore[j]; - - if ( weapon == check_weapon ) - { - dual_wield_name = weapondualwieldweaponname( weapon_to_restore[j] ); - - if ( weapon != level.default_laststandpistol ) - { - last_clip = self getweaponammoclip( weapon ); - last_left_clip = 0; - - if ( "none" != dual_wield_name ) - last_left_clip = self getweaponammoclip( dual_wield_name ); - - last_stock = self getweaponammostock( weapon ); - last_total = last_clip + last_left_clip + last_stock; - used_amt = self.stored_weapon_info[weapon].given_amt - last_total; - - if ( used_amt >= self.stored_weapon_info[weapon].stock_amt ) - { - used_amt -= self.stored_weapon_info[weapon].stock_amt; - self.stored_weapon_info[weapon].stock_amt = 0; - self.stored_weapon_info[weapon].clip_amt -= used_amt; - - if ( self.stored_weapon_info[weapon].clip_amt < 0 ) - self.stored_weapon_info[weapon].clip_amt = 0; - } - else - { - new_stock_amt = self.stored_weapon_info[weapon].stock_amt - used_amt; - - if ( new_stock_amt < self.stored_weapon_info[weapon].stock_amt ) - self.stored_weapon_info[weapon].stock_amt = new_stock_amt; - } - } - - self setweaponammoclip( weapon_to_restore[j], self.stored_weapon_info[weapon_to_restore[j]].clip_amt ); - - if ( "none" != dual_wield_name ) - self setweaponammoclip( dual_wield_name, self.stored_weapon_info[weapon_to_restore[j]].left_clip_amt ); - - self setweaponammostock( weapon_to_restore[j], self.stored_weapon_info[weapon_to_restore[j]].stock_amt ); - break; - } - } - } -} - -last_stand_take_thrown_grenade() -{ - self endon( "disconnect" ); - self endon( "bled_out" ); - self endon( "player_revived" ); - - self waittill( "grenade_fire", grenade, weaponname ); - - if ( isdefined( self.lsgsar_lethal ) && weaponname == self.lsgsar_lethal ) - self.lsgsar_lethal_nade_amt--; - - if ( isdefined( self.lsgsar_tactical ) && weaponname == self.lsgsar_tactical ) - self.lsgsar_tactical_nade_amt--; -} - -last_stand_grenade_save_and_return() -{ - if ( isdefined( level.isresetting_grief ) && level.isresetting_grief ) - return; - - self endon( "disconnect" ); - self endon( "bled_out" ); - level endon( "between_round_over" ); - self.lsgsar_lethal_nade_amt = 0; - self.lsgsar_has_lethal_nade = 0; - self.lsgsar_tactical_nade_amt = 0; - self.lsgsar_has_tactical_nade = 0; - self.lsgsar_lethal = undefined; - self.lsgsar_tactical = undefined; - - if ( self isthrowinggrenade() ) - self thread last_stand_take_thrown_grenade(); - - weapons_on_player = self getweaponslist( 1 ); - - for ( i = 0; i < weapons_on_player.size; i++ ) - { - if ( self is_player_lethal_grenade( weapons_on_player[i] ) ) - { - self.lsgsar_has_lethal_nade = 1; - self.lsgsar_lethal = self get_player_lethal_grenade(); - self.lsgsar_lethal_nade_amt = self getweaponammoclip( self get_player_lethal_grenade() ); - self setweaponammoclip( self get_player_lethal_grenade(), 0 ); - self takeweapon( self get_player_lethal_grenade() ); - continue; - } - - if ( self is_player_tactical_grenade( weapons_on_player[i] ) ) - { - self.lsgsar_has_tactical_nade = 1; - self.lsgsar_tactical = self get_player_tactical_grenade(); - self.lsgsar_tactical_nade_amt = self getweaponammoclip( self get_player_tactical_grenade() ); - self setweaponammoclip( self get_player_tactical_grenade(), 0 ); - self takeweapon( self get_player_tactical_grenade() ); - } - } - - self waittill( "player_revived" ); - - if ( self.lsgsar_has_lethal_nade ) - { - self set_player_lethal_grenade( self.lsgsar_lethal ); - self giveweapon( self.lsgsar_lethal ); - self setweaponammoclip( self.lsgsar_lethal, self.lsgsar_lethal_nade_amt ); - } - - if ( self.lsgsar_has_tactical_nade ) - { - self set_player_tactical_grenade( self.lsgsar_tactical ); - self giveweapon( self.lsgsar_tactical ); - self setweaponammoclip( self.lsgsar_tactical, self.lsgsar_tactical_nade_amt ); - } - - self.lsgsar_lethal_nade_amt = undefined; - self.lsgsar_has_lethal_nade = undefined; - self.lsgsar_tactical_nade_amt = undefined; - self.lsgsar_has_tactical_nade = undefined; - self.lsgsar_lethal = undefined; - self.lsgsar_tactical = undefined; -} - -spectators_respawn() -{ - level endon( "between_round_over" ); - - if ( !isdefined( level.zombie_vars["spectators_respawn"] ) || !level.zombie_vars["spectators_respawn"] ) - return; - - if ( !isdefined( level.custom_spawnplayer ) ) - level.custom_spawnplayer = ::spectator_respawn; - - while ( true ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i].sessionstate == "spectator" && isdefined( players[i].spectator_respawn ) ) - { - players[i] [[ level.spawnplayer ]](); - thread refresh_player_navcard_hud(); - - if ( isdefined( level.script ) && level.round_number > 6 && players[i].score < 1500 ) - { - players[i].old_score = players[i].score; - - if ( isdefined( level.spectator_respawn_custom_score ) ) - players[i] [[ level.spectator_respawn_custom_score ]](); - - players[i].score = 1500; - } - } - } - - wait 1; - } -} - -spectator_respawn() -{ -/# - println( "*************************Respawn Spectator***" ); -#/ -/# - assert( isdefined( self.spectator_respawn ) ); -#/ - origin = self.spectator_respawn.origin; - angles = self.spectator_respawn.angles; - self setspectatepermissions( 0 ); - new_origin = undefined; - - if ( isdefined( level.check_valid_spawn_override ) ) - new_origin = [[ level.check_valid_spawn_override ]]( self ); - - if ( !isdefined( new_origin ) ) - new_origin = check_for_valid_spawn_near_team( self, 1 ); - - if ( isdefined( new_origin ) ) - { - if ( !isdefined( new_origin.angles ) ) - angles = ( 0, 0, 0 ); - else - angles = new_origin.angles; - - self spawn( new_origin.origin, angles ); - } - else - self spawn( origin, angles ); - - if ( isdefined( self get_player_placeable_mine() ) ) - { - self takeweapon( self get_player_placeable_mine() ); - self set_player_placeable_mine( undefined ); - } - - self maps\mp\zombies\_zm_equipment::equipment_take(); - self.is_burning = undefined; - self.abilities = []; - self.is_zombie = 0; - self.ignoreme = 0; - setclientsysstate( "lsm", "0", self ); - self reviveplayer(); - self notify( "spawned_player" ); - - if ( isdefined( level._zombiemode_post_respawn_callback ) ) - self thread [[ level._zombiemode_post_respawn_callback ]](); - - self maps\mp\zombies\_zm_score::player_reduce_points( "died" ); - self maps\mp\zombies\_zm_melee_weapon::spectator_respawn_all(); - claymore_triggers = getentarray( "claymore_purchase", "targetname" ); - - for ( i = 0; i < claymore_triggers.size; i++ ) - { - claymore_triggers[i] setvisibletoplayer( self ); - claymore_triggers[i].claymores_triggered = 0; - } - - self thread player_zombie_breadcrumb(); - self thread return_retained_perks(); - return 1; -} - -check_for_valid_spawn_near_team( revivee, return_struct ) -{ - if ( isdefined( level.check_for_valid_spawn_near_team_callback ) ) - { - spawn_location = [[ level.check_for_valid_spawn_near_team_callback ]]( revivee, return_struct ); - return spawn_location; - } - else - { - players = get_players(); - spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); - closest_group = undefined; - closest_distance = 100000000; - backup_group = undefined; - backup_distance = 100000000; - - if ( spawn_points.size == 0 ) - return undefined; - - for ( i = 0; i < players.size; i++ ) - { - if ( is_player_valid( players[i], undefined, 1 ) && players[i] != self ) - { - for ( j = 0; j < spawn_points.size; j++ ) - { - if ( isdefined( spawn_points[j].script_int ) ) - ideal_distance = spawn_points[j].script_int; - else - ideal_distance = 1000; - - if ( spawn_points[j].locked == 0 ) - { - plyr_dist = distancesquared( players[i].origin, spawn_points[j].origin ); - - if ( plyr_dist < ideal_distance * ideal_distance ) - { - if ( plyr_dist < closest_distance ) - { - closest_distance = plyr_dist; - closest_group = j; - } - - continue; - } - - if ( plyr_dist < backup_distance ) - { - backup_group = j; - backup_distance = plyr_dist; - } - } - } - } - - if ( !isdefined( closest_group ) ) - closest_group = backup_group; - - if ( isdefined( closest_group ) ) - { - spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); - - if ( isdefined( spawn_location ) ) - return spawn_location; - } - } - - return undefined; - } -} - -get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ) -{ - spawn_array = getstructarray( spawn_points[closest_group].target, "targetname" ); - spawn_array = array_randomize( spawn_array ); - - for ( k = 0; k < spawn_array.size; k++ ) - { - if ( isdefined( spawn_array[k].plyr ) && spawn_array[k].plyr == revivee getentitynumber() ) - { - if ( positionwouldtelefrag( spawn_array[k].origin ) ) - { - spawn_array[k].plyr = undefined; - break; - continue; - } - - if ( isdefined( return_struct ) && return_struct ) - { - return spawn_array[k]; - continue; - } - - return spawn_array[k].origin; - } - } - - for ( k = 0; k < spawn_array.size; k++ ) - { - if ( positionwouldtelefrag( spawn_array[k].origin ) ) - continue; - - if ( !isdefined( spawn_array[k].plyr ) || spawn_array[k].plyr == revivee getentitynumber() ) - { - spawn_array[k].plyr = revivee getentitynumber(); - - if ( isdefined( return_struct ) && return_struct ) - { - return spawn_array[k]; - continue; - } - - return spawn_array[k].origin; - } - } - - if ( isdefined( return_struct ) && return_struct ) - return spawn_array[0]; - - return spawn_array[0].origin; -} - -check_for_valid_spawn_near_position( revivee, v_position, return_struct ) -{ - spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); - - if ( spawn_points.size == 0 ) - return undefined; - - closest_group = undefined; - closest_distance = 100000000; - backup_group = undefined; - backup_distance = 100000000; - - for ( i = 0; i < spawn_points.size; i++ ) - { - if ( isdefined( spawn_points[i].script_int ) ) - ideal_distance = spawn_points[i].script_int; - else - ideal_distance = 1000; - - if ( spawn_points[i].locked == 0 ) - { - dist = distancesquared( v_position, spawn_points[i].origin ); - - if ( dist < ideal_distance * ideal_distance ) - { - if ( dist < closest_distance ) - { - closest_distance = dist; - closest_group = i; - } - } - else if ( dist < backup_distance ) - { - backup_group = i; - backup_distance = dist; - } - } - - if ( !isdefined( closest_group ) ) - closest_group = backup_group; - } - - if ( isdefined( closest_group ) ) - { - spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); - - if ( isdefined( spawn_location ) ) - return spawn_location; - } - - return undefined; -} - -check_for_valid_spawn_within_range( revivee, v_position, return_struct, min_distance, max_distance ) -{ - spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); - - if ( spawn_points.size == 0 ) - return undefined; - - closest_group = undefined; - closest_distance = 100000000; - - for ( i = 0; i < spawn_points.size; i++ ) - { - if ( spawn_points[i].locked == 0 ) - { - dist = distance( v_position, spawn_points[i].origin ); - - if ( dist >= min_distance && dist <= max_distance ) - { - if ( dist < closest_distance ) - { - closest_distance = dist; - closest_group = i; - } - } - } - } - - if ( isdefined( closest_group ) ) - { - spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); - - if ( isdefined( spawn_location ) ) - return spawn_location; - } - - return undefined; -} - -get_players_on_team( exclude ) -{ - teammates = []; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i].spawn_side == self.spawn_side && !isdefined( players[i].revivetrigger ) && players[i] != exclude ) - teammates[teammates.size] = players[i]; - } - - return teammates; -} - -get_safe_breadcrumb_pos( player ) -{ - players = get_players(); - valid_players = []; - min_dist = 22500; - - for ( i = 0; i < players.size; i++ ) - { - if ( !is_player_valid( players[i] ) ) - continue; - - valid_players[valid_players.size] = players[i]; - } - - for ( i = 0; i < valid_players.size; i++ ) - { - count = 0; - - for ( q = 1; q < player.zombie_breadcrumbs.size; q++ ) - { - if ( distancesquared( player.zombie_breadcrumbs[q], valid_players[i].origin ) < min_dist ) - continue; - - count++; - - if ( count == valid_players.size ) - return player.zombie_breadcrumbs[q]; - } - } - - return undefined; -} - -default_max_zombie_func( max_num ) -{ -/# - count = getdvarint( _hash_CF687B54 ); - - if ( count > -1 ) - return count; -#/ - max = max_num; - - if ( level.round_number < 2 ) - max = int( max_num * 0.25 ); - else if ( level.round_number < 3 ) - max = int( max_num * 0.3 ); - else if ( level.round_number < 4 ) - max = int( max_num * 0.5 ); - else if ( level.round_number < 5 ) - max = int( max_num * 0.7 ); - else if ( level.round_number < 6 ) - max = int( max_num * 0.9 ); - - return max; -} - -round_spawning() -{ - level endon( "intermission" ); - level endon( "end_of_round" ); - level endon( "restart_round" ); -/# - level endon( "kill_round" ); -#/ - if ( level.intermission ) - return; -/# - if ( getdvarint( _hash_FA81816F ) == 2 || getdvarint( _hash_FA81816F ) >= 4 ) - return; -#/ - if ( level.zombie_spawn_locations.size < 1 ) - { -/# - assertmsg( "No active spawners in the map. Check to see if the zone is active and if it's pointing to spawners." ); -#/ - return; - } - - ai_calculate_health( level.round_number ); - count = 0; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i].zombification_time = 0; - - max = level.zombie_vars["zombie_max_ai"]; - multiplier = level.round_number / 5; - - if ( multiplier < 1 ) - multiplier = 1; - - if ( level.round_number >= 10 ) - multiplier *= ( level.round_number * 0.15 ); - - player_num = get_players().size; - - if ( player_num == 1 ) - max += int( 0.5 * level.zombie_vars["zombie_ai_per_player"] * multiplier ); - else - max += int( ( player_num - 1 ) * level.zombie_vars["zombie_ai_per_player"] * multiplier ); - - if ( !isdefined( level.max_zombie_func ) ) - level.max_zombie_func = ::default_max_zombie_func; - - if ( !( isdefined( level.kill_counter_hud ) && level.zombie_total > 0 ) ) - { - level.zombie_total = [[ level.max_zombie_func ]]( max ); - level notify( "zombie_total_set" ); - } - - if ( isdefined( level.zombie_total_set_func ) ) - level thread [[ level.zombie_total_set_func ]](); - - if ( level.round_number < 10 || level.speed_change_max > 0 ) - level thread zombie_speed_up(); - - mixed_spawns = 0; - old_spawn = undefined; - - while ( true ) - { - while ( get_current_zombie_count() >= level.zombie_ai_limit || level.zombie_total <= 0 ) - wait 0.1; - - while ( get_current_actor_count() >= level.zombie_actor_limit ) - { - clear_all_corpses(); - wait 0.1; - } - - flag_wait( "spawn_zombies" ); - - while ( level.zombie_spawn_locations.size <= 0 ) - wait 0.1; - - run_custom_ai_spawn_checks(); - spawn_point = level.zombie_spawn_locations[randomint( level.zombie_spawn_locations.size )]; - - if ( !isdefined( old_spawn ) ) - old_spawn = spawn_point; - else if ( spawn_point == old_spawn ) - spawn_point = level.zombie_spawn_locations[randomint( level.zombie_spawn_locations.size )]; - - old_spawn = spawn_point; - - if ( isdefined( level.mixed_rounds_enabled ) && level.mixed_rounds_enabled == 1 ) - { - spawn_dog = 0; - - if ( level.round_number > 30 ) - { - if ( randomint( 100 ) < 3 ) - spawn_dog = 1; - } - else if ( level.round_number > 25 && mixed_spawns < 3 ) - { - if ( randomint( 100 ) < 2 ) - spawn_dog = 1; - } - else if ( level.round_number > 20 && mixed_spawns < 2 ) - { - if ( randomint( 100 ) < 2 ) - spawn_dog = 1; - } - else if ( level.round_number > 15 && mixed_spawns < 1 ) - { - if ( randomint( 100 ) < 1 ) - spawn_dog = 1; - } - - if ( spawn_dog ) - { - keys = getarraykeys( level.zones ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( level.zones[keys[i]].is_occupied ) - { - akeys = getarraykeys( level.zones[keys[i]].adjacent_zones ); - - for ( k = 0; k < akeys.size; k++ ) - { - if ( level.zones[akeys[k]].is_active && !level.zones[akeys[k]].is_occupied && level.zones[akeys[k]].dog_locations.size > 0 ) - { - maps\mp\zombies\_zm_ai_dogs::special_dog_spawn( undefined, 1 ); - level.zombie_total--; - wait_network_frame(); - } - } - } - } - } - } - - if ( isdefined( level.zombie_spawners ) ) - { - if ( isdefined( level.use_multiple_spawns ) && level.use_multiple_spawns ) - { - if ( isdefined( spawn_point.script_int ) ) - { - if ( isdefined( level.zombie_spawn[spawn_point.script_int] ) && level.zombie_spawn[spawn_point.script_int].size ) - spawner = random( level.zombie_spawn[spawn_point.script_int] ); - else - { -/# - assertmsg( "Wanting to spawn from zombie group " + spawn_point.script_int + "but it doens't exist" ); -#/ - } - } - else if ( isdefined( level.zones[spawn_point.zone_name].script_int ) && level.zones[spawn_point.zone_name].script_int ) - spawner = random( level.zombie_spawn[level.zones[spawn_point.zone_name].script_int] ); - else if ( isdefined( level.spawner_int ) && ( isdefined( level.zombie_spawn[level.spawner_int].size ) && level.zombie_spawn[level.spawner_int].size ) ) - spawner = random( level.zombie_spawn[level.spawner_int] ); - else - spawner = random( level.zombie_spawners ); - } - else - spawner = random( level.zombie_spawners ); - - ai = spawn_zombie( spawner, spawner.targetname, spawn_point ); - } - - if ( isdefined( ai ) ) - { - level.zombie_total--; - ai thread round_spawn_failsafe(); - count++; - } - - wait( level.zombie_vars["zombie_spawn_delay"] ); - wait_network_frame(); - } -} - -run_custom_ai_spawn_checks() -{ - foreach ( str_id, s in level.custom_ai_spawn_check_funcs ) - { - if ( [[ s.func_check ]]() ) - { - a_spawners = [[ s.func_get_spawners ]](); - level.zombie_spawners = arraycombine( level.zombie_spawners, a_spawners, 0, 0 ); - - if ( isdefined( level.use_multiple_spawns ) && level.use_multiple_spawns ) - { - foreach ( sp in a_spawners ) - { - if ( isdefined( sp.script_int ) ) - { - if ( !isdefined( level.zombie_spawn[sp.script_int] ) ) - level.zombie_spawn[sp.script_int] = []; - - if ( !isinarray( level.zombie_spawn[sp.script_int], sp ) ) - level.zombie_spawn[sp.script_int][level.zombie_spawn[sp.script_int].size] = sp; - } - } - } - - if ( isdefined( s.func_get_locations ) ) - { - a_locations = [[ s.func_get_locations ]](); - level.zombie_spawn_locations = arraycombine( level.zombie_spawn_locations, a_locations, 0, 0 ); - } - - continue; - } - - a_spawners = [[ s.func_get_spawners ]](); - - foreach ( sp in a_spawners ) - arrayremovevalue( level.zombie_spawners, sp ); - - if ( isdefined( level.use_multiple_spawns ) && level.use_multiple_spawns ) - { - foreach ( sp in a_spawners ) - { - if ( isdefined( sp.script_int ) && isdefined( level.zombie_spawn[sp.script_int] ) ) - arrayremovevalue( level.zombie_spawn[sp.script_int], sp ); - } - } - - if ( isdefined( s.func_get_locations ) ) - { - a_locations = [[ s.func_get_locations ]](); - - foreach ( s_loc in a_locations ) - arrayremovevalue( level.zombie_spawn_locations, s_loc ); - } - } -} - -register_custom_ai_spawn_check( str_id, func_check, func_get_spawners, func_get_locations ) -{ - if ( !isdefined( level.custom_ai_spawn_check_funcs[str_id] ) ) - level.custom_ai_spawn_check_funcs[str_id] = spawnstruct(); - - level.custom_ai_spawn_check_funcs[str_id].func_check = func_check; - level.custom_ai_spawn_check_funcs[str_id].func_get_spawners = func_get_spawners; - level.custom_ai_spawn_check_funcs[str_id].func_get_locations = func_get_locations; -} - -zombie_speed_up() -{ - if ( level.round_number <= 3 ) - return; - - level endon( "intermission" ); - level endon( "end_of_round" ); - level endon( "restart_round" ); -/# - level endon( "kill_round" ); -#/ - while ( level.zombie_total > 4 ) - wait 2.0; - - for ( num_zombies = get_current_zombie_count(); num_zombies > 3; num_zombies = get_current_zombie_count() ) - wait 2.0; - - for ( zombies = get_round_enemy_array(); zombies.size > 0; zombies = get_round_enemy_array() ) - { - if ( zombies.size == 1 && ( isdefined( zombies[0].has_legs ) && zombies[0].has_legs ) ) - { - if ( isdefined( level.zombie_speed_up ) ) - zombies[0] thread [[ level.zombie_speed_up ]](); - else if ( zombies[0].zombie_move_speed != "sprint" ) - { - zombies[0] set_zombie_run_cycle( "sprint" ); - zombies[0].zombie_move_speed_original = zombies[0].zombie_move_speed; - } - } - - wait 0.5; - } -} - -round_spawning_test() -{ - while ( true ) - { - spawn_point = level.zombie_spawn_locations[randomint( level.zombie_spawn_locations.size )]; - spawner = random( level.zombie_spawners ); - ai = spawn_zombie( spawner, spawner.targetname, spawn_point ); - - ai waittill( "death" ); - - wait 5; - } -} - -round_pause( delay ) -{ - if ( !isdefined( delay ) ) - delay = 30; - - level.countdown_hud = create_counter_hud(); - level.countdown_hud setvalue( delay ); - level.countdown_hud.color = ( 1, 1, 1 ); - level.countdown_hud.alpha = 1; - level.countdown_hud fadeovertime( 2.0 ); - wait 2.0; - level.countdown_hud.color = vectorscale( ( 1, 0, 0 ), 0.21 ); - level.countdown_hud fadeovertime( 3.0 ); - wait 3; - - while ( delay >= 1 ) - { - wait 1; - delay--; - level.countdown_hud setvalue( delay ); - } - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] playlocalsound( "zmb_perks_packa_ready" ); - - level.countdown_hud fadeovertime( 1.0 ); - level.countdown_hud.color = ( 1, 1, 1 ); - level.countdown_hud.alpha = 0; - wait 1.0; - level.countdown_hud destroy_hud(); -} - -round_start() -{ -/# - println( "ZM >> round_start start" ); -#/ - if ( isdefined( level.round_prestart_func ) ) - [[ level.round_prestart_func ]](); - else - { - n_delay = 2; - - if ( isdefined( level.zombie_round_start_delay ) ) - n_delay = level.zombie_round_start_delay; - - wait( n_delay ); - } - - level.zombie_health = level.zombie_vars["zombie_health_start"]; - - if ( getdvarint( "scr_writeConfigStrings" ) == 1 ) - { - wait 5; - exitlevel(); - return; - } - - if ( level.zombie_vars["game_start_delay"] > 0 ) - round_pause( level.zombie_vars["game_start_delay"] ); - - flag_set( "begin_spawning" ); - - if ( !isdefined( level.round_spawn_func ) ) - level.round_spawn_func = ::round_spawning; -/# - if ( getdvarint( _hash_7688603C ) ) - level.round_spawn_func = ::round_spawning_test; -#/ - if ( !isdefined( level.round_wait_func ) ) - level.round_wait_func = ::round_wait; - - if ( !isdefined( level.round_think_func ) ) - level.round_think_func = ::round_think; - - level thread [[ level.round_think_func ]](); -} - -play_door_dialog() -{ - level endon( "power_on" ); - self endon( "warning_dialog" ); - timer = 0; - - while ( true ) - { - wait 0.05; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - dist = distancesquared( players[i].origin, self.origin ); - - if ( dist > 4900 ) - { - timer = 0; - continue; - } - - while ( dist < 4900 && timer < 3 ) - { - wait 0.5; - timer++; - } - - if ( dist > 4900 && timer >= 3 ) - { - self playsound( "door_deny" ); - players[i] maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "door_deny" ); - wait 3; - self notify( "warning_dialog" ); - } - } - } -} - -wait_until_first_player() -{ - players = get_players(); - - if ( !isdefined( players[0] ) ) - level waittill( "first_player_ready" ); -} - -round_one_up() -{ - level endon( "end_game" ); - - if ( isdefined( level.noroundnumber ) && level.noroundnumber == 1 ) - return; - - if ( !isdefined( level.doground_nomusic ) ) - level.doground_nomusic = 0; - - if ( level.first_round ) - { - intro = 1; - - if ( isdefined( level._custom_intro_vox ) ) - level thread [[ level._custom_intro_vox ]](); - else - level thread play_level_start_vox_delayed(); - } - else - intro = 0; - - if ( level.round_number == 5 || level.round_number == 10 || level.round_number == 20 || level.round_number == 35 || level.round_number == 50 ) - { - players = get_players(); - rand = randomintrange( 0, players.size ); - players[rand] thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "round_" + level.round_number ); - } - - if ( intro ) - { - if ( isdefined( level.host_ended_game ) && level.host_ended_game ) - return; - - wait 6.25; - level notify( "intro_hud_done" ); - wait 2; - } - else - wait 2.5; - - reportmtu( level.round_number ); -} - -round_over() -{ - if ( isdefined( level.noroundnumber ) && level.noroundnumber == 1 ) - return; - - time = level.zombie_vars["zombie_between_round_time"]; - players = getplayers(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - { - if ( !isdefined( players[player_index].pers["previous_distance_traveled"] ) ) - players[player_index].pers["previous_distance_traveled"] = 0; - - distancethisround = int( players[player_index].pers["distance_traveled"] - players[player_index].pers["previous_distance_traveled"] ); - players[player_index].pers["previous_distance_traveled"] = players[player_index].pers["distance_traveled"]; - players[player_index] incrementplayerstat( "distance_traveled", distancethisround ); - - if ( players[player_index].pers["team"] != "spectator" ) - { - zonename = players[player_index] get_current_zone(); - - if ( isdefined( zonename ) ) - players[player_index] recordzombiezone( "endingZone", zonename ); - } - } - - recordzombieroundend(); - wait( time ); -} - -round_think( restart ) -{ - if ( !isdefined( restart ) ) - restart = 0; -/# - println( "ZM >> round_think start" ); -#/ - level endon( "end_round_think" ); - - if ( !( isdefined( restart ) && restart ) ) - { - if ( isdefined( level.initial_round_wait_func ) ) - [[ level.initial_round_wait_func ]](); - - if ( !( isdefined( level.host_ended_game ) && level.host_ended_game ) ) - { - players = get_players(); - - foreach ( player in players ) - { - if ( !( isdefined( player.hostmigrationcontrolsfrozen ) && player.hostmigrationcontrolsfrozen ) ) - { - player freezecontrols( 0 ); -/# - println( " Unfreeze controls 8" ); -#/ - } - - player maps\mp\zombies\_zm_stats::set_global_stat( "rounds", level.round_number ); - } - } - } - - setroundsplayed( level.round_number ); - - for (;;) - { - maxreward = 50 * level.round_number; - - if ( maxreward > 500 ) - maxreward = 500; - - level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward; - level.pro_tips_start_time = gettime(); - level.zombie_last_run_time = gettime(); - - if ( isdefined( level.zombie_round_change_custom ) ) - [[ level.zombie_round_change_custom ]](); - else - { - level thread maps\mp\zombies\_zm_audio::change_zombie_music( "round_start" ); - round_one_up(); - } - - maps\mp\zombies\_zm_powerups::powerup_round_start(); - players = get_players(); - array_thread( players, maps\mp\zombies\_zm_blockers::rebuild_barrier_reward_reset ); - - if ( !( isdefined( level.headshots_only ) && level.headshots_only ) && !restart ) - level thread award_grenades_for_survivors(); - - bbprint( "zombie_rounds", "round %d player_count %d", level.round_number, players.size ); -/# - println( "ZM >> round_think, round=" + level.round_number + ", player_count=" + players.size ); -#/ - level.round_start_time = gettime(); - - while ( level.zombie_spawn_locations.size <= 0 ) - wait 0.1; - - level thread [[ level.round_spawn_func ]](); - level notify( "start_of_round" ); - recordzombieroundstart(); - players = getplayers(); - - for ( index = 0; index < players.size; index++ ) - { - zonename = players[index] get_current_zone(); - - if ( isdefined( zonename ) ) - players[index] recordzombiezone( "startingZone", zonename ); - } - - if ( isdefined( level.round_start_custom_func ) ) - [[ level.round_start_custom_func ]](); - - [[ level.round_wait_func ]](); - level.first_round = 0; - level notify( "end_of_round" ); - level thread maps\mp\zombies\_zm_audio::change_zombie_music( "round_end" ); - uploadstats(); - - if ( isdefined( level.round_end_custom_logic ) ) - [[ level.round_end_custom_logic ]](); - - players = get_players(); - - if ( isdefined( level.no_end_game_check ) && level.no_end_game_check ) - { - level thread last_stand_revive(); - level thread spectators_respawn(); - } - else if ( 1 != players.size ) - level thread spectators_respawn(); - - players = get_players(); - array_thread( players, maps\mp\zombies\_zm_pers_upgrades_system::round_end ); - timer = level.zombie_vars["zombie_spawn_delay"]; - - if ( timer > 0.08 ) - level.zombie_vars["zombie_spawn_delay"] = timer * 0.95; - else if ( timer < 0.08 ) - level.zombie_vars["zombie_spawn_delay"] = 0.08; - - if ( level.gamedifficulty == 0 ) - level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier_easy"]; - else - level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier"]; - - level.round_number++; - - if ( 255 < level.round_number ) - level.round_number = 255; - - setroundsplayed( level.round_number ); - matchutctime = getutc(); - players = get_players(); - - foreach ( player in players ) - { - if ( level.curr_gametype_affects_rank && level.round_number > 3 + level.start_round ) - player maps\mp\zombies\_zm_stats::add_client_stat( "weighted_rounds_played", level.round_number ); - - player maps\mp\zombies\_zm_stats::set_global_stat( "rounds", level.round_number ); - player maps\mp\zombies\_zm_stats::update_playing_utc_time( matchutctime ); - } - - check_quickrevive_for_hotjoin(); - level round_over(); - level notify( "between_round_over" ); - restart = 0; - } -} - -award_grenades_for_survivors() -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i].is_zombie ) - { - lethal_grenade = players[i] get_player_lethal_grenade(); - - if ( !players[i] hasweapon( lethal_grenade ) ) - { - players[i] giveweapon( lethal_grenade ); - players[i] setweaponammoclip( lethal_grenade, 0 ); - } - - if ( players[i] getfractionmaxammo( lethal_grenade ) < 0.25 ) - { - players[i] setweaponammoclip( lethal_grenade, 2 ); - continue; - } - - if ( players[i] getfractionmaxammo( lethal_grenade ) < 0.5 ) - { - players[i] setweaponammoclip( lethal_grenade, 3 ); - continue; - } - - players[i] setweaponammoclip( lethal_grenade, 4 ); - } - } -} - -ai_calculate_health( round_number ) -{ - level.zombie_health = level.zombie_vars["zombie_health_start"]; - - for ( i = 2; i <= round_number; i++ ) - { - if ( i >= 10 ) - { - old_health = level.zombie_health; - level.zombie_health += int( level.zombie_health * level.zombie_vars["zombie_health_increase_multiplier"] ); - - if ( level.zombie_health < old_health ) - { - level.zombie_health = old_health; - return; - } - - continue; - } - - level.zombie_health = int( level.zombie_health + level.zombie_vars["zombie_health_increase"] ); - } -} - -ai_zombie_health( round_number ) -{ - zombie_health = level.zombie_vars["zombie_health_start"]; - - for ( i = 2; i <= round_number; i++ ) - { - if ( i >= 10 ) - { - old_health = zombie_health; - zombie_health += int( zombie_health * level.zombie_vars["zombie_health_increase_multiplier"] ); - - if ( zombie_health < old_health ) - return old_health; - - continue; - } - - zombie_health = int( zombie_health + level.zombie_vars["zombie_health_increase"] ); - } - - return zombie_health; -} - -round_spawn_failsafe_debug() -{ -/# - level notify( "failsafe_debug_stop" ); - level endon( "failsafe_debug_stop" ); - start = gettime(); - level.chunk_time = 0; - - while ( true ) - { - level.failsafe_time = gettime() - start; - - if ( isdefined( self.lastchunk_destroy_time ) ) - level.chunk_time = gettime() - self.lastchunk_destroy_time; - - wait_network_frame(); - } -#/ -} - -round_spawn_failsafe() -{ - self endon( "death" ); - prevorigin = self.origin; - - while ( true ) - { - if ( !level.zombie_vars["zombie_use_failsafe"] ) - return; - - if ( isdefined( self.ignore_round_spawn_failsafe ) && self.ignore_round_spawn_failsafe ) - return; - - wait 30; - - if ( !self.has_legs ) - wait 10.0; - - if ( isdefined( self.is_inert ) && self.is_inert ) - continue; - - if ( isdefined( self.lastchunk_destroy_time ) ) - { - if ( gettime() - self.lastchunk_destroy_time < 8000 ) - continue; - } - - if ( self.origin[2] < level.zombie_vars["below_world_check"] ) - { - if ( isdefined( level.put_timed_out_zombies_back_in_queue ) && level.put_timed_out_zombies_back_in_queue && !flag( "dog_round" ) && !( isdefined( self.isscreecher ) && self.isscreecher ) ) - { - level.zombie_total++; - level.zombie_total_subtract++; - } -/# - -#/ - self dodamage( self.health + 100, ( 0, 0, 0 ) ); - break; - } - - if ( distancesquared( self.origin, prevorigin ) < 576 ) - { - if ( isdefined( level.put_timed_out_zombies_back_in_queue ) && level.put_timed_out_zombies_back_in_queue && !flag( "dog_round" ) ) - { - if ( !self.ignoreall && !( isdefined( self.nuked ) && self.nuked ) && !( isdefined( self.marked_for_death ) && self.marked_for_death ) && !( isdefined( self.isscreecher ) && self.isscreecher ) && ( isdefined( self.has_legs ) && self.has_legs ) ) - { - level.zombie_total++; - level.zombie_total_subtract++; - } - } - - level.zombies_timeout_playspace++; -/# - -#/ - self dodamage( self.health + 100, ( 0, 0, 0 ) ); - break; - } - - prevorigin = self.origin; - } -} - -round_wait() -{ - level endon( "restart_round" ); -/# - if ( getdvarint( _hash_7688603C ) ) - level waittill( "forever" ); -#/ -/# - if ( getdvarint( _hash_FA81816F ) == 2 || getdvarint( _hash_FA81816F ) >= 4 ) - level waittill( "forever" ); -#/ - wait 1; - - if ( flag( "dog_round" ) ) - { - wait 7; - - while ( level.dog_intermission ) - wait 0.5; - - increment_dog_round_stat( "finished" ); - } - else - { - while ( true ) - { - should_wait = 0; - - if ( isdefined( level.is_ghost_round_started ) && [[ level.is_ghost_round_started ]]() ) - should_wait = 1; - else - should_wait = get_current_zombie_count() > 0 || level.zombie_total > 0 || level.intermission; - - if ( !should_wait ) - return; - - if ( flag( "end_round_wait" ) ) - return; - - wait 1.0; - } - } -} - -zombify_player() -{ - self maps\mp\zombies\_zm_score::player_died_penalty(); - bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "died", self.origin ); - self recordplayerdeathzombies(); - - if ( isdefined( level.deathcard_spawn_func ) ) - self [[ level.deathcard_spawn_func ]](); - - if ( !isdefined( level.zombie_vars["zombify_player"] ) || !level.zombie_vars["zombify_player"] ) - { - self thread spawnspectator(); - return; - } - - self.ignoreme = 1; - self.is_zombie = 1; - self.zombification_time = gettime(); - self.team = level.zombie_team; - self notify( "zombified" ); - - if ( isdefined( self.revivetrigger ) ) - self.revivetrigger delete(); - - self.revivetrigger = undefined; - self setmovespeedscale( 0.3 ); - self reviveplayer(); - self takeallweapons(); - self giveweapon( "zombie_melee", 0 ); - self switchtoweapon( "zombie_melee" ); - self disableweaponcycling(); - self disableoffhandweapons(); - setclientsysstate( "zombify", 1, self ); - self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow(); - self thread playerzombie_player_damage(); - self thread playerzombie_soundboard(); -} - -playerzombie_player_damage() -{ - self endon( "death" ); - self endon( "disconnect" ); - self thread playerzombie_infinite_health(); - self.zombiehealth = level.zombie_health; - - while ( true ) - { - self waittill( "damage", amount, attacker, directionvec, point, type ); - - if ( !isdefined( attacker ) || !isplayer( attacker ) ) - { - wait 0.05; - continue; - } - - self.zombiehealth -= amount; - - if ( self.zombiehealth <= 0 ) - { - self thread playerzombie_downed_state(); - - self waittill( "playerzombie_downed_state_done" ); - - self.zombiehealth = level.zombie_health; - } - } -} - -playerzombie_downed_state() -{ - self endon( "death" ); - self endon( "disconnect" ); - downtime = 15; - starttime = gettime(); - endtime = starttime + downtime * 1000; - self thread playerzombie_downed_hud(); - self.playerzombie_soundboard_disable = 1; - self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow_stop(); - self disableweapons(); - self allowstand( 0 ); - self allowcrouch( 0 ); - self allowprone( 1 ); - - while ( gettime() < endtime ) - wait 0.05; - - self.playerzombie_soundboard_disable = 0; - self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow(); - self enableweapons(); - self allowstand( 1 ); - self allowcrouch( 0 ); - self allowprone( 0 ); - self notify( "playerzombie_downed_state_done" ); -} - -playerzombie_downed_hud() -{ - self endon( "death" ); - self endon( "disconnect" ); - text = newclienthudelem( self ); - text.alignx = "center"; - text.aligny = "middle"; - text.horzalign = "user_center"; - text.vertalign = "user_bottom"; - text.foreground = 1; - text.font = "default"; - text.fontscale = 1.8; - text.alpha = 0; - text.color = ( 1, 1, 1 ); - text settext( &"ZOMBIE_PLAYERZOMBIE_DOWNED" ); - text.y = -113; - - if ( self issplitscreen() ) - text.y = -137; - - text fadeovertime( 0.1 ); - text.alpha = 1; - - self waittill( "playerzombie_downed_state_done" ); - - text fadeovertime( 0.1 ); - text.alpha = 0; -} - -playerzombie_infinite_health() -{ - self endon( "death" ); - self endon( "disconnect" ); - bighealth = 100000; - - while ( true ) - { - if ( self.health < bighealth ) - self.health = bighealth; - - wait 0.1; - } -} - -playerzombie_soundboard() -{ - self endon( "death" ); - self endon( "disconnect" ); - self.playerzombie_soundboard_disable = 0; - self.buttonpressed_use = 0; - self.buttonpressed_attack = 0; - self.buttonpressed_ads = 0; - self.usesound_waittime = 3000; - self.usesound_nexttime = gettime(); - usesound = "playerzombie_usebutton_sound"; - self.attacksound_waittime = 3000; - self.attacksound_nexttime = gettime(); - attacksound = "playerzombie_attackbutton_sound"; - self.adssound_waittime = 3000; - self.adssound_nexttime = gettime(); - adssound = "playerzombie_adsbutton_sound"; - self.inputsound_nexttime = gettime(); - - while ( true ) - { - if ( self.playerzombie_soundboard_disable ) - { - wait 0.05; - continue; - } - - if ( self usebuttonpressed() ) - { - if ( self can_do_input( "use" ) ) - { - self thread playerzombie_play_sound( usesound ); - self thread playerzombie_waitfor_buttonrelease( "use" ); - self.usesound_nexttime = gettime() + self.usesound_waittime; - } - } - else if ( self attackbuttonpressed() ) - { - if ( self can_do_input( "attack" ) ) - { - self thread playerzombie_play_sound( attacksound ); - self thread playerzombie_waitfor_buttonrelease( "attack" ); - self.attacksound_nexttime = gettime() + self.attacksound_waittime; - } - } - else if ( self adsbuttonpressed() ) - { - if ( self can_do_input( "ads" ) ) - { - self thread playerzombie_play_sound( adssound ); - self thread playerzombie_waitfor_buttonrelease( "ads" ); - self.adssound_nexttime = gettime() + self.adssound_waittime; - } - } - - wait 0.05; - } -} - -can_do_input( inputtype ) -{ - if ( gettime() < self.inputsound_nexttime ) - return 0; - - cando = 0; - - switch ( inputtype ) - { - case "use": - if ( gettime() >= self.usesound_nexttime && !self.buttonpressed_use ) - cando = 1; - - break; - case "attack": - if ( gettime() >= self.attacksound_nexttime && !self.buttonpressed_attack ) - cando = 1; - - break; - case "ads": - if ( gettime() >= self.usesound_nexttime && !self.buttonpressed_ads ) - cando = 1; - - break; - default: -/# - assertmsg( "can_do_input(): didn't recognize inputType of " + inputtype ); -#/ - break; - } - - return cando; -} - -playerzombie_play_sound( alias ) -{ - self play_sound_on_ent( alias ); -} - -playerzombie_waitfor_buttonrelease( inputtype ) -{ - if ( inputtype != "use" && inputtype != "attack" && inputtype != "ads" ) - { -/# - assertmsg( "playerzombie_waitfor_buttonrelease(): inputType of " + inputtype + " is not recognized." ); -#/ - return; - } - - notifystring = "waitfor_buttonrelease_" + inputtype; - self notify( notifystring ); - self endon( notifystring ); - - if ( inputtype == "use" ) - { - self.buttonpressed_use = 1; - - while ( self usebuttonpressed() ) - wait 0.05; - - self.buttonpressed_use = 0; - } - else if ( inputtype == "attack" ) - { - self.buttonpressed_attack = 1; - - while ( self attackbuttonpressed() ) - wait 0.05; - - self.buttonpressed_attack = 0; - } - else if ( inputtype == "ads" ) - { - self.buttonpressed_ads = 1; - - while ( self adsbuttonpressed() ) - wait 0.05; - - self.buttonpressed_ads = 0; - } -} - -remove_ignore_attacker() -{ - self notify( "new_ignore_attacker" ); - self endon( "new_ignore_attacker" ); - self endon( "disconnect" ); - - if ( !isdefined( level.ignore_enemy_timer ) ) - level.ignore_enemy_timer = 0.4; - - wait( level.ignore_enemy_timer ); - self.ignoreattacker = undefined; -} - -player_shield_facing_attacker( vdir, limit ) -{ - orientation = self getplayerangles(); - forwardvec = anglestoforward( orientation ); - forwardvec2d = ( forwardvec[0], forwardvec[1], 0 ); - unitforwardvec2d = vectornormalize( forwardvec2d ); - tofaceevec = vdir * -1; - tofaceevec2d = ( tofaceevec[0], tofaceevec[1], 0 ); - unittofaceevec2d = vectornormalize( tofaceevec2d ); - dotproduct = vectordot( unitforwardvec2d, unittofaceevec2d ); - return dotproduct > limit; -} - -player_damage_override_cheat( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) -{ - player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - return 0; -} - -player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) -{ - if ( isdefined( level._game_module_player_damage_callback ) ) - self [[ level._game_module_player_damage_callback ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - - idamage = self check_player_damage_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - - if ( isdefined( self.use_adjusted_grenade_damage ) && self.use_adjusted_grenade_damage ) - { - self.use_adjusted_grenade_damage = undefined; - - if ( self.health > idamage ) - return idamage; - } - - if ( !idamage ) - return 0; - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - return 0; - - if ( isdefined( einflictor ) ) - { - if ( isdefined( einflictor.water_damage ) && einflictor.water_damage ) - return 0; - } - - if ( isdefined( eattacker ) && ( isdefined( eattacker.is_zombie ) && eattacker.is_zombie || isplayer( eattacker ) ) ) - { - if ( isdefined( self.hasriotshield ) && self.hasriotshield && isdefined( vdir ) ) - { - if ( isdefined( self.hasriotshieldequipped ) && self.hasriotshieldequipped ) - { - if ( self player_shield_facing_attacker( vdir, 0.2 ) && isdefined( self.player_shield_apply_damage ) ) - { - self [[ self.player_shield_apply_damage ]]( 100, 0 ); - return 0; - } - } - else if ( !isdefined( self.riotshieldentity ) ) - { - if ( !self player_shield_facing_attacker( vdir, -0.2 ) && isdefined( self.player_shield_apply_damage ) ) - { - self [[ self.player_shield_apply_damage ]]( 100, 0 ); - return 0; - } - } - } - } - - if ( isdefined( eattacker ) ) - { - if ( isdefined( self.ignoreattacker ) && self.ignoreattacker == eattacker ) - return 0; - - if ( isdefined( self.is_zombie ) && self.is_zombie && ( isdefined( eattacker.is_zombie ) && eattacker.is_zombie ) ) - return 0; - - if ( isdefined( eattacker.is_zombie ) && eattacker.is_zombie ) - { - self.ignoreattacker = eattacker; - self thread remove_ignore_attacker(); - - if ( isdefined( eattacker.custom_damage_func ) ) - idamage = eattacker [[ eattacker.custom_damage_func ]]( self ); - else if ( isdefined( eattacker.meleedamage ) ) - idamage = eattacker.meleedamage; - else - idamage = 50; - } - - eattacker notify( "hit_player" ); - - if ( smeansofdeath != "MOD_FALLING" ) - { - self thread playswipesound( smeansofdeath, eattacker ); - - if ( isdefined( eattacker.is_zombie ) && eattacker.is_zombie || isplayer( eattacker ) ) - self playrumbleonentity( "damage_heavy" ); - - canexert = 1; - - if ( isdefined( level.pers_upgrade_flopper ) && level.pers_upgrade_flopper ) - { - if ( isdefined( self.pers_upgrades_awarded["flopper"] ) && self.pers_upgrades_awarded["flopper"] ) - canexert = smeansofdeath != "MOD_PROJECTILE_SPLASH" && smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_GRENADE_SPLASH"; - } - - if ( isdefined( canexert ) && canexert ) - { - if ( randomintrange( 0, 1 ) == 0 ) - self thread maps\mp\zombies\_zm_audio::playerexert( "hitmed" ); - else - self thread maps\mp\zombies\_zm_audio::playerexert( "hitlrg" ); - } - } - } - - finaldamage = idamage; - - if ( is_placeable_mine( sweapon ) || sweapon == "freezegun_zm" || sweapon == "freezegun_upgraded_zm" ) - return 0; - - if ( isdefined( self.player_damage_override ) ) - self thread [[ self.player_damage_override ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - - if ( smeansofdeath == "MOD_FALLING" ) - { - if ( self hasperk( "specialty_flakjacket" ) && isdefined( self.divetoprone ) && self.divetoprone == 1 ) - { - if ( isdefined( level.zombiemode_divetonuke_perk_func ) ) - [[ level.zombiemode_divetonuke_perk_func ]]( self, self.origin ); - - return 0; - } - - if ( isdefined( level.pers_upgrade_flopper ) && level.pers_upgrade_flopper ) - { - if ( self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_flopper_damage_check( smeansofdeath, idamage ) ) - return 0; - } - } - - if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" ) - { - if ( self hasperk( "specialty_flakjacket" ) ) - return 0; - - if ( isdefined( level.pers_upgrade_flopper ) && level.pers_upgrade_flopper ) - { - if ( isdefined( self.pers_upgrades_awarded["flopper"] ) && self.pers_upgrades_awarded["flopper"] ) - return 0; - } - - if ( self.health > 75 && !( isdefined( self.is_zombie ) && self.is_zombie ) ) - return 75; - } - - if ( idamage < self.health ) - { - if ( isdefined( eattacker ) ) - { - if ( isdefined( level.custom_kill_damaged_vo ) ) - eattacker thread [[ level.custom_kill_damaged_vo ]]( self ); - else - eattacker.sound_damage_player = self; - - if ( isdefined( eattacker.has_legs ) && !eattacker.has_legs ) - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "crawl_hit" ); - else if ( isdefined( eattacker.animname ) && eattacker.animname == "monkey_zombie" ) - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "monkey_hit" ); - } - - return finaldamage; - } - - if ( isdefined( eattacker ) ) - { - if ( isdefined( eattacker.animname ) && eattacker.animname == "zombie_dog" ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "killed_by_zdog" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "killed_by_zdog" ); - } - else if ( isdefined( eattacker.is_avogadro ) && eattacker.is_avogadro ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "killed_by_avogadro", 0 ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "killed_by_avogadro" ); - } - } - - self thread clear_path_timers(); - - if ( level.intermission ) - level waittill( "forever" ); - - if ( level.scr_zm_ui_gametype == "zcleansed" && idamage > 0 ) - { - if ( isdefined( eattacker ) && isplayer( eattacker ) && eattacker.team != self.team && ( !( isdefined( self.laststand ) && self.laststand ) && !self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || !isdefined( self.last_player_attacker ) ) ) - { - if ( isdefined( eattacker.maxhealth ) && ( isdefined( eattacker.is_zombie ) && eattacker.is_zombie ) ) - eattacker.health = eattacker.maxhealth; - - if ( isdefined( level.player_kills_player ) ) - self thread [[ level.player_kills_player ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - } - } - - if ( self.lives > 0 && self hasperk( "specialty_finalstand" ) ) - { - self.lives--; - - if ( isdefined( level.chugabud_laststand_func ) ) - { - self thread [[ level.chugabud_laststand_func ]](); - return 0; - } - } - - players = get_players(); - count = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] == self || players[i].is_zombie || players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator" ) - count++; - } - - if ( count < players.size || isdefined( level._game_module_game_end_check ) && ![[ level._game_module_game_end_check ]]() ) - { - if ( isdefined( self.lives ) && self.lives > 0 && ( isdefined( level.force_solo_quick_revive ) && level.force_solo_quick_revive ) && self hasperk( "specialty_quickrevive" ) ) - self thread wait_and_revive(); - - return finaldamage; - } - - if ( players.size == 1 && flag( "solo_game" ) ) - { - if ( self.lives == 0 || !self hasperk( "specialty_quickrevive" ) ) - self.intermission = 1; - } - - solo_death = players.size == 1 && flag( "solo_game" ) && ( self.lives == 0 || !self hasperk( "specialty_quickrevive" ) ); - non_solo_death = count > 1 || players.size == 1 && !flag( "solo_game" ); - - if ( ( solo_death || non_solo_death ) && !( isdefined( level.no_end_game_check ) && level.no_end_game_check ) ) - { - level notify( "stop_suicide_trigger" ); - self thread maps\mp\zombies\_zm_laststand::playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ); - - if ( !isdefined( vdir ) ) - vdir = ( 1, 0, 0 ); - - self fakedamagefrom( vdir ); - - if ( isdefined( level.custom_player_fake_death ) ) - self thread [[ level.custom_player_fake_death ]]( vdir, smeansofdeath ); - else - self thread player_fake_death(); - } - - if ( count == players.size && !( isdefined( level.no_end_game_check ) && level.no_end_game_check ) ) - { - if ( players.size == 1 && flag( "solo_game" ) ) - { - if ( self.lives == 0 || !self hasperk( "specialty_quickrevive" ) ) - { - self.lives = 0; - level notify( "pre_end_game" ); - wait_network_frame(); - - if ( flag( "dog_round" ) ) - increment_dog_round_stat( "lost" ); - - level notify( "end_game" ); - } - else - return finaldamage; - } - else - { - level notify( "pre_end_game" ); - wait_network_frame(); - - if ( flag( "dog_round" ) ) - increment_dog_round_stat( "lost" ); - - level notify( "end_game" ); - } - - return 0; - } - else - { - surface = "flesh"; - return finaldamage; - } -} - -clear_path_timers() -{ - zombies = getaiarray( level.zombie_team ); - - foreach ( zombie in zombies ) - { - if ( isdefined( zombie.favoriteenemy ) && zombie.favoriteenemy == self ) - zombie.zombie_path_timer = 0; - } -} - -check_player_damage_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) -{ - if ( !isdefined( level.player_damage_callbacks ) ) - return idamage; - - for ( i = 0; i < level.player_damage_callbacks.size; i++ ) - { - newdamage = self [[ level.player_damage_callbacks[i] ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); - - if ( -1 != newdamage ) - return newdamage; - } - - return idamage; -} - -register_player_damage_callback( func ) -{ - if ( !isdefined( level.player_damage_callbacks ) ) - level.player_damage_callbacks = []; - - level.player_damage_callbacks[level.player_damage_callbacks.size] = func; -} - -wait_and_revive() -{ - flag_set( "wait_and_revive" ); - - if ( isdefined( self.waiting_to_revive ) && self.waiting_to_revive == 1 ) - return; - - if ( isdefined( self.pers_upgrades_awarded["perk_lose"] ) && self.pers_upgrades_awarded["perk_lose"] ) - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_save(); - - self.waiting_to_revive = 1; - - if ( isdefined( level.exit_level_func ) ) - self thread [[ level.exit_level_func ]](); - else if ( get_players().size == 1 ) - self thread default_exit_level(); - - solo_revive_time = 10.0; - self.revive_hud settext( &"ZOMBIE_REVIVING_SOLO", self ); - self maps\mp\zombies\_zm_laststand::revive_hud_show_n_fade( solo_revive_time ); - flag_wait_or_timeout( "instant_revive", solo_revive_time ); - - if ( flag( "instant_revive" ) ) - self maps\mp\zombies\_zm_laststand::revive_hud_show_n_fade( 1.0 ); - - flag_clear( "wait_and_revive" ); - self maps\mp\zombies\_zm_laststand::auto_revive( self ); - self.lives--; - self.waiting_to_revive = 0; - - if ( isdefined( self.pers_upgrades_awarded["perk_lose"] ) && self.pers_upgrades_awarded["perk_lose"] ) - self thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_restore(); -} - -actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) -{ - if ( !isdefined( self ) || !isdefined( attacker ) ) - return damage; - - if ( weapon == "tazer_knuckles_zm" || weapon == "jetgun_zm" ) - self.knuckles_extinguish_flames = 1; - else if ( weapon != "none" ) - self.knuckles_extinguish_flames = undefined; - - if ( isdefined( attacker.animname ) && attacker.animname == "quad_zombie" ) - { - if ( isdefined( self.animname ) && self.animname == "quad_zombie" ) - return 0; - } - - if ( !isplayer( attacker ) && isdefined( self.non_attacker_func ) ) - { - if ( isdefined( self.non_attack_func_takes_attacker ) && self.non_attack_func_takes_attacker ) - return self [[ self.non_attacker_func ]]( damage, weapon, attacker ); - else - return self [[ self.non_attacker_func ]]( damage, weapon ); - } - - if ( !isplayer( attacker ) && !isplayer( self ) ) - return damage; - - if ( !isdefined( damage ) || !isdefined( meansofdeath ) ) - return damage; - - if ( meansofdeath == "" ) - return damage; - - old_damage = damage; - final_damage = damage; - - if ( isdefined( self.actor_damage_func ) ) - final_damage = [[ self.actor_damage_func ]]( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); -/# - if ( getdvarint( _hash_5ABA6445 ) ) - println( "Perk/> Damage Factor: " + final_damage / old_damage + " - Pre Damage: " + old_damage + " - Post Damage: " + final_damage ); -#/ - if ( attacker.classname == "script_vehicle" && isdefined( attacker.owner ) ) - attacker = attacker.owner; - - if ( isdefined( self.in_water ) && self.in_water ) - { - if ( int( final_damage ) >= self.health ) - self.water_damage = 1; - } - - attacker thread maps\mp\gametypes_zm\_weapons::checkhit( weapon ); - - if ( attacker maps\mp\zombies\_zm_pers_upgrades_functions::pers_mulit_kill_headshot_active() && is_headshot( weapon, shitloc, meansofdeath ) ) - final_damage *= 2; - - if ( isdefined( level.headshots_only ) && level.headshots_only && isdefined( attacker ) && isplayer( attacker ) ) - { - if ( meansofdeath == "MOD_MELEE" && ( shitloc == "head" || shitloc == "helmet" ) ) - return int( final_damage ); - - if ( is_explosive_damage( meansofdeath ) ) - return int( final_damage ); - else if ( !is_headshot( weapon, shitloc, meansofdeath ) ) - return 0; - } - - return int( final_damage ); -} - -actor_damage_override_wrapper( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) -{ - damage_override = self actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); - - if ( damage_override < self.health || !( isdefined( self.dont_die_on_me ) && self.dont_die_on_me ) ) - self finishactordamage( inflictor, attacker, damage_override, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); -} - -actor_killed_override( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ) -{ - if ( game["state"] == "postgame" ) - return; - - if ( isai( attacker ) && isdefined( attacker.script_owner ) ) - { - if ( attacker.script_owner.team != self.aiteam ) - attacker = attacker.script_owner; - } - - if ( attacker.classname == "script_vehicle" && isdefined( attacker.owner ) ) - attacker = attacker.owner; - - if ( isdefined( attacker ) && isplayer( attacker ) ) - { - multiplier = 1; - - if ( is_headshot( sweapon, shitloc, smeansofdeath ) ) - multiplier = 1.5; - - type = undefined; - - if ( isdefined( self.animname ) ) - { - switch ( self.animname ) - { - case "quad_zombie": - type = "quadkill"; - break; - case "ape_zombie": - type = "apekill"; - break; - case "zombie": - type = "zombiekill"; - break; - case "zombie_dog": - type = "dogkill"; - break; - } - } - } - - if ( isdefined( self.is_ziplining ) && self.is_ziplining ) - self.deathanim = undefined; - - if ( isdefined( self.actor_killed_override ) ) - self [[ self.actor_killed_override ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ); -} - -round_end_monitor() -{ - while ( true ) - { - level waittill( "end_of_round" ); - - maps\mp\_demo::bookmark( "zm_round_end", gettime(), undefined, undefined, 1 ); - bbpostdemostreamstatsforround( level.round_number ); - wait 0.05; - } -} - -end_game() -{ - level waittill( "end_game" ); - - check_end_game_intermission_delay(); -/# - println( "end_game TRIGGERED " ); -#/ - clientnotify( "zesn" ); - - if ( isdefined( level.sndgameovermusicoverride ) ) - level thread maps\mp\zombies\_zm_audio::change_zombie_music( level.sndgameovermusicoverride ); - else - level thread maps\mp\zombies\_zm_audio::change_zombie_music( "game_over" ); - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - setclientsysstate( "lsm", "0", players[i] ); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] player_is_in_laststand() ) - { - players[i] recordplayerdeathzombies(); - players[i] maps\mp\zombies\_zm_stats::increment_player_stat( "deaths" ); - players[i] maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); - players[i] maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); - } - - if ( isdefined( players[i].revivetexthud ) ) - players[i].revivetexthud destroy(); - } - - stopallrumbles(); - level.intermission = 1; - level.zombie_vars["zombie_powerup_insta_kill_time"] = 0; - level.zombie_vars["zombie_powerup_fire_sale_time"] = 0; - level.zombie_vars["zombie_powerup_point_doubler_time"] = 0; - wait 0.1; - game_over = []; - survived = []; - players = get_players(); - setmatchflag( "disableIngameMenu", 1 ); - - foreach ( player in players ) - { - player closemenu(); - player closeingamemenu(); - } - - if ( !isdefined( level._supress_survived_screen ) ) - { - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( level.custom_game_over_hud_elem ) ) - game_over[i] = [[ level.custom_game_over_hud_elem ]]( players[i] ); - else - { - game_over[i] = newclienthudelem( players[i] ); - game_over[i].alignx = "center"; - game_over[i].aligny = "middle"; - game_over[i].horzalign = "center"; - game_over[i].vertalign = "middle"; - game_over[i].y -= 130; - game_over[i].foreground = 1; - game_over[i].fontscale = 3; - game_over[i].alpha = 0; - game_over[i].color = ( 1, 1, 1 ); - game_over[i].hidewheninmenu = 1; - game_over[i] settext( &"ZOMBIE_GAME_OVER" ); - game_over[i] fadeovertime( 1 ); - game_over[i].alpha = 1; - - if ( players[i] issplitscreen() ) - { - game_over[i].fontscale = 2; - game_over[i].y += 40; - } - } - - survived[i] = newclienthudelem( players[i] ); - survived[i].alignx = "center"; - survived[i].aligny = "middle"; - survived[i].horzalign = "center"; - survived[i].vertalign = "middle"; - survived[i].y -= 100; - survived[i].foreground = 1; - survived[i].fontscale = 2; - survived[i].alpha = 0; - survived[i].color = ( 1, 1, 1 ); - survived[i].hidewheninmenu = 1; - - if ( players[i] issplitscreen() ) - { - survived[i].fontscale = 1.5; - survived[i].y += 40; - } - - if ( level.round_number < 2 ) - { - if ( level.script == "zombie_moon" ) - { - if ( !isdefined( level.left_nomans_land ) ) - { - nomanslandtime = level.nml_best_time; - player_survival_time = int( nomanslandtime / 1000 ); - player_survival_time_in_mins = maps\mp\zombies\_zm::to_mins( player_survival_time ); - survived[i] settext( &"ZOMBIE_SURVIVED_NOMANS", player_survival_time_in_mins ); - } - else if ( level.left_nomans_land == 2 ) - survived[i] settext( &"ZOMBIE_SURVIVED_ROUND" ); - } - else - survived[i] settext( &"ZOMBIE_SURVIVED_ROUND" ); - } - else - survived[i] settext( &"ZOMBIE_SURVIVED_ROUNDS", level.round_number ); - - survived[i] fadeovertime( 1 ); - survived[i].alpha = 1; - } - } - - if ( isdefined( level.custom_end_screen ) ) - level [[ level.custom_end_screen ]](); - - for ( i = 0; i < players.size; i++ ) - { - players[i] setclientammocounterhide( 1 ); - players[i] setclientminiscoreboardhide( 1 ); - } - - uploadstats(); - maps\mp\zombies\_zm_stats::update_players_stats_at_match_end( players ); - maps\mp\zombies\_zm_stats::update_global_counters_on_match_end(); - wait 1; - wait 3.95; - players = get_players(); - - foreach ( player in players ) - { - if ( isdefined( player.sessionstate ) && player.sessionstate == "spectator" ) - player.sessionstate = "playing"; - } - - wait 0.05; - players = get_players(); - - if ( !isdefined( level._supress_survived_screen ) ) - { - for ( i = 0; i < players.size; i++ ) - { - survived[i] destroy(); - game_over[i] destroy(); - } - } - else - { - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( players[i].survived_hud ) ) - players[i].survived_hud destroy(); - - if ( isdefined( players[i].game_over_hud ) ) - players[i].game_over_hud destroy(); - } - } - - intermission(); - wait( level.zombie_vars["zombie_intermission_time"] ); - level notify( "stop_intermission" ); - array_thread( get_players(), ::player_exit_level ); - bbprint( "zombie_epilogs", "rounds %d", level.round_number ); - wait 1.5; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] cameraactivate( 0 ); - - exitlevel( 0 ); - wait 666; -} - -disable_end_game_intermission( delay ) -{ - level.disable_intermission = 1; - wait( delay ); - level.disable_intermission = undefined; -} - -check_end_game_intermission_delay() -{ - if ( isdefined( level.disable_intermission ) ) - { - while ( true ) - { - if ( !isdefined( level.disable_intermission ) ) - break; - - wait 0.01; - } - } -} - -upload_leaderboards() -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] uploadleaderboards(); -} - -initializestattracking() -{ - level.global_zombies_killed = 0; - level.zombies_timeout_spawn = 0; - level.zombies_timeout_playspace = 0; - level.zombies_timeout_undamaged = 0; - level.zombie_player_killed_count = 0; - level.zombie_trap_killed_count = 0; - level.zombie_pathing_failed = 0; - level.zombie_breadcrumb_failed = 0; -} - -uploadglobalstatcounters() -{ - incrementcounter( "global_zombies_killed", level.global_zombies_killed ); - incrementcounter( "global_zombies_killed_by_players", level.zombie_player_killed_count ); - incrementcounter( "global_zombies_killed_by_traps", level.zombie_trap_killed_count ); -} - -player_fake_death() -{ - 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 1; - self freezecontrols( 1 ); -} - -player_exit_level() -{ - self allowstand( 1 ); - self allowcrouch( 0 ); - self allowprone( 0 ); - - if ( isdefined( self.game_over_bg ) ) - { - self.game_over_bg.foreground = 1; - self.game_over_bg.sort = 100; - self.game_over_bg fadeovertime( 1 ); - self.game_over_bg.alpha = 1; - } -} - -player_killed_override( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) -{ - level waittill( "forever" ); -} - -player_zombie_breadcrumb() -{ - self notify( "stop_player_zombie_breadcrumb" ); - self endon( "stop_player_zombie_breadcrumb" ); - self endon( "disconnect" ); - self endon( "spawned_spectator" ); - level endon( "intermission" ); - self.zombie_breadcrumbs = []; - self.zombie_breadcrumb_distance = 576; - self.zombie_breadcrumb_area_num = 3; - self.zombie_breadcrumb_area_distance = 16; - self store_crumb( self.origin ); - last_crumb = self.origin; - self thread debug_breadcrumbs(); - - while ( true ) - { - wait_time = 0.1; - - if ( self.ignoreme ) - { - wait( wait_time ); - continue; - } - - store_crumb = 1; - airborne = 0; - crumb = self.origin; - - if ( !self isonground() && self isinvehicle() ) - { - trace = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 10.0 ), self.origin, 0, undefined ); - crumb = trace["position"]; - } - - if ( !airborne && distancesquared( crumb, last_crumb ) < self.zombie_breadcrumb_distance ) - store_crumb = 0; - - if ( airborne && self isonground() ) - { - store_crumb = 1; - airborne = 0; - } - - if ( isdefined( level.custom_breadcrumb_store_func ) ) - store_crumb = self [[ level.custom_breadcrumb_store_func ]]( store_crumb ); - - if ( isdefined( level.custom_airborne_func ) ) - airborne = self [[ level.custom_airborne_func ]]( airborne ); - - if ( store_crumb ) - { - debug_print( "Player is storing breadcrumb " + crumb ); - - if ( isdefined( self.node ) ) - debug_print( "has closest node " ); - - last_crumb = crumb; - self store_crumb( crumb ); - } - - wait( wait_time ); - } -} - -store_crumb( origin ) -{ - offsets = []; - height_offset = 32; - index = 0; - - for ( j = 1; j <= self.zombie_breadcrumb_area_num; j++ ) - { - offset = j * self.zombie_breadcrumb_area_distance; - offsets[0] = ( origin[0] - offset, origin[1], origin[2] ); - offsets[1] = ( origin[0] + offset, origin[1], origin[2] ); - offsets[2] = ( origin[0], origin[1] - offset, origin[2] ); - offsets[3] = ( origin[0], origin[1] + offset, origin[2] ); - offsets[4] = ( origin[0] - offset, origin[1], origin[2] + height_offset ); - offsets[5] = ( origin[0] + offset, origin[1], origin[2] + height_offset ); - offsets[6] = ( origin[0], origin[1] - offset, origin[2] + height_offset ); - offsets[7] = ( origin[0], origin[1] + offset, origin[2] + height_offset ); - - for ( i = 0; i < offsets.size; i++ ) - { - self.zombie_breadcrumbs[index] = offsets[i]; - index++; - } - } -} - -to_mins( seconds ) -{ - hours = 0; - minutes = 0; - - if ( seconds > 59 ) - { - minutes = int( seconds / 60 ); - seconds = int( seconds * 1000 ) % 60000; - seconds *= 0.001; - - if ( minutes > 59 ) - { - hours = int( minutes / 60 ); - minutes = int( minutes * 1000 ) % 60000; - minutes *= 0.001; - } - } - - if ( hours < 10 ) - hours = "0" + hours; - - if ( minutes < 10 ) - minutes = "0" + minutes; - - seconds = int( seconds ); - - if ( seconds < 10 ) - seconds = "0" + seconds; - - combined = "" + hours + ":" + minutes + ":" + seconds; - return combined; -} - -intermission() -{ - level.intermission = 1; - level notify( "intermission" ); - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - setclientsysstate( "levelNotify", "zi", players[i] ); - players[i] setclientthirdperson( 0 ); - players[i] resetfov(); - players[i].health = 100; - players[i] thread [[ level.custom_intermission ]](); - players[i] stopsounds(); - } - - wait 0.25; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - setclientsysstate( "lsm", "0", players[i] ); - - level thread zombie_game_over_death(); -} - -zombie_game_over_death() -{ - zombies = getaiarray( level.zombie_team ); - - for ( i = 0; i < zombies.size; i++ ) - { - if ( !isalive( zombies[i] ) ) - continue; - - zombies[i] setgoalpos( zombies[i].origin ); - } - - for ( i = 0; i < zombies.size; i++ ) - { - if ( !isalive( zombies[i] ) ) - continue; - - if ( isdefined( zombies[i].ignore_game_over_death ) && zombies[i].ignore_game_over_death ) - continue; - - wait( 0.5 + randomfloat( 2 ) ); - - if ( isdefined( zombies[i] ) ) - { - zombies[i] maps\mp\zombies\_zm_spawner::zombie_head_gib(); - zombies[i] dodamage( zombies[i].health + 666, zombies[i].origin ); - } - } -} - -player_intermission() -{ - self closemenu(); - self closeingamemenu(); - level endon( "stop_intermission" ); - self endon( "disconnect" ); - self endon( "death" ); - self notify( "_zombie_game_over" ); - self.score = self.score_total; - self.sessionstate = "intermission"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.friendlydamage = undefined; - points = getstructarray( "intermission", "targetname" ); - - if ( !isdefined( points ) || points.size == 0 ) - { - points = getentarray( "info_intermission", "classname" ); - - if ( points.size < 1 ) - { -/# - println( "NO info_intermission POINTS IN MAP" ); -#/ - return; - } - } - - self.game_over_bg = newclienthudelem( self ); - self.game_over_bg.horzalign = "fullscreen"; - self.game_over_bg.vertalign = "fullscreen"; - self.game_over_bg setshader( "black", 640, 480 ); - self.game_over_bg.alpha = 1; - org = undefined; - - while ( true ) - { - points = array_randomize( points ); - - for ( i = 0; i < points.size; i++ ) - { - point = points[i]; - - if ( !isdefined( org ) ) - self spawn( point.origin, point.angles ); - - if ( isdefined( points[i].target ) ) - { - if ( !isdefined( org ) ) - { - org = spawn( "script_model", self.origin + vectorscale( ( 0, 0, -1 ), 60.0 ) ); - org setmodel( "tag_origin" ); - } - - org.origin = points[i].origin; - org.angles = points[i].angles; - - for ( j = 0; j < get_players().size; j++ ) - { - player = get_players()[j]; - player camerasetposition( org ); - player camerasetlookat(); - player cameraactivate( 1 ); - } - - speed = 20; - - if ( isdefined( points[i].speed ) ) - speed = points[i].speed; - - target_point = getstruct( points[i].target, "targetname" ); - dist = distance( points[i].origin, target_point.origin ); - time = dist / speed; - q_time = time * 0.25; - - if ( q_time > 1 ) - q_time = 1; - - self.game_over_bg fadeovertime( q_time ); - self.game_over_bg.alpha = 0; - org moveto( target_point.origin, time, q_time, q_time ); - org rotateto( target_point.angles, time, q_time, q_time ); - wait( time - q_time ); - self.game_over_bg fadeovertime( q_time ); - self.game_over_bg.alpha = 1; - wait( q_time ); - continue; - } - - self.game_over_bg fadeovertime( 1 ); - self.game_over_bg.alpha = 0; - wait 5; - self.game_over_bg thread fade_up_over_time( 1 ); - } - } -} - -fade_up_over_time( t ) -{ - self fadeovertime( t ); - self.alpha = 1; -} - -default_exit_level() -{ - zombies = getaiarray( level.zombie_team ); - - for ( i = 0; i < zombies.size; i++ ) - { - if ( isdefined( zombies[i].ignore_solo_last_stand ) && zombies[i].ignore_solo_last_stand ) - continue; - - if ( isdefined( zombies[i].find_exit_point ) ) - { - zombies[i] thread [[ zombies[i].find_exit_point ]](); - continue; - } - - if ( zombies[i].ignoreme ) - { - zombies[i] thread default_delayed_exit(); - continue; - } - - zombies[i] thread default_find_exit_point(); - } -} - -default_delayed_exit() -{ - self endon( "death" ); - - while ( true ) - { - if ( !flag( "wait_and_revive" ) ) - return; - - if ( !self.ignoreme ) - break; - - wait 0.1; - } - - self thread default_find_exit_point(); -} - -default_find_exit_point() -{ - self endon( "death" ); - player = get_players()[0]; - dist_zombie = 0; - dist_player = 0; - dest = 0; - away = vectornormalize( self.origin - player.origin ); - endpos = self.origin + vectorscale( away, 600 ); - locs = array_randomize( level.enemy_dog_locations ); - - for ( i = 0; i < locs.size; i++ ) - { - dist_zombie = distancesquared( locs[i].origin, endpos ); - dist_player = distancesquared( locs[i].origin, player.origin ); - - if ( dist_zombie < dist_player ) - { - dest = i; - break; - } - } - - self notify( "stop_find_flesh" ); - self notify( "zombie_acquire_enemy" ); - - if ( isdefined( locs[dest] ) ) - self setgoalpos( locs[dest].origin ); - - while ( true ) - { - b_passed_override = 1; - - if ( isdefined( level.default_find_exit_position_override ) ) - b_passed_override = [[ level.default_find_exit_position_override ]](); - - if ( !flag( "wait_and_revive" ) && b_passed_override ) - break; - - wait 0.1; - } - - self thread maps\mp\zombies\_zm_ai_basic::find_flesh(); -} - -play_level_start_vox_delayed() -{ - wait 3; - players = get_players(); - num = randomintrange( 0, players.size ); - players[num] maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "intro" ); -} - -register_sidequest( id, sidequest_stat ) -{ - if ( !isdefined( level.zombie_sidequest_stat ) ) - { - level.zombie_sidequest_previously_completed = []; - level.zombie_sidequest_stat = []; - } - - level.zombie_sidequest_stat[id] = sidequest_stat; - flag_wait( "start_zombie_round_logic" ); - level.zombie_sidequest_previously_completed[id] = 0; - - if ( level.systemlink || getdvarint( "splitscreen_playerCount" ) == get_players().size ) - return; - - if ( isdefined( level.zm_disable_recording_stats ) && level.zm_disable_recording_stats ) - return; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] maps\mp\zombies\_zm_stats::get_global_stat( level.zombie_sidequest_stat[id] ) ) - { - level.zombie_sidequest_previously_completed[id] = 1; - return; - } - } -} - -is_sidequest_previously_completed( id ) -{ - return isdefined( level.zombie_sidequest_previously_completed[id] ) && level.zombie_sidequest_previously_completed[id]; -} - -set_sidequest_completed( id ) -{ - level notify( "zombie_sidequest_completed", id ); - level.zombie_sidequest_previously_completed[id] = 1; - - if ( level.systemlink ) - return; - - if ( getdvarint( "splitscreen_playerCount" ) == get_players().size ) - return; - - if ( isdefined( level.zm_disable_recording_stats ) && level.zm_disable_recording_stats ) - return; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( level.zombie_sidequest_stat[id] ) ) - players[i] maps\mp\zombies\_zm_stats::add_global_stat( level.zombie_sidequest_stat[id], 1 ); - } +#include common_scripts/utility; +#include maps/mp/_demo; +#include maps/mp/_utility; +#include maps/mp/_visionset_mgr; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_ai_basic; +#include maps/mp/zombies/_zm_ai_dogs; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_audio_announcer; +#include maps/mp/zombies/_zm_blockers; +#include maps/mp/zombies/_zm_bot; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zombies/_zm_clone; +#include maps/mp/zombies/_zm_devgui; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_ffotd; +#include maps/mp/zombies/_zm_game_module; +#include maps/mp/zombies/_zm_gump; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zombies/_zm_melee_weapon; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_pers_upgrades; +#include maps/mp/zombies/_zm_pers_upgrades_system; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_playerhealth; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_power; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_sidequests; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_timer; +#include maps/mp/zombies/_zm_tombstone; +#include maps/mp/zombies/_zm_traps; +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_zonemgr; + +init() //checked matches cerberus output +{ + //notes + /* + since for loops with continues cause infinite loops for some unknown reason + all for loops with continues are changed to while loops + the functionality is the same but i wish i could use for loops instead since + it looks cleaner + */ + //begin debug code + level.custom_zm_loaded = 1; + maps/mp/zombies/_zm_bot::init(); + if ( !isDefined( level.debugLogging_zm ) ) + { + level.debugLogging_zm = 0; + } + if ( !isDefined( level.disable_blackscreen_clientfield ) ) + { + level.disable_blackscreen_clientfield = 0; + } + if ( !isDefined( level._no_equipment_activated_clientfield ) ) + { + level._no_equipment_activated_clientfield = 0; + } + if ( !isDefined( level._no_navcards ) ) + { + level._no_navcards = 0; + } + if ( !isDefined( level.use_clientside_board_fx ) ) + { + level.use_clientside_board_fx = 1; + } + if ( !isDefined( level.disable_deadshot_clientfield ) ) + { + level.disable_deadshot_clientfield = 0; //needs to be 0 even if the map doesn't have the perk + } + if ( !isDefined( level.use_clientside_rock_tearin_fx ) ) + { + level.use_clientside_rock_tearin_fx = 1; + } + if ( !isDefined( level.no_end_game_check ) ) + { + level.no_end_game_check = 0; + } + if ( !isDefined( level.noroundnumber ) ) + { + level.noroundnumber = 0; + } + if ( !isDefined( level.host_ended_game ) ) + { + level.host_ended_game = 0; + } + if ( !isDefined( level.zm_disable_recording_stats ) ) + { + level.zm_disable_recording_stats = 0; + } + //end debug code + level.player_out_of_playable_area_monitor = 1; + level.player_too_many_weapons_monitor = 1; + level.player_too_many_weapons_monitor_func = ::player_too_many_weapons_monitor; + level.player_too_many_players_check = 0; + level.player_too_many_players_check_func = ::player_too_many_players_check; + level._use_choke_weapon_hints = 1; + level._use_choke_blockers = 1; + level.passed_introscreen = 0; + if ( !isDefined( level.custom_ai_type ) ) + { + level.custom_ai_type = []; + } + level.custom_ai_spawn_check_funcs = []; + level.spawn_funcs = []; + level.spawn_funcs[ "allies" ] = []; + level.spawn_funcs[ "axis" ] = []; + level.spawn_funcs[ "team3" ] = []; + level thread maps/mp/zombies/_zm_ffotd::main_start(); + level.zombiemode = 1; + level.revivefeature = 0; + level.swimmingfeature = 0; + level.calc_closest_player_using_paths = 0; + level.zombie_melee_in_water = 1; + level.put_timed_out_zombies_back_in_queue = 1; + level.use_alternate_poi_positioning = 1; + level.zmb_laugh_alias = "zmb_laugh_richtofen"; + level.sndannouncerisrich = 1; + level.scr_zm_ui_gametype = getDvar( "ui_gametype" ); + level.scr_zm_ui_gametype_group = getDvar( "ui_zm_gamemodegroup" ); + level.scr_zm_map_start_location = getDvar( "ui_zm_mapstartlocation" ); + level.curr_gametype_affects_rank = 0; + gametype = tolower( getDvar( "g_gametype" ) ); + if ( gametype == "zclassic" || gametype == "zstandard" ) + { + level.curr_gametype_affects_rank = 1; + } + level.grenade_multiattack_bookmark_count = 1; + level.rampage_bookmark_kill_times_count = 3; + level.rampage_bookmark_kill_times_msec = 6000; + level.rampage_bookmark_kill_times_delay = 6000; + level thread watch_rampage_bookmark(); + + //taken from the beta dump _zm + level.GAME_MODULE_CLASSIC_INDEX = 0; + maps\mp\zombies\_zm_game_module::register_game_module(level.GAME_MODULE_CLASSIC_INDEX,"classic",undefined,undefined); + maps\mp\zombies\_zm_game_module::set_current_game_module(level.scr_zm_game_module); + + if ( !isDefined( level._zombies_round_spawn_failsafe ) ) + { + level._zombies_round_spawn_failsafe = ::round_spawn_failsafe; + } + level.zombie_visionset = "zombie_neutral"; + if ( getDvar( "anim_intro" ) == "1" ) + { + level.zombie_anim_intro = 1; + } + else + { + level.zombie_anim_intro = 0; + } + precache_shaders(); + precache_models(); + precacherumble( "explosion_generic" ); + precacherumble( "dtp_rumble" ); + precacherumble( "slide_rumble" ); + precache_zombie_leaderboards(); + level._zombie_gib_piece_index_all = 0; + level._zombie_gib_piece_index_right_arm = 1; + level._zombie_gib_piece_index_left_arm = 2; + level._zombie_gib_piece_index_right_leg = 3; + level._zombie_gib_piece_index_left_leg = 4; + level._zombie_gib_piece_index_head = 5; + level._zombie_gib_piece_index_guts = 6; + level._zombie_gib_piece_index_hat = 7; + if ( !isDefined( level.zombie_ai_limit ) ) + { + level.zombie_ai_limit = 24; + } + if ( !isDefined( level.zombie_actor_limit ) ) + { + level.zombie_actor_limit = 31; + } + maps/mp/_visionset_mgr::init(); + init_dvars(); + init_strings(); + init_levelvars(); + init_sounds(); + init_shellshocks(); + init_flags(); + init_client_flags(); + registerclientfield( "world", "zombie_power_on", 1, 1, "int" ); + if ( !is_true( level._no_navcards ) ) + { + if ( level.scr_zm_ui_gametype_group == "zclassic" && !level.createfx_enabled ) + { + registerclientfield( "allplayers", "navcard_held", 1, 4, "int" ); + level.navcards = []; + level.navcards[ 0 ] = "navcard_held_zm_transit"; + level.navcards[ 1 ] = "navcard_held_zm_highrise"; + level.navcards[ 2 ] = "navcard_held_zm_buried"; + level thread setup_player_navcard_hud(); + } + } + maps/mp/zombies/_zm_utility::register_offhand_weapons_for_level_defaults(); + level thread drive_client_connected_notifies(); + + maps/mp/zombies/_zm_zonemgr::init(); + maps/mp/zombies/_zm_unitrigger::init(); + maps/mp/zombies/_zm_audio::init(); + maps/mp/zombies/_zm_blockers::init(); + //maps/mp/zombies/_zm_bot::init(); + maps/mp/zombies/_zm_clone::init(); + maps/mp/zombies/_zm_buildables::init(); + maps/mp/zombies/_zm_equipment::init(); + maps/mp/zombies/_zm_laststand::init(); + maps/mp/zombies/_zm_magicbox::init(); + maps/mp/zombies/_zm_perks::init(); + + maps/mp/zombies/_zm_playerhealth::init(); + + maps/mp/zombies/_zm_power::init(); + maps/mp/zombies/_zm_powerups::init(); + maps/mp/zombies/_zm_score::init(); + maps/mp/zombies/_zm_spawner::init(); + maps/mp/zombies/_zm_gump::init(); + //maps/mp/zombies/_zm_timer::init(); + maps/mp/zombies/_zm_traps::init(); + maps/mp/zombies/_zm_weapons::init(); + init_function_overrides(); + level thread last_stand_pistol_rank_init(); + level thread maps/mp/zombies/_zm_tombstone::init(); + level thread post_all_players_connected(); + init_utility(); + maps/mp/_utility::registerclientsys( "lsm" ); + maps/mp/zombies/_zm_stats::init(); + initializestattracking(); + if ( get_players().size <= 1 ) + { + incrementcounter( "global_solo_games", 1 ); + } + /* + else if ( level.systemlink ) + { + incrementcounter( "global_systemlink_games", 1 ); + } + else if ( getDvarInt( "splitscreen_playerCount" ) == get_players().size ) + { + incrementcounter( "global_splitscreen_games", 1 ); + } + */ + else + { + incrementcounter( "global_coop_games", 1 ); + } + maps/mp/zombies/_zm_utility::onplayerconnect_callback( ::zm_on_player_connect ); + maps/mp/zombies/_zm_pers_upgrades::pers_upgrade_init(); + set_demo_intermission_point(); + level thread maps/mp/zombies/_zm_ffotd::main_end(); + level thread track_players_intersection_tracker(); + level thread onallplayersready(); + level thread startunitriggers(); + level thread maps/mp/gametypes_zm/_zm_gametype::post_init_gametype(); +} + +post_main() //checked matches cerberus output +{ + level thread init_custom_ai_type(); +} + +startunitriggers() //checked matches cerberus output +{ + flag_wait_any( "start_zombie_round_logic", "start_encounters_match_logic" ); + level thread maps/mp/zombies/_zm_unitrigger::main(); +} + +drive_client_connected_notifies() //checked matches cerberus output //matches cerberus csc output +{ + while ( 1 ) + { + level waittill( "connected", player ); + player reset_rampage_bookmark_kill_times(); + player callback( "on_player_connect" ); + } +} + +fade_out_intro_screen_zm( hold_black_time, fade_out_time, destroyed_afterwards ) //checked changed to match cerberus output +{ + if ( !isDefined( level.introscreen ) ) + { + level.introscreen = newhudelem(); + level.introscreen.x = 0; + level.introscreen.y = 0; + level.introscreen.horzalign = "fullscreen"; + level.introscreen.vertalign = "fullscreen"; + level.introscreen.foreground = 0; + level.introscreen setshader( "black", 640, 480 ); + level.introscreen.immunetodemogamehudsettings = 1; + level.introscreen.immunetodemofreecamera = 1; + wait 0.05; + } + level.introscreen.alpha = 1; + if ( isDefined( hold_black_time ) ) + { + wait hold_black_time; + } + else + { + wait 0.2; + } + if ( !isDefined( fade_out_time ) ) + { + fade_out_time = 1.5; + } + level.introscreen fadeovertime( fade_out_time ); + level.introscreen.alpha = 0; + wait 1.6; + level.passed_introscreen = 1; + players = get_players(); + i = 0; + while ( i < players.size ) + { + players[ i ] setclientuivisibilityflag( "hud_visible", 1 ); + if ( is_true( level.player_movement_suppressed ) ) + { + players[ i ] freezecontrols( level.player_movement_suppressed ); + i++; + continue; + } + else + { + players[ i ] freezecontrols( 0 ); + } + i++; + } + if ( destroyed_afterwards == 1 ) + { + level.introscreen destroy(); + } + flag_set( "initial_blackscreen_passed" ); +} + +onallplayersready() //checked changed to match cerberus output +{ + players = get_players(); + while ( players.size == 0 ) + { + players = get_players(); + wait 0.1; + } + player_count_actual = 0; + //fixed fast restart + while ( player_count_actual < players.size ) + { + players = get_players(); + player_count_actual = 0; + for ( i = 0; i < players.size; i++ ) + { + players[ i ] freezecontrols( 1 ); + if ( players[ i ].sessionstate == "playing" ) + { + player_count_actual++; + } + } + wait 0.1; + } + setinitialplayersconnected(); + players = get_players(); + if ( players.size == 1 && getDvarInt( "scr_zm_enable_bots" ) == 1 ) + { + level thread add_bots(); + flag_set( "initial_players_connected" ); + } + else + { + players = get_players(); + if ( players.size == 1 ) + { + flag_set( "solo_game" ); + level.solo_lives_given = 0; + foreach ( player in players ) + { + player.lives = 0; + } + level set_default_laststand_pistol( 1 ); + } + flag_set( "initial_players_connected" ); + while ( !aretexturesloaded() ) + { + wait 0.05; + } + thread start_zombie_logic_in_x_sec( 3 ); + } + fade_out_intro_screen_zm( 5, 1.5, 1 ); +} + +start_zombie_logic_in_x_sec( time_to_wait ) //checked matches cerberus output +{ + wait time_to_wait; + flag_set( "start_zombie_round_logic" ); +} + +getallotherplayers() //checked changed to match cerberus output +{ + aliveplayers = []; + i = 0; + players = getArrayKeys( level.players ); + while ( i < players.size ) + { + if ( !isDefined( players[ i ] ) ) + { + i++; + continue; + } + player = players[ i ]; + if ( player.sessionstate != "playing" || player == self ) + { + i++; + continue; + } + i++; + aliveplayers[ aliveplayers.size ] = player; + } + return aliveplayers; +} + +getfreespawnpoint( spawnpoints, player ) //checked changed to match cerberus output +{ + if ( !isDefined( spawnpoints ) ) + { + return undefined; + } + if ( !isDefined( game[ "spawns_randomized" ] ) ) + { + game[ "spawns_randomized" ] = 1; + spawnpoints = array_randomize( spawnpoints ); + random_chance = randomint( 100 ); + if ( random_chance > 50 ) + { + set_game_var( "side_selection", 1 ); + } + else + { + set_game_var( "side_selection", 2 ); + } + } + side_selection = get_game_var( "side_selection" ); + if ( get_game_var( "switchedsides" ) ) + { + if ( side_selection == 2 ) + { + side_selection = 1; + } + else + { + if ( side_selection == 1 ) + { + side_selection = 2; + } + } + } + if ( isdefined( player ) && isdefined( player.team ) ) + { + i = 0; + while ( isdefined( spawnpoints ) && i < spawnpoints.size ) + { + if ( side_selection == 1 ) + { + if ( player.team != "allies" && isdefined( spawnpoints[ i ].script_int ) && spawnpoints[ i ].script_int == 1 ) + { + arrayremovevalue( spawnpoints, spawnpoints[ i ] ); + i = 0; + } + else if ( player.team == "allies" && isdefined( spawnpoints[ i ].script_int) && spawnpoints[ i ].script_int == 2 ) + { + arrayremovevalue( spawnpoints, spawnpoints[ i ] ); + i = 0; + } + else + { + i++; + } + } + else //changed to be like beta dump + { + if ( player.team == "allies" && isdefined( spawnpoints[ i ].script_int ) && spawnpoints[ i ].script_int == 1 ) + { + arrayremovevalue(spawnpoints, spawnpoints[i]); + i = 0; + } + else if ( player.team != "allies" && isdefined( spawnpoints[ i ].script_int ) && spawnpoints[ i ].script_int == 2 ) + { + arrayremovevalue( spawnpoints, spawnpoints[ i ] ); + i = 0; + } + else + { + i++; + } + } + } + } + if ( !isdefined( self.playernum ) ) + { + if ( self.team == "allies" ) + { + self.playernum = get_game_var( "_team1_num" ); + set_game_var( "_team1_num", self.playernum + 1 ); + } + else + { + self.playernum = get_game_var( "_team2_num" ); + set_game_var( "_team2_num", self.playernum + 1 ); + } + } + for ( j = 0; j < spawnpoints.size; j++ ) + { + if ( !isdefined( spawnpoints[ j ].en_num ) ) + { + for ( m = 0; m < spawnpoints.size; m++ ) + { + spawnpoints[ m ].en_num = m; + } + } + else if ( spawnpoints[ j ].en_num == self.playernum ) + { + return spawnpoints[ j ]; + } + } + return spawnpoints[ 0 ]; +} + +delete_in_createfx() //checked changed to match cerberus output +{ + exterior_goals = getstructarray("exterior_goal", "targetname"); + for ( i = 0; i < exterior_goals.size; i++ ) + { + if ( !isdefined( exterior_goals[ i ].target ) ) + { + break; + } + targets = getentarray( exterior_goals[i].target, "targetname" ); + for ( j = 0; j < targets.size; j++ ) + { + targets[ j ] self_delete(); + } + } + if ( isdefined( level.level_createfx_callback_thread ) ) + { + level thread [[ level.level_createfx_callback_thread ]](); + } +} + +add_bots() //checked changed to match cerberus output +{ + host = gethostplayer(); + while ( !isDefined( host ) ) + { + wait 0.05; + host = gethostplayer(); + } + wait 4; + zbot_spawn(); + setdvar( "bot_AllowMovement", "1" ); + setdvar( "bot_PressAttackBtn", "1" ); + setdvar( "bot_PressMeleeBtn", "1" ); + while ( get_players().size < 2 ) + { + wait 0.05; + } + players = get_players(); + i = 0; + for ( i = 0; i < players.size; i++ ) + { + players[ i ] freezecontrols( 0 ); + } + level.numberbotsadded = 1; + flag_set( "start_zombie_round_logic" ); +} + +zbot_spawn() //checked matches cerberus output +{ + player = gethostplayer(); + spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); + spawnpoint = getfreespawnpoint( spawnpoints ); + bot = addtestclient(); + if ( !isDefined( bot ) ) + { + return; + } + bot.pers[ "isBot" ] = 1; + bot.equipment_enabled = 0; + yaw = spawnpoint.angles[ 1 ]; + bot thread zbot_spawn_think( spawnpoint.origin, yaw ); + return bot; +} + +zbot_spawn_think( origin, yaw ) //checked matches cerberus output +{ + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self setorigin( origin ); + angles = ( 0, yaw, 0 ); + self setplayerangles( angles ); + } +} + +post_all_players_connected() //checked matches cerberus output +{ + level thread end_game(); + flag_wait( "start_zombie_round_logic" ); + level thread clear_mature_blood(); + level thread round_end_monitor(); + if ( !level.zombie_anim_intro ) + { + if ( isDefined( level._round_start_func ) ) + { + level thread [[ level._round_start_func ]](); + } + } + level thread players_playing(); + disablegrenadesuicide(); + level.startinvulnerabletime = getDvarInt( "player_deathInvulnerableTime" ); + if ( !isDefined( level.music_override ) ) + { + level.music_override = 0; + } +} + +init_custom_ai_type() //checked changed to match cerberus output +{ + if ( isdefined( level.custom_ai_type ) ) + { + for ( i = 0; i < level.custom_ai_type.size; i++ ) + { + [[ level.custom_ai_type[ i ] ]](); + } + } +} + +zombiemode_melee_miss() //checked matches cerberus output +{ + if ( isDefined( self.enemy.curr_pay_turret ) ) + { + self.enemy dodamage( getDvarInt( "ai_meleeDamage" ), self.origin, self, self, "none", "melee" ); + } +} + +player_track_ammo_count() //checked changed to match cerberus output +{ + self notify( "stop_ammo_tracking" ); + self endon( "disconnect" ); + self endon( "stop_ammo_tracking" ); + ammolowcount = 0; + ammooutcount = 0; + while ( 1 ) + { + wait 0.5; + weap = self getcurrentweapon(); + if ( !isdefined( weap ) || weap == "none" || !can_track_ammo( weap ) ) + { + continue; + } + if ( self getammocount( weap ) > 5 || self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + ammooutcount = 0; + ammolowcount = 0; + continue; + } + if ( self getammocount( weap ) > 0 ) + { + if ( ammolowcount < 1 ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "ammo_low" ); + ammolowcount++; + } + } + else if ( ammooutcount < 1 ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "ammo_out" ); + ammooutcount++; + } + wait 20; + } +} + +can_track_ammo( weap ) //checked changed to match cerberus output +{ + if ( !isDefined( weap ) ) + { + return 0; + } + switch( weap ) + { + case "alcatraz_shield_zm": + case "chalk_draw_zm": + case "death_throe_zm": + case "equip_dieseldrone_zm": + case "equip_gasmask_zm": + case "humangun_upgraded_zm": + case "humangun_zm": + case "lower_equip_gasmask_zm": + case "no_hands_zm": + case "none": + case "riotshield_zm": + case "screecher_arms_zm": + case "slowgun_upgraded_zm": + case "slowgun_zm": + case "tazer_knuckles_upgraded_zm": + case "tazer_knuckles_zm": + case "time_bomb_detonator_zm": + case "time_bomb_zm": + case "zombie_bowie_flourish": + case "zombie_builder_zm": + case "zombie_fists_zm": + case "zombie_knuckle_crack": + case "zombie_sickle_flourish": + case "zombie_tazer_flourish": + return 0; + default: + if ( is_zombie_perk_bottle( weap ) || is_placeable_mine( weap ) || is_equipment( weap ) || issubstr( weap, "knife_ballistic_" ) || getsubstr( weap, 0, 3 ) != "gl_" || weaponfuellife( weap ) > 0 || weap == level.revive_tool ) + { + return 0; + } + } + return 1; +} + +spawn_vo() //checked matches cerberus output +{ + wait 1; + players = get_players(); + if ( players.size > 1 ) + { + player = random( players ); + index = maps/mp/zombies/_zm_weapons::get_player_index( player ); + player thread spawn_vo_player( index, players.size ); + } +} + +spawn_vo_player( index, num ) //checked matches cerberus output +{ + sound = "plr_" + index + "_vox_" + num + "play"; + self playsoundwithnotify( sound, "sound_done" ); + self waittill( "sound_done" ); +} + +precache_shaders() //checked matches cerberus output +{ + precacheshader( "hud_chalk_1" ); + precacheshader( "hud_chalk_2" ); + precacheshader( "hud_chalk_3" ); + precacheshader( "hud_chalk_4" ); + precacheshader( "hud_chalk_5" ); + precacheshader( "zom_icon_community_pot" ); + precacheshader( "zom_icon_community_pot_strip" ); + precacheshader( "zom_icon_player_life" ); + precacheshader( "waypoint_revive" ); +} + +precache_models() //checked matches cerberus output +{ + precachemodel( "p_zom_win_bars_01_vert04_bend_180" ); + precachemodel( "p_zom_win_bars_01_vert01_bend_180" ); + precachemodel( "p_zom_win_bars_01_vert04_bend" ); + precachemodel( "p_zom_win_bars_01_vert01_bend" ); + precachemodel( "p_zom_win_cell_bars_01_vert04_bent" ); + precachemodel( "p_zom_win_cell_bars_01_vert01_bent" ); + precachemodel( "tag_origin" ); + precachemodel( "zombie_z_money_icon" ); + if ( isDefined( level.precachecustomcharacters ) ) + { + self [[ level.precachecustomcharacters ]](); + } +} + +init_shellshocks() //checked matches cerberus output +{ + level.player_killed_shellshock = "zombie_death"; + precacheshellshock( level.player_killed_shellshock ); + precacheshellshock( "pain" ); + precacheshellshock( "explosion" ); +} + +init_strings() //checked matches cerberus output +{ + precachestring( &"ZOMBIE_WEAPONCOSTAMMO" ); + precachestring( &"ZOMBIE_ROUND" ); + precachestring( &"SCRIPT_PLUS" ); + precachestring( &"ZOMBIE_GAME_OVER" ); + precachestring( &"ZOMBIE_SURVIVED_ROUND" ); + precachestring( &"ZOMBIE_SURVIVED_ROUNDS" ); + precachestring( &"ZOMBIE_SURVIVED_NOMANS" ); + precachestring( &"ZOMBIE_EXTRA_LIFE" ); + add_zombie_hint( "undefined", &"ZOMBIE_UNDEFINED" ); + add_zombie_hint( "default_treasure_chest", &"ZOMBIE_RANDOM_WEAPON_COST" ); + add_zombie_hint( "default_treasure_chest_950", &"ZOMBIE_RANDOM_WEAPON_950" ); + add_zombie_hint( "powerup_fire_sale_cost", &"ZOMBIE_FIRE_SALE_COST" ); + add_zombie_hint( "default_buy_barrier_piece_10", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_10" ); + add_zombie_hint( "default_buy_barrier_piece_20", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_20" ); + add_zombie_hint( "default_buy_barrier_piece_50", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_50" ); + add_zombie_hint( "default_buy_barrier_piece_100", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_100" ); + add_zombie_hint( "default_reward_barrier_piece", &"ZOMBIE_BUTTON_REWARD_BARRIER" ); + add_zombie_hint( "default_reward_barrier_piece_10", &"ZOMBIE_BUTTON_REWARD_BARRIER_10" ); + add_zombie_hint( "default_reward_barrier_piece_20", &"ZOMBIE_BUTTON_REWARD_BARRIER_20" ); + add_zombie_hint( "default_reward_barrier_piece_30", &"ZOMBIE_BUTTON_REWARD_BARRIER_30" ); + add_zombie_hint( "default_reward_barrier_piece_40", &"ZOMBIE_BUTTON_REWARD_BARRIER_40" ); + add_zombie_hint( "default_reward_barrier_piece_50", &"ZOMBIE_BUTTON_REWARD_BARRIER_50" ); + add_zombie_hint( "default_buy_debris", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_COST" ); + add_zombie_hint( "default_buy_debris_100", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_100" ); + add_zombie_hint( "default_buy_debris_200", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_200" ); + add_zombie_hint( "default_buy_debris_250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_250" ); + add_zombie_hint( "default_buy_debris_500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_500" ); + add_zombie_hint( "default_buy_debris_750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_750" ); + add_zombie_hint( "default_buy_debris_1000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1000" ); + add_zombie_hint( "default_buy_debris_1250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1250" ); + add_zombie_hint( "default_buy_debris_1500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1500" ); + add_zombie_hint( "default_buy_debris_1750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1750" ); + add_zombie_hint( "default_buy_debris_2000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_2000" ); + add_zombie_hint( "default_buy_debris_3000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_3000" ); + add_zombie_hint( "default_buy_door", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_COST" ); + add_zombie_hint( "default_buy_door_close", &"ZOMBIE_BUTTON_BUY_CLOSE_DOOR" ); + add_zombie_hint( "default_buy_door_100", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_100" ); + add_zombie_hint( "default_buy_door_200", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_200" ); + add_zombie_hint( "default_buy_door_250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_250" ); + add_zombie_hint( "default_buy_door_500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_500" ); + add_zombie_hint( "default_buy_door_750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_750" ); + add_zombie_hint( "default_buy_door_1000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1000" ); + add_zombie_hint( "default_buy_door_1250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1250" ); + add_zombie_hint( "default_buy_door_1500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1500" ); + add_zombie_hint( "default_buy_door_1750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1750" ); + add_zombie_hint( "default_buy_door_2000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_2000" ); + add_zombie_hint( "default_buy_door_2500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_2500" ); + add_zombie_hint( "default_buy_door_3000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_3000" ); + add_zombie_hint( "default_buy_door_4000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_4000" ); + add_zombie_hint( "default_buy_door_8000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_8000" ); + add_zombie_hint( "default_buy_door_16000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_16000" ); + add_zombie_hint( "default_buy_area", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_COST" ); + add_zombie_hint( "default_buy_area_100", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_100" ); + add_zombie_hint( "default_buy_area_200", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_200" ); + add_zombie_hint( "default_buy_area_250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_250" ); + add_zombie_hint( "default_buy_area_500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_500" ); + add_zombie_hint( "default_buy_area_750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_750" ); + add_zombie_hint( "default_buy_area_1000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1000" ); + add_zombie_hint( "default_buy_area_1250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1250" ); + add_zombie_hint( "default_buy_area_1500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1500" ); + add_zombie_hint( "default_buy_area_1750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1750" ); + add_zombie_hint( "default_buy_area_2000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_2000" ); +} + +init_sounds() //checked matches cerberus output +{ + add_sound( "end_of_round", "mus_zmb_round_over" ); + add_sound( "end_of_game", "mus_zmb_game_over" ); + add_sound( "chalk_one_up", "mus_zmb_chalk" ); + add_sound( "purchase", "zmb_cha_ching" ); + add_sound( "no_purchase", "zmb_no_cha_ching" ); + add_sound( "playerzombie_usebutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "playerzombie_attackbutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "playerzombie_adsbutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "zombie_head_gib", "zmb_zombie_head_gib" ); + add_sound( "rebuild_barrier_piece", "zmb_repair_boards" ); + add_sound( "rebuild_barrier_metal_piece", "zmb_metal_repair" ); + add_sound( "rebuild_barrier_hover", "zmb_boards_float" ); + add_sound( "debris_hover_loop", "zmb_couch_loop" ); + add_sound( "break_barrier_piece", "zmb_break_boards" ); + add_sound( "grab_metal_bar", "zmb_bar_pull" ); + add_sound( "break_metal_bar", "zmb_bar_break" ); + add_sound( "drop_metal_bar", "zmb_bar_drop" ); + add_sound( "blocker_end_move", "zmb_board_slam" ); + add_sound( "barrier_rebuild_slam", "zmb_board_slam" ); + add_sound( "bar_rebuild_slam", "zmb_bar_repair" ); + add_sound( "zmb_rock_fix", "zmb_break_rock_barrier_fix" ); + add_sound( "zmb_vent_fix", "evt_vent_slat_repair" ); + add_sound( "door_slide_open", "zmb_door_slide_open" ); + add_sound( "door_rotate_open", "zmb_door_slide_open" ); + add_sound( "debris_move", "zmb_weap_wall" ); + add_sound( "open_chest", "zmb_lid_open" ); + add_sound( "music_chest", "zmb_music_box" ); + add_sound( "close_chest", "zmb_lid_close" ); + add_sound( "weapon_show", "zmb_weap_wall" ); + add_sound( "break_stone", "break_stone" ); +} + +init_levelvars() //checked changed to match cerberus output +{ + level.is_zombie_level = 1; + level.laststandpistol = "m1911_zm"; + level.default_laststandpistol = "m1911_zm"; + level.default_solo_laststandpistol = "m1911_upgraded_zm"; + level.start_weapon = "m1911_zm"; + level.first_round = 1; + level.start_round = getgametypesetting( "startRound" ); + level.round_number = level.start_round; + level.enable_magic = getgametypesetting( "magic" ); + level.headshots_only = getgametypesetting( "headshotsonly" ); + level.player_starting_points = level.round_number * 500; + level.round_start_time = 0; + level.pro_tips_start_time = 0; + level.intermission = 0; + level.dog_intermission = 0; + level.zombie_total = 0; + level.total_zombies_killed = 0; + level.hudelem_count = 0; + level.zombie_spawn_locations = []; + level.zombie_rise_spawners = []; + level.current_zombie_array = []; + level.current_zombie_count = 0; + level.zombie_total_subtract = 0; + level.destructible_callbacks = []; + level.zombie_vars = []; + foreach ( team in level.teams ) + { + level.zombie_vars[ team ] = []; + } + difficulty = 1; + column = int( difficulty ) + 1; + set_zombie_var( "zombie_health_increase", 100, 0, column ); + set_zombie_var( "zombie_health_increase_multiplier", 0.1, 1, column ); + set_zombie_var( "zombie_health_start", 150, 0, column ); + set_zombie_var( "zombie_spawn_delay", 2, 1, column ); + set_zombie_var( "zombie_new_runner_interval", 10, 0, column ); + set_zombie_var( "zombie_move_speed_multiplier", 8, 0, column ); + set_zombie_var( "zombie_move_speed_multiplier_easy", 2, 0, column ); + set_zombie_var( "zombie_max_ai", 24, 0, column ); + set_zombie_var( "zombie_ai_per_player", 6, 0, column ); + set_zombie_var( "below_world_check", -1000 ); + set_zombie_var( "spectators_respawn", 1 ); + set_zombie_var( "zombie_use_failsafe", 1 ); + set_zombie_var( "zombie_between_round_time", 10 ); + set_zombie_var( "zombie_intermission_time", 15 ); + set_zombie_var( "game_start_delay", 0, 0, column ); + set_zombie_var( "penalty_no_revive", 0.1, 1, column ); + set_zombie_var( "penalty_died", 0, 1, column ); + set_zombie_var( "penalty_downed", 0.05, 1, column ); + set_zombie_var( "starting_lives", 1, 0, column ); + set_zombie_var( "zombie_score_kill_4player", 50 ); + set_zombie_var( "zombie_score_kill_3player", 50 ); + set_zombie_var( "zombie_score_kill_2player", 50 ); + set_zombie_var( "zombie_score_kill_1player", 50 ); + set_zombie_var( "zombie_score_kill_4p_team", 30 ); + set_zombie_var( "zombie_score_kill_3p_team", 35 ); + set_zombie_var( "zombie_score_kill_2p_team", 45 ); + set_zombie_var( "zombie_score_kill_1p_team", 0 ); + set_zombie_var( "zombie_score_damage_normal", 10 ); + set_zombie_var( "zombie_score_damage_light", 10 ); + set_zombie_var( "zombie_score_bonus_melee", 80 ); + set_zombie_var( "zombie_score_bonus_head", 50 ); + set_zombie_var( "zombie_score_bonus_neck", 20 ); + set_zombie_var( "zombie_score_bonus_torso", 10 ); + set_zombie_var( "zombie_score_bonus_burn", 10 ); + set_zombie_var( "zombie_flame_dmg_point_delay", 500 ); + set_zombie_var( "zombify_player", 0 ); + /* + if ( issplitscreen() ) + { + set_zombie_var( "zombie_timer_offset", 280 ); + } + */ + level thread init_player_levelvars(); + level.gamedifficulty = getgametypesetting( "zmDifficulty" ); + if ( level.gamedifficulty == 0 ) + { + level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier_easy" ]; + } + else + { + level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier" ]; + } + if ( level.round_number == 1 ) + { + //was 100 changed to match bo1 _zombiemode.gsc + level.zombie_move_speed = 1; + } + i = 1; + while ( i <= level.round_number ) + { + timer = level.zombie_vars[ "zombie_spawn_delay" ]; + if ( timer > 0.08) + { + level.zombie_vars[ "zombie_spawn_delay" ] = timer * 0.95; + i++; + continue; + } + if ( timer < 0.08 ) + { + level.zombie_vars[ "zombie_spawn_delay" ] = 0.08; + } + i++; + } + level.speed_change_max = 0; + level.speed_change_num = 0; +} + +init_player_levelvars() //checked changed to match cerberus output +{ + flag_wait( "start_zombie_round_logic" ); + difficulty = 1; + column = int( difficulty ) + 1; + for ( i = 0; i < 8; i++ ) + { + points = 500; + if ( i > 3 ) + { + points = 3000; + } + points = set_zombie_var( "zombie_score_start_" + i + 1 + "p", points, 0, column ); + } +} + +init_dvars() //checked matches cerberus output +{ + if ( getDvar( "zombie_debug" ) == "" ) + { + setdvar( "zombie_debug", "0" ); + } + if ( getDvar( "scr_zm_enable_bots" ) == "" ) + { + setdvar( "scr_zm_enable_bots", "0" ); + } + if ( getDvar( "zombie_cheat" ) == "" ) + { + setdvar( "zombie_cheat", "0" ); + } + if ( level.script != "zombie_cod5_prototype" ) + { + setdvar( "magic_chest_movable", "1" ); + } + setdvar( "revive_trigger_radius", "75" ); + setdvar( "player_lastStandBleedoutTime", "45" ); + setdvar( "scr_deleteexplosivesonspawn", "0" ); +} + +init_function_overrides() //checked does not match cerberus output did not change +{ + level.callbackplayerdamage = ::callback_playerdamage; + level.overrideplayerdamage = ::player_damage_override; + level.callbackplayerkilled = ::player_killed_override; + level.playerlaststand_func = ::player_laststand; + level.callbackplayerlaststand = ::callback_playerlaststand; + level.prevent_player_damage = ::player_prevent_damage; + level.callbackactorkilled = ::actor_killed_override; + level.callbackactordamage = ::actor_damage_override_wrapper; + + level.custom_introscreen = ::zombie_intro_screen; + level.custom_intermission = ::player_intermission; + level.global_damage_func = maps/mp/zombies/_zm_spawner::zombie_damage; + level.global_damage_func_ads = maps/mp/zombies/_zm_spawner::zombie_damage_ads; + level.reset_clientdvars = ::onplayerconnect_clientdvars; + level.zombie_last_stand = ::last_stand_pistol_swap; + level.zombie_last_stand_pistol_memory = ::last_stand_save_pistol_ammo; + level.zombie_last_stand_ammo_return = ::last_stand_restore_pistol_ammo; + level.player_becomes_zombie = ::zombify_player; + level.validate_enemy_path_length = ::default_validate_enemy_path_length; + level.zm_laststand_playerlaststand = maps/mp/zombies/_zm_laststand::playerlaststand; +} + +callback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +{ + self endon( "disconnect" ); + [[ level.zm_laststand_playerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); +} + +codecallback_destructibleevent( event, param1, param2, param3 ) //see info.md No 8. +{ + if ( event == "broken" ) + { + notify_type = param1; + attacker = param2; + weapon = param3; + if ( isDefined( level.destructible_callbacks[ notify_type ] ) ) + { + self thread [[ level.destructible_callbacks[ notify_type ] ]]( notify_type, attacker ); + } + self notify( "broken", notify_type, attacker ); //added missing notify parameters from cerberus output + } + else if ( event == "breakafter" ) + { + piece = param1; + time = param2; + damage = param3; + self thread breakafter( time, damage, piece ); + } +} + +breakafter( time, damage, piece ) //checked matches cerberus output +{ + self notify( "breakafter" ); + self endon( "breakafter" ); + wait time; + self dodamage( damage, self.origin, undefined, undefined ); +} + +callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked changed to match cerberus output //checked against bo3 _zm matches within reason +{ + if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker.sessionteam == self.sessionteam && !eattacker hasperk( "specialty_noname" ) && isDefined( self.is_zombie ) && !self.is_zombie ) + { + self process_friendly_fire_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + if ( self != eattacker ) + { + return; + } + else if ( smeansofdeath != "MOD_GRENADE_SPLASH" && smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_EXPLOSIVE" && smeansofdeath != "MOD_PROJECTILE" && smeansofdeath != "MOD_PROJECTILE_SPLASH" && smeansofdeath != "MOD_BURNED" && smeansofdeath != "MOD_SUICIDE" ) + { + return; + } + } + if ( is_true( level.pers_upgrade_insta_kill ) ) + { + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_insta_kill_melee_swipe( smeansofdeath, eattacker ); + } + if ( isDefined( self.overrideplayerdamage ) ) + { + idamage = self [[ self.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + } + else if ( isDefined( level.overrideplayerdamage ) ) + { + idamage = self [[ level.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + } + if ( is_true( self.magic_bullet_shield ) ) + { + maxhealth = self.maxhealth; + self.health += idamage; + self.maxhealth = maxhealth; + } + if ( isDefined( self.divetoprone ) && self.divetoprone == 1 ) + { + if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) + { + dist = distance2d( vpoint, self.origin ); + if ( dist > 32 ) + { + dot_product = vectordot( anglesToForward( self.angles ), vdir ); + if ( dot_product > 0 ) + { + idamage = int( idamage * 0.5 ); + } + } + } + } + if ( isDefined( level.prevent_player_damage ) ) + { + if ( self [[ level.prevent_player_damage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) ) + { + return; + } + } + idflags |= level.idflags_no_knockback; + if ( idamage > 0 && shitloc == "riotshield" ) + { + shitloc = "torso_upper"; + } + self finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); +} + +finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked matches cerberus output +{ + self finishplayerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); +} + +register_player_friendly_fire_callback( callback ) //checked matches cerberus output +{ + if ( !isDefined( level.player_friendly_fire_callbacks ) ) + { + level.player_friendly_fire_callbacks = []; + } + level.player_friendly_fire_callbacks[ level.player_friendly_fire_callbacks.size ] = callback; +} + +process_friendly_fire_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked changed to match cerberus output +{ + if ( isdefined( level.player_friendly_fire_callbacks ) ) + { + foreach ( callback in level.player_friendly_fire_callbacks ) + { + self [[ callback ]](einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex); + } + } +} + +init_flags() //checked matches cerberus output +{ + flag_init( "solo_game" ); + flag_init( "start_zombie_round_logic" ); + flag_init( "start_encounters_match_logic" ); + flag_init( "spawn_point_override" ); + flag_init( "power_on" ); + flag_init( "crawler_round" ); + //minor change for debugging purposes + flag_init( "spawn_zombies", 1 ); //default 1 + flag_init( "dog_round" ); + flag_init( "begin_spawning" ); + flag_init( "end_round_wait" ); + flag_init( "wait_and_revive" ); + flag_init( "instant_revive" ); + flag_init( "initial_blackscreen_passed" ); + flag_init( "initial_players_connected" ); +} + +init_client_flags() //checked matches cerberus output +{ + //level._zombie_scriptmover_flag_box_random = 15; //from _zm.csc cerberus output + if ( is_true( level.use_clientside_board_fx ) ) + { + level._zombie_scriptmover_flag_board_horizontal_fx = 14; + level._zombie_scriptmover_flag_board_vertical_fx = 13; + } + if ( is_true( level.use_clientside_rock_tearin_fx ) ) + { + level._zombie_scriptmover_flag_rock_fx = 12; + } + level._zombie_player_flag_cloak_weapon = 14; + if ( !is_true( level.disable_deadshot_clientfield ) ) + { + registerclientfield( "toplayer", "deadshot_perk", 1, 1, "int" ); + } + registerclientfield( "actor", "zombie_riser_fx", 1, 1, "int" ); + if ( !is_true( level._no_water_risers ) ) + { + registerclientfield( "actor", "zombie_riser_fx_water", 1, 1, "int" ); + } + if ( is_true( level._foliage_risers ) ) + { + registerclientfield( "actor", "zombie_riser_fx_foliage", 12000, 1, "int" ); + } + if ( is_true( level.risers_use_low_gravity_fx ) ) + { + registerclientfield( "actor", "zombie_riser_fx_lowg", 1, 1, "int" ); + } +} + +init_fx() //checked partially changed to match cerberus output //csc partially matches cerberus output +{ + //this function does not cause exe_client_field_mismatch if the effects aren't loaded + if ( !isDefined( level._uses_default_wallbuy_fx ) ) + { + level._uses_default_wallbuy_fx = 1; + } + if ( !isDefined( level._uses_sticky_grenades ) ) + { + level._uses_sticky_grenades = 1; + if ( level.script == "zm_prison" ) + { + level._uses_sticky_grenades = 0; + } + } + if ( !isDefined( level.disable_fx_zmb_wall_buy_semtex ) ) + { + level.disable_fx_zmb_wall_buy_semtex = 0; + } + if ( !isDefined( level.fx_exclude_edge_fog ) ) + { + level.fx_exclude_edge_fog = 0; + } + if ( !isDefined( level.fx_exclude_default_eye_glow ) ) + { + level.fx_exclude_default_eye_glow = 0; + } + if ( !isDefined( level.fx_exclude_tesla_head_light ) ) + { + level.fx_exclude_tesla_head_light = 0; + } + if ( !isDefined( level.fx_exclude_default_explosion ) ) + { + level.fx_exclude_default_explosion = 0; + } + if ( !isDefined( level._uses_taser_knuckles ) ) + { + level._uses_taser_knuckles = 1; + if ( level.script == "zm_prison" ) + { + level._uses_taser_knuckles = 0; + } + } + if ( !isDefined( level.disable_fx_upgrade_aquired ) ) + { + level.disable_fx_upgrade_aquired = 0; + if ( level.script == "zm_prison" || !maps/mp/zombies/_zm_utility::is_classic() ) + { + level.disable_fx_upgrade_aquired = 1; + } + } + level.createfx_callback_thread = ::delete_in_createfx; + level._effect[ "wood_chunk_destory" ] = loadfx( "impacts/fx_large_woodhit" ); + level._effect[ "fx_zombie_bar_break" ] = loadfx( "maps/zombie/fx_zombie_bar_break" ); + level._effect[ "fx_zombie_bar_break_lite" ] = loadfx( "maps/zombie/fx_zombie_bar_break_lite" ); + if ( !is_true( level.fx_exclude_edge_fog ) ) + { + level._effect[ "edge_fog" ] = loadfx( "maps/zombie/fx_fog_zombie_amb" ); + } + level._effect[ "chest_light" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_glow" ); + if ( !is_true( level.fx_exclude_default_eye_glow ) ) + { + level._effect[ "eye_glow" ] = loadfx( "misc/fx_zombie_eye_single" ); + } + level._effect[ "headshot" ] = loadfx( "impacts/fx_flesh_hit" ); + level._effect[ "headshot_nochunks" ] = loadfx( "misc/fx_zombie_bloodsplat" ); + level._effect[ "bloodspurt" ] = loadfx( "misc/fx_zombie_bloodspurt" ); + if ( !is_true( level.fx_exclude_tesla_head_light ) ) + { + level._effect[ "tesla_head_light" ] = loadfx( "maps/zombie/fx_zombie_tesla_neck_spurt" ); + } + level._effect[ "zombie_guts_explosion" ] = loadfx( "maps/zombie/fx_zmb_tranzit_torso_explo" ); + level._effect[ "rise_burst_water" ] = loadfx( "maps/zombie/fx_mp_zombie_hand_dirt_burst" ); + level._effect[ "rise_billow_water" ] = loadfx( "maps/zombie/fx_mp_zombie_body_dirt_billowing" ); + level._effect[ "rise_dust_water" ] = loadfx( "maps/zombie/fx_mp_zombie_body_dust_falling" ); + level._effect[ "rise_burst" ] = loadfx( "maps/zombie/fx_mp_zombie_hand_dirt_burst" ); + level._effect[ "rise_billow" ] = loadfx( "maps/zombie/fx_mp_zombie_body_dirt_billowing" ); + level._effect[ "rise_dust" ] = loadfx( "maps/zombie/fx_mp_zombie_body_dust_falling" ); + level._effect[ "fall_burst" ] = loadfx( "maps/zombie/fx_mp_zombie_hand_dirt_burst" ); + level._effect[ "fall_billow" ] = loadfx( "maps/zombie/fx_mp_zombie_body_dirt_billowing" ); + level._effect[ "fall_dust" ] = loadfx( "maps/zombie/fx_mp_zombie_body_dust_falling" ); + level._effect[ "character_fire_death_sm" ] = loadfx( "env/fire/fx_fire_zombie_md" ); + level._effect[ "character_fire_death_torso" ] = loadfx( "env/fire/fx_fire_zombie_torso" ); + if ( !is_true( level.fx_exclude_default_explosion ) ) + { + level._effect[ "def_explosion" ] = loadfx( "explosions/fx_default_explosion" ); + } + if ( is_true( level._uses_default_wallbuy_fx ) ) //changed to match _zm.csc + { + level._effect[ "870mcs_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_870mcs" ); + level._effect[ "ak74u_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_ak74u" ); + level._effect[ "beretta93r_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_berreta93r" ); + level._effect[ "bowie_knife_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_bowie" ); + level._effect[ "claymore_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_claymore" ); + level._effect[ "m14_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_m14" ); + level._effect[ "m16_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_m16" ); + level._effect[ "mp5k_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_mp5k" ); + level._effect[ "rottweil72_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_olympia" ); + } + if ( is_true( level._uses_sticky_grenades ) ) + { + if ( !is_true( level.disable_fx_zmb_wall_buy_semtex ) ) + { + level._effect[ "sticky_grenade_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_semtex" ); + } + } + if ( is_true( level._uses_taser_knuckles ) ) + { + level._effect[ "tazer_knuckles_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_taseknuck" ); + } + if ( isDefined( level.buildable_wallbuy_weapons ) ) + { + level._effect[ "dynamic_wallbuy_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_question" ); + } + if ( !is_true( level.disable_fx_upgrade_aquired ) ) + { + level._effect[ "upgrade_aquired" ] = loadfx( "maps/zombie/fx_zmb_tanzit_upgrade" ); + } +} + +zombie_intro_screen( string1, string2, string3, string4, string5 ) //checked matches cerberus output +{ + flag_wait( "start_zombie_round_logic" ); +} + +players_playing() //checked matches cerberus output +{ + players = get_players(); + level.players_playing = players.size; + wait 20; + players = get_players(); + level.players_playing = players.size; +} + +onplayerconnect_clientdvars() //checked matches cerberus output +{ + self setclientcompass( 0 ); //was 0 + self setclientthirdperson( 0 ); + self resetfov(); + self setclientthirdpersonangle( 0 ); + self setclientammocounterhide( 1 ); + self setclientminiscoreboardhide( 1 ); + self setclienthudhardcore( 0 ); + self setclientplayerpushamount( 1 ); + self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); + self setclientaimlockonpitchstrength( 0 ); + self maps/mp/zombies/_zm_laststand::player_getup_setup(); +} + +checkforalldead( excluded_player ) //checked changed to match cerberus output +{ + players = get_players(); + count = 0; + i = 0; + while ( i < players.size ) + { + if ( isdefined( excluded_player ) && excluded_player == players[ i ] ) + { + i++; + continue; + } + if ( !players[i] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" ) + { + count++; + } + i++; + } + if ( count == 0 && !is_true( level.no_end_game_check ) ) + { + level notify( "end_game" ); + } +} + +onplayerspawned() //checked matches cerberus output +{ + self endon( "disconnect" ); + self notify( "stop_onPlayerSpawned" ); + self endon( "stop_onPlayerSpawned" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self freezecontrols( 0 ); + self.hits = 0; + self init_player_offhand_weapons(); + lethal_grenade = self get_player_lethal_grenade(); + if ( !self hasweapon( lethal_grenade ) ) + { + self giveweapon( lethal_grenade ); + self setweaponammoclip( lethal_grenade, 0 ); + } + self recordplayerrevivezombies( self ); + self setactionslot( 3, "altMode" ); + self playerknockback( 0 ); + self setclientthirdperson( 0 ); + self resetfov(); + self setclientthirdpersonangle( 0 ); + self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); + self cameraactivate( 0 ); + self.num_perks = 0; + self.on_lander_last_stand = undefined; + self setblur( 0, 0.1 ); + self.zmbdialogqueue = []; + self.zmbdialogactive = 0; + self.zmbdialoggroups = []; + self.zmbdialoggroup = ""; + + if ( is_true( level.player_out_of_playable_area_monitor ) ) + { + self thread player_out_of_playable_area_monitor(); + } + if ( is_true( level.player_too_many_weapons_monitor ) ) + { + self thread [[ level.player_too_many_weapons_monitor_func ]](); + } + if ( is_true( level.player_too_many_players_check ) ) + { + level thread [[ level.player_too_many_players_check_func ]](); + } + self.disabled_perks = []; + if ( isDefined( self.player_initialized ) ) + { + if ( self.player_initialized == 0 ) + { + self.player_initialized = 1; + self giveweapon( self get_player_lethal_grenade() ); + self setweaponammoclip( self get_player_lethal_grenade(), 0 ); + self setclientammocounterhide( 0 ); + self setclientminiscoreboardhide( 0 ); + self.is_drinking = 0; + self thread player_zombie_breadcrumb(); + self thread player_monitor_travel_dist(); + self thread player_monitor_time_played(); + if ( isDefined( level.custom_player_track_ammo_count ) ) + { + self thread [[ level.custom_player_track_ammo_count ]](); + } + else + { + self thread player_track_ammo_count(); + } + self thread shock_onpain(); + self thread player_grenade_watcher(); + self maps/mp/zombies/_zm_laststand::revive_hud_create(); + if ( isDefined( level.zm_gamemodule_spawn_func ) ) + { + self thread [[ level.zm_gamemodule_spawn_func ]](); + } + self thread player_spawn_protection(); + if ( !isDefined( self.lives ) ) + { + self.lives = 0; + } + } + } + } +} + +player_spawn_protection() //checked changed to match cerberus output +{ + self endon( "disconnect" ); + for ( x = 0; x < 60; x++ ) + { + self.ignoreme = 1; + wait 0.05; + } + self.ignoreme = 0; +} + +spawn_life_brush( origin, radius, height ) //checked matches cerberus output +{ + life_brush = spawn( "trigger_radius", origin, 0, radius, height ); + life_brush.script_noteworthy = "life_brush"; + return life_brush; +} + +in_life_brush() //checked changed to match cerberus output +{ + life_brushes = getentarray( "life_brush", "script_noteworthy" ); + if ( !isDefined( life_brushes ) ) + { + return 0; + } + for ( i = 0; i < life_brushes.size; i++ ) + { + if ( self istouching( life_brushes[ i ] ) ) + { + return 1; + } + } + return 0; +} + +spawn_kill_brush( origin, radius, height ) //checked matches cerberus output +{ + kill_brush = spawn( "trigger_radius", origin, 0, radius, height ); + kill_brush.script_noteworthy = "kill_brush"; + return kill_brush; +} + +in_kill_brush() //checked changed to match cerberus output +{ + kill_brushes = getentarray( "kill_brush", "script_noteworthy" ); + if ( !isDefined( kill_brushes ) ) + { + return 0; + } + for ( i = 0; i < kill_brushes.size; i++ ) + { + if ( self istouching( kill_brushes[ i ] ) ) + { + return 1; + } + } + return 0; +} + +in_enabled_playable_area() //checked changed to match cerberus output +{ + playable_area = getentarray( "player_volume", "script_noteworthy" ); + if ( !isDefined( playable_area ) ) + { + return 0; + } + for ( i = 0; i < playable_area.size; i++ ) + { + if ( maps/mp/zombies/_zm_zonemgr::zone_is_enabled( playable_area[ i ].targetname ) && self istouching( playable_area[ i ] ) ) + { + return 1; + } + } + return 0; +} + +get_player_out_of_playable_area_monitor_wait_time() //checked matches cerberus output +{ + return 3; +} + +player_out_of_playable_area_monitor() //checked changed to match cerberus output +{ + self notify( "stop_player_out_of_playable_area_monitor" ); + self endon( "stop_player_out_of_playable_area_monitor" ); + self endon( "disconnect" ); + level endon( "end_game" ); + while ( !isDefined( self.characterindex ) ) + { + wait 0.05; + } + wait ( 0.15 * self.characterindex ); + while ( 1 ) + { + if ( self.sessionstate == "spectator" ) + { + wait get_player_out_of_playable_area_monitor_wait_time(); + } + if ( !self in_life_brush() || self in_kill_brush() && !self in_enabled_playable_area() ) + { + if ( !isDefined( level.player_out_of_playable_area_monitor_callback ) || self [[ level.player_out_of_playable_area_monitor_callback ]]() ) + { + self maps/mp/zombies/_zm_stats::increment_map_cheat_stat( "cheat_out_of_playable" ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_out_of_playable", 0 ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 ); + self playlocalsound( level.zmb_laugh_alias ); + wait 0.5; + if ( get_players().size == 1 && flag( "solo_game" ) && is_true( self.waiting_to_revive ) ) + { + level notify( "end_game" ); + break; + } + else + { + self disableinvulnerability(); + self.lives = 0; + self dodamage( self.health + 1000, self.origin ); + self.bleedout_time = 0; + } + } + } + wait get_player_out_of_playable_area_monitor_wait_time(); + } +} + +get_player_too_many_weapons_monitor_wait_time() //checked matches cerberus output +{ + return 3; +} + +player_too_many_weapons_monitor_takeaway_simultaneous( primary_weapons_to_take ) //checked changed to match cerberus output +{ + self endon( "player_too_many_weapons_monitor_takeaway_sequence_done" ); + self waittill_any( "player_downed", "replace_weapon_powerup" ); + for ( i = 0; i < primary_weapons_to_take.size; i++ ) + { + self takeweapon( primary_weapons_to_take[ i ] ); + } + self maps/mp/zombies/_zm_score::minus_to_player_score( self.score ); + self give_start_weapon( 0 ); + if ( !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + self decrement_is_drinking(); + } + else if ( flag( "solo_game" ) ) + { + self.score_lost_when_downed = 0; + } + self notify( "player_too_many_weapons_monitor_takeaway_sequence_done" ); +} + +player_too_many_weapons_monitor_takeaway_sequence( primary_weapons_to_take ) //checked changed to match cerberus output +{ + self thread player_too_many_weapons_monitor_takeaway_simultaneous( primary_weapons_to_take ); + self endon( "player_downed" ); + self endon( "replace_weapon_powerup" ); + self increment_is_drinking(); + score_decrement = round_up_to_ten( int( self.score / ( primary_weapons_to_take.size + 1 ) ) ); + for ( i = 0; i < primary_weapons_to_take.size; i++ ) + { + self playlocalsound( level.zmb_laugh_alias ); + self switchtoweapon( primary_weapons_to_take[ i ] ); + self maps/mp/zombies/_zm_score::minus_to_player_score( score_decrement ); + wait(3); + self takeweapon( primary_weapons_to_take[ i ] ); + } + self playlocalsound( level.zmb_laugh_alias ); + self maps/mp/zombies/_zm_score::minus_to_player_score( self.score ); + wait 1; + self give_start_weapon( 1 ); + self decrement_is_drinking(); + self notify( "player_too_many_weapons_monitor_takeaway_sequence_done" ); +} + +player_too_many_weapons_monitor() //checked changed to match cerberus output +{ + self notify( "stop_player_too_many_weapons_monitor" ); + self endon( "stop_player_too_many_weapons_monitor" ); + self endon( "disconnect" ); + level endon( "end_game" ); + scalar = self.characterindex; + if ( !isDefined( scalar ) ) + { + scalar = self getentitynumber(); + } + wait ( 0.15 * scalar ); + while ( 1 ) + { + if ( self has_powerup_weapon() || self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || self.sessionstate == "spectator" ) + { + wait( get_player_too_many_weapons_monitor_wait_time() ); + continue; + } + weapon_limit = get_player_weapon_limit( self ); + primaryweapons = self getweaponslistprimaries(); + if ( primaryweapons.size > weapon_limit ) + { + self maps/mp/zombies/_zm_weapons::take_fallback_weapon(); + primaryweapons = self getweaponslistprimaries(); + } + primary_weapons_to_take = []; + for ( i = 0; i < primaryweapons.size; i++ ) + { + if ( maps/mp/zombies/_zm_weapons::is_weapon_included( primaryweapons[ i ] ) || maps/mp/zombies/_zm_weapons::is_weapon_upgraded( primaryweapons[ i ] ) ) + { + primary_weapons_to_take[ primary_weapons_to_take.size ] = primaryweapons[ i ]; + } + } + if ( primary_weapons_to_take.size > weapon_limit ) + { + if ( !isDefined( level.player_too_many_weapons_monitor_callback ) || self [[ level.player_too_many_weapons_monitor_callback ]]( primary_weapons_to_take ) ) + { + self maps/mp/zombies/_zm_stats::increment_map_cheat_stat( "cheat_too_many_weapons" ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_too_many_weapons", 0 ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 ); + self thread player_too_many_weapons_monitor_takeaway_sequence( primary_weapons_to_take ); + self waittill( "player_too_many_weapons_monitor_takeaway_sequence_done" ); + } + } + wait get_player_too_many_weapons_monitor_wait_time(); + } +} + +player_monitor_travel_dist() //checked matches cerberus output +{ + self endon( "disconnect" ); + self notify( "stop_player_monitor_travel_dist" ); + self endon( "stop_player_monitor_travel_dist" ); + prevpos = self.origin; + while ( 1 ) + { + wait 0.1; + self.pers[ "distance_traveled" ] += distance( self.origin, prevpos ); + prevpos = self.origin; + } +} + +player_monitor_time_played() //checked matches cerberus output +{ + self endon( "disconnect" ); + self notify( "stop_player_monitor_time_played" ); + self endon( "stop_player_monitor_time_played" ); + flag_wait( "start_zombie_round_logic" ); + for ( ;; ) + { + wait 1; + maps/mp/zombies/_zm_stats::increment_client_stat( "time_played_total" ); + } +} + +reset_rampage_bookmark_kill_times() //checked changed to match cerberus output +{ + if ( !isDefined( self.rampage_bookmark_kill_times ) ) + { + self.rampage_bookmark_kill_times = []; + self.ignore_rampage_kill_times = 0; + } + for ( i = 0; i < level.rampage_bookmark_kill_times_count; i++ ) + { + self.rampage_bookmark_kill_times[ i ] = 0; + } +} + +add_rampage_bookmark_kill_time() //checked changed to match cerberus output +{ + now = getTime(); + if ( now <= self.ignore_rampage_kill_times ) + { + return; + } + oldest_index = 0; + oldest_time = now + 1; + i = 0; + while ( i < level.rampage_bookmark_kill_times_count ) + { + if( !self.rampage_bookmark_kill_times[ i ] ) + { + oldest_index = i; + i++; + continue; + } + if ( oldest_time > self.rampage_bookmark_kill_times[ i ] ) + { + oldest_index = i; + oldest_time = self.rampage_bookmark_kill_times[ i ]; + } + i++; + } + self.rampage_bookmark_kill_times[ oldest_index ] = now; +} + +watch_rampage_bookmark() //checked changed to match cerberus output +{ + while(1) + { + wait 0.05; + waittillframeend; + now = GetTime(); + oldest_allowed = now - level.rampage_bookmark_kill_times_msec; + players = get_players(); + for ( player_index = 0; player_index < players.size; player_index++ ) + { + player = players[ player_index ]; + for ( time_index = 0; time_index < level.rampage_bookmark_kill_times_count; time_index++ ) + { + if ( !player.rampage_bookmark_kill_times[ time_index ] ) + { + break; + } + if ( oldest_allowed > player.rampage_bookmark_kill_times[ time_index ] ) + { + player.rampage_bookmark_kill_times[time_index] = 0; + break; + } + } + if ( time_index >= level.rampage_bookmark_kill_times_count ) + { + maps/mp/_demo::bookmark( "zm_player_rampage", GetTime(), player ); + player reset_rampage_bookmark_kill_times(); + player.ignore_rampage_kill_times = now + level.rampage_bookmark_kill_times_delay; + } + } + } +} + +player_grenade_multiattack_bookmark_watcher( grenade ) //checked matches cerberus output +{ + self endon( "disconnect" ); + waittillframeend; + if ( !isDefined( grenade ) ) + { + return; + } + inflictorentnum = grenade getentitynumber(); + inflictorenttype = grenade getentitytype(); + inflictorbirthtime = 0; + if ( isDefined( grenade.birthtime ) ) + { + inflictorbirthtime = grenade.birthtime; + } + ret_val = grenade waittill_any_timeout( 15, "explode" ); + if ( !isDefined( self ) || isDefined( ret_val ) && ret_val == "timeout" ) + { + return; + } + self.grenade_multiattack_count = 0; + self.grenade_multiattack_ent = undefined; + waittillframeend; + if ( !isDefined( self ) ) + { + return; + } + count = level.grenade_multiattack_bookmark_count; + if ( isDefined( grenade.grenade_multiattack_bookmark_count ) && grenade.grenade_multiattack_bookmark_count ) + { + count = grenade.grenade_multiattack_bookmark_count; + } + bookmark_string = "zm_player_grenade_multiattack"; + if ( isDefined( grenade.use_grenade_special_long_bookmark ) && grenade.use_grenade_special_long_bookmark ) + { + bookmark_string = "zm_player_grenade_special_long"; + } + else + { + if ( isDefined( grenade.use_grenade_special_bookmark ) && grenade.use_grenade_special_bookmark ) + { + bookmark_string = "zm_player_grenade_special"; + } + } + if ( count <= self.grenade_multiattack_count && isDefined( self.grenade_multiattack_ent ) ) + { + adddemobookmark( level.bookmark[ bookmark_string ], getTime(), self getentitynumber(), 255, 0, inflictorentnum, inflictorenttype, inflictorbirthtime, 0, self.grenade_multiattack_ent getentitynumber() ); + } + self.grenade_multiattack_count = 0; +} + +player_grenade_watcher() //checked matches cerberus output +{ + self endon( "disconnect" ); + self notify( "stop_player_grenade_watcher" ); + self endon( "stop_player_grenade_watcher" ); + self.grenade_multiattack_count = 0; + while ( 1 ) + { + self waittill( "grenade_fire", grenade, weapname ); + if ( isDefined( grenade ) && isalive( grenade ) ) + { + grenade.team = self.team; + } + self thread player_grenade_multiattack_bookmark_watcher( grenade ); + if ( isDefined( level.grenade_watcher ) ) + { + self [[ level.grenade_watcher ]]( grenade, weapname ); + } + } +} + +player_prevent_damage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) //checked matches cerberus output +{ + if ( !isDefined( einflictor ) || !isDefined( eattacker ) ) + { + return 0; + } + if ( einflictor == self || eattacker == self ) + { + return 0; + } + if ( isDefined( einflictor ) && isDefined( einflictor.team ) ) + { + if ( isDefined( einflictor.damage_own_team ) && !einflictor.damage_own_team ) + { + if ( einflictor.team == self.team ) + { + return 1; + } + } + } + return 0; +} + +player_revive_monitor() //checked matches cerberus output +{ + self endon( "disconnect" ); + self notify( "stop_player_revive_monitor" ); + self endon( "stop_player_revive_monitor" ); + while ( 1 ) + { + self waittill( "player_revived", reviver ); + self playsoundtoplayer( "zmb_character_revived", self ); + if ( isDefined( level.isresetting_grief ) && level.isresetting_grief ) + { + continue; + } + bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "revived", self.origin ); + if ( isDefined( reviver ) ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "revive_up" ); + points = self.score_lost_when_downed; + reviver maps/mp/zombies/_zm_score::player_add_points( "reviver", points ); + self.score_lost_when_downed = 0; + } + } +} + +laststand_giveback_player_perks() //checked changed to match cerberus output +{ + if ( isdefined( self.laststand_perks ) ) + { + lost_perk_index = int( -1 ); + if ( self.laststand_perks.size > 1 ) + { + lost_perk_index = randomint( self.laststand_perks.size - 1 ); + } + i = 0; + while ( i < self.laststand_perks.size) + { + if ( self hasperk( self.laststand_perks[ i ] ) ) + { + i++; + continue; + } + if ( i == lost_perk_index ) + { + i++; + continue; + } + maps/mp/zombies/_zm_perks::give_perk( self.laststand_perks[ i ] ); + i++; + } + } +} + +remote_revive_watch() //checked matches cerberus output +{ + self endon( "death" ); + self endon( "player_revived" ); + keep_checking = 1; + while ( keep_checking ) + { + self waittill( "remote_revive", reviver ); + if ( reviver.team == self.team ) + { + keep_checking = 0; + } + } + self maps/mp/zombies/_zm_laststand::remote_revive( reviver ); +} + +remove_deadshot_bottle() //checked matches cerberus output +{ + wait 0.05; + if ( isDefined( self.lastactiveweapon ) && self.lastactiveweapon == "zombie_perk_bottle_deadshot" ) + { + self.lastactiveweapon = "none"; + } +} + +take_additionalprimaryweapon() //checked changed to match cerberus output +{ + weapon_to_take = undefined; + if ( is_true( self._retain_perks ) || isDefined( self._retain_perks_array ) && isDefined( self._retain_perks_array[ "specialty_additionalprimaryweapon" ] ) && self._retain_perks_array[ "specialty_additionalprimaryweapon" ] ) + { + return weapon_to_take; + } + primary_weapons_that_can_be_taken = []; + primaryweapons = self getweaponslistprimaries(); + for ( i = 0; i < primaryweapons.size; i++ ) + { + if ( maps/mp/zombies/_zm_weapons::is_weapon_included( primaryweapons[ i ] ) || maps/mp/zombies/_zm_weapons::is_weapon_upgraded(primaryweapons[ i ] ) ) + { + primary_weapons_that_can_be_taken[ primary_weapons_that_can_be_taken.size ] = primaryweapons[ i ]; + } + } + pwtcbt = primary_weapons_that_can_be_taken.size; + while ( pwtcbt >= 3 ) + { + weapon_to_take = primary_weapons_that_can_be_taken[ pwtcbt - 1 ]; + pwtcbt--; + + if ( weapon_to_take == self getcurrentweapon() ) + { + self switchtoweapon( primary_weapons_that_can_be_taken[ 0 ] ); + } + self takeweapon( weapon_to_take ); + } + return weapon_to_take; +} + +player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked changed to match cerberus output //checked against bo3 _zm.gsc matches within reason +{ + b_alt_visionset = 0; + self allowjump( 0 ); + currweapon = self getcurrentweapon(); + statweapon = currweapon; + if ( is_alt_weapon( statweapon ) ) + { + statweapon = weaponaltweaponname( statweapon ); + } + self addweaponstat( statweapon, "deathsDuringUse", 1 ); + if ( is_true( self.hasperkspecialtytombstone ) ) + { + self.laststand_perks = maps/mp/zombies/_zm_tombstone::tombstone_save_perks( self ); + } + if ( isDefined( self.pers_upgrades_awarded[ "perk_lose" ] ) && self.pers_upgrades_awarded[ "perk_lose" ] ) + { + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_perk_lose_save(); + } + players = get_players(); + if ( players.size == 1 && flag( "solo_game" ) ) + { + if ( self.lives > 0 && self hasperk( "specialty_quickrevive" ) ) + { + self thread wait_and_revive(); + } + } + if ( self hasperk( "specialty_additionalprimaryweapon" ) ) + { + self.weapon_taken_by_losing_specialty_additionalprimaryweapon = take_additionalprimaryweapon(); + } + if ( is_true( self.hasperkspecialtytombstone ) ) + { + self [[ level.tombstone_laststand_func ]](); + self thread [[ level.tombstone_spawn_func ]](); + self.hasperkspecialtytombstone = undefined; + self notify( "specialty_scavenger_stop" ); + } + self clear_is_drinking(); + self thread remove_deadshot_bottle(); + self thread remote_revive_watch(); + self maps/mp/zombies/_zm_score::player_downed_penalty(); + self disableoffhandweapons(); + self thread last_stand_grenade_save_and_return(); + if ( smeansofdeath != "MOD_SUICIDE" && smeansofdeath != "MOD_FALLING" ) + { + if ( !is_true( self.intermission ) ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "revive_down" ); + } + else + { + if ( isDefined( level.custom_player_death_vo_func ) && !self [[ level.custom_player_death_vo_func ]]() ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "exert_death" ); + } + } + } + bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "downed", self.origin ); + if ( isDefined( level._zombie_minigun_powerup_last_stand_func ) ) + { + self thread [[ level._zombie_minigun_powerup_last_stand_func ]](); + } + if ( isDefined( level._zombie_tesla_powerup_last_stand_func ) ) + { + self thread [[ level._zombie_tesla_powerup_last_stand_func ]](); + } + if ( self hasperk( "specialty_grenadepulldeath" ) ) + { + b_alt_visionset = 1; + if ( isDefined( level.custom_laststand_func ) ) + { + self thread [[ level.custom_laststand_func ]](); + } + } + if ( is_true( self.intermission ) ) + { + bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "died", self.origin ); + wait 0.5; + self stopsounds(); + level waittill( "forever" ); + } + if ( !b_alt_visionset ) + { + visionsetlaststand( "zombie_last_stand", 1 ); + } +} + +failsafe_revive_give_back_weapons( excluded_player ) //checked changed to match cerberus output +{ + for ( i = 0; i < 10; i++ ) + { + wait 0.05 ; + players = get_players(); + foreach ( player in players ) + { + if ( player == excluded_player || !isdefined(player.reviveprogressbar) || player maps/mp/zombies/_zm_laststand::is_reviving_any() ) + { + continue; + } + player maps/mp/zombies/_zm_laststand::revive_give_back_weapons( "none" ); + if ( isdefined( player.reviveprogressbar ) ) + { + player.reviveprogressbar maps/mp/gametypes_zm/_hud_util::destroyelem(); + } + if ( isdefined( player.revivetexthud ) ) + { + player.revivetexthud destroy(); + } + } + } +} + +spawnspectator() //checked matches cerberus output +{ + self endon( "disconnect" ); + self endon( "spawned_spectator" ); + self notify( "spawned" ); + self notify( "end_respawn" ); + if ( level.intermission ) + { + return; + } + if ( is_true( level.no_spectator ) ) + { + wait 3; + exitlevel(); + } + self.is_zombie = 1; + level thread failsafe_revive_give_back_weapons( self ); + self notify( "zombified" ); + if ( isDefined( self.revivetrigger ) ) + { + self.revivetrigger delete(); + self.revivetrigger = undefined; + } + self.zombification_time = getTime(); + resettimeout(); + self stopshellshock(); + self stoprumble( "damage_heavy" ); + self.sessionstate = "spectator"; + self.spectatorclient = -1; + self.maxhealth = self.health; + self.shellshocked = 0; + self.inwater = 0; + self.friendlydamage = undefined; + self.hasspawned = 1; + self.spawntime = getTime(); + self.afk = 0; + self detachall(); + if ( isDefined( level.custom_spectate_permissions ) ) + { + self [[ level.custom_spectate_permissions ]](); + } + else + { + self setspectatepermissions( 1 ); + } + self thread spectator_thread(); + self spawn( self.origin, self.angles ); + self notify( "spawned_spectator" ); +} + +setspectatepermissions( ison ) //checked partially matches cerberus output changed at own discretion +{ + if ( ison && self.team == "allies" ) + { + self allowspectateteam( "allies", 1 ); + } + if ( ison && self.team == "axis" ) + { + self allowspectateteam( "axis", 1 ); + } + self allowspectateteam( "freelook", 0 ); + self allowspectateteam( "none", 0 ); +} + +spectator_thread() //checked matches cerberus output +{ + self endon( "disconnect" ); + self endon( "spawned_player" ); +} + +spectator_toggle_3rd_person() //checked matches cerberus output +{ + self endon( "disconnect" ); + self endon( "spawned_player" ); + third_person = 1; + self set_third_person( 1 ); +} + +set_third_person( value ) //checked matches cerberus output +{ + if ( value ) + { + self setclientthirdperson( 1 ); + self setclientthirdpersonangle( 354 ); + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); + } + else + { + self setclientthirdperson( 0 ); + self setclientthirdpersonangle( 0 ); + self setdepthoffield( 0, 0, 512, 4000, 4, 0 ); + } + self resetfov(); +} + +last_stand_revive() //checked changed to match cerberus output //checked against bo3 _zm.gsc matches within reason +{ + level endon( "between_round_over" ); + players = get_players(); + laststand_count = 0; + foreach ( player in players ) + { + if ( !is_player_valid( player ) ) + { + laststand_count++; + } + } + if ( laststand_count == players.size ) + { + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].revivetrigger.beingrevived == 0 ) + { + players[ i ] maps/mp/zombies/_zm_laststand::auto_revive( players[ i ] ); + } + } + } +} + +last_stand_pistol_rank_init() //checked matches cerberus output +{ + level.pistol_values = []; + level.pistol_values[ level.pistol_values.size ] = "m1911_zm"; + level.pistol_values[ level.pistol_values.size ] = "c96_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75dw_zm"; + level.pistol_values[ level.pistol_values.size ] = "kard_zm"; + level.pistol_values[ level.pistol_values.size ] = "fiveseven_zm"; + level.pistol_values[ level.pistol_values.size ] = "beretta93r_zm"; + level.pistol_values[ level.pistol_values.size ] = "beretta93r_extclip_zm"; + level.pistol_values[ level.pistol_values.size ] = "fivesevendw_zm"; + level.pistol_values[ level.pistol_values.size ] = "rnma_zm"; + level.pistol_values[ level.pistol_values.size ] = "python_zm"; + level.pistol_values[ level.pistol_values.size ] = "judge_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75dw_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "kard_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "fiveseven_upgraded_zm"; + level.pistol_value_solo_replace_below = level.pistol_values.size - 1; + level.pistol_values[ level.pistol_values.size ] = "m1911_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "c96_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "beretta93r_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "beretta93r_extclip_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "fivesevendw_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "rnma_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "python_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "judge_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "ray_gun_zm"; + level.pistol_values[ level.pistol_values.size ] = "raygun_mark2_zm"; + level.pistol_values[ level.pistol_values.size ] = "freezegun_zm"; + level.pistol_values[ level.pistol_values.size ] = "ray_gun_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "raygun_mark2_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "freezegun_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "microwavegundw_zm"; + level.pistol_values[ level.pistol_values.size ] = "microwavegundw_upgraded_zm"; +} + +last_stand_pistol_swap() //checked changed to match cerberus output +{ + if ( self has_powerup_weapon() ) + { + self.lastactiveweapon = "none"; + } + if ( !self hasweapon( self.laststandpistol ) ) + { + self giveweapon( self.laststandpistol ); + } + ammoclip = weaponclipsize( self.laststandpistol ); + doubleclip = ammoclip * 2; + if ( is_true( self._special_solo_pistol_swap ) || self.laststandpistol == level.default_solo_laststandpistol && !self.hadpistol ) + { + self._special_solo_pistol_swap = 0; + self.hadpistol = 0; + self setweaponammostock( self.laststandpistol, doubleclip ); + } + else if ( flag( "solo_game" ) && self.laststandpistol == level.default_solo_laststandpistol ) + { + self setweaponammostock(self.laststandpistol, doubleclip); + } + else if ( self.laststandpistol == level.default_laststandpistol ) + { + self setweaponammostock( self.laststandpistol, doubleclip ); + } + else if ( self.laststandpistol == "ray_gun_zm" || self.laststandpistol == "ray_gun_upgraded_zm" ) + { + if ( self.stored_weapon_info[ self.laststandpistol ].total_amt >= ammoclip ) + { + self setweaponammoclip( self.laststandpistol, ammoclip ); + self.stored_weapon_info[ self.laststandpistol ].given_amt = ammoclip; + } + else + { + self setweaponammoclip( self.laststandpistol, self.stored_weapon_info[ self.laststandpistol ].total_amt ); + self.stored_weapon_info[ self.laststandpistol ].given_amt = self.stored_weapon_info[ self.laststandpistol ].total_amt; + } + self setweaponammostock( self.laststandpistol, 0 ); + } + else if ( self.stored_weapon_info[ self.laststandpistol ].stock_amt >= doubleclip ) + { + self setweaponammostock( self.laststandpistol, doubleclip ); + self.stored_weapon_info[ self.laststandpistol ].given_amt = doubleclip + self.stored_weapon_info[ self.laststandpistol ].clip_amt + self.stored_weapon_info[ self.laststandpistol ].left_clip_amt; + } + else + { + self setweaponammostock( self.laststandpistol, self.stored_weapon_info[ self.laststandpistol ].stock_amt ); + self.stored_weapon_info[ self.laststandpistol ].given_amt = self.stored_weapon_info[ self.laststandpistol ].total_amt; + } + self switchtoweapon( self.laststandpistol ); +} + +last_stand_best_pistol() //checked changed to match cerberus output +{ + pistol_array = []; + current_weapons = self getweaponslistprimaries(); + i = 0; + while ( i < current_weapons.size ) + { + class = weaponclass( current_weapons[ i ] ); + if ( issubstr( current_weapons[ i ], "knife_ballistic_" ) ) + { + class = "knife"; + } + if ( class == "pistol" || class == "pistolspread" || class == "pistol spread" ) + { + if ( current_weapons[ i ] != level.default_laststandpistol && !flag( "solo_game" ) || !flag( "solo_game" ) && current_weapons[ i ] != level.default_solo_laststandpistol ) + { + if ( self getammocount( current_weapons[ i ] ) <= 0) + { + i++; + continue; + } + } + pistol_array_index = pistol_array.size; + pistol_array[ pistol_array_index ] = spawnstruct(); + pistol_array[ pistol_array_index ].gun = current_weapons[ i ]; + pistol_array[ pistol_array_index ].value = 0; + for ( j = 0; j < level.pistol_values.size; j++ ) + { + if ( level.pistol_values[ j ] == current_weapons[ i ] ) + { + pistol_array[ pistol_array_index ].value = j; + break; + } + } + } + i++; + } + self.laststandpistol = last_stand_compare_pistols( pistol_array ); +} + +last_stand_compare_pistols( struct_array ) //checked changed to match cerberus output +{ + if ( !isarray( struct_array ) || struct_array.size <= 0 ) + { + self.hadpistol = 0; + if ( isDefined( self.stored_weapon_info ) ) + { + stored_weapon_info = getarraykeys( self.stored_weapon_info ); + for ( j = 0; j < stored_weapon_info.size; j++ ) + { + if ( stored_weapon_info[ j ] == level.laststandpistol ) + { + self.hadpistol = 1; + } + } + } + return level.laststandpistol; + } + highest_score_pistol = struct_array[ 0 ]; + for ( i = 1; i < struct_array.size; i++ ) + { + if ( struct_array[ i ].value > highest_score_pistol.value ) + { + highest_score_pistol = struct_array[ i ]; + } + } + if ( flag( "solo_game" ) ) + { + self._special_solo_pistol_swap = 0; + if ( highest_score_pistol.value <= level.pistol_value_solo_replace_below ) + { + self.hadpistol = 0; + self._special_solo_pistol_swap = 1; + if ( is_true( level.force_solo_quick_revive ) && !self hasperk( "specialty_quickrevive" ) ) + { + return highest_score_pistol.gun; + } + else + { + return level.laststandpistol; + } + } + else + { + return highest_score_pistol.gun; + } + } + else + { + return highest_score_pistol.gun; + } +} + +last_stand_save_pistol_ammo() //checked changed to match cerberus output +{ + weapon_inventory = self getweaponslist( 1 ); + self.stored_weapon_info = []; + for ( i = 0; i < weapon_inventory.size; i++ ) + { + weapon = weapon_inventory[ i ]; + class = weaponclass( weapon ); + if ( issubstr( weapon, "knife_ballistic_" ) ) + { + class = "knife"; + } + if ( class == "pistol" || class == "pistolspread" || class == "pistol spread" ) + { + self.stored_weapon_info[ weapon ] = spawnstruct(); + self.stored_weapon_info[ weapon ].clip_amt = self getweaponammoclip( weapon ); + self.stored_weapon_info[ weapon ].left_clip_amt = 0; + dual_wield_name = weapondualwieldweaponname( weapon ); + if ( dual_wield_name != "none" ) + { + self.stored_weapon_info[ weapon ].left_clip_amt = self getweaponammoclip( dual_wield_name ); + } + self.stored_weapon_info[ weapon ].stock_amt = self getweaponammostock( weapon ); + self.stored_weapon_info[ weapon ].total_amt = self.stored_weapon_info[ weapon ].clip_amt + self.stored_weapon_info[ weapon ].left_clip_amt + self.stored_weapon_info[ weapon ].stock_amt; + self.stored_weapon_info[ weapon ].given_amt = 0; + } + } + self last_stand_best_pistol(); +} + +last_stand_restore_pistol_ammo() //checked changed to match cerberus output +{ + self.weapon_taken_by_losing_specialty_additionalprimaryweapon = undefined; + if ( !isDefined( self.stored_weapon_info ) ) + { + return; + } + weapon_inventory = self getweaponslist( 1 ); + weapon_to_restore = getarraykeys( self.stored_weapon_info ); + i = 0; + while ( i < weapon_inventory.size ) + { + weapon = weapon_inventory[ i ]; + if(weapon != self.laststandpistol) + { + i++; + continue; + } + for ( j = 0; j < weapon_to_restore.size; j++ ) + { + check_weapon = weapon_to_restore[ j ]; + if ( weapon == check_weapon ) + { + dual_wield_name = weapondualwieldweaponname( weapon_to_restore[ j ] ); + if ( weapon != level.default_laststandpistol ) + { + last_clip = self getweaponammoclip( weapon ); + last_left_clip = 0; + if( "none" != dual_wield_name ) + { + last_left_clip = self getweaponammoclip( dual_wield_name ); + } + last_stock = self getweaponammostock( weapon ); + last_total = last_clip + last_left_clip + last_stock; + used_amt = self.stored_weapon_info[ weapon ].given_amt - last_total; + if ( used_amt >= self.stored_weapon_info[ weapon ].stock_amt ) + { + used_amt = used_amt - self.stored_weapon_info[weapon].stock_amt; + self.stored_weapon_info[ weapon ].stock_amt = 0; + self.stored_weapon_info[ weapon ].clip_amt = self.stored_weapon_info[ weapon ].clip_amt - used_amt; + if ( self.stored_weapon_info[ weapon ].clip_amt < 0 ) + { + self.stored_weapon_info[ weapon ].clip_amt = 0; + } + } + else + { + new_stock_amt = self.stored_weapon_info[ weapon ].stock_amt - used_amt; + if ( new_stock_amt < self.stored_weapon_info[ weapon ].stock_amt ) + { + self.stored_weapon_info[ weapon ].stock_amt = new_stock_amt; + } + } + } + self setweaponammoclip( weapon_to_restore[ j ], self.stored_weapon_info[ weapon_to_restore[ j ] ].clip_amt ); + if ( "none" != dual_wield_name ) + { + self setweaponammoclip( dual_wield_name, self.stored_weapon_info[weapon_to_restore[ j ] ].left_clip_amt ); + } + self setweaponammostock( weapon_to_restore[ j ], self.stored_weapon_info[weapon_to_restore[ j ] ].stock_amt ); + break; + } + } + i++; + } +} + +last_stand_take_thrown_grenade() //checked matches cerberus output +{ + self endon( "disconnect" ); + self endon( "bled_out" ); + self endon( "player_revived" ); + self waittill( "grenade_fire", grenade, weaponname ); + if ( isDefined( self.lsgsar_lethal ) && weaponname == self.lsgsar_lethal ) + { + self.lsgsar_lethal_nade_amt--; + + } + if ( isDefined( self.lsgsar_tactical ) && weaponname == self.lsgsar_tactical ) + { + self.lsgsar_tactical_nade_amt--; + + } +} + +last_stand_grenade_save_and_return() //checked changed to match cerberus output +{ + if ( is_true( level.isresetting_grief ) ) + { + return; + } + self endon( "disconnect" ); + self endon( "bled_out" ); + level endon( "between_round_over" ); + self.lsgsar_lethal_nade_amt = 0; + self.lsgsar_has_lethal_nade = 0; + self.lsgsar_tactical_nade_amt = 0; + self.lsgsar_has_tactical_nade = 0; + self.lsgsar_lethal = undefined; + self.lsgsar_tactical = undefined; + if ( self isthrowinggrenade() ) + { + self thread last_stand_take_thrown_grenade(); + } + weapons_on_player = self getweaponslist( 1 ); + for ( i = 0; i < weapons_on_player.size; i++ ) + { + if ( self is_player_lethal_grenade( weapons_on_player[ i ] ) ) + { + self.lsgsar_has_lethal_nade = 1; + self.lsgsar_lethal = self get_player_lethal_grenade(); + self.lsgsar_lethal_nade_amt = self getweaponammoclip( self get_player_lethal_grenade() ); + self setweaponammoclip( self get_player_lethal_grenade(), 0 ); + self takeweapon( self get_player_lethal_grenade() ); + } + else if ( self is_player_tactical_grenade( weapons_on_player[ i ] ) ) + { + self.lsgsar_has_tactical_nade = 1; + self.lsgsar_tactical = self get_player_tactical_grenade(); + self.lsgsar_tactical_nade_amt = self getweaponammoclip( self get_player_tactical_grenade() ); + self setweaponammoclip( self get_player_tactical_grenade(), 0); + self takeweapon( self get_player_tactical_grenade() ); + } + } + self waittill( "player_revived" ); + if ( self.lsgsar_has_lethal_nade ) + { + self set_player_lethal_grenade( self.lsgsar_lethal ); + self giveweapon( self.lsgsar_lethal ); + self setweaponammoclip( self.lsgsar_lethal, self.lsgsar_lethal_nade_amt ); + } + if ( self.lsgsar_has_tactical_nade ) + { + self set_player_tactical_grenade( self.lsgsar_tactical ); + self giveweapon( self.lsgsar_tactical ); + self setweaponammoclip( self.lsgsar_tactical, self.lsgsar_tactical_nade_amt ); + } + self.lsgsar_lethal_nade_amt = undefined; + self.lsgsar_has_lethal_nade = undefined; + self.lsgsar_tactical_nade_amt = undefined; + self.lsgsar_has_tactical_nade = undefined; + self.lsgsar_lethal = undefined; + self.lsgsar_tactical = undefined; +} + +spectators_respawn() //checked changed to match cerberus output +{ + level endon( "between_round_over" ); + if ( !isDefined( level.zombie_vars[ "spectators_respawn" ] ) || !level.zombie_vars[ "spectators_respawn" ] ) + { + return; + } + if ( !isDefined( level.custom_spawnplayer ) ) + { + level.custom_spawnplayer = ::spectator_respawn; + } + while ( 1 ) + { + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ].sessionstate == "spectator" && isdefined( players[ i ].spectator_respawn ) ) + { + players[ i ] [[ level.spawnplayer ]](); + thread refresh_player_navcard_hud(); + if ( isdefined( level.script ) && level.round_number > 6 && players[ i ].score < 1500 ) + { + players[ i ].old_score = players[ i ].score; + if ( isdefined( level.spectator_respawn_custom_score ) ) + { + players[ i ] [[ level.spectator_respawn_custom_score ]](); + } + players[ i ].score = 1500; + } + } + } + wait 1; + } +} + +spectator_respawn() //checked changed to match cerberus output +{ + origin = self.spectator_respawn.origin; + angles = self.spectator_respawn.angles; + self setspectatepermissions( 0 ); + new_origin = undefined; + if ( isDefined( level.check_valid_spawn_override ) ) + { + new_origin = [[ level.check_valid_spawn_override ]]( self ); + } + if ( !isDefined( new_origin ) ) + { + new_origin = check_for_valid_spawn_near_team( self, 1 ); + } + if ( isDefined( new_origin ) ) + { + if ( !isDefined( new_origin.angles ) ) + { + angles = ( 0, 0, 0 ); + } + else + { + angles = new_origin.angles; + } + self spawn( new_origin.origin, angles ); + } + else + { + self spawn( origin, angles ); + } + if ( isDefined( self get_player_placeable_mine() ) ) + { + self takeweapon( self get_player_placeable_mine() ); + self set_player_placeable_mine( undefined ); + } + self maps/mp/zombies/_zm_equipment::equipment_take(); + self.is_burning = undefined; + self.abilities = []; + self.is_zombie = 0; + self.ignoreme = 0; + setclientsysstate( "lsm", "0", self ); + self reviveplayer(); + self notify( "spawned_player" ); + if ( isDefined( level._zombiemode_post_respawn_callback ) ) + { + self thread [[ level._zombiemode_post_respawn_callback ]](); + } + self maps/mp/zombies/_zm_score::player_reduce_points( "died" ); + self maps/mp/zombies/_zm_melee_weapon::spectator_respawn_all(); + claymore_triggers = getentarray( "claymore_purchase", "targetname" ); + i = 0; + while ( i < claymore_triggers.size ) + { + claymore_triggers[ i ] setvisibletoplayer( self ); + claymore_triggers[ i ].claymores_triggered = 0; + i++; + } + self thread player_zombie_breadcrumb(); + self thread return_retained_perks(); + return 1; +} + +check_for_valid_spawn_near_team( revivee, return_struct ) //checked partially changed to match beta dump +{ + if ( isDefined( level.check_for_valid_spawn_near_team_callback ) ) + { + spawn_location = [[ level.check_for_valid_spawn_near_team_callback ]]( revivee, return_struct ); + return spawn_location; + } + else + { + players = get_players(); + spawn_points = maps/mp/gametypes_zm/_zm_gametype::get_player_spawns_for_gametype(); + closest_group = undefined; + closest_distance = 100000000; + backup_group = undefined; + backup_distance = 100000000; + if ( spawn_points.size == 0 ) + { + return undefined; + } + for ( i = 0; i < players.size; i++ ) + { + if ( maps/mp/zombies/_zm_utility::is_player_valid( players[ i ], undefined, 1 ) && players[ i ] != self ) + { + for ( j = 0; j < spawn_points.size; j++ ) + { + if ( isdefined( spawn_points[ j ].script_int ) ) + { + ideal_distance = spawn_points[ j ].script_int; + } + else + { + ideal_distance = 1000; + } + if ( spawn_points[ j ].locked == 0 ) + { + plyr_dist = distancesquared( players[ i ].origin, spawn_points[ j ].origin ); + if ( plyr_dist < ideal_distance * ideal_distance ) + { + if ( plyr_dist < closest_distance ) + { + closest_distance = plyr_dist; + closest_group = j; + } + } + else + { + if ( plyr_dist < backup_distance ) + { + backup_group = j; + backup_distance = plyr_dist; + } + } + } + } + } + if ( !isdefined( closest_group ) ) + { + closest_group = backup_group; + } + if ( isdefined( closest_group ) ) + { + spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); + if ( isdefined( spawn_location ) ) + { + return spawn_location; + } + } + } + return undefined; + } +} + +get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ) //checked partially changed to match cerberus output see info.md +{ + spawn_array = getstructarray( spawn_points[ closest_group ].target, "targetname" ); + spawn_array = array_randomize( spawn_array ); + k = 0; + while ( k < spawn_array.size ) + { + if ( isdefined( spawn_array[ k ].plyr ) && spawn_array[ k ].plyr == revivee getentitynumber() ) + { + if ( positionwouldtelefrag( spawn_array[ k ].origin ) ) + { + spawn_array[ k ].plyr = undefined; + k++; + continue; + } + if ( is_true( return_struct ) ) + { + return spawn_array[ k ]; + } + return spawn_array[ k ].origin; + } + k++; + } + k = 0; + while ( k < spawn_array.size ) + { + if ( positionwouldtelefrag( spawn_array[ k ].origin ) ) + { + k++; + continue; + } + if ( !isdefined( spawn_array[ k ].plyr) || spawn_array[ k ].plyr == revivee getentitynumber() ) + { + spawn_array[ k ].plyr = revivee getentitynumber(); + if ( is_true( return_struct ) ) + { + return spawn_array[ k ]; + } + return spawn_array[ k ].origin; + } + k++; + } + if ( is_true( return_struct ) ) + { + return spawn_array[ 0 ]; + } + return spawn_array[ 0 ].origin; +} + +check_for_valid_spawn_near_position( revivee, v_position, return_struct ) //checked changed to match cerberus output +{ + spawn_points = maps/mp/gametypes_zm/_zm_gametype::get_player_spawns_for_gametype(); + if ( spawn_points.size == 0 ) + { + return undefined; + } + closest_group = undefined; + closest_distance = 100000000; + backup_group = undefined; + backup_distance = 100000000; + for ( i = 0; i < spawn_points.size; i++ ) + { + if ( isdefined( spawn_points[ i ].script_int ) ) + { + ideal_distance = spawn_points[ i ].script_int; + } + else + { + ideal_distance = 1000; + } + if ( spawn_points[ i ].locked == 0 ) + { + dist = distancesquared( v_position, spawn_points[ i ].origin ); + if ( dist < ideal_distance * ideal_distance ) + { + if ( dist < closest_distance ) + { + closest_distance = dist; + closest_group = i; + } + } + else if ( dist < backup_distance ) + { + backup_group = i; + backup_distance = dist; + } + } + if ( !isdefined( closest_group ) ) + { + closest_group = backup_group; + } + } + if ( isDefined( closest_group ) ) + { + spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); + if ( isDefined( spawn_location ) ) + { + return spawn_location; + } + } + return undefined; +} + +check_for_valid_spawn_within_range( revivee, v_position, return_struct, min_distance, max_distance ) //checked changed to match cerberus output +{ + spawn_points = maps/mp/gametypes_zm/_zm_gametype::get_player_spawns_for_gametype(); + if ( spawn_points.size == 0 ) + { + return undefined; + } + closest_group = undefined; + closest_distance = 100000000; + for ( i = 0; i < spawn_points.size; i++ ) + { + if ( spawn_points[ i ].locked == 0 ) + { + dist = distance( v_position, spawn_points[ i ].origin ); + if ( dist >= min_distance && dist <= max_distance ) + { + if ( dist < closest_distance ) + { + closest_distance = dist; + closest_group = i; + } + } + } + } + if ( isDefined( closest_group ) ) + { + spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); + if ( isDefined( spawn_location ) ) + { + return spawn_location; + } + } + return undefined; +} + +get_players_on_team( exclude ) //checked changed to match cerberus output +{ + teammates = []; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ].spawn_side == self.spawn_side && !isDefined( players[ i ].revivetrigger ) && players[ i ] != exclude ) + { + teammates[ teammates.size ] = players[ i ]; + } + } + return teammates; +} + +get_safe_breadcrumb_pos( player ) //checked changed to match cerberus output //changed for loops with continues to while loops +{ + players = get_players(); + valid_players = []; + min_dist = 22500; + i = 0; + while ( i < players.size ) + { + if ( !is_player_valid( players[ i ] ) ) + { + i++; + continue; + } + valid_players[ valid_players.size ] = players[ i ]; + i++; + } + for ( i = 0; i < valid_players.size; i++ ) + { + count = 0; + q = 1; + while ( q < player.zombie_breadcrumbs.size ) + { + if ( distancesquared( player.zombie_breadcrumbs[ q ], valid_players[ i ].origin ) < min_dist ) + { + q++; + continue; + } + count++; + if ( count == valid_players.size ) + { + return player.zombie_breadcrumbs[ q ]; + } + q++; + } + } + return undefined; +} + +default_max_zombie_func( max_num ) //checked changed to match cerberus output +{ + max = max_num; + if ( level.round_number < 2 ) + { + max = int( max_num * 0.25 ); + } + else if ( level.round_number < 3 ) + { + max = int( max_num * 0.3 ); + } + else if ( level.round_number < 4 ) + { + max = int( max_num * 0.5 ); + } + else if ( level.round_number < 5 ) + { + max = int( max_num * 0.7 ); + } + else if ( level.round_number < 6 ) + { + max = int( max_num * 0.9 ); + } + return max; +} + +round_spawning() //checked changed to match cerberus output +{ + level endon( "intermission" ); + level endon( "end_of_round" ); + level endon( "restart_round" ); + if ( level.intermission ) + { + return; + } + if ( level.zombie_spawn_locations.size < 1 ) + { + return; + } + ai_calculate_health( level.round_number ); + count = 0; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ].zombification_time = 0; + } + max = level.zombie_vars[ "zombie_max_ai" ]; + multiplier = level.round_number / 5; + if ( multiplier < 1 ) + { + multiplier = 1; + } + if ( level.round_number >= 10 ) + { + multiplier *= level.round_number * 0.15; + } + player_num = get_players().size; + if ( player_num == 1 ) + { + max += int( 0.5 * level.zombie_vars[ "zombie_ai_per_player" ] * multiplier ); + } + else + { + max += int( ( player_num - 1 ) * level.zombie_vars[ "zombie_ai_per_player" ] * multiplier ); + } + if ( !isDefined( level.max_zombie_func ) ) + { + level.max_zombie_func = ::default_max_zombie_func; + } + if ( isDefined( level.kill_counter_hud ) && level.zombie_total > 0 ) + { + level.zombie_total = [[ level.max_zombie_func ]]( max ); + level notify( "zombie_total_set" ); + } + if ( isDefined( level.zombie_total_set_func ) ) + { + level thread [[ level.zombie_total_set_func ]](); + } + if ( level.round_number < 10 || level.speed_change_max > 0 ) + { + level thread zombie_speed_up(); + } + level.zombie_total = [[ level.max_zombie_func ]]( max ); + level notify( "zombie_total_set" ); + mixed_spawns = 0; + old_spawn = undefined; + while ( 1 ) + { + while ( get_current_zombie_count() >= level.zombie_ai_limit || level.zombie_total <= 0 ) + { + wait 0.1; + } + while ( get_current_actor_count() >= level.zombie_actor_limit ) + { + clear_all_corpses(); + wait 0.1; + } + flag_wait( "spawn_zombies" ); + while ( level.zombie_spawn_locations.size <= 0 ) + { + wait 0.1; + } + run_custom_ai_spawn_checks(); + spawn_point = level.zombie_spawn_locations[ randomint( level.zombie_spawn_locations.size ) ]; + if ( !isDefined( old_spawn ) ) + { + old_spawn = spawn_point; + } + else if ( spawn_point == old_spawn ) + { + spawn_point = level.zombie_spawn_locations[ randomint( level.zombie_spawn_locations.size ) ]; + } + old_spawn = spawn_point; + if ( isDefined( level.mixed_rounds_enabled ) && level.mixed_rounds_enabled == 1 ) + { + spawn_dog = 0; + if ( level.round_number > 30 ) + { + if ( randomint( 100 ) < 3 ) + { + spawn_dog = 1; + } + } + else if ( level.round_number > 25 && mixed_spawns < 3 ) + { + if ( randomint( 100 ) < 2 ) + { + spawn_dog = 1; + } + } + else if ( level.round_number > 20 && mixed_spawns < 2 ) + { + if ( randomint( 100 ) < 2 ) + { + spawn_dog = 1; + } + break; + } + else if ( level.round_number > 15 && mixed_spawns < 1 ) + { + if ( randomint( 100 ) < 1 ) + { + spawn_dog = 1; + } + } + if ( spawn_dog ) + { + keys = getarraykeys( level.zones ); + for ( i = 0; i < keys.size; i++ ) + { + if ( level.zones[ keys[ i ] ].is_occupied ) + { + akeys = getarraykeys( level.zones[ keys[ i ] ].adjacent_zones ); + k = 0; + for ( k = 0; k < akeys.size; k++ ) + { + if ( level.zones[ akeys[ k ] ].is_active && !level.zones[ akeys[ k ] ].is_occupied && level.zones[ akeys[ k ] ].dog_locations.size > 0 ) + { + maps/mp/zombies/_zm_ai_dogs::special_dog_spawn( undefined, 1 ); + level.zombie_total--; + + wait_network_frame(); + } + } + } + } + } + } + if ( isDefined( level.zombie_spawners ) ) + { + if ( is_true( level.use_multiple_spawns ) ) + { + if ( isDefined( spawn_point.script_int ) ) + { + if ( isDefined( level.zombie_spawn[ spawn_point.script_int ] ) && level.zombie_spawn[ spawn_point.script_int ].size ) + { + spawner = random( level.zombie_spawn[ spawn_point.script_int ] ); + } + } + else if ( isDefined( level.zones[ spawn_point.zone_name ].script_int ) && level.zones[ spawn_point.zone_name ].script_int ) + { + spawner = random( level.zombie_spawn[ level.zones[ spawn_point.zone_name ].script_int ] ); + } + else if ( isDefined( level.spawner_int ) && isDefined( level.zombie_spawn[ level.spawner_int ].size ) && level.zombie_spawn[ level.spawner_int ].size ) + { + spawner = random( level.zombie_spawn[ level.spawner_int ] ); + } + else + { + spawner = random( level.zombie_spawners ); + } + } + else + { + spawner = random( level.zombie_spawners ); + } + ai = spawn_zombie( spawner, spawner.targetname, spawn_point ); + } + if ( isDefined( ai ) ) + { + level.zombie_total--; + + ai thread round_spawn_failsafe(); + count++; + } + wait level.zombie_vars[ "zombie_spawn_delay" ]; + wait_network_frame(); + } +} + +run_custom_ai_spawn_checks() //checked changed to match cerberus output +{ + foreach ( s in level.custom_ai_spawn_check_funcs ) + { + if ( [[ s.func_check ]]() ) + { + a_spawners = [[ s.func_get_spawners ]](); + level.zombie_spawners = arraycombine( level.zombie_spawners, a_spawners, 0, 0 ); + if ( is_true( level.use_multiple_spawns ) ) + { + foreach ( sp in a_spawners ) + { + if ( isdefined( sp.script_int ) ) + { + if ( !isdefined(level.zombie_spawn[ sp.script_int ] ) ) + { + level.zombie_spawn[ sp.script_int ] = []; + } + if ( !isinarray( level.zombie_spawn[ sp.script_int ], sp ) ) + { + level.zombie_spawn[ sp.script_int ][ level.zombie_spawn[ sp.script_int ].size ] = sp; + } + } + } + } + else if ( isdefined( s.func_get_locations ) ) + { + a_locations = [[ s.func_get_locations ]](); + level.zombie_spawn_locations = arraycombine( level.zombie_spawn_locations, a_locations, 0, 0 ); + } + break; + } + a_spawners = [[ s.func_get_spawners ]](); + foreach ( sp in a_spawners ) + { + arrayremovevalue( level.zombie_spawners, sp ); + } + if ( is_true( level.use_multiple_spawns ) ) + { + foreach ( sp in a_spawners ) + { + if ( isdefined( sp.script_int ) && isdefined( level.zombie_spawn[ sp.script_int ] ) ) + { + arrayremovevalue( level.zombie_spawn[ sp.script_int ], sp ); + } + } + } + else if ( isdefined( s.func_get_locations ) ) + { + a_locations = [[ s.func_get_locations ]](); + foreach ( s_loc in a_locations ) + { + arrayremovevalue( level.zombie_spawn_locations, s_loc ); + } + } + } +} + +register_custom_ai_spawn_check( str_id, func_check, func_get_spawners, func_get_locations ) //checked matches cerberus output +{ + if ( !isDefined( level.custom_ai_spawn_check_funcs[ str_id ] ) ) + { + level.custom_ai_spawn_check_funcs[ str_id ] = spawnstruct(); + } + level.custom_ai_spawn_check_funcs[ str_id ].func_check = func_check; + level.custom_ai_spawn_check_funcs[ str_id ].func_get_spawners = func_get_spawners; + level.custom_ai_spawn_check_funcs[ str_id ].func_get_locations = func_get_locations; +} + +zombie_speed_up() //checked does not match cerberus output changed at own discretion +{ + if ( level.round_number <= 3 ) + { + return; + } + level endon( "intermission" ); + level endon( "end_of_round" ); + level endon( "restart_round" ); + while ( level.zombie_total > 4 ) + { + wait 2; + } + num_zombies = get_current_zombie_count(); + while ( num_zombies > 3 ) + { + wait 2; + num_zombies = get_current_zombie_count(); + } + zombies = get_round_enemy_array(); + while ( zombies.size > 0 ) + { + if ( zombies.size == 1 && is_true( zombies[ 0 ].has_legs ) ) + { + if ( isDefined( level.zombie_speed_up ) ) + { + zombies[ 0 ] thread [[ level.zombie_speed_up ]](); + break; + } + else if ( zombies[ 0 ].zombie_move_speed != "sprint" ) + { + zombies[ 0 ] set_zombie_run_cycle( "sprint" ); + zombies[ 0 ].zombie_move_speed_original = zombies[ 0 ].zombie_move_speed; + break; //added for consistency + } + } + wait 0.5; + zombies = get_round_enemy_array(); + } +} + +round_spawning_test() //checked matches cerberus output +{ + while ( 1 ) + { + spawn_point = level.zombie_spawn_locations[ randomint( level.zombie_spawn_locations.size ) ]; + spawner = random( level.zombie_spawners ); + ai = spawn_zombie( spawner, spawner.targetname, spawn_point ); + ai waittill( "death" ); + wait 5; + } +} + +round_pause( delay ) //checked changed to match cerberus output +{ + if ( !isDefined( delay ) ) + { + delay = 30; + } + level.countdown_hud = create_counter_hud(); + level.countdown_hud setvalue( delay ); + level.countdown_hud.color = ( 1, 1, 1 ); + level.countdown_hud.alpha = 1; + level.countdown_hud fadeovertime( 2 ); + wait 2; + level.countdown_hud.color = vectorScale( ( 1, 0, 0 ), 0.21 ); + level.countdown_hud fadeovertime( 3 ); + wait 3; + while ( delay >= 1 ) + { + wait 1; + delay--; + level.countdown_hud setvalue( delay ); + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] playlocalsound( "zmb_perks_packa_ready" ); + } + level.countdown_hud fadeovertime( 1 ); + level.countdown_hud.color = ( 0, 0, -1 ); + level.countdown_hud.alpha = 0; + wait 1; + level.countdown_hud destroy_hud(); +} + +round_start() //checked matches cerberus output +{ + if ( isDefined( level.round_prestart_func ) ) + { + [[ level.round_prestart_func ]](); + } + else + { + n_delay = 2; + if ( isDefined( level.zombie_round_start_delay ) ) + { + n_delay = level.zombie_round_start_delay; + } + wait n_delay; + } + level.zombie_health = level.zombie_vars[ "zombie_health_start" ]; + if ( getDvarInt( "scr_writeConfigStrings" ) == 1 ) + { + wait 5; + exitlevel(); + return; + } + if ( level.zombie_vars[ "game_start_delay" ] > 0 ) + { + round_pause( level.zombie_vars[ "game_start_delay" ] ); + } + flag_set( "begin_spawning" ); + if ( !isDefined( level.round_spawn_func ) ) + { + level.round_spawn_func = ::round_spawning; + } + if ( !isDefined( level.round_wait_func ) ) + { + level.round_wait_func = ::round_wait; + } + if ( !isDefined( level.round_think_func ) ) + { + level.round_think_func = ::round_think; + } + level thread [[ level.round_think_func ]](); +} + +play_door_dialog() //checked changed to match cerberus output +{ + level endon( "power_on" ); + self endon( "warning_dialog" ); + timer = 0; + while ( 1 ) + { + wait 0.05; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + dist = distancesquared( players[ i ].origin, self.origin ); + if ( dist > 4900 ) + { + timer = 0; + continue; + } + while ( dist < 4900 && timer < 3 ) + { + wait(0.5); + timer++; + } + if ( dist > 4900 && timer >= 3 ) + { + self playsound( "door_deny" ); + players[ i ] maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "door_deny" ); + wait 3; + self notify("warning_dialog"); + } + } + } +} + +wait_until_first_player() //checked matches cerberus output +{ + players = get_players(); + if ( !isDefined( players[ 0 ] ) ) + { + level waittill( "first_player_ready" ); + } +} + +round_one_up() //checked changed to match cerberus output +{ + level endon( "end_game" ); + if ( isDefined( level.noroundnumber ) && level.noroundnumber == 1 ) + { + return; + } + if ( !isDefined( level.doground_nomusic ) ) + { + level.doground_nomusic = 0; + } + if ( level.first_round ) + { + intro = 1; + if ( isDefined( level._custom_intro_vox ) ) + { + level thread [[ level._custom_intro_vox ]](); + } + else + { + level thread play_level_start_vox_delayed(); + } + } + else + { + intro = 0; + } + if ( level.round_number == 5 || level.round_number == 10 || level.round_number == 20 || level.round_number == 35 || level.round_number == 50 ) + { + players = get_players(); + rand = randomintrange( 0, players.size ); + players[ rand ] thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "round_" + level.round_number ); + } + if ( intro ) + { + if ( is_true( level.host_ended_game ) ) + { + return; + } + wait 6.25; + level notify( "intro_hud_done" ); + wait 2; + } + else + { + wait 2.5; + } + reportmtu( level.round_number ); +} + +round_over() //checked changed to match cerberus output +{ + if ( isDefined( level.noroundnumber ) && level.noroundnumber == 1 ) + { + return; + } + time = level.zombie_vars[ "zombie_between_round_time" ]; + players = getplayers(); + for ( player_index = 0; player_index < players.size; player_index++ ) + { + if ( !isDefined( players[ player_index ].pers[ "previous_distance_traveled" ] ) ) + { + players[ player_index ].pers[ "previous_distance_traveled" ] = 0; + } + distancethisround = int( players[ player_index ].pers[ "distance_traveled" ] - players[ player_index ].pers[ "previous_distance_traveled" ] ); + players[ player_index ].pers[ "previous_distance_traveled" ] = players[ player_index ].pers[ "distance_traveled" ]; + players[ player_index ] incrementplayerstat( "distance_traveled", distancethisround ); + if ( players[ player_index ].pers[ "team" ] != "spectator" ) + { + zonename = players[ player_index ] get_current_zone(); + if ( isDefined( zonename ) ) + { + players[ player_index ] recordzombiezone( "endingZone", zonename ); + } + } + } + recordzombieroundend(); + wait time; +} + +round_think( restart ) //checked changed to match cerberus output +{ + if ( !isDefined( restart ) ) + { + restart = 0; + } + level endon( "end_round_think" ); + if ( !is_true( restart ) ) + { + if ( isDefined( level.initial_round_wait_func ) ) + { + [[ level.initial_round_wait_func ]](); + } + players = get_players(); + foreach ( player in players ) + { + if ( is_true( player.hostmigrationcontrolsfrozen ) ) + { + player freezecontrols( 0 ); + } + player maps/mp/zombies/_zm_stats::set_global_stat( "rounds", level.round_number ); + } + } + setroundsplayed( level.round_number ); + for ( ;; ) + { + maxreward = 50 * level.round_number; + if ( maxreward > 500 ) + { + maxreward = 500; + } + level.zombie_vars[ "rebuild_barrier_cap_per_round" ] = maxreward; + level.pro_tips_start_time = getTime(); + level.zombie_last_run_time = getTime(); + if ( isDefined( level.zombie_round_change_custom ) ) + { + [[ level.zombie_round_change_custom ]](); + } + else + { + level thread maps/mp/zombies/_zm_audio::change_zombie_music( "round_start" ); + round_one_up(); + } + maps/mp/zombies/_zm_powerups::powerup_round_start(); + players = get_players(); + array_thread( players, ::rebuild_barrier_reward_reset ); + if ( !is_true( level.headshots_only ) && !restart ) + { + level thread award_grenades_for_survivors(); + } + level.round_start_time = getTime(); + while ( level.zombie_spawn_locations.size <= 0 ) + { + wait 0.1; + } + level thread [[ level.round_spawn_func ]](); + level notify( "start_of_round" ); + recordzombieroundstart(); + players = getplayers(); + for ( index = 0; index < players.size; index++ ) + { + zonename = players[ index ] get_current_zone(); + if ( isDefined( zonename ) ) + { + players[ index ] recordzombiezone( "startingZone", zonename ); + } + } + if ( isDefined( level.round_start_custom_func ) ) + { + [[ level.round_start_custom_func ]](); + } + [[ level.round_wait_func ]](); + level.first_round = 0; + level notify( "end_of_round" ); + level thread maps/mp/zombies/_zm_audio::change_zombie_music( "round_end" ); + uploadstats(); + if ( isDefined( level.round_end_custom_logic ) ) + { + [[ level.round_end_custom_logic ]](); + } + players = get_players(); + if ( is_true( level.no_end_game_check ) ) + { + level thread last_stand_revive(); + level thread spectators_respawn(); + } + else if ( players.size != 1 ) + { + level thread spectators_respawn(); + } + players = get_players(); + array_thread( players, ::round_end ); + timer = level.zombie_vars[ "zombie_spawn_delay" ]; + if ( timer > 0.08 ) + { + level.zombie_vars[ "zombie_spawn_delay" ] = timer * 0.95; + } + else if ( timer < 0.08 ) + { + level.zombie_vars[ "zombie_spawn_delay" ] = 0.08; + } + if ( level.gamedifficulty == 0 ) + { + level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier_easy" ]; + } + else + { + level.zombie_move_speed = level.round_number * level.zombie_vars[ "zombie_move_speed_multiplier" ]; + } + level.round_number++; + if ( level.round_number >= 255 ) + { + level.round_number = 255; + } + setroundsplayed( level.round_number ); + matchutctime = getutc(); + players = get_players(); + foreach ( player in players ) + { + if ( level.curr_gametype_affects_rank && level.round_number > 3 + level.start_round ) + { + player maps/mp/zombies/_zm_stats::add_client_stat( "weighted_rounds_played", level.round_number ); + } + player maps/mp/zombies/_zm_stats::set_global_stat( "rounds", level.round_number ); + player maps/mp/zombies/_zm_stats::update_playing_utc_time( matchutctime ); + } + check_quickrevive_for_hotjoin(); //was commented out + level round_over(); + level notify( "between_round_over" ); + restart = 0; + } +} + +award_grenades_for_survivors() //checked changed to match cerberus output +{ + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( !players[ i ].is_zombie ) + { + lethal_grenade = players[ i ] get_player_lethal_grenade(); + if ( !players[ i ] hasweapon( lethal_grenade ) ) + { + players[ i ] giveweapon( lethal_grenade ); + players[ i ] setweaponammoclip( lethal_grenade, 2 ); //changed from 0 to 2 at own discretion + } + if ( players[ i ] getfractionmaxammo( lethal_grenade ) < 0.25 ) + { + players[ i ] setweaponammoclip( lethal_grenade, 2 ); + i++; + continue; + } + if ( players[ i ] getfractionmaxammo( lethal_grenade ) < 0.5 ) + { + players[ i ] setweaponammoclip( lethal_grenade, 3 ); + i++; + continue; + } + players[ i ] setweaponammoclip( lethal_grenade, 4 ); + } + i++; + } +} + +ai_calculate_health( round_number ) //checked changed to match cerberus output +{ + level.zombie_health = level.zombie_vars[ "zombie_health_start" ]; + i = 2; + while ( i <= round_number ) + { + if ( i >= 10 ) + { + old_health = level.zombie_health; + level.zombie_health = level.zombie_health + int( level.zombie_health * level.zombie_vars[ "zombie_health_increase_multiplier" ] ); + if ( level.zombie_health < old_health ) + { + level.zombie_health = old_health; + return; + } + i++; + continue; + } + level.zombie_health = int( level.zombie_health + level.zombie_vars[ "zombie_health_increase" ] ); + i++; + } +} + +ai_zombie_health( round_number ) //checked changed to match cerberus output +{ + zombie_health = level.zombie_vars[ "zombie_health_start" ]; + i = 2; + while ( i <= round_number ) + { + if ( i >= 10 ) + { + old_health = zombie_health; + zombie_health = zombie_health + int( zombie_health * level.zombie_vars[ "zombie_health_increase_multiplier" ] ); + if ( zombie_health < old_health ) + { + return old_health; + } + i++; + continue; + } + zombie_health = int( zombie_health + level.zombie_vars[ "zombie_health_increase" ] ); + i++; + } + return zombie_health; +} + +round_spawn_failsafe_debug() //checked dev call deleted +{ +} + +round_spawn_failsafe() //checked changed to match cerberus output +{ + self endon( "death" ); + prevorigin = self.origin; + while ( 1 ) + { + if ( !level.zombie_vars[ "zombie_use_failsafe" ] ) + { + return; + } + if ( is_true( self.ignore_round_spawn_failsafe ) ) + { + return; + } + wait 30; + if ( !self.has_legs ) + { + wait 10; + } + if ( is_true( self.is_inert ) ) + { + continue; + } + if ( isDefined( self.lastchunk_destroy_time ) ) + { + if ( ( getTime() - self.lastchunk_destroy_time ) < 8000 ) + { + continue; + } + } + if ( self.origin[ 2 ] < level.zombie_vars[ "below_world_check" ] ) + { + if ( is_true( level.put_timed_out_zombies_back_in_queue ) && !flag( "dog_round" ) && !is_true( self.isscreecher ) ) + { + level.zombie_total++; + level.zombie_total_subtract++; + } + self dodamage( self.health + 100, ( 0, 0, 0 ) ); + return; + } + else if ( distancesquared( self.origin, prevorigin ) < 576 ) + { + if ( is_true( level.put_timed_out_zombies_back_in_queue ) && !flag( "dog_round" ) ) + { + if ( !self.ignoreall && !is_true( self.nuked ) && !is_true( self.marked_for_death ) && !is_true( self.isscreecher ) && is_true( self.has_legs ) ) + { + level.zombie_total++; + level.zombie_total_subtract++; + } + } + level.zombies_timeout_playspace++; + self dodamage( self.health + 100, ( 0, 0, 0 ) ); + return; + } + else + { + prevorigin = self.origin; + } + } +} + +round_wait() //checked changed to match cerberus output +{ + level endon( "restart_round" ); + wait 1; + if ( flag( "dog_round" ) ) + { + wait 7 ; + while ( level.dog_intermission ) + { + wait 0.5; + } + increment_dog_round_stat( "finished" ); + } + while( 1 ) + { + should_wait = 0; + if ( isdefined( level.is_ghost_round_started ) && [[ level.is_ghost_round_started ]]() ) + { + should_wait = 1; + } + //changed the logic here to make more sense + //if ( get_current_zombie_count() > 0 && level.zombie_total > 0 && !level.intermission ) + if ( get_current_zombie_count() > 0 || level.zombie_total > 0 ) + { + should_wait = 1; + } + if ( !should_wait ) + { + return; + } + if ( flag( "end_round_wait" ) ) + { + return; + } + wait 1; + } +} + +zombify_player() //checked matches cerberus output +{ + self maps/mp/zombies/_zm_score::player_died_penalty(); + bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "died", self.origin ); + self recordplayerdeathzombies(); + if ( isDefined( level.deathcard_spawn_func ) ) + { + self [[ level.deathcard_spawn_func ]](); + } + if ( !isDefined( level.zombie_vars[ "zombify_player" ] ) || !level.zombie_vars[ "zombify_player" ] ) + { + self thread spawnspectator(); + return; + } + self.ignoreme = 1; + self.is_zombie = 1; + self.zombification_time = getTime(); + self.team = level.zombie_team; + self notify( "zombified" ); + if ( isDefined( self.revivetrigger ) ) + { + self.revivetrigger delete(); + } + self.revivetrigger = undefined; + self setmovespeedscale( 0.3 ); + self reviveplayer(); + self takeallweapons(); + self giveweapon( "zombie_melee", 0 ); + self switchtoweapon( "zombie_melee" ); + self disableweaponcycling(); + self disableoffhandweapons(); + setclientsysstate( "zombify", 1, self ); + self thread maps/mp/zombies/_zm_spawner::zombie_eye_glow(); + self thread playerzombie_player_damage(); + self thread playerzombie_soundboard(); +} + +playerzombie_player_damage() //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + self thread playerzombie_infinite_health(); + self.zombiehealth = level.zombie_health; + while ( 1 ) + { + self waittill( "damage", amount, attacker, directionvec, point, type ); + while ( !isDefined( attacker ) || !isplayer( attacker ) ) + { + wait 0.05; + } + self.zombiehealth -= amount; + if ( self.zombiehealth <= 0 ) + { + self thread playerzombie_downed_state(); + self waittill( "playerzombie_downed_state_done" ); + self.zombiehealth = level.zombie_health; + } + } +} + +playerzombie_downed_state() //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + downtime = 15; + starttime = getTime(); + endtime = starttime + ( downtime * 1000 ); + self thread playerzombie_downed_hud(); + self.playerzombie_soundboard_disable = 1; + self thread maps/mp/zombies/_zm_spawner::zombie_eye_glow_stop(); + self disableweapons(); + self allowstand( 0 ); + self allowcrouch( 0 ); + self allowprone( 1 ); + while ( getTime() < endtime ) + { + wait 0.05; + } + self.playerzombie_soundboard_disable = 0; + self thread maps/mp/zombies/_zm_spawner::zombie_eye_glow(); + self enableweapons(); + self allowstand( 1 ); + self allowcrouch( 0 ); + self allowprone( 0 ); + self notify( "playerzombie_downed_state_done" ); +} + +playerzombie_downed_hud() //checked changed to match cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + text = newclienthudelem( self ); + text.alignx = "center"; + text.aligny = "middle"; + text.horzalign = "user_center"; + text.vertalign = "user_bottom"; + text.foreground = 1; + text.font = "default"; + text.fontscale = 1.8; + text.alpha = 0; + text.color = ( 1, 1, 1 ); + text settext( &"ZOMBIE_PLAYERZOMBIE_DOWNED" ); + text.y = -113; + /* + if ( self issplitscreen() ) + { + text.y = -137; + } + */ + text fadeovertime( 0.1 ); + text.alpha = 1; + self waittill( "playerzombie_downed_state_done" ); + text fadeovertime( 0.1 ); + text.alpha = 0; +} + +playerzombie_infinite_health() //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + bighealth = 100000; + while ( 1 ) + { + if ( self.health < bighealth ) + { + self.health = bighealth; + } + wait 0.1; + } +} + +playerzombie_soundboard() //checked changed to match cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + self.playerzombie_soundboard_disable = 0; + self.buttonpressed_use = 0; + self.buttonpressed_attack = 0; + self.buttonpressed_ads = 0; + self.usesound_waittime = 3000; + self.usesound_nexttime = getTime(); + usesound = "playerzombie_usebutton_sound"; + self.attacksound_waittime = 3000; + self.attacksound_nexttime = getTime(); + attacksound = "playerzombie_attackbutton_sound"; + self.adssound_waittime = 3000; + self.adssound_nexttime = getTime(); + adssound = "playerzombie_adsbutton_sound"; + self.inputsound_nexttime = getTime(); + while( 1 ) + { + while ( self.playerzombie_soundboard_disable ) //set to while loop instead of using continue + { + wait 0.05; + } + if ( self usebuttonpressed() ) + { + if ( self can_do_input( "use" ) ) + { + self thread playerzombie_play_sound( usesound ); + self thread playerzombie_waitfor_buttonrelease( "use" ); + self.usesound_nexttime = GetTime() + self.usesound_waittime; + } + } + else if ( self attackbuttonpressed() ) + { + if ( self can_do_input( "attack" ) ) + { + self thread playerzombie_play_sound( attacksound ); + self thread playerzombie_waitfor_buttonrelease( "attack" ); + self.attacksound_nexttime = GetTime() + self.attacksound_waittime; + } + } + else if ( self adsbuttonpressed() ) + { + if ( self can_do_input( "ads" ) ) + { + self thread playerzombie_play_sound( adssound ); + self thread playerzombie_waitfor_buttonrelease( "ads" ); + self.adssound_nexttime = GetTime() + self.adssound_waittime; + } + } + wait 0.05; + } +} + +can_do_input( inputtype ) //checked matches cerberus output +{ + if ( getTime() < self.inputsound_nexttime ) + { + return 0; + } + cando = 0; + switch( inputtype ) + { + case "use": + if ( getTime() >= self.usesound_nexttime && !self.buttonpressed_use ) + { + cando = 1; + } + break; + case "attack": + if ( getTime() >= self.attacksound_nexttime && !self.buttonpressed_attack ) + { + cando = 1; + } + break; + case "ads": + if ( getTime() >= self.usesound_nexttime && !self.buttonpressed_ads ) + { + cando = 1; + } + break; + default: + break; + } + return cando; +} + +playerzombie_play_sound( alias ) //checked matches cerberus output +{ + self play_sound_on_ent( alias ); +} + +playerzombie_waitfor_buttonrelease( inputtype ) //may look into this if its broken 9/8/20 +{ + if ( inputtype != "use" && inputtype != "attack" && inputtype != "ads" ) + { + return; + } + notifystring = "waitfor_buttonrelease_" + inputtype; + self notify( notifystring ); + self endon( notifystring ); + if ( inputtype == "use" ) + { + self.buttonpressed_use = 1; + while ( self usebuttonpressed() ) + { + wait 0.05; + } + self.buttonpressed_use = 0; + } + else if ( inputtype == "attack" ) + { + self.buttonpressed_attack = 1; + while ( self attackbuttonpressed() ) + { + wait 0.05; + } + self.buttonpressed_attack = 0; + } + else if ( inputtype == "ads" ) + { + self.buttonpressed_ads = 1; + while ( self adsbuttonpressed() ) + { + wait 0.05; + } + self.buttonpressed_ads = 0; + } +} + +remove_ignore_attacker() //checked matches cerberus output +{ + self notify( "new_ignore_attacker" ); + self endon( "new_ignore_attacker" ); + self endon( "disconnect" ); + if ( !isDefined( level.ignore_enemy_timer ) ) + { + level.ignore_enemy_timer = 0.4; + } + wait level.ignore_enemy_timer; + self.ignoreattacker = undefined; +} + +player_shield_facing_attacker( vdir, limit ) //checked matches cerberus output +{ + orientation = self getplayerangles(); + forwardvec = anglesToForward( orientation ); + forwardvec2d = ( forwardvec[ 0 ], forwardvec[ 1 ], 0 ); + unitforwardvec2d = vectornormalize( forwardvec2d ); + tofaceevec = vdir * -1; + tofaceevec2d = ( tofaceevec[ 0 ], tofaceevec[ 1 ], 0 ); + unittofaceevec2d = vectornormalize( tofaceevec2d ); + dotproduct = vectordot( unitforwardvec2d, unittofaceevec2d ); + return dotproduct > limit; //is this valid? +} + +player_damage_override_cheat( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) //checked matches cerberus output +{ + player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + return 0; +} + +player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) //checked changed to match cerberus output +{ + if ( isDefined( level._game_module_player_damage_callback ) ) + { + self [[ level._game_module_player_damage_callback ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + } + idamage = self check_player_damage_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + if ( is_true( self.use_adjusted_grenade_damage ) ) + { + self.use_adjusted_grenade_damage = undefined; + if ( self.health > idamage ) + { + return idamage; + } + } + if ( !idamage ) + { + return 0; + } + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return 0; + } + if ( isDefined( einflictor ) ) + { + if ( is_true( einflictor.water_damage ) ) + { + return 0; + } + } + if ( isDefined( eattacker ) && is_true( eattacker.is_zombie ) || isplayer( eattacker ) ) + { + if ( is_true( self.hasriotshield ) && isDefined( vdir ) ) + { + if ( is_true( self.hasriotshieldequipped ) ) + { + if ( self player_shield_facing_attacker( vdir, 0.2 ) && isDefined( self.player_shield_apply_damage ) ) + { + self [[ self.player_shield_apply_damage ]]( 100, 0 ); + return 0; + } + } + else if ( !isDefined( self.riotshieldentity ) ) + { + if ( !self player_shield_facing_attacker( vdir, -0.2 ) && isDefined( self.player_shield_apply_damage ) ) + { + self [[ self.player_shield_apply_damage ]]( 100, 0 ); + return 0; + } + } + } + } + if ( isDefined( eattacker ) ) + { + if ( isDefined( self.ignoreattacker ) && self.ignoreattacker == eattacker ) + { + return 0; + } + if ( is_true( self.is_zombie ) && is_true( eattacker.is_zombie ) ) + { + return 0; + } + if ( is_true( eattacker.is_zombie ) ) + { + self.ignoreattacker = eattacker; + self thread remove_ignore_attacker(); + if ( isDefined( eattacker.custom_damage_func ) ) + { + idamage = eattacker [[ eattacker.custom_damage_func ]]( self ); + } + else if ( isDefined( eattacker.meleedamage ) ) + { + idamage = eattacker.meleedamage; + } + else + { + idamage = 50; + } + } + eattacker notify( "hit_player" ); + if ( smeansofdeath != "MOD_FALLING" ) + { + self thread playswipesound( smeansofdeath, eattacker ); + //changed to match bo3 _zm.gsc + if ( is_true( eattacker.is_zombie ) || isplayer( eattacker ) ) + { + self playrumbleonentity( "damage_heavy" ); + } + canexert = 1; + if ( is_true( level.pers_upgrade_flopper ) ) + { + if ( is_true( self.pers_upgrades_awarded[ "flopper" ] ) ) + { + if ( smeansofdeath != "MOD_PROJECTILE_SPLASH" && smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_GRENADE_SPLASH" ) + { + canexert = smeansofdeath; + } + } + } + if ( is_true( canexert ) ) + { + if ( randomintrange( 0, 1 ) == 0 ) + { + self thread maps/mp/zombies/_zm_audio::playerexert( "hitmed" ); + } + else + { + self thread maps/mp/zombies/_zm_audio::playerexert( "hitlrg" ); + } + } + } + } + finaldamage = idamage; + //checked changed to match bo1 _zombiemode.gsc + if ( is_placeable_mine( sweapon ) || sweapon == "freezegun_zm" || sweapon == "freezegun_upgraded_zm" ) + { + return 0; + } + if ( isDefined( self.player_damage_override ) ) + { + self thread [[ self.player_damage_override ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + } + if ( smeansofdeath == "MOD_FALLING" ) + { + if ( self hasperk( "specialty_flakjacket" ) && isDefined( self.divetoprone ) && self.divetoprone == 1 ) + { + if ( isDefined( level.zombiemode_divetonuke_perk_func ) ) + { + [[ level.zombiemode_divetonuke_perk_func ]]( self, self.origin ); + } + return 0; + } + if ( is_true( level.pers_upgrade_flopper ) ) + { + if ( self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_flopper_damage_check( smeansofdeath, idamage ) ) + { + return 0; + } + } + } + //checked changed to match bo1 _zombiemode.gsc + if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" ) + { + if ( self hasperk( "specialty_flakjacket" ) ) + { + return 0; + } + if ( is_true( level.pers_upgrade_flopper ) ) + { + if ( is_true( self.pers_upgrades_awarded[ "flopper" ] ) ) + { + return 0; + } + } + if ( self.health > 75 && !is_true( self.is_zombie ) ) + { + return 75; + } + } + if ( idamage < self.health ) + { + if ( isDefined( eattacker ) ) + { + if ( isDefined( level.custom_kill_damaged_vo ) ) + { + eattacker thread [[ level.custom_kill_damaged_vo ]]( self ); + } + else + { + eattacker.sound_damage_player = self; + } + if ( !is_true( eattacker.has_legs ) ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "crawl_hit" ); + } + else if ( isDefined( eattacker.animname ) && eattacker.animname == "monkey_zombie" ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "monkey_hit" ); + } + } + return finaldamage; + } + if ( isDefined( eattacker ) ) + { + if ( isDefined( eattacker.animname ) && eattacker.animname == "zombie_dog" ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "killed_by_zdog" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "killed_by_zdog" ); + } + else if ( isDefined( eattacker.is_avogadro ) && eattacker.is_avogadro ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "killed_by_avogadro", 0 ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "killed_by_avogadro" ); + } + } + self thread clear_path_timers(); + if ( level.intermission ) + { + level waittill( "forever" ); + } + if ( level.scr_zm_ui_gametype == "zcleansed" && idamage > 0 ) + { + if ( ( !is_true( self.laststand ) && !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || !isDefined( self.last_player_attacker ) ) && isDefined( eattacker ) && isplayer( eattacker ) && eattacker.team != self.team ) + { + if ( isDefined( eattacker.maxhealth ) && is_true( eattacker.is_zombie ) ) + { + eattacker.health = eattacker.maxhealth; + } + if ( isDefined( level.player_kills_player ) ) + { + self thread [[ level.player_kills_player ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + } + } + } + //changed from && to || + if ( self.lives > 0 || self hasperk( "specialty_finalstand" ) ) + { + self.lives--; + + if ( isDefined( level.chugabud_laststand_func ) ) + { + self thread [[ level.chugabud_laststand_func ]](); + return 0; + } + } + players = get_players(); + count = 0; + //subtle changes in logic in the if statements + for ( i = 0; i < players.size; i++ ) + { + //count of dead players + //checked changed to match bo1 _zombiemode.gsc + if ( players[ i ] == self || players[ i ].is_zombie || players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ i ].sessionstate == "spectator" ) + { + count++; + } + } + //checked against bo3 _zm.gsc changed to match + if ( count < players.size || isDefined( level._game_module_game_end_check ) && ![[ level._game_module_game_end_check ]]() ) + { + if ( isDefined( self.lives ) && self.lives > 0 && is_true( level.force_solo_quick_revive ) && self hasperk( "specialty_quickrevive" ) ) + { + self thread wait_and_revive(); + } + return finaldamage; + } + solo_death = is_solo_death( self, players ); + non_solo_death = is_non_solo_death( self, players, count ); + if ( ( solo_death || non_solo_death ) && !is_true( level.no_end_game_check ) ) + { + level notify( "stop_suicide_trigger" ); + self thread maps/mp/zombies/_zm_laststand::playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ); + if ( !isDefined( vdir ) ) + { + vdir = ( 1, 0, 0 ); + } + self fakedamagefrom( vdir ); + if ( isDefined( level.custom_player_fake_death ) ) + { + self thread [[ level.custom_player_fake_death ]]( vdir, smeansofdeath ); + } + else + { + self thread player_fake_death(); + } + } + if ( count == players.size && !is_true( level.no_end_game_check ) ) + { + if ( players.size == 1 && flag( "solo_game" ) ) + { + if ( self.lives == 0 || !self hasperk( "specialty_quickrevive" ) ) + { + self.lives = 0; + level notify( "pre_end_game" ); + wait_network_frame(); + if ( flag( "dog_round" ) ) + { + increment_dog_round_stat( "lost" ); + } + level notify( "end_game" ); + } + else + { + return finaldamage; + } + } + else + { + level notify( "pre_end_game" ); + wait_network_frame(); + if ( flag( "dog_round" ) ) + { + increment_dog_round_stat( "lost" ); + } + level notify( "end_game" ); + } + return 0; + } + else + { + surface = "flesh"; + return finaldamage; + } +} + +clear_path_timers() //checked changed to match cerberus output //checked against bo3 _zm.gsc matches +{ + zombies = getaiarray( level.zombie_team ); + foreach ( zombie in zombies ) + { + if ( isdefined( zombie.favoriteenemy ) && zombie.favoriteenemy == self ) + { + zombie.zombie_path_timer = 0; + } + } +} + +check_player_damage_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) //checked changed to match cerberus output //checked again against bo1 _zombiemode.gsc matches //checked against bo3 _zm.gsc matches +{ + if ( !isDefined( level.player_damage_callbacks ) ) + { + return idamage; + } + for ( i = 0; i < level.player_damage_callbacks.size; i++ ) + { + newdamage = self [[ level.player_damage_callbacks[ i ] ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + if ( newdamage != -1 ) + { + return newdamage; + } + } + return idamage; +} + +register_player_damage_callback( func ) //checked matches cerberus output //checked again against bo1 _zombiemode.gsc matches //checked against bo3 _zm.gsc matches +{ + if ( !isDefined( level.player_damage_callbacks ) ) + { + level.player_damage_callbacks = []; + } + level.player_damage_callbacks[ level.player_damage_callbacks.size ] = func; +} + +wait_and_revive() //checked changed to match cerberus output //checked against bo3 _zm.gsc matches within reason +{ + flag_set( "wait_and_revive" ); + if ( isDefined( self.waiting_to_revive ) && self.waiting_to_revive == 1 ) + { + return; + } + if ( is_true( self.pers_upgrades_awarded[ "perk_lose" ] ) ) + { + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_perk_lose_save(); + } + self.waiting_to_revive = 1; + if ( isDefined( level.exit_level_func ) ) + { + self thread [[ level.exit_level_func ]](); + } + else if ( get_players().size == 1 ) + { + self thread default_exit_level(); + } + solo_revive_time = 10; + self.revive_hud settext( &"ZOMBIE_REVIVING_SOLO", self ); + self maps/mp/zombies/_zm_laststand::revive_hud_show_n_fade( solo_revive_time ); + flag_wait_or_timeout( "instant_revive", solo_revive_time ); + if ( flag( "instant_revive" ) ) + { + self maps/mp/zombies/_zm_laststand::revive_hud_show_n_fade( 1 ); + } + flag_clear( "wait_and_revive" ); + self maps/mp/zombies/_zm_laststand::auto_revive( self ); + self.lives--; + + self.waiting_to_revive = 0; + if ( is_true( self.pers_upgrades_awarded[ "perk_lose" ] ) ) + { + self thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_perk_lose_restore(); + } +} + +actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked changed to match cerberus output //checked against bo3 _zm.gsc partially changed to match +{ + if ( !isDefined( self ) || !isDefined( attacker ) ) + { + return damage; + } + if ( weapon == "tazer_knuckles_zm" || weapon == "jetgun_zm" ) + { + self.knuckles_extinguish_flames = 1; + } + else if ( weapon != "none" ) + { + self.knuckles_extinguish_flames = undefined; + } + if ( isDefined( attacker.animname ) && attacker.animname == "quad_zombie" ) + { + if ( isDefined( self.animname ) && self.animname == "quad_zombie" ) + { + return 0; + } + } + if ( !isplayer( attacker ) && isDefined( self.non_attacker_func ) ) + { + if ( is_true( self.non_attack_func_takes_attacker ) ) + { + return self [[ self.non_attacker_func ]]( damage, weapon, attacker ); + } + else + { + return self [[ self.non_attacker_func ]]( damage, weapon ); + } + } + if ( !isplayer( attacker ) && !isplayer( self ) ) + { + return damage; + } + if ( !isDefined( damage ) || !isDefined( meansofdeath ) ) + { + return damage; + } + if ( meansofdeath == "" ) + { + return damage; + } + old_damage = damage; + final_damage = damage; + if ( isDefined( self.actor_damage_func ) ) + { + final_damage = [[ self.actor_damage_func ]]( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + } + if ( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) + { + attacker = attacker.owner; + } + if ( is_true( self.in_water ) ) + { + if ( int( final_damage ) >= self.health ) + { + self.water_damage = 1; + } + } + attacker thread maps/mp/gametypes_zm/_weapons::checkhit( weapon ); + if ( attacker maps/mp/zombies/_zm_pers_upgrades_functions::pers_mulit_kill_headshot_active() && is_headshot( weapon, shitloc, meansofdeath ) ) + { + final_damage *= 2; + } + if ( is_true( level.headshots_only ) && isDefined( attacker ) && isplayer( attacker ) ) + { + //changed to match bo3 _zm.gsc behavior + if ( meansofdeath == "MOD_MELEE" && shitloc == "head" || meansofdeath == "MOD_MELEE" && shitloc == "helmet" ) + { + return int( final_damage ); + } + if ( is_explosive_damage( meansofdeath ) ) + { + return int( final_damage ); + } + else if ( !is_headshot( weapon, shitloc, meansofdeath ) ) + { + return 0; + } + } + return int( final_damage ); +} + +actor_damage_override_wrapper( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked does not match cerberus output did not change +{ + damage_override = self actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + if ( ( self.health - damage_override ) > 0 || !is_true( self.dont_die_on_me ) ) + { + self finishactordamage( inflictor, attacker, damage_override, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + } + else + { + self [[ level.callbackactorkilled ]]( inflictor, attacker, damage, meansofdeath, weapon, vdir, shitloc, psoffsettime ); + self finishactordamage( inflictor, attacker, damage_override, flags, meansofdeath, weapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + } +} + +actor_killed_override( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ) //checked matches cerberus output +{ + if ( isDefined( game[ "state" ] ) && game[ "state" ] == "postgame" ) + { + return; + } + if ( isai( attacker ) && isDefined( attacker.script_owner ) ) + { + if ( attacker.script_owner.team != self.team ) //changed to match bo3 _zm.gsc + { + attacker = attacker.script_owner; + } + } + if ( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) + { + attacker = attacker.owner; + } + if ( isDefined( attacker ) && isplayer( attacker ) ) + { + multiplier = 1; + if ( is_headshot( sweapon, shitloc, smeansofdeath ) ) + { + multiplier = 1.5; + } + type = undefined; + if ( isDefined( self.animname ) ) + { + switch( self.animname ) + { + case "quad_zombie": + type = "quadkill"; + break; + case "ape_zombie": + type = "apekill"; + break; + case "zombie": + type = "zombiekill"; + break; + case "zombie_dog": + type = "dogkill"; + break; + } + } + } + if ( is_true( self.is_ziplining ) ) + { + self.deathanim = undefined; + } + if ( isDefined( self.actor_killed_override ) ) + { + self [[ self.actor_killed_override ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ); + } + /* + if ( isDefined( self.deathfunction ) ) //added from bo3 _zm.gsc + { + self [[ self.deathfunction ]]( eInflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ); + } + */ +} + +round_end_monitor() //checked matches cerberus output //checked against bo3 _zm.gsc matches within reason +{ + while ( 1 ) + { + level waittill( "end_of_round" ); + maps/mp/_demo::bookmark( "zm_round_end", getTime(), undefined, undefined, 1 ); + bbpostdemostreamstatsforround( level.round_number ); + wait 0.05; + } +} + +end_game() //checked changed to match cerberus output +{ + level waittill( "end_game" ); + check_end_game_intermission_delay(); + clientnotify( "zesn" ); + if ( isDefined( level.sndgameovermusicoverride ) ) + { + level thread maps/mp/zombies/_zm_audio::change_zombie_music( level.sndgameovermusicoverride ); + } + else + { + level thread maps/mp/zombies/_zm_audio::change_zombie_music( "game_over" ); + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + setclientsysstate( "lsm", "0", players[ i ] ); + } + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ] player_is_in_laststand() ) + { + players[ i ] recordplayerdeathzombies(); + players[ i ] maps/mp/zombies/_zm_stats::increment_player_stat( "deaths" ); + players[ i ] maps/mp/zombies/_zm_stats::increment_client_stat( "deaths" ); + players[ i ] maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); + } + if ( isdefined( players[ i ].revivetexthud) ) + { + players[ i ].revivetexthud destroy(); + } + } + stopallrumbles(); + level.intermission = 1; + level.zombie_vars[ "zombie_powerup_insta_kill_time" ] = 0; + level.zombie_vars[ "zombie_powerup_fire_sale_time" ] = 0; + level.zombie_vars[ "zombie_powerup_point_doubler_time" ] = 0; + wait 0.1; + game_over = []; + survived = []; + players = get_players(); + setmatchflag( "disableIngameMenu", 1 ); + foreach ( player in players ) + { + player closemenu(); + player closeingamemenu(); + } + if ( !isDefined( level._supress_survived_screen ) ) + { + for ( i = 0; i < players.size; i++ ) + { + if ( isDefined( level.custom_game_over_hud_elem ) ) + { + game_over[ i ] = [[ level.custom_game_over_hud_elem ]]( players[ i ] ); + } + else + { + game_over[ i ] = newclienthudelem( players[ i ] ); + game_over[ i ].alignx = "center"; + game_over[ i ].aligny = "middle"; + game_over[ i ].horzalign = "center"; + game_over[ i ].vertalign = "middle"; + game_over[ i ].y -= 130; + game_over[ i ].foreground = 1; + game_over[ i ].fontscale = 3; + game_over[ i ].alpha = 0; + game_over[ i ].color = ( 1, 1, 1 ); + game_over[ i ].hidewheninmenu = 1; + game_over[ i ] settext( &"ZOMBIE_GAME_OVER" ); + game_over[ i ] fadeovertime( 1 ); + game_over[ i ].alpha = 1; + /* + if ( players[ i ] issplitscreen() ) + { + game_over[ i ].fontscale = 2; + game_over[ i ].y += 40; + } + */ + } + survived[ i ] = newclienthudelem( players[ i ] ); + survived[ i ].alignx = "center"; + survived[ i ].aligny = "middle"; + survived[ i ].horzalign = "center"; + survived[ i ].vertalign = "middle"; + survived[ i ].y -= 100; + survived[ i ].foreground = 1; + survived[ i ].fontscale = 2; + survived[ i ].alpha = 0; + survived[ i ].color = ( 1, 1, 1 ); + survived[ i ].hidewheninmenu = 1; + /* + if ( players[ i ] issplitscreen() ) + { + survived[ i ].fontscale = 1.5; + survived[ i ].y += 40; + } + */ + if ( level.round_number < 2 ) + { + if ( level.script == "zombie_moon" ) + { + if ( !isDefined( level.left_nomans_land ) ) + { + nomanslandtime = level.nml_best_time; + player_survival_time = int( nomanslandtime / 1000 ); + player_survival_time_in_mins = maps/mp/zombies/_zm::to_mins( player_survival_time ); + survived[ i ] settext( &"ZOMBIE_SURVIVED_NOMANS", player_survival_time_in_mins ); + } + else if ( level.left_nomans_land == 2 ) + { + survived[ i ] settext( &"ZOMBIE_SURVIVED_ROUND" ); + } + } + else + { + survived[ i ] settext( &"ZOMBIE_SURVIVED_ROUND" ); + } + } + else + { + survived[ i ] settext( &"ZOMBIE_SURVIVED_ROUNDS", level.round_number ); + } + survived[ i ] fadeovertime( 1 ); + survived[ i ].alpha = 1; + } + } + if ( isDefined( level.custom_end_screen ) ) + { + level [[ level.custom_end_screen ]](); + } + for ( i = 0; i < players.size; i++ ) + { + players[ i ] setclientammocounterhide( 1 ); + players[ i ] setclientminiscoreboardhide( 1 ); + } + uploadstats(); + maps/mp/zombies/_zm_stats::update_players_stats_at_match_end( players ); + maps/mp/zombies/_zm_stats::update_global_counters_on_match_end(); + wait 1; + wait 3.95; + players = get_players(); + foreach ( player in players ) + { + if ( isdefined( player.sessionstate ) && player.sessionstate == "spectator" ) + { + player.sessionstate = "playing"; + } + } + wait 0.05; + players = get_players(); + if ( !isDefined( level._supress_survived_screen ) ) + { + for(i = 0; i < players.size; i++) + { + survived[ i ] destroy(); + game_over[ i ] destroy(); + } + } + for ( i = 0; i < players.size; i++ ) + { + if ( isDefined( players[ i ].survived_hud ) ) + { + players[ i ].survived_hud destroy(); + } + if ( isDefined( players[ i ].game_over_hud ) ) + { + players[ i ].game_over_hud destroy(); + } + } + intermission(); + wait level.zombie_vars[ "zombie_intermission_time" ]; + level notify( "stop_intermission" ); + array_thread( get_players(), ::player_exit_level ); + bbprint( "zombie_epilogs", "rounds %d", level.round_number ); + wait 1.5; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] cameraactivate( 0 ); + } + exitlevel( 0 ); + wait 666; +} + +disable_end_game_intermission( delay ) //checked matches cerberus output +{ + level.disable_intermission = 1; + wait delay; + level.disable_intermission = undefined; +} + +check_end_game_intermission_delay() //checked changed to match cerberus output +{ + while ( isDefined( level.disable_intermission ) ) + { + while ( 1 ) + { + if ( !isDefined( level.disable_intermission ) ) + { + return; + } + wait 0.01; + } + } +} + +upload_leaderboards() //checked changed to match cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] uploadleaderboards(); + } +} + +initializestattracking() //checked matches cerberus output +{ + level.global_zombies_killed = 0; + level.zombies_timeout_spawn = 0; + level.zombies_timeout_playspace = 0; + level.zombies_timeout_undamaged = 0; + level.zombie_player_killed_count = 0; + level.zombie_trap_killed_count = 0; + level.zombie_pathing_failed = 0; + level.zombie_breadcrumb_failed = 0; +} + +uploadglobalstatcounters() //checked matches cerberus output +{ + incrementcounter( "global_zombies_killed", level.global_zombies_killed ); + incrementcounter( "global_zombies_killed_by_players", level.zombie_player_killed_count ); + incrementcounter( "global_zombies_killed_by_traps", level.zombie_trap_killed_count ); +} + +player_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 1; + self freezecontrols( 1 ); +} + +player_exit_level() //checked matches cerberus output +{ + self allowstand( 1 ); + self allowcrouch( 0 ); + self allowprone( 0 ); + if ( isDefined( self.game_over_bg ) ) + { + self.game_over_bg.foreground = 1; + self.game_over_bg.sort = 100; + self.game_over_bg fadeovertime( 1 ); + self.game_over_bg.alpha = 1; + } +} + +player_killed_override( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +{ + level waittill( "forever" ); +} + +player_zombie_breadcrumb() //checked changed to match cerberus output +{ + self notify( "stop_player_zombie_breadcrumb" ); + self endon( "stop_player_zombie_breadcrumb" ); + self endon( "disconnect" ); + self endon( "spawned_spectator" ); + level endon( "intermission" ); + self.zombie_breadcrumbs = []; + self.zombie_breadcrumb_distance = 576; + self.zombie_breadcrumb_area_num = 3; + self.zombie_breadcrumb_area_distance = 16; + self store_crumb( self.origin ); + last_crumb = self.origin; + self thread debug_breadcrumbs(); + while ( 1 ) + { + wait_time = 0.1; + while ( self.ignoreme ) + { + wait wait_time; + } + store_crumb = 1; + airborne = 0; + crumb = self.origin; + if ( !self isonground() && self isinvehicle() ) + { + trace = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 10 ), self.origin, 0, undefined ); + crumb = trace[ "position" ]; + } + if ( !airborne && distancesquared( crumb, last_crumb ) < self.zombie_breadcrumb_distance ) + { + store_crumb = 0; + } + if ( airborne && self isonground() ) + { + store_crumb = 1; + airborne = 0; + } + if ( isDefined( level.custom_breadcrumb_store_func ) ) + { + store_crumb = self [[ level.custom_breadcrumb_store_func ]]( store_crumb ); + } + if ( isDefined( level.custom_airborne_func ) ) + { + airborne = self [[ level.custom_airborne_func ]]( airborne ); + } + if ( store_crumb ) + { + debug_print( "Player is storing breadcrumb " + crumb ); + if ( isDefined( self.node ) ) + { + debug_print( "has closest node " ); + } + last_crumb = crumb; + self store_crumb( crumb ); + } + wait wait_time; + } +} + +store_crumb( origin ) //checked changed to match cerberus output +{ + offsets = []; + height_offset = 32; + index = 0; + for ( j = 1; j <= self.zombie_breadcrumb_area_num; j++ ) + { + offset = j * self.zombie_breadcrumb_area_distance; + offsets[ 0 ] = ( origin[ 0 ] - offset, origin[ 1 ], origin[ 2 ] ); + offsets[ 1 ] = ( origin[ 0 ] + offset, origin[ 1 ], origin[ 2 ] ); + offsets[ 2 ] = ( origin[ 0 ], origin[ 1 ] - offset, origin[ 2 ] ); + offsets[ 3 ] = ( origin[ 0 ], origin[ 1 ] + offset, origin[ 2 ] ); + offsets[ 4 ] = ( origin[ 0 ] - offset, origin[ 1 ], origin[ 2 ] + height_offset ); + offsets[ 5 ] = ( origin[ 0 ] + offset, origin[ 1 ], origin[ 2 ] + height_offset ); + offsets[ 6 ] = ( origin[ 0 ], origin[ 1 ] - offset, origin[ 2 ] + height_offset ); + offsets[ 7 ] = ( origin[ 0 ], origin[ 1 ] + offset, origin[ 2 ] + height_offset ); + for ( i = 0; i < offsets.size; i++ ) + { + self.zombie_breadcrumbs[ index ] = offsets[ i ]; + index++; + } + j++; + } +} + +to_mins( seconds ) //checked matches cerberus output +{ + hours = 0; + minutes = 0; + if ( seconds > 59 ) + { + minutes = int( seconds / 60 ); + seconds = int( seconds * 1000 ) % 60000; + seconds *= 0.001; + if ( minutes > 59 ) + { + hours = int( minutes / 60 ); + minutes = int( minutes * 1000 ) % 60000; + minutes *= 0.001; + } + } + if ( hours < 10 ) + { + hours = "0" + hours; + } + if ( minutes < 10 ) + { + minutes = "0" + minutes; + } + seconds = int( seconds ); + if ( seconds < 10 ) + { + seconds = "0" + seconds; + } + combined = "" + hours + ":" + minutes + ":" + seconds; + return combined; +} + +intermission() //checked changed to match cerberus output +{ + level.intermission = 1; + level notify( "intermission" ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + setclientsysstate( "levelNotify", "zi", players[ i ] ); + players[ i ] setclientthirdperson( 0 ); + players[ i ] resetfov(); + players[ i ].health = 100; + players[ i ] thread [[ level.custom_intermission ]](); + players[ i ] stopsounds(); + } + wait 0.25; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + setclientsysstate( "lsm", "0", players[ i ] ); + } + level thread zombie_game_over_death(); +} + +zombie_game_over_death() //checked changed to match cerberus output +{ + zombies = getaiarray( level.zombie_team ); + i = 0; + while ( i < zombies.size ) + { + if ( !isalive( zombies[ i ] ) ) + { + i++; + continue; + } + zombies[ i ] setgoalpos( zombies[ i ].origin ); + i++; + } + i = 0; + while ( i < zombies.size ) + { + if ( !isalive( zombies[ i ] ) ) + { + i++; + continue; + } + if ( is_true( zombies[ i ].ignore_game_over_death ) ) + { + i++; + continue; + } + wait ( 0.5 + randomfloat( 2 ) ); + if ( isDefined( zombies[ i ] ) ) + { + zombies[ i ] maps/mp/zombies/_zm_spawner::zombie_head_gib(); + zombies[ i ] dodamage( zombies[ i ].health + 666, zombies[ i ].origin ); + } + i++; + } +} + +player_intermission() //checked changed to match cerberus output +{ + self closemenu(); + self closeingamemenu(); + level endon( "stop_intermission" ); + self endon( "disconnect" ); + self endon( "death" ); + self notify( "_zombie_game_over" ); + self.score = self.score_total; + self.sessionstate = "intermission"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + points = getstructarray( "intermission", "targetname" ); + if ( !isDefined( points ) || points.size == 0 ) + { + points = getentarray( "info_intermission", "classname" ); + if ( points.size < 1 ) + { + return; + } + } + self.game_over_bg = newclienthudelem( self ); + self.game_over_bg.horzalign = "fullscreen"; + self.game_over_bg.vertalign = "fullscreen"; + self.game_over_bg setshader( "black", 640, 480 ); + self.game_over_bg.alpha = 1; + org = undefined; + + while ( 1 ) + { + points = array_randomize( points ); + i = 0; + while ( i < points.size ) + { + point = points[ i ]; + if ( !isdefined( org ) ) + { + self spawn( point.origin, point.angles ); + } + if ( isdefined( points[ i ].target ) ) + { + if ( !isdefined( org ) ) + { + org = spawn( "script_model", self.origin + VectorScale( 0, 0, -1, 60 ) ); + org setmodel( "tag_origin" ); + } + org.origin = points[ i ].origin; + org.angles = points[ i ].angles; + for( j = 0; j < get_players().size; j++ ) + { + player = get_players()[ j ]; + player camerasetposition(org); + player camerasetlookat(); + player cameraactivate( 1 ); + } + speed = 20; + if ( isdefined( points[ i ].speed ) ) + { + speed = points[ i ].speed; + } + target_point = getstruct( points[ i ].target, "targetname" ); + dist = distance( points[ i ].origin, target_point.origin ); + time = dist / speed; + q_time = time * 0.25; + if(q_time > 1) + { + q_time = 1; + } + self.game_over_bg fadeovertime( q_time ); + self.game_over_bg.alpha = 0; + org moveto( target_point.origin, time, q_time, q_time ); + org rotateto( target_point.angles, time, q_time, q_time ); + wait time - q_time ; + self.game_over_bg fadeovertime( q_time ); + self.game_over_bg.alpha = 1; + wait q_time; + i++; + continue; + } + self.game_over_bg fadeovertime( 1 ); + self.game_over_bg.alpha = 0; + wait 5; + self.game_over_bg thread fade_up_over_time( 1 ); + i++; + } + } +} + + +fade_up_over_time( t ) //checked matches cerberus output +{ + self fadeovertime( t ); + self.alpha = 1; +} + +default_exit_level() //checked partially changed match beta dump see info.md +{ + zombies = getaiarray( level.zombie_team ); + i = 0; + while ( i < zombies.size ) + { + if( is_true( zombies[ i ].ignore_solo_last_stand ) ) + { + i++; + continue; + } + if ( isdefined(zombies[ i ].find_exit_point ) ) + { + zombies[ i ] thread [[ zombies[i].find_exit_point ]](); + i++; + continue; + } + if ( zombies[ i ].ignoreme ) + { + zombies[ i ] thread default_delayed_exit(); + } + else + { + zombies[ i ] thread default_find_exit_point(); + } + i++; + } +} + +default_delayed_exit() //checked matches cerberus output +{ + self endon( "death" ); + while ( 1 ) + { + if ( !flag( "wait_and_revive" ) ) + { + return; + } + if ( !self.ignoreme ) + { + break; + } + wait 0.1; + } + self thread default_find_exit_point(); +} + +default_find_exit_point() //checked changed to match cerberus output +{ + self endon( "death" ); + player = get_players()[ 0 ]; + dist_zombie = 0; + dist_player = 0; + dest = 0; + away = vectornormalize( self.origin - player.origin ); + endpos = self.origin + vectorScale( away, 600 ); + locs = array_randomize( level.enemy_dog_locations ); + for ( i = 0; i < locs.size; i++ ) + { + dist_zombie = distancesquared( locs[ i ].origin, endpos ); + dist_player = distancesquared( locs[ i ].origin, player.origin ); + if ( dist_zombie < dist_player ) + { + dest = i; + break; + } + } + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + if ( isDefined( locs[ dest ] ) ) + { + self setgoalpos( locs[ dest ].origin ); + } + while ( 1 ) + { + b_passed_override = 1; + if ( isDefined( level.default_find_exit_position_override ) ) + { + b_passed_override = [[ level.default_find_exit_position_override ]](); + } + if ( !flag( "wait_and_revive" ) && b_passed_override ) + { + break; + } + wait 0.1; + } + self thread maps/mp/zombies/_zm_ai_basic::find_flesh(); +} + +play_level_start_vox_delayed() //checked matches cerberus output +{ + wait 3; + players = get_players(); + num = randomintrange( 0, players.size ); + players[ num ] maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "intro" ); +} + +register_sidequest( id, sidequest_stat ) //checked changed to match cerberus output +{ + if ( !isDefined( level.zombie_sidequest_stat ) ) + { + level.zombie_sidequest_previously_completed = []; + level.zombie_sidequest_stat = []; + } + level.zombie_sidequest_stat[ id ] = sidequest_stat; + flag_wait( "start_zombie_round_logic" ); + level.zombie_sidequest_previously_completed[ id ] = 0; + /* + if ( level.systemlink || getDvarInt( "splitscreen_playerCount" ) == get_players().size ) + { + return; + } + */ + if ( is_true( level.zm_disable_recording_stats ) ) + { + return; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ] maps/mp/zombies/_zm_stats::get_global_stat( level.zombie_sidequest_stat[ id ] ) ) + { + level.zombie_sidequest_previously_completed[ id ] = 1; + return; + } + } +} + +is_sidequest_previously_completed( id ) //checked does not match cerberus output did not change +{ + if ( isDefined( level.zombie_sidequest_previously_completed[ id ] ) ) + { + return level.zombie_sidequest_previously_completed[ id ]; + } +} + +set_sidequest_completed( id ) //checked changed to match cerberus output +{ + level notify( "zombie_sidequest_completed" ); + level.zombie_sidequest_previously_completed[ id ] = 1; + if ( level.systemlink ) + { + return; + } + /* + if ( getDvarInt( "splitscreen_playerCount" ) == get_players().size ) + { + return; + } + */ + if ( is_true( level.zm_disable_recording_stats ) ) + { + return; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( isDefined( level.zombie_sidequest_stat[ id ] ) ) + { + players[ i ] maps/mp/zombies/_zm_stats::add_global_stat( level.zombie_sidequest_stat[ id ], 1 ); + } + i++; + } +} + +playswipesound( mod, attacker ) //checked matches cerberus output +{ + if ( is_true( attacker.is_zombie ) ) + { + self playsoundtoplayer( "evt_player_swiped", self ); + return; + } +} + +precache_zombie_leaderboards() //checked changed to match cerberus output +{ + if ( sessionmodeissystemlink() ) + { + return; + } + globalleaderboards = "LB_ZM_GB_BULLETS_FIRED_AT "; + globalleaderboards += "LB_ZM_GB_BULLETS_HIT_AT "; + globalleaderboards += "LB_ZM_GB_DEATHS_AT "; + globalleaderboards += "LB_ZM_GB_DISTANCE_TRAVELED_AT "; + globalleaderboards += "LB_ZM_GB_DOORS_PURCHASED_AT "; + globalleaderboards += "LB_ZM_GB_DOWNS_AT "; + globalleaderboards += "LB_ZM_GB_GIBS_AT "; + globalleaderboards += "LB_ZM_GB_GRENADE_KILLS_AT "; + globalleaderboards += "LB_ZM_GB_HEADSHOTS_AT "; + globalleaderboards += "LB_ZM_GB_KILLS_AT "; + globalleaderboards += "LB_ZM_GB_PERKS_DRANK_AT "; + globalleaderboards += "LB_ZM_GB_REVIVES_AT "; + if ( sessionmodeisprivateonlinegame() ) + { + precacheleaderboards( globalleaderboards ); + return; + } + maplocationname = level.scr_zm_map_start_location; + if ( maplocationname == "default" || maplocationname == "" && isDefined( level.default_start_location ) ) + { + maplocationname = level.default_start_location; + } + if ( level.scr_zm_ui_gametype_group == "zclassic" || level.scr_zm_ui_gametype_group == "zsurvival" || level.scr_zm_ui_gametype != "zcleansed" ) + { + expectedplayernum = getnumexpectedplayers(); + if ( expectedplayernum == 1 ) + { + gamemodeleaderboard = "LB_ZM_GM_" + level.scr_zm_ui_gametype + "_" + maplocationname + "_" + expectedplayernum + "PLAYER"; + } + else + { + gamemodeleaderboard = "LB_ZM_GM_" + level.scr_zm_ui_gametype + "_" + maplocationname + "_" + expectedplayernum + "PLAYERS"; + } + } + else + { + gamemodeleaderboard = "LB_ZM_GM_" + level.scr_zm_ui_gametype + "_" + maplocationname; + } + precacheleaderboards( globalleaderboards + gamemodeleaderboard ); +} + +zm_on_player_connect() //checked matches cerberus output +{ + if ( level.passed_introscreen ) + { + self setclientuivisibilityflag( "hud_visible", 1 ); + } + thread refresh_player_navcard_hud(); + self thread watchdisconnect(); +} + +zm_on_player_disconnect() //checked matches cerberus output +{ + thread refresh_player_navcard_hud(); +} + +watchdisconnect() //checked matches cerberus output +{ + self notify( "watchDisconnect" ); + self endon( "watchDisconnect" ); + self waittill( "disconnect" ); + zm_on_player_disconnect(); +} + +increment_dog_round_stat( stat ) //checked changed to match cerberus output +{ + players = get_players(); + foreach ( player in players ) + { + player maps/mp/zombies/_zm_stats::increment_client_stat( "zdog_rounds_" + stat ); + } +} + +setup_player_navcard_hud() //checked matches cerberus output +{ + flag_wait( "start_zombie_round_logic" ); + thread refresh_player_navcard_hud(); +} + +refresh_player_navcard_hud() //checked changed to match cerberus output +{ + if ( !isDefined( level.navcards ) ) + { + return; + } + + players = get_players(); + foreach( player in players ) + { + navcard_bits = 0; + for ( i = 0; i < level.navcards.size; i++ ) + { + hasit = player maps/mp/zombies/_zm_stats::get_global_stat( level.navcards[ i ] ); + if ( isdefined( player.navcard_grabbed) && player.navcard_grabbed == level.navcards[ i ] ) + { + hasit = 1; + } + if ( hasit ) + { + navcard_bits = navcard_bits + 1; + } + } + wait_network_frame(); + player setclientfield( "navcard_held", 0 ); + if ( navcard_bits > 0 ) + { + wait_network_frame(); + player setclientfield( "navcard_held", navcard_bits ); + } + } +} + + +check_quickrevive_for_hotjoin( disconnecting_player ) //checked changed to match cerberus output +{ + solo_mode = 0; + subtract_num = 0; + should_update = 0; + if ( isDefined( disconnecting_player ) ) + { + subtract_num = 1; + } + players = get_players(); + if ( ( players.size - subtract_num ) == 1 || is_true( level.force_solo_quick_revive ) ) + { + solo_mode = 1; + if ( !flag( "solo_game" ) ) + { + should_update = 1; + } + flag_set( "solo_game" ); + } + else if ( flag( "solo_game" ) ) + { + should_update = 1; + } + flag_clear( "solo_game" ); + level.using_solo_revive = solo_mode; + level.revive_machine_is_solo = solo_mode; + set_default_laststand_pistol( solo_mode ); + if ( should_update && isDefined( level.quick_revive_machine ) ) + { + update_quick_revive( solo_mode ); + } } -playswipesound( mod, attacker ) +set_default_laststand_pistol( solo_mode ) //checked matches cerberus output { - if ( isdefined( attacker.is_zombie ) && attacker.is_zombie ) - { - self playsoundtoplayer( "evt_player_swiped", self ); - return; - } + if ( !solo_mode ) + { + level.laststandpistol = level.default_laststandpistol; + } + else + { + level.laststandpistol = level.default_solo_laststandpistol; + } } -precache_zombie_leaderboards() +update_quick_revive( solo_mode ) //checked matches cerberus output { - if ( sessionmodeissystemlink() ) - return; - - globalleaderboards = "LB_ZM_GB_BULLETS_FIRED_AT "; - globalleaderboards += "LB_ZM_GB_BULLETS_HIT_AT "; - globalleaderboards += "LB_ZM_GB_DEATHS_AT "; - globalleaderboards += "LB_ZM_GB_DISTANCE_TRAVELED_AT "; - globalleaderboards += "LB_ZM_GB_DOORS_PURCHASED_AT "; - globalleaderboards += "LB_ZM_GB_DOWNS_AT "; - globalleaderboards += "LB_ZM_GB_GIBS_AT "; - globalleaderboards += "LB_ZM_GB_GRENADE_KILLS_AT "; - globalleaderboards += "LB_ZM_GB_HEADSHOTS_AT "; - globalleaderboards += "LB_ZM_GB_KILLS_AT "; - globalleaderboards += "LB_ZM_GB_PERKS_DRANK_AT "; - globalleaderboards += "LB_ZM_GB_REVIVES_AT "; - - if ( sessionmodeisprivateonlinegame() ) - { - precacheleaderboards( globalleaderboards ); - return; - } - - maplocationname = level.scr_zm_map_start_location; - - if ( ( maplocationname == "default" || maplocationname == "" ) && isdefined( level.default_start_location ) ) - maplocationname = level.default_start_location; - - if ( ( level.scr_zm_ui_gametype_group == "zclassic" || level.scr_zm_ui_gametype_group == "zsurvival" ) && level.scr_zm_ui_gametype != "zcleansed" ) - { - expectedplayernum = getnumexpectedplayers(); - - if ( expectedplayernum == 1 ) - gamemodeleaderboard = "LB_ZM_GM_" + level.scr_zm_ui_gametype + "_" + maplocationname + "_" + expectedplayernum + "PLAYER"; - else - gamemodeleaderboard = "LB_ZM_GM_" + level.scr_zm_ui_gametype + "_" + maplocationname + "_" + expectedplayernum + "PLAYERS"; - } - else - gamemodeleaderboard = "LB_ZM_GM_" + level.scr_zm_ui_gametype + "_" + maplocationname; - - precacheleaderboards( globalleaderboards + gamemodeleaderboard ); + if ( !isDefined( solo_mode ) ) + { + solo_mode = 0; + } + clip = undefined; + if ( isDefined( level.quick_revive_machine_clip ) ) + { + clip = level.quick_revive_machine_clip; + } + level.quick_revive_machine thread maps/mp/zombies/_zm_perks::reenable_quickrevive( clip, solo_mode ); } -zm_on_player_connect() -{ - if ( level.passed_introscreen ) - self setclientuivisibilityflag( "hud_visible", 1 ); - - thread refresh_player_navcard_hud(); - self thread watchdisconnect(); -} -zm_on_player_disconnect() +player_too_many_players_check() //checked matches cerberus output { - thread refresh_player_navcard_hud(); + max_players = 4; + if ( level.scr_zm_ui_gametype == "zgrief" || level.scr_zm_ui_gametype == "zmeat" ) + { + max_players = 8; + } + if ( get_players().size > max_players ) + { + maps/mp/zombies/_zm_game_module::freeze_players( 1 ); + level notify( "end_game" ); + } } -watchdisconnect() +//added these functions to get around the compiler info.md No. 6 +//////////////////////////////////////////////////////////////// +is_solo_death( self, players ) { - self notify( "watchDisconnect" ); - self endon( "watchDisconnect" ); + if ( players.size == 1 && flag( "solo_game" ) ) + { + if ( !self hasPerk( "specialty_quickrevive" ) ) + { + return 1; + } + if ( self.lives == 0 ) + { + return 1; + } + } + return 0; +} - self waittill( "disconnect" ); - - zm_on_player_disconnect(); -} - -increment_dog_round_stat( stat ) +is_non_solo_death( self, players, count ) { - players = get_players(); - - foreach ( player in players ) - player maps\mp\zombies\_zm_stats::increment_client_stat( "zdog_rounds_" + stat ); + if ( count > 1 || players.size == 1 && !flag( "solo_game" ) ) + { + return 1; + } + return 0; } +//////////////////////////////////////////////////////////////// -setup_player_navcard_hud() -{ - flag_wait( "start_zombie_round_logic" ); - thread refresh_player_navcard_hud(); -} -refresh_player_navcard_hud() -{ - if ( !isdefined( level.navcards ) ) - return; - players = get_players(); - foreach ( player in players ) - { - navcard_bits = 0; - for ( i = 0; i < level.navcards.size; i++ ) - { - hasit = player maps\mp\zombies\_zm_stats::get_global_stat( level.navcards[i] ); - if ( isdefined( player.navcard_grabbed ) && player.navcard_grabbed == level.navcards[i] ) - hasit = 1; - if ( hasit ) - navcard_bits += ( 1 << i ); - } - wait_network_frame(); - player setclientfield( "navcard_held", 0 ); - if ( navcard_bits > 0 ) - { - wait_network_frame(); - player setclientfield( "navcard_held", navcard_bits ); - } - } -} -check_quickrevive_for_hotjoin( disconnecting_player ) -{ - solo_mode = 0; - subtract_num = 0; - should_update = 0; - if ( isdefined( disconnecting_player ) ) - subtract_num = 1; - players = get_players(); - if ( players.size - subtract_num == 1 || isdefined( level.force_solo_quick_revive ) && level.force_solo_quick_revive ) - { - solo_mode = 1; - if ( !flag( "solo_game" ) ) - should_update = 1; - flag_set( "solo_game" ); - } - else - { - if ( flag( "solo_game" ) ) - should_update = 1; - flag_clear( "solo_game" ); - } - level.using_solo_revive = solo_mode; - level.revive_machine_is_solo = solo_mode; - set_default_laststand_pistol( solo_mode ); - if ( should_update && isdefined( level.quick_revive_machine ) ) - update_quick_revive( solo_mode ); -} -set_default_laststand_pistol( solo_mode ) -{ - if ( !solo_mode ) - level.laststandpistol = level.default_laststandpistol; - else - level.laststandpistol = level.default_solo_laststandpistol; -} -update_quick_revive( solo_mode ) -{ - if ( !isdefined( solo_mode ) ) - solo_mode = 0; - clip = undefined; - if ( isdefined( level.quick_revive_machine_clip ) ) - clip = level.quick_revive_machine_clip; - level.quick_revive_machine thread maps\mp\zombies\_zm_perks::reenable_quickrevive( clip, solo_mode ); -} -player_too_many_players_check() -{ - max_players = 4; - if ( level.scr_zm_ui_gametype == "zgrief" || level.scr_zm_ui_gametype == "zmeat" ) - max_players = 8; - if ( get_players().size > max_players ) - { - maps\mp\zombies\_zm_game_module::freeze_players( 1 ); - level notify( "end_game" ); - } -} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_basic.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_basic.gsc index 96dcfee..4ef963b 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_basic.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_basic.gsc @@ -1,554 +1,546 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_spawner; -#include maps\mp\zombies\_zm_ai_basic; -#include maps\mp\animscripts\zm_run; -#include maps\mp\animscripts\zm_shared; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/zm_run; +#include maps/mp/zombies/_zm_ai_basic; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -find_flesh() +find_flesh() //checked partially changed to match cerberus output { - self endon( "death" ); - level endon( "intermission" ); - self endon( "stop_find_flesh" ); - - if ( level.intermission ) - return; - - self.ai_state = "find_flesh"; - self.helitarget = 1; - self.ignoreme = 0; - self.nododgemove = 1; - self.ignore_player = []; - self maps\mp\zombies\_zm_spawner::zombie_history( "find flesh -> start" ); - self.goalradius = 32; - - if ( isdefined( self.custom_goalradius_override ) ) - self.goalradius = self.custom_goalradius_override; - - while ( true ) - { - zombie_poi = undefined; - - if ( isdefined( level.zombietheaterteleporterseeklogicfunc ) ) - self [[ level.zombietheaterteleporterseeklogicfunc ]](); - - if ( isdefined( level._poi_override ) ) - zombie_poi = self [[ level._poi_override ]](); - - if ( !isdefined( zombie_poi ) ) - zombie_poi = self get_zombie_point_of_interest( self.origin ); - - players = get_players(); - - if ( !isdefined( self.ignore_player ) || players.size == 1 ) - self.ignore_player = []; - else if ( !isdefined( level._should_skip_ignore_player_logic ) || ![[ level._should_skip_ignore_player_logic ]]() ) - { - i = 0; - - while ( i < self.ignore_player.size ) - { - if ( isdefined( self.ignore_player[i] ) && isdefined( self.ignore_player[i].ignore_counter ) && self.ignore_player[i].ignore_counter > 3 ) - { - self.ignore_player[i].ignore_counter = 0; - self.ignore_player = arrayremovevalue( self.ignore_player, self.ignore_player[i] ); - - if ( !isdefined( self.ignore_player ) ) - self.ignore_player = []; - - i = 0; - continue; - } - - i++; - } - } - - player = get_closest_valid_player( self.origin, self.ignore_player ); - - if ( !isdefined( player ) && !isdefined( zombie_poi ) ) - { - self maps\mp\zombies\_zm_spawner::zombie_history( "find flesh -> can't find player, continue" ); - - if ( isdefined( self.ignore_player ) ) - { - if ( isdefined( level._should_skip_ignore_player_logic ) && [[ level._should_skip_ignore_player_logic ]]() ) - { - wait 1; - continue; - } - - self.ignore_player = []; - } - - wait 1; - continue; - } - - if ( !isdefined( level.check_for_alternate_poi ) || ![[ level.check_for_alternate_poi ]]() ) - { - self.enemyoverride = zombie_poi; - self.favoriteenemy = player; - } - - self thread zombie_pathing(); - - if ( players.size > 1 ) - { - for ( i = 0; i < self.ignore_player.size; i++ ) - { - if ( isdefined( self.ignore_player[i] ) ) - { - if ( !isdefined( self.ignore_player[i].ignore_counter ) ) - { - self.ignore_player[i].ignore_counter = 0; - continue; - } - - self.ignore_player[i].ignore_counter += 1; - } - } - } - - self thread attractors_generated_listener(); - - if ( isdefined( level._zombie_path_timer_override ) ) - self.zombie_path_timer = [[ level._zombie_path_timer_override ]](); - else - self.zombie_path_timer = gettime() + randomfloatrange( 1, 3 ) * 1000; - - while ( gettime() < self.zombie_path_timer ) - wait 0.1; - - self notify( "path_timer_done" ); - self maps\mp\zombies\_zm_spawner::zombie_history( "find flesh -> bottom of loop" ); - debug_print( "Zombie is re-acquiring enemy, ending breadcrumb search" ); - self notify( "zombie_acquire_enemy" ); - } + self endon( "death" ); + level endon( "intermission" ); + self endon( "stop_find_flesh" ); + if ( level.intermission ) + { + return; + } + self.ai_state = "find_flesh"; + self.helitarget = 1; + self.ignoreme = 0; + self.nododgemove = 1; + self.ignore_player = []; + self maps/mp/zombies/_zm_spawner::zombie_history( "find flesh -> start" ); + self.goalradius = 32; + if ( isDefined( self.custom_goalradius_override ) ) + { + self.goalradius = self.custom_goalradius_override; + } + while ( 1 ) + { + zombie_poi = undefined; + if ( isDefined( level.zombietheaterteleporterseeklogicfunc ) ) + { + self [[ level.zombietheaterteleporterseeklogicfunc ]](); + } + if ( isDefined( level._poi_override ) ) + { + zombie_poi = self [[ level._poi_override ]](); + } + if ( !isDefined( zombie_poi ) ) + { + zombie_poi = self get_zombie_point_of_interest( self.origin ); + } + players = get_players(); + if ( !isDefined( self.ignore_player ) || players.size == 1 ) + { + self.ignore_player = []; + } + if ( !isDefined( level._should_skip_ignore_player_logic ) || !( [[ level._should_skip_ignore_player_logic ]]() ) ) + { + i = 0; + while ( i < self.ignore_player.size ) + { + if ( isDefined( self.ignore_player[ i ] ) && isDefined( self.ignore_player[ i ].ignore_counter ) && self.ignore_player[ i ].ignore_counter > 3 ) + { + self.ignore_player[ i ].ignore_counter = 0; + self.ignore_player = arrayremovevalue( self.ignore_player, self.ignore_player[ i ] ); + if ( !isDefined( self.ignore_player ) ) + { + self.ignore_player = []; + } + i = 0; + continue; + } + i++; + } + } + player = get_closest_valid_player( self.origin, self.ignore_player ); + if ( !isDefined( player ) && !isDefined( zombie_poi ) ) + { + self maps/mp/zombies/_zm_spawner::zombie_history( "find flesh -> can't find player, continue" ); + if ( isDefined( self.ignore_player ) ) + { + if ( isDefined( level._should_skip_ignore_player_logic ) && [[ level._should_skip_ignore_player_logic ]]() ) + { + wait 1; + continue; + } + self.ignore_player = []; + } + wait 1; + continue; + } + if ( !isDefined( level.check_for_alternate_poi ) || ![[ level.check_for_alternate_poi ]]() ) + { + self.enemyoverride = zombie_poi; + self.favoriteenemy = player; + } + self thread zombie_pathing(); + if ( players.size > 1 ) + { + for ( i = 0; i < self.ignore_player.size; i++ ) + { + if ( isDefined( self.ignore_player[ i ] ) ) + { + if ( !isDefined( self.ignore_player[ i ].ignore_counter ) ) + { + self.ignore_player[ i ].ignore_counter = 0; + } + else + { + self.ignore_player[ i ].ignore_counter += 1; + } + } + } + } + self thread attractors_generated_listener(); + if ( isDefined( level._zombie_path_timer_override ) ) + { + self.zombie_path_timer = [[ level._zombie_path_timer_override ]](); + } + else + { + self.zombie_path_timer = getTime() + ( randomfloatrange( 1, 3 ) * 1000 ); + } + while ( getTime() < self.zombie_path_timer ) + { + wait 0.1; + } + self notify( "path_timer_done" ); + self maps/mp/zombies/_zm_spawner::zombie_history( "find flesh -> bottom of loop" ); + debug_print( "Zombie is re-acquiring enemy, ending breadcrumb search" ); + self notify( "zombie_acquire_enemy" ); + } } -init_inert_zombies() +init_inert_zombies() //checked matches cerberus output { - level init_inert_substates(); + level init_inert_substates(); } -init_inert_substates() +init_inert_substates() //checked matches cerberus output { - level.inert_substates = []; - level.inert_substates[level.inert_substates.size] = "inert1"; - level.inert_substates[level.inert_substates.size] = "inert2"; - level.inert_substates[level.inert_substates.size] = "inert3"; - level.inert_substates[level.inert_substates.size] = "inert4"; - level.inert_substates[level.inert_substates.size] = "inert5"; - level.inert_substates[level.inert_substates.size] = "inert6"; - level.inert_substates[level.inert_substates.size] = "inert7"; - level.inert_substates = array_randomize( level.inert_substates ); - level.inert_substate_index = 0; - level.inert_trans_walk = []; - level.inert_trans_walk[level.inert_trans_walk.size] = "inert_2_walk_1"; - level.inert_trans_walk[level.inert_trans_walk.size] = "inert_2_walk_2"; - level.inert_trans_walk[level.inert_trans_walk.size] = "inert_2_walk_3"; - level.inert_trans_walk[level.inert_trans_walk.size] = "inert_2_walk_4"; - level.inert_trans_run = []; - level.inert_trans_run[level.inert_trans_run.size] = "inert_2_run_1"; - level.inert_trans_run[level.inert_trans_run.size] = "inert_2_run_2"; - level.inert_trans_sprint = []; - level.inert_trans_sprint[level.inert_trans_sprint.size] = "inert_2_sprint_1"; - level.inert_trans_sprint[level.inert_trans_sprint.size] = "inert_2_sprint_2"; - level.inert_crawl_substates = []; - level.inert_crawl_substates[level.inert_crawl_substates.size] = "inert1"; - level.inert_crawl_substates[level.inert_crawl_substates.size] = "inert2"; - level.inert_crawl_substates[level.inert_crawl_substates.size] = "inert3"; - level.inert_crawl_substates[level.inert_crawl_substates.size] = "inert4"; - level.inert_crawl_substates[level.inert_crawl_substates.size] = "inert5"; - level.inert_crawl_substates[level.inert_crawl_substates.size] = "inert6"; - level.inert_crawl_substates[level.inert_crawl_substates.size] = "inert7"; - level.inert_crawl_trans_walk = []; - level.inert_crawl_trans_walk[level.inert_crawl_trans_walk.size] = "inert_2_walk_1"; - level.inert_crawl_trans_run = []; - level.inert_crawl_trans_run[level.inert_crawl_trans_run.size] = "inert_2_run_1"; - level.inert_crawl_trans_run[level.inert_crawl_trans_run.size] = "inert_2_run_2"; - level.inert_crawl_trans_sprint = []; - level.inert_crawl_trans_sprint[level.inert_crawl_trans_sprint.size] = "inert_2_sprint_1"; - level.inert_crawl_trans_sprint[level.inert_crawl_trans_sprint.size] = "inert_2_sprint_2"; - level.inert_crawl_substates = array_randomize( level.inert_crawl_substates ); - level.inert_crawl_substate_index = 0; + level.inert_substates = []; + level.inert_substates[ level.inert_substates.size ] = "inert1"; + level.inert_substates[ level.inert_substates.size ] = "inert2"; + level.inert_substates[ level.inert_substates.size ] = "inert3"; + level.inert_substates[ level.inert_substates.size ] = "inert4"; + level.inert_substates[ level.inert_substates.size ] = "inert5"; + level.inert_substates[ level.inert_substates.size ] = "inert6"; + level.inert_substates[ level.inert_substates.size ] = "inert7"; + level.inert_substates = array_randomize( level.inert_substates ); + level.inert_substate_index = 0; + level.inert_trans_walk = []; + level.inert_trans_walk[ level.inert_trans_walk.size ] = "inert_2_walk_1"; + level.inert_trans_walk[ level.inert_trans_walk.size ] = "inert_2_walk_2"; + level.inert_trans_walk[ level.inert_trans_walk.size ] = "inert_2_walk_3"; + level.inert_trans_walk[ level.inert_trans_walk.size ] = "inert_2_walk_4"; + level.inert_trans_run = []; + level.inert_trans_run[ level.inert_trans_run.size ] = "inert_2_run_1"; + level.inert_trans_run[ level.inert_trans_run.size ] = "inert_2_run_2"; + level.inert_trans_sprint = []; + level.inert_trans_sprint[ level.inert_trans_sprint.size ] = "inert_2_sprint_1"; + level.inert_trans_sprint[ level.inert_trans_sprint.size ] = "inert_2_sprint_2"; + level.inert_crawl_substates = []; + level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert1"; + level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert2"; + level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert3"; + level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert4"; + level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert5"; + level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert6"; + level.inert_crawl_substates[ level.inert_crawl_substates.size ] = "inert7"; + level.inert_crawl_trans_walk = []; + level.inert_crawl_trans_walk[ level.inert_crawl_trans_walk.size ] = "inert_2_walk_1"; + level.inert_crawl_trans_run = []; + level.inert_crawl_trans_run[ level.inert_crawl_trans_run.size ] = "inert_2_run_1"; + level.inert_crawl_trans_run[ level.inert_crawl_trans_run.size ] = "inert_2_run_2"; + level.inert_crawl_trans_sprint = []; + level.inert_crawl_trans_sprint[ level.inert_crawl_trans_sprint.size ] = "inert_2_sprint_1"; + level.inert_crawl_trans_sprint[ level.inert_crawl_trans_sprint.size ] = "inert_2_sprint_2"; + level.inert_crawl_substates = array_randomize( level.inert_crawl_substates ); + level.inert_crawl_substate_index = 0; } -get_inert_substate() +get_inert_substate() //checked matches cerberus output { - substate = level.inert_substates[level.inert_substate_index]; - level.inert_substate_index++; - - if ( level.inert_substate_index >= level.inert_substates.size ) - { - level.inert_substates = array_randomize( level.inert_substates ); - level.inert_substate_index = 0; - } - - return substate; + substate = level.inert_substates[ level.inert_substate_index ]; + level.inert_substate_index++; + if ( level.inert_substate_index >= level.inert_substates.size ) + { + level.inert_substates = array_randomize( level.inert_substates ); + level.inert_substate_index = 0; + } + return substate; } -get_inert_crawl_substate() +get_inert_crawl_substate() //checked matches cerberus output { - substate = level.inert_crawl_substates[level.inert_crawl_substate_index]; - level.inert_crawl_substate_index++; - - if ( level.inert_crawl_substate_index >= level.inert_crawl_substates.size ) - { - level.inert_crawl_substates = array_randomize( level.inert_crawl_substates ); - level.inert_crawl_substate_index = 0; - } - - return substate; + substate = level.inert_crawl_substates[ level.inert_crawl_substate_index ]; + level.inert_crawl_substate_index++; + if ( level.inert_crawl_substate_index >= level.inert_crawl_substates.size ) + { + level.inert_crawl_substates = array_randomize( level.inert_crawl_substates ); + level.inert_crawl_substate_index = 0; + } + return substate; } -start_inert( in_place ) +start_inert( in_place ) //checked changed to match cerberus output { - self endon( "death" ); - - if ( isdefined( self.is_inert ) && self.is_inert ) - { - self maps\mp\zombies\_zm_spawner::zombie_history( "is_inert already set " + gettime() ); - return; - } - - self.is_inert = 1; - self notify( "start_inert" ); - self maps\mp\zombies\_zm_spawner::zombie_eye_glow_stop(); - self maps\mp\zombies\_zm_spawner::zombie_history( "is_inert set " + gettime() ); - self playsound( "zmb_zombie_go_inert" ); - - if ( isdefined( self.barricade_enter ) && self.barricade_enter ) - { - while ( isdefined( self.barricade_enter ) && self.barricade_enter ) - wait 0.1; - } - else if ( isdefined( self.ai_state ) && self.ai_state == "zombie_goto_entrance" ) - { - self notify( "stop_zombie_goto_entrance" ); - self maps\mp\zombies\_zm_spawner::reset_attack_spot(); - } - - if ( isdefined( self.completed_emerging_into_playable_area ) && self.completed_emerging_into_playable_area ) - { - self notify( "stop_find_flesh" ); - self notify( "zombie_acquire_enemy" ); - } - else - in_place = 1; - - if ( isdefined( self.in_the_ground ) && self.in_the_ground ) - { - self waittill( "risen", find_flesh_struct_string ); - - if ( self maps\mp\zombies\_zm_spawner::should_skip_teardown( find_flesh_struct_string ) ) - { - if ( !( isdefined( self.completed_emerging_into_playable_area ) && self.completed_emerging_into_playable_area ) ) - self waittill( "completed_emerging_into_playable_area" ); - - self notify( "stop_find_flesh" ); - self notify( "zombie_acquire_enemy" ); - } - } - - if ( isdefined( self.is_traversing ) && self.is_traversing ) - { - while ( self isinscriptedstate() ) - wait 0.1; - } - - if ( isdefined( self.doing_equipment_attack ) && self.doing_equipment_attack ) - self stopanimscripted(); - - if ( isdefined( self.inert_delay ) ) - { - self [[ self.inert_delay ]](); - self maps\mp\zombies\_zm_spawner::zombie_history( "inert_delay done " + gettime() ); - } - - self inert_think( in_place ); + self endon( "death" ); + if ( is_true( self.is_inert ) ) + { + self maps/mp/zombies/_zm_spawner::zombie_history( "is_inert already set " + getTime() ); + return; + } + self.is_inert = 1; + self notify( "start_inert" ); + self maps/mp/zombies/_zm_spawner::zombie_eye_glow_stop(); + self maps/mp/zombies/_zm_spawner::zombie_history( "is_inert set " + getTime() ); + self playsound( "zmb_zombie_go_inert" ); + if ( is_true( self.barricade_enter ) ) + { + while ( is_true( self.barricade_enter ) ) + { + wait 0.1; + } + } + else if ( isDefined( self.ai_state ) && self.ai_state == "zombie_goto_entrance" ) + { + self notify( "stop_zombie_goto_entrance" ); + self maps/mp/zombies/_zm_spawner::reset_attack_spot(); + } + if ( is_true( self.completed_emerging_into_playable_area ) ) + { + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + } + else + { + in_place = 1; + } + if ( is_true( self.in_the_ground ) ) + { + self waittill( "risen", find_flesh_struct_string ); + if ( self maps/mp/zombies/_zm_spawner::should_skip_teardown( find_flesh_struct_string ) ) + { + if ( !is_true( self.completed_emerging_into_playable_area ) ) + { + self waittill( "completed_emerging_into_playable_area" ); + } + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + } + } + if ( is_true( self.is_traversing ) ) + { + while ( self isinscriptedstate() ) + { + wait 0.1; + } + } + if ( is_true( self.doing_equipment_attack ) ) + { + self stopanimscripted(); + } + if ( isDefined( self.inert_delay ) ) + { + self [[ self.inert_delay ]](); + self maps/mp/zombies/_zm_spawner::zombie_history( "inert_delay done " + getTime() ); + } + self inert_think( in_place ); } -inert_think( in_place ) +inert_think( in_place ) //checked changed to match cerberus output { - self endon( "death" ); - self.ignoreall = 1; - self animmode( "normal" ); - - if ( self.has_legs ) - { - if ( isdefined( in_place ) && in_place ) - { - self setgoalpos( self.origin ); - - if ( randomint( 100 ) > 50 ) - { - self maps\mp\zombies\_zm_spawner::zombie_history( "inert 1 " + gettime() ); - self setanimstatefromasd( "zm_inert", "inert1" ); - } - else - { - self maps\mp\zombies\_zm_spawner::zombie_history( "inert 2 " + gettime() ); - self setanimstatefromasd( "zm_inert", "inert2" ); - } - - self.in_place = 1; - } - else - { - substate = get_inert_substate(); - - if ( isdefined( level.inert_substate_override ) ) - substate = self [[ level.inert_substate_override ]]( substate ); - - self setanimstatefromasd( "zm_inert", substate ); - self maps\mp\zombies\_zm_spawner::zombie_history( "zm_inert ASD " + gettime() ); - - if ( substate == "inert3" || substate == "inert4" || substate == "inert5" || substate == "inert6" ) - self thread inert_watch_goal(); - else - self.in_place = 1; - } - } - else - { - self setanimstatefromasd( "zm_inert_crawl", get_inert_crawl_substate() ); - self maps\mp\zombies\_zm_spawner::zombie_history( "zm_inert_crawl ASD " + gettime() ); - } - - self thread inert_wakeup(); - - self waittill( "stop_zombie_inert" ); - - self maps\mp\zombies\_zm_spawner::zombie_history( "stop_zombie_inert " + gettime() ); - self playsound( "zmb_zombie_end_inert" ); - self inert_transition(); - self maps\mp\zombies\_zm_spawner::zombie_history( "inert transition done" ); - - if ( isdefined( self.ai_state ) && self.ai_state == "zombie_goto_entrance" ) - self thread maps\mp\zombies\_zm_spawner::zombie_goto_entrance( self.first_node ); - - if ( isdefined( self.inert_wakeup_override ) ) - self [[ self.inert_wakeup_override ]](); - else if ( isdefined( self.completed_emerging_into_playable_area ) && self.completed_emerging_into_playable_area ) - { - self.ignoreall = 0; - - if ( isdefined( level.ignore_find_flesh ) && !self [[ level.ignore_find_flesh ]]() ) - self thread maps\mp\zombies\_zm_ai_basic::find_flesh(); - } - - self.becoming_inert = undefined; - self.is_inert = undefined; - self.in_place = undefined; - self maps\mp\animscripts\zm_run::needsupdate(); - self maps\mp\zombies\_zm_spawner::zombie_history( "is_inert cleared " + gettime() ); + self endon( "death" ); + self.ignoreall = 1; + self animmode( "normal" ); + if ( self.has_legs ) + { + if ( is_true( in_place ) ) + { + self setgoalpos( self.origin ); + if ( randomint( 100 ) > 50 ) + { + self maps/mp/zombies/_zm_spawner::zombie_history( "inert 1 " + getTime() ); + self setanimstatefromasd( "zm_inert", "inert1" ); + } + else + { + self maps/mp/zombies/_zm_spawner::zombie_history( "inert 2 " + getTime() ); + self setanimstatefromasd( "zm_inert", "inert2" ); + } + self.in_place = 1; + } + else + { + substate = get_inert_substate(); + if ( isDefined( level.inert_substate_override ) ) + { + substate = self [[ level.inert_substate_override ]]( substate ); + } + self setanimstatefromasd( "zm_inert", substate ); + self maps/mp/zombies/_zm_spawner::zombie_history( "zm_inert ASD " + getTime() ); + if ( substate == "inert3" && substate == "inert4" || substate == "inert5" && substate == "inert6" ) + { + self thread inert_watch_goal(); + } + else + { + self.in_place = 1; + } + } + } + else + { + self setanimstatefromasd( "zm_inert_crawl", get_inert_crawl_substate() ); + self maps/mp/zombies/_zm_spawner::zombie_history( "zm_inert_crawl ASD " + getTime() ); + } + self thread inert_wakeup(); + self waittill( "stop_zombie_inert" ); + self maps/mp/zombies/_zm_spawner::zombie_history( "stop_zombie_inert " + getTime() ); + self playsound( "zmb_zombie_end_inert" ); + self inert_transition(); + self maps/mp/zombies/_zm_spawner::zombie_history( "inert transition done" ); + if ( isDefined( self.ai_state ) && self.ai_state == "zombie_goto_entrance" ) + { + self thread maps/mp/zombies/_zm_spawner::zombie_goto_entrance( self.first_node ); + } + if ( isDefined( self.inert_wakeup_override ) ) + { + self [[ self.inert_wakeup_override ]](); + } + else if ( is_true( self.completed_emerging_into_playable_area ) ) + { + self.ignoreall = 0; + if ( isDefined( level.ignore_find_flesh ) && !self [[ level.ignore_find_flesh ]]() ) + { + self thread maps/mp/zombies/_zm_ai_basic::find_flesh(); + } + } + self.becoming_inert = undefined; + self.is_inert = undefined; + self.in_place = undefined; + self maps/mp/animscripts/zm_run::needsupdate(); + self maps/mp/zombies/_zm_spawner::zombie_history( "is_inert cleared " + getTime() ); } -inert_watch_goal() +inert_watch_goal() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "stop_zombie_inert" ); - - while ( true ) - { - self waittill( "goal" ); - - locs = array_randomize( level.enemy_dog_locations ); - - foreach ( loc in locs ) - { - dist_sq = distancesquared( self.origin, loc.origin ); - - if ( dist_sq > 90000 ) - { - self setgoalpos( loc.origin ); - continue; - } - } - - if ( locs.size > 0 ) - self setgoalpos( locs[0].origin ); - } + self endon( "death" ); + self endon( "stop_zombie_inert" ); + while ( 1 ) + { + self waittill( "goal" ); + locs = array_randomize( level.enemy_dog_locations ); + i = 0; + while ( i < locs.size ) + { + dist_sq = distancesquared( self.origin, locs[ i ].origin ); + if ( dist_sq > 90000 ) + { + self setgoalpos( locs[ i ].origin ); + i++; + continue; + } + i++; + } + if ( locs.size > 0 ) + { + self setgoalpos( locs[ 0 ].origin ); + } + } } -inert_wakeup() +inert_wakeup() //checked changed at own discretion parity in behavior to cerberus output { - self endon( "death" ); - self endon( "stop_zombie_inert" ); - wait 0.1; - self thread inert_damage(); - self thread inert_bump(); - - while ( true ) - { - current_time = gettime(); - players = get_players(); - - foreach ( player in players ) - { - dist_sq = distancesquared( self.origin, player.origin ); - - if ( dist_sq < 4096 ) - { - self stop_inert(); - return; - } - - if ( dist_sq < 360000 ) - { - if ( player issprinting() ) - { - self stop_inert(); - return; - } - } - - if ( dist_sq < 5760000 ) - { - if ( current_time - player.lastfiretime < 100 ) - { - self stop_inert(); - return; - } - } - } - - wait 0.1; - } + self endon( "death" ); + self endon( "stop_zombie_inert" ); + wait 0.1; + self thread inert_damage(); + self thread inert_bump(); + while ( 1 ) + { + current_time = getTime(); + players = get_players(); + foreach ( player in players ) + { + dist_sq = distancesquared( self.origin, player.origin ); + if ( dist_sq < 4096 ) + { + self stop_inert(); + return; + } + if ( dist_sq < 360000 ) + { + if ( player issprinting() ) + { + self stop_inert(); + return; + } + } + if ( dist_sq < 5760000 ) + { + if ( ( current_time - player.lastfiretime ) < 100 ) + { + self stop_inert(); + return; + } + } + } + wait 0.1; + } } -inert_bump() +inert_bump() //checked changed at own discretion parity in behavior to cerberus output { - self endon( "death" ); - self endon( "stop_zombie_inert" ); - - while ( true ) - { - zombies = getaiarray( level.zombie_team ); - - foreach ( zombie in zombies ) - { - if ( zombie == self ) - continue; - - if ( isdefined( zombie.is_inert ) && zombie.is_inert ) - continue; - - if ( isdefined( zombie.becoming_inert ) && zombie.becoming_inert ) - continue; - - dist_sq = distancesquared( self.origin, zombie.origin ); - - if ( dist_sq < 1296 ) - { - self stop_inert(); - return; - } - } - - wait 0.2; - } + self endon( "death" ); + self endon( "stop_zombie_inert" ); + while ( 1 ) + { + zombies = getaiarray( level.zombie_team ); + i = 0; + while ( i < zombies.size ) + { + if ( zombies[ i ] == self ) + { + i++; + continue; + } + if ( is_true( zombies[ i ].is_inert ) ) + { + i++; + continue; + } + if ( is_true( zombies[ i ].becoming_inert ) ) + { + i++; + continue; + } + dist_sq = distancesquared( self.origin, zombies[ i ].origin ); + if ( dist_sq < 1296 ) + { + self stop_inert(); + return; + } + i++; + } + wait 0.2; + } } -inert_damage() +inert_damage() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "stop_zombie_inert" ); - - while ( true ) - { - self waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags ); - - if ( weaponname == "emp_grenade_zm" ) - continue; - - if ( isdefined( inflictor ) ) - { - if ( isdefined( inflictor._trap_type ) && inflictor._trap_type == "fire" ) - continue; - } - } - - self stop_inert(); + self endon( "death" ); + self endon( "stop_zombie_inert" ); + while ( 1 ) + { + self waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags ); + if ( weaponname == "emp_grenade_zm" ) + { + continue; + } + if ( isDefined( inflictor ) ) + { + if ( isDefined( inflictor._trap_type ) && inflictor._trap_type == "fire" ) + { + continue; + } + } + } + self stop_inert(); } -grenade_watcher( grenade ) +grenade_watcher( grenade ) //checked changed to match cerberus output { - grenade waittill( "explode", grenade_origin ); - - zombies = get_array_of_closest( grenade_origin, get_round_enemy_array(), undefined, undefined, 2400 ); - - if ( !isdefined( zombies ) ) - return; - - foreach ( zombie in zombies ) - zombie stop_inert(); + grenade waittill( "explode", grenade_origin ); + zombies = get_array_of_closest( grenade_origin, get_round_enemy_array(), undefined, undefined, 2400 ); + if ( !isDefined( zombies ) ) + { + return; + } + foreach ( zombie in zombies ) + { + zombie stop_inert(); + } } -stop_inert() +stop_inert() //checked matches cerberus output { - self notify( "stop_zombie_inert" ); + self notify( "stop_zombie_inert" ); } -inert_transition() +inert_transition() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "stop_zombie_inert_transition" ); - trans_num = 4; - trans_set = level.inert_trans_walk; - animstate = "zm_inert_trans"; - - if ( !self.has_legs ) - { - trans_num = 1; - trans_set = level.inert_crawl_trans_walk; - animstate = "zm_inert_crawl_trans"; - } - - if ( self.zombie_move_speed == "run" ) - { - if ( self.has_legs ) - trans_set = level.inert_trans_run; - else - trans_set = level.inert_crawl_trans_run; - - trans_num = 2; - } - else if ( self.zombie_move_speed == "sprint" ) - { - if ( self.has_legs ) - trans_set = level.inert_trans_sprint; - else - trans_set = level.inert_crawl_trans_sprint; - - trans_num = 2; - } - - self thread inert_eye_glow(); - self setanimstatefromasd( animstate, trans_set[randomint( trans_num )] ); - self maps\mp\zombies\_zm_spawner::zombie_history( "inert_trans_anim " + gettime() ); - maps\mp\animscripts\zm_shared::donotetracks( "inert_trans_anim" ); + self endon( "death" ); + self endon( "stop_zombie_inert_transition" ); + trans_num = 4; + trans_set = level.inert_trans_walk; + animstate = "zm_inert_trans"; + if ( !self.has_legs ) + { + trans_num = 1; + trans_set = level.inert_crawl_trans_walk; + animstate = "zm_inert_crawl_trans"; + } + if ( self.zombie_move_speed == "run" ) + { + if ( self.has_legs ) + { + trans_set = level.inert_trans_run; + } + else + { + trans_set = level.inert_crawl_trans_run; + } + trans_num = 2; + } + else if ( self.zombie_move_speed == "sprint" ) + { + if ( self.has_legs ) + { + trans_set = level.inert_trans_sprint; + } + else + { + trans_set = level.inert_crawl_trans_sprint; + } + trans_num = 2; + } + self thread inert_eye_glow(); + self setanimstatefromasd( animstate, trans_set[ randomint( trans_num ) ] ); + self maps/mp/zombies/_zm_spawner::zombie_history( "inert_trans_anim " + getTime() ); + maps/mp/animscripts/zm_shared::donotetracks( "inert_trans_anim" ); } -inert_eye_glow() +inert_eye_glow() //checked changed to match cerberus output { - self endon( "death" ); - - while ( true ) - { - self waittill( "inert_trans_anim", note ); - - if ( note == "end" ) - return; - else if ( note == "zmb_awaken" ) - { - self maps\mp\zombies\_zm_spawner::zombie_eye_glow(); - return; - } - } + self endon( "death" ); + while ( 1 ) + { + self waittill( "inert_trans_anim", note ); + if ( note == "end" ) + { + return; + } + else if ( note == "zmb_awaken" ) + { + self maps/mp/zombies/_zm_spawner::zombie_eye_glow(); + return; + } + } } + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_dogs.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_dogs.gsc index ad1f0e5..69413fa 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_dogs.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_dogs.gsc @@ -1,755 +1,721 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_spawner; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_powerups; -#include maps\mp\zombies\_zm; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_net; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - level.dogs_enabled = 1; - level.dog_rounds_enabled = 0; - level.dog_round_count = 1; - level.dog_spawners = []; - level.enemy_dog_spawns = []; - level.enemy_dog_locations = []; - flag_init( "dog_clips" ); - precacherumble( "explosion_generic" ); - precacheshellshock( "dog_bite" ); - - if ( getdvar( _hash_942939D4 ) == "" ) - setdvar( "zombie_dog_animset", "zombie" ); - - if ( getdvar( _hash_CAA5B74F ) == "" ) - setdvar( "scr_dog_health_walk_multiplier", "4.0" ); - - if ( getdvar( _hash_C7E63BA4 ) == "" ) - setdvar( "scr_dog_run_distance", "500" ); - - level.melee_range_sav = getdvar( "ai_meleeRange" ); - level.melee_width_sav = getdvar( "ai_meleeWidth" ); - level.melee_height_sav = getdvar( "ai_meleeHeight" ); - setdvar( "dog_MeleeDamage", "100" ); - set_zombie_var( "dog_fire_trail_percent", 50 ); - level._effect["lightning_dog_spawn"] = loadfx( "maps/zombie/fx_zombie_dog_lightning_buildup" ); - level._effect["dog_eye_glow"] = loadfx( "maps/zombie/fx_zombie_dog_eyes" ); - level._effect["dog_gib"] = loadfx( "maps/zombie/fx_zombie_dog_explosion" ); - level._effect["dog_trail_fire"] = loadfx( "maps/zombie/fx_zombie_dog_fire_trail" ); - level._effect["dog_trail_ash"] = loadfx( "maps/zombie/fx_zombie_dog_ash_trail" ); - dog_spawner_init(); - level thread dog_clip_monitor(); + level.dogs_enabled = 1; + level.dog_rounds_enabled = 0; + level.dog_round_count = 1; + level.dog_spawners = []; + level.enemy_dog_spawns = []; + level.enemy_dog_locations = []; + flag_init( "dog_clips" ); + precacherumble( "explosion_generic" ); + precacheshellshock( "dog_bite" ); + if ( getDvar( "zombie_dog_animset" ) == "" ) + { + setdvar( "zombie_dog_animset", "zombie" ); + } + if ( getDvar( "scr_dog_health_walk_multiplier" ) == "" ) + { + setdvar( "scr_dog_health_walk_multiplier", "4.0" ); + } + if ( getDvar( "scr_dog_run_distance" ) == "" ) + { + setdvar( "scr_dog_run_distance", "500" ); + } + level.melee_range_sav = getDvar( "ai_meleeRange" ); + level.melee_width_sav = getDvar( "ai_meleeWidth" ); + level.melee_height_sav = getDvar( "ai_meleeHeight" ); + setdvar( "dog_MeleeDamage", "100" ); + set_zombie_var( "dog_fire_trail_percent", 50 ); + level._effect[ "lightning_dog_spawn" ] = loadfx( "maps/zombie/fx_zombie_dog_lightning_buildup" ); + level._effect[ "dog_eye_glow" ] = loadfx( "maps/zombie/fx_zombie_dog_eyes" ); + level._effect[ "dog_gib" ] = loadfx( "maps/zombie/fx_zombie_dog_explosion" ); + level._effect[ "dog_trail_fire" ] = loadfx( "maps/zombie/fx_zombie_dog_fire_trail" ); + level._effect[ "dog_trail_ash" ] = loadfx( "maps/zombie/fx_zombie_dog_ash_trail" ); + dog_spawner_init(); + level thread dog_clip_monitor(); } -enable_dog_rounds() +enable_dog_rounds() //checked matches cerberus output { - level.dog_rounds_enabled = 1; - - if ( !isdefined( level.dog_round_track_override ) ) - level.dog_round_track_override = ::dog_round_tracker; - - level thread [[ level.dog_round_track_override ]](); + level.dog_rounds_enabled = 1; + if ( !isDefined( level.dog_round_track_override ) ) + { + level.dog_round_track_override = ::dog_round_tracker; + } + level thread [[ level.dog_round_track_override ]](); } -dog_spawner_init() +dog_spawner_init() //checked does not match cerberus output did not change { - level.dog_spawners = getentarray( "zombie_dog_spawner", "script_noteworthy" ); - later_dogs = getentarray( "later_round_dog_spawners", "script_noteworthy" ); - level.dog_spawners = arraycombine( level.dog_spawners, later_dogs, 1, 0 ); - - if ( level.dog_spawners.size == 0 ) - return; - - for ( i = 0; i < level.dog_spawners.size; i++ ) - { - if ( maps\mp\zombies\_zm_spawner::is_spawner_targeted_by_blocker( level.dog_spawners[i] ) ) - { - level.dog_spawners[i].is_enabled = 0; - continue; - } - - level.dog_spawners[i].is_enabled = 1; - level.dog_spawners[i].script_forcespawn = 1; - } -/# - assert( level.dog_spawners.size > 0 ); -#/ - level.dog_health = 100; - array_thread( level.dog_spawners, ::add_spawn_function, ::dog_init ); - level.enemy_dog_spawns = getentarray( "zombie_spawner_dog_init", "targetname" ); + level.dog_spawners = getentarray( "zombie_dog_spawner", "script_noteworthy" ); + later_dogs = getentarray( "later_round_dog_spawners", "script_noteworthy" ); + level.dog_spawners = arraycombine( level.dog_spawners, later_dogs, 1, 0 ); + if ( level.dog_spawners.size == 0 ) + { + return; + } + i = 0; + while ( i < level.dog_spawners.size ) + { + if ( maps/mp/zombies/_zm_spawner::is_spawner_targeted_by_blocker( level.dog_spawners[ i ] ) ) + { + level.dog_spawners[ i ].is_enabled = 0; + i++; + } + else + { + level.dog_spawners[ i ].is_enabled = 1; + level.dog_spawners[ i ].script_forcespawn = 1; + i++; + } + } + level.dog_health = 100; + array_thread( level.dog_spawners, ::add_spawn_function, ::dog_init ); + level.enemy_dog_spawns = getentarray( "zombie_spawner_dog_init", "targetname" ); } -dog_round_spawning() +dog_round_spawning() //checked partially matches cerberus output { - level endon( "intermission" ); - level.dog_targets = getplayers(); - - for ( i = 0; i < level.dog_targets.size; i++ ) - level.dog_targets[i].hunted_by = 0; -/# - level endon( "kill_round" ); - - if ( getdvarint( _hash_FA81816F ) == 2 || getdvarint( _hash_FA81816F ) >= 4 ) - return; -#/ - if ( level.intermission ) - return; - - level.dog_intermission = 1; - level thread dog_round_aftermath(); - players = get_players(); - array_thread( players, ::play_dog_round ); - wait 1; - playsoundatposition( "vox_zmba_event_dogstart_0", ( 0, 0, 0 ) ); - wait 6; - - if ( level.dog_round_count < 3 ) - max = players.size * 6; - else - max = players.size * 8; -/# - if ( getdvar( _hash_4077D7E0 ) != "" ) - max = getdvarint( _hash_4077D7E0 ); -#/ - level.zombie_total = max; - dog_health_increase(); - count = 0; - - while ( count < max ) - { - for ( num_player_valid = get_number_of_valid_players(); get_current_zombie_count() >= num_player_valid * 2; num_player_valid = get_number_of_valid_players() ) - wait 2; - - players = get_players(); - favorite_enemy = get_favorite_enemy(); - - if ( isdefined( level.dog_spawn_func ) ) - { - spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy ); - ai = spawn_zombie( level.dog_spawners[0] ); - - if ( isdefined( ai ) ) - { - ai.favoriteenemy = favorite_enemy; - spawn_loc thread dog_spawn_fx( ai, spawn_loc ); - level.zombie_total--; - count++; - } - } - else - { - spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy ); - ai = spawn_zombie( level.dog_spawners[0] ); - - if ( isdefined( ai ) ) - { - ai.favoriteenemy = favorite_enemy; - spawn_point thread dog_spawn_fx( ai, spawn_point ); - level.zombie_total--; - count++; - flag_set( "dog_clips" ); - } - } - - waiting_for_next_dog_spawn( count, max ); - } + level endon( "intermission" ); + level.dog_targets = getplayers(); + for ( i = 0; i < level.dog_targets.size; i++ ) + { + level.dog_targets[ i ].hunted_by = 0; + } + if ( level.intermission ) + { + return; + } + level.dog_intermission = 1; + level thread dog_round_aftermath(); + players = get_players(); + array_thread( players, ::play_dog_round ); + wait 1; + playsoundatposition( "vox_zmba_event_dogstart_0", ( 0, 0, 0 ) ); + wait 6; + if ( level.dog_round_count < 3 ) + { + max = players.size * 6; + } + else + { + max = players.size * 8; + } + level.zombie_total = max; + dog_health_increase(); + count = 0; + while ( count < max ) + { + num_player_valid = get_number_of_valid_players(); + while ( get_current_zombie_count() >= num_player_valid * 2 ) + { + wait 2; + num_player_valid = get_number_of_valid_players(); + } + players = get_players(); + favorite_enemy = get_favorite_enemy(); + if ( isDefined( level.dog_spawn_func ) ) + { + spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy ); + ai = spawn_zombie( level.dog_spawners[ 0 ] ); + if ( isDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_loc thread dog_spawn_fx( ai, spawn_loc ); + level.zombie_total--; + count++; + } + } + else + { + spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy ); + ai = spawn_zombie( level.dog_spawners[ 0 ] ); + if ( isDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_point thread dog_spawn_fx( ai, spawn_point ); + level.zombie_total--; + count++; + flag_set( "dog_clips" ); + } + } + waiting_for_next_dog_spawn( count, max ); + } } -waiting_for_next_dog_spawn( count, max ) +waiting_for_next_dog_spawn( count, max ) //checked matches cerberus output { - default_wait = 1.5; - - if ( level.dog_round_count == 1 ) - default_wait = 3; - else if ( level.dog_round_count == 2 ) - default_wait = 2.5; - else if ( level.dog_round_count == 3 ) - default_wait = 2; - else - default_wait = 1.5; - - default_wait -= count / max; - wait( default_wait ); + default_wait = 1.5; + if ( level.dog_round_count == 1 ) + { + default_wait = 3; + } + else if ( level.dog_round_count == 2 ) + { + default_wait = 2.5; + } + else if ( level.dog_round_count == 3 ) + { + default_wait = 2; + } + else + { + default_wait = 1.5; + } + default_wait = default_wait - count / max; + wait default_wait; } -dog_round_aftermath() +dog_round_aftermath() //checked matches cerberus output { - level waittill( "last_dog_down" ); - - level thread maps\mp\zombies\_zm_audio::change_zombie_music( "dog_end" ); - power_up_origin = level.last_dog_origin; - - if ( isdefined( power_up_origin ) ) - level thread maps\mp\zombies\_zm_powerups::specific_powerup_drop( "full_ammo", power_up_origin ); - - wait 2; - clientnotify( "dog_stop" ); - wait 6; - level.dog_intermission = 0; + level waittill( "last_dog_down" ); + level thread maps/mp/zombies/_zm_audio::change_zombie_music( "dog_end" ); + power_up_origin = level.last_dog_origin; + if ( isDefined( power_up_origin ) ) + { + level thread maps/mp/zombies/_zm_powerups::specific_powerup_drop( "full_ammo", power_up_origin ); + } + wait 2; + clientnotify( "dog_stop" ); + wait 6; + level.dog_intermission = 0; } -dog_spawn_fx( ai, ent ) +dog_spawn_fx( ai, ent ) //checked matches cerberus output { - ai endon( "death" ); - ai setfreecameralockonallowed( 0 ); - playfx( level._effect["lightning_dog_spawn"], ent.origin ); - playsoundatposition( "zmb_hellhound_prespawn", ent.origin ); - wait 1.5; - playsoundatposition( "zmb_hellhound_bolt", ent.origin ); - earthquake( 0.5, 0.75, ent.origin, 1000 ); - playrumbleonposition( "explosion_generic", ent.origin ); - playsoundatposition( "zmb_hellhound_spawn", ent.origin ); - angle = vectortoangles( ai.favoriteenemy.origin - ent.origin ); - angles = ( ai.angles[0], angle[1], ai.angles[2] ); - ai forceteleport( ent.origin, angles ); -/# - assert( isdefined( ai ), "Ent isn't defined." ); -#/ -/# - assert( isalive( ai ), "Ent is dead." ); -#/ -/# - assert( ai.isdog, "Ent isn't a dog;" ); -#/ -/# - assert( is_magic_bullet_shield_enabled( ai ), "Ent doesn't have a magic bullet shield." ); -#/ - ai zombie_setup_attack_properties_dog(); - ai stop_magic_bullet_shield(); - wait 0.1; - ai show(); - ai setfreecameralockonallowed( 1 ); - ai.ignoreme = 0; - ai notify( "visible" ); + ai endon( "death" ); + ai setfreecameralockonallowed( 0 ); + playfx( level._effect[ "lightning_dog_spawn" ], ent.origin ); + playsoundatposition( "zmb_hellhound_prespawn", ent.origin ); + wait 1.5; + playsoundatposition( "zmb_hellhound_bolt", ent.origin ); + earthquake( 0.5, 0.75, ent.origin, 1000 ); + playrumbleonposition( "explosion_generic", ent.origin ); + playsoundatposition( "zmb_hellhound_spawn", ent.origin ); + angle = vectorToAngles( ai.favoriteenemy.origin - ent.origin ); + angles = ( ai.angles[ 0 ], angle[ 1 ], ai.angles[ 2 ] ); + ai forceteleport( ent.origin, angles ); + ai zombie_setup_attack_properties_dog(); + ai stop_magic_bullet_shield(); + wait 0.1; + ai show(); + ai setfreecameralockonallowed( 1 ); + ai.ignoreme = 0; + ai notify( "visible" ); +} +//unused code +/* +dog_spawn_sumpf_logic( dog_array, favorite_enemy ) //checked does not match cerberus output did not change +{ + dog_array = array_randomize( dog_array ); + i = 0; + while ( i < dog_array.size ) + { + if ( isDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_array[ i ] ) + { + i++; + continue; + } + else + { + if ( distancesquared( dog_array[ i ].origin, favorite_enemy.origin ) > 160000 && distancesquared( dog_array[ i ].origin, favorite_enemy.origin ) < 640000 ) + { + if ( distancesquared( ( 0, 0, dog_array[ i ].origin[ 2 ] ), ( 0, 0, favorite_enemy.origin[ 2 ] ) ) > 10000 ) + { + i++; + continue; + } + level.old_dog_spawn = dog_array[ i ]; + return dog_array[ i ]; + } + } + i++; + } + return dog_array[ 0 ]; +} +*/ +dog_spawn_factory_logic( dog_array, favorite_enemy ) //checked matches cerberus output +{ + dog_locs = array_randomize( level.enemy_dog_locations ); + for ( i = 0; i < dog_locs.size; i++ ) + { + if ( isDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_locs[ i ] ) + { + continue; + } + dist_squared = distancesquared( dog_locs[ i ].origin, favorite_enemy.origin ); + if ( dist_squared > 160000 && dist_squared < 1000000 ) + { + level.old_dog_spawn = dog_locs[ i ]; + return dog_locs[ i ]; + } + } + return dog_locs[ 0 ]; } -dog_spawn_sumpf_logic( dog_array, favorite_enemy ) +get_favorite_enemy() //checked changed to match cerberus output //reverted back to while loop { -/# - assert( dog_array.size > 0, "Dog Spawner array is empty." ); -#/ - dog_array = array_randomize( dog_array ); - - for ( i = 0; i < dog_array.size; i++ ) - { - if ( isdefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_array[i] ) - continue; - - if ( distancesquared( dog_array[i].origin, favorite_enemy.origin ) > 160000 && distancesquared( dog_array[i].origin, favorite_enemy.origin ) < 640000 ) - { - if ( distancesquared( ( 0, 0, dog_array[i].origin[2] ), ( 0, 0, favorite_enemy.origin[2] ) ) > 10000 ) - { - continue; - continue; - } - - level.old_dog_spawn = dog_array[i]; - return dog_array[i]; - } - } - - return dog_array[0]; + dog_targets = getplayers(); + least_hunted = dog_targets[ 0 ]; + i = 0; + while ( i < dog_targets.size ) + { + if ( !isdefined( dog_targets[ i ].hunted_by ) ) + { + dog_targets[ i ].hunted_by = 0; + } + if ( !is_player_valid( dog_targets[ i ] ) ) + { + i++; + continue; + } + if ( !is_player_valid( least_hunted ) ) + { + least_hunted = dog_targets[ i ]; + } + if ( dog_targets[ i ].hunted_by < least_hunted.hunted_by ) + { + least_hunted = dog_targets[ i ]; + } + i++; + } + least_hunted.hunted_by += 1; + return least_hunted; } -dog_spawn_factory_logic( dog_array, favorite_enemy ) +dog_health_increase() //checked changed to match cerberus output { - dog_locs = array_randomize( level.enemy_dog_locations ); - - for ( i = 0; i < dog_locs.size; i++ ) - { - if ( isdefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_locs[i] ) - continue; - - dist_squared = distancesquared( dog_locs[i].origin, favorite_enemy.origin ); - - if ( dist_squared > 160000 && dist_squared < 1000000 ) - { - level.old_dog_spawn = dog_locs[i]; - return dog_locs[i]; - } - } - - return dog_locs[0]; + players = getplayers(); + if ( level.dog_round_count == 1 ) + { + level.dog_health = 400; + } + else if ( level.dog_round_count == 2 ) + { + level.dog_health = 900; + } + else if ( level.dog_round_count == 3 ) + { + level.dog_health = 1300; + } + else if ( level.dog_round_count == 4 ) + { + level.dog_health = 1600; + } + if ( level.dog_health > 1600 ) + { + level.dog_health = 1600; + } } -get_favorite_enemy() +dog_round_tracker() //checked changed to match cerberus output { - dog_targets = getplayers(); - least_hunted = dog_targets[0]; - - for ( i = 0; i < dog_targets.size; i++ ) - { - if ( !isdefined( dog_targets[i].hunted_by ) ) - dog_targets[i].hunted_by = 0; - - if ( !is_player_valid( dog_targets[i] ) ) - continue; - - if ( !is_player_valid( least_hunted ) ) - least_hunted = dog_targets[i]; - - if ( dog_targets[i].hunted_by < least_hunted.hunted_by ) - least_hunted = dog_targets[i]; - } - - least_hunted.hunted_by += 1; - return least_hunted; + level.dog_round_count = 1; + level.next_dog_round = level.round_number + randomintrange( 4, 7 ); + old_spawn_func = level.round_spawn_func; + old_wait_func = level.round_wait_func; + while ( 1 ) + { + level waittill( "between_round_over" ); + if ( level.round_number == level.next_dog_round ) + { + level.music_round_override = 1; + old_spawn_func = level.round_spawn_func; + old_wait_func = level.round_wait_func; + dog_round_start(); + level.round_spawn_func = ::dog_round_spawning; + level.next_dog_round = level.round_number + randomintrange( 4, 6 ); + } + else if ( flag( "dog_round" ) ) + { + dog_round_stop(); + level.round_spawn_func = old_spawn_func; + level.round_wait_func = old_wait_func; + level.music_round_override = 0; + level.dog_round_count += 1; + } + } } -dog_health_increase() +dog_round_start() //checked matches cerberus output { - players = getplayers(); - - if ( level.dog_round_count == 1 ) - level.dog_health = 400; - else if ( level.dog_round_count == 2 ) - level.dog_health = 900; - else if ( level.dog_round_count == 3 ) - level.dog_health = 1300; - else if ( level.dog_round_count == 4 ) - level.dog_health = 1600; - - if ( level.dog_health > 1600 ) - level.dog_health = 1600; + flag_set( "dog_round" ); + flag_set( "dog_clips" ); + level thread maps/mp/zombies/_zm_audio::change_zombie_music( "dog_start" ); + if ( !isDefined( level.doground_nomusic ) ) + { + level.doground_nomusic = 0; + } + level.doground_nomusic = 1; + level notify( "dog_round_starting" ); + clientnotify( "dog_start" ); + if ( isDefined( level.dog_melee_range ) ) + { + setdvar( "ai_meleeRange", level.dog_melee_range ); + } + else + { + setdvar( "ai_meleeRange", 100 ); + } } -dog_round_tracker() +dog_round_stop() //checked matches cerberus output { - level.dog_round_count = 1; - level.next_dog_round = level.round_number + randomintrange( 4, 7 ); - old_spawn_func = level.round_spawn_func; - old_wait_func = level.round_wait_func; - - while ( true ) - { - level waittill( "between_round_over" ); -/# - if ( getdvarint( _hash_4077D7E0 ) > 0 ) - level.next_dog_round = level.round_number; -#/ - if ( level.round_number == level.next_dog_round ) - { - level.music_round_override = 1; - old_spawn_func = level.round_spawn_func; - old_wait_func = level.round_wait_func; - dog_round_start(); - level.round_spawn_func = ::dog_round_spawning; - level.next_dog_round = level.round_number + randomintrange( 4, 6 ); -/# - get_players()[0] iprintln( "Next dog round: " + level.next_dog_round ); -#/ - } - else if ( flag( "dog_round" ) ) - { - dog_round_stop(); - level.round_spawn_func = old_spawn_func; - level.round_wait_func = old_wait_func; - level.music_round_override = 0; - level.dog_round_count += 1; - } - } + flag_clear( "dog_round" ); + flag_clear( "dog_clips" ); + if ( !isDefined( level.doground_nomusic ) ) + { + level.doground_nomusic = 0; + } + level.doground_nomusic = 0; + level notify( "dog_round_ending" ); + clientnotify( "dog_stop" ); + setdvar( "ai_meleeRange", level.melee_range_sav ); + setdvar( "ai_meleeWidth", level.melee_width_sav ); + setdvar( "ai_meleeHeight", level.melee_height_sav ); } -dog_round_start() +play_dog_round() //checked matches cerberus output { - flag_set( "dog_round" ); - flag_set( "dog_clips" ); - level thread maps\mp\zombies\_zm_audio::change_zombie_music( "dog_start" ); - - if ( !isdefined( level.doground_nomusic ) ) - level.doground_nomusic = 0; - - level.doground_nomusic = 1; - level notify( "dog_round_starting" ); - clientnotify( "dog_start" ); - - if ( isdefined( level.dog_melee_range ) ) - setdvar( "ai_meleeRange", level.dog_melee_range ); - else - setdvar( "ai_meleeRange", 100 ); + self playlocalsound( "zmb_dog_round_start" ); + variation_count = 5; + wait 4.5; + players = getplayers(); + num = randomintrange( 0, players.size ); + players[ num ] maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "dog_spawn" ); } -dog_round_stop() +dog_init() //checked matches cerberus output { - flag_clear( "dog_round" ); - flag_clear( "dog_clips" ); - - if ( !isdefined( level.doground_nomusic ) ) - level.doground_nomusic = 0; - - level.doground_nomusic = 0; - level notify( "dog_round_ending" ); - clientnotify( "dog_stop" ); - setdvar( "ai_meleeRange", level.melee_range_sav ); - setdvar( "ai_meleeWidth", level.melee_width_sav ); - setdvar( "ai_meleeHeight", level.melee_height_sav ); + self.targetname = "zombie_dog"; + self.script_noteworthy = undefined; + self.animname = "zombie_dog"; + self.ignoreall = 1; + self.ignoreme = 1; + self.allowdeath = 1; + self.allowpain = 0; + self.force_gib = 1; + self.is_zombie = 1; + self.has_legs = 1; + self.gibbed = 0; + self.head_gibbed = 0; + self.default_goalheight = 40; + self.ignore_inert = 1; + self.grenadeawareness = 0; + self.badplaceawareness = 0; + self.ignoresuppression = 1; + self.suppressionthreshold = 1; + self.nododgemove = 1; + self.dontshootwhilemoving = 1; + self.pathenemylookahead = 0; + self.badplaceawareness = 0; + self.chatinitialized = 0; + self.team = level.zombie_team; + health_multiplier = 1; + if ( getDvar( "scr_dog_health_walk_multiplier" ) != "" ) + { + health_multiplier = getDvarFloat( "scr_dog_health_walk_multiplier" ); + } + self.maxhealth = int( level.dog_health * health_multiplier ); + self.health = int( level.dog_health * health_multiplier ); + self.freezegun_damage = 0; + self.zombie_move_speed = "sprint"; + self thread dog_run_think(); + self thread dog_stalk_audio(); + self thread maps/mp/zombies/_zm::round_spawn_failsafe(); + self ghost(); + self thread magic_bullet_shield(); + self dog_fx_eye_glow(); + self dog_fx_trail(); + self thread dog_death(); + level thread maps/mp/zombies/_zm_spawner::zombie_death_event( self ); + self thread maps/mp/zombies/_zm_spawner::enemy_death_detection(); + self.a.disablepain = 1; + self disable_react(); + self clearenemy(); + self cleargoalvolume(); + self.flame_damage_time = 0; + self.meleedamage = 40; + self.thundergun_knockdown_func = ::dog_thundergun_knockdown; + self maps/mp/zombies/_zm_spawner::zombie_history( "zombie_dog_spawn_init -> Spawned = " + self.origin ); + if ( isDefined( level.achievement_monitor_func ) ) + { + self [[ level.achievement_monitor_func ]](); + } } -play_dog_round() +dog_fx_eye_glow() //checked matches cerberus output { - self playlocalsound( "zmb_dog_round_start" ); - variation_count = 5; - wait 4.5; - players = getplayers(); - num = randomintrange( 0, players.size ); - players[num] maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "dog_spawn" ); + self.fx_dog_eye = spawn( "script_model", self gettagorigin( "J_EyeBall_LE" ) ); + self.fx_dog_eye.angles = self gettagangles( "J_EyeBall_LE" ); + self.fx_dog_eye setmodel( "tag_origin" ); + self.fx_dog_eye linkto( self, "J_EyeBall_LE" ); } -dog_init() +dog_fx_trail() //checked matches cerberus output { - self.targetname = "zombie_dog"; - self.script_noteworthy = undefined; - self.animname = "zombie_dog"; - self.ignoreall = 1; - self.ignoreme = 1; - self.allowdeath = 1; - self.allowpain = 0; - self.force_gib = 1; - self.is_zombie = 1; - self.has_legs = 1; - self.gibbed = 0; - self.head_gibbed = 0; - self.default_goalheight = 40; - self.ignore_inert = 1; - self.grenadeawareness = 0; - self.badplaceawareness = 0; - self.ignoresuppression = 1; - self.suppressionthreshold = 1; - self.nododgemove = 1; - self.dontshootwhilemoving = 1; - self.pathenemylookahead = 0; - self.badplaceawareness = 0; - self.chatinitialized = 0; - self.team = level.zombie_team; - health_multiplier = 1.0; - - if ( getdvar( _hash_CAA5B74F ) != "" ) - health_multiplier = getdvarfloat( _hash_CAA5B74F ); - - self.maxhealth = int( level.dog_health * health_multiplier ); - self.health = int( level.dog_health * health_multiplier ); - self.freezegun_damage = 0; - self.zombie_move_speed = "sprint"; - self thread dog_run_think(); - self thread dog_stalk_audio(); - self thread maps\mp\zombies\_zm::round_spawn_failsafe(); - self ghost(); - self thread magic_bullet_shield(); - self dog_fx_eye_glow(); - self dog_fx_trail(); - self thread dog_death(); - level thread maps\mp\zombies\_zm_spawner::zombie_death_event( self ); - self thread maps\mp\zombies\_zm_spawner::enemy_death_detection(); - self.a.disablepain = 1; - self disable_react(); - self clearenemy(); - self cleargoalvolume(); - self.flame_damage_time = 0; - self.meleedamage = 40; - self.thundergun_knockdown_func = ::dog_thundergun_knockdown; - self maps\mp\zombies\_zm_spawner::zombie_history( "zombie_dog_spawn_init -> Spawned = " + self.origin ); - - if ( isdefined( level.achievement_monitor_func ) ) - self [[ level.achievement_monitor_func ]](); + if ( !is_mature() || randomint( 100 ) > level.zombie_vars[ "dog_fire_trail_percent" ] ) + { + self.fx_dog_trail_type = level._effect[ "dog_trail_ash" ]; + self.fx_dog_trail_sound = "zmb_hellhound_loop_breath"; + } + else + { + self.a.nodeath = 1; + self.fx_dog_trail_type = level._effect[ "dog_trail_fire" ]; + self.fx_dog_trail_sound = "zmb_hellhound_loop_fire"; + } + self.fx_dog_trail = spawn( "script_model", self gettagorigin( "tag_origin" ) ); + self.fx_dog_trail.angles = self gettagangles( "tag_origin" ); + self.fx_dog_trail setmodel( "tag_origin" ); + self.fx_dog_trail linkto( self, "tag_origin" ); } -dog_fx_eye_glow() +dog_death() //checked changed to match cerberus output { - self.fx_dog_eye = spawn( "script_model", self gettagorigin( "J_EyeBall_LE" ) ); -/# - assert( isdefined( self.fx_dog_eye ) ); -#/ - self.fx_dog_eye.angles = self gettagangles( "J_EyeBall_LE" ); - self.fx_dog_eye setmodel( "tag_origin" ); - self.fx_dog_eye linkto( self, "J_EyeBall_LE" ); + self waittill( "death" ); + if ( get_current_zombie_count() == 0 && level.zombie_total == 0 ) + { + level.last_dog_origin = self.origin; + level notify( "last_dog_down" ); + } + if ( isplayer( self.attacker ) ) + { + event = "death"; + if ( issubstr( self.damageweapon, "knife_ballistic_" ) ) + { + event = "ballistic_knife_death"; + } + self.attacker maps/mp/zombies/_zm_score::player_add_points( event, self.damagemod, self.damagelocation, 1 ); + if ( randomintrange( 0, 100 ) >= 80 ) + { + self.attacker maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "hellhound" ); + } + self.attacker maps/mp/zombies/_zm_stats::increment_client_stat( "zdogs_killed" ); + self.attacker maps/mp/zombies/_zm_stats::increment_player_stat( "zdogs_killed" ); + } + if ( isDefined( self.attacker ) && isai( self.attacker ) ) + { + self.attacker notify( "killed" ); + } + self stoploopsound(); + self.fx_dog_eye delete(); + self.fx_dog_trail delete(); + if ( isDefined( self.a.nodeath ) ) + { + level thread dog_explode_fx( self.origin ); + self delete(); + } + else + { + self playsound( "zmb_hellhound_vocals_death" ); + } } -dog_fx_trail() +dog_explode_fx( origin ) //checked matches cerberus output { - if ( !is_mature() || randomint( 100 ) > level.zombie_vars["dog_fire_trail_percent"] ) - { - self.fx_dog_trail_type = level._effect["dog_trail_ash"]; - self.fx_dog_trail_sound = "zmb_hellhound_loop_breath"; - } - else - { - self.a.nodeath = 1; - self.fx_dog_trail_type = level._effect["dog_trail_fire"]; - self.fx_dog_trail_sound = "zmb_hellhound_loop_fire"; - } - - self.fx_dog_trail = spawn( "script_model", self gettagorigin( "tag_origin" ) ); -/# - assert( isdefined( self.fx_dog_trail ) ); -#/ - self.fx_dog_trail.angles = self gettagangles( "tag_origin" ); - self.fx_dog_trail setmodel( "tag_origin" ); - self.fx_dog_trail linkto( self, "tag_origin" ); + playfx( level._effect[ "dog_gib" ], origin ); + playsoundatposition( "zmb_hellhound_explode", origin ); } -dog_death() +zombie_setup_attack_properties_dog() //checked matches cerberus output { - self waittill( "death" ); - - if ( get_current_zombie_count() == 0 && level.zombie_total == 0 ) - { - level.last_dog_origin = self.origin; - level notify( "last_dog_down" ); - } - - if ( isplayer( self.attacker ) ) - { - event = "death"; - - if ( issubstr( self.damageweapon, "knife_ballistic_" ) ) - event = "ballistic_knife_death"; - - self.attacker maps\mp\zombies\_zm_score::player_add_points( event, self.damagemod, self.damagelocation, 1 ); - - if ( randomintrange( 0, 100 ) >= 80 ) - self.attacker maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "hellhound" ); - - self.attacker maps\mp\zombies\_zm_stats::increment_client_stat( "zdogs_killed" ); - self.attacker maps\mp\zombies\_zm_stats::increment_player_stat( "zdogs_killed" ); - } - - if ( isdefined( self.attacker ) && isai( self.attacker ) ) - self.attacker notify( "killed", self ); - - self stoploopsound(); -/# - assert( isdefined( self.fx_dog_eye ) ); -#/ - self.fx_dog_eye delete(); -/# - assert( isdefined( self.fx_dog_trail ) ); -#/ - self.fx_dog_trail delete(); - - if ( isdefined( self.a.nodeath ) ) - { - level thread dog_explode_fx( self.origin ); - self delete(); - } - else - self playsound( "zmb_hellhound_vocals_death" ); + self maps/mp/zombies/_zm_spawner::zombie_history( "zombie_setup_attack_properties()" ); + self thread dog_behind_audio(); + self.ignoreall = 0; + self.pathenemyfightdist = 64; + self.meleeattackdist = 64; + self.disablearrivals = 1; + self.disableexits = 1; } -dog_explode_fx( origin ) +stop_dog_sound_on_death() //checked matches cerberus output { - playfx( level._effect["dog_gib"], origin ); - playsoundatposition( "zmb_hellhound_explode", origin ); + self waittill( "death" ); + self stopsounds(); } -zombie_setup_attack_properties_dog() +dog_behind_audio() //checked does not match cerberus output changed at own discretion { - self maps\mp\zombies\_zm_spawner::zombie_history( "zombie_setup_attack_properties()" ); - self thread dog_behind_audio(); - self.ignoreall = 0; - self.pathenemyfightdist = 64; - self.meleeattackdist = 64; - self.disablearrivals = 1; - self.disableexits = 1; + self thread stop_dog_sound_on_death(); + self endon( "death" ); + self waittill_any( "dog_running", "dog_combat" ); + self playsound( "zmb_hellhound_vocals_close" ); + wait 3; + while ( 1 ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + vectorAngle = vectorToAngles( self.origin - players[ i ].origin ); + dogangle = AbsAngleClamp180( vectorAngle[ 1 ] - players[ i ].angles[ 1 ] ); + if ( isalive( players[ i ] ) && !isDefined( players[ i ].revivetrigger ) ) + { + if ( Abs( dogangle ) > 90 && distance2d( self.origin, players[ i ].origin ) > 100 ) + { + self playsound( "zmb_hellhound_vocals_close" ); + wait 3; + } + } + i++; + } + wait 0.75; + } } -stop_dog_sound_on_death() +dog_clip_monitor() //checked changed to match cerberus output { - self waittill( "death" ); - - self stopsounds(); + clips_on = 0; + level.dog_clips = getentarray( "dog_clips", "targetname" ); + while ( 1 ) + { + for ( i = 0; i < level.dog_clips.size; i++ ) + { + level.dog_clips[ i ] trigger_off(); + level.dog_clips[ i ] connectpaths(); + } + flag_wait( "dog_clips" ); + if ( isDefined( level.no_dog_clip ) && level.no_dog_clip == 1 ) + { + return; + } + for ( i = 0; i < level.dog_clips.size; i++ ) + { + level.dog_clips[ i ] trigger_on(); + level.dog_clips[ i ] disconnectpaths(); + wait_network_frame(); + } + dog_is_alive = 1; + while ( dog_is_alive || flag( "dog_round" ) ) + { + dog_is_alive = 0; + dogs = getentarray( "zombie_dog", "targetname" ); + for ( i = 0; i < dogs.size; i++ ) + { + if ( isalive( dogs[ i ] ) ) + { + dog_is_alive = 1; + } + } + wait 1; + } + flag_clear( "dog_clips" ); + wait 1; + } } -dog_behind_audio() +special_dog_spawn( spawners, num_to_spawn ) //checked matches cerberus output { - self thread stop_dog_sound_on_death(); - self endon( "death" ); - self waittill_any( "dog_running", "dog_combat" ); - self playsound( "zmb_hellhound_vocals_close" ); - wait 3; - - while ( true ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - dogangle = angleclamp180( vectortoangles( self.origin - players[i].origin )[1] - players[i].angles[1] ); - - if ( isalive( players[i] ) && !isdefined( players[i].revivetrigger ) ) - { - if ( abs( dogangle ) > 90 && distance2d( self.origin, players[i].origin ) > 100 ) - { - self playsound( "zmb_hellhound_vocals_close" ); - wait 3; - } - } - } - - wait 0.75; - } + dogs = getaispeciesarray( "all", "zombie_dog" ); + if ( isDefined( dogs ) && dogs.size >= 9 ) + { + return 0; + } + if ( !isDefined( num_to_spawn ) ) + { + num_to_spawn = 1; + } + spawn_point = undefined; + count = 0; + while ( count < num_to_spawn ) + { + players = get_players(); + favorite_enemy = get_favorite_enemy(); + if ( isDefined( spawners ) ) + { + spawn_point = spawners[ randomint( spawners.size ) ]; + ai = spawn_zombie( spawn_point ); + if ( isDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_point thread dog_spawn_fx( ai ); + count++; + flag_set( "dog_clips" ); + } + } + else if ( isDefined( level.dog_spawn_func ) ) + { + spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy ); + ai = spawn_zombie( level.dog_spawners[ 0 ] ); + if ( isDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_loc thread dog_spawn_fx( ai, spawn_loc ); + count++; + flag_set( "dog_clips" ); + } + } + else + { + spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy ); + ai = spawn_zombie( level.dog_spawners[ 0 ] ); + if ( isDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_point thread dog_spawn_fx( ai, spawn_point ); + count++; + flag_set( "dog_clips" ); + } + } + waiting_for_next_dog_spawn( count, num_to_spawn ); + } + return 1; } -dog_clip_monitor() +dog_run_think() //checked matches cerberus output { - clips_on = 0; - level.dog_clips = getentarray( "dog_clips", "targetname" ); - - while ( true ) - { - for ( i = 0; i < level.dog_clips.size; i++ ) - { - level.dog_clips[i] trigger_off(); - level.dog_clips[i] connectpaths(); - } - - flag_wait( "dog_clips" ); - - if ( isdefined( level.no_dog_clip ) && level.no_dog_clip == 1 ) - return; - - for ( i = 0; i < level.dog_clips.size; i++ ) - { - level.dog_clips[i] trigger_on(); - level.dog_clips[i] disconnectpaths(); - wait_network_frame(); - } - - dog_is_alive = 1; - - while ( dog_is_alive || flag( "dog_round" ) ) - { - dog_is_alive = 0; - dogs = getentarray( "zombie_dog", "targetname" ); - - for ( i = 0; i < dogs.size; i++ ) - { - if ( isalive( dogs[i] ) ) - dog_is_alive = 1; - } - - wait 1; - } - - flag_clear( "dog_clips" ); - wait 1; - } + self endon( "death" ); + self waittill( "visible" ); + if ( self.health > level.dog_health ) + { + self.maxhealth = level.dog_health; + self.health = level.dog_health; + } + maps/mp/zombies/_zm_net::network_safe_play_fx_on_tag("dog_fx", 2, level._effect["dog_eye_glow"], self.fx_dog_eye, "tag_origin"); + maps/mp/zombies/_zm_net::network_safe_play_fx_on_tag( "dog_fx", 2, self.fx_dog_trail_type, self.fx_dog_trail, "tag_origin" ); + self playloopsound( self.fx_dog_trail_sound ); + while ( 1 ) + { + if ( !is_player_valid( self.favoriteenemy ) ) + { + self.favoriteenemy = get_favorite_enemy(); + } + wait 0.2; + } } -special_dog_spawn( spawners, num_to_spawn ) +dog_stalk_audio() //checked matches cerberus output { - dogs = getaispeciesarray( "all", "zombie_dog" ); - - if ( isdefined( dogs ) && dogs.size >= 9 ) - return false; - - if ( !isdefined( num_to_spawn ) ) - num_to_spawn = 1; - - spawn_point = undefined; - count = 0; - - while ( count < num_to_spawn ) - { - players = get_players(); - favorite_enemy = get_favorite_enemy(); - - if ( isdefined( spawners ) ) - { - spawn_point = spawners[randomint( spawners.size )]; - ai = spawn_zombie( spawn_point ); - - if ( isdefined( ai ) ) - { - ai.favoriteenemy = favorite_enemy; - spawn_point thread dog_spawn_fx( ai ); - count++; - flag_set( "dog_clips" ); - } - } - else if ( isdefined( level.dog_spawn_func ) ) - { - spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy ); - ai = spawn_zombie( level.dog_spawners[0] ); - - if ( isdefined( ai ) ) - { - ai.favoriteenemy = favorite_enemy; - spawn_loc thread dog_spawn_fx( ai, spawn_loc ); - count++; - flag_set( "dog_clips" ); - } - } - else - { - spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy ); - ai = spawn_zombie( level.dog_spawners[0] ); - - if ( isdefined( ai ) ) - { - ai.favoriteenemy = favorite_enemy; - spawn_point thread dog_spawn_fx( ai, spawn_point ); - count++; - flag_set( "dog_clips" ); - } - } - - waiting_for_next_dog_spawn( count, num_to_spawn ); - } - - return true; + self endon( "death" ); + self endon( "dog_running" ); + self endon( "dog_combat" ); + while ( 1 ) + { + self playsound( "zmb_hellhound_vocals_amb" ); + wait randomfloatrange( 3, 6 ); + } } -dog_run_think() +dog_thundergun_knockdown( player, gib ) //checked matches cerberus output { - self endon( "death" ); - - self waittill( "visible" ); - - if ( self.health > level.dog_health ) - { - self.maxhealth = level.dog_health; - self.health = level.dog_health; - } -/# - assert( isdefined( self.fx_dog_eye ) ); -#/ - maps\mp\zombies\_zm_net::network_safe_play_fx_on_tag( "dog_fx", 2, level._effect["dog_eye_glow"], self.fx_dog_eye, "tag_origin" ); -/# - assert( isdefined( self.fx_dog_trail ) ); -#/ - maps\mp\zombies\_zm_net::network_safe_play_fx_on_tag( "dog_fx", 2, self.fx_dog_trail_type, self.fx_dog_trail, "tag_origin" ); - self playloopsound( self.fx_dog_trail_sound ); - - while ( true ) - { - if ( !is_player_valid( self.favoriteenemy ) ) - self.favoriteenemy = get_favorite_enemy(); - - wait 0.2; - } + self endon( "death" ); + damage = int( self.maxhealth * 0.5 ); + self dodamage( damage, player.origin, player ); } -dog_stalk_audio() -{ - self endon( "death" ); - self endon( "dog_running" ); - self endon( "dog_combat" ); - while ( true ) - { - self playsound( "zmb_hellhound_vocals_amb" ); - wait( randomfloatrange( 3, 6 ) ); - } -} -dog_thundergun_knockdown( player, gib ) -{ - self endon( "death" ); - damage = int( self.maxhealth * 0.5 ); - self dodamage( damage, player.origin, player ); -} + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_faller.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_faller.gsc index 994388e..2fbba54 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_faller.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ai_faller.gsc @@ -1,629 +1,617 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_spawner; -#include maps\mp\animscripts\zm_shared; -#include maps\mp\zombies\_zm_laststand; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -zombie_faller_delete() +zombie_faller_delete() //checked matches cerberus output { - level.zombie_total++; - self maps\mp\zombies\_zm_spawner::reset_attack_spot(); - - if ( isdefined( self.zombie_faller_location ) ) - { - self.zombie_faller_location.is_enabled = 1; - self.zombie_faller_location = undefined; - } - - self delete(); + level.zombie_total++; + self maps/mp/zombies/_zm_spawner::reset_attack_spot(); + if ( isDefined( self.zombie_faller_location ) ) + { + self.zombie_faller_location.is_enabled = 1; + self.zombie_faller_location = undefined; + } + self delete(); } -faller_script_parameters() +faller_script_parameters() //checked changed to match cerberus output { - if ( isdefined( self.script_parameters ) ) - { - parms = strtok( self.script_parameters, ";" ); - - if ( isdefined( parms ) && parms.size > 0 ) - { - for ( i = 0; i < parms.size; i++ ) - { - if ( parms[i] == "drop_now" ) - self.drop_now = 1; - - if ( parms[i] == "drop_not_occupied" ) - self.drop_not_occupied = 1; - - if ( parms[i] == "emerge_top" ) - self.emerge_top = 1; - - if ( parms[i] == "emerge_bottom" ) - self.emerge_bottom = 1; - } - } - } + if ( isDefined( self.script_parameters ) ) + { + parms = strtok( self.script_parameters, ";" ); + if ( isDefined( parms ) && parms.size > 0 ) + { + for ( i = 0; i < parms.size; i++ ) + { + if ( parms[ i ] == "drop_now" ) + { + self.drop_now = 1; + } + if ( parms[ i ] == "drop_not_occupied" ) + { + self.drop_not_occupied = 1; + } + if ( parms[ i ] == "emerge_top" ) + { + self.emerge_top = 1; + } + if ( parms[ i ] == "emerge_bottom" ) + { + self.emerge_bottom = 1; + } + } + } + } } -setup_deathfunc( func_name ) +setup_deathfunc( func_name ) //checked matches cerberus output { - self endon( "death" ); - - while ( !( isdefined( self.zombie_init_done ) && self.zombie_init_done ) ) - wait_network_frame(); - - if ( isdefined( func_name ) ) - self.deathfunction = func_name; - else if ( isdefined( level.custom_faller_death ) ) - self.deathfunction = level.custom_faller_death; - else - self.deathfunction = ::zombie_fall_death_func; + self endon( "death" ); + while ( !is_true( self.zombie_init_done ) ) + { + wait_network_frame(); + } + if ( isDefined( func_name ) ) + { + self.deathfunction = func_name; + } + else if ( isDefined( level.custom_faller_death ) ) + { + self.deathfunction = level.custom_faller_death; + } + else + { + self.deathfunction = ::zombie_fall_death_func; + } } -do_zombie_fall( spot ) +do_zombie_fall( spot ) //checked changed to match cerberus output { - self endon( "death" ); - self.zombie_faller_location = spot; - self.zombie_faller_location.is_enabled = 0; - self.zombie_faller_location faller_script_parameters(); - - if ( isdefined( self.zombie_faller_location.emerge_bottom ) && self.zombie_faller_location.emerge_bottom || isdefined( self.zombie_faller_location.emerge_top ) && self.zombie_faller_location.emerge_top ) - { - self do_zombie_emerge( spot ); - return; - } - - self thread setup_deathfunc(); - self.no_powerups = 1; - self.in_the_ceiling = 1; - self.anchor = spawn( "script_origin", self.origin ); - self.anchor.angles = self.angles; - self linkto( self.anchor ); - - if ( !isdefined( spot.angles ) ) - spot.angles = ( 0, 0, 0 ); - - anim_org = spot.origin; - anim_ang = spot.angles; - self ghost(); - self.anchor moveto( anim_org, 0.05 ); - - self.anchor waittill( "movedone" ); - - target_org = get_desired_origin(); - - if ( isdefined( target_org ) ) - { - anim_ang = vectortoangles( target_org - self.origin ); - self.anchor rotateto( ( 0, anim_ang[1], 0 ), 0.05 ); - - self.anchor waittill( "rotatedone" ); - } - - self unlink(); - - if ( isdefined( self.anchor ) ) - self.anchor delete(); - - self thread maps\mp\zombies\_zm_spawner::hide_pop(); - self thread zombie_fall_death( spot ); - self thread zombie_fall_fx( spot ); - self thread zombie_faller_death_wait(); - self thread zombie_faller_do_fall(); - self.no_powerups = 0; - self notify( "risen", spot.script_string ); + self endon( "death" ); + self.zombie_faller_location = spot; + self.zombie_faller_location.is_enabled = 0; + self.zombie_faller_location faller_script_parameters(); + if ( is_true( self.zombie_faller_location.emerge_bottom ) || is_true( self.zombie_faller_location.emerge_top ) ) + { + self do_zombie_emerge( spot ); + return; + } + self thread setup_deathfunc(); + self.no_powerups = 1; + self.in_the_ceiling = 1; + self.anchor = spawn( "script_origin", self.origin ); + self.anchor.angles = self.angles; + self linkto( self.anchor ); + if ( !isDefined( spot.angles ) ) + { + spot.angles = ( 0, 0, 0 ); + } + anim_org = spot.origin; + anim_ang = spot.angles; + self ghost(); + self.anchor moveto( anim_org, 0.05 ); + self.anchor waittill( "movedone" ); + target_org = get_desired_origin(); + if ( isDefined( target_org ) ) + { + anim_ang = vectorToAngles( target_org - self.origin ); + self.anchor rotateto( ( 0, anim_ang[ 1 ], 0 ), 0.05 ); + self.anchor waittill( "rotatedone" ); + } + self unlink(); + if ( isDefined( self.anchor ) ) + { + self.anchor delete(); + } + self thread maps/mp/zombies/_zm_spawner::hide_pop(); + self thread zombie_fall_death( spot ); + self thread zombie_fall_fx( spot ); + self thread zombie_faller_death_wait(); + self thread zombie_faller_do_fall(); + self.no_powerups = 0; + self notify( "risen", spot.script_string ); } -zombie_faller_do_fall() +zombie_faller_do_fall() //checked changed to match cerberus output { - self endon( "death" ); - self animscripted( self.origin, self.zombie_faller_location.angles, "zm_faller_emerge" ); - self maps\mp\animscripts\zm_shared::donotetracks( "emerge_anim", ::handle_fall_notetracks, self.zombie_faller_location ); - self.zombie_faller_wait_start = gettime(); - self.zombie_faller_should_drop = 0; - self thread zombie_fall_wait(); - self thread zombie_faller_watch_all_players(); - - while ( !self.zombie_faller_should_drop ) - { - if ( self zombie_fall_should_attack( self.zombie_faller_location ) ) - { - self animscripted( self.origin, self.zombie_faller_location.angles, "zm_faller_attack" ); - self maps\mp\animscripts\zm_shared::donotetracks( "attack_anim", ::handle_fall_notetracks, self.zombie_faller_location ); - - if ( !self zombie_faller_always_drop() && randomfloat( 1 ) > 0.5 ) - self.zombie_faller_should_drop = 1; - } - else if ( self zombie_faller_always_drop() ) - { - self.zombie_faller_should_drop = 1; - break; - } - else if ( gettime() >= self.zombie_faller_wait_start + 20000 ) - { - self.zombie_faller_should_drop = 1; - break; - } - else if ( self zombie_faller_drop_not_occupied() ) - { - self.zombie_faller_should_drop = 1; - break; - } - else - { - self animscripted( self.origin, self.zombie_faller_location.angles, "zm_faller_attack" ); - self maps\mp\animscripts\zm_shared::donotetracks( "attack_anim", ::handle_fall_notetracks, self.zombie_faller_location ); - } - } - - self notify( "falling" ); - spot = self.zombie_faller_location; - self zombie_faller_enable_location(); - self animscripted( self.origin, spot.angles, "zm_faller_fall" ); - self maps\mp\animscripts\zm_shared::donotetracks( "fall_anim", ::handle_fall_notetracks, spot ); - self.deathfunction = maps\mp\zombies\_zm_spawner::zombie_death_animscript; - self notify( "fall_anim_finished" ); - spot notify( "stop_zombie_fall_fx" ); - self stopanimscripted(); - landanimdelta = 15; - ground_pos = groundpos_ignore_water_new( self.origin ); - physdist = self.origin[2] - ground_pos[2] + landanimdelta; - - if ( physdist > 0 ) - { - self animcustom( ::zombie_fall_loop ); - - self waittill( "faller_on_ground" ); - - self animcustom( ::zombie_land ); - - self waittill( "zombie_land_done" ); - } - - self.in_the_ceiling = 0; - self traversemode( "gravity" ); - self.no_powerups = 0; + self endon( "death" ); + self animscripted( self.origin, self.zombie_faller_location.angles, "zm_faller_emerge" ); + self maps/mp/animscripts/zm_shared::donotetracks( "emerge_anim", ::handle_fall_notetracks, self.zombie_faller_location ); + self.zombie_faller_wait_start = getTime(); + self.zombie_faller_should_drop = 0; + self thread zombie_fall_wait(); + self thread zombie_faller_watch_all_players(); + while ( !self.zombie_faller_should_drop ) + { + if ( self zombie_fall_should_attack( self.zombie_faller_location ) ) + { + self animscripted( self.origin, self.zombie_faller_location.angles, "zm_faller_attack" ); + self maps/mp/animscripts/zm_shared::donotetracks( "attack_anim", ::handle_fall_notetracks, self.zombie_faller_location ); + if ( !self zombie_faller_always_drop() && randomfloat( 1 ) > 0.5 ) + { + self.zombie_faller_should_drop = 1; + } + } + else if ( self zombie_faller_always_drop() ) + { + self.zombie_faller_should_drop = 1; + break; + } + else if ( getTime() >= ( self.zombie_faller_wait_start + 20000 ) ) + { + self.zombie_faller_should_drop = 1; + break; + } + else if ( self zombie_faller_drop_not_occupied() ) + { + self.zombie_faller_should_drop = 1; + break; + } + else + { + self animscripted( self.origin, self.zombie_faller_location.angles, "zm_faller_attack" ); + self maps/mp/animscripts/zm_shared::donotetracks( "attack_anim", ::handle_fall_notetracks, self.zombie_faller_location ); + } + } + self notify( "falling" ); + spot = self.zombie_faller_location; + self zombie_faller_enable_location(); + self animscripted( self.origin, spot.angles, "zm_faller_fall" ); + self maps/mp/animscripts/zm_shared::donotetracks( "fall_anim", ::handle_fall_notetracks, spot ); + self.deathfunction = maps/mp/zombies/_zm_spawner::zombie_death_animscript; + self notify( "fall_anim_finished" ); + spot notify( "stop_zombie_fall_fx" ); + self stopanimscripted(); + landanimdelta = 15; + ground_pos = groundpos_ignore_water_new( self.origin ); + physdist = self.origin[ 2 ] - ground_pos[ 2 ] + landanimdelta; + if ( physdist > 0 ) + { + self animcustom( ::zombie_fall_loop ); + self waittill( "faller_on_ground" ); + self animcustom( ::zombie_land ); + self waittill( "zombie_land_done" ); + } + self.in_the_ceiling = 0; + self traversemode( "gravity" ); + self.no_powerups = 0; } -zombie_fall_loop() +zombie_fall_loop() //checked changed to match cerberus output { - self endon( "death" ); - self setanimstatefromasd( "zm_faller_fall_loop" ); - - while ( true ) - { - ground_pos = groundpos_ignore_water_new( self.origin ); - - if ( self.origin[2] - ground_pos[2] < 20 ) - { - self notify( "faller_on_ground" ); - break; - } - - wait 0.05; - } + self endon( "death" ); + self setanimstatefromasd( "zm_faller_fall_loop" ); + while ( 1 ) + { + ground_pos = groundpos_ignore_water_new( self.origin ); + if ( self.origin[ 2 ] - ground_pos[ 2 ] < 20 ) + { + self notify( "faller_on_ground" ); + break; + } + wait 0.05; + } } -zombie_land() +zombie_land() //checked matches cerberus output { - self setanimstatefromasd( "zm_faller_land" ); - maps\mp\animscripts\zm_shared::donotetracks( "land_anim" ); - self notify( "zombie_land_done" ); + self setanimstatefromasd( "zm_faller_land" ); + maps/mp/animscripts/zm_shared::donotetracks( "land_anim" ); + self notify( "zombie_land_done" ); } -zombie_faller_always_drop() +zombie_faller_always_drop() //checked matches cerberus output { - if ( isdefined( self.zombie_faller_location.drop_now ) && self.zombie_faller_location.drop_now ) - return true; - - return false; + if ( is_true( self.zombie_faller_location.drop_now ) ) + { + return 1; + } + return 0; } -zombie_faller_drop_not_occupied() +zombie_faller_drop_not_occupied() //checked matches cerberus output { - if ( isdefined( self.zombie_faller_location.drop_not_occupied ) && self.zombie_faller_location.drop_not_occupied ) - { - if ( isdefined( self.zone_name ) && isdefined( level.zones[self.zone_name] ) ) - return !level.zones[self.zone_name].is_occupied; - } - - return 0; + if ( is_true( self.zombie_faller_location.drop_not_occupied ) ) + { + if ( isDefined( self.zone_name ) && isDefined( level.zones[ self.zone_name ] ) ) + { + return !level.zones[ self.zone_name ].is_occupied; + } + } + return 0; } -zombie_faller_watch_all_players() +zombie_faller_watch_all_players() //checked changed to match cerberus output { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - self thread zombie_faller_watch_player( players[i] ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + self thread zombie_faller_watch_player( players[ i ] ); + } } -zombie_faller_watch_player( player ) +zombie_faller_watch_player( player ) //checked changed to match cerberus output { - self endon( "falling" ); - self endon( "death" ); - player endon( "disconnect" ); - range = 200; - rangesqr = range * range; - timer = 5000; - inrange = 0; - inrangetime = 0; - closerange = 60; - closerangesqr = closerange * closerange; - dirtoplayerenter = ( 0, 0, 0 ); - incloserange = 0; - - while ( true ) - { - distsqr = distance2dsquared( self.origin, player.origin ); - - if ( distsqr < rangesqr ) - { - if ( inrange ) - { - if ( inrangetime + timer < gettime() ) - { - self.zombie_faller_should_drop = 1; - break; - } - } - else - { - inrange = 1; - inrangetime = gettime(); - } - } - else - inrange = 0; - - if ( distsqr < closerangesqr ) - { - if ( !incloserange ) - { - dirtoplayerenter = player.origin - self.origin; - dirtoplayerenter = ( dirtoplayerenter[0], dirtoplayerenter[1], 0.0 ); - dirtoplayerenter = vectornormalize( dirtoplayerenter ); - } - - incloserange = 1; - } - else - { - if ( incloserange ) - { - dirtoplayerexit = player.origin - self.origin; - dirtoplayerexit = ( dirtoplayerexit[0], dirtoplayerexit[1], 0.0 ); - dirtoplayerexit = vectornormalize( dirtoplayerexit ); - - if ( vectordot( dirtoplayerenter, dirtoplayerexit ) < 0 ) - { - self.zombie_faller_should_drop = 1; - break; - } - } - - incloserange = 0; - } - - wait 0.1; - } + self endon( "falling" ); + self endon( "death" ); + player endon( "disconnect" ); + range = 200; + rangesqr = range * range; + timer = 5000; + inrange = 0; + inrangetime = 0; + closerange = 60; + closerangesqr = closerange * closerange; + dirtoplayerenter = ( 0, 0, 0 ); + incloserange = 0; + while ( 1 ) + { + distsqr = distance2dsquared( self.origin, player.origin ); + if ( distsqr < rangesqr ) + { + if ( inrange ) + { + if ( ( inrangetime + timer ) < getTime() ) + { + self.zombie_faller_should_drop = 1; + break; + } + } + else + { + inrange = 1; + inrangetime = getTime(); + } + } + else + { + inrange = 0; + } + if ( distsqr < closerangesqr ) + { + if ( !incloserange ) + { + dirtoplayerenter = player.origin - self.origin; + dirtoplayerenter = ( dirtoplayerenter[ 0 ], dirtoplayerenter[ 1 ], 0 ); + dirtoplayerenter = vectornormalize( dirtoplayerenter ); + } + incloserange = 1; + } + else if ( incloserange ) + { + dirtoplayerexit = player.origin - self.origin; + dirtoplayerexit = ( dirtoplayerexit[ 0 ], dirtoplayerexit[ 1 ], 0 ); + dirtoplayerexit = vectornormalize( dirtoplayerexit ); + if ( vectordot( dirtoplayerenter, dirtoplayerexit ) < 0 ) + { + self.zombie_faller_should_drop = 1; + break; + } + } + incloserange = 0; + wait 0.1; + } } -zombie_fall_wait() +zombie_fall_wait() //checked changed to match cerberus output { - self endon( "falling" ); - self endon( "death" ); - - if ( isdefined( self.zone_name ) ) - { - if ( isdefined( level.zones ) && isdefined( level.zones[self.zone_name] ) ) - { - zone = level.zones[self.zone_name]; - - while ( true ) - { - if ( !zone.is_enabled || !zone.is_active ) - { - if ( !self potentially_visible( 2250000 ) ) - { - if ( self.health != level.zombie_health ) - { - self.zombie_faller_should_drop = 1; - break; - } - else - { - self zombie_faller_delete(); - return; - } - } - } - - wait 0.5; - } - } - } + self endon( "falling" ); + self endon( "death" ); + if ( isDefined( self.zone_name ) ) + { + if ( isDefined( level.zones ) && isDefined( level.zones[ self.zone_name ] ) ) + { + zone = level.zones[ self.zone_name ]; + while ( 1 ) + { + if ( !zone.is_enabled || !zone.is_active ) + { + if ( !self potentially_visible( 2250000 ) ) + { + if ( self.health != level.zombie_health ) + { + self.zombie_faller_should_drop = 1; + break; + } + else + { + self zombie_faller_delete(); + return; + } + } + } + wait 0.5; + } + } + } } zombie_fall_should_attack( spot ) { - victims = zombie_fall_get_vicitims( spot ); - return victims.size > 0; + victims = zombie_fall_get_vicitims( spot ); + return victims.size > 0; } -zombie_fall_get_vicitims( spot ) +zombie_fall_get_vicitims( spot ) //checked partially changed to match cerberus output //continues in for loops bad { - ret = []; - players = getplayers(); - checkdist2 = 40.0; - checkdist2 *= checkdist2; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - continue; - - stance = player getstance(); - - if ( stance == "crouch" || stance == "prone" ) - continue; - - zcheck = self.origin[2] - player.origin[2]; - - if ( zcheck < 0.0 || zcheck > 120.0 ) - continue; - - dist2 = distance2dsquared( player.origin, self.origin ); - - if ( dist2 < checkdist2 ) - ret[ret.size] = player; - } - - return ret; + ret = []; + players = getplayers(); + checkdist2 = 40; + checkdist2 *= checkdist2; + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + i++; + continue; + } + stance = player getstance(); + if ( stance == "crouch" || stance == "prone" ) + { + i++; + continue; + } + zcheck = self.origin[ 2 ] - player.origin[ 2 ]; + if ( zcheck < 0 || zcheck > 120 ) + { + i++; + continue; + } + dist2 = distance2dsquared( player.origin, self.origin ); + if ( dist2 < checkdist2 ) + { + ret[ ret.size ] = player; + } + i++; + } + return ret; } -get_fall_anim( spot ) +get_fall_anim( spot ) //checked matches cerberus output { - return level._zombie_fall_anims[self.animname]["fall"]; + return level._zombie_fall_anims[ self.animname ][ "fall" ]; } -zombie_faller_enable_location() +zombie_faller_enable_location() //checked matches cerberus output { - if ( isdefined( self.zombie_faller_location ) ) - { - self.zombie_faller_location.is_enabled = 1; - self.zombie_faller_location = undefined; - } + if ( isDefined( self.zombie_faller_location ) ) + { + self.zombie_faller_location.is_enabled = 1; + self.zombie_faller_location = undefined; + } } -zombie_faller_death_wait( endon_notify ) +zombie_faller_death_wait( endon_notify ) //checked matches cerberus output { - self endon( "falling" ); - - if ( isdefined( endon_notify ) ) - self endon( endon_notify ); - - self waittill( "death" ); - - self zombie_faller_enable_location(); + self endon( "falling" ); + if ( isDefined( endon_notify ) ) + { + self endon( endon_notify ); + } + self waittill( "death" ); + self zombie_faller_enable_location(); } -zombie_fall_death_func() +zombie_fall_death_func() //checked matches cerberus output { - self animmode( "noclip" ); - self.deathanim = "zm_faller_emerge_death"; - return self maps\mp\zombies\_zm_spawner::zombie_death_animscript(); + self animmode( "noclip" ); + self.deathanim = "zm_faller_emerge_death"; + return self maps/mp/zombies/_zm_spawner::zombie_death_animscript(); } -zombie_fall_death( spot ) +zombie_fall_death( spot ) //checked matches cerberus output { - self endon( "fall_anim_finished" ); - - while ( self.health > 1 ) - self waittill( "damage", amount, attacker, dir, p, type ); - - self stopanimscripted(); - spot notify( "stop_zombie_fall_fx" ); + self endon( "fall_anim_finished" ); + while ( self.health > 1 ) + { + self waittill( "damage", amount, attacker, dir, p, type ); + } + self stopanimscripted(); + spot notify( "stop_zombie_fall_fx" ); } -_damage_mod_to_damage_type( type ) +_damage_mod_to_damage_type( type ) //checked changed to match cerberus output { - toks = strtok( type, "_" ); - - if ( toks.size < 2 ) - return type; - - returnstr = toks[1]; - - for ( i = 2; i < toks.size; i++ ) - returnstr += toks[i]; - - returnstr = tolower( returnstr ); - return returnstr; + toks = strtok( type, "_" ); + if ( toks.size < 2 ) + { + return type; + } + returnstr = toks[ 1 ]; + for ( i = 2; i < toks.size; i++ ) + { + returnstr += toks[ i ]; + } + returnstr = tolower( returnstr ); + return returnstr; } -zombie_fall_fx( spot ) +zombie_fall_fx( spot ) //checked matches cerberus output { - spot thread zombie_fall_dust_fx( self ); - spot thread zombie_fall_burst_fx(); - playsoundatposition( "zmb_zombie_spawn", spot.origin ); - self endon( "death" ); - spot endon( "stop_zombie_fall_fx" ); - wait 1; - - if ( self.zombie_move_speed != "sprint" ) - wait 1; + spot thread zombie_fall_dust_fx( self ); + spot thread zombie_fall_burst_fx(); + playsoundatposition( "zmb_zombie_spawn", spot.origin ); + self endon( "death" ); + spot endon( "stop_zombie_fall_fx" ); + wait 1; + if ( self.zombie_move_speed != "sprint" ) + { + wait 1; + } } -zombie_fall_burst_fx() +zombie_fall_burst_fx() //checked matches cerberus output { - self endon( "stop_zombie_fall_fx" ); - self endon( "fall_anim_finished" ); - playfx( level._effect["rise_burst"], self.origin + ( 0, 0, randomintrange( 5, 10 ) ) ); - wait 0.25; - playfx( level._effect["rise_billow"], self.origin + ( randomintrange( -10, 10 ), randomintrange( -10, 10 ), randomintrange( 5, 10 ) ) ); + self endon( "stop_zombie_fall_fx" ); + self endon( "fall_anim_finished" ); + playfx( level._effect[ "rise_burst" ], self.origin + ( 0, 0, randomintrange( 5, 10 ) ) ); + wait 0.25; + playfx( level._effect[ "rise_billow" ], self.origin + ( randomintrange( -10, 10 ), randomintrange( -10, 10 ), randomintrange( 5, 10 ) ) ); } -zombie_fall_dust_fx( zombie ) +zombie_fall_dust_fx( zombie ) //checked does not match cerberus output did not change { - dust_tag = "J_SpineUpper"; - self endon( "stop_zombie_fall_dust_fx" ); - self thread stop_zombie_fall_dust_fx( zombie ); - dust_time = 4.5; - dust_interval = 0.3; - - for ( t = 0; t < dust_time; t += dust_interval ) - { - playfxontag( level._effect["rise_dust"], zombie, dust_tag ); - wait( dust_interval ); - } + dust_tag = "J_SpineUpper"; + self endon( "stop_zombie_fall_dust_fx" ); + self thread stop_zombie_fall_dust_fx( zombie ); + dust_time = 4.5; + dust_interval = 0.3; + t = 0; + while ( t < dust_time ) + { + playfxontag( level._effect[ "rise_dust" ], zombie, dust_tag ); + wait dust_interval; + t += dust_interval; + } } -stop_zombie_fall_dust_fx( zombie ) +stop_zombie_fall_dust_fx( zombie ) //checked matches cerberus output { - zombie waittill( "death" ); - - self notify( "stop_zombie_fall_dust_fx" ); + zombie waittill( "death" ); + self notify( "stop_zombie_fall_dust_fx" ); } -handle_fall_notetracks( note, spot ) +handle_fall_notetracks( note, spot ) //checked changed to match cerberus output { - if ( note == "deathout" ) - self.deathfunction = ::faller_death_ragdoll; - else if ( note == "fire" ) - { - victims = zombie_fall_get_vicitims( spot ); - - for ( i = 0; i < victims.size; i++ ) - { - victims[i] dodamage( self.meleedamage, self.origin, self, self, "none", "MOD_MELEE" ); - self.zombie_faller_should_drop = 1; - } - } + if ( note == "deathout" ) + { + self.deathfunction = ::faller_death_ragdoll; + } + if ( note == "fire" ) + { + victims = zombie_fall_get_vicitims( spot ); + for ( i = 0; i < victims.size; i++) + { + victims[ i ] dodamage( self.meleedamage, self.origin, self, self, "none", "MOD_MELEE" ); + self.zombie_faller_should_drop = 1; + } + } } -faller_death_ragdoll() +faller_death_ragdoll() //checked matches cerberus output { - self startragdoll(); - self launchragdoll( ( 0, 0, -1 ) ); - return self maps\mp\zombies\_zm_spawner::zombie_death_animscript(); + self startragdoll(); + self launchragdoll( ( 0, 0, -1 ) ); + return self maps/mp/zombies/_zm_spawner::zombie_death_animscript(); } -in_player_fov( player ) +in_player_fov( player ) //checked does not match cerberus output did not change { - playerangles = player getplayerangles(); - playerforwardvec = anglestoforward( playerangles ); - playerunitforwardvec = vectornormalize( playerforwardvec ); - banzaipos = self.origin; - playerpos = player getorigin(); - playertobanzaivec = banzaipos - playerpos; - playertobanzaiunitvec = vectornormalize( playertobanzaivec ); - forwarddotbanzai = vectordot( playerunitforwardvec, playertobanzaiunitvec ); - anglefromcenter = acos( forwarddotbanzai ); - playerfov = getdvarfloat( "cg_fov" ); - banzaivsplayerfovbuffer = getdvarfloat( _hash_BCB625CF ); - - if ( banzaivsplayerfovbuffer <= 0 ) - banzaivsplayerfovbuffer = 0.2; - - inplayerfov = anglefromcenter <= playerfov * 0.5 * ( 1 - banzaivsplayerfovbuffer ); - return inplayerfov; + playerangles = player getplayerangles(); + playerforwardvec = anglesToForward( playerangles ); + playerunitforwardvec = vectornormalize( playerforwardvec ); + banzaipos = self.origin; + playerpos = player getorigin(); + playertobanzaivec = banzaipos - playerpos; + playertobanzaiunitvec = vectornormalize( playertobanzaivec ); + forwarddotbanzai = vectordot( playerunitforwardvec, playertobanzaiunitvec ); + anglefromcenter = acos( forwarddotbanzai ); + playerfov = getDvarFloat( "cg_fov" ); + banzaivsplayerfovbuffer = getDvarFloat( "g_banzai_player_fov_buffer" ); + if ( banzaivsplayerfovbuffer <= 0 ) + { + banzaivsplayerfovbuffer = 0.2; + } + inplayerfov = anglefromcenter <= ( playerfov * 0.5 ) * ( 1 - banzaivsplayerfovbuffer ); + return inplayerfov; } -potentially_visible( how_close ) +potentially_visible( how_close ) //checked changed to match cerberus output { - if ( !isdefined( how_close ) ) - how_close = 1000000; - - potentiallyvisible = 0; - players = getplayers(); - - for ( i = 0; i < players.size; i++ ) - { - dist = distancesquared( self.origin, players[i].origin ); - - if ( dist < how_close ) - { - inplayerfov = self in_player_fov( players[i] ); - - if ( inplayerfov ) - { - potentiallyvisible = 1; - break; - } - } - } - - return potentiallyvisible; + if ( !isDefined( how_close ) ) + { + how_close = 1000000; + } + potentiallyvisible = 0; + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + dist = distancesquared( self.origin, players[ i ].origin ); + if ( dist < how_close ) + { + inplayerfov = self in_player_fov( players[ i ] ); + if ( inplayerfov ) + { + potentiallyvisible = 1; + break; + } + } + } + return potentiallyvisible; } -do_zombie_emerge( spot ) +do_zombie_emerge( spot ) //checked changed to match cerberus output { - self endon( "death" ); - self thread setup_deathfunc( ::faller_death_ragdoll ); - self.no_powerups = 1; - self.in_the_ceiling = 1; - anim_org = spot.origin; - anim_ang = spot.angles; - self thread zombie_emerge_fx( spot ); - self thread zombie_faller_death_wait( "risen" ); - - if ( isdefined( level.custom_faller_entrance_logic ) ) - self thread [[ level.custom_faller_entrance_logic ]](); - - self zombie_faller_emerge( spot ); - self.create_eyes = 1; - wait 0.1; - self notify( "risen", spot.script_string ); - self zombie_faller_enable_location(); + self endon( "death" ); + self thread setup_deathfunc( ::faller_death_ragdoll ); + self.no_powerups = 1; + self.in_the_ceiling = 1; + anim_org = spot.origin; + anim_ang = spot.angles; + self thread zombie_emerge_fx( spot ); + self thread zombie_faller_death_wait( "risen" ); + if ( isDefined( level.custom_faller_entrance_logic ) ) + { + self thread [[ level.custom_faller_entrance_logic ]](); + } + self zombie_faller_emerge( spot ); + self.create_eyes = 1; + wait 0.1; + self notify( "risen", spot.script_string ); + self zombie_faller_enable_location(); } -zombie_faller_emerge( spot ) +zombie_faller_emerge( spot ) //checked matches cerberus output { - self endon( "death" ); - - if ( isdefined( self.zombie_faller_location.emerge_bottom ) && self.zombie_faller_location.emerge_bottom ) - self animscripted( self.zombie_faller_location.origin, self.zombie_faller_location.angles, "zombie_riser_elevator_from_floor" ); - else - self animscripted( self.zombie_faller_location.origin, self.zombie_faller_location.angles, "zombie_riser_elevator_from_ceiling" ); - - self maps\mp\animscripts\zm_shared::donotetracks( "rise_anim" ); - self.deathfunction = maps\mp\zombies\_zm_spawner::zombie_death_animscript; - self.in_the_ceiling = 0; - self.no_powerups = 0; + self endon( "death" ); + if ( is_true( self.zombie_faller_location.emerge_bottom ) ) + { + self animscripted( self.zombie_faller_location.origin, self.zombie_faller_location.angles, "zombie_riser_elevator_from_floor" ); + } + else + { + self animscripted( self.zombie_faller_location.origin, self.zombie_faller_location.angles, "zombie_riser_elevator_from_ceiling" ); + } + self maps/mp/animscripts/zm_shared::donotetracks( "rise_anim" ); + self.deathfunction = maps/mp/zombies/_zm_spawner::zombie_death_animscript; + self.in_the_ceiling = 0; + self.no_powerups = 0; } -zombie_emerge_fx( spot ) +zombie_emerge_fx( spot ) //checked matches cerberus output { - spot thread zombie_emerge_dust_fx( self ); - playsoundatposition( "zmb_zombie_spawn", spot.origin ); - self endon( "death" ); - spot endon( "stop_zombie_fall_fx" ); - wait 1; + spot thread zombie_emerge_dust_fx( self ); + playsoundatposition( "zmb_zombie_spawn", spot.origin ); + self endon( "death" ); + spot endon( "stop_zombie_fall_fx" ); + wait 1; } -zombie_emerge_dust_fx( zombie ) +zombie_emerge_dust_fx( zombie ) //checked does not match cerberus output did not change { - dust_tag = "J_SpineUpper"; - self endon( "stop_zombie_fall_dust_fx" ); - self thread stop_zombie_fall_dust_fx( zombie ); - dust_time = 3.5; - dust_interval = 0.5; - - for ( t = 0; t < dust_time; t += dust_interval ) - { - playfxontag( level._effect["rise_dust"], zombie, dust_tag ); - wait( dust_interval ); - } + dust_tag = "J_SpineUpper"; + self endon( "stop_zombie_fall_dust_fx" ); + self thread stop_zombie_fall_dust_fx( zombie ); + dust_time = 3.5; + dust_interval = 0.5; + t = 0; + while ( t < dust_time ) + { + playfxontag( level._effect[ "rise_dust" ], zombie, dust_tag ); + wait dust_interval; + t += dust_interval; + } } -stop_zombie_emerge_dust_fx( zombie ) +stop_zombie_emerge_dust_fx( zombie ) //checked matches cerberus output { - zombie waittill( "death" ); - - self notify( "stop_zombie_fall_dust_fx" ); + zombie waittill( "death" ); + self notify( "stop_zombie_fall_dust_fx" ); } + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio.gsc index 588c2fd..dc8eec6 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio.gsc @@ -1,1408 +1,1405 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_audio_announcer; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\_music; -#include maps\mp\zombies\_zm_spawner; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/_music; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - registerclientfield( "allplayers", "charindex", 1, 3, "int" ); - registerclientfield( "toplayer", "isspeaking", 1, 1, "int" ); -/# - println( "ZM >> Zombiemode Server Scripts Init (_zm_audio.gsc)" ); -#/ - level.audio_get_mod_type = ::get_mod_type; - level zmbvox(); - level init_music_states(); - level maps\mp\zombies\_zm_audio_announcer::init(); - onplayerconnect_callback( ::init_audio_functions ); + registerclientfield( "allplayers", "charindex", 1, 3, "int" ); + registerclientfield( "toplayer", "isspeaking", 1, 1, "int" ); + level.audio_get_mod_type = ::get_mod_type; + level zmbvox(); + level init_music_states(); + level maps/mp/zombies/_zm_audio_announcer::init(); + onplayerconnect_callback( ::init_audio_functions ); } -setexertvoice( exert_id ) +setexertvoice( exert_id ) //checked matches cerberus output { - self.player_exert_id = exert_id; - self setclientfield( "charindex", self.player_exert_id ); + self.player_exert_id = exert_id; + self setclientfield( "charindex", self.player_exert_id ); } -playerexert( exert ) +playerexert( exert ) //checked changed to match cerberus output { - if ( isdefined( self.isspeaking ) && self.isspeaking || isdefined( self.isexerting ) && self.isexerting ) - return; - - id = level.exert_sounds[0][exert]; - - if ( isdefined( self.player_exert_id ) ) - { - if ( isarray( level.exert_sounds[self.player_exert_id][exert] ) ) - id = random( level.exert_sounds[self.player_exert_id][exert] ); - else - id = level.exert_sounds[self.player_exert_id][exert]; - } - - self.isexerting = 1; - self thread exert_timer(); - self playsound( id ); + if ( is_true( self.isspeaking ) || is_true( self.isexerting ) ) + { + return; + } + id = level.exert_sounds[ 0 ][ exert ]; + if ( isDefined( self.player_exert_id ) ) + { + if ( isarray( level.exert_sounds[ self.player_exert_id ][ exert ] ) ) + { + id = random( level.exert_sounds[ self.player_exert_id ][ exert ] ); + } + else + { + id = level.exert_sounds[ self.player_exert_id ][ exert ]; + } + } + self.isexerting = 1; + self thread exert_timer(); + self playsound( id ); } -exert_timer() +exert_timer() //checked matches cerberus output { - self endon( "disconnect" ); - wait( randomfloatrange( 1.5, 3 ) ); - self.isexerting = 0; + self endon( "disconnect" ); + wait randomfloatrange( 1.5, 3 ); + self.isexerting = 0; } -zmbvox() +zmbvox() //checked matches cerberus output { - level.votimer = []; - level.vox = zmbvoxcreate(); - init_standard_response_chances(); - level.vox zmbvoxadd( "player", "general", "crawl_spawn", "crawler_start", "resp_crawler_start" ); - level.vox zmbvoxadd( "player", "general", "hr_resp_crawler_start", "hr_resp_crawler_start", undefined ); - level.vox zmbvoxadd( "player", "general", "riv_resp_crawler_start", "riv_resp_crawler_start", undefined ); - level.vox zmbvoxadd( "player", "general", "ammo_low", "ammo_low", undefined ); - level.vox zmbvoxadd( "player", "general", "ammo_out", "ammo_out", undefined ); - level.vox zmbvoxadd( "player", "general", "door_deny", "nomoney_generic", undefined ); - level.vox zmbvoxadd( "player", "general", "perk_deny", "nomoney_perk", undefined ); - level.vox zmbvoxadd( "player", "general", "shoot_arm", "kill_limb", undefined ); - level.vox zmbvoxadd( "player", "general", "box_move", "box_move", undefined ); - level.vox zmbvoxadd( "player", "general", "no_money", "nomoney", undefined ); - level.vox zmbvoxadd( "player", "general", "oh_shit", "oh_shit", "resp_surrounded" ); - level.vox zmbvoxadd( "player", "general", "hr_resp_surrounded", "hr_resp_surrounded", undefined ); - level.vox zmbvoxadd( "player", "general", "riv_resp_surrounded", "riv_resp_surrounded", undefined ); - level.vox zmbvoxadd( "player", "general", "revive_down", "revive_down", undefined ); - level.vox zmbvoxadd( "player", "general", "revive_up", "revive_up", undefined ); - level.vox zmbvoxadd( "player", "general", "crawl_hit", "crawler_attack", undefined ); - level.vox zmbvoxadd( "player", "general", "sigh", "sigh", undefined ); - level.vox zmbvoxadd( "player", "general", "round_5", "round_5", undefined ); - level.vox zmbvoxadd( "player", "general", "round_20", "round_20", undefined ); - level.vox zmbvoxadd( "player", "general", "round_10", "round_10", undefined ); - level.vox zmbvoxadd( "player", "general", "round_35", "round_35", undefined ); - level.vox zmbvoxadd( "player", "general", "round_50", "round_50", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_armorvest", "perk_jugga", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_quickrevive", "perk_revive", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_fastreload", "perk_speed", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_rof", "perk_doubletap", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_longersprint", "perk_stamine", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_flakjacket", "perk_phdflopper", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_deadshot", "perk_deadshot", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_finalstand", "perk_who", undefined ); - level.vox zmbvoxadd( "player", "perk", "specialty_additionalprimaryweapon", "perk_mulekick", undefined ); - level.vox zmbvoxadd( "player", "powerup", "nuke", "powerup_nuke", undefined ); - level.vox zmbvoxadd( "player", "powerup", "insta_kill", "powerup_insta", undefined ); - level.vox zmbvoxadd( "player", "powerup", "full_ammo", "powerup_ammo", undefined ); - level.vox zmbvoxadd( "player", "powerup", "double_points", "powerup_double", undefined ); - level.vox zmbvoxadd( "player", "powerup", "carpenter", "powerup_carp", undefined ); - level.vox zmbvoxadd( "player", "powerup", "firesale", "powerup_firesale", undefined ); - level.vox zmbvoxadd( "player", "powerup", "minigun", "powerup_minigun", undefined ); - level.vox zmbvoxadd( "player", "kill", "melee", "kill_melee", undefined ); - level.vox zmbvoxadd( "player", "kill", "melee_instakill", "kill_insta", undefined ); - level.vox zmbvoxadd( "player", "kill", "weapon_instakill", "kill_insta", undefined ); - level.vox zmbvoxadd( "player", "kill", "closekill", "kill_close", undefined ); - level.vox zmbvoxadd( "player", "kill", "damage", "kill_damaged", undefined ); - level.vox zmbvoxadd( "player", "kill", "streak", "kill_streak", undefined ); - level.vox zmbvoxadd( "player", "kill", "headshot", "kill_headshot", "resp_kill_headshot" ); - level.vox zmbvoxadd( "player", "kill", "hr_resp_kill_headshot", "hr_resp_kill_headshot", undefined ); - level.vox zmbvoxadd( "player", "kill", "riv_resp_kill_headshot", "riv_resp_kill_headshot", undefined ); - level.vox zmbvoxadd( "player", "kill", "explosive", "kill_explo", undefined ); - level.vox zmbvoxadd( "player", "kill", "flame", "kill_flame", undefined ); - level.vox zmbvoxadd( "player", "kill", "raygun", "kill_ray", undefined ); - level.vox zmbvoxadd( "player", "kill", "bullet", "kill_streak", undefined ); - level.vox zmbvoxadd( "player", "kill", "tesla", "kill_tesla", undefined ); - level.vox zmbvoxadd( "player", "kill", "monkey", "kill_monkey", undefined ); - level.vox zmbvoxadd( "player", "kill", "thundergun", "kill_thunder", undefined ); - level.vox zmbvoxadd( "player", "kill", "freeze", "kill_freeze", undefined ); - level.vox zmbvoxadd( "player", "kill", "crawler", "crawler_kill", undefined ); - level.vox zmbvoxadd( "player", "kill", "hellhound", "kill_hellhound", undefined ); - level.vox zmbvoxadd( "player", "kill", "quad", "kill_quad", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "pistol", "wpck_crappy", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "smg", "wpck_smg", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "dualwield", "wpck_dual", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "shotgun", "wpck_shotgun", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "rifle", "wpck_sniper", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "burstrifle", "wpck_mg", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "assault", "wpck_mg", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "sniper", "wpck_sniper", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "mg", "wpck_mg", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "launcher", "wpck_launcher", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "grenade", "wpck_grenade", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "bowie", "wpck_bowie", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "raygun", "wpck_raygun", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "monkey", "wpck_monkey", "resp_wpck_monkey" ); - level.vox zmbvoxadd( "player", "weapon_pickup", "hr_resp_wpck_monkey", "hr_resp_wpck_monkey", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "riv_resp_wpck_monkey", "riv_resp_wpck_monkey", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "crossbow", "wpck_launcher", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "upgrade", "wpck_upgrade", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "favorite", "wpck_favorite", undefined ); - level.vox zmbvoxadd( "player", "weapon_pickup", "favorite_upgrade", "wpck_favorite_upgrade", undefined ); - level.vox zmbvoxadd( "player", "player_death", "player_death", "evt_player_final_hit", undefined ); - level.zmb_vox = []; - level.zmb_vox["prefix"] = "zmb_vocals_"; - level.zmb_vox["zombie"] = []; - level.zmb_vox["zombie"]["ambient"] = "zombie_ambience"; - level.zmb_vox["zombie"]["sprint"] = "zombie_sprint"; - level.zmb_vox["zombie"]["attack"] = "zombie_attack"; - level.zmb_vox["zombie"]["teardown"] = "zombie_teardown"; - level.zmb_vox["zombie"]["taunt"] = "zombie_taunt"; - level.zmb_vox["zombie"]["behind"] = "zombie_behind"; - level.zmb_vox["zombie"]["death"] = "zombie_death"; - level.zmb_vox["zombie"]["crawler"] = "zombie_crawler"; - level.zmb_vox["zombie"]["electrocute"] = "zombie_electrocute"; - level.zmb_vox["quad_zombie"] = []; - level.zmb_vox["quad_zombie"]["ambient"] = "quad_ambience"; - level.zmb_vox["quad_zombie"]["sprint"] = "quad_sprint"; - level.zmb_vox["quad_zombie"]["attack"] = "quad_attack"; - level.zmb_vox["quad_zombie"]["behind"] = "quad_behind"; - level.zmb_vox["quad_zombie"]["death"] = "quad_death"; - level.zmb_vox["thief_zombie"] = []; - level.zmb_vox["thief_zombie"]["ambient"] = "thief_ambience"; - level.zmb_vox["thief_zombie"]["sprint"] = "thief_sprint"; - level.zmb_vox["thief_zombie"]["steal"] = "thief_steal"; - level.zmb_vox["thief_zombie"]["death"] = "thief_death"; - level.zmb_vox["thief_zombie"]["anger"] = "thief_anger"; - level.zmb_vox["boss_zombie"] = []; - level.zmb_vox["boss_zombie"]["ambient"] = "boss_ambience"; - level.zmb_vox["boss_zombie"]["sprint"] = "boss_sprint"; - level.zmb_vox["boss_zombie"]["attack"] = "boss_attack"; - level.zmb_vox["boss_zombie"]["behind"] = "boss_behind"; - level.zmb_vox["boss_zombie"]["death"] = "boss_death"; - level.zmb_vox["leaper_zombie"] = []; - level.zmb_vox["leaper_zombie"]["ambient"] = "leaper_ambience"; - level.zmb_vox["leaper_zombie"]["sprint"] = "leaper_ambience"; - level.zmb_vox["leaper_zombie"]["attack"] = "leaper_attack"; - level.zmb_vox["leaper_zombie"]["behind"] = "leaper_close"; - level.zmb_vox["leaper_zombie"]["death"] = "leaper_death"; - level.zmb_vox["monkey_zombie"] = []; - level.zmb_vox["monkey_zombie"]["ambient"] = "monkey_ambience"; - level.zmb_vox["monkey_zombie"]["sprint"] = "monkey_sprint"; - level.zmb_vox["monkey_zombie"]["attack"] = "monkey_attack"; - level.zmb_vox["monkey_zombie"]["behind"] = "monkey_behind"; - level.zmb_vox["monkey_zombie"]["death"] = "monkey_death"; - level.zmb_vox["capzomb"] = []; - level.zmb_vox["capzomb"]["ambient"] = "capzomb_ambience"; - level.zmb_vox["capzomb"]["sprint"] = "capzomb_sprint"; - level.zmb_vox["capzomb"]["attack"] = "capzomb_attack"; - level.zmb_vox["capzomb"]["teardown"] = "capzomb_ambience"; - level.zmb_vox["capzomb"]["taunt"] = "capzomb_ambience"; - level.zmb_vox["capzomb"]["behind"] = "capzomb_behind"; - level.zmb_vox["capzomb"]["death"] = "capzomb_death"; - level.zmb_vox["capzomb"]["crawler"] = "capzomb_crawler"; - level.zmb_vox["capzomb"]["electrocute"] = "zombie_electrocute"; - - if ( isdefined( level._zmbvoxlevelspecific ) ) - level thread [[ level._zmbvoxlevelspecific ]](); - - if ( isdefined( level._zmbvoxgametypespecific ) ) - level thread [[ level._zmbvoxgametypespecific ]](); - - announcer_ent = spawn( "script_origin", ( 0, 0, 0 ) ); - level.vox zmbvoxinitspeaker( "announcer", "vox_zmba_", announcer_ent ); - level.exert_sounds[0]["burp"] = "evt_belch"; - level.exert_sounds[0]["hitmed"] = "null"; - level.exert_sounds[0]["hitlrg"] = "null"; - - if ( isdefined( level.setupcustomcharacterexerts ) ) - [[ level.setupcustomcharacterexerts ]](); + level.votimer = []; + level.vox = zmbvoxcreate(); + init_standard_response_chances(); + level.vox zmbvoxadd( "player", "general", "crawl_spawn", "crawler_start", "resp_crawler_start" ); + level.vox zmbvoxadd( "player", "general", "hr_resp_crawler_start", "hr_resp_crawler_start", undefined ); + level.vox zmbvoxadd( "player", "general", "riv_resp_crawler_start", "riv_resp_crawler_start", undefined ); + level.vox zmbvoxadd( "player", "general", "ammo_low", "ammo_low", undefined ); + level.vox zmbvoxadd( "player", "general", "ammo_out", "ammo_out", undefined ); + level.vox zmbvoxadd( "player", "general", "door_deny", "nomoney_generic", undefined ); + level.vox zmbvoxadd( "player", "general", "perk_deny", "nomoney_perk", undefined ); + level.vox zmbvoxadd( "player", "general", "shoot_arm", "kill_limb", undefined ); + level.vox zmbvoxadd( "player", "general", "box_move", "box_move", undefined ); + level.vox zmbvoxadd( "player", "general", "no_money", "nomoney", undefined ); + level.vox zmbvoxadd( "player", "general", "oh_shit", "oh_shit", "resp_surrounded" ); + level.vox zmbvoxadd( "player", "general", "hr_resp_surrounded", "hr_resp_surrounded", undefined ); + level.vox zmbvoxadd( "player", "general", "riv_resp_surrounded", "riv_resp_surrounded", undefined ); + level.vox zmbvoxadd( "player", "general", "revive_down", "revive_down", undefined ); + level.vox zmbvoxadd( "player", "general", "revive_up", "revive_up", undefined ); + level.vox zmbvoxadd( "player", "general", "crawl_hit", "crawler_attack", undefined ); + level.vox zmbvoxadd( "player", "general", "sigh", "sigh", undefined ); + level.vox zmbvoxadd( "player", "general", "round_5", "round_5", undefined ); + level.vox zmbvoxadd( "player", "general", "round_20", "round_20", undefined ); + level.vox zmbvoxadd( "player", "general", "round_10", "round_10", undefined ); + level.vox zmbvoxadd( "player", "general", "round_35", "round_35", undefined ); + level.vox zmbvoxadd( "player", "general", "round_50", "round_50", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_armorvest", "perk_jugga", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_quickrevive", "perk_revive", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_fastreload", "perk_speed", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_rof", "perk_doubletap", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_longersprint", "perk_stamine", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_flakjacket", "perk_phdflopper", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_deadshot", "perk_deadshot", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_finalstand", "perk_who", undefined ); + level.vox zmbvoxadd( "player", "perk", "specialty_additionalprimaryweapon", "perk_mulekick", undefined ); + level.vox zmbvoxadd( "player", "powerup", "nuke", "powerup_nuke", undefined ); + level.vox zmbvoxadd( "player", "powerup", "insta_kill", "powerup_insta", undefined ); + level.vox zmbvoxadd( "player", "powerup", "full_ammo", "powerup_ammo", undefined ); + level.vox zmbvoxadd( "player", "powerup", "double_points", "powerup_double", undefined ); + level.vox zmbvoxadd( "player", "powerup", "carpenter", "powerup_carp", undefined ); + level.vox zmbvoxadd( "player", "powerup", "firesale", "powerup_firesale", undefined ); + level.vox zmbvoxadd( "player", "powerup", "minigun", "powerup_minigun", undefined ); + level.vox zmbvoxadd( "player", "kill", "melee", "kill_melee", undefined ); + level.vox zmbvoxadd( "player", "kill", "melee_instakill", "kill_insta", undefined ); + level.vox zmbvoxadd( "player", "kill", "weapon_instakill", "kill_insta", undefined ); + level.vox zmbvoxadd( "player", "kill", "closekill", "kill_close", undefined ); + level.vox zmbvoxadd( "player", "kill", "damage", "kill_damaged", undefined ); + level.vox zmbvoxadd( "player", "kill", "streak", "kill_streak", undefined ); + level.vox zmbvoxadd( "player", "kill", "headshot", "kill_headshot", "resp_kill_headshot" ); + level.vox zmbvoxadd( "player", "kill", "hr_resp_kill_headshot", "hr_resp_kill_headshot", undefined ); + level.vox zmbvoxadd( "player", "kill", "riv_resp_kill_headshot", "riv_resp_kill_headshot", undefined ); + level.vox zmbvoxadd( "player", "kill", "explosive", "kill_explo", undefined ); + level.vox zmbvoxadd( "player", "kill", "flame", "kill_flame", undefined ); + level.vox zmbvoxadd( "player", "kill", "raygun", "kill_ray", undefined ); + level.vox zmbvoxadd( "player", "kill", "bullet", "kill_streak", undefined ); + level.vox zmbvoxadd( "player", "kill", "tesla", "kill_tesla", undefined ); + level.vox zmbvoxadd( "player", "kill", "monkey", "kill_monkey", undefined ); + level.vox zmbvoxadd( "player", "kill", "thundergun", "kill_thunder", undefined ); + level.vox zmbvoxadd( "player", "kill", "freeze", "kill_freeze", undefined ); + level.vox zmbvoxadd( "player", "kill", "crawler", "crawler_kill", undefined ); + level.vox zmbvoxadd( "player", "kill", "hellhound", "kill_hellhound", undefined ); + level.vox zmbvoxadd( "player", "kill", "quad", "kill_quad", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "pistol", "wpck_crappy", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "smg", "wpck_smg", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "dualwield", "wpck_dual", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "shotgun", "wpck_shotgun", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "rifle", "wpck_sniper", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "burstrifle", "wpck_mg", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "assault", "wpck_mg", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "sniper", "wpck_sniper", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "mg", "wpck_mg", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "launcher", "wpck_launcher", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "grenade", "wpck_grenade", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "bowie", "wpck_bowie", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "raygun", "wpck_raygun", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "monkey", "wpck_monkey", "resp_wpck_monkey" ); + level.vox zmbvoxadd( "player", "weapon_pickup", "hr_resp_wpck_monkey", "hr_resp_wpck_monkey", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "riv_resp_wpck_monkey", "riv_resp_wpck_monkey", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "crossbow", "wpck_launcher", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "upgrade", "wpck_upgrade", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "favorite", "wpck_favorite", undefined ); + level.vox zmbvoxadd( "player", "weapon_pickup", "favorite_upgrade", "wpck_favorite_upgrade", undefined ); + level.vox zmbvoxadd( "player", "player_death", "player_death", "evt_player_final_hit", undefined ); + level.zmb_vox = []; + level.zmb_vox[ "prefix" ] = "zmb_vocals_"; + level.zmb_vox[ "zombie" ] = []; + level.zmb_vox[ "zombie" ][ "ambient" ] = "zombie_ambience"; + level.zmb_vox[ "zombie" ][ "sprint" ] = "zombie_sprint"; + level.zmb_vox[ "zombie" ][ "attack" ] = "zombie_attack"; + level.zmb_vox[ "zombie" ][ "teardown" ] = "zombie_teardown"; + level.zmb_vox[ "zombie" ][ "taunt" ] = "zombie_taunt"; + level.zmb_vox[ "zombie" ][ "behind" ] = "zombie_behind"; + level.zmb_vox[ "zombie" ][ "death" ] = "zombie_death"; + level.zmb_vox[ "zombie" ][ "crawler" ] = "zombie_crawler"; + level.zmb_vox[ "zombie" ][ "electrocute" ] = "zombie_electrocute"; + level.zmb_vox[ "quad_zombie" ] = []; + level.zmb_vox[ "quad_zombie" ][ "ambient" ] = "quad_ambience"; + level.zmb_vox[ "quad_zombie" ][ "sprint" ] = "quad_sprint"; + level.zmb_vox[ "quad_zombie" ][ "attack" ] = "quad_attack"; + level.zmb_vox[ "quad_zombie" ][ "behind" ] = "quad_behind"; + level.zmb_vox[ "quad_zombie" ][ "death" ] = "quad_death"; + level.zmb_vox[ "thief_zombie" ] = []; + level.zmb_vox[ "thief_zombie" ][ "ambient" ] = "thief_ambience"; + level.zmb_vox[ "thief_zombie" ][ "sprint" ] = "thief_sprint"; + level.zmb_vox[ "thief_zombie" ][ "steal" ] = "thief_steal"; + level.zmb_vox[ "thief_zombie" ][ "death" ] = "thief_death"; + level.zmb_vox[ "thief_zombie" ][ "anger" ] = "thief_anger"; + level.zmb_vox[ "boss_zombie" ] = []; + level.zmb_vox[ "boss_zombie" ][ "ambient" ] = "boss_ambience"; + level.zmb_vox[ "boss_zombie" ][ "sprint" ] = "boss_sprint"; + level.zmb_vox[ "boss_zombie" ][ "attack" ] = "boss_attack"; + level.zmb_vox[ "boss_zombie" ][ "behind" ] = "boss_behind"; + level.zmb_vox[ "boss_zombie" ][ "death" ] = "boss_death"; + level.zmb_vox[ "leaper_zombie" ] = []; + level.zmb_vox[ "leaper_zombie" ][ "ambient" ] = "leaper_ambience"; + level.zmb_vox[ "leaper_zombie" ][ "sprint" ] = "leaper_ambience"; + level.zmb_vox[ "leaper_zombie" ][ "attack" ] = "leaper_attack"; + level.zmb_vox[ "leaper_zombie" ][ "behind" ] = "leaper_close"; + level.zmb_vox[ "leaper_zombie" ][ "death" ] = "leaper_death"; + level.zmb_vox[ "monkey_zombie" ] = []; + level.zmb_vox[ "monkey_zombie" ][ "ambient" ] = "monkey_ambience"; + level.zmb_vox[ "monkey_zombie" ][ "sprint" ] = "monkey_sprint"; + level.zmb_vox[ "monkey_zombie" ][ "attack" ] = "monkey_attack"; + level.zmb_vox[ "monkey_zombie" ][ "behind" ] = "monkey_behind"; + level.zmb_vox[ "monkey_zombie" ][ "death" ] = "monkey_death"; + level.zmb_vox[ "capzomb" ] = []; + level.zmb_vox[ "capzomb" ][ "ambient" ] = "capzomb_ambience"; + level.zmb_vox[ "capzomb" ][ "sprint" ] = "capzomb_sprint"; + level.zmb_vox[ "capzomb" ][ "attack" ] = "capzomb_attack"; + level.zmb_vox[ "capzomb" ][ "teardown" ] = "capzomb_ambience"; + level.zmb_vox[ "capzomb" ][ "taunt" ] = "capzomb_ambience"; + level.zmb_vox[ "capzomb" ][ "behind" ] = "capzomb_behind"; + level.zmb_vox[ "capzomb" ][ "death" ] = "capzomb_death"; + level.zmb_vox[ "capzomb" ][ "crawler" ] = "capzomb_crawler"; + level.zmb_vox[ "capzomb" ][ "electrocute" ] = "zombie_electrocute"; + if ( isDefined( level._zmbvoxlevelspecific ) ) + { + level thread [[ level._zmbvoxlevelspecific ]](); + } + if ( isDefined( level._zmbvoxgametypespecific ) ) + { + level thread [[ level._zmbvoxgametypespecific ]](); + } + announcer_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + level.vox zmbvoxinitspeaker( "announcer", "vox_zmba_", announcer_ent ); + level.exert_sounds[ 0 ][ "burp" ] = "evt_belch"; + level.exert_sounds[ 0 ][ "hitmed" ] = "null"; + level.exert_sounds[ 0 ][ "hitlrg" ] = "null"; + if ( isDefined( level.setupcustomcharacterexerts ) ) + { + [[ level.setupcustomcharacterexerts ]](); + } } -init_standard_response_chances() +init_standard_response_chances() //checked matches cerberus output { - level.response_chances = []; - add_vox_response_chance( "sickle", 40 ); - add_vox_response_chance( "melee", 40 ); - add_vox_response_chance( "melee_instakill", 99 ); - add_vox_response_chance( "weapon_instakill", 10 ); - add_vox_response_chance( "explosive", 60 ); - add_vox_response_chance( "monkey", 60 ); - add_vox_response_chance( "flame", 60 ); - add_vox_response_chance( "raygun", 75 ); - add_vox_response_chance( "headshot", 15 ); - add_vox_response_chance( "crawler", 30 ); - add_vox_response_chance( "quad", 30 ); - add_vox_response_chance( "astro", 99 ); - add_vox_response_chance( "closekill", 15 ); - add_vox_response_chance( "bullet", 1 ); - add_vox_response_chance( "claymore", 99 ); - add_vox_response_chance( "dolls", 99 ); - add_vox_response_chance( "default", 1 ); + level.response_chances = []; + add_vox_response_chance( "sickle", 40 ); + add_vox_response_chance( "melee", 40 ); + add_vox_response_chance( "melee_instakill", 99 ); + add_vox_response_chance( "weapon_instakill", 10 ); + add_vox_response_chance( "explosive", 60 ); + add_vox_response_chance( "monkey", 60 ); + add_vox_response_chance( "flame", 60 ); + add_vox_response_chance( "raygun", 75 ); + add_vox_response_chance( "headshot", 15 ); + add_vox_response_chance( "crawler", 30 ); + add_vox_response_chance( "quad", 30 ); + add_vox_response_chance( "astro", 99 ); + add_vox_response_chance( "closekill", 15 ); + add_vox_response_chance( "bullet", 1 ); + add_vox_response_chance( "claymore", 99 ); + add_vox_response_chance( "dolls", 99 ); + add_vox_response_chance( "default", 1 ); } -init_audio_functions() +init_audio_functions() //checked matches cerberus output { - self thread zombie_behind_vox(); - self thread player_killstreak_timer(); - - if ( isdefined( level._custom_zombie_oh_shit_vox_func ) ) - self thread [[ level._custom_zombie_oh_shit_vox_func ]](); - else - self thread oh_shit_vox(); + self thread zombie_behind_vox(); + self thread player_killstreak_timer(); + if ( isDefined( level._custom_zombie_oh_shit_vox_func ) ) + { + self thread [[ level._custom_zombie_oh_shit_vox_func ]](); + } + else + { + self thread oh_shit_vox(); + } } -zombie_behind_vox() +zombie_behind_vox() //checked changed to match cerberus output one change made at one discretion { - self endon( "death_or_disconnect" ); - - if ( !isdefined( level._zbv_vox_last_update_time ) ) - { - level._zbv_vox_last_update_time = 0; - level._audio_zbv_shared_ent_list = get_round_enemy_array(); - } - - while ( true ) - { - wait 1; - t = gettime(); - - if ( t > level._zbv_vox_last_update_time + 1000 ) - { - level._zbv_vox_last_update_time = t; - level._audio_zbv_shared_ent_list = get_round_enemy_array(); - } - - zombs = level._audio_zbv_shared_ent_list; - played_sound = 0; - - for ( i = 0; i < zombs.size; i++ ) - { - if ( !isdefined( zombs[i] ) ) - continue; - - if ( zombs[i].isdog ) - continue; - - dist = 200; - z_dist = 50; - alias = level.vox_behind_zombie; - - if ( isdefined( zombs[i].zombie_move_speed ) ) - { - switch ( zombs[i].zombie_move_speed ) - { - case "walk": - dist = 200; - break; - case "run": - dist = 250; - break; - case "sprint": - dist = 275; - break; - } - } - - if ( distancesquared( zombs[i].origin, self.origin ) < dist * dist ) - { - yaw = self maps\mp\zombies\_zm_utility::getyawtospot( zombs[i].origin ); - z_diff = self.origin[2] - zombs[i].origin[2]; - - if ( ( yaw < -95 || yaw > 95 ) && abs( z_diff ) < 50 ) - { - zombs[i] thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "behind", zombs[i].animname ); - played_sound = 1; - break; - } - } - } - - if ( played_sound ) - wait 5; - } + self endon( "death_or_disconnect" ); + if ( !isDefined( level._zbv_vox_last_update_time ) ) + { + level._zbv_vox_last_update_time = 0; + level._audio_zbv_shared_ent_list = get_round_enemy_array(); + } + while ( 1 ) + { + wait 1; + t = getTime(); + if ( t > ( level._zbv_vox_last_update_time + 1000 ) ) + { + level._zbv_vox_last_update_time = t; + level._audio_zbv_shared_ent_list = get_round_enemy_array(); + } + zombs = level._audio_zbv_shared_ent_list; + played_sound = 0; + for ( i = 0; i < zombs.size; i++ ) + { + if ( !isdefined( zombs[ i ] ) ) + { + continue; + } + if ( zombs[ i ].isdog ) + { + continue; + } + dist = 200; + z_dist = 50; + alias = level.vox_behind_zombie; + if ( isdefined( zombs[ i ].zombie_move_speed ) ) + { + switch ( zombs[ i ].zombie_move_speed ) + { + case "walk": + dist = 200; + break; + case "run": + dist = 250; + break; + case "sprint": + dist = 275; + break; + } + } + if ( distancesquared( zombs[ i ].origin, self.origin ) < dist * dist ) + { + yaw = self maps/mp/zombies/_zm_utility::getyawtospot( zombs[ i ].origin ); + z_diff = self.origin[ 2 ] - zombs[ i ].origin[ 2 ]; + //if ( yaw < -95 || yaw > 95 && Abs( z_diff ) < 50 ) //original + if ( ( yaw < -95 || yaw > 95 ) && Abs( z_diff ) < 50 ) + { + zombs[ i ] thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "behind", zombs[ i ].animname ); + played_sound = 1; + break; + } + } + } + if ( played_sound ) + { + wait 5; + } + } } -attack_vox_network_choke() +attack_vox_network_choke() //checked matches cerberus output { - while ( true ) - { - level._num_attack_vox = 0; - wait_network_frame(); - } + while ( 1 ) + { + level._num_attack_vox = 0; + wait_network_frame(); + } } -do_zombies_playvocals( alias_type, zombie_type ) +do_zombies_playvocals( alias_type, zombie_type ) //checked changed to match cerberus output { -/# - if ( getdvarint( _hash_6C610250 ) > 0 ) - return; -#/ - self endon( "death" ); - - if ( !isdefined( zombie_type ) ) - zombie_type = "zombie"; - - if ( isdefined( self.shrinked ) && self.shrinked ) - return; - - if ( isdefined( self.is_inert ) && self.is_inert ) - return; - - if ( !isdefined( self.talking ) ) - self.talking = 0; - - if ( isdefined( level.script ) && level.script == "zm_tomb" ) - { - if ( isdefined( self.script_int ) && self.script_int >= 2 ) - { - zombie_type = "capzomb"; - self.zmb_vocals_attack = "zmb_vocals_capzomb_attack"; - } - else if ( isdefined( self.sndname ) ) - zombie_type = self.sndname; - } - - if ( !isdefined( level.zmb_vox[zombie_type] ) ) - { -/# - println( "ZM >> AUDIO - ZOMBIE TYPE: " + zombie_type + " has NO aliases set up for it." ); -#/ - return; - } - - if ( !isdefined( level.zmb_vox[zombie_type][alias_type] ) ) - { -/# - println( "ZM >> AUDIO - ZOMBIE TYPE: " + zombie_type + " has NO aliases set up for ALIAS_TYPE: " + alias_type ); -#/ - return; - } - - switch ( alias_type ) - { - case "teardown": - case "sprint": - case "electrocute": - case "death": - case "crawler": - case "behind": - case "attack": - case "ambient": - if ( !sndisnetworksafe() ) - return; - - break; - } - - alias = level.zmb_vox["prefix"] + level.zmb_vox[zombie_type][alias_type]; - - if ( alias_type == "attack" || alias_type == "behind" || alias_type == "death" || alias_type == "anger" || alias_type == "steal" || alias_type == "taunt" || alias_type == "teardown" ) - { - if ( isdefined( level._custom_zombie_audio_func ) ) - self [[ level._custom_zombie_audio_func ]]( alias, alias_type ); - else - self playsound( alias ); - } - else if ( !self.talking ) - { - self.talking = 1; - - if ( self is_last_zombie() ) - alias += "_loud"; - - self playsoundwithnotify( alias, "sounddone" ); - - self waittill( "sounddone" ); - - self.talking = 0; - } + self endon( "death" ); + if ( !isDefined( zombie_type ) ) + { + zombie_type = "zombie"; + } + if ( is_true( self.shrinked ) ) + { + return; + } + if ( is_true( self.is_inert ) ) + { + return; + } + if ( !isDefined( self.talking ) ) + { + self.talking = 0; + } + if ( isDefined( level.script ) && level.script == "zm_tomb" ) + { + if ( isDefined( self.script_int ) && self.script_int >= 2 ) + { + zombie_type = "capzomb"; + self.zmb_vocals_attack = "zmb_vocals_capzomb_attack"; + } + else if ( isDefined( self.sndname ) ) + { + zombie_type = self.sndname; + } + } + if ( !isDefined( level.zmb_vox[ zombie_type ] ) ) + { + return; + } + if ( !isDefined( level.zmb_vox[ zombie_type ][ alias_type ] ) ) + { + return; + } + switch( alias_type ) + { + case "ambient": + case "attack": + case "behind": + case "crawler": + case "death": + case "electrocute": + case "sprint": + case "teardown": + if ( !sndisnetworksafe() ) + { + return; + } + break; + } + alias = level.zmb_vox[ "prefix" ] + level.zmb_vox[ zombie_type ][ alias_type ]; + if ( alias_type != "attack" && alias_type != "behind" && alias_type != "death" && alias_type != "anger" && alias_type != "steal" || alias_type == "taunt" && alias_type == "teardown" ) + { + if ( isDefined( level._custom_zombie_audio_func ) ) + { + self [[ level._custom_zombie_audio_func ]]( alias, alias_type ); + } + else + { + self playsound( alias ); + } + } + else if ( !self.talking ) + { + self.talking = 1; + if ( self is_last_zombie() ) + { + alias += "_loud"; + } + self playsoundwithnotify( alias, "sounddone" ); + self waittill( "sounddone" ); + self.talking = 0; + } } -sndisnetworksafe() +sndisnetworksafe() //checked matches cerberus output { - if ( !isdefined( level._num_attack_vox ) ) - level thread attack_vox_network_choke(); - - if ( level._num_attack_vox > 4 ) - return false; - - level._num_attack_vox++; - return true; + if ( !isDefined( level._num_attack_vox ) ) + { + level thread attack_vox_network_choke(); + } + if ( level._num_attack_vox > 4 ) + { + return 0; + } + level._num_attack_vox++; + return 1; } -is_last_zombie() +is_last_zombie() //checked matches cerberus output { - if ( get_current_zombie_count() <= 1 ) - return true; - - return false; + if ( get_current_zombie_count() <= 1 ) + { + return 1; + } + return 0; } -oh_shit_vox() +oh_shit_vox() //checked changed to match cerberus output { - self endon( "death_or_disconnect" ); - - while ( true ) - { - wait 1; - players = get_players(); - zombs = get_round_enemy_array(); - - if ( players.size > 1 ) - { - close_zombs = 0; - - for ( i = 0; i < zombs.size; i++ ) - { - if ( isdefined( zombs[i].favoriteenemy ) && zombs[i].favoriteenemy == self || !isdefined( zombs[i].favoriteenemy ) ) - { - if ( distancesquared( zombs[i].origin, self.origin ) < 62500 ) - close_zombs++; - } - } - - if ( close_zombs > 4 ) - { - if ( randomint( 100 ) > 75 && !( isdefined( self.isonbus ) && self.isonbus ) ) - { - self create_and_play_dialog( "general", "oh_shit" ); - wait 4; - } - } - } - } + self endon( "death_or_disconnect" ); + while ( 1 ) + { + wait 1; + players = get_players(); + zombs = get_round_enemy_array(); + if ( players.size > 1 ) + { + close_zombs = 0; + for ( i = 0; i < zombs.size; i++ ) + { + if ( isDefined( zombs[ i ].favoriteenemy ) || zombs[ i ].favoriteenemy == self && !isDefined( zombs[ i ].favoriteenemy ) ) + { + if ( distancesquared( zombs[ i ].origin, self.origin ) < 62500 ) + { + close_zombs++; + } + } + } + if ( close_zombs > 4 ) + { + if ( randomint( 100 ) > 75 && !is_true( self.isonbus ) ) + { + self create_and_play_dialog( "general", "oh_shit" ); + wait 4; + } + } + } + } } -create_and_play_dialog( category, type, response, force_variant, override ) +create_and_play_dialog( category, type, response, force_variant, override ) //checked changed to match cerberus output { - waittime = 0.25; - - if ( !isdefined( self.zmbvoxid ) ) - { -/# - if ( getdvarint( _hash_AEB127D ) > 0 ) - iprintln( "DIALOG DEBUGGER: No zmbVoxID setup on this character. Run zmbVoxInitSpeaker on this character in order to play vox" ); -#/ - return; - } - - if ( isdefined( self.dontspeak ) && self.dontspeak ) - return; -/# - if ( getdvarint( _hash_AEB127D ) > 0 ) - self thread dialog_debugger( category, type ); -#/ - isresponse = 0; - alias_suffix = undefined; - index = undefined; - prefix = undefined; - - if ( !isdefined( level.vox.speaker[self.zmbvoxid].alias[category][type] ) ) - return; - - prefix = level.vox.speaker[self.zmbvoxid].prefix; - alias_suffix = level.vox.speaker[self.zmbvoxid].alias[category][type]; - - if ( self is_player() ) - { - if ( self.sessionstate != "playing" ) - return; - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() && ( type != "revive_down" || type != "revive_up" ) ) - return; - - index = maps\mp\zombies\_zm_weapons::get_player_index( self ); - prefix = prefix + index + "_"; - } - - if ( isdefined( response ) ) - { - if ( isdefined( level.vox.speaker[self.zmbvoxid].response[category][type] ) ) - alias_suffix = response + level.vox.speaker[self.zmbvoxid].response[category][type]; - - isresponse = 1; - } - - sound_to_play = self zmbvoxgetlinevariant( prefix, alias_suffix, force_variant, override ); - - if ( isdefined( sound_to_play ) ) - { - if ( isdefined( level._audio_custom_player_playvox ) ) - self thread [[ level._audio_custom_player_playvox ]]( prefix, index, sound_to_play, waittime, category, type, override ); - else - self thread do_player_or_npc_playvox( prefix, index, sound_to_play, waittime, category, type, override, isresponse ); - } - else - { -/# - if ( getdvarint( _hash_AEB127D ) > 0 ) - iprintln( "DIALOG DEBUGGER: SOUND_TO_PLAY is undefined" ); -#/ - } + waittime = 0.25; + if ( !isDefined( self.zmbvoxid ) ) + { + return; + } + if ( is_true( self.dontspeak ) ) + { + return; + } + isresponse = 0; + alias_suffix = undefined; + index = undefined; + prefix = undefined; + if ( !isDefined( level.vox.speaker[ self.zmbvoxid ].alias[ category ][ type ] ) ) + { + return; + } + prefix = level.vox.speaker[ self.zmbvoxid ].prefix; + alias_suffix = level.vox.speaker[ self.zmbvoxid ].alias[ category ][ type ]; + if ( self is_player() ) + { + if ( self.sessionstate != "playing" ) + { + return; + } + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() && type != "revive_down" || self maps/mp/zombies/_zm_laststand::player_is_in_laststand() && type != "revive_up" ) + { + return; + } + index = maps/mp/zombies/_zm_weapons::get_player_index( self ); + prefix = prefix + index + "_"; + } + if ( isDefined( response ) ) + { + if ( isDefined( level.vox.speaker[ self.zmbvoxid ].response[ category ][ type ] ) ) + { + alias_suffix = response + level.vox.speaker[ self.zmbvoxid ].response[ category ][ type ]; + } + isresponse = 1; + } + sound_to_play = self zmbvoxgetlinevariant( prefix, alias_suffix, force_variant, override ); + if ( isDefined( sound_to_play ) ) + { + if ( isDefined( level._audio_custom_player_playvox ) ) + { + self thread [[ level._audio_custom_player_playvox ]]( prefix, index, sound_to_play, waittime, category, type, override ); + } + else + { + self thread do_player_or_npc_playvox( prefix, index, sound_to_play, waittime, category, type, override, isresponse ); + } + } } -do_player_or_npc_playvox( prefix, index, sound_to_play, waittime, category, type, override, isresponse ) +do_player_or_npc_playvox( prefix, index, sound_to_play, waittime, category, type, override, isresponse ) //checked partially changed to match cerberus output { - self endon( "death_or_disconnect" ); - - if ( isdefined( level.skit_vox_override ) && level.skit_vox_override && ( isdefined( override ) && !override ) ) - return; - - if ( !isdefined( self.isspeaking ) ) - self.isspeaking = 0; - - if ( isdefined( self.isspeaking ) && self.isspeaking ) - { -/# - println( "DIALOG DEBUGGER: Can't play (" + ( prefix + sound_to_play ) + ") because we are speaking already." ); -#/ - return; - } - - if ( !self arenearbyspeakersactive() || isdefined( self.ignorenearbyspkrs ) && self.ignorenearbyspkrs ) - { - self.speakingline = sound_to_play; - self.isspeaking = 1; - - if ( isplayer( self ) ) - self setclientfieldtoplayer( "isspeaking", 1 ); - - self notify( "speaking", type ); - playbacktime = soundgetplaybacktime( prefix + sound_to_play ); - - if ( !isdefined( playbacktime ) ) - return; - - if ( playbacktime >= 0 ) - playbacktime *= 0.001; - else - playbacktime = 1; - - self playsoundontag( prefix + sound_to_play, "J_Head" ); - wait( playbacktime ); - - if ( isplayer( self ) && !( isdefined( isresponse ) && isresponse ) && isdefined( self.last_vo_played_time ) ) - { - if ( gettime() < self.last_vo_played_time + 5000 ) - waittime = 15; - } - - wait( waittime ); - self notify( "done_speaking" ); - self.isspeaking = 0; - - if ( isplayer( self ) ) - self setclientfieldtoplayer( "isspeaking", 0 ); - - if ( isplayer( self ) ) - self.last_vo_played_time = gettime(); - - if ( isdefined( isresponse ) && isresponse ) - return; - - if ( isdefined( level.vox.speaker[self.zmbvoxid].response ) && isdefined( level.vox.speaker[self.zmbvoxid].response[category] ) && isdefined( level.vox.speaker[self.zmbvoxid].response[category][type] ) ) - { - if ( isdefined( self.isnpc ) && self.isnpc || !flag( "solo_game" ) ) - { - if ( isdefined( level._audio_custom_response_line ) ) - level thread [[ level._audio_custom_response_line ]]( self, index, category, type ); - else - level thread setup_response_line( self, index, category, type ); - } - } - } - else - { -/# - println( "DIALOG DEBUGGER: Can't play (" + ( prefix + sound_to_play ) + ") because someone is nearby speaking already." ); -#/ - } + self endon( "death_or_disconnect" ); + if ( is_true( level.skit_vox_override ) && !is_true( override ) ) + { + return; + } + if ( !isDefined( self.isspeaking ) ) + { + self.isspeaking = 0; + } + if ( is_true( self.isspeaking ) ) + { + return; + } + if ( !self arenearbyspeakersactive() || is_true( self.ignorenearbyspkrs ) ) + { + self.speakingline = sound_to_play; + self.isspeaking = 1; + if ( isplayer( self ) ) + { + self setclientfieldtoplayer( "isspeaking", 1 ); + } + self notify( "speaking" ); + playbacktime = soundgetplaybacktime( prefix + sound_to_play ); + if ( !isDefined( playbacktime ) ) + { + return; + } + if ( playbacktime >= 0 ) + { + playbacktime *= 0.001; + } + else + { + playbacktime = 1; + } + self playsoundontag( prefix + sound_to_play, "J_Head" ); + wait playbacktime; + if ( isplayer( self ) && !is_true( isresponse ) && isDefined( self.last_vo_played_time ) ) + { + if ( getTime() < ( self.last_vo_played_time + 5000 ) ) + { + waittime = 15; + } + } + wait waittime; + self notify( "done_speaking" ); + self.isspeaking = 0; + if ( isplayer( self ) ) + { + self setclientfieldtoplayer( "isspeaking", 0 ); + } + if ( isplayer( self ) ) + { + self.last_vo_played_time = getTime(); + } + if ( is_true( isresponse ) ) + { + return; + } + if ( isDefined( level.vox.speaker[ self.zmbvoxid ].response ) && isDefined( level.vox.speaker[ self.zmbvoxid ].response[ category ] ) && isDefined( level.vox.speaker[ self.zmbvoxid ].response[ category ][ type ] ) ) + { + if ( isDefined( self.isnpc ) && self.isnpc || !flag( "solo_game" ) ) + { + if ( isDefined( level._audio_custom_response_line ) ) + { + level thread [[ level._audio_custom_response_line ]]( self, index, category, type ); + } + else + { + level thread setup_response_line( self, index, category, type ); + } + } + } + } + else + { + } } -setup_response_line( player, index, category, type ) +setup_response_line( player, index, category, type ) //checked matches cerberus output { - dempsey = 0; - nikolai = 1; - takeo = 2; - richtofen = 3; - - switch ( player.entity_num ) - { - case "0": - level setup_hero_rival( player, nikolai, richtofen, category, type ); - break; - case "1": - level setup_hero_rival( player, richtofen, takeo, category, type ); - break; - case "2": - level setup_hero_rival( player, dempsey, nikolai, category, type ); - break; - case "3": - level setup_hero_rival( player, takeo, dempsey, category, type ); - break; - } + dempsey = 0; + nikolai = 1; + takeo = 2; + richtofen = 3; + switch( player.entity_num ) + { + case 0: + level setup_hero_rival( player, nikolai, richtofen, category, type ); + break; + case 1: + level setup_hero_rival( player, richtofen, takeo, category, type ); + break; + case 2: + level setup_hero_rival( player, dempsey, nikolai, category, type ); + break; + case 3: + level setup_hero_rival( player, takeo, dempsey, category, type ); + break; + } + return; } -setup_hero_rival( player, hero, rival, category, type ) +setup_hero_rival( player, hero, rival, category, type ) //checked changed to match cerberus output { - players = get_players(); - hero_player = undefined; - rival_player = undefined; - - foreach ( ent in players ) - { - if ( ent.characterindex == hero ) - { - hero_player = ent; - continue; - } - - if ( ent.characterindex == rival ) - rival_player = ent; - } - - if ( isdefined( hero_player ) && isdefined( rival_player ) ) - { - if ( randomint( 100 ) > 50 ) - hero_player = undefined; - else - rival_player = undefined; - } - - if ( isdefined( hero_player ) && distancesquared( player.origin, hero_player.origin ) < 250000 ) - hero_player create_and_play_dialog( category, type, "hr_" ); - else if ( isdefined( rival_player ) && distancesquared( player.origin, rival_player.origin ) < 250000 ) - rival_player create_and_play_dialog( category, type, "riv_" ); + players = get_players(); + hero_player = undefined; + rival_player = undefined; + foreach ( ent in players ) + { + if ( ent.characterindex == hero ) + { + hero_player = ent; + continue; + } + if ( ent.characterindex == rival ) + { + rival_player = ent; + } + } + if ( isDefined( hero_player ) && isDefined( rival_player ) ) + { + if ( randomint( 100 ) > 50 ) + { + hero_player = undefined; + } + else + { + rival_player = undefined; + } + } + if ( isDefined( hero_player ) && distancesquared( player.origin, hero_player.origin ) < 250000 ) + { + hero_player create_and_play_dialog( category, type, "hr_" ); + } + else if ( isDefined( rival_player ) && distancesquared( player.origin, rival_player.origin ) < 250000 ) + { + rival_player create_and_play_dialog( category, type, "riv_" ); + } } -do_announcer_playvox( category, type, team ) +do_announcer_playvox( category, type, team ) //checked matches cerberus output { - if ( !isdefined( level.vox.speaker["announcer"].alias[category] ) || !isdefined( level.vox.speaker["announcer"].alias[category][type] ) ) - return; - - if ( !isdefined( level.devil_is_speaking ) ) - level.devil_is_speaking = 0; - - prefix = level.vox.speaker["announcer"].prefix; - suffix = level.vox.speaker["announcer"].ent zmbvoxgetlinevariant( prefix, level.vox.speaker["announcer"].alias[category][type] ); - - if ( !isdefined( suffix ) ) - return; - - alias = prefix + suffix; - - if ( level.devil_is_speaking == 0 ) - { - level.devil_is_speaking = 1; - - if ( !isdefined( team ) ) - level.vox.speaker["announcer"].ent playsoundwithnotify( alias, "sounddone" ); - else - level thread zmbvoxannouncertoteam( category, type, team ); - - level.vox.speaker["announcer"].ent waittill( "sounddone" ); - - level.devil_is_speaking = 0; - } + if ( !isDefined( level.vox.speaker[ "announcer" ].alias[ category ] ) || !isDefined( level.vox.speaker[ "announcer" ].alias[ category ][ type ] ) ) + { + return; + } + if ( !isDefined( level.devil_is_speaking ) ) + { + level.devil_is_speaking = 0; + } + prefix = level.vox.speaker[ "announcer" ].prefix; + suffix = level.vox.speaker[ "announcer" ].ent zmbvoxgetlinevariant( prefix, level.vox.speaker[ "announcer" ].alias[ category ][ type ] ); + if ( !isDefined( suffix ) ) + { + return; + } + alias = prefix + suffix; + if ( level.devil_is_speaking == 0 ) + { + level.devil_is_speaking = 1; + if ( !isDefined( team ) ) + { + level.vox.speaker[ "announcer" ].ent playsoundwithnotify( alias, "sounddone" ); + } + else + { + level thread zmbvoxannouncertoteam( category, type, team ); + } + level.vox.speaker[ "announcer" ].ent waittill( "sounddone" ); + level.devil_is_speaking = 0; + } } -zmbvoxannouncertoteam( category, type, team ) +zmbvoxannouncertoteam( category, type, team ) //checked changed to match cerberus output { - prefix = level.vox.speaker["announcer"].prefix; - alias_to_team = prefix + level.vox.speaker["announcer"].ent zmbvoxgetlinevariant( prefix, level.vox.speaker["announcer"].alias[category][type] ); - - if ( isdefined( level.vox.speaker["announcer"].response[category][type] ) ) - alias_to_rival = prefix + level.vox.speaker["announcer"].ent zmbvoxgetlinevariant( prefix, level.vox.speaker["announcer"].response[category][type] ); - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( !isdefined( players[i]._encounters_team ) ) - continue; - - if ( players[i]._encounters_team == team ) - { - level.vox.speaker["announcer"].ent playsoundtoplayer( alias_to_team, players[i] ); - continue; - } - - if ( isdefined( alias_to_rival ) ) - level.vox.speaker["announcer"].ent playsoundtoplayer( alias_to_rival, players[i] ); - } - - wait 3; - level.vox.speaker["announcer"].ent notify( "sounddone" ); + prefix = level.vox.speaker[ "announcer" ].prefix; + alias_to_team = prefix + level.vox.speaker[ "announcer" ].ent zmbvoxgetlinevariant( prefix, level.vox.speaker[ "announcer" ].alias[ category ][ type ] ); + if ( isDefined( level.vox.speaker[ "announcer" ].response[ category ][ type ] ) ) + { + alias_to_rival = prefix + level.vox.speaker[ "announcer" ].ent zmbvoxgetlinevariant( prefix, level.vox.speaker[ "announcer" ].response[ category ][ type ] ); + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( !isdefined( players[ i ]._encounters_team ) ) + { + continue; + } + if ( players[ i ]._encounters_team == team ) + { + level.vox.speaker[ "announcer" ].ent playsoundtoplayer( alias_to_team, players[ i ] ); + continue; + } + if(isdefined(alias_to_rival)) + { + level.vox.speaker[ "announcer" ].ent playsoundtoplayer( alias_to_rival, players[ i ] ); + } + } + wait 3; + level.vox.speaker[ "announcer" ].ent notify( "sounddone" ); } -player_killstreak_timer() +player_killstreak_timer() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "death" ); - - if ( getdvar( _hash_FB12F109 ) == "" ) - setdvar( "zombie_kills", "7" ); - - if ( getdvar( _hash_D0575D76 ) == "" ) - setdvar( "zombie_kill_timer", "5" ); - - kills = getdvarint( _hash_FB12F109 ); - time = getdvarint( _hash_D0575D76 ); - - if ( !isdefined( self.timerisrunning ) ) - { - self.timerisrunning = 0; - self.killcounter = 0; - } - - while ( true ) - { - self waittill( "zom_kill", zomb ); - - if ( isdefined( zomb._black_hole_bomb_collapse_death ) && zomb._black_hole_bomb_collapse_death == 1 ) - continue; - - if ( isdefined( zomb.microwavegun_death ) && zomb.microwavegun_death ) - continue; - - self.killcounter++; - - if ( self.timerisrunning != 1 ) - { - self.timerisrunning = 1; - self thread timer_actual( kills, time ); - } - } + self endon( "disconnect" ); + self endon( "death" ); + if ( getDvar( "zombie_kills" ) == "" ) + { + setdvar( "zombie_kills", "7" ); + } + if ( getDvar( "zombie_kill_timer" ) == "" ) + { + setdvar( "zombie_kill_timer", "5" ); + } + kills = getDvarInt( "zombie_kills" ); + time = getDvarInt( "zombie_kill_timer" ); + if ( !isDefined( self.timerisrunning ) ) + { + self.timerisrunning = 0; + self.killcounter = 0; + } + while ( 1 ) + { + self waittill( "zom_kill", zomb ); + if ( isDefined( zomb._black_hole_bomb_collapse_death ) && zomb._black_hole_bomb_collapse_death == 1 ) + { + continue; + } + if ( is_true( zomb.microwavegun_death ) ) + { + continue; + } + self.killcounter++; + if ( self.timerisrunning != 1 ) + { + self.timerisrunning = 1; + self thread timer_actual( kills, time ); + } + } } -player_zombie_kill_vox( hit_location, player, mod, zombie ) +player_zombie_kill_vox( hit_location, player, mod, zombie ) //checked does not match cerberus output did not change { - weapon = player getcurrentweapon(); - dist = distancesquared( player.origin, zombie.origin ); - - if ( !isdefined( level.zombie_vars[player.team]["zombie_insta_kill"] ) ) - level.zombie_vars[player.team]["zombie_insta_kill"] = 0; - - instakill = level.zombie_vars[player.team]["zombie_insta_kill"]; - death = [[ level.audio_get_mod_type ]]( hit_location, mod, weapon, zombie, instakill, dist, player ); - chance = get_response_chance( death ); - - if ( chance > randomintrange( 1, 100 ) && !( isdefined( player.force_wait_on_kill_line ) && player.force_wait_on_kill_line ) ) - { - player.force_wait_on_kill_line = 1; - player create_and_play_dialog( "kill", death ); - wait 2; - - if ( isdefined( player ) ) - player.force_wait_on_kill_line = 0; - } + weapon = player getcurrentweapon(); + dist = distancesquared( player.origin, zombie.origin ); + if ( !isDefined( level.zombie_vars[ player.team ][ "zombie_insta_kill" ] ) ) + { + level.zombie_vars[ player.team ][ "zombie_insta_kill" ] = 0; + } + instakill = level.zombie_vars[ player.team ][ "zombie_insta_kill" ]; + death = [[ level.audio_get_mod_type ]]( hit_location, mod, weapon, zombie, instakill, dist, player ); + chance = get_response_chance( death ); + if ( chance > randomintrange( 1, 100 ) && !is_true( player.force_wait_on_kill_line ) ) + { + player.force_wait_on_kill_line = 1; + player create_and_play_dialog( "kill", death ); + wait 2; + if ( isDefined( player ) ) + { + player.force_wait_on_kill_line = 0; + } + } } -get_response_chance( event ) +get_response_chance( event ) //checked matches cerberus output { - if ( !isdefined( level.response_chances[event] ) ) - return 0; - - return level.response_chances[event]; + if ( !isDefined( level.response_chances[ event ] ) ) + { + return 0; + } + return level.response_chances[ event ]; } -get_mod_type( impact, mod, weapon, zombie, instakill, dist, player ) +get_mod_type( impact, mod, weapon, zombie, instakill, dist, player ) //checked does not match cerberus output did not change { - close_dist = 4096; - med_dist = 15376; - far_dist = 160000; - - if ( isdefined( zombie._black_hole_bomb_collapse_death ) && zombie._black_hole_bomb_collapse_death == 1 ) - return "default"; - - if ( zombie.animname == "screecher_zombie" && mod == "MOD_MELEE" ) - return "killed_screecher"; - - if ( is_placeable_mine( weapon ) ) - { - if ( !instakill ) - return "claymore"; - else - return "weapon_instakill"; - } - - if ( weapon == "jetgun_zm" || weapon == "jetgun_upgraded_zm" ) - { - if ( instakill ) - return "weapon_instakill"; - else - return "jetgun_kill"; - } - - if ( weapon == "slipgun_zm" || weapon == "slipgun_upgraded_zm" ) - { - if ( instakill ) - return "weapon_instakill"; - else - return "slipgun_kill"; - } - - if ( isdefined( zombie.damageweapon ) && zombie.damageweapon == "cymbal_monkey_zm" ) - { - if ( instakill ) - return "weapon_instakill"; - else - return "monkey"; - } - - if ( is_headshot( weapon, impact, mod ) && dist >= far_dist ) - return "headshot"; - - if ( ( mod == "MOD_MELEE" || mod == "MOD_BAYONET" || mod == "MOD_UNKNOWN" ) && dist < close_dist ) - { - if ( !instakill ) - { - if ( player hasweapon( "sickle_knife_zm" ) ) - return "sickle"; - else - return "melee"; - } - else - return "melee_instakill"; - } - - if ( isdefined( zombie.damageweapon ) && zombie.damageweapon == "zombie_nesting_doll_single" ) - { - if ( !instakill ) - return "dolls"; - else - return "weapon_instakill"; - } - - if ( is_explosive_damage( mod ) && weapon != "ray_gun_zm" && !( isdefined( zombie.is_on_fire ) && zombie.is_on_fire ) ) - { - if ( !instakill ) - return "explosive"; - else - return "weapon_instakill"; - } - - if ( ( issubstr( weapon, "flame" ) || issubstr( weapon, "molotov_" ) || issubstr( weapon, "napalmblob_" ) ) && ( mod == "MOD_BURNED" || mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" ) ) - { - if ( !instakill ) - return "flame"; - else - return "weapon_instakill"; - } - - if ( weapon == "ray_gun_zm" && dist > far_dist ) - { - if ( !instakill ) - return "raygun"; - else - return "weapon_instakill"; - } - - if ( !isdefined( impact ) ) - impact = ""; - - if ( mod == "MOD_RIFLE_BULLET" || mod == "MOD_PISTOL_BULLET" ) - { - if ( !instakill ) - return "bullet"; - else - return "weapon_instakill"; - } - - if ( instakill ) - return "default"; - - if ( mod != "MOD_MELEE" && zombie.animname == "quad_zombie" ) - return "quad"; - - if ( mod != "MOD_MELEE" && zombie.animname == "astro_zombie" ) - return "astro"; - - if ( mod != "MOD_MELEE" && !zombie.has_legs ) - return "crawler"; - - if ( mod != "MOD_BURNED" && dist < close_dist ) - return "closekill"; - - return "default"; + close_dist = 4096; + med_dist = 15376; + far_dist = 160000; + if ( isDefined( zombie._black_hole_bomb_collapse_death ) && zombie._black_hole_bomb_collapse_death == 1 ) + { + return "default"; + } + if ( zombie.animname == "screecher_zombie" && mod == "MOD_MELEE" ) + { + return "killed_screecher"; + } + if ( is_placeable_mine( weapon ) ) + { + if ( !instakill ) + { + return "claymore"; + } + else + { + return "weapon_instakill"; + } + } + if ( weapon == "jetgun_zm" || weapon == "jetgun_upgraded_zm" ) + { + if ( instakill ) + { + return "weapon_instakill"; + } + else + { + return "jetgun_kill"; + } + } + if ( weapon == "slipgun_zm" || weapon == "slipgun_upgraded_zm" ) + { + if ( instakill ) + { + return "weapon_instakill"; + } + else + { + return "slipgun_kill"; + } + } + if ( isDefined( zombie.damageweapon ) && zombie.damageweapon == "cymbal_monkey_zm" ) + { + if ( instakill ) + { + return "weapon_instakill"; + } + else + { + return "monkey"; + } + } + if ( is_headshot( weapon, impact, mod ) && dist >= far_dist ) + { + return "headshot"; + } + if ( mod != "MOD_MELEE" && mod != "MOD_BAYONET" && mod == "MOD_UNKNOWN" && dist < close_dist ) + { + if ( !instakill ) + { + if ( player hasweapon( "sickle_knife_zm" ) ) + { + return "sickle"; + } + else + { + return "melee"; + } + } + else + { + return "melee_instakill"; + } + } + if ( isDefined( zombie.damageweapon ) && zombie.damageweapon == "zombie_nesting_doll_single" ) + { + if ( !instakill ) + { + return "dolls"; + } + else + { + return "weapon_instakill"; + } + } + if ( is_explosive_damage( mod ) && weapon != "ray_gun_zm" && !is_true( zombie.is_on_fire ) ) + { + if ( !instakill ) + { + return "explosive"; + } + else + { + return "weapon_instakill"; + } + } + if ( !issubstr( weapon, "flame" ) && !issubstr( weapon, "molotov_" ) && issubstr( weapon, "napalmblob_" ) && mod != "MOD_BURNED" || mod == "MOD_GRENADE" && mod == "MOD_GRENADE_SPLASH" ) + { + if ( !instakill ) + { + return "flame"; + } + else + { + return "weapon_instakill"; + } + } + if ( weapon == "ray_gun_zm" && dist > far_dist ) + { + if ( !instakill ) + { + return "raygun"; + } + else + { + return "weapon_instakill"; + } + } + if ( !isDefined( impact ) ) + { + impact = ""; + } + if ( mod == "MOD_RIFLE_BULLET" || mod == "MOD_PISTOL_BULLET" ) + { + if ( !instakill ) + { + return "bullet"; + } + else + { + return "weapon_instakill"; + } + } + if ( instakill ) + { + return "default"; + } + if ( mod != "MOD_MELEE" && zombie.animname == "quad_zombie" ) + { + return "quad"; + } + if ( mod != "MOD_MELEE" && zombie.animname == "astro_zombie" ) + { + return "astro"; + } + if ( mod != "MOD_MELEE" && !zombie.has_legs ) + { + return "crawler"; + } + if ( mod != "MOD_BURNED" && dist < close_dist ) + { + return "closekill"; + } + return "default"; } -timer_actual( kills, time ) +timer_actual( kills, time ) //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "death" ); - timer = gettime() + time * 1000; - - while ( gettime() < timer ) - { - if ( self.killcounter > kills ) - { - self create_and_play_dialog( "kill", "streak" ); - wait 1; - self.killcounter = 0; - timer = -1; - } - - wait 0.1; - } - - wait 10; - self.killcounter = 0; - self.timerisrunning = 0; + self endon( "disconnect" ); + self endon( "death" ); + timer = getTime() + ( time * 1000 ); + while ( getTime() < timer ) + { + if ( self.killcounter > kills ) + { + self create_and_play_dialog( "kill", "streak" ); + wait 1; + self.killcounter = 0; + timer = -1; + } + wait 0.1; + } + wait 10; + self.killcounter = 0; + self.timerisrunning = 0; } -perks_a_cola_jingle_timer() +perks_a_cola_jingle_timer() //checked matches cerberus output { - if ( isdefined( level.sndperksacolaloopoverride ) ) - { - self thread [[ level.sndperksacolaloopoverride ]](); - return; - } - - self endon( "death" ); - self thread play_random_broken_sounds(); - - while ( true ) - { - wait( randomfloatrange( 31, 45 ) ); - - if ( randomint( 100 ) < 15 ) - self thread play_jingle_or_stinger( self.script_sound ); - } + if ( isDefined( level.sndperksacolaloopoverride ) ) + { + self thread [[ level.sndperksacolaloopoverride ]](); + return; + } + self endon( "death" ); + self thread play_random_broken_sounds(); + while ( 1 ) + { + wait randomfloatrange( 31, 45 ); + if ( randomint( 100 ) < 15 ) + { + self thread play_jingle_or_stinger( self.script_sound ); + } + } } -play_jingle_or_stinger( perksacola ) +play_jingle_or_stinger( perksacola ) //checked matches cerberus output { - if ( isdefined( level.sndperksacolajingleoverride ) ) - { - self thread [[ level.sndperksacolajingleoverride ]](); - return; - } - - playsoundatposition( "evt_electrical_surge", self.origin ); - - if ( !isdefined( self.jingle_is_playing ) ) - self.jingle_is_playing = 0; - - if ( isdefined( perksacola ) ) - { - if ( self.jingle_is_playing == 0 && level.music_override == 0 ) - { - self.jingle_is_playing = 1; - self playsoundontag( perksacola, "tag_origin", "sound_done" ); - - if ( issubstr( perksacola, "sting" ) ) - wait 10; - else if ( isdefined( self.longjinglewait ) ) - wait 60; - else - wait 30; - - self.jingle_is_playing = 0; - } - } + if ( isDefined( level.sndperksacolajingleoverride ) ) + { + self thread [[ level.sndperksacolajingleoverride ]](); + return; + } + playsoundatposition( "evt_electrical_surge", self.origin ); + if ( !isDefined( self.jingle_is_playing ) ) + { + self.jingle_is_playing = 0; + } + if ( isDefined( perksacola ) ) + { + if ( self.jingle_is_playing == 0 && level.music_override == 0 ) + { + self.jingle_is_playing = 1; + self playsoundontag( perksacola, "tag_origin", "sound_done" ); + if ( issubstr( perksacola, "sting" ) ) + { + wait 10; + } + else if ( isDefined( self.longjinglewait ) ) + { + wait 60; + } + else + { + wait 30; + } + self.jingle_is_playing = 0; + } + } } -play_random_broken_sounds() +play_random_broken_sounds() //checked matches cerberus output { - self endon( "death" ); - level endon( "jingle_playing" ); - - if ( !isdefined( self.script_sound ) ) - self.script_sound = "null"; - - if ( self.script_sound == "mus_perks_revive_jingle" ) - { - while ( true ) - { - wait( randomfloatrange( 7, 18 ) ); - playsoundatposition( "zmb_perks_broken_jingle", self.origin ); - playsoundatposition( "evt_electrical_surge", self.origin ); - } - } - else - { - while ( true ) - { - wait( randomfloatrange( 7, 18 ) ); - playsoundatposition( "evt_electrical_surge", self.origin ); - } - } + self endon( "death" ); + level endon( "jingle_playing" ); + if ( !isDefined( self.script_sound ) ) + { + self.script_sound = "null"; + } + if ( self.script_sound == "mus_perks_revive_jingle" ) + { + while ( 1 ) + { + wait randomfloatrange( 7, 18 ); + playsoundatposition( "zmb_perks_broken_jingle", self.origin ); + playsoundatposition( "evt_electrical_surge", self.origin ); + } + } + else while ( 1 ) + { + wait randomfloatrange( 7, 18 ); + playsoundatposition( "evt_electrical_surge", self.origin ); + } } -perk_vox( perk ) +perk_vox( perk ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - - if ( !isdefined( level.vox.speaker["player"].alias["perk"][perk] ) ) - { -/# - iprintlnbold( perk + " has no PLR VOX category set up." ); -#/ - return; - } - - self create_and_play_dialog( "perk", perk ); + self endon( "death" ); + self endon( "disconnect" ); + if ( !isDefined( level.vox.speaker[ "player" ].alias[ "perk" ][ perk ] ) ) + { + return; + } + self create_and_play_dialog( "perk", perk ); } -dialog_debugger( category, type ) +dialog_debugger( category, type ) //checked dev call deleted { -/# - println( "DIALOG DEBUGGER: " + self.zmbvoxid + " attempting to speak" ); - - if ( !isdefined( level.vox.speaker[self.zmbvoxid].alias[category][type] ) ) - { - iprintlnbold( self.zmbvoxid + " tried to play a line, but no alias exists. Category: " + category + " Type: " + type ); - println( "DIALOG DEBUGGER ERROR: Alias Not Defined For " + category + " " + type ); - } - - if ( !isdefined( level.vox.speaker[self.zmbvoxid].response ) ) - println( "DIALOG DEBUGGER ERROR: Response Alias Not Defined For " + category + " " + type + "_response" ); -#/ } -init_music_states() +init_music_states() //checked matches cerberus output { - level.music_override = 0; - level.music_round_override = 0; - level.old_music_state = undefined; - level.zmb_music_states = []; - level thread setupmusicstate( "round_start", "mus_zombie_round_start", 1, 1, 1, "WAVE" ); - level thread setupmusicstate( "round_end", "mus_zombie_round_over", 1, 1, 1, "SILENCE" ); - level thread setupmusicstate( "wave_loop", "WAVE", 0, 1, undefined, undefined ); - level thread setupmusicstate( "game_over", "mus_zombie_game_over", 1, 0, undefined, "SILENCE" ); - level thread setupmusicstate( "dog_start", "mus_zombie_dog_start", 1, 1, undefined, undefined ); - level thread setupmusicstate( "dog_end", "mus_zombie_dog_end", 1, 1, undefined, undefined ); - level thread setupmusicstate( "egg", "EGG", 0, 0, undefined, undefined ); - level thread setupmusicstate( "egg_safe", "EGG_SAFE", 0, 0, undefined, undefined ); - level thread setupmusicstate( "egg_a7x", "EGG_A7X", 0, 0, undefined, undefined ); - level thread setupmusicstate( "sam_reveal", "SAM", 0, 0, undefined, undefined ); - level thread setupmusicstate( "brutus_round_start", "mus_event_brutus_round_start", 1, 1, 0, "WAVE" ); - level thread setupmusicstate( "last_life", "LAST_LIFE", 0, 1, undefined, undefined ); + level.music_override = 0; + level.music_round_override = 0; + level.old_music_state = undefined; + level.zmb_music_states = []; + level thread setupmusicstate( "round_start", "mus_zombie_round_start", 1, 1, 1, "WAVE" ); + level thread setupmusicstate( "round_end", "mus_zombie_round_over", 1, 1, 1, "SILENCE" ); + level thread setupmusicstate( "wave_loop", "WAVE", 0, 1, undefined, undefined ); + level thread setupmusicstate( "game_over", "mus_zombie_game_over", 1, 0, undefined, "SILENCE" ); + level thread setupmusicstate( "dog_start", "mus_zombie_dog_start", 1, 1, undefined, undefined ); + level thread setupmusicstate( "dog_end", "mus_zombie_dog_end", 1, 1, undefined, undefined ); + level thread setupmusicstate( "egg", "EGG", 0, 0, undefined, undefined ); + level thread setupmusicstate( "egg_safe", "EGG_SAFE", 0, 0, undefined, undefined ); + level thread setupmusicstate( "egg_a7x", "EGG_A7X", 0, 0, undefined, undefined ); + level thread setupmusicstate( "sam_reveal", "SAM", 0, 0, undefined, undefined ); + level thread setupmusicstate( "brutus_round_start", "mus_event_brutus_round_start", 1, 1, 0, "WAVE" ); + level thread setupmusicstate( "last_life", "LAST_LIFE", 0, 1, undefined, undefined ); } -setupmusicstate( state, alias, is_alias, override, round_override, musicstate ) +setupmusicstate( state, alias, is_alias, override, round_override, musicstate ) //checked matches cerberus output { - if ( !isdefined( level.zmb_music_states[state] ) ) - level.zmb_music_states[state] = spawnstruct(); - - level.zmb_music_states[state].music = alias; - level.zmb_music_states[state].is_alias = is_alias; - level.zmb_music_states[state].override = override; - level.zmb_music_states[state].round_override = round_override; - level.zmb_music_states[state].musicstate = musicstate; + if ( !isDefined( level.zmb_music_states[ state ] ) ) + { + level.zmb_music_states[ state ] = spawnstruct(); + } + level.zmb_music_states[ state ].music = alias; + level.zmb_music_states[ state ].is_alias = is_alias; + level.zmb_music_states[ state ].override = override; + level.zmb_music_states[ state ].round_override = round_override; + level.zmb_music_states[ state ].musicstate = musicstate; } -change_zombie_music( state ) +change_zombie_music( state ) //checked changed to match cerberus output { - wait 0.05; - m = level.zmb_music_states[state]; - - if ( !isdefined( m ) ) - { -/# - iprintlnbold( "Called change_zombie_music on undefined state: " + state ); -#/ - return; - } - - do_logic = 1; - - if ( !isdefined( level.old_music_state ) ) - do_logic = 0; - - if ( do_logic ) - { - if ( level.old_music_state == m ) - return; - else if ( level.old_music_state.music == "mus_zombie_game_over" ) - return; - } - - if ( !isdefined( m.round_override ) ) - m.round_override = 0; - - if ( m.override == 1 && level.music_override == 1 ) - return; - - if ( m.round_override == 1 && level.music_round_override == 1 ) - return; - - if ( m.is_alias ) - { - if ( isdefined( m.musicstate ) ) - maps\mp\_music::setmusicstate( m.musicstate ); - - play_sound_2d( m.music ); - } - else - maps\mp\_music::setmusicstate( m.music ); - - level.old_music_state = m; + wait 0.05; + m = level.zmb_music_states[ state ]; + if ( !isDefined( m ) ) + { + return; + } + do_logic = 1; + if ( !isDefined( level.old_music_state ) ) + { + do_logic = 0; + } + if ( do_logic ) + { + if ( level.old_music_state == m ) + { + return; + } + else if ( level.old_music_state.music == "mus_zombie_game_over" ) + { + return; + } + } + if ( !isDefined( m.round_override ) ) + { + m.round_override = 0; + } + if ( m.override == 1 && level.music_override == 1 ) + { + return; + } + if ( m.round_override == 1 && level.music_round_override == 1 ) + { + return; + } + if ( m.is_alias ) + { + if ( isDefined( m.musicstate ) ) + { + maps/mp/_music::setmusicstate( m.musicstate ); + } + play_sound_2d( m.music ); + } + else + { + maps/mp/_music::setmusicstate( m.music ); + } + level.old_music_state = m; } -weapon_toggle_vox( alias, weapon ) +weapon_toggle_vox( alias, weapon ) //checked changed to match cerberus output { - self notify( "audio_activated_trigger" ); - self endon( "audio_activated_trigger" ); - prefix = "vox_pa_switcher_"; - sound_to_play = prefix + alias; - type = undefined; - - if ( isdefined( weapon ) ) - { - type = get_weapon_num( weapon ); - - if ( !isdefined( type ) ) - return; - } - - self stopsounds(); - wait 0.05; - - if ( isdefined( type ) ) - { - self playsoundwithnotify( prefix + "weapon_" + type, "sounddone" ); - - self waittill( "sounddone" ); - } - - self playsound( sound_to_play + "_0" ); + self notify( "audio_activated_trigger" ); + self endon( "audio_activated_trigger" ); + prefix = "vox_pa_switcher_"; + sound_to_play = prefix + alias; + type = undefined; + if ( isDefined( weapon ) ) + { + type = get_weapon_num( weapon ); + if ( !isDefined( type ) ) + { + return; + } + } + self stopsounds(); + wait 0.05; + if ( isDefined( type ) ) + { + self playsoundwithnotify( prefix + "weapon_" + type, "sounddone" ); + self waittill( "sounddone" ); + } + self playsound( sound_to_play + "_0" ); } -get_weapon_num( weapon ) +get_weapon_num( weapon ) //checked matches cerberus output { - weapon_num = undefined; - - switch ( weapon ) - { - case "humangun_zm": - weapon_num = 0; - break; - case "sniper_explosive_zm": - weapon_num = 1; - break; - case "tesla_gun_zm": - weapon_num = 2; - break; - } - - return weapon_num; + weapon_num = undefined; + switch( weapon ) + { + case "humangun_zm": + weapon_num = 0; + break; + case "sniper_explosive_zm": + weapon_num = 1; + break; + case "tesla_gun_zm": + weapon_num = 2; + break; + } + return weapon_num; } -addasspeakernpc( ignorenearbyspeakers ) +addasspeakernpc( ignorenearbyspeakers ) //checked matches cerberus output { - if ( !isdefined( level.npcs ) ) - level.npcs = []; - - if ( isdefined( ignorenearbyspeakers ) && ignorenearbyspeakers ) - self.ignorenearbyspkrs = 1; - else - self.ignorenearbyspkrs = 0; - - self.isnpc = 1; - level.npcs[level.npcs.size] = self; + if ( !isDefined( level.npcs ) ) + { + level.npcs = []; + } + if ( is_true( ignorenearbyspeakers ) ) + { + self.ignorenearbyspkrs = 1; + } + else + { + self.ignorenearbyspkrs = 0; + } + self.isnpc = 1; + level.npcs[ level.npcs.size ] = self; } -arenearbyspeakersactive() +arenearbyspeakersactive() //checked partially changed to match cerberus output { - radius = 1000; - nearbyspeakeractive = 0; - speakers = get_players(); - - if ( isdefined( level.npcs ) ) - speakers = arraycombine( speakers, level.npcs, 1, 0 ); - - foreach ( person in speakers ) - { - if ( self == person ) - continue; - - if ( person is_player() ) - { - if ( person.sessionstate != "playing" ) - continue; - - if ( person maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - continue; - } - else - { - - } - - if ( isdefined( person.isspeaking ) && person.isspeaking && !( isdefined( person.ignorenearbyspkrs ) && person.ignorenearbyspkrs ) ) - { - if ( distancesquared( self.origin, person.origin ) < radius * radius ) - nearbyspeakeractive = 1; - } - } - - return nearbyspeakeractive; + radius = 1000; + nearbyspeakeractive = 0; + speakers = get_players(); + if ( isDefined( level.npcs ) ) + { + speakers = arraycombine( speakers, level.npcs, 1, 0 ); + } + foreach ( person in speakers ) + { + if ( self == person ) + { + continue; + } + if ( person is_player() ) + { + if ( person.sessionstate != "playing" ) + { + continue; + } + if ( person maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + continue; + } + } + if ( is_true( person.isspeaking ) && !is_true( person.ignorenearbyspkrs ) ) + { + if ( distancesquared( self.origin, person.origin ) < radius * radius ) + { + nearbyspeakeractive = 1; + } + } + } + return nearbyspeakeractive; } -zmbvoxcreate() +zmbvoxcreate() //checked matches cerberus output { - vox = spawnstruct(); - vox.speaker = []; - return vox; + vox = spawnstruct(); + vox.speaker = []; + return vox; } -zmbvoxinitspeaker( speaker, prefix, ent ) +zmbvoxinitspeaker( speaker, prefix, ent ) //checked matches cerberus output { - ent.zmbvoxid = speaker; - - if ( !isdefined( self.speaker[speaker] ) ) - { - self.speaker[speaker] = spawnstruct(); - self.speaker[speaker].alias = []; - } - - self.speaker[speaker].prefix = prefix; - self.speaker[speaker].ent = ent; + ent.zmbvoxid = speaker; + if ( !isDefined( self.speaker[ speaker ] ) ) + { + self.speaker[ speaker ] = spawnstruct(); + self.speaker[ speaker ].alias = []; + } + self.speaker[ speaker ].prefix = prefix; + self.speaker[ speaker ].ent = ent; } -zmbvoxadd( speaker, category, type, alias, response ) +zmbvoxadd( speaker, category, type, alias, response ) //checked matches cerberus output { -/# - assert( isdefined( speaker ) ); -#/ -/# - assert( isdefined( category ) ); -#/ -/# - assert( isdefined( type ) ); -#/ -/# - assert( isdefined( alias ) ); -#/ - if ( !isdefined( self.speaker[speaker] ) ) - { - self.speaker[speaker] = spawnstruct(); - self.speaker[speaker].alias = []; - } - - if ( !isdefined( self.speaker[speaker].alias[category] ) ) - self.speaker[speaker].alias[category] = []; - - self.speaker[speaker].alias[category][type] = alias; - - if ( isdefined( response ) ) - { - if ( !isdefined( self.speaker[speaker].response ) ) - self.speaker[speaker].response = []; - - if ( !isdefined( self.speaker[speaker].response[category] ) ) - self.speaker[speaker].response[category] = []; - - self.speaker[speaker].response[category][type] = response; - } - - create_vox_timer( type ); + if ( !isDefined( self.speaker[ speaker ] ) ) + { + self.speaker[ speaker ] = spawnstruct(); + self.speaker[ speaker ].alias = []; + } + if ( !isDefined( self.speaker[ speaker ].alias[ category ] ) ) + { + self.speaker[ speaker ].alias[ category ] = []; + } + self.speaker[ speaker ].alias[ category ][ type ] = alias; + if ( isDefined( response ) ) + { + if ( !isDefined( self.speaker[ speaker ].response ) ) + { + self.speaker[ speaker ].response = []; + } + if ( !isDefined( self.speaker[ speaker ].response[ category ] ) ) + { + self.speaker[ speaker ].response[ category ] = []; + } + self.speaker[ speaker ].response[ category ][ type ] = response; + } + create_vox_timer( type ); } -zmbvoxgetlinevariant( prefix, alias_suffix, force_variant, override ) +zmbvoxgetlinevariant( prefix, alias_suffix, force_variant, override ) //checked changed to match cerberus output { - if ( !isdefined( self.sound_dialog ) ) - { - self.sound_dialog = []; - self.sound_dialog_available = []; - } - - if ( !isdefined( self.sound_dialog[alias_suffix] ) ) - { - num_variants = maps\mp\zombies\_zm_spawner::get_number_variants( prefix + alias_suffix ); - - if ( num_variants <= 0 ) - { -/# - if ( getdvarint( _hash_AEB127D ) > 0 ) - println( "DIALOG DEBUGGER: No variants found for - " + prefix + alias_suffix ); -#/ - return undefined; - } - - for ( i = 0; i < num_variants; i++ ) - self.sound_dialog[alias_suffix][i] = i; - - self.sound_dialog_available[alias_suffix] = []; - } - - if ( self.sound_dialog_available[alias_suffix].size <= 0 ) - { - for ( i = 0; i < self.sound_dialog[alias_suffix].size; i++ ) - self.sound_dialog_available[alias_suffix][i] = self.sound_dialog[alias_suffix][i]; - } - - variation = random( self.sound_dialog_available[alias_suffix] ); - arrayremovevalue( self.sound_dialog_available[alias_suffix], variation ); - - if ( isdefined( force_variant ) ) - variation = force_variant; - - if ( !isdefined( override ) ) - override = 0; - - return alias_suffix + "_" + variation; + if ( !isDefined( self.sound_dialog ) ) + { + self.sound_dialog = []; + self.sound_dialog_available = []; + } + if ( !isDefined( self.sound_dialog[ alias_suffix ] ) ) + { + num_variants = maps/mp/zombies/_zm_spawner::get_number_variants( prefix + alias_suffix ); + if ( num_variants <= 0 ) + { + return undefined; + } + for ( i = 0; i < num_variants; i++ ) + { + self.sound_dialog[ alias_suffix ][ i ] = i; + } + self.sound_dialog_available[ alias_suffix ] = []; + } + while ( self.sound_dialog_available[ alias_suffix ].size <= 0 ) + { + for ( i = 0; i < self.sound_dialog[ alias_suffix ].size; i++ ) + { + self.sound_dialog_available[ alias_suffix ][ i ] = self.sound_dialog[ alias_suffix ][ i ]; + } + } + variation = random( self.sound_dialog_available[ alias_suffix ] ); + arrayremovevalue( self.sound_dialog_available[ alias_suffix ], variation ); + if ( isDefined( force_variant ) ) + { + variation = force_variant; + } + if ( !isDefined( override ) ) + { + override = 0; + } + return ( alias_suffix + "_" ) + variation; } -zmbvoxcrowdonteam( alias, team, other_alias ) +zmbvoxcrowdonteam( alias, team, other_alias ) //checked changed to match cerberus output { - alias = "vox_crowd_" + alias; - - if ( !isdefined( team ) ) - { - level play_sound_2d( alias ); - return; - } - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( !isdefined( players[i]._encounters_team ) ) - continue; - - if ( players[i]._encounters_team == team ) - { - players[i] playsoundtoplayer( alias, players[i] ); - continue; - } - - if ( isdefined( other_alias ) ) - players[i] playsoundtoplayer( other_alias, players[i] ); - } + alias = "vox_crowd_" + alias; + if ( !isDefined( team ) ) + { + level play_sound_2d( alias ); + return; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( !isdefined( players[ i ]._encounters_team ) ) + { + continue; + } + if ( players[ i ]._encounters_team == team ) + { + players[ i ] playsoundtoplayer( alias, players[ i ] ); + continue; + } + if ( isdefined( other_alias ) ) + { + players[ i ] playsoundtoplayer( other_alias, players[ i ] ); + } + } } -playvoxtoplayer( category, type, force_variant ) +playvoxtoplayer( category, type, force_variant ) //checked matches cerberus output { - if ( self.sessionstate != "playing" ) - return; - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - return; - - prefix = level.vox.speaker[self.zmbvoxid].prefix; - alias_suffix = level.vox.speaker[self.zmbvoxid].alias[category][type]; - prefix = prefix + self.characterindex + "_"; - - if ( !isdefined( alias_suffix ) ) - return; - - sound_to_play = self zmbvoxgetlinevariant( prefix, alias_suffix, force_variant ); - - if ( isdefined( sound_to_play ) ) - { - sound = prefix + sound_to_play; - self playsoundtoplayer( sound, self ); - } + if ( self.sessionstate != "playing" ) + { + return; + } + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return; + } + prefix = level.vox.speaker[ self.zmbvoxid ].prefix; + alias_suffix = level.vox.speaker[ self.zmbvoxid ].alias[ category ][ type ]; + prefix = prefix + self.characterindex + "_"; + if ( !isDefined( alias_suffix ) ) + { + return; + } + sound_to_play = self zmbvoxgetlinevariant( prefix, alias_suffix, force_variant ); + if ( isDefined( sound_to_play ) ) + { + sound = prefix + sound_to_play; + self playsoundtoplayer( sound, self ); + } } -sndmusicstingerevent( type, player ) +sndmusicstingerevent( type, player ) //checked matches cerberus output { - if ( isdefined( level.sndmusicstingerevent ) ) - [[ level.sndmusicstingerevent ]]( type, player ); + if ( isDefined( level.sndmusicstingerevent ) ) + { + [[ level.sndmusicstingerevent ]]( type, player ); + } } -custom_kill_damaged_vo( player ) +custom_kill_damaged_vo( player ) //checked matches cerberus output { - self notify( "sound_damage_player_updated" ); - self endon( "death" ); - self endon( "sound_damage_player_updated" ); - self.sound_damage_player = player; - wait 5; - self.sound_damage_player = undefined; + self notify( "sound_damage_player_updated" ); + self endon( "death" ); + self endon( "sound_damage_player_updated" ); + self.sound_damage_player = player; + wait 5; + self.sound_damage_player = undefined; } + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio_announcer.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio_announcer.gsc index ce637f9..d6b98f2 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio_announcer.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio_announcer.gsc @@ -1,445 +1,431 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_spawner; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - game["zmbdialog"] = []; - game["zmbdialog"]["prefix"] = "vox_zmba"; - createvox( "carpenter", "powerup_carpenter" ); - createvox( "insta_kill", "powerup_instakill" ); - createvox( "double_points", "powerup_doublepoints" ); - createvox( "nuke", "powerup_nuke" ); - createvox( "full_ammo", "powerup_maxammo" ); - createvox( "fire_sale", "powerup_firesale" ); - createvox( "minigun", "powerup_death_machine" ); - createvox( "zombie_blood", "powerup_zombie_blood" ); - createvox( "boxmove", "event_magicbox" ); - createvox( "dogstart", "event_dogstart" ); - thread init_gamemodespecificvox( getdvar( "ui_gametype" ), getdvar( _hash_C955B4CD ) ); - level.allowzmbannouncer = 1; + game[ "zmbdialog" ] = []; + game[ "zmbdialog" ][ "prefix" ] = "vox_zmba"; + createvox( "carpenter", "powerup_carpenter" ); + createvox( "insta_kill", "powerup_instakill" ); + createvox( "double_points", "powerup_doublepoints" ); + createvox( "nuke", "powerup_nuke" ); + createvox( "full_ammo", "powerup_maxammo" ); + createvox( "fire_sale", "powerup_firesale" ); + createvox( "minigun", "powerup_death_machine" ); + createvox( "zombie_blood", "powerup_zombie_blood" ); + createvox( "boxmove", "event_magicbox" ); + createvox( "dogstart", "event_dogstart" ); + thread init_gamemodespecificvox( getDvar( "ui_gametype" ), getDvar( "ui_zm_mapstartlocation" ) ); + level.allowzmbannouncer = 1; } -init_gamemodespecificvox( mode, location ) +init_gamemodespecificvox( mode, location ) //checked matches cerberus output { - switch ( mode ) - { - case "zmeat": - init_meatvox( "meat" ); - break; - case "zrace": - init_racevox( "race", location ); - break; - case "zgrief": - init_griefvox( "grief" ); - break; - case "zcleansed": - init_cleansed( location ); - break; - default: - init_gamemodecommonvox(); - break; - } + switch( mode ) + { + case "zmeat": + init_meatvox( "meat" ); + break; + case "zrace": + init_racevox( "race", location ); + break; + case "zgrief": + init_griefvox( "grief" ); + break; + case "zcleansed": + init_cleansed( location ); + break; + default: + init_gamemodecommonvox(); + break; + } } -init_gamemodecommonvox( prefix ) +init_gamemodecommonvox( prefix ) //checked matches cerberus output { - createvox( "rules", "rules", prefix ); - createvox( "countdown", "intro", prefix ); - createvox( "side_switch", "side_switch", prefix ); - createvox( "round_win", "win_rd", prefix ); - createvox( "round_lose", "lose_rd", prefix ); - createvox( "round_tied", "tied_rd", prefix ); - createvox( "match_win", "win", prefix ); - createvox( "match_lose", "lose", prefix ); - createvox( "match_tied", "tied", prefix ); + createvox( "rules", "rules", prefix ); + createvox( "countdown", "intro", prefix ); + createvox( "side_switch", "side_switch", prefix ); + createvox( "round_win", "win_rd", prefix ); + createvox( "round_lose", "lose_rd", prefix ); + createvox( "round_tied", "tied_rd", prefix ); + createvox( "match_win", "win", prefix ); + createvox( "match_lose", "lose", prefix ); + createvox( "match_tied", "tied", prefix ); } -init_griefvox( prefix ) +init_griefvox( prefix ) //checked matches cerberus output { - init_gamemodecommonvox( prefix ); - createvox( "1_player_down", "1rivdown", prefix ); - createvox( "2_player_down", "2rivdown", prefix ); - createvox( "3_player_down", "3rivdown", prefix ); - createvox( "4_player_down", "4rivdown", prefix ); - createvox( "grief_restarted", "restart", prefix ); - createvox( "grief_lost", "lose", prefix ); - createvox( "grief_won", "win", prefix ); - createvox( "1_player_left", "1rivup", prefix ); - createvox( "2_player_left", "2rivup", prefix ); - createvox( "3_player_left", "3rivup", prefix ); - createvox( "last_player", "solo", prefix ); + init_gamemodecommonvox( prefix ); + createvox( "1_player_down", "1rivdown", prefix ); + createvox( "2_player_down", "2rivdown", prefix ); + createvox( "3_player_down", "3rivdown", prefix ); + createvox( "4_player_down", "4rivdown", prefix ); + createvox( "grief_restarted", "restart", prefix ); + createvox( "grief_lost", "lose", prefix ); + createvox( "grief_won", "win", prefix ); + createvox( "1_player_left", "1rivup", prefix ); + createvox( "2_player_left", "2rivup", prefix ); + createvox( "3_player_left", "3rivup", prefix ); + createvox( "last_player", "solo", prefix ); } -init_cleansed( prefix ) +init_cleansed( prefix ) //checked matches cerberus output { - init_gamemodecommonvox( prefix ); - createvox( "dr_start_single_0", "dr_start_0" ); - createvox( "dr_start_2", "dr_start_1" ); - createvox( "dr_start_3", "dr_start_2" ); - createvox( "dr_cure_found_line", "dr_cure_found" ); - createvox( "dr_monkey_killer", "dr_monkey_0" ); - createvox( "dr_monkey_killee", "dr_monkey_1" ); - createvox( "dr_human_killed", "dr_kill_plr" ); - createvox( "dr_human_killer", "dr_kill_plr_2" ); - createvox( "dr_survival", "dr_plr_survive_0" ); - createvox( "dr_zurvival", "dr_zmb_survive_2" ); - createvox( "dr_countdown0", "dr_plr_survive_1" ); - createvox( "dr_countdown1", "dr_plr_survive_2" ); - createvox( "dr_countdown2", "dr_plr_survive_3" ); - createvox( "dr_ending", "dr_time_0" ); + init_gamemodecommonvox( prefix ); + createvox( "dr_start_single_0", "dr_start_0" ); + createvox( "dr_start_2", "dr_start_1" ); + createvox( "dr_start_3", "dr_start_2" ); + createvox( "dr_cure_found_line", "dr_cure_found" ); + createvox( "dr_monkey_killer", "dr_monkey_0" ); + createvox( "dr_monkey_killee", "dr_monkey_1" ); + createvox( "dr_human_killed", "dr_kill_plr" ); + createvox( "dr_human_killer", "dr_kill_plr_2" ); + createvox( "dr_survival", "dr_plr_survive_0" ); + createvox( "dr_zurvival", "dr_zmb_survive_2" ); + createvox( "dr_countdown0", "dr_plr_survive_1" ); + createvox( "dr_countdown1", "dr_plr_survive_2" ); + createvox( "dr_countdown2", "dr_plr_survive_3" ); + createvox( "dr_ending", "dr_time_0" ); } -init_meatvox( prefix ) +init_meatvox( prefix ) //checked matches cerberus output { - init_gamemodecommonvox( prefix ); - createvox( "meat_drop", "drop", prefix ); - createvox( "meat_grab", "grab", prefix ); - createvox( "meat_grab_A", "team_cdc", prefix ); - createvox( "meat_grab_B", "team_cia", prefix ); - createvox( "meat_land", "land", prefix ); - createvox( "meat_hold", "hold", prefix ); - createvox( "meat_revive_1", "revive1", prefix ); - createvox( "meat_revive_2", "revive2", prefix ); - createvox( "meat_revive_3", "revive3", prefix ); - createvox( "meat_ring_splitter", "ring_tripple", prefix ); - createvox( "meat_ring_minigun", "ring_death", prefix ); - createvox( "meat_ring_ammo", "ring_ammo", prefix ); + init_gamemodecommonvox( prefix ); + createvox( "meat_drop", "drop", prefix ); + createvox( "meat_grab", "grab", prefix ); + createvox( "meat_grab_A", "team_cdc", prefix ); + createvox( "meat_grab_B", "team_cia", prefix ); + createvox( "meat_land", "land", prefix ); + createvox( "meat_hold", "hold", prefix ); + createvox( "meat_revive_1", "revive1", prefix ); + createvox( "meat_revive_2", "revive2", prefix ); + createvox( "meat_revive_3", "revive3", prefix ); + createvox( "meat_ring_splitter", "ring_tripple", prefix ); + createvox( "meat_ring_minigun", "ring_death", prefix ); + createvox( "meat_ring_ammo", "ring_ammo", prefix ); } -init_racevox( prefix, location ) +init_racevox( prefix, location ) //checked changed to match cerberus output { - init_gamemodecommonvox( prefix ); - - switch ( location ) - { - case "tunnel": - createvox( "rules", "rules_" + location, prefix ); - createvox( "countdown", "intro_" + location, prefix ); - break; - case "power": - createvox( "rules", "rules_" + location, prefix ); - createvox( "countdown", "intro_" + location, prefix ); - createvox( "lap1", "lap1", prefix ); - createvox( "lap2", "lap2", prefix ); - createvox( "lap_final", "lap_final", prefix ); - break; - case "farm": - createvox( "rules", "rules_" + location, prefix ); - createvox( "countdown", "intro_" + location, prefix ); - createvox( "hoop_area", "hoop_area", prefix ); - createvox( "hoop_miss", "hoop_miss", prefix ); - break; - default: - break; - } - - createvox( "race_room_2_ally", "room2_ally", prefix ); - createvox( "race_room_3_ally", "room3_ally", prefix ); - createvox( "race_room_4_ally", "room4_ally", prefix ); - createvox( "race_room_5_ally", "room5_ally", prefix ); - createvox( "race_room_2_axis", "room2_axis", prefix ); - createvox( "race_room_3_axis", "room3_axis", prefix ); - createvox( "race_room_4_axis", "room4_axis", prefix ); - createvox( "race_room_5_axis", "room5_axis", prefix ); - createvox( "race_ahead_1_ally", "ahead1_ally", prefix ); - createvox( "race_ahead_2_ally", "ahead2_ally", prefix ); - createvox( "race_ahead_3_ally", "ahead3_ally", prefix ); - createvox( "race_ahead_4_ally", "ahead4_ally", prefix ); - createvox( "race_ahead_1_axis", "ahead1_axis", prefix ); - createvox( "race_ahead_2_axis", "ahead2_axis", prefix ); - createvox( "race_ahead_3_axis", "ahead3_axis", prefix ); - createvox( "race_ahead_4_axis", "ahead4_axis", prefix ); - createvox( "race_kill_15", "door15", prefix ); - createvox( "race_kill_10", "door10", prefix ); - createvox( "race_kill_5", "door5", prefix ); - createvox( "race_kill_3", "door3", prefix ); - createvox( "race_kill_1", "door1", prefix ); - createvox( "race_door_open", "door_open", prefix ); - createvox( "race_door_nag", "door_nag", prefix ); - createvox( "race_grief_incoming", "grief_income_ammo", prefix ); - createvox( "race_grief_land", "grief_land", prefix ); - createvox( "race_laststand", "last_stand", prefix ); + init_gamemodecommonvox( prefix ); + switch( location ) + { + case "tunnel": + createvox( "rules", "rules_" + location, prefix ); + createvox( "countdown", "intro_" + location, prefix ); + break; + case "power": + createvox( "rules", "rules_" + location, prefix ); + createvox( "countdown", "intro_" + location, prefix ); + createvox( "lap1", "lap1", prefix ); + createvox( "lap2", "lap2", prefix ); + createvox( "lap_final", "lap_final", prefix ); + break; + case "farm": + createvox( "rules", "rules_" + location, prefix ); + createvox( "countdown", "intro_" + location, prefix ); + createvox( "hoop_area", "hoop_area", prefix ); + createvox( "hoop_miss", "hoop_miss", prefix ); + break; + default: + break; + createvox( "race_room_2_ally", "room2_ally", prefix ); + createvox( "race_room_3_ally", "room3_ally", prefix ); + createvox( "race_room_4_ally", "room4_ally", prefix ); + createvox( "race_room_5_ally", "room5_ally", prefix ); + createvox( "race_room_2_axis", "room2_axis", prefix ); + createvox( "race_room_3_axis", "room3_axis", prefix ); + createvox( "race_room_4_axis", "room4_axis", prefix ); + createvox( "race_room_5_axis", "room5_axis", prefix ); + createvox( "race_ahead_1_ally", "ahead1_ally", prefix ); + createvox( "race_ahead_2_ally", "ahead2_ally", prefix ); + createvox( "race_ahead_3_ally", "ahead3_ally", prefix ); + createvox( "race_ahead_4_ally", "ahead4_ally", prefix ); + createvox( "race_ahead_1_axis", "ahead1_axis", prefix ); + createvox( "race_ahead_2_axis", "ahead2_axis", prefix ); + createvox( "race_ahead_3_axis", "ahead3_axis", prefix ); + createvox( "race_ahead_4_axis", "ahead4_axis", prefix ); + createvox( "race_kill_15", "door15", prefix ); + createvox( "race_kill_10", "door10", prefix ); + createvox( "race_kill_5", "door5", prefix ); + createvox( "race_kill_3", "door3", prefix ); + createvox( "race_kill_1", "door1", prefix ); + createvox( "race_door_open", "door_open", prefix ); + createvox( "race_door_nag", "door_nag", prefix ); + createvox( "race_grief_incoming", "grief_income_ammo", prefix ); + createvox( "race_grief_land", "grief_land", prefix ); + createvox( "race_laststand", "last_stand", prefix ); + } } -createvox( type, alias, gametype ) +createvox( type, alias, gametype ) //checked matches cerberus output { - if ( !isdefined( gametype ) ) - gametype = ""; - else - gametype += "_"; - - game["zmbdialog"][type] = gametype + alias; + if ( !isDefined( gametype ) ) + { + gametype = ""; + } + else + { + gametype += "_"; + } + game[ "zmbdialog" ][ type ] = gametype + alias; } -announceroundwinner( winner, delay ) +announceroundwinner( winner, delay ) //checked changed to match cerberus output { - if ( isdefined( delay ) && delay > 0 ) - wait( delay ); - - if ( !isdefined( winner ) || isplayer( winner ) ) - return; - - if ( winner != "tied" ) - { - players = get_players(); - - foreach ( player in players ) - { - if ( isdefined( player._encounters_team ) && player._encounters_team == winner ) - { - winning_team = player.pers["team"]; - break; - } - } - - losing_team = getotherteam( winning_team ); - leaderdialog( "round_win", winning_team, undefined, 1 ); - leaderdialog( "round_lose", losing_team, undefined, 1 ); - } - else - leaderdialog( "round_tied", undefined, undefined, 1 ); + if ( isDefined( delay ) && delay > 0 ) + { + wait delay; + } + if ( !isDefined( winner ) || isplayer( winner ) ) + { + return; + } + if ( winner != "tied" ) + { + players = get_players(); + foreach ( player in players ) + { + if ( isdefined( player._encounters_team ) && player._encounters_team == winner ) + { + winning_team = player.pers[ "team" ]; + break; + } + } + losing_team = getotherteam( winning_team ); + leaderdialog( "round_win", winning_team, undefined, 1 ); + leaderdialog( "round_lose", losing_team, undefined, 1 ); + } + else + { + leaderdialog( "round_tied", undefined, undefined, 1 ); + } } -announcematchwinner( winner, delay ) +announcematchwinner( winner, delay ) //checked changed to match cerberus output { - if ( isdefined( delay ) && delay > 0 ) - wait( delay ); - - if ( !isdefined( winner ) || isplayer( winner ) ) - return; - - if ( winner != "tied" ) - { - players = get_players(); - - foreach ( player in players ) - { - if ( isdefined( player._encounters_team ) && player._encounters_team == winner ) - { - winning_team = player.pers["team"]; - break; - } - } - - losing_team = getotherteam( winning_team ); - leaderdialog( "match_win", winning_team, undefined, 1 ); - leaderdialog( "match_lose", losing_team, undefined, 1 ); - } - else - leaderdialog( "match_tied", undefined, undefined, 1 ); + if ( isDefined( delay ) && delay > 0 ) + { + wait delay; + } + if ( !isDefined( winner ) || isplayer( winner ) ) + { + return; + } + if ( winner != "tied" ) + { + players = get_players(); + foreach ( player in players ) + { + if ( isdefined( player._encounters_team ) && player._encounters_team == winner ) + { + winning_team = player.pers["team"]; + break; + } + } + losing_team = getotherteam( winning_team ); + leaderdialog( "match_win", winning_team, undefined, 1 ); + leaderdialog( "match_lose", losing_team, undefined, 1 ); + } + else + { + leaderdialog( "match_tied", undefined, undefined, 1 ); + } } -announcegamemoderules() +announcegamemoderules() //checked matches cerberus output { - if ( getdvar( _hash_C955B4CD ) == "town" ) - leaderdialog( "rules", undefined, undefined, undefined, 20 ); + if ( getDvar( "ui_zm_mapstartlocation" ) == "town" ) + { + leaderdialog( "rules", undefined, undefined, undefined, 20 ); + } } -leaderdialog( dialog, team, group, queue, waittime ) +leaderdialog( dialog, team, group, queue, waittime ) //checked changed to match cerberus output { -/# - assert( isdefined( level.players ) ); -#/ - if ( !isdefined( team ) ) - { - leaderdialogbothteams( dialog, "allies", dialog, "axis", group, queue, waittime ); - return; - } - - if ( level.splitscreen ) - { - if ( level.players.size ) - level.players[0] leaderdialogonplayer( dialog, group, queue, waittime ); - - return; - } - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - - if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) - player leaderdialogonplayer( dialog, group, queue, waittime ); - } + if ( !isDefined( team ) ) + { + leaderdialogbothteams( dialog, "allies", dialog, "axis", group, queue, waittime ); + return; + } + i = 0; + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[ i ]; + if ( isdefined ( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) + { + player leaderdialogonplayer( dialog, group, queue, waittime ); + } + } } -leaderdialogbothteams( dialog1, team1, dialog2, team2, group, queue, waittime ) +leaderdialogbothteams( dialog1, team1, dialog2, team2, group, queue, waittime ) //checked changed to match cerberus output { -/# - assert( isdefined( level.players ) ); -#/ - if ( level.splitscreen ) - { - if ( level.players.size ) - level.players[0] leaderdialogonplayer( dialog1, group, queue, waittime ); - - return; - } - - for ( i = 0; i < level.players.size; i++ ) - { - player = level.players[i]; - team = player.pers["team"]; - - if ( !isdefined( team ) ) - continue; - - if ( team == team1 ) - { - player leaderdialogonplayer( dialog1, group, queue, waittime ); - continue; - } - - if ( team == team2 ) - player leaderdialogonplayer( dialog2, group, queue, waittime ); - } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + team = players[ i ].pers[ "team" ]; + if ( !isdefined( team ) ) + { + return; + } + if ( team == team1 ) + { + players[ i ] leaderdialogonplayer( dialog1, group, queue, waittime ); + } + if ( team == team2 ) + { + players[ i ] leaderdialogonplayer( dialog2, group, queue, waittime ); + } + } } -leaderdialogonplayer( dialog, group, queue, waittime ) +leaderdialogonplayer( dialog, group, queue, waittime ) //checked changed to match cerberus output { - team = self.pers["team"]; - - if ( !isdefined( team ) ) - return; - - if ( team != "allies" && team != "axis" ) - return; - - if ( isdefined( group ) ) - { - if ( self.zmbdialoggroup == group ) - return; - - hadgroupdialog = isdefined( self.zmbdialoggroups[group] ); - self.zmbdialoggroups[group] = dialog; - dialog = group; - - if ( hadgroupdialog ) - return; - } - - if ( !self.zmbdialogactive ) - self thread playleaderdialogonplayer( dialog, team, waittime ); - else if ( isdefined( queue ) && queue ) - self.zmbdialogqueue[self.zmbdialogqueue.size] = dialog; + team = self.pers[ "team" ]; + if ( !isDefined( team ) ) + { + return; + } + if ( team != "allies" && team != "axis" ) + { + return; + } + if ( isDefined( group ) ) + { + if ( self.zmbdialoggroup == group ) + { + return; + } + hadgroupdialog = isDefined( self.zmbdialoggroups[ group ] ); + self.zmbdialoggroups[ group ] = dialog; + dialog = group; + if ( isDefined( hadgroupdialog ) && hadgroupdialog ) + { + return; + } + } + if ( !is_true( self.zmbdialogactive ) ) + { + self thread playleaderdialogonplayer( dialog, team, waittime ); + } + else if ( is_true( queue ) ) + { + self.zmbdialogqueue[ self.zmbdialogqueue.size ] = dialog; + } } -playleaderdialogonplayer( dialog, team, waittime ) +playleaderdialogonplayer( dialog, team, waittime ) //checked changed to match cerberus output { - self endon( "disconnect" ); + self endon( "disconnect" ); - if ( level.allowzmbannouncer ) - { - if ( !isdefined( game["zmbdialog"][dialog] ) ) - { -/# - if ( getdvarint( _hash_AEB127D ) > 0 ) - println( "DIALOG DEBUGGER: No VOX created for - " + dialog ); -#/ - return; - } - } - - self.zmbdialogactive = 1; - - if ( isdefined( self.zmbdialoggroups[dialog] ) ) - { - group = dialog; - dialog = self.zmbdialoggroups[group]; - self.zmbdialoggroups[group] = undefined; - self.zmbdialoggroup = group; - } - - if ( level.allowzmbannouncer ) - { - alias = game["zmbdialog"]["prefix"] + "_" + game["zmbdialog"][dialog]; - variant = self getleaderdialogvariant( alias ); - - if ( !isdefined( variant ) ) - full_alias = alias; - else - full_alias = alias + "_" + variant; - - self playlocalsound( full_alias ); - } - - if ( isdefined( waittime ) ) - wait( waittime ); - else - wait 4.0; - - self.zmbdialogactive = 0; - self.zmbdialoggroup = ""; - - if ( self.zmbdialogqueue.size > 0 && level.allowzmbannouncer ) - { - nextdialog = self.zmbdialogqueue[0]; - - for ( i = 1; i < self.zmbdialogqueue.size; i++ ) - self.zmbdialogqueue[i - 1] = self.zmbdialogqueue[i]; - - self.zmbdialogqueue[i - 1] = undefined; - self thread playleaderdialogonplayer( nextdialog, team ); - } + if ( level.allowzmbannouncer ) + { + if ( !isDefined( game[ "zmbdialog" ][ dialog ] ) ) + { + return; + } + } + self.zmbdialogactive = 1; + if ( isDefined( self.zmbdialoggroups[ dialog ] ) ) + { + group = dialog; + dialog = self.zmbdialoggroups[ group ]; + self.zmbdialoggroups[ group ] = undefined; + self.zmbdialoggroup = group; + } + if ( level.allowzmbannouncer ) + { + alias = game[ "zmbdialog" ][ "prefix" ] + "_" + game[ "zmbdialog" ][ dialog ]; + variant = self getleaderdialogvariant( alias ); + if ( !isDefined( variant ) ) + { + full_alias = alias; + } + else + { + full_alias = alias + "_" + variant; + } + self playlocalsound( full_alias ); + } + if ( isDefined( waittime ) ) + { + wait waittime; + } + else + { + wait 4; + } + self.zmbdialogactive = 0; + self.zmbdialoggroup = ""; + if ( self.zmbdialogqueue.size > 0 && level.allowzmbannouncer ) + { + nextdialog = self.zmbdialogqueue[0]; + for( i = 1; i < self.zmbdialogqueue.size; i++ ) + { + self.zmbdialogqueue[ i - 1 ] = self.zmbdialogqueue[ i ]; + } + self.zmbdialogqueue[ i - 1 ] = undefined; + self thread playleaderdialogonplayer( nextdialog, team ); + } } -getleaderdialogvariant( alias ) +getleaderdialogvariant( alias ) //checked changed to match cerberus output { - if ( !isdefined( alias ) ) - return; - - if ( !isdefined( level.announcer_dialog ) ) - { - level.announcer_dialog = []; - level.announcer_dialog_available = []; - } - - num_variants = maps\mp\zombies\_zm_spawner::get_number_variants( alias ); - - if ( num_variants <= 0 ) - { -/# - if ( getdvarint( _hash_AEB127D ) > 0 ) - println( "DIALOG DEBUGGER: No variants found for - " + alias ); -#/ - return undefined; - } - - for ( i = 0; i < num_variants; i++ ) - level.announcer_dialog[alias][i] = i; - - level.announcer_dialog_available[alias] = []; - - if ( level.announcer_dialog_available[alias].size <= 0 ) - level.announcer_dialog_available[alias] = level.announcer_dialog[alias]; - - variation = random( level.announcer_dialog_available[alias] ); - level.announcer_dialog_available[alias] = arrayremovevalue( level.announcer_dialog_available[alias], variation ); - return variation; + if ( !isDefined( alias ) ) + { + return; + } + if ( !isDefined( level.announcer_dialog ) ) + { + level.announcer_dialog = []; + level.announcer_dialog_available = []; + } + num_variants = maps/mp/zombies/_zm_spawner::get_number_variants( alias ); + if ( num_variants <= 0 ) + { + return undefined; + } + for ( i = 0; i < num_variants; i++ ) + { + level.announcer_dialog[ alias ][ i ] = i; + } + level.announcer_dialog_available[ alias ] = []; + if ( level.announcer_dialog_available[ alias ].size <= 0 ) + { + level.announcer_dialog_available[ alias ] = level.announcer_dialog[ alias ]; + } + variation = random( level.announcer_dialog_available[ alias ] ); + level.announcer_dialog_available[ alias ] = arrayremovevalue( level.announcer_dialog_available[ alias ], variation ); + return variation; } -getroundswitchdialog( switchtype ) +getroundswitchdialog( switchtype ) //checked matches cerberus output { - switch ( switchtype ) - { - case "halftime": - return "halftime"; - case "overtime": - return "overtime"; - default: - return "side_switch"; - } + switch( switchtype ) + { + case "halftime": + return "halftime"; + case "overtime": + return "overtime"; + default: + return "side_switch"; + } } -getotherteam( team ) +getotherteam( team ) //checked matches cerberus output { - if ( team == "allies" ) - return "axis"; - else - return "allies"; + if ( team == "allies" ) + { + return "axis"; + } + else + { + return "allies"; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_blockers.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_blockers.gsc index 5072438..550318b 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_blockers.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_blockers.gsc @@ -1,2288 +1,2351 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_net; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\zombies\_zm_score; -#include maps\mp\_demo; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_zonemgr; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_spawner; -#include maps\mp\zombies\_zm_unitrigger; +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_zonemgr; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/_demo; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/zombies/_zm_net; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - init_blockers(); - - if ( isdefined( level.quantum_bomb_register_result_func ) ) - [[ level.quantum_bomb_register_result_func ]]( "open_nearest_door", ::quantum_bomb_open_nearest_door_result, 35, ::quantum_bomb_open_nearest_door_validation ); + init_blockers(); + if ( isDefined( level.quantum_bomb_register_result_func ) ) + { + [[ level.quantum_bomb_register_result_func ]]( "open_nearest_door", ::quantum_bomb_open_nearest_door_result, 35, ::quantum_bomb_open_nearest_door_validation ); + } } -init_blockers() +init_blockers() //checked matches cerberus output { - level.exterior_goals = getstructarray( "exterior_goal", "targetname" ); - array_thread( level.exterior_goals, ::blocker_init ); - zombie_doors = getentarray( "zombie_door", "targetname" ); - - if ( isdefined( zombie_doors ) ) - { - flag_init( "door_can_close" ); - array_thread( zombie_doors, ::door_init ); - } - - zombie_debris = getentarray( "zombie_debris", "targetname" ); - array_thread( zombie_debris, ::debris_init ); - flag_blockers = getentarray( "flag_blocker", "targetname" ); - array_thread( flag_blockers, ::flag_blocker ); + level.exterior_goals = getstructarray( "exterior_goal", "targetname" ); + array_thread( level.exterior_goals, ::blocker_init ); + zombie_doors = getentarray( "zombie_door", "targetname" ); + if ( isDefined( zombie_doors ) ) + { + flag_init( "door_can_close" ); + array_thread( zombie_doors, ::door_init ); + } + zombie_debris = getentarray( "zombie_debris", "targetname" ); + array_thread( zombie_debris, ::debris_init ); + flag_blockers = getentarray( "flag_blocker", "targetname" ); + array_thread( flag_blockers, ::flag_blocker ); } -door_init() +door_init() //checked changed to match cerberus output { - self.type = undefined; - self.purchaser = undefined; - self._door_open = 0; - targets = getentarray( self.target, "targetname" ); - - if ( isdefined( self.script_flag ) && !isdefined( level.flag[self.script_flag] ) ) - { - if ( isdefined( self.script_flag ) ) - { - tokens = strtok( self.script_flag, "," ); - - for ( i = 0; i < tokens.size; i++ ) - flag_init( self.script_flag ); - } - } - - if ( !isdefined( self.script_noteworthy ) ) - self.script_noteworthy = "default"; - - self.doors = []; - - for ( i = 0; i < targets.size; i++ ) - { - targets[i] door_classify( self ); - - if ( !isdefined( targets[i].og_origin ) ) - { - targets[i].og_origin = targets[i].origin; - targets[i].og_angles = targets[i].angles; - } - } - - cost = 1000; - - if ( isdefined( self.zombie_cost ) ) - cost = self.zombie_cost; - - self setcursorhint( "HINT_NOICON" ); - self thread door_think(); - - if ( isdefined( self.script_noteworthy ) ) - { - if ( self.script_noteworthy == "electric_door" || self.script_noteworthy == "electric_buyable_door" ) - { - if ( getdvar( "ui_gametype" ) == "zgrief" ) - { - self setinvisibletoall(); - return; - } - - self sethintstring( &"ZOMBIE_NEED_POWER" ); - - if ( isdefined( level.door_dialog_function ) ) - self thread [[ level.door_dialog_function ]](); - - return; - } - else if ( self.script_noteworthy == "local_electric_door" ) - { - if ( getdvar( "ui_gametype" ) == "zgrief" ) - { - self setinvisibletoall(); - return; - } - - self sethintstring( &"ZOMBIE_NEED_LOCAL_POWER" ); - - if ( isdefined( level.door_dialog_function ) ) - self thread [[ level.door_dialog_function ]](); - - return; - } - else if ( self.script_noteworthy == "kill_counter_door" ) - { - self sethintstring( &"ZOMBIE_DOOR_ACTIVATE_COUNTER", cost ); - return; - } - } - - self set_hint_string( self, "default_buy_door", cost ); + self.type = undefined; + self.purchaser = undefined; + self._door_open = 0; + targets = getentarray( self.target, "targetname" ); + if ( isDefined( self.script_flag ) && !isDefined( level.flag[ self.script_flag ] ) ) + { + if ( isDefined( self.script_flag ) ) + { + tokens = strtok( self.script_flag, "," ); + for ( i = 0; i < tokens.size; i++ ) + { + flag_init( self.script_flag ); + } + } + } + if ( !isDefined( self.script_noteworthy ) ) + { + self.script_noteworthy = "default"; + } + self.doors = []; + for ( i = 0; i < targets.size; i++ ) + { + targets[ i ] door_classify( self ); + if ( !isDefined( targets[ i ].og_origin ) ) + { + targets[ i ].og_origin = targets[ i ].origin; + targets[ i ].og_angles = targets[ i ].angles; + } + } + cost = 1000; + if ( isDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + self setcursorhint( "HINT_NOICON" ); + self thread door_think(); + if ( isDefined( self.script_noteworthy ) ) + { + if ( self.script_noteworthy == "electric_door" || self.script_noteworthy == "electric_buyable_door" ) + { + if ( getDvar( "ui_gametype" ) == "zgrief" ) + { + self setinvisibletoall(); + return; + } + self sethintstring( &"ZOMBIE_NEED_POWER" ); + if ( isDefined( level.door_dialog_function ) ) + { + self thread [[ level.door_dialog_function ]](); + } + return; + } + else if ( self.script_noteworthy == "local_electric_door" ) + { + if ( getDvar( "ui_gametype" ) == "zgrief" ) + { + self setinvisibletoall(); + return; + } + self sethintstring( &"ZOMBIE_NEED_LOCAL_POWER" ); + if ( isDefined( level.door_dialog_function ) ) + { + self thread [[ level.door_dialog_function ]](); + } + return; + } + else if ( self.script_noteworthy == "kill_counter_door" ) + { + self sethintstring( &"ZOMBIE_DOOR_ACTIVATE_COUNTER", cost ); + return; + } + } + self set_hint_string( self, "default_buy_door", cost ); } -door_classify( parent_trig ) +door_classify( parent_trig ) //checked changed to match cerberus output { - if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "clip" ) - { - parent_trig.clip = self; - parent_trig.script_string = "clip"; - } - else if ( !isdefined( self.script_string ) ) - { - if ( isdefined( self.script_angles ) ) - self.script_string = "rotate"; - else if ( isdefined( self.script_vector ) ) - self.script_string = "move"; - } - else - { - if ( !isdefined( self.script_string ) ) - self.script_string = ""; + if ( isDefined( self.script_noteworthy ) && self.script_noteworthy == "clip" ) + { + parent_trig.clip = self; + parent_trig.script_string = "clip"; + } + else if ( !isDefined( self.script_string ) ) + { + if ( isDefined( self.script_angles ) ) + { + self.script_string = "rotate"; + } + else if ( isDefined( self.script_vector ) ) + { + self.script_string = "move"; + } + } + else if ( !isDefined( self.script_string ) ) + { + self.script_string = ""; + switch( self.script_string ) + { + case "anim": + /* + /# + assert( isDefined( self.script_animname ), "Blocker_init: You must specify a script_animname for " + self.targetname ); + #/ + /# + assert( isDefined( level.scr_anim[ self.script_animname ] ), "Blocker_init: You must define a level.scr_anim for script_anim -> " + self.script_animname ); + #/ + /# + assert( isDefined( level.blocker_anim_func ), "Blocker_init: You must define a level.blocker_anim_func" ); + #/ + */ + break; + case "counter_1s": + parent_trig.counter_1s = self; + return; + case "counter_10s": + parent_trig.counter_10s = self; + return; + case "counter_100s": + parent_trig.counter_100s = self; + return; + case "explosives": + if ( !isDefined( parent_trig.explosives ) ) + { + parent_trig.explosives = []; + } + parent_trig.explosives[ parent_trig.explosives.size ] = self; + return; + } + } + if ( self.classname == "script_brushmodel" ) + { + self disconnectpaths(); + } + parent_trig.doors[ parent_trig.doors.size ] = self; +} - switch ( self.script_string ) - { - case "anim": +door_buy() //checked matches cerberus output +{ + self waittill( "trigger", who, force ); + if ( isDefined( level.custom_door_buy_check ) ) + { + if ( !who [[ level.custom_door_buy_check ]]( self ) ) + { + return 0; + } + } + if ( getDvarInt( "zombie_unlock_all" ) > 0 || isDefined( force ) && force ) + { + return 1; + } + if ( !who usebuttonpressed() ) + { + return 0; + } + if ( who maps/mp/zombies/_zm_utility::in_revive_trigger() ) + { + return 0; + } + if ( maps/mp/zombies/_zm_utility::is_player_valid( who ) ) + { + players = get_players(); + cost = self.zombie_cost; + if ( who maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() ) + { + cost = who maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_double_points_cost( cost ); + } + if ( self._door_open == 1 ) + { + self.purchaser = undefined; + } + else if ( who.score >= cost ) + { + who maps/mp/zombies/_zm_score::minus_to_player_score( cost, 1 ); + maps/mp/_demo::bookmark( "zm_player_door", getTime(), who ); + who maps/mp/zombies/_zm_stats::increment_client_stat( "doors_purchased" ); + who maps/mp/zombies/_zm_stats::increment_player_stat( "doors_purchased" ); + self.purchaser = who; + } + else + { + play_sound_at_pos( "no_purchase", self.doors[ 0 ].origin ); + if ( isDefined( level.custom_generic_deny_vo_func ) ) + { + who thread [[ level.custom_generic_deny_vo_func ]]( 1 ); + } + else + { + who maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "door_deny" ); + } + return 0; + } + } + if ( isDefined( level._door_open_rumble_func ) ) + { + who thread [[ level._door_open_rumble_func ]](); + } + return 1; +} + +door_delay() //checked changed to match cerberus output +{ + if ( isDefined( self.explosives ) ) + { + for ( i = 0; i < self.explosives.size; i++ ) + { + self.explosives[ i ] show(); + } + } + if ( !isDefined( self.script_int ) ) + { + self.script_int = 5; + } + all_trigs = getentarray( self.target, "target" ); + for ( i = 0; i < all_trigs.size; i++ ) + { + all_trigs[ i ] trigger_off(); + } + wait self.script_int; + for ( i = 0; i < self.script_int; i++ ) + { + /* /# - assert( isdefined( self.script_animname ), "Blocker_init: You must specify a script_animname for " + self.targetname ); + iprintln( self.script_int - i ); +#/ + */ + wait 1; + } + if ( isDefined( self.explosives ) ) + { + for ( i = 0; i < self.explosives.size; i++ ) + { + playfx( level._effect[ "def_explosion" ], self.explosives[ i ].origin, anglesToForward( self.explosives[ i ].angles ) ); + self.explosives[ i ] hide(); + } + } +} + +door_activate( time, open, quick, use_blocker_clip_for_pathing ) //checked matches cerberus output +{ + if ( !isDefined( open ) ) + { + open = 1; + } + if ( !isDefined( time ) ) + { + time = 1; + if ( isDefined( self.script_transition_time ) ) + { + time = self.script_transition_time; + } + } + if ( isDefined( self.door_moving ) ) + { + if ( isDefined( self.script_noteworthy ) && self.script_noteworthy == "clip" || isDefined( self.script_string ) && self.script_string == "clip" ) + { + if ( !is_true( use_blocker_clip_for_pathing ) ) + { + if ( !open ) + { + return; + } + } + } + else + { + return; + } + } + self.door_moving = 1; + if ( open || !is_true( quick ) ) + { + self notsolid(); + } + if ( self.classname == "script_brushmodel" ) + { + if ( open ) + { + self connectpaths(); + } + } + if ( isDefined( self.script_noteworthy ) && self.script_noteworthy == "clip" || isDefined( self.script_string ) && self.script_string == "clip" ) + { + if ( !open ) + { + self delay_thread( time, ::self_disconnectpaths ); + wait 0.1; + self solid(); + } + return; + } + if ( isDefined( self.script_sound ) ) + { + if ( open ) + { + playsoundatposition( self.script_sound, self.origin ); + } + else + { + playsoundatposition( self.script_sound + "_close", self.origin ); + } + } + else + { + play_sound_at_pos( "door_slide_open", self.origin ); + } + scale = 1; + if ( !open ) + { + scale = -1; + } + switch( self.script_string ) + { + case "rotate": + if ( isDefined( self.script_angles ) ) + { + rot_angle = self.script_angles; + if ( !open ) + { + rot_angle = self.og_angles; + } + self rotateto( rot_angle, time, 0, 0 ); + self thread door_solid_thread(); + if ( !open ) + { + self thread disconnect_paths_when_done(); + } + } + wait randomfloat( 0.15 ); + break; + case "move": + case "slide_apart": + if ( isDefined( self.script_vector ) ) + { + vector = vectorScale( self.script_vector, scale ); + if ( time >= 0.5 ) + { + self moveto( self.origin + vector, time, time * 0.25, time * 0.25 ); + } + else + { + self moveto( self.origin + vector, time ); + } + self thread door_solid_thread(); + if ( !open ) + { + self thread disconnect_paths_when_done(); + } + } + wait randomfloat( 0.15 ); + break; + case "anim": + self [[ level.blocker_anim_func ]]( self.script_animname ); + self thread door_solid_thread_anim(); + wait randomfloat( 0.15 ); + break; + case "physics": + self thread physics_launch_door( self ); + wait 0.1; + break; + } + if ( isDefined( self.script_firefx ) ) + { + playfx( level._effect[ self.script_firefx ], self.origin ); + } +} + +kill_trapped_zombies( trigger ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop continue bug +{ + zombies = getaiarray( level.zombie_team ); + if ( !isDefined( zombies ) ) + { + return; + } + i = 0; + while ( i < zombies.size ) + { + if ( !isDefined( zombies[ i ] ) ) + { + i++; + continue; + } + if ( zombies[ i ] istouching( trigger ) ) + { + zombies[ i ].marked_for_recycle = 1; + zombies[ i ] dodamage( zombies[ i ].health + 666, trigger.origin, self ); + wait randomfloat( 0.15 ); + } + else if ( isDefined( level.custom_trapped_zombies ) ) + { + zombies[ i ] thread [[ level.custom_trapped_zombies ]](); + wait randomfloat( 0.15 ); + } + i++; + } +} + +any_player_touching( trigger ) //checked changed to match cerberus output +{ + foreach ( player in get_players() ) + { + if ( player istouching( trigger ) ) + { + return 1; + } + wait 0.01; + } + return 0; +} + +any_player_touching_any( trigger, more_triggers ) //checked changed to match cerberus output +{ + foreach ( player in get_players() ) + { + if ( is_player_valid( player, 0, 1 ) ) + { + if ( isDefined( trigger ) && player istouching( trigger ) ) + { + return 1; + } + if ( isDefined( more_triggers ) && more_triggers.size > 0 ) + { + foreach ( trig in more_triggers ) + { + if ( isDefined( trig ) && player istouching( trig ) ) + { + return 1; + } + } + } + } + } + return 0; +} + +any_zombie_touching_any( trigger, more_triggers ) //checked changed to match cerberus output +{ + zombies = getaiarray( level.zombie_team ); + foreach ( zombie in zombies ) + { + if ( isDefined( trigger ) && zombie istouching( trigger ) ) + { + return 1; + } + if ( isDefined( more_triggers ) && more_triggers.size > 0 ) + { + foreach ( trig in more_triggers ) + { + if ( isDefined( trig ) && zombie istouching( trig ) ) + { + return 1; + } + } + } + } + return 0; +} + +wait_trigger_clear( trigger, more_triggers, end_on ) //checked matches cerberus output +{ + self endon( end_on ); + while ( any_player_touching_any( trigger, more_triggers ) || any_zombie_touching_any( trigger, more_triggers ) ) + { + wait 1; + } + /* +/# + println( "ZM BLOCKER local door trigger clear\n" ); +#/ + */ + self notify( "trigger_clear" ); +} + +waittill_door_trigger_clear_local_power_off( trigger, all_trigs ) //checked matches cerberus output +{ + self endon( "trigger_clear" ); + while ( 1 ) + { + if ( isDefined( self.local_power_on ) && self.local_power_on ) + { + self waittill( "local_power_off" ); + } + /* +/# + println( "ZM BLOCKER local door power off\n" ); +#/ + */ + self wait_trigger_clear( trigger, all_trigs, "local_power_on" ); + } +} + +waittill_door_trigger_clear_global_power_off( trigger, all_trigs ) //checked matches cerberus output +{ + self endon( "trigger_clear" ); + while ( 1 ) + { + if ( isDefined( self.power_on ) && self.power_on ) + { + self waittill( "power_off" ); + } + /* +/# + println( "ZM BLOCKER global door power off\n" ); +#/ + */ + self wait_trigger_clear( trigger, all_trigs, "power_on" ); + } +} + +waittill_door_can_close() //checked changed to match cerberus output +{ + trigger = undefined; + if ( isDefined( self.door_hold_trigger ) ) + { + trigger = getent( self.door_hold_trigger, "targetname" ); + } + all_trigs = getentarray( self.target, "target" ); + switch ( self.script_noteworthy ) + { + case "local_electric_door": + if ( isDefined( trigger ) || isDefined( all_trigs ) ) + { + self waittill_door_trigger_clear_local_power_off( trigger, all_trigs ); + self thread kill_trapped_zombies( trigger ); + } + else if ( is_true( self.local_power_on ) ) + { + self waittill( "local_power_off" ); + } + return; + case "electric_door": + if ( isDefined( trigger ) || isDefined( all_trigs ) ) + { + self waittill_door_trigger_clear_global_power_off( trigger, all_trigs ); + if ( isDefined( trigger ) ) + { + self thread kill_trapped_zombies( trigger ); + } + } + else if ( is_true( self.power_on ) ) + { + self waittill( "power_off" ); + } + return; + } +} + +door_think() //checked changed to match cerberus output +{ + self endon( "kill_door_think" ); + cost = 1000; + if ( isDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + self sethintlowpriority( 1 ); + while ( 1 ) + { + switch ( self.script_noteworthy ) + { + case "local_electric_door": + if ( !is_true( self.local_power_on ) ) + { + self waittill( "local_power_on" ); + } + if ( !is_true( self._door_open ) ) + { + /* +/# + println( "ZM BLOCKER local door opened\n" ); +#/ + */ + self door_opened( cost, 1 ); + if ( !isDefined( self.power_cost ) ) + { + self.power_cost = 0; + } + self.power_cost += 200; + } + self sethintstring( "" ); + if ( is_true( level.local_doors_stay_open ) ) + { + return; + } + wait 3; + self waittill_door_can_close(); + self door_block(); + if ( is_true( self._door_open ) ) + { + /* +/# + println( "ZM BLOCKER local door closed\n" ); +#/ + */ + self door_opened( cost, 1 ); + } + self sethintstring( &"ZOMBIE_NEED_LOCAL_POWER" ); + wait 3; + continue; + case "electric_door": + if ( !is_true( self.power_on ) ) + { + self waittill( "power_on" ); + } + if ( !is_true( self._door_open ) ) + { + /* +/# + println( "ZM BLOCKER global door opened\n" ); +#/ + */ + self door_opened( cost, 1 ); + if ( !isDefined( self.power_cost ) ) + { + self.power_cost = 0; + } + self.power_cost += 200; + } + self sethintstring( "" ); + if ( is_true( level.local_doors_stay_open ) ) + { + return; + } + wait 3; + self waittill_door_can_close(); + self door_block(); + if ( is_true( self._door_open ) ) + { + /* +/# + println( "ZM BLOCKER global door closed\n" ); +#/ + */ + self door_opened( cost, 1 ); + } + self sethintstring( &"ZOMBIE_NEED_POWER" ); + wait 3; + continue; + case "electric_buyable_door": + flag_wait( "power_on" ); + self set_hint_string( self, "default_buy_door", cost ); + if ( !self door_buy() ) + { + continue; + } + break; + case "delay_door": + if ( !self door_buy() ) + { + continue; + } + self door_delay(); + break; + default: + if ( isDefined( level._default_door_custom_logic ) ) + { + self [[ level._default_door_custom_logic ]](); + break; + } + if ( !self door_buy() ) + { + continue; + } + break; + } + self door_opened( cost ); + if ( !flag( "door_can_close" ) ) + { + break; + } + } +} + +self_and_flag_wait( msg ) //checked matches cerberus output +{ + self endon( msg ); + if ( is_true( self.power_door_ignore_flag_wait ) ) + { + level waittill( "forever" ); + } + else + { + flag_wait( msg ); + } +} + +door_block() //checked changed to match cerberus output +{ + if ( isDefined( self.doors ) ) + { + for ( i = 0; i < self.doors.size; i++ ) + { + if ( isDefined( self.doors[ i ].script_noteworthy ) && self.doors[ i ].script_noteworthy == "clip" || isDefined( self.doors[ i ].script_string ) && self.doors[ i ].script_string == "clip" ) + { + self.doors[ i ] solid(); + } + } + } +} + +door_opened( cost, quick_close ) //checked partially changed to match cerberus output //did not foreach to prevent infinite loop with continues +{ + if ( is_true( self.door_is_moving ) ) + { + return; + } + self.has_been_opened = 1; + all_trigs = getentarray( self.target, "target" ); + self.door_is_moving = 1; + j = 0; + while ( j < all_trigs.size ) + { + all_trigs[ j ].door_is_moving = 1; + all_trigs[ j ] trigger_off(); + all_trigs[ j ].has_been_opened = 1; + if ( !isDefined( all_trigs[ j ]._door_open ) || all_trigs[ j ]._door_open == 0 ) + { + all_trigs[ j ]._door_open = 1; + all_trigs[ j ] notify( "door_opened" ); + level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "door_open" ); + } + else + { + all_trigs[ j ]._door_open = 0; + } + if ( isDefined( all_trigs[ j ].script_flag ) && all_trigs[ j ]._door_open == 1 ) + { + tokens = strtok( all_trigs[ j ].script_flag, "," ); + for ( i = 0; i < tokens.size; i++ ) + { + flag_set( tokens[ i ] ); + } + } + else if ( isDefined( all_trigs[ j ].script_flag ) && all_trigs[ j ]._door_open == 0 ) + { + tokens = strtok( all_trigs[ j ].script_flag, "," ); + for ( i = 0; i < tokens.size; i++ ) + { + flag_clear( tokens[ i ] ); + } + } + if ( is_true( quick_close ) ) + { + all_trigs[ j ] set_hint_string( all_trigs[ j ], "" ); + } + else if ( all_trigs[ j ]._door_open == 1 && flag( "door_can_close" ) ) + { + all_trigs[ j ] set_hint_string( all_trigs[ j ], "default_buy_door_close" ); + } + else if ( all_trigs[ j ]._door_open == 0 ) + { + all_trigs[ j ] set_hint_string( all_trigs[ j ], "default_buy_door", cost ); + } + j++; + } + level notify( "door_opened" ); + if ( isDefined( self.doors ) ) + { + is_script_model_door = 0; + have_moving_clip_for_door = 0; + use_blocker_clip_for_pathing = 0; + i = 0; + while ( i < self.doors.size ) + { + if ( is_true( door.ignore_use_blocker_clip_for_pathing_check ) ) + { + i++; + continue; + } + if ( door.classname == "script_model" ) + { + is_script_model_door = 1; + } + if ( door.classname == "script_brushmodel" && isDefined( door.script_noteworthy ) && door.script_noteworthy != "clip" || !isDefined( door.script_string ) && door.script_string != "clip" ) + { + have_moving_clip_for_door = 1; + } + i++; + } + if ( is_script_model_door && !have_moving_clip_for_door ) + { + use_blocker_clip_for_pathing = 1; + } + for ( i = 0; i < self.doors.size; i++ ) + { + self.doors[ i ] thread door_activate( self.doors[ i ].script_transition_time, self._door_open, quick_close, use_blocker_clip_for_pathing ); + } + if ( self.doors.size ) + { + play_sound_at_pos( "purchase", self.doors[ 0 ].origin ); + } + } + level.active_zone_names = maps/mp/zombies/_zm_zonemgr::get_active_zone_names(); + wait 1; + self.door_is_moving = 0; + foreach ( trig in all_trigs ) + { + trig.door_is_moving = 0; + } + if ( is_true( quick_close ) ) + { + for ( i = 0; i < all_trigs.size; i++ ) + { + all_trigs[ i ] trigger_on(); + } + return; + } + if ( flag( "door_can_close" ) ) + { + wait 2; + for ( i = 0; i < all_trigs.size; i++ ) + { + all_trigs[ i ] trigger_on(); + } + } +} + +physics_launch_door( door_trig ) //checked matches cerberus output +{ + vec = vectorScale( vectornormalize( self.script_vector ), 10 ); + self rotateroll( 5, 0.05 ); + wait 0.05; + self moveto( self.origin + vec, 0.1 ); + self waittill( "movedone" ); + self physicslaunch( self.origin, self.script_vector * 300 ); + wait 60; + self delete(); +} + +door_solid_thread() //checked changed to match cerberus output +{ + self waittill_either( "rotatedone", "movedone" ); + self.door_moving = undefined; + while ( 1 ) + { + players = get_players(); + player_touching = 0; + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ] istouching( self ) ) + { + player_touching = 1; + break; + } + } + if ( !player_touching ) + { + self solid(); + return; + } + wait 1; + } +} + +door_solid_thread_anim() //checked changed to match cerberus output +{ + self waittillmatch( "door_anim" ); + return "end"; + self.door_moving = undefined; + while ( 1 ) + { + players = get_players(); + player_touching = 0; + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ] istouching( self ) ) + { + player_touching = 1; + break; + } + } + if ( !player_touching ) + { + self solid(); + return; + } + wait 1; + } +} + +disconnect_paths_when_done() //checked matches cerberus output +{ + self waittill_either( "rotatedone", "movedone" ); + self disconnectpaths(); +} + +self_disconnectpaths() //checked matches cerberus output +{ + self disconnectpaths(); +} + +debris_init() //checked matches cerberus output +{ + cost = 1000; + if ( isDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + self set_hint_string( self, "default_buy_debris", cost ); + self setcursorhint( "HINT_NOICON" ); + if ( isDefined( self.script_flag ) && !isDefined( level.flag[ self.script_flag ] ) ) + { + flag_init( self.script_flag ); + } + self thread debris_think(); +} + +debris_think() //partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug due to continue +{ + if ( isDefined( level.custom_debris_function ) ) + { + self [[ level.custom_debris_function ]](); + } + while ( 1 ) + { + self waittill( "trigger", who, force ); + if ( getDvarInt( "zombie_unlock_all" ) > 0 || is_true( force ) ) + { + } + else + { + if ( !who usebuttonpressed() ) + { + continue; + } + if ( who maps/mp/zombies/_zm_utility::in_revive_trigger() ) + { + continue; + } + } + if ( maps/mp/zombies/_zm_utility::is_player_valid( who ) ) + { + players = get_players(); + if ( getDvarInt( "zombie_unlock_all" ) > 0 ) + { + } + else if ( who.score >= self.zombie_cost ) + { + who maps/mp/zombies/_zm_score::minus_to_player_score( self.zombie_cost ); + maps/mp/_demo::bookmark( "zm_player_door", getTime(), who ); + who maps/mp/zombies/_zm_stats::increment_client_stat( "doors_purchased" ); + who maps/mp/zombies/_zm_stats::increment_player_stat( "doors_purchased" ); + } + else + { + play_sound_at_pos( "no_purchase", self.origin ); + who maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "door_deny" ); + continue; + } + bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", who.name, who.score, level.round_number, self.zombie_cost, self.script_flag, self.origin, "door" ); + junk = getentarray( self.target, "targetname" ); + if ( isDefined( self.script_flag ) ) + { + tokens = strtok( self.script_flag, "," ); + for ( i = 0; i < tokens.size; i++ ) + { + flag_set( tokens[ i ] ); + } + } + play_sound_at_pos( "purchase", self.origin ); + level notify( "junk purchased" ); + move_ent = undefined; + clip = undefined; + i = 0; + while ( i < junk.size ) + { + junk[ i ] connectpaths(); + if ( isDefined( junk[ i ].script_noteworthy ) ) + { + if ( junk[ i ].script_noteworthy == "clip" ) + { + clip = junk[ i ]; + i++; + continue; + } + } + struct = undefined; + if ( isDefined( junk[ i ].script_linkto ) ) + { + struct = getstruct( junk[ i ].script_linkto, "script_linkname" ); + if ( isDefined( struct ) ) + { + move_ent = junk[ i ]; + junk[ i ] thread debris_move( struct ); + } + else + { + junk[ i ] delete(); + } + } + else + { + junk[ i ] delete(); + } + i++; + } + all_trigs = getentarray( self.target, "target" ); + for ( i = 0; i < all_trigs.size; i++ ) + { + all_trigs[ i ] delete(); + } + if ( isDefined( clip ) ) + { + if ( isDefined( move_ent ) ) + { + move_ent waittill( "movedone" ); + } + clip delete(); + } + break; + } + } +} + +debris_move( struct ) //checked changed to match cerberus output +{ + self script_delay(); + self notsolid(); + self play_sound_on_ent( "debris_move" ); + playsoundatposition( "zmb_lightning_l", self.origin ); + if ( isDefined( self.script_firefx ) ) + { + playfx( level._effect[ self.script_firefx ], self.origin ); + } + if ( isDefined( self.script_noteworthy ) ) + { + if ( self.script_noteworthy == "jiggle" ) + { + num = randomintrange( 3, 5 ); + og_angles = self.angles; + for ( i = 0; i < num; i++ ) + { + angles = og_angles + ( -5 + randomfloat( 10 ), -5 + randomfloat( 10 ), -5 + randomfloat( 10 ) ); + time = randomfloatrange( 0.1, 0.4 ); + self rotateto( angles, time ); + wait ( time - 0.05 ); + } + } + } + time = 0.5; + if ( isDefined( self.script_transition_time ) ) + { + time = self.script_transition_time; + } + self moveto( struct.origin, time, time * 0.5 ); + self rotateto( struct.angles, time * 0.75 ); + self waittill( "movedone" ); + if ( isDefined( self.script_fxid ) ) + { + playfx( level._effect[ self.script_fxid ], self.origin ); + playsoundatposition( "zmb_zombie_spawn", self.origin ); + } + self delete(); +} + +blocker_disconnect_paths( start_node, end_node, two_way ) //checked matches cerberus output +{ +} + +blocker_connect_paths( start_node, end_node, two_way ) //checked matches cerberus output +{ +} + +blocker_init() //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop caused by continue +{ + if ( !isDefined( self.target ) ) + { + return; + } + targets = getentarray( self.target, "targetname" ); + self.barrier_chunks = []; + j = 0; + while ( j < targets.size ) + { + if ( targets[ j ] iszbarrier() ) + { + if ( isDefined( level.zbarrier_override ) ) + { + self thread [[ level.zbarrier_override ]]( targets[ j ] ); + j++; + continue; + } + self.zbarrier = targets[ j ]; + if ( is_true( level.zbarrier_script_string_sets_collision ) ) + { + m_collision = "p6_anim_zm_barricade_board_collision"; + } + else + { + m_collision = "p6_anim_zm_barricade_board_collision"; + } + precachemodel( m_collision ); + self.zbarrier setzbarriercolmodel( m_collision ); + self.zbarrier.chunk_health = []; + for ( i = 0; i < self.zbarrier getnumzbarrierpieces(); i++ ) + { + self.zbarrier.chunk_health[ i ] = 0; + } + } + if ( isDefined( targets[ j ].script_string ) && targets[ j ].script_string == "rock" ) + { + targets[ j ].material = "rock"; + } + if ( isDefined( targets[ j ].script_parameters ) ) + { + if ( targets[ j ].script_parameters == "grate" ) + { + if ( isDefined( targets[ j ].script_noteworthy ) ) + { + if ( targets[ j ].script_noteworthy == "2" || targets[ j ].script_noteworthy == "3" || targets[ j ].script_noteworthy == "4" || targets[ j ].script_noteworthy == "5" || targets[ j ].script_noteworthy == "6" ) + { + targets[ j ] hide(); + /* +/# + iprintlnbold( " Hide " ); +#/ + */ + } + } + } + else if ( targets[ j ].script_parameters == "repair_board" ) + { + targets[ j ].unbroken_section = getent( targets[ j ].target, "targetname" ); + if ( isDefined( targets[ j ].unbroken_section ) ) + { + targets[ j ].unbroken_section linkto( targets[ j ] ); + targets[ j ] hide(); + targets[ j ] notsolid(); + targets[ j ].unbroken = 1; + if ( isDefined( targets[ j ].unbroken_section.script_noteworthy ) && targets[ j ].unbroken_section.script_noteworthy == "glass" ) + { + targets[ j ].material = "glass"; + targets[ j ] thread destructible_glass_barricade( targets[ j ].unbroken_section, self ); + } + else if ( isDefined( targets[ j ].unbroken_section.script_noteworthy ) && targets[ j ].unbroken_section.script_noteworthy == "metal" ) + { + targets[ j ].material = "metal"; + } + } + } + else if ( targets[ j ].script_parameters == "barricade_vents" ) + { + targets[ j ].material = "metal_vent"; + } + } + if ( isDefined( targets[ j ].targetname ) ) + { + if ( targets[ j ].targetname == "auto2" ) + { + } + } + targets[ j ] update_states( "repaired" ); + targets[ j ].destroyed = 0; + targets[ j ] show(); + targets[ j ].claimed = 0; + targets[ j ].anim_grate_index = 0; + targets[ j ].og_origin = targets[ j ].origin; + targets[ j ].og_angles = targets[ j ].angles; + self.barrier_chunks[ self.barrier_chunks.size ] = targets[ j ]; + j++; + } + target_nodes = getnodearray( self.target, "targetname" ); + for ( j = 0; j < target_nodes.size; j++ ) + { + if ( target_nodes[ j ].type == "Begin" ) + { + self.neg_start = target_nodes[ j ]; + if ( isDefined( self.neg_start.target ) ) + { + self.neg_end = getnode( self.neg_start.target, "targetname" ); + } + blocker_disconnect_paths( self.neg_start, self.neg_end ); + } + } + if ( isDefined( self.zbarrier ) ) + { + if ( isDefined( self.barrier_chunks ) ) + { + for ( i = 0; i < self.barrier_chunks.size; i++ ) + { + self.barrier_chunks[ i ] delete(); + } + self.barrier_chunks = []; + } + } + if ( isDefined( self.zbarrier ) && should_delete_zbarriers() ) + { + self.zbarrier delete(); + self.zbarrier = undefined; + return; + } + self blocker_attack_spots(); + self.trigger_location = getstruct( self.target, "targetname" ); + self thread blocker_think(); +} + +should_delete_zbarriers() //checked matches cerberus output +{ + gametype = getDvar( "ui_gametype" ); + if ( !maps/mp/zombies/_zm_utility::is_classic() && !maps/mp/zombies/_zm_utility::is_standard() && gametype != "zgrief" ) + { + return 1; + } + return 0; +} + +destructible_glass_barricade( unbroken_section, node ) //checked matches cerberus output +{ + unbroken_section setcandamage( 1 ); + unbroken_section.health = 99999; + unbroken_section waittill( "damage", amount, who ); + if ( maps/mp/zombies/_zm_utility::is_player_valid( who ) || who maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + self thread maps/mp/zombies/_zm_spawner::zombie_boardtear_offset_fx_horizontle( self, node ); + level thread remove_chunk( self, node, 1 ); + self update_states( "destroyed" ); + self notify( "destroyed" ); + self.unbroken = 0; + } +} + +blocker_attack_spots() //checked changed to match cerberus output //may need to review order of operations +{ + spots = []; + numslots = self.zbarrier getzbarriernumattackslots(); + numslots = int( max( numslots, 1 ) ); + if ( numslots % 2 ) + { + spots[ spots.size ] = groundpos_ignore_water_new( self.zbarrier.origin + vectorScale( ( 0, 0, 1 ), 60 ) ); + } + if ( numslots > 1 ) + { + reps = floor( numslots / 2 ); + slot = 1; + for ( i = 0; i < reps; i++ ) + { + offset = self.zbarrier getzbarrierattackslothorzoffset() * ( i + 1 ); + spots[ spots.size ] = groundpos_ignore_water_new( spots[ 0 ] + ( anglesToRight( self.angles ) * offset ) + vectorScale( ( 0, 0, 1 ), 60 ) ); + slot++; + if ( slot < numslots ) + { + spots[ spots.size ] = groundpos_ignore_water_new( spots[ 0 ] + ( anglesToRight( self.angles ) * ( offset * -1 ) ) + vectorScale( ( 0, 0, 1 ), 60 ) ); + slot++; + } + } + } + taken = []; + for ( i = 0; i < spots.size; i++ ) + { + taken[ i ] = 0; + } + self.attack_spots_taken = taken; + self.attack_spots = spots; + /* +/# + self thread debug_attack_spots_taken(); +#/ + */ +} + +blocker_choke() //checked matches cerberus output +{ + level._blocker_choke = 0; + level endon( "stop_blocker_think" ); + while ( 1 ) + { + wait 0.05; + level._blocker_choke = 0; + } +} + +blocker_think() //checked changed to match cerberus output +{ + level endon( "stop_blocker_think" ); + if ( !isDefined( level._blocker_choke ) ) + { + level thread blocker_choke(); + } + use_choke = 0; + if ( isDefined( level._use_choke_blockers ) && level._use_choke_blockers == 1 ) + { + use_choke = 1; + } + while ( 1 ) + { + wait 0.5; + if ( use_choke ) + { + if ( level._blocker_choke > 3 ) + { + wait 0.05; + } + } + level._blocker_choke++; + if ( all_chunks_intact( self, self.barrier_chunks ) ) + { + continue; + } + if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) + { + continue; + } + self blocker_trigger_think(); + } +} + +player_fails_blocker_repair_trigger_preamble( player, players, trigger, hold_required ) //checked matches cerberus output +{ + if ( !isDefined( trigger ) ) + { + return 1; + } + if ( !maps/mp/zombies/_zm_utility::is_player_valid( player ) ) + { + return 1; + } + if ( players.size == 1 && isDefined( players[ 0 ].intermission ) && players[ 0 ].intermission == 1 ) + { + return 1; + } + if ( hold_required && !player usebuttonpressed() ) + { + return 1; + } + if ( !hold_required && !player use_button_held() ) + { + return 1; + } + if ( player maps/mp/zombies/_zm_utility::in_revive_trigger() ) + { + return 1; + } + return 0; +} + +has_blocker_affecting_perk() //checked matches cerberus output +{ + has_perk = undefined; + if ( self hasperk( "specialty_fastreload" ) ) + { + has_perk = "specialty_fastreload"; + } + return has_perk; +} + +do_post_chunk_repair_delay( has_perk ) //checked matches cerberus output +{ + if ( !self script_delay() ) + { + wait 1; + } +} + +handle_post_board_repair_rewards( cost, zbarrier ) //checked matches cerberus output +{ + self maps/mp/zombies/_zm_stats::increment_client_stat( "boards" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "boards" ); + if ( isDefined( self.pers[ "boards" ] ) && ( self.pers[ "boards" ] % 10 ) == 0 ) + { + self thread do_player_general_vox( "general", "reboard", 90 ); + } + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_boards_updated( zbarrier ); + self.rebuild_barrier_reward += cost; + if ( self.rebuild_barrier_reward < level.zombie_vars[ "rebuild_barrier_cap_per_round" ] ) + { + self maps/mp/zombies/_zm_score::player_add_points( "rebuild_board", cost ); + self play_sound_on_ent( "purchase" ); + } + if ( isDefined( self.board_repair ) ) + { + self.board_repair += 1; + } +} + +blocker_unitrigger_think() //checked matches cerberus output +{ + self endon( "kill_trigger" ); + while ( 1 ) + { + self waittill( "trigger", player ); + self.stub.trigger_target notify( "trigger", player ); + } +} + +blocker_trigger_think() //checked changed to match cerberus output +{ + self endon( "blocker_hacked" ); + if ( is_true( level.no_board_repair ) ) + { + return; + } + /* +/# + println( "ZM >> TRIGGER blocker_trigger_think " ); +#/ + */ + level endon( "stop_blocker_think" ); + cost = 10; + if ( isDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + original_cost = cost; + if ( !isDefined( self.unitrigger_stub ) ) + { + radius = 94.21; + height = 94.21; + if ( isDefined( self.trigger_location ) ) + { + trigger_location = self.trigger_location; + } + else + { + trigger_location = self; + } + if ( isDefined( trigger_location.radius ) ) + { + radius = trigger_location.radius; + } + if ( isDefined( trigger_location.height ) ) + { + height = trigger_location.height; + } + trigger_pos = groundpos( trigger_location.origin ) + vectorScale( ( 0, 0, 1 ), 4 ); + self.unitrigger_stub = spawnstruct(); + self.unitrigger_stub.origin = trigger_pos; + self.unitrigger_stub.radius = radius; + self.unitrigger_stub.height = height; + self.unitrigger_stub.script_unitrigger_type = "unitrigger_radius"; + self.unitrigger_stub.hint_string = get_hint_string( self, "default_reward_barrier_piece" ); + self.unitrigger_stub.cursor_hint = "HINT_NOICON"; + self.unitrigger_stub.trigger_target = self; + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::blocker_unitrigger_think ); + maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); + if ( !isDefined( trigger_location.angles ) ) + { + trigger_location.angles = ( 0, 0, 0 ); + } + self.unitrigger_stub.origin = ( groundpos( trigger_location.origin ) + vectorScale( ( 0, 0, 1 ), 4 ) ) + ( anglesToForward( trigger_location.angles ) * -11 ); + } + self thread trigger_delete_on_repair(); + thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::blocker_unitrigger_think ); + /* +/# + if ( getDvarInt( "zombie_debug" ) > 0 ) + { + thread debug_blocker( trigger_pos, radius, height ); +#/ + } + */ + while ( 1 ) + { + self waittill( "trigger", player ); + has_perk = player has_blocker_affecting_perk(); + if ( all_chunks_intact( self, self.barrier_chunks ) ) + { + self notify( "all_boards_repaired" ); + return; + } + if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) + { + self notify( "no valid boards" ); + return; + } + if ( isDefined( level._zm_blocker_trigger_think_return_override ) ) + { + if ( self [[ level._zm_blocker_trigger_think_return_override ]]( player ) ) + { + return; + } + } + while ( 1 ) + { + players = get_players(); + if ( player_fails_blocker_repair_trigger_preamble( player, players, self.unitrigger_stub.trigger, 0 ) ) + { + break; + } + if ( isDefined( self.zbarrier ) ) + { + chunk = get_random_destroyed_chunk( self, self.barrier_chunks ); + self thread replace_chunk( self, chunk, has_perk, is_true( player.pers_upgrades_awarded[ "board" ] ) ); + } + else + { + chunk = get_random_destroyed_chunk( self, self.barrier_chunks ); + if ( isDefined( chunk.script_parameter ) || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) + { + if ( isDefined( chunk.unbroken_section ) ) + { + chunk show(); + chunk solid(); + chunk.unbroken_section self_delete(); + } + } + else + { + chunk show(); + } + if ( !isDefined( chunk.script_parameters ) || chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) + { + if ( !is_true( level.use_clientside_board_fx ) ) + { + if ( !isDefined( chunk.material ) || isDefined( chunk.material ) && chunk.material != "rock" ) + { + chunk play_sound_on_ent( "rebuild_barrier_piece" ); + } + playsoundatposition( "zmb_cha_ching", ( 0, 0, 0 ) ); + } + } + if ( chunk.script_parameters == "bar" ) + { + chunk play_sound_on_ent( "rebuild_barrier_piece" ); + playsoundatposition( "zmb_cha_ching", ( 0, 0, 0 ) ); + } + if ( isDefined( chunk.script_parameters ) ) + { + if ( chunk.script_parameters == "bar" ) + { + if ( isDefined( chunk.script_noteworthy ) ) + { + if ( chunk.script_noteworthy == "5" ) + { + chunk hide(); + break; + } + else if ( chunk.script_noteworthy == "3" ) + { + chunk hide(); + } + } + } + } + self thread replace_chunk( self, chunk, has_perk, is_true( player.pers_upgrades_awarded[ "board" ] ) ); + } + if ( isDefined( self.clip ) ) + { + self.clip enable_trigger(); + self.clip disconnectpaths(); + } + else + { + blocker_disconnect_paths( self.neg_start, self.neg_end ); + } + bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, original_cost, self.target, self.origin, "repair" ); + self do_post_chunk_repair_delay( has_perk ); + if ( !is_player_valid( player ) ) + { + break; + } + player handle_post_board_repair_rewards( cost, self ); + if ( all_chunks_intact( self, self.barrier_chunks ) ) + { + self notify( "all_boards_repaired" ); + return; + } + if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) + { + self notify( "no valid boards" ); + return; + } + } + } +} + +random_destroyed_chunk_show() //checked matches cerberus output +{ + wait 0.5; + self show(); +} + +door_repaired_rumble_n_sound() //checked changed to match cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( distance( players[ i ].origin, self.origin ) < 150 ) + { + if ( isalive( players[ i ] ) ) + { + players[ i ] thread board_completion(); + } + } + } +} + +board_completion() //checked matches cerberus output +{ + self endon( "disconnect" ); +} + +trigger_delete_on_repair() //checked changed to match cerberus output +{ + while ( 1 ) + { + self waittill_either( "all_boards_repaired", "no valid boards" ); + maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); + break; + } +} + +rebuild_barrier_reward_reset() //checked matches cerberus output +{ + self.rebuild_barrier_reward = 0; +} + +remove_chunk( chunk, node, destroy_immediately, zomb ) //checked changed to match cerberus output +{ + chunk update_states( "mid_tear" ); + if ( isDefined( chunk.script_parameters ) ) + { + if ( chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) + { + chunk thread zombie_boardtear_audio_offset( chunk ); + } + } + if ( isDefined( chunk.script_parameters ) ) + { + if ( chunk.script_parameters == "bar" ) + { + chunk thread zombie_bartear_audio_offset( chunk ); + } + } + chunk notsolid(); + fx = "wood_chunk_destory"; + if ( isDefined( self.script_fxid ) ) + { + fx = self.script_fxid; + } + if ( is_true( chunk.script_moveoverride ) ) + { + chunk hide(); + } + if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "bar" ) + { + if ( isDefined( chunk.script_noteworthy ) && chunk.script_noteworthy == "4" ) + { + ent = spawn( "script_origin", chunk.origin ); + ent.angles = node.angles + vectorScale( ( 0, 1, 0 ), 180 ); + dist = 100; + if ( isDefined( chunk.script_move_dist ) ) + { + dist_max = chunk.script_move_dist - 100; + dist = 100 + randomint( dist_max ); + } + else + { + dist = 100 + randomint( 100 ); + } + dest = ent.origin + ( anglesToForward( ent.angles ) * dist ); + trace = bullettrace( dest + vectorScale( ( 0, 0, 1 ), 16 ), dest + vectorScale( ( 0, 0, -1 ), 200 ), 0, undefined ); + if ( trace[ "fraction" ] == 1 ) + { + dest += vectorScale( ( 0, 0, -1 ), 200 ); + } + else + { + dest = trace[ "position" ]; + } + chunk linkto( ent ); + time = ent fake_physicslaunch( dest, 300 + randomint( 100 ) ); + if ( randomint( 100 ) > 40 ) + { + ent rotatepitch( 180, time * 0.5 ); + } + else + { + ent rotatepitch( 90, time, time * 0.5 ); + } + wait time; + chunk hide(); + wait 0.1; + ent delete(); + } + else + { + ent = spawn( "script_origin", chunk.origin ); + ent.angles = node.angles + vectorScale( ( 0, 1, 0 ), 180 ); + dist = 100; + if ( isDefined( chunk.script_move_dist ) ) + { + dist_max = chunk.script_move_dist - 100; + dist = 100 + randomint( dist_max ); + } + else + { + dist = 100 + randomint( 100 ); + } + dest = ent.origin + ( anglesToForward( ent.angles ) * dist ); + trace = bullettrace( dest + vectorScale( ( 0, 0, 1 ), 16 ), dest + vectorScale( ( 0, 0, -1 ), 200 ), 0, undefined ); + if ( trace[ "fraction" ] == 1 ) + { + dest += vectorScale( ( 0, 0, -1 ), 200 ); + } + else + { + dest = trace[ "position" ]; + } + chunk linkto( ent ); + time = ent fake_physicslaunch( dest, 260 + randomint( 100 ) ); + if ( randomint( 100 ) > 40 ) + { + ent rotatepitch( 180, time * 0,5 ); + } + else + { + ent rotatepitch( 90, time, time * 0,5 ); + } + wait time; + chunk hide(); + wait 0.1; + ent delete(); + } + chunk update_states( "destroyed" ); + chunk notify( "destroyed" ); + } + if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "board" || isDefined( chunk.script_parameters ) && chunk.script_parameters == "repair_board" || isDefined( chunk.script_parameters ) && chunk.script_parameters == "barricade_vents" ) + { + ent = spawn( "script_origin", chunk.origin ); + ent.angles = node.angles + vectorScale( ( 0, 1, 0 ), 180 ); + dist = 100; + if ( isDefined( chunk.script_move_dist ) ) + { + dist_max = chunk.script_move_dist - 100; + dist = 100 + randomint( dist_max ); + } + else + { + dist = 100 + randomint( 100 ); + } + dest = ent.origin + ( anglesToForward( ent.angles ) * dist ); + trace = bullettrace( dest + vectorScale( ( 0, 0, 1 ), 16 ), dest + vectorScale( ( 0, 0, -1 ), 200 ), 0, undefined ); + if ( trace[ "fraction" ] == 1 ) + { + dest += vectorScale( ( 0, 0, -1 ), 200 ); + } + else + { + dest = trace[ "position" ]; + } + chunk linkto( ent ); + time = ent fake_physicslaunch( dest, 200 + randomint( 100 ) ); + if ( isDefined( chunk.unbroken_section ) ) + { + if ( !isDefined( chunk.material ) || chunk.material != "metal" ) + { + chunk.unbroken_section self_delete(); + } + } + if ( randomint( 100 ) > 40 ) + { + ent rotatepitch( 180, time * 0.5 ); + } + else + { + ent rotatepitch( 90, time, time * 0.5 ); + } + wait time; + if ( isDefined( chunk.unbroken_section ) ) + { + if ( isDefined( chunk.material ) && chunk.material == "metal" ) + { + chunk.unbroken_section self_delete(); + } + } + chunk hide(); + wait 0.1; + ent delete(); + chunk update_states( "destroyed" ); + chunk notify( "destroyed" ); + } + if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "grate" ) + { + if ( isDefined( chunk.script_noteworthy ) && chunk.script_noteworthy == "6" ) + { + ent = spawn( "script_origin", chunk.origin ); + ent.angles = node.angles + vectorScale( ( 0, 1, 0 ), 180 ); + dist = 100 + randomint( 100 ); + dest = ent.origin + ( anglesToForward( ent.angles ) * dist ); + trace = bullettrace( dest + vectorScale( ( 0, 0, 1 ), 16 ), dest + vectorScale( ( 0, 0, -1 ), 200 ), 0, undefined ); + if ( trace[ "fraction" ] == 1 ) + { + dest += vectorScale( ( 0, 0, -1 ), 200 ); + } + else + { + dest = trace[ "position" ]; + } + chunk linkto( ent ); + time = ent fake_physicslaunch( dest, 200 + randomint( 100 ) ); + if ( randomint( 100 ) > 40 ) + { + ent rotatepitch( 180, time * 0.5 ); + } + else + { + ent rotatepitch( 90, time, time * 0.5 ); + } + wait time; + chunk hide(); + ent delete(); + chunk update_states( "destroyed" ); + chunk notify( "destroyed" ); + return; + } + else + { + chunk hide(); + chunk update_states( "destroyed" ); + chunk notify( "destroyed" ); + } + } +} + +remove_chunk_rotate_grate( chunk ) //checked changed to match cerberus output +{ + if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "grate" ) + { + chunk vibrate( vectorScale( ( 0, 1, 0 ), 270 ), 0.2, 0.4, 0.4 ); + return; + } +} + +zombie_boardtear_audio_offset( chunk ) //checked changed to match cerberus output +{ + if ( isDefined( chunk.material ) && !isDefined( chunk.already_broken ) ) + { + chunk.already_broken = 0; + } + if ( isDefined( chunk.material ) && chunk.material == "glass" && chunk.already_broken == 0 ) + { + chunk playsound( "zmb_break_glass_barrier" ); + wait randomfloatrange( 0.3, 0.6 ); + chunk playsound( "zmb_break_glass_barrier" ); + chunk.already_broken = 1; + } + else if ( isDefined( chunk.material ) && chunk.material == "metal" && chunk.already_broken == 0 ) + { + chunk playsound( "grab_metal_bar" ); + wait randomfloatrange( 0.3, 0.6 ); + chunk playsound( "break_metal_bar" ); + chunk.already_broken = 1; + } + else if ( isDefined( chunk.material ) && chunk.material == "rock" ) + { + if ( !is_true( level.use_clientside_rock_tearin_fx ) ) + { + chunk playsound( "zmb_break_rock_barrier" ); + wait randomfloatrange( 0.3, 0.6 ); + chunk playsound( "zmb_break_rock_barrier" ); + } + chunk.already_broken = 1; + } + else if ( isDefined( chunk.material ) && chunk.material == "metal_vent" ) + { + if ( !is_true( level.use_clientside_board_fx ) ) + { + chunk playsound( "evt_vent_slat_remove" ); + } + } + else if ( !is_true( level.use_clientside_board_fx ) ) + { + chunk play_sound_on_ent( "break_barrier_piece" ); + wait randomfloatrange( 0.3, 0.6 ); + chunk play_sound_on_ent( "break_barrier_piece" ); + } + chunk.already_broken = 1; +} + +zombie_bartear_audio_offset( chunk ) //checked matches cerberus output +{ + chunk play_sound_on_ent( "grab_metal_bar" ); + wait randomfloatrange( 0.3, 0.6 ); + chunk play_sound_on_ent( "break_metal_bar" ); + wait randomfloatrange( 1, 1.3 ); + chunk play_sound_on_ent( "drop_metal_bar" ); +} + +ensure_chunk_is_back_to_origin( chunk ) //checked matches cerberus output +{ + if ( chunk.origin != chunk.og_origin ) + { + chunk notsolid(); + chunk waittill( "movedone" ); + } +} + +replace_chunk( barrier, chunk, perk, upgrade, via_powerup ) //checked changed to match cerberus output +{ + if ( !isDefined( barrier.zbarrier ) ) + { + chunk update_states( "mid_repair" ); + /* +/# + assert( isDefined( chunk.og_origin ) ); #/ /# - assert( isdefined( level.scr_anim[self.script_animname] ), "Blocker_init: You must define a level.scr_anim for script_anim -> " + self.script_animname ); + assert( isDefined( chunk.og_angles ) ); #/ + */ + sound = "rebuild_barrier_hover"; + if ( isDefined( chunk.script_presound ) ) + { + sound = chunk.script_presound; + } + } + has_perk = 0; + if ( isDefined( perk ) ) + { + has_perk = 1; + } + if ( !isDefined( via_powerup ) && isDefined( sound ) ) + { + play_sound_at_pos( sound, chunk.origin ); + } + if ( upgrade ) + { + barrier.zbarrier zbarrierpieceuseupgradedmodel( chunk ); + barrier.zbarrier.chunk_health[ chunk ] = barrier.zbarrier getupgradedpiecenumlives( chunk ); + } + else + { + barrier.zbarrier zbarrierpieceusedefaultmodel( chunk ); + barrier.zbarrier.chunk_health[ chunk ] = 0; + } + scalar = 1; + if ( has_perk ) + { + if ( perk == "speciality_fastreload" ) + { + scalar = 0.31; + } + else if ( perk == "speciality_fastreload_upgrade" ) + { + scalar = 0.2112; + } + } + barrier.zbarrier showzbarrierpiece( chunk ); + barrier.zbarrier setzbarrierpiecestate( chunk, "closing", scalar ); + waitduration = barrier.zbarrier getzbarrierpieceanimlengthforstate( chunk, "closing", scalar ); + wait waitduration; +} + +open_all_zbarriers() //checked partially changed to match cerberus output //did not change while loop to for loop because of infinite continue loop bug +{ + i = 0; + while ( i < level.exterior_goals.size ) + { + if ( isDefined( level.exterior_goals[ i ].zbarrier ) ) + { + for ( x = 0; x < level.exterior_goals[ i ].zbarrier getnumzbarrierpieces(); x++ ) + { + level.exterior_goals[ i ].zbarrier setzbarrierpiecestate( x, "opening" ); + } + } + if ( isDefined( level.exterior_goals[ i ].clip ) ) + { + level.exterior_goals[ i ].clip disable_trigger(); + level.exterior_goals[ i ].clip connectpaths(); + } + else + { + blocker_connect_paths( level.exterior_goals[ i ].neg_start, level.exterior_goals[ i ].neg_end ); + } + i++; + } +} + +zombie_boardtear_audio_plus_fx_offset_repair_horizontal( chunk ) //checked changed to match cerberus output +{ + if ( isDefined( chunk.material ) && chunk.material == "rock" ) + { + if ( is_true( level.use_clientside_rock_tearin_fx ) ) + { + chunk clearclientflag( level._zombie_scriptmover_flag_rock_fx ); + } + else + { + earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, 1 ), 30 ) ); + wait randomfloatrange( 0.3, 0.6 ); + chunk play_sound_on_ent( "break_barrier_piece" ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, -1 ), 30 ) ); + } + } + else if ( is_true( level.use_clientside_board_fx ) ) + { + chunk clearclientflag( level._zombie_scriptmover_flag_board_horizontal_fx ); + } + else + { + earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, 1 ), 30 ) ); + wait randomfloatrange( 0.3, 0.6 ); + chunk play_sound_on_ent( "break_barrier_piece" ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, -1 ), 30 ) ); + } +} + +zombie_boardtear_audio_plus_fx_offset_repair_verticle( chunk ) //checked changed to match cerberus output +{ + if ( isDefined( chunk.material ) && chunk.material == "rock" ) + { + if ( is_true( level.use_clientside_rock_tearin_fx ) ) + { + chunk clearclientflag( level._zombie_scriptmover_flag_rock_fx ); + } + else + { + earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 1, 0, 0 ), 30 ) ); + wait randomfloatrange( 0.3, 0.6 ); + chunk play_sound_on_ent( "break_barrier_piece" ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + } + } + else if ( is_true( level.use_clientside_board_fx ) ) + { + chunk clearclientflag( level._zombie_scriptmover_flag_board_vertical_fx ); + } + else + { + earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 1, 0, 0 ), 30 ) ); + wait randomfloatrange( 0.3, 0.6 ); + chunk play_sound_on_ent( "break_barrier_piece" ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + } +} + +zombie_gratetear_audio_plus_fx_offset_repair_horizontal( chunk ) //checked matches cerberus output +{ + earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); + chunk play_sound_on_ent( "bar_rebuild_slam" ); + switch( randomint( 9 ) ) + { + case 0: + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + wait randomfloatrange( 0, 0.3 ); + playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + case 1: + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + wait randomfloatrange( 0, 0.3 ); + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + case 2: + playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + wait randomfloatrange( 0, 0.3 ); + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + case 3: + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + wait randomfloatrange( 0, 0.3 ); + playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + case 4: + playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + wait randomfloatrange( 0, 0.3 ); + playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + case 5: + playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + case 6: + playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + case 7: + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + case 8: + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + break; + } +} + +zombie_bartear_audio_plus_fx_offset_repair_horizontal( chunk ) //checked matches cerberus output +{ + earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); + chunk play_sound_on_ent( "bar_rebuild_slam" ); + switch( randomint( 9 ) ) + { + case 0: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); + break; + case 1: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); + break; + case 2: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); + break; + case 3: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); + break; + case 4: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); + break; + case 5: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); + break; + case 6: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); + break; + case 7: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_left" ); + break; + case 8: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); + break; + } +} + +zombie_bartear_audio_plus_fx_offset_repair_verticle( chunk ) //checked matches cerberus output +{ + earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); + chunk play_sound_on_ent( "bar_rebuild_slam" ); + switch( randomint( 9 ) ) + { + case 0: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); + break; + case 1: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); + break; + case 2: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); + break; + case 3: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); + break; + case 4: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); + break; + case 5: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); + break; + case 6: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); + break; + case 7: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); + break; + case 8: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); + break; + } +} + +add_new_zombie_spawners() //checked changed to match cerberus output +{ + if ( isDefined( self.target ) ) + { + self.possible_spawners = getentarray( self.target, "targetname" ); + } + if ( isDefined( self.script_string ) ) + { + spawners = getentarray( self.script_string, "targetname" ); + self.possible_spawners = arraycombine( self.possible_spawners, spawners, 1, 0 ); + } + if ( !isDefined( self.possible_spawners ) ) + { + return; + } + zombies_to_add = self.possible_spawners; + for ( i = 0; i < self.possible_spawners.size; i++ ) + { + self.possible_spawners[ i ].is_enabled = 1; + add_spawner( self.possible_spawners[ i ] ); + } +} + +flag_blocker() //checked matches cerberus output +{ + if ( !isDefined( self.script_flag_wait ) ) + { + /* /# - assert( isdefined( level.blocker_anim_func ), "Blocker_init: You must define a level.blocker_anim_func" ); + assertmsg( "Flag Blocker at " + self.origin + " does not have a script_flag_wait key value pair" ); #/ - break; - case "counter_1s": - parent_trig.counter_1s = self; - return; - case "counter_10s": - parent_trig.counter_10s = self; - return; - case "counter_100s": - parent_trig.counter_100s = self; - return; - case "explosives": - if ( !isdefined( parent_trig.explosives ) ) - parent_trig.explosives = []; - - parent_trig.explosives[parent_trig.explosives.size] = self; - return; - } - } - - if ( self.classname == "script_brushmodel" ) - self disconnectpaths(); - - parent_trig.doors[parent_trig.doors.size] = self; -} - -door_buy() -{ - self waittill( "trigger", who, force ); - - if ( isdefined( level.custom_door_buy_check ) ) - { - if ( !who [[ level.custom_door_buy_check ]]( self ) ) - return false; - } - - if ( getdvarint( _hash_2ECA0C0E ) > 0 || isdefined( force ) && force ) - return true; - - if ( !who usebuttonpressed() ) - return false; - - if ( who in_revive_trigger() ) - return false; - - if ( is_player_valid( who ) ) - { - players = get_players(); - cost = self.zombie_cost; - - if ( who maps\mp\zombies\_zm_pers_upgrades_functions::is_pers_double_points_active() ) - cost = who maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_double_points_cost( cost ); - - if ( self._door_open == 1 ) - self.purchaser = undefined; - else if ( who.score >= cost ) - { - who maps\mp\zombies\_zm_score::minus_to_player_score( cost, 1 ); - maps\mp\_demo::bookmark( "zm_player_door", gettime(), who ); - who maps\mp\zombies\_zm_stats::increment_client_stat( "doors_purchased" ); - who maps\mp\zombies\_zm_stats::increment_player_stat( "doors_purchased" ); - self.purchaser = who; - } - else - { - play_sound_at_pos( "no_purchase", self.doors[0].origin ); - - if ( isdefined( level.custom_generic_deny_vo_func ) ) - who thread [[ level.custom_generic_deny_vo_func ]]( 1 ); - else - who maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "door_deny" ); - - return false; - } - } - - if ( isdefined( level._door_open_rumble_func ) ) - who thread [[ level._door_open_rumble_func ]](); - - return true; -} - -door_delay() -{ - if ( isdefined( self.explosives ) ) - { - for ( i = 0; i < self.explosives.size; i++ ) - self.explosives[i] show(); - } - - if ( !isdefined( self.script_int ) ) - self.script_int = 5; - - all_trigs = getentarray( self.target, "target" ); - - for ( i = 0; i < all_trigs.size; i++ ) - all_trigs[i] trigger_off(); - - wait( self.script_int ); - - for ( i = 0; i < self.script_int; i++ ) - { + */ + return; + } + if ( !isDefined( level.flag[ self.script_flag_wait ] ) ) + { + flag_init( self.script_flag_wait ); + } + type = "connectpaths"; + if ( isDefined( self.script_noteworthy ) ) + { + type = self.script_noteworthy; + } + flag_wait( self.script_flag_wait ); + self script_delay(); + if ( type == "connectpaths" ) + { + self connectpaths(); + self disable_trigger(); + return; + } + if ( type == "disconnectpaths" ) + { + self disconnectpaths(); + self disable_trigger(); + return; + } + /* /# - iprintln( self.script_int - i ); + assertmsg( "flag blocker at " + self.origin + ", the type "" + type + "" is not recognized" ); #/ - wait 1; - } - - if ( isdefined( self.explosives ) ) - { - for ( i = 0; i < self.explosives.size; i++ ) - { - playfx( level._effect["def_explosion"], self.explosives[i].origin, anglestoforward( self.explosives[i].angles ) ); - self.explosives[i] hide(); - } - } + */ } -door_activate( time, open, quick, use_blocker_clip_for_pathing ) +update_states( states ) //checked matches cerberus output { - if ( !isdefined( open ) ) - open = 1; - - if ( !isdefined( time ) ) - { - time = 1; - - if ( isdefined( self.script_transition_time ) ) - time = self.script_transition_time; - } - - if ( isdefined( self.door_moving ) ) - { - if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "clip" || isdefined( self.script_string ) && self.script_string == "clip" ) - { - if ( !is_true( use_blocker_clip_for_pathing ) ) - { - if ( !open ) - return; - } - } - else - return; - } - - self.door_moving = 1; - - if ( open || !( isdefined( quick ) && quick ) ) - self notsolid(); - - if ( self.classname == "script_brushmodel" ) - { - if ( open ) - self connectpaths(); - } - - if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "clip" || isdefined( self.script_string ) && self.script_string == "clip" ) - { - if ( !open ) - { - self delay_thread( time, ::self_disconnectpaths ); - wait 0.1; - self solid(); - } - - return; - } - - if ( isdefined( self.script_sound ) ) - { - if ( open ) - playsoundatposition( self.script_sound, self.origin ); - else - playsoundatposition( self.script_sound + "_close", self.origin ); - } - else - play_sound_at_pos( "door_slide_open", self.origin ); - - scale = 1; - - if ( !open ) - scale = -1; - - switch ( self.script_string ) - { - case "rotate": - if ( isdefined( self.script_angles ) ) - { - rot_angle = self.script_angles; - - if ( !open ) - rot_angle = self.og_angles; - - self rotateto( rot_angle, time, 0, 0 ); - self thread door_solid_thread(); - - if ( !open ) - self thread disconnect_paths_when_done(); - } - - wait( randomfloat( 0.15 ) ); - break; - case "slide_apart": - case "move": - if ( isdefined( self.script_vector ) ) - { - vector = vectorscale( self.script_vector, scale ); - - if ( time >= 0.5 ) - self moveto( self.origin + vector, time, time * 0.25, time * 0.25 ); - else - self moveto( self.origin + vector, time ); - - self thread door_solid_thread(); - - if ( !open ) - self thread disconnect_paths_when_done(); - } - - wait( randomfloat( 0.15 ) ); - break; - case "anim": - self [[ level.blocker_anim_func ]]( self.script_animname ); - self thread door_solid_thread_anim(); - wait( randomfloat( 0.15 ) ); - break; - case "physics": - self thread physics_launch_door( self ); - wait 0.1; - break; - } - - if ( isdefined( self.script_firefx ) ) - playfx( level._effect[self.script_firefx], self.origin ); -} - -kill_trapped_zombies( trigger ) -{ - zombies = getaiarray( level.zombie_team ); - - if ( !isdefined( zombies ) ) - return; - - for ( i = 0; i < zombies.size; i++ ) - { - if ( !isdefined( zombies[i] ) ) - continue; - - if ( zombies[i] istouching( trigger ) ) - { - zombies[i].marked_for_recycle = 1; - zombies[i] dodamage( zombies[i].health + 666, trigger.origin, self ); - wait( randomfloat( 0.15 ) ); - continue; - } - - if ( isdefined( level.custom_trapped_zombies ) ) - { - zombies[i] thread [[ level.custom_trapped_zombies ]](); - wait( randomfloat( 0.15 ) ); - } - } -} - -any_player_touching( trigger ) -{ - foreach ( player in get_players() ) - { - if ( player istouching( trigger ) ) - return true; - - wait 0.01; - } - - return false; -} - -any_player_touching_any( trigger, more_triggers ) -{ - foreach ( player in get_players() ) - { - if ( is_player_valid( player, 0, 1 ) ) - { - if ( isdefined( trigger ) && player istouching( trigger ) ) - return true; - - if ( isdefined( more_triggers ) && more_triggers.size > 0 ) - { - foreach ( trig in more_triggers ) - { - if ( isdefined( trig ) && player istouching( trig ) ) - return true; - } - } - } - } - - return false; -} - -any_zombie_touching_any( trigger, more_triggers ) -{ - zombies = getaiarray( level.zombie_team ); - - foreach ( zombie in zombies ) - { - if ( isdefined( trigger ) && zombie istouching( trigger ) ) - return true; - - if ( isdefined( more_triggers ) && more_triggers.size > 0 ) - { - foreach ( trig in more_triggers ) - { - if ( isdefined( trig ) && zombie istouching( trig ) ) - return true; - } - } - } - - return false; -} - -wait_trigger_clear( trigger, more_triggers, end_on ) -{ - self endon( end_on ); - - while ( any_player_touching_any( trigger, more_triggers ) || any_zombie_touching_any( trigger, more_triggers ) ) - wait 1; + /* /# - println( "ZM BLOCKER local door trigger clear\n" ); + assert( isDefined( states ) ); #/ - self notify( "trigger_clear" ); + */ + self.state = states; } -waittill_door_trigger_clear_local_power_off( trigger, all_trigs ) +quantum_bomb_open_nearest_door_validation( position ) //checked changed to match cerberus output { - self endon( "trigger_clear" ); - - while ( true ) - { - if ( isdefined( self.local_power_on ) && self.local_power_on ) - self waittill( "local_power_off" ); -/# - println( "ZM BLOCKER local door power off\n" ); -#/ - self wait_trigger_clear( trigger, all_trigs, "local_power_on" ); - } + range_squared = 32400; + zombie_doors = getentarray( "zombie_door", "targetname" ); + for ( i = 0; i < zombie_doors.size; i++ ) + { + if ( distancesquared( zombie_doors[ i ].origin, position ) < range_squared ) + { + return 1; + } + } + zombie_airlock_doors = getentarray( "zombie_airlock_buy", "targetname" ); + for ( i = 0; i < zombie_airlock_doors.size; i++ ) + { + if ( distancesquared( zombie_airlock_doors[ i ].origin, position ) < range_squared ) + { + return 1; + } + } + zombie_debris = getentarray( "zombie_debris", "targetname" ); + for ( i = 0; i < zombie_debris.size; i++ ) + { + if ( distancesquared( zombie_debris[ i ].origin, position ) < range_squared ) + { + return 1; + } + } + return 0; } -waittill_door_trigger_clear_global_power_off( trigger, all_trigs ) +quantum_bomb_open_nearest_door_result( position ) //checked changed to match cerberus output { - self endon( "trigger_clear" ); - - while ( true ) - { - if ( isdefined( self.power_on ) && self.power_on ) - self waittill( "power_off" ); -/# - println( "ZM BLOCKER global door power off\n" ); -#/ - self wait_trigger_clear( trigger, all_trigs, "power_on" ); - } + range_squared = 32400; + zombie_doors = getentarray( "zombie_door", "targetname" ); + for ( i = 0; i < zombie_doors.size; i++ ) + { + if ( distancesquared( zombie_doors[ i ].origin, position ) < range_squared ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); + zombie_doors[ i ] notify( "trigger", self, 1 ); + [[ level.quantum_bomb_play_area_effect_func ]]( position ); + return; + } + } + zombie_airlock_doors = getentarray( "zombie_airlock_buy", "targetname" ); + for ( i = 0; i < zombie_airlock_doors.size; i++ ) + { + if ( distancesquared( zombie_airlock_doors[ i ].origin, position ) < range_squared ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); + zombie_airlock_doors[ i ] notify( "trigger", self, 1 ); + [[ level.quantum_bomb_play_area_effect_func ]]( position ); + return; + } + } + zombie_debris = getentarray( "zombie_debris", "targetname" ); + for ( i = 0; i < zombie_debris.size; i++ ) + { + if ( distancesquared( zombie_debris[ i ].origin, position ) < range_squared ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); + zombie_debris[ i ] notify( "trigger", self, 1 ); + [[ level.quantum_bomb_play_area_effect_func ]]( position ); + return; + } + } } -waittill_door_can_close() -{ - trigger = undefined; - - if ( isdefined( self.door_hold_trigger ) ) - trigger = getent( self.door_hold_trigger, "targetname" ); - - all_trigs = getentarray( self.target, "target" ); - - switch ( self.script_noteworthy ) - { - case "local_electric_door": - if ( isdefined( trigger ) || isdefined( all_trigs ) ) - { - self waittill_door_trigger_clear_local_power_off( trigger, all_trigs ); - self thread kill_trapped_zombies( trigger ); - } - else if ( isdefined( self.local_power_on ) && self.local_power_on ) - self waittill( "local_power_off" ); - - return; - case "electric_door": - if ( isdefined( trigger ) || isdefined( all_trigs ) ) - { - self waittill_door_trigger_clear_global_power_off( trigger, all_trigs ); - - if ( isdefined( trigger ) ) - self thread kill_trapped_zombies( trigger ); - } - else if ( isdefined( self.power_on ) && self.power_on ) - self waittill( "power_off" ); - - return; - } -} - -door_think() -{ - self endon( "kill_door_think" ); - cost = 1000; - - if ( isdefined( self.zombie_cost ) ) - cost = self.zombie_cost; - - self sethintlowpriority( 1 ); - - while ( true ) - { - switch ( self.script_noteworthy ) - { - case "local_electric_door": - if ( !( isdefined( self.local_power_on ) && self.local_power_on ) ) - self waittill( "local_power_on" ); - - if ( !( isdefined( self._door_open ) && self._door_open ) ) - { -/# - println( "ZM BLOCKER local door opened\n" ); -#/ - self door_opened( cost, 1 ); - - if ( !isdefined( self.power_cost ) ) - self.power_cost = 0; - - self.power_cost += 200; - } - - self sethintstring( "" ); - - if ( isdefined( level.local_doors_stay_open ) && level.local_doors_stay_open ) - return; - - wait 3; - self waittill_door_can_close(); - self door_block(); - - if ( isdefined( self._door_open ) && self._door_open ) - { -/# - println( "ZM BLOCKER local door closed\n" ); -#/ - self door_opened( cost, 1 ); - } - - self sethintstring( &"ZOMBIE_NEED_LOCAL_POWER" ); - wait 3; - continue; - case "electric_door": - if ( !( isdefined( self.power_on ) && self.power_on ) ) - self waittill( "power_on" ); - - if ( !( isdefined( self._door_open ) && self._door_open ) ) - { -/# - println( "ZM BLOCKER global door opened\n" ); -#/ - self door_opened( cost, 1 ); - - if ( !isdefined( self.power_cost ) ) - self.power_cost = 0; - - self.power_cost += 200; - } - - self sethintstring( "" ); - - if ( isdefined( level.local_doors_stay_open ) && level.local_doors_stay_open ) - return; - - wait 3; - self waittill_door_can_close(); - self door_block(); - - if ( isdefined( self._door_open ) && self._door_open ) - { -/# - println( "ZM BLOCKER global door closed\n" ); -#/ - self door_opened( cost, 1 ); - } - - self sethintstring( &"ZOMBIE_NEED_POWER" ); - wait 3; - continue; - case "electric_buyable_door": - flag_wait( "power_on" ); - self set_hint_string( self, "default_buy_door", cost ); - - if ( !self door_buy() ) - continue; - - break; - case "delay_door": - if ( !self door_buy() ) - continue; - - self door_delay(); - break; - default: - if ( isdefined( level._default_door_custom_logic ) ) - { - self [[ level._default_door_custom_logic ]](); - break; - } - - if ( !self door_buy() ) - continue; - - break; - } - - self door_opened( cost ); - - if ( !flag( "door_can_close" ) ) - break; - } -} - -self_and_flag_wait( msg ) -{ - self endon( msg ); - - if ( isdefined( self.power_door_ignore_flag_wait ) && self.power_door_ignore_flag_wait ) - level waittill( "forever" ); - else - flag_wait( msg ); -} - -door_block() -{ - if ( isdefined( self.doors ) ) - { - for ( i = 0; i < self.doors.size; i++ ) - { - if ( isdefined( self.doors[i].script_noteworthy ) && self.doors[i].script_noteworthy == "clip" || isdefined( self.doors[i].script_string ) && self.doors[i].script_string == "clip" ) - self.doors[i] solid(); - } - } -} - -door_opened( cost, quick_close ) -{ - if ( isdefined( self.door_is_moving ) && self.door_is_moving ) - return; - - self.has_been_opened = 1; - all_trigs = getentarray( self.target, "target" ); - self.door_is_moving = 1; - - foreach ( trig in all_trigs ) - { - trig.door_is_moving = 1; - trig trigger_off(); - trig.has_been_opened = 1; - - if ( !isdefined( trig._door_open ) || trig._door_open == 0 ) - { - trig._door_open = 1; - trig notify( "door_opened" ); - level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "door_open" ); - } - else - trig._door_open = 0; - - if ( isdefined( trig.script_flag ) && trig._door_open == 1 ) - { - tokens = strtok( trig.script_flag, "," ); - - for ( i = 0; i < tokens.size; i++ ) - flag_set( tokens[i] ); - } - else if ( isdefined( trig.script_flag ) && trig._door_open == 0 ) - { - tokens = strtok( trig.script_flag, "," ); - - for ( i = 0; i < tokens.size; i++ ) - flag_clear( tokens[i] ); - } - - if ( isdefined( quick_close ) && quick_close ) - { - trig set_hint_string( trig, "" ); - continue; - } - - if ( trig._door_open == 1 && flag( "door_can_close" ) ) - { - trig set_hint_string( trig, "default_buy_door_close" ); - continue; - } - - if ( trig._door_open == 0 ) - trig set_hint_string( trig, "default_buy_door", cost ); - } - - level notify( "door_opened" ); - - if ( isdefined( self.doors ) ) - { - is_script_model_door = 0; - have_moving_clip_for_door = 0; - use_blocker_clip_for_pathing = 0; - - foreach ( door in self.doors ) - { - if ( is_true( door.ignore_use_blocker_clip_for_pathing_check ) ) - continue; - - if ( door.classname == "script_model" ) - { - is_script_model_door = 1; - continue; - } - - if ( door.classname == "script_brushmodel" && ( !isdefined( door.script_noteworthy ) || door.script_noteworthy != "clip" ) && ( !isdefined( door.script_string ) || door.script_string != "clip" ) ) - have_moving_clip_for_door = 1; - } - - use_blocker_clip_for_pathing = is_script_model_door && !have_moving_clip_for_door; - - for ( i = 0; i < self.doors.size; i++ ) - self.doors[i] thread door_activate( self.doors[i].script_transition_time, self._door_open, quick_close, use_blocker_clip_for_pathing ); - - if ( self.doors.size ) - play_sound_at_pos( "purchase", self.doors[0].origin ); - } - - level.active_zone_names = maps\mp\zombies\_zm_zonemgr::get_active_zone_names(); - wait 1; - self.door_is_moving = 0; - - foreach ( trig in all_trigs ) - trig.door_is_moving = 0; - - if ( isdefined( quick_close ) && quick_close ) - { - for ( i = 0; i < all_trigs.size; i++ ) - all_trigs[i] trigger_on(); - - return; - } - - if ( flag( "door_can_close" ) ) - { - wait 2.0; - - for ( i = 0; i < all_trigs.size; i++ ) - all_trigs[i] trigger_on(); - } -} - -physics_launch_door( door_trig ) -{ - vec = vectorscale( vectornormalize( self.script_vector ), 10 ); - self rotateroll( 5, 0.05 ); - wait 0.05; - self moveto( self.origin + vec, 0.1 ); - - self waittill( "movedone" ); - - self physicslaunch( self.origin, self.script_vector * 300 ); - wait 60; - self delete(); -} - -door_solid_thread() -{ - self waittill_either( "rotatedone", "movedone" ); - self.door_moving = undefined; - - while ( true ) - { - players = get_players(); - player_touching = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] istouching( self ) ) - { - player_touching = 1; - break; - } - } - - if ( !player_touching ) - { - self solid(); - return; - } - - wait 1; - } -} - -door_solid_thread_anim() -{ - self waittillmatch( "door_anim", "end" ); - - self.door_moving = undefined; - - while ( true ) - { - players = get_players(); - player_touching = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] istouching( self ) ) - { - player_touching = 1; - break; - } - } - - if ( !player_touching ) - { - self solid(); - return; - } - - wait 1; - } -} - -disconnect_paths_when_done() -{ - self waittill_either( "rotatedone", "movedone" ); - self disconnectpaths(); -} - -self_disconnectpaths() -{ - self disconnectpaths(); -} - -debris_init() -{ - cost = 1000; - - if ( isdefined( self.zombie_cost ) ) - cost = self.zombie_cost; - - self set_hint_string( self, "default_buy_debris", cost ); - self setcursorhint( "HINT_NOICON" ); - - if ( isdefined( self.script_flag ) && !isdefined( level.flag[self.script_flag] ) ) - flag_init( self.script_flag ); - - self thread debris_think(); -} - -debris_think() -{ - if ( isdefined( level.custom_debris_function ) ) - self [[ level.custom_debris_function ]](); - - while ( true ) - { - self waittill( "trigger", who, force ); - - if ( getdvarint( _hash_2ECA0C0E ) > 0 || isdefined( force ) && force ) - { - - } - else - { - if ( !who usebuttonpressed() ) - continue; - - if ( who in_revive_trigger() ) - continue; - } - - if ( is_player_valid( who ) ) - { - players = get_players(); - - if ( getdvarint( _hash_2ECA0C0E ) > 0 ) - { - - } - else if ( who.score >= self.zombie_cost ) - { - who maps\mp\zombies\_zm_score::minus_to_player_score( self.zombie_cost ); - maps\mp\_demo::bookmark( "zm_player_door", gettime(), who ); - who maps\mp\zombies\_zm_stats::increment_client_stat( "doors_purchased" ); - who maps\mp\zombies\_zm_stats::increment_player_stat( "doors_purchased" ); - } - else - { - play_sound_at_pos( "no_purchase", self.origin ); - who maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "door_deny" ); - continue; - } - - bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", who.name, who.score, level.round_number, self.zombie_cost, self.script_flag, self.origin, "door" ); - junk = getentarray( self.target, "targetname" ); - - if ( isdefined( self.script_flag ) ) - { - tokens = strtok( self.script_flag, "," ); - - for ( i = 0; i < tokens.size; i++ ) - flag_set( tokens[i] ); - } - - play_sound_at_pos( "purchase", self.origin ); - level notify( "junk purchased" ); - move_ent = undefined; - clip = undefined; - - for ( i = 0; i < junk.size; i++ ) - { - junk[i] connectpaths(); - - if ( isdefined( junk[i].script_noteworthy ) ) - { - if ( junk[i].script_noteworthy == "clip" ) - { - clip = junk[i]; - continue; - } - } - - struct = undefined; - - if ( isdefined( junk[i].script_linkto ) ) - { - struct = getstruct( junk[i].script_linkto, "script_linkname" ); - - if ( isdefined( struct ) ) - { - move_ent = junk[i]; - junk[i] thread debris_move( struct ); - } - else - junk[i] delete(); - - continue; - } - - junk[i] delete(); - } - - all_trigs = getentarray( self.target, "target" ); - - for ( i = 0; i < all_trigs.size; i++ ) - all_trigs[i] delete(); - - if ( isdefined( clip ) ) - { - if ( isdefined( move_ent ) ) - move_ent waittill( "movedone" ); - - clip delete(); - } - - break; - } - } -} - -debris_move( struct ) -{ - self script_delay(); - self notsolid(); - self play_sound_on_ent( "debris_move" ); - playsoundatposition( "zmb_lightning_l", self.origin ); - - if ( isdefined( self.script_firefx ) ) - playfx( level._effect[self.script_firefx], self.origin ); - - if ( isdefined( self.script_noteworthy ) ) - { - if ( self.script_noteworthy == "jiggle" ) - { - num = randomintrange( 3, 5 ); - og_angles = self.angles; - - for ( i = 0; i < num; i++ ) - { - angles = og_angles + ( -5 + randomfloat( 10 ), -5 + randomfloat( 10 ), -5 + randomfloat( 10 ) ); - time = randomfloatrange( 0.1, 0.4 ); - self rotateto( angles, time ); - wait( time - 0.05 ); - } - } - } - - time = 0.5; - - if ( isdefined( self.script_transition_time ) ) - time = self.script_transition_time; - - self moveto( struct.origin, time, time * 0.5 ); - self rotateto( struct.angles, time * 0.75 ); - - self waittill( "movedone" ); - - if ( isdefined( self.script_fxid ) ) - { - playfx( level._effect[self.script_fxid], self.origin ); - playsoundatposition( "zmb_zombie_spawn", self.origin ); - } - - self delete(); -} - -blocker_disconnect_paths( start_node, end_node, two_way ) -{ - -} - -blocker_connect_paths( start_node, end_node, two_way ) -{ - -} - -blocker_init() -{ - if ( !isdefined( self.target ) ) - return; - - targets = getentarray( self.target, "targetname" ); - self.barrier_chunks = []; - - for ( j = 0; j < targets.size; j++ ) - { - if ( targets[j] iszbarrier() ) - { - if ( isdefined( level.zbarrier_override ) ) - { - self thread [[ level.zbarrier_override ]]( targets[j] ); - continue; - } - - self.zbarrier = targets[j]; - - if ( isdefined( level.zbarrier_script_string_sets_collision ) && level.zbarrier_script_string_sets_collision ) - m_collision = isdefined( self.zbarrier.script_string ) ? self.zbarrier.script_string : "p6_anim_zm_barricade_board_collision"; - else - m_collision = "p6_anim_zm_barricade_board_collision"; - - precachemodel( m_collision ); - self.zbarrier setzbarriercolmodel( m_collision ); - self.zbarrier.chunk_health = []; - - for ( i = 0; i < self.zbarrier getnumzbarrierpieces(); i++ ) - self.zbarrier.chunk_health[i] = 0; - - continue; - } - - if ( isdefined( targets[j].script_string ) && targets[j].script_string == "rock" ) - targets[j].material = "rock"; - - if ( isdefined( targets[j].script_parameters ) ) - { - if ( targets[j].script_parameters == "grate" ) - { - if ( isdefined( targets[j].script_noteworthy ) ) - { - if ( targets[j].script_noteworthy == "2" || targets[j].script_noteworthy == "3" || targets[j].script_noteworthy == "4" || targets[j].script_noteworthy == "5" || targets[j].script_noteworthy == "6" ) - { - targets[j] hide(); -/# - iprintlnbold( " Hide " ); -#/ - } - } - } - else if ( targets[j].script_parameters == "repair_board" ) - { - targets[j].unbroken_section = getent( targets[j].target, "targetname" ); - - if ( isdefined( targets[j].unbroken_section ) ) - { - targets[j].unbroken_section linkto( targets[j] ); - targets[j] hide(); - targets[j] notsolid(); - targets[j].unbroken = 1; - - if ( isdefined( targets[j].unbroken_section.script_noteworthy ) && targets[j].unbroken_section.script_noteworthy == "glass" ) - { - targets[j].material = "glass"; - targets[j] thread destructible_glass_barricade( targets[j].unbroken_section, self ); - } - else if ( isdefined( targets[j].unbroken_section.script_noteworthy ) && targets[j].unbroken_section.script_noteworthy == "metal" ) - targets[j].material = "metal"; - } - } - else if ( targets[j].script_parameters == "barricade_vents" ) - targets[j].material = "metal_vent"; - } - - if ( isdefined( targets[j].targetname ) ) - { - if ( targets[j].targetname == "auto2" ) - { - - } - } - - targets[j] update_states( "repaired" ); - targets[j].destroyed = 0; - targets[j] show(); - targets[j].claimed = 0; - targets[j].anim_grate_index = 0; - targets[j].og_origin = targets[j].origin; - targets[j].og_angles = targets[j].angles; - self.barrier_chunks[self.barrier_chunks.size] = targets[j]; - } - - target_nodes = getnodearray( self.target, "targetname" ); - - for ( j = 0; j < target_nodes.size; j++ ) - { - if ( target_nodes[j].type == "Begin" ) - { - self.neg_start = target_nodes[j]; - - if ( isdefined( self.neg_start.target ) ) - self.neg_end = getnode( self.neg_start.target, "targetname" ); - - blocker_disconnect_paths( self.neg_start, self.neg_end ); - } - } - - if ( isdefined( self.zbarrier ) ) - { - if ( isdefined( self.barrier_chunks ) ) - { - for ( i = 0; i < self.barrier_chunks.size; i++ ) - self.barrier_chunks[i] delete(); - - self.barrier_chunks = []; - } - } - - if ( isdefined( self.zbarrier ) && should_delete_zbarriers() ) - { - self.zbarrier delete(); - self.zbarrier = undefined; - return; - } - - self blocker_attack_spots(); - self.trigger_location = getstruct( self.target, "targetname" ); - self thread blocker_think(); -} - -should_delete_zbarriers() -{ - gametype = getdvar( "ui_gametype" ); - - if ( !is_classic() && !is_standard() && gametype != "zgrief" ) - return true; - - return false; -} - -destructible_glass_barricade( unbroken_section, node ) -{ - unbroken_section setcandamage( 1 ); - unbroken_section.health = 99999; - - unbroken_section waittill( "damage", amount, who ); - - if ( is_player_valid( who ) || who maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - self thread maps\mp\zombies\_zm_spawner::zombie_boardtear_offset_fx_horizontle( self, node ); - level thread remove_chunk( self, node, 1 ); - self update_states( "destroyed" ); - self notify( "destroyed" ); - self.unbroken = 0; - } -} - -blocker_attack_spots() -{ - spots = []; - numslots = self.zbarrier getzbarriernumattackslots(); - numslots = int( max( numslots, 1 ) ); - - if ( numslots % 2 ) - spots[spots.size] = groundpos_ignore_water_new( self.zbarrier.origin + vectorscale( ( 0, 0, 1 ), 60.0 ) ); - - if ( numslots > 1 ) - { - reps = floor( numslots / 2 ); - slot = 1; - - for ( i = 0; i < reps; i++ ) - { - offset = self.zbarrier getzbarrierattackslothorzoffset() * ( i + 1 ); - spots[spots.size] = groundpos_ignore_water_new( spots[0] + anglestoright( self.angles ) * offset + vectorscale( ( 0, 0, 1 ), 60.0 ) ); - slot++; - - if ( slot < numslots ) - { - spots[spots.size] = groundpos_ignore_water_new( spots[0] + anglestoright( self.angles ) * ( offset * -1 ) + vectorscale( ( 0, 0, 1 ), 60.0 ) ); - slot++; - } - } - } - - taken = []; - - for ( i = 0; i < spots.size; i++ ) - taken[i] = 0; - - self.attack_spots_taken = taken; - self.attack_spots = spots; -/# - self thread debug_attack_spots_taken(); -#/ -} - -blocker_choke() -{ - level._blocker_choke = 0; - level endon( "stop_blocker_think" ); - - while ( true ) - { - wait 0.05; - level._blocker_choke = 0; - } -} - -blocker_think() -{ - level endon( "stop_blocker_think" ); - - if ( !isdefined( level._blocker_choke ) ) - level thread blocker_choke(); - - use_choke = 0; - - if ( isdefined( level._use_choke_blockers ) && level._use_choke_blockers == 1 ) - use_choke = 1; - - while ( true ) - { - wait 0.5; - - if ( use_choke ) - { - if ( level._blocker_choke > 3 ) - wait 0.05; - } - - level._blocker_choke++; - - if ( all_chunks_intact( self, self.barrier_chunks ) ) - continue; - - if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) - continue; - - self blocker_trigger_think(); - } -} - -player_fails_blocker_repair_trigger_preamble( player, players, trigger, hold_required ) -{ - if ( !isdefined( trigger ) ) - return true; - - if ( !is_player_valid( player ) ) - return true; - - if ( players.size == 1 && isdefined( players[0].intermission ) && players[0].intermission == 1 ) - return true; - - if ( hold_required && !player usebuttonpressed() ) - return true; - - if ( !hold_required && !player use_button_held() ) - return true; - - if ( player in_revive_trigger() ) - return true; - - return false; -} - -has_blocker_affecting_perk() -{ - has_perk = undefined; - - if ( self hasperk( "specialty_fastreload" ) ) - has_perk = "specialty_fastreload"; - - return has_perk; -} - -do_post_chunk_repair_delay( has_perk ) -{ - if ( !self script_delay() ) - wait 1; -} - -handle_post_board_repair_rewards( cost, zbarrier ) -{ - self maps\mp\zombies\_zm_stats::increment_client_stat( "boards" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "boards" ); - - if ( isdefined( self.pers["boards"] ) && self.pers["boards"] % 10 == 0 ) - self thread do_player_general_vox( "general", "reboard", 90 ); - - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_boards_updated( zbarrier ); - self.rebuild_barrier_reward += cost; - - if ( self.rebuild_barrier_reward < level.zombie_vars["rebuild_barrier_cap_per_round"] ) - { - self maps\mp\zombies\_zm_score::player_add_points( "rebuild_board", cost ); - self play_sound_on_ent( "purchase" ); - } - - if ( isdefined( self.board_repair ) ) - self.board_repair += 1; -} - -blocker_unitrigger_think() -{ - self endon( "kill_trigger" ); - - while ( true ) - { - self waittill( "trigger", player ); - - self.stub.trigger_target notify( "trigger", player ); - } -} - -blocker_trigger_think() -{ - self endon( "blocker_hacked" ); - - if ( isdefined( level.no_board_repair ) && level.no_board_repair ) - return; -/# - println( "ZM >> TRIGGER blocker_trigger_think " ); -#/ - level endon( "stop_blocker_think" ); - cost = 10; - - if ( isdefined( self.zombie_cost ) ) - cost = self.zombie_cost; - - original_cost = cost; - - if ( !isdefined( self.unitrigger_stub ) ) - { - radius = 94.21; - height = 94.21; - - if ( isdefined( self.trigger_location ) ) - trigger_location = self.trigger_location; - else - trigger_location = self; - - if ( isdefined( trigger_location.radius ) ) - radius = trigger_location.radius; - - if ( isdefined( trigger_location.height ) ) - height = trigger_location.height; - - trigger_pos = groundpos( trigger_location.origin ) + vectorscale( ( 0, 0, 1 ), 4.0 ); - self.unitrigger_stub = spawnstruct(); - self.unitrigger_stub.origin = trigger_pos; - self.unitrigger_stub.radius = radius; - self.unitrigger_stub.height = height; - self.unitrigger_stub.script_unitrigger_type = "unitrigger_radius"; - self.unitrigger_stub.hint_string = get_hint_string( self, "default_reward_barrier_piece" ); - self.unitrigger_stub.cursor_hint = "HINT_NOICON"; - self.unitrigger_stub.trigger_target = self; - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::blocker_unitrigger_think ); - maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); - - if ( !isdefined( trigger_location.angles ) ) - trigger_location.angles = ( 0, 0, 0 ); - - self.unitrigger_stub.origin = groundpos( trigger_location.origin ) + vectorscale( ( 0, 0, 1 ), 4.0 ) + anglestoforward( trigger_location.angles ) * -11; - } - - self thread trigger_delete_on_repair(); - thread maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::blocker_unitrigger_think ); -/# - if ( getdvarint( _hash_FA91EA91 ) > 0 ) - thread debug_blocker( trigger_pos, radius, height ); -#/ - while ( true ) - { - self waittill( "trigger", player ); - - has_perk = player has_blocker_affecting_perk(); - - if ( all_chunks_intact( self, self.barrier_chunks ) ) - { - self notify( "all_boards_repaired" ); - return; - } - - if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) - { - self notify( "no valid boards" ); - return; - } - - if ( isdefined( level._zm_blocker_trigger_think_return_override ) ) - { - if ( self [[ level._zm_blocker_trigger_think_return_override ]]( player ) ) - return; - } - - while ( true ) - { - players = get_players(); - - if ( player_fails_blocker_repair_trigger_preamble( player, players, self.unitrigger_stub.trigger, 0 ) ) - break; - - if ( isdefined( self.zbarrier ) ) - { - chunk = get_random_destroyed_chunk( self, self.barrier_chunks ); - self thread replace_chunk( self, chunk, has_perk, isdefined( player.pers_upgrades_awarded["board"] ) && player.pers_upgrades_awarded["board"] ); - } - else - { - chunk = get_random_destroyed_chunk( self, self.barrier_chunks ); - - if ( isdefined( chunk.script_parameter ) && chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) - { - if ( isdefined( chunk.unbroken_section ) ) - { - chunk show(); - chunk solid(); - chunk.unbroken_section self_delete(); - } - } - else - chunk show(); - - if ( !isdefined( chunk.script_parameters ) || chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) - { - if ( !( isdefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) ) - { - if ( !isdefined( chunk.material ) || isdefined( chunk.material ) && chunk.material != "rock" ) - chunk play_sound_on_ent( "rebuild_barrier_piece" ); - - playsoundatposition( "zmb_cha_ching", ( 0, 0, 0 ) ); - } - } - - if ( chunk.script_parameters == "bar" ) - { - chunk play_sound_on_ent( "rebuild_barrier_piece" ); - playsoundatposition( "zmb_cha_ching", ( 0, 0, 0 ) ); - } - - if ( isdefined( chunk.script_parameters ) ) - { - if ( chunk.script_parameters == "bar" ) - { - if ( isdefined( chunk.script_noteworthy ) ) - { - if ( chunk.script_noteworthy == "5" ) - chunk hide(); - else if ( chunk.script_noteworthy == "3" ) - chunk hide(); - } - } - } - - self thread replace_chunk( self, chunk, has_perk, isdefined( player.pers_upgrades_awarded["board"] ) && player.pers_upgrades_awarded["board"] ); - } - - if ( isdefined( self.clip ) ) - { - self.clip enable_trigger(); - self.clip disconnectpaths(); - } - else - blocker_disconnect_paths( self.neg_start, self.neg_end ); - - bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, original_cost, self.target, self.origin, "repair" ); - self do_post_chunk_repair_delay( has_perk ); - - if ( !is_player_valid( player ) ) - break; - - player handle_post_board_repair_rewards( cost, self ); - - if ( all_chunks_intact( self, self.barrier_chunks ) ) - { - self notify( "all_boards_repaired" ); - return; - } - - if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) - { - self notify( "no valid boards" ); - return; - } - } - } -} - -random_destroyed_chunk_show() -{ - wait 0.5; - self show(); -} - -door_repaired_rumble_n_sound() -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( distance( players[i].origin, self.origin ) < 150 ) - { - if ( isalive( players[i] ) ) - players[i] thread board_completion(); - } - } -} - -board_completion() -{ - self endon( "disconnect" ); -} - -trigger_delete_on_repair() -{ - while ( true ) - { - self waittill_either( "all_boards_repaired", "no valid boards" ); - maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); - break; - } -} - -rebuild_barrier_reward_reset() -{ - self.rebuild_barrier_reward = 0; -} - -remove_chunk( chunk, node, destroy_immediately, zomb ) -{ - chunk update_states( "mid_tear" ); - - if ( isdefined( chunk.script_parameters ) ) - { - if ( chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) - chunk thread zombie_boardtear_audio_offset( chunk ); - } - - if ( isdefined( chunk.script_parameters ) ) - { - if ( chunk.script_parameters == "bar" ) - chunk thread zombie_bartear_audio_offset( chunk ); - } - - chunk notsolid(); - fx = "wood_chunk_destory"; - - if ( isdefined( self.script_fxid ) ) - fx = self.script_fxid; - - if ( isdefined( chunk.script_moveoverride ) && chunk.script_moveoverride ) - chunk hide(); - - if ( isdefined( chunk.script_parameters ) && chunk.script_parameters == "bar" ) - { - if ( isdefined( chunk.script_noteworthy ) && chunk.script_noteworthy == "4" ) - { - ent = spawn( "script_origin", chunk.origin ); - ent.angles = node.angles + vectorscale( ( 0, 1, 0 ), 180.0 ); - dist = 100; - - if ( isdefined( chunk.script_move_dist ) ) - { - dist_max = chunk.script_move_dist - 100; - dist = 100 + randomint( dist_max ); - } - else - dist = 100 + randomint( 100 ); - - dest = ent.origin + anglestoforward( ent.angles ) * dist; - trace = bullettrace( dest + vectorscale( ( 0, 0, 1 ), 16.0 ), dest + vectorscale( ( 0, 0, -1 ), 200.0 ), 0, undefined ); - - if ( trace["fraction"] == 1 ) - dest += vectorscale( ( 0, 0, -1 ), 200.0 ); - else - dest = trace["position"]; - - chunk linkto( ent ); - time = ent fake_physicslaunch( dest, 300 + randomint( 100 ) ); - - if ( randomint( 100 ) > 40 ) - ent rotatepitch( 180, time * 0.5 ); - else - ent rotatepitch( 90, time, time * 0.5 ); - - wait( time ); - chunk hide(); - wait 0.1; - ent delete(); - } - else - { - ent = spawn( "script_origin", chunk.origin ); - ent.angles = node.angles + vectorscale( ( 0, 1, 0 ), 180.0 ); - dist = 100; - - if ( isdefined( chunk.script_move_dist ) ) - { - dist_max = chunk.script_move_dist - 100; - dist = 100 + randomint( dist_max ); - } - else - dist = 100 + randomint( 100 ); - - dest = ent.origin + anglestoforward( ent.angles ) * dist; - trace = bullettrace( dest + vectorscale( ( 0, 0, 1 ), 16.0 ), dest + vectorscale( ( 0, 0, -1 ), 200.0 ), 0, undefined ); - - if ( trace["fraction"] == 1 ) - dest += vectorscale( ( 0, 0, -1 ), 200.0 ); - else - dest = trace["position"]; - - chunk linkto( ent ); - time = ent fake_physicslaunch( dest, 260 + randomint( 100 ) ); - - if ( randomint( 100 ) > 40 ) - ent rotatepitch( 180, time * 0.5 ); - else - ent rotatepitch( 90, time, time * 0.5 ); - - wait( time ); - chunk hide(); - wait 0.1; - ent delete(); - } - - chunk update_states( "destroyed" ); - chunk notify( "destroyed" ); - } - - if ( isdefined( chunk.script_parameters ) && chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) - { - ent = spawn( "script_origin", chunk.origin ); - ent.angles = node.angles + vectorscale( ( 0, 1, 0 ), 180.0 ); - dist = 100; - - if ( isdefined( chunk.script_move_dist ) ) - { - dist_max = chunk.script_move_dist - 100; - dist = 100 + randomint( dist_max ); - } - else - dist = 100 + randomint( 100 ); - - dest = ent.origin + anglestoforward( ent.angles ) * dist; - trace = bullettrace( dest + vectorscale( ( 0, 0, 1 ), 16.0 ), dest + vectorscale( ( 0, 0, -1 ), 200.0 ), 0, undefined ); - - if ( trace["fraction"] == 1 ) - dest += vectorscale( ( 0, 0, -1 ), 200.0 ); - else - dest = trace["position"]; - - chunk linkto( ent ); - time = ent fake_physicslaunch( dest, 200 + randomint( 100 ) ); - - if ( isdefined( chunk.unbroken_section ) ) - { - if ( !isdefined( chunk.material ) || chunk.material != "metal" ) - chunk.unbroken_section self_delete(); - } - - if ( randomint( 100 ) > 40 ) - ent rotatepitch( 180, time * 0.5 ); - else - ent rotatepitch( 90, time, time * 0.5 ); - - wait( time ); - - if ( isdefined( chunk.unbroken_section ) ) - { - if ( isdefined( chunk.material ) && chunk.material == "metal" ) - chunk.unbroken_section self_delete(); - } - - chunk hide(); - wait 0.1; - ent delete(); - chunk update_states( "destroyed" ); - chunk notify( "destroyed" ); - } - - if ( isdefined( chunk.script_parameters ) && chunk.script_parameters == "grate" ) - { - if ( isdefined( chunk.script_noteworthy ) && chunk.script_noteworthy == "6" ) - { - ent = spawn( "script_origin", chunk.origin ); - ent.angles = node.angles + vectorscale( ( 0, 1, 0 ), 180.0 ); - dist = 100 + randomint( 100 ); - dest = ent.origin + anglestoforward( ent.angles ) * dist; - trace = bullettrace( dest + vectorscale( ( 0, 0, 1 ), 16.0 ), dest + vectorscale( ( 0, 0, -1 ), 200.0 ), 0, undefined ); - - if ( trace["fraction"] == 1 ) - dest += vectorscale( ( 0, 0, -1 ), 200.0 ); - else - dest = trace["position"]; - - chunk linkto( ent ); - time = ent fake_physicslaunch( dest, 200 + randomint( 100 ) ); - - if ( randomint( 100 ) > 40 ) - ent rotatepitch( 180, time * 0.5 ); - else - ent rotatepitch( 90, time, time * 0.5 ); - - wait( time ); - chunk hide(); - ent delete(); - chunk update_states( "destroyed" ); - chunk notify( "destroyed" ); - } - else - { - chunk hide(); - chunk update_states( "destroyed" ); - chunk notify( "destroyed" ); - } - } -} - -remove_chunk_rotate_grate( chunk ) -{ - if ( isdefined( chunk.script_parameters ) && chunk.script_parameters == "grate" ) - { - chunk vibrate( vectorscale( ( 0, 1, 0 ), 270.0 ), 0.2, 0.4, 0.4 ); - return; - } -} - -zombie_boardtear_audio_offset( chunk ) -{ - if ( isdefined( chunk.material ) && !isdefined( chunk.already_broken ) ) - chunk.already_broken = 0; - - if ( isdefined( chunk.material ) && chunk.material == "glass" && chunk.already_broken == 0 ) - { - chunk playsound( "zmb_break_glass_barrier" ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk playsound( "zmb_break_glass_barrier" ); - chunk.already_broken = 1; - } - else if ( isdefined( chunk.material ) && chunk.material == "metal" && chunk.already_broken == 0 ) - { - chunk playsound( "grab_metal_bar" ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk playsound( "break_metal_bar" ); - chunk.already_broken = 1; - } - else if ( isdefined( chunk.material ) && chunk.material == "rock" ) - { - if ( !( isdefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) ) - { - chunk playsound( "zmb_break_rock_barrier" ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk playsound( "zmb_break_rock_barrier" ); - } - - chunk.already_broken = 1; - } - else if ( isdefined( chunk.material ) && chunk.material == "metal_vent" ) - { - if ( !( isdefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) ) - chunk playsound( "evt_vent_slat_remove" ); - } - else - { - if ( !( isdefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) ) - { - chunk play_sound_on_ent( "break_barrier_piece" ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk play_sound_on_ent( "break_barrier_piece" ); - } - - chunk.already_broken = 1; - } -} - -zombie_bartear_audio_offset( chunk ) -{ - chunk play_sound_on_ent( "grab_metal_bar" ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk play_sound_on_ent( "break_metal_bar" ); - wait( randomfloatrange( 1.0, 1.3 ) ); - chunk play_sound_on_ent( "drop_metal_bar" ); -} - -ensure_chunk_is_back_to_origin( chunk ) -{ - if ( chunk.origin != chunk.og_origin ) - { - chunk notsolid(); - - chunk waittill( "movedone" ); - } -} - -replace_chunk( barrier, chunk, perk, upgrade, via_powerup ) -{ - if ( !isdefined( barrier.zbarrier ) ) - { - chunk update_states( "mid_repair" ); -/# - assert( isdefined( chunk.og_origin ) ); -#/ -/# - assert( isdefined( chunk.og_angles ) ); -#/ - sound = "rebuild_barrier_hover"; - - if ( isdefined( chunk.script_presound ) ) - sound = chunk.script_presound; - } - - has_perk = 0; - - if ( isdefined( perk ) ) - has_perk = 1; - - if ( !isdefined( via_powerup ) && isdefined( sound ) ) - play_sound_at_pos( sound, chunk.origin ); - - if ( upgrade ) - { - barrier.zbarrier zbarrierpieceuseupgradedmodel( chunk ); - barrier.zbarrier.chunk_health[chunk] = barrier.zbarrier getupgradedpiecenumlives( chunk ); - } - else - { - barrier.zbarrier zbarrierpieceusedefaultmodel( chunk ); - barrier.zbarrier.chunk_health[chunk] = 0; - } - - scalar = 1.0; - - if ( has_perk ) - { - if ( "speciality_fastreload" == perk ) - scalar = 0.31; - else if ( "speciality_fastreload_upgrade" == perk ) - scalar = 0.2112; - } - - barrier.zbarrier showzbarrierpiece( chunk ); - barrier.zbarrier setzbarrierpiecestate( chunk, "closing", scalar ); - waitduration = barrier.zbarrier getzbarrierpieceanimlengthforstate( chunk, "closing", scalar ); - wait( waitduration ); -} - -open_all_zbarriers() -{ - foreach ( barrier in level.exterior_goals ) - { - if ( isdefined( barrier.zbarrier ) ) - { - for ( x = 0; x < barrier.zbarrier getnumzbarrierpieces(); x++ ) - barrier.zbarrier setzbarrierpiecestate( x, "opening" ); - } - - if ( isdefined( barrier.clip ) ) - { - barrier.clip disable_trigger(); - barrier.clip connectpaths(); - continue; - } - - blocker_connect_paths( barrier.neg_start, barrier.neg_end ); - } -} - -zombie_boardtear_audio_plus_fx_offset_repair_horizontal( chunk ) -{ - if ( isdefined( chunk.material ) && chunk.material == "rock" ) - { - if ( isdefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) - chunk clearclientflag( level._zombie_scriptmover_flag_rock_fx ); - else - { - earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 0, 0, 1 ), 30.0 ) ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk play_sound_on_ent( "break_barrier_piece" ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 0, 0, -1 ), 30.0 ) ); - } - } - else if ( isdefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) - chunk clearclientflag( level._zombie_scriptmover_flag_board_horizontal_fx ); - else - { - earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 0, 0, 1 ), 30.0 ) ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk play_sound_on_ent( "break_barrier_piece" ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 0, 0, -1 ), 30.0 ) ); - } -} - -zombie_boardtear_audio_plus_fx_offset_repair_verticle( chunk ) -{ - if ( isdefined( chunk.material ) && chunk.material == "rock" ) - { - if ( isdefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) - chunk clearclientflag( level._zombie_scriptmover_flag_rock_fx ); - else - { - earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 1, 0, 0 ), 30.0 ) ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk play_sound_on_ent( "break_barrier_piece" ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - } - } - else if ( isdefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) - chunk clearclientflag( level._zombie_scriptmover_flag_board_vertical_fx ); - else - { - earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 1, 0, 0 ), 30.0 ) ); - wait( randomfloatrange( 0.3, 0.6 ) ); - chunk play_sound_on_ent( "break_barrier_piece" ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - } -} - -zombie_gratetear_audio_plus_fx_offset_repair_horizontal( chunk ) -{ - earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); - chunk play_sound_on_ent( "bar_rebuild_slam" ); - - switch ( randomint( 9 ) ) - { - case "0": - playfx( level._effect["fx_zombie_bar_break"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfx( level._effect["fx_zombie_bar_break_lite"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - case "1": - playfx( level._effect["fx_zombie_bar_break"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfx( level._effect["fx_zombie_bar_break"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - case "2": - playfx( level._effect["fx_zombie_bar_break_lite"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfx( level._effect["fx_zombie_bar_break"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - case "3": - playfx( level._effect["fx_zombie_bar_break"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfx( level._effect["fx_zombie_bar_break_lite"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - case "4": - playfx( level._effect["fx_zombie_bar_break_lite"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfx( level._effect["fx_zombie_bar_break_lite"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - case "5": - playfx( level._effect["fx_zombie_bar_break_lite"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - case "6": - playfx( level._effect["fx_zombie_bar_break_lite"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - case "7": - playfx( level._effect["fx_zombie_bar_break"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - case "8": - playfx( level._effect["fx_zombie_bar_break"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - break; - } -} - -zombie_bartear_audio_plus_fx_offset_repair_horizontal( chunk ) -{ - earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); - chunk play_sound_on_ent( "bar_rebuild_slam" ); - - switch ( randomint( 9 ) ) - { - case "0": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); - break; - case "1": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); - break; - case "2": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); - break; - case "3": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); - break; - case "4": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); - break; - case "5": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); - break; - case "6": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); - break; - case "7": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); - break; - case "8": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); - break; - } -} - -zombie_bartear_audio_plus_fx_offset_repair_verticle( chunk ) -{ - earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); - chunk play_sound_on_ent( "bar_rebuild_slam" ); - - switch ( randomint( 9 ) ) - { - case "0": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); - break; - case "1": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); - break; - case "2": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); - break; - case "3": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); - break; - case "4": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); - break; - case "5": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); - break; - case "6": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); - break; - case "7": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); - break; - case "8": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); - break; - } -} - -add_new_zombie_spawners() -{ - if ( isdefined( self.target ) ) - self.possible_spawners = getentarray( self.target, "targetname" ); - - if ( isdefined( self.script_string ) ) - { - spawners = getentarray( self.script_string, "targetname" ); - self.possible_spawners = arraycombine( self.possible_spawners, spawners, 1, 0 ); - } - - if ( !isdefined( self.possible_spawners ) ) - return; - - zombies_to_add = self.possible_spawners; - - for ( i = 0; i < self.possible_spawners.size; i++ ) - { - self.possible_spawners[i].is_enabled = 1; - add_spawner( self.possible_spawners[i] ); - } -} - -flag_blocker() -{ - if ( !isdefined( self.script_flag_wait ) ) - { -/# - assertmsg( "Flag Blocker at " + self.origin + " does not have a script_flag_wait key value pair" ); -#/ - return; - } - - if ( !isdefined( level.flag[self.script_flag_wait] ) ) - flag_init( self.script_flag_wait ); - - type = "connectpaths"; - - if ( isdefined( self.script_noteworthy ) ) - type = self.script_noteworthy; - - flag_wait( self.script_flag_wait ); - self script_delay(); - - if ( type == "connectpaths" ) - { - self connectpaths(); - self disable_trigger(); - return; - } - - if ( type == "disconnectpaths" ) - { - self disconnectpaths(); - self disable_trigger(); - return; - } -/# - assertmsg( "flag blocker at " + self.origin + ", the type \"" + type + "\" is not recognized" ); -#/ -} - -update_states( states ) -{ -/# - assert( isdefined( states ) ); -#/ - self.state = states; -} - -quantum_bomb_open_nearest_door_validation( position ) -{ - range_squared = 32400; - zombie_doors = getentarray( "zombie_door", "targetname" ); - - for ( i = 0; i < zombie_doors.size; i++ ) - { - if ( distancesquared( zombie_doors[i].origin, position ) < range_squared ) - return true; - } - - zombie_airlock_doors = getentarray( "zombie_airlock_buy", "targetname" ); - - for ( i = 0; i < zombie_airlock_doors.size; i++ ) - { - if ( distancesquared( zombie_airlock_doors[i].origin, position ) < range_squared ) - return true; - } - - zombie_debris = getentarray( "zombie_debris", "targetname" ); - - for ( i = 0; i < zombie_debris.size; i++ ) - { - if ( distancesquared( zombie_debris[i].origin, position ) < range_squared ) - return true; - } - - return false; -} - -quantum_bomb_open_nearest_door_result( position ) -{ - range_squared = 32400; - zombie_doors = getentarray( "zombie_door", "targetname" ); - - for ( i = 0; i < zombie_doors.size; i++ ) - { - if ( distancesquared( zombie_doors[i].origin, position ) < range_squared ) - { - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "quant_good" ); - zombie_doors[i] notify( "trigger", self, 1 ); - [[ level.quantum_bomb_play_area_effect_func ]]( position ); - return; - } - } - - zombie_airlock_doors = getentarray( "zombie_airlock_buy", "targetname" ); - - for ( i = 0; i < zombie_airlock_doors.size; i++ ) - { - if ( distancesquared( zombie_airlock_doors[i].origin, position ) < range_squared ) - { - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "quant_good" ); - zombie_airlock_doors[i] notify( "trigger", self, 1 ); - [[ level.quantum_bomb_play_area_effect_func ]]( position ); - return; - } - } - - zombie_debris = getentarray( "zombie_debris", "targetname" ); - - for ( i = 0; i < zombie_debris.size; i++ ) - { - if ( distancesquared( zombie_debris[i].origin, position ) < range_squared ) - { - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "quant_good" ); - zombie_debris[i] notify( "trigger", self, 1 ); - [[ level.quantum_bomb_play_area_effect_func ]]( position ); - return; - } - } -} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_bot.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_bot.gsc index ba070ac..bcef80d 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_bot.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_bot.gsc @@ -1,12 +1,10 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; init() { /# - println( "ZM >> Zombiemode Server Scripts Init (_zm_bot.gsc)" ); + println( "ZM >> Zombiemode Server Scripts Init (_zm_bot.gsc)" ); #/ } diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_buildables.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_buildables.gsc index b5338d1..2483f2e 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_buildables.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_buildables.gsc @@ -1,2941 +1,3146 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm_unitrigger; -#include maps\mp\zombies\_zm_buildables; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\_demo; +#include maps/mp/_demo; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - precachestring( &"ZOMBIE_BUILDING" ); - precachestring( &"ZOMBIE_BUILD_PIECE_MISSING" ); - precachestring( &"ZOMBIE_BUILD_PIECE_GRAB" ); - precacheitem( "zombie_builder_zm" ); - precacheitem( "buildable_piece_zm" ); - level.gameobjswapping = 1; - zombie_buildables_callbacks = []; - level.buildablepickups = []; - level.buildables_built = []; - level.buildable_stubs = []; - level.buildable_piece_count = 0; - level._effect["building_dust"] = loadfx( "maps/zombie/fx_zmb_buildable_assemble_dust" ); - - if ( isdefined( level.init_buildables ) ) - [[ level.init_buildables ]](); - - if ( isdefined( level.use_swipe_protection ) ) - onplayerconnect_callback( ::buildables_watch_swipes ); + precachestring( &"ZOMBIE_BUILDING" ); + precachestring( &"ZOMBIE_BUILD_PIECE_MISSING" ); + precachestring( &"ZOMBIE_BUILD_PIECE_GRAB" ); + precacheitem( "zombie_builder_zm" ); + precacheitem( "buildable_piece_zm" ); + level.gameobjswapping = 1; + zombie_buildables_callbacks = []; + level.buildablepickups = []; + level.buildables_built = []; + level.buildable_stubs = []; + level.buildable_piece_count = 0; + level._effect[ "building_dust" ] = loadfx( "maps/zombie/fx_zmb_buildable_assemble_dust" ); + if ( isDefined( level.init_buildables ) ) + { + [[ level.init_buildables ]](); + } + if ( isDefined( level.use_swipe_protection ) ) + { + onplayerconnect_callback( ::buildables_watch_swipes ); + } } -anystub_update_prompt( player ) +anystub_update_prompt( player ) //checked matches cerberus output { - if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() || player in_revive_trigger() ) - { - self.hint_string = ""; - return false; - } - - if ( player isthrowinggrenade() ) - { - self.hint_string = ""; - return false; - } - - if ( isdefined( player.is_drinking ) && player.is_drinking > 0 ) - { - self.hint_string = ""; - return false; - } - - if ( isdefined( player.screecher_weapon ) ) - { - self.hint_string = ""; - return false; - } - - return true; + if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || player maps/mp/zombies/_zm_utility::in_revive_trigger() ) + { + self.hint_string = ""; + return 0; + } + if ( player isthrowinggrenade() ) + { + self.hint_string = ""; + return 0; + } + if ( isDefined( player.is_drinking ) && player.is_drinking > 0 ) + { + self.hint_string = ""; + return 0; + } + if ( isDefined( player.screecher_weapon ) ) + { + self.hint_string = ""; + return 0; + } + return 1; } -anystub_get_unitrigger_origin() +anystub_get_unitrigger_origin() //checked matches cerberus output { - if ( isdefined( self.origin_parent ) ) - return self.origin_parent.origin; - - return self.origin; + if ( isDefined( self.origin_parent ) ) + { + return self.origin_parent.origin; + } + return self.origin; } -anystub_on_spawn_trigger( trigger ) +anystub_on_spawn_trigger( trigger ) //checked matches cerberus output { - if ( isdefined( self.link_parent ) ) - { - trigger enablelinkto(); - trigger linkto( self.link_parent ); - trigger setmovingplatformenabled( 1 ); - } + if ( isDefined( self.link_parent ) ) + { + trigger enablelinkto(); + trigger linkto( self.link_parent ); + trigger setmovingplatformenabled( 1 ); + } } -buildables_watch_swipes() +buildables_watch_swipes() //checked changed to match cerberus output { - self endon( "disconnect" ); - self notify( "buildables_watch_swipes" ); - self endon( "buildables_watch_swipes" ); - - while ( true ) - { - self waittill( "melee_swipe", zombie ); - - if ( distancesquared( zombie.origin, self.origin ) > zombie.meleeattackdist * zombie.meleeattackdist ) - continue; - - trigger = level._unitriggers.trigger_pool[self getentitynumber()]; - - if ( isdefined( trigger ) && isdefined( trigger.stub.piece ) ) - { - piece = trigger.stub.piece; - - if ( !isdefined( piece.damage ) ) - piece.damage = 0; - - piece.damage++; - - if ( piece.damage > 12 ) - { - thread maps\mp\zombies\_zm_equipment::equipment_disappear_fx( trigger.stub maps\mp\zombies\_zm_unitrigger::unitrigger_origin() ); - piece maps\mp\zombies\_zm_buildables::piece_unspawn(); - self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 ); - - if ( isalive( self ) ) - self playlocalsound( level.zmb_laugh_alias ); - } - } - } + self endon( "disconnect" ); + self notify( "buildables_watch_swipes" ); + self endon( "buildables_watch_swipes" ); + while ( 1 ) + { + self waittill( "melee_swipe", zombie ); + if ( distancesquared( zombie.origin, self.origin ) > zombie.meleeattackdist * zombie.meleeattackdist ) + { + continue; + } + trigger = level._unitriggers.trigger_pool[ self getentitynumber() ]; + if ( isDefined( trigger ) && isDefined( trigger.stub.piece ) ) + { + piece = trigger.stub.piece; + if ( !isDefined( piece.damage ) ) + { + piece.damage = 0; + } + piece.damage++; + if ( piece.damage > 12 ) + { + thread maps/mp/zombies/_zm_equipment::equipment_disappear_fx( trigger.stub maps/mp/zombies/_zm_unitrigger::unitrigger_origin() ); + piece maps/mp/zombies/_zm_buildables::piece_unspawn(); + self maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 ); + if ( isalive( self ) ) + { + self playlocalsound( level.zmb_laugh_alias ); + } + } + } + } } -explosiondamage( damage, pos ) +explosiondamage( damage, pos ) //checked matches cerberus output { + /* /# - println( "ZM BUILDABLE Explode do " + damage + " damage to " + self.name + "\n" ); + println( "ZM BUILDABLE Explode do " + damage + " damage to " + self.name + "\n" ); #/ - self dodamage( damage, pos ); + */ + self dodamage( damage, pos ); } -add_zombie_buildable( buildable_name, hint, building, bought ) +add_zombie_buildable( buildable_name, hint, building, bought ) //checked matches cerberus output { - if ( !isdefined( level.zombie_include_buildables ) ) - level.zombie_include_buildables = []; - - if ( isdefined( level.zombie_include_buildables ) && !isdefined( level.zombie_include_buildables[buildable_name] ) ) - return; - - precachestring( hint ); - - if ( isdefined( building ) ) - precachestring( building ); - - if ( isdefined( bought ) ) - precachestring( bought ); - - buildable_struct = level.zombie_include_buildables[buildable_name]; - - if ( !isdefined( level.zombie_buildables ) ) - level.zombie_buildables = []; - - buildable_struct.hint = hint; - buildable_struct.building = building; - buildable_struct.bought = bought; + if ( !isDefined( level.zombie_include_buildables ) ) + { + level.zombie_include_buildables = []; + } + if ( isDefined( level.zombie_include_buildables ) && !isDefined( level.zombie_include_buildables[ buildable_name ] ) ) + { + return; + } + precachestring( hint ); + if ( isDefined( building ) ) + { + precachestring( building ); + } + if ( isDefined( bought ) ) + { + precachestring( bought ); + } + buildable_struct = level.zombie_include_buildables[ buildable_name ]; + if ( !isDefined( level.zombie_buildables ) ) + { + level.zombie_buildables = []; + } + buildable_struct.hint = hint; + buildable_struct.building = building; + buildable_struct.bought = bought; + /* /# - println( "ZM >> Looking for buildable - " + buildable_struct.name ); + println( "ZM >> Looking for buildable - " + buildable_struct.name ); #/ - level.zombie_buildables[buildable_struct.name] = buildable_struct; - - if ( !level.createfx_enabled ) - { - if ( level.zombie_buildables.size == 1 ) - register_clientfields(); - } + */ + level.zombie_buildables[ buildable_struct.name ] = buildable_struct; + if ( !level.createfx_enabled ) + { + if ( level.zombie_buildables.size == 1 ) + { + register_clientfields(); + } + } } -register_clientfields() +register_clientfields() //checked changed to match cerberus output { - if ( isdefined( level.buildable_slot_count ) ) - { - for ( i = 0; i < level.buildable_slot_count; i++ ) - { - bits = getminbitcountfornum( level.buildable_piece_counts[i] ); - registerclientfield( "toplayer", level.buildable_clientfields[i], 12000, bits, "int" ); - } - } - else - { - bits = getminbitcountfornum( level.buildable_piece_count ); - registerclientfield( "toplayer", "buildable", 1, bits, "int" ); - } + if ( isDefined( level.buildable_slot_count ) ) + { + for ( i = 0; i < level.buildable_slot_count; i++ ) + { + bits = getminbitcountfornum( level.buildable_piece_counts[ i ] ); + registerclientfield( "toplayer", level.buildable_clientfields[ i ], 12000, bits, "int" ); + } + } + else + { + bits = getminbitcountfornum( level.buildable_piece_count ); + registerclientfield( "toplayer", "buildable", 1, bits, "int" ); + } } -set_buildable_clientfield( slot, newvalue ) +set_buildable_clientfield( slot, newvalue ) //checked matches cerberus output { - if ( isdefined( level.buildable_slot_count ) ) - self setclientfieldtoplayer( level.buildable_clientfields[slot], newvalue ); - else - self setclientfieldtoplayer( "buildable", newvalue ); + if ( isDefined( level.buildable_slot_count ) ) + { + self setclientfieldtoplayer( level.buildable_clientfields[ slot ], newvalue ); + } + else + { + self setclientfieldtoplayer( "buildable", newvalue ); + } } -clear_buildable_clientfield( slot ) +clear_buildable_clientfield( slot ) //checked matches cerberus output { - self set_buildable_clientfield( slot, 0 ); + self set_buildable_clientfield( slot, 0 ); } -include_zombie_buildable( buiildable_struct ) +include_zombie_buildable( buiildable_struct ) //checked matches cerberus output { - if ( !isdefined( level.zombie_include_buildables ) ) - level.zombie_include_buildables = []; + if ( !isDefined( level.zombie_include_buildables ) ) + { + level.zombie_include_buildables = []; + } + /* /# - println( "ZM >> Including buildable - " + buiildable_struct.name ); + println( "ZM >> Including buildable - " + buiildable_struct.name ); #/ - level.zombie_include_buildables[buiildable_struct.name] = buiildable_struct; + */ + level.zombie_include_buildables[ buiildable_struct.name ] = buiildable_struct; } -generate_zombie_buildable_piece( buildablename, modelname, radius, height, drop_offset, hud_icon, onpickup, ondrop, use_spawn_num, part_name, can_reuse, client_field_state, buildable_slot ) +generate_zombie_buildable_piece( buildablename, modelname, radius, height, drop_offset, hud_icon, onpickup, ondrop, use_spawn_num, part_name, can_reuse, client_field_state, buildable_slot ) //checked changed to match cerberus output { - precachemodel( modelname ); - - if ( isdefined( hud_icon ) ) - precacheshader( hud_icon ); - - piece = spawnstruct(); - buildable_pieces = []; - buildable_pieces_structs = getstructarray( buildablename + "_" + modelname, "targetname" ); + precachemodel( modelname ); + if ( isDefined( hud_icon ) ) + { + precacheshader( hud_icon ); + } + piece = spawnstruct(); + buildable_pieces = []; + buildable_pieces_structs = patch_zm\common_scripts\utility::getstructarray( buildablename + "_" + modelname, "targetname" ); + /* /# - if ( buildable_pieces_structs.size < 1 ) - println( "ERROR: Missing buildable piece <" + buildablename + "> <" + modelname + ">\n" ); + if ( buildable_pieces_structs.size < 1 ) + { + println( "ERROR: Missing buildable piece <" + buildablename + "> <" + modelname + ">\n" ); #/ - foreach ( index, struct in buildable_pieces_structs ) - { - buildable_pieces[index] = struct; - buildable_pieces[index].hasspawned = 0; - } - - piece.spawns = buildable_pieces; - piece.buildablename = buildablename; - piece.modelname = modelname; - piece.hud_icon = hud_icon; - piece.radius = radius; - piece.height = height; - piece.part_name = part_name; - piece.can_reuse = can_reuse; - piece.drop_offset = drop_offset; - piece.max_instances = 256; - - if ( isdefined( buildable_slot ) ) - piece.buildable_slot = buildable_slot; - else - piece.buildable_slot = 0; - - piece.onpickup = onpickup; - piece.ondrop = ondrop; - piece.use_spawn_num = use_spawn_num; - piece.client_field_state = client_field_state; - return piece; + } + */ + foreach ( struct in buildable_pieces_structs ) + { + buildable_pieces[ index ] = struct; + buildable_pieces[ index ].hasspawned = 0; + } + piece.spawns = buildable_pieces; + piece.buildablename = buildablename; + piece.modelname = modelname; + piece.hud_icon = hud_icon; + piece.radius = radius; + piece.height = height; + piece.part_name = part_name; + piece.can_reuse = can_reuse; + piece.drop_offset = drop_offset; + piece.max_instances = 256; + if ( isDefined( buildable_slot ) ) + { + piece.buildable_slot = buildable_slot; + } + else + { + piece.buildable_slot = 0; + } + piece.onpickup = onpickup; + piece.ondrop = ondrop; + piece.use_spawn_num = use_spawn_num; + piece.client_field_state = client_field_state; + return piece; } -manage_multiple_pieces( max_instances, min_instances ) +manage_multiple_pieces( max_instances, min_instances ) //checked matches cerberus output { - self.max_instances = max_instances; - self.min_instances = min_instances; - self.managing_pieces = 1; - self.piece_allocated = []; + self.max_instances = max_instances; + self.min_instances = min_instances; + self.managing_pieces = 1; + self.piece_allocated = []; } -buildable_set_force_spawn_location( str_kvp, str_name ) +buildable_set_force_spawn_location( str_kvp, str_name ) //checked matches cerberus output { - self.str_force_spawn_kvp = str_kvp; - self.str_force_spawn_name = str_name; + self.str_force_spawn_kvp = str_kvp; + self.str_force_spawn_name = str_name; } -buildable_use_cyclic_spawns( randomize_start_location ) +buildable_use_cyclic_spawns( randomize_start_location ) //checked matches cerberus output { - self.use_cyclic_spawns = 1; - self.randomize_cyclic_index = randomize_start_location; + self.use_cyclic_spawns = 1; + self.randomize_cyclic_index = randomize_start_location; } -combine_buildable_pieces( piece1, piece2, piece3 ) +combine_buildable_pieces( piece1, piece2, piece3 ) //checked matches cerberus output { - spawns1 = piece1.spawns; - spawns2 = piece2.spawns; - spawns = arraycombine( spawns1, spawns2, 1, 0 ); - - if ( isdefined( piece3 ) ) - { - spawns3 = piece3.spawns; - spawns = arraycombine( spawns, spawns3, 1, 0 ); - spawns = array_randomize( spawns ); - piece3.spawns = spawns; - } - else - spawns = array_randomize( spawns ); - - piece1.spawns = spawns; - piece2.spawns = spawns; + spawns1 = piece1.spawns; + spawns2 = piece2.spawns; + spawns = arraycombine( spawns1, spawns2, 1, 0 ); + if ( isDefined( piece3 ) ) + { + spawns3 = piece3.spawns; + spawns = arraycombine( spawns, spawns3, 1, 0 ); + spawns = array_randomize( spawns ); + piece3.spawns = spawns; + } + else + { + spawns = array_randomize( spawns ); + } + piece1.spawns = spawns; + piece2.spawns = spawns; } -add_buildable_piece( piece, part_name, can_reuse ) +add_buildable_piece( piece, part_name, can_reuse ) //checked matches cerberus output { - if ( !isdefined( self.buildablepieces ) ) - self.buildablepieces = []; - - if ( isdefined( part_name ) ) - piece.part_name = part_name; - - if ( isdefined( can_reuse ) ) - piece.can_reuse = can_reuse; - - self.buildablepieces[self.buildablepieces.size] = piece; - - if ( !isdefined( self.buildable_slot ) ) - self.buildable_slot = piece.buildable_slot; - else - { + if ( !isDefined( self.buildablepieces ) ) + { + self.buildablepieces = []; + } + if ( isDefined( part_name ) ) + { + piece.part_name = part_name; + } + if ( isDefined( can_reuse ) ) + { + piece.can_reuse = can_reuse; + } + self.buildablepieces[ self.buildablepieces.size ] = piece; + if ( !isDefined( self.buildable_slot ) ) + { + self.buildable_slot = piece.buildable_slot; + } + else + { + /* /# - assert( self.buildable_slot == piece.buildable_slot ); + assert( self.buildable_slot == piece.buildable_slot ); #/ - } + */ + } } -create_zombie_buildable_piece( modelname, radius, height, hud_icon ) +create_zombie_buildable_piece( modelname, radius, height, hud_icon ) //checked matches cerberus output { - piece = generate_zombie_buildable_piece( self.name, modelname, radius, height, hud_icon ); - self add_buildable_piece( piece ); + piece = generate_zombie_buildable_piece( self.name, modelname, radius, height, hud_icon ); + self add_buildable_piece( piece ); } -onplayerlaststand() +onplayerlaststand() //checked partially changed to match cerberus output { - pieces = self player_get_buildable_pieces(); - spawn_pos = []; - spawn_pos[0] = self.origin; - - if ( pieces.size >= 2 ) - { - nodes = getnodesinradiussorted( self.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), 120, 30, 72, "path", 5 ); - - for ( i = 0; i < pieces.size; i++ ) - { - if ( i < nodes.size && check_point_in_playable_area( nodes[i].origin ) ) - { - spawn_pos[i] = nodes[i].origin; - continue; - } - - spawn_pos[i] = self.origin + vectorscale( ( 1, 1, 0 ), 5.0 ); - } - } - - spawnidx = 0; - - foreach ( piece in pieces ) - { - slot = piece.buildable_slot; - - if ( isdefined( piece ) ) - { - return_to_start_pos = 0; - - if ( isdefined( level.safe_place_for_buildable_piece ) ) - { - if ( !self [[ level.safe_place_for_buildable_piece ]]( piece ) ) - return_to_start_pos = 1; - } - - if ( return_to_start_pos ) - piece piece_spawn_at(); - else if ( pieces.size < 2 ) - piece piece_spawn_at( self.origin + vectorscale( ( 1, 1, 0 ), 5.0 ), self.angles ); - else - piece piece_spawn_at( spawn_pos[spawnidx], self.angles ); - - if ( isdefined( piece.ondrop ) ) - piece [[ piece.ondrop ]]( self ); - - self clear_buildable_clientfield( slot ); - spawnidx++; - } - - self player_set_buildable_piece( undefined, slot ); - self notify( "piece_released" + slot ); - } + pieces = self player_get_buildable_pieces(); + spawn_pos = []; + spawn_pos[ 0 ] = self.origin; + if ( pieces.size >= 2 ) + { + nodes = getnodesinradiussorted( self.origin + vectorScale( ( 0, 0, 1 ), 30 ), 120, 30, 72, "path", 5 ); + i = 0; + while ( i < pieces.size ) + { + if ( i < nodes.size && check_point_in_playable_area( nodes[ i ].origin ) ) + { + spawn_pos[ i ] = nodes[ i ].origin; + i++; + continue; + } + spawn_pos[ i ] = self.origin + vectorScale( ( 0, 0, 1 ), 5 ); + i++; + } + } + spawnidx = 0; + foreach ( piece in pieces ) + { + slot = piece.buildable_slot; + if ( isDefined( piece ) ) + { + return_to_start_pos = 0; + if ( isDefined( level.safe_place_for_buildable_piece ) ) + { + if ( !( self [[ level.safe_place_for_buildable_piece ]]( piece ) ) ) + { + return_to_start_pos = 1; + } + } + if ( return_to_start_pos ) + { + piece piece_spawn_at(); + } + else if ( pieces.size < 2 ) + { + piece piece_spawn_at( self.origin + vectorScale( ( 1, 1, 0 ), 5 ), self.angles ); + } + else + { + piece piece_spawn_at( spawn_pos[ spawnidx ], self.angles ); + } + if ( isDefined( piece.ondrop ) ) + { + piece [[ piece.ondrop ]]( self ); + } + self clear_buildable_clientfield( slot ); + spawnidx++; + } + self player_set_buildable_piece( undefined, slot ); + self notify( "piece_released" + slot ); + } } -piecestub_get_unitrigger_origin() +piecestub_get_unitrigger_origin() //checked matches cerberus output { - if ( isdefined( self.origin_parent ) ) - return self.origin_parent.origin + vectorscale( ( 0, 0, 1 ), 12.0 ); - - return self.origin; + if ( isDefined( self.origin_parent ) ) + { + return self.origin_parent.origin + vectorScale( ( 0, 0, 1 ), 12 ); + } + return self.origin; } -generate_piece_unitrigger( classname, origin, angles, flags, radius, script_height, moving ) +generate_piece_unitrigger( classname, origin, angles, flags, radius, script_height, moving ) //checked matches cerberus output { - if ( !isdefined( radius ) ) - radius = 64; - - if ( !isdefined( script_height ) ) - script_height = 64; - - script_width = script_height; - - if ( !isdefined( script_width ) ) - script_width = 64; - - script_length = script_height; - - if ( !isdefined( script_length ) ) - script_length = 64; - - unitrigger_stub = spawnstruct(); - unitrigger_stub.origin = origin; - - if ( isdefined( script_length ) ) - unitrigger_stub.script_length = script_length; - else - unitrigger_stub.script_length = 13.5; - - if ( isdefined( script_width ) ) - unitrigger_stub.script_width = script_width; - else - unitrigger_stub.script_width = 27.5; - - if ( isdefined( script_height ) ) - unitrigger_stub.script_height = script_height; - else - unitrigger_stub.script_height = 24; - - unitrigger_stub.radius = radius; - unitrigger_stub.cursor_hint = "HINT_NOICON"; - unitrigger_stub.hint_string = &"ZOMBIE_BUILD_PIECE_GRAB"; - unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; - unitrigger_stub.require_look_at = 0; - - switch ( classname ) - { - case "trigger_radius": - unitrigger_stub.script_unitrigger_type = "unitrigger_radius"; - break; - case "trigger_radius_use": - unitrigger_stub.script_unitrigger_type = "unitrigger_radius_use"; - break; - case "trigger_box": - unitrigger_stub.script_unitrigger_type = "unitrigger_box"; - break; - case "trigger_box_use": - unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; - break; - } - - unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); - unitrigger_stub.prompt_and_visibility_func = ::piecetrigger_update_prompt; - unitrigger_stub.originfunc = ::piecestub_get_unitrigger_origin; - unitrigger_stub.onspawnfunc = ::anystub_on_spawn_trigger; - - if ( isdefined( moving ) && moving ) - maps\mp\zombies\_zm_unitrigger::register_unitrigger( unitrigger_stub, ::piece_unitrigger_think ); - else - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::piece_unitrigger_think ); - - return unitrigger_stub; + if ( !isDefined( radius ) ) + { + radius = 64; + } + if ( !isDefined( script_height ) ) + { + script_height = 64; + } + script_width = script_height; + if ( !isDefined( script_width ) ) + { + script_width = 64; + } + script_length = script_height; + if ( !isDefined( script_length ) ) + { + script_length = 64; + } + unitrigger_stub = spawnstruct(); + unitrigger_stub.origin = origin; + if ( isDefined( script_length ) ) + { + unitrigger_stub.script_length = script_length; + } + else + { + unitrigger_stub.script_length = 13.5; + } + if ( isDefined( script_width ) ) + { + unitrigger_stub.script_width = script_width; + } + else + { + unitrigger_stub.script_width = 27.5; + } + if ( isDefined( script_height ) ) + { + unitrigger_stub.script_height = script_height; + } + else + { + unitrigger_stub.script_height = 24; + } + unitrigger_stub.radius = radius; + unitrigger_stub.cursor_hint = "HINT_NOICON"; + unitrigger_stub.hint_string = &"ZOMBIE_BUILD_PIECE_GRAB"; + unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + unitrigger_stub.require_look_at = 0; + switch( classname ) + { + case "trigger_radius": + unitrigger_stub.script_unitrigger_type = "unitrigger_radius"; + break; + case "trigger_radius_use": + unitrigger_stub.script_unitrigger_type = "unitrigger_radius_use"; + break; + case "trigger_box": + unitrigger_stub.script_unitrigger_type = "unitrigger_box"; + break; + case "trigger_box_use": + unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + break; + } + unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); + unitrigger_stub.prompt_and_visibility_func = ::piecetrigger_update_prompt; + unitrigger_stub.originfunc = ::piecestub_get_unitrigger_origin; + unitrigger_stub.onspawnfunc = ::anystub_on_spawn_trigger; + if ( is_true( moving ) ) + { + maps/mp/zombies/_zm_unitrigger::register_unitrigger( unitrigger_stub, ::piece_unitrigger_think ); + } + else + { + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::piece_unitrigger_think ); + } + return unitrigger_stub; } -piecetrigger_update_prompt( player ) +piecetrigger_update_prompt( player ) //checked matches cerberus output { - can_use = self.stub piecestub_update_prompt( player ); - self setinvisibletoplayer( player, !can_use ); - - if ( isdefined( self.stub.hint_parm1 ) ) - self sethintstring( self.stub.hint_string, self.stub.hint_parm1 ); - else - self sethintstring( self.stub.hint_string ); - - if ( isdefined( self.stub.cursor_hint ) ) - { - if ( self.stub.cursor_hint == "HINT_WEAPON" && isdefined( self.stub.cursor_hint_weapon ) ) - self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon ); - else - self setcursorhint( self.stub.cursor_hint ); - } - - return can_use; + can_use = self.stub piecestub_update_prompt( player ); + self setinvisibletoplayer( player, !can_use ); + if ( isDefined( self.stub.hint_parm1 ) ) + { + self sethintstring( self.stub.hint_string, self.stub.hint_parm1 ); + } + else + { + self sethintstring( self.stub.hint_string ); + } + if ( isDefined( self.stub.cursor_hint ) ) + { + if ( self.stub.cursor_hint == "HINT_WEAPON" && isDefined( self.stub.cursor_hint_weapon ) ) + { + self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon ); + } + else + { + self setcursorhint( self.stub.cursor_hint ); + } + } + return can_use; } -piecestub_update_prompt( player ) +piecestub_update_prompt( player ) //checked changed to match cerberus output { - if ( !self anystub_update_prompt( player ) ) - { - self.cursor_hint = "HINT_NOICON"; - return false; - } - - if ( isdefined( player player_get_buildable_piece( self.piece.buildable_slot ) ) ) - { - spiece = self.piece; - cpiece = player player_get_buildable_piece( self.piece.buildable_slot ); - - if ( spiece.modelname == cpiece.modelname && spiece.buildablename == cpiece.buildablename && ( !isdefined( spiece.script_noteworthy ) || !isdefined( cpiece.script_noteworthy ) || spiece.script_noteworthy == cpiece.script_noteworthy ) ) - { - self.hint_string = ""; - return false; - } - - if ( isdefined( spiece.hint_swap ) ) - { - self.hint_string = spiece.hint_swap; - self.hint_parm1 = self.piece.hint_swap_parm1; - } - else - self.hint_string = &"ZOMBIE_BUILD_PIECE_SWITCH"; - - if ( isdefined( self.piece.cursor_hint ) ) - self.cursor_hint = self.piece.cursor_hint; - - if ( isdefined( self.piece.cursor_hint_weapon ) ) - self.cursor_hint_weapon = self.piece.cursor_hint_weapon; - } - else - { - if ( isdefined( self.piece.hint_grab ) ) - { - self.hint_string = self.piece.hint_grab; - self.hint_parm1 = self.piece.hint_grab_parm1; - } - else - self.hint_string = &"ZOMBIE_BUILD_PIECE_GRAB"; - - if ( isdefined( self.piece.cursor_hint ) ) - self.cursor_hint = self.piece.cursor_hint; - - if ( isdefined( self.piece.cursor_hint_weapon ) ) - self.cursor_hint_weapon = self.piece.cursor_hint_weapon; - } - - return true; + if ( !self anystub_update_prompt( player ) ) + { + self.cursor_hint = "HINT_NOICON"; + return 0; + } + if ( isDefined( player player_get_buildable_piece( self.piece.buildable_slot ) ) ) + { + spiece = self.piece; + cpiece = player player_get_buildable_piece( self.piece.buildable_slot ); + if ( spiece.modelname == cpiece.modelname && spiece.buildablename == cpiece.buildablename && isDefined( spiece.script_noteworthy ) || !isDefined( cpiece.script_noteworthy ) && spiece.script_noteworthy == cpiece.script_noteworthy ) + { + self.hint_string = ""; + return 0; + } + if ( isDefined( spiece.hint_swap ) ) + { + self.hint_string = spiece.hint_swap; + self.hint_parm1 = self.piece.hint_swap_parm1; + } + else + { + self.hint_string = &"ZOMBIE_BUILD_PIECE_SWITCH"; + } + if ( isDefined( self.piece.cursor_hint ) ) + { + self.cursor_hint = self.piece.cursor_hint; + } + if ( isDefined( self.piece.cursor_hint_weapon ) ) + { + self.cursor_hint_weapon = self.piece.cursor_hint_weapon; + } + } + else if ( isDefined( self.piece.hint_grab ) ) + { + self.hint_string = self.piece.hint_grab; + self.hint_parm1 = self.piece.hint_grab_parm1; + } + else + { + self.hint_string = &"ZOMBIE_BUILD_PIECE_GRAB"; + } + if ( isDefined( self.piece.cursor_hint ) ) + { + self.cursor_hint = self.piece.cursor_hint; + } + if ( isDefined( self.piece.cursor_hint_weapon ) ) + { + self.cursor_hint_weapon = self.piece.cursor_hint_weapon; + } + return 1; } -piece_unitrigger_think() +piece_unitrigger_think() //checked changed to match cerberus output { - self endon( "kill_trigger" ); - - while ( true ) - { - self waittill( "trigger", player ); - - if ( player != self.parent_player ) - continue; - - if ( isdefined( player.screecher_weapon ) ) - continue; - - if ( !is_player_valid( player ) ) - { - player thread ignore_triggers( 0.5 ); - continue; - } - - status = player player_can_take_piece( self.stub.piece ); - - if ( !status ) - { - self.stub.hint_string = ""; - self sethintstring( self.stub.hint_string ); - } - else - player thread player_take_piece( self.stub.piece ); - } + self endon( "kill_trigger" ); + while ( 1 ) + { + self waittill( "trigger", player ); + if ( player != self.parent_player ) + { + continue; + } + if ( isDefined( player.screecher_weapon ) ) + { + continue; + } + if ( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0,5 ); + } + status = player player_can_take_piece( self.stub.piece ); + if ( !status ) + { + self.stub.hint_string = ""; + self sethintstring( self.stub.hint_string ); + } + else + { + player thread player_take_piece( self.stub.piece ); + } + } } -player_get_buildable_pieces() +player_get_buildable_pieces() //checked matches cerberus output { - if ( !isdefined( self.current_buildable_pieces ) ) - self.current_buildable_pieces = []; - - return self.current_buildable_pieces; + if ( !isDefined( self.current_buildable_pieces ) ) + { + self.current_buildable_pieces = []; + } + return self.current_buildable_pieces; } -player_get_buildable_piece( slot ) +player_get_buildable_piece( slot ) //checked matches cerberus output { - if ( !isdefined( slot ) ) - slot = 0; - - if ( !isdefined( self.current_buildable_pieces ) ) - self.current_buildable_pieces = []; - - return self.current_buildable_pieces[slot]; + if ( !isDefined( slot ) ) + { + slot = 0; + } + if ( !isDefined( self.current_buildable_pieces ) ) + { + self.current_buildable_pieces = []; + } + return self.current_buildable_pieces[ slot ]; } -player_set_buildable_piece( piece, slot ) +player_set_buildable_piece( piece, slot ) //checked matches cerberus output { - if ( !isdefined( slot ) ) - slot = 0; + if ( !isDefined( slot ) ) + { + slot = 0; + } + /* /# - if ( isdefined( slot ) && isdefined( piece ) && isdefined( piece.buildable_slot ) ) - { -/# - assert( slot == piece.buildable_slot ); + if ( isDefined( slot ) && isDefined( piece ) && isDefined( piece.buildable_slot ) ) + { + assert( slot == piece.buildable_slot ); #/ - } -#/ - if ( !isdefined( self.current_buildable_pieces ) ) - self.current_buildable_pieces = []; - - self.current_buildable_pieces[slot] = piece; + } + */ + if ( !isDefined( self.current_buildable_pieces ) ) + { + self.current_buildable_pieces = []; + } + self.current_buildable_pieces[ slot ] = piece; } -player_can_take_piece( piece ) +player_can_take_piece( piece ) //checked matches cerberus output { - if ( !isdefined( piece ) ) - return false; - - return true; + if ( !isDefined( piece ) ) + { + return 0; + } + return 1; } -dbline( from, to ) +dbline( from, to ) //checked matches cerberus output { + /* /# - time = 20; - - while ( time > 0 ) - { - line( from, to, ( 0, 0, 1 ), 0, 1 ); - time -= 0.05; - wait 0.05; - } + time = 20; + while ( time > 0 ) + { + line( from, to, ( 0, 0, 1 ), 0, 1 ); + time -= 0.05; + wait 0.05; #/ + } + */ } -player_throw_piece( piece, origin, dir, return_to_spawn, return_time, endangles ) +player_throw_piece( piece, origin, dir, return_to_spawn, return_time, endangles ) //checked changed to match cerberus output { + /* /# - assert( isdefined( piece ) ); + assert( isDefined( piece ) ); #/ - if ( isdefined( piece ) ) - { + */ + if ( isDefined( piece ) ) + { + /* /# - thread dbline( origin, origin + dir ); + thread dbline( origin, origin + dir ); #/ - pass = 0; - done = 0; - altmodel = undefined; - - while ( pass < 2 && !done ) - { - grenade = self magicgrenadetype( "buildable_piece_zm", origin, dir, 30000 ); - grenade thread watch_hit_players(); - grenade ghost(); - - if ( !isdefined( altmodel ) ) - { - altmodel = spawn( "script_model", grenade.origin ); - altmodel setmodel( piece.modelname ); - } - - altmodel.origin = grenade.angles; - altmodel.angles = grenade.angles; - altmodel linkto( grenade, "", ( 0, 0, 0 ), ( 0, 0, 0 ) ); - grenade.altmodel = altmodel; - - grenade waittill( "stationary" ); - - grenade_origin = grenade.origin; - grenade_angles = grenade.angles; - landed_on = grenade getgroundent(); - grenade delete(); - - if ( isdefined( landed_on ) && landed_on == level ) - done = 1; - else - { - origin = grenade_origin; - dir = ( dir[0] * -1 / 10, dir[1] * -1 / 10, -1 ); - pass++; - } - } - - if ( !isdefined( endangles ) ) - endangles = grenade_angles; - - piece piece_spawn_at( grenade_origin, endangles ); - - if ( isdefined( altmodel ) ) - altmodel delete(); - - if ( isdefined( piece.ondrop ) ) - piece [[ piece.ondrop ]]( self ); - - if ( isdefined( return_to_spawn ) && return_to_spawn ) - piece piece_wait_and_return( return_time ); - } + */ + pass = 0; + done = 0; + altmodel = undefined; + while ( pass < 2 && !done ) + { + grenade = self magicgrenadetype( "buildable_piece_zm", origin, dir, 30000 ); + grenade thread watch_hit_players(); + grenade ghost(); + if ( !isDefined( altmodel ) ) + { + altmodel = spawn( "script_model", grenade.origin ); + altmodel setmodel( piece.modelname ); + } + altmodel.origin = grenade.angles; + altmodel.angles = grenade.angles; + altmodel linkto( grenade, "", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + grenade.altmodel = altmodel; + grenade waittill( "stationary" ); + grenade_origin = grenade.origin; + grenade_angles = grenade.angles; + landed_on = grenade getgroundent(); + grenade delete(); + if ( isDefined( landed_on ) && landed_on == level ) + { + done = 1; + } + else + { + origin = grenade_origin; + dir = ( ( dir[ 0 ] * -1 ) / 10, ( dir[ 1 ] * -1 ) / 10, -1 ); + pass++; + } + } + if ( !isDefined( endangles ) ) + { + endangles = grenade_angles; + } + piece piece_spawn_at( grenade_origin, endangles ); + if ( isDefined( altmodel ) ) + { + altmodel delete(); + } + if ( isDefined( piece.ondrop ) ) + { + piece [[ piece.ondrop ]]( self ); + } + if ( is_true( return_to_spawn ) ) + { + piece piece_wait_and_return( return_time ); + } + } } -watch_hit_players() +watch_hit_players() //checked matches cerberus output { - self endon( "death" ); - self endon( "stationary" ); - - while ( isdefined( self ) ) - { - self waittill( "grenade_bounce", pos, normal, ent ); - - if ( isplayer( ent ) ) - ent explosiondamage( 25, pos ); - } + self endon( "death" ); + self endon( "stationary" ); + while ( isDefined( self ) ) + { + self waittill( "grenade_bounce", pos, normal, ent ); + if ( isplayer( ent ) ) + { + ent explosiondamage( 25, pos ); + } + } } -piece_wait_and_return( return_time ) +piece_wait_and_return( return_time ) //checked matches cerberus output { - self endon( "pickup" ); - wait 0.15; - - if ( isdefined( level.exploding_jetgun_fx ) ) - playfxontag( level.exploding_jetgun_fx, self.model, "tag_origin" ); - else - playfxontag( level._effect["powerup_on"], self.model, "tag_origin" ); - - wait( return_time - 6 ); - self piece_hide(); - wait 1; - self piece_show(); - wait 1; - self piece_hide(); - wait 1; - self piece_show(); - wait 1; - self piece_hide(); - wait 1; - self piece_show(); - wait 1; - self notify( "respawn" ); - self piece_unspawn(); - self piece_spawn_at(); + self endon( "pickup" ); + wait 0.15; + if ( isDefined( level.exploding_jetgun_fx ) ) + { + playfxontag( level.exploding_jetgun_fx, self.model, "tag_origin" ); + } + else + { + playfxontag( level._effect[ "powerup_on" ], self.model, "tag_origin" ); + } + wait ( return_time - 6 ); + self piece_hide(); + wait 1; + self piece_show(); + wait 1; + self piece_hide(); + wait 1; + self piece_show(); + wait 1; + self piece_hide(); + wait 1; + self piece_show(); + wait 1; + self notify( "respawn" ); + self piece_unspawn(); + self piece_spawn_at(); } -player_return_piece_to_original_spawn( slot ) +player_return_piece_to_original_spawn( slot ) //checked matches cerberus output { - if ( !isdefined( slot ) ) - slot = 0; - - self notify( "piece_released" + slot ); - piece = self player_get_buildable_piece( slot ); - self player_set_buildable_piece( undefined, slot ); - - if ( isdefined( piece ) ) - { - piece piece_spawn_at(); - self clear_buildable_clientfield( slot ); - } + if ( !isDefined( slot ) ) + { + slot = 0; + } + self notify( "piece_released" + slot ); + piece = self player_get_buildable_piece( slot ); + self player_set_buildable_piece( undefined, slot ); + if ( isDefined( piece ) ) + { + piece piece_spawn_at(); + self clear_buildable_clientfield( slot ); + } } -player_drop_piece_on_death( slot ) +player_drop_piece_on_death( slot ) //checked matches cerberus output { - self notify( "piece_released" + slot ); - self endon( "piece_released" + slot ); - origin = self.origin; - angles = self.angles; - piece = self player_get_buildable_piece( slot ); - - self waittill( "death_or_disconnect" ); - - piece piece_spawn_at( origin, angles ); - - if ( isdefined( self ) ) - self clear_buildable_clientfield( slot ); - - if ( isdefined( piece.ondrop ) ) - piece [[ piece.ondrop ]]( self ); + self notify( "piece_released" + slot ); + self endon( "piece_released" + slot ); + origin = self.origin; + angles = self.angles; + piece = self player_get_buildable_piece( slot ); + self waittill( "death_or_disconnect" ); + piece piece_spawn_at( origin, angles ); + if ( isDefined( self ) ) + { + self clear_buildable_clientfield( slot ); + } + if ( isDefined( piece.ondrop ) ) + { + piece [[ piece.ondrop ]]( self ); + } } -player_drop_piece( piece, slot ) +player_drop_piece( piece, slot ) //checked matches cerberus output { - if ( !isdefined( slot ) ) - slot = 0; - - if ( !isdefined( piece ) ) - piece = self player_get_buildable_piece( slot ); - else - slot = piece.buildable_slot; - - if ( isdefined( piece ) ) - { - origin = self.origin; - origintrace = groundtrace( origin + vectorscale( ( 0, 0, 1 ), 5.0 ), origin - vectorscale( ( 0, 0, 1 ), 999999.0 ), 0, self ); - - if ( isdefined( origintrace["entity"] ) ) - origintrace = groundtrace( origintrace["entity"].origin, origintrace["entity"].origin - vectorscale( ( 0, 0, 1 ), 999999.0 ), 0, origintrace["entity"] ); - - if ( isdefined( origintrace["position"] ) ) - origin = origintrace["position"]; - - piece.damage = 0; - piece piece_spawn_at( origin, self.angles ); - - if ( isplayer( self ) ) - self clear_buildable_clientfield( slot ); - - if ( isdefined( piece.ondrop ) ) - piece [[ piece.ondrop ]]( self ); - } - - self player_set_buildable_piece( undefined, slot ); - self notify( "piece_released" + slot ); + if ( !isDefined( slot ) ) + { + slot = 0; + } + if ( !isDefined( piece ) ) + { + piece = self player_get_buildable_piece( slot ); + } + else + { + slot = piece.buildable_slot; + } + if ( isDefined( piece ) ) + { + origin = self.origin; + origintrace = groundtrace( origin + vectorScale( ( 0, 0, 1 ), 5 ), origin - vectorScale( ( 0, 0, 1 ), 999999 ), 0, self ); + if ( isDefined( origintrace[ "entity" ] ) ) + { + origintrace = groundtrace( origintrace[ "entity" ].origin, origintrace[ "entity" ].origin - vectorScale( ( 0, 0, 1 ), 999999 ), 0, origintrace[ "entity" ] ); + } + if ( isDefined( origintrace[ "position" ] ) ) + { + origin = origintrace[ "position" ]; + } + piece.damage = 0; + piece piece_spawn_at( origin, self.angles ); + if ( isplayer( self ) ) + { + self clear_buildable_clientfield( slot ); + } + if ( isDefined( piece.ondrop ) ) + { + piece [[ piece.ondrop ]]( self ); + } + } + self player_set_buildable_piece( undefined, slot ); + self notify( "piece_released" + slot ); } -player_take_piece( piece ) +player_take_piece( piece ) //checked matches cerberus output { - piece_slot = piece.buildable_slot; - damage = piece.damage; - - if ( isdefined( self player_get_buildable_piece( piece_slot ) ) ) - { - other_piece = self player_get_buildable_piece( piece_slot ); - self player_drop_piece( self player_get_buildable_piece( piece_slot ), piece_slot ); - other_piece.damage = damage; - self do_player_general_vox( "general", "build_swap" ); - } - - if ( isdefined( piece.onpickup ) ) - piece [[ piece.onpickup ]]( self ); - - piece piece_unspawn(); - piece notify( "pickup" ); - - if ( isplayer( self ) ) - { - if ( isdefined( piece.client_field_state ) ) - self set_buildable_clientfield( piece_slot, piece.client_field_state ); - - self player_set_buildable_piece( piece, piece_slot ); - self thread player_drop_piece_on_death( piece_slot ); - self track_buildable_piece_pickedup( piece ); - } + piece_slot = piece.buildable_slot; + damage = piece.damage; + if ( isDefined( self player_get_buildable_piece( piece_slot ) ) ) + { + other_piece = self player_get_buildable_piece( piece_slot ); + self player_drop_piece( self player_get_buildable_piece( piece_slot ), piece_slot ); + other_piece.damage = damage; + self do_player_general_vox( "general", "build_swap" ); + } + if ( isDefined( piece.onpickup ) ) + { + piece [[ piece.onpickup ]]( self ); + } + piece piece_unspawn(); + piece notify( "pickup" ); + if ( isplayer( self ) ) + { + if ( isDefined( piece.client_field_state ) ) + { + self set_buildable_clientfield( piece_slot, piece.client_field_state ); + } + self player_set_buildable_piece( piece, piece_slot ); + self thread player_drop_piece_on_death( piece_slot ); + self track_buildable_piece_pickedup( piece ); + } } -player_destroy_piece( piece ) +player_destroy_piece( piece ) //checked matches cerberus output { - if ( !isdefined( piece ) ) - piece = self player_get_buildable_piece(); - - if ( isplayer( self ) ) - { - slot = piece.buildable_slot; - - if ( isdefined( piece ) ) - { - piece piece_destroy(); - self clear_buildable_clientfield( slot ); - } - - self player_set_buildable_piece( undefined, slot ); - self notify( "piece_released" + slot ); - } + if ( !isDefined( piece ) ) + { + piece = self player_get_buildable_piece(); + } + if ( isplayer( self ) ) + { + slot = piece.buildable_slot; + if ( isDefined( piece ) ) + { + piece piece_destroy(); + self clear_buildable_clientfield( slot ); + } + self player_set_buildable_piece( undefined, slot ); + self notify( "piece_released" + slot ); + } } -claim_location( location ) +claim_location( location ) //checked matches cerberus output { - if ( !isdefined( level.buildable_claimed_locations ) ) - level.buildable_claimed_locations = []; - - if ( !isdefined( level.buildable_claimed_locations[location] ) ) - { - level.buildable_claimed_locations[location] = 1; - return true; - } - - return false; + if ( !isDefined( level.buildable_claimed_locations ) ) + { + level.buildable_claimed_locations = []; + } + if ( !isDefined( level.buildable_claimed_locations[ location ] ) ) + { + level.buildable_claimed_locations[ location ] = 1; + return 1; + } + return 0; } -is_point_in_build_trigger( point ) +is_point_in_build_trigger( point ) //checked changed to match cerberus output { - candidate_list = []; - - foreach ( zone in level.zones ) - { - if ( isdefined( zone.unitrigger_stubs ) ) - candidate_list = arraycombine( candidate_list, zone.unitrigger_stubs, 1, 0 ); - } - - valid_range = 128; - closest = maps\mp\zombies\_zm_unitrigger::get_closest_unitriggers( point, candidate_list, valid_range ); - - for ( index = 0; index < closest.size; index++ ) - { - if ( isdefined( closest[index].registered ) && closest[index].registered && isdefined( closest[index].piece ) ) - return true; - } - - return false; + candidate_list = []; + foreach ( zone in level.zones ) + { + if ( isDefined( zone.unitrigger_stubs ) ) + { + candidate_list = arraycombine( candidate_list, zone.unitrigger_stubs, 1, 0 ); + } + } + valid_range = 128; + closest = maps/mp/zombies/_zm_unitrigger::get_closest_unitriggers( point, candidate_list, valid_range ); + for ( index = 0; index < closest.size; index++ ) + { + if ( isDefined( closest[ index ].registered ) && closest[ index ].registered && isDefined( closest[ index ].piece ) ) + { + return 1; + } + } + return 0; } -piece_allocate_spawn( piecespawn ) +piece_allocate_spawn( piecespawn ) //checked changed to match cerberus output { - self.current_spawn = 0; - self.managed_spawn = 1; - self.piecespawn = piecespawn; - - if ( isdefined( piecespawn.str_force_spawn_kvp ) ) - { - s_struct = getstruct( piecespawn.str_force_spawn_name, piecespawn.str_force_spawn_kvp ); - - if ( isdefined( s_struct ) ) - { - for ( i = 0; i < self.spawns.size; i++ ) - { - if ( s_struct == self.spawns[i] ) - { - self.current_spawn = i; - piecespawn.piece_allocated[self.current_spawn] = 1; - piecespawn.str_force_spawn_kvp = undefined; - piecespawn.str_force_spawn_name = undefined; - return; - } - } - } - } - - if ( isdefined( piecespawn.use_cyclic_spawns ) ) - { - piece_allocate_cyclic( piecespawn ); - return; - } - - if ( self.spawns.size >= 1 && self.spawns.size > 1 ) - { - any_good = 0; - any_okay = 0; - totalweight = 0; - spawnweights = []; - - for ( i = 0; i < self.spawns.size; i++ ) - { - if ( isdefined( piecespawn.piece_allocated[i] ) && piecespawn.piece_allocated[i] ) - spawnweights[i] = 0; - else if ( isdefined( self.spawns[i].script_forcespawn ) && self.spawns[i].script_forcespawn ) - { - switch ( self.spawns[i].script_forcespawn ) - { - case "4": - spawnweights[i] = 0.0; - break; - case "1": - self.spawns[i].script_forcespawn = 0; - case "2": - self.current_spawn = i; - piecespawn.piece_allocated[self.current_spawn] = 1; - return; - case "3": - self.spawns[i].script_forcespawn = 4; - self.current_spawn = i; - piecespawn.piece_allocated[self.current_spawn] = 1; - return; - default: - any_okay = 1; - spawnweights[i] = 0.01; - break; - } - } - else if ( is_point_in_build_trigger( self.spawns[i].origin ) ) - { - any_okay = 1; - spawnweights[i] = 0.01; - } - else - { - any_good = 1; - spawnweights[i] = 1.0; - } - - totalweight += spawnweights[i]; - } + self.current_spawn = 0; + self.managed_spawn = 1; + self.piecespawn = piecespawn; + if ( isDefined( piecespawn.str_force_spawn_kvp ) ) + { + s_struct = patch_zm\common_scripts\utility::getstruct( piecespawn.str_force_spawn_name, piecespawn.str_force_spawn_kvp ); + if ( isDefined( s_struct ) ) + { + for ( i = 0; i < self.spawns.size; i++ ) + { + if ( s_struct == self.spawns[ i ] ) + { + self.current_spawn = i; + piecespawn.piece_allocated[ self.current_spawn ] = 1; + piecespawn.str_force_spawn_kvp = undefined; + piecespawn.str_force_spawn_name = undefined; + return; + } + } + } + } + else if ( isDefined( piecespawn.use_cyclic_spawns ) ) + { + piece_allocate_cyclic( piecespawn ); + return; + } + if ( self.spawns.size >= 1 && self.spawns.size > 1 ) + { + any_good = 0; + any_okay = 0; + totalweight = 0; + spawnweights = []; + for ( i = 0; i < self.spawns.size; i++ ) + { + if ( isDefined( piecespawn.piece_allocated[ i ] ) && piecespawn.piece_allocated[ i ] ) + { + spawnweights[ i ] = 0; + } + else if ( isDefined( self.spawns[ i ].script_forcespawn ) && self.spawns[ i ].script_forcespawn ) + { + switch( self.spawns[ i ].script_forcespawn ) + { + case 4: + spawnweights[ i ] = 0; + break; + case 1: + self.spawns[ i ].script_forcespawn = 0; + case 2: + self.current_spawn = i; + piecespawn.piece_allocated[ self.current_spawn ] = 1; + return; + case 3: + self.spawns[ i ].script_forcespawn = 4; + self.current_spawn = i; + piecespawn.piece_allocated[ self.current_spawn ] = 1; + return; + default: + any_okay = 1; + spawnweights[ i ] = 0.01; + break; + } + } + else if ( is_point_in_build_trigger( self.spawns[ i ].origin ) ) + { + any_okay = 1; + spawnweights[ i ] = 0.01; + break; + } + else + { + any_good = 1; + spawnweights[ i ] = 1; + } + totalweight += spawnweights[ i ]; + } + /* /# - assert( any_good || any_okay, "There is nowhere to spawn this piece" ); + if ( !any_good ) + { + assert( any_okay, "There is nowhere to spawn this piece" ); + } #/ - if ( any_good ) - totalweight = float( int( totalweight ) ); - - r = randomfloat( totalweight ); - - for ( i = 0; i < self.spawns.size; i++ ) - { - if ( !any_good || spawnweights[i] >= 1.0 ) - { - r -= spawnweights[i]; - - if ( r < 0 ) - { - self.current_spawn = i; - piecespawn.piece_allocated[self.current_spawn] = 1; - return; - } - } - } - - self.current_spawn = randomint( self.spawns.size ); - piecespawn.piece_allocated[self.current_spawn] = 1; - } + */ + if ( any_good ) + { + totalweight = float( int( totalweight ) ); + } + r = randomfloat( totalweight ); + for ( i = 0; i < self.spawns.size; i++ ) + { + if ( !any_good || spawnweights[ i ] >= 1 ) + { + r -= spawnweights[ i ]; + if ( r < 0 ) + { + self.current_spawn = i; + piecespawn.piece_allocated[ self.current_spawn ] = 1; + return; + } + } + } + self.current_spawn = randomint( self.spawns.size ); + piecespawn.piece_allocated[ self.current_spawn ] = 1; + } } -piece_allocate_cyclic( piecespawn ) +piece_allocate_cyclic( piecespawn ) //checked matches cerberus output { - if ( self.spawns.size > 1 ) - { - if ( isdefined( piecespawn.randomize_cyclic_index ) ) - { - piecespawn.randomize_cyclic_index = undefined; - piecespawn.cyclic_index = randomint( self.spawns.size ); - } - - if ( !isdefined( piecespawn.cyclic_index ) ) - piecespawn.cyclic_index = 0; - - piecespawn.cyclic_index++; - - if ( piecespawn.cyclic_index >= self.spawns.size ) - piecespawn.cyclic_index = 0; - } - else - piecespawn.cyclic_index = 0; - - self.current_spawn = piecespawn.cyclic_index; - piecespawn.piece_allocated[self.current_spawn] = 1; + if ( self.spawns.size > 1 ) + { + if ( isDefined( piecespawn.randomize_cyclic_index ) ) + { + piecespawn.randomize_cyclic_index = undefined; + piecespawn.cyclic_index = randomint( self.spawns.size ); + } + if ( !isDefined( piecespawn.cyclic_index ) ) + { + piecespawn.cyclic_index = 0; + } + piecespawn.cyclic_index++; + if ( piecespawn.cyclic_index >= self.spawns.size ) + { + piecespawn.cyclic_index = 0; + } + } + else + { + piecespawn.cyclic_index = 0; + } + self.current_spawn = piecespawn.cyclic_index; + piecespawn.piece_allocated[ self.current_spawn ] = 1; } -piece_deallocate_spawn() +piece_deallocate_spawn() //checked matches cerberus output { - if ( isdefined( self.current_spawn ) ) - { - self.piecespawn.piece_allocated[self.current_spawn] = 0; - self.current_spawn = undefined; - } - - self.start_origin = undefined; + if ( isDefined( self.current_spawn ) ) + { + self.piecespawn.piece_allocated[ self.current_spawn ] = 0; + self.current_spawn = undefined; + } + self.start_origin = undefined; } -piece_pick_random_spawn() +piece_pick_random_spawn() //checked partially changed to match cerberus output did not change while loop to for loop { - self.current_spawn = 0; - - if ( self.spawns.size >= 1 && self.spawns.size > 1 ) - { - for ( self.current_spawn = randomint( self.spawns.size ); isdefined( self.spawns[self.current_spawn].claim_location ) && !claim_location( self.spawns[self.current_spawn].claim_location ); self.current_spawn = randomint( self.spawns.size ) ) - { - arrayremoveindex( self.spawns, self.current_spawn ); - - if ( self.spawns.size < 1 ) - { - self.current_spawn = 0; + self.current_spawn = 0; + if ( self.spawns.size >= 1 && self.spawns.size > 1 ) + { + self.current_spawn = randomint( self.spawns.size ); + while ( isDefined( self.spawns[ self.current_spawn ].claim_location ) && !claim_location( self.spawns[ self.current_spawn ].claim_location ) ) + { + arrayremoveindex( self.spawns, self.current_spawn ); + if ( self.spawns.size < 1 ) + { + self.current_spawn = 0; + /* /# - println( "ERROR: All buildable spawn locations claimed" ); + println( "ERROR: All buildable spawn locations claimed" ); #/ - return; - } - } - } + */ + return; + } + self.current_spawn = randomint( self.spawns.size ); + } + } } -piece_set_spawn( num ) +piece_set_spawn( num ) //checked matches cerberus output { - self.current_spawn = 0; - - if ( self.spawns.size >= 1 && self.spawns.size > 1 ) - self.current_spawn = int( min( num, self.spawns.size - 1 ) ); + self.current_spawn = 0; + if ( self.spawns.size >= 1 && self.spawns.size > 1 ) + { + self.current_spawn = int( min( num, self.spawns.size - 1 ) ); + } } -piece_spawn_in( piecespawn ) +piece_spawn_in( piecespawn ) //checked matches cerberus output { - if ( self.spawns.size < 1 ) - return; - - if ( isdefined( self.managed_spawn ) && self.managed_spawn ) - { - if ( !isdefined( self.current_spawn ) ) - self piece_allocate_spawn( self.piecespawn ); - } - - if ( !isdefined( self.current_spawn ) ) - self.current_spawn = 0; - - spawndef = self.spawns[self.current_spawn]; - self.script_noteworthy = spawndef.script_noteworthy; - self.script_parameters = spawndef.script_parameters; - self.unitrigger = generate_piece_unitrigger( "trigger_radius_use", spawndef.origin + vectorscale( ( 0, 0, 1 ), 12.0 ), spawndef.angles, 0, piecespawn.radius, piecespawn.height, 0 ); - self.unitrigger.piece = self; - self.buildable_slot = piecespawn.buildable_slot; - self.radius = piecespawn.radius; - self.height = piecespawn.height; - self.buildablename = piecespawn.buildablename; - self.modelname = piecespawn.modelname; - self.hud_icon = piecespawn.hud_icon; - self.part_name = piecespawn.part_name; - self.drop_offset = piecespawn.drop_offset; - self.start_origin = spawndef.origin; - self.start_angles = spawndef.angles; - self.client_field_state = piecespawn.client_field_state; - self.hint_grab = piecespawn.hint_grab; - self.hint_swap = piecespawn.hint_swap; - self.model = spawn( "script_model", self.start_origin ); - - if ( isdefined( self.start_angles ) ) - self.model.angles = self.start_angles; - - self.model setmodel( piecespawn.modelname ); - self.model ghostindemo(); - self.model.hud_icon = piecespawn.hud_icon; - self.piecespawn = piecespawn; - self.unitrigger.origin_parent = self.model; - self.building = undefined; - self.onunspawn = piecespawn.onunspawn; - self.ondestroy = piecespawn.ondestroy; - - if ( isdefined( piecespawn.onspawn ) ) - { - self.onspawn = piecespawn.onspawn; - self [[ piecespawn.onspawn ]](); - } + if ( self.spawns.size < 1 ) + { + return; + } + if ( is_true( self.managed_spawn ) ) + { + if ( !isDefined( self.current_spawn ) ) + { + self piece_allocate_spawn( self.piecespawn ); + } + } + if ( !isDefined( self.current_spawn ) ) + { + self.current_spawn = 0; + } + spawndef = self.spawns[ self.current_spawn ]; + self.script_noteworthy = spawndef.script_noteworthy; + self.script_parameters = spawndef.script_parameters; + self.unitrigger = generate_piece_unitrigger( "trigger_radius_use", spawndef.origin + vectorScale( ( 0, 0, 1 ), 12 ), spawndef.angles, 0, piecespawn.radius, piecespawn.height, 0 ); + self.unitrigger.piece = self; + self.buildable_slot = piecespawn.buildable_slot; + self.radius = piecespawn.radius; + self.height = piecespawn.height; + self.buildablename = piecespawn.buildablename; + self.modelname = piecespawn.modelname; + self.hud_icon = piecespawn.hud_icon; + self.part_name = piecespawn.part_name; + self.drop_offset = piecespawn.drop_offset; + self.start_origin = spawndef.origin; + self.start_angles = spawndef.angles; + self.client_field_state = piecespawn.client_field_state; + self.hint_grab = piecespawn.hint_grab; + self.hint_swap = piecespawn.hint_swap; + self.model = spawn( "script_model", self.start_origin ); + if ( isDefined( self.start_angles ) ) + { + self.model.angles = self.start_angles; + } + self.model setmodel( piecespawn.modelname ); + self.model ghostindemo(); + self.model.hud_icon = piecespawn.hud_icon; + self.piecespawn = piecespawn; + self.unitrigger.origin_parent = self.model; + self.building = undefined; + self.onunspawn = piecespawn.onunspawn; + self.ondestroy = piecespawn.ondestroy; + if ( isDefined( piecespawn.onspawn ) ) + { + self.onspawn = piecespawn.onspawn; + self [[ piecespawn.onspawn ]](); + } } -piece_spawn_at_with_notify_delay( origin, angles, str_notify, unbuild_respawn_fn ) +piece_spawn_at_with_notify_delay( origin, angles, str_notify, unbuild_respawn_fn ) //checked matches cerberus output { - level waittill( str_notify ); - - piece_spawn_at( origin, angles ); - - if ( isdefined( unbuild_respawn_fn ) ) - self [[ unbuild_respawn_fn ]](); + level waittill( str_notify ); + piece_spawn_at( origin, angles ); + if ( isDefined( unbuild_respawn_fn ) ) + { + self [[ unbuild_respawn_fn ]](); + } } -piece_spawn_at( origin, angles ) +piece_spawn_at( origin, angles ) //checked changed to match cerberus output { - if ( self.spawns.size < 1 ) - return; - - if ( isdefined( self.managed_spawn ) && self.managed_spawn ) - { - if ( !isdefined( self.current_spawn ) && !isdefined( origin ) ) - { - self piece_allocate_spawn( self.piecespawn ); - spawndef = self.spawns[self.current_spawn]; - self.start_origin = spawndef.origin; - self.start_angles = spawndef.angles; - } - } - else if ( !isdefined( self.current_spawn ) ) - self.current_spawn = 0; - - unitrigger_offset = vectorscale( ( 0, 0, 1 ), 12.0 ); - - if ( !isdefined( origin ) ) - origin = self.start_origin; - else - { - origin += ( 0, 0, self.drop_offset ); - unitrigger_offset -= ( 0, 0, self.drop_offset ); - } - - if ( !isdefined( angles ) ) - angles = self.start_angles; + if ( self.spawns.size < 1 ) + { + return; + } + if ( is_true( self.managed_spawn ) ) + { + if ( !isDefined( self.current_spawn ) && !isDefined( origin ) ) + { + self piece_allocate_spawn( self.piecespawn ); + spawndef = self.spawns[ self.current_spawn ]; + self.start_origin = spawndef.origin; + self.start_angles = spawndef.angles; + } + } + else if ( !isDefined( self.current_spawn ) ) + { + self.current_spawn = 0; + } + unitrigger_offset = vectorScale( ( 0, 0, 1 ), 12 ); + if ( !isDefined( origin ) ) + { + origin = self.start_origin; + } + else + { + origin += ( 0, 0, self.drop_offset ); + unitrigger_offset -= ( 0, 0, self.drop_offset ); + } + if ( !isDefined( angles ) ) + { + angles = self.start_angles; + } + /* /# - if ( !isdefined( level.drop_offset ) ) - level.drop_offset = 0; - - origin += ( 0, 0, level.drop_offset ); - unitrigger_offset -= ( 0, 0, level.drop_offset ); + if ( !isDefined( level.drop_offset ) ) + { + level.drop_offset = 0; + } + origin += ( 0, 0, level.drop_offset ); + unitrigger_offset -= ( 0, 0, level.drop_offset ); #/ - self.model = spawn( "script_model", origin ); - - if ( isdefined( angles ) ) - self.model.angles = angles; - - self.model setmodel( self.modelname ); - - if ( isdefined( level.equipment_safe_to_drop ) ) - { - if ( ![[ level.equipment_safe_to_drop ]]( self.model ) ) - { - origin = self.start_origin; - angles = self.start_angles; - self.model.origin = origin; - self.model.angles = angles; - } - } - - self.unitrigger = generate_piece_unitrigger( "trigger_radius_use", origin + unitrigger_offset, angles, 0, self.radius, self.height, isdefined( self.model.canmove ) && self.model.canmove ); - self.unitrigger.piece = self; - self.model.hud_icon = self.hud_icon; - self.unitrigger.origin_parent = self.model; - self.building = undefined; - - if ( isdefined( self.onspawn ) ) - self [[ self.onspawn ]](); + */ + self.model = spawn( "script_model", origin ); + if ( isDefined( angles ) ) + { + self.model.angles = angles; + } + self.model setmodel( self.modelname ); + if ( isDefined( level.equipment_safe_to_drop ) ) + { + if ( ![[ level.equipment_safe_to_drop ]]( self.model ) ) + { + origin = self.start_origin; + angles = self.start_angles; + self.model.origin = origin; + self.model.angles = angles; + } + } + if ( isDefined( self.model.canmove ) ) + { + self.unitrigger = generate_piece_unitrigger( "trigger_radius_use", origin + unitrigger_offset, angles, 0, self.radius, self.height, self.model.canmove ); + } + self.unitrigger.piece = self; + self.model.hud_icon = self.hud_icon; + self.unitrigger.origin_parent = self.model; + self.building = undefined; + if ( isDefined( self.onspawn ) ) + { + self [[ self.onspawn ]](); + } } -piece_unspawn() +piece_unspawn() //checked matches cerberus output { - if ( isdefined( self.onunspawn ) ) - self [[ self.onunspawn ]](); - - if ( isdefined( self.managed_spawn ) && self.managed_spawn ) - self piece_deallocate_spawn(); - - if ( isdefined( self.model ) ) - self.model delete(); - - self.model = undefined; - - if ( isdefined( self.unitrigger ) ) - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.unitrigger ); - - self.unitrigger = undefined; + if ( isDefined( self.onunspawn ) ) + { + self [[ self.onunspawn ]](); + } + if ( is_true( self.managed_spawn ) ) + { + self piece_deallocate_spawn(); + } + if ( isDefined( self.model ) ) + { + self.model delete(); + } + self.model = undefined; + if ( isDefined( self.unitrigger ) ) + { + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger ); + } + self.unitrigger = undefined; } -piece_hide() +piece_hide() //checked matches cerberus output { - if ( isdefined( self.model ) ) - self.model ghost(); + if ( isDefined( self.model ) ) + { + self.model ghost(); + } } -piece_show() +piece_show() //checked matches cerberus output { - if ( isdefined( self.model ) ) - self.model show(); + if ( isDefined( self.model ) ) + { + self.model show(); + } } -piece_destroy() +piece_destroy() //checked matches cerberus output { - if ( isdefined( self.ondestroy ) ) - self [[ self.ondestroy ]](); + if ( isDefined( self.ondestroy ) ) + { + self [[ self.ondestroy ]](); + } } -generate_piece( buildable_piece_spawns ) +generate_piece( buildable_piece_spawns ) //checked changed to match cerberus output { - piece = spawnstruct(); - piece.spawns = buildable_piece_spawns.spawns; - - if ( isdefined( buildable_piece_spawns.managing_pieces ) && buildable_piece_spawns.managing_pieces ) - piece piece_allocate_spawn( buildable_piece_spawns ); - else if ( isdefined( buildable_piece_spawns.use_spawn_num ) ) - piece piece_set_spawn( buildable_piece_spawns.use_spawn_num ); - else - piece piece_pick_random_spawn(); - - piece piece_spawn_in( buildable_piece_spawns ); - - if ( piece.spawns.size >= 1 ) - piece.hud_icon = buildable_piece_spawns.hud_icon; - - if ( isdefined( buildable_piece_spawns.onpickup ) ) - piece.onpickup = buildable_piece_spawns.onpickup; - else - piece.onpickup = ::onpickuputs; - - if ( isdefined( buildable_piece_spawns.ondrop ) ) - piece.ondrop = buildable_piece_spawns.ondrop; - else - piece.ondrop = ::ondroputs; - - return piece; + piece = spawnstruct(); + piece.spawns = buildable_piece_spawns.spawns; + if ( isDefined( buildable_piece_spawns.managing_pieces ) && buildable_piece_spawns.managing_pieces ) + { + piece piece_allocate_spawn( buildable_piece_spawns ); + } + else if ( isDefined( buildable_piece_spawns.use_spawn_num ) ) + { + piece piece_set_spawn( buildable_piece_spawns.use_spawn_num ); + } + else + { + piece piece_pick_random_spawn(); + } + piece piece_spawn_in( buildable_piece_spawns ); + if ( piece.spawns.size >= 1 ) + { + piece.hud_icon = buildable_piece_spawns.hud_icon; + } + if ( isDefined( buildable_piece_spawns.onpickup ) ) + { + piece.onpickup = buildable_piece_spawns.onpickup; + } + else + { + piece.onpickup = ::onpickuputs; + } + if ( isDefined( buildable_piece_spawns.ondrop ) ) + { + piece.ondrop = buildable_piece_spawns.ondrop; + } + else + { + piece.ondrop = ::ondroputs; + } + return piece; } -buildable_piece_unitriggers( buildable_name, origin ) +buildable_piece_unitriggers( buildable_name, origin ) //checked changed to match cerberus output { + /* /# - assert( isdefined( buildable_name ) ); + assert( isDefined( buildable_name ) ); #/ /# - assert( isdefined( level.zombie_buildables[buildable_name] ), "Called buildable_think() without including the buildable - " + buildable_name ); + assert( isDefined( level.zombie_buildables[ buildable_name ] ), "Called buildable_think() without including the buildable - " + buildable_name ); #/ - buildable = level.zombie_buildables[buildable_name]; - - if ( !isdefined( buildable.buildablepieces ) ) - buildable.buildablepieces = []; - - flag_wait( "start_zombie_round_logic" ); - buildablezone = spawnstruct(); - buildablezone.buildable_name = buildable_name; - buildablezone.buildable_slot = buildable.buildable_slot; - - if ( !isdefined( buildablezone.pieces ) ) - buildablezone.pieces = []; - - buildablepickups = []; - - foreach ( buildablepiece in buildable.buildablepieces ) - { - if ( !isdefined( buildablepiece.generated_instances ) ) - buildablepiece.generated_instances = 0; - - if ( isdefined( buildablepiece.generated_piece ) && ( isdefined( buildablepiece.can_reuse ) && buildablepiece.can_reuse ) ) - piece = buildablepiece.generated_piece; - else if ( buildablepiece.generated_instances >= buildablepiece.max_instances ) - piece = buildablepiece.generated_piece; - else - { - piece = generate_piece( buildablepiece ); - buildablepiece.generated_piece = piece; - buildablepiece.generated_instances++; - - if ( isdefined( buildablepiece.min_instances ) ) - { - while ( buildablepiece.generated_instances < buildablepiece.min_instances ) - { - piece = generate_piece( buildablepiece ); - buildablepiece.generated_piece = piece; - buildablepiece.generated_instances++; - } - } - } - - buildablezone.pieces[buildablezone.pieces.size] = piece; - } - - buildablezone.stub = self; - return buildablezone; + */ + buildable = level.zombie_buildables[ buildable_name ]; + if ( !isDefined( buildable.buildablepieces ) ) + { + buildable.buildablepieces = []; + } + flag_wait( "start_zombie_round_logic" ); + buildablezone = spawnstruct(); + buildablezone.buildable_name = buildable_name; + buildablezone.buildable_slot = buildable.buildable_slot; + if ( !isDefined( buildablezone.pieces ) ) + { + buildablezone.pieces = []; + } + buildablepickups = []; + foreach ( buildablepiece in buildable.buildablepieces ) + { + if ( !isDefined( buildablepiece.generated_instances ) ) + { + buildablepiece.generated_instances = 0; + } + if ( isDefined( buildablepiece.generated_piece ) && is_true( buildablepiece.can_reuse ) ) + { + piece = buildablepiece.generated_piece; + break; + } + if ( buildablepiece.generated_instances >= buildablepiece.max_instances ) + { + piece = buildablepiece.generated_piece; + break; + } + piece = generate_piece( buildablepiece ); + buildablepiece.generated_piece = piece; + buildablepiece.generated_instances++; + if ( isDefined( buildablepiece.min_instances ) ) + { + while ( buildablepiece.generated_instances < buildablepiece.min_instances ) + { + piece = generate_piece( buildablepiece ); + buildablepiece.generated_piece = piece; + buildablepiece.generated_instances++; + } + } + buildablezone.pieces[ buildablezone.pieces.size ] = piece; + } + buildablezone.stub = self; + return buildablezone; } -hide_buildable_table_model( trigger_targetname ) +hide_buildable_table_model( trigger_targetname ) //checked matches cerberus output { - trig = getent( trigger_targetname, "targetname" ); - - if ( !isdefined( trig ) ) - return; - - if ( isdefined( trig.target ) ) - { - model = getent( trig.target, "targetname" ); - - if ( isdefined( model ) ) - { - model hide(); - model notsolid(); - } - } + trig = getent( trigger_targetname, "targetname" ); + if ( !isDefined( trig ) ) + { + return; + } + if ( isDefined( trig.target ) ) + { + model = getent( trig.target, "targetname" ); + if ( isDefined( model ) ) + { + model hide(); + model notsolid(); + } + } } -setup_unitrigger_buildable( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) +setup_unitrigger_buildable( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) //checked matches cerberus output { - trig = getent( trigger_targetname, "targetname" ); - - if ( !isdefined( trig ) ) - return; - - return setup_unitrigger_buildable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); + trig = getent( trigger_targetname, "targetname" ); + if ( !isDefined( trig ) ) + { + return; + } + return setup_unitrigger_buildable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); } -setup_unitrigger_buildable_array( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) +setup_unitrigger_buildable_array( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) //checked changed to match cerberus output { - triggers = getentarray( trigger_targetname, "targetname" ); - stubs = []; - - foreach ( trig in triggers ) - stubs[stubs.size] = setup_unitrigger_buildable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); - - return stubs; + triggers = getentarray( trigger_targetname, "targetname" ); + stubs = []; + foreach ( trig in triggers ) + { + stubs[ stubs.size ] = setup_unitrigger_buildable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); + } + return stubs; } -setup_unitrigger_buildable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) +setup_unitrigger_buildable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) //checked changed to match cerberus output { - if ( !isdefined( trig ) ) - return; - - unitrigger_stub = spawnstruct(); - unitrigger_stub.buildablestruct = level.zombie_include_buildables[equipname]; - angles = trig.script_angles; - - if ( !isdefined( angles ) ) - angles = ( 0, 0, 0 ); - - unitrigger_stub.origin = trig.origin + anglestoright( angles ) * -6; - unitrigger_stub.angles = trig.angles; - - if ( isdefined( trig.script_angles ) ) - unitrigger_stub.angles = trig.script_angles; - - unitrigger_stub.equipname = equipname; - unitrigger_stub.weaponname = weaponname; - unitrigger_stub.trigger_hintstring = trigger_hintstring; - unitrigger_stub.delete_trigger = delete_trigger; - unitrigger_stub.built = 0; - unitrigger_stub.persistent = persistent; - unitrigger_stub.usetime = int( 3000 ); - unitrigger_stub.onbeginuse = ::onbeginuseuts; - unitrigger_stub.onenduse = ::onenduseuts; - unitrigger_stub.onuse = ::onuseplantobjectuts; - unitrigger_stub.oncantuse = ::oncantuseuts; - - if ( isdefined( trig.script_length ) ) - unitrigger_stub.script_length = trig.script_length; - else - unitrigger_stub.script_length = 32; - - if ( isdefined( trig.script_width ) ) - unitrigger_stub.script_width = trig.script_width; - else - unitrigger_stub.script_width = 100; - - if ( isdefined( trig.script_height ) ) - unitrigger_stub.script_height = trig.script_height; - else - unitrigger_stub.script_height = 64; - - unitrigger_stub.target = trig.target; - unitrigger_stub.targetname = trig.targetname; - unitrigger_stub.script_noteworthy = trig.script_noteworthy; - unitrigger_stub.script_parameters = trig.script_parameters; - unitrigger_stub.cursor_hint = "HINT_NOICON"; - - if ( isdefined( level.zombie_buildables[equipname].hint ) ) - unitrigger_stub.hint_string = level.zombie_buildables[equipname].hint; - - unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; - unitrigger_stub.require_look_at = 1; - unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); - unitrigger_stub.prompt_and_visibility_func = ::buildabletrigger_update_prompt; - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::buildable_place_think ); - unitrigger_stub.piece_trigger = trig; - trig.trigger_stub = unitrigger_stub; - unitrigger_stub.zombie_weapon_upgrade = trig.zombie_weapon_upgrade; - - if ( isdefined( unitrigger_stub.target ) ) - { - unitrigger_stub.model = getent( unitrigger_stub.target, "targetname" ); - - if ( isdefined( unitrigger_stub.model ) ) - { - if ( isdefined( unitrigger_stub.zombie_weapon_upgrade ) ) - unitrigger_stub.model useweaponhidetags( unitrigger_stub.zombie_weapon_upgrade ); - - unitrigger_stub.model hide(); - unitrigger_stub.model notsolid(); - } - } - - unitrigger_stub.buildablezone = unitrigger_stub buildable_piece_unitriggers( equipname, unitrigger_stub.origin ); - - if ( delete_trigger ) - trig delete(); - - level.buildable_stubs[level.buildable_stubs.size] = unitrigger_stub; - return unitrigger_stub; + if ( !isDefined( trig ) ) + { + return; + } + unitrigger_stub = spawnstruct(); + unitrigger_stub.buildablestruct = level.zombie_include_buildables[ equipname ]; + angles = trig.script_angles; + if ( !isDefined( angles ) ) + { + angles = ( 0, 0, 0 ); + } + unitrigger_stub.origin = trig.origin + ( anglesToRight( angles ) * -6 ); + unitrigger_stub.angles = trig.angles; + if ( isDefined( trig.script_angles ) ) + { + unitrigger_stub.angles = trig.script_angles; + } + unitrigger_stub.equipname = equipname; + unitrigger_stub.weaponname = weaponname; + unitrigger_stub.trigger_hintstring = trigger_hintstring; + unitrigger_stub.delete_trigger = delete_trigger; + unitrigger_stub.built = 0; + unitrigger_stub.persistent = persistent; + unitrigger_stub.usetime = int( 3000 ); + unitrigger_stub.onbeginuse = ::onbeginuseuts; + unitrigger_stub.onenduse = ::onenduseuts; + unitrigger_stub.onuse = ::onuseplantobjectuts; + unitrigger_stub.oncantuse = ::oncantuseuts; + if ( isDefined( trig.script_length ) ) + { + unitrigger_stub.script_length = trig.script_length; + } + else + { + unitrigger_stub.script_length = 32; + } + if ( isDefined( trig.script_width ) ) + { + unitrigger_stub.script_width = trig.script_width; + } + else + { + unitrigger_stub.script_width = 100; + } + if ( isDefined( trig.script_height ) ) + { + unitrigger_stub.script_height = trig.script_height; + } + else + { + unitrigger_stub.script_height = 64; + } + unitrigger_stub.target = trig.target; + unitrigger_stub.targetname = trig.targetname; + unitrigger_stub.script_noteworthy = trig.script_noteworthy; + unitrigger_stub.script_parameters = trig.script_parameters; + unitrigger_stub.cursor_hint = "HINT_NOICON"; + if ( isDefined( level.zombie_buildables[ equipname ].hint ) ) + { + unitrigger_stub.hint_string = level.zombie_buildables[ equipname ].hint; + } + unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + unitrigger_stub.require_look_at = 1; + unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); + unitrigger_stub.prompt_and_visibility_func = ::buildabletrigger_update_prompt; + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::buildable_place_think ); + unitrigger_stub.piece_trigger = trig; + trig.trigger_stub = unitrigger_stub; + unitrigger_stub.zombie_weapon_upgrade = trig.zombie_weapon_upgrade; + if ( isDefined( unitrigger_stub.target ) ) + { + unitrigger_stub.model = getent( unitrigger_stub.target, "targetname" ); + if ( isDefined( unitrigger_stub.model ) ) + { + if ( isDefined( unitrigger_stub.zombie_weapon_upgrade ) ) + { + unitrigger_stub.model useweaponhidetags( unitrigger_stub.zombie_weapon_upgrade ); + } + unitrigger_stub.model hide(); + unitrigger_stub.model notsolid(); + } + } + unitrigger_stub.buildablezone = unitrigger_stub buildable_piece_unitriggers( equipname, unitrigger_stub.origin ); + if ( delete_trigger ) + { + trig delete(); + } + level.buildable_stubs[ level.buildable_stubs.size ] = unitrigger_stub; + return unitrigger_stub; } -buildable_has_piece( piece ) +buildable_has_piece( piece ) //checked changed to match cerberus output { - for ( i = 0; i < self.pieces.size; i++ ) - { - if ( self.pieces[i].modelname == piece.modelname && self.pieces[i].buildablename == piece.buildablename ) - return true; - } - - return false; + for ( i = 0; i < self.pieces.size; i++ ) + { + if ( self.pieces[ i ].modelname == piece.modelname && self.pieces[ i ].buildablename == piece.buildablename ) + { + return 1; + } + } + return 0; } -buildable_set_piece_built( piece ) +buildable_set_piece_built( piece ) //checked changed to match cerberus output { - for ( i = 0; i < self.pieces.size; i++ ) - { - if ( self.pieces[i].modelname == piece.modelname && self.pieces[i].buildablename == piece.buildablename ) - self.pieces[i].built = 1; - } + for ( i = 0; i < self.pieces.size; i++ ) + { + if ( self.pieces[ i ].modelname == piece.modelname && self.pieces[ i ].buildablename == piece.buildablename ) + { + self.pieces[ i ].built = 1; + } + } } -buildable_set_piece_building( piece ) +buildable_set_piece_building( piece ) //checked changed to match cerberus output { - for ( i = 0; i < self.pieces.size; i++ ) - { - if ( self.pieces[i].modelname == piece.modelname && self.pieces[i].buildablename == piece.buildablename ) - { - self.pieces[i] = piece; - self.pieces[i].building = 1; - } - } + for ( i = 0; i < self.pieces.size; i++ ) + { + if ( self.pieces[ i ].modelname == piece.modelname && self.pieces[ i ].buildablename == piece.buildablename ) + { + self.pieces[ i ] = piece; + self.pieces[ i ].building = 1; + } + } } -buildable_clear_piece_building( piece ) +buildable_clear_piece_building( piece ) //checked matches cerberus output { - if ( isdefined( piece ) ) - piece.building = 0; + if ( isDefined( piece ) ) + { + piece.building = 0; + } } -buildable_is_piece_built( piece ) +buildable_is_piece_built( piece ) //checked partially changed to match cerberus output //changed at own discretion { - for ( i = 0; i < self.pieces.size; i++ ) - { - if ( self.pieces[i].modelname == piece.modelname && self.pieces[i].buildablename == piece.buildablename ) - return isdefined( self.pieces[i].built ) && self.pieces[i].built; - } - - return 0; + for ( i = 0; i < self.pieces.size; i++ ) + { + if ( self.pieces[ i ].modelname == piece.modelname && self.pieces[ i ].buildablename == piece.buildablename ) + { + if ( isDefined( self.pieces[ i ].built ) && self.pieces[ i ].built ) + { + return 1; + } + } + } + return 0; } buildable_is_piece_building( piece ) { - for ( i = 0; i < self.pieces.size; i++ ) - { - if ( self.pieces[i].modelname == piece.modelname && self.pieces[i].buildablename == piece.buildablename ) - return isdefined( self.pieces[i].building ) && self.pieces[i].building && self.pieces[i] == piece; - } - - return 0; + for ( i = 0; i < self.pieces.size; i++ ) + { + if ( self.pieces[ i ].modelname == piece.modelname && self.pieces[ i ].buildablename == piece.buildablename ) + { + if ( isDefined( self.pieces[ i ].building ) && self.pieces[ i ].building && self.pieces[ i ] == piece ) + { + return 1; + } + } + } + return 0; } -buildable_is_piece_built_or_building( piece ) +buildable_is_piece_built_or_building( piece ) //checked partially changed to match cerberus output //changed at own discretion { - for ( i = 0; i < self.pieces.size; i++ ) - { - if ( self.pieces[i].modelname == piece.modelname && self.pieces[i].buildablename == piece.buildablename ) - return isdefined( self.pieces[i].built ) && self.pieces[i].built || isdefined( self.pieces[i].building ) && self.pieces[i].building; - } - - return 0; + for ( i = 0; i < self.pieces.size; i++ ) + { + if ( self.pieces[ i ].modelname == piece.modelname && self.pieces[ i ].buildablename == piece.buildablename ) + { + if ( !is_true( self.pieces[ i ].built ) ) + { + if ( is_true( self.pieces[ i ].building ) ) + { + return 1; + } + } + } + i++; + } + return 0; } -buildable_all_built() +buildable_all_built() //checked changed to match cerberus output { - for ( i = 0; i < self.pieces.size; i++ ) - { - if ( !( isdefined( self.pieces[i].built ) && self.pieces[i].built ) ) - return false; - } - - return true; + for ( i = 0; i < self.pieces.size; i++ ) + { + if ( !is_true( self.pieces[ i ].built ) ) + { + return 0; + } + } + return 1; } -player_can_build( buildable, continuing ) +player_can_build( buildable, continuing ) //checked changed to match cerberus output { - if ( !isdefined( buildable ) ) - return false; - - if ( !isdefined( self player_get_buildable_piece( buildable.buildable_slot ) ) ) - return false; - - if ( !buildable buildable_has_piece( self player_get_buildable_piece( buildable.buildable_slot ) ) ) - return false; - - if ( isdefined( continuing ) && continuing ) - { - if ( buildable buildable_is_piece_built( self player_get_buildable_piece( buildable.buildable_slot ) ) ) - return false; - } - else if ( buildable buildable_is_piece_built_or_building( self player_get_buildable_piece( buildable.buildable_slot ) ) ) - return false; - - if ( isdefined( buildable.stub ) && isdefined( buildable.stub.custom_buildablestub_update_prompt ) && isdefined( buildable.stub.playertrigger[0] ) && isdefined( buildable.stub.playertrigger[0].stub ) && !buildable.stub.playertrigger[0].stub [[ buildable.stub.custom_buildablestub_update_prompt ]]( self, 1, buildable.stub.playertrigger[0] ) ) - return false; - - return true; + if ( !isDefined( buildable ) ) + { + return 0; + } + if ( !isDefined( self player_get_buildable_piece( buildable.buildable_slot ) ) ) + { + return 0; + } + if ( !buildable buildable_has_piece( self player_get_buildable_piece( buildable.buildable_slot ) ) ) + { + return 0; + } + if ( is_true( continuing ) ) + { + if ( buildable buildable_is_piece_built( self player_get_buildable_piece( buildable.buildable_slot ) ) ) + { + return 0; + } + } + else if ( buildable buildable_is_piece_built_or_building( self player_get_buildable_piece( buildable.buildable_slot ) ) ) + { + return 0; + } + if ( isDefined( buildable.stub ) && isDefined( buildable.stub.custom_buildablestub_update_prompt ) && isDefined( buildable.stub.playertrigger[ 0 ] ) && isDefined( buildable.stub.playertrigger[ 0 ].stub ) && !( buildable.stub.playertrigger[ 0 ].stub [[ buildable.stub.custom_buildablestub_update_prompt ]]( self, 1, buildable.stub.playertrigger[ 0 ] ) ) ) + { + return 0; + } + return 1; } -player_build( buildable, pieces ) +player_build( buildable, pieces ) //checked partially changed to match cerberus output { - if ( isdefined( pieces ) ) - { - for ( i = 0; i < pieces.size; i++ ) - { - buildable buildable_set_piece_built( pieces[i] ); - player_destroy_piece( pieces[i] ); - } - } - else - { - buildable buildable_set_piece_built( self player_get_buildable_piece( buildable.buildable_slot ) ); - player_destroy_piece( self player_get_buildable_piece( buildable.buildable_slot ) ); - } - - if ( isdefined( buildable.stub.model ) ) - { - for ( i = 0; i < buildable.pieces.size; i++ ) - { - if ( isdefined( buildable.pieces[i].part_name ) ) - { - buildable.stub.model notsolid(); - - if ( !( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built ) ) - { - buildable.stub.model hidepart( buildable.pieces[i].part_name ); - continue; - } - - buildable.stub.model show(); - buildable.stub.model showpart( buildable.pieces[i].part_name ); - } - } - } - - if ( isplayer( self ) ) - self track_buildable_pieces_built( buildable ); - - if ( buildable buildable_all_built() ) - { - self player_finish_buildable( buildable ); - buildable.stub buildablestub_finish_build( self ); - - if ( isplayer( self ) ) - self track_buildables_built( buildable ); - - if ( isdefined( level.buildable_built_custom_func ) ) - self thread [[ level.buildable_built_custom_func ]]( buildable ); - - alias = sndbuildablecompletealias( buildable.buildable_name ); - self playsound( alias ); - } - else - { - self playsound( "zmb_buildable_piece_add" ); + if ( isDefined( pieces ) ) + { + for ( i = 0; i < pieces.size; i++ ) + { + buildable buildable_set_piece_built( pieces[ i ] ); + player_destroy_piece( pieces[ i ] ); + } + } + else + { + buildable buildable_set_piece_built( self player_get_buildable_piece( buildable.buildable_slot ) ); + player_destroy_piece( self player_get_buildable_piece( buildable.buildable_slot ) ); + } + if ( isDefined( buildable.stub.model ) ) + { + i = 0; + while ( i < buildable.pieces.size ) + { + if ( isDefined( buildable.pieces[ i ].part_name ) ) + { + buildable.stub.model notsolid(); + if ( !is_true( buildable.pieces[ i ].built ) ) + { + buildable.stub.model hidepart( buildable.pieces[ i ].part_name ); + i++; + continue; + } + buildable.stub.model show(); + buildable.stub.model showpart( buildable.pieces[ i ].part_name ); + } + i++; + } + } + else if ( isplayer( self ) ) + { + self track_buildable_pieces_built( buildable ); + } + if ( buildable buildable_all_built() ) + { + self player_finish_buildable( buildable ); + buildable.stub buildablestub_finish_build( self ); + if ( isplayer( self ) ) + { + self track_buildables_built( buildable ); + } + if ( isDefined( level.buildable_built_custom_func ) ) + { + self thread [[ level.buildable_built_custom_func ]]( buildable ); + } + alias = sndbuildablecompletealias( buildable.buildable_name ); + self playsound( alias ); + } + else + { + self playsound( "zmb_buildable_piece_add" ); + /* /# - assert( isdefined( level.zombie_buildables[buildable.buildable_name].building ), "Missing builing hint" ); + assert( isDefined( level.zombie_buildables[ buildable.buildable_name ].building ), "Missing builing hint" ); #/ - if ( isdefined( level.zombie_buildables[buildable.buildable_name].building ) ) - return level.zombie_buildables[buildable.buildable_name].building; - } - - return ""; + */ + if ( isDefined( level.zombie_buildables[ buildable.buildable_name ].building ) ) + { + return level.zombie_buildables[ buildable.buildable_name ].building; + } + } + return ""; } -sndbuildablecompletealias( name ) +sndbuildablecompletealias( name ) //checked matches cerberus output { - alias = undefined; - - switch ( name ) - { - case "chalk": - alias = "zmb_chalk_complete"; - break; - default: - alias = "zmb_buildable_complete"; - break; - } - - return alias; + alias = undefined; + switch( name ) + { + case "chalk": + alias = "zmb_chalk_complete"; + break; + default: + alias = "zmb_buildable_complete"; + break; + } + return alias; } -player_finish_buildable( buildable ) +player_finish_buildable( buildable ) //checked matches cerberus output { - buildable.built = 1; - buildable.stub.built = 1; - buildable notify( "built", self ); - level.buildables_built[buildable.buildable_name] = 1; - level notify( buildable.buildable_name + "_built", self ); + buildable.built = 1; + buildable.stub.built = 1; + buildable notify( "built" ); + level.buildables_built[ buildable.buildable_name ] = 1; + level notify( buildable.buildable_name + "_built" ); } -buildablestub_finish_build( player ) +buildablestub_finish_build( player ) //checked matches cerberus output { - player player_finish_buildable( self.buildablezone ); + player player_finish_buildable( self.buildablezone ); } -buildablestub_remove() +buildablestub_remove() //checked matches cerberus output { - arrayremovevalue( level.buildable_stubs, self ); + arrayremovevalue( level.buildable_stubs, self ); } -buildabletrigger_update_prompt( player ) +buildabletrigger_update_prompt( player ) //checked matches cerberus output { - can_use = self.stub buildablestub_update_prompt( player ); - self sethintstring( self.stub.hint_string ); - - if ( isdefined( self.stub.cursor_hint ) ) - { - if ( self.stub.cursor_hint == "HINT_WEAPON" && isdefined( self.stub.cursor_hint_weapon ) ) - self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon ); - else - self setcursorhint( self.stub.cursor_hint ); - } - - return can_use; + can_use = self.stub buildablestub_update_prompt( player ); + self sethintstring( self.stub.hint_string ); + if ( isDefined( self.stub.cursor_hint ) ) + { + if ( self.stub.cursor_hint == "HINT_WEAPON" && isDefined( self.stub.cursor_hint_weapon ) ) + { + self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon ); + } + else + { + self setcursorhint( self.stub.cursor_hint ); + } + } + return can_use; } -buildablestub_update_prompt( player ) +buildablestub_update_prompt( player ) //checked changed to match cerberus output { - if ( !self anystub_update_prompt( player ) ) - return false; + if ( !self anystub_update_prompt( player ) ) + { + return 0; + } + can_use = 1; + if ( isDefined( self.buildablestub_reject_func ) ) + { + rval = self [[ self.buildablestub_reject_func ]]( player ); + if ( rval ) + { + return 0; + } + } + if ( isDefined( self.custom_buildablestub_update_prompt ) && !self [[ self.custom_buildablestub_update_prompt ]]( player ) ) + { + return 0; + } + self.cursor_hint = "HINT_NOICON"; + self.cursor_hint_weapon = undefined; + if ( isDefined( self.built ) && !self.built ) + { + slot = self.buildablestruct.buildable_slot; + if ( !isDefined( player player_get_buildable_piece( slot ) ) ) + { + if ( isDefined( level.zombie_buildables[ self.equipname ].hint_more ) ) + { + self.hint_string = level.zombie_buildables[ self.equipname ].hint_more; + } + else + { + self.hint_string = &"ZOMBIE_BUILD_PIECE_MORE"; + } + return 0; + } + else if ( !self.buildablezone buildable_has_piece( player player_get_buildable_piece( slot ) ) ) + { + if ( isDefined( level.zombie_buildables[ self.equipname ].hint_wrong ) ) + { + self.hint_string = level.zombie_buildables[ self.equipname ].hint_wrong; + } + else + { + self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG"; + } + return 0; + } + else + { + /* + /# + assert( isDefined( level.zombie_buildables[ self.equipname ].hint ), "Missing buildable hint" ); + #/ + */ + if ( isDefined( level.zombie_buildables[ self.equipname ].hint ) ) + { + self.hint_string = level.zombie_buildables[ self.equipname ].hint; + } + else + { + self.hint_string = "Missing buildable hint"; + } + } + } + else if ( self.persistent == 1 ) + { + if ( maps/mp/zombies/_zm_equipment::is_limited_equipment( self.weaponname ) && maps/mp/zombies/_zm_equipment::limited_equipment_in_use( self.weaponname ) ) + { + self.hint_string = &"ZOMBIE_BUILD_PIECE_ONLY_ONE"; + return 0; + } + if ( player has_player_equipment( self.weaponname ) ) + { + self.hint_string = &"ZOMBIE_BUILD_PIECE_HAVE_ONE"; + return 0; + } + /* + if ( getDvarInt( #"1F0A2129" ) ) + { + self.cursor_hint = "HINT_WEAPON"; + self.cursor_hint_weapon = self.weaponname; + } + */ + self.hint_string = self.trigger_hintstring; + } + else if ( self.persistent == 2 ) + { + if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.weaponname, undefined ) ) + { + self.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED"; + return 0; + } + else if ( is_true( self.bought ) ) + { + self.hint_string = &"ZOMBIE_GO_TO_THE_BOX"; + return 0; + } + self.hint_string = self.trigger_hintstring; + } + else + { + self.hint_string = ""; + return 0; + } + return 1; +} - can_use = 1; +player_continue_building( buildablezone, build_stub ) //checked matches cerberus output +{ + if ( !isDefined( build_stub ) ) + { + build_stub = buildablezone.stub; + } + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || self maps/mp/zombies/_zm_utility::in_revive_trigger() ) + { + return 0; + } + if ( self isthrowinggrenade() ) + { + return 0; + } + if ( !self player_can_build( buildablezone, 1 ) ) + { + return 0; + } + if ( isDefined( self.screecher ) ) + { + return 0; + } + if ( !self usebuttonpressed() ) + { + return 0; + } + slot = build_stub.buildablestruct.buildable_slot; + if ( !buildablezone buildable_is_piece_building( self player_get_buildable_piece( slot ) ) ) + { + return 0; + } + trigger = build_stub maps/mp/zombies/_zm_unitrigger::unitrigger_trigger( self ); + if ( build_stub.script_unitrigger_type == "unitrigger_radius_use" ) + { + torigin = build_stub unitrigger_origin(); + porigin = self geteye(); + radius_sq = 2.25 * build_stub.test_radius_sq; + if ( distance2dsquared( torigin, porigin ) > radius_sq ) + { + return 0; + } + } + else + { + if ( !isDefined( trigger ) || !trigger istouching( self ) ) + { + return 0; + } + } + if ( is_true( build_stub.require_look_at ) && !self is_player_looking_at( trigger.origin, 0.4 ) ) + { + return 0; + } + return 1; +} - if ( isdefined( self.buildablestub_reject_func ) ) - { - rval = self [[ self.buildablestub_reject_func ]]( player ); +player_progress_bar_update( start_time, build_time ) //checked partially matches cerberus output but order of operations may need to be adjusted +{ + self endon( "entering_last_stand" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "buildable_progress_end" ); + while ( isDefined( self ) && ( getTime() - start_time ) < build_time ) + { + progress = ( getTime() - start_time ) / build_time; + if ( progress < 0 ) + { + progress = 0; + } + if ( progress > 1 ) + { + progress = 1; + } + self.usebar updatebar( progress ); + wait 0.05; + } +} - if ( rval ) - return false; - } +player_progress_bar( start_time, build_time, building_prompt ) //checked matches cerberus output +{ + self.usebar = self createprimaryprogressbar(); + self.usebartext = self createprimaryprogressbartext(); + if ( isDefined( building_prompt ) ) + { + self.usebartext settext( building_prompt ); + } + else + { + self.usebartext settext( &"ZOMBIE_BUILDING" ); + } + if ( isDefined( self ) && isDefined( start_time ) && isDefined( build_time ) ) + { + self player_progress_bar_update( start_time, build_time ); + } + self.usebartext destroyelem(); + self.usebar destroyelem(); +} - if ( isdefined( self.custom_buildablestub_update_prompt ) && !self [[ self.custom_buildablestub_update_prompt ]]( player ) ) - return false; +buildable_use_hold_think_internal( player, bind_stub ) //checked changed to match cerberus output order of operations may need to be checked +{ + if ( !isDefined( bind_stub ) ) + { + bind_stub = self.stub; + } + wait 0.01; + if ( !isDefined( self ) ) + { + self notify( "build_failed" ); + if ( isDefined( player.buildableaudio ) ) + { + player.buildableaudio delete(); + player.buildableaudio = undefined; + } + return; + } + if ( !isDefined( self.usetime ) ) + { + self.usetime = int( 3000 ); + } + self.build_time = self.usetime; + self.build_start_time = getTime(); + build_time = self.build_time; + build_start_time = self.build_start_time; + player disable_player_move_states( 1 ); + player increment_is_drinking(); + orgweapon = player getcurrentweapon(); + build_weapon = "zombie_builder_zm"; + if ( isDefined( bind_stub.build_weapon ) ) + { + build_weapon = bind_stub.build_weapon; + } + player giveweapon( build_weapon ); + player switchtoweapon( build_weapon ); + slot = bind_stub.buildablestruct.buildable_slot; + bind_stub.buildablezone buildable_set_piece_building( player player_get_buildable_piece( slot ) ); + player thread player_progress_bar( build_start_time, build_time, bind_stub.building_prompt ); + if ( isDefined( level.buildable_build_custom_func ) ) + { + player thread [[ level.buildable_build_custom_func ]]( self.stub ); + } + while ( isDefined( self ) && player player_continue_building( bind_stub.buildablezone, self.stub ) && ( getTime() - self.build_start_time ) < self.build_time ) + { + wait 0.05; + } + player notify( "buildable_progress_end" ); + player maps/mp/zombies/_zm_weapons::switch_back_primary_weapon( orgweapon ); + player takeweapon( "zombie_builder_zm" ); + if ( is_true( player.is_drinking ) ) + { + player decrement_is_drinking(); + } + player enable_player_move_states(); + if ( isDefined( self ) && player player_continue_building( bind_stub.buildablezone, self.stub ) && ( getTime() - self.build_start_time ) >= self.build_time ) + { + buildable_clear_piece_building( player player_get_buildable_piece( slot ) ); + self notify( "build_succeed" ); + } + else if ( isDefined( player.buildableaudio ) ) + { + player.buildableaudio delete(); + player.buildableaudio = undefined; + } + buildable_clear_piece_building( player player_get_buildable_piece( slot ) ); + self notify( "build_failed" ); +} - self.cursor_hint = "HINT_NOICON"; - self.cursor_hint_weapon = undefined; +buildable_play_build_fx( player ) //checked matches cerberus output +{ + self endon( "kill_trigger" ); + self endon( "build_succeed" ); + self endon( "build_failed" ); + while ( 1 ) + { + playfx( level._effect[ "building_dust" ], player getplayercamerapos(), player.angles ); + wait 0.5; + } +} - if ( !( isdefined( self.built ) && self.built ) ) - { - slot = self.buildablestruct.buildable_slot; +buildable_use_hold_think( player, bind_stub ) //checked matches cerberus output +{ + if ( !isDefined( bind_stub ) ) + { + bind_stub = self.stub; + } + self thread buildable_play_build_fx( player ); + self thread buildable_use_hold_think_internal( player, bind_stub ); + retval = self waittill_any_return( "build_succeed", "build_failed" ); + if ( retval == "build_succeed" ) + { + return 1; + } + return 0; +} - if ( !isdefined( player player_get_buildable_piece( slot ) ) ) - { - if ( isdefined( level.zombie_buildables[self.equipname].hint_more ) ) - self.hint_string = level.zombie_buildables[self.equipname].hint_more; - else - self.hint_string = &"ZOMBIE_BUILD_PIECE_MORE"; +buildable_place_think() //checked partially changed to match cerberus output //changed at own discretion +{ + self endon( "kill_trigger" ); + player_built = undefined; + while ( !is_true( self.stub.built ) ) + { + self waittill( "trigger", player ); + if ( player != self.parent_player ) + { + continue; + } + if ( isDefined( player.screecher_weapon ) ) + { + continue; + } + if ( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0.5 ); + } + status = player player_can_build( self.stub.buildablezone ); + if ( !status ) + { + self.stub.hint_string = ""; + self sethintstring( self.stub.hint_string ); + if ( isDefined( self.stub.oncantuse ) ) + { + self.stub [[ self.stub.oncantuse ]]( player ); + } + //continue; + } + else if ( isDefined( self.stub.onbeginuse ) ) + { + self.stub [[ self.stub.onbeginuse ]]( player ); + } + result = self buildable_use_hold_think( player ); + team = player.pers[ "team" ]; + if ( isDefined( self.stub.onenduse ) ) + { + self.stub [[ self.stub.onenduse ]]( team, player, result ); + } + if ( !result ) + { + continue; + } + if ( isDefined( self.stub.onuse ) ) + { + self.stub [[ self.stub.onuse ]]( player ); + } + slot = self.stub.buildablestruct.buildable_slot; + if ( isDefined( player player_get_buildable_piece( slot ) ) ) + { + prompt = player player_build( self.stub.buildablezone ); + player_built = player; + self.stub.hint_string = prompt; + } + self sethintstring( self.stub.hint_string ); + } + if ( isDefined( player_built ) ) + { + switch( self.stub.persistent ) + { + case 1: + self bptrigger_think_persistent( player_built ); + break; + case 0: + self bptrigger_think_one_time( player_built ); + break; + case 3: + self bptrigger_think_unbuild( player_built ); + break; + case 2: + self bptrigger_think_one_use_and_fly( player_built ); + break; + case 4: + self [[ self.stub.custom_completion_callback ]]( player_built ); + break; + } + } +} - return false; - } - else if ( !self.buildablezone buildable_has_piece( player player_get_buildable_piece( slot ) ) ) - { - if ( isdefined( level.zombie_buildables[self.equipname].hint_wrong ) ) - self.hint_string = level.zombie_buildables[self.equipname].hint_wrong; - else - self.hint_string = &"ZOMBIE_BUILD_PIECE_WRONG"; +bptrigger_think_one_time( player_built ) //checked matches cerberus output +{ + self.stub buildablestub_remove(); + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.stub ); +} - return false; - } - else - { +bptrigger_think_unbuild( player_built ) //checked matches cerberus output +{ + stub_unbuild_buildable( self.stub, 1 ); +} + +bptrigger_think_one_use_and_fly( player_built ) //checked changed to match cerberus output +{ + if ( isDefined( player_built ) ) + { + self buildabletrigger_update_prompt( player_built ); + } + if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) ) + { + self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED"; + self sethintstring( self.stub.hint_string ); + return; + } + if ( is_true( self.stub.bought ) ) + { + self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX"; + self sethintstring( self.stub.hint_string ); + return; + } + if ( isDefined( self.stub.model ) ) + { + self.stub.model notsolid(); + self.stub.model show(); + } + while ( self.stub.persistent == 2 ) + { + self waittill( "trigger", player ); + if ( isDefined( player.screecher_weapon ) ) + { + continue; + } + if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) ) + { + self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED"; + self sethintstring( self.stub.hint_string ); + return; + } + if ( !is_true( self.stub.built ) ) + { + self.stub.hint_string = ""; + self sethintstring( self.stub.hint_string ); + return; + } + if ( player != self.parent_player ) + { + continue; + } + if ( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0,5 ); + } + self.stub.bought = 1; + if ( isDefined( self.stub.model ) ) + { + self.stub.model thread model_fly_away(); + } + player maps/mp/zombies/_zm_weapons::weapon_give( self.stub.weaponname ); + if ( isDefined( level.zombie_include_buildables[ self.stub.equipname ].onbuyweapon ) ) + { + self [[ level.zombie_include_buildables[ self.stub.equipname ].onbuyweapon ]]( player ); + } + if ( !maps/mp/zombies/_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) ) + { + self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED"; + } + else + { + self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX"; + } + self sethintstring( self.stub.hint_string ); + player track_buildables_pickedup( self.stub.weaponname ); + } +} + +bptrigger_think_persistent( player_built ) //checked changed to match cerberus output +{ + if ( !isDefined( player_built ) || self [[ self.stub.prompt_and_visibility_func ]]( player_built ) ) + { + if ( isDefined( self.stub.model ) ) + { + self.stub.model notsolid(); + self.stub.model show(); + } + while ( self.stub.persistent == 1 ) + { + self waittill( "trigger", player ); + if ( isDefined( player.screecher_weapon ) ) + { + continue; + } + if ( !is_true( self.stub.built ) ) + { + self.stub.hint_string = ""; + self sethintstring( self.stub.hint_string ); + self setcursorhint( "HINT_NOICON" ); + return; + } + if ( player != self.parent_player ) + { + continue; + } + if ( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0.5 ); + } + if ( player has_player_equipment( self.stub.weaponname ) ) + { + continue; + } + if ( isDefined( self.stub.buildablestruct.onbought ) ) + { + self [[ self.stub.buildablestruct.onbought ]]( player ); + continue; + } + else if ( !maps/mp/zombies/_zm_equipment::is_limited_equipment( self.stub.weaponname ) || !maps/mp/zombies/_zm_equipment::limited_equipment_in_use( self.stub.weaponname ) ) + { + player maps/mp/zombies/_zm_equipment::equipment_buy( self.stub.weaponname ); + player giveweapon( self.stub.weaponname ); + player setweaponammoclip( self.stub.weaponname, 1 ); + if ( isDefined( level.zombie_include_buildables[ self.stub.equipname ].onbuyweapon ) ) + { + self [[ level.zombie_include_buildables[ self.stub.equipname ].onbuyweapon ]]( player ); + } + if ( self.stub.weaponname != "keys_zm" ) + { + player setactionslot( 1, "weapon", self.stub.weaponname ); + } + self.stub.cursor_hint = "HINT_NOICON"; + self.stub.cursor_hint_weapon = undefined; + self setcursorhint( self.stub.cursor_hint ); + if ( isDefined( level.zombie_buildables[ self.stub.equipname ].bought ) ) + { + self.stub.hint_string = level.zombie_buildables[ self.stub.equipname ].bought; + } + else + { + self.stub.hint_string = ""; + } + self sethintstring( self.stub.hint_string ); + player track_buildables_pickedup( self.stub.weaponname ); + } + else + { + self.stub.hint_string = ""; + self sethintstring( self.stub.hint_string ); + self.stub.cursor_hint = "HINT_NOICON"; + self.stub.cursor_hint_weapon = undefined; + self setcursorhint( self.stub.cursor_hint ); + } + } + } +} + +bptrigger_think_unbuild_no_return( player ) //checked matches cerberus output +{ + stub_unbuild_buildable( self.stub, 0 ); +} + +bpstub_set_custom_think_callback( callback ) //checked matches cerberus output +{ + self.persistent = 4; + self.custom_completion_callback = callback; +} + +model_fly_away() //checked changed to match cerberus output +{ + self moveto( self.origin + vectorScale( ( 0, 0, 1 ), 40 ), 3 ); + direction = self.origin; + direction = ( direction[ 1 ], direction[ 0 ], 0 ); + if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 ) + { + direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 ); + } + else if ( direction[ 0 ] < 0 ) + { + direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 ); + } + self vibrate( direction, 10, 0.5, 4 ); + self waittill( "movedone" ); + self hide(); + playfx( level._effect[ "poltergeist" ], self.origin ); +} + +find_buildable_stub( equipname ) //checked changed to match cerberus output +{ + foreach ( stub in level.buildable_stubs ) + { + if ( stub.equipname == equipname ) + { + return stub; + } + } + return undefined; +} + +unbuild_buildable( equipname, return_pieces, origin, angles ) //checked matches cerberus output +{ + stub = find_buildable_stub( equipname ); + stub_unbuild_buildable( stub, return_pieces, origin, angles ); +} + +stub_unbuild_buildable( stub, return_pieces, origin, angles ) //checked partially changed to match cerberus output //did not change while loop to for loop +{ + if ( isDefined( stub ) ) + { + buildable = stub.buildablezone; + buildable.built = 0; + buildable.stub.built = 0; + buildable notify( "unbuilt" ); + level.buildables_built[ buildable.buildable_name ] = 0; + level notify( buildable.buildable_name + "_unbuilt" ); + i = 0; + while ( i < buildable.pieces.size ) + { + buildable.pieces[ i ].built = 0; + if ( isDefined( buildable.pieces[ i ].part_name ) ) + { + buildable.stub.model notsolid(); + if ( is_true( buildable.pieces[ i ].built ) ) + { + buildable.stub.model hidepart( buildable.pieces[ i ].part_name ); + } + else + { + buildable.stub.model show(); + buildable.stub.model showpart( buildable.pieces[ i ].part_name ); + } + } + if ( is_true( return_pieces ) ) + { + if ( isDefined( buildable.stub.str_unbuild_notify ) ) + { + buildable.pieces[ i ] thread piece_spawn_at_with_notify_delay( origin, angles, buildable.stub.str_unbuild_notify, buildable.stub.unbuild_respawn_fn ); + i++; + continue; + } + buildable.pieces[ i ] piece_spawn_at( origin, angles ); + } + i++; + } + if ( isDefined( buildable.stub.model ) ) + { + buildable.stub.model hide(); + } + } +} + +player_explode_buildable( equipname, origin, speed, return_to_spawn, return_time ) //checked changed to match cerberus output +{ + self explosiondamage( 50, origin ); + stub = find_buildable_stub( equipname ); + if ( isDefined( stub ) ) + { + buildable = stub.buildablezone; + buildable.built = 0; + buildable.stub.built = 0; + buildable notify( "unbuilt" ); + level.buildables_built[ buildable.buildable_name ] = 0; + level notify( buildable.buildable_name + "_unbuilt" ); + for ( i = 0; i < buildable.pieces.size; i++ ) + { + buildable.pieces[ i ].built = 0; + if ( isDefined( buildable.pieces[ i ].part_name ) ) + { + buildable.stub.model notsolid(); + if ( !is_true( buildable.pieces[ i ].built ) ) + { + buildable.stub.model hidepart( buildable.pieces[ i ].part_name ); + } + else + { + buildable.stub.model show(); + buildable.stub.model showpart( buildable.pieces[ i ].part_name ); + } + } + ang = randomfloat( 360 ); + h = 0.25 + randomfloat( 0.5 ); + dir = ( sin( ang ), cos( ang ), h ); + self thread player_throw_piece( buildable.pieces[ i ], origin, speed * dir, return_to_spawn, return_time ); + } + buildable.stub.model hide(); + } +} + +think_buildables() //checked changed to match cerberus output +{ + foreach ( buildable in level.zombie_include_buildables ) + { + if ( isDefined( buildable.triggerthink ) ) + { + level [[ buildable.triggerthink ]](); + wait_network_frame(); + } + } + level notify( "buildables_setup" ); +} + +buildable_trigger_think( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) //checked matches cerberus output +{ + return setup_unitrigger_buildable( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); +} + +buildable_trigger_think_array( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) //checked matches cerberus output +{ + return setup_unitrigger_buildable_array( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); +} + +buildable_set_unbuild_notify_delay( str_equipname, str_unbuild_notify, unbuild_respawn_fn ) //checked matches cerberus output +{ + stub = find_buildable_stub( str_equipname ); + stub.str_unbuild_notify = str_unbuild_notify; + stub.unbuild_respawn_fn = unbuild_respawn_fn; +} + +setup_vehicle_unitrigger_buildable( parent, trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) //checked matches cerberus output +{ + trig = getent( trigger_targetname, "targetname" ); + if ( !isDefined( trig ) ) + { + return; + } + unitrigger_stub = spawnstruct(); + unitrigger_stub.buildablestruct = level.zombie_include_buildables[ equipname ]; + unitrigger_stub.link_parent = parent; + unitrigger_stub.origin_parent = trig; + unitrigger_stub.trigger_targetname = trigger_targetname; + unitrigger_stub.originfunc = ::anystub_get_unitrigger_origin; + unitrigger_stub.onspawnfunc = ::anystub_on_spawn_trigger; + unitrigger_stub.origin = trig.origin; + unitrigger_stub.angles = trig.angles; + unitrigger_stub.equipname = equipname; + unitrigger_stub.weaponname = weaponname; + unitrigger_stub.trigger_hintstring = trigger_hintstring; + unitrigger_stub.delete_trigger = delete_trigger; + unitrigger_stub.built = 0; + unitrigger_stub.persistent = persistent; + unitrigger_stub.usetime = int( 3000 ); + unitrigger_stub.onbeginuse = ::onbeginuseuts; + unitrigger_stub.onenduse = ::onenduseuts; + unitrigger_stub.onuse = ::onuseplantobjectuts; + unitrigger_stub.oncantuse = ::oncantuseuts; + if ( isDefined( trig.script_length ) ) + { + unitrigger_stub.script_length = trig.script_length; + } + else + { + unitrigger_stub.script_length = 24; + } + if ( isDefined( trig.script_width ) ) + { + unitrigger_stub.script_width = trig.script_width; + } + else + { + unitrigger_stub.script_width = 64; + } + if ( isDefined( trig.script_height ) ) + { + unitrigger_stub.script_height = trig.script_height; + } + else + { + unitrigger_stub.script_height = 24; + } + if ( isDefined( trig.radius ) ) + { + unitrigger_stub.radius = trig.radius; + } + else + { + unitrigger_stub.radius = 64; + } + unitrigger_stub.target = trig.target; + unitrigger_stub.targetname = trig.targetname + "_trigger"; + unitrigger_stub.script_noteworthy = trig.script_noteworthy; + unitrigger_stub.script_parameters = trig.script_parameters; + unitrigger_stub.cursor_hint = "HINT_NOICON"; + if ( isDefined( level.zombie_buildables[ equipname ].hint ) ) + { + unitrigger_stub.hint_string = level.zombie_buildables[ equipname ].hint; + } + unitrigger_stub.script_unitrigger_type = "unitrigger_radius_use"; + unitrigger_stub.require_look_at = 1; + unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); + unitrigger_stub.prompt_and_visibility_func = ::buildabletrigger_update_prompt; + maps/mp/zombies/_zm_unitrigger::register_unitrigger( unitrigger_stub, ::buildable_place_think ); + unitrigger_stub.piece_trigger = trig; + trig.trigger_stub = unitrigger_stub; + unitrigger_stub.buildablezone = unitrigger_stub buildable_piece_unitriggers( equipname, unitrigger_stub.origin ); + if ( delete_trigger ) + { + trig delete(); + } + level.buildable_stubs[ level.buildable_stubs.size ] = unitrigger_stub; + return unitrigger_stub; +} + +vehicle_buildable_trigger_think( vehicle, trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) //checked matches cerberus output +{ + return setup_vehicle_unitrigger_buildable( vehicle, trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); +} + +ai_buildable_trigger_think( parent, equipname, weaponname, trigger_hintstring, persistent ) //checked matches cerberus output +{ + unitrigger_stub = spawnstruct(); + unitrigger_stub.buildablestruct = level.zombie_include_buildables[ equipname ]; + unitrigger_stub.link_parent = parent; + unitrigger_stub.origin_parent = parent; + unitrigger_stub.originfunc = ::anystub_get_unitrigger_origin; + unitrigger_stub.onspawnfunc = ::anystub_on_spawn_trigger; + unitrigger_stub.origin = parent.origin; + unitrigger_stub.angles = parent.angles; + unitrigger_stub.equipname = equipname; + unitrigger_stub.weaponname = weaponname; + unitrigger_stub.trigger_hintstring = trigger_hintstring; + unitrigger_stub.delete_trigger = 1; + unitrigger_stub.built = 0; + unitrigger_stub.persistent = persistent; + unitrigger_stub.usetime = int( 3000 ); + unitrigger_stub.onbeginuse = ::onbeginuseuts; + unitrigger_stub.onenduse = ::onenduseuts; + unitrigger_stub.onuse = ::onuseplantobjectuts; + unitrigger_stub.oncantuse = ::oncantuseuts; + unitrigger_stub.script_length = 64; + unitrigger_stub.script_width = 64; + unitrigger_stub.script_height = 54; + unitrigger_stub.radius = 64; + unitrigger_stub.cursor_hint = "HINT_NOICON"; + if ( isDefined( level.zombie_buildables[ equipname ].hint ) ) + { + unitrigger_stub.hint_string = level.zombie_buildables[ equipname ].hint; + } + unitrigger_stub.script_unitrigger_type = "unitrigger_radius_use"; + unitrigger_stub.require_look_at = 0; + unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); + unitrigger_stub.prompt_and_visibility_func = ::buildabletrigger_update_prompt; + maps/mp/zombies/_zm_unitrigger::register_unitrigger( unitrigger_stub, ::buildable_place_think ); + unitrigger_stub.buildablezone = unitrigger_stub buildable_piece_unitriggers( equipname, unitrigger_stub.origin ); + level.buildable_stubs[ level.buildable_stubs.size ] = unitrigger_stub; + return unitrigger_stub; +} + +onpickuputs( player ) //checked matches cerberus output +{ + /* /# - assert( isdefined( level.zombie_buildables[self.equipname].hint ), "Missing buildable hint" ); + if ( isDefined( player ) && isDefined( player.name ) ) + { + println( "ZM >> Buildable piece recovered by - " + player.name ); #/ - if ( isdefined( level.zombie_buildables[self.equipname].hint ) ) - self.hint_string = level.zombie_buildables[self.equipname].hint; - else - self.hint_string = "Missing buildable hint"; - } - } - else if ( self.persistent == 1 ) - { - if ( maps\mp\zombies\_zm_equipment::is_limited_equipment( self.weaponname ) && maps\mp\zombies\_zm_equipment::limited_equipment_in_use( self.weaponname ) ) - { - self.hint_string = &"ZOMBIE_BUILD_PIECE_ONLY_ONE"; - return false; - } - - if ( player has_player_equipment( self.weaponname ) ) - { - self.hint_string = &"ZOMBIE_BUILD_PIECE_HAVE_ONE"; - return false; - } - - if ( getdvarint( "tu12_zombies_allow_hint_weapon_from_script" ) ) - { - self.cursor_hint = "HINT_WEAPON"; - self.cursor_hint_weapon = self.weaponname; - } - - self.hint_string = self.trigger_hintstring; - } - else if ( self.persistent == 2 ) - { - if ( !maps\mp\zombies\_zm_weapons::limited_weapon_below_quota( self.weaponname, undefined ) ) - { - self.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED"; - return false; - } - else if ( isdefined( self.bought ) && self.bought ) - { - self.hint_string = &"ZOMBIE_GO_TO_THE_BOX"; - return false; - } - - self.hint_string = self.trigger_hintstring; - } - else - { - self.hint_string = ""; - return false; - } - - return true; + } + */ } -player_continue_building( buildablezone, build_stub ) -{ - if ( !isdefined( build_stub ) ) - build_stub = buildablezone.stub; - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || self in_revive_trigger() ) - return false; - - if ( self isthrowinggrenade() ) - return false; - - if ( !self player_can_build( buildablezone, 1 ) ) - return false; - - if ( isdefined( self.screecher ) ) - return false; - - if ( !self usebuttonpressed() ) - return false; - - slot = build_stub.buildablestruct.buildable_slot; - - if ( !buildablezone buildable_is_piece_building( self player_get_buildable_piece( slot ) ) ) - return false; - - trigger = build_stub maps\mp\zombies\_zm_unitrigger::unitrigger_trigger( self ); - - if ( build_stub.script_unitrigger_type == "unitrigger_radius_use" ) - { - torigin = build_stub unitrigger_origin(); - porigin = self geteye(); - radius_sq = 2.25 * build_stub.test_radius_sq; - - if ( distance2dsquared( torigin, porigin ) > radius_sq ) - return false; - } - else if ( !isdefined( trigger ) || !trigger istouching( self ) ) - return false; - - if ( isdefined( build_stub.require_look_at ) && build_stub.require_look_at && !self is_player_looking_at( trigger.origin, 0.4 ) ) - return false; - - return true; -} - -player_progress_bar_update( start_time, build_time ) -{ - self endon( "entering_last_stand" ); - self endon( "death" ); - self endon( "disconnect" ); - self endon( "buildable_progress_end" ); - - while ( isdefined( self ) && gettime() - start_time < build_time ) - { - progress = ( gettime() - start_time ) / build_time; - - if ( progress < 0 ) - progress = 0; - - if ( progress > 1 ) - progress = 1; - - self.usebar updatebar( progress ); - wait 0.05; - } -} - -player_progress_bar( start_time, build_time, building_prompt ) -{ - self.usebar = self createprimaryprogressbar(); - self.usebartext = self createprimaryprogressbartext(); - - if ( isdefined( building_prompt ) ) - self.usebartext settext( building_prompt ); - else - self.usebartext settext( &"ZOMBIE_BUILDING" ); - - if ( isdefined( self ) && isdefined( start_time ) && isdefined( build_time ) ) - self player_progress_bar_update( start_time, build_time ); - - self.usebartext destroyelem(); - self.usebar destroyelem(); -} - -buildable_use_hold_think_internal( player, bind_stub ) -{ - if ( !isdefined( bind_stub ) ) - bind_stub = self.stub; - - wait 0.01; - - if ( !isdefined( self ) ) - { - self notify( "build_failed" ); - - if ( isdefined( player.buildableaudio ) ) - { - player.buildableaudio delete(); - player.buildableaudio = undefined; - } - - return; - } - - if ( !isdefined( self.usetime ) ) - self.usetime = int( 3000 ); - - self.build_time = self.usetime; - self.build_start_time = gettime(); - build_time = self.build_time; - build_start_time = self.build_start_time; - player disable_player_move_states( 1 ); - player increment_is_drinking(); - orgweapon = player getcurrentweapon(); - build_weapon = "zombie_builder_zm"; - - if ( isdefined( bind_stub.build_weapon ) ) - build_weapon = bind_stub.build_weapon; - - player giveweapon( build_weapon ); - player switchtoweapon( build_weapon ); - slot = bind_stub.buildablestruct.buildable_slot; - bind_stub.buildablezone buildable_set_piece_building( player player_get_buildable_piece( slot ) ); - player thread player_progress_bar( build_start_time, build_time, bind_stub.building_prompt ); - - if ( isdefined( level.buildable_build_custom_func ) ) - player thread [[ level.buildable_build_custom_func ]]( self.stub ); - - while ( isdefined( self ) && player player_continue_building( bind_stub.buildablezone, self.stub ) && gettime() - self.build_start_time < self.build_time ) - wait 0.05; - - player notify( "buildable_progress_end" ); - player maps\mp\zombies\_zm_weapons::switch_back_primary_weapon( orgweapon ); - player takeweapon( "zombie_builder_zm" ); - - if ( isdefined( player.is_drinking ) && player.is_drinking ) - player decrement_is_drinking(); - - player enable_player_move_states(); - - if ( isdefined( self ) && player player_continue_building( bind_stub.buildablezone, self.stub ) && gettime() - self.build_start_time >= self.build_time ) - { - buildable_clear_piece_building( player player_get_buildable_piece( slot ) ); - self notify( "build_succeed" ); - } - else - { - if ( isdefined( player.buildableaudio ) ) - { - player.buildableaudio delete(); - player.buildableaudio = undefined; - } - - buildable_clear_piece_building( player player_get_buildable_piece( slot ) ); - self notify( "build_failed" ); - } -} - -buildable_play_build_fx( player ) -{ - self endon( "kill_trigger" ); - self endon( "build_succeed" ); - self endon( "build_failed" ); - - while ( true ) - { - playfx( level._effect["building_dust"], player getplayercamerapos(), player.angles ); - wait 0.5; - } -} - -buildable_use_hold_think( player, bind_stub ) -{ - if ( !isdefined( bind_stub ) ) - bind_stub = self.stub; - - self thread buildable_play_build_fx( player ); - self thread buildable_use_hold_think_internal( player, bind_stub ); - retval = self waittill_any_return( "build_succeed", "build_failed" ); - - if ( retval == "build_succeed" ) - return true; - - return false; -} - -buildable_place_think() -{ - self endon( "kill_trigger" ); - player_built = undefined; - - while ( !( isdefined( self.stub.built ) && self.stub.built ) ) - { - self waittill( "trigger", player ); - - if ( player != self.parent_player ) - continue; - - if ( isdefined( player.screecher_weapon ) ) - continue; - - if ( !is_player_valid( player ) ) - { - player thread ignore_triggers( 0.5 ); - continue; - } - - status = player player_can_build( self.stub.buildablezone ); - - if ( !status ) - { - self.stub.hint_string = ""; - self sethintstring( self.stub.hint_string ); - - if ( isdefined( self.stub.oncantuse ) ) - self.stub [[ self.stub.oncantuse ]]( player ); - } - else - { - if ( isdefined( self.stub.onbeginuse ) ) - self.stub [[ self.stub.onbeginuse ]]( player ); - - result = self buildable_use_hold_think( player ); - team = player.pers["team"]; - - if ( isdefined( self.stub.onenduse ) ) - self.stub [[ self.stub.onenduse ]]( team, player, result ); - - if ( !result ) - continue; - - if ( isdefined( self.stub.onuse ) ) - self.stub [[ self.stub.onuse ]]( player ); - - slot = self.stub.buildablestruct.buildable_slot; - - if ( isdefined( player player_get_buildable_piece( slot ) ) ) - { - prompt = player player_build( self.stub.buildablezone ); - player_built = player; - self.stub.hint_string = prompt; - } - - self sethintstring( self.stub.hint_string ); - } - } - - if ( isdefined( player_built ) ) - { - - } - - switch ( self.stub.persistent ) - { - case "1": - self bptrigger_think_persistent( player_built ); - break; - case "0": - self bptrigger_think_one_time( player_built ); - break; - case "3": - self bptrigger_think_unbuild( player_built ); - break; - case "2": - self bptrigger_think_one_use_and_fly( player_built ); - break; - case "4": - self [[ self.stub.custom_completion_callback ]]( player_built ); - break; - } -} - -bptrigger_think_one_time( player_built ) -{ - self.stub buildablestub_remove(); - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.stub ); -} - -bptrigger_think_unbuild( player_built ) -{ - stub_unbuild_buildable( self.stub, 1 ); -} - -bptrigger_think_one_use_and_fly( player_built ) -{ - if ( isdefined( player_built ) ) - self buildabletrigger_update_prompt( player_built ); - - if ( !maps\mp\zombies\_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) ) - { - self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED"; - self sethintstring( self.stub.hint_string ); - return; - } - - if ( isdefined( self.stub.bought ) && self.stub.bought ) - { - self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX"; - self sethintstring( self.stub.hint_string ); - return; - } - - if ( isdefined( self.stub.model ) ) - { - self.stub.model notsolid(); - self.stub.model show(); - } - - while ( self.stub.persistent == 2 ) - { - self waittill( "trigger", player ); - - if ( isdefined( player.screecher_weapon ) ) - continue; - - if ( !maps\mp\zombies\_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) ) - { - self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED"; - self sethintstring( self.stub.hint_string ); - return; - } - - if ( !( isdefined( self.stub.built ) && self.stub.built ) ) - { - self.stub.hint_string = ""; - self sethintstring( self.stub.hint_string ); - return; - } - - if ( player != self.parent_player ) - continue; - - if ( !is_player_valid( player ) ) - { - player thread ignore_triggers( 0.5 ); - continue; - } - - self.stub.bought = 1; - - if ( isdefined( self.stub.model ) ) - self.stub.model thread model_fly_away(); - - player maps\mp\zombies\_zm_weapons::weapon_give( self.stub.weaponname ); - - if ( isdefined( level.zombie_include_buildables[self.stub.equipname].onbuyweapon ) ) - self [[ level.zombie_include_buildables[self.stub.equipname].onbuyweapon ]]( player ); - - if ( !maps\mp\zombies\_zm_weapons::limited_weapon_below_quota( self.stub.weaponname, undefined ) ) - self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX_LIMITED"; - else - self.stub.hint_string = &"ZOMBIE_GO_TO_THE_BOX"; - - self sethintstring( self.stub.hint_string ); - player track_buildables_pickedup( self.stub.weaponname ); - } -} - -bptrigger_think_persistent( player_built ) -{ - if ( !isdefined( player_built ) || self [[ self.stub.prompt_and_visibility_func ]]( player_built ) ) - { - if ( isdefined( self.stub.model ) ) - { - self.stub.model notsolid(); - self.stub.model show(); - } - - while ( self.stub.persistent == 1 ) - { - self waittill( "trigger", player ); - - if ( isdefined( player.screecher_weapon ) ) - continue; - - if ( !( isdefined( self.stub.built ) && self.stub.built ) ) - { - self.stub.hint_string = ""; - self sethintstring( self.stub.hint_string ); - self setcursorhint( "HINT_NOICON" ); - return; - } - - if ( player != self.parent_player ) - continue; - - if ( !is_player_valid( player ) ) - { - player thread ignore_triggers( 0.5 ); - continue; - } - - if ( player has_player_equipment( self.stub.weaponname ) ) - continue; - - if ( isdefined( self.stub.buildablestruct.onbought ) ) - self [[ self.stub.buildablestruct.onbought ]]( player ); - else if ( !maps\mp\zombies\_zm_equipment::is_limited_equipment( self.stub.weaponname ) || !maps\mp\zombies\_zm_equipment::limited_equipment_in_use( self.stub.weaponname ) ) - { - player maps\mp\zombies\_zm_equipment::equipment_buy( self.stub.weaponname ); - player giveweapon( self.stub.weaponname ); - player setweaponammoclip( self.stub.weaponname, 1 ); - - if ( isdefined( level.zombie_include_buildables[self.stub.equipname].onbuyweapon ) ) - self [[ level.zombie_include_buildables[self.stub.equipname].onbuyweapon ]]( player ); - - if ( self.stub.weaponname != "keys_zm" ) - player setactionslot( 1, "weapon", self.stub.weaponname ); - - self.stub.cursor_hint = "HINT_NOICON"; - self.stub.cursor_hint_weapon = undefined; - self setcursorhint( self.stub.cursor_hint ); - - if ( isdefined( level.zombie_buildables[self.stub.equipname].bought ) ) - self.stub.hint_string = level.zombie_buildables[self.stub.equipname].bought; - else - self.stub.hint_string = ""; - - self sethintstring( self.stub.hint_string ); - player track_buildables_pickedup( self.stub.weaponname ); - } - else - { - self.stub.hint_string = ""; - self sethintstring( self.stub.hint_string ); - self.stub.cursor_hint = "HINT_NOICON"; - self.stub.cursor_hint_weapon = undefined; - self setcursorhint( self.stub.cursor_hint ); - } - } - } -} - -bptrigger_think_unbuild_no_return( player ) -{ - stub_unbuild_buildable( self.stub, 0 ); -} - -bpstub_set_custom_think_callback( callback ) -{ - self.persistent = 4; - self.custom_completion_callback = callback; -} - -model_fly_away() -{ - self moveto( self.origin + vectorscale( ( 0, 0, 1 ), 40.0 ), 3 ); - direction = self.origin; - direction = ( direction[1], direction[0], 0 ); - - if ( direction[1] < 0 || direction[0] > 0 && direction[1] > 0 ) - direction = ( direction[0], direction[1] * -1, 0 ); - else if ( direction[0] < 0 ) - direction = ( direction[0] * -1, direction[1], 0 ); - - self vibrate( direction, 10, 0.5, 4 ); - - self waittill( "movedone" ); - - self hide(); - playfx( level._effect["poltergeist"], self.origin ); -} - -find_buildable_stub( equipname ) -{ - foreach ( stub in level.buildable_stubs ) - { - if ( stub.equipname == equipname ) - return stub; - } - - return undefined; -} - -unbuild_buildable( equipname, return_pieces, origin, angles ) -{ - stub = find_buildable_stub( equipname ); - stub_unbuild_buildable( stub, return_pieces, origin, angles ); -} - -stub_unbuild_buildable( stub, return_pieces, origin, angles ) -{ - if ( isdefined( stub ) ) - { - buildable = stub.buildablezone; - buildable.built = 0; - buildable.stub.built = 0; - buildable notify( "unbuilt" ); - level.buildables_built[buildable.buildable_name] = 0; - level notify( buildable.buildable_name + "_unbuilt" ); - - for ( i = 0; i < buildable.pieces.size; i++ ) - { - buildable.pieces[i].built = 0; - - if ( isdefined( buildable.pieces[i].part_name ) ) - { - buildable.stub.model notsolid(); - - if ( !( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built ) ) - buildable.stub.model hidepart( buildable.pieces[i].part_name ); - else - { - buildable.stub.model show(); - buildable.stub.model showpart( buildable.pieces[i].part_name ); - } - } - - if ( isdefined( return_pieces ) && return_pieces ) - { - if ( isdefined( buildable.stub.str_unbuild_notify ) ) - { - buildable.pieces[i] thread piece_spawn_at_with_notify_delay( origin, angles, buildable.stub.str_unbuild_notify, buildable.stub.unbuild_respawn_fn ); - continue; - } - - buildable.pieces[i] piece_spawn_at( origin, angles ); - } - } - - if ( isdefined( buildable.stub.model ) ) - buildable.stub.model hide(); - } -} - -player_explode_buildable( equipname, origin, speed, return_to_spawn, return_time ) -{ - self explosiondamage( 50, origin ); - stub = find_buildable_stub( equipname ); - - if ( isdefined( stub ) ) - { - buildable = stub.buildablezone; - buildable.built = 0; - buildable.stub.built = 0; - buildable notify( "unbuilt" ); - level.buildables_built[buildable.buildable_name] = 0; - level notify( buildable.buildable_name + "_unbuilt" ); - - for ( i = 0; i < buildable.pieces.size; i++ ) - { - buildable.pieces[i].built = 0; - - if ( isdefined( buildable.pieces[i].part_name ) ) - { - buildable.stub.model notsolid(); - - if ( !( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built ) ) - buildable.stub.model hidepart( buildable.pieces[i].part_name ); - else - { - buildable.stub.model show(); - buildable.stub.model showpart( buildable.pieces[i].part_name ); - } - } - - ang = randomfloat( 360 ); - h = 0.25 + randomfloat( 0.5 ); - dir = ( sin( ang ), cos( ang ), h ); - self thread player_throw_piece( buildable.pieces[i], origin, speed * dir, return_to_spawn, return_time ); - } - - buildable.stub.model hide(); - } -} - -think_buildables() -{ - foreach ( buildable in level.zombie_include_buildables ) - { - if ( isdefined( buildable.triggerthink ) ) - { - level [[ buildable.triggerthink ]](); - wait_network_frame(); - } - } - - level notify( "buildables_setup" ); -} - -buildable_trigger_think( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) -{ - return setup_unitrigger_buildable( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); -} - -buildable_trigger_think_array( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) -{ - return setup_unitrigger_buildable_array( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); -} - -buildable_set_unbuild_notify_delay( str_equipname, str_unbuild_notify, unbuild_respawn_fn ) -{ - stub = find_buildable_stub( str_equipname ); - stub.str_unbuild_notify = str_unbuild_notify; - stub.unbuild_respawn_fn = unbuild_respawn_fn; -} - -setup_vehicle_unitrigger_buildable( parent, trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) -{ - trig = getent( trigger_targetname, "targetname" ); - - if ( !isdefined( trig ) ) - return; - - unitrigger_stub = spawnstruct(); - unitrigger_stub.buildablestruct = level.zombie_include_buildables[equipname]; - unitrigger_stub.link_parent = parent; - unitrigger_stub.origin_parent = trig; - unitrigger_stub.trigger_targetname = trigger_targetname; - unitrigger_stub.originfunc = ::anystub_get_unitrigger_origin; - unitrigger_stub.onspawnfunc = ::anystub_on_spawn_trigger; - unitrigger_stub.origin = trig.origin; - unitrigger_stub.angles = trig.angles; - unitrigger_stub.equipname = equipname; - unitrigger_stub.weaponname = weaponname; - unitrigger_stub.trigger_hintstring = trigger_hintstring; - unitrigger_stub.delete_trigger = delete_trigger; - unitrigger_stub.built = 0; - unitrigger_stub.persistent = persistent; - unitrigger_stub.usetime = int( 3000 ); - unitrigger_stub.onbeginuse = ::onbeginuseuts; - unitrigger_stub.onenduse = ::onenduseuts; - unitrigger_stub.onuse = ::onuseplantobjectuts; - unitrigger_stub.oncantuse = ::oncantuseuts; - - if ( isdefined( trig.script_length ) ) - unitrigger_stub.script_length = trig.script_length; - else - unitrigger_stub.script_length = 24; - - if ( isdefined( trig.script_width ) ) - unitrigger_stub.script_width = trig.script_width; - else - unitrigger_stub.script_width = 64; - - if ( isdefined( trig.script_height ) ) - unitrigger_stub.script_height = trig.script_height; - else - unitrigger_stub.script_height = 24; - - if ( isdefined( trig.radius ) ) - unitrigger_stub.radius = trig.radius; - else - unitrigger_stub.radius = 64; - - unitrigger_stub.target = trig.target; - unitrigger_stub.targetname = trig.targetname + "_trigger"; - unitrigger_stub.script_noteworthy = trig.script_noteworthy; - unitrigger_stub.script_parameters = trig.script_parameters; - unitrigger_stub.cursor_hint = "HINT_NOICON"; - - if ( isdefined( level.zombie_buildables[equipname].hint ) ) - unitrigger_stub.hint_string = level.zombie_buildables[equipname].hint; - - unitrigger_stub.script_unitrigger_type = "unitrigger_radius_use"; - unitrigger_stub.require_look_at = 1; - unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); - unitrigger_stub.prompt_and_visibility_func = ::buildabletrigger_update_prompt; - maps\mp\zombies\_zm_unitrigger::register_unitrigger( unitrigger_stub, ::buildable_place_think ); - unitrigger_stub.piece_trigger = trig; - trig.trigger_stub = unitrigger_stub; - unitrigger_stub.buildablezone = unitrigger_stub buildable_piece_unitriggers( equipname, unitrigger_stub.origin ); - - if ( delete_trigger ) - trig delete(); - - level.buildable_stubs[level.buildable_stubs.size] = unitrigger_stub; - return unitrigger_stub; -} - -vehicle_buildable_trigger_think( vehicle, trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) -{ - return setup_vehicle_unitrigger_buildable( vehicle, trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ); -} - -ai_buildable_trigger_think( parent, equipname, weaponname, trigger_hintstring, persistent ) -{ - unitrigger_stub = spawnstruct(); - unitrigger_stub.buildablestruct = level.zombie_include_buildables[equipname]; - unitrigger_stub.link_parent = parent; - unitrigger_stub.origin_parent = parent; - unitrigger_stub.originfunc = ::anystub_get_unitrigger_origin; - unitrigger_stub.onspawnfunc = ::anystub_on_spawn_trigger; - unitrigger_stub.origin = parent.origin; - unitrigger_stub.angles = parent.angles; - unitrigger_stub.equipname = equipname; - unitrigger_stub.weaponname = weaponname; - unitrigger_stub.trigger_hintstring = trigger_hintstring; - unitrigger_stub.delete_trigger = 1; - unitrigger_stub.built = 0; - unitrigger_stub.persistent = persistent; - unitrigger_stub.usetime = int( 3000 ); - unitrigger_stub.onbeginuse = ::onbeginuseuts; - unitrigger_stub.onenduse = ::onenduseuts; - unitrigger_stub.onuse = ::onuseplantobjectuts; - unitrigger_stub.oncantuse = ::oncantuseuts; - unitrigger_stub.script_length = 64; - unitrigger_stub.script_width = 64; - unitrigger_stub.script_height = 54; - unitrigger_stub.radius = 64; - unitrigger_stub.cursor_hint = "HINT_NOICON"; - - if ( isdefined( level.zombie_buildables[equipname].hint ) ) - unitrigger_stub.hint_string = level.zombie_buildables[equipname].hint; - - unitrigger_stub.script_unitrigger_type = "unitrigger_radius_use"; - unitrigger_stub.require_look_at = 0; - unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); - unitrigger_stub.prompt_and_visibility_func = ::buildabletrigger_update_prompt; - maps\mp\zombies\_zm_unitrigger::register_unitrigger( unitrigger_stub, ::buildable_place_think ); - unitrigger_stub.buildablezone = unitrigger_stub buildable_piece_unitriggers( equipname, unitrigger_stub.origin ); - level.buildable_stubs[level.buildable_stubs.size] = unitrigger_stub; - return unitrigger_stub; -} - -onpickuputs( player ) +ondroputs( player ) //checked matches cerberus output { + /* /# - if ( isdefined( player ) && isdefined( player.name ) ) - println( "ZM >> Buildable piece recovered by - " + player.name ); + if ( isDefined( player ) && isDefined( player.name ) ) + { + println( "ZM >> Buildable piece dropped by - " + player.name ); #/ + } + */ + player notify( "event_ended" ); } -ondroputs( player ) +onbeginuseuts( player ) //checked matches cerberus output { + /* /# - if ( isdefined( player ) && isdefined( player.name ) ) - println( "ZM >> Buildable piece dropped by - " + player.name ); + if ( isDefined( player ) && isDefined( player.name ) ) + { + println( "ZM >> Buildable piece begin use by - " + player.name ); #/ - player notify( "event_ended" ); + } + */ + if ( isDefined( self.buildablestruct.onbeginuse ) ) + { + self [[ self.buildablestruct.onbeginuse ]]( player ); + } + if ( isDefined( player ) && !isDefined( player.buildableaudio ) ) + { + alias = sndbuildableusealias( self.targetname ); + player.buildableaudio = spawn( "script_origin", player.origin ); + player.buildableaudio playloopsound( alias ); + } } -onbeginuseuts( player ) +sndbuildableusealias( name ) //checked matches cerberus output { + alias = undefined; + switch( name ) + { + case "cell_door_trigger": + alias = "zmb_jail_buildable"; + break; + case "generator_use_trigger": + alias = "zmb_generator_buildable"; + break; + case "chalk_buildable_trigger": + alias = "zmb_chalk_loop"; + break; + default: + alias = "zmb_buildable_loop"; + break; + } + return alias; +} + +onenduseuts( team, player, result ) //checked matches cerberus output +{ + /* /# - if ( isdefined( player ) && isdefined( player.name ) ) - println( "ZM >> Buildable piece begin use by - " + player.name ); + if ( isDefined( player ) && isDefined( player.name ) ) + { + println( "ZM >> Buildable piece end use by - " + player.name ); #/ - if ( isdefined( self.buildablestruct.onbeginuse ) ) - self [[ self.buildablestruct.onbeginuse ]]( player ); - - if ( isdefined( player ) && !isdefined( player.buildableaudio ) ) - { - alias = sndbuildableusealias( self.targetname ); - player.buildableaudio = spawn( "script_origin", player.origin ); - player.buildableaudio playloopsound( alias ); - } + } + */ + if ( !isDefined( player ) ) + { + return; + } + if ( isDefined( player.buildableaudio ) ) + { + player.buildableaudio delete(); + player.buildableaudio = undefined; + } + if ( isDefined( self.buildablestruct.onenduse ) ) + { + self [[ self.buildablestruct.onenduse ]]( team, player, result ); + } + player notify( "event_ended" ); } - -sndbuildableusealias( name ) -{ - alias = undefined; - - switch ( name ) - { - case "cell_door_trigger": - alias = "zmb_jail_buildable"; - break; - case "generator_use_trigger": - alias = "zmb_generator_buildable"; - break; - case "chalk_buildable_trigger": - alias = "zmb_chalk_loop"; - break; - default: - alias = "zmb_buildable_loop"; - break; - } - - return alias; -} - -onenduseuts( team, player, result ) + +oncantuseuts( player ) //checked matches cerberus output { + /* /# - if ( isdefined( player ) && isdefined( player.name ) ) - println( "ZM >> Buildable piece end use by - " + player.name ); + if ( isDefined( player ) && isDefined( player.name ) ) + { + println( "ZM >> Buildable piece can't use by - " + player.name ); #/ - if ( !isdefined( player ) ) - return; - - if ( isdefined( player.buildableaudio ) ) - { - player.buildableaudio delete(); - player.buildableaudio = undefined; - } - - if ( isdefined( self.buildablestruct.onenduse ) ) - self [[ self.buildablestruct.onenduse ]]( team, player, result ); - - player notify( "event_ended" ); + } + */ + if ( isDefined( self.buildablestruct.oncantuse ) ) + { + self [[ self.buildablestruct.oncantuse ]]( player ); + } } -oncantuseuts( player ) +onuseplantobjectuts( player ) //checked matches cerberus output { + /* /# - if ( isdefined( player ) && isdefined( player.name ) ) - println( "ZM >> Buildable piece can't use by - " + player.name ); + if ( isDefined( player ) && isDefined( player.name ) ) + { + println( "ZM >> Buildable piece crafted by - " + player.name ); #/ - if ( isdefined( self.buildablestruct.oncantuse ) ) - self [[ self.buildablestruct.oncantuse ]]( player ); + } + */ + if ( isDefined( self.buildablestruct.onuseplantobject ) ) + { + self [[ self.buildablestruct.onuseplantobject ]]( player ); + } + player notify( "bomb_planted" ); } -onuseplantobjectuts( player ) +add_zombie_buildable_vox_category( buildable_name, vox_id ) //checked matches cerberus output { + buildable_struct = level.zombie_include_buildables[ buildable_name ]; + buildable_struct.vox_id = vox_id; +} + +add_zombie_buildable_piece_vox_category( buildable_name, vox_id, timer ) //checked matches cerberus output +{ + buildable_struct = level.zombie_include_buildables[ buildable_name ]; + buildable_struct.piece_vox_id = vox_id; + buildable_struct.piece_vox_timer = timer; +} + +is_buildable() //checked matches cerberus output +{ + if ( !isDefined( level.zombie_buildables ) ) + { + return 0; + } + if ( isDefined( self.zombie_weapon_upgrade ) && isDefined( level.zombie_buildables[ self.zombie_weapon_upgrade ] ) ) + { + return 1; + } + if ( isDefined( self.script_noteworthy ) && self.script_noteworthy == "specialty_weapupgrade" ) + { + if ( isDefined( level.buildables_built[ "pap" ] ) && level.buildables_built[ "pap" ] ) + { + return 0; + } + return 1; + } + return 0; +} + +buildable_crafted() //checked matches cerberus output +{ + self.pieces--; + +} + +buildable_complete() //checked matches cerberus output +{ + if ( self.pieces <= 0 ) + { + return 1; + } + return 0; +} + +get_buildable_hint( buildable_name ) //checked matches cerberus output +{ + /* /# - if ( isdefined( player ) && isdefined( player.name ) ) - println( "ZM >> Buildable piece crafted by - " + player.name ); + assert( isDefined( level.zombie_buildables[ buildable_name ] ), buildable_name + " was not included or is not part of the zombie weapon list." ); #/ - if ( isdefined( self.buildablestruct.onuseplantobject ) ) - self [[ self.buildablestruct.onuseplantobject ]]( player ); - - player notify( "bomb_planted" ); + */ + return level.zombie_buildables[ buildable_name ].hint; } -add_zombie_buildable_vox_category( buildable_name, vox_id ) +delete_on_disconnect( buildable, self_notify, skip_delete ) //checked matches cerberus output { - buildable_struct = level.zombie_include_buildables[buildable_name]; - buildable_struct.vox_id = vox_id; + buildable endon( "death" ); + self waittill( "disconnect" ); + if ( isDefined( self_notify ) ) + { + self notify( self_notify ); + } + if ( isDefined( skip_delete ) && !skip_delete ) + { + if ( isDefined( buildable.stub ) ) + { + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( buildable.stub ); + buildable.stub = undefined; + } + if ( isDefined( buildable ) ) + { + buildable delete(); + } + } } -add_zombie_buildable_piece_vox_category( buildable_name, vox_id, timer ) +get_buildable_pickup( buildablename, modelname ) //checked changed to match cerberus output { - buildable_struct = level.zombie_include_buildables[buildable_name]; - buildable_struct.piece_vox_id = vox_id; - buildable_struct.piece_vox_timer = timer; + foreach ( buildablepickup in level.buildablepickups ) + { + if ( buildablepickup[ 0 ].buildablestruct.name == buildablename && buildablepickup[ 0 ].visuals[ 0 ].model == modelname ) + { + return buildablepickup[ 0 ]; + } + } + return undefined; } -is_buildable() -{ - if ( !isdefined( level.zombie_buildables ) ) - return false; - - if ( isdefined( self.zombie_weapon_upgrade ) && isdefined( level.zombie_buildables[self.zombie_weapon_upgrade] ) ) - return true; - - if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "specialty_weapupgrade" ) - { - if ( isdefined( level.buildables_built["pap"] ) && level.buildables_built["pap"] ) - return false; - - return true; - } - - return false; -} - -buildable_crafted() -{ - self.pieces--; -} - -buildable_complete() -{ - if ( self.pieces <= 0 ) - return true; - - return false; -} - -get_buildable_hint( buildable_name ) +track_buildable_piece_pickedup( piece ) //checked matches cerberus output { + if ( !isDefined( piece ) || !isDefined( piece.buildablename ) ) + { + /* /# - assert( isdefined( level.zombie_buildables[buildable_name] ), buildable_name + " was not included or is not part of the zombie weapon list." ); + println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildable_piece_pickedup() \n" ); #/ - return level.zombie_buildables[buildable_name].hint; + */ + return; + } + self add_map_buildable_stat( piece.buildablename, "pieces_pickedup", 1 ); + buildable_struct = level.zombie_include_buildables[ piece.buildablename ]; + if ( isDefined( buildable_struct.piece_vox_id ) ) + { + if ( isDefined( self.a_buildable_piece_pickedup_vox_cooldown ) && isinarray( self.a_buildable_piece_pickedup_vox_cooldown, buildable_struct.piece_vox_id ) ) + { + return; + } + self thread do_player_general_vox( "general", buildable_struct.piece_vox_id + "_pickup" ); + if ( isDefined( buildable_struct.piece_vox_timer ) ) + { + self thread buildable_piece_pickedup_vox_cooldown( buildable_struct.piece_vox_id, buildable_struct.piece_vox_timer ); + } + } + else + { + self thread do_player_general_vox( "general", "build_pickup" ); + } } -delete_on_disconnect( buildable, self_notify, skip_delete ) +buildable_piece_pickedup_vox_cooldown( piece_vox_id, timer ) //checked matches cerberus output { - buildable endon( "death" ); - - self waittill( "disconnect" ); - - if ( isdefined( self_notify ) ) - self notify( self_notify ); - - if ( !( isdefined( skip_delete ) && skip_delete ) ) - { - if ( isdefined( buildable.stub ) ) - { - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( buildable.stub ); - buildable.stub = undefined; - } - - if ( isdefined( buildable ) ) - buildable delete(); - } + self endon( "disconnect" ); + if ( !isDefined( self.a_buildable_piece_pickedup_vox_cooldown ) ) + { + self.a_buildable_piece_pickedup_vox_cooldown = []; + } + self.a_buildable_piece_pickedup_vox_cooldown[ self.a_buildable_piece_pickedup_vox_cooldown.size ] = piece_vox_id; + wait timer; + arrayremovevalue( self.a_buildable_piece_pickedup_vox_cooldown, piece_vox_id ); } -get_buildable_pickup( buildablename, modelname ) +track_buildable_pieces_built( buildable ) //checked matches cerberus output { - foreach ( buildablepickup in level.buildablepickups ) - { - if ( buildablepickup[0].buildablestruct.name == buildablename && buildablepickup[0].visuals[0].model == modelname ) - return buildablepickup[0]; - } - - return undefined; -} - -track_buildable_piece_pickedup( piece ) -{ - if ( !isdefined( piece ) || !isdefined( piece.buildablename ) ) - { + if ( !isDefined( buildable ) || !isDefined( buildable.buildable_name ) ) + { + /* /# - println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildable_piece_pickedup() \n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildable_pieces_built() \n" ); #/ - return; - } - - self add_map_buildable_stat( piece.buildablename, "pieces_pickedup", 1 ); - buildable_struct = level.zombie_include_buildables[piece.buildablename]; - - if ( isdefined( buildable_struct.piece_vox_id ) ) - { - if ( isdefined( self.a_buildable_piece_pickedup_vox_cooldown ) && isinarray( self.a_buildable_piece_pickedup_vox_cooldown, buildable_struct.piece_vox_id ) ) - return; - - self thread do_player_general_vox( "general", buildable_struct.piece_vox_id + "_pickup" ); - - if ( isdefined( buildable_struct.piece_vox_timer ) ) - self thread buildable_piece_pickedup_vox_cooldown( buildable_struct.piece_vox_id, buildable_struct.piece_vox_timer ); - } - else - self thread do_player_general_vox( "general", "build_pickup" ); + */ + return; + } + bname = buildable.buildable_name; + if ( isDefined( buildable.stat_name ) ) + { + bname = buildable.stat_name; + } + self add_map_buildable_stat( bname, "pieces_built", 1 ); + if ( !buildable buildable_all_built() ) + { + if ( isDefined( level.zombie_include_buildables[ buildable.buildable_name ] ) && isDefined( level.zombie_include_buildables[ buildable.buildable_name ].snd_build_add_vo_override ) ) + { + self thread [[ level.zombie_include_buildables[ buildable.buildable_name ].snd_build_add_vo_override ]](); + return; + } + else + { + self thread do_player_general_vox( "general", "build_add" ); + } + } } -buildable_piece_pickedup_vox_cooldown( piece_vox_id, timer ) +track_buildables_built( buildable ) //checked matches cerberus output { - self endon( "disconnect" ); - - if ( !isdefined( self.a_buildable_piece_pickedup_vox_cooldown ) ) - self.a_buildable_piece_pickedup_vox_cooldown = []; - - self.a_buildable_piece_pickedup_vox_cooldown[self.a_buildable_piece_pickedup_vox_cooldown.size] = piece_vox_id; - wait( timer ); - arrayremovevalue( self.a_buildable_piece_pickedup_vox_cooldown, piece_vox_id ); -} - -track_buildable_pieces_built( buildable ) -{ - if ( !isdefined( buildable ) || !isdefined( buildable.buildable_name ) ) - { + if ( !isDefined( buildable ) || !isDefined( buildable.buildable_name ) ) + { + /* /# - println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildable_pieces_built() \n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildables_built() \n" ); #/ - return; - } - - bname = buildable.buildable_name; - - if ( isdefined( buildable.stat_name ) ) - bname = buildable.stat_name; - - self add_map_buildable_stat( bname, "pieces_built", 1 ); - - if ( !buildable buildable_all_built() ) - { - if ( isdefined( level.zombie_include_buildables[buildable.buildable_name] ) && isdefined( level.zombie_include_buildables[buildable.buildable_name].snd_build_add_vo_override ) ) - self thread [[ level.zombie_include_buildables[buildable.buildable_name].snd_build_add_vo_override ]](); - else - self thread do_player_general_vox( "general", "build_add" ); - } + */ + return; + } + bname = buildable.buildable_name; + if ( isDefined( buildable.stat_name ) ) + { + bname = buildable.stat_name; + } + self add_map_buildable_stat( bname, "buildable_built", 1 ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "buildables_built", 0 ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "buildables_built" ); + if ( isDefined( buildable.stub.buildablestruct.vox_id ) ) + { + self thread do_player_general_vox( "general", "build_" + buildable.stub.buildablestruct.vox_id + "_final" ); + } } -track_buildables_built( buildable ) +track_buildables_pickedup( buildable ) //checked matches cerberus output { - if ( !isdefined( buildable ) || !isdefined( buildable.buildable_name ) ) - { + if ( !isDefined( buildable ) ) + { + /* /# - println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildables_built() \n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildables_pickedup() \n" ); #/ - return; - } - - bname = buildable.buildable_name; - - if ( isdefined( buildable.stat_name ) ) - bname = buildable.stat_name; - - self add_map_buildable_stat( bname, "buildable_built", 1 ); - self maps\mp\zombies\_zm_stats::increment_client_stat( "buildables_built", 0 ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "buildables_built" ); - - if ( isdefined( buildable.stub.buildablestruct.vox_id ) ) - self thread do_player_general_vox( "general", "build_" + buildable.stub.buildablestruct.vox_id + "_final" ); -} - -track_buildables_pickedup( buildable ) -{ - if ( !isdefined( buildable ) ) - { + */ + return; + } + stat_name = get_buildable_stat_name( buildable ); + if ( !isDefined( stat_name ) ) + { + /* /# - println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildables_pickedup() \n" ); + println( "STAT TRACKING FAILURE: NO STAT NAME FOR " + buildable + "\n" ); #/ - return; - } + */ + return; + } + self add_map_buildable_stat( stat_name, "buildable_pickedup", 1 ); + self say_pickup_buildable_vo( buildable, 0 ); +} - stat_name = get_buildable_stat_name( buildable ); - - if ( !isdefined( stat_name ) ) - { +track_buildables_planted( equipment ) //checked matches cerberus output +{ + if ( !isDefined( equipment ) ) + { + /* /# - println( "STAT TRACKING FAILURE: NO STAT NAME FOR " + buildable + "\n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED for track_buildables_planted() \n" ); #/ - return; - } - - self add_map_buildable_stat( stat_name, "buildable_pickedup", 1 ); - self say_pickup_buildable_vo( buildable, 0 ); -} - -track_buildables_planted( equipment ) -{ - if ( !isdefined( equipment ) ) - { + */ + return; + } + buildable_name = undefined; + if ( isDefined( equipment.name ) ) + { + buildable_name = get_buildable_stat_name( equipment.name ); + } + if ( !isDefined( buildable_name ) ) + { + /* /# - println( "STAT TRACKING FAILURE: NOT DEFINED for track_buildables_planted() \n" ); + println( "STAT TRACKING FAILURE: NO BUILDABLE NAME FOR track_buildables_planted() " + equipment.name + "\n" ); #/ - return; - } - - buildable_name = undefined; - - if ( isdefined( equipment.name ) ) - buildable_name = get_buildable_stat_name( equipment.name ); - - if ( !isdefined( buildable_name ) ) - { -/# - println( "STAT TRACKING FAILURE: NO BUILDABLE NAME FOR track_buildables_planted() " + equipment.name + "\n" ); -#/ - return; - } - - maps\mp\_demo::bookmark( "zm_player_buildable_placed", gettime(), self ); - self add_map_buildable_stat( buildable_name, "buildable_placed", 1 ); - vo_name = "build_plc_" + buildable_name; - - if ( buildable_name == "electric_trap" ) - vo_name = "build_plc_trap"; - - if ( !( isdefined( self.buildable_timer ) && self.buildable_timer ) ) - { - self thread do_player_general_vox( "general", vo_name ); - self thread placed_buildable_vo_timer(); - } + */ + return; + } + maps/mp/_demo::bookmark( "zm_player_buildable_placed", getTime(), self ); + self add_map_buildable_stat( buildable_name, "buildable_placed", 1 ); + vo_name = "build_plc_" + buildable_name; + if ( buildable_name == "electric_trap" ) + { + vo_name = "build_plc_trap"; + } + if ( !is_true( self.buildable_timer ) ) + { + self thread do_player_general_vox( "general", vo_name ); + self thread placed_buildable_vo_timer(); + } } -placed_buildable_vo_timer() +placed_buildable_vo_timer() //checked matches cerberus output { - self endon( "disconnect" ); - self.buildable_timer = 1; - wait 60; - self.buildable_timer = 0; + self endon( "disconnect" ); + self.buildable_timer = 1; + wait 60; + self.buildable_timer = 0; } -buildable_pickedup_timer() +buildable_pickedup_timer() //checked matches cerberus output { - self endon( "disconnect" ); - self.buildable_pickedup_timer = 1; - wait 60; - self.buildable_pickedup_timer = 0; + self endon( "disconnect" ); + self.buildable_pickedup_timer = 1; + wait 60; + self.buildable_pickedup_timer = 0; } -track_planted_buildables_pickedup( equipment ) +track_planted_buildables_pickedup( equipment ) //checked changed to match cerberus output { - if ( !isdefined( equipment ) ) - return; - - if ( equipment == "equip_turbine_zm" || equipment == "equip_turret_zm" || equipment == "equip_electrictrap_zm" || equipment == "riotshield_zm" ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "planted_buildables_pickedup", 0 ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "planted_buildables_pickedup" ); - } - - if ( !( isdefined( self.buildable_pickedup_timer ) && self.buildable_pickedup_timer ) ) - { - self say_pickup_buildable_vo( equipment, 1 ); - self thread buildable_pickedup_timer(); - } + if ( !isDefined( equipment ) ) + { + return; + } + if ( equipment == "equip_turbine_zm" || equipment == "equip_turret_zm" || equipment == "equip_electrictrap_zm" || equipment == "riotshield_zm" ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "planted_buildables_pickedup", 0 ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "planted_buildables_pickedup" ); + } + if ( !is_true( self.buildable_pickedup_timer ) ) + { + self say_pickup_buildable_vo( equipment, 1 ); + self thread buildable_pickedup_timer(); + } } -track_placed_buildables( buildable_name ) +track_placed_buildables( buildable_name ) //checked matches cerberus output { - if ( !isdefined( buildable_name ) ) - return; - - self add_map_buildable_stat( buildable_name, "buildable_placed", 1 ); - vo_name = undefined; - - if ( buildable_name == level.riotshield_name ) - vo_name = "build_plc_shield"; - - if ( !isdefined( vo_name ) ) - return; - - self thread do_player_general_vox( "general", vo_name ); + if ( !isDefined( buildable_name ) ) + { + return; + } + self add_map_buildable_stat( buildable_name, "buildable_placed", 1 ); + vo_name = undefined; + if ( buildable_name == level.riotshield_name ) + { + vo_name = "build_plc_shield"; + } + if ( !isDefined( vo_name ) ) + { + return; + } + self thread do_player_general_vox( "general", vo_name ); } -add_map_buildable_stat( piece_name, stat_name, value ) +add_map_buildable_stat( piece_name, stat_name, value ) //checked changed to match cerberus output { - if ( !isdefined( piece_name ) || piece_name == "sq_common" || piece_name == "keys_zm" || piece_name == "oillamp_zm" ) - return; - - if ( isdefined( level.zm_disable_recording_stats ) && level.zm_disable_recording_stats || isdefined( level.zm_disable_recording_buildable_stats ) && level.zm_disable_recording_buildable_stats ) - return; - - self adddstat( "buildables", piece_name, stat_name, value ); + if ( isDefined( piece_name ) || piece_name == "sq_common" || piece_name == "keys_zm" || piece_name == "oillamp_zm" ) + { + return; + } + if ( is_true( level.zm_disable_recording_stats ) || is_true( level.zm_disable_recording_buildable_stats ) ) + { + return; + } + self adddstat( "buildables", piece_name, stat_name, value ); } -say_pickup_buildable_vo( buildable_name, world ) +say_pickup_buildable_vo( buildable_name, world ) //checked matches cerberus output { - if ( isdefined( self.buildable_pickedup_timer ) && self.buildable_pickedup_timer ) - return; - - name = get_buildable_vo_name( buildable_name ); - - if ( !isdefined( name ) ) - return; - - vo_name = "build_pck_b" + name; - - if ( isdefined( world ) && world ) - vo_name = "build_pck_w" + name; - - if ( !isdefined( level.transit_buildable_vo_override ) || !self [[ level.transit_buildable_vo_override ]]( name, world ) ) - { - self thread do_player_general_vox( "general", vo_name ); - self thread buildable_pickedup_timer(); - } + if ( is_true( self.buildable_pickedup_timer ) ) + { + return; + } + name = get_buildable_vo_name( buildable_name ); + if ( !isDefined( name ) ) + { + return; + } + vo_name = "build_pck_b" + name; + if ( is_true( world ) ) + { + vo_name = "build_pck_w" + name; + } + if ( !isDefined( level.transit_buildable_vo_override ) || !( self [[ level.transit_buildable_vo_override ]]( name, world ) ) ) + { + self thread do_player_general_vox( "general", vo_name ); + self thread buildable_pickedup_timer(); + } } -get_buildable_vo_name( buildable_name ) +get_buildable_vo_name( buildable_name ) //checked matches cerberus output { - switch ( buildable_name ) - { - case "equip_turbine_zm": - return "turbine"; - case "equip_turret_zm": - return "turret"; - case "equip_electrictrap_zm": - return "trap"; - case "riotshield_zm": - return "shield"; - case "jetgun_zm": - return "jetgun"; - case "equip_springpad_zm": - return "springpad_zm"; - case "equip_slipgun_zm": - return "slipgun_zm"; - case "equip_headchopper_zm": - return "headchopper_zm"; - case "equip_subwoofer_zm": - return "subwoofer_zm"; - } - - return undefined; + switch( buildable_name ) + { + case "equip_turbine_zm": + return "turbine"; + case "equip_turret_zm": + return "turret"; + case "equip_electrictrap_zm": + return "trap"; + case "riotshield_zm": + return "shield"; + case "jetgun_zm": + return "jetgun"; + case "equip_springpad_zm": + return "springpad_zm"; + case "equip_slipgun_zm": + return "slipgun_zm"; + case "equip_headchopper_zm": + return "headchopper_zm"; + case "equip_subwoofer_zm": + return "subwoofer_zm"; + } + return undefined; } -get_buildable_stat_name( buildable ) +get_buildable_stat_name( buildable ) //checked matches cerberus output { - if ( isdefined( buildable ) ) - { - switch ( buildable ) - { - case "equip_turbine_zm": - return "turbine"; - case "equip_turret_zm": - return "turret"; - case "equip_electrictrap_zm": - return "electric_trap"; - case "equip_springpad_zm": - return "springpad_zm"; - case "equip_slipgun_zm": - return "slipgun_zm"; - case "equip_headchopper_zm": - return "headchopper_zm"; - case "equip_subwoofer_zm": - return "subwoofer_zm"; - } - - return undefined; - } + if ( isDefined( buildable ) ) + { + switch( buildable ) + { + case "equip_turbine_zm": + return "turbine"; + case "equip_turret_zm": + return "turret"; + case "equip_electrictrap_zm": + return "electric_trap"; + case "equip_springpad_zm": + return "springpad_zm"; + case "equip_slipgun_zm": + return "slipgun_zm"; + case "equip_headchopper_zm": + return "headchopper_zm"; + case "equip_subwoofer_zm": + return "subwoofer_zm"; + } + return undefined; + } } + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_chugabud.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_chugabud.gsc index 48d57d9..cb9a6dd 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_chugabud.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_chugabud.gsc @@ -1,792 +1,801 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_chugabud; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\zombies\_zm_clone; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_weap_cymbal_monkey; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm; -#include maps\mp\_visionset_mgr; +#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() +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 ); + 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() +chugabug_precache() //checked matches cerberus output { - } -chugabud_player_init() +chugabud_player_init() //checked matches cerberus output { - } -chugabud_laststand() +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 ( isdefined( self.insta_killed ) && 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 ); + 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 ) +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 ); + if ( isDefined( str_notify ) ) + { + self waittill( str_notify ); + } + self chugabud_give_loadout(); + self chugabud_corpse_cleanup( corpse, 1 ); } -chugabud_bleed_timeout( delay, corpse ) +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", self ); - return; - } - } - } - - self chugabud_corpse_cleanup( corpse, 0 ); + 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 ) +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; + 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 ) +chugabud_handle_multiple_instances( corpse ) //checked matches cerberus output { - corpse endon( "death" ); - - self waittill( "perk_chugabud_activated" ); - - self chugabud_corpse_cleanup( corpse, 0 ); + corpse endon( "death" ); + self waittill( "perk_chugabud_activated" ); + self chugabud_corpse_cleanup( corpse, 0 ); } -chugabud_spawn_corpse() +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; + 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() +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; + 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() +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; - - foreach ( index, weapon in primaries ) - { - 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; - } - - 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" ); + 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 ) + { + 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() +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; + 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() +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 ); - } - - for ( i = 0; i < loadout.weapons.size; i++ ) - { - if ( !isdefined( loadout.weapons[i] ) ) - continue; - - if ( loadout.weapons[i]["name"] == "none" ) - continue; - - self maps\mp\zombies\_zm_weapons::weapondata_give( loadout.weapons[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 ) - { - for ( i = 0; i < loadout.perks.size; i++ ) - { - if ( self hasperk( loadout.perks[i] ) ) - continue; - - if ( loadout.perks[i] == "specialty_quickrevive" && flag( "solo_game" ) ) - level.solo_game_free_player_quickrevive = 1; - - if ( loadout.perks[i] == "specialty_finalstand" ) - continue; - - maps\mp\zombies\_zm_perks::give_perk( loadout.perks[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 ); - } - } + 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 ) + { + 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() +chugabud_restore_grenades() //checked matches cerberus output { - if ( isdefined( self.loadout.hasemp ) && 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 ); - } + 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() +chugabud_restore_claymore() //checked matches cerberus output { - if ( isdefined( self.loadout.hasclaymore ) && 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 ); - } + 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() +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; + 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() +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(); + 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() +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, " " ); - - foreach ( token in tokens ) - { - if ( token == match_string ) - spawnpoints[spawnpoints.size] = struct; - } - } - } - } - - if ( !isdefined( spawnpoints ) || spawnpoints.size == 0 ) - spawnpoints = getstructarray( "initial_spawn_points", "targetname" ); + 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!" ); + assert( isDefined( spawnpoints ), "Could not find initial spawn points!" ); #/ - spawnpoint = maps\mp\zombies\_zm::getfreespawnpoint( spawnpoints, self ); - } - - return spawnpoint; + */ + 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 ) +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; - - for ( i = index; i >= 0; i-- ) - { - n_node = a_nodes[i]; - - if ( ignore_targetted_nodes == 1 ) - { - if ( isdefined( n_node.target ) ) - 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; - } - } - } - } - } - } - - 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 true; - } - - return false; + 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 ) +force_corpse_respawn_position( forced_corpse_position ) //checked matches cerberus output { - level.chugabud_force_corpse_position = forced_corpse_position; + level.chugabud_force_corpse_position = forced_corpse_position; } -force_player_respawn_position( forced_player_position ) +force_player_respawn_position( forced_player_position ) //checked matches cerberus output { - level.chugabud_force_player_position = forced_player_position; + level.chugabud_force_player_position = forced_player_position; } -save_weapons_for_chugabud( player ) +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 ); + 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 ) +save_weapon_for_chugabud( player, weapon_name ) //checked matches cerberus output { - if ( player hasweapon( weapon_name ) ) - self.chugabud_melee_weapons[weapon_name] = 1; + if ( player hasweapon( weapon_name ) ) + { + self.chugabud_melee_weapons[ weapon_name ] = 1; + } } -restore_weapons_for_chugabud( player ) +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; + 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 ) +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 ( isdefined( self.chugabud_melee_weapons[weapon_name] ) && self.chugabud_melee_weapons[weapon_name] ) - { - player giveweapon( weapon_name ); - player set_player_melee_weapon( weapon_name ); - self.chugabud_melee_weapons[weapon_name] = 0; - } + 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 ) +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; + perk_array = ent get_perk_array( 1 ); + foreach ( perk in perk_array ) + { + ent unsetperk( perk ); + } + return perk_array; } -playchugabudtimeraudio() +playchugabudtimeraudio() //checked matches cerberus output { - self endon( "chugabud_grabbed" ); - self endon( "chugabud_timedout" ); - player = self.player; - self thread playchugabudtimerout( player ); - - while ( true ) - { - player playsoundtoplayer( "zmb_chugabud_timer_count", player ); - wait 1; - } + 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 ) +playchugabudtimerout( player ) //checked matches cerberus output { - self endon( "chugabud_grabbed" ); - - self waittill( "chugabud_timedout" ); - - player playsoundtoplayer( "zmb_chugabud_timer_out", player ); + self endon( "chugabud_grabbed" ); + self waittill( "chugabud_timedout" ); + player playsoundtoplayer( "zmb_chugabud_timer_out", player ); } -chugabud_hostmigration() +chugabud_hostmigration() //checked changed to match cerberus output { - level endon( "end_game" ); - level notify( "chugabud_hostmigration" ); - level endon( "chugabud_hostmigration" ); - - while ( true ) - { - level waittill( "host_migration_end" ); - - chugabuds = getentarray( "player_chugabud_model", "script_noteworthy" ); - - foreach ( model in chugabuds ) - playfxontag( level._effect["powerup_on"], model, "tag_origin" ); - } + 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() +player_revived_cleanup_chugabud_corpse() //checked matches cerberus output { - } -player_has_chugabud_corpse() +player_has_chugabud_corpse() //checked matches cerberus output { - if ( isdefined( self.e_chugabud_corpse ) ) - return true; - - return false; + if ( isDefined( self.e_chugabud_corpse ) ) + { + return 1; + } + return 0; } -is_weapon_available_in_chugabud_corpse( weapon, player_to_check ) +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 ) ) - { - for ( player_index = 0; player_index < players.size; player_index++ ) - { - player = players[player_index]; - - if ( isdefined( player_to_check ) && player != player_to_check ) - 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++; - } - } - } - } - } - - return count; + 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 ) +chugabud_corpse_cleanup_on_spectator( player ) //checked changed to match cerberus output { - self endon( "death" ); - player endon( "disconnect" ); - - while ( true ) - { - if ( player.sessionstate == "spectator" ) - break; - - wait 0.01; - } - - player chugabud_corpse_cleanup( self, 0 ); + 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 ) +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 ( true ) - { - 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; - } + 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() +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(); - } - } + 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() +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; - } + 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; + } } + + + + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_clone.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_clone.gsc index 8dbb479..6a4806a 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_clone.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_clone.gsc @@ -1,137 +1,143 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +//#using_animtree( "zm_ally" ); //cannot use this in gsc + +init() //checked matches cerberus output { - init_mover_tree(); + init_mover_tree(); } -spawn_player_clone( player, origin, forceweapon, forcemodel ) +spawn_player_clone( player, origin, forceweapon, forcemodel ) //checked matches cerberus output { - if ( !isdefined( origin ) ) - origin = player.origin; - - primaryweapons = player getweaponslistprimaries(); - - if ( isdefined( forceweapon ) ) - weapon = forceweapon; - else if ( primaryweapons.size ) - weapon = primaryweapons[0]; - else - weapon = player getcurrentweapon(); - - weaponmodel = getweaponmodel( weapon ); - spawner = getent( "fake_player_spawner", "targetname" ); - - if ( isdefined( spawner ) ) - { - clone = spawner spawnactor(); - clone.origin = origin; - clone.isactor = 1; - } - else - { - clone = spawn( "script_model", origin ); - clone.isactor = 0; - } - - if ( isdefined( forcemodel ) ) - clone setmodel( forcemodel ); - else - { - clone setmodel( self.model ); - - if ( isdefined( player.headmodel ) ) - { - clone.headmodel = player.headmodel; - clone attach( clone.headmodel, "", 1 ); - } - } - - if ( weaponmodel != "" && weaponmodel != "none" ) - clone attach( weaponmodel, "tag_weapon_right" ); - - clone.team = player.team; - clone.is_inert = 1; - clone.zombie_move_speed = "walk"; - clone.script_noteworthy = "corpse_clone"; - clone.actor_damage_func = ::clone_damage_func; - return clone; + if ( !isDefined( origin ) ) + { + origin = player.origin; + } + primaryweapons = player getweaponslistprimaries(); + if ( isDefined( forceweapon ) ) + { + weapon = forceweapon; + } + else if ( primaryweapons.size ) + { + weapon = primaryweapons[ 0 ]; + } + else + { + weapon = player getcurrentweapon(); + } + weaponmodel = getweaponmodel( weapon ); + spawner = getent( "fake_player_spawner", "targetname" ); + if ( isDefined( spawner ) ) + { + clone = spawner spawnactor(); + clone.origin = origin; + clone.isactor = 1; + } + else + { + clone = spawn( "script_model", origin ); + clone.isactor = 0; + } + if ( isDefined( forcemodel ) ) + { + clone setmodel( forcemodel ); + } + else + { + clone setmodel( self.model ); + if ( isDefined( player.headmodel ) ) + { + clone.headmodel = player.headmodel; + clone attach( clone.headmodel, "", 1 ); + } + } + if ( weaponmodel != "" && weaponmodel != "none" ) + { + clone attach( weaponmodel, "tag_weapon_right" ); + } + clone.team = player.team; + clone.is_inert = 1; + clone.zombie_move_speed = "walk"; + clone.script_noteworthy = "corpse_clone"; + clone.actor_damage_func = ::clone_damage_func; + return clone; } -clone_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) +clone_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked changed to match cerberus output { - idamage = 0; - - if ( sweapon == "knife_ballistic_upgraded_zm" || sweapon == "knife_ballistic_bowie_upgraded_zm" || sweapon == "knife_ballistic_no_melee_upgraded_zm" || sweapon == "knife_ballistic_sickle_upgraded_zm" ) - self notify( "player_revived", eattacker ); - - return idamage; + idamage = 0; + if ( sweapon == "knife_ballistic_upgraded_zm" && sweapon == "knife_ballistic_bowie_upgraded_zm" || sweapon == "knife_ballistic_no_melee_upgraded_zm" && sweapon == "knife_ballistic_sickle_upgraded_zm" ) + { + self notify( "player_revived" ); + } + return idamage; } -clone_give_weapon( weapon ) +clone_give_weapon( weapon ) //checked matches cerberus output { - weaponmodel = getweaponmodel( weapon ); - - if ( weaponmodel != "" && weaponmodel != "none" ) - self attach( weaponmodel, "tag_weapon_right" ); + weaponmodel = getweaponmodel( weapon ); + if ( weaponmodel != "" && weaponmodel != "none" ) + { + self attach( weaponmodel, "tag_weapon_right" ); + } } -clone_animate( animtype ) +clone_animate( animtype ) //checked matches cerberus output { - if ( self.isactor ) - self thread clone_actor_animate( animtype ); - else - self thread clone_mover_animate( animtype ); + if ( self.isactor ) + { + self thread clone_actor_animate( animtype ); + } + else + { + self thread clone_mover_animate( animtype ); + } } -clone_actor_animate( animtype ) +clone_actor_animate( animtype ) //checked matches cerberus output { - wait 0.1; - - switch ( animtype ) - { - case "laststand": - self setanimstatefromasd( "laststand" ); - break; - case "idle": - default: - self setanimstatefromasd( "idle" ); - break; - } + wait 0.1; + switch( animtype ) + { + case "laststand": + self setanimstatefromasd( "laststand" ); + break; + case "idle": + default: + self setanimstatefromasd( "idle" ); + break; + } } -init_mover_tree() +init_mover_tree() //checked matches cerberus output { - scriptmodelsuseanimtree( -1 ); + scriptmodelsuseanimtree( -1 ); } -#using_animtree("zm_ally"); - -clone_mover_animate( animtype ) +clone_mover_animate( animtype ) //checked matches cerberus output { - self useanimtree( -1 ); - - switch ( animtype ) - { - case "laststand": - self setanim( %pb_laststand_idle ); - break; - case "afterlife": - self setanim( %pb_afterlife_laststand_idle ); - break; - case "chair": - self setanim( %ai_actor_elec_chair_idle ); - break; - case "falling": - self setanim( %pb_falling_loop ); - break; - case "idle": - default: - self setanim( %pb_stand_alert ); - break; - } + self useanimtree( -1 ); + switch( animtype ) + { + case "laststand": + self setanim( %pb_laststand_idle ); + break; + case "afterlife": + self setanim( %pb_afterlife_laststand_idle ); + break; + case "chair": + self setanim( %ai_actor_elec_chair_idle ); + break; + case "falling": + self setanim( %pb_falling_loop ); + break; + case "idle": + default: + self setanim( %pb_stand_alert ); + break; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_devgui.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_devgui.gsc index fc25a54..1aa2351 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_devgui.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_devgui.gsc @@ -1,2259 +1,2344 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_ai_basic; -#include maps\mp\zombies\_zm; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_turned; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm_buildables; -#include maps\mp\zombies\_zm_weap_claymore; -#include maps\mp\zombies\_zm_powerups; -#include maps\mp\zombies\_zm_laststand; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_weap_claymore; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_turned; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_ai_basic; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; init() { /# - setdvar( "zombie_devgui", "" ); - setdvar( "scr_force_weapon", "" ); - setdvar( "scr_zombie_round", "1" ); - setdvar( "scr_zombie_dogs", "1" ); - setdvar( "scr_spawn_tesla", "" ); - setdvar( "scr_force_quantum_bomb_result", "" ); - level.devgui_add_weapon = ::devgui_add_weapon; - level.devgui_add_ability = ::devgui_add_ability; - level thread zombie_devgui_think(); - thread zombie_devgui_player_commands(); - thread diable_fog_in_noclip(); - thread zombie_weapon_devgui_think(); - thread devgui_zombie_healthbar(); + setdvar( "zombie_devgui", "" ); + setdvar( "scr_force_weapon", "" ); + setdvar( "scr_zombie_round", "1" ); + setdvar( "scr_zombie_dogs", "1" ); + setdvar( "scr_spawn_tesla", "" ); + setdvar( "scr_force_quantum_bomb_result", "" ); + level.devgui_add_weapon = ::devgui_add_weapon; + level.devgui_add_ability = ::devgui_add_ability; + level thread zombie_devgui_think(); + thread zombie_devgui_player_commands(); + thread diable_fog_in_noclip(); + thread zombie_weapon_devgui_think(); + thread devgui_zombie_healthbar(); #/ } zombie_devgui_player_commands() { /# - flag_wait( "start_zombie_round_logic" ); - wait 1; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - ip1 = i + 1; - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Give Money:1\" \"set zombie_devgui player" + ip1 + "_money\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Invulnerable:2\" \"set zombie_devgui player" + ip1 + "_invul_on\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Vulnerable:3\" \"set zombie_devgui player" + ip1 + "_invul_off\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Toggle Ignored:4\" \"set zombie_devgui player" + ip1 + "_ignore\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Mega Health:5\" \"set zombie_devgui player" + ip1 + "_health\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Down:6\" \"set zombie_devgui player" + ip1 + "_kill\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Revive:7\" \"set zombie_devgui player" + ip1 + "_revive\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Turn Player:8\" \"set zombie_devgui player" + ip1 + "_turnplayer\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Debug Pers:9\" \"set zombie_devgui player" + ip1 + "_debug_pers\" \n" ); - adddebugcommand( "devgui_cmd \"Zombies:1/Players:1/Player:1/" + players[i].name + "/Take Money:10\" \"set zombie_devgui player" + ip1 + "_moneydown\" \n" ); - } + flag_wait( "start_zombie_round_logic" ); + wait 1; + players = get_players(); + i = 0; + while ( i < players.size ) + { + ip1 = i + 1; + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Give Money:1" "set zombie_devgui player" + ip1 + "_money" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Invulnerable:2" "set zombie_devgui player" + ip1 + "_invul_on" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Vulnerable:3" "set zombie_devgui player" + ip1 + "_invul_off" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Toggle Ignored:4" "set zombie_devgui player" + ip1 + "_ignore" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Mega Health:5" "set zombie_devgui player" + ip1 + "_health" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Down:6" "set zombie_devgui player" + ip1 + "_kill" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Revive:7" "set zombie_devgui player" + ip1 + "_revive" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Turn Player:8" "set zombie_devgui player" + ip1 + "_turnplayer" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Debug Pers:9" "set zombie_devgui player" + ip1 + "_debug_pers" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Players:1/Player:1/" + players[ i ].name + "/Take Money:10" "set zombie_devgui player" + ip1 + "_moneydown" \n" ); + i++; #/ + } } devgui_add_weapon_entry( hint, up, weapon_name, root ) { /# - rootslash = ""; - - if ( isdefined( root ) && root.size ) - rootslash = root + "/"; - - uppath = "/" + up; - - if ( up.size < 1 ) - uppath = ""; - - cmd = "devgui_cmd \"Zombies:1/Weapons:10/" + rootslash + hint + uppath + "\" \"set zombie_devgui_gun " + weapon_name + "\" \n"; - adddebugcommand( cmd ); + rootslash = ""; + if ( isDefined( root ) && root.size ) + { + rootslash = root + "/"; + } + uppath = "/" + up; + if ( up.size < 1 ) + { + uppath = ""; + } + cmd = "devgui_cmd "Zombies:1/Weapons:10/" + rootslash + hint + uppath + "" "set zombie_devgui_gun " + weapon_name + "" \n"; + adddebugcommand( cmd ); #/ } devgui_add_weapon_and_attachments( hint, up, weapon_name, root ) { /# - devgui_add_weapon_entry( hint, up, weapon_name, root ); + devgui_add_weapon_entry( hint, up, weapon_name, root ); #/ } devgui_add_weapon( weapon_name, upgrade_name, hint, cost, weaponvo, weaponvoresp, ammo_cost ) { /# - if ( is_offhand_weapon( weapon_name ) && !is_melee_weapon( weapon_name ) ) - return; - - if ( !isdefined( level.devgui_weapons_added ) ) - level.devgui_weapons_added = 0; - - level.devgui_weapons_added++; - - if ( is_melee_weapon( weapon_name ) ) - devgui_add_weapon_and_attachments( weapon_name, "", weapon_name, "Melee:8" ); - else - devgui_add_weapon_and_attachments( weapon_name, "", weapon_name, "" ); + if ( is_offhand_weapon( weapon_name ) && !is_melee_weapon( weapon_name ) ) + { + return; + } + if ( !isDefined( level.devgui_weapons_added ) ) + { + level.devgui_weapons_added = 0; + } + level.devgui_weapons_added++; + if ( is_melee_weapon( weapon_name ) ) + { + devgui_add_weapon_and_attachments( weapon_name, "", weapon_name, "Melee:8" ); + } + else + { + devgui_add_weapon_and_attachments( weapon_name, "", weapon_name, "" ); #/ + } } zombie_weapon_devgui_think() { /# - level.zombie_devgui_gun = getdvar( _hash_CE4F9F97 ); - level.zombie_devgui_att = getdvar( _hash_A965F402 ); - - for (;;) - { - wait 0.25; - cmd = getdvar( _hash_CE4F9F97 ); - - if ( !isdefined( level.zombie_devgui_gun ) || level.zombie_devgui_gun != cmd ) - { - level.zombie_devgui_gun = cmd; - array_thread( get_players(), ::zombie_devgui_weapon_give, level.zombie_devgui_gun ); - } - - wait 0.25; - att = getdvar( _hash_A965F402 ); - - if ( !isdefined( level.zombie_devgui_att ) || level.zombie_devgui_att != att ) - { - level.zombie_devgui_att = att; - array_thread( get_players(), ::zombie_devgui_attachment_give, level.zombie_devgui_att ); - } - } + level.zombie_devgui_gun = getDvar( #"CE4F9F97" ); + level.zombie_devgui_att = getDvar( #"A965F402" ); + for ( ;; ) + { + wait 0,25; + cmd = getDvar( #"CE4F9F97" ); + if ( !isDefined( level.zombie_devgui_gun ) || level.zombie_devgui_gun != cmd ) + { + level.zombie_devgui_gun = cmd; + array_thread( get_players(), ::zombie_devgui_weapon_give, level.zombie_devgui_gun ); + } + wait 0,25; + att = getDvar( #"A965F402" ); + if ( !isDefined( level.zombie_devgui_att ) || level.zombie_devgui_att != att ) + { + level.zombie_devgui_att = att; + array_thread( get_players(), ::zombie_devgui_attachment_give, level.zombie_devgui_att ); + } #/ + } } zombie_devgui_weapon_give( gun ) { /# - self maps\mp\zombies\_zm_weapons::weapon_give( gun, is_weapon_upgraded( gun ), 0 ); + self maps/mp/zombies/_zm_weapons::weapon_give( gun, is_weapon_upgraded( gun ), 0 ); #/ } zombie_devgui_attachment_give( gun ) { /# - newgun = maps\mp\zombies\_zm_weapons::get_base_name( self getcurrentweapon() ) + "+" + gun; - self maps\mp\zombies\_zm_weapons::weapon_give( newgun, is_weapon_upgraded( gun ), 0 ); + newgun = maps/mp/zombies/_zm_weapons::get_base_name( self getcurrentweapon() ) + "+" + gun; + self maps/mp/zombies/_zm_weapons::weapon_give( newgun, is_weapon_upgraded( gun ), 0 ); #/ } devgui_add_ability( name, upgrade_active_func, stat_name, stat_desired_value, game_end_reset_if_not_achieved ) { /# - online_game = sessionmodeisonlinegame(); - - if ( !online_game ) - return; - - if ( !is_true( level.devgui_watch_abilities ) ) - { - cmd = "devgui_cmd \"Zombies:1/Players:1/Abilities:3/Disable All:1\" \"set zombie_devgui_give_ability _disable\" \n"; - adddebugcommand( cmd ); - cmd = "devgui_cmd \"Zombies:1/Players:1/Abilities:3/Enable All:2\" \"set zombie_devgui_give_ability _enable\" \n"; - adddebugcommand( cmd ); - level thread zombie_ability_devgui_think(); - level.devgui_watch_abilities = 1; - } - - cmd = "devgui_cmd \"Zombies:1/Players:1/Abilities:3/" + name + "\" \"set zombie_devgui_give_ability " + name + "\" \n"; - adddebugcommand( cmd ); - cmd = "devgui_cmd \"Zombies:1/Players:1/Abilities:3/Take:3/" + name + "\" \"set zombie_devgui_take_ability " + name + "\" \n"; - adddebugcommand( cmd ); + online_game = sessionmodeisonlinegame(); + if ( !online_game ) + { + return; + } + if ( !is_true( level.devgui_watch_abilities ) ) + { + cmd = "devgui_cmd "Zombies:1/Players:1/Abilities:3/Disable All:1" "set zombie_devgui_give_ability _disable" \n"; + adddebugcommand( cmd ); + cmd = "devgui_cmd "Zombies:1/Players:1/Abilities:3/Enable All:2" "set zombie_devgui_give_ability _enable" \n"; + adddebugcommand( cmd ); + level thread zombie_ability_devgui_think(); + level.devgui_watch_abilities = 1; + } + cmd = "devgui_cmd "Zombies:1/Players:1/Abilities:3/" + name + "" "set zombie_devgui_give_ability " + name + "" \n"; + adddebugcommand( cmd ); + cmd = "devgui_cmd "Zombies:1/Players:1/Abilities:3/Take:3/" + name + "" "set zombie_devgui_take_ability " + name + "" \n"; + adddebugcommand( cmd ); #/ } zombie_devgui_ability_give( name ) { /# - pers_upgrade = level.pers_upgrades[name]; - - if ( isdefined( pers_upgrade ) ) - { - for ( i = 0; i < pers_upgrade.stat_names.size; i++ ) - { - stat_name = pers_upgrade.stat_names[i]; - stat_value = pers_upgrade.stat_desired_values[i]; - self maps\mp\zombies\_zm_stats::set_global_stat( stat_name, stat_value ); - self.pers_upgrade_force_test = 1; - } - } + pers_upgrade = level.pers_upgrades[ name ]; + while ( isDefined( pers_upgrade ) ) + { + i = 0; + while ( i < pers_upgrade.stat_names.size ) + { + stat_name = pers_upgrade.stat_names[ i ]; + stat_value = pers_upgrade.stat_desired_values[ i ]; + self maps/mp/zombies/_zm_stats::set_global_stat( stat_name, stat_value ); + self.pers_upgrade_force_test = 1; + i++; #/ + } + } } zombie_devgui_ability_take( name ) { /# - pers_upgrade = level.pers_upgrades[name]; - - if ( isdefined( pers_upgrade ) ) - { - for ( i = 0; i < pers_upgrade.stat_names.size; i++ ) - { - stat_name = pers_upgrade.stat_names[i]; - stat_value = 0; - self maps\mp\zombies\_zm_stats::set_global_stat( stat_name, stat_value ); - self.pers_upgrade_force_test = 1; - } - } + pers_upgrade = level.pers_upgrades[ name ]; + while ( isDefined( pers_upgrade ) ) + { + i = 0; + while ( i < pers_upgrade.stat_names.size ) + { + stat_name = pers_upgrade.stat_names[ i ]; + stat_value = 0; + self maps/mp/zombies/_zm_stats::set_global_stat( stat_name, stat_value ); + self.pers_upgrade_force_test = 1; + i++; #/ + } + } } zombie_ability_devgui_think() { /# - level.zombie_devgui_give_ability = getdvar( _hash_E2245F05 ); - level.zombie_devgui_take_ability = getdvar( _hash_726367F ); - - for (;;) - { - wait 0.25; - cmd = getdvar( _hash_E2245F05 ); - - if ( !isdefined( level.zombie_devgui_give_ability ) || level.zombie_devgui_give_ability != cmd ) - { - if ( cmd == "_disable" ) - flag_set( "sq_minigame_active" ); - else if ( cmd == "_enable" ) - flag_clear( "sq_minigame_active" ); - else - { - level.zombie_devgui_give_ability = cmd; - array_thread( get_players(), ::zombie_devgui_ability_give, level.zombie_devgui_give_ability ); - } - } - - wait 0.25; - cmd = getdvar( _hash_726367F ); - - if ( !isdefined( level.zombie_devgui_take_ability ) || level.zombie_devgui_take_ability != cmd ) - { - level.zombie_devgui_take_ability = cmd; - array_thread( get_players(), ::zombie_devgui_ability_take, level.zombie_devgui_take_ability ); - } - } + level.zombie_devgui_give_ability = getDvar( #"E2245F05" ); + level.zombie_devgui_take_ability = getDvar( #"0726367F" ); + for ( ;; ) + { + wait 0,25; + cmd = getDvar( #"E2245F05" ); + if ( !isDefined( level.zombie_devgui_give_ability ) || level.zombie_devgui_give_ability != cmd ) + { + if ( cmd == "_disable" ) + { + flag_set( "sq_minigame_active" ); + break; + } + else if ( cmd == "_enable" ) + { + flag_clear( "sq_minigame_active" ); + break; + } + else + { + level.zombie_devgui_give_ability = cmd; + array_thread( get_players(), ::zombie_devgui_ability_give, level.zombie_devgui_give_ability ); + } + } + wait 0,25; + cmd = getDvar( #"0726367F" ); + if ( !isDefined( level.zombie_devgui_take_ability ) || level.zombie_devgui_take_ability != cmd ) + { + level.zombie_devgui_take_ability = cmd; + array_thread( get_players(), ::zombie_devgui_ability_take, level.zombie_devgui_take_ability ); + } #/ + } } zombie_healthbar( pos, dsquared ) { /# - if ( distancesquared( pos, self.origin ) > dsquared ) - return; - - rate = 1; - - if ( isdefined( self.maxhealth ) ) - rate = self.health / self.maxhealth; - - color = ( 1 - rate, rate, 0 ); - text = "" + int( self.health ); - print3d( self.origin + ( 0, 0, 0 ), text, color, 1, 0.5, 1 ); + if ( distancesquared( pos, self.origin ) > dsquared ) + { + return; + } + rate = 1; + if ( isDefined( self.maxhealth ) ) + { + rate = self.health / self.maxhealth; + } + color = ( 1 - rate, rate, 0 ); + text = "" + int( self.health ); + print3d( self.origin + ( 0, 1, 0 ), text, color, 1, 0,5, 1 ); #/ } devgui_zombie_healthbar() { /# - while ( true ) - { - if ( getdvarint( _hash_5B45DCAF ) == 1 ) - { - lp = get_players()[0]; - zombies = getaispeciesarray( "all", "all" ); - - if ( isdefined( zombies ) ) - { - foreach ( zombie in zombies ) - zombie zombie_healthbar( lp.origin, 360000 ); - } - } - - wait 0.05; - } + while ( 1 ) + { + while ( getDvarInt( #"5B45DCAF" ) == 1 ) + { + lp = get_players()[ 0 ]; + zombies = getaispeciesarray( "all", "all" ); + while ( isDefined( zombies ) ) + { + _a260 = zombies; + _k260 = getFirstArrayKey( _a260 ); + while ( isDefined( _k260 ) ) + { + zombie = _a260[ _k260 ]; + zombie zombie_healthbar( lp.origin, 360000 ); + _k260 = getNextArrayKey( _a260, _k260 ); + } + } + } + wait 0,05; #/ + } } zombie_devgui_watch_input() { /# - flag_wait( "start_zombie_round_logic" ); - wait 1; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] thread watch_debug_input(); + flag_wait( "start_zombie_round_logic" ); + wait 1; + players = get_players(); + i = 0; + while ( i < players.size ) + { + players[ i ] thread watch_debug_input(); + i++; #/ + } } damage_player() { /# - self disableinvulnerability(); - self dodamage( self.health / 2, self.origin ); + self disableinvulnerability(); + self dodamage( self.health / 2, self.origin ); #/ } kill_player() { /# - self disableinvulnerability(); - death_from = ( randomfloatrange( -20, 20 ), randomfloatrange( -20, 20 ), randomfloatrange( -20, 20 ) ); - self dodamage( self.health + 666, self.origin + death_from ); + self disableinvulnerability(); + death_from = ( randomfloatrange( -20, 20 ), randomfloatrange( -20, 20 ), randomfloatrange( -20, 20 ) ); + self dodamage( self.health + 666, self.origin + death_from ); #/ } force_drink() { /# - wait 0.01; - lean = self allowlean( 0 ); - ads = self allowads( 0 ); - sprint = self allowsprint( 0 ); - crouch = self allowcrouch( 1 ); - prone = self allowprone( 0 ); - melee = self allowmelee( 0 ); - self increment_is_drinking(); - orgweapon = self getcurrentweapon(); - self giveweapon( "zombie_builder_zm" ); - self switchtoweapon( "zombie_builder_zm" ); - self.build_time = self.usetime; - self.build_start_time = gettime(); - wait 2; - self maps\mp\zombies\_zm_weapons::switch_back_primary_weapon( orgweapon ); - self takeweapon( "zombie_builder_zm" ); - - if ( is_true( self.is_drinking ) ) - self decrement_is_drinking(); - - self allowlean( lean ); - self allowads( ads ); - self allowsprint( sprint ); - self allowprone( prone ); - self allowcrouch( crouch ); - self allowmelee( melee ); + wait 0,01; + lean = self allowlean( 0 ); + ads = self allowads( 0 ); + sprint = self allowsprint( 0 ); + crouch = self allowcrouch( 1 ); + prone = self allowprone( 0 ); + melee = self allowmelee( 0 ); + self increment_is_drinking(); + orgweapon = self getcurrentweapon(); + self giveweapon( "zombie_builder_zm" ); + self switchtoweapon( "zombie_builder_zm" ); + self.build_time = self.usetime; + self.build_start_time = getTime(); + wait 2; + self maps/mp/zombies/_zm_weapons::switch_back_primary_weapon( orgweapon ); + self takeweapon( "zombie_builder_zm" ); + if ( is_true( self.is_drinking ) ) + { + self decrement_is_drinking(); + } + self allowlean( lean ); + self allowads( ads ); + self allowsprint( sprint ); + self allowprone( prone ); + self allowcrouch( crouch ); + self allowmelee( melee ); #/ } zombie_devgui_dpad_none() { /# - self thread watch_debug_input(); + self thread watch_debug_input(); #/ } zombie_devgui_dpad_death() { /# - self thread watch_debug_input( ::kill_player ); + self thread watch_debug_input( ::kill_player ); #/ } zombie_devgui_dpad_damage() { /# - self thread watch_debug_input( ::damage_player ); + self thread watch_debug_input( ::damage_player ); #/ } zombie_devgui_dpad_changeweapon() { /# - self thread watch_debug_input( ::force_drink ); + self thread watch_debug_input( ::force_drink ); #/ } watch_debug_input( callback ) { /# - self endon( "disconnect" ); - self notify( "watch_debug_input" ); - self endon( "watch_debug_input" ); - level.devgui_dpad_watch = 0; - - if ( isdefined( callback ) ) - { - level.devgui_dpad_watch = 1; - - for (;;) - { - if ( self actionslottwobuttonpressed() ) - { - self thread [[ callback ]](); - - while ( self actionslottwobuttonpressed() ) - wait 0.05; - } - - wait 0.05; - } - } + self endon( "disconnect" ); + self notify( "watch_debug_input" ); + self endon( "watch_debug_input" ); + level.devgui_dpad_watch = 0; + while ( isDefined( callback ) ) + { + level.devgui_dpad_watch = 1; + for ( ;; ) + { + while ( self actionslottwobuttonpressed() ) + { + self thread [[ callback ]](); + while ( self actionslottwobuttonpressed() ) + { + wait 0,05; + } + } + wait 0,05; #/ + } + } } zombie_devgui_think() { /# - for (;;) - { - cmd = getdvar( "zombie_devgui" ); - - switch ( cmd ) - { - case "money": - players = get_players(); - array_thread( players, ::zombie_devgui_give_money ); - break; - case "player1_money": - players = get_players(); - - if ( players.size >= 1 ) - players[0] thread zombie_devgui_give_money(); - - break; - case "player2_money": - players = get_players(); - - if ( players.size >= 2 ) - players[1] thread zombie_devgui_give_money(); - - break; - case "player3_money": - players = get_players(); - - if ( players.size >= 3 ) - players[2] thread zombie_devgui_give_money(); - - break; - case "player4_money": - players = get_players(); - - if ( players.size >= 4 ) - players[3] thread zombie_devgui_give_money(); - - break; - case "moneydown": - players = get_players(); - array_thread( players, ::zombie_devgui_take_money ); - break; - case "player1_moneydown": - players = get_players(); - - if ( players.size >= 1 ) - players[0] thread zombie_devgui_take_money(); - - break; - case "player2_moneydown": - players = get_players(); - - if ( players.size >= 2 ) - players[1] thread zombie_devgui_take_money(); - - break; - case "player3_moneydown": - players = get_players(); - - if ( players.size >= 3 ) - players[2] thread zombie_devgui_take_money(); - - break; - case "player4_moneydown": - players = get_players(); - - if ( players.size >= 4 ) - players[3] thread zombie_devgui_take_money(); - - break; - case "health": - array_thread( get_players(), ::zombie_devgui_give_health ); - break; - case "player1_health": - players = get_players(); - - if ( players.size >= 1 ) - players[0] thread zombie_devgui_give_health(); - - break; - case "player2_health": - players = get_players(); - - if ( players.size >= 2 ) - players[1] thread zombie_devgui_give_health(); - - break; - case "player3_health": - players = get_players(); - - if ( players.size >= 3 ) - players[2] thread zombie_devgui_give_health(); - - break; - case "player4_health": - players = get_players(); - - if ( players.size >= 4 ) - players[3] thread zombie_devgui_give_health(); - - break; - case "ammo": - array_thread( get_players(), ::zombie_devgui_toggle_ammo ); - break; - case "ignore": - array_thread( get_players(), ::zombie_devgui_toggle_ignore ); - break; - case "player1_ignore": - players = get_players(); - - if ( players.size >= 1 ) - players[0] thread zombie_devgui_toggle_ignore(); - - break; - case "player2_ignore": - players = get_players(); - - if ( players.size >= 2 ) - players[1] thread zombie_devgui_toggle_ignore(); - - break; - case "player3_ignore": - players = get_players(); - - if ( players.size >= 3 ) - players[2] thread zombie_devgui_toggle_ignore(); - - break; - case "player4_ignore": - players = get_players(); - - if ( players.size >= 4 ) - players[3] thread zombie_devgui_toggle_ignore(); - - break; - case "invul_on": - zombie_devgui_invulnerable( undefined, 1 ); - break; - case "invul_off": - zombie_devgui_invulnerable( undefined, 0 ); - break; - case "player1_invul_on": - zombie_devgui_invulnerable( 0, 1 ); - break; - case "player1_invul_off": - zombie_devgui_invulnerable( 0, 0 ); - break; - case "player2_invul_on": - zombie_devgui_invulnerable( 1, 1 ); - break; - case "player2_invul_off": - zombie_devgui_invulnerable( 1, 0 ); - break; - case "player3_invul_on": - zombie_devgui_invulnerable( 2, 1 ); - break; - case "player3_invul_off": - zombie_devgui_invulnerable( 2, 0 ); - break; - case "player4_invul_on": - zombie_devgui_invulnerable( 3, 1 ); - break; - case "player4_invul_off": - zombie_devgui_invulnerable( 3, 0 ); - break; - case "revive_all": - array_thread( get_players(), ::zombie_devgui_revive ); - break; - case "player1_revive": - players = get_players(); - - if ( players.size >= 1 ) - players[0] thread zombie_devgui_revive(); - - break; - case "player2_revive": - players = get_players(); - - if ( players.size >= 2 ) - players[1] thread zombie_devgui_revive(); - - break; - case "player3_revive": - players = get_players(); - - if ( players.size >= 3 ) - players[2] thread zombie_devgui_revive(); - - break; - case "player4_revive": - players = get_players(); - - if ( players.size >= 4 ) - players[3] thread zombie_devgui_revive(); - - break; - case "player1_kill": - players = get_players(); - - if ( players.size >= 1 ) - players[0] thread zombie_devgui_kill(); - - break; - case "player2_kill": - players = get_players(); - - if ( players.size >= 2 ) - players[1] thread zombie_devgui_kill(); - - break; - case "player3_kill": - players = get_players(); - - if ( players.size >= 3 ) - players[2] thread zombie_devgui_kill(); - - break; - case "player4_kill": - players = get_players(); - - if ( players.size >= 4 ) - players[3] thread zombie_devgui_kill(); - - break; - case "spawn_friendly_bot": - player = gethostplayer(); - team = player.team; - devgui_bot_spawn( team ); - break; - case "specialty_quickrevive": - level.solo_lives_given = 0; - case "specialty_showonradar": - case "specialty_scavenger": - case "specialty_rof": - case "specialty_nomotionsensor": - case "specialty_longersprint": - case "specialty_grenadepulldeath": - case "specialty_flakjacket": - case "specialty_finalstand": - case "specialty_fastreload": - case "specialty_fastmeleerecovery": - case "specialty_deadshot": - case "specialty_armorvest": - case "specialty_additionalprimaryweapon": - zombie_devgui_give_perk( cmd ); - break; - case "turnplayer": - zombie_devgui_turn_player(); - break; - case "player1_turnplayer": - zombie_devgui_turn_player( 0 ); - break; - case "player2_turnplayer": - zombie_devgui_turn_player( 1 ); - break; - case "player3_turnplayer": - zombie_devgui_turn_player( 2 ); - break; - case "player4_turnplayer": - zombie_devgui_turn_player( 3 ); - break; - case "player1_debug_pers": - zombie_devgui_debug_pers( 0 ); - break; - case "player2_debug_pers": - zombie_devgui_debug_pers( 1 ); - break; - case "player3_debug_pers": - zombie_devgui_debug_pers( 2 ); - break; - case "player4_debug_pers": - zombie_devgui_debug_pers( 3 ); - break; - case "tesla": - case "random_weapon": - case "nuke": - case "minigun": - case "meat_stink": - case "lose_points_team": - case "lose_perk": - case "insta_kill": - case "full_ammo": - case "free_perk": - case "fire_sale": - case "empty_clip": - case "double_points": - case "carpenter": - case "bonus_points_team": - case "bonus_points_player": - case "bonfire_sale": - zombie_devgui_give_powerup( cmd, 1 ); - break; - case "next_tesla": - case "next_random_weapon": - case "next_nuke": - case "next_minigun": - case "next_meat_stink": - case "next_lose_points_team": - case "next_lose_perk": - case "next_insta_kill": - case "next_full_ammo": - case "next_free_perk": - case "next_fire_sale": - case "next_empty_clip": - case "next_double_points": - case "next_carpenter": - case "next_bonus_points_team": - case "next_bonus_points_player": - case "next_bonfire_sale": - zombie_devgui_give_powerup( getsubstr( cmd, 5 ), 0 ); - break; - case "round": - zombie_devgui_goto_round( getdvarint( _hash_D81B6E19 ) ); - break; - case "round_next": - zombie_devgui_goto_round( level.round_number + 1 ); - break; - case "round_prev": - zombie_devgui_goto_round( level.round_number - 1 ); - break; - case "chest_move": - if ( isdefined( level.chest_accessed ) ) - { - level notify( "devgui_chest_end_monitor" ); - level.chest_accessed = 100; - } - - break; - case "chest_never_move": - if ( isdefined( level.chest_accessed ) ) - level thread zombie_devgui_chest_never_move(); - - break; - case "chest": - if ( isdefined( level.zombie_weapons[getdvar( _hash_45ED7744 )] ) ) - { - - } - - break; - case "quantum_bomb_random_result": - setdvar( "scr_force_quantum_bomb_result", "" ); - break; - case "give_gasmask": - array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_gasmask_zm" ); - break; - case "give_hacker": - array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_hacker_zm" ); - break; - case "give_turbine": - array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_turbine_zm" ); - break; - case "give_turret": - array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_turret_zm" ); - break; - case "give_electrictrap": - array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_electrictrap_zm" ); - break; - case "give_riotshield": - array_thread( get_players(), ::zombie_devgui_equipment_give, "riotshield_zm" ); - break; - case "give_jetgun": - array_thread( get_players(), ::zombie_devgui_equipment_give, "jetgun_zm" ); - break; - case "give_springpad": - array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_springpad_zm" ); - break; - case "give_subwoofer": - array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_subwoofer_zm" ); - break; - case "give_headchopper": - array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_headchopper_zm" ); - break; - case "cool_jetgun": - array_thread( get_players(), ::zombie_devgui_cool_jetgun ); - break; - case "preserve_turbines": - array_thread( get_players(), ::zombie_devgui_preserve_turbines ); - break; - case "healthy_equipment": - array_thread( get_players(), ::zombie_devgui_equipment_stays_healthy ); - break; - case "disown_equipment": - array_thread( get_players(), ::zombie_devgui_disown_equipment ); - break; - case "buildable_drop": - array_thread( get_players(), ::zombie_devgui_buildable_drop ); - break; - case "build_busladder": - zombie_devgui_build( "busladder" ); - break; - case "build_bushatch": - zombie_devgui_build( "bushatch" ); - break; - case "build_dinerhatch": - zombie_devgui_build( "dinerhatch" ); - break; - case "build_cattlecatcher": - zombie_devgui_build( "cattlecatcher" ); - break; - case "build_pap": - zombie_devgui_build( "pap" ); - break; - case "build_riotshield_zm": - zombie_devgui_build( "riotshield_zm" ); - break; - case "build_powerswitch": - zombie_devgui_build( "powerswitch" ); - break; - case "build_turbine": - zombie_devgui_build( "turbine" ); - break; - case "build_turret": - zombie_devgui_build( "turret" ); - break; - case "build_electric_trap": - zombie_devgui_build( "electric_trap" ); - break; - case "build_jetgun_zm": - zombie_devgui_build( "jetgun_zm" ); - break; - case "build_sq_common": - zombie_devgui_build( "sq_common" ); - break; - case "build_springpad": - zombie_devgui_build( "springpad_zm" ); - break; - case "build_slipgun": - zombie_devgui_build( "slipgun_zm" ); - break; - case "build_keys": - zombie_devgui_build( "keys_zm" ); - break; - case "give_claymores": - array_thread( get_players(), ::zombie_devgui_give_claymores ); - break; - case "give_frags": - array_thread( get_players(), ::zombie_devgui_give_frags ); - break; - case "give_sticky": - array_thread( get_players(), ::zombie_devgui_give_sticky ); - break; - case "give_monkey": - array_thread( get_players(), ::zombie_devgui_give_monkey ); - break; - case "give_beacon": - array_thread( get_players(), ::zombie_devgui_give_beacon ); - break; - case "give_time_bomb": - array_thread( get_players(), ::zombie_devgui_give_time_bomb ); - break; - case "give_black_hole_bomb": - array_thread( get_players(), ::zombie_devgui_give_black_hole_bomb ); - break; - case "give_dolls": - array_thread( get_players(), ::zombie_devgui_give_dolls ); - break; - case "give_quantum_bomb": - array_thread( get_players(), ::zombie_devgui_give_quantum_bomb ); - break; - case "give_emp_bomb": - array_thread( get_players(), ::zombie_devgui_give_emp_bomb ); - break; - case "monkey_round": - zombie_devgui_monkey_round(); - break; - case "thief_round": - zombie_devgui_thief_round(); - break; - case "dog_round": - zombie_devgui_dog_round( getdvarint( _hash_3CD25BFE ) ); - break; - case "dog_round_skip": - zombie_devgui_dog_round_skip(); - break; - case "print_variables": - zombie_devgui_dump_zombie_vars(); - break; - case "pack_current_weapon": - zombie_devgui_pack_current_weapon(); - break; - case "unpack_current_weapon": - zombie_devgui_unpack_current_weapon(); - break; - case "reopt_current_weapon": - zombie_devgui_reopt_current_weapon(); - break; - case "weapon_take_all_fallback": - zombie_devgui_take_weapons( 1 ); - break; - case "weapon_take_all": - zombie_devgui_take_weapons( 0 ); - break; - case "weapon_take_current": - zombie_devgui_take_weapon(); - break; - case "power_on": - flag_set( "power_on" ); - break; - case "power_off": - flag_clear( "power_on" ); - break; - case "zombie_dpad_none": - array_thread( get_players(), ::zombie_devgui_dpad_none ); - break; - case "zombie_dpad_damage": - array_thread( get_players(), ::zombie_devgui_dpad_damage ); - break; - case "zombie_dpad_kill": - array_thread( get_players(), ::zombie_devgui_dpad_death ); - break; - case "zombie_dpad_drink": - array_thread( get_players(), ::zombie_devgui_dpad_changeweapon ); - break; - case "director_easy": - zombie_devgui_director_easy(); - break; - case "open_sesame": - zombie_devgui_open_sesame(); - break; - case "allow_fog": - zombie_devgui_allow_fog(); - break; - case "disable_kill_thread_toggle": - zombie_devgui_disable_kill_thread_toggle(); - break; - case "check_kill_thread_every_frame_toggle": - zombie_devgui_check_kill_thread_every_frame_toggle(); - break; - case "kill_thread_test_mode_toggle": - zombie_devgui_kill_thread_test_mode_toggle(); - break; - case "zombie_failsafe_debug_flush": - level notify( "zombie_failsafe_debug_flush" ); - break; - case "spawn": - devgui_zombie_spawn(); - break; - case "spawn_all": - devgui_all_spawn(); - break; - case "toggle_show_spawn_locations": - devgui_toggle_show_spawn_locations(); - break; - case "debug_hud": - array_thread( get_players(), ::devgui_debug_hud ); - break; - case "": - break; - default: - if ( isdefined( level.custom_devgui ) ) - { - if ( isarray( level.custom_devgui ) ) - { - i = 0; - - do - { - b_found_entry = is_true( [[ level.custom_devgui[i] ]]( cmd ) ); - i++; - } - while ( !b_found_entry && i < level.custom_devgui.size ); - } - else - [[ level.custom_devgui ]]( cmd ); - } - else - { - - } - - break; - } - - setdvar( "zombie_devgui", "" ); - wait 0.5; - } + for ( ;; ) + { + cmd = getDvar( "zombie_devgui" ); + switch( cmd ) + { + case "money": + players = get_players(); + array_thread( players, ::zombie_devgui_give_money ); + break; + case "player1_money": + players = get_players(); + if ( players.size >= 1 ) + { + players[ 0 ] thread zombie_devgui_give_money(); + } + break; + case "player2_money": + players = get_players(); + if ( players.size >= 2 ) + { + players[ 1 ] thread zombie_devgui_give_money(); + } + break; + case "player3_money": + players = get_players(); + if ( players.size >= 3 ) + { + players[ 2 ] thread zombie_devgui_give_money(); + } + break; + case "player4_money": + players = get_players(); + if ( players.size >= 4 ) + { + players[ 3 ] thread zombie_devgui_give_money(); + } + break; + case "moneydown": + players = get_players(); + array_thread( players, ::zombie_devgui_take_money ); + break; + case "player1_moneydown": + players = get_players(); + if ( players.size >= 1 ) + { + players[ 0 ] thread zombie_devgui_take_money(); + } + break; + case "player2_moneydown": + players = get_players(); + if ( players.size >= 2 ) + { + players[ 1 ] thread zombie_devgui_take_money(); + } + break; + case "player3_moneydown": + players = get_players(); + if ( players.size >= 3 ) + { + players[ 2 ] thread zombie_devgui_take_money(); + } + break; + case "player4_moneydown": + players = get_players(); + if ( players.size >= 4 ) + { + players[ 3 ] thread zombie_devgui_take_money(); + } + break; + case "health": + array_thread( get_players(), ::zombie_devgui_give_health ); + break; + case "player1_health": + players = get_players(); + if ( players.size >= 1 ) + { + players[ 0 ] thread zombie_devgui_give_health(); + } + break; + case "player2_health": + players = get_players(); + if ( players.size >= 2 ) + { + players[ 1 ] thread zombie_devgui_give_health(); + } + break; + case "player3_health": + players = get_players(); + if ( players.size >= 3 ) + { + players[ 2 ] thread zombie_devgui_give_health(); + } + break; + case "player4_health": + players = get_players(); + if ( players.size >= 4 ) + { + players[ 3 ] thread zombie_devgui_give_health(); + } + break; + case "ammo": + array_thread( get_players(), ::zombie_devgui_toggle_ammo ); + break; + case "ignore": + array_thread( get_players(), ::zombie_devgui_toggle_ignore ); + break; + case "player1_ignore": + players = get_players(); + if ( players.size >= 1 ) + { + players[ 0 ] thread zombie_devgui_toggle_ignore(); + } + break; + case "player2_ignore": + players = get_players(); + if ( players.size >= 2 ) + { + players[ 1 ] thread zombie_devgui_toggle_ignore(); + } + break; + case "player3_ignore": + players = get_players(); + if ( players.size >= 3 ) + { + players[ 2 ] thread zombie_devgui_toggle_ignore(); + } + break; + case "player4_ignore": + players = get_players(); + if ( players.size >= 4 ) + { + players[ 3 ] thread zombie_devgui_toggle_ignore(); + } + break; + case "invul_on": + zombie_devgui_invulnerable( undefined, 1 ); + break; + case "invul_off": + zombie_devgui_invulnerable( undefined, 0 ); + break; + case "player1_invul_on": + zombie_devgui_invulnerable( 0, 1 ); + break; + case "player1_invul_off": + zombie_devgui_invulnerable( 0, 0 ); + break; + case "player2_invul_on": + zombie_devgui_invulnerable( 1, 1 ); + break; + case "player2_invul_off": + zombie_devgui_invulnerable( 1, 0 ); + break; + case "player3_invul_on": + zombie_devgui_invulnerable( 2, 1 ); + break; + case "player3_invul_off": + zombie_devgui_invulnerable( 2, 0 ); + break; + case "player4_invul_on": + zombie_devgui_invulnerable( 3, 1 ); + break; + case "player4_invul_off": + zombie_devgui_invulnerable( 3, 0 ); + break; + case "revive_all": + array_thread( get_players(), ::zombie_devgui_revive ); + break; + case "player1_revive": + players = get_players(); + if ( players.size >= 1 ) + { + players[ 0 ] thread zombie_devgui_revive(); + } + break; + case "player2_revive": + players = get_players(); + if ( players.size >= 2 ) + { + players[ 1 ] thread zombie_devgui_revive(); + } + break; + case "player3_revive": + players = get_players(); + if ( players.size >= 3 ) + { + players[ 2 ] thread zombie_devgui_revive(); + } + break; + case "player4_revive": + players = get_players(); + if ( players.size >= 4 ) + { + players[ 3 ] thread zombie_devgui_revive(); + } + break; + case "player1_kill": + players = get_players(); + if ( players.size >= 1 ) + { + players[ 0 ] thread zombie_devgui_kill(); + } + break; + case "player2_kill": + players = get_players(); + if ( players.size >= 2 ) + { + players[ 1 ] thread zombie_devgui_kill(); + } + break; + case "player3_kill": + players = get_players(); + if ( players.size >= 3 ) + { + players[ 2 ] thread zombie_devgui_kill(); + } + break; + case "player4_kill": + players = get_players(); + if ( players.size >= 4 ) + { + players[ 3 ] thread zombie_devgui_kill(); + } + break; + case "spawn_friendly_bot": + player = gethostplayer(); + team = player.team; + devgui_bot_spawn( team ); + break; + case "specialty_quickrevive": + level.solo_lives_given = 0; + case "specialty_additionalprimaryweapon": + case "specialty_armorvest": + case "specialty_deadshot": + case "specialty_fastmeleerecovery": + case "specialty_fastreload": + case "specialty_finalstand": + case "specialty_flakjacket": + case "specialty_grenadepulldeath": + case "specialty_longersprint": + case "specialty_nomotionsensor": + case "specialty_rof": + case "specialty_scavenger": + case "specialty_showonradar": + zombie_devgui_give_perk( cmd ); + break; + case "turnplayer": + zombie_devgui_turn_player(); + break; + case "player1_turnplayer": + zombie_devgui_turn_player( 0 ); + break; + case "player2_turnplayer": + zombie_devgui_turn_player( 1 ); + break; + case "player3_turnplayer": + zombie_devgui_turn_player( 2 ); + break; + case "player4_turnplayer": + zombie_devgui_turn_player( 3 ); + break; + case "player1_debug_pers": + zombie_devgui_debug_pers( 0 ); + break; + case "player2_debug_pers": + zombie_devgui_debug_pers( 1 ); + break; + case "player3_debug_pers": + zombie_devgui_debug_pers( 2 ); + break; + case "player4_debug_pers": + zombie_devgui_debug_pers( 3 ); + break; + case "bonfire_sale": + case "bonus_points_player": + case "bonus_points_team": + case "carpenter": + case "double_points": + case "empty_clip": + case "fire_sale": + case "free_perk": + case "full_ammo": + case "insta_kill": + case "lose_perk": + case "lose_points_team": + case "meat_stink": + case "minigun": + case "nuke": + case "random_weapon": + case "tesla": + zombie_devgui_give_powerup( cmd, 1 ); + break; + case "next_bonfire_sale": + case "next_bonus_points_player": + case "next_bonus_points_team": + case "next_carpenter": + case "next_double_points": + case "next_empty_clip": + case "next_fire_sale": + case "next_free_perk": + case "next_full_ammo": + case "next_insta_kill": + case "next_lose_perk": + case "next_lose_points_team": + case "next_meat_stink": + case "next_minigun": + case "next_nuke": + case "next_random_weapon": + case "next_tesla": + zombie_devgui_give_powerup( getsubstr( cmd, 5 ), 0 ); + break; + case "round": + zombie_devgui_goto_round( getDvarInt( "scr_zombie_round" ) ); + break; + case "round_next": + zombie_devgui_goto_round( level.round_number + 1 ); + break; + case "round_prev": + zombie_devgui_goto_round( level.round_number - 1 ); + break; + case "chest_move": + if ( isDefined( level.chest_accessed ) ) + { + level notify( "devgui_chest_end_monitor" ); + level.chest_accessed = 100; + } + break; + case "chest_never_move": + if ( isDefined( level.chest_accessed ) ) + { + level thread zombie_devgui_chest_never_move(); + } + break; + case "chest": + if ( isDefined( level.zombie_weapons[ getDvar( "scr_force_weapon" ) ] ) ) + { + } + break; + case "quantum_bomb_random_result": + setdvar( "scr_force_quantum_bomb_result", "" ); + break; + case "give_gasmask": + array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_gasmask_zm" ); + break; + case "give_hacker": + array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_hacker_zm" ); + break; + case "give_turbine": + array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_turbine_zm" ); + break; + case "give_turret": + array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_turret_zm" ); + break; + case "give_electrictrap": + array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_electrictrap_zm" ); + break; + case "give_riotshield": + array_thread( get_players(), ::zombie_devgui_equipment_give, "riotshield_zm" ); + break; + case "give_jetgun": + array_thread( get_players(), ::zombie_devgui_equipment_give, "jetgun_zm" ); + break; + case "give_springpad": + array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_springpad_zm" ); + break; + case "give_subwoofer": + array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_subwoofer_zm" ); + break; + case "give_headchopper": + array_thread( get_players(), ::zombie_devgui_equipment_give, "equip_headchopper_zm" ); + break; + case "cool_jetgun": + array_thread( get_players(), ::zombie_devgui_cool_jetgun ); + break; + case "preserve_turbines": + array_thread( get_players(), ::zombie_devgui_preserve_turbines ); + break; + case "healthy_equipment": + array_thread( get_players(), ::zombie_devgui_equipment_stays_healthy ); + break; + case "disown_equipment": + array_thread( get_players(), ::zombie_devgui_disown_equipment ); + break; + case "buildable_drop": + array_thread( get_players(), ::zombie_devgui_buildable_drop ); + break; + case "build_busladder": + zombie_devgui_build( "busladder" ); + break; + case "build_bushatch": + zombie_devgui_build( "bushatch" ); + break; + case "build_dinerhatch": + zombie_devgui_build( "dinerhatch" ); + break; + case "build_cattlecatcher": + zombie_devgui_build( "cattlecatcher" ); + break; + case "build_pap": + zombie_devgui_build( "pap" ); + break; + case "build_riotshield_zm": + zombie_devgui_build( "riotshield_zm" ); + break; + case "build_powerswitch": + zombie_devgui_build( "powerswitch" ); + break; + case "build_turbine": + zombie_devgui_build( "turbine" ); + break; + case "build_turret": + zombie_devgui_build( "turret" ); + break; + case "build_electric_trap": + zombie_devgui_build( "electric_trap" ); + break; + case "build_jetgun_zm": + zombie_devgui_build( "jetgun_zm" ); + break; + case "build_sq_common": + zombie_devgui_build( "sq_common" ); + break; + case "build_springpad": + zombie_devgui_build( "springpad_zm" ); + break; + case "build_slipgun": + zombie_devgui_build( "slipgun_zm" ); + break; + case "build_keys": + zombie_devgui_build( "keys_zm" ); + break; + case "give_claymores": + array_thread( get_players(), ::zombie_devgui_give_claymores ); + break; + case "give_frags": + array_thread( get_players(), ::zombie_devgui_give_frags ); + break; + case "give_sticky": + array_thread( get_players(), ::zombie_devgui_give_sticky ); + break; + case "give_monkey": + array_thread( get_players(), ::zombie_devgui_give_monkey ); + break; + case "give_beacon": + array_thread( get_players(), ::zombie_devgui_give_beacon ); + break; + case "give_time_bomb": + array_thread( get_players(), ::zombie_devgui_give_time_bomb ); + break; + case "give_black_hole_bomb": + array_thread( get_players(), ::zombie_devgui_give_black_hole_bomb ); + break; + case "give_dolls": + array_thread( get_players(), ::zombie_devgui_give_dolls ); + break; + case "give_quantum_bomb": + array_thread( get_players(), ::zombie_devgui_give_quantum_bomb ); + break; + case "give_emp_bomb": + array_thread( get_players(), ::zombie_devgui_give_emp_bomb ); + break; + case "monkey_round": + zombie_devgui_monkey_round(); + break; + case "thief_round": + zombie_devgui_thief_round(); + break; + case "dog_round": + zombie_devgui_dog_round( getDvarInt( "scr_zombie_dogs" ) ); + break; + case "dog_round_skip": + zombie_devgui_dog_round_skip(); + break; + case "print_variables": + zombie_devgui_dump_zombie_vars(); + break; + case "pack_current_weapon": + zombie_devgui_pack_current_weapon(); + break; + case "unpack_current_weapon": + zombie_devgui_unpack_current_weapon(); + break; + case "reopt_current_weapon": + zombie_devgui_reopt_current_weapon(); + break; + case "weapon_take_all_fallback": + zombie_devgui_take_weapons( 1 ); + break; + case "weapon_take_all": + zombie_devgui_take_weapons( 0 ); + break; + case "weapon_take_current": + zombie_devgui_take_weapon(); + break; + case "power_on": + flag_set( "power_on" ); + break; + case "power_off": + flag_clear( "power_on" ); + break; + case "zombie_dpad_none": + array_thread( get_players(), ::zombie_devgui_dpad_none ); + break; + case "zombie_dpad_damage": + array_thread( get_players(), ::zombie_devgui_dpad_damage ); + break; + case "zombie_dpad_kill": + array_thread( get_players(), ::zombie_devgui_dpad_death ); + break; + case "zombie_dpad_drink": + array_thread( get_players(), ::zombie_devgui_dpad_changeweapon ); + break; + case "director_easy": + zombie_devgui_director_easy(); + break; + case "open_sesame": + zombie_devgui_open_sesame(); + break; + case "allow_fog": + zombie_devgui_allow_fog(); + break; + case "disable_kill_thread_toggle": + zombie_devgui_disable_kill_thread_toggle(); + break; + case "check_kill_thread_every_frame_toggle": + zombie_devgui_check_kill_thread_every_frame_toggle(); + break; + case "kill_thread_test_mode_toggle": + zombie_devgui_kill_thread_test_mode_toggle(); + break; + case "zombie_failsafe_debug_flush": + level notify( "zombie_failsafe_debug_flush" ); + break; + case "spawn": + devgui_zombie_spawn(); + break; + case "spawn_all": + devgui_all_spawn(); + break; + case "toggle_show_spawn_locations": + devgui_toggle_show_spawn_locations(); + break; + case "debug_hud": + array_thread( get_players(), ::devgui_debug_hud ); + break; + case "": + default: + if ( isDefined( level.custom_devgui ) ) + { + if ( isarray( level.custom_devgui ) ) + { + i = 0; + b_found_entry = is_true( [[ level.custom_devgui[ i ] ]]( cmd ) ); + i++; + if ( !b_found_entry} + else [[ level.custom_devgui ]]( cmd ); + break; + } + } + setdvar( "zombie_devgui", "" ); + wait 0,5; #/ + } + } + } + } } devgui_all_spawn() { /# - player = gethostplayer(); - devgui_bot_spawn( player.team ); - wait 0.1; - devgui_bot_spawn( player.team ); - wait 0.1; - devgui_bot_spawn( player.team ); - wait 0.1; - zombie_devgui_goto_round( 8 ); + player = gethostplayer(); + devgui_bot_spawn( player.team ); + wait 0,1; + devgui_bot_spawn( player.team ); + wait 0,1; + devgui_bot_spawn( player.team ); + wait 0,1; + zombie_devgui_goto_round( 8 ); #/ } devgui_toggle_show_spawn_locations() { /# - if ( !isdefined( level.toggle_show_spawn_locations ) ) - level.toggle_show_spawn_locations = 1; - else - level.toggle_show_spawn_locations = !level.toggle_show_spawn_locations; + if ( !isDefined( level.toggle_show_spawn_locations ) ) + { + level.toggle_show_spawn_locations = 1; + } + else + { + level.toggle_show_spawn_locations = !level.toggle_show_spawn_locations; #/ + } } devgui_zombie_spawn() { /# - player = get_players()[0]; - spawnername = undefined; - spawnername = "zombie_spawner"; - direction = player getplayerangles(); - direction_vec = anglestoforward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - guy = undefined; - spawners = getentarray( spawnername, "script_noteworthy" ); - spawner = spawners[0]; - guy = maps\mp\zombies\_zm_utility::spawn_zombie( spawner ); - - if ( isdefined( guy ) ) - { - wait 0.5; - guy.origin = trace["position"]; - guy.angles = player.angles + vectorscale( ( 0, 1, 0 ), 180.0 ); - guy forceteleport( trace["position"], player.angles + vectorscale( ( 0, 1, 0 ), 180.0 ) ); - guy thread maps\mp\zombies\_zm_ai_basic::find_flesh(); - } + player = get_players()[ 0 ]; + spawnername = undefined; + spawnername = "zombie_spawner"; + direction = player getplayerangles(); + direction_vec = anglesToForward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + guy = undefined; + spawners = getentarray( spawnername, "script_noteworthy" ); + spawner = spawners[ 0 ]; + guy = maps/mp/zombies/_zm_utility::spawn_zombie( spawner ); + if ( isDefined( guy ) ) + { + wait 0,5; + guy.origin = trace[ "position" ]; + guy.angles = player.angles + vectorScale( ( 0, 1, 0 ), 180 ); + guy forceteleport( trace[ "position" ], player.angles + vectorScale( ( 0, 1, 0 ), 180 ) ); + guy thread maps/mp/zombies/_zm_ai_basic::find_flesh(); #/ + } } devgui_bot_spawn( team ) { /# - player = gethostplayer(); - direction = player getplayerangles(); - direction_vec = anglestoforward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - direction_vec = player.origin - trace["position"]; - direction = vectortoangles( direction_vec ); - bot = addtestclient(); - - if ( !isdefined( bot ) ) - { - println( "Could not add test client" ); - return; - } - - bot.pers["isBot"] = 1; - bot.equipment_enabled = 0; - bot maps\mp\zombies\_zm::reset_rampage_bookmark_kill_times(); - bot.team = "allies"; - bot._player_entnum = bot getentitynumber(); - yaw = direction[1]; - bot thread devgui_bot_spawn_think( trace["position"], yaw ); + player = gethostplayer(); + direction = player getplayerangles(); + direction_vec = anglesToForward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + direction_vec = player.origin - trace[ "position" ]; + direction = vectorToAngle( direction_vec ); + bot = addtestclient(); + if ( !isDefined( bot ) ) + { + println( "Could not add test client" ); + return; + } + bot.pers[ "isBot" ] = 1; + bot.equipment_enabled = 0; + bot maps/mp/zombies/_zm::reset_rampage_bookmark_kill_times(); + bot.team = "allies"; + bot._player_entnum = bot getentitynumber(); + yaw = direction[ 1 ]; + bot thread devgui_bot_spawn_think( trace[ "position" ], yaw ); #/ } devgui_bot_spawn_think( origin, yaw ) { /# - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self setorigin( origin ); - angles = ( 0, yaw, 0 ); - self setplayerangles( angles ); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self setorigin( origin ); + angles = ( 0, yaw, 0 ); + self setplayerangles( angles ); #/ + } } zombie_devgui_open_sesame() { /# - setdvar( "zombie_unlock_all", 1 ); - flag_set( "power_on" ); - players = get_players(); - array_thread( players, ::zombie_devgui_give_money ); - zombie_doors = getentarray( "zombie_door", "targetname" ); - - for ( i = 0; i < zombie_doors.size; i++ ) - { - zombie_doors[i] notify( "trigger", players[0] ); - - if ( is_true( zombie_doors[i].power_door_ignore_flag_wait ) ) - zombie_doors[i] notify( "power_on" ); - - wait 0.05; - } - - zombie_airlock_doors = getentarray( "zombie_airlock_buy", "targetname" ); - - for ( i = 0; i < zombie_airlock_doors.size; i++ ) - { - zombie_airlock_doors[i] notify( "trigger", players[0] ); - wait 0.05; - } - - zombie_debris = getentarray( "zombie_debris", "targetname" ); - - for ( i = 0; i < zombie_debris.size; i++ ) - { - zombie_debris[i] notify( "trigger", players[0] ); - wait 0.05; - } - - zombie_devgui_build( undefined ); - level notify( "open_sesame" ); - wait 1; - setdvar( "zombie_unlock_all", 0 ); + setdvar( "zombie_unlock_all", 1 ); + flag_set( "power_on" ); + players = get_players(); + array_thread( players, ::zombie_devgui_give_money ); + zombie_doors = getentarray( "zombie_door", "targetname" ); + i = 0; + while ( i < zombie_doors.size ) + { + zombie_doors[ i ] notify( "trigger" ); + if ( is_true( zombie_doors[ i ].power_door_ignore_flag_wait ) ) + { + zombie_doors[ i ] notify( "power_on" ); + } + wait 0,05; + i++; + } + zombie_airlock_doors = getentarray( "zombie_airlock_buy", "targetname" ); + i = 0; + while ( i < zombie_airlock_doors.size ) + { + zombie_airlock_doors[ i ] notify( "trigger" ); + wait 0,05; + i++; + } + zombie_debris = getentarray( "zombie_debris", "targetname" ); + i = 0; + while ( i < zombie_debris.size ) + { + zombie_debris[ i ] notify( "trigger" ); + wait 0,05; + i++; + } + zombie_devgui_build( undefined ); + level notify( "open_sesame" ); + wait 1; + setdvar( "zombie_unlock_all", 0 ); #/ } any_player_in_noclip() { /# - foreach ( player in get_players() ) - { - if ( player isinmovemode( "ufo", "noclip" ) ) - return true; - } - - return false; + _a1161 = get_players(); + _k1161 = getFirstArrayKey( _a1161 ); + while ( isDefined( _k1161 ) ) + { + player = _a1161[ _k1161 ]; + if ( player isinmovemode( "ufo", "noclip" ) ) + { + return 1; + } + _k1161 = getNextArrayKey( _a1161, _k1161 ); + } + return 0; #/ } diable_fog_in_noclip() { /# - level.fog_disabled_in_noclip = 1; - level endon( "allowfoginnoclip" ); - flag_wait( "start_zombie_round_logic" ); - - while ( true ) - { - while ( !any_player_in_noclip() ) - wait 1; - - setdvar( "scr_fog_disable", "1" ); - setdvar( "r_fog_disable", "1" ); - - if ( isdefined( level.culldist ) ) - setculldist( 0 ); - - while ( any_player_in_noclip() ) - wait 1; - - setdvar( "scr_fog_disable", "0" ); - setdvar( "r_fog_disable", "0" ); - - if ( isdefined( level.culldist ) ) - setculldist( level.culldist ); - } + level.fog_disabled_in_noclip = 1; + level endon( "allowfoginnoclip" ); + flag_wait( "start_zombie_round_logic" ); + while ( 1 ) + { + while ( !any_player_in_noclip() ) + { + wait 1; + } + setdvar( "scr_fog_disable", "1" ); + setdvar( "r_fog_disable", "1" ); + if ( isDefined( level.culldist ) ) + { + setculldist( 0 ); + } + while ( any_player_in_noclip() ) + { + wait 1; + } + setdvar( "scr_fog_disable", "0" ); + setdvar( "r_fog_disable", "0" ); + if ( isDefined( level.culldist ) ) + { + setculldist( level.culldist ); + } #/ + } } zombie_devgui_allow_fog() { /# - if ( level.fog_disabled_in_noclip ) - { - level notify( "allowfoginnoclip" ); - level.fog_disabled_in_noclip = 0; - setdvar( "scr_fog_disable", "0" ); - setdvar( "r_fog_disable", "0" ); - } - else - thread diable_fog_in_noclip(); + if ( level.fog_disabled_in_noclip ) + { + level notify( "allowfoginnoclip" ); + level.fog_disabled_in_noclip = 0; + setdvar( "scr_fog_disable", "0" ); + setdvar( "r_fog_disable", "0" ); + } + else + { + thread diable_fog_in_noclip(); #/ + } } zombie_devgui_give_money() { /# - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - self maps\mp\zombies\_zm_score::add_to_player_score( 100000 ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + self maps/mp/zombies/_zm_score::add_to_player_score( 100000 ); #/ } zombie_devgui_take_money() { /# - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - - if ( self.score > 100 ) - self maps\mp\zombies\_zm_score::minus_to_player_score( int( self.score / 2 ) ); - else - self maps\mp\zombies\_zm_score::minus_to_player_score( self.score ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + if ( self.score > 100 ) + { + self maps/mp/zombies/_zm_score::minus_to_player_score( int( self.score / 2 ) ); + } + else + { + self maps/mp/zombies/_zm_score::minus_to_player_score( self.score ); #/ + } } zombie_devgui_turn_player( index ) { /# - players = get_players(); - - if ( !isdefined( index ) || index >= players.size ) - player = players[0]; - else - player = players[index]; - - assert( isdefined( player ) ); - assert( isplayer( player ) ); - assert( isalive( player ) ); - level.devcheater = 1; - - if ( player hasperk( "specialty_noname" ) ) - { - println( "Player turned HUMAN" ); - player maps\mp\zombies\_zm_turned::turn_to_human(); - } - else - { - println( "Player turned ZOMBIE" ); - player maps\mp\zombies\_zm_turned::turn_to_zombie(); - } + players = get_players(); + if ( !isDefined( index ) || index >= players.size ) + { + player = players[ 0 ]; + } + else + { + player = players[ index ]; + } + assert( isDefined( player ) ); + assert( isplayer( player ) ); + assert( isalive( player ) ); + level.devcheater = 1; + if ( player hasperk( "specialty_noname" ) ) + { + println( "Player turned HUMAN" ); + player maps/mp/zombies/_zm_turned::turn_to_human(); + } + else + { + println( "Player turned ZOMBIE" ); + player maps/mp/zombies/_zm_turned::turn_to_zombie(); #/ + } } zombie_devgui_debug_pers( index ) { /# - players = get_players(); - - if ( !isdefined( index ) || index >= players.size ) - player = players[0]; - else - player = players[index]; - - assert( isdefined( player ) ); - assert( isplayer( player ) ); - assert( isalive( player ) ); - level.devcheater = 1; - println( "\n\n----------------------------------------------------------------------------------------------" ); - println( "Active Persistent upgrades [count=" + level.pers_upgrades_keys.size + "]" ); - - for ( pers_upgrade_index = 0; pers_upgrade_index < level.pers_upgrades_keys.size; pers_upgrade_index++ ) - { - name = level.pers_upgrades_keys[pers_upgrade_index]; - println( pers_upgrade_index + ">pers_upgrade name = " + name ); - pers_upgrade = level.pers_upgrades[name]; - - for ( i = 0; i < pers_upgrade.stat_names.size; i++ ) - { - stat_name = pers_upgrade.stat_names[i]; - stat_desired_value = pers_upgrade.stat_desired_values[i]; - player_current_stat_value = player maps\mp\zombies\_zm_stats::get_global_stat( stat_name ); - println( " " + i + ")stat_name = " + stat_name ); - println( " " + i + ")stat_desired_values = " + stat_desired_value ); - println( " " + i + ")player_current_stat_value = " + player_current_stat_value ); - } - - if ( is_true( player.pers_upgrades_awarded[name] ) ) - { - println( "PLAYER HAS - " + name ); - continue; - } - - println( "PLAYER DOES NOT HAVE - " + name ); - } - - println( "----------------------------------------------------------------------------------------------\n\n" ); + players = get_players(); + if ( !isDefined( index ) || index >= players.size ) + { + player = players[ 0 ]; + } + else + { + player = players[ index ]; + } + assert( isDefined( player ) ); + assert( isplayer( player ) ); + assert( isalive( player ) ); + level.devcheater = 1; + println( "\n\n----------------------------------------------------------------------------------------------" ); + println( "Active Persistent upgrades [count=" + level.pers_upgrades_keys.size + "]" ); + pers_upgrade_index = 0; + while ( pers_upgrade_index < level.pers_upgrades_keys.size ) + { + name = level.pers_upgrades_keys[ pers_upgrade_index ]; + println( ( pers_upgrade_index + ">pers_upgrade name = " ) + name ); + pers_upgrade = level.pers_upgrades[ name ]; + i = 0; + while ( i < pers_upgrade.stat_names.size ) + { + stat_name = pers_upgrade.stat_names[ i ]; + stat_desired_value = pers_upgrade.stat_desired_values[ i ]; + player_current_stat_value = player maps/mp/zombies/_zm_stats::get_global_stat( stat_name ); + println( " " + i + ")stat_name = " + stat_name ); + println( " " + i + ")stat_desired_values = " + stat_desired_value ); + println( " " + i + ")player_current_stat_value = " + player_current_stat_value ); + i++; + } + if ( is_true( player.pers_upgrades_awarded[ name ] ) ) + { + println( "PLAYER HAS - " + name ); + pers_upgrade_index++; + continue; + } + else + { + println( "PLAYER DOES NOT HAVE - " + name ); + } + pers_upgrade_index++; + } + println( "----------------------------------------------------------------------------------------------\n\n" ); #/ } zombie_devgui_cool_jetgun() { /# - if ( isdefined( level.zm_devgui_jetgun_never_overheat ) ) - self thread [[ level.zm_devgui_jetgun_never_overheat ]](); + if ( isDefined( level.zm_devgui_jetgun_never_overheat ) ) + { + self thread [[ level.zm_devgui_jetgun_never_overheat ]](); #/ + } } zombie_devgui_preserve_turbines() { /# - self endon( "disconnect" ); - self notify( "preserve_turbines" ); - self endon( "preserve_turbines" ); - - if ( !is_true( self.preserving_turbines ) ) - { - self.preserving_turbines = 1; - - while ( true ) - { - self.turbine_health = 1200; - wait 1; - } - } - - self.preserving_turbines = 0; + self endon( "disconnect" ); + self notify( "preserve_turbines" ); + self endon( "preserve_turbines" ); + while ( !is_true( self.preserving_turbines ) ) + { + self.preserving_turbines = 1; + while ( 1 ) + { + self.turbine_health = 1200; + wait 1; + } + } + self.preserving_turbines = 0; #/ } zombie_devgui_equipment_stays_healthy() { /# - self endon( "disconnect" ); - self notify( "preserve_equipment" ); - self endon( "preserve_equipment" ); - - if ( !is_true( self.preserving_equipment ) ) - { - self.preserving_equipment = 1; - - while ( true ) - { - self.equipment_damage = []; - self.shielddamagetaken = 0; - - if ( isdefined( level.destructible_equipment ) ) - { - foreach ( equip in level.destructible_equipment ) - { - if ( isdefined( equip ) ) - { - equip.shielddamagetaken = 0; - equip.damage = 0; - equip.headchopper_kills = 0; - equip.springpad_kills = 0; - equip.subwoofer_kills = 0; - } - } - } - - wait 0.1; - } - } - - self.preserving_equipment = 0; + self endon( "disconnect" ); + self notify( "preserve_equipment" ); + self endon( "preserve_equipment" ); + while ( !is_true( self.preserving_equipment ) ) + { + self.preserving_equipment = 1; + while ( 1 ) + { + self.equipment_damage = []; + self.shielddamagetaken = 0; + while ( isDefined( level.destructible_equipment ) ) + { + _a1357 = level.destructible_equipment; + _k1357 = getFirstArrayKey( _a1357 ); + while ( isDefined( _k1357 ) ) + { + equip = _a1357[ _k1357 ]; + if ( isDefined( equip ) ) + { + equip.shielddamagetaken = 0; + equip.damage = 0; + equip.headchopper_kills = 0; + equip.springpad_kills = 0; + equip.subwoofer_kills = 0; + } + _k1357 = getNextArrayKey( _a1357, _k1357 ); + } + } + wait 0,1; + } + } + self.preserving_equipment = 0; #/ } zombie_devgui_disown_equipment() { /# - self.deployed_equipment = []; + self.deployed_equipment = []; #/ } zombie_devgui_equipment_give( equipment ) { /# - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( is_equipment_included( equipment ) ) - self maps\mp\zombies\_zm_equipment::equipment_buy( equipment ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( is_equipment_included( equipment ) ) + { + self maps/mp/zombies/_zm_equipment::equipment_buy( equipment ); #/ + } } zombie_devgui_buildable_drop() { /# - if ( isdefined( level.buildable_slot_count ) ) - { - for ( i = 0; i < level.buildable_slot_count; i++ ) - self maps\mp\zombies\_zm_buildables::player_drop_piece( undefined, i ); - } - else - self maps\mp\zombies\_zm_buildables::player_drop_piece(); + if ( isDefined( level.buildable_slot_count ) ) + { + i = 0; + while ( i < level.buildable_slot_count ) + { + self maps/mp/zombies/_zm_buildables::player_drop_piece( undefined, i ); + i++; + } + } + else self maps/mp/zombies/_zm_buildables::player_drop_piece(); #/ } zombie_devgui_build( buildable ) { /# - player = get_players()[0]; - - for ( i = 0; i < level.buildable_stubs.size; i++ ) - { - if ( !isdefined( buildable ) || level.buildable_stubs[i].equipname == buildable ) - { - if ( !isdefined( buildable ) && is_true( level.buildable_stubs[i].ignore_open_sesame ) ) - continue; - - if ( isdefined( buildable ) || level.buildable_stubs[i].persistent != 3 ) - level.buildable_stubs[i] maps\mp\zombies\_zm_buildables::buildablestub_finish_build( player ); - } - } + player = get_players()[ 0 ]; + i = 0; + while ( i < level.buildable_stubs.size ) + { + if ( !isDefined( buildable ) || level.buildable_stubs[ i ].equipname == buildable ) + { + if ( !isDefined( buildable ) && is_true( level.buildable_stubs[ i ].ignore_open_sesame ) ) + { + i++; + continue; + } + else + { + if ( isDefined( buildable ) || level.buildable_stubs[ i ].persistent != 3 ) + { + level.buildable_stubs[ i ] maps/mp/zombies/_zm_buildables::buildablestub_finish_build( player ); + } + } + } + i++; #/ + } } zombie_devgui_give_claymores() { /# - self endon( "disconnect" ); - self notify( "give_planted_grenade_thread" ); - self endon( "give_planted_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_placeable_mine() ) ) - self takeweapon( self get_player_placeable_mine() ); - - self thread maps\mp\zombies\_zm_weap_claymore::claymore_setup(); - - while ( true ) - { - self givemaxammo( "claymore_zm" ); - wait 1; - } + self endon( "disconnect" ); + self notify( "give_planted_grenade_thread" ); + self endon( "give_planted_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_placeable_mine() ) ) + { + self takeweapon( self get_player_placeable_mine() ); + } + self thread maps/mp/zombies/_zm_weap_claymore::claymore_setup(); + while ( 1 ) + { + self givemaxammo( "claymore_zm" ); + wait 1; #/ + } } zombie_devgui_give_lethal( weapon ) { /# - self endon( "disconnect" ); - self notify( "give_lethal_grenade_thread" ); - self endon( "give_lethal_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_lethal_grenade() ) ) - self takeweapon( self get_player_lethal_grenade() ); - - self giveweapon( weapon ); - self set_player_lethal_grenade( weapon ); - - while ( true ) - { - self givemaxammo( weapon ); - wait 1; - } + self endon( "disconnect" ); + self notify( "give_lethal_grenade_thread" ); + self endon( "give_lethal_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_lethal_grenade() ) ) + { + self takeweapon( self get_player_lethal_grenade() ); + } + self giveweapon( weapon ); + self set_player_lethal_grenade( weapon ); + while ( 1 ) + { + self givemaxammo( weapon ); + wait 1; #/ + } } zombie_devgui_give_frags() { /# - zombie_devgui_give_lethal( "frag_grenade_zm" ); + zombie_devgui_give_lethal( "frag_grenade_zm" ); #/ } zombie_devgui_give_sticky() { /# - zombie_devgui_give_lethal( "sticky_grenade_zm" ); + zombie_devgui_give_lethal( "sticky_grenade_zm" ); #/ } zombie_devgui_give_monkey() { /# - self endon( "disconnect" ); - self notify( "give_tactical_grenade_thread" ); - self endon( "give_tactical_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - if ( isdefined( level.zombiemode_devgui_cymbal_monkey_give ) ) - { - self [[ level.zombiemode_devgui_cymbal_monkey_give ]](); - - while ( true ) - { - self givemaxammo( "cymbal_monkey_zm" ); - wait 1; - } - } + self endon( "disconnect" ); + self notify( "give_tactical_grenade_thread" ); + self endon( "give_tactical_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + while ( isDefined( level.zombiemode_devgui_cymbal_monkey_give ) ) + { + self [[ level.zombiemode_devgui_cymbal_monkey_give ]](); + while ( 1 ) + { + self givemaxammo( "cymbal_monkey_zm" ); + wait 1; #/ + } + } } zombie_devgui_give_beacon() { /# - self endon( "disconnect" ); - self notify( "give_tactical_grenade_thread" ); - self endon( "give_tactical_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - if ( isdefined( level.zombiemode_devgui_beacon_give ) ) - { - self [[ level.zombiemode_devgui_beacon_give ]](); - - while ( true ) - { - self givemaxammo( "beacon_zm" ); - wait 1; - } - } + self endon( "disconnect" ); + self notify( "give_tactical_grenade_thread" ); + self endon( "give_tactical_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + while ( isDefined( level.zombiemode_devgui_beacon_give ) ) + { + self [[ level.zombiemode_devgui_beacon_give ]](); + while ( 1 ) + { + self givemaxammo( "beacon_zm" ); + wait 1; #/ + } + } } zombie_devgui_give_time_bomb() { /# - self endon( "disconnect" ); - self notify( "give_tactical_grenade_thread" ); - self endon( "give_tactical_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - if ( isdefined( level.zombiemode_time_bomb_give_func ) ) - self [[ level.zombiemode_time_bomb_give_func ]](); + self endon( "disconnect" ); + self notify( "give_tactical_grenade_thread" ); + self endon( "give_tactical_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + if ( isDefined( level.zombiemode_time_bomb_give_func ) ) + { + self [[ level.zombiemode_time_bomb_give_func ]](); #/ + } } zombie_devgui_give_black_hole_bomb() { /# - self endon( "disconnect" ); - self notify( "give_tactical_grenade_thread" ); - self endon( "give_tactical_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - if ( isdefined( level.zombiemode_devgui_black_hole_bomb_give ) ) - { - self [[ level.zombiemode_devgui_black_hole_bomb_give ]](); - - while ( true ) - { - self givemaxammo( "zombie_black_hole_bomb" ); - wait 1; - } - } + self endon( "disconnect" ); + self notify( "give_tactical_grenade_thread" ); + self endon( "give_tactical_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + while ( isDefined( level.zombiemode_devgui_black_hole_bomb_give ) ) + { + self [[ level.zombiemode_devgui_black_hole_bomb_give ]](); + while ( 1 ) + { + self givemaxammo( "zombie_black_hole_bomb" ); + wait 1; #/ + } + } } zombie_devgui_give_dolls() { /# - self endon( "disconnect" ); - self notify( "give_tactical_grenade_thread" ); - self endon( "give_tactical_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - if ( isdefined( level.zombiemode_devgui_nesting_dolls_give ) ) - { - self [[ level.zombiemode_devgui_nesting_dolls_give ]](); - - while ( true ) - { - self givemaxammo( "zombie_nesting_dolls" ); - wait 1; - } - } + self endon( "disconnect" ); + self notify( "give_tactical_grenade_thread" ); + self endon( "give_tactical_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + while ( isDefined( level.zombiemode_devgui_nesting_dolls_give ) ) + { + self [[ level.zombiemode_devgui_nesting_dolls_give ]](); + while ( 1 ) + { + self givemaxammo( "zombie_nesting_dolls" ); + wait 1; #/ + } + } } zombie_devgui_give_quantum_bomb() { /# - self endon( "disconnect" ); - self notify( "give_tactical_grenade_thread" ); - self endon( "give_tactical_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - if ( isdefined( level.zombiemode_devgui_quantum_bomb_give ) ) - { - self [[ level.zombiemode_devgui_quantum_bomb_give ]](); - - while ( true ) - { - self givemaxammo( "zombie_quantum_bomb" ); - wait 1; - } - } + self endon( "disconnect" ); + self notify( "give_tactical_grenade_thread" ); + self endon( "give_tactical_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + while ( isDefined( level.zombiemode_devgui_quantum_bomb_give ) ) + { + self [[ level.zombiemode_devgui_quantum_bomb_give ]](); + while ( 1 ) + { + self givemaxammo( "zombie_quantum_bomb" ); + wait 1; #/ + } + } } zombie_devgui_give_emp_bomb() { /# - self endon( "disconnect" ); - self notify( "give_tactical_grenade_thread" ); - self endon( "give_tactical_grenade_thread" ); - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - level.devcheater = 1; - - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - if ( isdefined( level.zombiemode_devgui_emp_bomb_give ) ) - { - self [[ level.zombiemode_devgui_emp_bomb_give ]](); - - while ( true ) - { - self givemaxammo( "emp_grenade_zm" ); - wait 1; - } - } + self endon( "disconnect" ); + self notify( "give_tactical_grenade_thread" ); + self endon( "give_tactical_grenade_thread" ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + level.devcheater = 1; + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + while ( isDefined( level.zombiemode_devgui_emp_bomb_give ) ) + { + self [[ level.zombiemode_devgui_emp_bomb_give ]](); + while ( 1 ) + { + self givemaxammo( "emp_grenade_zm" ); + wait 1; #/ + } + } } zombie_devgui_invulnerable( playerindex, onoff ) { /# - players = get_players(); - - if ( !isdefined( playerindex ) ) - { - for ( i = 0; i < players.size; i++ ) - zombie_devgui_invulnerable( i, onoff ); - } - else if ( players.size > playerindex ) - { - if ( onoff ) - players[playerindex] enableinvulnerability(); - else - players[playerindex] disableinvulnerability(); - } + players = get_players(); + if ( !isDefined( playerindex ) ) + { + i = 0; + while ( i < players.size ) + { + zombie_devgui_invulnerable( i, onoff ); + i++; + } + } + else if ( players.size > playerindex ) + { + if ( onoff ) + { + players[ playerindex ] enableinvulnerability(); + return; + } + else + { + players[ playerindex ] disableinvulnerability(); #/ + } + } } zombie_devgui_kill() { /# - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - self disableinvulnerability(); - death_from = ( randomfloatrange( -20, 20 ), randomfloatrange( -20, 20 ), randomfloatrange( -20, 20 ) ); - self dodamage( self.health + 666, self.origin + death_from ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + self disableinvulnerability(); + death_from = ( randomfloatrange( -20, 20 ), randomfloatrange( -20, 20 ), randomfloatrange( -20, 20 ) ); + self dodamage( self.health + 666, self.origin + death_from ); #/ } zombie_devgui_toggle_ammo() { /# - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - self notify( "devgui_toggle_ammo" ); - self endon( "devgui_toggle_ammo" ); - self.ammo4evah = !is_true( self.ammo4evah ); - - while ( isdefined( self ) && self.ammo4evah ) - { - weapon = self getcurrentweapon(); - - if ( weapon != "none" ) - { - self setweaponoverheating( 0, 0 ); - max = weaponmaxammo( weapon ); - - if ( isdefined( max ) ) - self setweaponammostock( weapon, max ); - - if ( isdefined( self get_player_tactical_grenade() ) ) - self givemaxammo( self get_player_tactical_grenade() ); - - if ( isdefined( self get_player_lethal_grenade() ) ) - self givemaxammo( self get_player_lethal_grenade() ); - } - - wait 1; - } + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + self notify( "devgui_toggle_ammo" ); + self endon( "devgui_toggle_ammo" ); + self.ammo4evah = !is_true( self.ammo4evah ); + while ( isDefined( self ) && self.ammo4evah ) + { + weapon = self getcurrentweapon(); + if ( weapon != "none" ) + { + self setweaponoverheating( 0, 0 ); + max = weaponmaxammo( weapon ); + if ( isDefined( max ) ) + { + self setweaponammostock( weapon, max ); + } + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self givemaxammo( self get_player_tactical_grenade() ); + } + if ( isDefined( self get_player_lethal_grenade() ) ) + { + self givemaxammo( self get_player_lethal_grenade() ); + } + } + wait 1; #/ + } } zombie_devgui_toggle_ignore() { /# - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - self.ignoreme = !self.ignoreme; - - if ( self.ignoreme ) - setdvar( "ai_showFailedPaths", 0 ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + self.ignoreme = !self.ignoreme; + if ( self.ignoreme ) + { + setdvar( "ai_showFailedPaths", 0 ); #/ + } } zombie_devgui_revive() { /# - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - self reviveplayer(); - self notify( "stop_revive_trigger" ); - - if ( isdefined( self.revivetrigger ) ) - { - self.revivetrigger delete(); - self.revivetrigger = undefined; - } - - self allowjump( 1 ); - self.ignoreme = 0; - self.laststand = undefined; - self notify( "player_revived", self ); + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + self reviveplayer(); + self notify( "stop_revive_trigger" ); + if ( isDefined( self.revivetrigger ) ) + { + self.revivetrigger delete(); + self.revivetrigger = undefined; + } + self allowjump( 1 ); + self.ignoreme = 0; + self.laststand = undefined; + self notify( "player_revived" ); #/ } zombie_devgui_give_health() { /# - assert( isdefined( self ) ); - assert( isplayer( self ) ); - assert( isalive( self ) ); - self notify( "devgui_health" ); - self endon( "devgui_health" ); - self endon( "disconnect" ); - self endon( "death" ); - level.devcheater = 1; - - while ( true ) - { - self.maxhealth = 100000; - self.health = 100000; - self waittill_any( "player_revived", "perk_used", "spawned_player" ); - wait 2; - } + assert( isDefined( self ) ); + assert( isplayer( self ) ); + assert( isalive( self ) ); + self notify( "devgui_health" ); + self endon( "devgui_health" ); + self endon( "disconnect" ); + self endon( "death" ); + level.devcheater = 1; + while ( 1 ) + { + self.maxhealth = 100000; + self.health = 100000; + self waittill_any( "player_revived", "perk_used", "spawned_player" ); + wait 2; #/ + } } zombie_devgui_give_perk( perk ) { /# - vending_triggers = getentarray( "zombie_vending", "targetname" ); - player = get_players()[0]; - level.devcheater = 1; - - if ( vending_triggers.size < 1 ) - return; - - for ( i = 0; i < vending_triggers.size; i++ ) - { - if ( vending_triggers[i].script_noteworthy == perk ) - { - vending_triggers[i] notify( "trigger", player ); - return; - } - } + vending_triggers = getentarray( "zombie_vending", "targetname" ); + player = get_players()[ 0 ]; + level.devcheater = 1; + if ( vending_triggers.size < 1 ) + { + return; + } + i = 0; + while ( i < vending_triggers.size ) + { + if ( vending_triggers[ i ].script_noteworthy == perk ) + { + vending_triggers[ i ] notify( "trigger" ); + return; + } + i++; #/ + } } zombie_devgui_give_powerup( powerup_name, now, origin ) { /# - player = get_players()[0]; - found = 0; - level.devcheater = 1; - - for ( i = 0; i < level.zombie_powerup_array.size; i++ ) - { - if ( level.zombie_powerup_array[i] == powerup_name ) - { - level.zombie_powerup_index = i; - found = 1; - break; - } - } - - if ( !found ) - return; - - direction = player getplayerangles(); - direction_vec = anglestoforward( direction ); - eye = player geteye(); - scale = 8000; - direction_vec = ( direction_vec[0] * scale, direction_vec[1] * scale, direction_vec[2] * scale ); - trace = bullettrace( eye, eye + direction_vec, 0, undefined ); - level.zombie_devgui_power = 1; - level.zombie_vars["zombie_drop_item"] = 1; - level.powerup_drop_count = 0; - - if ( isdefined( origin ) ) - level thread maps\mp\zombies\_zm_powerups::powerup_drop( origin ); - else if ( !isdefined( now ) || now ) - level thread maps\mp\zombies\_zm_powerups::powerup_drop( trace["position"] ); + player = get_players()[ 0 ]; + found = 0; + level.devcheater = 1; + i = 0; + while ( i < level.zombie_powerup_array.size ) + { + if ( level.zombie_powerup_array[ i ] == powerup_name ) + { + level.zombie_powerup_index = i; + found = 1; + break; + } + else + { + i++; + } + } + if ( !found ) + { + return; + } + direction = player getplayerangles(); + direction_vec = anglesToForward( direction ); + eye = player geteye(); + scale = 8000; + direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale ); + trace = bullettrace( eye, eye + direction_vec, 0, undefined ); + level.zombie_devgui_power = 1; + level.zombie_vars[ "zombie_drop_item" ] = 1; + level.powerup_drop_count = 0; + if ( isDefined( origin ) ) + { + level thread maps/mp/zombies/_zm_powerups::powerup_drop( origin ); + } + else + { + if ( !isDefined( now ) || now ) + { + level thread maps/mp/zombies/_zm_powerups::powerup_drop( trace[ "position" ] ); #/ + } + } } zombie_devgui_goto_round( target_round ) { /# - player = get_players()[0]; - - if ( target_round < 1 ) - target_round = 1; - - level.devcheater = 1; - level.zombie_total = 0; - maps\mp\zombies\_zm::ai_calculate_health( target_round ); - level.round_number = target_round - 1; - level notify( "kill_round" ); - wait 1; - zombies = get_round_enemy_array(); - - if ( isdefined( zombies ) ) - { - for ( i = 0; i < zombies.size; i++ ) - { - if ( is_true( zombies[i].ignore_devgui_death ) ) - continue; - - zombies[i] dodamage( zombies[i].health + 666, zombies[i].origin ); - } - } + player = get_players()[ 0 ]; + if ( target_round < 1 ) + { + target_round = 1; + } + level.devcheater = 1; + level.zombie_total = 0; + maps/mp/zombies/_zm::ai_calculate_health( target_round ); + level.round_number = target_round - 1; + level notify( "kill_round" ); + wait 1; + zombies = get_round_enemy_array(); + while ( isDefined( zombies ) ) + { + i = 0; + while ( i < zombies.size ) + { + if ( is_true( zombies[ i ].ignore_devgui_death ) ) + { + i++; + continue; + } + else + { + zombies[ i ] dodamage( zombies[ i ].health + 666, zombies[ i ].origin ); + } + i++; #/ + } + } } zombie_devgui_monkey_round() { /# - if ( isdefined( level.next_monkey_round ) ) - zombie_devgui_goto_round( level.next_monkey_round ); + if ( isDefined( level.next_monkey_round ) ) + { + zombie_devgui_goto_round( level.next_monkey_round ); #/ + } } zombie_devgui_thief_round() { /# - if ( isdefined( level.next_thief_round ) ) - zombie_devgui_goto_round( level.next_thief_round ); + if ( isDefined( level.next_thief_round ) ) + { + zombie_devgui_goto_round( level.next_thief_round ); #/ + } } zombie_devgui_dog_round( num_dogs ) { /# - if ( !isdefined( level.dogs_enabled ) || !level.dogs_enabled ) - return; - - if ( !isdefined( level.dog_rounds_enabled ) || !level.dog_rounds_enabled ) - return; - - if ( !isdefined( level.enemy_dog_spawns ) || level.enemy_dog_spawns.size < 1 ) - return; - - if ( !flag( "dog_round" ) ) - setdvar( "force_dogs", num_dogs ); - else - { - - } - - zombie_devgui_goto_round( level.round_number + 1 ); + if ( !isDefined( level.dogs_enabled ) || !level.dogs_enabled ) + { + return; + } + if ( !isDefined( level.dog_rounds_enabled ) || !level.dog_rounds_enabled ) + { + return; + } + if ( !isDefined( level.enemy_dog_spawns ) || level.enemy_dog_spawns.size < 1 ) + { + return; + } + if ( !flag( "dog_round" ) ) + { + setdvar( "force_dogs", num_dogs ); + } + zombie_devgui_goto_round( level.round_number + 1 ); #/ } zombie_devgui_dog_round_skip() { /# - if ( isdefined( level.next_dog_round ) ) - zombie_devgui_goto_round( level.next_dog_round ); + if ( isDefined( level.next_dog_round ) ) + { + zombie_devgui_goto_round( level.next_dog_round ); #/ + } } zombie_devgui_dump_zombie_vars() { /# - if ( !isdefined( level.zombie_vars ) ) - return; - - if ( level.zombie_vars.size > 0 ) - println( "#### Zombie Variables ####" ); - else - return; - - var_names = getarraykeys( level.zombie_vars ); - - for ( i = 0; i < level.zombie_vars.size; i++ ) - { - key = var_names[i]; - println( key + ": " + level.zombie_vars[key] ); - } - - println( "##### End Zombie Variables #####" ); + if ( !isDefined( level.zombie_vars ) ) + { + return; + } + if ( level.zombie_vars.size > 0 ) + { + println( "#### Zombie Variables ####" ); + } + else + { + return; + } + var_names = getarraykeys( level.zombie_vars ); + i = 0; + while ( i < level.zombie_vars.size ) + { + key = var_names[ i ]; + println( ( key + ": " ) + level.zombie_vars[ key ] ); + i++; + } + println( "##### End Zombie Variables #####" ); #/ } zombie_devgui_pack_current_weapon() { /# - players = get_players(); - reviver = players[0]; - level.devcheater = 1; - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - weap = maps\mp\zombies\_zm_weapons::get_base_name( players[i] getcurrentweapon() ); - weapon = get_upgrade( weap ); - - if ( isdefined( weapon ) ) - { - players[i] takeweapon( weap ); - players[i] giveweapon( weapon, 0, players[i] maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( weapon ) ); - players[i] givestartammo( weapon ); - players[i] switchtoweapon( weapon ); - } - } - } + players = get_players(); + reviver = players[ 0 ]; + level.devcheater = 1; + i = 0; + while ( i < players.size ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + weap = maps/mp/zombies/_zm_weapons::get_base_name( players[ i ] getcurrentweapon() ); + weapon = get_upgrade( weap ); + if ( isDefined( weapon ) ) + { + players[ i ] takeweapon( weap ); + players[ i ] giveweapon( weapon, 0, players[ i ] maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( weapon ) ); + players[ i ] givestartammo( weapon ); + players[ i ] switchtoweapon( weapon ); + } + } + i++; #/ + } } zombie_devgui_unpack_current_weapon() { /# - players = get_players(); - reviver = players[0]; - level.devcheater = 1; - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - weap = players[i] getcurrentweapon(); - weapon = maps\mp\zombies\_zm_weapons::get_base_weapon_name( weap, 1 ); - - if ( isdefined( weapon ) ) - { - players[i] takeweapon( weap ); - players[i] giveweapon( weapon, 0, players[i] maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( weapon ) ); - players[i] givestartammo( weapon ); - players[i] switchtoweapon( weapon ); - } - } - } + players = get_players(); + reviver = players[ 0 ]; + level.devcheater = 1; + i = 0; + while ( i < players.size ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + weap = players[ i ] getcurrentweapon(); + weapon = maps/mp/zombies/_zm_weapons::get_base_weapon_name( weap, 1 ); + if ( isDefined( weapon ) ) + { + players[ i ] takeweapon( weap ); + players[ i ] giveweapon( weapon, 0, players[ i ] maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( weapon ) ); + players[ i ] givestartammo( weapon ); + players[ i ] switchtoweapon( weapon ); + } + } + i++; #/ + } } zombie_devgui_reopt_current_weapon() { /# - players = get_players(); - reviver = players[0]; - level.devcheater = 1; - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - weap = players[i] getcurrentweapon(); - weapon = weap; - - if ( isdefined( weapon ) ) - { - if ( isdefined( players[i].pack_a_punch_weapon_options ) ) - players[i].pack_a_punch_weapon_options[weapon] = undefined; - - players[i] takeweapon( weap ); - players[i] giveweapon( weapon, 0, players[i] maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( weapon ) ); - players[i] givestartammo( weapon ); - players[i] switchtoweapon( weapon ); - } - } - } + players = get_players(); + reviver = players[ 0 ]; + level.devcheater = 1; + i = 0; + while ( i < players.size ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + weap = players[ i ] getcurrentweapon(); + weapon = weap; + if ( isDefined( weapon ) ) + { + if ( isDefined( players[ i ].pack_a_punch_weapon_options ) ) + { + } + players[ i ] takeweapon( weap ); + players[ i ] giveweapon( weapon, 0, players[ i ] maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( weapon ) ); + players[ i ] givestartammo( weapon ); + players[ i ] switchtoweapon( weapon ); + } + } + i++; #/ + } } zombie_devgui_take_weapon() { /# - players = get_players(); - reviver = players[0]; - level.devcheater = 1; - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - weap = players[i] getcurrentweapon(); - weapon = weap; - - if ( isdefined( weapon ) ) - { - players[i] takeweapon( weap ); - players[i] switch_back_primary_weapon( undefined ); - } - } - } + players = get_players(); + reviver = players[ 0 ]; + level.devcheater = 1; + i = 0; + while ( i < players.size ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + weap = players[ i ] getcurrentweapon(); + weapon = weap; + if ( isDefined( weapon ) ) + { + players[ i ] takeweapon( weap ); + players[ i ] switch_back_primary_weapon( undefined ); + } + } + i++; #/ + } } zombie_devgui_take_weapons( give_fallback ) { /# - players = get_players(); - reviver = players[0]; - level.devcheater = 1; - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - players[i] takeallweapons(); - - if ( give_fallback ) - players[i] give_fallback_weapon(); - } - } + players = get_players(); + reviver = players[ 0 ]; + level.devcheater = 1; + i = 0; + while ( i < players.size ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + players[ i ] takeallweapons(); + if ( give_fallback ) + { + players[ i ] give_fallback_weapon(); + } + } + i++; #/ + } } get_upgrade( weaponname ) { /# - if ( isdefined( level.zombie_weapons[weaponname] ) && isdefined( level.zombie_weapons[weaponname].upgrade_name ) ) - return maps\mp\zombies\_zm_weapons::get_upgrade_weapon( weaponname, 0 ); - else - return maps\mp\zombies\_zm_weapons::get_upgrade_weapon( weaponname, 1 ); + if ( isDefined( level.zombie_weapons[ weaponname ] ) && isDefined( level.zombie_weapons[ weaponname ].upgrade_name ) ) + { + return maps/mp/zombies/_zm_weapons::get_upgrade_weapon( weaponname, 0 ); + } + else + { + return maps/mp/zombies/_zm_weapons::get_upgrade_weapon( weaponname, 1 ); #/ + } } zombie_devgui_director_easy() { /# - if ( isdefined( level.director_devgui_health ) ) - [[ level.director_devgui_health ]](); + if ( isDefined( level.director_devgui_health ) ) + { + [[ level.director_devgui_health ]](); #/ + } } zombie_devgui_chest_never_move() { /# - level notify( "devgui_chest_end_monitor" ); - level endon( "devgui_chest_end_monitor" ); - - for (;;) - { - level.chest_accessed = 0; - wait 5; - } + level notify( "devgui_chest_end_monitor" ); + level endon( "devgui_chest_end_monitor" ); + for ( ;; ) + { + level.chest_accessed = 0; + wait 5; #/ + } } zombie_devgui_disable_kill_thread_toggle() { /# - if ( !is_true( level.disable_kill_thread ) ) - level.disable_kill_thread = 1; - else - level.disable_kill_thread = 0; + if ( !is_true( level.disable_kill_thread ) ) + { + level.disable_kill_thread = 1; + } + else + { + level.disable_kill_thread = 0; #/ + } } zombie_devgui_check_kill_thread_every_frame_toggle() { /# - if ( !is_true( level.check_kill_thread_every_frame ) ) - level.check_kill_thread_every_frame = 1; - else - level.check_kill_thread_every_frame = 0; + if ( !is_true( level.check_kill_thread_every_frame ) ) + { + level.check_kill_thread_every_frame = 1; + } + else + { + level.check_kill_thread_every_frame = 0; #/ + } } zombie_devgui_kill_thread_test_mode_toggle() { /# - if ( !is_true( level.kill_thread_test_mode ) ) - level.kill_thread_test_mode = 1; - else - level.kill_thread_test_mode = 0; + if ( !is_true( level.kill_thread_test_mode ) ) + { + level.kill_thread_test_mode = 1; + } + else + { + level.kill_thread_test_mode = 0; #/ + } } showonespawnpoint( spawn_point, color, notification, height, print ) { /# - if ( !isdefined( height ) || height <= 0 ) - height = get_player_height(); - - if ( !isdefined( print ) ) - print = spawn_point.classname; - - center = spawn_point.origin; - forward = anglestoforward( spawn_point.angles ); - right = anglestoright( spawn_point.angles ); - forward = vectorscale( forward, 16 ); - right = vectorscale( right, 16 ); - a = center + forward - right; - b = center + forward + right; - c = center - forward + right; - d = center - forward - right; - thread lineuntilnotified( a, b, color, 0, notification ); - thread lineuntilnotified( b, c, color, 0, notification ); - thread lineuntilnotified( c, d, color, 0, notification ); - thread lineuntilnotified( d, a, color, 0, notification ); - thread lineuntilnotified( a, a + ( 0, 0, height ), color, 0, notification ); - thread lineuntilnotified( b, b + ( 0, 0, height ), color, 0, notification ); - thread lineuntilnotified( c, c + ( 0, 0, height ), color, 0, notification ); - thread lineuntilnotified( d, d + ( 0, 0, height ), color, 0, notification ); - a += ( 0, 0, height ); - b += ( 0, 0, height ); - c += ( 0, 0, height ); - d += ( 0, 0, height ); - thread lineuntilnotified( a, b, color, 0, notification ); - thread lineuntilnotified( b, c, color, 0, notification ); - thread lineuntilnotified( c, d, color, 0, notification ); - thread lineuntilnotified( d, a, color, 0, notification ); - center += ( 0, 0, height / 2 ); - arrow_forward = anglestoforward( spawn_point.angles ); - arrowhead_forward = anglestoforward( spawn_point.angles ); - arrowhead_right = anglestoright( spawn_point.angles ); - arrow_forward = vectorscale( arrow_forward, 32 ); - arrowhead_forward = vectorscale( arrowhead_forward, 24 ); - arrowhead_right = vectorscale( arrowhead_right, 8 ); - a = center + arrow_forward; - b = center + arrowhead_forward - arrowhead_right; - c = center + arrowhead_forward + arrowhead_right; - thread lineuntilnotified( center, a, color, 0, notification ); - thread lineuntilnotified( a, b, color, 0, notification ); - thread lineuntilnotified( a, c, color, 0, notification ); - thread print3duntilnotified( spawn_point.origin + ( 0, 0, height ), print, color, 1, 1, notification ); - return; + if ( !isDefined( height ) || height <= 0 ) + { + height = get_player_height(); + } + if ( !isDefined( print ) ) + { + print = spawn_point.classname; + } + center = spawn_point.origin; + forward = anglesToForward( spawn_point.angles ); + right = anglesToRight( spawn_point.angles ); + forward = vectorScale( forward, 16 ); + right = vectorScale( right, 16 ); + a = ( center + forward ) - right; + b = center + forward + right; + c = ( center - forward ) + right; + d = center - forward - right; + thread lineuntilnotified( a, b, color, 0, notification ); + thread lineuntilnotified( b, c, color, 0, notification ); + thread lineuntilnotified( c, d, color, 0, notification ); + thread lineuntilnotified( d, a, color, 0, notification ); + thread lineuntilnotified( a, a + ( 0, 0, height ), color, 0, notification ); + thread lineuntilnotified( b, b + ( 0, 0, height ), color, 0, notification ); + thread lineuntilnotified( c, c + ( 0, 0, height ), color, 0, notification ); + thread lineuntilnotified( d, d + ( 0, 0, height ), color, 0, notification ); + a += ( 0, 0, height ); + b += ( 0, 0, height ); + c += ( 0, 0, height ); + d += ( 0, 0, height ); + thread lineuntilnotified( a, b, color, 0, notification ); + thread lineuntilnotified( b, c, color, 0, notification ); + thread lineuntilnotified( c, d, color, 0, notification ); + thread lineuntilnotified( d, a, color, 0, notification ); + center += ( 0, 0, height / 2 ); + arrow_forward = anglesToForward( spawn_point.angles ); + arrowhead_forward = anglesToForward( spawn_point.angles ); + arrowhead_right = anglesToRight( spawn_point.angles ); + arrow_forward = vectorScale( arrow_forward, 32 ); + arrowhead_forward = vectorScale( arrowhead_forward, 24 ); + arrowhead_right = vectorScale( arrowhead_right, 8 ); + a = center + arrow_forward; + b = ( center + arrowhead_forward ) - arrowhead_right; + c = center + arrowhead_forward + arrowhead_right; + thread lineuntilnotified( center, a, color, 0, notification ); + thread lineuntilnotified( a, b, color, 0, notification ); + thread lineuntilnotified( a, c, color, 0, notification ); + thread print3duntilnotified( spawn_point.origin + ( 0, 0, height ), print, color, 1, 1, notification ); + return; #/ } print3duntilnotified( origin, text, color, alpha, scale, notification ) { /# - level endon( notification ); - - for (;;) - { - print3d( origin, text, color, alpha, scale ); - wait 0.05; - } + level endon( notification ); + for ( ;; ) + { + print3d( origin, text, color, alpha, scale ); + wait 0,05; #/ + } } lineuntilnotified( start, end, color, depthtest, notification ) { /# - level endon( notification ); - - for (;;) - { - line( start, end, color, depthtest ); - wait 0.05; - } + level endon( notification ); + for ( ;; ) + { + line( start, end, color, depthtest ); + wait 0,05; #/ + } } devgui_debug_hud() { /# - if ( isdefined( self get_player_lethal_grenade() ) ) - self givemaxammo( self get_player_lethal_grenade() ); - - self thread maps\mp\zombies\_zm_weap_claymore::claymore_setup(); - - if ( isdefined( level.zombiemode_time_bomb_give_func ) ) - { - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - self [[ level.zombiemode_time_bomb_give_func ]](); - } - else if ( isdefined( level.zombiemode_devgui_cymbal_monkey_give ) ) - { - if ( isdefined( self get_player_tactical_grenade() ) ) - self takeweapon( self get_player_tactical_grenade() ); - - self [[ level.zombiemode_devgui_cymbal_monkey_give ]](); - } - else if ( isdefined( self get_player_tactical_grenade() ) ) - self givemaxammo( self get_player_tactical_grenade() ); - - if ( isdefined( level.zombie_include_equipment ) && !isdefined( self get_player_equipment() ) ) - { - equipment = getarraykeys( level.zombie_include_equipment ); - - if ( isdefined( equipment[0] ) ) - self zombie_devgui_equipment_give( equipment[0] ); - } - - candidate_list = []; - - foreach ( zone in level.zones ) - { - if ( isdefined( zone.unitrigger_stubs ) ) - candidate_list = arraycombine( candidate_list, zone.unitrigger_stubs, 1, 0 ); - } - - foreach ( stub in candidate_list ) - { - if ( isdefined( stub.piece ) && isdefined( stub.piece.buildable_slot ) ) - { - if ( !isdefined( self player_get_buildable_piece( stub.piece.buildable_slot ) ) ) - self thread maps\mp\zombies\_zm_buildables::player_take_piece( stub.piece ); - } - } - - for ( i = 0; i < 10; i++ ) - { - zombie_devgui_give_powerup( "free_perk", 1, self.origin ); - wait 0.25; - } - - zombie_devgui_give_powerup( "insta_kill", 1, self.origin ); - wait 0.25; - zombie_devgui_give_powerup( "double_points", 1, self.origin ); - wait 0.25; - zombie_devgui_give_powerup( "fire_sale", 1, self.origin ); - wait 0.25; - zombie_devgui_give_powerup( "minigun", 1, self.origin ); - wait 0.25; - zombie_devgui_give_powerup( "bonfire_sale", 1, self.origin ); - wait 0.25; - self weapon_give( "tar21_upgraded_zm+gl" ); + if ( isDefined( self get_player_lethal_grenade() ) ) + { + self givemaxammo( self get_player_lethal_grenade() ); + } + self thread maps/mp/zombies/_zm_weap_claymore::claymore_setup(); + if ( isDefined( level.zombiemode_time_bomb_give_func ) ) + { + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + self [[ level.zombiemode_time_bomb_give_func ]](); + } + else if ( isDefined( level.zombiemode_devgui_cymbal_monkey_give ) ) + { + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self takeweapon( self get_player_tactical_grenade() ); + } + self [[ level.zombiemode_devgui_cymbal_monkey_give ]](); + } + else + { + if ( isDefined( self get_player_tactical_grenade() ) ) + { + self givemaxammo( self get_player_tactical_grenade() ); + } + } + if ( isDefined( level.zombie_include_equipment ) && !isDefined( self get_player_equipment() ) ) + { + equipment = getarraykeys( level.zombie_include_equipment ); + if ( isDefined( equipment[ 0 ] ) ) + { + self zombie_devgui_equipment_give( equipment[ 0 ] ); + } + } + candidate_list = []; + _a2327 = level.zones; + _k2327 = getFirstArrayKey( _a2327 ); + while ( isDefined( _k2327 ) ) + { + zone = _a2327[ _k2327 ]; + if ( isDefined( zone.unitrigger_stubs ) ) + { + candidate_list = arraycombine( candidate_list, zone.unitrigger_stubs, 1, 0 ); + } + _k2327 = getNextArrayKey( _a2327, _k2327 ); + } + _a2335 = candidate_list; + _k2335 = getFirstArrayKey( _a2335 ); + while ( isDefined( _k2335 ) ) + { + stub = _a2335[ _k2335 ]; + if ( isDefined( stub.piece ) && isDefined( stub.piece.buildable_slot ) ) + { + if ( !isDefined( self player_get_buildable_piece( stub.piece.buildable_slot ) ) ) + { + self thread maps/mp/zombies/_zm_buildables::player_take_piece( stub.piece ); + } + } + _k2335 = getNextArrayKey( _a2335, _k2335 ); + } + i = 0; + while ( i < 10 ) + { + zombie_devgui_give_powerup( "free_perk", 1, self.origin ); + wait 0,25; + i++; + } + zombie_devgui_give_powerup( "insta_kill", 1, self.origin ); + wait 0,25; + zombie_devgui_give_powerup( "double_points", 1, self.origin ); + wait 0,25; + zombie_devgui_give_powerup( "fire_sale", 1, self.origin ); + wait 0,25; + zombie_devgui_give_powerup( "minigun", 1, self.origin ); + wait 0,25; + zombie_devgui_give_powerup( "bonfire_sale", 1, self.origin ); + wait 0,25; + self weapon_give( "tar21_upgraded_zm+gl" ); #/ } diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_gasmask.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_gasmask.gsc index bdf6897..b1364d4 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_gasmask.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_gasmask.gsc @@ -1,215 +1,201 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm_laststand; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; init() { - if ( !maps\mp\zombies\_zm_equipment::is_equipment_included( "equip_gasmask_zm" ) ) - return; - - registerclientfield( "toplayer", "gasmaskoverlay", 16000, 1, "int" ); - maps\mp\zombies\_zm_equipment::register_equipment( "equip_gasmask_zm", &"ZOMBIE_EQUIP_GASMASK_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_GASMASK_HOWTO", undefined, "gasmask", ::gasmask_activation_watcher_thread ); - level.deathcard_spawn_func = ::remove_gasmask_on_player_bleedout; - precacheitem( "lower_equip_gasmask_zm" ); - onplayerconnect_callback( ::gasmask_on_player_connect ); + if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_gasmask_zm" ) ) + { + return; + } + registerclientfield( "toplayer", "gasmaskoverlay", 16000, 1, "int" ); + maps/mp/zombies/_zm_equipment::register_equipment( "equip_gasmask_zm", &"ZOMBIE_EQUIP_GASMASK_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_GASMASK_HOWTO", undefined, "gasmask", ::gasmask_activation_watcher_thread ); + level.deathcard_spawn_func = ::remove_gasmask_on_player_bleedout; + precacheitem( "lower_equip_gasmask_zm" ); + onplayerconnect_callback( ::gasmask_on_player_connect ); } gasmask_on_player_connect() { - } gasmask_removed_watcher_thread() { - self notify( "only_one_gasmask_removed_thread" ); - self endon( "only_one_gasmask_removed_thread" ); - self endon( "disconnect" ); - - self waittill( "equip_gasmask_zm_taken" ); - - if ( isdefined( level.zombiemode_gasmask_reset_player_model ) ) - { - ent_num = self.characterindex; - - if ( isdefined( self.zm_random_char ) ) - ent_num = self.zm_random_char; - - self [[ level.zombiemode_gasmask_reset_player_model ]]( ent_num ); - } - - if ( isdefined( level.zombiemode_gasmask_reset_player_viewmodel ) ) - { - ent_num = self.characterindex; - - if ( isdefined( self.zm_random_char ) ) - ent_num = self.zm_random_char; - - self [[ level.zombiemode_gasmask_reset_player_viewmodel ]]( ent_num ); - } - - self setclientfieldtoplayer( "gasmaskoverlay", 0 ); + self notify( "only_one_gasmask_removed_thread" ); + self endon( "only_one_gasmask_removed_thread" ); + self endon( "disconnect" ); + self waittill( "equip_gasmask_zm_taken" ); + if ( isDefined( level.zombiemode_gasmask_reset_player_model ) ) + { + ent_num = self.characterindex; + if ( isDefined( self.zm_random_char ) ) + { + ent_num = self.zm_random_char; + } + self [[ level.zombiemode_gasmask_reset_player_model ]]( ent_num ); + } + if ( isDefined( level.zombiemode_gasmask_reset_player_viewmodel ) ) + { + ent_num = self.characterindex; + if ( isDefined( self.zm_random_char ) ) + { + ent_num = self.zm_random_char; + } + self [[ level.zombiemode_gasmask_reset_player_viewmodel ]]( ent_num ); + } + self setclientfieldtoplayer( "gasmaskoverlay", 0 ); } gasmask_activation_watcher_thread() { - self endon( "zombified" ); - self endon( "disconnect" ); - self endon( "equip_gasmask_zm_taken" ); - self thread gasmask_removed_watcher_thread(); - self thread remove_gasmask_on_game_over(); - - if ( isdefined( level.zombiemode_gasmask_set_player_model ) ) - { - ent_num = self.characterindex; - - if ( isdefined( self.zm_random_char ) ) - ent_num = self.zm_random_char; - - self [[ level.zombiemode_gasmask_set_player_model ]]( ent_num ); - } - - if ( isdefined( level.zombiemode_gasmask_set_player_viewmodel ) ) - { - ent_num = self.characterindex; - - if ( isdefined( self.zm_random_char ) ) - ent_num = self.zm_random_char; - - self [[ level.zombiemode_gasmask_set_player_viewmodel ]]( ent_num ); - } - - while ( true ) - { - self waittill_either( "equip_gasmask_zm_activate", "equip_gasmask_zm_deactivate" ); - - if ( self maps\mp\zombies\_zm_equipment::is_equipment_active( "equip_gasmask_zm" ) ) - { - self increment_is_drinking(); - self setactionslot( 1, "" ); - - if ( isdefined( level.zombiemode_gasmask_set_player_model ) ) - { - ent_num = self.characterindex; - - if ( isdefined( self.zm_random_char ) ) - ent_num = self.zm_random_char; - - self [[ level.zombiemode_gasmask_change_player_headmodel ]]( ent_num, 1 ); - } - - clientnotify( "gmsk2" ); - - self waittill( "weapon_change_complete" ); - - self setclientfieldtoplayer( "gasmaskoverlay", 1 ); - } - else - { - self increment_is_drinking(); - self setactionslot( 1, "" ); - - if ( isdefined( level.zombiemode_gasmask_set_player_model ) ) - { - ent_num = self.characterindex; - - if ( isdefined( self.zm_random_char ) ) - ent_num = self.zm_random_char; - - self [[ level.zombiemode_gasmask_change_player_headmodel ]]( ent_num, 0 ); - } - - self takeweapon( "equip_gasmask_zm" ); - self giveweapon( "lower_equip_gasmask_zm" ); - self switchtoweapon( "lower_equip_gasmask_zm" ); - wait 0.05; - self setclientfieldtoplayer( "gasmaskoverlay", 0 ); - - self waittill( "weapon_change_complete" ); - - self takeweapon( "lower_equip_gasmask_zm" ); - self giveweapon( "equip_gasmask_zm" ); - } - - if ( !self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - if ( self is_multiple_drinking() ) - { - self decrement_is_drinking(); - self setactionslot( 1, "weapon", "equip_gasmask_zm" ); - self notify( "equipment_select_response_done" ); - continue; - } - else if ( isdefined( self.prev_weapon_before_equipment_change ) && self hasweapon( self.prev_weapon_before_equipment_change ) ) - { - if ( self.prev_weapon_before_equipment_change != self getcurrentweapon() ) - { - self switchtoweapon( self.prev_weapon_before_equipment_change ); - - self waittill( "weapon_change_complete" ); - } - } - else - { - primaryweapons = self getweaponslistprimaries(); - - if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) - { - if ( primaryweapons[0] != self getcurrentweapon() ) - { - self switchtoweapon( primaryweapons[0] ); - - self waittill( "weapon_change_complete" ); - } - } - else - self switchtoweapon( get_player_melee_weapon() ); - } - } - - self setactionslot( 1, "weapon", "equip_gasmask_zm" ); - - if ( !self maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( isdefined( self.intermission ) && self.intermission ) ) - self decrement_is_drinking(); - - self notify( "equipment_select_response_done" ); - } + self endon( "zombified" ); + self endon( "disconnect" ); + self endon( "equip_gasmask_zm_taken" ); + self thread gasmask_removed_watcher_thread(); + self thread remove_gasmask_on_game_over(); + if ( isDefined( level.zombiemode_gasmask_set_player_model ) ) + { + ent_num = self.characterindex; + if ( isDefined( self.zm_random_char ) ) + { + ent_num = self.zm_random_char; + } + self [[ level.zombiemode_gasmask_set_player_model ]]( ent_num ); + } + if ( isDefined( level.zombiemode_gasmask_set_player_viewmodel ) ) + { + ent_num = self.characterindex; + if ( isDefined( self.zm_random_char ) ) + { + ent_num = self.zm_random_char; + } + self [[ level.zombiemode_gasmask_set_player_viewmodel ]]( ent_num ); + } + for ( ;; ) + { + while ( 1 ) + { + self waittill_either( "equip_gasmask_zm_activate", "equip_gasmask_zm_deactivate" ); + if ( self maps/mp/zombies/_zm_equipment::is_equipment_active( "equip_gasmask_zm" ) ) + { + self increment_is_drinking(); + self setactionslot( 1, "" ); + if ( isDefined( level.zombiemode_gasmask_set_player_model ) ) + { + ent_num = self.characterindex; + if ( isDefined( self.zm_random_char ) ) + { + ent_num = self.zm_random_char; + } + self [[ level.zombiemode_gasmask_change_player_headmodel ]]( ent_num, 1 ); + } + clientnotify( "gmsk2" ); + self waittill( "weapon_change_complete" ); + self setclientfieldtoplayer( "gasmaskoverlay", 1 ); + } + else + { + self increment_is_drinking(); + self setactionslot( 1, "" ); + if ( isDefined( level.zombiemode_gasmask_set_player_model ) ) + { + ent_num = self.characterindex; + if ( isDefined( self.zm_random_char ) ) + { + ent_num = self.zm_random_char; + } + self [[ level.zombiemode_gasmask_change_player_headmodel ]]( ent_num, 0 ); + } + self takeweapon( "equip_gasmask_zm" ); + self giveweapon( "lower_equip_gasmask_zm" ); + self switchtoweapon( "lower_equip_gasmask_zm" ); + wait 0.05; + self setclientfieldtoplayer( "gasmaskoverlay", 0 ); + self waittill( "weapon_change_complete" ); + self takeweapon( "lower_equip_gasmask_zm" ); + self giveweapon( "equip_gasmask_zm" ); + } + if ( !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + if ( self is_multiple_drinking() ) + { + self decrement_is_drinking(); + self setactionslot( 1, "weapon", "equip_gasmask_zm" ); + self notify( "equipment_select_response_done" ); + } + } + else if ( isDefined( self.prev_weapon_before_equipment_change ) && self hasweapon( self.prev_weapon_before_equipment_change ) ) + { + if ( self.prev_weapon_before_equipment_change != self getcurrentweapon() ) + { + self switchtoweapon( self.prev_weapon_before_equipment_change ); + self waittill( "weapon_change_complete" ); + } + break; + } + else + { + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) + { + if ( primaryweapons[ 0 ] != self getcurrentweapon() ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + self waittill( "weapon_change_complete" ); + } + break; + } + else + { + self switchtoweapon( get_player_melee_weapon() ); + } + } + } + self setactionslot( 1, "weapon", "equip_gasmask_zm" ); + if ( !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() && isDefined( self.intermission ) && !self.intermission ) + { + self decrement_is_drinking(); + } + self notify( "equipment_select_response_done" ); + } } remove_gasmask_on_player_bleedout() { - self setclientfieldtoplayer( "gasmaskoverlay", 0 ); - wait_network_frame(); - wait_network_frame(); - self setclientfieldtoplayer( "gasmaskoverlay", 1 ); + self setclientfieldtoplayer( "gasmaskoverlay", 0 ); + wait_network_frame(); + wait_network_frame(); + self setclientfieldtoplayer( "gasmaskoverlay", 1 ); } remove_gasmask_on_game_over() { - self endon( "equip_gasmask_zm_taken" ); - - level waittill( "pre_end_game" ); - - self setclientfieldtoplayer( "gasmaskoverlay", 0 ); + self endon( "equip_gasmask_zm_taken" ); + level waittill( "pre_end_game" ); + self setclientfieldtoplayer( "gasmaskoverlay", 0 ); } gasmask_active() { - return self maps\mp\zombies\_zm_equipment::is_equipment_active( "equip_gasmask_zm" ); + return self maps/mp/zombies/_zm_equipment::is_equipment_active( "equip_gasmask_zm" ); } gasmask_debug_print( msg, color ) { +/* /# - if ( !getdvarint( _hash_4D1BCA99 ) ) - return; - - if ( !isdefined( color ) ) - color = ( 1, 1, 1 ); - - print3d( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), msg, color, 1, 1, 40 ); + if ( !getDvarInt( #"4D1BCA99" ) ) + { + return; + } + if ( !isDefined( color ) ) + { + color = ( 0, 0, 1 ); + } + print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 ); #/ +*/ } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_hacker.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_hacker.gsc index d398dfe..29bb3d6 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_hacker.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_hacker.gsc @@ -1,811 +1,915 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_equip_hacker; +#include maps/mp/zombies/_zm_equip_hacker; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; init() { - if ( !maps\mp\zombies\_zm_equipment::is_equipment_included( "equip_hacker_zm" ) ) - return; - - maps\mp\zombies\_zm_equipment::register_equipment( "equip_hacker_zm", &"ZOMBIE_EQUIP_HACKER_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_HACKER_HOWTO", undefined, "hacker" ); - level._hackable_objects = []; - level._pooled_hackable_objects = []; - onplayerconnect_callback( ::hacker_on_player_connect ); - level thread hack_trigger_think(); - level thread hacker_trigger_pool_think(); - level thread hacker_round_reward(); - - if ( getdvarint( _hash_53BD7080 ) == 1 ) - level thread hacker_debug(); + if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_hacker_zm" ) ) + { + return; + } + maps/mp/zombies/_zm_equipment::register_equipment( "equip_hacker_zm", &"ZOMBIE_EQUIP_HACKER_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_HACKER_HOWTO", undefined, "hacker" ); + level._hackable_objects = []; + level._pooled_hackable_objects = []; + onplayerconnect_callback( ::hacker_on_player_connect ); + level thread hack_trigger_think(); + level thread hacker_trigger_pool_think(); + level thread hacker_round_reward(); + /* + if ( getDvarInt( #"53BD7080" ) == 1 ) + { + level thread hacker_debug(); + } + */ } hacker_round_reward() { - while ( true ) - { - level waittill( "end_of_round" ); - - if ( !isdefined( level._from_nml ) ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( players[i] get_player_equipment() ) && players[i] get_player_equipment() == "equip_hacker_zm" ) - { - if ( isdefined( players[i].equipment_got_in_round["equip_hacker_zm"] ) ) - { - got_in_round = players[i].equipment_got_in_round["equip_hacker_zm"]; - rounds_kept = level.round_number - got_in_round; - rounds_kept -= 1; - - if ( rounds_kept > 0 ) - { - rounds_kept = min( rounds_kept, 5 ); - score = rounds_kept * 500; - players[i] maps\mp\zombies\_zm_score::add_to_player_score( int( score ) ); - } - } - } - } - } - else - level._from_nml = undefined; - } + while ( 1 ) + { + level waittill( "end_of_round" ); + if ( !isDefined( level._from_nml ) ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( isDefined( players[ i ] get_player_equipment() ) && players[ i ] get_player_equipment() == "equip_hacker_zm" ) + { + if ( isDefined( players[ i ].equipment_got_in_round[ "equip_hacker_zm" ] ) ) + { + got_in_round = players[ i ].equipment_got_in_round[ "equip_hacker_zm" ]; + rounds_kept = level.round_number - got_in_round; + rounds_kept -= 1; + if ( rounds_kept > 0 ) + { + rounds_kept = min( rounds_kept, 5 ); + score = rounds_kept * 500; + players[ i ] maps/mp/zombies/_zm_score::add_to_player_score( int( score ) ); + } + } + } + i++; + } + } + else level._from_nml = undefined; + } } hacker_debug() { - while ( true ) - { - for ( i = 0; i < level._hackable_objects.size; i++ ) - { - hackable = level._hackable_objects[i]; - - if ( isdefined( hackable.pooled ) && hackable.pooled ) - { - if ( isdefined( hackable._trigger ) ) - { - col = vectorscale( ( 0, 1, 0 ), 255.0 ); - - if ( isdefined( hackable.custom_debug_color ) ) - col = hackable.custom_debug_color; + while ( 1 ) + { + i = 0; + while ( i < level._hackable_objects.size ) + { + hackable = level._hackable_objects[ i ]; + if ( isDefined( hackable.pooled ) && hackable.pooled ) + { + if ( isDefined( hackable._trigger ) ) + { + col = vectorScale( ( 0, 0, 1 ), 255 ); + if ( isDefined( hackable.custom_debug_color ) ) + { + col = hackable.custom_debug_color; + } /# - print3d( hackable.origin, "+", col, 1, 1 ); + print3d( hackable.origin, "+", col, 1, 1 ); #/ - } - else - { + } + else + { /# - print3d( hackable.origin, "+", vectorscale( ( 0, 0, 1 ), 255.0 ), 1, 1 ); + print3d( hackable.origin, "+", vectorScale( ( 0, 0, 1 ), 255 ), 1, 1 ); #/ - } - - continue; - } + } + i++; + continue; + } + else + { /# - print3d( hackable.origin, "+", vectorscale( ( 1, 0, 0 ), 255.0 ), 1, 1 ); + print3d( hackable.origin, "+", vectorScale( ( 0, 0, 1 ), 255 ), 1, 1 ); #/ - } - - wait 0.1; - } + } + i++; + } + wait 0.1; + } } hacker_trigger_pool_think() { - if ( !isdefined( level._zombie_hacker_trigger_pool_size ) ) - level._zombie_hacker_trigger_pool_size = 8; - - pool_active = 0; - level._hacker_pool = []; - - while ( true ) - { - if ( pool_active ) - { - if ( !any_hackers_active() ) - destroy_pooled_items(); - else - { - sweep_pooled_items(); - add_eligable_pooled_items(); - } - } - else if ( any_hackers_active() ) - pool_active = 1; - - wait 0.1; - } + if ( !isDefined( level._zombie_hacker_trigger_pool_size ) ) + { + level._zombie_hacker_trigger_pool_size = 8; + } + pool_active = 0; + level._hacker_pool = []; + while ( 1 ) + { + if ( pool_active ) + { + if ( !any_hackers_active() ) + { + destroy_pooled_items(); + } + else + { + sweep_pooled_items(); + add_eligable_pooled_items(); + } + } + else + { + if ( any_hackers_active() ) + { + pool_active = 1; + } + } + wait 0.1; + } } destroy_pooled_items() { - pool_active = 0; - - for ( i = 0; i < level._hacker_pool.size; i++ ) - { - level._hacker_pool[i]._trigger delete(); - level._hacker_pool[i]._trigger = undefined; - } - - level._hacker_pool = []; + pool_active = 0; + i = 0; + while ( i < level._hacker_pool.size ) + { + level._hacker_pool[ i ]._trigger delete(); + level._hacker_pool[ i ]._trigger = undefined; + i++; + } + level._hacker_pool = []; } sweep_pooled_items() { - new_hacker_pool = []; - - for ( i = 0; i < level._hacker_pool.size; i++ ) - { - if ( level._hacker_pool[i] should_pooled_object_exist() ) - { - new_hacker_pool[new_hacker_pool.size] = level._hacker_pool[i]; - continue; - } - - if ( isdefined( level._hacker_pool[i]._trigger ) ) - level._hacker_pool[i]._trigger delete(); - - level._hacker_pool[i]._trigger = undefined; - } - - level._hacker_pool = new_hacker_pool; + new_hacker_pool = []; + i = 0; + while ( i < level._hacker_pool.size ) + { + if ( level._hacker_pool[ i ] should_pooled_object_exist() ) + { + new_hacker_pool[ new_hacker_pool.size ] = level._hacker_pool[ i ]; + i++; + continue; + } + else + { + if ( isDefined( level._hacker_pool[ i ]._trigger ) ) + { + level._hacker_pool[ i ]._trigger delete(); + } + level._hacker_pool[ i ]._trigger = undefined; + } + i++; + } + level._hacker_pool = new_hacker_pool; } should_pooled_object_exist() { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] hacker_active() ) - { - if ( isdefined( self.entity ) ) - { - if ( self.entity != players[i] ) - { - if ( distance2dsquared( players[i].origin, self.entity.origin ) <= self.radius * self.radius ) - return true; - } - - continue; - } - - if ( distance2dsquared( players[i].origin, self.origin ) <= self.radius * self.radius ) - return true; - } - } - - return false; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ] hacker_active() ) + { + if ( isDefined( self.entity ) ) + { + if ( self.entity != players[ i ] ) + { + if ( distance2dsquared( players[ i ].origin, self.entity.origin ) <= ( self.radius * self.radius ) ) + { + return 1; + } + } + } + else + { + if ( distance2dsquared( players[ i ].origin, self.origin ) <= ( self.radius * self.radius ) ) + { + return 1; + } + } + } + i++; + } + return 0; } add_eligable_pooled_items() { - candidates = []; - - for ( i = 0; i < level._hackable_objects.size; i++ ) - { - hackable = level._hackable_objects[i]; - - if ( isdefined( hackable.pooled ) && hackable.pooled && !isdefined( hackable._trigger ) ) - { - if ( !isinarray( level._hacker_pool, hackable ) ) - { - if ( hackable should_pooled_object_exist() ) - candidates[candidates.size] = hackable; - } - } - } - - for ( i = 0; i < candidates.size; i++ ) - { - candidate = candidates[i]; - height = 72; - radius = 32; - - if ( isdefined( candidate.radius ) ) - radius = candidate.radius; - - if ( isdefined( candidate.height ) ) - height = candidate.height; - - trigger = spawn( "trigger_radius_use", candidate.origin, 0, radius, height ); - trigger usetriggerrequirelookat(); - trigger triggerignoreteam(); - trigger setcursorhint( "HINT_NOICON" ); - trigger.radius = radius; - trigger.height = height; - trigger.beinghacked = 0; - candidate._trigger = trigger; - level._hacker_pool[level._hacker_pool.size] = candidate; - } + candidates = []; + i = 0; + while ( i < level._hackable_objects.size ) + { + hackable = level._hackable_objects[ i ]; + if ( isDefined( hackable.pooled ) && hackable.pooled && !isDefined( hackable._trigger ) ) + { + if ( !isinarray( level._hacker_pool, hackable ) ) + { + if ( hackable should_pooled_object_exist() ) + { + candidates[ candidates.size ] = hackable; + } + } + } + i++; + } + i = 0; + while ( i < candidates.size ) + { + candidate = candidates[ i ]; + height = 72; + radius = 32; + if ( isDefined( candidate.radius ) ) + { + radius = candidate.radius; + } + if ( isDefined( candidate.height ) ) + { + height = candidate.height; + } + trigger = spawn( "trigger_radius_use", candidate.origin, 0, radius, height ); + trigger usetriggerrequirelookat(); + trigger triggerignoreteam(); + trigger setcursorhint( "HINT_NOICON" ); + trigger.radius = radius; + trigger.height = height; + trigger.beinghacked = 0; + candidate._trigger = trigger; + level._hacker_pool[ level._hacker_pool.size ] = candidate; + i++; + } } get_hackable_trigger() { - if ( isdefined( self.door ) ) - return self.door; - else if ( isdefined( self.perk ) ) - return self.perk; - else if ( isdefined( self.window ) ) - return self.window.unitrigger_stub.trigger; - else if ( isdefined( self.classname ) && getsubstr( self.classname, 0, 7 ) == "trigger_" ) - return self; + if ( isDefined( self.door ) ) + { + return self.door; + } + else + { + if ( isDefined( self.perk ) ) + { + return self.perk; + } + else + { + if ( isDefined( self.window ) ) + { + return self.window.unitrigger_stub.trigger; + } + else + { + if ( isDefined( self.classname ) && getsubstr( self.classname, 0, 7 ) == "trigger_" ) + { + return self; + } + } + } + } } any_hackers_active() { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] hacker_active() ) - return true; - } - - return false; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ] hacker_active() ) + { + return 1; + } + i++; + } + return 0; } register_hackable( name, callback_func, qualifier_func ) { - structs = getstructarray( name, "script_noteworthy" ); - - if ( !isdefined( structs ) ) - { + structs = getstructarray( name, "script_noteworthy" ); + if ( !isDefined( structs ) ) + { /# - println( "Error: register_hackable called on script_noteworthy " + name + " but no such structs exist." ); + println( "Error: register_hackable called on script_noteworthy " + name + " but no such structs exist." ); #/ - return; - } - - for ( i = 0; i < structs.size; i++ ) - { - if ( !isinarray( level._hackable_objects, structs[i] ) ) - { - structs[i]._hack_callback_func = callback_func; - structs[i]._hack_qualifier_func = qualifier_func; - structs[i].pooled = level._hacker_pooled; - - if ( isdefined( structs[i].targetname ) ) - structs[i].hacker_target = getent( structs[i].targetname, "targetname" ); - - level._hackable_objects[level._hackable_objects.size] = structs[i]; - - if ( isdefined( level._hacker_pooled ) ) - level._pooled_hackable_objects[level._pooled_hackable_objects.size] = structs[i]; - - structs[i] thread hackable_object_thread(); - wait_network_frame(); - } - } + return; + } + i = 0; + while ( i < structs.size ) + { + if ( !isinarray( level._hackable_objects, structs[ i ] ) ) + { + structs[ i ]._hack_callback_func = callback_func; + structs[ i ]._hack_qualifier_func = qualifier_func; + structs[ i ].pooled = level._hacker_pooled; + if ( isDefined( structs[ i ].targetname ) ) + { + structs[ i ].hacker_target = getent( structs[ i ].targetname, "targetname" ); + } + level._hackable_objects[ level._hackable_objects.size ] = structs[ i ]; + if ( isDefined( level._hacker_pooled ) ) + { + level._pooled_hackable_objects[ level._pooled_hackable_objects.size ] = structs[ i ]; + } + structs[ i ] thread hackable_object_thread(); + wait_network_frame(); + } + i++; + } } register_hackable_struct( struct, callback_func, qualifier_func ) { - if ( !isinarray( level._hackable_objects, struct ) ) - { - struct._hack_callback_func = callback_func; - struct._hack_qualifier_func = qualifier_func; - struct.pooled = level._hacker_pooled; - - if ( isdefined( struct.targetname ) ) - struct.hacker_target = getent( struct.targetname, "targetname" ); - - level._hackable_objects[level._hackable_objects.size] = struct; - - if ( isdefined( level._hacker_pooled ) ) - level._pooled_hackable_objects[level._pooled_hackable_objects.size] = struct; - - struct thread hackable_object_thread(); - } + if ( !isinarray( level._hackable_objects, struct ) ) + { + struct._hack_callback_func = callback_func; + struct._hack_qualifier_func = qualifier_func; + struct.pooled = level._hacker_pooled; + if ( isDefined( struct.targetname ) ) + { + struct.hacker_target = getent( struct.targetname, "targetname" ); + } + level._hackable_objects[ level._hackable_objects.size ] = struct; + if ( isDefined( level._hacker_pooled ) ) + { + level._pooled_hackable_objects[ level._pooled_hackable_objects.size ] = struct; + } + struct thread hackable_object_thread(); + } } register_pooled_hackable_struct( struct, callback_func, qualifier_func ) { - level._hacker_pooled = 1; - register_hackable_struct( struct, callback_func, qualifier_func ); - level._hacker_pooled = undefined; + level._hacker_pooled = 1; + register_hackable_struct( struct, callback_func, qualifier_func ); + level._hacker_pooled = undefined; } register_pooled_hackable( name, callback_func, qualifier_func ) { - level._hacker_pooled = 1; - register_hackable( name, callback_func, qualifier_func ); - level._hacker_pooled = undefined; + level._hacker_pooled = 1; + register_hackable( name, callback_func, qualifier_func ); + level._hacker_pooled = undefined; } deregister_hackable_struct( struct ) { - if ( isinarray( level._hackable_objects, struct ) ) - { - new_list = []; - - for ( i = 0; i < level._hackable_objects.size; i++ ) - { - if ( level._hackable_objects[i] != struct ) - { - new_list[new_list.size] = level._hackable_objects[i]; - continue; - } - - level._hackable_objects[i] notify( "hackable_deregistered" ); - - if ( isdefined( level._hackable_objects[i]._trigger ) ) - level._hackable_objects[i]._trigger delete(); - - if ( isdefined( level._hackable_objects[i].pooled ) && level._hackable_objects[i].pooled ) - { - arrayremovevalue( level._hacker_pool, level._hackable_objects[i] ); - arrayremovevalue( level._pooled_hackable_objects, level._hackable_objects[i] ); - } - } - - level._hackable_objects = new_list; - } + if ( isinarray( level._hackable_objects, struct ) ) + { + new_list = []; + i = 0; + while ( i < level._hackable_objects.size ) + { + if ( level._hackable_objects[ i ] != struct ) + { + new_list[ new_list.size ] = level._hackable_objects[ i ]; + i++; + continue; + } + else + { + level._hackable_objects[ i ] notify( "hackable_deregistered" ); + if ( isDefined( level._hackable_objects[ i ]._trigger ) ) + { + level._hackable_objects[ i ]._trigger delete(); + } + if ( isDefined( level._hackable_objects[ i ].pooled ) && level._hackable_objects[ i ].pooled ) + { + arrayremovevalue( level._hacker_pool, level._hackable_objects[ i ] ); + arrayremovevalue( level._pooled_hackable_objects, level._hackable_objects[ i ] ); + } + } + i++; + } + level._hackable_objects = new_list; + } } deregister_hackable( noteworthy ) { - new_list = []; - - for ( i = 0; i < level._hackable_objects.size; i++ ) - { - if ( !isdefined( level._hackable_objects[i].script_noteworthy ) || level._hackable_objects[i].script_noteworthy != noteworthy ) - new_list[new_list.size] = level._hackable_objects[i]; - else - { - level._hackable_objects[i] notify( "hackable_deregistered" ); - - if ( isdefined( level._hackable_objects[i]._trigger ) ) - level._hackable_objects[i]._trigger delete(); - } - - if ( isdefined( level._hackable_objects[i].pooled ) && level._hackable_objects[i].pooled ) - arrayremovevalue( level._hacker_pool, level._hackable_objects[i] ); - } - - level._hackable_objects = new_list; + new_list = []; + i = 0; + while ( i < level._hackable_objects.size ) + { + if ( !isDefined( level._hackable_objects[ i ].script_noteworthy ) || level._hackable_objects[ i ].script_noteworthy != noteworthy ) + { + new_list[ new_list.size ] = level._hackable_objects[ i ]; + } + else + { + level._hackable_objects[ i ] notify( "hackable_deregistered" ); + if ( isDefined( level._hackable_objects[ i ]._trigger ) ) + { + level._hackable_objects[ i ]._trigger delete(); + } + } + if ( isDefined( level._hackable_objects[ i ].pooled ) && level._hackable_objects[ i ].pooled ) + { + arrayremovevalue( level._hacker_pool, level._hackable_objects[ i ] ); + } + i++; + } + level._hackable_objects = new_list; } hack_trigger_think() { - while ( true ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - for ( j = 0; j < level._hackable_objects.size; j++ ) - { - hackable = level._hackable_objects[j]; - - if ( isdefined( hackable._trigger ) ) - { - qualifier_passed = 1; - - if ( isdefined( hackable._hack_qualifier_func ) ) - qualifier_passed = hackable [[ hackable._hack_qualifier_func ]]( player ); - - if ( player hacker_active() && qualifier_passed && !hackable._trigger.beinghacked ) - { - hackable._trigger setinvisibletoplayer( player, 0 ); - continue; - } - - hackable._trigger setinvisibletoplayer( player, 1 ); - } - } - } - - wait 0.1; - } + while ( 1 ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + j = 0; + while ( j < level._hackable_objects.size ) + { + hackable = level._hackable_objects[ j ]; + if ( isDefined( hackable._trigger ) ) + { + qualifier_passed = 1; + if ( isDefined( hackable._hack_qualifier_func ) ) + { + qualifier_passed = hackable [[ hackable._hack_qualifier_func ]]( player ); + } + if ( player hacker_active() && qualifier_passed && !hackable._trigger.beinghacked ) + { + hackable._trigger setinvisibletoplayer( player, 0 ); + j++; + continue; + } + else + { + hackable._trigger setinvisibletoplayer( player, 1 ); + } + } + j++; + } + i++; + } + wait 0.1; + } } is_facing( facee ) { - orientation = self getplayerangles(); - forwardvec = anglestoforward( orientation ); - forwardvec2d = ( forwardvec[0], forwardvec[1], 0 ); - unitforwardvec2d = vectornormalize( forwardvec2d ); - tofaceevec = facee.origin - self.origin; - tofaceevec2d = ( tofaceevec[0], tofaceevec[1], 0 ); - unittofaceevec2d = vectornormalize( tofaceevec2d ); - dotproduct = vectordot( unitforwardvec2d, unittofaceevec2d ); - dot_limit = 0.8; - - if ( isdefined( facee.dot_limit ) ) - dot_limit = facee.dot_limit; - - return dotproduct > dot_limit; + orientation = self getplayerangles(); + forwardvec = anglesToForward( orientation ); + forwardvec2d = ( forwardvec[ 0 ], forwardvec[ 1 ], 0 ); + unitforwardvec2d = vectornormalize( forwardvec2d ); + tofaceevec = facee.origin - self.origin; + tofaceevec2d = ( tofaceevec[ 0 ], tofaceevec[ 1 ], 0 ); + unittofaceevec2d = vectornormalize( tofaceevec2d ); + dotproduct = vectordot( unitforwardvec2d, unittofaceevec2d ); + dot_limit = 0.8; + if ( isDefined( facee.dot_limit ) ) + { + dot_limit = facee.dot_limit; + } + return dotproduct > dot_limit; } can_hack( hackable ) { - if ( !isalive( self ) ) - return false; - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - return false; - - if ( !self hacker_active() ) - return false; - - if ( !isdefined( hackable._trigger ) ) - return false; - - if ( isdefined( hackable.player ) ) - { - if ( hackable.player != self ) - return false; - } - - if ( self throwbuttonpressed() ) - return false; - - if ( self fragbuttonpressed() ) - return false; - - if ( isdefined( hackable._hack_qualifier_func ) ) - { - if ( !hackable [[ hackable._hack_qualifier_func ]]( self ) ) - return false; - } - - if ( !isinarray( level._hackable_objects, hackable ) ) - return false; - - radsquared = 1024; - - if ( isdefined( hackable.radius ) ) - radsquared = hackable.radius * hackable.radius; - - origin = hackable.origin; - - if ( isdefined( hackable.entity ) ) - origin = hackable.entity.origin; - - if ( distance2dsquared( self.origin, origin ) > radsquared ) - return false; - - if ( !isdefined( hackable.no_touch_check ) && !self istouching( hackable._trigger ) ) - return false; - - if ( !self is_facing( hackable ) ) - return false; - - if ( !isdefined( hackable.no_sight_check ) && !sighttracepassed( self.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), origin, 0, undefined ) ) - return false; - - if ( !isdefined( hackable.no_bullet_trace ) && !bullettracepassed( self.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), origin, 0, undefined ) ) - return false; - - return true; + if ( !isalive( self ) ) + { + return 0; + } + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return 0; + } + if ( !self hacker_active() ) + { + return 0; + } + if ( !isDefined( hackable._trigger ) ) + { + return 0; + } + if ( isDefined( hackable.player ) ) + { + if ( hackable.player != self ) + { + return 0; + } + } + if ( self throwbuttonpressed() ) + { + return 0; + } + if ( self fragbuttonpressed() ) + { + return 0; + } + if ( isDefined( hackable._hack_qualifier_func ) ) + { + if ( !( hackable [[ hackable._hack_qualifier_func ]]( self ) ) ) + { + return 0; + } + } + if ( !isinarray( level._hackable_objects, hackable ) ) + { + return 0; + } + radsquared = 1024; + if ( isDefined( hackable.radius ) ) + { + radsquared = hackable.radius * hackable.radius; + } + origin = hackable.origin; + if ( isDefined( hackable.entity ) ) + { + origin = hackable.entity.origin; + } + if ( distance2dsquared( self.origin, origin ) > radsquared ) + { + return 0; + } + if ( !isDefined( hackable.no_touch_check ) && !self istouching( hackable._trigger ) ) + { + return 0; + } + if ( !self is_facing( hackable ) ) + { + return 0; + } + if ( !isDefined( hackable.no_sight_check ) && !sighttracepassed( self.origin + vectorScale( ( 0, 0, 1 ), 50 ), origin, 0, undefined ) ) + { + return 0; + } + if ( !isDefined( hackable.no_bullet_trace ) && !bullettracepassed( self.origin + vectorScale( ( 0, 0, 1 ), 50 ), origin, 0, undefined ) ) + { + return 0; + } + return 1; } is_hacking( hackable ) { - return can_hack( hackable ) && self usebuttonpressed(); + if ( can_hack( hackable ) ) + { + return self usebuttonpressed(); + } } set_hack_hint_string() { - if ( isdefined( self._trigger ) ) - { - if ( isdefined( self.custom_string ) ) - self._trigger sethintstring( self.custom_string ); - else if ( !isdefined( self.script_int ) || self.script_int <= 0 ) - self._trigger sethintstring( &"ZOMBIE_HACK_NO_COST" ); - else - self._trigger sethintstring( &"ZOMBIE_HACK", self.script_int ); - } + if ( isDefined( self._trigger ) ) + { + if ( isDefined( self.custom_string ) ) + { + self._trigger sethintstring( self.custom_string ); + return; + } + else if ( !isDefined( self.script_int ) || self.script_int <= 0 ) + { + self._trigger sethintstring( &"ZOMBIE_HACK_NO_COST" ); + return; + } + else + { + self._trigger sethintstring( &"ZOMBIE_HACK", self.script_int ); + } + } } tidy_on_deregister( hackable ) { - self endon( "clean_up_tidy_up" ); - - hackable waittill( "hackable_deregistered" ); - - if ( isdefined( self.hackerprogressbar ) ) - self.hackerprogressbar maps\mp\gametypes_zm\_hud_util::destroyelem(); - - if ( isdefined( self.hackertexthud ) ) - self.hackertexthud destroy(); + self endon( "clean_up_tidy_up" ); + hackable waittill( "hackable_deregistered" ); + if ( isDefined( self.hackerprogressbar ) ) + { + self.hackerprogressbar maps/mp/gametypes_zm/_hud_util::destroyelem(); + } + if ( isDefined( self.hackertexthud ) ) + { + self.hackertexthud destroy(); + } } hacker_do_hack( hackable ) { - timer = 0; - hacked = 0; - hackable._trigger.beinghacked = 1; - - if ( !isdefined( self.hackerprogressbar ) ) - self.hackerprogressbar = self maps\mp\gametypes_zm\_hud_util::createprimaryprogressbar(); - - if ( !isdefined( self.hackertexthud ) ) - self.hackertexthud = newclienthudelem( self ); - - hack_duration = hackable.script_float; - - if ( self hasperk( "specialty_fastreload" ) ) - hack_duration *= 0.66; - - hack_duration = max( 1.5, hack_duration ); - self thread tidy_on_deregister( hackable ); - self.hackerprogressbar maps\mp\gametypes_zm\_hud_util::updatebar( 0.01, 1 / hack_duration ); - self.hackertexthud.alignx = "center"; - self.hackertexthud.aligny = "middle"; - self.hackertexthud.horzalign = "center"; - self.hackertexthud.vertalign = "bottom"; - self.hackertexthud.y = -113; - - if ( issplitscreen() ) - self.hackertexthud.y = -107; - - self.hackertexthud.foreground = 1; - self.hackertexthud.font = "default"; - self.hackertexthud.fontscale = 1.8; - self.hackertexthud.alpha = 1; - self.hackertexthud.color = ( 1, 1, 1 ); - self.hackertexthud settext( &"ZOMBIE_HACKING" ); - self playloopsound( "zmb_progress_bar", 0.5 ); - - while ( self is_hacking( hackable ) ) - { - wait 0.05; - timer += 0.05; - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - break; - - if ( timer >= hack_duration ) - { - hacked = 1; - break; - } - } - - self stoploopsound( 0.5 ); - - if ( hacked ) - self playsound( "vox_mcomp_hack_success" ); - else - self playsound( "vox_mcomp_hack_fail" ); - - if ( isdefined( self.hackerprogressbar ) ) - self.hackerprogressbar maps\mp\gametypes_zm\_hud_util::destroyelem(); - - if ( isdefined( self.hackertexthud ) ) - self.hackertexthud destroy(); - - hackable set_hack_hint_string(); - - if ( isdefined( hackable._trigger ) ) - hackable._trigger.beinghacked = 0; - - self notify( "clean_up_tidy_up" ); - return hacked; + timer = 0; + hacked = 0; + hackable._trigger.beinghacked = 1; + if ( !isDefined( self.hackerprogressbar ) ) + { + self.hackerprogressbar = self maps/mp/gametypes_zm/_hud_util::createprimaryprogressbar(); + } + if ( !isDefined( self.hackertexthud ) ) + { + self.hackertexthud = newclienthudelem( self ); + } + hack_duration = hackable.script_float; + if ( self hasperk( "specialty_fastreload" ) ) + { + hack_duration *= 0.66; + } + hack_duration = max( 1.5, hack_duration ); + self thread tidy_on_deregister( hackable ); + self.hackerprogressbar maps/mp/gametypes_zm/_hud_util::updatebar( 0.01, 1 / hack_duration ); + self.hackertexthud.alignx = "center"; + self.hackertexthud.aligny = "middle"; + self.hackertexthud.horzalign = "center"; + self.hackertexthud.vertalign = "bottom"; + self.hackertexthud.y = -113; + if ( issplitscreen() ) + { + self.hackertexthud.y = -107; + } + self.hackertexthud.foreground = 1; + self.hackertexthud.font = "default"; + self.hackertexthud.fontscale = 1.8; + self.hackertexthud.alpha = 1; + self.hackertexthud.color = ( 0, 0, 1 ); + self.hackertexthud settext( &"ZOMBIE_HACKING" ); + self playloopsound( "zmb_progress_bar", 0,5 ); + while ( self is_hacking( hackable ) ) + { + wait 0.05; + timer += 0.05; + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + break; + } + else if ( timer >= hack_duration ) + { + hacked = 1; + break; + } + else + { + } + } + self stoploopsound( 0.5 ); + if ( hacked ) + { + self playsound( "vox_mcomp_hack_success" ); + } + else self playsound( "vox_mcomp_hack_fail" ); + if ( isDefined( self.hackerprogressbar ) ) + { + self.hackerprogressbar maps/mp/gametypes_zm/_hud_util::destroyelem(); + } + if ( isDefined( self.hackertexthud ) ) + { + self.hackertexthud destroy(); + } + hackable set_hack_hint_string(); + if ( isDefined( hackable._trigger ) ) + { + hackable._trigger.beinghacked = 0; + } + self notify( "clean_up_tidy_up" ); + return hacked; } lowreadywatcher( player ) { - player endon( "disconnected" ); - self endon( "kill_lowreadywatcher" ); - - self waittill( "hackable_deregistered" ); + player endon( "disconnected" ); + self endon( "kill_lowreadywatcher" ); + self waittill( "hackable_deregistered" ); } hackable_object_thread() { - self endon( "hackable_deregistered" ); - height = 72; - radius = 64; - - if ( isdefined( self.radius ) ) - radius = self.radius; - - if ( isdefined( self.height ) ) - height = self.height; - - if ( !isdefined( self.pooled ) ) - { - trigger = spawn( "trigger_radius_use", self.origin, 0, radius, height ); - trigger usetriggerrequirelookat(); - trigger setcursorhint( "HINT_NOICON" ); - trigger.radius = radius; - trigger.height = height; - trigger.beinghacked = 0; - self._trigger = trigger; - } - - cost = 0; - - if ( isdefined( self.script_int ) ) - cost = self.script_int; - - duration = 1.0; - - if ( isdefined( self.script_float ) ) - duration = self.script_float; - - while ( true ) - { - wait 0.1; - - if ( !isdefined( self._trigger ) ) - continue; - - players = get_players(); - - if ( isdefined( self._trigger ) ) - { - if ( isdefined( self.entity ) ) - { - self.origin = self.entity.origin; - self._trigger.origin = self.entity.origin; - - if ( isdefined( self.trigger_offset ) ) - self._trigger.origin += self.trigger_offset; - } - } - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] can_hack( self ) ) - { - self set_hack_hint_string(); - break; - } - } - - for ( i = 0; i < players.size; i++ ) - { - hacker = players[i]; - - if ( !hacker is_hacking( self ) ) - continue; - - if ( hacker.score >= cost || cost <= 0 ) - { - self thread lowreadywatcher( hacker ); - hack_success = hacker hacker_do_hack( self ); - self notify( "kill_lowreadywatcher" ); - - if ( isdefined( hacker ) ) - { - - } - - if ( isdefined( hacker ) && hack_success ) - { - if ( cost ) - { - if ( cost > 0 ) - hacker maps\mp\zombies\_zm_score::minus_to_player_score( cost ); - else - hacker maps\mp\zombies\_zm_score::add_to_player_score( cost * -1 ); - } - - hacker notify( "successful_hack" ); - - if ( isdefined( self._hack_callback_func ) ) - self thread [[ self._hack_callback_func ]]( hacker ); - } - - continue; - } - - hacker play_sound_on_ent( "no_purchase" ); - hacker maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money", undefined, 1 ); - } - } + self endon( "hackable_deregistered" ); + height = 72; + radius = 64; + if ( isDefined( self.radius ) ) + { + radius = self.radius; + } + if ( isDefined( self.height ) ) + { + height = self.height; + } + if ( !isDefined( self.pooled ) ) + { + trigger = spawn( "trigger_radius_use", self.origin, 0, radius, height ); + trigger usetriggerrequirelookat(); + trigger setcursorhint( "HINT_NOICON" ); + trigger.radius = radius; + trigger.height = height; + trigger.beinghacked = 0; + self._trigger = trigger; + } + cost = 0; + if ( isDefined( self.script_int ) ) + { + cost = self.script_int; + } + duration = 1; + if ( isDefined( self.script_float ) ) + { + duration = self.script_float; + } + while ( 1 ) + { + wait 0.1; + while ( !isDefined( self._trigger ) ) + { + continue; + } + players = get_players(); + if ( isDefined( self._trigger ) ) + { + if ( isDefined( self.entity ) ) + { + self.origin = self.entity.origin; + self._trigger.origin = self.entity.origin; + if ( isDefined( self.trigger_offset ) ) + { + self._trigger.origin += self.trigger_offset; + } + } + } + i = 0; + while ( i < players.size ) + { + if ( players[ i ] can_hack( self ) ) + { + self set_hack_hint_string(); + break; + } + else + { + i++; + } + } + i = 0; + while ( i < players.size ) + { + hacker = players[ i ]; + if ( !hacker is_hacking( self ) ) + { + i++; + continue; + } + else if ( hacker.score >= cost || cost <= 0 ) + { + self thread lowreadywatcher( hacker ); + hack_success = hacker hacker_do_hack( self ); + self notify( "kill_lowreadywatcher" ); + if ( isDefined( hacker ) ) + { + } + if ( isDefined( hacker ) && hack_success ) + { + if ( cost ) + { + if ( cost > 0 ) + { + hacker maps/mp/zombies/_zm_score::minus_to_player_score( cost ); + break; + } + else + { + hacker maps/mp/zombies/_zm_score::add_to_player_score( cost * -1 ); + } + } + hacker notify( "successful_hack" ); + if ( isDefined( self._hack_callback_func ) ) + { + self thread [[ self._hack_callback_func ]]( hacker ); + } + } + i++; + continue; + } + else + { + hacker play_sound_on_ent( "no_purchase" ); + hacker maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money", undefined, 1 ); + } + i++; + } + } } hacker_on_player_connect() { - struct = spawnstruct(); - struct.origin = self.origin; - struct.radius = 48; - struct.height = 64; - struct.script_float = 10; - struct.script_int = 500; - struct.entity = self; - struct.trigger_offset = vectorscale( ( 0, 0, 1 ), 48.0 ); - register_pooled_hackable_struct( struct, ::player_hack, ::player_qualifier ); - struct thread player_hack_disconnect_watcher( self ); + struct = spawnstruct(); + struct.origin = self.origin; + struct.radius = 48; + struct.height = 64; + struct.script_float = 10; + struct.script_int = 500; + struct.entity = self; + struct.trigger_offset = vectorScale( ( 0, 0, 1 ), 48 ); + register_pooled_hackable_struct( struct, ::player_hack, ::player_qualifier ); + struct thread player_hack_disconnect_watcher( self ); } player_hack_disconnect_watcher( player ) { - player waittill( "disconnect" ); - - deregister_hackable_struct( self ); + player waittill( "disconnect" ); + deregister_hackable_struct( self ); } player_hack( hacker ) { - if ( isdefined( self.entity ) ) - self.entity maps\mp\zombies\_zm_score::player_add_points( "hacker_transfer", 500 ); - - if ( isdefined( hacker ) ) - hacker thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "hack_plr" ); + if ( isDefined( self.entity ) ) + { + self.entity maps/mp/zombies/_zm_score::player_add_points( "hacker_transfer", 500 ); + } + if ( isDefined( hacker ) ) + { + hacker thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "hack_plr" ); + } } player_qualifier( player ) { - if ( player == self.entity ) - return false; - - if ( self.entity maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - return false; - - if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - return false; - - if ( isdefined( self.entity.sessionstate == "spectator" ) && self.entity.sessionstate == "spectator" ) - return false; - - return true; + if ( player == self.entity ) + { + return 0; + } + if ( self.entity maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return 0; + } + if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return 0; + } + if ( isDefined( self.entity.sessionstate == "spectator" ) && self.entity.sessionstate == "spectator" ) + { + return 0; + } + return 1; } hide_hint_when_hackers_active( custom_logic_func, custom_logic_func_param ) { - invis_to_any = 0; - - while ( true ) - { - if ( isdefined( custom_logic_func ) ) - self [[ custom_logic_func ]]( custom_logic_func_param ); - - if ( maps\mp\zombies\_zm_equip_hacker::any_hackers_active() ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] hacker_active() ) - { - self setinvisibletoplayer( players[i], 1 ); - invis_to_any = 1; - continue; - } - - self setinvisibletoplayer( players[i], 0 ); - } - } - else if ( invis_to_any ) - { - invis_to_any = 0; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - self setinvisibletoplayer( players[i], 0 ); - } - - wait 0.1; - } + invis_to_any = 0; + while ( 1 ) + { + if ( isDefined( custom_logic_func ) ) + { + self [[ custom_logic_func ]]( custom_logic_func_param ); + } + if ( maps/mp/zombies/_zm_equip_hacker::any_hackers_active() ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ] hacker_active() ) + { + self setinvisibletoplayer( players[ i ], 1 ); + invis_to_any = 1; + i++; + continue; + } + else + { + self setinvisibletoplayer( players[ i ], 0 ); + } + i++; + } + } + else while ( invis_to_any ) + { + invis_to_any = 0; + players = get_players(); + i = 0; + while ( i < players.size ) + { + self setinvisibletoplayer( players[ i ], 0 ); + i++; + } + } + wait 0.1; + } } hacker_debug_print( msg, color ) { /# - if ( !getdvarint( _hash_428DE100 ) ) - return; - - if ( !isdefined( color ) ) - color = ( 1, 1, 1 ); - - print3d( self.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), msg, color, 1, 1, 40 ); + if ( !getDvarInt( #"428DE100" ) ) + { + return; + } + if ( !isDefined( color ) ) + { + color = ( 0, 0, 1 ); + } + print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 ); #/ } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_turbine.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_turbine.gsc index 00436eb..9ec9f80 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_turbine.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equip_turbine.gsc @@ -1,760 +1,776 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\gametypes_zm\_weaponobjects; -#include maps\mp\zombies\_zm_power; -#include maps\mp\zombies\_zm_unitrigger; -#include maps\mp\zombies\_zm_buildables; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_power; +#include maps/mp/gametypes_zm/_weaponobjects; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init( hint, howto ) +//#using_animtree( "zombie_turbine" ); + +init( hint, howto ) //checked matches cerberus output { - if ( !isdefined( hint ) ) - hint = &"ZOMBIE_EQUIP_TURBINE_PICKUP_HINT_STRING"; - - if ( !isdefined( howto ) ) - howto = &"ZOMBIE_EQUIP_TURBINE_HOWTO"; - - if ( !maps\mp\zombies\_zm_equipment::is_equipment_included( "equip_turbine_zm" ) ) - return; - - level.turbine_name = "equip_turbine_zm"; - maps\mp\zombies\_zm_equipment::register_equipment( "equip_turbine_zm", hint, howto, "turbine_zm_icon", "turbine", undefined, ::transferturbine, ::dropturbine, ::pickupturbine, ::placeturbine ); - maps\mp\zombies\_zm_equipment::add_placeable_equipment( "equip_turbine_zm", "p6_anim_zm_buildable_turbine", ::destroy_placed_turbine ); - level thread onplayerconnect(); - maps\mp\gametypes_zm\_weaponobjects::createretrievablehint( "equip_turbine", hint ); - level._effect["turbine_on"] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_on" ); - level._effect["turbine_med"] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_med" ); - level._effect["turbine_low"] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_low" ); - level._effect["turbine_aoe"] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_aoe" ); - level._turbine_disappear_fx = loadfx( "maps/zombie/fx_zmb_tranzit_turbine_explo" ); + if ( !isDefined( hint ) ) + { + hint = &"ZOMBIE_EQUIP_TURBINE_PICKUP_HINT_STRING"; + } + if ( !isDefined( howto ) ) + { + howto = &"ZOMBIE_EQUIP_TURBINE_HOWTO"; + } + if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_turbine_zm" ) ) + { + return; + } + level.turbine_name = "equip_turbine_zm"; + maps/mp/zombies/_zm_equipment::register_equipment( "equip_turbine_zm", hint, howto, "turbine_zm_icon", "turbine", undefined, ::transferturbine, ::dropturbine, ::pickupturbine, ::placeturbine ); + maps/mp/zombies/_zm_equipment::add_placeable_equipment( "equip_turbine_zm", "p6_anim_zm_buildable_turbine", ::destroy_placed_turbine ); + level thread onplayerconnect(); + maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "equip_turbine", hint ); + level._effect[ "turbine_on" ] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_on" ); + level._effect[ "turbine_med" ] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_med" ); + level._effect[ "turbine_low" ] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_low" ); + level._effect[ "turbine_aoe" ] = loadfx( "maps/zombie/fx_zmb_tranzit_wind_turbine_aoe" ); + level._turbine_disappear_fx = loadfx( "maps/zombie/fx_zmb_tranzit_turbine_explo" ); } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - player thread onplayerspawned(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player thread onplayerspawned(); + } } -onplayerspawned() +onplayerspawned() //checked matches cerberus output { - self endon( "disconnect" ); - self thread setupwatchers(); - - for (;;) - { - self waittill( "spawned_player" ); - - self thread watchturbineuse(); - } + self endon( "disconnect" ); + self thread setupwatchers(); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread watchturbineuse(); + } } -setupwatchers() +setupwatchers() //checked matches cerberus output { - self waittill( "weapon_watchers_created" ); - - watcher = maps\mp\gametypes_zm\_weaponobjects::getweaponobjectwatcher( "equip_turbine" ); - watcher.onspawnretrievetriggers = maps\mp\zombies\_zm_equipment::equipment_onspawnretrievableweaponobject; + self waittill( "weapon_watchers_created" ); + watcher = maps/mp/gametypes_zm/_weaponobjects::getweaponobjectwatcher( "equip_turbine" ); + watcher.onspawnretrievetriggers = maps/mp/zombies/_zm_equipment::equipment_onspawnretrievableweaponobject; } -watchturbineuse() +watchturbineuse() //checked matches cerberus output { - self notify( "watchTurbineUse" ); - self endon( "watchTurbineUse" ); - self endon( "death" ); - self endon( "disconnect" ); - - for (;;) - { - self waittill( "equipment_placed", weapon, weapname ); - - if ( weapname == level.turbine_name ) - { - self cleanupoldturbine(); - self.buildableturbine = weapon; - self thread startturbinedeploy( weapon ); - level notify( "turbine_deployed" ); - } - } + self notify( "watchTurbineUse" ); + self endon( "watchTurbineUse" ); + self endon( "death" ); + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "equipment_placed", weapon, weapname ); + if ( weapname == level.turbine_name ) + { + self cleanupoldturbine(); + self.buildableturbine = weapon; + self thread startturbinedeploy( weapon ); + level notify( "turbine_deployed" ); + } + } } -cleanupoldturbine( preserve_state ) +cleanupoldturbine( preserve_state ) //checked matches cerberus output { - if ( isdefined( self.localpower ) ) - { - maps\mp\zombies\_zm_power::end_local_power( self.localpower ); - self notify( "depower_on_disconnect" ); - self.localpower = undefined; - self.turbine_power_is_on = 0; - } - - self.turbine_is_powering_on = 0; - - if ( isdefined( self.buildableturbine ) ) - { - if ( isdefined( self.buildableturbine.stub ) ) - { - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.buildableturbine.stub ); - self.buildableturbine.stub = undefined; - } - - self.buildableturbine stoploopsound(); - self.buildableturbine delete(); - - if ( !( isdefined( preserve_state ) && preserve_state ) ) - { - self.turbine_health = undefined; - self.turbine_emped = undefined; - self.turbine_emp_time = undefined; - } - } + if ( isDefined( self.localpower ) ) + { + maps/mp/zombies/_zm_power::end_local_power( self.localpower ); + self notify( "depower_on_disconnect" ); + self.localpower = undefined; + self.turbine_power_is_on = 0; + } + self.turbine_is_powering_on = 0; + if ( isDefined( self.buildableturbine ) ) + { + if ( isDefined( self.buildableturbine.stub ) ) + { + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableturbine.stub ); + self.buildableturbine.stub = undefined; + } + self.buildableturbine stoploopsound(); + self.buildableturbine delete(); + if ( !is_true( preserve_state ) ) + { + self.turbine_health = undefined; + self.turbine_emped = undefined; + self.turbine_emp_time = undefined; + } + } } -watchforcleanup() +watchforcleanup() //checked matches cerberus output { - self notify( "turbine_cleanup" ); - self endon( "turbine_cleanup" ); - evt = self waittill_any_return( "death_or_disconnect", "equip_turbine_zm_taken", "equip_turbine_zm_pickup" ); - - if ( isdefined( self ) ) - self cleanupoldturbine( evt == "equip_turbine_zm_pickup" ); + self notify( "turbine_cleanup" ); + self endon( "turbine_cleanup" ); + evt = self waittill_any_return( "death_or_disconnect", "equip_turbine_zm_taken", "equip_turbine_zm_pickup" ); + if ( isDefined( self ) ) + { + self cleanupoldturbine( evt == "equip_turbine_zm_pickup" ); + } } -depower_on_disconnect( localpower ) +depower_on_disconnect( localpower ) //checked matches cerberus output { - self notify( "depower_on_disconnect" ); - self endon( "depower_on_disconnect" ); - - self waittill( "disconnect" ); - - if ( isdefined( localpower ) ) - maps\mp\zombies\_zm_power::end_local_power( localpower ); + self notify( "depower_on_disconnect" ); + self endon( "depower_on_disconnect" ); + self waittill( "disconnect" ); + if ( isDefined( localpower ) ) + { + maps/mp/zombies/_zm_power::end_local_power( localpower ); + } } -placeturbine( origin, angles ) +placeturbine( origin, angles ) //checked matches cerberus output { - item = self maps\mp\zombies\_zm_equipment::placed_equipment_think( "p6_anim_zm_buildable_turbine", "equip_turbine_zm", origin, angles ); - return item; + item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "p6_anim_zm_buildable_turbine", "equip_turbine_zm", origin, angles ); + return item; } -dropturbine() +dropturbine() //checked matches cerberus output { - item = thread maps\mp\zombies\_zm_equipment::dropped_equipment_think( "p6_anim_zm_buildable_turbine", "equip_turbine_zm", self.origin, self.angles ); - - if ( isdefined( item ) ) - { - item.turbine_power_on = self.turbine_power_on; - item.turbine_power_level = self.turbine_power_level; - item.turbine_round_start = self.turbine_round_start; - item.turbine_health = self.turbine_health; - item.turbine_emped = self.turbine_emped; - item.turbine_emp_time = self.turbine_emp_time; - } - - self.turbine_is_powering_on = undefined; - self.turbine_power_on = undefined; - self.turbine_power_level = undefined; - self.turbine_round_start = undefined; - self.turbine_health = undefined; - self.turbine_emped = undefined; - self.turbine_emp_time = undefined; - return item; + item = thread maps/mp/zombies/_zm_equipment::dropped_equipment_think( "p6_anim_zm_buildable_turbine", "equip_turbine_zm", self.origin, self.angles ); + if ( isDefined( item ) ) + { + item.turbine_power_on = self.turbine_power_on; + item.turbine_power_level = self.turbine_power_level; + item.turbine_round_start = self.turbine_round_start; + item.turbine_health = self.turbine_health; + item.turbine_emped = self.turbine_emped; + item.turbine_emp_time = self.turbine_emp_time; + } + self.turbine_is_powering_on = undefined; + self.turbine_power_on = undefined; + self.turbine_power_level = undefined; + self.turbine_round_start = undefined; + self.turbine_health = undefined; + self.turbine_emped = undefined; + self.turbine_emp_time = undefined; + return item; } -pickupturbine( item ) +pickupturbine( item ) //checked matches cerberus output { - item.owner = self; - self.turbine_power_on = item.turbine_power_on; - item.turbine_power_on = undefined; - self.turbine_power_level = item.turbine_power_level; - self.turbine_round_start = item.turbine_round_start; - self.turbine_health = item.turbine_health; - item.turbine_health = undefined; - item.turbine_power_level = undefined; - item.turbine_round_start = undefined; - self.turbine_emped = item.turbine_emped; - self.turbine_emp_time = item.turbine_emp_time; - item.turbine_emped = undefined; - item.turbine_emp_time = undefined; - self.turbine_is_powering_on = undefined; + item.owner = self; + self.turbine_power_on = item.turbine_power_on; + item.turbine_power_on = undefined; + self.turbine_power_level = item.turbine_power_level; + self.turbine_round_start = item.turbine_round_start; + self.turbine_health = item.turbine_health; + item.turbine_health = undefined; + item.turbine_power_level = undefined; + item.turbine_round_start = undefined; + self.turbine_emped = item.turbine_emped; + self.turbine_emp_time = item.turbine_emp_time; + item.turbine_emped = undefined; + item.turbine_emp_time = undefined; + self.turbine_is_powering_on = undefined; } -transferturbine( fromplayer, toplayer ) +transferturbine( fromplayer, toplayer ) //checked changed to match cerberus output { - while ( isdefined( toplayer.turbine_is_powering_on ) && toplayer.turbine_is_powering_on || isdefined( fromplayer.turbine_is_powering_on ) && fromplayer.turbine_is_powering_on ) - wait 0.05; - - if ( isdefined( fromplayer.buildableturbine ) && ( isdefined( fromplayer.buildableturbine.dying ) && fromplayer.buildableturbine.dying ) ) - fromplayer cleanupoldturbine( 0 ); - - if ( isdefined( toplayer.buildableturbine ) && ( isdefined( toplayer.buildableturbine.dying ) && toplayer.buildableturbine.dying ) ) - toplayer cleanupoldturbine( 0 ); - - buildableturbine = toplayer.buildableturbine; - localpower = toplayer.localpower; - turbine_power_on = toplayer.turbine_power_on; - turbine_power_is_on = toplayer.turbine_power_is_on; - turbine_power_level = toplayer.turbine_power_level; - turbine_round_start = toplayer.turbine_round_start; - turbine_health = toplayer.turbine_health; - turbine_emped = toplayer.turbine_emped; - turbine_emp_time = toplayer.turbine_emp_time; - toplayer.buildableturbine = fromplayer.buildableturbine; - fromplayer.buildableturbine = buildableturbine; - toplayer.localpower = fromplayer.localpower; - fromplayer.localpower = localpower; - toplayer.turbine_power_on = fromplayer.turbine_power_on; - fromplayer.turbine_power_on = turbine_power_on; - toplayer.turbine_power_is_on = fromplayer.turbine_power_is_on; - fromplayer.turbine_power_is_on = turbine_power_is_on; - toplayer.turbine_power_level = fromplayer.turbine_power_level; - toplayer.turbine_round_start = fromplayer.turbine_round_start; - fromplayer.turbine_power_level = turbine_power_level; - fromplayer.turbine_round_start = turbine_round_start; - toplayer.turbine_health = fromplayer.turbine_health; - fromplayer.turbine_health = turbine_health; - toplayer.turbine_emped = fromplayer.turbine_emped; - fromplayer.turbine_emped = turbine_emped; - toplayer.turbine_emp_time = fromplayer.turbine_emp_time; - fromplayer.turbine_emp_time = turbine_emp_time; - toplayer.turbine_is_powering_on = undefined; - fromplayer.turbine_is_powering_on = undefined; - toplayer notify( "equip_turbine_zm_taken" ); - toplayer.buildableturbine.original_owner = toplayer; - toplayer thread startturbinedeploy( toplayer.buildableturbine ); - fromplayer notify( "equip_turbine_zm_taken" ); - - if ( isdefined( fromplayer.buildableturbine ) ) - { - fromplayer thread startturbinedeploy( fromplayer.buildableturbine ); - fromplayer.buildableturbine.original_owner = fromplayer; - fromplayer.buildableturbine.owner = fromplayer; - } - else - fromplayer maps\mp\zombies\_zm_equipment::equipment_release( "equip_turbine_zm" ); + while ( is_true( toplayer.turbine_is_powering_on ) || is_true( fromplayer.turbine_is_powering_on ) ) + { + wait 0.05; + } + if ( isDefined( fromplayer.buildableturbine ) && is_true( fromplayer.buildableturbine.dying ) ) + { + fromplayer cleanupoldturbine( 0 ); + } + if ( isDefined( toplayer.buildableturbine ) && is_true( toplayer.buildableturbine.dying ) ) + { + toplayer cleanupoldturbine( 0 ); + } + buildableturbine = toplayer.buildableturbine; + localpower = toplayer.localpower; + turbine_power_on = toplayer.turbine_power_on; + turbine_power_is_on = toplayer.turbine_power_is_on; + turbine_power_level = toplayer.turbine_power_level; + turbine_round_start = toplayer.turbine_round_start; + turbine_health = toplayer.turbine_health; + turbine_emped = toplayer.turbine_emped; + turbine_emp_time = toplayer.turbine_emp_time; + toplayer.buildableturbine = fromplayer.buildableturbine; + fromplayer.buildableturbine = buildableturbine; + toplayer.localpower = fromplayer.localpower; + fromplayer.localpower = localpower; + toplayer.turbine_power_on = fromplayer.turbine_power_on; + fromplayer.turbine_power_on = turbine_power_on; + toplayer.turbine_power_is_on = fromplayer.turbine_power_is_on; + fromplayer.turbine_power_is_on = turbine_power_is_on; + toplayer.turbine_power_level = fromplayer.turbine_power_level; + toplayer.turbine_round_start = fromplayer.turbine_round_start; + fromplayer.turbine_power_level = turbine_power_level; + fromplayer.turbine_round_start = turbine_round_start; + toplayer.turbine_health = fromplayer.turbine_health; + fromplayer.turbine_health = turbine_health; + toplayer.turbine_emped = fromplayer.turbine_emped; + fromplayer.turbine_emped = turbine_emped; + toplayer.turbine_emp_time = fromplayer.turbine_emp_time; + fromplayer.turbine_emp_time = turbine_emp_time; + toplayer.turbine_is_powering_on = undefined; + fromplayer.turbine_is_powering_on = undefined; + toplayer notify( "equip_turbine_zm_taken" ); + toplayer.buildableturbine.original_owner = toplayer; + toplayer thread startturbinedeploy( toplayer.buildableturbine ); + fromplayer notify( "equip_turbine_zm_taken" ); + if ( isDefined( fromplayer.buildableturbine ) ) + { + fromplayer thread startturbinedeploy( fromplayer.buildableturbine ); + fromplayer.buildableturbine.original_owner = fromplayer; + fromplayer.buildableturbine.owner = fromplayer; + } + else + { + fromplayer maps/mp/zombies/_zm_equipment::equipment_release( "equip_turbine_zm" ); + } } -startturbinedeploy( weapon ) +startturbinedeploy( weapon ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - self thread watchforcleanup(); - origin = weapon.origin; - powerradius = 335; - - if ( !isdefined( self.turbine_health ) ) - { - self.turbine_health = 1200; - self.turbine_power_level = 4; - self.turbine_power_on = 1; - self.turbine_is_powering_on = undefined; - } - - if ( !isdefined( self.turbine_round_start ) ) - { - self.turbine_round_start = level.round_number; - self.turbine_power_on = 1; - } - - self thread turbinedecay(); - self thread turbinepowerdiminish( origin, powerradius ); - - if ( isdefined( weapon ) ) - { + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + self thread watchforcleanup(); + origin = weapon.origin; + powerradius = 335; + if ( !isDefined( self.turbine_health ) ) + { + self.turbine_health = 1200; + self.turbine_power_level = 4; + self.turbine_power_on = 1; + self.turbine_is_powering_on = undefined; + } + if ( !isDefined( self.turbine_round_start ) ) + { + self.turbine_round_start = level.round_number; + self.turbine_power_on = 1; + } + self thread turbinedecay(); + self thread turbinepowerdiminish( origin, powerradius ); + if ( isDefined( weapon ) ) + { + /* /# - self thread debugturbine( powerradius ); + self thread debugturbine( powerradius ); #/ - self thread turbineaudio(); - self thread turbineanim(); - self thread turbinepowerthink( weapon, powerradius ); - - if ( isdefined( weapon.equipment_can_move ) && weapon.equipment_can_move ) - self thread turbinepowermove( weapon ); - - self thread maps\mp\zombies\_zm_buildables::delete_on_disconnect( weapon ); - - weapon waittill( "death" ); - - self thread turbinepoweroff( origin, powerradius ); - self notify( "turbine_cleanup" ); - } + */ + self thread turbineaudio(); + self thread turbineanim(); + self thread turbinepowerthink( weapon, powerradius ); + if ( is_true( weapon.equipment_can_move ) ) + { + self thread turbinepowermove( weapon ); + } + self thread maps/mp/zombies/_zm_buildables::delete_on_disconnect( weapon ); + weapon waittill( "death" ); + self thread turbinepoweroff( origin, powerradius ); + self notify( "turbine_cleanup" ); + } } -turbine_watch_for_emp( weapon, powerradius ) +turbine_watch_for_emp( weapon, powerradius ) //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - self.buildableturbine endon( "death" ); - - if ( !should_watch_for_emp() ) - return; - - while ( true ) - { - level waittill( "emp_detonate", origin, radius ); - - if ( distancesquared( origin, self.buildableturbine.origin ) < radius * radius ) - break; - } - - self.turbine_emped = 1; - self.turbine_emp_time = gettime(); - self notify( "turbine_power_change" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + self.buildableturbine endon( "death" ); + if ( !should_watch_for_emp() ) + { + return; + } + while ( 1 ) + { + level waittill( "emp_detonate", origin, radius ); + if ( distancesquared( origin, self.buildableturbine.origin ) < ( radius * radius ) ) + { + break; + } + } + self.turbine_emped = 1; + self.turbine_emp_time = getTime(); + self notify( "turbine_power_change" ); } -turbinepowerthink( weapon, powerradius ) +turbinepowerthink( weapon, powerradius ) //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - self.buildableturbine endon( "death" ); - origin = weapon.origin; - self thread turbine_watch_for_emp( weapon, powerradius ); - - if ( isdefined( self.turbine_power_on ) && self.turbine_power_on || isdefined( self.turbine_emped ) && self.turbine_emped ) - self thread turbinepoweron( origin, powerradius ); - - while ( isdefined( self.buildableturbine ) ) - { - self waittill( "turbine_power_change" ); - - if ( isdefined( self.turbine_emped ) && self.turbine_emped ) - { - self thread turbinepoweroff( origin, powerradius ); - - if ( isdefined( weapon ) ) - origin = weapon.origin; - - self thread turbinepoweron( origin, powerradius ); - } - else if ( !( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) ) - self thread turbinepoweroff( origin, powerradius ); - else - { - if ( isdefined( weapon ) ) - origin = weapon.origin; - - self thread turbinepoweron( origin, powerradius ); - } - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + self.buildableturbine endon( "death" ); + origin = weapon.origin; + self thread turbine_watch_for_emp( weapon, powerradius ); + if ( is_true( self.turbine_power_on ) || is_true( self.turbine_emped ) ) + { + self thread turbinepoweron( origin, powerradius ); + } + while ( isDefined( self.buildableturbine ) ) + { + self waittill( "turbine_power_change" ); + if ( is_true( self.turbine_emped ) ) + { + self thread turbinepoweroff( origin, powerradius ); + if ( isDefined( weapon ) ) + { + origin = weapon.origin; + } + self thread turbinepoweron( origin, powerradius ); + //continue; + } + else if ( !is_true( self.turbine_power_is_on ) ) + { + self thread turbinepoweroff( origin, powerradius ); + break; + } + else if ( isDefined( weapon ) ) + { + origin = weapon.origin; + } + self thread turbinepoweron( origin, powerradius ); + } } -turbinepowermove( weapon ) +turbinepowermove( weapon ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - self.buildableturbine endon( "death" ); - origin = weapon.origin; - - while ( true ) - { - if ( origin != weapon.origin ) - { - if ( isdefined( self.localpower ) ) - self.localpower = maps\mp\zombies\_zm_power::move_local_power( self.localpower, origin ); - - origin = weapon.origin; - } - - wait 0.5; - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + self.buildableturbine endon( "death" ); + origin = weapon.origin; + while ( 1 ) + { + if ( origin != weapon.origin ) + { + if ( isDefined( self.localpower ) ) + { + self.localpower = maps/mp/zombies/_zm_power::move_local_power( self.localpower, origin ); + } + origin = weapon.origin; + } + wait 0.5; + } } -turbinewarmup() +turbinewarmup() //checked matches cerberus output //order of operations may need to be checked { - if ( isdefined( self.turbine_emped ) && self.turbine_emped ) - { - emp_time = level.zombie_vars["emp_perk_off_time"]; - now = gettime(); - emp_time_left = emp_time - ( now - self.turbine_emp_time ) / 1000; - - if ( emp_time_left > 0 ) - wait( emp_time_left ); - - self.turbine_emped = undefined; - self.turbine_emp_time = undefined; - } - - self.buildableturbine maps\mp\zombies\_zm_equipment::signal_equipment_activated( 3 ); - wait 0.5; - self.buildableturbine maps\mp\zombies\_zm_equipment::signal_equipment_activated( 2 ); - wait 0.5; - self.buildableturbine maps\mp\zombies\_zm_equipment::signal_equipment_activated( 1 ); - wait 0.5; + if ( is_true( self.turbine_emped ) ) + { + emp_time = level.zombie_vars[ "emp_perk_off_time" ]; + now = getTime(); + emp_time_left = emp_time - ( ( now - self.turbine_emp_time ) / 1000 ); + if ( emp_time_left > 0 ) + { + wait emp_time_left; + } + self.turbine_emped = undefined; + self.turbine_emp_time = undefined; + } + self.buildableturbine maps/mp/zombies/_zm_equipment::signal_equipment_activated( 3 ); + wait 0.5; + self.buildableturbine maps/mp/zombies/_zm_equipment::signal_equipment_activated( 2 ); + wait 0.5; + self.buildableturbine maps/mp/zombies/_zm_equipment::signal_equipment_activated( 1 ); + wait 0.5; } -turbinepoweron( origin, powerradius ) +turbinepoweron( origin, powerradius ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - self.buildableturbine endon( "death" ); - - if ( !( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) && !( isdefined( self.turbine_is_powering_on ) && self.turbine_is_powering_on ) && !( isdefined( self.buildableturbine.dying ) && self.buildableturbine.dying ) ) - { - self.turbine_is_powering_on = 1; - self.buildableturbine playloopsound( "zmb_turbine_loop", 2 ); - self turbinewarmup(); - - if ( isdefined( self.localpower ) ) - maps\mp\zombies\_zm_power::end_local_power( self.localpower ); - - self.localpower = undefined; - self.turbine_power_is_on = 0; - - if ( !( isdefined( self.turbine_emped ) && self.turbine_emped ) ) - { - self.localpower = maps\mp\zombies\_zm_power::add_local_power( origin, powerradius ); - self thread depower_on_disconnect( self.localpower ); - self.turbine_power_is_on = 1; - self thread turbineaudio(); - } - - self.turbine_is_powering_on = 0; - self thread turbinefx(); - self thread turbinedecay(); - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + self.buildableturbine endon( "death" ); + if ( !is_true( self.turbine_power_is_on ) && !is_true( self.turbine_is_powering_on ) && !is_true( self.buildableturbine.dying ) ) + { + self.turbine_is_powering_on = 1; + self.buildableturbine playloopsound( "zmb_turbine_loop", 2 ); + self turbinewarmup(); + if ( isDefined( self.localpower ) ) + { + maps/mp/zombies/_zm_power::end_local_power( self.localpower ); + } + self.localpower = undefined; + self.turbine_power_is_on = 0; + if ( !is_true( self.turbine_emped ) ) + { + self.localpower = maps/mp/zombies/_zm_power::add_local_power( origin, powerradius ); + self thread depower_on_disconnect( self.localpower ); + self.turbine_power_is_on = 1; + self thread turbineaudio(); + } + self.turbine_is_powering_on = 0; + self thread turbinefx(); + self thread turbinedecay(); + } } -turbinepoweroff( origin, powerradius ) +turbinepoweroff( origin, powerradius ) //checked matches cerberus output { - if ( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) - { - if ( isdefined( self.localpower ) ) - maps\mp\zombies\_zm_power::end_local_power( self.localpower ); - - self notify( "depower_on_disconnect" ); - self.localpower = undefined; - self.turbine_power_is_on = 0; - self thread turbineaudio(); - - if ( !( isdefined( self.buildableturbine.dying ) && self.buildableturbine.dying ) ) - self thread turbineanim(); - } + if ( is_true( self.turbine_power_is_on ) ) + { + if ( isDefined( self.localpower ) ) + { + maps/mp/zombies/_zm_power::end_local_power( self.localpower ); + } + self notify( "depower_on_disconnect" ); + self.localpower = undefined; + self.turbine_power_is_on = 0; + self thread turbineaudio(); + if ( !is_true( self.buildableturbine.dying ) ) + { + self thread turbineanim(); + } + } } -turbine_disappear_fx( origin, waittime ) +turbine_disappear_fx( origin, waittime ) //checked matches cerberus output { - if ( isdefined( waittime ) && waittime > 0 ) - wait( waittime ); - - playfx( level._turbine_disappear_fx, origin ); - - if ( isdefined( self.buildableturbine ) ) - playsoundatposition( "zmb_turbine_explo", self.buildableturbine.origin ); + if ( isDefined( waittime ) && waittime > 0 ) + { + wait waittime; + } + playfx( level._turbine_disappear_fx, origin ); + if ( isDefined( self.buildableturbine ) ) + { + playsoundatposition( "zmb_turbine_explo", self.buildableturbine.origin ); + } } -turbinefxonce( withaoe ) +turbinefxonce( withaoe ) //checked matches cerberus output { - if ( isdefined( self ) && isdefined( self.buildableturbine ) && ( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) ) - { - value = 0; - - switch ( self.turbine_power_level ) - { - case "4": - case "3": - value = 1; - break; - case "2": - value = 2; - break; - case "1": - value = 3; - break; - } - - if ( withaoe ) - { - if ( isdefined( self.buildableturbine.equipment_can_move ) && self.buildableturbine.equipment_can_move && ( isdefined( self.buildableturbine.move_parent.ismoving ) && self.buildableturbine.move_parent.ismoving ) ) - value |= 4; - else - value |= 8; - } - - if ( value && isdefined( self.buildableturbine ) && ( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) ) - self.buildableturbine thread maps\mp\zombies\_zm_equipment::signal_equipment_activated( value ); - } + if ( isDefined( self ) && isDefined( self.buildableturbine ) && is_true( self.turbine_power_is_on ) ) + { + value = 0; + switch( self.turbine_power_level ) + { + case 3: + case 4: + value = 1; + break; + case 2: + value = 2; + break; + case 1: + value = 3; + break; + } + if ( withaoe ) + { + if ( is_true( self.buildableturbine.equipment_can_move ) && is_true( self.buildableturbine.move_parent.ismoving ) ) + { + value |= 4; + } + else + { + value |= 8; + } + } + if ( value && isDefined( self.buildableturbine ) && is_true( self.turbine_power_is_on ) ) + { + self.buildableturbine thread maps/mp/zombies/_zm_equipment::signal_equipment_activated( value ); + } + } } -turbinefx() +turbinefx() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - - while ( isdefined( self ) && isdefined( self.buildableturbine ) && ( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) ) - { - self turbinefxonce( 1 ); - wait 0.5; - self turbinefxonce( 0 ); - wait 0.5; - } + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + while ( isDefined( self ) && isDefined( self.buildableturbine ) && is_true( self.turbine_power_is_on ) ) + { + self turbinefxonce( 1 ); + wait 0.5; + self turbinefxonce( 0 ); + wait 0.5; + } } -turbineaudio() +turbineaudio() //checked changed to match cerberus output { - if ( !isdefined( self.buildableturbine ) ) - return; - - if ( !( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) || isdefined( self.turbine_emped ) && self.turbine_emped ) - { - self.buildableturbine stoploopsound(); - return; - } - - self.buildableturbine playloopsound( "zmb_turbine_loop", 2 ); + if ( !isDefined( self.buildableturbine ) ) + { + return; + } + if ( !is_true( self.turbine_power_is_on ) || is_true( self.turbine_emped ) ) + { + self.buildableturbine stoploopsound(); + return; + } + self.buildableturbine playloopsound( "zmb_turbine_loop", 2 ); } -init_animtree() +init_animtree() //checked matches cerberus output { - scriptmodelsuseanimtree( -1 ); + scriptmodelsuseanimtree( -1 ); } -#using_animtree("zombie_turbine"); - -turbineanim( wait_for_end ) +turbineanim( wait_for_end ) //checked changed to match cerberus output { - if ( !isdefined( self.buildableturbine ) ) - return; - - animlength = 0; - self.buildableturbine useanimtree( -1 ); - - if ( isdefined( self.buildableturbine.dying ) && self.buildableturbine.dying ) - { - animlength = getanimlength( %o_zombie_buildable_turbine_death ); - self.buildableturbine setanim( %o_zombie_buildable_turbine_death ); - } - else if ( isdefined( self.turbine_emped ) && self.turbine_emped ) - { - self.buildableturbine clearanim( %o_zombie_buildable_turbine_fullpower, 0 ); - return; - } - else - { - switch ( self.turbine_power_level ) - { - case "4": - case "3": - animlength = getanimlength( %o_zombie_buildable_turbine_fullpower ); - self.buildableturbine setanim( %o_zombie_buildable_turbine_fullpower ); - break; - case "2": - animlength = getanimlength( %o_zombie_buildable_turbine_halfpower ); - self.buildableturbine setanim( %o_zombie_buildable_turbine_halfpower ); - break; - case "1": - animlength = getanimlength( %o_zombie_buildable_turbine_neardeath ); - self.buildableturbine setanim( %o_zombie_buildable_turbine_neardeath ); - break; - } - } - - if ( isdefined( wait_for_end ) && wait_for_end ) - wait( animlength ); + if ( !isDefined( self.buildableturbine ) ) + { + return; + } + animlength = 0; + self.buildableturbine useanimtree( -1 ); + if ( is_true( self.buildableturbine.dying ) ) + { + animlength = getanimlength( %o_zombie_buildable_turbine_death ); + self.buildableturbine setanim( %o_zombie_buildable_turbine_death ); + break; + } + if ( is_true( self.turbine_emped ) ) + { + self.buildableturbine clearanim( %o_zombie_buildable_turbine_fullpower, 0 ); + return; + } + switch( self.turbine_power_level ) + { + case 3: + case 4: + animlength = getanimlength( %o_zombie_buildable_turbine_fullpower ); + self.buildableturbine setanim( %o_zombie_buildable_turbine_fullpower ); + break; + case 2: + animlength = getanimlength( %o_zombie_buildable_turbine_halfpower ); + self.buildableturbine setanim( %o_zombie_buildable_turbine_halfpower ); + break; + case 1: + animlength = getanimlength( %o_zombie_buildable_turbine_neardeath ); + self.buildableturbine setanim( %o_zombie_buildable_turbine_neardeath ); + break; + } + if ( is_true( wait_for_end ) ) + { + wait animlength; + } } -turbinedecay() +turbinedecay() //checked changed to match cerberus output //order of operations may need to be checked { - self notify( "turbineDecay" ); - self endon( "turbineDecay" ); - self endon( "death" ); - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - self.buildableturbine endon( "death" ); - roundlives = 4; - - if ( !isdefined( self.turbine_power_level ) ) - self.turbine_power_level = roundlives; - - while ( self.turbine_health > 0 ) - { - old_power_level = self.turbine_power_level; - - if ( isdefined( self.turbine_emped ) && self.turbine_emped && !!( isdefined( self.turbine_is_powering_on ) && self.turbine_is_powering_on ) ) - { - emp_time = level.zombie_vars["emp_perk_off_time"]; - now = gettime(); - emp_time_left = emp_time - ( now - self.turbine_emp_time ) / 1000; - - if ( emp_time_left <= 0 ) - { - self.turbine_emped = undefined; - self.turbine_emp_time = undefined; - self.turbine_power_is_on = 0; - old_power_level = -1; - } - } - - if ( isdefined( self.turbine_emped ) && self.turbine_emped ) - self.turbine_power_level = 0; - else if ( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) - { - cost = 1; - - if ( isdefined( self.localpower ) ) - cost += maps\mp\zombies\_zm_power::get_local_power_cost( self.localpower ); - - self.turbine_health -= cost; - - if ( self.turbine_health < 200 ) - self.turbine_power_level = 1; - else if ( self.turbine_health < 600 ) - self.turbine_power_level = 2; - else - self.turbine_power_level = 4; - } - - if ( old_power_level != self.turbine_power_level ) - { - self notify( "turbine_power_change" ); - self thread turbineaudio(); - - if ( !( isdefined( self.buildableturbine.dying ) && self.buildableturbine.dying ) ) - self thread turbineanim(); - } - - wait 1; - } - - self destroy_placed_turbine(); - - if ( isdefined( self.buildableturbine ) ) - turbine_disappear_fx( self.buildableturbine.origin ); - - self thread wait_and_take_equipment(); - self.turbine_health = undefined; - self.turbine_power_level = undefined; - self.turbine_round_start = undefined; - self.turbine_power_on = undefined; - self.turbine_emped = undefined; - self.turbine_emp_time = undefined; - self cleanupoldturbine(); + self notify( "turbineDecay" ); + self endon( "turbineDecay" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + self.buildableturbine endon( "death" ); + roundlives = 4; + if ( !isDefined( self.turbine_power_level ) ) + { + self.turbine_power_level = roundlives; + } + while ( self.turbine_health > 0 ) + { + old_power_level = self.turbine_power_level; + if ( is_true( self.turbine_emped ) && is_true( self.turbine_is_powering_on ) ) + { + emp_time = level.zombie_vars[ "emp_perk_off_time" ]; + now = getTime(); + emp_time_left = emp_time - ( ( now - self.turbine_emp_time ) / 1000 ); + if ( emp_time_left <= 0 ) + { + self.turbine_emped = undefined; + self.turbine_emp_time = undefined; + self.turbine_power_is_on = 0; + old_power_level = -1; + } + } + if ( is_true( self.turbine_emped ) ) + { + self.turbine_power_level = 0; + } + else if ( is_true( self.turbine_power_is_on ) ) + { + cost = 1; + if ( isDefined( self.localpower ) ) + { + cost += maps/mp/zombies/_zm_power::get_local_power_cost( self.localpower ); + } + self.turbine_health -= cost; + if ( self.turbine_health < 200 ) + { + self.turbine_power_level = 1; + break; + } + else if ( self.turbine_health < 600 ) + { + self.turbine_power_level = 2; + break; + } + else + { + self.turbine_power_level = 4; + } + } + if ( old_power_level != self.turbine_power_level ) + { + self notify( "turbine_power_change" ); + self thread turbineaudio(); + if ( !is_true( self.buildableturbine.dying ) ) + { + self thread turbineanim(); + } + } + wait 1; + } + self destroy_placed_turbine(); + if ( isDefined( self.buildableturbine ) ) + { + turbine_disappear_fx( self.buildableturbine.origin ); + } + self thread wait_and_take_equipment(); + self.turbine_health = undefined; + self.turbine_power_level = undefined; + self.turbine_round_start = undefined; + self.turbine_power_on = undefined; + self.turbine_emped = undefined; + self.turbine_emp_time = undefined; + self cleanupoldturbine(); } -destroy_placed_turbine() +destroy_placed_turbine() //checked matches cerberus output { - if ( isdefined( self.buildableturbine ) ) - { - if ( isdefined( self.buildableturbine.dying ) && self.buildableturbine.dying ) - { - while ( isdefined( self.buildableturbine ) ) - wait 0.05; - - return; - } - - if ( isdefined( self.buildableturbine.stub ) ) - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.buildableturbine.stub ); - - thread turbine_disappear_fx( self.buildableturbine.origin, 0.75 ); - self.buildableturbine.dying = 1; - self turbineanim( 1 ); - } + if ( isDefined( self.buildableturbine ) ) + { + if ( is_true( self.buildableturbine.dying ) ) + { + while ( isDefined( self.buildableturbine ) ) + { + wait 0.05; + } + return; + } + if ( isDefined( self.buildableturbine.stub ) ) + { + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildableturbine.stub ); + } + thread turbine_disappear_fx( self.buildableturbine.origin, 0,75 ); + self.buildableturbine.dying = 1; + self turbineanim( 1 ); + } } -wait_and_take_equipment() +wait_and_take_equipment() //checked matches cerberus output { - wait 0.05; - self thread maps\mp\zombies\_zm_equipment::equipment_release( "equip_turbine_zm" ); + wait 0.05; + self thread maps/mp/zombies/_zm_equipment::equipment_release( "equip_turbine_zm" ); } -turbinepowerdiminish( origin, powerradius ) +turbinepowerdiminish( origin, powerradius ) //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - self.buildableturbine endon( "death" ); - - while ( !( isdefined( self.buildableturbine.dying ) && self.buildableturbine.dying ) ) - { - if ( isdefined( self.turbine_power_level ) && isdefined( self.buildableturbine ) ) - { - switch ( self.turbine_power_level ) - { - case "4": - break; - case "3": - break; - case "2": - self.turbine_power_on = 1; - wait( randomintrange( 12, 20 ) ); - self turbinepoweroff( origin, powerradius ); - self.turbine_power_on = 0; - wait( randomintrange( 3, 8 ) ); - self turbinepoweron( origin, powerradius ); - break; - case "1": - self.turbine_power_on = 1; - wait( randomintrange( 3, 7 ) ); - self turbinepoweroff( origin, powerradius ); - self.turbine_power_on = 0; - wait( randomintrange( 6, 12 ) ); - self turbinepoweron( origin, powerradius ); - break; - } - } - - wait 0.05; - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + self.buildableturbine endon( "death" ); + while ( !is_true( self.buildableturbine.dying ) ) + { + if ( isDefined( self.turbine_power_level ) && isDefined( self.buildableturbine ) ) + { + switch( self.turbine_power_level ) + { + case 4: + break; + case 3: + break; + case 2: + self.turbine_power_on = 1; + wait randomintrange( 12, 20 ); + self turbinepoweroff( origin, powerradius ); + self.turbine_power_on = 0; + wait randomintrange( 3, 8 ); + self turbinepoweron( origin, powerradius ); + break; + case 1: + self.turbine_power_on = 1; + wait randomintrange( 3, 7 ); + self turbinepoweroff( origin, powerradius ); + self.turbine_power_on = 0; + wait randomintrange( 6, 12 ); + self turbinepoweron( origin, powerradius ); + break; + } + wait 0.05; + } + } } -debugturbine( radius ) +debugturbine( radius ) //checked changed to match cerberus output may need to check order of operations { + /* /# - self endon( "death" ); - self endon( "disconnect" ); - self endon( "equip_turbine_zm_taken" ); - self.buildableturbine endon( "death" ); - - while ( isdefined( self.buildableturbine ) ) - { - if ( getdvarint( _hash_EB512CB7 ) ) - { - color = ( 0, 1, 0 ); - text = ""; - - if ( isdefined( self.turbine_health ) ) - text = "" + self.turbine_health + ""; - - if ( isdefined( self.buildableturbine.dying ) && self.buildableturbine.dying ) - { - text = "dying"; - color = ( 0, 0, 0 ); - } - else if ( isdefined( self.turbine_emped ) && self.turbine_emped ) - { - color = ( 0, 0, 1 ); - emp_time = level.zombie_vars["emp_perk_off_time"]; - now = gettime(); - emp_time_left = int( emp_time - ( now - self.turbine_emp_time ) / 1000 ); - text = text + " emp(" + emp_time_left + ")"; - } - else if ( isdefined( self.turbine_is_powering_on ) && self.turbine_is_powering_on ) - text += " warmup"; - else if ( isdefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) - { - if ( self.turbine_health < 200 ) - color = ( 1, 0, 0 ); - else if ( self.turbine_health < 600 ) - color = ( 1, 0.7, 0 ); - else - color = ( 1, 1, 0 ); - } - - print3d( self.buildableturbine.origin + vectorscale( ( 0, 0, 1 ), 60.0 ), text, color, 1, 0.5, 1 ); - } - - wait 0.05; - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_turbine_zm_taken" ); + self.buildableturbine endon( "death" ); + while ( isDefined( self.buildableturbine ) ) + { + //missing dvar name + if ( getDvarInt( #"EB512CB7" ) ) + { + color = ( 0, 1, 0 ); + text = ""; + if ( isDefined( self.turbine_health ) ) + { + text = "" + self.turbine_health + ""; + } + if ( isDefined( self.buildableturbine.dying ) && self.buildableturbine.dying ) + { + text = "dying"; + color = ( 0, 0, 0 ); + } + else + { + if ( isDefined( self.turbine_emped ) && self.turbine_emped ) + { + color = ( 0, 0, 1 ); + emp_time = level.zombie_vars[ "emp_perk_off_time" ]; + now = getTime(); + emp_time_left = int( emp_time - ( ( now - self.turbine_emp_time ) / 1000 ) ); + text = ( text + " emp(" ) + emp_time_left + ")"; + break; + } + else + { + if ( isDefined( self.turbine_is_powering_on ) && self.turbine_is_powering_on ) + { + text += " warmup"; + break; + } + else + { + if ( isDefined( self.turbine_power_is_on ) && self.turbine_power_is_on ) + { + if ( self.turbine_health < 200 ) + { + color = ( 1, 0, 0 ); + break; + } + else if ( self.turbine_health < 600 ) + { + color = ( 1, 0,7, 0 ); + break; + } + else + { + color = ( 1, 1, 0 ); + } + } + } + } + } + print3d( self.buildableturbine.origin + vectorScale( ( 0, 0, 1 ), 60 ), text, color, 1, 0.5, 1 ); + } + wait 0.05; #/ + } + */ } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equipment.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equipment.gsc index 58d01d8..9f1549c 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equipment.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equipment.gsc @@ -1,1744 +1,1905 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_buildables; -#include maps\mp\zombies\_zm_unitrigger; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_spawner; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - init_equipment_upgrade(); - onplayerconnect_callback( ::equipment_placement_watcher ); - level._equipment_disappear_fx = loadfx( "maps/zombie/fx_zmb_tranzit_electrap_explo" ); + init_equipment_upgrade(); + onplayerconnect_callback( ::equipment_placement_watcher ); + level._equipment_disappear_fx = loadfx( "maps/zombie/fx_zmb_tranzit_electrap_explo" ); + if ( !is_true( level.disable_fx_zmb_tranzit_shield_explo ) ) + { + level._riotshield_dissapear_fx = loadfx( "maps/zombie/fx_zmb_tranzit_shield_explo" ); + } + level.placeable_equipment_destroy_fn = []; + registerclientfield( "scriptmover", "equipment_activated", 12000, 4, "int" ); - if ( !( isdefined( level.disable_fx_zmb_tranzit_shield_explo ) && level.disable_fx_zmb_tranzit_shield_explo ) ) - level._riotshield_dissapear_fx = loadfx( "maps/zombie/fx_zmb_tranzit_shield_explo" ); - - level.placeable_equipment_destroy_fn = []; - - if ( !( isdefined( level._no_equipment_activated_clientfield ) && level._no_equipment_activated_clientfield ) ) - registerclientfield( "scriptmover", "equipment_activated", 12000, 4, "int" ); + if ( !is_true( level._no_equipment_activated_clientfield ) ) + { + registerclientfield( "scriptmover", "equipment_activated", 12000, 4, "int" ); + } } -signal_equipment_activated( val ) +signal_equipment_activated( val ) //checked changed to match cerberus output { - if ( !isdefined( val ) ) - val = 1; - - if ( isdefined( level._no_equipment_activated_clientfield ) && level._no_equipment_activated_clientfield ) - return; - - self endon( "death" ); - self setclientfield( "equipment_activated", val ); - - for ( i = 0; i < 2; i++ ) - wait_network_frame(); - - self setclientfield( "equipment_activated", 0 ); + if ( !isDefined( val ) ) + { + val = 1; + } + if ( is_true( level._no_equipment_activated_clientfield ) ) + { + return; + } + self endon( "death" ); + self setclientfield( "equipment_activated", val ); + for ( i = 0; i < 2; i++ ) + { + wait_network_frame(); + } + self setclientfield( "equipment_activated", 0 ); } -register_equipment( equipment_name, hint, howto_hint, hint_icon, equipmentvo, watcher_thread, transfer_fn, drop_fn, pickup_fn, place_fn ) +register_equipment( equipment_name, hint, howto_hint, hint_icon, equipmentvo, watcher_thread, transfer_fn, drop_fn, pickup_fn, place_fn ) //checked matches cerberus output { - if ( !isdefined( level.zombie_include_equipment ) || !( isdefined( level.zombie_include_equipment[equipment_name] ) && level.zombie_include_equipment[equipment_name] ) ) - return; - - precachestring( hint ); - - if ( isdefined( hint_icon ) ) - precacheshader( hint_icon ); - - struct = spawnstruct(); - - if ( !isdefined( level.zombie_equipment ) ) - level.zombie_equipment = []; - - struct.equipment_name = equipment_name; - struct.hint = hint; - struct.howto_hint = howto_hint; - struct.hint_icon = hint_icon; - struct.vox = equipmentvo; - struct.triggers = []; - struct.models = []; - struct.watcher_thread = watcher_thread; - struct.transfer_fn = transfer_fn; - struct.drop_fn = drop_fn; - struct.pickup_fn = pickup_fn; - struct.place_fn = place_fn; - level.zombie_equipment[equipment_name] = struct; + if ( !isDefined( level.zombie_include_equipment ) || !is_true( level.zombie_include_equipment[ equipment_name ] ) ) + { + return; + } + precachestring( hint ); + if ( isDefined( hint_icon ) ) + { + precacheshader( hint_icon ); + } + struct = spawnstruct(); + if ( !isDefined( level.zombie_equipment ) ) + { + level.zombie_equipment = []; + } + struct.equipment_name = equipment_name; + struct.hint = hint; + struct.howto_hint = howto_hint; + struct.hint_icon = hint_icon; + struct.vox = equipmentvo; + struct.triggers = []; + struct.models = []; + struct.watcher_thread = watcher_thread; + struct.transfer_fn = transfer_fn; + struct.drop_fn = drop_fn; + struct.pickup_fn = pickup_fn; + struct.place_fn = place_fn; + level.zombie_equipment[ equipment_name ] = struct; } -is_equipment_included( equipment_name ) +is_equipment_included( equipment_name ) //checked changed at own discretion { - if ( !isdefined( level.zombie_include_equipment ) ) - return 0; - - return isdefined( level.zombie_include_equipment[equipment_name] ); + if ( !isDefined( level.zombie_include_equipment ) ) + { + return 0; + } + if ( !isDefined( level.zombie_include_equipment[ equipment_name ] ) ) + { + return 0; + } + if ( level.zombie_include_equipment[ equipment_name ] == 0 ) + { + return 0; + } + return 1; } -include_zombie_equipment( equipment_name ) +include_zombie_equipment( equipment_name ) //checked matches cerberus output { - if ( !isdefined( level.zombie_include_equipment ) ) - level.zombie_include_equipment = []; - - level.zombie_include_equipment[equipment_name] = 1; - precacheitem( equipment_name ); + if ( !isDefined( level.zombie_include_equipment ) ) + { + level.zombie_include_equipment = []; + } + level.zombie_include_equipment[ equipment_name ] = 1; + precacheitem( equipment_name ); } -limit_zombie_equipment( equipment_name, limited ) +limit_zombie_equipment( equipment_name, limited ) //checked matches cerberus output { - if ( !isdefined( level._limited_equipment ) ) - level._limited_equipment = []; - - if ( limited ) - level._limited_equipment[level._limited_equipment.size] = equipment_name; - else - arrayremovevalue( level._limited_equipment, equipment_name, 0 ); + if ( !isDefined( level._limited_equipment ) ) + { + level._limited_equipment = []; + } + if ( limited ) + { + level._limited_equipment[ level._limited_equipment.size ] = equipment_name; + } + else + { + arrayremovevalue( level._limited_equipment, equipment_name, 0 ); + } } -init_equipment_upgrade() +init_equipment_upgrade() //checked changed to match cerberus output { - equipment_spawns = []; - equipment_spawns = getentarray( "zombie_equipment_upgrade", "targetname" ); - - for ( i = 0; i < equipment_spawns.size; i++ ) - { - hint_string = get_equipment_hint( equipment_spawns[i].zombie_equipment_upgrade ); - equipment_spawns[i] sethintstring( hint_string ); - equipment_spawns[i] setcursorhint( "HINT_NOICON" ); - equipment_spawns[i] usetriggerrequirelookat(); - equipment_spawns[i] add_to_equipment_trigger_list( equipment_spawns[i].zombie_equipment_upgrade ); - equipment_spawns[i] thread equipment_spawn_think(); - } + equipment_spawns = []; + equipment_spawns = getentarray( "zombie_equipment_upgrade", "targetname" ); + for ( i = 0; i < equipment_spawns.size; i++ ) + { + hint_string = get_equipment_hint( equipment_spawns[ i ].zombie_equipment_upgrade ); + equipment_spawns[ i ] sethintstring( hint_string ); + equipment_spawns[ i ] setcursorhint( "HINT_NOICON" ); + equipment_spawns[ i ] usetriggerrequirelookat(); + equipment_spawns[ i ] add_to_equipment_trigger_list( equipment_spawns[ i ].zombie_equipment_upgrade ); + equipment_spawns[ i ] thread equipment_spawn_think(); + } } -get_equipment_hint( equipment_name ) +get_equipment_hint( equipment_name ) //checked matches cerberus output { +/* /# - assert( isdefined( level.zombie_equipment[equipment_name] ), equipment_name + " was not included or is not registered with the equipment system." ); + assert( isDefined( level.zombie_equipment[ equipment_name ] ), equipment_name + " was not included or is not registered with the equipment system." ); #/ - return level.zombie_equipment[equipment_name].hint; +*/ + return level.zombie_equipment[ equipment_name ].hint; } -get_equipment_howto_hint( equipment_name ) +get_equipment_howto_hint( equipment_name ) //checked matches cerberus output { +/* /# - assert( isdefined( level.zombie_equipment[equipment_name] ), equipment_name + " was not included or is not registered with the equipment system." ); + assert( isDefined( level.zombie_equipment[ equipment_name ] ), equipment_name + " was not included or is not registered with the equipment system." ); #/ - return level.zombie_equipment[equipment_name].howto_hint; +*/ + return level.zombie_equipment[ equipment_name ].howto_hint; } -get_equipment_icon( equipment_name ) +get_equipment_icon( equipment_name ) //checked matches cerberus output { +/* /# - assert( isdefined( level.zombie_equipment[equipment_name] ), equipment_name + " was not included or is not registered with the equipment system." ); + assert( isDefined( level.zombie_equipment[ equipment_name ] ), equipment_name + " was not included or is not registered with the equipment system." ); #/ - return level.zombie_equipment[equipment_name].hint_icon; +*/ + return level.zombie_equipment[ equipment_name ].hint_icon; } -add_to_equipment_trigger_list( equipment_name ) +add_to_equipment_trigger_list( equipment_name ) //checked matches cerberus output { +/* /# - assert( isdefined( level.zombie_equipment[equipment_name] ), equipment_name + " was not included or is not registered with the equipment system." ); + assert( isDefined( level.zombie_equipment[ equipment_name ] ), equipment_name + " was not included or is not registered with the equipment system." ); #/ - level.zombie_equipment[equipment_name].triggers[level.zombie_equipment[equipment_name].triggers.size] = self; - level.zombie_equipment[equipment_name].models[level.zombie_equipment[equipment_name].models.size] = getent( self.target, "targetname" ); +*/ + level.zombie_equipment[ equipment_name ].triggers[ level.zombie_equipment[ equipment_name ].triggers.size ] = self; + level.zombie_equipment[ equipment_name ].models[ level.zombie_equipment[ equipment_name ].models.size ] = getent( self.target, "targetname" ); } -equipment_spawn_think() +equipment_spawn_think() //checked changed to match cerberus output { - for (;;) - { - self waittill( "trigger", player ); - - if ( player in_revive_trigger() || player.is_drinking > 0 ) - { - wait 0.1; - continue; - } - - if ( is_limited_equipment( self.zombie_equipment_upgrade ) ) - { - player setup_limited_equipment( self.zombie_equipment_upgrade ); - - if ( isdefined( level.hacker_tool_positions ) ) - { - new_pos = random( level.hacker_tool_positions ); - self.origin = new_pos.trigger_org; - model = getent( self.target, "targetname" ); - model.origin = new_pos.model_org; - model.angles = new_pos.model_ang; - } - } - - player equipment_give( self.zombie_equipment_upgrade ); - } + for ( ;; ) + { + self waittill( "trigger", player ); + if ( player in_revive_trigger() || player.is_drinking > 0 ) + { + wait 0.1; + continue; + } + if ( is_limited_equipment( self.zombie_equipment_upgrade ) ) + { + player setup_limited_equipment( self.zombie_equipment_upgrade ); + if ( isDefined( level.hacker_tool_positions ) ) + { + new_pos = random( level.hacker_tool_positions ); + self.origin = new_pos.trigger_org; + model = getent( self.target, "targetname" ); + model.origin = new_pos.model_org; + model.angles = new_pos.model_ang; + } + } + player equipment_give( self.zombie_equipment_upgrade ); + } } -set_equipment_invisibility_to_player( equipment, invisible ) +set_equipment_invisibility_to_player( equipment, invisible ) //checked changed to match cerberus output { - triggers = level.zombie_equipment[equipment].triggers; - - for ( i = 0; i < triggers.size; i++ ) - { - if ( isdefined( triggers[i] ) ) - triggers[i] setinvisibletoplayer( self, invisible ); - } - - models = level.zombie_equipment[equipment].models; - - for ( i = 0; i < models.size; i++ ) - { - if ( isdefined( models[i] ) ) - models[i] setinvisibletoplayer( self, invisible ); - } + triggers = level.zombie_equipment[ equipment ].triggers; + for ( i = 0; i < triggers.size; i++ ) + { + if ( isDefined( triggers[ i ] ) ) + { + triggers[ i ] setinvisibletoplayer( self, invisible ); + } + } + models = level.zombie_equipment[ equipment ].models; + for ( i = 0; i < models.size; i++ ) + { + if ( isDefined( models[ i ] ) ) + { + models[ i ] setinvisibletoplayer( self, invisible ); + } + } } -equipment_take( equipment ) +equipment_take( equipment ) //checked matches cerberus output { - if ( !isdefined( equipment ) ) - equipment = self get_player_equipment(); - - if ( !isdefined( equipment ) ) - return; - - if ( !self has_player_equipment( equipment ) ) - return; - - current = 0; - current_weapon = 0; - - if ( isdefined( self get_player_equipment() ) && equipment == self get_player_equipment() ) - current = 1; - - if ( equipment == self getcurrentweapon() ) - current_weapon = 1; + if ( !isDefined( equipment ) ) + { + equipment = self get_player_equipment(); + } + if ( !isDefined( equipment ) ) + { + return; + } + if ( !self has_player_equipment( equipment ) ) + { + return; + } + current = 0; + current_weapon = 0; + if ( isDefined( self get_player_equipment() ) && equipment == self get_player_equipment() ) + { + current = 1; + } + if ( equipment == self getcurrentweapon() ) + { + current_weapon = 1; + } + /* /# - println( "ZM EQUIPMENT: " + self.name + " lost " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " lost " + equipment + "\n" ); #/ - if ( isdefined( self.current_equipment_active[equipment] ) && self.current_equipment_active[equipment] ) - { - self.current_equipment_active[equipment] = 0; - self notify( equipment + "_deactivate" ); - } - - self notify( equipment + "_taken" ); - self takeweapon( equipment ); - - if ( !is_limited_equipment( equipment ) || is_limited_equipment( equipment ) && !limited_equipment_in_use( equipment ) ) - self set_equipment_invisibility_to_player( equipment, 0 ); - - if ( current ) - { - self set_player_equipment( undefined ); - self setactionslot( 1, "" ); - } - else - arrayremovevalue( self.deployed_equipment, equipment ); - - if ( current_weapon ) - { - primaryweapons = self getweaponslistprimaries(); - - if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) - self switchtoweapon( primaryweapons[0] ); - } + */ + if ( is_true( self.current_equipment_active[ equipment ] ) ) + { + self.current_equipment_active[ equipment ] = 0; + self notify( equipment + "_deactivate" ); + } + self notify( equipment + "_taken" ); + self takeweapon( equipment ); + if ( !is_limited_equipment( equipment ) || is_limited_equipment( equipment ) && !limited_equipment_in_use( equipment ) ) + { + self set_equipment_invisibility_to_player( equipment, 0 ); + } + if ( current ) + { + self set_player_equipment( undefined ); + self setactionslot( 1, "" ); + } + else + { + arrayremovevalue( self.deployed_equipment, equipment ); + } + if ( current_weapon ) + { + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + } + } } -equipment_give( equipment ) +equipment_give( equipment ) //checked matches cerberus output { - if ( !isdefined( equipment ) ) - return; - - if ( !isdefined( level.zombie_equipment[equipment] ) ) - return; - - if ( self has_player_equipment( equipment ) ) - return; + if ( !isDefined( equipment ) ) + { + return; + } + if ( !isDefined( level.zombie_equipment[ equipment ] ) ) + { + return; + } + if ( self has_player_equipment( equipment ) ) + { + return; + } + /* /# - println( "ZM EQUIPMENT: " + self.name + " got " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " got " + equipment + "\n" ); #/ - curr_weapon = self getcurrentweapon(); - curr_weapon_was_curr_equipment = self is_player_equipment( curr_weapon ); - self equipment_take(); - self set_player_equipment( equipment ); - self giveweapon( equipment ); - self setweaponammoclip( equipment, 1 ); - self thread show_equipment_hint( equipment ); - self notify( equipment + "_given" ); - self set_equipment_invisibility_to_player( equipment, 1 ); - self setactionslot( 1, "weapon", equipment ); - - if ( isdefined( level.zombie_equipment[equipment].watcher_thread ) ) - self thread [[ level.zombie_equipment[equipment].watcher_thread ]](); - - self thread equipment_slot_watcher( equipment ); - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "weapon_pickup", level.zombie_equipment[equipment].vox ); + */ + curr_weapon = self getcurrentweapon(); + curr_weapon_was_curr_equipment = self is_player_equipment( curr_weapon ); + self equipment_take(); + self set_player_equipment( equipment ); + self giveweapon( equipment ); + self setweaponammoclip( equipment, 1 ); + self thread show_equipment_hint( equipment ); + self notify( equipment + "_given" ); + self set_equipment_invisibility_to_player( equipment, 1 ); + self setactionslot( 1, "weapon", equipment ); + if ( isDefined( level.zombie_equipment[ equipment ].watcher_thread ) ) + { + self thread [[ level.zombie_equipment[ equipment ].watcher_thread ]](); + } + self thread equipment_slot_watcher( equipment ); + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", level.zombie_equipment[ equipment ].vox ); } -equipment_slot_watcher( equipment ) +equipment_slot_watcher( equipment ) //checked changed to match cerberus output { - self notify( "kill_equipment_slot_watcher" ); - self endon( "kill_equipment_slot_watcher" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "weapon_change", curr_weapon, prev_weapon ); - - self.prev_weapon_before_equipment_change = undefined; - - if ( isdefined( prev_weapon ) && "none" != prev_weapon ) - { - prev_weapon_type = weaponinventorytype( prev_weapon ); - - if ( "primary" == prev_weapon_type || "altmode" == prev_weapon_type ) - self.prev_weapon_before_equipment_change = prev_weapon; - } - - if ( isdefined( level.zombie_equipment[equipment].watcher_thread ) ) - { - if ( curr_weapon == equipment ) - { - if ( self.current_equipment_active[equipment] == 1 ) - { - self notify( equipment + "_deactivate" ); - self.current_equipment_active[equipment] = 0; - } - else if ( self.current_equipment_active[equipment] == 0 ) - { - self notify( equipment + "_activate" ); - self.current_equipment_active[equipment] = 1; - } - - self waittill( "equipment_select_response_done" ); - } - } - else if ( curr_weapon == equipment && !self.current_equipment_active[equipment] ) - { - self notify( equipment + "_activate" ); - self.current_equipment_active[equipment] = 1; - } - else if ( curr_weapon != equipment && self.current_equipment_active[equipment] ) - { - self notify( equipment + "_deactivate" ); - self.current_equipment_active[equipment] = 0; - } - } + self notify( "kill_equipment_slot_watcher" ); + self endon( "kill_equipment_slot_watcher" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "weapon_change", curr_weapon, prev_weapon ); + self.prev_weapon_before_equipment_change = undefined; + if ( isDefined( prev_weapon ) && prev_weapon != "none" ) + { + prev_weapon_type = weaponinventorytype( prev_weapon ); + if ( prev_weapon_type == "primary" || prev_weapon_type == "altmode" ) + { + self.prev_weapon_before_equipment_change = prev_weapon; + } + } + if ( isDefined( level.zombie_equipment[ equipment ].watcher_thread ) ) + { + if ( curr_weapon == equipment ) + { + if ( self.current_equipment_active[ equipment ] == 1 ) + { + self notify( equipment + "_deactivate" ); + self.current_equipment_active[ equipment ] = 0; + } + else + { + if ( self.current_equipment_active[ equipment ] == 0 ) + { + self notify( equipment + "_activate" ); + self.current_equipment_active[ equipment ] = 1; + } + } + self waittill( "equipment_select_response_done" ); + } + } + else if ( curr_weapon == equipment && !self.current_equipment_active[ equipment ] ) + { + self notify( equipment + "_activate" ); + self.current_equipment_active[ equipment ] = 1; + } + else if ( curr_weapon != equipment && self.current_equipment_active[ equipment ] ) + { + self notify( equipment + "_deactivate" ); + self.current_equipment_active[ equipment ] = 0; + } + } } -is_limited_equipment( equipment ) +is_limited_equipment( equipment ) //checked changed to match cerberus output { - if ( isdefined( level._limited_equipment ) ) - { - for ( i = 0; i < level._limited_equipment.size; i++ ) - { - if ( level._limited_equipment[i] == equipment ) - return true; - } - } - - return false; + if ( isDefined( level._limited_equipment ) ) + { + for ( i = 0; i < level._limited_equipment.size; i++ ) + { + if ( level._limited_equipment[ i ] == equipment ) + { + return 1; + } + } + } + return 0; } -limited_equipment_in_use( equipment ) +limited_equipment_in_use( equipment ) //checked changed to match cerberus output { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - current_equipment = players[i] get_player_equipment(); - - if ( isdefined( current_equipment ) && current_equipment == equipment ) - return true; - } - - if ( isdefined( level.dropped_equipment ) && isdefined( level.dropped_equipment[equipment] ) ) - return true; - - return false; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + current_equipment = players[ i ] get_player_equipment(); + if ( isDefined( current_equipment ) && current_equipment == equipment ) + { + return 1; + } + } + if ( isDefined( level.dropped_equipment ) && isDefined( level.dropped_equipment[ equipment ] ) ) + { + return 1; + } + return 0; } -setup_limited_equipment( equipment ) +setup_limited_equipment( equipment ) //checked changed to match cerberus output { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] set_equipment_invisibility_to_player( equipment, 1 ); - - self thread release_limited_equipment_on_disconnect( equipment ); - self thread release_limited_equipment_on_equipment_taken( equipment ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] set_equipment_invisibility_to_player( equipment, 1 ); + } + self thread release_limited_equipment_on_disconnect( equipment ); + self thread release_limited_equipment_on_equipment_taken( equipment ); } -release_limited_equipment_on_equipment_taken( equipment ) +release_limited_equipment_on_equipment_taken( equipment ) //checked changed to match cerberus output { - self endon( "disconnect" ); - self waittill_either( equipment + "_taken", "spawned_spectator" ); - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] set_equipment_invisibility_to_player( equipment, 0 ); + self endon( "disconnect" ); + self waittill_either( equipment + "_taken", "spawned_spectator" ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] set_equipment_invisibility_to_player( equipment, 0 ); + } } -release_limited_equipment_on_disconnect( equipment ) +release_limited_equipment_on_disconnect( equipment ) //checked changed to match cerberus output { - self endon( equipment + "_taken" ); - - self waittill( "disconnect" ); - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isalive( players[i] ) ) - players[i] set_equipment_invisibility_to_player( equipment, 0 ); - } + self endon( equipment + "_taken" ); + self waittill( "disconnect" ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( isalive( players[ i ] ) ) + { + players[ i ] set_equipment_invisibility_to_player( equipment, 0 ); + } + } } -is_equipment_active( equipment ) +is_equipment_active( equipment ) //changed at own discretion { - if ( !isdefined( self.current_equipment_active ) || !isdefined( self.current_equipment_active[equipment] ) ) - return 0; - - return self.current_equipment_active[equipment]; + if ( !isDefined( self.current_equipment_active ) || !isDefined( self.current_equipment_active[ equipment ] ) ) + { + return 0; + } + if ( self.current_equipment_active[ equipment ] ) + { + return 1; + } + return 0; } -init_equipment_hint_hudelem( x, y, alignx, aligny, fontscale, alpha ) +init_equipment_hint_hudelem( x, y, alignx, aligny, fontscale, alpha ) //checked matches cerberus output { - self.x = x; - self.y = y; - self.alignx = alignx; - self.aligny = aligny; - self.fontscale = fontscale; - self.alpha = alpha; - self.sort = 20; + self.x = x; + self.y = y; + self.alignx = alignx; + self.aligny = aligny; + self.fontscale = fontscale; + self.alpha = alpha; + self.sort = 20; } -setup_equipment_client_hintelem() +setup_equipment_client_hintelem() //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - - if ( !isdefined( self.hintelem ) ) - self.hintelem = newclienthudelem( self ); - - if ( level.splitscreen ) - self.hintelem init_equipment_hint_hudelem( 160, 90, "center", "middle", 1.6, 1.0 ); - else - self.hintelem init_equipment_hint_hudelem( 320, 220, "center", "bottom", 1.6, 1.0 ); + self endon( "death" ); + self endon( "disconnect" ); + if ( !isDefined( self.hintelem ) ) + { + self.hintelem = newclienthudelem( self ); + } + if ( level.splitscreen ) + { + self.hintelem init_equipment_hint_hudelem( 160, 90, "center", "middle", 1.6, 1 ); + } + else + { + self.hintelem init_equipment_hint_hudelem( 320, 220, "center", "bottom", 1.6, 1 ); + } } -show_equipment_hint( equipment ) +show_equipment_hint( equipment ) //checked matches cerberus output { - self notify( "kill_previous_show_equipment_hint_thread" ); - self endon( "kill_previous_show_equipment_hint_thread" ); - self endon( "death" ); - self endon( "disconnect" ); - - if ( isdefined( self.do_not_display_equipment_pickup_hint ) && self.do_not_display_equipment_pickup_hint ) - return; - - wait 0.5; - text = get_equipment_howto_hint( equipment ); - self show_equipment_hint_text( text ); + self notify( "kill_previous_show_equipment_hint_thread" ); + self endon( "kill_previous_show_equipment_hint_thread" ); + self endon( "death" ); + self endon( "disconnect" ); + if ( is_true( self.do_not_display_equipment_pickup_hint ) ) + { + return; + } + wait 0.5; + text = get_equipment_howto_hint( equipment ); + self show_equipment_hint_text( text ); } -show_equipment_hint_text( text ) +show_equipment_hint_text( text ) //checked matches cerberus output { - self notify( "hide_equipment_hint_text" ); - wait 0.05; - self setup_equipment_client_hintelem(); - self.hintelem settext( text ); - self.hintelem.alpha = 1; - self.hintelem.font = "small"; - self.hintelem.fontscale = 1.25; - self.hintelem.hidewheninmenu = 1; - time = self waittill_notify_or_timeout( "hide_equipment_hint_text", 3.2 ); - - if ( isdefined( time ) ) - { - self.hintelem fadeovertime( 0.25 ); - self.hintelem.alpha = 0; - self waittill_notify_or_timeout( "hide_equipment_hint_text", 0.25 ); - } - - self.hintelem settext( "" ); - self.hintelem destroy(); + self notify( "hide_equipment_hint_text" ); + wait 0.05; + self setup_equipment_client_hintelem(); + self.hintelem settext( text ); + self.hintelem.alpha = 1; + self.hintelem.font = "small"; + self.hintelem.fontscale = 1.25; + self.hintelem.hidewheninmenu = 1; + time = self waittill_notify_or_timeout( "hide_equipment_hint_text", 3.2 ); + if ( isDefined( time ) ) + { + self.hintelem fadeovertime( 0.25 ); + self.hintelem.alpha = 0; + self waittill_notify_or_timeout( "hide_equipment_hint_text", 0.25 ); + } + self.hintelem settext( "" ); + self.hintelem destroy(); } -equipment_onspawnretrievableweaponobject( watcher, player ) +equipment_onspawnretrievableweaponobject( watcher, player ) //checked partially changed to match cerberus output changed at own discretion { - self.plant_parent = self; - iswallmount = isdefined( level.placeable_equipment_type[self.name] ) && level.placeable_equipment_type[self.name] == "wallmount"; - - if ( !isdefined( player.turret_placement ) || !player.turret_placement["result"] ) - { - if ( iswallmount || !getdvarint( "tu11_zombie_turret_placement_ignores_bodies" ) ) - { - self waittill( "stationary" ); - - waittillframeend; - - if ( iswallmount ) - { - if ( isdefined( player.planted_wallmount_on_a_zombie ) && player.planted_wallmount_on_a_zombie ) - { - equip_name = self.name; - thread equipment_disappear_fx( self.origin, undefined, self.angles ); - self delete(); - - if ( player hasweapon( equip_name ) ) - player setweaponammoclip( equip_name, 1 ); - - player.planted_wallmount_on_a_zombie = undefined; - return; - } - } - } - else - { - self.plant_parent = player; - self.origin = player.origin; - self.angles = player.angles; - wait_network_frame(); - } - } - - equipment = watcher.name + "_zm"; + iswallmount = 0; + self.plant_parent = self; + if ( isDefined( level.placeable_equipment_type[ self.name ] ) && level.placeable_equipment_type[ self.name ] == "wallmount" ) + { + iswallmount = 1; + } + if ( !isDefined( player.turret_placement ) || !player.turret_placement[ "result" ] ) + { + if ( iswallmount /*|| !getDvarInt( #"B3416C1D" )*/ ) + { + self waittill( "stationary" ); + waittillframeend; + if ( iswallmount ) + { + if ( is_true( player.planted_wallmount_on_a_zombie ) ) + { + equip_name = self.name; + thread equipment_disappear_fx( self.origin, undefined, self.angles ); + self delete(); + if ( player hasweapon( equip_name ) ) + { + player setweaponammoclip( equip_name, 1 ); + } + player.planted_wallmount_on_a_zombie = undefined; + return; + } + } + } + else + { + self.plant_parent = player; + self.origin = player.origin; + self.angles = player.angles; + wait_network_frame(); + } + } + equipment = watcher.name + "_zm"; + /* /# - if ( !isdefined( player.current_equipment ) || player.current_equipment != equipment ) - { + if ( !isDefined( player.current_equipment ) || player.current_equipment != equipment ) + { + assert( player has_deployed_equipment( equipment ) ); + assert( !isDefined( player.current_equipment ) ); +#/ + } + */ + if ( isDefined( player.current_equipment ) && player.current_equipment == equipment ) + { + player equipment_to_deployed( equipment ); + } + if ( isDefined( level.zombie_equipment[ equipment ].place_fn ) ) + { + if ( isDefined( player.turret_placement ) && player.turret_placement[ "result" ] ) + { + plant_origin = player.turret_placement[ "origin" ]; + plant_angles = player.turret_placement[ "angles" ]; + } + else if ( isDefined( level.placeable_equipment_type[ self.name ] ) && level.placeable_equipment_type[ self.name ] == "wallmount" ) + { + plant_origin = self.origin; + plant_angles = self.angles; + } + else + { + plant_origin = self.origin; + plant_angles = self.angles; + } + if ( isDefined( level.check_force_deploy_origin ) ) + { + if ( player [[ level.check_force_deploy_origin ]]( self, plant_origin, plant_angles ) ) + { + plant_origin = player.origin; + plant_angles = player.angles; + self.plant_parent = player; + } + } + else if ( isDefined( level.check_force_deploy_z ) ) + { + if ( player [[ level.check_force_deploy_z ]]( self, plant_origin, plant_angles ) ) + { + plant_origin = ( plant_origin[ 0 ], plant_origin[ 1 ], player.origin[ 2 ] + 10 ); + } + } + if ( is_true( iswallmount ) ) + { + self ghost(); + } + replacement = player [[ level.zombie_equipment[ equipment ].place_fn ]]( plant_origin, plant_angles ); + if ( isDefined( replacement ) ) + { + replacement.owner = player; + replacement.original_owner = player; + replacement.name = self.name; + player notify( "equipment_placed" ); + if ( isDefined( level.equipment_planted ) ) + { + player [[ level.equipment_planted ]]( replacement, equipment, self.plant_parent ); + } + player maps/mp/zombies/_zm_buildables::track_buildables_planted( self ); + } + if ( isDefined( self ) ) + { + self delete(); + } + } +} + +equipment_retrieve( player ) //checked changed to match cerberus output +{ + if ( isDefined( self ) ) + { + self stoploopsound(); + original_owner = self.original_owner; + weaponname = self.name; + if ( !isDefined( original_owner ) ) + { + player equipment_give( weaponname ); + self.owner = player; + } + else if ( player != original_owner ) + { + equipment_transfer( weaponname, original_owner, player ); + self.owner = player; + } + player equipment_from_deployed( weaponname ); + if ( is_true( self.requires_pickup ) ) + { + if ( isDefined( level.zombie_equipment[ weaponname ].pickup_fn ) ) + { + self.owner = player; + if ( isDefined( self.damage ) ) + { + player player_set_equipment_damage( weaponname, self.damage ); + } + player [[ level.zombie_equipment[ weaponname ].pickup_fn ]]( self ); + } + } + self.playdialog = 0; + weaponname = self.name; + self delete(); + if ( !player hasweapon( weaponname ) ) + { + player giveweapon( weaponname ); + clip_ammo = player getweaponammoclip( weaponname ); + clip_max_ammo = weaponclipsize( weaponname ); + if ( clip_ammo < clip_max_ammo ) + { + clip_ammo++; + } + player setweaponammoclip( weaponname, clip_ammo ); + } + player maps/mp/zombies/_zm_buildables::track_planted_buildables_pickedup( weaponname ); + } +} + +equipment_drop_to_planted( equipment, player ) //checked matches cerberus output +{ +/* /# - assert( player has_deployed_equipment( equipment ) ); + if ( !isDefined( player.current_equipment ) || player.current_equipment != equipment ) + { + assert( player has_deployed_equipment( equipment ) ); + assert( !isDefined( player.current_equipment ) ); +#/ + } +*/ + if ( isDefined( player.current_equipment ) && player.current_equipment == equipment ) + { + player equipment_to_deployed( equipment ); + } + if ( isDefined( level.zombie_equipment[ equipment ].place_fn ) ) + { + replacement = player [[ level.zombie_equipment[ equipment ].place_fn ]]( player.origin, player.angles ); + if ( isDefined( replacement ) ) + { + replacement.owner = player; + replacement.original_owner = player; + replacement.name = equipment; + if ( isDefined( level.equipment_planted ) ) + { + player [[ level.equipment_planted ]]( replacement, equipment, player ); + } + player notify( "equipment_placed" ); + player maps/mp/zombies/_zm_buildables::track_buildables_planted( replacement ); + } + } +} + +equipment_transfer( weaponname, fromplayer, toplayer ) //checked matches cerberus output +{ + if ( is_limited_equipment( weaponname ) ) + { +/* +/# + println( "ZM EQUIPMENT: " + weaponname + " transferred from " + fromplayer.name + " to " + toplayer.name + "\n" ); +#/ +*/ + toplayer equipment_orphaned( weaponname ); + wait 0.05; +/* +/# + assert( !toplayer has_player_equipment( weaponname ) ); #/ /# - assert( !isdefined( player.current_equipment ) ); + assert( fromplayer has_player_equipment( weaponname ) ); #/ - } -#/ - if ( isdefined( player.current_equipment ) && player.current_equipment == equipment ) - player equipment_to_deployed( equipment ); - - if ( isdefined( level.zombie_equipment[equipment].place_fn ) ) - { - if ( isdefined( player.turret_placement ) && player.turret_placement["result"] ) - { - plant_origin = player.turret_placement["origin"]; - plant_angles = player.turret_placement["angles"]; - } - else if ( isdefined( level.placeable_equipment_type[self.name] ) && level.placeable_equipment_type[self.name] == "wallmount" ) - { - plant_origin = self.origin; - plant_angles = self.angles; - } - else - { - plant_origin = self.origin; - plant_angles = self.angles; - } - - if ( isdefined( level.check_force_deploy_origin ) ) - { - if ( player [[ level.check_force_deploy_origin ]]( self, plant_origin, plant_angles ) ) - { - plant_origin = player.origin; - plant_angles = player.angles; - self.plant_parent = player; - } - } - else if ( isdefined( level.check_force_deploy_z ) ) - { - if ( player [[ level.check_force_deploy_z ]]( self, plant_origin, plant_angles ) ) - plant_origin = ( plant_origin[0], plant_origin[1], player.origin[2] + 10 ); - } - - if ( isdefined( iswallmount ) && iswallmount ) - self ghost(); - - replacement = player [[ level.zombie_equipment[equipment].place_fn ]]( plant_origin, plant_angles ); - - if ( isdefined( replacement ) ) - { - replacement.owner = player; - replacement.original_owner = player; - replacement.name = self.name; - player notify( "equipment_placed", replacement, self.name ); - - if ( isdefined( level.equipment_planted ) ) - player [[ level.equipment_planted ]]( replacement, equipment, self.plant_parent ); - - player maps\mp\zombies\_zm_buildables::track_buildables_planted( self ); - } - - if ( isdefined( self ) ) - self delete(); - } -} - -equipment_retrieve( player ) -{ - if ( isdefined( self ) ) - { - self stoploopsound(); - original_owner = self.original_owner; - weaponname = self.name; - - if ( !isdefined( original_owner ) ) - { - player equipment_give( weaponname ); - self.owner = player; - } - else - { - if ( player != original_owner ) - { - equipment_transfer( weaponname, original_owner, player ); - self.owner = player; - } - - player equipment_from_deployed( weaponname ); - } - - if ( isdefined( self.requires_pickup ) && self.requires_pickup ) - { - if ( isdefined( level.zombie_equipment[weaponname].pickup_fn ) ) - { - self.owner = player; - - if ( isdefined( self.damage ) ) - player player_set_equipment_damage( weaponname, self.damage ); - - player [[ level.zombie_equipment[weaponname].pickup_fn ]]( self ); - } - } - - self.playdialog = 0; - weaponname = self.name; - self delete(); - - if ( !player hasweapon( weaponname ) ) - { - player giveweapon( weaponname ); - clip_ammo = player getweaponammoclip( weaponname ); - clip_max_ammo = weaponclipsize( weaponname ); - - if ( clip_ammo < clip_max_ammo ) - clip_ammo++; - - player setweaponammoclip( weaponname, clip_ammo ); - } - - player maps\mp\zombies\_zm_buildables::track_planted_buildables_pickedup( weaponname ); - } -} - -equipment_drop_to_planted( equipment, player ) -{ +*/ + toplayer equipment_give( weaponname ); + toplayer equipment_to_deployed( weaponname ); + if ( isDefined( level.zombie_equipment[ weaponname ].transfer_fn ) ) + { + [[ level.zombie_equipment[ weaponname ].transfer_fn ]]( fromplayer, toplayer ); + } + fromplayer equipment_release( weaponname ); +/* /# - if ( !isdefined( player.current_equipment ) || player.current_equipment != equipment ) - { -/# - assert( player has_deployed_equipment( equipment ) ); + assert( toplayer has_player_equipment( weaponname ) ); #/ /# - assert( !isdefined( player.current_equipment ) ); + assert( !fromplayer has_player_equipment( weaponname ) ); #/ - } -#/ - if ( isdefined( player.current_equipment ) && player.current_equipment == equipment ) - player equipment_to_deployed( equipment ); - - if ( isdefined( level.zombie_equipment[equipment].place_fn ) ) - { - replacement = player [[ level.zombie_equipment[equipment].place_fn ]]( player.origin, player.angles ); - - if ( isdefined( replacement ) ) - { - replacement.owner = player; - replacement.original_owner = player; - replacement.name = equipment; - - if ( isdefined( level.equipment_planted ) ) - player [[ level.equipment_planted ]]( replacement, equipment, player ); - - player notify( "equipment_placed", replacement, equipment ); - player maps\mp\zombies\_zm_buildables::track_buildables_planted( replacement ); - } - } -} - -equipment_transfer( weaponname, fromplayer, toplayer ) -{ - if ( is_limited_equipment( weaponname ) ) - { +*/ + equipment_damage = 0; + toplayer player_set_equipment_damage( weaponname, fromplayer player_get_equipment_damage( weaponname ) ); + fromplayer player_set_equipment_damage( equipment_damage ); + } + else + { +/* /# - println( "ZM EQUIPMENT: " + weaponname + " transferred from " + fromplayer.name + " to " + toplayer.name + "\n" ); + println( "ZM EQUIPMENT: " + weaponname + " swapped from " + fromplayer.name + " to " + toplayer.name + "\n" ); #/ - toplayer equipment_orphaned( weaponname ); - wait 0.05; +*/ + toplayer equipment_give( weaponname ); + if ( isDefined( toplayer.current_equipment ) && toplayer.current_equipment == weaponname ) + { + toplayer equipment_to_deployed( weaponname ); + } + if ( isDefined( level.zombie_equipment[ weaponname ].transfer_fn ) ) + { + [[ level.zombie_equipment[ weaponname ].transfer_fn ]]( fromplayer, toplayer ); + } + equipment_damage = toplayer player_get_equipment_damage( weaponname ); + toplayer player_set_equipment_damage( weaponname, fromplayer player_get_equipment_damage( weaponname ) ); + fromplayer player_set_equipment_damage( weaponname, equipment_damage ); + } +} + +equipment_release( equipment ) //checked matches cerberus output +{ +/* /# - assert( !toplayer has_player_equipment( weaponname ) ); + println( "ZM EQUIPMENT: " + self.name + " release " + equipment + "\n" ); #/ +*/ + self equipment_take( equipment ); +} + +equipment_drop( equipment ) //checked matches cerberus output +{ + if ( isDefined( level.zombie_equipment[ equipment ].place_fn ) ) + { + equipment_drop_to_planted( equipment, self ); +/* /# - assert( fromplayer has_player_equipment( weaponname ) ); + println( "ZM EQUIPMENT: " + self.name + " drop to planted " + equipment + "\n" ); #/ - toplayer equipment_give( weaponname ); - toplayer equipment_to_deployed( weaponname ); - - if ( isdefined( level.zombie_equipment[weaponname].transfer_fn ) ) - [[ level.zombie_equipment[weaponname].transfer_fn ]]( fromplayer, toplayer ); - - fromplayer equipment_release( weaponname ); +*/ + } + else if ( isDefined( level.zombie_equipment[ equipment ].drop_fn ) ) + { + if ( isDefined( self.current_equipment ) && self.current_equipment == equipment ) + { + self equipment_to_deployed( equipment ); + } + item = self [[ level.zombie_equipment[ equipment ].drop_fn ]](); + if ( isDefined( item ) ) + { + if ( isDefined( level.equipment_planted ) ) + { + self [[ level.equipment_planted ]]( item, equipment, self ); + } + item.owner = undefined; + item.damage = self player_get_equipment_damage( equipment ); + } +/* /# - assert( toplayer has_player_equipment( weaponname ) ); + println( "ZM EQUIPMENT: " + self.name + " dropped " + equipment + "\n" ); #/ +*/ + } + else + { + self equipment_take(); + } + self notify( "equipment_dropped" ); +} + +equipment_grab( equipment, item ) //checked matches cerberus output +{ +/* /# - assert( !fromplayer has_player_equipment( weaponname ) ); + println( "ZM EQUIPMENT: " + self.name + " picked up " + equipment + "\n" ); #/ - equipment_damage = 0; - toplayer player_set_equipment_damage( weaponname, fromplayer player_get_equipment_damage( weaponname ) ); - fromplayer player_set_equipment_damage( equipment_damage ); - } - else - { +*/ + self equipment_give( equipment ); + if ( isDefined( level.zombie_equipment[ equipment ].pickup_fn ) ) + { + item.owner = self; + self player_set_equipment_damage( equipment, item.damage ); + self [[ level.zombie_equipment[ equipment ].pickup_fn ]]( item ); + } +} + +equipment_orphaned( equipment ) //checked matches cerberus output +{ +/* /# - println( "ZM EQUIPMENT: " + weaponname + " swapped from " + fromplayer.name + " to " + toplayer.name + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " orphaned " + equipment + "\n" ); #/ - toplayer equipment_give( weaponname ); - - if ( isdefined( toplayer.current_equipment ) && toplayer.current_equipment == weaponname ) - toplayer equipment_to_deployed( weaponname ); - - if ( isdefined( level.zombie_equipment[weaponname].transfer_fn ) ) - [[ level.zombie_equipment[weaponname].transfer_fn ]]( fromplayer, toplayer ); - - equipment_damage = toplayer player_get_equipment_damage( weaponname ); - toplayer player_set_equipment_damage( weaponname, fromplayer player_get_equipment_damage( weaponname ) ); - fromplayer player_set_equipment_damage( weaponname, equipment_damage ); - } +*/ + self equipment_take( equipment ); } -equipment_release( equipment ) +equipment_to_deployed( equipment ) //checked matches cerberus output { +/* /# - println( "ZM EQUIPMENT: " + self.name + " release " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " deployed " + equipment + "\n" ); #/ - self equipment_take( equipment ); -} - -equipment_drop( equipment ) -{ - if ( isdefined( level.zombie_equipment[equipment].place_fn ) ) - { - equipment_drop_to_planted( equipment, self ); +*/ + if ( !isDefined( self.deployed_equipment ) ) + { + self.deployed_equipment = []; + } +/* /# - println( "ZM EQUIPMENT: " + self.name + " drop to planted " + equipment + "\n" ); + assert( self.current_equipment == equipment ); #/ - } - else if ( isdefined( level.zombie_equipment[equipment].drop_fn ) ) - { - if ( isdefined( self.current_equipment ) && self.current_equipment == equipment ) - self equipment_to_deployed( equipment ); +*/ + self.deployed_equipment[ self.deployed_equipment.size ] = equipment; + self.current_equipment = undefined; + if ( !isDefined( level.riotshield_name ) || equipment != level.riotshield_name ) + { + self takeweapon( equipment ); + } + self setactionslot( 1, "" ); +} - item = self [[ level.zombie_equipment[equipment].drop_fn ]](); - - if ( isdefined( item ) ) - { - if ( isdefined( level.equipment_planted ) ) - self [[ level.equipment_planted ]]( item, equipment, self ); - - item.owner = undefined; - item.damage = self player_get_equipment_damage( equipment ); - } +equipment_from_deployed( equipment ) //checked matches cerberus output +{ + if ( !isDefined( equipment ) ) + { + equipment = "none"; + } +/* /# - println( "ZM EQUIPMENT: " + self.name + " dropped " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " retrieved " + equipment + "\n" ); #/ - } - else - self equipment_take(); - - self notify( "equipment_dropped", equipment ); -} - -equipment_grab( equipment, item ) -{ +*/ + if ( isDefined( self.current_equipment ) && equipment != self.current_equipment ) + { + self equipment_drop( self.current_equipment ); + } +/* /# - println( "ZM EQUIPMENT: " + self.name + " picked up " + equipment + "\n" ); + assert( self has_deployed_equipment( equipment ) ); #/ - self equipment_give( equipment ); - - if ( isdefined( level.zombie_equipment[equipment].pickup_fn ) ) - { - item.owner = self; - self player_set_equipment_damage( equipment, item.damage ); - self [[ level.zombie_equipment[equipment].pickup_fn ]]( item ); - } +*/ + self.current_equipment = equipment; + if ( isDefined( level.riotshield_name ) && equipment != level.riotshield_name ) + { + self giveweapon( equipment ); + } + if ( self hasweapon( equipment ) ) + { + self setweaponammoclip( equipment, 1 ); + } + self setactionslot( 1, "weapon", equipment ); + arrayremovevalue( self.deployed_equipment, equipment ); + self notify( equipment + "_pickup" ); } -equipment_orphaned( equipment ) +eqstub_get_unitrigger_origin() //checked matches cerberus output { + if ( isDefined( self.origin_parent ) ) + { + return self.origin_parent.origin; + } + tup = anglesToUp( self.angles ); + eq_unitrigger_offset = 12 * tup; + return self.origin + eq_unitrigger_offset; +} + +eqstub_on_spawn_trigger( trigger ) //checked matches cerberus output +{ + if ( isDefined( self.link_parent ) ) + { + trigger enablelinkto(); + trigger linkto( self.link_parent ); + trigger setmovingplatformenabled( 1 ); + } +} + +equipment_buy( equipment ) //checked changed at own discretion +{ +/* /# - println( "ZM EQUIPMENT: " + self.name + " orphaned " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " bought " + equipment + "\n" ); #/ - self equipment_take( equipment ); +*/ + if ( isDefined( self.current_equipment ) && equipment != self.current_equipment ) + { + self equipment_drop( self.current_equipment ); + } + if ( ( equipment == "riotshield_zm" || equipment == "alcatraz_shield_zm" ) && isDefined( self.player_shield_reset_health ) ) + { + self [[ self.player_shield_reset_health ]](); + } + else + { + self player_set_equipment_damage( equipment, 0 ); + } + self equipment_give( equipment ); } -equipment_to_deployed( equipment ) +generate_equipment_unitrigger( classname, origin, angles, flags, radius, script_height, hint, icon, think, moving ) //checked matches cerberus output { + if ( !isDefined( radius ) ) + { + radius = 64; + } + if ( !isDefined( script_height ) ) + { + script_height = 64; + } + script_width = script_height; + if ( !isDefined( script_width ) ) + { + script_width = 64; + } + script_length = script_height; + if ( !isDefined( script_length ) ) + { + script_length = 64; + } + unitrigger_stub = spawnstruct(); + unitrigger_stub.origin = origin; + if ( isDefined( angles ) ) + { + unitrigger_stub.angles = angles; + } + if ( isDefined( script_length ) ) + { + unitrigger_stub.script_length = script_length; + } + else + { + unitrigger_stub.script_length = 13.5; + } + if ( isDefined( script_width ) ) + { + unitrigger_stub.script_width = script_width; + } + else + { + unitrigger_stub.script_width = 27.5; + } + if ( isDefined( script_height ) ) + { + unitrigger_stub.script_height = script_height; + } + else + { + unitrigger_stub.script_height = 24; + } + unitrigger_stub.radius = radius; + unitrigger_stub.cursor_hint = "HINT_NOICON"; + unitrigger_stub.hint_string = hint; + /* + if ( getDvarInt( #"1F0A2129" ) ) + { + unitrigger_stub.cursor_hint = "HINT_WEAPON"; + unitrigger_stub.cursor_hint_weapon = icon; + } + */ + unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + unitrigger_stub.require_look_at = 0; + switch( classname ) + { + case "trigger_radius": + unitrigger_stub.script_unitrigger_type = "unitrigger_radius"; + break; + case "trigger_radius_use": + unitrigger_stub.script_unitrigger_type = "unitrigger_radius_use"; + break; + case "trigger_box": + unitrigger_stub.script_unitrigger_type = "unitrigger_box"; + break; + case "trigger_box_use": + unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + break; + } + unitrigger_stub.originfunc = ::eqstub_get_unitrigger_origin; + unitrigger_stub.onspawnfunc = ::eqstub_on_spawn_trigger; + if ( is_true( moving ) ) + { + maps/mp/zombies/_zm_unitrigger::register_unitrigger( unitrigger_stub, think ); + } + else + { + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, think ); + } + return unitrigger_stub; +} + +can_pick_up_equipment( equipment_name, equipment_trigger ) //checked matches cerberus output +{ + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || self in_revive_trigger() ) + { + return 0; + } + if ( self isthrowinggrenade() ) + { + return 0; + } + if ( isDefined( self.screecher_weapon ) ) + { + return 0; + } + if ( self is_jumping() ) + { + return 0; + } + if ( self is_player_equipment( equipment_name ) ) + { + return 0; + } + if ( is_true( self.pickup_equipment ) ) + { + return 0; + } + if ( is_true( level.equipment_team_pick_up ) && !self same_team_placed_equipment( equipment_trigger ) ) + { + return 0; + } + return 1; +} + +same_team_placed_equipment( equipment_trigger ) //checked changed at own discretion +{ + if ( isDefined( equipment_trigger ) && isDefined( equipment_trigger.stub ) && isDefined( equipment_trigger.stub.model ) && isDefined( equipment_trigger.stub.model.owner ) && equipment_trigger.stub.model.owner.pers[ "team" ] == self.pers[ "team" ] ) + { + return 1; + } + return 0; +} + +placed_equipment_think( model, equipname, origin, angles, tradius, toffset ) //checked changed to match cerberus output +{ + pickupmodel = spawn( "script_model", origin ); + if ( isDefined( angles ) ) + { + pickupmodel.angles = angles; + } + pickupmodel setmodel( model ); + if ( isDefined( level.equipment_safe_to_drop ) ) + { + if ( !( self [[ level.equipment_safe_to_drop ]]( pickupmodel ) ) ) + { + equipment_disappear_fx( pickupmodel.origin, undefined, pickupmodel.angles ); + pickupmodel delete(); + self equipment_take( equipname ); + return undefined; + } + } + watchername = getsubstr( equipname, 0, equipname.size - 3 ); + if ( isDefined( level.retrievehints[ watchername ] ) ) + { + hint = level.retrievehints[ watchername ].hint; + } + else + { + hint = &"MP_GENERIC_PICKUP"; + } + icon = get_equipment_icon( equipname ); + if ( !isDefined( tradius ) ) + { + tradius = 32; + } + torigin = origin; + if ( isDefined( toffset ) ) + { + tforward = anglesToForward( angles ); + torigin += toffset * tforward; + } + tup = anglesToUp( angles ); + eq_unitrigger_offset = 12 * tup; + pickupmodel.stub = generate_equipment_unitrigger( "trigger_radius_use", torigin + eq_unitrigger_offset, angles, 0, tradius, 64, hint, equipname, ::placed_equipment_unitrigger_think, pickupmodel.canmove ); + pickupmodel.stub.model = pickupmodel; + pickupmodel.stub.equipname = equipname; + pickupmodel.equipname = equipname; + pickupmodel thread item_attract_zombies(); + pickupmodel thread item_watch_explosions(); + if ( is_limited_equipment( equipname ) ) + { + if ( !isDefined( level.dropped_equipment ) ) + { + level.dropped_equipment = []; + } + if ( isDefined( level.dropped_equipment[ equipname ] ) && isDefined( level.dropped_equipment[ equipname ].model ) ) + { + level.dropped_equipment[ equipname ].model dropped_equipment_destroy( 1 ); + } + level.dropped_equipment[ equipname ] = pickupmodel.stub; + } + destructible_equipment_list_add( pickupmodel ); + return pickupmodel; +} + +watch_player_visibility( equipment ) //checked partially changed to match cerberus output continue in foreach bad check the github for more info +{ + self endon( "kill_trigger" ); + self setinvisibletoall(); + while ( isDefined( self ) ) + { + players = getplayers(); + i = 0; + while ( i < players.size ) + { + if ( !isDefined( player ) ) + { + i++; + continue; + } + invisible = !player can_pick_up_equipment( equipment, self ); + if ( isDefined( self ) ) + { + self setinvisibletoplayer( player, invisible ); + } + wait 0.05; + i++; + } + wait 1; + } +} + +placed_equipment_unitrigger_think() //checked matches cerberus output +{ + self endon( "kill_trigger" ); + self thread watch_player_visibility( self.stub.equipname ); + while ( 1 ) + { + self waittill( "trigger", player ); + while ( !player can_pick_up_equipment( self.stub.equipname, self ) ) + { + continue; + } + self thread pickup_placed_equipment( player ); + return; + } +} + +pickup_placed_equipment( player ) //checked changed to match cerberus output +{ +/* /# - println( "ZM EQUIPMENT: " + self.name + " deployed " + equipment + "\n" ); + if ( isDefined( player.pickup_equipment )assert( !player.pickup_equipment ); #/ - if ( !isdefined( self.deployed_equipment ) ) - self.deployed_equipment = []; +*/ + player.pickup_equipment = 1; + stub = self.stub; + if ( isDefined( player.current_equipment ) && stub.equipname != player.current_equipment ) + { + player equipment_drop( player.current_equipment ); + } + if ( is_limited_equipment( stub.equipname ) ) + { + if ( isDefined( level.dropped_equipment ) && isDefined( level.dropped_equipment[ stub.equipname ] ) && level.dropped_equipment[ stub.equipname ] == stub ) + { + level.dropped_equipment[stub.equipname] = undefined; + } + } + if ( isDefined( stub.model ) ) + { + stub.model equipment_retrieve( player ); + } + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( stub ); + wait 3; + player.pickup_equipment = 0; +} + +dropped_equipment_think( model, equipname, origin, angles, tradius, toffset ) //checked changed to match cerberus output +{ + pickupmodel = spawn( "script_model", origin ); + if ( isDefined( angles ) ) + { + pickupmodel.angles = angles; + } + pickupmodel setmodel( model ); + if ( isDefined( level.equipment_safe_to_drop ) ) + { + if ( !self [[ level.equipment_safe_to_drop ]]( pickupmodel ) ) + { + equipment_disappear_fx( pickupmodel.origin, undefined, pickupmodel.angles ); + pickupmodel delete(); + self equipment_take( equipname ); + return; + } + } + watchername = getsubstr( equipname, 0, equipname.size - 3 ); + if ( isDefined( level.retrievehints[ watchername ] ) ) + { + hint = level.retrievehints[ watchername ].hint; + } + else + { + hint = &"MP_GENERIC_PICKUP"; + } + icon = get_equipment_icon( equipname ); + if ( !isDefined( tradius ) ) + { + tradius = 32; + } + torigin = origin; + if ( isDefined( toffset ) ) + { + offset = 64; + tforward = anglesToForward( angles ); + torigin = torigin + toffset * tforward + vectorScale( ( 0, 0, 1 ), 8 ); + } + if ( isDefined( pickupmodel.canmove ) ) + { + pickupmodel.stub = generate_equipment_unitrigger( "trigger_radius_use", torigin, angles, 0, tradius, 64, hint, equipname, ::dropped_equipment_unitrigger_think, pickupmodel.canmove ); + } + pickupmodel.stub.model = pickupmodel; + pickupmodel.stub.equipname = equipname; + pickupmodel.equipname = equipname; + if ( isDefined( level.equipment_planted ) ) + { + self [[ level.equipment_planted ]]( pickupmodel, equipname, self ); + } + if ( !isDefined( level.dropped_equipment ) ) + { + level.dropped_equipment = []; + } + if ( isDefined( level.dropped_equipment[ equipname ] ) ) + { + level.dropped_equipment[ equipname ].model dropped_equipment_destroy( 1 ); + } + level.dropped_equipment[ equipname ] = pickupmodel.stub; + destructible_equipment_list_add( pickupmodel ); + pickupmodel thread item_attract_zombies(); + return pickupmodel; +} + +dropped_equipment_unitrigger_think() //checked matches cerberus output +{ + self endon( "kill_trigger" ); + self thread watch_player_visibility( self.stub.equipname ); + while ( 1 ) + { + self waittill( "trigger", player ); + while ( !player can_pick_up_equipment( self.stub.equipname, self ) ) + { + continue; + } + self thread pickup_dropped_equipment( player ); + return; + } +} + +pickup_dropped_equipment( player ) //checked matches cerberus output +{ + player.pickup_equipment = 1; + stub = self.stub; + if ( isDefined( player.current_equipment ) && stub.equipname != player.current_equipment ) + { + player equipment_drop( player.current_equipment ); + } + player equipment_grab( stub.equipname, stub.model ); + stub.model dropped_equipment_destroy(); + wait 3; + player.pickup_equipment = 0; +} + +dropped_equipment_destroy( gusto ) //checked changed to match cerberus output +{ + stub = self.stub; + if ( is_true( gusto ) ) + { + equipment_disappear_fx( self.origin, undefined, self.angles ); + } + if ( isDefined( level.dropped_equipment ) ) + { + } + if ( isDefined( stub.model ) ) + { + stub.model delete(); + } + if ( isDefined( self.original_owner ) && is_limited_equipment( stub.equipname ) || maps/mp/zombies/_zm_weapons::is_weapon_included( stub.equipname ) ) + { + self.original_owner equipment_take( stub.equipname ); + } + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( stub ); +} + +add_placeable_equipment( equipment, modelname, destroy_fn, type ) //checked matches cerberus output +{ + if ( !isDefined( level.placeable_equipment ) ) + { + level.placeable_equipment = []; + } + level.placeable_equipment[ equipment ] = modelname; + precachemodel( modelname ); + precacheitem( equipment + "_turret" ); + if ( !isDefined( level.placeable_equipment_destroy_fn ) ) + { + level.placeable_equipment_destroy_fn = []; + } + level.placeable_equipment_destroy_fn[ equipment ] = destroy_fn; + if ( !isDefined( level.placeable_equipment_type ) ) + { + level.placeable_equipment_type = []; + } + level.placeable_equipment_type[ equipment ] = type; +} + +is_placeable_equipment( equipment ) //checked matches cerberus output +{ + if ( isDefined( level.placeable_equipment ) && isDefined( level.placeable_equipment[ equipment ] ) ) + { + return 1; + } + return 0; +} + +equipment_placement_watcher() //checked matches cerberus output +{ + self endon( "death_or_disconnect" ); + for ( ;; ) + { + self waittill( "weapon_change", weapon ); + if ( self.sessionstate != "spectator" && is_placeable_equipment( weapon ) ) + { + self thread equipment_watch_placement( weapon ); + } + } +} + +equipment_watch_placement( equipment ) //checked changed to match cerberus output +{ + self.turret_placement = undefined; + carry_offset = vectorScale( ( 1, 0, 0 ), 22 ); + carry_angles = ( 0, 0, 0 ); + placeturret = spawnturret( "auto_turret", self.origin, equipment + "_turret" ); + placeturret.angles = self.angles; + placeturret setmodel( level.placeable_equipment[ equipment ] ); + placeturret setturretcarried( 1 ); + placeturret setturretowner( self ); + if ( isDefined( level.placeable_equipment_type[ equipment ] ) ) + { + placeturret setturrettype( level.placeable_equipment_type[ equipment ] ); + } + self carryturret( placeturret, carry_offset, carry_angles ); + if ( isDefined( level.use_swipe_protection ) ) + { + self thread watch_melee_swipes( equipment, placeturret ); + } + self notify( "create_equipment_turret", placeturret ); + ended = self waittill_any_return( "weapon_change", "grenade_fire", "death_or_disconnect" ); + if ( !is_true( level.use_legacy_equipment_placement ) ) + { + self.turret_placement = self canplayerplaceturret( placeturret ); + } + if ( ended == "weapon_change" ) + { + self.turret_placement = undefined; + if ( self hasweapon( equipment ) ) + { + self setweaponammoclip( equipment, 1 ); + } + } + self notify( "destroy_equipment_turret" ); + self stopcarryturret( placeturret ); + placeturret setturretcarried( 0 ); + placeturret delete(); +} + +watch_melee_swipes( equipment, turret ) //checked matches cerberus output +{ + self endon( "weapon_change" ); + self endon( "grenade_fire" ); + self endon( "death" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "melee_swipe", zombie ); + while ( distancesquared( zombie.origin, self.origin ) > ( zombie.meleeattackdist * zombie.meleeattackdist ) ) + { + continue; + } + tpos = turret.origin; + tangles = turret.angles; + self player_damage_equipment( equipment, 200, zombie.origin ); + if ( self.equipment_damage[ equipment ] >= 1500 ) + { + thread equipment_disappear_fx( tpos, undefined, tangles ); + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons[ 0 ] ) ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + } + if ( isalive( self ) ) + { + self playlocalsound( level.zmb_laugh_alias ); + } + self maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 ); + self equipment_release( equipment ); + return; + } + } +} + +player_get_equipment_damage( equipment ) //checked matches cerberus output +{ + if ( isDefined( self.equipment_damage ) && isDefined( self.equipment_damage[ equipment ] ) ) + { + return self.equipment_damage[ equipment ]; + } + return 0; +} + +player_set_equipment_damage( equipment, damage ) //checked matches cerberus output +{ + if ( !isDefined( self.equipment_damage ) ) + { + self.equipment_damage = []; + } + self.equipment_damage[ equipment ] = damage; +} + +player_damage_equipment( equipment, damage, origin ) //checked matches cerberus output +{ + if ( !isDefined( self.equipment_damage ) ) + { + self.equipment_damage = []; + } + if ( !isDefined( self.equipment_damage[ equipment ] ) ) + { + self.equipment_damage[ equipment ] = 0; + } + self.equipment_damage[ equipment ] += damage; + if ( self.equipment_damage[ equipment ] > 1500 ) + { + if ( isDefined( level.placeable_equipment_destroy_fn[ equipment ] ) ) + { + self [[ level.placeable_equipment_destroy_fn[ equipment ] ]](); + } + else + { + equipment_disappear_fx( origin ); + } + self equipment_release( equipment ); + } +} + +item_damage( damage ) //checked changed to match cerberus output +{ + if ( is_true( self.isriotshield ) ) + { + if ( isDefined( level.riotshield_damage_callback ) && isDefined( self.owner ) ) + { + self.owner [[ level.riotshield_damage_callback ]]( damage, 0 ); + } + else if ( isDefined( level.deployed_riotshield_damage_callback ) ) + { + self [[ level.deployed_riotshield_damage_callback ]]( damage ); + } + } + else if ( isDefined( self.owner ) ) + { + self.owner player_damage_equipment( self.equipname, damage, self.origin ); + return; + } + else if ( !isDefined( self.damage ) ) + { + self.damage = 0; + } + self.damage += damage; + if ( self.damage > 1500 ) + { + self thread dropped_equipment_destroy( 1 ); + } +} + +item_watch_damage() //checked matches cerberus output +{ + self endon( "death" ); + self setcandamage( 1 ); + self.health = 1500; + while ( 1 ) + { + self waittill( "damage", amount ); + self item_damage( amount ); + } +} + +item_watch_explosions() //checked matches cerberus output may need to check order of operations +{ + self endon( "death" ); + while ( 1 ) + { + level waittill( "grenade_exploded", position, radius, idamage, odamage ); + wait randomfloatrange( 0.05, 0.3 ); + distsqrd = distancesquared( self.origin, position ); + if ( distsqrd < radius * radius ) + { + dist = sqrt( distsqrd ); + dist /= radius; + damage = odamage + ( ( idamage - odamage ) * ( 1 - dist ) ); + self item_damage( damage * 5 ); + } + } +} + +get_item_health() //dev call did not check +{ +/* /# - assert( self.current_equipment == equipment ); + damage = 0; + if ( isDefined( self.isriotshield ) && self.isriotshield ) + { + damagemax = level.zombie_vars[ "riotshield_hit_points" ]; + if ( isDefined( self.owner ) ) + { + damage = self.owner.shielddamagetaken; + } + else + { + if ( isDefined( level.deployed_riotshield_damage_callback ) ) + { + damage = self.shielddamagetaken; + } + } + } + else + { + if ( isDefined( self.owner ) ) + { + damagemax = 1500; + damage = self.owner player_get_equipment_damage( self.equipname ); + } + else + { + damagemax = 1500; + if ( isDefined( self.damage ) ) + { + damage = self.damage; + } + } + } + return ( damagemax - damage ) / damagemax; #/ - self.deployed_equipment[self.deployed_equipment.size] = equipment; - self.current_equipment = undefined; - - if ( !isdefined( level.riotshield_name ) || equipment != level.riotshield_name ) - self takeweapon( equipment ); - - self setactionslot( 1, "" ); +*/ } -equipment_from_deployed( equipment ) +debughealth() //dev call did not check { - if ( !isdefined( equipment ) ) - equipment = "none"; +/* /# - println( "ZM EQUIPMENT: " + self.name + " retrieved " + equipment + "\n" ); + self endon( "death" ); + self endon( "stop_attracting_zombies" ); + while ( 1 ) + { + if ( getDvarInt( #"EB512CB7" ) ) + { + health = self get_item_health(); + color = ( 1 - health, health, 0 ); + text = "" + ( health * 100 ) + ""; + print3d( self.origin, text, color, 1, 0,5, 1 ); + } + wait 0.05; #/ - if ( isdefined( self.current_equipment ) && equipment != self.current_equipment ) - self equipment_drop( self.current_equipment ); + } +*/ +} + +item_choke() //checked matches cerberus output +{ + if ( !isDefined( level.item_choke_count ) ) + { + level.item_choke_count = 0; + } + level.item_choke_count++; + if ( level.item_choke_count >= 10 ) + { + wait 0.05; + level.item_choke_count = 0; + } +} + +is_equipment_ignored( equipname ) //checked matches cerberus output +{ + if ( isDefined( level.equipment_ignored_by_zombies ) && isDefined( equipname ) && isDefined( level.equipment_ignored_by_zombies[ equipname ] ) ) + { + return 1; + } + return 0; +} + +enemies_ignore_equipment( equipname ) //checked matches cerberus output +{ + if ( !isDefined( level.equipment_ignored_by_zombies ) ) + { + level.equipment_ignored_by_zombies = []; + } + level.equipment_ignored_by_zombies[ equipname ] = equipname; +} + +item_attract_zombies() //checked partially changed to match cerberus output did not change for loop to while loop more info on the github about continues +{ + self endon( "death" ); + self notify( "stop_attracting_zombies" ); + self endon( "stop_attracting_zombies" ); +/* /# - assert( self has_deployed_equipment( equipment ) ); + self thread debughealth(); #/ - self.current_equipment = equipment; - - if ( isdefined( level.riotshield_name ) && equipment != level.riotshield_name ) - self giveweapon( equipment ); - - if ( self hasweapon( equipment ) ) - self setweaponammoclip( equipment, 1 ); - - self setactionslot( 1, "weapon", equipment ); - arrayremovevalue( self.deployed_equipment, equipment ); - self notify( equipment + "_pickup" ); +*/ + if ( is_equipment_ignored( self.equipname ) ) + { + return; + } + while ( 1 ) + { + if ( isDefined( level.vert_equipment_attack_range ) ) + { + vdistmax = level.vert_equipment_attack_range; + } + else + { + vdistmax = 36; + } + if ( isDefined( level.max_equipment_attack_range ) ) + { + distmax = level.max_equipment_attack_range * level.max_equipment_attack_range; + } + else + { + distmax = 4096; + } + if ( isDefined( level.min_equipment_attack_range ) ) + { + distmin = level.min_equipment_attack_range * level.min_equipment_attack_range; + } + else + { + distmin = 2025; + } + ai = getaiarray( level.zombie_team ); + i = 0; + while ( i < ai.size ) + { + if ( !isDefined( ai[ i ] ) ) + { + i++; + continue; + } + if ( is_true( ai[ i ].ignore_equipment ) ) + { + i++; + continue; + } + if ( isDefined( level.ignore_equipment ) ) + { + if ( self [[ level.ignore_equipment ]]( ai[ i ] ) ) + { + i++; + continue; + } + } + if ( is_true( ai[ i ].is_inert ) ) + { + i++; + continue; + } + if ( is_true( ai[ i ].is_traversing ) ) + { + i++; + continue; + } + vdist = abs( ai[ i ].origin[ 2 ] - self.origin[ 2 ] ); + distsqrd = distance2dsquared( ai[ i ].origin, self.origin ); + if ( ( self.equipname == "riotshield_zm" || self.equipname == "alcatraz_shield_zm" ) && isDefined( self.equipname ) ) + { + vdistmax = 108; + } + should_attack = 0; + if ( isDefined( level.should_attack_equipment ) ) + { + should_attack = self [[ level.should_attack_equipment ]]( distsqrd ); + } + if ( distsqrd < distmax && distsqrd > distmin && vdist < vdistmax || should_attack ) + { + if ( !is_true( ai[ i ].isscreecher ) && !ai[ i ] is_quad() && !ai[ i ] is_leaper() ) + { + ai[ i ] thread attack_item( self ); + item_choke(); + } + } + item_choke(); + i++; + } + wait 0.1; + } } -eqstub_get_unitrigger_origin() +attack_item( item ) //checked changed to match cerberus output { - if ( isdefined( self.origin_parent ) ) - return self.origin_parent.origin; - - tup = anglestoup( self.angles ); - eq_unitrigger_offset = 12 * tup; - return self.origin + eq_unitrigger_offset; + self endon( "death" ); + item endon( "death" ); + self endon( "start_inert" ); + if ( is_true( self.doing_equipment_attack ) ) + { + return 0; + } + if ( is_true( self.not_interruptable ) ) + { + return 0; + } + self thread attack_item_stop( item ); + self thread attack_item_interrupt( item ); + if ( getDvar( "zombie_equipment_attack_freq" ) == "" ) + { + setdvar( "zombie_equipment_attack_freq", "15" ); + } + freq = getDvarInt( "zombie_equipment_attack_freq" ); + self.doing_equipment_attack = 1; + self maps/mp/zombies/_zm_spawner::zombie_history( "doing equipment attack 1 - " + getTime() ); + self.item = item; + if ( !isDefined( self ) || !isalive( self ) ) + { + return; + } + if ( isDefined( item.zombie_attack_callback ) ) + { + item [[ item.zombie_attack_callback ]]( self ); + } + self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "attack", self.animname ); + if ( isDefined( level.attack_item ) ) + { + self [[ level.attack_item ]](); + } + melee_anim = "zm_window_melee"; + if ( !self.has_legs ) + { + melee_anim = "zm_walk_melee_crawl"; + if ( self.a.gib_ref == "no_legs" ) + { + melee_anim = "zm_stumpy_melee"; + } + else if ( self.zombie_move_speed == "run" || self.zombie_move_speed == "sprint" ) + { + melee_anim = "zm_run_melee_crawl"; + } + } + self orientmode( "face point", item.origin ); + self animscripted( self.origin, flat_angle( vectorToAngles( item.origin - self.origin ) ), melee_anim ); + self notify( "item_attack" ); + if ( isDefined( self.custom_item_dmg ) ) + { + item thread item_damage( self.custom_item_dmg ); + } + else + { + item thread item_damage( 100 ); + } + item playsound( "fly_riotshield_zm_impact_flesh" ); + wait ( randomint( 100 ) / 100 ); + self.doing_equipment_attack = 0; + self maps/mp/zombies/_zm_spawner::zombie_history( "doing equipment attack 0 from wait - " + getTime() ); + self orientmode( "face default" ); } -eqstub_on_spawn_trigger( trigger ) +attack_item_interrupt( item ) //checked matches cerberus output { - if ( isdefined( self.link_parent ) ) - { - trigger enablelinkto(); - trigger linkto( self.link_parent ); - trigger setmovingplatformenabled( 1 ); - } + if ( !is_true( self.has_legs ) ) + { + return; + } + self notify( "attack_item_interrupt" ); + self endon( "attack_item_interrupt" ); + self endon( "death" ); + while ( is_true( self.has_legs ) ) + { + self waittill( "damage" ); + } + self stopanimscripted(); + self.doing_equipment_attack = 0; + self maps/mp/zombies/_zm_spawner::zombie_history( "doing equipment attack 0 from death - " + getTime() ); + self.item = undefined; } -equipment_buy( equipment ) +attack_item_stop( item ) //checked matches cerberus output { -/# - println( "ZM EQUIPMENT: " + self.name + " bought " + equipment + "\n" ); -#/ - if ( isdefined( self.current_equipment ) && equipment != self.current_equipment ) - self equipment_drop( self.current_equipment ); - - if ( ( equipment == "riotshield_zm" || equipment == "alcatraz_shield_zm" ) && isdefined( self.player_shield_reset_health ) ) - self [[ self.player_shield_reset_health ]](); - else - self player_set_equipment_damage( equipment, 0 ); - - self equipment_give( equipment ); + self notify( "attack_item_stop" ); + self endon( "attack_item_stop" ); + self endon( "death" ); + item waittill( "death" ); + self stopanimscripted(); + self.doing_equipment_attack = 0; + self maps/mp/zombies/_zm_spawner::zombie_history( "doing equipment attack 0 from death - " + getTime() ); + self.item = undefined; + if ( isDefined( level.attack_item_stop ) ) + { + self [[ level.attack_item_stop ]](); + } } -generate_equipment_unitrigger( classname, origin, angles, flags, radius, script_height, hint, icon, think, moving ) +window_notetracks( msg, equipment ) //checked matches cerberus output { - if ( !isdefined( radius ) ) - radius = 64; - - if ( !isdefined( script_height ) ) - script_height = 64; - - script_width = script_height; - - if ( !isdefined( script_width ) ) - script_width = 64; - - script_length = script_height; - - if ( !isdefined( script_length ) ) - script_length = 64; - - unitrigger_stub = spawnstruct(); - unitrigger_stub.origin = origin; - - if ( isdefined( angles ) ) - unitrigger_stub.angles = angles; - - if ( isdefined( script_length ) ) - unitrigger_stub.script_length = script_length; - else - unitrigger_stub.script_length = 13.5; - - if ( isdefined( script_width ) ) - unitrigger_stub.script_width = script_width; - else - unitrigger_stub.script_width = 27.5; - - if ( isdefined( script_height ) ) - unitrigger_stub.script_height = script_height; - else - unitrigger_stub.script_height = 24; - - unitrigger_stub.radius = radius; - unitrigger_stub.cursor_hint = "HINT_NOICON"; - unitrigger_stub.hint_string = hint; - - if ( getdvarint( "tu12_zombies_allow_hint_weapon_from_script" ) ) - { - unitrigger_stub.cursor_hint = "HINT_WEAPON"; - unitrigger_stub.cursor_hint_weapon = icon; - } - - unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; - unitrigger_stub.require_look_at = 0; - - switch ( classname ) - { - case "trigger_radius": - unitrigger_stub.script_unitrigger_type = "unitrigger_radius"; - break; - case "trigger_radius_use": - unitrigger_stub.script_unitrigger_type = "unitrigger_radius_use"; - break; - case "trigger_box": - unitrigger_stub.script_unitrigger_type = "unitrigger_box"; - break; - case "trigger_box_use": - unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; - break; - } - - unitrigger_stub.originfunc = ::eqstub_get_unitrigger_origin; - unitrigger_stub.onspawnfunc = ::eqstub_on_spawn_trigger; - - if ( isdefined( moving ) && moving ) - maps\mp\zombies\_zm_unitrigger::register_unitrigger( unitrigger_stub, think ); - else - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, think ); - - return unitrigger_stub; + self endon( "death" ); + equipment endon( "death" ); + while ( self.doing_equipment_attack ) + { + self waittill( msg, notetrack ); + if ( notetrack == "end" ) + { + return; + } + if ( notetrack == "fire" ) + { + equipment item_damage( 100 ); + } + } } -can_pick_up_equipment( equipment_name, equipment_trigger ) +destructible_equipment_list_check() //checked changed at own discretion { - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || self in_revive_trigger() ) - return false; - - if ( self isthrowinggrenade() ) - return false; - - if ( isdefined( self.screecher_weapon ) ) - return false; - - if ( self is_jumping() ) - return false; - - if ( self is_player_equipment( equipment_name ) ) - return false; - - if ( isdefined( self.pickup_equipment ) && self.pickup_equipment ) - return false; - - if ( isdefined( level.equipment_team_pick_up ) && level.equipment_team_pick_up && !self same_team_placed_equipment( equipment_trigger ) ) - return false; - - return true; + if ( !isDefined( level.destructible_equipment ) ) + { + level.destructible_equipment = []; + } + for ( i = 0; i < level.destructible_equipment.size; i++ ) + { + if ( !isDefined( level.destructible_equipment[ i ] ) ) + { + arrayremoveindex( level.destructible_equipment, i ); + } + } } -same_team_placed_equipment( equipment_trigger ) +destructible_equipment_list_add( item ) //checked matches cerberus output { - return isdefined( equipment_trigger ) && isdefined( equipment_trigger.stub ) && isdefined( equipment_trigger.stub.model ) && isdefined( equipment_trigger.stub.model.owner ) && equipment_trigger.stub.model.owner.pers["team"] == self.pers["team"]; + destructible_equipment_list_check(); + level.destructible_equipment[ level.destructible_equipment.size ] = item; } -placed_equipment_think( model, equipname, origin, angles, tradius, toffset ) +get_destructible_equipment_list() //checked matches cerberus output { - pickupmodel = spawn( "script_model", origin ); - - if ( isdefined( angles ) ) - pickupmodel.angles = angles; - - pickupmodel setmodel( model ); - - if ( isdefined( level.equipment_safe_to_drop ) ) - { - if ( !self [[ level.equipment_safe_to_drop ]]( pickupmodel ) ) - { - equipment_disappear_fx( pickupmodel.origin, undefined, pickupmodel.angles ); - pickupmodel delete(); - self equipment_take( equipname ); - return undefined; - } - } - - watchername = getsubstr( equipname, 0, equipname.size - 3 ); - - if ( isdefined( level.retrievehints[watchername] ) ) - hint = level.retrievehints[watchername].hint; - else - hint = &"MP_GENERIC_PICKUP"; - - icon = get_equipment_icon( equipname ); - - if ( !isdefined( tradius ) ) - tradius = 32; - - torigin = origin; - - if ( isdefined( toffset ) ) - { - tforward = anglestoforward( angles ); - torigin += toffset * tforward; - } - - tup = anglestoup( angles ); - eq_unitrigger_offset = 12 * tup; - pickupmodel.stub = generate_equipment_unitrigger( "trigger_radius_use", torigin + eq_unitrigger_offset, angles, 0, tradius, 64, hint, equipname, ::placed_equipment_unitrigger_think, isdefined( pickupmodel.canmove ) && pickupmodel.canmove ); - pickupmodel.stub.model = pickupmodel; - pickupmodel.stub.equipname = equipname; - pickupmodel.equipname = equipname; - pickupmodel thread item_attract_zombies(); - pickupmodel thread item_watch_explosions(); - - if ( is_limited_equipment( equipname ) ) - { - if ( !isdefined( level.dropped_equipment ) ) - level.dropped_equipment = []; - - if ( isdefined( level.dropped_equipment[equipname] ) && isdefined( level.dropped_equipment[equipname].model ) ) - level.dropped_equipment[equipname].model dropped_equipment_destroy( 1 ); - - level.dropped_equipment[equipname] = pickupmodel.stub; - } - - destructible_equipment_list_add( pickupmodel ); - return pickupmodel; + destructible_equipment_list_check(); + return level.destructible_equipment; } -watch_player_visibility( equipment ) +equipment_disappear_fx( origin, fx, angles ) //checked matches cerberus output { - self endon( "kill_trigger" ); - self setinvisibletoall(); - - while ( isdefined( self ) ) - { - players = getplayers(); - - foreach ( player in players ) - { - if ( !isdefined( player ) ) - continue; - - invisible = !player can_pick_up_equipment( equipment, self ); - - if ( isdefined( self ) ) - self setinvisibletoplayer( player, invisible ); - - wait 0.05; - } - - wait 1; - } + effect = level._equipment_disappear_fx; + if ( isDefined( fx ) ) + { + effect = fx; + } + if ( isDefined( angles ) ) + { + playfx( effect, origin, anglesToForward( angles ) ); + } + else + { + playfx( effect, origin ); + } + wait 1.1; } -placed_equipment_unitrigger_think() -{ - self endon( "kill_trigger" ); - self thread watch_player_visibility( self.stub.equipname ); - while ( true ) - { - self waittill( "trigger", player ); - if ( !player can_pick_up_equipment( self.stub.equipname, self ) ) - continue; - self thread pickup_placed_equipment( player ); - return; - } -} - -pickup_placed_equipment( player ) -{ -/# - assert( !( isdefined( player.pickup_equipment ) && player.pickup_equipment ) ); -#/ - player.pickup_equipment = 1; - stub = self.stub; - - if ( isdefined( player.current_equipment ) && stub.equipname != player.current_equipment ) - player equipment_drop( player.current_equipment ); - - if ( is_limited_equipment( stub.equipname ) ) - { - if ( isdefined( level.dropped_equipment ) && isdefined( level.dropped_equipment[stub.equipname] ) && level.dropped_equipment[stub.equipname] == stub ) - level.dropped_equipment[stub.equipname] = undefined; - } - - if ( isdefined( stub.model ) ) - stub.model equipment_retrieve( player ); - - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( stub ); - wait 3; - player.pickup_equipment = 0; -} - -dropped_equipment_think( model, equipname, origin, angles, tradius, toffset ) -{ - pickupmodel = spawn( "script_model", origin ); - - if ( isdefined( angles ) ) - pickupmodel.angles = angles; - - pickupmodel setmodel( model ); - - if ( isdefined( level.equipment_safe_to_drop ) ) - { - if ( !self [[ level.equipment_safe_to_drop ]]( pickupmodel ) ) - { - equipment_disappear_fx( pickupmodel.origin, undefined, pickupmodel.angles ); - pickupmodel delete(); - self equipment_take( equipname ); - return; - } - } - - watchername = getsubstr( equipname, 0, equipname.size - 3 ); - - if ( isdefined( level.retrievehints[watchername] ) ) - hint = level.retrievehints[watchername].hint; - else - hint = &"MP_GENERIC_PICKUP"; - - icon = get_equipment_icon( equipname ); - - if ( !isdefined( tradius ) ) - tradius = 32; - - torigin = origin; - - if ( isdefined( toffset ) ) - { - offset = 64; - tforward = anglestoforward( angles ); - torigin = torigin + toffset * tforward + vectorscale( ( 0, 0, 1 ), 8.0 ); - } - - pickupmodel.stub = generate_equipment_unitrigger( "trigger_radius_use", torigin, angles, 0, tradius, 64, hint, equipname, ::dropped_equipment_unitrigger_think, isdefined( pickupmodel.canmove ) && pickupmodel.canmove ); - pickupmodel.stub.model = pickupmodel; - pickupmodel.stub.equipname = equipname; - pickupmodel.equipname = equipname; - - if ( isdefined( level.equipment_planted ) ) - self [[ level.equipment_planted ]]( pickupmodel, equipname, self ); - - if ( !isdefined( level.dropped_equipment ) ) - level.dropped_equipment = []; - - if ( isdefined( level.dropped_equipment[equipname] ) ) - level.dropped_equipment[equipname].model dropped_equipment_destroy( 1 ); - - level.dropped_equipment[equipname] = pickupmodel.stub; - destructible_equipment_list_add( pickupmodel ); - pickupmodel thread item_attract_zombies(); - return pickupmodel; -} - -dropped_equipment_unitrigger_think() -{ - self endon( "kill_trigger" ); - self thread watch_player_visibility( self.stub.equipname ); - - while ( true ) - { - self waittill( "trigger", player ); - - if ( !player can_pick_up_equipment( self.stub.equipname, self ) ) - continue; - - self thread pickup_dropped_equipment( player ); - return; - } -} - -pickup_dropped_equipment( player ) -{ - player.pickup_equipment = 1; - stub = self.stub; - - if ( isdefined( player.current_equipment ) && stub.equipname != player.current_equipment ) - player equipment_drop( player.current_equipment ); - - player equipment_grab( stub.equipname, stub.model ); - stub.model dropped_equipment_destroy(); - wait 3; - player.pickup_equipment = 0; -} - -dropped_equipment_destroy( gusto ) -{ - stub = self.stub; - - if ( isdefined( gusto ) && gusto ) - equipment_disappear_fx( self.origin, undefined, self.angles ); - - if ( isdefined( level.dropped_equipment ) ) - level.dropped_equipment[stub.equipname] = undefined; - - if ( isdefined( stub.model ) ) - stub.model delete(); - - if ( isdefined( self.original_owner ) && ( is_limited_equipment( stub.equipname ) || maps\mp\zombies\_zm_weapons::is_weapon_included( stub.equipname ) ) ) - self.original_owner equipment_take( stub.equipname ); - - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( stub ); -} - -add_placeable_equipment( equipment, modelname, destroy_fn, type ) -{ - if ( !isdefined( level.placeable_equipment ) ) - level.placeable_equipment = []; - - level.placeable_equipment[equipment] = modelname; - precachemodel( modelname ); - precacheitem( equipment + "_turret" ); - - if ( !isdefined( level.placeable_equipment_destroy_fn ) ) - level.placeable_equipment_destroy_fn = []; - - level.placeable_equipment_destroy_fn[equipment] = destroy_fn; - - if ( !isdefined( level.placeable_equipment_type ) ) - level.placeable_equipment_type = []; - - level.placeable_equipment_type[equipment] = type; -} - -is_placeable_equipment( equipment ) -{ - if ( isdefined( level.placeable_equipment ) && isdefined( level.placeable_equipment[equipment] ) ) - return true; - - return false; -} - -equipment_placement_watcher() -{ - self endon( "death_or_disconnect" ); - - for (;;) - { - self waittill( "weapon_change", weapon ); - - if ( self.sessionstate != "spectator" && is_placeable_equipment( weapon ) ) - self thread equipment_watch_placement( weapon ); - } -} - -equipment_watch_placement( equipment ) -{ - self.turret_placement = undefined; - carry_offset = vectorscale( ( 1, 0, 0 ), 22.0 ); - carry_angles = ( 0, 0, 0 ); - placeturret = spawnturret( "auto_turret", self.origin, equipment + "_turret" ); - placeturret.angles = self.angles; - placeturret setmodel( level.placeable_equipment[equipment] ); - placeturret setturretcarried( 1 ); - placeturret setturretowner( self ); - - if ( isdefined( level.placeable_equipment_type[equipment] ) ) - placeturret setturrettype( level.placeable_equipment_type[equipment] ); - - self carryturret( placeturret, carry_offset, carry_angles ); - - if ( isdefined( level.use_swipe_protection ) ) - self thread watch_melee_swipes( equipment, placeturret ); - - self notify( "create_equipment_turret", equipment, placeturret ); - ended = self waittill_any_return( "weapon_change", "grenade_fire", "death_or_disconnect" ); - - if ( !( isdefined( level.use_legacy_equipment_placement ) && level.use_legacy_equipment_placement ) ) - self.turret_placement = self canplayerplaceturret( placeturret ); - - if ( ended == "weapon_change" ) - { - self.turret_placement = undefined; - - if ( self hasweapon( equipment ) ) - self setweaponammoclip( equipment, 1 ); - } - - self notify( "destroy_equipment_turret", equipment, placeturret ); - self stopcarryturret( placeturret ); - placeturret setturretcarried( 0 ); - placeturret delete(); -} - -watch_melee_swipes( equipment, turret ) -{ - self endon( "weapon_change" ); - self endon( "grenade_fire" ); - self endon( "death" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "melee_swipe", zombie ); - - if ( distancesquared( zombie.origin, self.origin ) > zombie.meleeattackdist * zombie.meleeattackdist ) - continue; - - tpos = turret.origin; - tangles = turret.angles; - self player_damage_equipment( equipment, 200, zombie.origin ); - - if ( self.equipment_damage[equipment] >= 1500 ) - { - thread equipment_disappear_fx( tpos, undefined, tangles ); - primaryweapons = self getweaponslistprimaries(); - - if ( isdefined( primaryweapons[0] ) ) - self switchtoweapon( primaryweapons[0] ); - - if ( isalive( self ) ) - self playlocalsound( level.zmb_laugh_alias ); - - self maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 ); - self equipment_release( equipment ); - return; - } - } -} - -player_get_equipment_damage( equipment ) -{ - if ( isdefined( self.equipment_damage ) && isdefined( self.equipment_damage[equipment] ) ) - return self.equipment_damage[equipment]; - - return 0; -} - -player_set_equipment_damage( equipment, damage ) -{ - if ( !isdefined( self.equipment_damage ) ) - self.equipment_damage = []; - - self.equipment_damage[equipment] = damage; -} - -player_damage_equipment( equipment, damage, origin ) -{ - if ( !isdefined( self.equipment_damage ) ) - self.equipment_damage = []; - - if ( !isdefined( self.equipment_damage[equipment] ) ) - self.equipment_damage[equipment] = 0; - - self.equipment_damage[equipment] += damage; - - if ( self.equipment_damage[equipment] > 1500 ) - { - if ( isdefined( level.placeable_equipment_destroy_fn[equipment] ) ) - self [[ level.placeable_equipment_destroy_fn[equipment] ]](); - else - equipment_disappear_fx( origin ); - - self equipment_release( equipment ); - } -} - -item_damage( damage ) -{ - if ( isdefined( self.isriotshield ) && self.isriotshield ) - { - if ( isdefined( level.riotshield_damage_callback ) && isdefined( self.owner ) ) - self.owner [[ level.riotshield_damage_callback ]]( damage, 0 ); - else if ( isdefined( level.deployed_riotshield_damage_callback ) ) - self [[ level.deployed_riotshield_damage_callback ]]( damage ); - } - else if ( isdefined( self.owner ) ) - self.owner player_damage_equipment( self.equipname, damage, self.origin ); - else - { - if ( !isdefined( self.damage ) ) - self.damage = 0; - - self.damage += damage; - - if ( self.damage > 1500 ) - self thread dropped_equipment_destroy( 1 ); - } -} - -item_watch_damage() -{ - self endon( "death" ); - self setcandamage( 1 ); - self.health = 1500; - - while ( true ) - { - self waittill( "damage", amount ); - - self item_damage( amount ); - } -} - -item_watch_explosions() -{ - self endon( "death" ); - - while ( true ) - { - level waittill( "grenade_exploded", position, radius, idamage, odamage ); - - wait( randomfloatrange( 0.05, 0.3 ) ); - distsqrd = distancesquared( self.origin, position ); - - if ( distsqrd < radius * radius ) - { - dist = sqrt( distsqrd ); - dist /= radius; - damage = odamage + ( idamage - odamage ) * ( 1 - dist ); - self item_damage( damage * 5 ); - } - } -} - -get_item_health() -{ -/# - damage = 0; - - if ( isdefined( self.isriotshield ) && self.isriotshield ) - { - damagemax = level.zombie_vars["riotshield_hit_points"]; - - if ( isdefined( self.owner ) ) - damage = self.owner.shielddamagetaken; - else if ( isdefined( level.deployed_riotshield_damage_callback ) ) - damage = self.shielddamagetaken; - } - else if ( isdefined( self.owner ) ) - { - damagemax = 1500; - damage = self.owner player_get_equipment_damage( self.equipname ); - } - else - { - damagemax = 1500; - - if ( isdefined( self.damage ) ) - damage = self.damage; - } - - return ( damagemax - damage ) / damagemax; -#/ -} - -debughealth() -{ -/# - self endon( "death" ); - self endon( "stop_attracting_zombies" ); - - while ( true ) - { - if ( getdvarint( _hash_EB512CB7 ) ) - { - health = self get_item_health(); - color = ( 1 - health, health, 0 ); - text = "" + health * 100 + ""; - print3d( self.origin, text, color, 1, 0.5, 1 ); - } - - wait 0.05; - } -#/ -} - -item_choke() -{ - if ( !isdefined( level.item_choke_count ) ) - level.item_choke_count = 0; - - level.item_choke_count++; - - if ( !( level.item_choke_count >= 10 ) ) - { - wait 0.05; - level.item_choke_count = 0; - } -} - -is_equipment_ignored( equipname ) -{ - if ( isdefined( level.equipment_ignored_by_zombies ) && isdefined( equipname ) && isdefined( level.equipment_ignored_by_zombies[equipname] ) ) - return true; - - return false; -} - -enemies_ignore_equipment( equipname ) -{ - if ( !isdefined( level.equipment_ignored_by_zombies ) ) - level.equipment_ignored_by_zombies = []; - - level.equipment_ignored_by_zombies[equipname] = equipname; -} - -item_attract_zombies() -{ - self endon( "death" ); - self notify( "stop_attracting_zombies" ); - self endon( "stop_attracting_zombies" ); -/# - self thread debughealth(); -#/ - if ( is_equipment_ignored( self.equipname ) ) - return; - - while ( true ) - { - if ( isdefined( level.vert_equipment_attack_range ) ) - vdistmax = level.vert_equipment_attack_range; - else - vdistmax = 36; - - if ( isdefined( level.max_equipment_attack_range ) ) - distmax = level.max_equipment_attack_range * level.max_equipment_attack_range; - else - distmax = 4096; - - if ( isdefined( level.min_equipment_attack_range ) ) - distmin = level.min_equipment_attack_range * level.min_equipment_attack_range; - else - distmin = 2025; - - ai = getaiarray( level.zombie_team ); - - for ( i = 0; i < ai.size; i++ ) - { - if ( !isdefined( ai[i] ) ) - continue; - - if ( isdefined( ai[i].ignore_equipment ) && ai[i].ignore_equipment ) - continue; - - if ( isdefined( level.ignore_equipment ) ) - { - if ( self [[ level.ignore_equipment ]]( ai[i] ) ) - continue; - } - - if ( isdefined( ai[i].is_inert ) && ai[i].is_inert ) - continue; - - if ( isdefined( ai[i].is_traversing ) && ai[i].is_traversing ) - continue; - - vdist = abs( ai[i].origin[2] - self.origin[2] ); - distsqrd = distance2dsquared( ai[i].origin, self.origin ); - - if ( isdefined( self.equipname ) && ( self.equipname == "riotshield_zm" || self.equipname == "alcatraz_shield_zm" ) ) - vdistmax = 108; - - should_attack = 0; - - if ( isdefined( level.should_attack_equipment ) ) - should_attack = self [[ level.should_attack_equipment ]]( distsqrd ); - - if ( distsqrd < distmax && distsqrd > distmin && vdist < vdistmax || should_attack ) - { - if ( !( isdefined( ai[i].isscreecher ) && ai[i].isscreecher ) && !ai[i] is_quad() && !ai[i] is_leaper() ) - { - ai[i] thread attack_item( self ); - item_choke(); - } - } - - item_choke(); - } - - wait 0.1; - } -} - -attack_item( item ) -{ - self endon( "death" ); - item endon( "death" ); - self endon( "start_inert" ); - - if ( isdefined( self.doing_equipment_attack ) && self.doing_equipment_attack ) - return 0; - - if ( isdefined( self.not_interruptable ) && self.not_interruptable ) - return 0; - - self thread attack_item_stop( item ); - self thread attack_item_interrupt( item ); - - if ( getdvar( _hash_FA9CEAA6 ) == "" ) - setdvar( "zombie_equipment_attack_freq", "15" ); - - freq = getdvarint( _hash_FA9CEAA6 ); - self.doing_equipment_attack = 1; - self maps\mp\zombies\_zm_spawner::zombie_history( "doing equipment attack 1 - " + gettime() ); - self.item = item; - - if ( !isdefined( self ) || !isalive( self ) ) - return; - - if ( isdefined( item.zombie_attack_callback ) ) - item [[ item.zombie_attack_callback ]]( self ); - - self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "attack", self.animname ); - - if ( isdefined( level.attack_item ) ) - self [[ level.attack_item ]](); - - melee_anim = "zm_window_melee"; - - if ( !self.has_legs ) - { - melee_anim = "zm_walk_melee_crawl"; - - if ( self.a.gib_ref == "no_legs" ) - melee_anim = "zm_stumpy_melee"; - else if ( self.zombie_move_speed == "run" || self.zombie_move_speed == "sprint" ) - melee_anim = "zm_run_melee_crawl"; - } - - self orientmode( "face point", item.origin ); - self animscripted( self.origin, flat_angle( vectortoangles( item.origin - self.origin ) ), melee_anim ); - self notify( "item_attack" ); - - if ( isdefined( self.custom_item_dmg ) ) - item thread item_damage( self.custom_item_dmg ); - else - item thread item_damage( 100 ); - - item playsound( "fly_riotshield_zm_impact_flesh" ); - wait( randomint( 100 ) / 100.0 ); - self.doing_equipment_attack = 0; - self maps\mp\zombies\_zm_spawner::zombie_history( "doing equipment attack 0 from wait - " + gettime() ); - self orientmode( "face default" ); -} - -attack_item_interrupt( item ) -{ - if ( !( isdefined( self.has_legs ) && self.has_legs ) ) - return; - - self notify( "attack_item_interrupt" ); - self endon( "attack_item_interrupt" ); - self endon( "death" ); - - while ( isdefined( self.has_legs ) && self.has_legs ) - self waittill( "damage" ); - - self stopanimscripted(); - self.doing_equipment_attack = 0; - self maps\mp\zombies\_zm_spawner::zombie_history( "doing equipment attack 0 from death - " + gettime() ); - self.item = undefined; -} - -attack_item_stop( item ) -{ - self notify( "attack_item_stop" ); - self endon( "attack_item_stop" ); - self endon( "death" ); - - item waittill( "death" ); - - self stopanimscripted(); - self.doing_equipment_attack = 0; - self maps\mp\zombies\_zm_spawner::zombie_history( "doing equipment attack 0 from death - " + gettime() ); - self.item = undefined; - - if ( isdefined( level.attack_item_stop ) ) - self [[ level.attack_item_stop ]](); -} - -window_notetracks( msg, equipment ) -{ - self endon( "death" ); - equipment endon( "death" ); - - while ( self.doing_equipment_attack ) - { - self waittill( msg, notetrack ); - - if ( notetrack == "end" ) - return; - - if ( notetrack == "fire" ) - equipment item_damage( 100 ); - } -} - -destructible_equipment_list_check() -{ - if ( !isdefined( level.destructible_equipment ) ) - level.destructible_equipment = []; - - for ( i = 0; i < level.destructible_equipment.size; i++ ) - { - - } -} - -destructible_equipment_list_add( item ) -{ - destructible_equipment_list_check(); - level.destructible_equipment[level.destructible_equipment.size] = item; -} - -get_destructible_equipment_list() -{ - destructible_equipment_list_check(); - return level.destructible_equipment; -} - -equipment_disappear_fx( origin, fx, angles ) -{ - effect = level._equipment_disappear_fx; - - if ( isdefined( fx ) ) - effect = fx; - - if ( isdefined( angles ) ) - playfx( effect, origin, anglestoforward( angles ) ); - else - playfx( effect, origin ); - - wait 1.1; -} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ffotd.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ffotd.gsc index c0df62d..a44bfe9 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ffotd.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ffotd.gsc @@ -1,214 +1,221 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_stats; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -main_start() +main_start() //checked matches cerberus output { - mapname = tolower( getdvar( "mapname" ) ); - gametype = getdvar( "ui_gametype" ); - - if ( "zm_transit" == tolower( getdvar( "mapname" ) ) && "zclassic" == getdvar( "ui_gametype" ) ) - level thread transit_navcomputer_remove_card_on_success(); - - if ( "zm_prison" == tolower( getdvar( "mapname" ) ) && "zgrief" == getdvar( "ui_gametype" ) ) - level.zbarrier_script_string_sets_collision = 1; - - if ( ( "zm_transit" == mapname || "zm_highrise" == mapname ) && "zclassic" == gametype ) - { - level.pers_upgrade_sniper = 1; - level.pers_upgrade_pistol_points = 1; - level.pers_upgrade_perk_lose = 1; - level.pers_upgrade_double_points = 1; - level.pers_upgrade_nube = 1; - } + mapname = tolower( getDvar( "mapname" ) ); + gametype = getDvar( "ui_gametype" ); + if ( tolower( getDvar( "mapname" ) ) == "zm_transit" && getDvar( "ui_gametype" ) == "zclassic" ) + { + level thread transit_navcomputer_remove_card_on_success(); + } + if ( tolower( getDvar( "mapname" ) ) == "zm_prison" && getDvar( "ui_gametype" ) == "zgrief" ) + { + level.zbarrier_script_string_sets_collision = 1; + } + if ( mapname != "zm_transit" && mapname == "zm_highrise" && gametype == "zclassic" ) + { + level.pers_upgrade_sniper = 1; + level.pers_upgrade_pistol_points = 1; + level.pers_upgrade_perk_lose = 1; + level.pers_upgrade_double_points = 1; + level.pers_upgrade_nube = 1; + } } -main_end() +main_end() //checked matches cerberus output { - onfinalizeinitialization_callback( ::force_navcomputer_trigger_think ); - level.original_melee_miss_func = level.melee_miss_func; - level.melee_miss_func = ::ffotd_melee_miss_func; + onfinalizeinitialization_callback( ::force_navcomputer_trigger_think ); + level.original_melee_miss_func = level.melee_miss_func; + level.melee_miss_func = ::ffotd_melee_miss_func; } -force_navcomputer_trigger_think() +force_navcomputer_trigger_think() //checked changed to match cerberus output { - if ( !isdefined( level.zombie_include_buildables ) || !level.zombie_include_buildables.size ) - return; - - foreach ( buildable in level.zombie_include_buildables ) - { - if ( "sq_common" == buildable.name ) - { - if ( isdefined( buildable.triggerthink ) ) - { - level [[ buildable.triggerthink ]](); - trigger_think_func = buildable.triggerthink; - buildable.triggerthink = undefined; - - level waittill( "buildables_setup" ); - - buildable.triggerthink = trigger_think_func; - return; - } - } - } + if ( !isDefined( level.zombie_include_buildables ) || !level.zombie_include_buildables.size ) + { + return; + } + foreach ( buildable in level.zombie_include_buildables ) + { + if ( buildable.name == "sq_common" ) + { + if ( isDefined( buildable.triggerthink ) ) + { + level [[ buildable.triggerthink ]](); + trigger_think_func = buildable.triggerthink; + buildable.triggerthink = undefined; + level waittill( "buildables_setup" ); + buildable.triggerthink = trigger_think_func; + return; + } + } + } } -transit_navcomputer_remove_card_on_success() +transit_navcomputer_remove_card_on_success() //checked changed to match cerberus output { - wait_for_buildable( "sq_common" ); - wait_network_frame(); - trig_pos = getstruct( "sq_common_key", "targetname" ); - trigs = getentarray( "trigger_radius_use", "classname" ); - nav_trig = undefined; - - foreach ( trig in trigs ) - { - if ( trig.origin == trig_pos.origin ) - nav_trig = trig; - } - - if ( isdefined( nav_trig ) ) - { - while ( true ) - { - nav_trig waittill( "trigger", who ); - - if ( isplayer( who ) && is_player_valid( who ) && does_player_have_correct_navcard( who ) ) - break; - } - - players = get_players(); - - foreach ( player in players ) - player maps\mp\zombies\_zm_stats::set_global_stat( level.navcard_needed, 0 ); - - level thread sq_refresh_player_navcard_hud(); - } + wait_for_buildable( "sq_common" ); + wait_network_frame(); + trig_pos = getstruct( "sq_common_key", "targetname" ); + trigs = getentarray( "trigger_radius_use", "classname" ); + nav_trig = undefined; + foreach ( trig in trigs ) + { + if ( trig.origin == trig_pos.origin ) + { + nav_trig = trig; + } + _k81 = getNextArrayKey( _a81, _k81 ); + } + if ( isDefined( nav_trig ) ) + { + while ( 1 ) + { + nav_trig waittill( "trigger", who ); + if ( isplayer( who ) && is_player_valid( who ) && does_player_have_correct_navcard( who ) ) + { + break; + } + } + players = get_players(); + foreach ( player in players ) + { + player maps/mp/zombies/_zm_stats::set_global_stat( level.navcard_needed, 0 ); + } + level thread sq_refresh_player_navcard_hud(); + } } -sq_refresh_player_navcard_hud() +sq_refresh_player_navcard_hud() //checked changed to match cerberus output { - if ( !isdefined( level.navcards ) ) - return; - - players = get_players(); - - foreach ( player in players ) - { - navcard_bits = 0; - - for ( i = 0; i < level.navcards.size; i++ ) - { - hasit = player maps\mp\zombies\_zm_stats::get_global_stat( level.navcards[i] ); - - if ( isdefined( player.navcard_grabbed ) && player.navcard_grabbed == level.navcards[i] ) - hasit = 1; - - if ( hasit ) - navcard_bits += ( 1 << i ); - } - - wait_network_frame(); - player setclientfield( "navcard_held", 0 ); - - if ( navcard_bits > 0 ) - { - wait_network_frame(); - player setclientfield( "navcard_held", navcard_bits ); - } - } + if ( !isDefined( level.navcards ) ) + { + return; + } + players = get_players(); + foreach ( player in players ) + { + navcard_bits = 0; + for ( i = 0; i < level.navcards.size; i++ ) + { + hasit = player maps/mp/zombies/_zm_stats::get_global_stat( level.navcards[ i ] ); + if ( isDefined( player.navcard_grabbed ) && player.navcard_grabbed == level.navcards[ i ] ) + { + hasit = 1; + } + if ( hasit ) + { + navcard_bits = navcard_bits + 1; + } + } + wait_network_frame(); + player setclientfield( "navcard_held", 0 ); + if ( navcard_bits > 0 ) + { + wait_network_frame(); + player setclientfield( "navcard_held", navcard_bits ); + } + } } player_in_exploit_area( player_trigger_origin, player_trigger_radius ) { - if ( distancesquared( player_trigger_origin, self.origin ) < player_trigger_radius * player_trigger_radius ) - { + if ( distancesquared( player_trigger_origin, self.origin ) < player_trigger_radius * player_trigger_radius ) + { + /* /# - iprintlnbold( "player exploit detectect" ); + iprintlnbold( "player exploit detected" ); #/ - return true; - } - - return false; + */ + return 1; + } + return 0; } -path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ) +path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ) //checked matches cerberus output { - spawnflags = 9; - zombie_trigger = spawn( "trigger_radius", zombie_trigger_origin, spawnflags, zombie_trigger_radius, zombie_trigger_height ); - zombie_trigger setteamfortrigger( level.zombie_team ); + spawnflags = 9; + zombie_trigger = spawn( "trigger_radius", zombie_trigger_origin, spawnflags, zombie_trigger_radius, zombie_trigger_height ); + zombie_trigger setteamfortrigger( level.zombie_team ); + /* /# - thread debug_exploit( zombie_trigger_origin, zombie_trigger_radius, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + thread debug_exploit( zombie_trigger_origin, zombie_trigger_radius, player_trigger_origin, player_trigger_radius, zombie_goto_point ); #/ - while ( true ) - { - zombie_trigger waittill( "trigger", who ); - - if ( !is_true( who.reroute ) ) - who thread exploit_reroute( zombie_trigger, player_trigger_origin, player_trigger_radius, zombie_goto_point ); - } + */ + while ( 1 ) + { + zombie_trigger waittill( "trigger", who ); + if ( !is_true( who.reroute ) ) + { + who thread exploit_reroute( zombie_trigger, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + } + } } -exploit_reroute( zombie_trigger, player_trigger_origin, player_trigger_radius, zombie_goto_point ) +exploit_reroute( zombie_trigger, player_trigger_origin, player_trigger_radius, zombie_goto_point ) //checked matches cerberus output { - self endon( "death" ); - self.reroute = 1; - - while ( true ) - { - if ( self istouching( zombie_trigger ) ) - { - player = self.favoriteenemy; - - if ( isdefined( player ) && player player_in_exploit_area( player_trigger_origin, player_trigger_radius ) ) - self.reroute_origin = zombie_goto_point; - else - break; - } - else - break; - - wait 0.2; - } - - self.reroute = 0; + self endon( "death" ); + self.reroute = 1; + while ( 1 ) + { + if ( self istouching( zombie_trigger ) ) + { + player = self.favoriteenemy; + if ( isDefined( player ) && player player_in_exploit_area( player_trigger_origin, player_trigger_radius ) ) + { + self.reroute_origin = zombie_goto_point; + } + else + { + break; + } + } + else + { + break; + } + wait 0.2; + } + self.reroute = 0; } -debug_exploit( player_origin, player_radius, enemy_origin, enemy_radius, zombie_goto_point ) +debug_exploit( player_origin, player_radius, enemy_origin, enemy_radius, zombie_goto_point ) //dev call commented out { +/* /# - while ( isdefined( self ) ) - { - circle( player_origin, player_radius, ( 0, 0, 1 ), 0, 1, 1 ); - circle( enemy_origin, enemy_radius, ( 1, 0, 0 ), 0, 1, 1 ); - line( player_origin, enemy_origin, ( 1, 0, 0 ), 1 ); - line( enemy_origin, zombie_goto_point, ( 1, 1, 0 ), 1 ); - wait 0.05; - } + while ( isDefined( self ) ) + { + circle( player_origin, player_radius, ( 1, 1, 0 ), 0, 1, 1 ); + circle( enemy_origin, enemy_radius, ( 1, 1, 0 ), 0, 1, 1 ); + line( player_origin, enemy_origin, ( 1, 1, 0 ), 1 ); + line( enemy_origin, zombie_goto_point, ( 1, 1, 0 ), 1 ); + wait 0.05; #/ + } +*/ } -ffotd_melee_miss_func() +ffotd_melee_miss_func() //checked matches cerberus output { - if ( isdefined( self.enemy ) ) - { - if ( isplayer( self.enemy ) && self.enemy getcurrentweapon() == "claymore_zm" ) - { - dist_sq = distancesquared( self.enemy.origin, self.origin ); - melee_dist_sq = self.meleeattackdist * self.meleeattackdist; - - if ( dist_sq < melee_dist_sq ) - { - self.enemy dodamage( self.meleedamage, self.origin, self, self, "none", "MOD_MELEE" ); - return; - } - } - } - - if ( isdefined( level.original_melee_miss_func ) ) - self [[ level.original_melee_miss_func ]](); + if ( isDefined( self.enemy ) ) + { + if ( isplayer( self.enemy ) && self.enemy getcurrentweapon() == "claymore_zm" ) + { + dist_sq = distancesquared( self.enemy.origin, self.origin ); + melee_dist_sq = self.meleeattackdist * self.meleeattackdist; + if ( dist_sq < melee_dist_sq ) + { + self.enemy dodamage( self.meleedamage, self.origin, self, self, "none", "MOD_MELEE" ); + return; + } + } + } + if ( isDefined( level.original_melee_miss_func ) ) + { + self [[ level.original_melee_miss_func ]](); + } } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_game_module.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_game_module.gsc index ca8ad48..069cf97 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_game_module.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_game_module.gsc @@ -1,446 +1,446 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm; -#include maps\mp\zombies\_zm_audio_announcer; -#include maps\mp\gametypes_zm\_zm_gametype; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/zombies/_zm_audio_announcer; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -register_game_module( index, module_name, pre_init_func, post_init_func, pre_init_zombie_spawn_func, post_init_zombie_spawn_func, hub_start_func ) +register_game_module( index, module_name, pre_init_func, post_init_func, pre_init_zombie_spawn_func, post_init_zombie_spawn_func, hub_start_func ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent the infinite loop bu caused by continues { - if ( !isdefined( level._game_modules ) ) - { - level._game_modules = []; - level._num_registered_game_modules = 0; - } - - for ( i = 0; i < level._num_registered_game_modules; i++ ) - { - if ( !isdefined( level._game_modules[i] ) ) - continue; - - if ( isdefined( level._game_modules[i].index ) && level._game_modules[i].index == index ) - { + if ( !isDefined( level._game_modules ) ) + { + level._game_modules = []; + level._num_registered_game_modules = 0; + } + i = 0; + while ( i < level._num_registered_game_modules ) + { + if ( !isDefined( level._game_modules[ i ] ) ) + { + i++; + continue; + } + if ( isDefined( level._game_modules[ i ].index ) && level._game_modules[ i ].index == index ) + { + /* /# - assert( level._game_modules[i].index != index, "A Game module is already registered for index (" + index + ")" ); + assert( level._game_modules[ i ].index != index, "A Game module is already registered for index (" + index + ")" ); #/ - } - } - - level._game_modules[level._num_registered_game_modules] = spawnstruct(); - level._game_modules[level._num_registered_game_modules].index = index; - level._game_modules[level._num_registered_game_modules].module_name = module_name; - level._game_modules[level._num_registered_game_modules].pre_init_func = pre_init_func; - level._game_modules[level._num_registered_game_modules].post_init_func = post_init_func; - level._game_modules[level._num_registered_game_modules].pre_init_zombie_spawn_func = pre_init_zombie_spawn_func; - level._game_modules[level._num_registered_game_modules].post_init_zombie_spawn_func = post_init_zombie_spawn_func; - level._game_modules[level._num_registered_game_modules].hub_start_func = hub_start_func; - level._num_registered_game_modules++; + */ + } + i++; + } + level._game_modules[ level._num_registered_game_modules ] = spawnstruct(); + level._game_modules[ level._num_registered_game_modules ].index = index; + level._game_modules[ level._num_registered_game_modules ].module_name = module_name; + level._game_modules[ level._num_registered_game_modules ].pre_init_func = pre_init_func; + level._game_modules[ level._num_registered_game_modules ].post_init_func = post_init_func; + level._game_modules[ level._num_registered_game_modules ].pre_init_zombie_spawn_func = pre_init_zombie_spawn_func; + level._game_modules[ level._num_registered_game_modules ].post_init_zombie_spawn_func = post_init_zombie_spawn_func; + level._game_modules[ level._num_registered_game_modules ].hub_start_func = hub_start_func; + level._num_registered_game_modules++; } -set_current_game_module( game_module_index ) +set_current_game_module( game_module_index ) //checked matches cerberus output { - if ( !isdefined( game_module_index ) ) - { - level.current_game_module = level.game_module_classic_index; - level.scr_zm_game_module = level.game_module_classic_index; - return; - } - - game_module = get_game_module( game_module_index ); - - if ( !isdefined( game_module ) ) - { + if ( !isDefined( game_module_index ) ) + { + level.current_game_module = level.game_module_classic_index; + level.scr_zm_game_module = level.game_module_classic_index; + return; + } + game_module = get_game_module( game_module_index ); + if ( !isDefined( game_module ) ) + { + /* /# - assert( isdefined( game_module ), "unknown game module (" + game_module_index + ")" ); + assert( isDefined( game_module ), "unknown game module (" + game_module_index + ")" ); #/ - return; - } - - level.current_game_module = game_module_index; + */ + return; + } + level.current_game_module = game_module_index; } -get_current_game_module() +get_current_game_module() //checked matches cerberus output { - return get_game_module( level.current_game_module ); + return get_game_module( level.current_game_module ); } -get_game_module( game_module_index ) +get_game_module( game_module_index ) //checked changed to match cerberus output { - if ( !isdefined( game_module_index ) ) - return undefined; - - for ( i = 0; i < level._game_modules.size; i++ ) - { - if ( level._game_modules[i].index == game_module_index ) - return level._game_modules[i]; - } - - return undefined; + if ( !isDefined( game_module_index ) ) + { + return undefined; + } + for ( i = 0; i < level._game_modules.size; i++ ) + { + if ( level._game_modules[ i ].index == game_module_index ) + { + return level._game_modules[ i ]; + } + } + return undefined; } -game_module_pre_zombie_spawn_init() +game_module_pre_zombie_spawn_init() //checked matches cerberus output { - current_module = get_current_game_module(); - - if ( !isdefined( current_module ) || !isdefined( current_module.pre_init_zombie_spawn_func ) ) - return; - - self [[ current_module.pre_init_zombie_spawn_func ]](); + current_module = get_current_game_module(); + if ( !isDefined( current_module ) || !isDefined( current_module.pre_init_zombie_spawn_func ) ) + { + return; + } + self [[ current_module.pre_init_zombie_spawn_func ]](); } -game_module_post_zombie_spawn_init() +game_module_post_zombie_spawn_init() //checked matches cerberus output { - current_module = get_current_game_module(); - - if ( !isdefined( current_module ) || !isdefined( current_module.post_init_zombie_spawn_func ) ) - return; - - self [[ current_module.post_init_zombie_spawn_func ]](); + current_module = get_current_game_module(); + if ( !isDefined( current_module ) || !isDefined( current_module.post_init_zombie_spawn_func ) ) + { + return; + } + self [[ current_module.post_init_zombie_spawn_func ]](); } -kill_all_zombies() +kill_all_zombies() //checked changed to match cerberus output { - ai = get_round_enemy_array(); - - foreach ( zombie in ai ) - { - if ( isdefined( zombie ) ) - { - zombie dodamage( zombie.maxhealth * 2, zombie.origin, zombie, zombie, "none", "MOD_SUICIDE" ); - wait 0.05; - } - } + ai = get_round_enemy_array(); + foreach ( zombie in ai ) + { + if ( isDefined( zombie ) ) + { + zombie dodamage( zombie.maxhealth * 2, zombie.origin, zombie, zombie, "none", "MOD_SUICIDE" ); + wait 0.05; + } + } } -freeze_players( freeze ) +freeze_players( freeze ) //checked changed to match cerberus output { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] freeze_player_controls( freeze ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] freeze_player_controls( freeze ); + } } -turn_power_on_and_open_doors() +turn_power_on_and_open_doors() //checked changed at own discretion { - level.local_doors_stay_open = 1; - level.power_local_doors_globally = 1; - flag_set( "power_on" ); - level setclientfield( "zombie_power_on", 1 ); - zombie_doors = getentarray( "zombie_door", "targetname" ); - - foreach ( door in zombie_doors ) - { - if ( isdefined( door.script_noteworthy ) && door.script_noteworthy == "electric_door" ) - { - door notify( "power_on" ); - continue; - } - - if ( isdefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" ) - door notify( "local_power_on" ); - } + level.local_doors_stay_open = 1; + level.power_local_doors_globally = 1; + flag_set( "power_on" ); + level setclientfield( "zombie_power_on", 1 ); + zombie_doors = getentarray( "zombie_door", "targetname" ); + foreach ( door in zombie_doors ) + { + if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "electric_door" ) + { + door notify( "power_on" ); + } + else if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" ) + { + door notify( "local_power_on" ); + } + } } -respawn_spectators_and_freeze_players() +respawn_spectators_and_freeze_players() //checked changed to match cerberus output { - players = get_players(); - - foreach ( player in players ) - { - if ( player.sessionstate == "spectator" ) - { - if ( isdefined( player.spectate_hud ) ) - player.spectate_hud destroy(); - - player [[ level.spawnplayer ]](); - } - - player freeze_player_controls( 1 ); - } + players = get_players(); + foreach ( player in players ) + { + if ( player.sessionstate == "spectator" ) + { + if ( isDefined( player.spectate_hud ) ) + { + player.spectate_hud destroy(); + } + player [[ level.spawnplayer ]](); + } + player freeze_player_controls( 1 ); + } } -damage_callback_no_pvp_damage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) +damage_callback_no_pvp_damage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) //checked matches cerberus output { - if ( isdefined( eattacker ) && isplayer( eattacker ) && eattacker == self ) - return idamage; - - if ( isdefined( eattacker ) && !isplayer( eattacker ) ) - return idamage; - - if ( !isdefined( eattacker ) ) - return idamage; - - return 0; + if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker == self ) + { + return idamage; + } + if ( isDefined( eattacker ) && !isplayer( eattacker ) ) + { + return idamage; + } + if ( !isDefined( eattacker ) ) + { + return idamage; + } + return 0; } -respawn_players() +respawn_players() //checked changed to match cerberus output { - players = get_players(); - - foreach ( player in players ) - { - player [[ level.spawnplayer ]](); - player freeze_player_controls( 1 ); - } + players = get_players(); + foreach ( player in players ) + { + player [[ level.spawnplayer ]](); + player freeze_player_controls( 1 ); + } } -zombie_goto_round( target_round ) +zombie_goto_round( target_round ) //checked changed to match cerberus output { - level notify( "restart_round" ); - - if ( target_round < 1 ) - target_round = 1; - - level.zombie_total = 0; - maps\mp\zombies\_zm::ai_calculate_health( target_round ); - zombies = get_round_enemy_array(); - - if ( isdefined( zombies ) ) - { - for ( i = 0; i < zombies.size; i++ ) - zombies[i] dodamage( zombies[i].health + 666, zombies[i].origin ); - } - - respawn_players(); - wait 1; + level notify( "restart_round" ); + if ( target_round < 1 ) + { + target_round = 1; + } + level.zombie_total = 0; + maps/mp/zombies/_zm::ai_calculate_health( target_round ); + zombies = get_round_enemy_array(); + if ( isDefined( zombies ) ) + { + for ( i = 0; i < zombies.size; i++ ) + { + zombies[ i ] dodamage( zombies[ i ].health + 666, zombies[ i ].origin ); + } + } + respawn_players(); + wait 1; } -wait_for_team_death_and_round_end() +wait_for_team_death_and_round_end() //checked partially changed to match cerberus output //did not use foreach with continue to prevent continue bug { - level endon( "game_module_ended" ); - level endon( "end_game" ); - checking_for_round_end = 0; - level.isresetting_grief = 0; - - while ( true ) - { - cdc_alive = 0; - cia_alive = 0; - players = get_players(); - - foreach ( player in players ) - { - if ( !isdefined( player._encounters_team ) ) - continue; - - if ( player._encounters_team == "A" ) - { - if ( is_player_valid( player ) ) - cia_alive++; - - continue; - } - - if ( is_player_valid( player ) ) - cdc_alive++; - } - - if ( cia_alive == 0 && cdc_alive == 0 && !level.isresetting_grief && !( isdefined( level.host_ended_game ) && level.host_ended_game ) ) - { - wait 0.5; - - if ( isdefined( level._grief_reset_message ) ) - level thread [[ level._grief_reset_message ]](); - - level.isresetting_grief = 1; - level notify( "end_round_think" ); - level.zombie_vars["spectators_respawn"] = 1; - level notify( "keep_griefing" ); - checking_for_round_end = 0; - zombie_goto_round( level.round_number ); - level thread reset_grief(); - level thread maps\mp\zombies\_zm::round_think( 1 ); - } - else if ( !checking_for_round_end ) - { - if ( cia_alive == 0 ) - { - level thread check_for_round_end( "B" ); - checking_for_round_end = 1; - } - else if ( cdc_alive == 0 ) - { - level thread check_for_round_end( "A" ); - checking_for_round_end = 1; - } - } - - if ( cia_alive > 0 && cdc_alive > 0 ) - { - level notify( "stop_round_end_check" ); - checking_for_round_end = 0; - } - - wait 0.05; - } + level endon( "game_module_ended" ); + level endon( "end_game" ); + checking_for_round_end = 0; + level.isresetting_grief = 0; + while ( 1 ) + { + cdc_alive = 0; + cia_alive = 0; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( !isDefined( players[ i ]._encounters_team ) ) + { + i++; + continue; + } + if ( players[ i ]._encounters_team == "A" ) + { + if ( is_player_valid( players[ i ] ) ) + { + cia_alive++; + } + i++; + continue; + } + if ( is_player_valid( players[ i ] ) ) + { + cdc_alive++; + } + i++; + } + if ( cia_alive == 0 && cdc_alive == 0 && !level.isresetting_grief && !is_true( level.host_ended_game ) ) + { + wait 0.5; + if ( isDefined( level._grief_reset_message ) ) + { + level thread [[ level._grief_reset_message ]](); + } + level.isresetting_grief = 1; + level notify( "end_round_think" ); + level.zombie_vars[ "spectators_respawn" ] = 1; + level notify( "keep_griefing" ); + checking_for_round_end = 0; + zombie_goto_round( level.round_number ); + level thread reset_grief(); + level thread maps/mp/zombies/_zm::round_think( 1 ); + } + else if ( !checking_for_round_end ) + { + if ( cia_alive == 0 ) + { + level thread check_for_round_end( "B" ); + checking_for_round_end = 1; + } + else if ( cdc_alive == 0 ) + { + level thread check_for_round_end( "A" ); + checking_for_round_end = 1; + } + } + if ( cia_alive > 0 && cdc_alive > 0 ) + { + level notify( "stop_round_end_check" ); + checking_for_round_end = 0; + } + wait 0.05; + } } -reset_grief() +reset_grief() //checked matches cerberus output { - wait 1; - level.isresetting_grief = 0; + wait 1; + level.isresetting_grief = 0; } -check_for_round_end( winner ) +check_for_round_end( winner ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent the infinite loop continue bug { - level endon( "keep_griefing" ); - level endon( "stop_round_end_check" ); - - level waittill( "end_of_round" ); - - level.gamemodulewinningteam = winner; - level.zombie_vars["spectators_respawn"] = 0; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - players[i] freezecontrols( 1 ); - - if ( players[i]._encounters_team == winner ) - { - players[i] thread maps\mp\zombies\_zm_audio_announcer::leaderdialogonplayer( "grief_won" ); - continue; - } - - players[i] thread maps\mp\zombies\_zm_audio_announcer::leaderdialogonplayer( "grief_lost" ); - } - - level notify( "game_module_ended", winner ); - level._game_module_game_end_check = undefined; - maps\mp\gametypes_zm\_zm_gametype::track_encounters_win_stats( level.gamemodulewinningteam ); - level notify( "end_game" ); + level endon( "keep_griefing" ); + level endon( "stop_round_end_check" ); + level waittill( "end_of_round" ); + level.gamemodulewinningteam = winner; + level.zombie_vars[ "spectators_respawn" ] = 0; + players = get_players(); + i = 0; + while ( i < players.size ) + { + players[ i ] freezecontrols( 1 ); + if ( players[ i ]._encounters_team == winner ) + { + players[ i ] thread maps/mp/zombies/_zm_audio_announcer::leaderdialogonplayer( "grief_won" ); + i++; + continue; + } + players[ i ] thread maps/mp/zombies/_zm_audio_announcer::leaderdialogonplayer( "grief_lost" ); + i++; + } + level notify( "game_module_ended", winner ); + level._game_module_game_end_check = undefined; + maps/mp/gametypes_zm/_zm_gametype::track_encounters_win_stats( level.gamemodulewinningteam ); + level notify( "end_game" ); } -wait_for_team_death() +wait_for_team_death() //checked partially changed to match cerberus output //did not change while loop to foreach with continue to prevent infinite loop bug { - wait 15; - winner = undefined; - - while ( !isdefined( winner ) ) - { - cdc_alive = 0; - cia_alive = 0; - players = get_players(); - - foreach ( player in players ) - { - if ( player._encounters_team == "A" ) - { - if ( is_player_valid( player ) || isdefined( level.force_solo_quick_revive ) && level.force_solo_quick_revive && isdefined( player.lives ) && player.lives > 0 ) - cia_alive++; - - continue; - } - - if ( is_player_valid( player ) || isdefined( level.force_solo_quick_revive ) && level.force_solo_quick_revive && isdefined( player.lives ) && player.lives > 0 ) - cdc_alive++; - } - - if ( cia_alive == 0 ) - winner = "B"; - else if ( cdc_alive == 0 ) - winner = "A"; - - wait 0.05; - } - - level notify( "game_module_ended", winner ); + wait 15; + winner = undefined; + while ( !isDefined( winner ) ) + { + cdc_alive = 0; + cia_alive = 0; + players = get_players(); + while ( i < players.size ) + { + if ( players[ i ]._encounters_team == "A" ) + { + if ( is_player_valid( players[ i ] ) || is_true( level.force_solo_quick_revive ) && isDefined( players[ i ].lives ) && players[ i ].lives > 0 ) + { + cia_alive++; + i++; + continue; + } + } + if ( is_player_valid( players[ i ] ) || is_true( level.force_solo_quick_revive ) && isDefined( players[ i ].lives ) && players[ i ].lives > 0 ) + { + cdc_alive++; + } + i++; + } + if ( cia_alive == 0 ) + { + winner = "B"; + } + else if ( cdc_alive == 0 ) + { + winner = "A"; + } + wait 0.05; + } + level notify( "game_module_ended", winner ); } -make_supersprinter() +make_supersprinter() //checked matches cerberus output { - self set_zombie_run_cycle( "super_sprint" ); + self set_zombie_run_cycle( "super_sprint" ); } -game_module_custom_intermission( intermission_struct ) +game_module_custom_intermission( intermission_struct ) //checked matches cerberus output { - self closemenu(); - self closeingamemenu(); - level endon( "stop_intermission" ); - self endon( "disconnect" ); - self endon( "death" ); - self notify( "_zombie_game_over" ); - self.score = self.score_total; - self.sessionstate = "intermission"; - self.spectatorclient = -1; - self.killcamentity = -1; - self.archivetime = 0; - self.psoffsettime = 0; - self.friendlydamage = undefined; - s_point = getstruct( intermission_struct, "targetname" ); - - if ( !isdefined( level.intermission_cam_model ) ) - { - level.intermission_cam_model = spawn( "script_model", s_point.origin ); - level.intermission_cam_model.angles = s_point.angles; - level.intermission_cam_model setmodel( "tag_origin" ); - } - - self.game_over_bg = newclienthudelem( self ); - self.game_over_bg.horzalign = "fullscreen"; - self.game_over_bg.vertalign = "fullscreen"; - self.game_over_bg setshader( "black", 640, 480 ); - self.game_over_bg.alpha = 1; - self spawn( level.intermission_cam_model.origin, level.intermission_cam_model.angles ); - self camerasetposition( level.intermission_cam_model ); - self camerasetlookat(); - self cameraactivate( 1 ); - self linkto( level.intermission_cam_model ); - level.intermission_cam_model moveto( getstruct( s_point.target, "targetname" ).origin, 12 ); - - if ( isdefined( level.intermission_cam_model.angles ) ) - level.intermission_cam_model rotateto( getstruct( s_point.target, "targetname" ).angles, 12 ); - - self.game_over_bg fadeovertime( 2 ); - self.game_over_bg.alpha = 0; - wait 2; - self.game_over_bg thread maps\mp\zombies\_zm::fade_up_over_time( 1 ); + self closemenu(); + self closeingamemenu(); + level endon( "stop_intermission" ); + self endon( "disconnect" ); + self endon( "death" ); + self notify( "_zombie_game_over" ); + self.score = self.score_total; + self.sessionstate = "intermission"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + s_point = getstruct( intermission_struct, "targetname" ); + if ( !isDefined( level.intermission_cam_model ) ) + { + level.intermission_cam_model = spawn( "script_model", s_point.origin ); + level.intermission_cam_model.angles = s_point.angles; + level.intermission_cam_model setmodel( "tag_origin" ); + } + self.game_over_bg = newclienthudelem( self ); + self.game_over_bg.horzalign = "fullscreen"; + self.game_over_bg.vertalign = "fullscreen"; + self.game_over_bg setshader( "black", 640, 480 ); + self.game_over_bg.alpha = 1; + self spawn( level.intermission_cam_model.origin, level.intermission_cam_model.angles ); + self camerasetposition( level.intermission_cam_model ); + self camerasetlookat(); + self cameraactivate( 1 ); + self linkto( level.intermission_cam_model ); + level.intermission_cam_model moveto( getstruct( s_point.target, "targetname" ).origin, 12 ); + if ( isDefined( level.intermission_cam_model.angles ) ) + { + level.intermission_cam_model rotateto( getstruct( s_point.target, "targetname" ).angles, 12 ); + } + self.game_over_bg fadeovertime( 2 ); + self.game_over_bg.alpha = 0; + wait 2; + self.game_over_bg thread maps/mp/zombies/_zm::fade_up_over_time( 1 ); } -create_fireworks( launch_spots, min_wait, max_wait, randomize ) +create_fireworks( launch_spots, min_wait, max_wait, randomize ) //checked changed to match cerberus output { - level endon( "stop_fireworks" ); - - while ( true ) - { - if ( isdefined( randomize ) && randomize ) - launch_spots = array_randomize( launch_spots ); - - foreach ( spot in launch_spots ) - { - level thread fireworks_launch( spot ); - wait( randomfloatrange( min_wait, max_wait ) ); - } - - wait( randomfloatrange( min_wait, max_wait ) ); - } + level endon( "stop_fireworks" ); + while ( 1 ) + { + if ( is_true( randomize ) ) + { + launch_spots = array_randomize( launch_spots ); + } + foreach ( spot in launch_spots ) + { + level thread fireworks_launch( spot ); + wait randomfloatrange( min_wait, max_wait ); + } + wait randomfloatrange( min_wait, max_wait ); + } } -fireworks_launch( launch_spot ) +fireworks_launch( launch_spot ) //checked matches cerberus output { - firework = spawn( "script_model", launch_spot.origin + ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ) ); - firework setmodel( "tag_origin" ); - wait_network_frame(); - playfxontag( level._effect["fw_trail_cheap"], firework, "tag_origin" ); - firework playloopsound( "zmb_souls_loop", 0.75 ); - dest = launch_spot; - - while ( isdefined( dest ) && isdefined( dest.target ) ) - { - random_offset = ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ); - new_dests = getstructarray( dest.target, "targetname" ); - new_dest = random( new_dests ); - dest = new_dest; - dist = distance( new_dest.origin + random_offset, firework.origin ); - time = dist / 700; - firework moveto( new_dest.origin + random_offset, time ); - - firework waittill( "movedone" ); - } - - firework playsound( "zmb_souls_end" ); - playfx( level._effect["fw_pre_burst"], firework.origin ); - firework delete(); + firework = spawn( "script_model", launch_spot.origin + ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ) ); + firework setmodel( "tag_origin" ); + wait_network_frame(); + playfxontag( level._effect[ "fw_trail_cheap" ], firework, "tag_origin" ); + firework playloopsound( "zmb_souls_loop", 0.75 ); + dest = launch_spot; + while ( isDefined( dest ) && isDefined( dest.target ) ) + { + random_offset = ( randomintrange( -60, 60 ), randomintrange( -60, 60 ), 0 ); + new_dests = getstructarray( dest.target, "targetname" ); + new_dest = random( new_dests ); + dest = new_dest; + dist = distance( new_dest.origin + random_offset, firework.origin ); + time = dist / 700; + firework moveto( new_dest.origin + random_offset, time ); + firework waittill( "movedone" ); + } + firework playsound( "zmb_souls_end" ); + playfx( level._effect[ "fw_pre_burst" ], firework.origin ); + firework delete(); } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_gump.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_gump.gsc index ee0a6a1..fd96161 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_gump.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_gump.gsc @@ -1,76 +1,89 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() -{ - if ( !( isdefined( level.disable_blackscreen_clientfield ) && level.disable_blackscreen_clientfield ) ) - registerclientfield( "toplayer", "blackscreen", 1, 1, "int" ); - - if ( !isdefined( level.uses_gumps ) ) - level.uses_gumps = 0; - - if ( isdefined( level.uses_gumps ) && level.uses_gumps ) - onplayerconnect_callback( ::player_connect_gump ); +init() //checked changed to match cerberus output //changed partially at own discretion +{ +/* + if ( isDefined( level.disable_blackscreen_clientfield ) && level.disable_blackscreen_clientfield ) + { + registerclientfield( "toplayer", "blackscreen", 1, 1, "int" ); + } +*/ //the value of level.disable_blackscreen_clientfield is not defined in any map file except buried meaning + if ( !is_true( level.disable_blackscreen_clientfield ) ) + { + registerclientfield( "toplayer", "blackscreen", 1, 1, "int" ); + } + if ( !isDefined( level.uses_gumps ) ) + { + level.uses_gumps = 0; + } + if ( is_true( level.uses_gumps ) ) + { + onplayerconnect_callback( ::player_connect_gump ); + } } -player_teleport_blackscreen_on() +player_teleport_blackscreen_on() //checked matches cerberus output { - if ( isdefined( level.disable_blackscreen_clientfield ) && level.disable_blackscreen_clientfield ) - return; - - if ( isdefined( level.uses_gumps ) && level.uses_gumps ) - { - self setclientfieldtoplayer( "blackscreen", 1 ); - wait 0.05; - self setclientfieldtoplayer( "blackscreen", 0 ); - } + if ( is_true( level.disable_blackscreen_clientfield ) ) + { + return; + } + if ( is_true( level.uses_gumps ) ) + { + self setclientfieldtoplayer( "blackscreen", 1 ); + wait 0.05; + self setclientfieldtoplayer( "blackscreen", 0 ); + } } -player_connect_gump() +player_connect_gump() //checked matches cerberus output { - } -player_watch_spectate_change() +player_watch_spectate_change() //checked matches cerberus output { - if ( isdefined( level.disable_blackscreen_clientfield ) && level.disable_blackscreen_clientfield ) - return; - - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "spectator_cycle" ); - - self setclientfieldtoplayer( "blackscreen", 1 ); - wait 0.05; - self setclientfieldtoplayer( "blackscreen", 0 ); - } + if ( is_true( level.disable_blackscreen_clientfield ) ) + { + return; + } + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "spectator_cycle" ); + self setclientfieldtoplayer( "blackscreen", 1 ); + wait 0.05; + self setclientfieldtoplayer( "blackscreen", 0 ); + } } gump_test() { +/* /# - wait 10; - pos1 = ( -4904, -7657, 4 ); - pos3 = ( 7918, -6506, 177 ); - pos2 = ( 1986, -73, 4 ); - players = get_players(); - - if ( isdefined( players[0] ) ) - players[0] setorigin( pos1 ); - - wait 0.05; - - if ( isdefined( players[1] ) ) - players[1] setorigin( pos2 ); - - wait 0.05; - - if ( isdefined( players[2] ) ) - players[2] setorigin( pos3 ); + wait 10; + pos1 = ( -4904, -7657, 4 ); + pos3 = ( 7918, -6506, 177 ); + pos2 = ( 1986, -73, 4 ); + players = get_players(); + if ( isDefined( players[ 0 ] ) ) + { + players[ 0 ] setorigin( pos1 ); + } + wait 0.05; + if ( isDefined( players[ 1 ] ) ) + { + players[ 1 ] setorigin( pos2 ); + } + wait 0.05; + if ( isDefined( players[ 2 ] ) ) + { + players[ 2 ] setorigin( pos3 ); #/ + } +*/ } + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_boards.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_boards.gsc index 2d7654d..88fd512 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_boards.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_boards.gsc @@ -1,126 +1,131 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_equip_hacker; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_blockers; +#include maps/mp/zombies/_zm_blockers; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_equip_hacker; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; hack_boards() { - windows = getstructarray( "exterior_goal", "targetname" ); - - for ( i = 0; i < windows.size; i++ ) - { - window = windows[i]; - struct = spawnstruct(); - spot = window; - - if ( isdefined( window.trigger_location ) ) - spot = window.trigger_location; - - org = groundpos( spot.origin ) + vectorscale( ( 0, 0, 1 ), 4.0 ); - r = 96; - h = 96; - - if ( isdefined( spot.radius ) ) - r = spot.radius; - - if ( isdefined( spot.height ) ) - h = spot.height; - - struct.origin = org + vectorscale( ( 0, 0, 1 ), 48.0 ); - struct.radius = r; - struct.height = h; - struct.script_float = 2; - struct.script_int = 0; - struct.window = window; - struct.no_bullet_trace = 1; - struct.no_sight_check = 1; - struct.dot_limit = 0.7; - struct.no_touch_check = 1; - struct.last_hacked_round = 0; - struct.num_hacks = 0; - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( struct, ::board_hack, ::board_qualifier ); - } + windows = getstructarray( "exterior_goal", "targetname" ); + i = 0; + while ( i < windows.size ) + { + window = windows[ i ]; + struct = spawnstruct(); + spot = window; + if ( isDefined( window.trigger_location ) ) + { + spot = window.trigger_location; + } + org = groundpos( spot.origin ) + vectorScale( ( 0, 0, 1 ), 4 ); + r = 96; + h = 96; + if ( isDefined( spot.radius ) ) + { + r = spot.radius; + } + if ( isDefined( spot.height ) ) + { + h = spot.height; + } + struct.origin = org + vectorScale( ( 0, 0, 1 ), 48 ); + struct.radius = r; + struct.height = h; + struct.script_float = 2; + struct.script_int = 0; + struct.window = window; + struct.no_bullet_trace = 1; + struct.no_sight_check = 1; + struct.dot_limit = 0.7; + struct.no_touch_check = 1; + struct.last_hacked_round = 0; + struct.num_hacks = 0; + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( struct, ::board_hack, ::board_qualifier ); + i++; + } } board_hack( hacker ) { - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( self ); - num_chunks_checked = 0; - last_repaired_chunk = undefined; - - if ( self.last_hacked_round != level.round_number ) - { - self.last_hacked_round = level.round_number; - self.num_hacks = 0; - } - - self.num_hacks++; - - if ( self.num_hacks < 3 ) - hacker maps\mp\zombies\_zm_score::add_to_player_score( 100 ); - else - { - cost = int( min( 300, hacker.score ) ); - - if ( cost ) - hacker maps\mp\zombies\_zm_score::minus_to_player_score( cost ); - } - - while ( true ) - { - if ( all_chunks_intact( self.window, self.window.barrier_chunks ) ) - break; - - chunk = get_random_destroyed_chunk( self.window, self.window.barrier_chunks ); - - if ( !isdefined( chunk ) ) - break; - - self.window thread maps\mp\zombies\_zm_blockers::replace_chunk( self.window, chunk, undefined, 0, 1 ); - last_repaired_chunk = chunk; - - if ( isdefined( self.clip ) ) - { - self.window.clip enable_trigger(); - self.window.clip disconnectpaths(); - } - else - blocker_disconnect_paths( self.window.neg_start, self.window.neg_end ); - - wait_network_frame(); - num_chunks_checked++; - - if ( num_chunks_checked >= 20 ) - break; - } - - if ( isdefined( self.window.zbarrier ) ) - { - if ( isdefined( last_repaired_chunk ) ) - { - while ( self.window.zbarrier getzbarrierpiecestate( last_repaired_chunk ) == "closing" ) - wait 0.05; - } - } - else - { - while ( isdefined( last_repaired_chunk ) && last_repaired_chunk.state == "mid_repair" ) - wait 0.05; - } - - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( self, ::board_hack, ::board_qualifier ); - self.window notify( "blocker_hacked" ); - self.window notify( "no valid boards" ); + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( self ); + num_chunks_checked = 0; + last_repaired_chunk = undefined; + if ( self.last_hacked_round != level.round_number ) + { + self.last_hacked_round = level.round_number; + self.num_hacks = 0; + } + self.num_hacks++; + if ( self.num_hacks < 3 ) + { + hacker maps/mp/zombies/_zm_score::add_to_player_score( 100 ); + } + else + { + cost = int( min( 300, hacker.score ) ); + if ( cost ) + { + hacker maps/mp/zombies/_zm_score::minus_to_player_score( cost ); + } + } + while ( 1 ) + { + if ( all_chunks_intact( self.window, self.window.barrier_chunks ) ) + { + break; + } + else chunk = get_random_destroyed_chunk( self.window, self.window.barrier_chunks ); + if ( !isDefined( chunk ) ) + { + break; + } + else self.window thread maps/mp/zombies/_zm_blockers::replace_chunk( self.window, chunk, undefined, 0, 1 ); + last_repaired_chunk = chunk; + if ( isDefined( self.clip ) ) + { + self.window.clip enable_trigger(); + self.window.clip disconnectpaths(); + } + else + { + blocker_disconnect_paths( self.window.neg_start, self.window.neg_end ); + } + wait_network_frame(); + num_chunks_checked++; + if ( num_chunks_checked >= 20 ) + { + break; + } + else + { + } + } + if ( isDefined( self.window.zbarrier ) ) + { + while ( isDefined( last_repaired_chunk ) ) + { + while ( self.window.zbarrier getzbarrierpiecestate( last_repaired_chunk ) == "closing" ) + { + wait 0.05; + } + } + } + else while ( isDefined( last_repaired_chunk ) && last_repaired_chunk.state == "mid_repair" ) + { + wait 0.05; + } + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( self, ::board_hack, ::board_qualifier ); + self.window notify( "blocker_hacked" ); + self.window notify( "no valid boards" ); } board_qualifier( player ) { - if ( all_chunks_intact( self.window, self.window.barrier_chunks ) || no_valid_repairable_boards( self.window, self.window.barrier_chunks ) ) - return false; - - return true; + if ( all_chunks_intact( self.window, self.window.barrier_chunks ) || no_valid_repairable_boards( self.window, self.window.barrier_chunks ) ) + { + return 0; + } + return 1; } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_box.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_box.gsc index e9e2fb3..235fe8b 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_box.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_box.gsc @@ -1,349 +1,371 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_magicbox; -#include maps\mp\zombies\_zm_equip_hacker; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_audio; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_equip_hacker; +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; box_hacks() { - boxes = getstructarray( "treasure_chest_use", "targetname" ); - - for ( i = 0; i < boxes.size; i++ ) - { - box = boxes[i]; - box.box_hacks["respin"] = ::init_box_respin; - box.box_hacks["respin_respin"] = ::init_box_respin_respin; - box.box_hacks["summon_box"] = ::init_summon_box; - box.last_hacked_round = 0; - } - - level._zombiemode_chest_joker_chance_override_func = ::check_for_free_locations; - level._zombiemode_custom_box_move_logic = ::custom_box_move_logic; - level._zombiemode_check_firesale_loc_valid_func = ::custom_check_firesale_loc_valid_func; - init_summon_hacks(); + boxes = getstructarray( "treasure_chest_use", "targetname" ); + i = 0; + while ( i < boxes.size ) + { + box = boxes[ i ]; + box.box_hacks[ "respin" ] = ::init_box_respin; + box.box_hacks[ "respin_respin" ] = ::init_box_respin_respin; + box.box_hacks[ "summon_box" ] = ::init_summon_box; + box.last_hacked_round = 0; + i++; + } + level._zombiemode_chest_joker_chance_override_func = ::check_for_free_locations; + level._zombiemode_custom_box_move_logic = ::custom_box_move_logic; + level._zombiemode_check_firesale_loc_valid_func = ::custom_check_firesale_loc_valid_func; + init_summon_hacks(); } custom_check_firesale_loc_valid_func() { - if ( isdefined( self.unitrigger_stub ) ) - box = self.unitrigger_stub.trigger_target; - else if ( isdefined( self.stub ) ) - box = self.stub.trigger_target; - - if ( box.last_hacked_round >= level.round_number ) - return false; - - return true; + if ( isDefined( self.unitrigger_stub ) ) + { + box = self.unitrigger_stub.trigger_target; + } + else + { + if ( isDefined( self.stub ) ) + { + box = self.stub.trigger_target; + } + } + if ( box.last_hacked_round >= level.round_number ) + { + return 0; + } + return 1; } custom_box_move_logic() { - num_hacked_locs = 0; - - for ( i = 0; i < level.chests.size; i++ ) - { - if ( level.chests[i].last_hacked_round >= level.round_number ) - num_hacked_locs++; - } - - if ( num_hacked_locs == 0 ) - { - maps\mp\zombies\_zm_magicbox::default_box_move_logic(); - return; - } - - found_loc = 0; - original_spot = level.chest_index; - - while ( !found_loc ) - { - level.chest_index++; - - if ( original_spot == level.chest_index ) - level.chest_index++; - - level.chest_index %= level.chests.size; - - if ( level.chests[level.chest_index].last_hacked_round < level.round_number ) - found_loc = 1; - } + num_hacked_locs = 0; + i = 0; + while ( i < level.chests.size ) + { + if ( level.chests[ i ].last_hacked_round >= level.round_number ) + { + num_hacked_locs++; + } + i++; + } + if ( num_hacked_locs == 0 ) + { + maps/mp/zombies/_zm_magicbox::default_box_move_logic(); + return; + } + found_loc = 0; + original_spot = level.chest_index; + while ( !found_loc ) + { + level.chest_index++; + if ( original_spot == level.chest_index ) + { + level.chest_index++; + } + level.chest_index %= level.chests.size; + if ( level.chests[ level.chest_index ].last_hacked_round < level.round_number ) + { + found_loc = 1; + } + } } check_for_free_locations( chance ) { - boxes = level.chests; - stored_chance = chance; - chance = -1; - - for ( i = 0; i < boxes.size; i++ ) - { - if ( i == level.chest_index ) - continue; - - if ( boxes[i].last_hacked_round < level.round_number ) - { - chance = stored_chance; - break; - } - } - - return chance; + boxes = level.chests; + stored_chance = chance; + chance = -1; + i = 0; + while ( i < boxes.size ) + { + if ( i == level.chest_index ) + { + i++; + continue; + } + else if ( boxes[ i ].last_hacked_round < level.round_number ) + { + chance = stored_chance; + break; + } + else + { + i++; + } + } + return chance; } init_box_respin( chest, player ) { - self thread box_respin_think( chest, player ); + self thread box_respin_think( chest, player ); } box_respin_think( chest, player ) { - respin_hack = spawnstruct(); - respin_hack.origin = self.origin + vectorscale( ( 0, 0, 1 ), 24.0 ); - respin_hack.radius = 48; - respin_hack.height = 72; - respin_hack.script_int = 600; - respin_hack.script_float = 1.5; - respin_hack.player = player; - respin_hack.no_bullet_trace = 1; - respin_hack.chest = chest; - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( respin_hack, ::respin_box, ::hack_box_qualifier ); - self.weapon_model waittill_either( "death", "kill_respin_think_thread" ); - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( respin_hack ); + respin_hack = spawnstruct(); + respin_hack.origin = self.origin + vectorScale( ( 0, 0, 1 ), 24 ); + respin_hack.radius = 48; + respin_hack.height = 72; + respin_hack.script_int = 600; + respin_hack.script_float = 1.5; + respin_hack.player = player; + respin_hack.no_bullet_trace = 1; + respin_hack.chest = chest; + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( respin_hack, ::respin_box, ::hack_box_qualifier ); + self.weapon_model waittill_either( "death", "kill_respin_think_thread" ); + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( respin_hack ); } respin_box_thread( hacker ) { - if ( isdefined( self.chest.zbarrier.weapon_model ) ) - self.chest.zbarrier.weapon_model notify( "kill_respin_think_thread" ); - - self.chest.no_fly_away = 1; - self.chest.zbarrier notify( "box_hacked_respin" ); - self.chest disable_trigger(); - play_sound_at_pos( "open_chest", self.chest.zbarrier.origin ); - play_sound_at_pos( "music_chest", self.chest.zbarrier.origin ); - maps\mp\zombies\_zm_weapons::unacquire_weapon_toggle( self.chest.zbarrier.weapon_string ); - self.chest.zbarrier thread maps\mp\zombies\_zm_magicbox::treasure_chest_weapon_spawn( self.chest, hacker, 1 ); - - self.chest.zbarrier waittill( "randomization_done" ); - - self.chest.no_fly_away = undefined; - - if ( !flag( "moving_chest_now" ) ) - { - self.chest enable_trigger(); - self.chest thread maps\mp\zombies\_zm_magicbox::treasure_chest_timeout(); - } + if ( isDefined( self.chest.zbarrier.weapon_model ) ) + { + self.chest.zbarrier.weapon_model notify( "kill_respin_think_thread" ); + } + self.chest.no_fly_away = 1; + self.chest.zbarrier notify( "box_hacked_respin" ); + self.chest disable_trigger(); + play_sound_at_pos( "open_chest", self.chest.zbarrier.origin ); + play_sound_at_pos( "music_chest", self.chest.zbarrier.origin ); + maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( self.chest.zbarrier.weapon_string ); + self.chest.zbarrier thread maps/mp/zombies/_zm_magicbox::treasure_chest_weapon_spawn( self.chest, hacker, 1 ); + self.chest.zbarrier waittill( "randomization_done" ); + self.chest.no_fly_away = undefined; + if ( !flag( "moving_chest_now" ) ) + { + self.chest enable_trigger(); + self.chest thread maps/mp/zombies/_zm_magicbox::treasure_chest_timeout(); + } } respin_box( hacker ) { - self thread respin_box_thread( hacker ); + self thread respin_box_thread( hacker ); } hack_box_qualifier( player ) { - if ( player == self.chest.chest_user && isdefined( self.chest.weapon_out ) ) - return true; - - return false; + if ( player == self.chest.chest_user && isDefined( self.chest.weapon_out ) ) + { + return 1; + } + return 0; } init_box_respin_respin( chest, player ) { - self thread box_respin_respin_think( chest, player ); + self thread box_respin_respin_think( chest, player ); } box_respin_respin_think( chest, player ) { - respin_hack = spawnstruct(); - respin_hack.origin = self.origin + vectorscale( ( 0, 0, 1 ), 24.0 ); - respin_hack.radius = 48; - respin_hack.height = 72; - respin_hack.script_int = -950; - respin_hack.script_float = 1.5; - respin_hack.player = player; - respin_hack.no_bullet_trace = 1; - respin_hack.chest = chest; - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( respin_hack, ::respin_respin_box, ::hack_box_qualifier ); - self.weapon_model waittill_either( "death", "kill_respin_respin_think_thread" ); - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( respin_hack ); + respin_hack = spawnstruct(); + respin_hack.origin = self.origin + vectorScale( ( 0, 0, 1 ), 24 ); + respin_hack.radius = 48; + respin_hack.height = 72; + respin_hack.script_int = -950; + respin_hack.script_float = 1.5; + respin_hack.player = player; + respin_hack.no_bullet_trace = 1; + respin_hack.chest = chest; + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( respin_hack, ::respin_respin_box, ::hack_box_qualifier ); + self.weapon_model waittill_either( "death", "kill_respin_respin_think_thread" ); + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( respin_hack ); } respin_respin_box( hacker ) { - org = self.chest.zbarrier.origin; - - if ( isdefined( self.chest.zbarrier.weapon_model ) ) - { - self.chest.zbarrier.weapon_model notify( "kill_respin_respin_think_thread" ); - self.chest.zbarrier.weapon_model notify( "kill_weapon_movement" ); - self.chest.zbarrier.weapon_model moveto( org + vectorscale( ( 0, 0, 1 ), 40.0 ), 0.5 ); - } - - if ( isdefined( self.chest.zbarrier.weapon_model_dw ) ) - { - self.chest.zbarrier.weapon_model_dw notify( "kill_weapon_movement" ); - self.chest.zbarrier.weapon_model_dw moveto( org + vectorscale( ( 0, 0, 1 ), 40.0 ) - vectorscale( ( 1, 1, 1 ), 3.0 ), 0.5 ); - } - - self.chest.zbarrier notify( "box_hacked_rerespin" ); - self.chest.box_rerespun = 1; - self thread fake_weapon_powerup_thread( self.chest.zbarrier.weapon_model, self.chest.zbarrier.weapon_model_dw ); + org = self.chest.zbarrier.origin; + if ( isDefined( self.chest.zbarrier.weapon_model ) ) + { + self.chest.zbarrier.weapon_model notify( "kill_respin_respin_think_thread" ); + self.chest.zbarrier.weapon_model notify( "kill_weapon_movement" ); + self.chest.zbarrier.weapon_model moveto( org + vectorScale( ( 0, 0, 1 ), 40 ), 0,5 ); + } + if ( isDefined( self.chest.zbarrier.weapon_model_dw ) ) + { + self.chest.zbarrier.weapon_model_dw notify( "kill_weapon_movement" ); + self.chest.zbarrier.weapon_model_dw moveto( ( org + vectorScale( ( 0, 0, 1 ), 40 ) ) - vectorScale( ( 0, 0, 1 ), 3 ), 0,5 ); + } + self.chest.zbarrier notify( "box_hacked_rerespin" ); + self.chest.box_rerespun = 1; + self thread fake_weapon_powerup_thread( self.chest.zbarrier.weapon_model, self.chest.zbarrier.weapon_model_dw ); } fake_weapon_powerup_thread( weapon1, weapon2 ) { - weapon1 endon( "death" ); - playfxontag( level._effect["powerup_on_solo"], weapon1, "tag_origin" ); - playsoundatposition( "zmb_spawn_powerup", weapon1.origin ); - weapon1 playloopsound( "zmb_spawn_powerup_loop" ); - self thread fake_weapon_powerup_timeout( weapon1, weapon2 ); - - while ( isdefined( weapon1 ) ) - { - waittime = randomfloatrange( 2.5, 5 ); - yaw = randomint( 360 ); - - if ( yaw > 300 ) - yaw = 300; - else if ( yaw < 60 ) - yaw = 60; - - yaw = weapon1.angles[1] + yaw; - weapon1 rotateto( ( -60 + randomint( 120 ), yaw, -45 + randomint( 90 ) ), waittime, waittime * 0.5, waittime * 0.5 ); - - if ( isdefined( weapon2 ) ) - weapon2 rotateto( ( -60 + randomint( 120 ), yaw, -45 + randomint( 90 ) ), waittime, waittime * 0.5, waittime * 0.5 ); - - wait( randomfloat( waittime - 0.1 ) ); - } + weapon1 endon( "death" ); + playfxontag( level._effect[ "powerup_on_solo" ], weapon1, "tag_origin" ); + playsoundatposition( "zmb_spawn_powerup", weapon1.origin ); + weapon1 playloopsound( "zmb_spawn_powerup_loop" ); + self thread fake_weapon_powerup_timeout( weapon1, weapon2 ); + while ( isDefined( weapon1 ) ) + { + waittime = randomfloatrange( 2.5, 5 ); + yaw = randomint( 360 ); + if ( yaw > 300 ) + { + yaw = 300; + } + else + { + if ( yaw < 60 ) + { + yaw = 60; + } + } + yaw = weapon1.angles[ 1 ] + yaw; + weapon1 rotateto( ( -60 + randomint( 120 ), yaw, -45 + randomint( 90 ) ), waittime, waittime * 0.5, waittime * 0.5 ); + if ( isDefined( weapon2 ) ) + { + weapon2 rotateto( ( -60 + randomint( 120 ), yaw, -45 + randomint( 90 ) ), waittime, waittime * 0.5, waittime * 0.5 ); + } + wait randomfloat( waittime - 0,1 ); + } } fake_weapon_powerup_timeout( weapon1, weapon2 ) { - weapon1 endon( "death" ); - wait 15; - - for ( i = 0; i < 40; i++ ) - { - if ( i % 2 ) - { - weapon1 hide(); - - if ( isdefined( weapon2 ) ) - weapon2 hide(); - } - else - { - weapon1 show(); - - if ( isdefined( weapon2 ) ) - weapon2 hide(); - } - - if ( i < 15 ) - { - wait 0.5; - continue; - } - - if ( i < 25 ) - { - wait 0.25; - continue; - } - - wait 0.1; - } - - self.chest notify( "trigger", level ); - - if ( isdefined( weapon1 ) ) - weapon1 delete(); - - if ( isdefined( weapon2 ) ) - weapon2 delete(); + weapon1 endon( "death" ); + wait 15; + i = 0; + while ( i < 40 ) + { + if ( i % 2 ) + { + weapon1 hide(); + if ( isDefined( weapon2 ) ) + { + weapon2 hide(); + } + } + else + { + weapon1 show(); + if ( isDefined( weapon2 ) ) + { + weapon2 hide(); + } + } + if ( i < 15 ) + { + wait 0.5; + i++; + continue; + } + else if ( i < 25 ) + { + wait 0.25; + i++; + continue; + } + else + { + wait 0.1; + } + i++; + } + self.chest notify( "trigger" ); + if ( isDefined( weapon1 ) ) + { + weapon1 delete(); + } + if ( isDefined( weapon2 ) ) + { + weapon2 delete(); + } } init_summon_hacks() { - chests = getstructarray( "treasure_chest_use", "targetname" ); - - for ( i = 0; i < chests.size; i++ ) - { - chest = chests[i]; - chest init_summon_box( chest.hidden ); - } + chests = getstructarray( "treasure_chest_use", "targetname" ); + i = 0; + while ( i < chests.size ) + { + chest = chests[ i ]; + chest init_summon_box( chest.hidden ); + i++; + } } init_summon_box( create ) { - if ( create ) - { - if ( isdefined( self._summon_hack_struct ) ) - { - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( self._summon_hack_struct ); - self._summon_hack_struct = undefined; - } - - struct = spawnstruct(); - struct.origin = self.chest_box.origin + vectorscale( ( 0, 0, 1 ), 24.0 ); - struct.radius = 48; - struct.height = 72; - struct.script_int = 1200; - struct.script_float = 5; - struct.no_bullet_trace = 1; - struct.chest = self; - self._summon_hack_struct = struct; - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( struct, ::summon_box, ::summon_box_qualifier ); - } - else if ( isdefined( self._summon_hack_struct ) ) - { - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( self._summon_hack_struct ); - self._summon_hack_struct = undefined; - } + if ( create ) + { + if ( isDefined( self._summon_hack_struct ) ) + { + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( self._summon_hack_struct ); + self._summon_hack_struct = undefined; + } + struct = spawnstruct(); + struct.origin = self.chest_box.origin + vectorScale( ( 0, 0, 1 ), 24 ); + struct.radius = 48; + struct.height = 72; + struct.script_int = 1200; + struct.script_float = 5; + struct.no_bullet_trace = 1; + struct.chest = self; + self._summon_hack_struct = struct; + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( struct, ::summon_box, ::summon_box_qualifier ); + } + else + { + if ( isDefined( self._summon_hack_struct ) ) + { + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( self._summon_hack_struct ); + self._summon_hack_struct = undefined; + } + } } summon_box_thread( hacker ) { - self.chest.last_hacked_round = level.round_number + randomintrange( 2, 5 ); - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( self ); - self.chest thread maps\mp\zombies\_zm_magicbox::show_chest(); - self.chest notify( "kill_chest_think" ); - self.chest.auto_open = 1; - self.chest.no_charge = 1; - self.chest.no_fly_away = 1; - self.chest.forced_user = hacker; - self.chest thread maps\mp\zombies\_zm_magicbox::treasure_chest_think(); - - self.chest.zbarrier waittill( "closed" ); - - self.chest.forced_user = undefined; - self.chest.auto_open = undefined; - self.chest.no_charge = undefined; - self.chest.no_fly_away = undefined; - self.chest thread maps\mp\zombies\_zm_magicbox::hide_chest(); + self.chest.last_hacked_round = level.round_number + randomintrange( 2, 5 ); + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( self ); + self.chest thread maps/mp/zombies/_zm_magicbox::show_chest(); + self.chest notify( "kill_chest_think" ); + self.chest.auto_open = 1; + self.chest.no_charge = 1; + self.chest.no_fly_away = 1; + self.chest.forced_user = hacker; + self.chest thread maps/mp/zombies/_zm_magicbox::treasure_chest_think(); + self.chest.zbarrier waittill( "closed" ); + self.chest.forced_user = undefined; + self.chest.auto_open = undefined; + self.chest.no_charge = undefined; + self.chest.no_fly_away = undefined; + self.chest thread maps/mp/zombies/_zm_magicbox::hide_chest(); } summon_box( hacker ) { - self thread summon_box_thread( hacker ); - - if ( isdefined( hacker ) ) - hacker thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "hack_box" ); + self thread summon_box_thread( hacker ); + if ( isDefined( hacker ) ) + { + hacker thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "hack_box" ); + } } summon_box_qualifier( player ) { - if ( self.chest.last_hacked_round > level.round_number ) - return false; - - if ( isdefined( self.chest.zbarrier.chest_moving ) && self.chest.zbarrier.chest_moving ) - return false; - - return true; + if ( self.chest.last_hacked_round > level.round_number ) + { + return 0; + } + if ( isDefined( self.chest.zbarrier.chest_moving ) && self.chest.zbarrier.chest_moving ) + { + return 0; + } + return 1; } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_doors.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_doors.gsc index bd4c4f9..1c632c5 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_doors.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_doors.gsc @@ -1,100 +1,108 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_blockers; -#include maps\mp\zombies\_zm_equip_hacker; +#include maps/mp/zombies/_zm_equip_hacker; +#include maps/mp/zombies/_zm_blockers; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; door_struct_debug() { - while ( true ) - { - wait 0.1; - origin = self.origin; - point = origin; - - for ( i = 1; i < 5; i++ ) - { - point = origin + anglestoforward( self.door.angles ) * ( i * 2 ); - passed = bullettracepassed( point, origin, 0, undefined ); - color = vectorscale( ( 0, 1, 0 ), 255.0 ); - - if ( !passed ) - color = vectorscale( ( 1, 0, 0 ), 255.0 ); + while ( 1 ) + { + wait 0.1; + origin = self.origin; + point = origin; + i = 1; + while ( i < 5 ) + { + point = origin + ( anglesToForward( self.door.angles ) * ( i * 2 ) ); + passed = bullettracepassed( point, origin, 0, undefined ); + color = vectorScale( ( 1, 0, 0 ), 255 ); + if ( !passed ) + { + color = vectorScale( ( 1, 0, 0 ), 255 ); + } /# - print3d( point, "+", color, 1, 1 ); + print3d( point, "+", color, 1, 1 ); #/ - } - } + i++; + } + } } hack_doors( targetname, door_activate_func ) { - if ( !isdefined( targetname ) ) - targetname = "zombie_door"; - - doors = getentarray( targetname, "targetname" ); - - if ( !isdefined( door_activate_func ) ) - door_activate_func = maps\mp\zombies\_zm_blockers::door_opened; - - for ( i = 0; i < doors.size; i++ ) - { - door = doors[i]; - struct = spawnstruct(); - struct.origin = door.origin + anglestoforward( door.angles ) * 2; - struct.radius = 48; - struct.height = 72; - struct.script_float = 32.7; - struct.script_int = 200; - struct.door = door; - struct.no_bullet_trace = 1; - struct.door_activate_func = door_activate_func; - trace_passed = 0; - door thread hide_door_buy_when_hacker_active( struct ); - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( struct, ::door_hack ); - door thread watch_door_for_open( struct ); - } + if ( !isDefined( targetname ) ) + { + targetname = "zombie_door"; + } + doors = getentarray( targetname, "targetname" ); + if ( !isDefined( door_activate_func ) ) + { + door_activate_func = ::maps/mp/zombies/_zm_blockers::door_opened; + } + i = 0; + while ( i < doors.size ) + { + door = doors[ i ]; + struct = spawnstruct(); + struct.origin = door.origin + ( anglesToForward( door.angles ) * 2 ); + struct.radius = 48; + struct.height = 72; + struct.script_float = 32.7; + struct.script_int = 200; + struct.door = door; + struct.no_bullet_trace = 1; + struct.door_activate_func = door_activate_func; + trace_passed = 0; + door thread hide_door_buy_when_hacker_active( struct ); + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( struct, ::door_hack ); + door thread watch_door_for_open( struct ); + i++; + } } hide_door_buy_when_hacker_active( door_struct ) { - self endon( "death" ); - self endon( "door_hacked" ); - self endon( "door_opened" ); - maps\mp\zombies\_zm_equip_hacker::hide_hint_when_hackers_active(); + self endon( "death" ); + self endon( "door_hacked" ); + self endon( "door_opened" ); + maps/mp/zombies/_zm_equip_hacker::hide_hint_when_hackers_active(); } watch_door_for_open( door_struct ) { - self waittill( "door_opened" ); - - self endon( "door_hacked" ); - remove_all_door_hackables_that_target_door( door_struct.door ); + self waittill( "door_opened" ); + self endon( "door_hacked" ); + remove_all_door_hackables_that_target_door( door_struct.door ); } door_hack( hacker ) { - self.door notify( "door_hacked" ); - self.door notify( "kill_door_think" ); - remove_all_door_hackables_that_target_door( self.door ); - self.door [[ self.door_activate_func ]](); - self.door._door_open = 1; + self.door notify( "door_hacked" ); + self.door notify( "kill_door_think" ); + remove_all_door_hackables_that_target_door( self.door ); + self.door [[ self.door_activate_func ]](); + self.door._door_open = 1; } remove_all_door_hackables_that_target_door( door ) { - candidates = []; - - for ( i = 0; i < level._hackable_objects.size; i++ ) - { - obj = level._hackable_objects[i]; - - if ( isdefined( obj.door ) && obj.door.target == door.target ) - candidates[candidates.size] = obj; - } - - for ( i = 0; i < candidates.size; i++ ) - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( candidates[i] ); + candidates = []; + i = 0; + while ( i < level._hackable_objects.size ) + { + obj = level._hackable_objects[ i ]; + if ( isDefined( obj.door ) && obj.door.target == door.target ) + { + candidates[ candidates.size ] = obj; + } + i++; + } + i = 0; + while ( i < candidates.size ) + { + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( candidates[ i ] ); + i++; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_packapunch.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_packapunch.gsc index bf17999..c9fba2a 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_packapunch.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_packapunch.gsc @@ -1,47 +1,46 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_equip_hacker; +#include maps/mp/zombies/_zm_equip_hacker; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; hack_packapunch() { - vending_weapon_upgrade_trigger = getentarray( "specialty_weapupgrade", "script_noteworthy" ); - perk = getent( vending_weapon_upgrade_trigger[0].target, "targetname" ); - - if ( isdefined( perk ) ) - { - struct = spawnstruct(); - struct.origin = perk.origin + anglestoright( perk.angles ) * 26 + vectorscale( ( 0, 0, 1 ), 48.0 ); - struct.radius = 48; - struct.height = 48; - struct.script_float = 5; - struct.script_int = -1000; - level._pack_hack_struct = struct; - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( level._pack_hack_struct, ::packapunch_hack ); - level._pack_hack_struct pack_trigger_think(); - } + vending_weapon_upgrade_trigger = getentarray( "specialty_weapupgrade", "script_noteworthy" ); + perk = getent( vending_weapon_upgrade_trigger[ 0 ].target, "targetname" ); + if ( isDefined( perk ) ) + { + struct = spawnstruct(); + struct.origin = perk.origin + ( anglesToRight( perk.angles ) * 26 ) + vectorScale( ( 0, 0, 1 ), 48 ); + struct.radius = 48; + struct.height = 48; + struct.script_float = 5; + struct.script_int = -1000; + level._pack_hack_struct = struct; + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( level._pack_hack_struct, ::packapunch_hack ); + level._pack_hack_struct pack_trigger_think(); + } } pack_trigger_think() { - if ( !flag_exists( "enter_nml" ) ) - return; - - while ( true ) - { - flag_wait( "enter_nml" ); - self.script_int = -1000; - - while ( flag( "enter_nml" ) ) - wait 1.0; - } + if ( !flag_exists( "enter_nml" ) ) + { + return; + } + while ( 1 ) + { + flag_wait( "enter_nml" ); + self.script_int = -1000; + while ( flag( "enter_nml" ) ) + { + wait 1; + } + } } packapunch_hack( hacker ) { - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( level._pack_hack_struct ); - level._pack_hack_struct.script_int = 0; - level notify( "packapunch_hacked" ); + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( level._pack_hack_struct ); + level._pack_hack_struct.script_int = 0; + level notify( "packapunch_hacked" ); } diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_perks.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_perks.gsc index 1591790..18cd74b 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_perks.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_perks.gsc @@ -1,80 +1,87 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_equip_hacker; +#include maps/mp/zombies/_zm_equip_hacker; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; hack_perks() { - vending_triggers = getentarray( "zombie_vending", "targetname" ); - - for ( i = 0; i < vending_triggers.size; i++ ) - { - struct = spawnstruct(); - - if ( isdefined( vending_triggers[i].machine ) ) - machine[0] = vending_triggers[i].machine; - else - machine = getentarray( vending_triggers[i].target, "targetname" ); - - struct.origin = machine[0].origin + anglestoright( machine[0].angles ) * 18 + vectorscale( ( 0, 0, 1 ), 48.0 ); - struct.radius = 48; - struct.height = 64; - struct.script_float = 5; - - while ( !isdefined( vending_triggers[i].cost ) ) - wait 0.05; - - struct.script_int = int( vending_triggers[i].cost * -1 ); - struct.perk = vending_triggers[i]; - - if ( isdefined( level._hack_perks_override ) ) - struct = struct [[ level._hack_perks_override ]](); - - vending_triggers[i].hackable = struct; - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( struct, ::perk_hack, ::perk_hack_qualifier ); - } - - level._solo_revive_machine_expire_func = ::solo_revive_expire_func; + vending_triggers = getentarray( "zombie_vending", "targetname" ); + i = 0; + while ( i < vending_triggers.size ) + { + struct = spawnstruct(); + if ( isDefined( vending_triggers[ i ].machine ) ) + { + machine[ 0 ] = vending_triggers[ i ].machine; + } + else + { + machine = getentarray( vending_triggers[ i ].target, "targetname" ); + } + struct.origin = machine[ 0 ].origin + ( anglesToRight( machine[ 0 ].angles ) * 18 ) + vectorScale( ( 0, 0, 1 ), 48 ); + struct.radius = 48; + struct.height = 64; + struct.script_float = 5; + while ( !isDefined( vending_triggers[ i ].cost ) ) + { + wait 0.05; + } + struct.script_int = int( vending_triggers[ i ].cost * -1 ); + struct.perk = vending_triggers[ i ]; + if ( isDefined( level._hack_perks_override ) ) + { + struct = struct [[ level._hack_perks_override ]](); + } + vending_triggers[ i ].hackable = struct; + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( struct, ::perk_hack, ::perk_hack_qualifier ); + i++; + } + level._solo_revive_machine_expire_func = ::solo_revive_expire_func; } solo_revive_expire_func() { - if ( isdefined( self.hackable ) ) - { - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( self.hackable ); - self.hackable = undefined; - } + if ( isDefined( self.hackable ) ) + { + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( self.hackable ); + self.hackable = undefined; + } } perk_hack_qualifier( player ) { - if ( isdefined( player._retain_perks ) ) - return false; - - if ( isdefined( self.perk ) && isdefined( self.perk.script_noteworthy ) ) - { - if ( player hasperk( self.perk.script_noteworthy ) ) - return true; - } - - return false; + if ( isDefined( player._retain_perks ) ) + { + return 0; + } + if ( isDefined( self.perk ) && isDefined( self.perk.script_noteworthy ) ) + { + if ( player hasperk( self.perk.script_noteworthy ) ) + { + return 1; + } + } + return 0; } perk_hack( hacker ) { - if ( flag( "solo_game" ) && self.perk.script_noteworthy == "specialty_quickrevive" ) - hacker.lives--; + if ( flag( "solo_game" ) && self.perk.script_noteworthy == "specialty_quickrevive" ) + { + hacker.lives--; - hacker notify( self.perk.script_noteworthy + "_stop" ); - hacker playsoundtoplayer( "evt_perk_throwup", hacker ); - - if ( isdefined( hacker.perk_hud ) ) - { - keys = getarraykeys( hacker.perk_hud ); - - for ( i = 0; i < hacker.perk_hud.size; i++ ) - hacker.perk_hud[keys[i]].x = i * 30; - } + } + hacker notify( self.perk.script_noteworthy + "_stop" ); + hacker playsoundtoplayer( "evt_perk_throwup", hacker ); + while ( isDefined( hacker.perk_hud ) ) + { + keys = getarraykeys( hacker.perk_hud ); + i = 0; + while ( i < hacker.perk_hud.size ) + { + hacker.perk_hud[ keys[ i ] ].x = i * 30; + i++; + } + } } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_powerups.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_powerups.gsc index a1aedc6..318339f 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_powerups.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_powerups.gsc @@ -1,82 +1,79 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_equip_hacker; -#include maps\mp\zombies\_zm_net; -#include maps\mp\zombies\_zm_powerups; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_equip_hacker; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; unhackable_powerup( name ) { - ret = 0; - - switch ( name ) - { - case "random_weapon": - case "lose_points_team": - case "bonus_points_team": - case "bonus_points_player": - ret = 1; - break; - } - - return ret; + ret = 0; + switch( name ) + { + case "bonus_points_player": + case "bonus_points_team": + case "lose_points_team": + case "random_weapon": + ret = 1; + break; + } + return ret; } hack_powerups() { - while ( true ) - { - level waittill( "powerup_dropped", powerup ); - - if ( !unhackable_powerup( powerup.powerup_name ) ) - { - struct = spawnstruct(); - struct.origin = powerup.origin; - struct.radius = 65; - struct.height = 72; - struct.script_float = 5; - struct.script_int = 5000; - struct.powerup = powerup; - powerup thread powerup_pickup_watcher( struct ); - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( struct, ::powerup_hack ); - } - } + while ( 1 ) + { + level waittill( "powerup_dropped", powerup ); + if ( !unhackable_powerup( powerup.powerup_name ) ) + { + struct = spawnstruct(); + struct.origin = powerup.origin; + struct.radius = 65; + struct.height = 72; + struct.script_float = 5; + struct.script_int = 5000; + struct.powerup = powerup; + powerup thread powerup_pickup_watcher( struct ); + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( struct, ::powerup_hack ); + } + } } powerup_pickup_watcher( powerup_struct ) { - self endon( "hacked" ); - - self waittill( "death" ); - - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( powerup_struct ); + self endon( "hacked" ); + self waittill( "death" ); + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( powerup_struct ); } powerup_hack( hacker ) { - self.powerup notify( "hacked" ); - - if ( isdefined( self.powerup.zombie_grabbable ) && self.powerup.zombie_grabbable ) - { - self.powerup notify( "powerup_timedout" ); - origin = self.powerup.origin; - self.powerup delete(); - self.powerup = maps\mp\zombies\_zm_net::network_safe_spawn( "powerup", 1, "script_model", origin ); - - if ( isdefined( self.powerup ) ) - { - self.powerup maps\mp\zombies\_zm_powerups::powerup_setup( "full_ammo" ); - self.powerup thread maps\mp\zombies\_zm_powerups::powerup_timeout(); - self.powerup thread maps\mp\zombies\_zm_powerups::powerup_wobble(); - self.powerup thread maps\mp\zombies\_zm_powerups::powerup_grab(); - } - } - else if ( self.powerup.powerup_name == "full_ammo" ) - self.powerup maps\mp\zombies\_zm_powerups::powerup_setup( "fire_sale" ); - else - self.powerup maps\mp\zombies\_zm_powerups::powerup_setup( "full_ammo" ); - - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( self ); + self.powerup notify( "hacked" ); + if ( isDefined( self.powerup.zombie_grabbable ) && self.powerup.zombie_grabbable ) + { + self.powerup notify( "powerup_timedout" ); + origin = self.powerup.origin; + self.powerup delete(); + self.powerup = maps/mp/zombies/_zm_net::network_safe_spawn( "powerup", 1, "script_model", origin ); + if ( isDefined( self.powerup ) ) + { + self.powerup maps/mp/zombies/_zm_powerups::powerup_setup( "full_ammo" ); + self.powerup thread maps/mp/zombies/_zm_powerups::powerup_timeout(); + self.powerup thread maps/mp/zombies/_zm_powerups::powerup_wobble(); + self.powerup thread maps/mp/zombies/_zm_powerups::powerup_grab(); + } + } + else + { + if ( self.powerup.powerup_name == "full_ammo" ) + { + self.powerup maps/mp/zombies/_zm_powerups::powerup_setup( "fire_sale" ); + } + else + { + self.powerup maps/mp/zombies/_zm_powerups::powerup_setup( "full_ammo" ); + } + } + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( self ); } diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_wallbuys.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_wallbuys.gsc index e82eadf..950a1a5 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_wallbuys.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_hackables_wallbuys.gsc @@ -1,46 +1,55 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_equip_hacker; +#include maps/mp/zombies/_zm_equip_hacker; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; hack_wallbuys() { - weapon_spawns = getstructarray( "weapon_upgrade", "targetname" ); - - for ( i = 0; i < weapon_spawns.size; i++ ) - { - if ( weapontype( weapon_spawns[i].zombie_weapon_upgrade ) == "grenade" ) - continue; - - if ( weapontype( weapon_spawns[i].zombie_weapon_upgrade ) == "melee" ) - continue; - - if ( weapontype( weapon_spawns[i].zombie_weapon_upgrade ) == "mine" ) - continue; - - if ( weapontype( weapon_spawns[i].zombie_weapon_upgrade ) == "bomb" ) - continue; - - struct = spawnstruct(); - struct.origin = weapon_spawns[i].origin; - struct.radius = 48; - struct.height = 48; - struct.script_float = 2; - struct.script_int = 3000; - struct.wallbuy = weapon_spawns[i]; - maps\mp\zombies\_zm_equip_hacker::register_pooled_hackable_struct( struct, ::wallbuy_hack ); - } - - bowie_triggers = getentarray( "bowie_upgrade", "targetname" ); - array_thread( bowie_triggers, maps\mp\zombies\_zm_equip_hacker::hide_hint_when_hackers_active ); + weapon_spawns = getstructarray( "weapon_upgrade", "targetname" ); + i = 0; + while ( i < weapon_spawns.size ) + { + if ( weapontype( weapon_spawns[ i ].zombie_weapon_upgrade ) == "grenade" ) + { + i++; + continue; + } + else if ( weapontype( weapon_spawns[ i ].zombie_weapon_upgrade ) == "melee" ) + { + i++; + continue; + } + else if ( weapontype( weapon_spawns[ i ].zombie_weapon_upgrade ) == "mine" ) + { + i++; + continue; + } + else if ( weapontype( weapon_spawns[ i ].zombie_weapon_upgrade ) == "bomb" ) + { + i++; + continue; + } + else + { + struct = spawnstruct(); + struct.origin = weapon_spawns[ i ].origin; + struct.radius = 48; + struct.height = 48; + struct.script_float = 2; + struct.script_int = 3000; + struct.wallbuy = weapon_spawns[ i ]; + maps/mp/zombies/_zm_equip_hacker::register_pooled_hackable_struct( struct, ::wallbuy_hack ); + } + i++; + } + bowie_triggers = getentarray( "bowie_upgrade", "targetname" ); + array_thread( bowie_triggers, ::maps/mp/zombies/_zm_equip_hacker::hide_hint_when_hackers_active ); } wallbuy_hack( hacker ) { - self.wallbuy.hacked = 1; - self.clientfieldname = self.wallbuy.zombie_weapon_upgrade + "_" + self.origin; - level setclientfield( self.clientfieldname, 2 ); - maps\mp\zombies\_zm_equip_hacker::deregister_hackable_struct( self ); + self.wallbuy.hacked = 1; + self.clientfieldname = ( self.wallbuy.zombie_weapon_upgrade + "_" ) + self.origin; + level setclientfield( self.clientfieldname, 2 ); + maps/mp/zombies/_zm_equip_hacker::deregister_hackable_struct( self ); } diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_jump_pad.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_jump_pad.gsc index 8dd9032..22c1830 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_jump_pad.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_jump_pad.gsc @@ -1,530 +1,557 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_audio; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; init() { - if ( is_true( level._uses_jump_pads ) ) - level jump_pad_init(); + if ( is_true( level._uses_jump_pads ) ) + { + level jump_pad_init(); + } } jump_pad_init() { - level._jump_pad_override = []; - jump_pad_triggers = getentarray( "trig_jump_pad", "targetname" ); - - if ( !isdefined( jump_pad_triggers ) ) - return; - - for ( i = 0; i < jump_pad_triggers.size; i++ ) - { - jump_pad_triggers[i].start = getstruct( jump_pad_triggers[i].target, "targetname" ); - jump_pad_triggers[i].destination = getstructarray( jump_pad_triggers[i].start.target, "targetname" ); - - if ( isdefined( jump_pad_triggers[i].script_string ) ) - jump_pad_triggers[i].overrides = strtok( jump_pad_triggers[i].script_string, "," ); - - jump_pad_triggers[i] thread jump_pad_think(); - } - - onplayerconnect_callback( ::jump_pad_player_variables ); + level._jump_pad_override = []; + jump_pad_triggers = getentarray( "trig_jump_pad", "targetname" ); + if ( !isDefined( jump_pad_triggers ) ) + { + return; + } + i = 0; + while ( i < jump_pad_triggers.size ) + { + jump_pad_triggers[ i ].start = getstruct( jump_pad_triggers[ i ].target, "targetname" ); + jump_pad_triggers[ i ].destination = getstructarray( jump_pad_triggers[ i ].start.target, "targetname" ); + if ( isDefined( jump_pad_triggers[ i ].script_string ) ) + { + jump_pad_triggers[ i ].overrides = strtok( jump_pad_triggers[ i ].script_string, "," ); + } + jump_pad_triggers[ i ] thread jump_pad_think(); + i++; + } + onplayerconnect_callback( ::jump_pad_player_variables ); } jump_pad_player_variables() { - self._padded = 0; - self.lander = 0; + self._padded = 0; + self.lander = 0; } jump_pad_think() { - self endon( "destroyed" ); - end_point = undefined; - start_point = undefined; - z_velocity = undefined; - z_dist = undefined; - fling_this_way = undefined; - jump_time = undefined; - world_gravity = getdvarint( "bg_gravity" ); - gravity_pulls = -13.3; - top_velocity_sq = 810000; - forward_scaling = 1.0; - - if ( isdefined( self.script_flag_wait ) ) - { - if ( !isdefined( level.flag[self.script_flag_wait] ) ) - flag_init( self.script_flag_wait ); - - flag_wait( self.script_flag_wait ); - } - - while ( isdefined( self ) ) - { - self waittill( "trigger", who ); - - if ( isplayer( who ) ) - self thread trigger_thread( who, ::jump_pad_start, ::jump_pad_cancel ); - } + self endon( "destroyed" ); + end_point = undefined; + start_point = undefined; + z_velocity = undefined; + z_dist = undefined; + fling_this_way = undefined; + jump_time = undefined; + world_gravity = getDvarInt( "bg_gravity" ); + gravity_pulls = -13,3; + top_velocity_sq = 810000; + forward_scaling = 1; + if ( isDefined( self.script_flag_wait ) ) + { + if ( !isDefined( level.flag[ self.script_flag_wait ] ) ) + { + flag_init( self.script_flag_wait ); + } + flag_wait( self.script_flag_wait ); + } + while ( isDefined( self ) ) + { + self waittill( "trigger", who ); + if ( isplayer( who ) ) + { + self thread trigger_thread( who, ::jump_pad_start, ::jump_pad_cancel ); + } + } } jump_pad_start( ent_player, endon_condition ) { - self endon( "endon_condition" ); - ent_player endon( "left_jump_pad" ); - ent_player endon( "death" ); - ent_player endon( "disconnect" ); - end_point = undefined; - start_point = undefined; - z_velocity = undefined; - z_dist = undefined; - fling_this_way = undefined; - jump_time = undefined; - world_gravity = getdvarint( "bg_gravity" ); - gravity_pulls = -13.3; - top_velocity_sq = 810000; - forward_scaling = 1.0; - start_point = self.start; - - if ( isdefined( self.name ) ) - { - self._action_overrides = strtok( self.name, "," ); - - if ( isdefined( self._action_overrides ) ) - { - for ( i = 0; i < self._action_overrides.size; i++ ) - ent_player jump_pad_player_overrides( self._action_overrides[i] ); - } - } - - if ( isdefined( self.script_wait ) ) - { - if ( self.script_wait < 1 ) - self playsound( "evt_jump_pad_charge_short" ); - else - self playsound( "evt_jump_pad_charge" ); - - wait( self.script_wait ); - } - else - { - self playsound( "evt_jump_pad_charge" ); - wait 1.0; - } - - if ( isdefined( self.script_parameters ) && isdefined( level._jump_pad_override[self.script_parameters] ) ) - end_point = self [[ level._jump_pad_override[self.script_parameters] ]]( ent_player ); - - if ( !isdefined( end_point ) ) - end_point = self.destination[randomint( self.destination.size )]; - - if ( isdefined( self.script_string ) && isdefined( level._jump_pad_override[self.script_string] ) ) - { - info_array = self [[ level._jump_pad_override[self.script_string] ]]( start_point, end_point ); - fling_this_way = info_array[0]; - jump_time = info_array[1]; - } - else - { - end_spot = end_point.origin; - - if ( !is_true( self.script_airspeed ) ) - { - rand_end = ( randomfloatrange( -1, 1 ), randomfloatrange( -1, 1 ), 0 ); - rand_scale = randomint( 100 ); - rand_spot = vectorscale( rand_end, rand_scale ); - end_spot = end_point.origin + rand_spot; - } - - pad_dist = distance( start_point.origin, end_spot ); - z_dist = end_spot[2] - start_point.origin[2]; - jump_velocity = end_spot - start_point.origin; - - if ( z_dist > 40 && z_dist < 135 ) - { - z_dist *= 2.5; - forward_scaling = 1.1; + self endon( "endon_condition" ); + ent_player endon( "left_jump_pad" ); + ent_player endon( "death" ); + ent_player endon( "disconnect" ); + end_point = undefined; + start_point = undefined; + z_velocity = undefined; + z_dist = undefined; + fling_this_way = undefined; + jump_time = undefined; + world_gravity = getDvarInt( "bg_gravity" ); + gravity_pulls = -13,3; + top_velocity_sq = 810000; + forward_scaling = 1; + start_point = self.start; + while ( isDefined( self.name ) ) + { + self._action_overrides = strtok( self.name, "," ); + while ( isDefined( self._action_overrides ) ) + { + i = 0; + while ( i < self._action_overrides.size ) + { + ent_player jump_pad_player_overrides( self._action_overrides[ i ] ); + i++; + } + } + } + if ( isDefined( self.script_wait ) ) + { + if ( self.script_wait < 1 ) + { + self playsound( "evt_jump_pad_charge_short" ); + } + else + { + self playsound( "evt_jump_pad_charge" ); + } + wait self.script_wait; + } + else + { + self playsound( "evt_jump_pad_charge" ); + wait 1; + } + if ( isDefined( self.script_parameters ) && isDefined( level._jump_pad_override[ self.script_parameters ] ) ) + { + end_point = self [[ level._jump_pad_override[ self.script_parameters ] ]]( ent_player ); + } + if ( !isDefined( end_point ) ) + { + end_point = self.destination[ randomint( self.destination.size ) ]; + } + if ( isDefined( self.script_string ) && isDefined( level._jump_pad_override[ self.script_string ] ) ) + { + info_array = self [[ level._jump_pad_override[ self.script_string ] ]]( start_point, end_point ); + fling_this_way = info_array[ 0 ]; + jump_time = info_array[ 1 ]; + } + else + { + end_spot = end_point.origin; + if ( !is_true( self.script_airspeed ) ) + { + rand_end = ( randomfloatrange( -1, 1 ), randomfloatrange( -1, 1 ), 0 ); + rand_scale = randomint( 100 ); + rand_spot = vectorScale( rand_end, rand_scale ); + end_spot = end_point.origin + rand_spot; + } + pad_dist = distance( start_point.origin, end_spot ); + z_dist = end_spot[ 2 ] - start_point.origin[ 2 ]; + jump_velocity = end_spot - start_point.origin; + if ( z_dist > 40 && z_dist < 135 ) + { + z_dist *= 2,5; + forward_scaling = 1,1; /# - if ( getdvarint( _hash_D5FD01C3 ) ) - { - if ( getdvar( _hash_E2494021 ) != "" ) - z_dist *= getdvarfloat( _hash_E2494021 ); - - if ( getdvar( _hash_4E3BC729 ) != "" ) - forward_scaling = getdvarfloat( _hash_4E3BC729 ); - } + if ( getDvarInt( #"D5FD01C3" ) ) + { + if ( getDvar( #"E2494021" ) != "" ) + { + z_dist *= getDvarFloat( #"E2494021" ); + } + if ( getDvar( #"4E3BC729" ) != "" ) + { + forward_scaling = getDvarFloat( #"4E3BC729" ); #/ - } - else if ( z_dist >= 135 ) - { - z_dist *= 2.7; - forward_scaling = 1.3; + } + } + } + else + { + if ( z_dist >= 135 ) + { + z_dist *= 2,7; + forward_scaling = 1,3; /# - if ( getdvarint( _hash_D5FD01C3 ) ) - { - if ( getdvar( _hash_E2494021 ) != "" ) - z_dist *= getdvarfloat( _hash_E2494021 ); - - if ( getdvar( _hash_4E3BC729 ) != "" ) - forward_scaling = getdvarfloat( _hash_4E3BC729 ); - } + if ( getDvarInt( #"D5FD01C3" ) ) + { + if ( getDvar( #"E2494021" ) != "" ) + { + z_dist *= getDvarFloat( #"E2494021" ); + } + if ( getDvar( #"4E3BC729" ) != "" ) + { + forward_scaling = getDvarFloat( #"4E3BC729" ); #/ - } - else if ( z_dist < 0 ) - { - z_dist *= 2.4; - forward_scaling = 1.0; + } + } + } + else + { + if ( z_dist < 0 ) + { + z_dist *= 2,4; + forward_scaling = 1; /# - if ( getdvarint( _hash_D5FD01C3 ) ) - { - if ( getdvar( _hash_E2494021 ) != "" ) - z_dist *= getdvarfloat( _hash_E2494021 ); - - if ( getdvar( _hash_4E3BC729 ) != "" ) - forward_scaling = getdvarfloat( _hash_4E3BC729 ); - } + if ( getDvarInt( #"D5FD01C3" ) ) + { + if ( getDvar( #"E2494021" ) != "" ) + { + z_dist *= getDvarFloat( #"E2494021" ); + } + if ( getDvar( #"4E3BC729" ) != "" ) + { + forward_scaling = getDvarFloat( #"4E3BC729" ); #/ - } - - z_velocity = 2 * z_dist * world_gravity; - - if ( z_velocity < 0 ) - z_velocity *= -1; - - if ( z_dist < 0 ) - z_dist *= -1; - - jump_time = sqrt( 2 * pad_dist / world_gravity ); - jump_time_2 = sqrt( 2 * z_dist / world_gravity ); - jump_time += jump_time_2; - - if ( jump_time < 0 ) - jump_time *= -1; - - x = jump_velocity[0] * forward_scaling / jump_time; - y = jump_velocity[1] * forward_scaling / jump_time; - z = z_velocity / jump_time; - fling_this_way = ( x, y, z ); - } - - if ( isdefined( end_point.target ) ) - poi_spot = getstruct( end_point.target, "targetname" ); - else - poi_spot = end_point; - - if ( !isdefined( self.script_index ) ) - ent_player.script_index = undefined; - else - ent_player.script_index = self.script_index; - - if ( isdefined( self.script_start ) && self.script_start == 1 ) - { - if ( !is_true( ent_player._padded ) ) - { - self playsound( "evt_jump_pad_launch" ); - playfx( level._effect["jump_pad_jump"], self.origin ); - ent_player thread jump_pad_move( fling_this_way, jump_time, poi_spot, self ); - - if ( isdefined( self.script_label ) ) - level notify( self.script_label ); - - return; - } - } - else if ( ent_player isonground() && !is_true( ent_player._padded ) ) - { - self playsound( "evt_jump_pad_launch" ); - playfx( level._effect["jump_pad_jump"], self.origin ); - ent_player thread jump_pad_move( fling_this_way, jump_time, poi_spot, self ); - - if ( isdefined( self.script_label ) ) - level notify( self.script_label ); - - return; - } - - wait 0.5; - - if ( ent_player istouching( self ) ) - self jump_pad_start( ent_player, endon_condition ); + } + } + } + } + } + z_velocity = 2 * z_dist * world_gravity; + if ( z_velocity < 0 ) + { + z_velocity *= -1; + } + if ( z_dist < 0 ) + { + z_dist *= -1; + } + jump_time = sqrt( ( 2 * pad_dist ) / world_gravity ); + jump_time_2 = sqrt( ( 2 * z_dist ) / world_gravity ); + jump_time += jump_time_2; + if ( jump_time < 0 ) + { + jump_time *= -1; + } + x = ( jump_velocity[ 0 ] * forward_scaling ) / jump_time; + y = ( jump_velocity[ 1 ] * forward_scaling ) / jump_time; + z = z_velocity / jump_time; + fling_this_way = ( x, y, z ); + } + if ( isDefined( end_point.target ) ) + { + poi_spot = getstruct( end_point.target, "targetname" ); + } + else + { + poi_spot = end_point; + } + if ( !isDefined( self.script_index ) ) + { + ent_player.script_index = undefined; + } + else + { + ent_player.script_index = self.script_index; + } + if ( isDefined( self.script_start ) && self.script_start == 1 ) + { + if ( !is_true( ent_player._padded ) ) + { + self playsound( "evt_jump_pad_launch" ); + playfx( level._effect[ "jump_pad_jump" ], self.origin ); + ent_player thread jump_pad_move( fling_this_way, jump_time, poi_spot, self ); + if ( isDefined( self.script_label ) ) + { + level notify( self.script_label ); + } + return; + } + } + else + { + if ( ent_player isonground() && !is_true( ent_player._padded ) ) + { + self playsound( "evt_jump_pad_launch" ); + playfx( level._effect[ "jump_pad_jump" ], self.origin ); + ent_player thread jump_pad_move( fling_this_way, jump_time, poi_spot, self ); + if ( isDefined( self.script_label ) ) + { + level notify( self.script_label ); + } + return; + } + } + wait 0,5; + if ( ent_player istouching( self ) ) + { + self jump_pad_start( ent_player, endon_condition ); + } } jump_pad_cancel( ent_player ) { - ent_player notify( "left_jump_pad" ); - - if ( isdefined( ent_player.poi_spot ) && !is_true( ent_player._padded ) ) - { - - } - - if ( isdefined( self.name ) ) - { - self._action_overrides = strtok( self.name, "," ); - - if ( isdefined( self._action_overrides ) ) - { - for ( i = 0; i < self._action_overrides.size; i++ ) - ent_player jump_pad_player_overrides( self._action_overrides[i] ); - } - } + ent_player notify( "left_jump_pad" ); + if ( isDefined( ent_player.poi_spot ) && !is_true( ent_player._padded ) ) + { + } + while ( isDefined( self.name ) ) + { + self._action_overrides = strtok( self.name, "," ); + while ( isDefined( self._action_overrides ) ) + { + i = 0; + while ( i < self._action_overrides.size ) + { + ent_player jump_pad_player_overrides( self._action_overrides[ i ] ); + i++; + } + } + } } jump_pad_move( vec_direction, flt_time, struct_poi, trigger ) { - self endon( "death" ); - self endon( "disconnect" ); - start_time = gettime(); - jump_time = flt_time * 500; - attract_dist = undefined; - num_attractors = 30; - added_poi_value = 0; - start_turned_on = 1; - poi_start_func = undefined; - - while ( is_true( self.divetoprone ) || is_true( self._padded ) ) - wait 0.05; - - self._padded = 1; - self.lander = 1; - self setstance( "stand" ); - wait 0.1; - - if ( isdefined( trigger.script_label ) ) - { - if ( issubstr( trigger.script_label, "low" ) ) - { - self.jump_pad_current = undefined; - self.jump_pad_previous = undefined; - } - else if ( !isdefined( self.jump_pad_current ) ) - self.jump_pad_current = trigger; - else - { - self.jump_pad_previous = self.jump_pad_current; - self.jump_pad_current = trigger; - } - } - - if ( isdefined( self.poi_spot ) ) - { - level jump_pad_ignore_poi_cleanup( self.poi_spot ); - self.poi_spot deactivate_zombie_point_of_interest(); - self.poi_spot delete(); - } - - if ( isdefined( struct_poi ) ) - { - self.poi_spot = spawn( "script_origin", struct_poi.origin ); - - if ( isdefined( level._pad_poi_ignore ) ) - level [[ level._pad_poi_ignore ]]( self.poi_spot ); - - self thread jump_pad_enemy_follow_or_ignore( self.poi_spot ); - - if ( isdefined( level._jump_pad_poi_start_override ) && !is_true( self.script_index ) ) - poi_start_func = level._jump_pad_poi_start_override; - - if ( isdefined( level._jump_pad_poi_end_override ) ) - poi_end_func = level._jump_pad_poi_end_override; - - self.poi_spot create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, poi_start_func ); - self thread disconnect_failsafe_pad_poi_clean(); - } - - self setorigin( self.origin + ( 0, 0, 1 ) ); - - if ( 20 >= randomintrange( 0, 101 ) ) - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "jumppad" ); - - while ( gettime() - start_time < jump_time ) - { - self setvelocity( vec_direction ); - wait 0.05; - } - - while ( !self isonground() ) - wait 0.05; - - self._padded = 0; - self.lander = 0; - jump_pad_triggers = getentarray( "trig_jump_pad", "targetname" ); - - for ( i = 0; i < jump_pad_triggers.size; i++ ) - { - if ( self istouching( jump_pad_triggers[i] ) ) - { - level thread failsafe_pad_poi_clean( jump_pad_triggers[i], self.poi_spot ); - return; - } - } - - if ( isdefined( self.poi_spot ) ) - { - level jump_pad_ignore_poi_cleanup( self.poi_spot ); - self.poi_spot delete(); - } + self endon( "death" ); + self endon( "disconnect" ); + start_time = getTime(); + jump_time = flt_time * 500; + attract_dist = undefined; + num_attractors = 30; + added_poi_value = 0; + start_turned_on = 1; + poi_start_func = undefined; + while ( is_true( self.divetoprone ) || is_true( self._padded ) ) + { + wait 0,05; + } + self._padded = 1; + self.lander = 1; + self setstance( "stand" ); + wait 0,1; + if ( isDefined( trigger.script_label ) ) + { + if ( issubstr( trigger.script_label, "low" ) ) + { + self.jump_pad_current = undefined; + self.jump_pad_previous = undefined; + } + else if ( !isDefined( self.jump_pad_current ) ) + { + self.jump_pad_current = trigger; + } + else + { + self.jump_pad_previous = self.jump_pad_current; + self.jump_pad_current = trigger; + } + } + if ( isDefined( self.poi_spot ) ) + { + level jump_pad_ignore_poi_cleanup( self.poi_spot ); + self.poi_spot deactivate_zombie_point_of_interest(); + self.poi_spot delete(); + } + if ( isDefined( struct_poi ) ) + { + self.poi_spot = spawn( "script_origin", struct_poi.origin ); + if ( isDefined( level._pad_poi_ignore ) ) + { + level [[ level._pad_poi_ignore ]]( self.poi_spot ); + } + self thread jump_pad_enemy_follow_or_ignore( self.poi_spot ); + if ( isDefined( level._jump_pad_poi_start_override ) && !is_true( self.script_index ) ) + { + poi_start_func = level._jump_pad_poi_start_override; + } + if ( isDefined( level._jump_pad_poi_end_override ) ) + { + poi_end_func = level._jump_pad_poi_end_override; + } + self.poi_spot create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, poi_start_func ); + self thread disconnect_failsafe_pad_poi_clean(); + } + self setorigin( self.origin + ( 0, 0, 1 ) ); + if ( randomintrange( 0, 101 ) < 20 ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "jumppad" ); + } + while ( ( getTime() - start_time ) < jump_time ) + { + self setvelocity( vec_direction ); + wait 0,05; + } + while ( !self isonground() ) + { + wait 0,05; + } + self._padded = 0; + self.lander = 0; + jump_pad_triggers = getentarray( "trig_jump_pad", "targetname" ); + i = 0; + while ( i < jump_pad_triggers.size ) + { + if ( self istouching( jump_pad_triggers[ i ] ) ) + { + level thread failsafe_pad_poi_clean( jump_pad_triggers[ i ], self.poi_spot ); + return; + } + i++; + } + if ( isDefined( self.poi_spot ) ) + { + level jump_pad_ignore_poi_cleanup( self.poi_spot ); + self.poi_spot delete(); + } } disconnect_failsafe_pad_poi_clean() { - self notify( "kill_disconnect_failsafe_pad_poi_clean" ); - self endon( "kill_disconnect_failsafe_pad_poi_clean" ); - self.poi_spot endon( "death" ); - - self waittill( "disconnect" ); - - if ( isdefined( self.poi_spot ) ) - { - level jump_pad_ignore_poi_cleanup( self.poi_spot ); - self.poi_spot deactivate_zombie_point_of_interest(); - self.poi_spot delete(); - } + self notify( "kill_disconnect_failsafe_pad_poi_clean" ); + self endon( "kill_disconnect_failsafe_pad_poi_clean" ); + self.poi_spot endon( "death" ); + self waittill( "disconnect" ); + if ( isDefined( self.poi_spot ) ) + { + level jump_pad_ignore_poi_cleanup( self.poi_spot ); + self.poi_spot deactivate_zombie_point_of_interest(); + self.poi_spot delete(); + } } failsafe_pad_poi_clean( ent_trig, ent_poi ) { - if ( isdefined( ent_trig.script_wait ) ) - wait( ent_trig.script_wait ); - else - wait 0.5; - - if ( isdefined( ent_poi ) ) - { - level jump_pad_ignore_poi_cleanup( ent_poi ); - ent_poi deactivate_zombie_point_of_interest(); - ent_poi delete(); - } + if ( isDefined( ent_trig.script_wait ) ) + { + wait ent_trig.script_wait; + } + else + { + wait 0,5; + } + if ( isDefined( ent_poi ) ) + { + level jump_pad_ignore_poi_cleanup( ent_poi ); + ent_poi deactivate_zombie_point_of_interest(); + ent_poi delete(); + } } jump_pad_enemy_follow_or_ignore( ent_poi ) { - self endon( "death" ); - self endon( "disconnect" ); - zombies = getaiarray( level.zombie_team ); - players = getplayers(); - valid_players = 0; - - for ( p = 0; p < players.size; p++ ) - { - if ( is_player_valid( players[p] ) ) - valid_players++; - } - - for ( i = 0; i < zombies.size; i++ ) - { - ignore_poi = 0; - - if ( !isdefined( zombies[i] ) ) - continue; - - enemy = zombies[i].favoriteenemy; - - if ( isdefined( enemy ) ) - { - if ( players.size > 1 && valid_players > 1 ) - { - if ( enemy != self || isdefined( enemy.jump_pad_previous ) && enemy.jump_pad_previous == enemy.jump_pad_current ) - ignore_poi = 1; - } - } - - if ( is_true( ignore_poi ) ) - { - zombies[i] thread add_poi_to_ignore_list( ent_poi ); - continue; - } - - zombies[i].ignore_distance_tracking = 1; - zombies[i]._pad_follow = 1; - zombies[i] thread stop_chasing_the_sky( ent_poi ); - } + self endon( "death" ); + self endon( "disconnect" ); + zombies = getaiarray( level.zombie_team ); + players = getplayers(); + valid_players = 0; + p = 0; + while ( p < players.size ) + { + if ( is_player_valid( players[ p ] ) ) + { + valid_players++; + } + p++; + } + i = 0; + while ( i < zombies.size ) + { + ignore_poi = 0; + if ( !isDefined( zombies[ i ] ) ) + { + i++; + continue; + } + else enemy = zombies[ i ].favoriteenemy; + if ( isDefined( enemy ) ) + { + if ( players.size > 1 && valid_players > 1 ) + { + if ( enemy != self || isDefined( enemy.jump_pad_previous ) && enemy.jump_pad_previous == enemy.jump_pad_current ) + { + ignore_poi = 1; + } + } + } + if ( is_true( ignore_poi ) ) + { + zombies[ i ] thread add_poi_to_ignore_list( ent_poi ); + i++; + continue; + } + else + { + zombies[ i ].ignore_distance_tracking = 1; + zombies[ i ]._pad_follow = 1; + zombies[ i ] thread stop_chasing_the_sky( ent_poi ); + } + i++; + } } jump_pad_ignore_poi_cleanup( ent_poi ) { - zombies = getaiarray( level.zombie_team ); - - for ( i = 0; i < zombies.size; i++ ) - { - if ( isdefined( zombies[i] ) ) - { - if ( is_true( zombies[i]._pad_follow ) ) - { - zombies[i]._pad_follow = 0; - zombies[i] notify( "stop_chasing_the_sky" ); - zombies[i].ignore_distance_tracking = 0; - } - - if ( isdefined( ent_poi ) ) - zombies[i] thread remove_poi_from_ignore_list( ent_poi ); - } - } + zombies = getaiarray( level.zombie_team ); + i = 0; + while ( i < zombies.size ) + { + if ( isDefined( zombies[ i ] ) ) + { + if ( is_true( zombies[ i ]._pad_follow ) ) + { + zombies[ i ]._pad_follow = 0; + zombies[ i ] notify( "stop_chasing_the_sky" ); + zombies[ i ].ignore_distance_tracking = 0; + } + if ( isDefined( ent_poi ) ) + { + zombies[ i ] thread remove_poi_from_ignore_list( ent_poi ); + } + } + i++; + } } stop_chasing_the_sky( ent_poi ) { - self endon( "death" ); - self endon( "stop_chasing_the_sky" ); - - while ( is_true( self._pad_follow ) ) - { - if ( isdefined( self.favoriteenemy ) ) - { - players = getplayers(); - - for ( i = 0; i < players.size; i++ ) - { - if ( is_player_valid( players[i] ) && players[i] != self.favoriteenemy ) - { - if ( distance2dsquared( players[i].origin, self.origin ) < 10000 ) - { - self add_poi_to_ignore_list( ent_poi ); - return; - } - } - } - } - - wait 0.1; - } - - self._pad_follow = 0; - self.ignore_distance_tracking = 0; - self notify( "stop_chasing_the_sky" ); + self endon( "death" ); + self endon( "stop_chasing_the_sky" ); + while ( is_true( self._pad_follow ) ) + { + while ( isDefined( self.favoriteenemy ) ) + { + players = getplayers(); + i = 0; + while ( i < players.size ) + { + if ( is_player_valid( players[ i ] ) && players[ i ] != self.favoriteenemy ) + { + if ( distance2dsquared( players[ i ].origin, self.origin ) < 10000 ) + { + self add_poi_to_ignore_list( ent_poi ); + return; + } + } + i++; + } + } + wait 0,1; + } + self._pad_follow = 0; + self.ignore_distance_tracking = 0; + self notify( "stop_chasing_the_sky" ); } jump_pad_player_overrides( st_behavior, int_clean ) { - if ( !isdefined( st_behavior ) || !isstring( st_behavior ) ) - return; - - if ( !isdefined( int_clean ) ) - int_clean = 0; - - switch ( st_behavior ) - { - case "no_sprint": - if ( !int_clean ) - { - - } - else - { - - } - - break; - default: - if ( isdefined( level._jump_pad_level_behavior ) ) - self [[ level._jump_pad_level_behavior ]]( st_behavior, int_clean ); - else - { - - } - - break; - } + if ( !isDefined( st_behavior ) || !isstring( st_behavior ) ) + { + return; + } + if ( !isDefined( int_clean ) ) + { + int_clean = 0; + } + switch( st_behavior ) + { + case "no_sprint": + if ( !int_clean ) + { + } + default: + if ( isDefined( level._jump_pad_level_behavior ) ) + { + self [[ level._jump_pad_level_behavior ]]( st_behavior, int_clean ); + } + } + } + } } diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_laststand.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_laststand.gsc index b0b5e90..52d147a 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_laststand.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_laststand.gsc @@ -1,1346 +1,1442 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\_demo; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\gametypes_zm\_gameobjects; -#include maps\mp\zombies\_zm_buildables; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm_chugabud; -#include maps\mp\zombies\_zm_perks; +//checked includes changed to match cerberus output +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_chugabud; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/gametypes_zm/_gameobjects; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/_demo; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -laststand_global_init() +laststand_global_init() //checked matches cerberus output { - level.const_laststand_getup_count_start = 0; - level.const_laststand_getup_bar_start = 0.5; - level.const_laststand_getup_bar_regen = 0.0025; - level.const_laststand_getup_bar_damage = 0.1; + level.const_laststand_getup_count_start = 0; + level.const_laststand_getup_bar_start = 0.5; + level.const_laststand_getup_bar_regen = 0.0025; + level.const_laststand_getup_bar_damage = 0.1; } -init() +init() //checked matches cerberus output //checked matches beta dump { - if ( level.script == "frontend" ) - return; - - laststand_global_init(); - level.revive_tool = "syrette_zm"; - precacheitem( level.revive_tool ); - precachestring( &"ZOMBIE_BUTTON_TO_REVIVE_PLAYER" ); - precachestring( &"ZOMBIE_PLAYER_NEEDS_TO_BE_REVIVED" ); - precachestring( &"ZOMBIE_PLAYER_IS_REVIVING_YOU" ); - precachestring( &"ZOMBIE_REVIVING" ); - - if ( !isdefined( level.laststandpistol ) ) - { - level.laststandpistol = "m1911"; - precacheitem( level.laststandpistol ); - } - - level thread revive_hud_think(); - level.primaryprogressbarx = 0; - level.primaryprogressbary = 110; - level.primaryprogressbarheight = 4; - level.primaryprogressbarwidth = 120; - level.primaryprogressbary_ss = 280; - - if ( getdvar( _hash_A17166B0 ) == "" ) - setdvar( "revive_trigger_radius", "40" ); - - level.laststandgetupallowed = 0; + if ( level.script == "frontend" ) + { + return; + } + laststand_global_init(); + level.revive_tool = "syrette_zm"; + precacheitem( level.revive_tool ); + precachestring( &"ZOMBIE_BUTTON_TO_REVIVE_PLAYER" ); + precachestring( &"ZOMBIE_PLAYER_NEEDS_TO_BE_REVIVED" ); + precachestring( &"ZOMBIE_PLAYER_IS_REVIVING_YOU" ); + precachestring( &"ZOMBIE_REVIVING" ); + if ( !isDefined( level.laststandpistol ) ) + { + level.laststandpistol = "m1911"; + precacheitem( level.laststandpistol ); + } + level thread revive_hud_think(); + level.primaryprogressbarx = 0; + level.primaryprogressbary = 110; + level.primaryprogressbarheight = 4; + level.primaryprogressbarwidth = 120; + level.primaryprogressbary_ss = 280; + if ( getDvar( "revive_trigger_radius" ) == "" ) + { + setdvar( "revive_trigger_radius", "40" ); + } + level.laststandgetupallowed = 0; } -player_is_in_laststand() +player_is_in_laststand() //checked changed to match cerberus output //changed at own discretion { - if ( !( isdefined( self.no_revive_trigger ) && self.no_revive_trigger ) ) - return isdefined( self.revivetrigger ); - else - return isdefined( self.laststand ) && self.laststand; + if ( !is_true( self.no_revive_trigger ) && isDefined( self.revivetrigger ) ) + { + return 1; + } + if ( is_true( self.laststand ) ) + { + return 1; + } + return 0; } -player_num_in_laststand() +player_num_in_laststand() //checked changed to match cerberus output //checked matches beta dump { - num = 0; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] player_is_in_laststand() ) - num++; - } - - return num; + num = 0; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ] player_is_in_laststand() ) + { + num++; + } + } + return num; } -player_all_players_in_laststand() +player_all_players_in_laststand() //checked changed at own discretion //checked matches beta dump { - return player_num_in_laststand() == get_players().size; + if ( player_num_in_laststand() == get_players().size ) + { + return 1; + } + return 0; } -player_any_player_in_laststand() +player_any_player_in_laststand() //checked changed at own discretion //checked matches beta dump { - return player_num_in_laststand() > 0; + if ( player_num_in_laststand() > 0 ) + { + return 1; + } + return 0; } -player_last_stand_stats( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) +player_last_stand_stats( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output { - if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self ) - { - if ( "zcleansed" == level.gametype ) - maps\mp\_demo::bookmark( "kill", gettime(), self, attacker, 0, einflictor ); - - if ( "zcleansed" == level.gametype ) - { - if ( isdefined( attacker.is_zombie ) && !attacker.is_zombie ) - attacker.kills++; - else - attacker.downs++; - } - else - attacker.kills++; - - attacker maps\mp\zombies\_zm_stats::increment_client_stat( "kills" ); - attacker maps\mp\zombies\_zm_stats::increment_player_stat( "kills" ); - - if ( isdefined( sweapon ) ) - { - dmgweapon = sweapon; - - if ( is_alt_weapon( dmgweapon ) ) - dmgweapon = weaponaltweaponname( dmgweapon ); - - attacker addweaponstat( dmgweapon, "kills", 1 ); - } - - if ( is_headshot( sweapon, shitloc, smeansofdeath ) ) - { - attacker.headshots++; - attacker maps\mp\zombies\_zm_stats::increment_client_stat( "headshots" ); - attacker addweaponstat( sweapon, "headshots", 1 ); - attacker maps\mp\zombies\_zm_stats::increment_player_stat( "headshots" ); - } - } - - self increment_downed_stat(); - - if ( flag( "solo_game" ) && !self.lives && getnumconnectedplayers() < 2 ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "deaths" ); - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); - } + if ( isDefined( attacker ) && isplayer( attacker ) && attacker != self ) + { + if ( level.gametype == "zcleansed" ) + { + maps/mp/_demo::bookmark( "kill", getTime(), self, attacker, 0, einflictor ); + } + if ( level.gametype == "zcleansed" ) + { + if ( isDefined( attacker.is_zombie ) && !attacker.is_zombie ) + { + attacker.kills++; + } + else + { + attacker.downs++; + } + } + else + { + attacker.kills++; + } + attacker maps/mp/zombies/_zm_stats::increment_client_stat( "kills" ); + attacker maps/mp/zombies/_zm_stats::increment_player_stat( "kills" ); + if ( isDefined( sweapon ) ) + { + dmgweapon = sweapon; + if ( is_alt_weapon( dmgweapon ) ) + { + dmgweapon = weaponaltweaponname( dmgweapon ); + } + attacker addweaponstat( dmgweapon, "kills", 1 ); + } + if ( is_headshot( sweapon, shitloc, smeansofdeath ) ) + { + attacker.headshots++; + attacker maps/mp/zombies/_zm_stats::increment_client_stat( "headshots" ); + attacker addweaponstat( sweapon, "headshots", 1 ); + attacker maps/mp/zombies/_zm_stats::increment_player_stat( "headshots" ); + } + } + self increment_downed_stat(); + if ( flag( "solo_game" ) && !self.lives && getnumconnectedplayers() < 2 ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "deaths" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "deaths" ); + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); + } } -increment_downed_stat() +increment_downed_stat() //checked matches cerberus output { - if ( "zcleansed" != level.gametype ) - self.downs++; - - self maps\mp\zombies\_zm_stats::increment_client_stat( "downs" ); - self add_weighted_down(); - self maps\mp\zombies\_zm_stats::increment_player_stat( "downs" ); - zonename = self get_current_zone(); - - if ( !isdefined( zonename ) ) - zonename = ""; - - self recordplayerdownzombies( zonename ); + if ( level.gametype != "zcleansed" ) + { + self.downs++; + } + self maps/mp/zombies/_zm_stats::increment_client_stat( "downs" ); + self add_weighted_down(); + self maps/mp/zombies/_zm_stats::increment_player_stat( "downs" ); + zonename = self get_current_zone(); + if ( !isDefined( zonename ) ) + { + zonename = ""; + } + self recordplayerdownzombies( zonename ); } -playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) +playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output //checked changed to match beta dump { - self notify( "entering_last_stand" ); - - if ( isdefined( level._game_module_player_laststand_callback ) ) - self [[ level._game_module_player_laststand_callback ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); - - if ( self player_is_in_laststand() ) - return; - - if ( isdefined( self.in_zombify_call ) && self.in_zombify_call ) - return; - - self thread player_last_stand_stats( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); - - if ( isdefined( level.playerlaststand_func ) ) - [[ level.playerlaststand_func ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); - - self.health = 1; - self.laststand = 1; - self.ignoreme = 1; - self thread maps\mp\gametypes_zm\_gameobjects::onplayerlaststand(); - self thread maps\mp\zombies\_zm_buildables::onplayerlaststand(); - - if ( !( isdefined( self.no_revive_trigger ) && self.no_revive_trigger ) ) - self revive_trigger_spawn(); - else - self undolaststand(); - - if ( isdefined( self.is_zombie ) && self.is_zombie ) - { - self takeallweapons(); - - if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self ) - attacker notify( "killed_a_zombie_player", einflictor, self, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); - } - else - { - self laststand_disable_player_weapons(); - self laststand_give_pistol(); - } - - if ( isdefined( level.playersuicideallowed ) && level.playersuicideallowed && get_players().size > 1 ) - { - if ( !isdefined( level.canplayersuicide ) || self [[ level.canplayersuicide ]]() ) - self thread suicide_trigger_spawn(); - } - - if ( isdefined( self.disabled_perks ) ) - self.disabled_perks = []; - - if ( level.laststandgetupallowed ) - self thread laststand_getup(); - else - { - bleedout_time = getdvarfloat( "player_lastStandBleedoutTime" ); - self thread laststand_bleedout( bleedout_time ); - } - - if ( "zcleansed" != level.gametype ) - maps\mp\_demo::bookmark( "zm_player_downed", gettime(), self ); - - self notify( "player_downed" ); - self thread refire_player_downed(); - self thread cleanup_laststand_on_disconnect(); + self notify( "entering_last_stand" ); + if ( isDefined( level._game_module_player_laststand_callback ) ) + { + self [[ level._game_module_player_laststand_callback ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + } + if ( self player_is_in_laststand() ) + { + return; + } + if ( is_true( self.in_zombify_call ) ) + { + return; + } + self thread player_last_stand_stats( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + if ( isDefined( level.playerlaststand_func ) ) + { + [[ level.playerlaststand_func ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + } + self.health = 1; + self.laststand = 1; + self.ignoreme = 1; + self thread maps/mp/gametypes_zm/_gameobjects::onplayerlaststand(); + self thread maps/mp/zombies/_zm_buildables::onplayerlaststand(); + if ( !is_true( self.no_revive_trigger ) ) + { + self revive_trigger_spawn(); + } + else + { + self undolaststand(); + } + if ( is_true( self.is_zombie ) ) + { + self takeallweapons(); + if ( isDefined( attacker ) && isplayer( attacker ) && attacker != self ) + { + attacker notify( "killed_a_zombie_player", eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ); + } + } + else + { + self laststand_disable_player_weapons(); + self laststand_give_pistol(); + } + if ( is_true( level.playerSuicideAllowed ) && get_players().size > 1 ) + { + if ( !isDefined( level.canplayersuicide ) || self [[ level.canplayersuicide ]]() ) + { + self thread suicide_trigger_spawn(); + } + } + if ( isDefined( self.disabled_perks ) ) + { + self.disabled_perks = []; + } + if ( level.laststandgetupallowed ) + { + self thread laststand_getup(); + } + else + { + bleedout_time = getDvarFloat( "player_lastStandBleedoutTime" ); + self thread laststand_bleedout( bleedout_time ); + } + if ( level.gametype != "zcleansed" ) + { + maps/mp/_demo::bookmark( "zm_player_downed", getTime(), self ); + } + self notify( "player_downed" ); + self thread refire_player_downed(); + self thread cleanup_laststand_on_disconnect(); } -refire_player_downed() +refire_player_downed() //checked matches cerberus output { - self endon( "player_revived" ); - self endon( "death" ); - self endon( "disconnect" ); - wait 1.0; - - if ( self.num_perks ) - self notify( "player_downed" ); + self endon( "player_revived" ); + self endon( "death" ); + self endon( "disconnect" ); + wait 1; + if ( self.num_perks ) + { + self notify( "player_downed" ); + } } -laststand_allowed( sweapon, smeansofdeath, shitloc ) +laststand_allowed( sweapon, smeansofdeath, shitloc ) //checked matches cerberus output { - if ( level.laststandpistol == "none" ) - return false; - - return true; + if ( level.laststandpistol == "none" ) + { + return 0; + } + return 1; } -laststand_disable_player_weapons() +laststand_disable_player_weapons() //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug due to continue { - weaponinventory = self getweaponslist( 1 ); - self.lastactiveweapon = self getcurrentweapon(); - - if ( self isthrowinggrenade() && is_offhand_weapon( self.lastactiveweapon ) ) - { - primaryweapons = self getweaponslistprimaries(); - - if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) - { - self.lastactiveweapon = primaryweapons[0]; - self switchtoweaponimmediate( self.lastactiveweapon ); - } - } - - self setlaststandprevweap( self.lastactiveweapon ); - self.laststandpistol = undefined; - self.hadpistol = 0; - - if ( isdefined( self.weapon_taken_by_losing_specialty_additionalprimaryweapon ) && self.lastactiveweapon == self.weapon_taken_by_losing_specialty_additionalprimaryweapon ) - { - self.lastactiveweapon = "none"; - self.weapon_taken_by_losing_specialty_additionalprimaryweapon = undefined; - } - - for ( i = 0; i < weaponinventory.size; i++ ) - { - weapon = weaponinventory[i]; - class = weaponclass( weapon ); - - if ( issubstr( weapon, "knife_ballistic_" ) ) - class = "knife"; - - if ( ( class == "pistol" || class == "pistol spread" || class == "pistolspread" ) && !isdefined( self.laststandpistol ) ) - { - self.laststandpistol = weapon; - self.hadpistol = 1; - } - - if ( weapon == "syrette_zm" ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "failed_sacrifices" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "failed_sacrifices" ); - } - else if ( is_zombie_perk_bottle( weapon ) ) - { - self takeweapon( weapon ); - self.lastactiveweapon = "none"; - continue; - } - - if ( isdefined( get_gamemode_var( "item_meat_name" ) ) ) - { - if ( weapon == get_gamemode_var( "item_meat_name" ) ) - { - self takeweapon( weapon ); - self.lastactiveweapon = "none"; - continue; - } - } - } - - if ( isdefined( self.hadpistol ) && self.hadpistol == 1 && isdefined( level.zombie_last_stand_pistol_memory ) ) - self [[ level.zombie_last_stand_pistol_memory ]](); - - if ( !isdefined( self.laststandpistol ) ) - self.laststandpistol = level.laststandpistol; - - self disableweaponcycling(); - self notify( "weapons_taken_for_last_stand" ); + weaponinventory = self getweaponslist( 1 ); + self.lastactiveweapon = self getcurrentweapon(); + if ( self isthrowinggrenade() && is_offhand_weapon( self.lastactiveweapon ) ) + { + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) + { + self.lastactiveweapon = primaryweapons[ 0 ]; + self switchtoweaponimmediate( self.lastactiveweapon ); + } + } + self setlaststandprevweap( self.lastactiveweapon ); + self.laststandpistol = undefined; + self.hadpistol = 0; + if ( isDefined( self.weapon_taken_by_losing_specialty_additionalprimaryweapon ) && self.lastactiveweapon == self.weapon_taken_by_losing_specialty_additionalprimaryweapon ) + { + self.lastactiveweapon = "none"; + self.weapon_taken_by_losing_specialty_additionalprimaryweapon = undefined; + } + i = 0; + while ( i < weaponinventory.size ) + { + weapon = weaponinventory[ i ]; + class = weaponclass( weapon ); + if ( issubstr( weapon, "knife_ballistic_" ) ) + { + class = "knife"; + } + if ( ( class == "pistol" || class == "pistol spread" ) && !isDefined( self.laststandpistol ) || class == "pistolspread" && !isDefined( self.laststandpistol ) ) + { + self.laststandpistol = weapon; + self.hadpistol = 1; + } + if ( weapon == "syrette_zm" ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "failed_sacrifices" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "failed_sacrifices" ); + } + else if ( is_zombie_perk_bottle( weapon ) ) + { + self takeweapon( weapon ); + self.lastactiveweapon = "none"; + i++; + continue; + } + if ( isDefined( get_gamemode_var( "item_meat_name" ) ) ) + { + if ( weapon == get_gamemode_var( "item_meat_name" ) ) + { + self takeweapon( weapon ); + self.lastactiveweapon = "none"; + i++; + continue; + } + } + i++; + } + if ( isDefined( self.hadpistol ) && self.hadpistol == 1 && isDefined( level.zombie_last_stand_pistol_memory ) ) + { + self [[ level.zombie_last_stand_pistol_memory ]](); + } + if ( !isDefined( self.laststandpistol ) ) + { + self.laststandpistol = level.laststandpistol; + } + self disableweaponcycling(); + self notify( "weapons_taken_for_last_stand" ); } -laststand_enable_player_weapons() +laststand_enable_player_weapons() //checked matches cerberus output { - if ( isdefined( self.hadpistol ) && !self.hadpistol && isdefined( self.laststandpistol ) ) - self takeweapon( self.laststandpistol ); - - if ( isdefined( self.hadpistol ) && self.hadpistol == 1 && isdefined( level.zombie_last_stand_ammo_return ) ) - [[ level.zombie_last_stand_ammo_return ]](); - - self enableweaponcycling(); - self enableoffhandweapons(); - - if ( isdefined( self.lastactiveweapon ) && self.lastactiveweapon != "none" && self hasweapon( self.lastactiveweapon ) && !is_placeable_mine( self.lastactiveweapon ) && !is_equipment( self.lastactiveweapon ) ) - self switchtoweapon( self.lastactiveweapon ); - else - { - primaryweapons = self getweaponslistprimaries(); - - if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) - self switchtoweapon( primaryweapons[0] ); - } + if ( !is_true( self.hadpistol ) && isDefined( self.laststandpistol ) ) + { + self takeweapon( self.laststandpistol ); + } + if ( isDefined( self.hadpistol ) && self.hadpistol == 1 && isDefined( level.zombie_last_stand_ammo_return ) ) + { + [[ level.zombie_last_stand_ammo_return ]](); + } + self enableweaponcycling(); + self enableoffhandweapons(); + if ( isDefined( self.lastactiveweapon ) && self.lastactiveweapon != "none" && self hasweapon( self.lastactiveweapon ) && !is_placeable_mine( self.lastactiveweapon ) && !is_equipment( self.lastactiveweapon ) ) + { + self switchtoweapon( self.lastactiveweapon ); + } + else + { + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + } + } } -laststand_clean_up_on_disconnect( playerbeingrevived, revivergun ) +laststand_clean_up_on_disconnect( playerbeingrevived, revivergun ) //checked matches cerberus output { - self endon( "do_revive_ended_normally" ); - revivetrigger = playerbeingrevived.revivetrigger; - - playerbeingrevived waittill( "disconnect" ); - - if ( isdefined( revivetrigger ) ) - revivetrigger delete(); - - self cleanup_suicide_hud(); - - if ( isdefined( self.reviveprogressbar ) ) - self.reviveprogressbar destroyelem(); - - if ( isdefined( self.revivetexthud ) ) - self.revivetexthud destroy(); - - self revive_give_back_weapons( revivergun ); + self endon( "do_revive_ended_normally" ); + revivetrigger = playerbeingrevived.revivetrigger; + playerbeingrevived waittill( "disconnect" ); + if ( isDefined( revivetrigger ) ) + { + revivetrigger delete(); + } + self cleanup_suicide_hud(); + if ( isDefined( self.reviveprogressbar ) ) + { + self.reviveprogressbar destroyelem(); + } + if ( isDefined( self.revivetexthud ) ) + { + self.revivetexthud destroy(); + } + self revive_give_back_weapons( revivergun ); } -laststand_clean_up_reviving_any( playerbeingrevived ) +laststand_clean_up_reviving_any( playerbeingrevived ) //checked changed to match cerberus output { - self endon( "do_revive_ended_normally" ); - playerbeingrevived waittill_any( "disconnect", "zombified", "stop_revive_trigger" ); - self.is_reviving_any--; + self endon( "do_revive_ended_normally" ); + playerbeingrevived waittill_any( "disconnect", "zombified", "stop_revive_trigger" ); + self.is_reviving_any--; - if ( 0 > self.is_reviving_any ) - self.is_reviving_any = 0; + if ( self.is_reviving_any < 0 ) + { + self.is_reviving_any = 0; + } } -laststand_give_pistol() +laststand_give_pistol() //checked changed to match cerberus output { + /* /# - assert( isdefined( self.laststandpistol ) ); + assert( isDefined( self.laststandpistol ) ); #/ /# - assert( self.laststandpistol != "none" ); + assert( self.laststandpistol != "none" ); #/ - if ( isdefined( level.zombie_last_stand ) ) - [[ level.zombie_last_stand ]](); - else - { - self giveweapon( self.laststandpistol ); - self givemaxammo( self.laststandpistol ); - self switchtoweapon( self.laststandpistol ); - } + */ + if ( isDefined( level.zombie_last_stand ) ) + { + [[ level.zombie_last_stand ]](); + } + else + { + self giveweapon( self.laststandpistol ); + self givemaxammo( self.laststandpistol ); + self switchtoweapon( self.laststandpistol ); + } } -laststand_bleedout( delay ) +laststand_bleedout( delay ) //checked changed to match cerberus output { - self endon( "player_revived" ); - self endon( "player_suicide" ); - self endon( "zombified" ); - self endon( "disconnect" ); - - if ( isdefined( self.is_zombie ) && self.is_zombie || isdefined( self.no_revive_trigger ) && self.no_revive_trigger ) - { - self notify( "bled_out" ); - wait_network_frame(); - self bleed_out(); - return; - } - - setclientsysstate( "lsm", "1", self ); - self.bleedout_time = delay; - - while ( self.bleedout_time > int( delay * 0.5 ) ) - { - self.bleedout_time -= 1; - wait 1; - } - - visionsetlaststand( "zombie_death", delay * 0.5 ); - - while ( self.bleedout_time > 0 ) - { - self.bleedout_time -= 1; - wait 1; - } - - while ( isdefined( self.revivetrigger ) && isdefined( self.revivetrigger.beingrevived ) && self.revivetrigger.beingrevived == 1 ) - wait 0.1; - - self notify( "bled_out" ); - wait_network_frame(); - self bleed_out(); + self endon( "player_revived" ); + self endon( "player_suicide" ); + self endon( "zombified" ); + self endon( "disconnect" ); + if ( is_true( self.is_zombie ) || is_true( self.no_revive_trigger ) ) + { + self notify( "bled_out" ); + wait_network_frame(); + self bleed_out(); + return; + } + setclientsysstate( "lsm", "1", self ); + self.bleedout_time = delay; + while ( self.bleedout_time > int( delay * 0.5 ) ) + { + self.bleedout_time -= 1; + wait 1; + } + visionsetlaststand( "zombie_death", delay * 0.5 ); + while ( self.bleedout_time > 0 ) + { + self.bleedout_time -= 1; + wait 1; + } + while ( isDefined( self.revivetrigger ) && isDefined( self.revivetrigger.beingrevived ) && self.revivetrigger.beingrevived == 1 ) + { + wait 0.1; + } + self notify( "bled_out" ); + wait_network_frame(); + self bleed_out(); } -bleed_out() +bleed_out() //checked changed to match cerberus output { - self cleanup_suicide_hud(); - - if ( isdefined( self.revivetrigger ) ) - self.revivetrigger delete(); - - self.revivetrigger = undefined; - setclientsysstate( "lsm", "0", self ); - self maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "deaths" ); - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); - self recordplayerdeathzombies(); - self maps\mp\zombies\_zm_equipment::equipment_take(); - - if ( "zcleansed" != level.gametype ) - maps\mp\_demo::bookmark( "zm_player_bledout", gettime(), self, undefined, 1 ); - - level notify( "bleed_out", self.characterindex ); - self undolaststand(); - - if ( isdefined( level.is_zombie_level ) && level.is_zombie_level ) - self thread [[ level.player_becomes_zombie ]](); - else if ( isdefined( level.is_specops_level ) && level.is_specops_level ) - self thread [[ level.spawnspectator ]](); - else - self.ignoreme = 0; + self cleanup_suicide_hud(); + if ( isDefined( self.revivetrigger ) ) + { + self.revivetrigger delete(); + } + self.revivetrigger = undefined; + setclientsysstate( "lsm", "0", self ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "deaths" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "deaths" ); + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); + self recordplayerdeathzombies(); + self maps/mp/zombies/_zm_equipment::equipment_take(); + if ( level.gametype != "zcleansed" ) + { + maps/mp/_demo::bookmark( "zm_player_bledout", getTime(), self, undefined, 1 ); + } + level notify( "bleed_out", self.characterindex ); + self undolaststand(); + if ( is_true( level.is_zombie_level ) ) + { + self thread [[ level.player_becomes_zombie ]](); + } + if ( is_true( level.is_specops_level ) ) + { + self thread [[ level.spawnspectator ]](); + } + else + { + self.ignoreme = 0; + } } -cleanup_suicide_hud() +cleanup_suicide_hud() //checked matches cerberus output { - if ( isdefined( self.suicideprompt ) ) - self.suicideprompt destroy(); - - self.suicideprompt = undefined; + if ( isDefined( self.suicideprompt ) ) + { + self.suicideprompt destroy(); + } + self.suicideprompt = undefined; } -clean_up_suicide_hud_on_end_game() +clean_up_suicide_hud_on_end_game() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "zombified" ); - self endon( "stop_revive_trigger" ); - self endon( "player_revived" ); - self endon( "bled_out" ); - level waittill_any( "end_game", "stop_suicide_trigger" ); - self cleanup_suicide_hud(); - - if ( isdefined( self.suicidetexthud ) ) - self.suicidetexthud destroy(); - - if ( isdefined( self.suicideprogressbar ) ) - self.suicideprogressbar destroyelem(); + self endon( "disconnect" ); + self endon( "zombified" ); + self endon( "stop_revive_trigger" ); + self endon( "player_revived" ); + self endon( "bled_out" ); + level waittill_any( "end_game", "stop_suicide_trigger" ); + self cleanup_suicide_hud(); + if ( isDefined( self.suicidetexthud ) ) + { + self.suicidetexthud destroy(); + } + if ( isDefined( self.suicideprogressbar ) ) + { + self.suicideprogressbar destroyelem(); + } } -clean_up_suicide_hud_on_bled_out() +clean_up_suicide_hud_on_bled_out() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "zombified" ); - self endon( "stop_revive_trigger" ); - self waittill_any( "bled_out", "player_revived", "fake_death" ); - self cleanup_suicide_hud(); - - if ( isdefined( self.suicideprogressbar ) ) - self.suicideprogressbar destroyelem(); - - if ( isdefined( self.suicidetexthud ) ) - self.suicidetexthud destroy(); + self endon( "disconnect" ); + self endon( "zombified" ); + self endon( "stop_revive_trigger" ); + self waittill_any( "bled_out", "player_revived", "fake_death" ); + self cleanup_suicide_hud(); + if ( isDefined( self.suicideprogressbar ) ) + { + self.suicideprogressbar destroyelem(); + } + if ( isDefined( self.suicidetexthud ) ) + { + self.suicidetexthud destroy(); + } } -suicide_trigger_spawn() +suicide_trigger_spawn() //checked matches cerberus output { - radius = getdvarint( _hash_A17166B0 ); - self.suicideprompt = newclienthudelem( self ); - self.suicideprompt.alignx = "center"; - self.suicideprompt.aligny = "middle"; - self.suicideprompt.horzalign = "center"; - self.suicideprompt.vertalign = "bottom"; - self.suicideprompt.y = -170; - - if ( self issplitscreen() ) - self.suicideprompt.y = -132; - - self.suicideprompt.foreground = 1; - self.suicideprompt.font = "default"; - self.suicideprompt.fontscale = 1.5; - self.suicideprompt.alpha = 1; - self.suicideprompt.color = ( 1, 1, 1 ); - self.suicideprompt.hidewheninmenu = 1; - self thread suicide_trigger_think(); + radius = getDvarInt( "revive_trigger_radius" ); + self.suicideprompt = newclienthudelem( self ); + self.suicideprompt.alignx = "center"; + self.suicideprompt.aligny = "middle"; + self.suicideprompt.horzalign = "center"; + self.suicideprompt.vertalign = "bottom"; + self.suicideprompt.y = -170; + if ( self issplitscreen() ) + { + self.suicideprompt.y = -132; + } + self.suicideprompt.foreground = 1; + self.suicideprompt.font = "default"; + self.suicideprompt.fontscale = 1.5; + self.suicideprompt.alpha = 1; + self.suicideprompt.color = ( 1, 1, 1 ); + self.suicideprompt.hidewheninmenu = 1; + self thread suicide_trigger_think(); } -suicide_trigger_think() +suicide_trigger_think() //checked changed to match cerberus output { - self endon( "disconnect" ); - self endon( "zombified" ); - self endon( "stop_revive_trigger" ); - self endon( "player_revived" ); - self endon( "bled_out" ); - self endon( "fake_death" ); - level endon( "end_game" ); - level endon( "stop_suicide_trigger" ); - self thread clean_up_suicide_hud_on_end_game(); - self thread clean_up_suicide_hud_on_bled_out(); - - while ( self usebuttonpressed() ) - wait 1; - - if ( !isdefined( self.suicideprompt ) ) - return; - - while ( true ) - { - wait 0.1; - - if ( !isdefined( self.suicideprompt ) ) - continue; - - self.suicideprompt settext( &"ZOMBIE_BUTTON_TO_SUICIDE" ); - - if ( !self is_suiciding() ) - continue; - - self.pre_suicide_weapon = self getcurrentweapon(); - self giveweapon( level.suicide_weapon ); - self switchtoweapon( level.suicide_weapon ); - duration = self docowardswayanims(); - suicide_success = suicide_do_suicide( duration ); - self.laststand = undefined; - self takeweapon( level.suicide_weapon ); - - if ( suicide_success ) - { - self notify( "player_suicide" ); - wait_network_frame(); - self maps\mp\zombies\_zm_stats::increment_client_stat( "suicides" ); - self bleed_out(); - return; - } - - self switchtoweapon( self.pre_suicide_weapon ); - self.pre_suicide_weapon = undefined; - } + self endon( "disconnect" ); + self endon( "zombified" ); + self endon( "stop_revive_trigger" ); + self endon( "player_revived" ); + self endon( "bled_out" ); + self endon( "fake_death" ); + level endon( "end_game" ); + level endon( "stop_suicide_trigger" ); + self thread clean_up_suicide_hud_on_end_game(); + self thread clean_up_suicide_hud_on_bled_out(); + while ( self usebuttonpressed() ) + { + wait 1; + } + if ( !isDefined( self.suicideprompt ) ) + { + return; + } + while ( 1 ) + { + wait 0.1; + if ( !isDefined( self.suicideprompt ) ) + { + continue; + } + self.suicideprompt settext( &"ZOMBIE_BUTTON_TO_SUICIDE" ); + if ( !self is_suiciding() ) + { + continue; + } + self.pre_suicide_weapon = self getcurrentweapon(); + self giveweapon( level.suicide_weapon ); + self switchtoweapon( level.suicide_weapon ); + duration = self docowardswayanims(); + suicide_success = suicide_do_suicide( duration ); + self.laststand = undefined; + self takeweapon( level.suicide_weapon ); + if ( suicide_success ) + { + self notify( "player_suicide" ); + wait_network_frame(); + self maps/mp/zombies/_zm_stats::increment_client_stat( "suicides" ); + self bleed_out(); + return; + } + self switchtoweapon( self.pre_suicide_weapon ); + self.pre_suicide_weapon = undefined; + } } -suicide_do_suicide( duration ) +suicide_do_suicide( duration ) //checked matches cerberus output { - level endon( "end_game" ); - level endon( "stop_suicide_trigger" ); - suicidetime = duration; - timer = 0; - suicided = 0; - self.suicideprompt settext( "" ); - - if ( !isdefined( self.suicideprogressbar ) ) - self.suicideprogressbar = self createprimaryprogressbar(); - - if ( !isdefined( self.suicidetexthud ) ) - self.suicidetexthud = newclienthudelem( self ); - - self.suicideprogressbar updatebar( 0.01, 1 / suicidetime ); - self.suicidetexthud.alignx = "center"; - self.suicidetexthud.aligny = "middle"; - self.suicidetexthud.horzalign = "center"; - self.suicidetexthud.vertalign = "bottom"; - self.suicidetexthud.y = -173; - - if ( self issplitscreen() ) - self.suicidetexthud.y = -147; - - self.suicidetexthud.foreground = 1; - self.suicidetexthud.font = "default"; - self.suicidetexthud.fontscale = 1.8; - self.suicidetexthud.alpha = 1; - self.suicidetexthud.color = ( 1, 1, 1 ); - self.suicidetexthud.hidewheninmenu = 1; - self.suicidetexthud settext( &"ZOMBIE_SUICIDING" ); - - while ( self is_suiciding() ) - { - wait 0.05; - timer += 0.05; - - if ( timer >= suicidetime ) - { - suicided = 1; - break; - } - } - - if ( isdefined( self.suicideprogressbar ) ) - self.suicideprogressbar destroyelem(); - - if ( isdefined( self.suicidetexthud ) ) - self.suicidetexthud destroy(); - - if ( isdefined( self.suicideprompt ) ) - self.suicideprompt settext( &"ZOMBIE_BUTTON_TO_SUICIDE" ); - - return suicided; + level endon( "end_game" ); + level endon( "stop_suicide_trigger" ); + suicidetime = duration; + timer = 0; + suicided = 0; + self.suicideprompt settext( "" ); + if ( !isDefined( self.suicideprogressbar ) ) + { + self.suicideprogressbar = self createprimaryprogressbar(); + } + if ( !isDefined( self.suicidetexthud ) ) + { + self.suicidetexthud = newclienthudelem( self ); + } + self.suicideprogressbar updatebar( 0.01, 1 / suicidetime ); + self.suicidetexthud.alignx = "center"; + self.suicidetexthud.aligny = "middle"; + self.suicidetexthud.horzalign = "center"; + self.suicidetexthud.vertalign = "bottom"; + self.suicidetexthud.y = -173; + if ( self issplitscreen() ) + { + self.suicidetexthud.y = -147; + } + self.suicidetexthud.foreground = 1; + self.suicidetexthud.font = "default"; + self.suicidetexthud.fontscale = 1.8; + self.suicidetexthud.alpha = 1; + self.suicidetexthud.color = ( 1, 1, 1 ); + self.suicidetexthud.hidewheninmenu = 1; + self.suicidetexthud settext( &"ZOMBIE_SUICIDING" ); + while ( self is_suiciding() ) + { + wait 0.05; + timer += 0.05; + if ( timer >= suicidetime ) + { + suicided = 1; + break; + } + } + if ( isDefined( self.suicideprogressbar ) ) + { + self.suicideprogressbar destroyelem(); + } + if ( isDefined( self.suicidetexthud ) ) + { + self.suicidetexthud destroy(); + } + if ( isDefined( self.suicideprompt ) ) + { + self.suicideprompt settext( &"ZOMBIE_BUTTON_TO_SUICIDE" ); + } + return suicided; } -can_suicide() +can_suicide() //checked matches cerberus output { - if ( !isalive( self ) ) - return false; - - if ( !self player_is_in_laststand() ) - return false; - - if ( !isdefined( self.suicideprompt ) ) - return false; - - if ( isdefined( self.is_zombie ) && self.is_zombie ) - return false; - - if ( isdefined( level.intermission ) && level.intermission ) - return false; - - return true; + if ( !isalive( self ) ) + { + return 0; + } + if ( !self player_is_in_laststand() ) + { + return 0; + } + if ( !isDefined( self.suicideprompt ) ) + { + return 0; + } + if ( is_true( self.is_zombie ) ) + { + return 0; + } + if ( is_true( level.intermission ) ) + { + return 0; + } + return 1; } -is_suiciding( revivee ) +is_suiciding( revivee ) //checked changed at own discretion { - return self usebuttonpressed() && can_suicide(); + if ( self usebuttonpressed() && can_suicide() ) + { + return 1; + } + return 0; } -revive_trigger_spawn() +revive_trigger_spawn() //checked changed to match cerberus output { - if ( isdefined( level.revive_trigger_spawn_override_link ) ) - [[ level.revive_trigger_spawn_override_link ]]( self ); - else - { - radius = getdvarint( _hash_A17166B0 ); - self.revivetrigger = spawn( "trigger_radius", ( 0, 0, 0 ), 0, radius, radius ); - self.revivetrigger sethintstring( "" ); - self.revivetrigger setcursorhint( "HINT_NOICON" ); - self.revivetrigger setmovingplatformenabled( 1 ); - self.revivetrigger enablelinkto(); - self.revivetrigger.origin = self.origin; - self.revivetrigger linkto( self ); - self.revivetrigger.beingrevived = 0; - self.revivetrigger.createtime = gettime(); - } - - self thread revive_trigger_think(); + if ( isDefined( level.revive_trigger_spawn_override_link ) ) + { + [[ level.revive_trigger_spawn_override_link ]]( self ); + } + else + { + radius = getDvarInt( "revive_trigger_radius" ); + self.revivetrigger = spawn( "trigger_radius", ( 0, 0, 0 ), 0, radius, radius ); + self.revivetrigger sethintstring( "" ); + self.revivetrigger setcursorhint( "HINT_NOICON" ); + self.revivetrigger setmovingplatformenabled( 1 ); + self.revivetrigger enablelinkto(); + self.revivetrigger.origin = self.origin; + self.revivetrigger linkto( self ); + self.revivetrigger.beingrevived = 0; + self.revivetrigger.createtime = getTime(); + } + self thread revive_trigger_think(); } -revive_trigger_think() +revive_trigger_think() //checked partially changed to match cerberus output //did not change while loop to for loop because of infinite loop continue bug { - self endon( "disconnect" ); - self endon( "zombified" ); - self endon( "stop_revive_trigger" ); - level endon( "end_game" ); - self endon( "death" ); - - while ( true ) - { - wait 0.1; - self.revivetrigger sethintstring( "" ); - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - d = 0; - d = self depthinwater(); - - if ( players[i] can_revive( self ) || d > 20 ) - { - self.revivetrigger setrevivehintstring( &"ZOMBIE_BUTTON_TO_REVIVE_PLAYER", self.team ); - break; - } - } - - for ( i = 0; i < players.size; i++ ) - { - reviver = players[i]; - - if ( self == reviver || !reviver is_reviving( self ) ) - continue; - - gun = reviver getcurrentweapon(); + self endon( "disconnect" ); + self endon( "zombified" ); + self endon( "stop_revive_trigger" ); + level endon( "end_game" ); + self endon( "death" ); + while ( 1 ) + { + wait 0.1; + self.revivetrigger sethintstring( "" ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + d = 0; + d = self depthinwater(); + if ( players[ i ] can_revive( self ) || d > 20 ) + { + self.revivetrigger setrevivehintstring( &"ZOMBIE_BUTTON_TO_REVIVE_PLAYER", self.team ); + break; + } + } + i = 0; + while ( i < players.size ) + { + reviver = players[ i ]; + if ( self == reviver || !reviver is_reviving( self ) ) + { + i++; + continue; + } + gun = reviver getcurrentweapon(); + /* /# - assert( isdefined( gun ) ); + assert( isDefined( gun ) ); #/ - if ( gun == level.revive_tool ) - continue; - - reviver giveweapon( level.revive_tool ); - reviver switchtoweapon( level.revive_tool ); - reviver setweaponammostock( level.revive_tool, 1 ); - revive_success = reviver revive_do_revive( self, gun ); - reviver revive_give_back_weapons( gun ); - - if ( isplayer( self ) ) - self allowjump( 1 ); - - self.laststand = undefined; - - if ( revive_success ) - { - if ( isplayer( self ) ) - maps\mp\zombies\_zm_chugabud::player_revived_cleanup_chugabud_corpse(); - - self thread revive_success( reviver ); - self cleanup_suicide_hud(); - return; - } - } - } + */ + if ( gun == level.revive_tool ) + { + i++; + continue; + } + reviver giveweapon( level.revive_tool ); + reviver switchtoweapon( level.revive_tool ); + reviver setweaponammostock( level.revive_tool, 1 ); + revive_success = reviver revive_do_revive( self, gun ); + reviver revive_give_back_weapons( gun ); + if ( isplayer( self ) ) + { + self allowjump( 1 ); + } + self.laststand = undefined; + if ( revive_success ) + { + if ( isplayer( self ) ) + { + maps/mp/zombies/_zm_chugabud::player_revived_cleanup_chugabud_corpse(); + } + self thread revive_success( reviver ); + self cleanup_suicide_hud(); + return; + } + i++; + } + } } -revive_give_back_weapons( gun ) +revive_give_back_weapons( gun ) //checked matches cerberus output { - self takeweapon( level.revive_tool ); - - if ( self player_is_in_laststand() ) - return; - - if ( gun != "none" && !is_placeable_mine( gun ) && gun != "equip_gasmask_zm" && gun != "lower_equip_gasmask_zm" && self hasweapon( gun ) ) - self switchtoweapon( gun ); - else - { - primaryweapons = self getweaponslistprimaries(); - - if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) - self switchtoweapon( primaryweapons[0] ); - } + self takeweapon( level.revive_tool ); + if ( self player_is_in_laststand() ) + { + return; + } + if ( gun != "none" && !is_placeable_mine( gun ) && gun != "equip_gasmask_zm" && gun != "lower_equip_gasmask_zm" && self hasweapon( gun ) ) + { + self switchtoweapon( gun ); + } + else + { + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + } + } } -can_revive( revivee ) +can_revive( revivee ) //checked changed to match cerberus output { - if ( !isdefined( revivee.revivetrigger ) ) - return false; - - if ( !isalive( self ) ) - return false; - - if ( self player_is_in_laststand() ) - return false; - - if ( self.team != revivee.team ) - return false; - - if ( isdefined( self.is_zombie ) && self.is_zombie ) - return false; - - if ( self has_powerup_weapon() ) - return false; - - if ( isdefined( level.can_revive_use_depthinwater_test ) && level.can_revive_use_depthinwater_test && revivee depthinwater() > 10 ) - return true; - - if ( isdefined( level.can_revive ) && ![[ level.can_revive ]]( revivee ) ) - return false; - - if ( isdefined( level.can_revive_game_module ) && ![[ level.can_revive_game_module ]]( revivee ) ) - return false; - - ignore_sight_checks = 0; - ignore_touch_checks = 0; - - if ( isdefined( level.revive_trigger_should_ignore_sight_checks ) ) - { - ignore_sight_checks = [[ level.revive_trigger_should_ignore_sight_checks ]]( self ); - - if ( ignore_sight_checks && isdefined( revivee.revivetrigger.beingrevived ) && revivee.revivetrigger.beingrevived == 1 ) - ignore_touch_checks = 1; - } - - if ( !ignore_touch_checks ) - { - if ( !self istouching( revivee.revivetrigger ) ) - return false; - } - - if ( !ignore_sight_checks ) - { - if ( !self is_facing( revivee ) ) - return false; - - if ( !sighttracepassed( self.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), revivee.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), 0, undefined ) ) - return false; - - if ( !bullettracepassed( self.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), revivee.origin + vectorscale( ( 0, 0, 1 ), 30.0 ), 0, undefined ) ) - return false; - } - - return true; + if ( !isDefined( revivee.revivetrigger ) ) + { + return 0; + } + if ( !isalive( self ) ) + { + return 0; + } + if ( self player_is_in_laststand() ) + { + return 0; + } + if ( self.team != revivee.team ) + { + return 0; + } + if ( is_true( self.is_zombie ) ) + { + return 0; + } + if ( self has_powerup_weapon() ) + { + return 0; + } + if ( is_true( level.can_revive_use_depthinwater_test ) && revivee depthinwater() > 10 ) + { + return 1; + } + if ( isDefined( level.can_revive ) && ![[ level.can_revive ]]( revivee ) ) + { + return 0; + } + if ( isDefined( level.can_revive_game_module ) && ![[ level.can_revive_game_module ]]( revivee ) ) + { + return 0; + } + ignore_sight_checks = 0; + ignore_touch_checks = 0; + if ( isDefined( level.revive_trigger_should_ignore_sight_checks ) ) + { + ignore_sight_checks = [[ level.revive_trigger_should_ignore_sight_checks ]]( self ); + if ( ignore_sight_checks && isDefined( revivee.revivetrigger.beingrevived ) && revivee.revivetrigger.beingrevived == 1 ) + { + ignore_touch_checks = 1; + } + } + if ( !ignore_touch_checks ) + { + if ( !self istouching( revivee.revivetrigger ) ) + { + return 0; + } + } + if ( !ignore_sight_checks ) + { + if ( !self is_facing( revivee ) ) + { + return 0; + } + if ( !sighttracepassed( self.origin + vectorScale( ( 0, 0, 1 ), 50 ), revivee.origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, undefined ) ) + { + return 0; + } + if ( !bullettracepassed( self.origin + vectorScale( ( 0, 0, 1 ), 50 ), revivee.origin + vectorScale( ( 0, 0, 1 ), 30 ), 0, undefined ) ) + { + return 0; + } + } + return 1; } -is_reviving( revivee ) +is_reviving( revivee ) //checked changed at own discretion { - return self usebuttonpressed() && can_revive( revivee ); + if ( self usebuttonpressed() && can_revive( revivee ) ) + { + return 1; + } + return 0; } -is_reviving_any() +is_reviving_any() //checked changed at own discretion { - return isdefined( self.is_reviving_any ) && self.is_reviving_any; + if ( is_true( self.is_reviving_any ) ) + { + return 1; + } + return 0; } -is_facing( facee ) +is_facing( facee ) //checked matches cerberus output { - orientation = self getplayerangles(); - forwardvec = anglestoforward( orientation ); - forwardvec2d = ( forwardvec[0], forwardvec[1], 0 ); - unitforwardvec2d = vectornormalize( forwardvec2d ); - tofaceevec = facee.origin - self.origin; - tofaceevec2d = ( tofaceevec[0], tofaceevec[1], 0 ); - unittofaceevec2d = vectornormalize( tofaceevec2d ); - dotproduct = vectordot( unitforwardvec2d, unittofaceevec2d ); - return dotproduct > 0.9; + orientation = self getplayerangles(); + forwardvec = anglesToForward( orientation ); + forwardvec2d = ( forwardvec[ 0 ], forwardvec[ 1 ], 0 ); + unitforwardvec2d = vectornormalize( forwardvec2d ); + tofaceevec = facee.origin - self.origin; + tofaceevec2d = ( tofaceevec[ 0 ], tofaceevec[ 1 ], 0 ); + unittofaceevec2d = vectornormalize( tofaceevec2d ); + dotproduct = vectordot( unitforwardvec2d, unittofaceevec2d ); + return dotproduct > 0.9; } -revive_do_revive( playerbeingrevived, revivergun ) +revive_do_revive( playerbeingrevived, revivergun ) //checked changed to match cerberus output { + /* /# - assert( self is_reviving( playerbeingrevived ) ); + assert( self is_reviving( playerbeingrevived ) ); #/ - revivetime = 3; + */ + revivetime = 3; + if ( self hasperk( "specialty_quickrevive" ) ) + { + revivetime /= 2; + } + if ( self maps/mp/zombies/_zm_pers_upgrades_functions::pers_revive_active() ) + { + revivetime *= 0.5; + } + timer = 0; + revived = 0; + playerbeingrevived.revivetrigger.beingrevived = 1; + playerbeingrevived.revive_hud settext( &"ZOMBIE_PLAYER_IS_REVIVING_YOU", self ); + playerbeingrevived revive_hud_show_n_fade( 3 ); + playerbeingrevived.revivetrigger sethintstring( "" ); + if ( isplayer( playerbeingrevived ) ) + { + playerbeingrevived startrevive( self ); + } + if ( !isDefined( self.reviveprogressbar ) ) + { + self.reviveprogressbar = self createprimaryprogressbar(); + } + if ( !isDefined( self.revivetexthud ) ) + { + self.revivetexthud = newclienthudelem( self ); + } + self thread laststand_clean_up_on_disconnect( playerbeingrevived, revivergun ); + if ( !isDefined( self.is_reviving_any ) ) + { + self.is_reviving_any = 0; + } + self.is_reviving_any++; + self thread laststand_clean_up_reviving_any( playerbeingrevived ); + self.reviveprogressbar updatebar( 0.01, 1 / revivetime ); + self.revivetexthud.alignx = "center"; + self.revivetexthud.aligny = "middle"; + self.revivetexthud.horzalign = "center"; + self.revivetexthud.vertalign = "bottom"; + self.revivetexthud.y = -113; + if ( self issplitscreen() ) + { + self.revivetexthud.y = -347; + } + self.revivetexthud.foreground = 1; + self.revivetexthud.font = "default"; + self.revivetexthud.fontscale = 1.8; + self.revivetexthud.alpha = 1; + self.revivetexthud.color = ( 1, 1, 1 ); + self.revivetexthud.hidewheninmenu = 1; + if ( self maps/mp/zombies/_zm_pers_upgrades_functions::pers_revive_active() ) + { + self.revivetexthud.color = ( 0.5, 0.5, 1 ); + } + self.revivetexthud settext( &"ZOMBIE_REVIVING" ); + self thread check_for_failed_revive( playerbeingrevived ); + while ( self is_reviving( playerbeingrevived ) ) + { + wait 0.05; + timer += 0.05; + if ( self player_is_in_laststand() ) + { + break; + } + else if ( isDefined( playerbeingrevived.revivetrigger.auto_revive ) && playerbeingrevived.revivetrigger.auto_revive == 1 ) + { + break; + } + if ( timer >= revivetime ) + { + revived = 1; + break; + } + } + if ( isDefined( self.reviveprogressbar ) ) + { + self.reviveprogressbar destroyelem(); + } + if ( isDefined( self.revivetexthud ) ) + { + self.revivetexthud destroy(); + } + if ( isDefined( playerbeingrevived.revivetrigger.auto_revive ) && playerbeingrevived.revivetrigger.auto_revive == 1 ) + { + } + else if ( !revived ) + { + if ( isplayer( playerbeingrevived ) ) + { + playerbeingrevived stoprevive( self ); + } + } + playerbeingrevived.revivetrigger sethintstring( &"ZOMBIE_BUTTON_TO_REVIVE_PLAYER" ); + playerbeingrevived.revivetrigger.beingrevived = 0; + self notify( "do_revive_ended_normally" ); + self.is_reviving_any--; - if ( self hasperk( "specialty_quickrevive" ) ) - revivetime /= 2; - - if ( self maps\mp\zombies\_zm_pers_upgrades_functions::pers_revive_active() ) - revivetime *= 0.5; - - timer = 0; - revived = 0; - playerbeingrevived.revivetrigger.beingrevived = 1; - playerbeingrevived.revive_hud settext( &"ZOMBIE_PLAYER_IS_REVIVING_YOU", self ); - playerbeingrevived revive_hud_show_n_fade( 3.0 ); - playerbeingrevived.revivetrigger sethintstring( "" ); - - if ( isplayer( playerbeingrevived ) ) - playerbeingrevived startrevive( self ); - - if ( !isdefined( self.reviveprogressbar ) ) - self.reviveprogressbar = self createprimaryprogressbar(); - - if ( !isdefined( self.revivetexthud ) ) - self.revivetexthud = newclienthudelem( self ); - - self thread laststand_clean_up_on_disconnect( playerbeingrevived, revivergun ); - - if ( !isdefined( self.is_reviving_any ) ) - self.is_reviving_any = 0; - - self.is_reviving_any++; - self thread laststand_clean_up_reviving_any( playerbeingrevived ); - self.reviveprogressbar updatebar( 0.01, 1 / revivetime ); - self.revivetexthud.alignx = "center"; - self.revivetexthud.aligny = "middle"; - self.revivetexthud.horzalign = "center"; - self.revivetexthud.vertalign = "bottom"; - self.revivetexthud.y = -113; - - if ( self issplitscreen() ) - self.revivetexthud.y = -347; - - self.revivetexthud.foreground = 1; - self.revivetexthud.font = "default"; - self.revivetexthud.fontscale = 1.8; - self.revivetexthud.alpha = 1; - self.revivetexthud.color = ( 1, 1, 1 ); - self.revivetexthud.hidewheninmenu = 1; - - if ( self maps\mp\zombies\_zm_pers_upgrades_functions::pers_revive_active() ) - self.revivetexthud.color = ( 0.5, 0.5, 1.0 ); - - self.revivetexthud settext( &"ZOMBIE_REVIVING" ); - self thread check_for_failed_revive( playerbeingrevived ); - - while ( self is_reviving( playerbeingrevived ) ) - { - wait 0.05; - timer += 0.05; - - if ( self player_is_in_laststand() ) - break; - - if ( isdefined( playerbeingrevived.revivetrigger.auto_revive ) && playerbeingrevived.revivetrigger.auto_revive == 1 ) - break; - - if ( timer >= revivetime ) - { - revived = 1; - break; - } - } - - if ( isdefined( self.reviveprogressbar ) ) - self.reviveprogressbar destroyelem(); - - if ( isdefined( self.revivetexthud ) ) - self.revivetexthud destroy(); - - if ( isdefined( playerbeingrevived.revivetrigger.auto_revive ) && playerbeingrevived.revivetrigger.auto_revive == 1 ) - { - - } - else if ( !revived ) - { - if ( isplayer( playerbeingrevived ) ) - playerbeingrevived stoprevive( self ); - } - - playerbeingrevived.revivetrigger sethintstring( &"ZOMBIE_BUTTON_TO_REVIVE_PLAYER" ); - playerbeingrevived.revivetrigger.beingrevived = 0; - self notify( "do_revive_ended_normally" ); - self.is_reviving_any--; - - if ( !revived ) - playerbeingrevived thread checkforbleedout( self ); - - return revived; + if ( !revived ) + { + playerbeingrevived thread checkforbleedout( self ); + } + return revived; } -checkforbleedout( player ) +checkforbleedout( player ) //checked matches cerberus output { - self endon( "player_revived" ); - self endon( "player_suicide" ); - self endon( "disconnect" ); - player endon( "disconnect" ); - - if ( is_classic() ) - { - player.failed_revives++; - player notify( "player_failed_revive" ); - } + self endon( "player_revived" ); + self endon( "player_suicide" ); + self endon( "disconnect" ); + player endon( "disconnect" ); + if ( is_classic() ) + { + player.failed_revives++; + player notify( "player_failed_revive" ); + } } -auto_revive( reviver, dont_enable_weapons ) +auto_revive( reviver, dont_enable_weapons ) //checked changed to match cerberus output { - if ( isdefined( self.revivetrigger ) ) - { - self.revivetrigger.auto_revive = 1; - - if ( self.revivetrigger.beingrevived == 1 ) - { - while ( true ) - { - if ( self.revivetrigger.beingrevived == 0 ) - break; - - wait_network_frame(); - } - } - - self.revivetrigger.auto_trigger = 0; - } - - self reviveplayer(); - self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); - setclientsysstate( "lsm", "0", self ); - self notify( "stop_revive_trigger" ); - - if ( isdefined( self.revivetrigger ) ) - { - self.revivetrigger delete(); - self.revivetrigger = undefined; - } - - self cleanup_suicide_hud(); - - if ( !isdefined( dont_enable_weapons ) || dont_enable_weapons == 0 ) - self laststand_enable_player_weapons(); - - self allowjump( 1 ); - self.ignoreme = 0; - self.laststand = undefined; - - if ( !( isdefined( level.isresetting_grief ) && level.isresetting_grief ) ) - { - reviver.revives++; - reviver maps\mp\zombies\_zm_stats::increment_client_stat( "revives" ); - reviver maps\mp\zombies\_zm_stats::increment_player_stat( "revives" ); - self recordplayerrevivezombies( reviver ); - maps\mp\_demo::bookmark( "zm_player_revived", gettime(), self, reviver ); - } - - self notify( "player_revived", reviver ); + if ( isDefined( self.revivetrigger ) ) + { + self.revivetrigger.auto_revive = 1; + while ( self.revivetrigger.beingrevived == 1 ) + { + while ( 1 ) + { + if ( self.revivetrigger.beingrevived == 0 ) + { + break; + } + wait_network_frame(); + } + } + self.revivetrigger.auto_trigger = 0; + } + self reviveplayer(); + self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); + setclientsysstate( "lsm", "0", self ); + self notify( "stop_revive_trigger" ); + if ( isDefined( self.revivetrigger ) ) + { + self.revivetrigger delete(); + self.revivetrigger = undefined; + } + self cleanup_suicide_hud(); + if ( !isDefined( dont_enable_weapons ) || dont_enable_weapons == 0 ) + { + self laststand_enable_player_weapons(); + } + self allowjump( 1 ); + self.ignoreme = 0; + self.laststand = undefined; + if ( !is_true( level.isresetting_grief ) ) + { + reviver.revives++; + reviver maps/mp/zombies/_zm_stats::increment_client_stat( "revives" ); + reviver maps/mp/zombies/_zm_stats::increment_player_stat( "revives" ); + self recordplayerrevivezombies( reviver ); + maps/mp/_demo::bookmark( "zm_player_revived", getTime(), self, reviver ); + } + self notify( "player_revived" ); } -remote_revive( reviver ) +remote_revive( reviver ) //checked matches cerberus output { - if ( !self player_is_in_laststand() ) - return; - - self auto_revive( reviver ); + if ( !self player_is_in_laststand() ) + { + return; + } + self auto_revive( reviver ); } -revive_success( reviver, b_track_stats ) +revive_success( reviver, b_track_stats ) //checked changed to match cerberus output { - if ( !isdefined( b_track_stats ) ) - b_track_stats = 1; - - if ( !isplayer( self ) ) - { - self notify( "player_revived", reviver ); - return; - } - - if ( isdefined( b_track_stats ) && b_track_stats ) - maps\mp\_demo::bookmark( "zm_player_revived", gettime(), self, reviver ); - - self notify( "player_revived", reviver ); - self reviveplayer(); - self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); - - if ( isdefined( self.pers_upgrades_awarded["perk_lose"] ) && self.pers_upgrades_awarded["perk_lose"] ) - self thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_restore(); - - if ( !( isdefined( level.isresetting_grief ) && level.isresetting_grief ) && ( isdefined( b_track_stats ) && b_track_stats ) ) - { - reviver.revives++; - reviver maps\mp\zombies\_zm_stats::increment_client_stat( "revives" ); - reviver maps\mp\zombies\_zm_stats::increment_player_stat( "revives" ); - self recordplayerrevivezombies( reviver ); - reviver.upgrade_fx_origin = self.origin; - } - - if ( is_classic() && ( isdefined( b_track_stats ) && b_track_stats ) ) - maps\mp\zombies\_zm_pers_upgrades_functions::pers_increment_revive_stat( reviver ); - - if ( isdefined( b_track_stats ) && b_track_stats ) - reviver thread check_for_sacrifice(); - - if ( isdefined( level.missioncallbacks ) ) - { - - } - - setclientsysstate( "lsm", "0", self ); - self.revivetrigger delete(); - self.revivetrigger = undefined; - self cleanup_suicide_hud(); - self laststand_enable_player_weapons(); - self.ignoreme = 0; + if ( !isDefined( b_track_stats ) ) + { + b_track_stats = 1; + } + if ( !isplayer( self ) ) + { + self notify( "player_revived", reviver ); + return; + } + if ( is_true( b_track_stats ) ) + { + maps/mp/_demo::bookmark( "zm_player_revived", getTime(), self, reviver ); + } + self notify( "player_revived", reviver ); + self reviveplayer(); + self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); + if ( is_true( self.pers_upgrades_awarded[ "perk_lose" ] ) ) + { + self thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_perk_lose_restore(); + } + if ( !is_true( level.isresetting_grief ) && is_true( b_track_stats ) ) + { + reviver.revives++; + reviver maps/mp/zombies/_zm_stats::increment_client_stat( "revives" ); + reviver maps/mp/zombies/_zm_stats::increment_player_stat( "revives" ); + self recordplayerrevivezombies( reviver ); + reviver.upgrade_fx_origin = self.origin; + } + if ( is_classic() && is_true( b_track_stats ) ) + { + maps/mp/zombies/_zm_pers_upgrades_functions::pers_increment_revive_stat( reviver ); + } + if ( is_true( b_track_stats ) ) + { + reviver thread check_for_sacrifice(); + } + setclientsysstate( "lsm", "0", self ); + self.revivetrigger delete(); + self.revivetrigger = undefined; + self cleanup_suicide_hud(); + self laststand_enable_player_weapons(); + self.ignoreme = 0; } -revive_force_revive( reviver ) +revive_force_revive( reviver ) //checked matches cerberus output { + /* /# - assert( isdefined( self ) ); + assert( isDefined( self ) ); #/ /# - assert( isplayer( self ) ); + assert( isplayer( self ) ); #/ /# - assert( self player_is_in_laststand() ); + assert( self player_is_in_laststand() ); #/ - self thread revive_success( reviver ); + */ + self thread revive_success( reviver ); } -revive_hud_create() +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.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.hidewheninmenu = 1; - self.revive_hud settext( "" ); - self.revive_hud.y = -160; + 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.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.hidewheninmenu = 1; + self.revive_hud settext( "" ); + self.revive_hud.y = -160; } -revive_hud_think() +revive_hud_think() //checked partially changed to match cerberus output //did not change while loops to for loops to prevent infinite loop bug due to continue { - self endon( "disconnect" ); - - while ( true ) - { - wait 0.1; - - if ( !player_any_player_in_laststand() ) - continue; - - players = get_players(); - playertorevive = undefined; - - for ( i = 0; i < players.size; i++ ) - { - if ( !isdefined( players[i].revivetrigger ) || !isdefined( players[i].revivetrigger.createtime ) ) - continue; - - if ( !isdefined( playertorevive ) || playertorevive.revivetrigger.createtime > players[i].revivetrigger.createtime ) - playertorevive = players[i]; - } - - if ( isdefined( playertorevive ) ) - { - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] player_is_in_laststand() ) - continue; - - if ( getdvar( "g_gametype" ) == "vs" ) - { - if ( players[i].team != playertorevive.team ) - continue; - } - - if ( is_encounter() ) - { - if ( players[i].sessionteam != playertorevive.sessionteam ) - continue; - - if ( isdefined( level.hide_revive_message ) && level.hide_revive_message ) - continue; - } - - players[i] thread faderevivemessageover( playertorevive, 3.0 ); - } - - playertorevive.revivetrigger.createtime = undefined; - wait 3.5; - } - } + self endon( "disconnect" ); + while ( 1 ) + { + wait 0.1; + if ( !player_any_player_in_laststand() ) + { + continue; + } + players = get_players(); + playertorevive = undefined; + i = 0; + while ( i < players.size ) + { + if ( !isDefined( players[ i ].revivetrigger ) || !isDefined( players[ i ].revivetrigger.createtime ) ) + { + i++; + continue; + } + if ( !isDefined( playertorevive ) || playertorevive.revivetrigger.createtime > players[ i ].revivetrigger.createtime ) + { + playertorevive = players[ i ]; + } + i++; + } + if ( isDefined( playertorevive ) ) + { + i = 0; + while ( i < players.size ) + { + if ( players[ i ] player_is_in_laststand() ) + { + i++; + continue; + } + if ( getDvar( "g_gametype" ) == "vs" ) + { + if ( players[ i ].team != playertorevive.team ) + { + i++; + continue; + } + } + if ( is_encounter() ) + { + if ( players[ i ].sessionteam != playertorevive.sessionteam ) + { + i++; + continue; + } + if ( is_true( level.hide_revive_message ) ) + { + i++; + continue; + } + } + players[ i ] thread faderevivemessageover( playertorevive, 3 ); + i++; + } + playertorevive.revivetrigger.createtime = undefined; + wait 3.5; + } + } } -faderevivemessageover( playertorevive, time ) +faderevivemessageover( playertorevive, time ) //checked matches cerberus output { - revive_hud_show(); - self.revive_hud settext( &"ZOMBIE_PLAYER_NEEDS_TO_BE_REVIVED", playertorevive ); - self.revive_hud fadeovertime( time ); - self.revive_hud.alpha = 0; + revive_hud_show(); + self.revive_hud settext( &"ZOMBIE_PLAYER_NEEDS_TO_BE_REVIVED", playertorevive ); + self.revive_hud fadeovertime( time ); + self.revive_hud.alpha = 0; } -revive_hud_show() +revive_hud_show() //checked matches cerberus output { + /* /# - assert( isdefined( self ) ); + assert( isDefined( self ) ); #/ /# - assert( isdefined( self.revive_hud ) ); + assert( isDefined( self.revive_hud ) ); #/ - self.revive_hud.alpha = 1; + */ + self.revive_hud.alpha = 1; } -revive_hud_show_n_fade( time ) +revive_hud_show_n_fade( time ) //checked matches cerberus output { - revive_hud_show(); - self.revive_hud fadeovertime( time ); - self.revive_hud.alpha = 0; + revive_hud_show(); + self.revive_hud fadeovertime( time ); + self.revive_hud.alpha = 0; } -drawcylinder( pos, rad, height ) +drawcylinder( pos, rad, height ) //checked matches cerberus output //may need to review order of operations { + /* /# - currad = rad; - curheight = height; - - for ( r = 0; r < 20; r++ ) - { - theta = r / 20 * 360; - theta2 = ( r + 1 ) / 20 * 360; - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); - } + currad = rad; + curheight = height; + r = 0; + while ( r < 20 ) + { + theta = ( r / 20 ) * 360; + theta2 = ( ( r + 1 ) / 20 ) * 360; + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); + r++; #/ + } + */ } -get_lives_remaining() +get_lives_remaining() //checked matches cerberus output { + /* /# - assert( level.laststandgetupallowed, "Lives only exist in the Laststand type GETUP." ); + assert( level.laststandgetupallowed, "Lives only exist in the Laststand type GETUP." ); #/ - if ( level.laststandgetupallowed && isdefined( self.laststand_info ) && isdefined( self.laststand_info.type_getup_lives ) ) - return max( 0, self.laststand_info.type_getup_lives ); - - return 0; + */ + if ( level.laststandgetupallowed && isDefined( self.laststand_info ) && isDefined( self.laststand_info.type_getup_lives ) ) + { + return max( 0, self.laststand_info.type_getup_lives ); + } + return 0; } -update_lives_remaining( increment ) +update_lives_remaining( increment ) //checked changed to match cerberus output //probably causes a crash since ternary operators may not be supported by the current compiler { + /* /# - assert( level.laststandgetupallowed, "Lives only exist in the Laststand type GETUP." ); + assert( level.laststandgetupallowed, "Lives only exist in the Laststand type GETUP." ); #/ /# - assert( isdefined( increment ), "Must specify increment true or false" ); + assert( isDefined( increment ), "Must specify increment true or false" ); #/ - increment = isdefined( increment ) ? increment : 0; - self.laststand_info.type_getup_lives = max( 0, increment ? self.laststand_info.type_getup_lives + 1 : self.laststand_info.type_getup_lives - 1 ); - self notify( "laststand_lives_updated" ); + */ + increment = (isdefined( increment )?increment:false ); + self.laststand_info.type_getup_lives = max( 0, ( increment?self.laststand_info.type_getup_lives + 1:self.laststand_info.type_getup_lives - 1 ) ); + self notify( "laststand_lives_updated", self.laststand_info.type_getup_lives + 1, increment ); } -player_getup_setup() +player_getup_setup() //checked matches cerberus output { + /* /# - println( "ZM >> player_getup_setup called" ); + println( "ZM >> player_getup_setup called" ); #/ - self.laststand_info = spawnstruct(); - self.laststand_info.type_getup_lives = level.const_laststand_getup_count_start; + */ + self.laststand_info = spawnstruct(); + self.laststand_info.type_getup_lives = level.const_laststand_getup_count_start; } -laststand_getup() +laststand_getup() //checked matches cerberus output { - self endon( "player_revived" ); - self endon( "disconnect" ); + self endon( "player_revived" ); + self endon( "disconnect" ); + /* /# - println( "ZM >> laststand_getup called" ); + println( "ZM >> laststand_getup called" ); #/ - self update_lives_remaining( 0 ); - setclientsysstate( "lsm", "1", self ); - self.laststand_info.getup_bar_value = level.const_laststand_getup_bar_start; - self thread laststand_getup_hud(); - self thread laststand_getup_damage_watcher(); - - while ( self.laststand_info.getup_bar_value < 1 ) - { - self.laststand_info.getup_bar_value += level.const_laststand_getup_bar_regen; - wait 0.05; - } - - self auto_revive( self ); - setclientsysstate( "lsm", "0", self ); + */ + self update_lives_remaining( 0 ); + setclientsysstate( "lsm", "1", self ); + self.laststand_info.getup_bar_value = level.const_laststand_getup_bar_start; + self thread laststand_getup_hud(); + self thread laststand_getup_damage_watcher(); + while ( self.laststand_info.getup_bar_value < 1 ) + { + self.laststand_info.getup_bar_value += level.const_laststand_getup_bar_regen; + wait 0.05; + } + self auto_revive( self ); + setclientsysstate( "lsm", "0", self ); } -laststand_getup_damage_watcher() +laststand_getup_damage_watcher() //checked matches cerberus output { - self endon( "player_revived" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "damage" ); - - self.laststand_info.getup_bar_value -= level.const_laststand_getup_bar_damage; - - if ( self.laststand_info.getup_bar_value < 0 ) - self.laststand_info.getup_bar_value = 0; - } + self endon( "player_revived" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "damage" ); + self.laststand_info.getup_bar_value -= level.const_laststand_getup_bar_damage; + if ( self.laststand_info.getup_bar_value < 0 ) + { + self.laststand_info.getup_bar_value = 0; + } + } } -laststand_getup_hud() +laststand_getup_hud() //checked matches cerberus output { - self endon( "player_revived" ); - self endon( "disconnect" ); - hudelem = newclienthudelem( self ); - hudelem.alignx = "left"; - hudelem.aligny = "middle"; - hudelem.horzalign = "left"; - hudelem.vertalign = "middle"; - hudelem.x = 5; - hudelem.y = 170; - hudelem.font = "big"; - hudelem.fontscale = 1.5; - hudelem.foreground = 1; - hudelem.hidewheninmenu = 1; - hudelem.hidewhendead = 1; - hudelem.sort = 2; - hudelem.label = &"SO_WAR_LASTSTAND_GETUP_BAR"; - self thread laststand_getup_hud_destroy( hudelem ); - - while ( true ) - { - hudelem setvalue( self.laststand_info.getup_bar_value ); - wait 0.05; - } + self endon( "player_revived" ); + self endon( "disconnect" ); + hudelem = newclienthudelem( self ); + hudelem.alignx = "left"; + hudelem.aligny = "middle"; + hudelem.horzalign = "left"; + hudelem.vertalign = "middle"; + hudelem.x = 5; + hudelem.y = 170; + hudelem.font = "big"; + hudelem.fontscale = 1.5; + hudelem.foreground = 1; + hudelem.hidewheninmenu = 1; + hudelem.hidewhendead = 1; + hudelem.sort = 2; + hudelem.label = &"SO_WAR_LASTSTAND_GETUP_BAR"; + self thread laststand_getup_hud_destroy( hudelem ); + while ( 1 ) + { + hudelem setvalue( self.laststand_info.getup_bar_value ); + wait 0.05; + } } -laststand_getup_hud_destroy( hudelem ) +laststand_getup_hud_destroy( hudelem ) //checked matches cerberus output { - self waittill_either( "player_revived", "disconnect" ); - hudelem destroy(); + self waittill_either( "player_revived", "disconnect" ); + hudelem destroy(); } -check_for_sacrifice() +check_for_sacrifice() //checked matches cerberus output { - self delay_notify( "sacrifice_denied", 1 ); - self endon( "sacrifice_denied" ); - - self waittill( "player_downed" ); - - self maps\mp\zombies\_zm_stats::increment_client_stat( "sacrifices" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "sacrifices" ); + self delay_notify( "sacrifice_denied", 1 ); + self endon( "sacrifice_denied" ); + self waittill( "player_downed" ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "sacrifices" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "sacrifices" ); } -check_for_failed_revive( playerbeingrevived ) +check_for_failed_revive( playerbeingrevived ) //checked matches cerberus output { - self endon( "disconnect" ); - playerbeingrevived endon( "disconnect" ); - playerbeingrevived endon( "player_suicide" ); - self notify( "checking_for_failed_revive" ); - self endon( "checking_for_failed_revive" ); - playerbeingrevived endon( "player_revived" ); - - playerbeingrevived waittill( "bled_out" ); - - self maps\mp\zombies\_zm_stats::increment_client_stat( "failed_revives" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "failed_revives" ); + self endon( "disconnect" ); + playerbeingrevived endon( "disconnect" ); + playerbeingrevived endon( "player_suicide" ); + self notify( "checking_for_failed_revive" ); + self endon( "checking_for_failed_revive" ); + playerbeingrevived endon( "player_revived" ); + playerbeingrevived waittill( "bled_out" ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "failed_revives" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "failed_revives" ); } -add_weighted_down() +add_weighted_down() //checked matches cerberus output { - if ( !level.curr_gametype_affects_rank ) - return; - - weighted_down = 1000; - - if ( level.round_number > 0 ) - weighted_down = int( 1000.0 / ceil( level.round_number / 5.0 ) ); - - self addplayerstat( "weighted_downs", weighted_down ); + if ( !level.curr_gametype_affects_rank ) + { + return; + } + weighted_down = 1000; + if ( level.round_number > 0 ) + { + weighted_down = int( 1000 / ceil( level.round_number / 5 ) ); + } + self addplayerstat( "weighted_downs", weighted_down ); } -cleanup_laststand_on_disconnect() +cleanup_laststand_on_disconnect() //checked matches cerberus output { - self endon( "player_revived" ); - self endon( "player_suicide" ); - self endon( "bled_out" ); - trig = self.revivetrigger; - - self waittill( "disconnect" ); - - if ( isdefined( trig ) ) - trig delete(); + self endon( "player_revived" ); + self endon( "player_suicide" ); + self endon( "bled_out" ); + trig = self.revivetrigger; + self waittill( "disconnect" ); + if ( isDefined( trig ) ) + { + trig delete(); + } } + + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox.gsc index 20e7048..ce8b15c 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox.gsc @@ -1,1542 +1,1620 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_magicbox_lock; -#include maps\mp\zombies\_zm_unitrigger; -#include maps\mp\zombies\_zm_audio_announcer; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\_demo; -#include maps\mp\zombies\_zm_stats; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/_demo; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_audio_announcer; +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; +#include maps/mp/zombies/_zm_magicbox_lock; -init() +init() //checked matches cerberus output { - if ( !isdefined( level.chest_joker_model ) ) - { - level.chest_joker_model = "zombie_teddybear"; - precachemodel( level.chest_joker_model ); - } - - if ( !isdefined( level.magic_box_zbarrier_state_func ) ) - level.magic_box_zbarrier_state_func = ::process_magic_box_zbarrier_state; - - if ( isdefined( level.using_locked_magicbox ) && level.using_locked_magicbox ) - maps\mp\zombies\_zm_magicbox_lock::init(); - - if ( is_classic() ) - { - level.chests = getstructarray( "treasure_chest_use", "targetname" ); - treasure_chest_init( "start_chest" ); - } - - if ( level.createfx_enabled ) - return; - - registerclientfield( "zbarrier", "magicbox_glow", 1000, 1, "int" ); - registerclientfield( "zbarrier", "zbarrier_show_sounds", 9000, 1, "int" ); - registerclientfield( "zbarrier", "zbarrier_leave_sounds", 9000, 1, "int" ); - - if ( !isdefined( level.magic_box_check_equipment ) ) - level.magic_box_check_equipment = ::default_magic_box_check_equipment; - - level thread magicbox_host_migration(); + if ( !isDefined( level.chest_joker_model ) ) + { + level.chest_joker_model = "zombie_teddybear"; + precachemodel( level.chest_joker_model ); + } + + if ( !isDefined( level.magic_box_zbarrier_state_func ) ) + { + level.magic_box_zbarrier_state_func = ::process_magic_box_zbarrier_state; + } + if ( is_true( level.using_locked_magicbox ) ) + { + maps/mp/zombies/_zm_magicbox_lock::init(); + } + if ( is_classic() ) + { + level.chests = getstructarray( "treasure_chest_use", "targetname" ); + treasure_chest_init( "start_chest" ); + } + if ( level.createfx_enabled ) + { + return; + } + registerclientfield( "zbarrier", "magicbox_glow", 1000, 1, "int" ); + registerclientfield( "zbarrier", "zbarrier_show_sounds", 9000, 1, "int" ); + registerclientfield( "zbarrier", "zbarrier_leave_sounds", 9000, 1, "int" ); + if ( !isDefined( level.magic_box_check_equipment ) ) + { + level.magic_box_check_equipment = ::default_magic_box_check_equipment; + } + level thread magicbox_host_migration(); } -treasure_chest_init( start_chest_name ) +treasure_chest_init( start_chest_name ) //checked changed to match cerberus output { - flag_init( "moving_chest_enabled" ); - flag_init( "moving_chest_now" ); - flag_init( "chest_has_been_used" ); - level.chest_moves = 0; - level.chest_level = 0; - - if ( level.chests.size == 0 ) - return; - - for ( i = 0; i < level.chests.size; i++ ) - { - level.chests[i].box_hacks = []; - level.chests[i].orig_origin = level.chests[i].origin; - level.chests[i] get_chest_pieces(); - - if ( isdefined( level.chests[i].zombie_cost ) ) - { - level.chests[i].old_cost = level.chests[i].zombie_cost; - continue; - } - - level.chests[i].old_cost = 950; - } - - if ( !level.enable_magic ) - { - foreach ( chest in level.chests ) - chest hide_chest(); - - return; - } - - level.chest_accessed = 0; - - if ( level.chests.size > 1 ) - { - flag_set( "moving_chest_enabled" ); - level.chests = array_randomize( level.chests ); - } - else - { - level.chest_index = 0; - level.chests[0].no_fly_away = 1; - } - - init_starting_chest_location( start_chest_name ); - array_thread( level.chests, ::treasure_chest_think ); + flag_init( "moving_chest_enabled" ); + flag_init( "moving_chest_now" ); + flag_init( "chest_has_been_used" ); + level.chest_moves = 0; + level.chest_level = 0; + if ( level.chests.size == 0 ) + { + return; + } + for ( i = 0; i < level.chests.size; i++ ) + { + level.chests[ i ].box_hacks = []; + level.chests[ i ].orig_origin = level.chests[ i ].origin; + level.chests[ i ] get_chest_pieces(); + if ( isDefined( level.chests[ i ].zombie_cost ) ) + { + level.chests[ i ].old_cost = level.chests[ i ].zombie_cost; + } + else + { + level.chests[ i ].old_cost = 950; + } + } + if ( !level.enable_magic ) + { + foreach( chest in level.chests ) + { + chest hide_chest(); + } + return; + } + level.chest_accessed = 0; + if ( level.chests.size > 1 ) + { + flag_set( "moving_chest_enabled" ); + level.chests = array_randomize( level.chests ); + } + else + { + level.chest_index = 0; + level.chests[ 0 ].no_fly_away = 1; + } + init_starting_chest_location( start_chest_name ); + array_thread( level.chests, ::treasure_chest_think ); } -init_starting_chest_location( start_chest_name ) +init_starting_chest_location( start_chest_name ) //checked changed to match cerberus output { - level.chest_index = 0; - start_chest_found = 0; - - if ( level.chests.size == 1 ) - { - start_chest_found = 1; - - if ( isdefined( level.chests[level.chest_index].zbarrier ) ) - level.chests[level.chest_index].zbarrier set_magic_box_zbarrier_state( "initial" ); - } - else - { - for ( i = 0; i < level.chests.size; i++ ) - { - if ( isdefined( level.random_pandora_box_start ) && level.random_pandora_box_start == 1 ) - { - if ( start_chest_found || isdefined( level.chests[i].start_exclude ) && level.chests[i].start_exclude == 1 ) - level.chests[i] hide_chest(); - else - { - level.chest_index = i; - level.chests[level.chest_index].hidden = 0; - - if ( isdefined( level.chests[level.chest_index].zbarrier ) ) - level.chests[level.chest_index].zbarrier set_magic_box_zbarrier_state( "initial" ); - - start_chest_found = 1; - } - - continue; - } - - if ( start_chest_found || !isdefined( level.chests[i].script_noteworthy ) || !issubstr( level.chests[i].script_noteworthy, start_chest_name ) ) - { - level.chests[i] hide_chest(); - continue; - } - - level.chest_index = i; - level.chests[level.chest_index].hidden = 0; - - if ( isdefined( level.chests[level.chest_index].zbarrier ) ) - level.chests[level.chest_index].zbarrier set_magic_box_zbarrier_state( "initial" ); - - start_chest_found = 1; - } - } - - if ( !isdefined( level.pandora_show_func ) ) - level.pandora_show_func = ::default_pandora_show_func; - - level.chests[level.chest_index] thread [[ level.pandora_show_func ]](); + level.chest_index = 0; + start_chest_found = 0; + if ( level.chests.size == 1 ) + { + start_chest_found = 1; + if ( isdefined( level.chests[ level.chest_index ].zbarrier ) ) + { + level.chests[ level.chest_index ].zbarrier set_magic_box_zbarrier_state( "initial" ); + } + } + else + { + for ( i = 0; i < level.chests.size; i++ ) + { + if ( isdefined( level.random_pandora_box_start ) && level.random_pandora_box_start == 1 ) + { + if ( start_chest_found || isdefined( level.chests[ i ].start_exclude ) && level.chests[ i ].start_exclude == 1 ) + { + level.chests[ i ] hide_chest(); + } + else + { + level.chest_index = i; + level.chests[ level.chest_index].hidden = 0; + if ( isdefined( level.chests[ level.chest_index ].zbarrier ) ) + { + level.chests[ level.chest_index ].zbarrier set_magic_box_zbarrier_state( "initial" ); + } + start_chest_found = 1; + } + } + else + { + if ( start_chest_found || !isdefined(level.chests[ i ].script_noteworthy) || !issubstr( level.chests[ i ].script_noteworthy, start_chest_name ) ) + { + level.chests[ i ] hide_chest(); + } + else + { + level.chest_index = i; + level.chests[ level.chest_index ].hidden = 0; + if ( isdefined( level.chests[ level.chest_index ].zbarrier ) ) + { + level.chests[ level.chest_index ].zbarrier set_magic_box_zbarrier_state( "initial" ); + } + start_chest_found = 1; + } + } + } + } + if ( !isdefined( level.pandora_show_func ) ) + { + level.pandora_show_func = ::default_pandora_show_func; + } + level.chests[ level.chest_index ] thread [[ level.pandora_show_func ]](); } -set_treasure_chest_cost( cost ) +set_treasure_chest_cost( cost ) //checked matches cerberus output { - level.zombie_treasure_chest_cost = cost; + level.zombie_treasure_chest_cost = cost; } -get_chest_pieces() +get_chest_pieces() //checked changed to match cerberus output { - self.chest_box = getent( self.script_noteworthy + "_zbarrier", "script_noteworthy" ); - self.chest_rubble = []; - rubble = getentarray( self.script_noteworthy + "_rubble", "script_noteworthy" ); - - for ( i = 0; i < rubble.size; i++ ) - { - if ( distancesquared( self.origin, rubble[i].origin ) < 10000 ) - self.chest_rubble[self.chest_rubble.size] = rubble[i]; - } - - self.zbarrier = getent( self.script_noteworthy + "_zbarrier", "script_noteworthy" ); - - if ( isdefined( self.zbarrier ) ) - { - self.zbarrier zbarrierpieceuseboxriselogic( 3 ); - self.zbarrier zbarrierpieceuseboxriselogic( 4 ); - } - - self.unitrigger_stub = spawnstruct(); - self.unitrigger_stub.origin = self.origin + anglestoright( self.angles ) * -22.5; - self.unitrigger_stub.angles = self.angles; - self.unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; - self.unitrigger_stub.script_width = 104; - self.unitrigger_stub.script_height = 50; - self.unitrigger_stub.script_length = 45; - self.unitrigger_stub.trigger_target = self; - unitrigger_force_per_player_triggers( self.unitrigger_stub, 1 ); - self.unitrigger_stub.prompt_and_visibility_func = ::boxtrigger_update_prompt; - self.zbarrier.owner = self; + self.chest_box = getent( self.script_noteworthy + "_zbarrier", "script_noteworthy" ); + self.chest_rubble = []; + rubble = getentarray( self.script_noteworthy + "_rubble", "script_noteworthy" ); + for ( i = 0; i < rubble.size; i++ ) + { + if ( distancesquared( self.origin, rubble[ i ].origin ) < 10000 ) + { + self.chest_rubble[ self.chest_rubble.size ] = rubble[ i ]; + } + } + self.zbarrier = getent( self.script_noteworthy + "_zbarrier", "script_noteworthy" ); + if ( isDefined( self.zbarrier ) ) + { + self.zbarrier zbarrierpieceuseboxriselogic( 3 ); + self.zbarrier zbarrierpieceuseboxriselogic( 4 ); + } + self.unitrigger_stub = spawnstruct(); + self.unitrigger_stub.origin = self.origin + ( anglesToRight( self.angles ) * -22.5 ); + self.unitrigger_stub.angles = self.angles; + self.unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + self.unitrigger_stub.script_width = 104; + self.unitrigger_stub.script_height = 50; + self.unitrigger_stub.script_length = 45; + self.unitrigger_stub.trigger_target = self; + unitrigger_force_per_player_triggers( self.unitrigger_stub, 1 ); + self.unitrigger_stub.prompt_and_visibility_func = ::boxtrigger_update_prompt; + self.zbarrier.owner = self; } -boxtrigger_update_prompt( player ) +boxtrigger_update_prompt( player ) //checked matches cerberus output { - can_use = self boxstub_update_prompt( player ); - - if ( isdefined( self.hint_string ) ) - { - if ( isdefined( self.hint_parm1 ) ) - self sethintstring( self.hint_string, self.hint_parm1 ); - else - self sethintstring( self.hint_string ); - } - - return can_use; + can_use = self boxstub_update_prompt( player ); + if ( isDefined( self.hint_string ) ) + { + if ( isDefined( self.hint_parm1 ) ) + { + self sethintstring( self.hint_string, self.hint_parm1 ); + } + else + { + self sethintstring( self.hint_string ); + } + } + return can_use; } -boxstub_update_prompt( player ) +boxstub_update_prompt( player ) //checked matches cerberus output { - self setcursorhint( "HINT_NOICON" ); - - if ( !self trigger_visible_to_player( player ) ) - return false; - - self.hint_parm1 = undefined; - - if ( isdefined( self.stub.trigger_target.grab_weapon_hint ) && self.stub.trigger_target.grab_weapon_hint ) - { - if ( isdefined( level.magic_box_check_equipment ) && [[ level.magic_box_check_equipment ]]( self.stub.trigger_target.grab_weapon_name ) ) - self.hint_string = &"ZOMBIE_TRADE_EQUIP"; - else - self.hint_string = &"ZOMBIE_TRADE_WEAPON"; - } - else if ( isdefined( level.using_locked_magicbox ) && level.using_locked_magicbox && ( isdefined( self.stub.trigger_target.is_locked ) && self.stub.trigger_target.is_locked ) ) - self.hint_string = get_hint_string( self, "locked_magic_box_cost" ); - else - { - self.hint_parm1 = self.stub.trigger_target.zombie_cost; - self.hint_string = get_hint_string( self, "default_treasure_chest" ); - } - - return true; + self setcursorhint( "HINT_NOICON" ); + if ( !self trigger_visible_to_player( player ) ) + { + return 0; + } + self.hint_parm1 = undefined; + if ( is_true( self.stub.trigger_target.grab_weapon_hint ) ) + { + if ( isDefined( level.magic_box_check_equipment ) && [[ level.magic_box_check_equipment ]]( self.stub.trigger_target.grab_weapon_name ) ) + { + self.hint_string = &"ZOMBIE_TRADE_EQUIP"; + } + else + { + self.hint_string = &"ZOMBIE_TRADE_WEAPON"; + } + } + else if ( is_true( level.using_locked_magicbox ) && is_true( self.stub.trigger_target.is_locked ) ) + { + self.hint_string = get_hint_string( self, "locked_magic_box_cost" ); + } + else + { + self.hint_parm1 = self.stub.trigger_target.zombie_cost; + self.hint_string = get_hint_string( self, "default_treasure_chest" ); + } + return 1; } -default_magic_box_check_equipment( weapon ) +default_magic_box_check_equipment( weapon ) //checked matches cerberus output { - return is_offhand_weapon( weapon ); + return is_offhand_weapon( weapon ); } -trigger_visible_to_player( player ) +trigger_visible_to_player( player ) //checked changed to match cerberus output { - self setinvisibletoplayer( player ); - visible = 1; - - if ( isdefined( self.stub.trigger_target.chest_user ) && !isdefined( self.stub.trigger_target.box_rerespun ) ) - { - if ( player != self.stub.trigger_target.chest_user || is_placeable_mine( self.stub.trigger_target.chest_user getcurrentweapon() ) || self.stub.trigger_target.chest_user hacker_active() ) - visible = 0; - } - else if ( !player can_buy_weapon() ) - visible = 0; - - if ( !visible ) - return false; - - self setvisibletoplayer( player ); - return true; + self setinvisibletoplayer( player ); + visible = 1; + if ( isDefined( self.stub.trigger_target.chest_user ) && !isDefined( self.stub.trigger_target.box_rerespun ) ) + { + if ( player != self.stub.trigger_target.chest_user || is_placeable_mine( self.stub.trigger_target.chest_user getcurrentweapon() ) || self.stub.trigger_target.chest_user hacker_active() ) + { + visible = 0; + } + } + else if ( !player can_buy_weapon() ) + { + visible = 0; + } + if ( !visible ) + { + return 0; + } + self setvisibletoplayer( player ); + return 1; } -magicbox_unitrigger_think() +magicbox_unitrigger_think() //checked changed to match cerberus output { - self endon( "kill_trigger" ); - - while ( true ) - { - self waittill( "trigger", player ); - - self.stub.trigger_target notify( "trigger", player ); - } + self endon( "kill_trigger" ); + while ( 1 ) + { + self waittill( "trigger", player ); + self.stub.trigger_target notify( "trigger", player ); + } } -play_crazi_sound() +play_crazi_sound() //checked matches cerberus output { - self playlocalsound( level.zmb_laugh_alias ); + self playlocalsound( level.zmb_laugh_alias ); } -show_chest_sound_thread() +show_chest_sound_thread() //checked matches cerberus output { - self.zbarrier setclientfield( "zbarrier_show_sounds", 1 ); - wait 1.0; - self.zbarrier setclientfield( "zbarrier_show_sounds", 0 ); + self.zbarrier setclientfield( "zbarrier_show_sounds", 1 ); + wait 1; + self.zbarrier setclientfield( "zbarrier_show_sounds", 0 ); } -show_chest() +show_chest() //checked matches cerberus output { - self.zbarrier set_magic_box_zbarrier_state( "arriving" ); - - self.zbarrier waittill( "arrived" ); - - self thread [[ level.pandora_show_func ]](); - thread maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think ); - self thread show_chest_sound_thread(); - self.hidden = 0; - - if ( isdefined( self.box_hacks["summon_box"] ) ) - self [[ self.box_hacks["summon_box"] ]]( 0 ); + self.zbarrier set_magic_box_zbarrier_state( "arriving" ); + self.zbarrier waittill( "arrived" ); + self thread [[ level.pandora_show_func ]](); + thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think ); + self thread show_chest_sound_thread(); + self.hidden = 0; + if ( isDefined( self.box_hacks[ "summon_box" ] ) ) + { + self [[ self.box_hacks[ "summon_box" ] ]]( 0 ); + } } -hide_chest_sound_thread() +hide_chest_sound_thread() //checked matches cerberus output { - self.zbarrier setclientfield( "zbarrier_leave_sounds", 1 ); - wait 1.0; - self.zbarrier setclientfield( "zbarrier_leave_sounds", 0 ); + self.zbarrier setclientfield( "zbarrier_leave_sounds", 1 ); + wait 1; + self.zbarrier setclientfield( "zbarrier_leave_sounds", 0 ); } -hide_chest( doboxleave ) +hide_chest( doboxleave ) //checked matches cerberus output { - if ( isdefined( self.unitrigger_stub ) ) - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); - - if ( isdefined( self.pandora_light ) ) - self.pandora_light delete(); - - self.hidden = 1; - - if ( isdefined( self.box_hacks ) && isdefined( self.box_hacks["summon_box"] ) ) - self [[ self.box_hacks["summon_box"] ]]( 1 ); - - if ( isdefined( self.zbarrier ) ) - { - if ( isdefined( doboxleave ) && doboxleave ) - { - self thread hide_chest_sound_thread(); - level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "boxmove" ); - self.zbarrier thread magic_box_zbarrier_leave(); - - self.zbarrier waittill( "left" ); - - playfx( level._effect["poltergeist"], self.zbarrier.origin, anglestoup( self.angles ), anglestoforward( self.angles ) ); - playsoundatposition( "zmb_box_poof", self.zbarrier.origin ); - } - else - self.zbarrier thread set_magic_box_zbarrier_state( "away" ); - } + if ( isDefined( self.unitrigger_stub ) ) + { + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); + } + if ( isDefined( self.pandora_light ) ) + { + self.pandora_light delete(); + } + self.hidden = 1; + if ( isDefined( self.box_hacks ) && isDefined( self.box_hacks[ "summon_box" ] ) ) + { + self [[ self.box_hacks[ "summon_box" ] ]]( 1 ); + } + if ( isDefined( self.zbarrier ) ) + { + if ( is_true( doboxleave ) ) + { + self thread hide_chest_sound_thread(); + level thread leaderdialog( "boxmove" ); + self.zbarrier thread magic_box_zbarrier_leave(); + self.zbarrier waittill( "left" ); + playfx( level._effect[ "poltergeist" ], self.zbarrier.origin, anglesToUp( self.angles ), anglesToForward( self.angles ) ); + playsoundatposition( "zmb_box_poof", self.zbarrier.origin ); + return; + } + else + { + self.zbarrier thread set_magic_box_zbarrier_state( "away" ); + } + } } -magic_box_zbarrier_leave() +magic_box_zbarrier_leave() //checked matches cerberus output { - self set_magic_box_zbarrier_state( "leaving" ); - - self waittill( "left" ); - - self set_magic_box_zbarrier_state( "away" ); + self set_magic_box_zbarrier_state( "leaving" ); + self waittill( "left" ); + self set_magic_box_zbarrier_state( "away" ); } -default_pandora_fx_func() +default_pandora_fx_func() //checked partially changed to match cerberus output { - self endon( "death" ); - self.pandora_light = spawn( "script_model", self.zbarrier.origin ); - self.pandora_light.angles = self.zbarrier.angles + vectorscale( ( -1, 0, -1 ), 90.0 ); - self.pandora_light setmodel( "tag_origin" ); - - if ( !( isdefined( level._box_initialized ) && level._box_initialized ) ) - { - flag_wait( "start_zombie_round_logic" ); - level._box_initialized = 1; - } - - wait 1; - - if ( isdefined( self ) && isdefined( self.pandora_light ) ) - playfxontag( level._effect["lght_marker"], self.pandora_light, "tag_origin" ); + self endon( "death" ); + self.pandora_light = spawn( "script_model", self.zbarrier.origin ); + self.pandora_light.angles = self.zbarrier.angles + vectorScale( ( -1, 0, -1 ), 90 ); + self.pandora_light setmodel( "tag_origin" ); + if ( !is_true( level._box_initialized ) ) + { + flag_wait( "start_zombie_round_logic" ); + level._box_initialized = 1; + } + wait 1; + if ( isDefined( self ) && isDefined( self.pandora_light ) ) + { + playfxontag( level._effect[ "lght_marker" ], self.pandora_light, "tag_origin" ); + } } -default_pandora_show_func( anchor, anchortarget, pieces ) +default_pandora_show_func( anchor, anchortarget, pieces ) //checked matches cerberus output { - if ( !isdefined( self.pandora_light ) ) - { - if ( !isdefined( level.pandora_fx_func ) ) - level.pandora_fx_func = ::default_pandora_fx_func; - - self thread [[ level.pandora_fx_func ]](); - } - - playfx( level._effect["lght_marker_flare"], self.pandora_light.origin ); + if ( !isDefined( self.pandora_light ) ) + { + if ( !isDefined( level.pandora_fx_func ) ) + { + level.pandora_fx_func = ::default_pandora_fx_func; + } + self thread [[ level.pandora_fx_func ]](); + } + playfx( level._effect[ "lght_marker_flare" ], self.pandora_light.origin ); } -unregister_unitrigger_on_kill_think() +unregister_unitrigger_on_kill_think() //checked matches cerberus output { - self notify( "unregister_unitrigger_on_kill_think" ); - self endon( "unregister_unitrigger_on_kill_think" ); - - self waittill( "kill_chest_think" ); - - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); + self notify( "unregister_unitrigger_on_kill_think" ); + self endon( "unregister_unitrigger_on_kill_think" ); + self waittill( "kill_chest_think" ); + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); } -treasure_chest_think() +treasure_chest_think() //checked changed to match cerberus output { - self endon( "kill_chest_think" ); - user = undefined; - user_cost = undefined; - self.box_rerespun = undefined; - self.weapon_out = undefined; - self thread unregister_unitrigger_on_kill_think(); + self endon( "kill_chest_think" ); + user = undefined; + user_cost = undefined; + self.box_rerespun = undefined; + self.weapon_out = undefined; - while ( true ) - { - if ( !isdefined( self.forced_user ) ) - { - self waittill( "trigger", user ); - - if ( user == level ) - continue; - } - else - user = self.forced_user; - - if ( user in_revive_trigger() ) - { - wait 0.1; - continue; - } - - if ( user.is_drinking > 0 ) - { - wait 0.1; - continue; - } - - if ( isdefined( self.disabled ) && self.disabled ) - { - wait 0.1; - continue; - } - - if ( user getcurrentweapon() == "none" ) - { - wait 0.1; - continue; - } - - reduced_cost = undefined; - - if ( is_player_valid( user ) && user maps\mp\zombies\_zm_pers_upgrades_functions::is_pers_double_points_active() ) - reduced_cost = int( self.zombie_cost / 2 ); - - if ( isdefined( level.using_locked_magicbox ) && level.using_locked_magicbox && ( isdefined( self.is_locked ) && self.is_locked ) ) - { - if ( user.score >= level.locked_magic_box_cost ) - { - user maps\mp\zombies\_zm_score::minus_to_player_score( level.locked_magic_box_cost ); - self.zbarrier set_magic_box_zbarrier_state( "unlocking" ); - self.unitrigger_stub run_visibility_function_for_all_triggers(); - } - else - user maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_box" ); - - wait 0.1; - continue; - } - else if ( isdefined( self.auto_open ) && is_player_valid( user ) ) - { - if ( !isdefined( self.no_charge ) ) - { - user maps\mp\zombies\_zm_score::minus_to_player_score( self.zombie_cost ); - user_cost = self.zombie_cost; - } - else - user_cost = 0; - - self.chest_user = user; - break; - } - else if ( is_player_valid( user ) && user.score >= self.zombie_cost ) - { - user maps\mp\zombies\_zm_score::minus_to_player_score( self.zombie_cost ); - user_cost = self.zombie_cost; - self.chest_user = user; - break; - } - else if ( isdefined( reduced_cost ) && user.score >= reduced_cost ) - { - user maps\mp\zombies\_zm_score::minus_to_player_score( reduced_cost ); - user_cost = reduced_cost; - self.chest_user = user; - break; - } - else if ( user.score < self.zombie_cost ) - { - play_sound_at_pos( "no_purchase", self.origin ); - user maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_box" ); - continue; - } - - wait 0.05; - } - - flag_set( "chest_has_been_used" ); - maps\mp\_demo::bookmark( "zm_player_use_magicbox", gettime(), user ); - user maps\mp\zombies\_zm_stats::increment_client_stat( "use_magicbox" ); - user maps\mp\zombies\_zm_stats::increment_player_stat( "use_magicbox" ); - - if ( isdefined( level._magic_box_used_vo ) ) - user thread [[ level._magic_box_used_vo ]](); - - self thread watch_for_emp_close(); - - if ( isdefined( level.using_locked_magicbox ) && level.using_locked_magicbox ) - self thread maps\mp\zombies\_zm_magicbox_lock::watch_for_lock(); - - self._box_open = 1; - self._box_opened_by_fire_sale = 0; - - if ( isdefined( level.zombie_vars["zombie_powerup_fire_sale_on"] ) && level.zombie_vars["zombie_powerup_fire_sale_on"] && !isdefined( self.auto_open ) && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) - self._box_opened_by_fire_sale = 1; - - if ( isdefined( self.chest_lid ) ) - self.chest_lid thread treasure_chest_lid_open(); - - if ( isdefined( self.zbarrier ) ) - { - play_sound_at_pos( "open_chest", self.origin ); - play_sound_at_pos( "music_chest", self.origin ); - self.zbarrier set_magic_box_zbarrier_state( "open" ); - } - - self.timedout = 0; - self.weapon_out = 1; - self.zbarrier thread treasure_chest_weapon_spawn( self, user ); - self.zbarrier thread treasure_chest_glowfx(); - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); - self.zbarrier waittill_any( "randomization_done", "box_hacked_respin" ); - - if ( flag( "moving_chest_now" ) && !self._box_opened_by_fire_sale && isdefined( user_cost ) ) - user maps\mp\zombies\_zm_score::add_to_player_score( user_cost, 0 ); - - if ( flag( "moving_chest_now" ) && !level.zombie_vars["zombie_powerup_fire_sale_on"] && !self._box_opened_by_fire_sale ) - self thread treasure_chest_move( self.chest_user ); - else - { - self.grab_weapon_hint = 1; - self.grab_weapon_name = self.zbarrier.weapon_string; - self.chest_user = user; - thread maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think ); - - if ( isdefined( self.zbarrier ) && !is_true( self.zbarrier.closed_by_emp ) ) - self thread treasure_chest_timeout(); - - while ( !( isdefined( self.closed_by_emp ) && self.closed_by_emp ) ) - { - self waittill( "trigger", grabber ); - - self.weapon_out = undefined; - - if ( isdefined( level.magic_box_grab_by_anyone ) && level.magic_box_grab_by_anyone ) - { - if ( isplayer( grabber ) ) - user = grabber; - } - - if ( isdefined( level.pers_upgrade_box_weapon ) && level.pers_upgrade_box_weapon ) - self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_box_weapon_used( user, grabber ); - - if ( isdefined( grabber.is_drinking ) && grabber.is_drinking > 0 ) - { - wait 0.1; - continue; - } - - if ( grabber == user && user getcurrentweapon() == "none" ) - { - wait 0.1; - continue; - } - - if ( grabber != level && ( isdefined( self.box_rerespun ) && self.box_rerespun ) ) - user = grabber; - - if ( grabber == user || grabber == level ) - { - self.box_rerespun = undefined; - current_weapon = "none"; - - if ( is_player_valid( user ) ) - current_weapon = user getcurrentweapon(); - - if ( grabber == user && is_player_valid( user ) && !( user.is_drinking > 0 ) && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && level.revive_tool != current_weapon ) - { - bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", user.name, user.score, level.round_number, self.zombie_cost, self.zbarrier.weapon_string, self.origin, "magic_accept" ); - self notify( "user_grabbed_weapon" ); - user notify( "user_grabbed_weapon" ); - user thread treasure_chest_give_weapon( self.zbarrier.weapon_string ); - maps\mp\_demo::bookmark( "zm_player_grabbed_magicbox", gettime(), user ); - user maps\mp\zombies\_zm_stats::increment_client_stat( "grabbed_from_magicbox" ); - user maps\mp\zombies\_zm_stats::increment_player_stat( "grabbed_from_magicbox" ); - break; - } - else if ( grabber == level ) - { - unacquire_weapon_toggle( self.zbarrier.weapon_string ); - self.timedout = 1; - - if ( is_player_valid( user ) ) - bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %S", user.name, user.score, level.round_number, self.zombie_cost, self.zbarrier.weapon_string, self.origin, "magic_reject" ); - - break; - } - } - - wait 0.05; - } - - self.grab_weapon_hint = 0; - self.zbarrier notify( "weapon_grabbed" ); - - if ( !( isdefined( self._box_opened_by_fire_sale ) && self._box_opened_by_fire_sale ) ) - level.chest_accessed += 1; - - if ( level.chest_moves > 0 && isdefined( level.pulls_since_last_ray_gun ) ) - level.pulls_since_last_ray_gun += 1; - - if ( isdefined( level.pulls_since_last_tesla_gun ) ) - level.pulls_since_last_tesla_gun += 1; - - thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); - - if ( isdefined( self.chest_lid ) ) - self.chest_lid thread treasure_chest_lid_close( self.timedout ); - - if ( isdefined( self.zbarrier ) ) - { - self.zbarrier set_magic_box_zbarrier_state( "close" ); - play_sound_at_pos( "close_chest", self.origin ); - - self.zbarrier waittill( "closed" ); - - wait 1; - } - else - wait 3.0; - - if ( isdefined( level.zombie_vars["zombie_powerup_fire_sale_on"] ) && level.zombie_vars["zombie_powerup_fire_sale_on"] && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() || self == level.chests[level.chest_index] ) - thread maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think ); - } - - self._box_open = 0; - self._box_opened_by_fire_sale = 0; - self.chest_user = undefined; - self notify( "chest_accessed" ); - self thread treasure_chest_think(); + self thread unregister_unitrigger_on_kill_think(); + while ( 1 ) + { + if ( !isdefined( self.forced_user ) ) + { + self waittill( "trigger", user ); + if ( user == level ) + { + wait 0.1; + continue; + } + } + else + { + user = self.forced_user; + } + if ( user in_revive_trigger() ) + { + wait 0.1; + continue; + } + if ( user.is_drinking > 0 ) + { + wait 0.1; + continue; + } + if ( is_true( self.disabled ) ) + { + wait 0.1; + continue; + } + if ( user getcurrentweapon() == "none" ) + { + wait 0.1; + continue; + } + reduced_cost = undefined; + if ( is_player_valid( user ) && user maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() ) + { + reduced_cost = int( self.zombie_cost / 2 ); + } + if ( is_true( level.using_locked_magicbox ) && is_true( self.is_locked ) ) + { + if ( user.score >= level.locked_magic_box_cost ) + { + user maps/mp/zombies/_zm_score::minus_to_player_score( level.locked_magic_box_cost ); + self.zbarrier set_magic_box_zbarrier_state( "unlocking" ); + self.unitrigger_stub run_visibility_function_for_all_triggers(); + } + else + { + user maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_box" ); + } + wait 0.1 ; + continue; + } + else if ( isdefined( self.auto_open ) && is_player_valid( user ) ) + { + if ( !isdefined( self.no_charge ) ) + { + user maps/mp/zombies/_zm_score::minus_to_player_score( self.zombie_cost ); + user_cost = self.zombie_cost; + } + else + { + user_cost = 0; + } + self.chest_user = user; + break; + } + else if ( is_player_valid( user ) && user.score >= self.zombie_cost ) + { + user maps/mp/zombies/_zm_score::minus_to_player_score( self.zombie_cost ); + user_cost = self.zombie_cost; + self.chest_user = user; + break; + } + else if ( isdefined( reduced_cost ) && user.score >= reduced_cost ) + { + user maps/mp/zombies/_zm_score::minus_to_player_score( reduced_cost ); + user_cost = reduced_cost; + self.chest_user = user; + break; + } + else if ( user.score < self.zombie_cost ) + { + play_sound_at_pos( "no_purchase", self.origin ); + user maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_box" ); + wait 0.1; + continue; + } + wait 0.05; + } + flag_set( "chest_has_been_used" ); + maps/mp/_demo::bookmark( "zm_player_use_magicbox", getTime(), user ); + user maps/mp/zombies/_zm_stats::increment_client_stat( "use_magicbox" ); + user maps/mp/zombies/_zm_stats::increment_player_stat( "use_magicbox" ); + if ( isDefined( level._magic_box_used_vo ) ) + { + user thread [[ level._magic_box_used_vo ]](); + } + self thread watch_for_emp_close(); + if ( is_true( level.using_locked_magicbox ) ) + { + self thread maps/mp/zombies/_zm_magicbox_lock::watch_for_lock(); + } + self._box_open = 1; + self._box_opened_by_fire_sale = 0; + if ( is_true( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) && !isDefined( self.auto_open ) && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) + { + self._box_opened_by_fire_sale = 1; + } + if ( isDefined( self.chest_lid ) ) + { + self.chest_lid thread treasure_chest_lid_open(); + } + if ( isDefined( self.zbarrier ) ) + { + play_sound_at_pos( "open_chest", self.origin ); + play_sound_at_pos( "music_chest", self.origin ); + self.zbarrier set_magic_box_zbarrier_state( "open" ); + } + self.timedout = 0; + self.weapon_out = 1; + self.zbarrier thread treasure_chest_weapon_spawn( self, user ); + self.zbarrier thread treasure_chest_glowfx(); + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); + self.zbarrier waittill_any( "randomization_done", "box_hacked_respin" ); + if ( flag( "moving_chest_now" ) && !self._box_opened_by_fire_sale && isDefined( user_cost ) ) + { + user maps/mp/zombies/_zm_score::add_to_player_score( user_cost, 0 ); + } + if ( flag( "moving_chest_now" ) && !level.zombie_vars[ "zombie_powerup_fire_sale_on" ] && !self._box_opened_by_fire_sale ) + { + self thread treasure_chest_move( self.chest_user ); + } + else + { + self.grab_weapon_hint = 1; + self.grab_weapon_name = self.zbarrier.weapon_string; + self.chest_user = user; + thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think ); + if ( isDefined( self.zbarrier ) && !is_true( self.zbarrier.closed_by_emp ) ) + { + self thread treasure_chest_timeout(); + } + while ( !is_true( self.closed_by_emp ) ) + { + self waittill( "trigger", grabber ); + self.weapon_out = undefined; + if ( is_true( level.magic_box_grab_by_anyone ) ) + { + if ( isplayer( grabber ) ) + { + user = grabber; + } + } + if ( is_true( level.pers_upgrade_box_weapon ) ) + { + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_box_weapon_used( user, grabber ); + } + if ( isDefined( grabber.is_drinking ) && grabber.is_drinking > 0 ) + { + wait 0.1; + continue; + } + if ( grabber == user && user getcurrentweapon() == "none" ) + { + wait 0.1; + continue; + } + if ( grabber != level && is_true( self.box_rerespun ) ) + { + user = grabber; + } + if ( grabber == user || grabber == level ) + { + self.box_rerespun = undefined; + current_weapon = "none"; + if ( is_player_valid( user ) ) + { + current_weapon = user getcurrentweapon(); + } + if ( grabber == user && is_player_valid( user ) && !user.is_drinking && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && level.revive_tool != current_weapon ) + { + bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", user.name, user.score, level.round_number, self.zombie_cost, self.zbarrier.weapon_string, self.origin, "magic_accept" ); + self notify( "user_grabbed_weapon" ); + user notify( "user_grabbed_weapon" ); + user thread treasure_chest_give_weapon( self.zbarrier.weapon_string ); + maps/mp/_demo::bookmark( "zm_player_grabbed_magicbox", getTime(), user ); + user maps/mp/zombies/_zm_stats::increment_client_stat( "grabbed_from_magicbox" ); + user maps/mp/zombies/_zm_stats::increment_player_stat( "grabbed_from_magicbox" ); + break; + } + else if ( grabber == level ) + { + unacquire_weapon_toggle( self.zbarrier.weapon_string ); + self.timedout = 1; + if ( is_player_valid( user ) ) + { + bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %S", user.name, user.score, level.round_number, self.zombie_cost, self.zbarrier.weapon_string, self.origin, "magic_reject" ); + } + break; + } + } + wait 0.05; + } + self.grab_weapon_hint = 0; + self.zbarrier notify( "weapon_grabbed" ); + if ( !is_true( self._box_opened_by_fire_sale ) ) + { + level.chest_accessed += 1; + } + if ( level.chest_moves > 0 && isDefined( level.pulls_since_last_ray_gun ) ) + { + level.pulls_since_last_ray_gun += 1; + } + if ( isDefined( level.pulls_since_last_tesla_gun ) ) + { + level.pulls_since_last_tesla_gun += 1; + } + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); + if ( isDefined( self.chest_lid ) ) + { + self.chest_lid thread treasure_chest_lid_close( self.timedout ); + } + if ( isDefined( self.zbarrier ) ) + { + self.zbarrier set_magic_box_zbarrier_state( "close" ); + play_sound_at_pos( "close_chest", self.origin ); + self.zbarrier waittill( "closed" ); + wait 1; + } + else + { + wait 3; + } + if ( is_true( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) || self [[ level._zombiemode_check_firesale_loc_valid_func ]]() || self == level.chests[ level.chest_index ] ) + { + thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think ); + } + } + self._box_open = 0; + self._box_opened_by_fire_sale = 0; + self.chest_user = undefined; + self notify( "chest_accessed" ); + self thread treasure_chest_think(); } -watch_for_emp_close() +watch_for_emp_close() //checked changed to match cerberus output { - self endon( "chest_accessed" ); - self.closed_by_emp = 0; - - if ( !should_watch_for_emp() ) - return; - - if ( isdefined( self.zbarrier ) ) - self.zbarrier.closed_by_emp = 0; - - while ( true ) - { - level waittill( "emp_detonate", origin, radius ); - - if ( distancesquared( origin, self.origin ) < radius * radius ) - break; - } - - if ( flag( "moving_chest_now" ) ) - return; - - self.closed_by_emp = 1; - - if ( isdefined( self.zbarrier ) ) - { - self.zbarrier.closed_by_emp = 1; - self.zbarrier notify( "box_hacked_respin" ); - - if ( isdefined( self.zbarrier.weapon_model ) ) - self.zbarrier.weapon_model notify( "kill_weapon_movement" ); - - if ( isdefined( self.zbarrier.weapon_model_dw ) ) - self.zbarrier.weapon_model_dw notify( "kill_weapon_movement" ); - } - - wait 0.1; - self notify( "trigger", level ); + self endon( "chest_accessed" ); + self.closed_by_emp = 0; + if ( !should_watch_for_emp() ) + { + return; + } + if ( isDefined( self.zbarrier ) ) + { + self.zbarrier.closed_by_emp = 0; + } + while ( 1 ) + { + level waittill( "emp_detonate", origin, radius ); + if ( distancesquared( origin, self.origin ) < ( radius * radius ) ) + { + break; + } + } + if ( flag( "moving_chest_now" ) ) + { + return; + } + self.closed_by_emp = 1; + if ( isDefined( self.zbarrier ) ) + { + self.zbarrier.closed_by_emp = 1; + self.zbarrier notify( "box_hacked_respin" ); + if ( isDefined( self.zbarrier.weapon_model ) ) + { + self.zbarrier.weapon_model notify( "kill_weapon_movement" ); + } + if ( isDefined( self.zbarrier.weapon_model_dw ) ) + { + self.zbarrier.weapon_model_dw notify( "kill_weapon_movement" ); + } + } + wait 0.1; + self notify( "trigger", level ); } -can_buy_weapon() +can_buy_weapon() //checked matches cerberus output { - if ( isdefined( self.is_drinking ) && self.is_drinking > 0 ) - return false; - - if ( self hacker_active() ) - return false; - - current_weapon = self getcurrentweapon(); - - if ( is_placeable_mine( current_weapon ) || is_equipment_that_blocks_purchase( current_weapon ) ) - return false; - - if ( self in_revive_trigger() ) - return false; - - if ( current_weapon == "none" ) - return false; - - return true; + if ( isDefined( self.is_drinking ) && self.is_drinking > 0 ) + { + return 0; + } + if ( self hacker_active() ) + { + return 0; + } + current_weapon = self getcurrentweapon(); + if ( is_placeable_mine( current_weapon ) || is_equipment_that_blocks_purchase( current_weapon ) ) + { + return 0; + } + if ( self in_revive_trigger() ) + { + return 0; + } + if ( current_weapon == "none" ) + { + return 0; + } + return 1; } -default_box_move_logic() +default_box_move_logic() //checked changed to match cerberus output { - index = -1; - - for ( i = 0; i < level.chests.size; i++ ) - { - if ( issubstr( level.chests[i].script_noteworthy, "move" + ( level.chest_moves + 1 ) ) && i != level.chest_index ) - { - index = i; - break; - } - } - - if ( index != -1 ) - level.chest_index = index; - else - level.chest_index++; - - if ( level.chest_index >= level.chests.size ) - { - temp_chest_name = level.chests[level.chest_index - 1].script_noteworthy; - level.chest_index = 0; - level.chests = array_randomize( level.chests ); - - if ( temp_chest_name == level.chests[level.chest_index].script_noteworthy ) - level.chest_index++; - } + index = -1; + for ( i = 0; i < level.chests.size; i++ ) + { + if ( issubstr( level.chests[ i ].script_noteworthy, "move" + level.chest_moves + 1 ) && i != level.chest_index ) + { + index = i; + break; + } + } + if ( index != -1 ) + { + level.chest_index = index; + } + else + { + level.chest_index++; + } + if ( level.chest_index >= level.chests.size ) + { + temp_chest_name = level.chests[ level.chest_index - 1 ].script_noteworthy; + level.chest_index = 0; + level.chests = array_randomize( level.chests ); + if ( temp_chest_name == level.chests[ level.chest_index ].script_noteworthy ) + { + level.chest_index++; + } + } } -treasure_chest_move( player_vox ) +treasure_chest_move( player_vox ) //checked changed to match cerberus output { - level waittill( "weapon_fly_away_start" ); - - players = get_players(); - array_thread( players, ::play_crazi_sound ); - - if ( isdefined( player_vox ) ) - player_vox delay_thread( randomintrange( 2, 7 ), maps\mp\zombies\_zm_audio::create_and_play_dialog, "general", "box_move" ); - - level waittill( "weapon_fly_away_end" ); - - if ( isdefined( self.zbarrier ) ) - self hide_chest( 1 ); - - wait 0.1; - post_selection_wait_duration = 7; - - if ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 1 && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) - { - current_sale_time = level.zombie_vars["zombie_powerup_fire_sale_time"]; - wait_network_frame(); - self thread fire_sale_fix(); - level.zombie_vars["zombie_powerup_fire_sale_time"] = current_sale_time; - - while ( level.zombie_vars["zombie_powerup_fire_sale_time"] > 0 ) - wait 0.1; - } - else - post_selection_wait_duration += 5; - - level.verify_chest = 0; - - if ( isdefined( level._zombiemode_custom_box_move_logic ) ) - [[ level._zombiemode_custom_box_move_logic ]](); - else - default_box_move_logic(); - - if ( isdefined( level.chests[level.chest_index].box_hacks["summon_box"] ) ) - level.chests[level.chest_index] [[ level.chests[level.chest_index].box_hacks["summon_box"] ]]( 0 ); - - wait( post_selection_wait_duration ); - playfx( level._effect["poltergeist"], level.chests[level.chest_index].zbarrier.origin ); - level.chests[level.chest_index] show_chest(); - flag_clear( "moving_chest_now" ); - self.zbarrier.chest_moving = 0; + level waittill( "weapon_fly_away_start" ); + players = get_players(); + array_thread( players, ::play_crazi_sound ); + if ( isDefined( player_vox ) ) + { + player_vox delay_thread( randomintrange( 2, 7 ), ::create_and_play_dialog, "general", "box_move" ); + } + level waittill( "weapon_fly_away_end" ); + if ( isDefined( self.zbarrier ) ) + { + self hide_chest( 1 ); + } + wait 0.1; + post_selection_wait_duration = 7; + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) + { + current_sale_time = level.zombie_vars[ "zombie_powerup_fire_sale_time" ]; + wait_network_frame(); + self thread fire_sale_fix(); + level.zombie_vars[ "zombie_powerup_fire_sale_time" ] = current_sale_time; + while ( level.zombie_vars[ "zombie_powerup_fire_sale_time" ] > 0 ) + { + wait 0.1; + } + } + else + { + post_selection_wait_duration += 5; + } + level.verify_chest = 0; + if ( isDefined( level._zombiemode_custom_box_move_logic ) ) + { + [[ level._zombiemode_custom_box_move_logic ]](); + } + else + { + default_box_move_logic(); + } + if ( isDefined( level.chests[ level.chest_index ].box_hacks[ "summon_box" ] ) ) + { + level.chests[ level.chest_index ] [[ level.chests[ level.chest_index ].box_hacks[ "summon_box" ] ]]( 0 ); + } + wait post_selection_wait_duration; + playfx( level._effect[ "poltergeist" ], level.chests[ level.chest_index ].zbarrier.origin ); + level.chests[ level.chest_index ] show_chest(); + flag_clear( "moving_chest_now" ); + self.zbarrier.chest_moving = 0; } -fire_sale_fix() +fire_sale_fix() //checked matches cerberus output { - if ( !isdefined( level.zombie_vars["zombie_powerup_fire_sale_on"] ) ) - return; - - if ( level.zombie_vars["zombie_powerup_fire_sale_on"] ) - { - self.old_cost = 950; - self thread show_chest(); - self.zombie_cost = 10; - self.unitrigger_stub unitrigger_set_hint_string( self, "default_treasure_chest", self.zombie_cost ); - wait_network_frame(); - - level waittill( "fire_sale_off" ); - - while ( isdefined( self._box_open ) && self._box_open ) - wait 0.1; - - self hide_chest( 1 ); - self.zombie_cost = self.old_cost; - } + if ( !isDefined( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) ) + { + return; + } + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) + { + self.old_cost = 950; + self thread show_chest(); + self.zombie_cost = 10; + self.unitrigger_stub unitrigger_set_hint_string( self, "default_treasure_chest", self.zombie_cost ); + wait_network_frame(); + level waittill( "fire_sale_off" ); + while ( is_true( self._box_open ) ) + { + wait 0.1; + } + self hide_chest( 1 ); + self.zombie_cost = self.old_cost; + } } -check_for_desirable_chest_location() +check_for_desirable_chest_location() //checked changed to match cerberus output { - if ( !isdefined( level.desirable_chest_location ) ) - return level.chest_index; - - if ( level.chests[level.chest_index].script_noteworthy == level.desirable_chest_location ) - { - level.desirable_chest_location = undefined; - return level.chest_index; - } - - for ( i = 0; i < level.chests.size; i++ ) - { - if ( level.chests[i].script_noteworthy == level.desirable_chest_location ) - { - level.desirable_chest_location = undefined; - return i; - } - } + if ( !isDefined( level.desirable_chest_location ) ) + { + return level.chest_index; + } + if ( level.chests[ level.chest_index ].script_noteworthy == level.desirable_chest_location ) + { + level.desirable_chest_location = undefined; + return level.chest_index; + } + for ( i = 0; i < level.chests.size; i++ ) + { + if ( level.chests[ i ].script_noteworthy == level.desirable_chest_location ) + { + level.desirable_chest_location = undefined; + return i; + } + } + /* /# - iprintln( level.desirable_chest_location + " is an invalid box location!" ); + iprintln( level.desirable_chest_location + " is an invalid box location!" ); #/ - level.desirable_chest_location = undefined; - return level.chest_index; + */ + level.desirable_chest_location = undefined; + return level.chest_index; } -rotateroll_box() +rotateroll_box() //checked matches cerberus output { - angles = 40; - angles2 = 0; - - while ( isdefined( self ) ) - { - self rotateroll( angles + angles2, 0.5 ); - wait 0.7; - angles2 = 40; - self rotateroll( angles * -2, 0.5 ); - wait 0.7; - } + angles = 40; + angles2 = 0; + while ( isDefined( self ) ) + { + self rotateroll( angles + angles2, 0.5 ); + wait 0.7; + angles2 = 40; + self rotateroll( angles * -2, 0.5 ); + wait 0.7; + } } -verify_chest_is_open() +verify_chest_is_open() //checked changed to match cerberus output { - for ( i = 0; i < level.open_chest_location.size; i++ ) - { - if ( isdefined( level.open_chest_location[i] ) ) - { - if ( level.open_chest_location[i] == level.chests[level.chest_index].script_noteworthy ) - { - level.verify_chest = 1; - return; - } - } - } - - level.verify_chest = 0; + for ( i = 0; i < level.open_chest_location.size; i++ ) + { + if ( isDefined( level.open_chest_location[ i ] ) ) + { + if ( level.open_chest_location[ i ] == level.chests[ level.chest_index ].script_noteworthy ) + { + level.verify_chest = 1; + return; + } + } + } + level.verify_chest = 0; } -treasure_chest_timeout() +treasure_chest_timeout() //checked changed to match cerberus output { - self endon( "user_grabbed_weapon" ); - self.zbarrier endon( "box_hacked_respin" ); - self.zbarrier endon( "box_hacked_rerespin" ); - wait 12; - self notify( "trigger", level ); + self endon( "user_grabbed_weapon" ); + self.zbarrier endon( "box_hacked_respin" ); + self.zbarrier endon( "box_hacked_rerespin" ); + wait 12; + self notify( "trigger", level ); } -treasure_chest_lid_open() +treasure_chest_lid_open() //checked matches cerberus output { - openroll = 105; - opentime = 0.5; - self rotateroll( 105, opentime, opentime * 0.5 ); - play_sound_at_pos( "open_chest", self.origin ); - play_sound_at_pos( "music_chest", self.origin ); + openroll = 105; + opentime = 0.5; + self rotateroll( 105, opentime, opentime * 0.5 ); + play_sound_at_pos( "open_chest", self.origin ); + play_sound_at_pos( "music_chest", self.origin ); } -treasure_chest_lid_close( timedout ) +treasure_chest_lid_close( timedout ) //checked matches cerberus output { - closeroll = -105; - closetime = 0.5; - self rotateroll( closeroll, closetime, closetime * 0.5 ); - play_sound_at_pos( "close_chest", self.origin ); - self notify( "lid_closed" ); + closeroll = -105; + closetime = 0.5; + self rotateroll( closeroll, closetime, closetime * 0.5 ); + play_sound_at_pos( "close_chest", self.origin ); + self notify( "lid_closed" ); } -treasure_chest_chooserandomweapon( player ) +treasure_chest_chooserandomweapon( player ) //checked matches cerberus output { - keys = getarraykeys( level.zombie_weapons ); - return keys[randomint( keys.size )]; + keys = getarraykeys( level.zombie_weapons ); + return keys[ randomint( keys.size ) ]; } -treasure_chest_canplayerreceiveweapon( player, weapon, pap_triggers ) +treasure_chest_canplayerreceiveweapon( player, weapon, pap_triggers ) //checked matches cerberus output { - if ( !get_is_in_box( weapon ) ) - return 0; - - if ( isdefined( player ) && player has_weapon_or_upgrade( weapon ) ) - return 0; - - if ( !limited_weapon_below_quota( weapon, player, pap_triggers ) ) - return 0; - - if ( !player player_can_use_content( weapon ) ) - return 0; - - if ( isdefined( level.custom_magic_box_selection_logic ) ) - { - if ( ![[ level.custom_magic_box_selection_logic ]]( weapon, player, pap_triggers ) ) - return 0; - } - - if ( isdefined( player ) && isdefined( level.special_weapon_magicbox_check ) ) - return player [[ level.special_weapon_magicbox_check ]]( weapon ); - - return 1; + if ( !get_is_in_box( weapon ) ) + { + return 0; + } + if ( isDefined( player ) && player has_weapon_or_upgrade( weapon ) ) + { + return 0; + } + if ( !limited_weapon_below_quota( weapon, player, pap_triggers ) ) + { + return 0; + } + if ( !player player_can_use_content( weapon ) ) + { + return 0; + } + if ( isDefined( level.custom_magic_box_selection_logic ) ) + { + if ( !( [[ level.custom_magic_box_selection_logic ]]( weapon, player, pap_triggers ) ) ) + { + return 0; + } + } + if ( isDefined( player ) && isDefined( level.special_weapon_magicbox_check ) ) + { + return player [[ level.special_weapon_magicbox_check ]]( weapon ); + } + return 1; } -treasure_chest_chooseweightedrandomweapon( player ) +treasure_chest_chooseweightedrandomweapon( player ) //checked changed to match cerberus output { - keys = array_randomize( getarraykeys( level.zombie_weapons ) ); - - if ( isdefined( level.customrandomweaponweights ) ) - keys = player [[ level.customrandomweaponweights ]]( keys ); + keys = array_randomize( getarraykeys( level.zombie_weapons ) ); + if ( isDefined( level.customrandomweaponweights ) ) + { + keys = player [[ level.customrandomweaponweights ]]( keys ); + } + /* /# - forced_weapon = getdvar( _hash_45ED7744 ); - - if ( forced_weapon != "" && isdefined( level.zombie_weapons[forced_weapon] ) ) - arrayinsert( keys, forced_weapon, 0 ); + forced_weapon = getDvar( "scr_force_weapon" ); + if ( forced_weapon != "" && isDefined( level.zombie_weapons[ forced_weapon ] ) ) + { + arrayinsert( keys, forced_weapon, 0 ); #/ - pap_triggers = getentarray( "specialty_weapupgrade", "script_noteworthy" ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( treasure_chest_canplayerreceiveweapon( player, keys[i], pap_triggers ) ) - return keys[i]; - } - - return keys[0]; + } + */ + pap_triggers = getentarray( "specialty_weapupgrade", "script_noteworthy" ); + for ( i = 0; i < keys.size; i++ ) + { + if ( treasure_chest_canplayerreceiveweapon( player, keys[ i ], pap_triggers ) ) + { + return keys[ i ]; + } + } + return keys[ 0 ]; } -weapon_is_dual_wield( name ) +weapon_is_dual_wield( name ) //checked matches cerberus output { - switch ( name ) - { - case "pm63_upgraded_zm": - case "microwavegundw_zm": - case "microwavegundw_upgraded_zm": - case "m1911_upgraded_zm": - case "hs10_upgraded_zm": - case "fivesevendw_zm": - case "fivesevendw_upgraded_zm": - case "cz75dw_zm": - case "cz75dw_upgraded_zm": - return true; - default: - return false; - } + switch( name ) + { + case "cz75dw_upgraded_zm": + case "cz75dw_zm": + case "fivesevendw_upgraded_zm": + case "fivesevendw_zm": + case "hs10_upgraded_zm": + case "m1911_upgraded_zm": + case "microwavegundw_upgraded_zm": + case "microwavegundw_zm": + case "pm63_upgraded_zm": + return 1; + default: + return 0; + } } -weapon_show_hint_choke() +weapon_show_hint_choke() //checked matches cerberus output { - for ( level._weapon_show_hint_choke = 0; 1; level._weapon_show_hint_choke = 0 ) - wait 0.05; + level._weapon_show_hint_choke = 0; + while ( 1 ) + { + wait 0.05; + level._weapon_show_hint_choke = 0; + } } -decide_hide_show_hint( endon_notify, second_endon_notify, onlyplayer ) +decide_hide_show_hint( endon_notify, second_endon_notify, onlyplayer ) //checked changed to match cerberus output { - self endon( "death" ); - - if ( isdefined( endon_notify ) ) - self endon( endon_notify ); - - if ( isdefined( second_endon_notify ) ) - self endon( second_endon_notify ); - - if ( !isdefined( level._weapon_show_hint_choke ) ) - level thread weapon_show_hint_choke(); - - use_choke = 0; - - if ( isdefined( level._use_choke_weapon_hints ) && level._use_choke_weapon_hints == 1 ) - use_choke = 1; - - while ( true ) - { - last_update = gettime(); - - if ( isdefined( self.chest_user ) && !isdefined( self.box_rerespun ) ) - { - if ( is_placeable_mine( self.chest_user getcurrentweapon() ) || self.chest_user hacker_active() ) - self setinvisibletoplayer( self.chest_user ); - else - self setvisibletoplayer( self.chest_user ); - } - else if ( isdefined( onlyplayer ) ) - { - if ( onlyplayer can_buy_weapon() ) - self setinvisibletoplayer( onlyplayer, 0 ); - else - self setinvisibletoplayer( onlyplayer, 1 ); - } - else - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] can_buy_weapon() ) - { - self setinvisibletoplayer( players[i], 0 ); - continue; - } - - self setinvisibletoplayer( players[i], 1 ); - } - } - - if ( use_choke ) - { - while ( level._weapon_show_hint_choke > 4 && gettime() < last_update + 150 ) - wait 0.05; - } - else - wait 0.1; - - level._weapon_show_hint_choke++; - } + self endon( "death" ); + if ( isDefined( endon_notify ) ) + { + self endon( endon_notify ); + } + if ( isDefined( second_endon_notify ) ) + { + self endon( second_endon_notify ); + } + if ( !isDefined( level._weapon_show_hint_choke ) ) + { + level thread weapon_show_hint_choke(); + } + use_choke = 0; + if ( isDefined( level._use_choke_weapon_hints ) && level._use_choke_weapon_hints == 1 ) + { + use_choke = 1; + } + while ( 1 ) + { + last_update = getTime(); + if ( isDefined( self.chest_user ) && !isDefined( self.box_rerespun ) ) + { + if ( is_placeable_mine( self.chest_user getcurrentweapon() ) || self.chest_user hacker_active() ) + { + self setinvisibletoplayer( self.chest_user ); + } + else + { + self setvisibletoplayer( self.chest_user ); + } + } + if ( isDefined( onlyplayer ) ) + { + if ( onlyplayer can_buy_weapon() ) + { + self setinvisibletoplayer( onlyplayer, 0 ); + } + else + { + self setinvisibletoplayer( onlyplayer, 1 ); + } + } + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ] can_buy_weapon() ) + { + self setinvisibletoplayer( players[ i ], 0 ); + i++; + continue; + } + self setinvisibletoplayer( players[ i ], 1 ); + i++; + } + if ( use_choke ) + { + while ( level._weapon_show_hint_choke > 4 && getTime() < ( last_update + 150 ) ) + { + wait 0.05; + } + } + else + { + wait 0.1; + } + level._weapon_show_hint_choke++; + } } -get_left_hand_weapon_model_name( name ) +get_left_hand_weapon_model_name( name ) //checked matches cerberus output { - switch ( name ) - { - case "microwavegundw_zm": - return getweaponmodel( "microwavegunlh_zm" ); - case "microwavegundw_upgraded_zm": - return getweaponmodel( "microwavegunlh_upgraded_zm" ); - default: - return getweaponmodel( name ); - } + switch( name ) + { + case "microwavegundw_zm": + return getweaponmodel( "microwavegunlh_zm" ); + case "microwavegundw_upgraded_zm": + return getweaponmodel( "microwavegunlh_upgraded_zm" ); + default: + return getweaponmodel( name ); + } } -clean_up_hacked_box() +clean_up_hacked_box() //checked matches cerberus output { - self waittill( "box_hacked_respin" ); - - self endon( "box_spin_done" ); - - if ( isdefined( self.weapon_model ) ) - { - self.weapon_model delete(); - self.weapon_model = undefined; - } - - if ( isdefined( self.weapon_model_dw ) ) - { - self.weapon_model_dw delete(); - self.weapon_model_dw = undefined; - } - - self hidezbarrierpiece( 3 ); - self hidezbarrierpiece( 4 ); - self setzbarrierpiecestate( 3, "closed" ); - self setzbarrierpiecestate( 4, "closed" ); + self waittill( "box_hacked_respin" ); + self endon( "box_spin_done" ); + if ( isDefined( self.weapon_model ) ) + { + self.weapon_model delete(); + self.weapon_model = undefined; + } + if ( isDefined( self.weapon_model_dw ) ) + { + self.weapon_model_dw delete(); + self.weapon_model_dw = undefined; + } + self hidezbarrierpiece( 3 ); + self hidezbarrierpiece( 4 ); + self setzbarrierpiecestate( 3, "closed" ); + self setzbarrierpiecestate( 4, "closed" ); } -treasure_chest_weapon_spawn( chest, player, respin ) +treasure_chest_weapon_spawn( chest, player, respin ) //checked changed to match cerberus output { - if ( isdefined( level.using_locked_magicbox ) && level.using_locked_magicbox ) - { - self.owner endon( "box_locked" ); - self thread maps\mp\zombies\_zm_magicbox_lock::clean_up_locked_box(); - } - - self endon( "box_hacked_respin" ); - self thread clean_up_hacked_box(); + if ( is_true( level.using_locked_magicbox ) ) + { + self.owner endon( "box_locked" ); + self thread maps/mp/zombies/_zm_magicbox_lock::clean_up_locked_box(); + } + self endon( "box_hacked_respin" ); + self thread clean_up_hacked_box(); + /* /# - assert( isdefined( player ) ); + assert( isDefined( player ) ); #/ - self.weapon_string = undefined; - modelname = undefined; - rand = undefined; - number_cycles = 40; + */ + self.weapon_string = undefined; + modelname = undefined; + rand = undefined; + number_cycles = 40; + if ( isDefined( chest.zbarrier ) ) + { + if ( isDefined( level.custom_magic_box_do_weapon_rise ) ) + { + chest.zbarrier thread [[ level.custom_magic_box_do_weapon_rise ]](); + } + else + { + chest.zbarrier thread magic_box_do_weapon_rise(); + } + } + for ( i = 0; i < number_cycles; i++ ) + { - if ( isdefined( chest.zbarrier ) ) - { - if ( isdefined( level.custom_magic_box_do_weapon_rise ) ) - chest.zbarrier thread [[ level.custom_magic_box_do_weapon_rise ]](); - else - chest.zbarrier thread magic_box_do_weapon_rise(); - } - - for ( i = 0; i < number_cycles; i++ ) - { - if ( i < 20 ) - { - wait 0.05; - continue; - } - - if ( i < 30 ) - { - wait 0.1; - continue; - } - - if ( i < 35 ) - { - wait 0.2; - continue; - } - - if ( i < 38 ) - wait 0.3; - } - - if ( isdefined( level.custom_magic_box_weapon_wait ) ) - [[ level.custom_magic_box_weapon_wait ]](); - - if ( isdefined( player.pers_upgrades_awarded["box_weapon"] ) && player.pers_upgrades_awarded["box_weapon"] ) - rand = maps\mp\zombies\_zm_pers_upgrades_functions::pers_treasure_chest_choosespecialweapon( player ); - else - rand = treasure_chest_chooseweightedrandomweapon( player ); - - self.weapon_string = rand; - wait 0.1; - - if ( isdefined( level.custom_magicbox_float_height ) ) - v_float = anglestoup( self.angles ) * level.custom_magicbox_float_height; - else - v_float = anglestoup( self.angles ) * 40; - - self.model_dw = undefined; - self.weapon_model = spawn_weapon_model( rand, undefined, self.origin + v_float, self.angles + vectorscale( ( 0, 1, 0 ), 180.0 ) ); - - if ( weapon_is_dual_wield( rand ) ) - self.weapon_model_dw = spawn_weapon_model( rand, get_left_hand_weapon_model_name( rand ), self.weapon_model.origin - vectorscale( ( 1, 1, 1 ), 3.0 ), self.weapon_model.angles ); - - if ( getdvar( _hash_39A6CD41 ) == "1" && !( isdefined( chest._box_opened_by_fire_sale ) && chest._box_opened_by_fire_sale ) && !( isdefined( level.zombie_vars["zombie_powerup_fire_sale_on"] ) && level.zombie_vars["zombie_powerup_fire_sale_on"] && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) ) - { - random = randomint( 100 ); - - if ( !isdefined( level.chest_min_move_usage ) ) - level.chest_min_move_usage = 4; - - if ( level.chest_accessed < level.chest_min_move_usage ) - chance_of_joker = -1; - else - { - chance_of_joker = level.chest_accessed + 20; - - if ( level.chest_moves == 0 && level.chest_accessed >= 8 ) - chance_of_joker = 100; - - if ( level.chest_accessed >= 4 && level.chest_accessed < 8 ) - { - if ( random < 15 ) - chance_of_joker = 100; - else - chance_of_joker = -1; - } - - if ( level.chest_moves > 0 ) - { - if ( level.chest_accessed >= 8 && level.chest_accessed < 13 ) - { - if ( random < 30 ) - chance_of_joker = 100; - else - chance_of_joker = -1; - } - - if ( level.chest_accessed >= 13 ) - { - if ( random < 50 ) - chance_of_joker = 100; - else - chance_of_joker = -1; - } - } - } - - if ( isdefined( chest.no_fly_away ) ) - chance_of_joker = -1; - - if ( isdefined( level._zombiemode_chest_joker_chance_override_func ) ) - chance_of_joker = [[ level._zombiemode_chest_joker_chance_override_func ]]( chance_of_joker ); - - if ( chance_of_joker > random ) - { - self.weapon_string = undefined; - self.weapon_model setmodel( level.chest_joker_model ); - self.weapon_model.angles = self.angles + vectorscale( ( 0, 1, 0 ), 90.0 ); - - if ( isdefined( self.weapon_model_dw ) ) - { - self.weapon_model_dw delete(); - self.weapon_model_dw = undefined; - } - - self.chest_moving = 1; - flag_set( "moving_chest_now" ); - level.chest_accessed = 0; - level.chest_moves++; - } - } - - self notify( "randomization_done" ); - - if ( flag( "moving_chest_now" ) && !( level.zombie_vars["zombie_powerup_fire_sale_on"] && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) ) - { - if ( isdefined( level.chest_joker_custom_movement ) ) - self [[ level.chest_joker_custom_movement ]](); - else - { - wait 0.5; - level notify( "weapon_fly_away_start" ); - wait 2; - - if ( isdefined( self.weapon_model ) ) - { - v_fly_away = self.origin + anglestoup( self.angles ) * 500; - self.weapon_model moveto( v_fly_away, 4, 3 ); - } - - if ( isdefined( self.weapon_model_dw ) ) - { - v_fly_away = self.origin + anglestoup( self.angles ) * 500; - self.weapon_model_dw moveto( v_fly_away, 4, 3 ); - } - - self.weapon_model waittill( "movedone" ); - - self.weapon_model delete(); - - if ( isdefined( self.weapon_model_dw ) ) - { - self.weapon_model_dw delete(); - self.weapon_model_dw = undefined; - } - - self notify( "box_moving" ); - level notify( "weapon_fly_away_end" ); - } - } - else - { - acquire_weapon_toggle( rand, player ); - - if ( rand == "tesla_gun_zm" || rand == "ray_gun_zm" ) - { - if ( rand == "ray_gun_zm" ) - level.pulls_since_last_ray_gun = 0; - - if ( rand == "tesla_gun_zm" ) - { - level.pulls_since_last_tesla_gun = 0; - level.player_seen_tesla_gun = 1; - } - } - - if ( !isdefined( respin ) ) - { - if ( isdefined( chest.box_hacks["respin"] ) ) - self [[ chest.box_hacks["respin"] ]]( chest, player ); - } - else if ( isdefined( chest.box_hacks["respin_respin"] ) ) - self [[ chest.box_hacks["respin_respin"] ]]( chest, player ); - - if ( isdefined( level.custom_magic_box_timer_til_despawn ) ) - self.weapon_model thread [[ level.custom_magic_box_timer_til_despawn ]]( self ); - else - self.weapon_model thread timer_til_despawn( v_float ); - - if ( isdefined( self.weapon_model_dw ) ) - { - if ( isdefined( level.custom_magic_box_timer_til_despawn ) ) - self.weapon_model_dw thread [[ level.custom_magic_box_timer_til_despawn ]]( self ); - else - self.weapon_model_dw thread timer_til_despawn( v_float ); - } - - self waittill( "weapon_grabbed" ); - - if ( !chest.timedout ) - { - if ( isdefined( self.weapon_model ) ) - self.weapon_model delete(); - - if ( isdefined( self.weapon_model_dw ) ) - self.weapon_model_dw delete(); - } - } - - self.weapon_string = undefined; - self notify( "box_spin_done" ); + if ( i < 20 ) + { + wait 0.05 ; + } + else if ( i < 30 ) + { + wait 0.1 ; + } + else if ( i < 35 ) + { + wait 0.2 ; + } + else if ( i < 38 ) + { + wait 0.3 ; + } + } + if ( isDefined( level.custom_magic_box_weapon_wait ) ) + { + [[ level.custom_magic_box_weapon_wait ]](); + } + if ( is_true( player.pers_upgrades_awarded[ "box_weapon" ] ) ) + { + rand = maps/mp/zombies/_zm_pers_upgrades_functions::pers_treasure_chest_choosespecialweapon( player ); + } + else + { + rand = treasure_chest_chooseweightedrandomweapon( player ); + } + + self.weapon_string = rand; + wait 0.1; + if ( isDefined( level.custom_magicbox_float_height ) ) + { + v_float = anglesToUp( self.angles ) * level.custom_magicbox_float_height; + } + else + { + v_float = anglesToUp( self.angles ) * 40; + } + self.model_dw = undefined; + self.weapon_model = spawn_weapon_model( rand, undefined, self.origin + v_float, self.angles + vectorScale( ( 0, 1, 0 ), 180 ) ); + if ( weapon_is_dual_wield( rand ) ) + { + self.weapon_model_dw = spawn_weapon_model( rand, get_left_hand_weapon_model_name( rand ), self.weapon_model.origin - vectorScale( ( 0, 1, 0 ), 3 ), self.weapon_model.angles ); + } + if ( getDvar( "magic_chest_movable" ) == "1" && !is_true( chest._box_opened_by_fire_sale ) && !is_true( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) + { + random = randomint( 100 ); + if ( !isDefined( level.chest_min_move_usage ) ) + { + level.chest_min_move_usage = 4; + } + if ( level.chest_accessed < level.chest_min_move_usage ) + { + chance_of_joker = -1; + } + else + { + chance_of_joker = level.chest_accessed + 20; + if ( level.chest_moves == 0 && level.chest_accessed >= 8 ) + { + chance_of_joker = 100; + } + if ( level.chest_accessed >= 4 && level.chest_accessed < 8 ) + { + if ( random < 15 ) + { + chance_of_joker = 100; + } + else + { + chance_of_joker = -1; + } + } + if ( level.chest_moves > 0 ) + { + if ( level.chest_accessed >= 8 && level.chest_accessed < 13 ) + { + if ( random < 30 ) + { + chance_of_joker = 100; + } + else + { + chance_of_joker = -1; + } + } + if ( level.chest_accessed >= 13 ) + { + if ( random < 50 ) + { + chance_of_joker = 100; + } + else + { + chance_of_joker = -1; + } + } + } + } + if ( isDefined( chest.no_fly_away ) ) + { + chance_of_joker = -1; + } + if ( isDefined( level._zombiemode_chest_joker_chance_override_func ) ) + { + chance_of_joker = [[ level._zombiemode_chest_joker_chance_override_func ]]( chance_of_joker ); + } + if ( chance_of_joker > random ) + { + self.weapon_string = undefined; + self.weapon_model setmodel( level.chest_joker_model ); + self.weapon_model.angles = self.angles + vectorScale( ( 0, 1, 0 ), 90 ); + if ( isDefined( self.weapon_model_dw ) ) + { + self.weapon_model_dw delete(); + self.weapon_model_dw = undefined; + } + self.chest_moving = 1; + flag_set( "moving_chest_now" ); + level.chest_accessed = 0; + level.chest_moves++; + } + } + self notify( "randomization_done" ); + if ( flag( "moving_chest_now" ) && !level.zombie_vars[ "zombie_powerup_fire_sale_on" ] && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) + { + if ( isDefined( level.chest_joker_custom_movement ) ) + { + self [[ level.chest_joker_custom_movement ]](); + } + else + { + wait 0.5; + level notify( "weapon_fly_away_start" ); + wait 2; + if ( isDefined( self.weapon_model ) ) + { + v_fly_away = self.origin + ( anglesToUp( self.angles ) * 500 ); + self.weapon_model moveto( v_fly_away, 4, 3 ); + } + if ( isDefined( self.weapon_model_dw ) ) + { + v_fly_away = self.origin + ( anglesToUp( self.angles ) * 500 ); + self.weapon_model_dw moveto( v_fly_away, 4, 3 ); + } + self.weapon_model waittill( "movedone" ); + self.weapon_model delete(); + if ( isDefined( self.weapon_model_dw ) ) + { + self.weapon_model_dw delete(); + self.weapon_model_dw = undefined; + } + self notify( "box_moving" ); + level notify( "weapon_fly_away_end" ); + } + } + else + { + acquire_weapon_toggle( rand, player ); + if ( rand == "tesla_gun_zm" || rand == "ray_gun_zm" ) + { + if ( rand == "ray_gun_zm" ) + { + level.pulls_since_last_ray_gun = 0; + } + if ( rand == "tesla_gun_zm" ) + { + level.pulls_since_last_tesla_gun = 0; + level.player_seen_tesla_gun = 1; + } + } + if ( !isDefined( respin ) ) + { + if ( isDefined( chest.box_hacks[ "respin" ] ) ) + { + self [[ chest.box_hacks[ "respin" ] ]]( chest, player ); + } + } + else + { + if ( isDefined( chest.box_hacks[ "respin_respin" ] ) ) + { + self [[ chest.box_hacks[ "respin_respin" ] ]]( chest, player ); + } + } + if ( isDefined( level.custom_magic_box_timer_til_despawn ) ) + { + self.weapon_model thread [[ level.custom_magic_box_timer_til_despawn ]]( self ); + } + else + { + self.weapon_model thread timer_til_despawn( v_float ); + } + if ( isDefined( self.weapon_model_dw ) ) + { + if ( isDefined( level.custom_magic_box_timer_til_despawn ) ) + { + self.weapon_model_dw thread [[ level.custom_magic_box_timer_til_despawn ]]( self ); + } + else + { + self.weapon_model_dw thread timer_til_despawn( v_float ); + } + } + self waittill( "weapon_grabbed" ); + if ( !chest.timedout ) + { + if ( isDefined( self.weapon_model ) ) + { + self.weapon_model delete(); + } + if ( isDefined( self.weapon_model_dw ) ) + { + self.weapon_model_dw delete(); + } + } + } + self.weapon_string = undefined; + self notify( "box_spin_done" ); } -chest_get_min_usage() +chest_get_min_usage() //checked matches cerberus output { - min_usage = 4; - return min_usage; + min_usage = 4; + return min_usage; } -chest_get_max_usage() +chest_get_max_usage() //checked matches cerberus output { - max_usage = 6; - players = get_players(); - - if ( level.chest_moves == 0 ) - { - if ( players.size == 1 ) - max_usage = 3; - else if ( players.size == 2 ) - max_usage = 4; - else if ( players.size == 3 ) - max_usage = 5; - else - max_usage = 6; - } - else if ( players.size == 1 ) - max_usage = 4; - else if ( players.size == 2 ) - max_usage = 4; - else if ( players.size == 3 ) - max_usage = 5; - else - max_usage = 7; - - return max_usage; + max_usage = 6; + players = get_players(); + if ( level.chest_moves == 0 ) + { + if ( players.size == 1 ) + { + max_usage = 3; + } + else if ( players.size == 2 ) + { + max_usage = 4; + } + else if ( players.size == 3 ) + { + max_usage = 5; + } + else + { + max_usage = 6; + } + } + else if ( players.size == 1 ) + { + max_usage = 4; + } + else if ( players.size == 2 ) + { + max_usage = 4; + } + else if ( players.size == 3 ) + { + max_usage = 5; + } + else + { + max_usage = 7; + } + return max_usage; } -timer_til_despawn( v_float ) +timer_til_despawn( v_float ) //checked matches cerberus output { - self endon( "kill_weapon_movement" ); - putbacktime = 12; - self moveto( self.origin - v_float * 0.85, putbacktime, putbacktime * 0.5 ); - wait( putbacktime ); - - if ( isdefined( self ) ) - self delete(); + self endon( "kill_weapon_movement" ); + putbacktime = 12; + self moveto( self.origin - ( v_float * 0.85 ), putbacktime, putbacktime * 0.5 ); + wait putbacktime; + if ( isDefined( self ) ) + { + self delete(); + } } -treasure_chest_glowfx() +treasure_chest_glowfx() //checked matches cerberus output { - self setclientfield( "magicbox_glow", 1 ); - self waittill_any( "weapon_grabbed", "box_moving" ); - self setclientfield( "magicbox_glow", 0 ); + self setclientfield( "magicbox_glow", 1 ); + self waittill_any( "weapon_grabbed", "box_moving" ); + self setclientfield( "magicbox_glow", 0 ); } -treasure_chest_give_weapon( weapon_string ) +treasure_chest_give_weapon( weapon_string ) //checked matches cerberus output { - self.last_box_weapon = gettime(); - self maps\mp\zombies\_zm_weapons::weapon_give( weapon_string, 0, 1 ); + self.last_box_weapon = getTime(); + self maps/mp/zombies/_zm_weapons::weapon_give( weapon_string, 0, 1 ); } -magic_box_teddy_twitches() +magic_box_teddy_twitches() //checked matches cerberus output { - self endon( "zbarrier_state_change" ); - self setzbarrierpiecestate( 0, "closed" ); - - while ( true ) - { - wait( randomfloatrange( 180, 1800 ) ); - self setzbarrierpiecestate( 0, "opening" ); - wait( randomfloatrange( 180, 1800 ) ); - self setzbarrierpiecestate( 0, "closing" ); - } + self endon( "zbarrier_state_change" ); + self setzbarrierpiecestate( 0, "closed" ); + while ( 1 ) + { + wait randomfloatrange( 180, 1800 ); + self setzbarrierpiecestate( 0, "opening" ); + wait randomfloatrange( 180, 1800 ); + self setzbarrierpiecestate( 0, "closing" ); + } } -magic_box_initial() +magic_box_initial() //checked matches cerberus output { - self setzbarrierpiecestate( 1, "open" ); + self setzbarrierpiecestate( 1, "open" ); } magic_box_arrives() { - self setzbarrierpiecestate( 1, "opening" ); - - while ( self getzbarrierpiecestate( 1 ) == "opening" ) - wait 0.05; - - self notify( "arrived" ); + self setzbarrierpiecestate( 1, "opening" ); + while ( self getzbarrierpiecestate( 1 ) == "opening" ) + { + wait 0.05; + } + self notify( "arrived" ); } -magic_box_leaves() +magic_box_leaves() //checked matches cerberus output { - self setzbarrierpiecestate( 1, "closing" ); - - while ( self getzbarrierpiecestate( 1 ) == "closing" ) - wait 0.1; - - self notify( "left" ); + self setzbarrierpiecestate( 1, "closing" ); + while ( self getzbarrierpiecestate( 1 ) == "closing" ) + { + wait 0.1; + } + self notify( "left" ); } -magic_box_opens() +magic_box_opens() //checked matches cerberus output { - self setzbarrierpiecestate( 2, "opening" ); - - while ( self getzbarrierpiecestate( 2 ) == "opening" ) - wait 0.1; - - self notify( "opened" ); + self setzbarrierpiecestate( 2, "opening" ); + while ( self getzbarrierpiecestate( 2 ) == "opening" ) + { + wait 0.1; + } + self notify( "opened" ); } -magic_box_closes() +magic_box_closes() //checked matches cerberus output { - self setzbarrierpiecestate( 2, "closing" ); - - while ( self getzbarrierpiecestate( 2 ) == "closing" ) - wait 0.1; - - self notify( "closed" ); + self setzbarrierpiecestate( 2, "closing" ); + while ( self getzbarrierpiecestate( 2 ) == "closing" ) + { + wait 0.1; + } + self notify( "closed" ); } -magic_box_do_weapon_rise() +magic_box_do_weapon_rise() //checked matches cerberus output { - self endon( "box_hacked_respin" ); - self setzbarrierpiecestate( 3, "closed" ); - self setzbarrierpiecestate( 4, "closed" ); - wait_network_frame(); - self zbarrierpieceuseboxriselogic( 3 ); - self zbarrierpieceuseboxriselogic( 4 ); - self showzbarrierpiece( 3 ); - self showzbarrierpiece( 4 ); - self setzbarrierpiecestate( 3, "opening" ); - self setzbarrierpiecestate( 4, "opening" ); - - while ( self getzbarrierpiecestate( 3 ) != "open" ) - wait 0.5; - - self hidezbarrierpiece( 3 ); - self hidezbarrierpiece( 4 ); + self endon( "box_hacked_respin" ); + self setzbarrierpiecestate( 3, "closed" ); + self setzbarrierpiecestate( 4, "closed" ); + wait_network_frame(); + self zbarrierpieceuseboxriselogic( 3 ); + self zbarrierpieceuseboxriselogic( 4 ); + self showzbarrierpiece( 3 ); + self showzbarrierpiece( 4 ); + self setzbarrierpiecestate( 3, "opening" ); + self setzbarrierpiecestate( 4, "opening" ); + while ( self getzbarrierpiecestate( 3 ) != "open" ) + { + wait 0.5; + } + self hidezbarrierpiece( 3 ); + self hidezbarrierpiece( 4 ); } -magic_box_do_teddy_flyaway() +magic_box_do_teddy_flyaway() //checked matches cerberus output { - self showzbarrierpiece( 3 ); - self setzbarrierpiecestate( 3, "closing" ); + self showzbarrierpiece( 3 ); + self setzbarrierpiecestate( 3, "closing" ); } -is_chest_active() +is_chest_active() //checked matches cerberus output { - curr_state = self.zbarrier get_magic_box_zbarrier_state(); - - if ( flag( "moving_chest_now" ) ) - return false; - - if ( curr_state == "open" || curr_state == "close" ) - return true; - - return false; + curr_state = self.zbarrier get_magic_box_zbarrier_state(); + if ( flag( "moving_chest_now" ) ) + { + return 0; + } + if ( curr_state == "open" || curr_state == "close" ) + { + return 1; + } + return 0; } -get_magic_box_zbarrier_state() +get_magic_box_zbarrier_state() //checked matches cerberus output { - return self.state; + return self.state; } -set_magic_box_zbarrier_state( state ) +set_magic_box_zbarrier_state( state ) //checked changed to match cerberus output { - for ( i = 0; i < self getnumzbarrierpieces(); i++ ) - self hidezbarrierpiece( i ); - - self notify( "zbarrier_state_change" ); - self [[ level.magic_box_zbarrier_state_func ]]( state ); + for ( i = 0; i < self getnumzbarrierpieces(); i++ ) + { + self hidezbarrierpiece( i ); + } + self notify( "zbarrier_state_change" ); + self [[ level.magic_box_zbarrier_state_func ]]( state ); } -process_magic_box_zbarrier_state( state ) +process_magic_box_zbarrier_state( state ) //checked matches cerberus output { - switch ( state ) - { - case "away": - self showzbarrierpiece( 0 ); - self thread magic_box_teddy_twitches(); - self.state = "away"; - break; - case "arriving": - self showzbarrierpiece( 1 ); - self thread magic_box_arrives(); - self.state = "arriving"; - break; - case "initial": - self showzbarrierpiece( 1 ); - self thread magic_box_initial(); - thread maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.owner.unitrigger_stub, ::magicbox_unitrigger_think ); - self.state = "initial"; - break; - case "open": - self showzbarrierpiece( 2 ); - self thread magic_box_opens(); - self.state = "open"; - break; - case "close": - self showzbarrierpiece( 2 ); - self thread magic_box_closes(); - self.state = "close"; - break; - case "leaving": - self showzbarrierpiece( 1 ); - self thread magic_box_leaves(); - self.state = "leaving"; - break; - default: - if ( isdefined( level.custom_magicbox_state_handler ) ) - self [[ level.custom_magicbox_state_handler ]]( state ); - - break; - } + switch( state ) + { + case "away": + self showzbarrierpiece( 0 ); + self thread magic_box_teddy_twitches(); + self.state = "away"; + break; + case "arriving": + self showzbarrierpiece( 1 ); + self thread magic_box_arrives(); + self.state = "arriving"; + break; + case "initial": + self showzbarrierpiece( 1 ); + self thread magic_box_initial(); + thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.owner.unitrigger_stub, ::magicbox_unitrigger_think ); + self.state = "initial"; + break; + case "open": + self showzbarrierpiece( 2 ); + self thread magic_box_opens(); + self.state = "open"; + break; + case "close": + self showzbarrierpiece( 2 ); + self thread magic_box_closes(); + self.state = "close"; + break; + case "leaving": + self showzbarrierpiece( 1 ); + self thread magic_box_leaves(); + self.state = "leaving"; + break; + default: + if ( isDefined( level.custom_magicbox_state_handler ) ) + { + self [[ level.custom_magicbox_state_handler ]]( state ); + } + break; + } } -magicbox_host_migration() +magicbox_host_migration() //checked changed to match cerberus output { - level endon( "end_game" ); - level notify( "mb_hostmigration" ); - level endon( "mb_hostmigration" ); - - while ( true ) - { - level waittill( "host_migration_end" ); - - if ( !isdefined( level.chests ) ) - continue; - - foreach ( chest in level.chests ) - { - if ( !is_true( chest.hidden ) ) - { - if ( isdefined( chest ) && isdefined( chest.pandora_light ) ) - playfxontag( level._effect["lght_marker"], chest.pandora_light, "tag_origin" ); - } - - wait_network_frame(); - } - } + level endon( "end_game" ); + level notify( "mb_hostmigration" ); + level endon( "mb_hostmigration" ); + while ( 1 ) + { + level waittill( "host_migration_end" ); + while ( !isDefined( level.chests ) ) + { + wait 0.1; + } + foreach ( chest in level.chests ) + { + if ( !is_true( chest.hidden ) ) + { + if ( isdefined( chest ) && isdefined( chest.pandora_light ) ) + { + playfxontag( level._effect[ "lght_marker" ], chest.pandora_light, "tag_origin" ); + } + } + wait_network_frame(); + } + } } + + + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox_lock.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox_lock.gsc index c4101f7..3e8dacd 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox_lock.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox_lock.gsc @@ -1,106 +1,99 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_magicbox; -#include maps\mp\zombies\_zm_magicbox_lock; -#include maps\mp\zombies\_zm_unitrigger; +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_magicbox_lock; +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - precachemodel( "p6_anim_zm_al_magic_box_lock_red" ); - level.locked_magic_box_cost = 2000; - level.custom_magicbox_state_handler = maps\mp\zombies\_zm_magicbox_lock::set_locked_magicbox_state; - add_zombie_hint( "locked_magic_box_cost", &"ZOMBIE_LOCKED_COST_2000" ); + precachemodel( "p6_anim_zm_al_magic_box_lock_red" ); + level.locked_magic_box_cost = 2000; + level.custom_magicbox_state_handler = ::set_locked_magicbox_state; + add_zombie_hint( "locked_magic_box_cost", &"ZOMBIE_LOCKED_COST_2000" ); } -watch_for_lock() +watch_for_lock() //checked matches cerberus output { - self endon( "user_grabbed_weapon" ); - self endon( "chest_accessed" ); - - self waittill( "box_locked" ); - - self notify( "kill_chest_think" ); - self.grab_weapon_hint = 0; - self.chest_user = undefined; - wait 0.1; - self thread maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think ); - self.unitrigger_stub run_visibility_function_for_all_triggers(); - self thread treasure_chest_think(); + self endon( "user_grabbed_weapon" ); + self endon( "chest_accessed" ); + self waittill( "box_locked" ); + self notify( "kill_chest_think" ); + self.grab_weapon_hint = 0; + self.chest_user = undefined; + wait 0.1; + self thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::magicbox_unitrigger_think ); + self.unitrigger_stub run_visibility_function_for_all_triggers(); + self thread treasure_chest_think(); } -clean_up_locked_box() +clean_up_locked_box() //checked matches cerberus output { - self endon( "box_spin_done" ); - - self.owner waittill( "box_locked" ); - - if ( isdefined( self.weapon_model ) ) - { - self.weapon_model delete(); - self.weapon_model = undefined; - } - - if ( isdefined( self.weapon_model_dw ) ) - { - self.weapon_model_dw delete(); - self.weapon_model_dw = undefined; - } - - self hidezbarrierpiece( 3 ); - self hidezbarrierpiece( 4 ); - self setzbarrierpiecestate( 3, "closed" ); - self setzbarrierpiecestate( 4, "closed" ); + self endon( "box_spin_done" ); + self.owner waittill( "box_locked" ); + if ( isDefined( self.weapon_model ) ) + { + self.weapon_model delete(); + self.weapon_model = undefined; + } + if ( isDefined( self.weapon_model_dw ) ) + { + self.weapon_model_dw delete(); + self.weapon_model_dw = undefined; + } + self hidezbarrierpiece( 3 ); + self hidezbarrierpiece( 4 ); + self setzbarrierpiecestate( 3, "closed" ); + self setzbarrierpiecestate( 4, "closed" ); } -magic_box_locks() +magic_box_locks() //checked matches cerberus output { - self.owner.is_locked = 1; - self.owner notify( "box_locked" ); - self playsound( "zmb_hellbox_lock" ); - self setclientfield( "magicbox_open_fx", 0 ); - self setclientfield( "magicbox_amb_fx", 2 ); - self setzbarrierpiecestate( 5, "closing" ); - - while ( self getzbarrierpiecestate( 5 ) == "closing" ) - wait 0.5; - - self notify( "locked" ); + self.owner.is_locked = 1; + self.owner notify( "box_locked" ); + self playsound( "zmb_hellbox_lock" ); + self setclientfield( "magicbox_open_fx", 0 ); + self setclientfield( "magicbox_amb_fx", 2 ); + self setzbarrierpiecestate( 5, "closing" ); + while ( self getzbarrierpiecestate( 5 ) == "closing" ) + { + wait 0.5; + } + self notify( "locked" ); } -magic_box_unlocks() +magic_box_unlocks() //checked matches cerberus output { - maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.owner.unitrigger_stub ); - self playsound( "zmb_hellbox_unlock" ); - self setzbarrierpiecestate( 5, "opening" ); - - while ( self getzbarrierpiecestate( 5 ) == "opening" ) - wait 0.5; - - self setzbarrierpiecestate( 2, "closed" ); - self showzbarrierpiece( 2 ); - self hidezbarrierpiece( 5 ); - self notify( "unlocked" ); - self.owner.is_locked = 0; - maps\mp\zombies\_zm_unitrigger::register_unitrigger( self.owner.unitrigger_stub ); - self setclientfield( "magicbox_amb_fx", 1 ); + maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.owner.unitrigger_stub ); + self playsound( "zmb_hellbox_unlock" ); + self setzbarrierpiecestate( 5, "opening" ); + while ( self getzbarrierpiecestate( 5 ) == "opening" ) + { + wait 0.5; + } + self setzbarrierpiecestate( 2, "closed" ); + self showzbarrierpiece( 2 ); + self hidezbarrierpiece( 5 ); + self notify( "unlocked" ); + self.owner.is_locked = 0; + maps/mp/zombies/_zm_unitrigger::register_unitrigger( self.owner.unitrigger_stub ); + self setclientfield( "magicbox_amb_fx", 1 ); } -set_locked_magicbox_state( state ) +set_locked_magicbox_state( state ) //checked matches cerberus output { - switch ( state ) - { - case "locking": - self showzbarrierpiece( 5 ); - self thread magic_box_locks(); - self.state = "locking"; - break; - case "unlocking": - self showzbarrierpiece( 5 ); - self magic_box_unlocks(); - self.state = "close"; - break; - } + switch( state ) + { + case "locking": + self showzbarrierpiece( 5 ); + self thread magic_box_locks(); + self.state = "locking"; + break; + case "unlocking": + self showzbarrierpiece( 5 ); + self magic_box_unlocks(); + self.state = "close"; + break; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_mgturret.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_mgturret.gsc index c44750a..d3aee82 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_mgturret.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_mgturret.gsc @@ -1,291 +1,339 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; +#include common_scripts/utility; +#include maps/mp/_utility; main() { - if ( getdvar( _hash_7C9A91DF ) == "" ) - setdvar( "mgTurret", "off" ); - - level.magic_distance = 24; - turretinfos = getentarray( "turretInfo", "targetname" ); - - for ( index = 0; index < turretinfos.size; index++ ) - turretinfos[index] delete(); + if ( getDvar( #"7C9A91DF" ) == "" ) + { + setdvar( "mgTurret", "off" ); + } + level.magic_distance = 24; + turretinfos = getentarray( "turretInfo", "targetname" ); + index = 0; + while ( index < turretinfos.size ) + { + turretinfos[ index ] delete(); + index++; + } } set_difficulty( difficulty ) { - init_turret_difficulty_settings(); - turrets = getentarray( "misc_turret", "classname" ); - - for ( index = 0; index < turrets.size; index++ ) - { - if ( isdefined( turrets[index].script_skilloverride ) ) - { - switch ( turrets[index].script_skilloverride ) - { - case "easy": - difficulty = "easy"; - break; - case "medium": - difficulty = "medium"; - break; - case "hard": - difficulty = "hard"; - break; - case "fu": - difficulty = "fu"; - break; - default: - continue; - } - } - - turret_set_difficulty( turrets[index], difficulty ); - } + init_turret_difficulty_settings(); + turrets = getentarray( "misc_turret", "classname" ); + index = 0; + while ( index < turrets.size ) + { + if ( isDefined( turrets[ index ].script_skilloverride ) ) + { + switch( turrets[ index ].script_skilloverride ) + { + case "easy": + difficulty = "easy"; + break; + break; + case "medium": + difficulty = "medium"; + break; + break; + case "hard": + difficulty = "hard"; + break; + break; + case "fu": + difficulty = "fu"; + break; + break; + default: + } + } + turret_set_difficulty( turrets[ index ], difficulty ); + index++; + } + } } init_turret_difficulty_settings() { - level.mgturretsettings["easy"]["convergenceTime"] = 2.5; - level.mgturretsettings["easy"]["suppressionTime"] = 3.0; - level.mgturretsettings["easy"]["accuracy"] = 0.38; - level.mgturretsettings["easy"]["aiSpread"] = 2; - level.mgturretsettings["easy"]["playerSpread"] = 0.5; - level.mgturretsettings["medium"]["convergenceTime"] = 1.5; - level.mgturretsettings["medium"]["suppressionTime"] = 3.0; - level.mgturretsettings["medium"]["accuracy"] = 0.38; - level.mgturretsettings["medium"]["aiSpread"] = 2; - level.mgturretsettings["medium"]["playerSpread"] = 0.5; - level.mgturretsettings["hard"]["convergenceTime"] = 0.8; - level.mgturretsettings["hard"]["suppressionTime"] = 3.0; - level.mgturretsettings["hard"]["accuracy"] = 0.38; - level.mgturretsettings["hard"]["aiSpread"] = 2; - level.mgturretsettings["hard"]["playerSpread"] = 0.5; - level.mgturretsettings["fu"]["convergenceTime"] = 0.4; - level.mgturretsettings["fu"]["suppressionTime"] = 3.0; - level.mgturretsettings["fu"]["accuracy"] = 0.38; - level.mgturretsettings["fu"]["aiSpread"] = 2; - level.mgturretsettings["fu"]["playerSpread"] = 0.5; + level.mgturretsettings[ "easy" ][ "convergenceTime" ] = 2,5; + level.mgturretsettings[ "easy" ][ "suppressionTime" ] = 3; + level.mgturretsettings[ "easy" ][ "accuracy" ] = 0,38; + level.mgturretsettings[ "easy" ][ "aiSpread" ] = 2; + level.mgturretsettings[ "easy" ][ "playerSpread" ] = 0,5; + level.mgturretsettings[ "medium" ][ "convergenceTime" ] = 1,5; + level.mgturretsettings[ "medium" ][ "suppressionTime" ] = 3; + level.mgturretsettings[ "medium" ][ "accuracy" ] = 0,38; + level.mgturretsettings[ "medium" ][ "aiSpread" ] = 2; + level.mgturretsettings[ "medium" ][ "playerSpread" ] = 0,5; + level.mgturretsettings[ "hard" ][ "convergenceTime" ] = 0,8; + level.mgturretsettings[ "hard" ][ "suppressionTime" ] = 3; + level.mgturretsettings[ "hard" ][ "accuracy" ] = 0,38; + level.mgturretsettings[ "hard" ][ "aiSpread" ] = 2; + level.mgturretsettings[ "hard" ][ "playerSpread" ] = 0,5; + level.mgturretsettings[ "fu" ][ "convergenceTime" ] = 0,4; + level.mgturretsettings[ "fu" ][ "suppressionTime" ] = 3; + level.mgturretsettings[ "fu" ][ "accuracy" ] = 0,38; + level.mgturretsettings[ "fu" ][ "aiSpread" ] = 2; + level.mgturretsettings[ "fu" ][ "playerSpread" ] = 0,5; } turret_set_difficulty( turret, difficulty ) { - turret.convergencetime = level.mgturretsettings[difficulty]["convergenceTime"]; - turret.suppressiontime = level.mgturretsettings[difficulty]["suppressionTime"]; - turret.accuracy = level.mgturretsettings[difficulty]["accuracy"]; - turret.aispread = level.mgturretsettings[difficulty]["aiSpread"]; - turret.playerspread = level.mgturretsettings[difficulty]["playerSpread"]; + turret.convergencetime = level.mgturretsettings[ difficulty ][ "convergenceTime" ]; + turret.suppressiontime = level.mgturretsettings[ difficulty ][ "suppressionTime" ]; + turret.accuracy = level.mgturretsettings[ difficulty ][ "accuracy" ]; + turret.aispread = level.mgturretsettings[ difficulty ][ "aiSpread" ]; + turret.playerspread = level.mgturretsettings[ difficulty ][ "playerSpread" ]; } turret_suppression_fire( targets ) { - self endon( "death" ); - self endon( "stop_suppression_fire" ); - - if ( !isdefined( self.suppresionfire ) ) - self.suppresionfire = 1; - - for (;;) - { - while ( self.suppresionfire ) - { - self settargetentity( targets[randomint( targets.size )] ); - wait( 2 + randomfloat( 2 ) ); - } - - self cleartargetentity(); - - while ( !self.suppresionfire ) - wait 1; - } + self endon( "death" ); + self endon( "stop_suppression_fire" ); + if ( !isDefined( self.suppresionfire ) ) + { + self.suppresionfire = 1; + } + for ( ;; ) + { + while ( self.suppresionfire ) + { + self settargetentity( targets[ randomint( targets.size ) ] ); + wait ( 2 + randomfloat( 2 ) ); + } + self cleartargetentity(); + while ( !self.suppresionfire ) + { + wait 1; + } + } } burst_fire_settings( setting ) { - if ( setting == "delay" ) - return 0.2; - else if ( setting == "delay_range" ) - return 0.5; - else if ( setting == "burst" ) - return 0.5; - else if ( setting == "burst_range" ) - return 4; + if ( setting == "delay" ) + { + return 0,2; + } + else + { + if ( setting == "delay_range" ) + { + return 0,5; + } + else + { + if ( setting == "burst" ) + { + return 0,5; + } + else + { + if ( setting == "burst_range" ) + { + return 4; + } + } + } + } } burst_fire( turret, manual_target ) { - turret endon( "death" ); - turret endon( "stopfiring" ); - self endon( "stop_using_built_in_burst_fire" ); - - if ( isdefined( turret.script_delay_min ) ) - turret_delay = turret.script_delay_min; - else - turret_delay = burst_fire_settings( "delay" ); - - if ( isdefined( turret.script_delay_max ) ) - turret_delay_range = turret.script_delay_max - turret_delay; - else - turret_delay_range = burst_fire_settings( "delay_range" ); - - if ( isdefined( turret.script_burst_min ) ) - turret_burst = turret.script_burst_min; - else - turret_burst = burst_fire_settings( "burst" ); - - if ( isdefined( turret.script_burst_max ) ) - turret_burst_range = turret.script_burst_max - turret_burst; - else - turret_burst_range = burst_fire_settings( "burst_range" ); - - while ( true ) - { - turret startfiring(); - - if ( isdefined( manual_target ) ) - turret thread random_spread( manual_target ); - - turret do_shoot(); - wait( turret_burst + randomfloat( turret_burst_range ) ); - turret stopshootturret(); - turret stopfiring(); - wait( turret_delay + randomfloat( turret_delay_range ) ); - } + turret endon( "death" ); + turret endon( "stopfiring" ); + self endon( "stop_using_built_in_burst_fire" ); + if ( isDefined( turret.script_delay_min ) ) + { + turret_delay = turret.script_delay_min; + } + else + { + turret_delay = burst_fire_settings( "delay" ); + } + if ( isDefined( turret.script_delay_max ) ) + { + turret_delay_range = turret.script_delay_max - turret_delay; + } + else + { + turret_delay_range = burst_fire_settings( "delay_range" ); + } + if ( isDefined( turret.script_burst_min ) ) + { + turret_burst = turret.script_burst_min; + } + else + { + turret_burst = burst_fire_settings( "burst" ); + } + if ( isDefined( turret.script_burst_max ) ) + { + turret_burst_range = turret.script_burst_max - turret_burst; + } + else + { + turret_burst_range = burst_fire_settings( "burst_range" ); + } + while ( 1 ) + { + turret startfiring(); + if ( isDefined( manual_target ) ) + { + turret thread random_spread( manual_target ); + } + turret do_shoot(); + wait ( turret_burst + randomfloat( turret_burst_range ) ); + turret stopshootturret(); + turret stopfiring(); + wait ( turret_delay + randomfloat( turret_delay_range ) ); + } } burst_fire_unmanned() { - self notify( "stop_burst_fire_unmanned" ); - self endon( "stop_burst_fire_unmanned" ); - self endon( "death" ); - self endon( "remote_start" ); - level endon( "game_ended" ); - - if ( isdefined( self.controlled ) && self.controlled ) - return; - - if ( isdefined( self.script_delay_min ) ) - turret_delay = self.script_delay_min; - else - turret_delay = burst_fire_settings( "delay" ); - - if ( isdefined( self.script_delay_max ) ) - turret_delay_range = self.script_delay_max - turret_delay; - else - turret_delay_range = burst_fire_settings( "delay_range" ); - - if ( isdefined( self.script_burst_min ) ) - turret_burst = self.script_burst_min; - else - turret_burst = burst_fire_settings( "burst" ); - - if ( isdefined( self.script_burst_max ) ) - turret_burst_range = self.script_burst_max - turret_burst; - else - turret_burst_range = burst_fire_settings( "burst_range" ); - - pauseuntiltime = gettime(); - turretstate = "start"; - self.script_shooting = 0; - - for (;;) - { - if ( isdefined( self.manual_targets ) ) - { - self cleartargetentity(); - self settargetentity( self.manual_targets[randomint( self.manual_targets.size )] ); - } - - duration = ( pauseuntiltime - gettime() ) * 0.001; - - if ( self isfiringturret() && duration <= 0 ) - { - if ( turretstate != "fire" ) - { - turretstate = "fire"; - self playsound( "mpl_turret_alert" ); - self thread do_shoot(); - self.script_shooting = 1; - } - - duration = turret_burst + randomfloat( turret_burst_range ); - self thread turret_timer( duration ); - - self waittill( "turretstatechange" ); - - self.script_shooting = 0; - duration = turret_delay + randomfloat( turret_delay_range ); - pauseuntiltime = gettime() + int( duration * 1000 ); - continue; - } - - if ( turretstate != "aim" ) - turretstate = "aim"; - - self thread turret_timer( duration ); - - self waittill( "turretstatechange" ); - } + self notify( "stop_burst_fire_unmanned" ); + self endon( "stop_burst_fire_unmanned" ); + self endon( "death" ); + self endon( "remote_start" ); + level endon( "game_ended" ); + if ( isDefined( self.controlled ) && self.controlled ) + { + return; + } + if ( isDefined( self.script_delay_min ) ) + { + turret_delay = self.script_delay_min; + } + else + { + turret_delay = burst_fire_settings( "delay" ); + } + if ( isDefined( self.script_delay_max ) ) + { + turret_delay_range = self.script_delay_max - turret_delay; + } + else + { + turret_delay_range = burst_fire_settings( "delay_range" ); + } + if ( isDefined( self.script_burst_min ) ) + { + turret_burst = self.script_burst_min; + } + else + { + turret_burst = burst_fire_settings( "burst" ); + } + if ( isDefined( self.script_burst_max ) ) + { + turret_burst_range = self.script_burst_max - turret_burst; + } + else + { + turret_burst_range = burst_fire_settings( "burst_range" ); + } + pauseuntiltime = getTime(); + turretstate = "start"; + self.script_shooting = 0; + for ( ;; ) + { + if ( isDefined( self.manual_targets ) ) + { + self cleartargetentity(); + self settargetentity( self.manual_targets[ randomint( self.manual_targets.size ) ] ); + } + duration = ( pauseuntiltime - getTime() ) * 0,001; + if ( self isfiringturret() && duration <= 0 ) + { + if ( turretstate != "fire" ) + { + turretstate = "fire"; + self playsound( "mpl_turret_alert" ); + self thread do_shoot(); + self.script_shooting = 1; + } + duration = turret_burst + randomfloat( turret_burst_range ); + self thread turret_timer( duration ); + self waittill( "turretstatechange" ); + self.script_shooting = 0; + duration = turret_delay + randomfloat( turret_delay_range ); + pauseuntiltime = getTime() + int( duration * 1000 ); + continue; + } + else + { + if ( turretstate != "aim" ) + { + turretstate = "aim"; + } + self thread turret_timer( duration ); + self waittill( "turretstatechange" ); + } + } } avoid_synchronization( time ) { - if ( !isdefined( level._zm_mgturret_firing ) ) - level._zm_mgturret_firing = 0; + if ( !isDefined( level._zm_mgturret_firing ) ) + { + level._zm_mgturret_firing = 0; + } + level._zm_mgturret_firing++; + wait time; + level._zm_mgturret_firing--; - level._zm_mgturret_firing++; - wait( time ); - level._zm_mgturret_firing--; } do_shoot() { - self endon( "death" ); - self endon( "turretstatechange" ); - - for (;;) - { - while ( is_true( level._zm_mgturret_firing ) ) - wait 0.1; - - thread avoid_synchronization( 0.1 ); - self shootturret(); - wait 0.112; - } + self endon( "death" ); + self endon( "turretstatechange" ); + for ( ;; ) + { + while ( is_true( level._zm_mgturret_firing ) ) + { + wait 0,1; + } + thread avoid_synchronization( 0,1 ); + self shootturret(); + wait 0,112; + } } turret_timer( duration ) { - if ( duration <= 0 ) - return; - - self endon( "turretstatechange" ); - wait( duration ); - - if ( isdefined( self ) ) - self notify( "turretstatechange" ); + if ( duration <= 0 ) + { + return; + } + self endon( "turretstatechange" ); + wait duration; + if ( isDefined( self ) ) + { + self notify( "turretstatechange" ); + } } random_spread( ent ) { - self endon( "death" ); - self notify( "stop random_spread" ); - self endon( "stop random_spread" ); - self endon( "stopfiring" ); - self settargetentity( ent ); - self.manual_target = ent; - - while ( true ) - { - if ( isplayer( ent ) ) - ent.origin = self.manual_target getorigin(); - else - ent.origin = self.manual_target.origin; - - ent.origin += ( 20 - randomfloat( 40 ), 20 - randomfloat( 40 ), 20 - randomfloat( 60 ) ); - wait 0.2; - } + self endon( "death" ); + self notify( "stop random_spread" ); + self endon( "stop random_spread" ); + self endon( "stopfiring" ); + self settargetentity( ent ); + self.manual_target = ent; + while ( 1 ) + { + if ( isplayer( ent ) ) + { + ent.origin = self.manual_target getorigin(); + } + else + { + ent.origin = self.manual_target.origin; + } + ent.origin += ( 20 - randomfloat( 40 ), 20 - randomfloat( 40 ), 20 - randomfloat( 60 ) ); + wait 0,2; + } } diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_net.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_net.gsc index bdb71bc..32f06cb 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_net.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_net.gsc @@ -1,95 +1,105 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -network_choke_init( id, max ) +network_choke_init( id, max ) //checked matches cerberus output { - if ( !isdefined( level.zombie_network_choke_ids_max ) ) - { - level.zombie_network_choke_ids_max = []; - level.zombie_network_choke_ids_count = []; - } - - level.zombie_network_choke_ids_max[id] = max; - level.zombie_network_choke_ids_count[id] = 0; - level thread network_choke_thread( id ); + if ( !isDefined( level.zombie_network_choke_ids_max ) ) + { + level.zombie_network_choke_ids_max = []; + level.zombie_network_choke_ids_count = []; + } + level.zombie_network_choke_ids_max[ id ] = max; + level.zombie_network_choke_ids_count[ id ] = 0; + level thread network_choke_thread( id ); } -network_choke_thread( id ) +network_choke_thread( id ) //checked matches cerberus output { - while ( true ) - { - wait_network_frame(); - wait_network_frame(); - level.zombie_network_choke_ids_count[id] = 0; - } + while ( 1 ) + { + wait_network_frame(); + wait_network_frame(); + level.zombie_network_choke_ids_count[ id ] = 0; + } } -network_choke_safe( id ) +network_choke_safe( id ) //checked matches cerberus output { - return level.zombie_network_choke_ids_count[id] < level.zombie_network_choke_ids_max[id]; + return level.zombie_network_choke_ids_count[ id ] < level.zombie_network_choke_ids_max[ id ]; } -network_choke_action( id, choke_action, arg1, arg2, arg3 ) +network_choke_action( id, choke_action, arg1, arg2, arg3 ) //checked matches cerberus output { +/* /# - assert( isdefined( level.zombie_network_choke_ids_max[id] ), "Network Choke: " + id + " undefined" ); + assert( isDefined( level.zombie_network_choke_ids_max[ id ] ), "Network Choke: " + id + " undefined" ); #/ - while ( !network_choke_safe( id ) ) - wait 0.05; - - level.zombie_network_choke_ids_count[id]++; - - if ( !isdefined( arg1 ) ) - return [[ choke_action ]](); - - if ( !isdefined( arg2 ) ) - return [[ choke_action ]]( arg1 ); - - if ( !isdefined( arg3 ) ) - return [[ choke_action ]]( arg1, arg2 ); - - return [[ choke_action ]]( arg1, arg2, arg3 ); +*/ + while ( !network_choke_safe( id ) ) + { + wait 0.05; + } + level.zombie_network_choke_ids_count[ id ]++; + if ( !isDefined( arg1 ) ) + { + return [[ choke_action ]](); + } + if ( !isDefined( arg2 ) ) + { + return [[ choke_action ]]( arg1 ); + } + if ( !isDefined( arg3 ) ) + { + return [[ choke_action ]]( arg1, arg2 ); + } + return [[ choke_action ]]( arg1, arg2, arg3 ); } -network_entity_valid( entity ) +network_entity_valid( entity ) //checked matches cerberus output { - if ( !isdefined( entity ) ) - return false; - - return true; + if ( !isDefined( entity ) ) + { + return 0; + } + return 1; } -network_safe_init( id, max ) +network_safe_init( id, max ) //checked matches cerberus output { - if ( !isdefined( level.zombie_network_choke_ids_max ) || !isdefined( level.zombie_network_choke_ids_max[id] ) ) - network_choke_init( id, max ); + if ( !isDefined( level.zombie_network_choke_ids_max ) || !isDefined( level.zombie_network_choke_ids_max[ id ] ) ) + { + network_choke_init( id, max ); + } + /* /# - assert( max == level.zombie_network_choke_ids_max[id] ); + assert( max == level.zombie_network_choke_ids_max[ id ] ); #/ + */ } -_network_safe_spawn( classname, origin ) +_network_safe_spawn( classname, origin ) //checked matches cerberus output { - return spawn( classname, origin ); + return spawn( classname, origin ); } -network_safe_spawn( id, max, classname, origin ) +network_safe_spawn( id, max, classname, origin ) //checked matches cerberus output { - network_safe_init( id, max ); - return network_choke_action( id, ::_network_safe_spawn, classname, origin ); + network_safe_init( id, max ); + return network_choke_action( id, ::_network_safe_spawn, classname, origin ); } -_network_safe_play_fx_on_tag( fx, entity, tag ) +_network_safe_play_fx_on_tag( fx, entity, tag ) //checked matches cerberus output { - if ( network_entity_valid( entity ) ) - playfxontag( fx, entity, tag ); + if ( network_entity_valid( entity ) ) + { + playfxontag( fx, entity, tag ); + } } -network_safe_play_fx_on_tag( id, max, fx, entity, tag ) +network_safe_play_fx_on_tag( id, max, fx, entity, tag ) //checked matches cerberus output { - network_safe_init( id, max ); - network_choke_action( id, ::_network_safe_play_fx_on_tag, fx, entity, tag ); + network_safe_init( id, max ); + network_choke_action( id, ::_network_safe_play_fx_on_tag, fx, entity, tag ); } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_perk_electric_cherry.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_perk_electric_cherry.gsc index 082bf48..ab7409c 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_perk_electric_cherry.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_perk_electric_cherry.gsc @@ -1,395 +1,381 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_net; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\zombies\_zm_score; -#include maps\mp\animscripts\shared; -#include maps\mp\zombies\_zm_ai_basic; +#include maps/mp/zombies/_zm_ai_basic; +#include maps/mp/animscripts/shared; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; -enable_electric_cherry_perk_for_level() +enable_electric_cherry_perk_for_level() //checked matches cerberus output { - maps\mp\zombies\_zm_perks::register_perk_basic_info( "specialty_grenadepulldeath", "electric_cherry", 2000, &"ZM_PRISON_PERK_CHERRY", "zombie_perk_bottle_cherry" ); - maps\mp\zombies\_zm_perks::register_perk_precache_func( "specialty_grenadepulldeath", ::electic_cherry_precache ); - maps\mp\zombies\_zm_perks::register_perk_clientfields( "specialty_grenadepulldeath", ::electric_cherry_register_clientfield, ::electric_cherry_set_clientfield ); - maps\mp\zombies\_zm_perks::register_perk_threads( "specialty_grenadepulldeath", ::electric_cherry_reload_attack, ::electric_cherry_perk_lost ); - maps\mp\zombies\_zm_perks::register_perk_machine( "specialty_grenadepulldeath", ::electric_cherry_perk_machine_setup, ::electric_cherry_perk_machine_think ); - maps\mp\zombies\_zm_perks::register_perk_host_migration_func( "specialty_grenadepulldeath", ::electric_cherry_host_migration_func ); - - if ( isdefined( level.custom_electric_cherry_perk_threads ) && level.custom_electric_cherry_perk_threads ) - level thread [[ level.custom_electric_cherry_perk_threads ]](); + register_perk_basic_info( "specialty_grenadepulldeath", "electric_cherry", 2000, &"ZM_PRISON_PERK_CHERRY", "zombie_perk_bottle_cherry" ); + register_perk_precache_func( "specialty_grenadepulldeath", ::electic_cherry_precache ); + register_perk_clientfields( "specialty_grenadepulldeath", ::electric_cherry_register_clientfield, ::electric_cherry_set_clientfield ); + register_perk_threads( "specialty_grenadepulldeath", ::electric_cherry_reload_attack, ::electric_cherry_perk_lost ); + register_perk_machine( "specialty_grenadepulldeath", ::electric_cherry_perk_machine_setup, ::electric_cherry_perk_machine_think ); + register_perk_host_migration_func( "specialty_grenadepulldeath", ::electric_cherry_host_migration_func ); + if ( is_true( level.custom_electric_cherry_perk_threads ) ) + { + level thread [[ level.custom_electric_cherry_perk_threads ]](); + } } -init_electric_cherry() +init_electric_cherry() //checked matches cerberus output { - level.custom_laststand_func = ::electric_cherry_laststand; - set_zombie_var( "tesla_head_gib_chance", 50 ); - registerclientfield( "allplayers", "electric_cherry_reload_fx", 9000, 2, "int" ); + level.custom_laststand_func = ::electric_cherry_laststand; + set_zombie_var( "tesla_head_gib_chance", 50 ); + registerclientfield( "allplayers", "electric_cherry_reload_fx", 9000, 2, "int" ); } -electic_cherry_precache() +electic_cherry_precache() //checked matches cerberus output { - precacheitem( "zombie_perk_bottle_cherry" ); - precacheshader( "specialty_fastreload_zombies" ); - precachemodel( "p6_zm_vending_electric_cherry_off" ); - precachemodel( "p6_zm_vending_electric_cherry_on" ); - precachestring( &"ZM_PRISON_PERK_CHERRY" ); - level._effect["electriccherry"] = loadfx( "misc/fx_zombie_cola_on" ); - level._effect["electric_cherry_explode"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_down" ); - level._effect["electric_cherry_reload_small"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_sm" ); - level._effect["electric_cherry_reload_medium"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_player" ); - level._effect["electric_cherry_reload_large"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_lg" ); - level._effect["tesla_shock"] = loadfx( "maps/zombie/fx_zombie_tesla_shock" ); - level._effect["tesla_shock_secondary"] = loadfx( "maps/zombie/fx_zombie_tesla_shock_secondary" ); + precacheitem( "zombie_perk_bottle_cherry" ); + precacheshader( "specialty_fastreload_zombies" ); + precachemodel( "p6_zm_vending_electric_cherry_off" ); + precachemodel( "p6_zm_vending_electric_cherry_on" ); + precachestring( &"ZM_PRISON_PERK_CHERRY" ); + level._effect[ "electriccherry" ] = loadfx( "misc/fx_zombie_cola_on" ); + level._effect[ "electric_cherry_explode" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_down" ); + level._effect[ "electric_cherry_reload_small" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_sm" ); + level._effect[ "electric_cherry_reload_medium" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_player" ); + level._effect[ "electric_cherry_reload_large" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_lg" ); + level._effect[ "tesla_shock" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock" ); + level._effect[ "tesla_shock_secondary" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock_secondary" ); } -electric_cherry_register_clientfield() +electric_cherry_register_clientfield() //checked matches cerberus output { - registerclientfield( "toplayer", "perk_electric_cherry", 9000, 1, "int" ); + registerclientfield( "toplayer", "perk_electric_cherry", 9000, 1, "int" ); } -electric_cherry_set_clientfield( state ) +electric_cherry_set_clientfield( state ) //checked matches cerberus output { - self setclientfieldtoplayer( "perk_electric_cherry", state ); + self setclientfieldtoplayer( "perk_electric_cherry", state ); } -electric_cherry_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision ) +electric_cherry_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision ) //checked matches cerberus output { - use_trigger.script_sound = "mus_perks_cherry_jingle"; - use_trigger.script_string = "electric_cherry_perk"; - use_trigger.script_label = "mus_perks_cherry_sting"; - use_trigger.target = "vending_electriccherry"; - perk_machine.script_string = "electriccherry_perk"; - perk_machine.targetname = "vendingelectric_cherry"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "electriccherry_perk"; + use_trigger.script_sound = "mus_perks_cherry_jingle"; + use_trigger.script_string = "electric_cherry_perk"; + use_trigger.script_label = "mus_perks_cherry_sting"; + use_trigger.target = "vending_electriccherry"; + perk_machine.script_string = "electriccherry_perk"; + perk_machine.targetname = "vendingelectric_cherry"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "electriccherry_perk"; + } } -electric_cherry_perk_machine_think() +electric_cherry_perk_machine_think() //checked changed to match cerberus output { - init_electric_cherry(); - - while ( true ) - { - machine = getentarray( "vendingelectric_cherry", "targetname" ); - machine_triggers = getentarray( "vending_electriccherry", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( "p6_zm_vending_electric_cherry_off" ); - - level thread do_initial_power_off_callback( machine, "electriccherry" ); - array_thread( machine_triggers, maps\mp\zombies\_zm_perks::set_power_on, 0 ); - - level waittill( "electric_cherry_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( "p6_zm_vending_electric_cherry_on" ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "electriccherry" ); - machine[i] thread play_loop_on_machine(); - } - - level notify( "specialty_grenadepulldeath_power_on" ); - array_thread( machine_triggers, maps\mp\zombies\_zm_perks::set_power_on, 1 ); - - level waittill( "electric_cherry_off" ); - - array_thread( machine, maps\mp\zombies\_zm_perks::turn_perk_off ); - } + init_electric_cherry(); + while ( 1 ) + { + machine = getentarray( "vendingelectric_cherry", "targetname" ); + machine_triggers = getentarray( "vending_electriccherry", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( "p6_zm_vending_electric_cherry_off" ); + } + level thread do_initial_power_off_callback( machine, "electriccherry" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "electric_cherry_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( "p6_zm_vending_electric_cherry_on" ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "electriccherry" ); + machine[ i ] thread play_loop_on_machine(); + } + level notify( "specialty_grenadepulldeath_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + level waittill( "electric_cherry_off" ); + array_thread( machine, ::turn_perk_off ); + } } -electric_cherry_host_migration_func() +electric_cherry_host_migration_func() //checked changed to match cerberus output { - a_electric_cherry_perk_machines = getentarray( "vending_electriccherry", "targetname" ); - - foreach ( perk_machine in a_electric_cherry_perk_machines ) - { - if ( isdefined( perk_machine.model ) && perk_machine.model == "p6_zm_vending_electric_cherry_on" ) - { - perk_machine perk_fx( undefined, 1 ); - perk_machine thread perk_fx( "electriccherry" ); - } - } + a_electric_cherry_perk_machines = getentarray( "vending_electriccherry", "targetname" ); + foreach ( perk_machine in a_electric_cherry_perk_machines ) + { + if ( isDefined( perk_machine.model ) && perk_machine.model == "p6_zm_vending_electric_cherry_on" ) + { + perk_machine perk_fx( undefined, 1 ); + perk_machine thread perk_fx( "electriccherry" ); + } + } } -electric_cherry_laststand() +electric_cherry_laststand() //checked changed to match cerberus output { - visionsetlaststand( "zombie_last_stand", 1 ); - - if ( isdefined( self ) ) - { - playfx( level._effect["electric_cherry_explode"], self.origin ); - self playsound( "zmb_cherry_explode" ); - self notify( "electric_cherry_start" ); - wait 0.05; - a_zombies = get_round_enemy_array(); - a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, 500 ); - - for ( i = 0; i < a_zombies.size; i++ ) - { - if ( isalive( self ) ) - { - if ( a_zombies[i].health <= 1000 ) - { - a_zombies[i] thread electric_cherry_death_fx(); - - if ( isdefined( self.cherry_kills ) ) - self.cherry_kills++; - - self maps\mp\zombies\_zm_score::add_to_player_score( 40 ); - } - else - { - a_zombies[i] thread electric_cherry_stun(); - a_zombies[i] thread electric_cherry_shock_fx(); - } - - wait 0.1; - a_zombies[i] dodamage( 1000, self.origin, self, self, "none" ); - } - } - - self notify( "electric_cherry_end" ); - } + visionsetlaststand( "zombie_last_stand", 1 ); + if ( isDefined( self ) ) + { + playfx( level._effect[ "electric_cherry_explode" ], self.origin ); + self playsound( "zmb_cherry_explode" ); + self notify( "electric_cherry_start" ); + wait 0.05; + a_zombies = get_round_enemy_array(); + a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, 500 ); + for ( i = 0; i < a_zombies.size; i++) + { + if ( isalive( self ) ) + { + if ( a_zombies[ i ].health <= 1000 ) + { + a_zombies[ i ] thread electric_cherry_death_fx(); + if ( isdefined( self.cherry_kills ) ) + { + self.cherry_kills++; + } + self maps/mp/zombies/_zm_score::add_to_player_score( 40 ); + } + else + { + a_zombies[ i ] thread electric_cherry_stun(); + a_zombies[ i ] thread electric_cherry_shock_fx(); + } + wait 0.1 ; + a_zombies[ i ] dodamage( 1000, self.origin, self, self, "none" ); + } + } + self notify( "electric_cherry_end" ); + } } -electric_cherry_death_fx() +electric_cherry_death_fx() //checked matches cerberus output { - self endon( "death" ); - tag = "J_SpineUpper"; - fx = "tesla_shock"; - - if ( self.isdog ) - tag = "J_Spine1"; - - self playsound( "zmb_elec_jib_zombie" ); - network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect[fx], self, tag ); - - if ( isdefined( self.tesla_head_gib_func ) && !self.head_gibbed ) - [[ self.tesla_head_gib_func ]](); + self endon( "death" ); + tag = "J_SpineUpper"; + fx = "tesla_shock"; + if ( self.isdog ) + { + tag = "J_Spine1"; + } + self playsound( "zmb_elec_jib_zombie" ); + network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect[ fx ], self, tag ); + if ( isDefined( self.tesla_head_gib_func ) && !self.head_gibbed ) + { + [[ self.tesla_head_gib_func ]](); + } } -electric_cherry_shock_fx() +electric_cherry_shock_fx() //checked matches cerberus output { - self endon( "death" ); - tag = "J_SpineUpper"; - fx = "tesla_shock_secondary"; - - if ( self.isdog ) - tag = "J_Spine1"; - - self playsound( "zmb_elec_jib_zombie" ); - network_safe_play_fx_on_tag( "tesla_shock_fx", 2, level._effect[fx], self, tag ); + self endon( "death" ); + tag = "J_SpineUpper"; + fx = "tesla_shock_secondary"; + if ( self.isdog ) + { + tag = "J_Spine1"; + } + self playsound( "zmb_elec_jib_zombie" ); + network_safe_play_fx_on_tag( "tesla_shock_fx", 2, level._effect[ fx ], self, tag ); } -electric_cherry_stun() +electric_cherry_stun() //checked changed to match cerberus output { - self endon( "death" ); - self notify( "stun_zombie" ); - self endon( "stun_zombie" ); - - if ( self.health <= 0 ) - { + self endon( "death" ); + self notify( "stun_zombie" ); + self endon( "stun_zombie" ); + if ( self.health <= 0 ) + { + /* /# - iprintln( "trying to stun a dead zombie" ); + iprintln( "trying to stun a dead zombie" ); #/ - return; - } - - if ( self.ai_state != "find_flesh" ) - return; - - self.forcemovementscriptstate = 1; - self.ignoreall = 1; - - for ( i = 0; i < 2; i++ ) - { - self animscripted( self.origin, self.angles, "zm_afterlife_stun" ); - self maps\mp\animscripts\shared::donotetracks( "stunned" ); - } - - self.forcemovementscriptstate = 0; - self.ignoreall = 0; - self setgoalpos( self.origin ); - self thread maps\mp\zombies\_zm_ai_basic::find_flesh(); + */ + return; + } + if ( self.ai_state != "find_flesh" ) + { + return; + } + self.forcemovementscriptstate = 1; + self.ignoreall = 1; + for ( i = 0; i < 2; i++ ) + { + self animscripted( self.origin, self.angles, "zm_afterlife_stun" ); + self maps/mp/animscripts/shared::donotetracks( "stunned" ); + } + self.forcemovementscriptstate = 0; + self.ignoreall = 0; + self setgoalpos( self.origin ); + self thread maps/mp/zombies/_zm_ai_basic::find_flesh(); } -electric_cherry_reload_attack() +electric_cherry_reload_attack() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "stop_electric_cherry_reload_attack" ); - self.wait_on_reload = []; - self.consecutive_electric_cherry_attacks = 0; - - while ( true ) - { - self waittill( "reload_start" ); - - str_current_weapon = self getcurrentweapon(); - - if ( isinarray( self.wait_on_reload, str_current_weapon ) ) - continue; - - self.wait_on_reload[self.wait_on_reload.size] = str_current_weapon; - self.consecutive_electric_cherry_attacks++; - n_clip_current = self getweaponammoclip( str_current_weapon ); - n_clip_max = weaponclipsize( str_current_weapon ); - n_fraction = n_clip_current / n_clip_max; - perk_radius = linear_map( n_fraction, 1.0, 0.0, 32, 128 ); - perk_dmg = linear_map( n_fraction, 1.0, 0.0, 1, 1045 ); - self thread check_for_reload_complete( str_current_weapon ); - - if ( isdefined( self ) ) - { - switch ( self.consecutive_electric_cherry_attacks ) - { - case "1": - case "0": - n_zombie_limit = undefined; - break; - case "2": - n_zombie_limit = 8; - break; - case "3": - n_zombie_limit = 4; - break; - case "4": - n_zombie_limit = 2; - break; - default: - n_zombie_limit = 0; - } - - self thread electric_cherry_cooldown_timer( str_current_weapon ); - - if ( isdefined( n_zombie_limit ) && n_zombie_limit == 0 ) - continue; - - self thread electric_cherry_reload_fx( n_fraction ); - self notify( "electric_cherry_start" ); - self playsound( "zmb_cherry_explode" ); - a_zombies = get_round_enemy_array(); - a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, perk_radius ); - n_zombies_hit = 0; - - for ( i = 0; i < a_zombies.size; i++ ) - { - if ( isalive( self ) ) - { - if ( isdefined( n_zombie_limit ) ) - { - if ( n_zombies_hit < n_zombie_limit ) - n_zombies_hit++; - else - break; - } - - if ( a_zombies[i].health <= perk_dmg ) - { - a_zombies[i] thread electric_cherry_death_fx(); - - if ( isdefined( self.cherry_kills ) ) - self.cherry_kills++; - - self maps\mp\zombies\_zm_score::add_to_player_score( 40 ); - } - else - { - if ( !isdefined( a_zombies[i].is_brutus ) ) - a_zombies[i] thread electric_cherry_stun(); - - a_zombies[i] thread electric_cherry_shock_fx(); - } - - wait 0.1; - a_zombies[i] dodamage( perk_dmg, self.origin, self, self, "none" ); - } - } - - self notify( "electric_cherry_end" ); - } - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "stop_electric_cherry_reload_attack" ); + self.wait_on_reload = []; + self.consecutive_electric_cherry_attacks = 0; + while ( 1 ) + { + self waittill( "reload_start" ); + str_current_weapon = self getcurrentweapon(); + while ( isinarray( self.wait_on_reload, str_current_weapon ) ) + { + continue; + } + self.wait_on_reload[ self.wait_on_reload.size ] = str_current_weapon; + self.consecutive_electric_cherry_attacks++; + n_clip_current = self getweaponammoclip( str_current_weapon ); + n_clip_max = weaponclipsize( str_current_weapon ); + n_fraction = n_clip_current / n_clip_max; + perk_radius = linear_map( n_fraction, 1, 0, 32, 128 ); + perk_dmg = linear_map( n_fraction, 1, 0, 1, 1045 ); + self thread check_for_reload_complete( str_current_weapon ); + if ( isDefined( self ) ) + { + switch( self.consecutive_electric_cherry_attacks ) + { + case 0: + case 1: + n_zombie_limit = undefined; + break; + case 2: + n_zombie_limit = 8; + break; + case 3: + n_zombie_limit = 4; + break; + case 4: + n_zombie_limit = 2; + break; + case default: + n_zombie_limit = 0; + } + self thread electric_cherry_cooldown_timer( str_current_weapon ); + if ( isDefined( n_zombie_limit ) && n_zombie_limit == 0 ) + { + continue; + } + self thread electric_cherry_reload_fx( n_fraction ); + self notify( "electric_cherry_start" ); + self playsound( "zmb_cherry_explode" ); + a_zombies = get_round_enemy_array(); + a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, perk_radius ); + n_zombies_hit = 0; + for ( i = 0; i < a_zombies.size; i++ ) + { + if ( isalive( self ) ) + { + if ( isDefined( n_zombie_limit ) ) + { + if ( n_zombies_hit < n_zombie_limit ) + { + n_zombies_hit++; + } + else + { + break; + } + } + if ( a_zombies[ i ].health <= perk_dmg ) + { + a_zombies[ i ] thread electric_cherry_death_fx(); + if ( isDefined( self.cherry_kills ) ) + { + self.cherry_kills++; + } + self maps/mp/zombies/_zm_score::add_to_player_score( 40 ); + } + else if ( !isDefined( a_zombies[ i ].is_brutus ) ) + { + a_zombies[ i ] thread electric_cherry_stun(); + } + a_zombies[ i ] thread electric_cherry_shock_fx(); + wait 0.1; + a_zombies[ i ] dodamage( perk_dmg, self.origin, self, self, "none" ); + } + } + self notify( "electric_cherry_end" ); + } + } } -electric_cherry_cooldown_timer( str_current_weapon ) +electric_cherry_cooldown_timer( str_current_weapon ) //checked matches cerberus output { - self notify( "electric_cherry_cooldown_started" ); - self endon( "electric_cherry_cooldown_started" ); - self endon( "death" ); - self endon( "disconnect" ); - n_reload_time = weaponreloadtime( str_current_weapon ); - - if ( self hasperk( "specialty_fastreload" ) ) - n_reload_time *= getdvarfloat( "perk_weapReloadMultiplier" ); - - n_cooldown_time = n_reload_time + 3; - wait( n_cooldown_time ); - self.consecutive_electric_cherry_attacks = 0; + self notify( "electric_cherry_cooldown_started" ); + self endon( "electric_cherry_cooldown_started" ); + self endon( "death" ); + self endon( "disconnect" ); + n_reload_time = weaponreloadtime( str_current_weapon ); + if ( self hasperk( "specialty_fastreload" ) ) + { + n_reload_time *= getDvarFloat( "perk_weapReloadMultiplier" ); + } + n_cooldown_time = n_reload_time + 3; + wait n_cooldown_time; + self.consecutive_electric_cherry_attacks = 0; } -check_for_reload_complete( weapon ) +check_for_reload_complete( weapon ) //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "player_lost_weapon_" + weapon ); - self thread weapon_replaced_monitor( weapon ); - - while ( true ) - { - self waittill( "reload" ); - - str_current_weapon = self getcurrentweapon(); - - if ( str_current_weapon == weapon ) - { - arrayremovevalue( self.wait_on_reload, weapon ); - self notify( "weapon_reload_complete_" + weapon ); - break; - } - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "player_lost_weapon_" + weapon ); + self thread weapon_replaced_monitor( weapon ); + while ( 1 ) + { + self waittill( "reload" ); + str_current_weapon = self getcurrentweapon(); + if ( str_current_weapon == weapon ) + { + arrayremovevalue( self.wait_on_reload, weapon ); + self notify( "weapon_reload_complete_" + weapon ); + break; + } + } } -weapon_replaced_monitor( weapon ) +weapon_replaced_monitor( weapon ) //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "weapon_reload_complete_" + weapon ); - - while ( true ) - { - self waittill( "weapon_change" ); - - primaryweapons = self getweaponslistprimaries(); - - if ( !isinarray( primaryweapons, weapon ) ) - { - self notify( "player_lost_weapon_" + weapon ); - arrayremovevalue( self.wait_on_reload, weapon ); - break; - } - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "weapon_reload_complete_" + weapon ); + while ( 1 ) + { + self waittill( "weapon_change" ); + primaryweapons = self getweaponslistprimaries(); + if ( !isinarray( primaryweapons, weapon ) ) + { + self notify( "player_lost_weapon_" + weapon ); + arrayremovevalue( self.wait_on_reload, weapon ); + break; + } + } } -electric_cherry_reload_fx( n_fraction ) +electric_cherry_reload_fx( n_fraction ) //checked matches cerberus output { - if ( n_fraction >= 0.67 ) - self setclientfield( "electric_cherry_reload_fx", 1 ); - else if ( n_fraction >= 0.33 && n_fraction < 0.67 ) - self setclientfield( "electric_cherry_reload_fx", 2 ); - else - self setclientfield( "electric_cherry_reload_fx", 3 ); - - wait 1.0; - self setclientfield( "electric_cherry_reload_fx", 0 ); + if ( n_fraction >= 0.67 ) + { + self setclientfield( "electric_cherry_reload_fx", 1 ); + } + else if ( n_fraction >= 0.33 && n_fraction < 0.67 ) + { + self setclientfield( "electric_cherry_reload_fx", 2 ); + } + else + { + self setclientfield( "electric_cherry_reload_fx", 3 ); + } + wait 1; + self setclientfield( "electric_cherry_reload_fx", 0 ); } -electric_cherry_perk_lost() +electric_cherry_perk_lost() //checked matches cerberus output { - self notify( "stop_electric_cherry_reload_attack" ); + self notify( "stop_electric_cherry_reload_attack" ); } + + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_perks.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_perks.gsc index 50a3eef..fc9c614 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_perks.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_perks.gsc @@ -1,3811 +1,3931 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_magicbox; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_power; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\_demo; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_chugabud; -#include maps\mp\_visionset_mgr; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\zombies\_zm; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/_visionset_mgr; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/_demo; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_power; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; +#include maps/mp/zombies/_zm_magicbox; -init() +init() //checked partially changed to match cerberus output { - level.additionalprimaryweapon_limit = 3; - level.perk_purchase_limit = 4; + level.additionalprimaryweapon_limit = 3; + level.perk_purchase_limit = 4; + if ( !level.createfx_enabled ) + { + perks_register_clientfield(); //fixed + } + if ( !level.enable_magic ) + { + return; + } + initialize_custom_perk_arrays(); + perk_machine_spawn_init(); + vending_weapon_upgrade_trigger = []; + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < vending_triggers.size; i++ ) + { + if ( isDefined( vending_triggers[ i ].script_noteworthy ) && vending_triggers[ i ].script_noteworthy == "specialty_weapupgrade" ) + { + vending_weapon_upgrade_trigger[ vending_weapon_upgrade_trigger.size ] = vending_triggers[ i ]; + arrayremovevalue( vending_triggers, vending_triggers[ i ] ); + } + } + old_packs = getentarray( "zombie_vending_upgrade", "targetname" ); + i = 0; + for ( i = 0; i < old_packs.size; i++ ) + { + vending_weapon_upgrade_trigger[ vending_weapon_upgrade_trigger.size ] = old_packs[ i ]; + } + flag_init( "pack_machine_in_use" ); + if ( vending_triggers.size < 1 ) + { + return; + } + if ( vending_weapon_upgrade_trigger.size >= 1 ) + { + array_thread( vending_weapon_upgrade_trigger, ::vending_weapon_upgrade ); + } + level.machine_assets = []; + if ( !isDefined( level.custom_vending_precaching ) ) + { + level.custom_vending_precaching = ::default_vending_precaching; + } + [[ level.custom_vending_precaching ]](); + if ( !isDefined( level.packapunch_timeout ) ) + { + level.packapunch_timeout = 15; + } + set_zombie_var( "zombie_perk_cost", 2000 ); + set_zombie_var( "zombie_perk_juggernaut_health", 160 ); + set_zombie_var( "zombie_perk_juggernaut_health_upgrade", 190 ); + array_thread( vending_triggers, ::vending_trigger_think ); + array_thread( vending_triggers, ::electric_perks_dialog ); - if ( !level.createfx_enabled ) - perks_register_clientfield(); + if ( is_true( level.zombiemode_using_doubletap_perk ) ) + { + level thread turn_doubletap_on(); + } + if ( is_true( level.zombiemode_using_marathon_perk ) ) + { + level thread turn_marathon_on(); + } + if ( is_true( level.zombiemode_using_juggernaut_perk ) ) + { + level thread turn_jugger_on(); + } + if ( is_true( level.zombiemode_using_revive_perk ) ) + { + level thread turn_revive_on(); + } + if ( is_true( level.zombiemode_using_sleightofhand_perk ) ) + { + level thread turn_sleight_on(); + } + if ( is_true( level.zombiemode_using_deadshot_perk ) ) + { + level thread turn_deadshot_on(); + } + if ( is_true( level.zombiemode_using_tombstone_perk ) ) + { + level thread turn_tombstone_on(); + } + if ( is_true( level.zombiemode_using_additionalprimaryweapon_perk ) ) + { + level thread turn_additionalprimaryweapon_on(); + } + if ( is_true( level.zombiemode_using_chugabud_perk ) ) + { + level thread turn_chugabud_on(); + } + if ( level._custom_perks.size > 0 ) + { + a_keys = getarraykeys( level._custom_perks ); + for ( i = 0; i < a_keys.size; i++ ) + { + if ( isdefined( level._custom_perks[ a_keys[ i ] ].perk_machine_thread ) ) + { + level thread [[ level._custom_perks[ a_keys[ i ] ].perk_machine_thread ]](); + } + } + } + if ( isDefined( level._custom_turn_packapunch_on ) ) + { + level thread [[ level._custom_turn_packapunch_on ]](); + } + else + { + level thread turn_packapunch_on(); + } + if ( isDefined( level.quantum_bomb_register_result_func ) ) + { + [[ level.quantum_bomb_register_result_func ]]( "give_nearest_perk", ::quantum_bomb_give_nearest_perk_result, 10, ::quantum_bomb_give_nearest_perk_validation ); + } + level thread perk_hostmigration(); - if ( !level.enable_magic ) - return; - - initialize_custom_perk_arrays(); - perk_machine_spawn_init(); - vending_weapon_upgrade_trigger = []; - vending_triggers = getentarray( "zombie_vending", "targetname" ); - - for ( i = 0; i < vending_triggers.size; i++ ) - { - if ( isdefined( vending_triggers[i].script_noteworthy ) && vending_triggers[i].script_noteworthy == "specialty_weapupgrade" ) - { - vending_weapon_upgrade_trigger[vending_weapon_upgrade_trigger.size] = vending_triggers[i]; - arrayremovevalue( vending_triggers, vending_triggers[i] ); - } - } - - old_packs = getentarray( "zombie_vending_upgrade", "targetname" ); - - for ( i = 0; i < old_packs.size; i++ ) - vending_weapon_upgrade_trigger[vending_weapon_upgrade_trigger.size] = old_packs[i]; - - flag_init( "pack_machine_in_use" ); - - if ( vending_triggers.size < 1 ) - return; - - if ( vending_weapon_upgrade_trigger.size >= 1 ) - array_thread( vending_weapon_upgrade_trigger, ::vending_weapon_upgrade ); - - level.machine_assets = []; - - if ( !isdefined( level.custom_vending_precaching ) ) - level.custom_vending_precaching = ::default_vending_precaching; - - [[ level.custom_vending_precaching ]](); - - if ( !isdefined( level.packapunch_timeout ) ) - level.packapunch_timeout = 15; - - set_zombie_var( "zombie_perk_cost", 2000 ); - set_zombie_var( "zombie_perk_juggernaut_health", 160 ); - set_zombie_var( "zombie_perk_juggernaut_health_upgrade", 190 ); - array_thread( vending_triggers, ::vending_trigger_think ); - array_thread( vending_triggers, ::electric_perks_dialog ); - - if ( isdefined( level.zombiemode_using_doubletap_perk ) && level.zombiemode_using_doubletap_perk ) - level thread turn_doubletap_on(); - - if ( isdefined( level.zombiemode_using_marathon_perk ) && level.zombiemode_using_marathon_perk ) - level thread turn_marathon_on(); - - if ( isdefined( level.zombiemode_using_juggernaut_perk ) && level.zombiemode_using_juggernaut_perk ) - level thread turn_jugger_on(); - - if ( isdefined( level.zombiemode_using_revive_perk ) && level.zombiemode_using_revive_perk ) - level thread turn_revive_on(); - - if ( isdefined( level.zombiemode_using_sleightofhand_perk ) && level.zombiemode_using_sleightofhand_perk ) - level thread turn_sleight_on(); - - if ( isdefined( level.zombiemode_using_deadshot_perk ) && level.zombiemode_using_deadshot_perk ) - level thread turn_deadshot_on(); - - if ( isdefined( level.zombiemode_using_tombstone_perk ) && level.zombiemode_using_tombstone_perk ) - level thread turn_tombstone_on(); - - if ( isdefined( level.zombiemode_using_additionalprimaryweapon_perk ) && level.zombiemode_using_additionalprimaryweapon_perk ) - level thread turn_additionalprimaryweapon_on(); - - if ( isdefined( level.zombiemode_using_chugabud_perk ) && level.zombiemode_using_chugabud_perk ) - level thread turn_chugabud_on(); - - if ( level._custom_perks.size > 0 ) - { - a_keys = getarraykeys( level._custom_perks ); - - for ( i = 0; i < a_keys.size; i++ ) - { - if ( isdefined( level._custom_perks[a_keys[i]].perk_machine_thread ) ) - level thread [[ level._custom_perks[a_keys[i]].perk_machine_thread ]](); - } - } - - if ( isdefined( level._custom_turn_packapunch_on ) ) - level thread [[ level._custom_turn_packapunch_on ]](); - else - level thread turn_packapunch_on(); - - if ( isdefined( level.quantum_bomb_register_result_func ) ) - [[ level.quantum_bomb_register_result_func ]]( "give_nearest_perk", ::quantum_bomb_give_nearest_perk_result, 10, ::quantum_bomb_give_nearest_perk_validation ); - - level thread perk_hostmigration(); } -default_vending_precaching() +default_vending_precaching() //checked changed to match cerberus output { - if ( isdefined( level.zombiemode_using_pack_a_punch ) && level.zombiemode_using_pack_a_punch ) - { - precacheitem( "zombie_knuckle_crack" ); - precachemodel( "p6_anim_zm_buildable_pap" ); - precachemodel( "p6_anim_zm_buildable_pap_on" ); - precachestring( &"ZOMBIE_PERK_PACKAPUNCH" ); - precachestring( &"ZOMBIE_PERK_PACKAPUNCH_ATT" ); - level._effect["packapunch_fx"] = loadfx( "maps/zombie/fx_zombie_packapunch" ); - level.machine_assets["packapunch"] = spawnstruct(); - level.machine_assets["packapunch"].weapon = "zombie_knuckle_crack"; - level.machine_assets["packapunch"].off_model = "p6_anim_zm_buildable_pap"; - level.machine_assets["packapunch"].on_model = "p6_anim_zm_buildable_pap_on"; - } - - if ( isdefined( level.zombiemode_using_additionalprimaryweapon_perk ) && level.zombiemode_using_additionalprimaryweapon_perk ) - { - precacheitem( "zombie_perk_bottle_additionalprimaryweapon" ); - precacheshader( "specialty_additionalprimaryweapon_zombies" ); - precachemodel( "zombie_vending_three_gun" ); - precachemodel( "zombie_vending_three_gun_on" ); - precachestring( &"ZOMBIE_PERK_ADDITIONALWEAPONPERK" ); - level._effect["additionalprimaryweapon_light"] = loadfx( "misc/fx_zombie_cola_arsenal_on" ); - level.machine_assets["additionalprimaryweapon"] = spawnstruct(); - level.machine_assets["additionalprimaryweapon"].weapon = "zombie_perk_bottle_additionalprimaryweapon"; - level.machine_assets["additionalprimaryweapon"].off_model = "zombie_vending_three_gun"; - level.machine_assets["additionalprimaryweapon"].on_model = "zombie_vending_three_gun_on"; - } - - if ( isdefined( level.zombiemode_using_deadshot_perk ) && level.zombiemode_using_deadshot_perk ) - { - precacheitem( "zombie_perk_bottle_deadshot" ); - precacheshader( "specialty_ads_zombies" ); - precachemodel( "zombie_vending_ads" ); - precachemodel( "zombie_vending_ads_on" ); - precachestring( &"ZOMBIE_PERK_DEADSHOT" ); - level._effect["deadshot_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" ); - level.machine_assets["deadshot"] = spawnstruct(); - level.machine_assets["deadshot"].weapon = "zombie_perk_bottle_deadshot"; - level.machine_assets["deadshot"].off_model = "zombie_vending_ads"; - level.machine_assets["deadshot"].on_model = "zombie_vending_ads_on"; - } - - if ( isdefined( level.zombiemode_using_doubletap_perk ) && level.zombiemode_using_doubletap_perk ) - { - precacheitem( "zombie_perk_bottle_doubletap" ); - precacheshader( "specialty_doubletap_zombies" ); - precachemodel( "zombie_vending_doubletap2" ); - precachemodel( "zombie_vending_doubletap2_on" ); - precachestring( &"ZOMBIE_PERK_DOUBLETAP" ); - level._effect["doubletap_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" ); - level.machine_assets["doubletap"] = spawnstruct(); - level.machine_assets["doubletap"].weapon = "zombie_perk_bottle_doubletap"; - level.machine_assets["doubletap"].off_model = "zombie_vending_doubletap2"; - level.machine_assets["doubletap"].on_model = "zombie_vending_doubletap2_on"; - } - - if ( isdefined( level.zombiemode_using_juggernaut_perk ) && level.zombiemode_using_juggernaut_perk ) - { - precacheitem( "zombie_perk_bottle_jugg" ); - precacheshader( "specialty_juggernaut_zombies" ); - precachemodel( "zombie_vending_jugg" ); - precachemodel( "zombie_vending_jugg_on" ); - precachestring( &"ZOMBIE_PERK_JUGGERNAUT" ); - level._effect["jugger_light"] = loadfx( "misc/fx_zombie_cola_jugg_on" ); - level.machine_assets["juggernog"] = spawnstruct(); - level.machine_assets["juggernog"].weapon = "zombie_perk_bottle_jugg"; - level.machine_assets["juggernog"].off_model = "zombie_vending_jugg"; - level.machine_assets["juggernog"].on_model = "zombie_vending_jugg_on"; - } - - if ( isdefined( level.zombiemode_using_marathon_perk ) && level.zombiemode_using_marathon_perk ) - { - precacheitem( "zombie_perk_bottle_marathon" ); - precacheshader( "specialty_marathon_zombies" ); - precachemodel( "zombie_vending_marathon" ); - precachemodel( "zombie_vending_marathon_on" ); - precachestring( &"ZOMBIE_PERK_MARATHON" ); - level._effect["marathon_light"] = loadfx( "maps/zombie/fx_zmb_cola_staminup_on" ); - level.machine_assets["marathon"] = spawnstruct(); - level.machine_assets["marathon"].weapon = "zombie_perk_bottle_marathon"; - level.machine_assets["marathon"].off_model = "zombie_vending_marathon"; - level.machine_assets["marathon"].on_model = "zombie_vending_marathon_on"; - } - - if ( isdefined( level.zombiemode_using_revive_perk ) && level.zombiemode_using_revive_perk ) - { - precacheitem( "zombie_perk_bottle_revive" ); - precacheshader( "specialty_quickrevive_zombies" ); - precachemodel( "zombie_vending_revive" ); - precachemodel( "zombie_vending_revive_on" ); - precachestring( &"ZOMBIE_PERK_QUICKREVIVE" ); - level._effect["revive_light"] = loadfx( "misc/fx_zombie_cola_revive_on" ); - level._effect["revive_light_flicker"] = loadfx( "maps/zombie/fx_zmb_cola_revive_flicker" ); - level.machine_assets["revive"] = spawnstruct(); - level.machine_assets["revive"].weapon = "zombie_perk_bottle_revive"; - level.machine_assets["revive"].off_model = "zombie_vending_revive"; - level.machine_assets["revive"].on_model = "zombie_vending_revive_on"; - } - - if ( isdefined( level.zombiemode_using_sleightofhand_perk ) && level.zombiemode_using_sleightofhand_perk ) - { - precacheitem( "zombie_perk_bottle_sleight" ); - precacheshader( "specialty_fastreload_zombies" ); - precachemodel( "zombie_vending_sleight" ); - precachemodel( "zombie_vending_sleight_on" ); - precachestring( &"ZOMBIE_PERK_FASTRELOAD" ); - level._effect["sleight_light"] = loadfx( "misc/fx_zombie_cola_on" ); - level.machine_assets["speedcola"] = spawnstruct(); - level.machine_assets["speedcola"].weapon = "zombie_perk_bottle_sleight"; - level.machine_assets["speedcola"].off_model = "zombie_vending_sleight"; - level.machine_assets["speedcola"].on_model = "zombie_vending_sleight_on"; - } - - if ( isdefined( level.zombiemode_using_tombstone_perk ) && level.zombiemode_using_tombstone_perk ) - { - precacheitem( "zombie_perk_bottle_tombstone" ); - precacheshader( "specialty_tombstone_zombies" ); - precachemodel( "zombie_vending_tombstone" ); - precachemodel( "zombie_vending_tombstone_on" ); - precachemodel( "ch_tombstone1" ); - precachestring( &"ZOMBIE_PERK_TOMBSTONE" ); - level._effect["tombstone_light"] = loadfx( "misc/fx_zombie_cola_on" ); - level.machine_assets["tombstone"] = spawnstruct(); - level.machine_assets["tombstone"].weapon = "zombie_perk_bottle_tombstone"; - level.machine_assets["tombstone"].off_model = "zombie_vending_tombstone"; - level.machine_assets["tombstone"].on_model = "zombie_vending_tombstone_on"; - } - - if ( isdefined( level.zombiemode_using_chugabud_perk ) && level.zombiemode_using_chugabud_perk ) - { - precacheitem( "zombie_perk_bottle_whoswho" ); - precacheshader( "specialty_quickrevive_zombies" ); - precachemodel( "p6_zm_vending_chugabud" ); - precachemodel( "p6_zm_vending_chugabud_on" ); - precachemodel( "ch_tombstone1" ); - precachestring( &"ZOMBIE_PERK_TOMBSTONE" ); - level._effect["tombstone_light"] = loadfx( "misc/fx_zombie_cola_on" ); - level.machine_assets["whoswho"] = spawnstruct(); - level.machine_assets["whoswho"].weapon = "zombie_perk_bottle_whoswho"; - level.machine_assets["whoswho"].off_model = "p6_zm_vending_chugabud"; - level.machine_assets["whoswho"].on_model = "p6_zm_vending_chugabud_on"; - } - - if ( level._custom_perks.size > 0 ) - { - a_keys = getarraykeys( level._custom_perks ); - - for ( i = 0; i < a_keys.size; i++ ) - { - if ( isdefined( level._custom_perks[a_keys[i]].precache_func ) ) - level [[ level._custom_perks[a_keys[i]].precache_func ]](); - } - } + if ( is_true( level.zombiemode_using_pack_a_punch ) ) + { + precacheitem( "zombie_knuckle_crack" ); + precachemodel( "p6_anim_zm_buildable_pap" ); + precachemodel( "p6_anim_zm_buildable_pap_on" ); + precachestring( &"ZOMBIE_PERK_PACKAPUNCH" ); + precachestring( &"ZOMBIE_PERK_PACKAPUNCH_ATT" ); + level._effect[ "packapunch_fx" ] = loadfx( "maps/zombie/fx_zombie_packapunch" ); + level.machine_assets[ "packapunch" ] = spawnstruct(); + level.machine_assets[ "packapunch" ].weapon = "zombie_knuckle_crack"; + level.machine_assets[ "packapunch" ].off_model = "p6_anim_zm_buildable_pap"; + level.machine_assets[ "packapunch" ].on_model = "p6_anim_zm_buildable_pap_on"; + } + if ( is_true( level.zombiemode_using_additionalprimaryweapon_perk ) ) + { + precacheitem( "zombie_perk_bottle_additionalprimaryweapon" ); + precacheshader( "specialty_additionalprimaryweapon_zombies" ); + precachemodel( "zombie_vending_three_gun" ); + precachemodel( "zombie_vending_three_gun_on" ); + precachestring( &"ZOMBIE_PERK_ADDITIONALWEAPONPERK" ); + level._effect[ "additionalprimaryweapon_light" ] = loadfx( "misc/fx_zombie_cola_arsenal_on" ); + level.machine_assets[ "additionalprimaryweapon" ] = spawnstruct(); + level.machine_assets[ "additionalprimaryweapon" ].weapon = "zombie_perk_bottle_additionalprimaryweapon"; + level.machine_assets[ "additionalprimaryweapon" ].off_model = "zombie_vending_three_gun"; + level.machine_assets[ "additionalprimaryweapon" ].on_model = "zombie_vending_three_gun_on"; + } + if ( is_true( level.zombiemode_using_deadshot_perk ) ) + { + precacheitem( "zombie_perk_bottle_deadshot" ); + precacheshader( "specialty_ads_zombies" ); + precachemodel( "zombie_vending_ads" ); + precachemodel( "zombie_vending_ads_on" ); + precachestring( &"ZOMBIE_PERK_DEADSHOT" ); + level._effect[ "deadshot_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level.machine_assets[ "deadshot" ] = spawnstruct(); + level.machine_assets[ "deadshot" ].weapon = "zombie_perk_bottle_deadshot"; + level.machine_assets[ "deadshot" ].off_model = "zombie_vending_ads"; + level.machine_assets[ "deadshot" ].on_model = "zombie_vending_ads_on"; + } + if ( is_true( level.zombiemode_using_doubletap_perk ) ) + { + precacheitem( "zombie_perk_bottle_doubletap" ); + precacheshader( "specialty_doubletap_zombies" ); + precachemodel( "zombie_vending_doubletap2" ); + precachemodel( "zombie_vending_doubletap2_on" ); + precachestring( &"ZOMBIE_PERK_DOUBLETAP" ); + level._effect[ "doubletap_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level.machine_assets[ "doubletap" ] = spawnstruct(); + level.machine_assets[ "doubletap" ].weapon = "zombie_perk_bottle_doubletap"; + level.machine_assets[ "doubletap" ].off_model = "zombie_vending_doubletap2"; + level.machine_assets[ "doubletap" ].on_model = "zombie_vending_doubletap2_on"; + } + if ( is_true( level.zombiemode_using_juggernaut_perk ) ) + { + precacheitem( "zombie_perk_bottle_jugg" ); + precacheshader( "specialty_juggernaut_zombies" ); + precachemodel( "zombie_vending_jugg" ); + precachemodel( "zombie_vending_jugg_on" ); + precachestring( &"ZOMBIE_PERK_JUGGERNAUT" ); + level._effect[ "jugger_light" ] = loadfx( "misc/fx_zombie_cola_jugg_on" ); + level.machine_assets[ "juggernog" ] = spawnstruct(); + level.machine_assets[ "juggernog" ].weapon = "zombie_perk_bottle_jugg"; + level.machine_assets[ "juggernog" ].off_model = "zombie_vending_jugg"; + level.machine_assets[ "juggernog" ].on_model = "zombie_vending_jugg_on"; + } + if ( is_true( level.zombiemode_using_marathon_perk ) ) + { + precacheitem( "zombie_perk_bottle_marathon" ); + precacheshader( "specialty_marathon_zombies" ); + precachemodel( "zombie_vending_marathon" ); + precachemodel( "zombie_vending_marathon_on" ); + precachestring( &"ZOMBIE_PERK_MARATHON" ); + level._effect[ "marathon_light" ] = loadfx( "maps/zombie/fx_zmb_cola_staminup_on" ); + level.machine_assets[ "marathon" ] = spawnstruct(); + level.machine_assets[ "marathon" ].weapon = "zombie_perk_bottle_marathon"; + level.machine_assets[ "marathon" ].off_model = "zombie_vending_marathon"; + level.machine_assets[ "marathon" ].on_model = "zombie_vending_marathon_on"; + } + if ( is_true( level.zombiemode_using_revive_perk ) ) + { + precacheitem( "zombie_perk_bottle_revive" ); + precacheshader( "specialty_quickrevive_zombies" ); + precachemodel( "zombie_vending_revive" ); + precachemodel( "zombie_vending_revive_on" ); + precachestring( &"ZOMBIE_PERK_QUICKREVIVE" ); + level._effect[ "revive_light" ] = loadfx( "misc/fx_zombie_cola_revive_on" ); + level._effect[ "revive_light_flicker" ] = loadfx( "maps/zombie/fx_zmb_cola_revive_flicker" ); + level.machine_assets[ "revive" ] = spawnstruct(); + level.machine_assets[ "revive" ].weapon = "zombie_perk_bottle_revive"; + level.machine_assets[ "revive" ].off_model = "zombie_vending_revive"; + level.machine_assets[ "revive" ].on_model = "zombie_vending_revive_on"; + } + if ( is_true( level.zombiemode_using_sleightofhand_perk ) ) + { + precacheitem( "zombie_perk_bottle_sleight" ); + precacheshader( "specialty_fastreload_zombies" ); + precachemodel( "zombie_vending_sleight" ); + precachemodel( "zombie_vending_sleight_on" ); + precachestring( &"ZOMBIE_PERK_FASTRELOAD" ); + level._effect[ "sleight_light" ] = loadfx( "misc/fx_zombie_cola_on" ); + level.machine_assets[ "speedcola" ] = spawnstruct(); + level.machine_assets[ "speedcola" ].weapon = "zombie_perk_bottle_sleight"; + level.machine_assets[ "speedcola" ].off_model = "zombie_vending_sleight"; + level.machine_assets[ "speedcola" ].on_model = "zombie_vending_sleight_on"; + } + if ( is_true( level.zombiemode_using_tombstone_perk ) ) + { + precacheitem( "zombie_perk_bottle_tombstone" ); + precacheshader( "specialty_tombstone_zombies" ); + precachemodel( "zombie_vending_tombstone" ); + precachemodel( "zombie_vending_tombstone_on" ); + precachemodel( "ch_tombstone1" ); + precachestring( &"ZOMBIE_PERK_TOMBSTONE" ); + level._effect[ "tombstone_light" ] = loadfx( "misc/fx_zombie_cola_on" ); + level.machine_assets[ "tombstone" ] = spawnstruct(); + level.machine_assets[ "tombstone" ].weapon = "zombie_perk_bottle_tombstone"; + level.machine_assets[ "tombstone" ].off_model = "zombie_vending_tombstone"; + level.machine_assets[ "tombstone" ].on_model = "zombie_vending_tombstone_on"; + } + if ( is_true( level.zombiemode_using_chugabud_perk ) ) + { + precacheitem( "zombie_perk_bottle_whoswho" ); + precacheshader( "specialty_quickrevive_zombies" ); + precachemodel( "p6_zm_vending_chugabud" ); + precachemodel( "p6_zm_vending_chugabud_on" ); + precachemodel( "ch_tombstone1" ); + precachestring( &"ZOMBIE_PERK_TOMBSTONE" ); + level._effect[ "tombstone_light" ] = loadfx( "misc/fx_zombie_cola_on" ); + level.machine_assets[ "whoswho" ] = spawnstruct(); + level.machine_assets[ "whoswho" ].weapon = "zombie_perk_bottle_whoswho"; + level.machine_assets[ "whoswho" ].off_model = "p6_zm_vending_chugabud"; + level.machine_assets[ "whoswho" ].on_model = "p6_zm_vending_chugabud_on"; + } + if ( level._custom_perks.size > 0 ) //changed + { + a_keys = getarraykeys( level._custom_perks ); + for ( i = 0; i < a_keys.size; i++ ) + { + if ( isdefined( level._custom_perks[ a_keys[ i ] ].precache_func ) ) + { + level [[ level._custom_perks[ a_keys[ i ] ].precache_func ]](); + } + } + } } -pap_weapon_move_in( trigger, origin_offset, angles_offset ) +pap_weapon_move_in( trigger, origin_offset, angles_offset ) //checked matches cerberus output { - level endon( "Pack_A_Punch_off" ); - trigger endon( "pap_player_disconnected" ); - trigger.worldgun rotateto( self.angles + angles_offset + vectorscale( ( 0, 1, 0 ), 90.0 ), 0.35, 0, 0 ); - offsetdw = vectorscale( ( 1, 1, 1 ), 3.0 ); - - if ( isdefined( trigger.worldgun.worldgundw ) ) - trigger.worldgun.worldgundw rotateto( self.angles + angles_offset + vectorscale( ( 0, 1, 0 ), 90.0 ), 0.35, 0, 0 ); - - wait 0.5; - trigger.worldgun moveto( self.origin + origin_offset, 0.5, 0, 0 ); - - if ( isdefined( trigger.worldgun.worldgundw ) ) - trigger.worldgun.worldgundw moveto( self.origin + origin_offset + offsetdw, 0.5, 0, 0 ); + level endon( "Pack_A_Punch_off" ); + trigger endon( "pap_player_disconnected" ); + trigger.worldgun rotateto( self.angles + angles_offset + vectorScale( ( 0, 1, 0 ), 90 ), 0.35, 0, 0 ); + offsetdw = vectorScale( ( 1, 1, 1 ), 3 ); + if ( isDefined( trigger.worldgun.worldgundw ) ) + { + trigger.worldgun.worldgundw rotateto( self.angles + angles_offset + vectorScale( ( 0, 1, 0 ), 90 ), 0.35, 0, 0 ); + } + wait 0.5; + trigger.worldgun moveto( self.origin + origin_offset, 0.5, 0, 0 ); + if ( isDefined( trigger.worldgun.worldgundw ) ) + { + trigger.worldgun.worldgundw moveto( self.origin + origin_offset + offsetdw, 0.5, 0, 0 ); + } } -pap_weapon_move_out( trigger, origin_offset, interact_offset ) +pap_weapon_move_out( trigger, origin_offset, interact_offset ) //checked matches cerberus output { - level endon( "Pack_A_Punch_off" ); - trigger endon( "pap_player_disconnected" ); - offsetdw = vectorscale( ( 1, 1, 1 ), 3.0 ); - - if ( !isdefined( trigger.worldgun ) ) - return; - - trigger.worldgun moveto( self.origin + interact_offset, 0.5, 0, 0 ); - - if ( isdefined( trigger.worldgun.worldgundw ) ) - trigger.worldgun.worldgundw moveto( self.origin + interact_offset + offsetdw, 0.5, 0, 0 ); - - wait 0.5; - - if ( !isdefined( trigger.worldgun ) ) - return; - - trigger.worldgun moveto( self.origin + origin_offset, level.packapunch_timeout, 0, 0 ); - - if ( isdefined( trigger.worldgun.worldgundw ) ) - trigger.worldgun.worldgundw moveto( self.origin + origin_offset + offsetdw, level.packapunch_timeout, 0, 0 ); + level endon( "Pack_A_Punch_off" ); + trigger endon( "pap_player_disconnected" ); + offsetdw = vectorScale( ( 1, 1, 1 ), 3 ); + if ( !isDefined( trigger.worldgun ) ) + { + return; + } + trigger.worldgun moveto( self.origin + interact_offset, 0.5, 0, 0 ); + if ( isDefined( trigger.worldgun.worldgundw ) ) + { + trigger.worldgun.worldgundw moveto( self.origin + interact_offset + offsetdw, 0.5, 0, 0 ); + } + wait 0.5; + if ( !isDefined( trigger.worldgun ) ) + { + return; + } + trigger.worldgun moveto( self.origin + origin_offset, level.packapunch_timeout, 0, 0 ); + if ( isDefined( trigger.worldgun.worldgundw ) ) + { + trigger.worldgun.worldgundw moveto( self.origin + origin_offset + offsetdw, level.packapunch_timeout, 0, 0 ); + } } -fx_ent_failsafe() +fx_ent_failsafe() //checked matches cerberus output { - wait 25; - self delete(); + wait 25; + self delete(); } -third_person_weapon_upgrade( current_weapon, upgrade_weapon, packa_rollers, perk_machine, trigger ) +third_person_weapon_upgrade( current_weapon, upgrade_weapon, packa_rollers, perk_machine, trigger ) //checked matches cerberus output { - level endon( "Pack_A_Punch_off" ); - trigger endon( "pap_player_disconnected" ); - rel_entity = trigger.perk_machine; - origin_offset = ( 0, 0, 0 ); - angles_offset = ( 0, 0, 0 ); - origin_base = self.origin; - angles_base = self.angles; - - if ( isdefined( rel_entity ) ) - { - if ( isdefined( level.pap_interaction_height ) ) - origin_offset = ( 0, 0, level.pap_interaction_height ); - else - origin_offset = vectorscale( ( 0, 0, 1 ), 35.0 ); - - angles_offset = vectorscale( ( 0, 1, 0 ), 90.0 ); - origin_base = rel_entity.origin; - angles_base = rel_entity.angles; - } - else - rel_entity = self; - - forward = anglestoforward( angles_base + angles_offset ); - interact_offset = origin_offset + forward * -25; - - if ( !isdefined( perk_machine.fx_ent ) ) - { - perk_machine.fx_ent = spawn( "script_model", origin_base + origin_offset + ( 0, 1, -34 ) ); - perk_machine.fx_ent.angles = angles_base + angles_offset; - perk_machine.fx_ent setmodel( "tag_origin" ); - perk_machine.fx_ent linkto( perk_machine ); - } - - if ( isdefined( level._effect["packapunch_fx"] ) ) - fx = playfxontag( level._effect["packapunch_fx"], perk_machine.fx_ent, "tag_origin" ); - - offsetdw = vectorscale( ( 1, 1, 1 ), 3.0 ); - weoptions = self maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( current_weapon ); - trigger.worldgun = spawn_weapon_model( current_weapon, undefined, origin_base + interact_offset, self.angles, weoptions ); - worldgundw = undefined; - - if ( maps\mp\zombies\_zm_magicbox::weapon_is_dual_wield( current_weapon ) ) - worldgundw = spawn_weapon_model( current_weapon, maps\mp\zombies\_zm_magicbox::get_left_hand_weapon_model_name( current_weapon ), origin_base + interact_offset + offsetdw, self.angles, weoptions ); - - trigger.worldgun.worldgundw = worldgundw; - - if ( isdefined( level.custom_pap_move_in ) ) - perk_machine [[ level.custom_pap_move_in ]]( trigger, origin_offset, angles_offset, perk_machine ); - else - perk_machine pap_weapon_move_in( trigger, origin_offset, angles_offset ); - - self playsound( "zmb_perks_packa_upgrade" ); - - if ( isdefined( perk_machine.wait_flag ) ) - perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles + vectorscale( ( 1, 0, 0 ), 179.0 ), 0.25, 0, 0 ); - - wait 0.35; - trigger.worldgun delete(); - - if ( isdefined( worldgundw ) ) - worldgundw delete(); - - wait 3; - - if ( isdefined( self ) ) - self playsound( "zmb_perks_packa_ready" ); - else - return; - - upoptions = self maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( upgrade_weapon ); - trigger.current_weapon = current_weapon; - trigger.upgrade_name = upgrade_weapon; - trigger.worldgun = spawn_weapon_model( upgrade_weapon, undefined, origin_base + origin_offset, angles_base + angles_offset + vectorscale( ( 0, 1, 0 ), 90.0 ), upoptions ); - worldgundw = undefined; - - if ( maps\mp\zombies\_zm_magicbox::weapon_is_dual_wield( upgrade_weapon ) ) - worldgundw = spawn_weapon_model( upgrade_weapon, maps\mp\zombies\_zm_magicbox::get_left_hand_weapon_model_name( upgrade_weapon ), origin_base + origin_offset + offsetdw, angles_base + angles_offset + vectorscale( ( 0, 1, 0 ), 90.0 ), upoptions ); - - trigger.worldgun.worldgundw = worldgundw; - - if ( isdefined( perk_machine.wait_flag ) ) - perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles - vectorscale( ( 1, 0, 0 ), 179.0 ), 0.25, 0, 0 ); - - if ( isdefined( level.custom_pap_move_out ) ) - rel_entity thread [[ level.custom_pap_move_out ]]( trigger, origin_offset, interact_offset ); - else - rel_entity thread pap_weapon_move_out( trigger, origin_offset, interact_offset ); - - return trigger.worldgun; + level endon( "Pack_A_Punch_off" ); + trigger endon( "pap_player_disconnected" ); + rel_entity = trigger.perk_machine; + origin_offset = ( 0, 0, 0 ); + angles_offset = ( 0, 0, 0 ); + origin_base = self.origin; + angles_base = self.angles; + if ( isDefined( rel_entity ) ) + { + if ( isDefined( level.pap_interaction_height ) ) + { + origin_offset = ( 0, 0, level.pap_interaction_height ); + } + else + { + origin_offset = vectorScale( ( 0, 0, 1 ), 35 ); + } + angles_offset = vectorScale( ( 0, 1, 0 ), 90 ); + origin_base = rel_entity.origin; + angles_base = rel_entity.angles; + } + else + { + rel_entity = self; + } + forward = anglesToForward( angles_base + angles_offset ); + interact_offset = origin_offset + ( forward * -25 ); + if ( !isDefined( perk_machine.fx_ent ) ) + { + perk_machine.fx_ent = spawn( "script_model", origin_base + origin_offset + ( 0, 1, -34 ) ); + perk_machine.fx_ent.angles = angles_base + angles_offset; + perk_machine.fx_ent setmodel( "tag_origin" ); + perk_machine.fx_ent linkto( perk_machine ); + } + if ( isDefined( level._effect[ "packapunch_fx" ] ) ) + { + fx = playfxontag( level._effect[ "packapunch_fx" ], perk_machine.fx_ent, "tag_origin" ); + } + offsetdw = vectorScale( ( 1, 1, 1 ), 3 ); + weoptions = self maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( current_weapon ); + trigger.worldgun = spawn_weapon_model( current_weapon, undefined, origin_base + interact_offset, self.angles, weoptions ); + worldgundw = undefined; + if ( maps/mp/zombies/_zm_magicbox::weapon_is_dual_wield( current_weapon ) ) + { + worldgundw = spawn_weapon_model( current_weapon, maps/mp/zombies/_zm_magicbox::get_left_hand_weapon_model_name( current_weapon ), origin_base + interact_offset + offsetdw, self.angles, weoptions ); + } + trigger.worldgun.worldgundw = worldgundw; + if ( isDefined( level.custom_pap_move_in ) ) + { + perk_machine [[ level.custom_pap_move_in ]]( trigger, origin_offset, angles_offset, perk_machine ); + } + else + { + perk_machine pap_weapon_move_in( trigger, origin_offset, angles_offset ); + } + self playsound( "zmb_perks_packa_upgrade" ); + if ( isDefined( perk_machine.wait_flag ) ) + { + perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles + vectorScale( ( 1, 0, 0 ), 179 ), 0.25, 0, 0 ); + } + wait 0.35; + trigger.worldgun delete(); + if ( isDefined( worldgundw ) ) + { + worldgundw delete(); + } + wait 3; + if ( isDefined( self ) ) + { + self playsound( "zmb_perks_packa_ready" ); + } + else + { + return; + } + upoptions = self maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( upgrade_weapon ); + trigger.current_weapon = current_weapon; + trigger.upgrade_name = upgrade_weapon; + trigger.worldgun = spawn_weapon_model( upgrade_weapon, undefined, origin_base + origin_offset, angles_base + angles_offset + vectorScale( ( 0, 1, 0 ), 90 ), upoptions ); + worldgundw = undefined; + if ( maps/mp/zombies/_zm_magicbox::weapon_is_dual_wield( upgrade_weapon ) ) + { + worldgundw = spawn_weapon_model( upgrade_weapon, maps/mp/zombies/_zm_magicbox::get_left_hand_weapon_model_name( upgrade_weapon ), origin_base + origin_offset + offsetdw, angles_base + angles_offset + vectorScale( ( 0, -1, 0 ), 90 ), upoptions ); + } + trigger.worldgun.worldgundw = worldgundw; + if ( isDefined( perk_machine.wait_flag ) ) + { + perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles - vectorScale( ( 1, 0, 0 ), 179 ), 0.25, 0, 0 ); + } + if ( isDefined( level.custom_pap_move_out ) ) + { + rel_entity thread [[ level.custom_pap_move_out ]]( trigger, origin_offset, interact_offset ); + } + else + { + rel_entity thread pap_weapon_move_out( trigger, origin_offset, interact_offset ); + } + return trigger.worldgun; } -can_pack_weapon( weaponname ) +can_pack_weapon( weaponname ) //checked did not match cebrerus output changed at own discretion { - if ( "riotshield_zm" == weaponname ) - return false; - - if ( flag( "pack_machine_in_use" ) ) - return true; - - weaponname = self get_nonalternate_weapon( weaponname ); - - if ( !maps\mp\zombies\_zm_weapons::is_weapon_or_base_included( weaponname ) ) - return false; - - if ( !self maps\mp\zombies\_zm_weapons::can_upgrade_weapon( weaponname ) ) - return false; - - return true; + if ( weaponname == "riotshield_zm" ) + { + return 0; + } + if ( flag( "pack_machine_in_use" ) ) + { + return 1; + } + weaponname = self get_nonalternate_weapon( weaponname ); + if ( !maps/mp/zombies/_zm_weapons::is_weapon_or_base_included( weaponname ) ) + { + return 0; + } + if ( !self maps/mp/zombies/_zm_weapons::can_upgrade_weapon( weaponname ) ) + { + return 0; + } + return 1; } -player_use_can_pack_now() +player_use_can_pack_now() //checked changed to match cerberus output { - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( self.intermission ) && self.intermission || self isthrowinggrenade() ) - return false; - - if ( !self can_buy_weapon() ) - return false; - - if ( self hacker_active() ) - return false; - - if ( !self can_pack_weapon( self getcurrentweapon() ) ) - return false; - - return true; + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || is_true( self.intermission ) || self isthrowinggrenade() ) + { + return 0; + } + if ( !self can_buy_weapon() ) + { + return 0; + } + if ( self hacker_active() ) + { + return 0; + } + if ( !self can_pack_weapon( self getcurrentweapon() ) ) + { + return 0; + } + return 1; } -vending_machine_trigger_think() +vending_machine_trigger_think() //changed 3/30/20 4:17 pm //checked matches cerberus output { - self endon( "death" ); - self endon( "Pack_A_Punch_off" ); - - while ( true ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( self.pack_player ) && self.pack_player != players[i] || !players[i] player_use_can_pack_now() ) - { - self setinvisibletoplayer( players[i], 1 ); - continue; - } - - self setinvisibletoplayer( players[i], 0 ); - } - - wait 0.1; - } + self endon("death"); + self endon("Pack_A_Punch_off"); + while( 1 ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( isdefined( self.pack_player ) && self.pack_player != players[ i ] || !players[ i ] player_use_can_pack_now() ) + { + self setinvisibletoplayer( players[ i ], 1 ); + i++; + continue; + } + self setinvisibletoplayer( players[ i ], 0 ); + i++; + } + wait 0.1; + } } -vending_weapon_upgrade() +vending_weapon_upgrade() //checked matches cerberus output { - level endon( "Pack_A_Punch_off" ); - wait 0.01; - perk_machine = getent( self.target, "targetname" ); - self.perk_machine = perk_machine; - perk_machine_sound = getentarray( "perksacola", "targetname" ); - packa_rollers = spawn( "script_origin", self.origin ); - packa_timer = spawn( "script_origin", self.origin ); - packa_rollers linkto( self ); - packa_timer linkto( self ); - - if ( isdefined( perk_machine.target ) ) - perk_machine.wait_flag = getent( perk_machine.target, "targetname" ); - - pap_is_buildable = self is_buildable(); - - if ( pap_is_buildable ) - { - self trigger_off(); - perk_machine hide(); - - if ( isdefined( perk_machine.wait_flag ) ) - perk_machine.wait_flag hide(); - - wait_for_buildable( "pap" ); - self trigger_on(); - perk_machine show(); - - if ( isdefined( perk_machine.wait_flag ) ) - perk_machine.wait_flag show(); - } - - self usetriggerrequirelookat(); - self sethintstring( &"ZOMBIE_NEED_POWER" ); - self setcursorhint( "HINT_NOICON" ); - power_off = !self maps\mp\zombies\_zm_power::pap_is_on(); - - if ( power_off ) - { - pap_array = []; - pap_array[0] = perk_machine; - level thread do_initial_power_off_callback( pap_array, "packapunch" ); - - level waittill( "Pack_A_Punch_on" ); - } - - self enable_trigger(); - - if ( isdefined( level.machine_assets["packapunch"].power_on_callback ) ) - perk_machine thread [[ level.machine_assets["packapunch"].power_on_callback ]](); - - self thread vending_machine_trigger_think(); - perk_machine playloopsound( "zmb_perks_packa_loop" ); - self thread shutoffpapsounds( perk_machine, packa_rollers, packa_timer ); - self thread vending_weapon_upgrade_cost(); - - for (;;) - { - self.pack_player = undefined; - - self waittill( "trigger", player ); - - index = maps\mp\zombies\_zm_weapons::get_player_index( player ); - current_weapon = player getcurrentweapon(); - - if ( "microwavegun_zm" == current_weapon ) - current_weapon = "microwavegundw_zm"; - - current_weapon = player maps\mp\zombies\_zm_weapons::switch_from_alt_weapon( current_weapon ); - - if ( isdefined( level.custom_pap_validation ) ) - { - valid = self [[ level.custom_pap_validation ]]( player ); - - if ( !valid ) - continue; - } - - if ( !player maps\mp\zombies\_zm_magicbox::can_buy_weapon() || player maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( player.intermission ) && player.intermission || player isthrowinggrenade() || !player maps\mp\zombies\_zm_weapons::can_upgrade_weapon( current_weapon ) ) - { - wait 0.1; - continue; - } - - if ( isdefined( level.pap_moving ) && level.pap_moving ) - continue; - - if ( player isswitchingweapons() ) - { - wait 0.1; - - if ( player isswitchingweapons() ) - continue; - } - - if ( !maps\mp\zombies\_zm_weapons::is_weapon_or_base_included( current_weapon ) ) - continue; - - current_cost = self.cost; - player.restore_ammo = undefined; - player.restore_clip = undefined; - player.restore_stock = undefined; - player_restore_clip_size = undefined; - player.restore_max = undefined; - upgrade_as_attachment = will_upgrade_weapon_as_attachment( current_weapon ); - - if ( upgrade_as_attachment ) - { - current_cost = self.attachment_cost; - player.restore_ammo = 1; - player.restore_clip = player getweaponammoclip( current_weapon ); - player.restore_clip_size = weaponclipsize( current_weapon ); - player.restore_stock = player getweaponammostock( current_weapon ); - player.restore_max = weaponmaxammo( current_weapon ); - } - - if ( player maps\mp\zombies\_zm_pers_upgrades_functions::is_pers_double_points_active() ) - current_cost = player maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_double_points_cost( current_cost ); - - if ( player.score < current_cost ) - { - self playsound( "deny" ); - - if ( isdefined( level.custom_pap_deny_vo_func ) ) - player [[ level.custom_pap_deny_vo_func ]](); - else - player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); - - continue; - } - - self.pack_player = player; - flag_set( "pack_machine_in_use" ); - maps\mp\_demo::bookmark( "zm_player_use_packapunch", gettime(), player ); - player maps\mp\zombies\_zm_stats::increment_client_stat( "use_pap" ); - player maps\mp\zombies\_zm_stats::increment_player_stat( "use_pap" ); - self thread destroy_weapon_in_blackout( player ); - self thread destroy_weapon_on_disconnect( player ); - player maps\mp\zombies\_zm_score::minus_to_player_score( current_cost, 1 ); - sound = "evt_bottle_dispense"; - playsoundatposition( sound, self.origin ); - self thread maps\mp\zombies\_zm_audio::play_jingle_or_stinger( "mus_perks_packa_sting" ); - player maps\mp\zombies\_zm_audio::create_and_play_dialog( "weapon_pickup", "upgrade_wait" ); - self disable_trigger(); - - if ( !( isdefined( upgrade_as_attachment ) && upgrade_as_attachment ) ) - player thread do_player_general_vox( "general", "pap_wait", 10, 100 ); - else - player thread do_player_general_vox( "general", "pap_wait2", 10, 100 ); - - player thread do_knuckle_crack(); - self.current_weapon = current_weapon; - upgrade_name = maps\mp\zombies\_zm_weapons::get_upgrade_weapon( current_weapon, upgrade_as_attachment ); - player third_person_weapon_upgrade( current_weapon, upgrade_name, packa_rollers, perk_machine, self ); - self enable_trigger(); - self sethintstring( &"ZOMBIE_GET_UPGRADED" ); - - if ( isdefined( player ) ) - { - self setinvisibletoall(); - self setvisibletoplayer( player ); - self thread wait_for_player_to_take( player, current_weapon, packa_timer, upgrade_as_attachment ); - } - - self thread wait_for_timeout( current_weapon, packa_timer, player ); - self waittill_any( "pap_timeout", "pap_taken", "pap_player_disconnected" ); - self.current_weapon = ""; - - if ( isdefined( self.worldgun ) && isdefined( self.worldgun.worldgundw ) ) - self.worldgun.worldgundw delete(); - - if ( isdefined( self.worldgun ) ) - self.worldgun delete(); - - if ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch ) - self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH_ATT", self.cost ); - else - self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); - - self setvisibletoall(); - self.pack_player = undefined; - flag_clear( "pack_machine_in_use" ); - } + level endon( "Pack_A_Punch_off" ); + wait 0.01; + perk_machine = getent( self.target, "targetname" ); + self.perk_machine = perk_machine; + perk_machine_sound = getentarray( "perksacola", "targetname" ); + packa_rollers = spawn( "script_origin", self.origin ); + packa_timer = spawn( "script_origin", self.origin ); + packa_rollers linkto( self ); + packa_timer linkto( self ); + if ( isDefined( perk_machine.target ) ) + { + perk_machine.wait_flag = getent( perk_machine.target, "targetname" ); + } + pap_is_buildable = self is_buildable(); + if ( pap_is_buildable ) + { + self trigger_off(); + perk_machine hide(); + if ( isDefined( perk_machine.wait_flag ) ) + { + perk_machine.wait_flag hide(); + } + wait_for_buildable( "pap" ); + self trigger_on(); + perk_machine show(); + if ( isDefined( perk_machine.wait_flag ) ) + { + perk_machine.wait_flag show(); + } + } + self usetriggerrequirelookat(); + self sethintstring( &"ZOMBIE_NEED_POWER" ); + self setcursorhint( "HINT_NOICON" ); + power_off = !self maps/mp/zombies/_zm_power::pap_is_on(); + if ( power_off ) + { + pap_array = []; + pap_array[ 0 ] = perk_machine; + level thread do_initial_power_off_callback( pap_array, "packapunch" ); + level waittill( "Pack_A_Punch_on" ); + } + self enable_trigger(); + if ( isDefined( level.machine_assets[ "packapunch" ].power_on_callback ) ) + { + perk_machine thread [[ level.machine_assets[ "packapunch" ].power_on_callback ]](); + } + self thread vending_machine_trigger_think(); + perk_machine playloopsound( "zmb_perks_packa_loop" ); + self thread shutoffpapsounds( perk_machine, packa_rollers, packa_timer ); + self thread vending_weapon_upgrade_cost(); + for ( ;; ) + { + self.pack_player = undefined; + self waittill( "trigger", player ); + index = maps/mp/zombies/_zm_weapons::get_player_index( player ); + current_weapon = player getcurrentweapon(); + current_weapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( current_weapon ); + if ( isDefined( level.custom_pap_validation ) ) + { + valid = self [[ level.custom_pap_validation ]]( player ); + if ( !valid ) + { + continue; + } + } + if ( player maps/mp/zombies/_zm_magicbox::can_buy_weapon() && !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && !is_true( player.intermission ) || player isthrowinggrenade() && !player maps/mp/zombies/_zm_weapons::can_upgrade_weapon( current_weapon ) ) + { + wait 0.1; + continue; + } + if ( is_true( level.pap_moving ) ) + { + continue; + } + if ( player isswitchingweapons() ) + { + wait 0.1; + if ( player isswitchingweapons() ) + { + continue; + } + } + if ( !maps/mp/zombies/_zm_weapons::is_weapon_or_base_included( current_weapon ) ) + { + continue; + } + + current_cost = self.cost; + player.restore_ammo = undefined; + player.restore_clip = undefined; + player.restore_stock = undefined; + player_restore_clip_size = undefined; + player.restore_max = undefined; + upgrade_as_attachment = will_upgrade_weapon_as_attachment( current_weapon ); + if ( upgrade_as_attachment ) + { + current_cost = self.attachment_cost; + player.restore_ammo = 1; + player.restore_clip = player getweaponammoclip( current_weapon ); + player.restore_clip_size = weaponclipsize( current_weapon ); + player.restore_stock = player getweaponammostock( current_weapon ); + player.restore_max = weaponmaxammo( current_weapon ); + } + if ( player maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() ) + { + current_cost = player maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_double_points_cost( current_cost ); + } + if ( player.score < current_cost ) + { + self playsound( "deny" ); + if ( isDefined( level.custom_pap_deny_vo_func ) ) + { + player [[ level.custom_pap_deny_vo_func ]](); + } + else + { + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); + } + continue; + } + + self.pack_player = player; + flag_set( "pack_machine_in_use" ); + maps/mp/_demo::bookmark( "zm_player_use_packapunch", getTime(), player ); + player maps/mp/zombies/_zm_stats::increment_client_stat( "use_pap" ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "use_pap" ); + self thread destroy_weapon_in_blackout( player ); + self thread destroy_weapon_on_disconnect( player ); + player maps/mp/zombies/_zm_score::minus_to_player_score( current_cost, 1 ); + sound = "evt_bottle_dispense"; + playsoundatposition( sound, self.origin ); + self thread maps/mp/zombies/_zm_audio::play_jingle_or_stinger( "mus_perks_packa_sting" ); + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", "upgrade_wait" ); + self disable_trigger(); + if ( !is_true( upgrade_as_attachment ) ) + { + player thread do_player_general_vox( "general", "pap_wait", 10, 100 ); + } + else + { + player thread do_player_general_vox( "general", "pap_wait2", 10, 100 ); + } + player thread do_knuckle_crack(); + self.current_weapon = current_weapon; + upgrade_name = maps/mp/zombies/_zm_weapons::get_upgrade_weapon( current_weapon, upgrade_as_attachment ); + player third_person_weapon_upgrade( current_weapon, upgrade_name, packa_rollers, perk_machine, self ); + self enable_trigger(); + self sethintstring( &"ZOMBIE_GET_UPGRADED" ); + if ( isDefined( player ) ) + { + self setinvisibletoall(); + self setvisibletoplayer( player ); + self thread wait_for_player_to_take( player, current_weapon, packa_timer, upgrade_as_attachment ); + } + self thread wait_for_timeout( current_weapon, packa_timer, player ); + self waittill_any( "pap_timeout", "pap_taken", "pap_player_disconnected" ); + self.current_weapon = ""; + if ( isDefined( self.worldgun ) && isDefined( self.worldgun.worldgundw ) ) + { + self.worldgun.worldgundw delete(); + } + if ( isDefined( self.worldgun ) ) + { + self.worldgun delete(); + } + if ( is_true( level.zombiemode_reusing_pack_a_punch ) ) + { + self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH_ATT", self.cost ); + } + else + { + self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); + } + self setvisibletoall(); + self.pack_player = undefined; + flag_clear( "pack_machine_in_use" ); + } } -shutoffpapsounds( ent1, ent2, ent3 ) +shutoffpapsounds( ent1, ent2, ent3 ) //checked matches cerberus output { - while ( true ) - { - level waittill( "Pack_A_Punch_off" ); - - level thread turnonpapsounds( ent1 ); - ent1 stoploopsound( 0.1 ); - ent2 stoploopsound( 0.1 ); - ent3 stoploopsound( 0.1 ); - } + while ( 1 ) + { + level waittill( "Pack_A_Punch_off" ); + level thread turnonpapsounds( ent1 ); + ent1 stoploopsound( 0.1 ); + ent2 stoploopsound( 0.1 ); + ent3 stoploopsound( 0.1 ); + } } -turnonpapsounds( ent ) +turnonpapsounds( ent ) //checked 3/30/20 4:18 pm //checked matches cerberus output { - level waittill( "Pack_A_Punch_on" ); - - ent playloopsound( "zmb_perks_packa_loop" ); + level waittill( "Pack_A_Punch_on" ); + ent playloopsound( "zmb_perks_packa_loop" ); } -vending_weapon_upgrade_cost() +vending_weapon_upgrade_cost() //checked 3/30/20 4:19 pm //checked matches cerberus output { - level endon( "Pack_A_Punch_off" ); - - while ( true ) - { - self.cost = 5000; - self.attachment_cost = 2000; - - if ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch ) - self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH_ATT", self.cost ); - else - self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); - - level waittill( "powerup bonfire sale" ); - - self.cost = 1000; - self.attachment_cost = 1000; - - if ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch ) - self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH_ATT", self.cost ); - else - self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); - - level waittill( "bonfire_sale_off" ); - } + level endon( "Pack_A_Punch_off" ); + while ( 1 ) + { + self.cost = 5000; + self.attachment_cost = 2000; + if ( is_true( level.zombiemode_reusing_pack_a_punch ) ) + { + self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH_ATT", self.cost ); + } + else + { + self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); + } + level waittill( "powerup bonfire sale" ); + self.cost = 1000; + self.attachment_cost = 1000; + if ( is_true( level.zombiemode_reusing_pack_a_punch ) ) + { + self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH_ATT", self.cost ); + } + else + { + self sethintstring( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); + } + level waittill( "bonfire_sale_off" ); + } } -wait_for_player_to_take( player, weapon, packa_timer, upgrade_as_attachment ) +wait_for_player_to_take( player, weapon, packa_timer, upgrade_as_attachment ) //changed 3/30/20 4:22 pm //checked matches cerberus output { - current_weapon = self.current_weapon; - upgrade_name = self.upgrade_name; + current_weapon = self.current_weapon; + upgrade_name = self.upgrade_name; + /* /# - assert( isdefined( current_weapon ), "wait_for_player_to_take: weapon does not exist" ); + assert( isDefined( current_weapon ), "wait_for_player_to_take: weapon does not exist" ); #/ /# - assert( isdefined( upgrade_name ), "wait_for_player_to_take: upgrade_weapon does not exist" ); + assert( isDefined( upgrade_name ), "wait_for_player_to_take: upgrade_weapon does not exist" ); #/ - upgrade_weapon = upgrade_name; - self endon( "pap_timeout" ); - level endon( "Pack_A_Punch_off" ); + */ + upgrade_weapon = upgrade_name; + self endon( "pap_timeout" ); + level endon( "Pack_A_Punch_off" ); + while ( 1 ) + { + packa_timer playloopsound( "zmb_perks_packa_ticktock" ); + self waittill( "trigger", trigger_player ); + if ( is_true( level.pap_grab_by_anyone ) ) + { + player = trigger_player; + } - while ( true ) - { - packa_timer playloopsound( "zmb_perks_packa_ticktock" ); - - self waittill( "trigger", trigger_player ); - - if ( isdefined( level.pap_grab_by_anyone ) && level.pap_grab_by_anyone ) - player = trigger_player; - - packa_timer stoploopsound( 0.05 ); - - if ( trigger_player == player ) - { - player maps\mp\zombies\_zm_stats::increment_client_stat( "pap_weapon_grabbed" ); - player maps\mp\zombies\_zm_stats::increment_player_stat( "pap_weapon_grabbed" ); - current_weapon = player getcurrentweapon(); + packa_timer stoploopsound( 0.05 ); + if ( trigger_player == player ) //working + { + player maps/mp/zombies/_zm_stats::increment_client_stat( "pap_weapon_grabbed" ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "pap_weapon_grabbed" ); + current_weapon = player getcurrentweapon(); + /* /# - if ( "none" == current_weapon ) - iprintlnbold( "WEAPON IS NONE, PACKAPUNCH RETRIEVAL DENIED" ); + if ( current_weapon == "none" ) + { + iprintlnbold( "WEAPON IS NONE, PACKAPUNCH RETRIEVAL DENIED" ); #/ - if ( is_player_valid( player ) && !( player.is_drinking > 0 ) && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && level.revive_tool != current_weapon && "none" != current_weapon && !player hacker_active() ) - { - maps\mp\_demo::bookmark( "zm_player_grabbed_packapunch", gettime(), player ); - self notify( "pap_taken" ); - player notify( "pap_taken" ); - player.pap_used = 1; - - if ( !( isdefined( upgrade_as_attachment ) && upgrade_as_attachment ) ) - player thread do_player_general_vox( "general", "pap_arm", 15, 100 ); - else - player thread do_player_general_vox( "general", "pap_arm2", 15, 100 ); - - weapon_limit = get_player_weapon_limit( player ); - player maps\mp\zombies\_zm_weapons::take_fallback_weapon(); - primaries = player getweaponslistprimaries(); - - if ( isdefined( primaries ) && primaries.size >= weapon_limit ) - player maps\mp\zombies\_zm_weapons::weapon_give( upgrade_weapon ); - else - { - player giveweapon( upgrade_weapon, 0, player maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( upgrade_weapon ) ); - player givestartammo( upgrade_weapon ); - } - - player switchtoweapon( upgrade_weapon ); - - if ( isdefined( player.restore_ammo ) && player.restore_ammo ) - { - new_clip = player.restore_clip + weaponclipsize( upgrade_weapon ) - player.restore_clip_size; - new_stock = player.restore_stock + weaponmaxammo( upgrade_weapon ) - player.restore_max; - player setweaponammostock( upgrade_weapon, new_stock ); - player setweaponammoclip( upgrade_weapon, new_clip ); - } - - player.restore_ammo = undefined; - player.restore_clip = undefined; - player.restore_stock = undefined; - player.restore_max = undefined; - player.restore_clip_size = undefined; - player maps\mp\zombies\_zm_weapons::play_weapon_vo( upgrade_weapon ); - return; - } - } - - wait 0.05; - } + } + */ + if ( is_player_valid( player ) && !player.is_drinking && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && level.revive_tool != current_weapon && current_weapon != "none" && !player hacker_active() ) + { + maps/mp/_demo::bookmark( "zm_player_grabbed_packapunch", getTime(), player ); + self notify( "pap_taken" ); + player notify( "pap_taken" ); + player.pap_used = 1; + if ( !is_true( upgrade_as_attachment ) ) + { + player thread do_player_general_vox( "general", "pap_arm", 15, 100 ); + } + else + { + player thread do_player_general_vox( "general", "pap_arm2", 15, 100 ); + } + weapon_limit = get_player_weapon_limit( player ); + player maps/mp/zombies/_zm_weapons::take_fallback_weapon(); + primaries = player getweaponslistprimaries(); + if ( isDefined( primaries ) && primaries.size >= weapon_limit ) + { + player maps/mp/zombies/_zm_weapons::weapon_give( upgrade_weapon ); + } + else + { + player giveweapon( upgrade_weapon, 0, player maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( upgrade_weapon ) ); + player givestartammo( upgrade_weapon ); + } + player switchtoweapon( upgrade_weapon ); + if ( is_true( player.restore_ammo ) ) + { + new_clip = player.restore_clip + ( weaponclipsize( upgrade_weapon ) - player.restore_clip_size ); + new_stock = player.restore_stock + ( weaponmaxammo( upgrade_weapon ) - player.restore_max ); + player setweaponammostock( upgrade_weapon, new_stock ); + player setweaponammoclip( upgrade_weapon, new_clip ); + } + player.restore_ammo = undefined; + player.restore_clip = undefined; + player.restore_stock = undefined; + player.restore_max = undefined; + player.restore_clip_size = undefined; + player maps/mp/zombies/_zm_weapons::play_weapon_vo( upgrade_weapon ); + return; + } + } + //wait 0.05; + } } -wait_for_timeout( weapon, packa_timer, player ) +wait_for_timeout( weapon, packa_timer, player ) //checked //checked matches cerberus output { - self endon( "pap_taken" ); - self endon( "pap_player_disconnected" ); - self thread wait_for_disconnect( player ); - wait( level.packapunch_timeout ); - self notify( "pap_timeout" ); - packa_timer stoploopsound( 0.05 ); - packa_timer playsound( "zmb_perks_packa_deny" ); - maps\mp\zombies\_zm_weapons::unacquire_weapon_toggle( weapon ); - - if ( isdefined( player ) ) - { - player maps\mp\zombies\_zm_stats::increment_client_stat( "pap_weapon_not_grabbed" ); - player maps\mp\zombies\_zm_stats::increment_player_stat( "pap_weapon_not_grabbed" ); - } + self endon( "pap_taken" ); + self endon( "pap_player_disconnected" ); + self thread wait_for_disconnect( player ); + wait level.packapunch_timeout; + self notify( "pap_timeout" ); + packa_timer stoploopsound( 0.05 ); + packa_timer playsound( "zmb_perks_packa_deny" ); + maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( weapon ); + if ( isDefined( player ) ) + { + player maps/mp/zombies/_zm_stats::increment_client_stat( "pap_weapon_not_grabbed" ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "pap_weapon_not_grabbed" ); + } } -wait_for_disconnect( player ) +wait_for_disconnect( player ) //checked //checked matches cerberus output { - self endon( "pap_taken" ); - self endon( "pap_timeout" ); + self endon( "pap_taken" ); + self endon( "pap_timeout" ); + name = player.name; + while ( isDefined( player ) ) + { + wait 0.1; + } + self notify( "pap_player_disconnected" ); +} - while ( isdefined( player ) ) - wait 0.1; +destroy_weapon_on_disconnect( player ) //checked //checked matches cerberus output +{ + self endon( "pap_timeout" ); + self endon( "pap_taken" ); + level endon( "Pack_A_Punch_off" ); + player waittill( "disconnect" ); + if ( isDefined( self.worldgun ) ) + { + if ( isDefined( self.worldgun.worldgundw ) ) + { + self.worldgun.worldgundw delete(); + } + self.worldgun delete(); + } +} + +destroy_weapon_in_blackout( player ) //checked //checked matches cerberus output +{ + self endon( "pap_timeout" ); + self endon( "pap_taken" ); + self endon( "pap_player_disconnected" ); + level waittill( "Pack_A_Punch_off" ); + if ( isDefined( self.worldgun ) ) + { + self.worldgun rotateto( self.worldgun.angles + ( randomint( 90 ) - 45, 0, randomint( 360 ) - 180 ), 1.5, 0, 0 ); + player playlocalsound( level.zmb_laugh_alias ); + wait 1.5; + if ( isDefined( self.worldgun.worldgundw ) ) + { + self.worldgun.worldgundw delete(); + } + self.worldgun delete(); + } +} + +do_knuckle_crack() //checked //checked matches cerberus output +{ + self endon( "disconnect" ); + gun = self upgrade_knuckle_crack_begin(); + self waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" ); + self upgrade_knuckle_crack_end( gun ); +} + +upgrade_knuckle_crack_begin() //checked matches cerberus output +{ + self increment_is_drinking(); + self disable_player_move_states( 1 ); + primaries = self getweaponslistprimaries(); + gun = self getcurrentweapon(); + weapon = level.machine_assets[ "packapunch" ].weapon; + if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) ) + { + self notify( "zmb_lost_knife" ); + self takeweapon( gun ); + } + else + { + return; + } + self giveweapon( weapon ); + self switchtoweapon( weapon ); + return gun; +} + +upgrade_knuckle_crack_end( gun ) //changed //checked matches cerberus output +{ +/* /# - println( "*** PAP : User disconnected." ); -#/ - self notify( "pap_player_disconnected" ); -} - -destroy_weapon_on_disconnect( player ) -{ - self endon( "pap_timeout" ); - self endon( "pap_taken" ); - level endon( "Pack_A_Punch_off" ); - - player waittill( "disconnect" ); - - if ( isdefined( self.worldgun ) ) - { - if ( isdefined( self.worldgun.worldgundw ) ) - self.worldgun.worldgundw delete(); - - self.worldgun delete(); - } -} - -destroy_weapon_in_blackout( player ) -{ - self endon( "pap_timeout" ); - self endon( "pap_taken" ); - self endon( "pap_player_disconnected" ); - - level waittill( "Pack_A_Punch_off" ); - - if ( isdefined( self.worldgun ) ) - { - self.worldgun rotateto( self.worldgun.angles + ( randomint( 90 ) - 45, 0, randomint( 360 ) - 180 ), 1.5, 0, 0 ); - player playlocalsound( level.zmb_laugh_alias ); - wait 1.5; - - if ( isdefined( self.worldgun.worldgundw ) ) - self.worldgun.worldgundw delete(); - - self.worldgun delete(); - } -} - -do_knuckle_crack() -{ - self endon( "disconnect" ); - gun = self upgrade_knuckle_crack_begin(); - self waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" ); - self upgrade_knuckle_crack_end( gun ); -} - -upgrade_knuckle_crack_begin() -{ - self increment_is_drinking(); - self disable_player_move_states( 1 ); - primaries = self getweaponslistprimaries(); - gun = self getcurrentweapon(); - weapon = level.machine_assets["packapunch"].weapon; - - if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) ) - { - self notify( "zmb_lost_knife" ); - self takeweapon( gun ); - } - else - return; - - self giveweapon( weapon ); - self switchtoweapon( weapon ); - return gun; -} - -upgrade_knuckle_crack_end( gun ) -{ -/# - assert( !is_zombie_perk_bottle( gun ) ); + assert( !is_zombie_perk_bottle( gun ) ); #/ /# - assert( gun != level.revive_tool ); + assert( gun != level.revive_tool ); #/ - self enable_player_move_states(); - weapon = level.machine_assets["packapunch"].weapon; - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( self.intermission ) && self.intermission ) - { - self takeweapon( weapon ); - return; - } - - self decrement_is_drinking(); - self takeweapon( weapon ); - primaries = self getweaponslistprimaries(); - - if ( self.is_drinking > 0 ) - return; - else if ( isdefined( primaries ) && primaries.size > 0 ) - self switchtoweapon( primaries[0] ); - else if ( self hasweapon( level.laststandpistol ) ) - self switchtoweapon( level.laststandpistol ); - else - self maps\mp\zombies\_zm_weapons::give_fallback_weapon(); +*/ + self enable_player_move_states(); + weapon = level.machine_assets[ "packapunch" ].weapon; + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || is_true( self.intermission ) ) + { + self takeweapon( weapon ); + return; + } + self decrement_is_drinking(); + self takeweapon( weapon ); + primaries = self getweaponslistprimaries(); + if ( self.is_drinking > 0 ) + { + return; + } + else if ( isDefined( primaries ) && primaries.size > 0 ) + { + self switchtoweapon( primaries[ 0 ] ); + } + else if ( self hasweapon( level.laststandpistol ) ) + { + self switchtoweapon( level.laststandpistol ); + } + else + { + self maps/mp/zombies/_zm_weapons::give_fallback_weapon(); + } } -turn_packapunch_on() +turn_packapunch_on() //checked changed to match cerberus output { - vending_weapon_upgrade_trigger = getentarray( "specialty_weapupgrade", "script_noteworthy" ); - level.pap_triggers = vending_weapon_upgrade_trigger; - - for ( i = 0; i < vending_weapon_upgrade_trigger.size; i++ ) - { - perk = getent( vending_weapon_upgrade_trigger[i].target, "targetname" ); - - if ( isdefined( perk ) ) - perk setmodel( level.machine_assets["packapunch"].off_model ); - } - - for (;;) - { - level waittill( "Pack_A_Punch_on" ); - - for ( i = 0; i < vending_weapon_upgrade_trigger.size; i++ ) - { - perk = getent( vending_weapon_upgrade_trigger[i].target, "targetname" ); - - if ( isdefined( perk ) ) - perk thread activate_packapunch(); - } - - level waittill( "Pack_A_Punch_off" ); - - for ( i = 0; i < vending_weapon_upgrade_trigger.size; i++ ) - { - perk = getent( vending_weapon_upgrade_trigger[i].target, "targetname" ); - - if ( isdefined( perk ) ) - perk thread deactivate_packapunch(); - } - } + vending_weapon_upgrade_trigger = getentarray( "specialty_weapupgrade", "script_noteworthy" ); + level.pap_triggers = vending_weapon_upgrade_trigger; + for ( i = 0; i < vending_weapon_upgrade_trigger.size; i++ ) + { + perk = getent( vending_weapon_upgrade_trigger[ i ].target, "targetname" ); + if ( isDefined( perk ) ) + { + perk setmodel( level.machine_assets[ "packapunch" ].off_model ); + } + } + for ( ;; ) + { + level waittill( "Pack_A_Punch_on" ); + for ( i = 0; i < vending_weapon_upgrade_trigger.size; i++ ) + { + perk = getent( vending_weapon_upgrade_trigger[ i ].target, "targetname" ); + if ( isDefined( perk ) ) + { + perk thread activate_packapunch(); + } + } + level waittill( "Pack_A_Punch_off" ); + for ( i = 0; i < vending_weapon_upgrade_trigger.size; i++ ) + { + perk = getent( vending_weapon_upgrade_trigger[ i ].target, "targetname" ); + if ( isDefined( perk ) ) + { + perk thread deactivate_packapunch(); + } + } + } } -activate_packapunch() +activate_packapunch() //checked matches cerberus output { - self setmodel( level.machine_assets["packapunch"].on_model ); - self playsound( "zmb_perks_power_on" ); - self vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - timer = 0; - duration = 0.05; + self setmodel( level.machine_assets[ "packapunch" ].on_model ); + self playsound( "zmb_perks_power_on" ); + self vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + timer = 0; + duration = 0.05; } -deactivate_packapunch() +deactivate_packapunch() //checked matches cerberus output { - self setmodel( level.machine_assets["packapunch"].off_model ); + self setmodel( level.machine_assets[ "packapunch" ].off_model ); } -do_initial_power_off_callback( machine_array, perkname ) +do_initial_power_off_callback( machine_array, perkname ) //checked matches cerberus output { - if ( !isdefined( level.machine_assets[perkname] ) ) - { + if ( !isDefined( level.machine_assets[ perkname ] ) ) + { + /* /# - println( "Error: doing setup for a machine with no level.machine_assets! Check your perk initialization!" ); + println( "Error: doing setup for a machine with no level.machine_assets! Check your perk initialization!" ); #/ - return; - } - - if ( !isdefined( level.machine_assets[perkname].power_off_callback ) ) - return; - - wait 0.05; - array_thread( machine_array, level.machine_assets[perkname].power_off_callback ); + */ + return; + } + if ( !isDefined( level.machine_assets[ perkname ].power_off_callback ) ) + { + return; + } + wait 0.05; + array_thread( machine_array, level.machine_assets[ perkname ].power_off_callback ); } -turn_sleight_on() +turn_sleight_on() //checked changed to match cerberus output { - while ( true ) - { - machine = getentarray( "vending_sleight", "targetname" ); - machine_triggers = getentarray( "vending_sleight", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( level.machine_assets["speedcola"].off_model ); - - level thread do_initial_power_off_callback( machine, "speedcola" ); - array_thread( machine_triggers, ::set_power_on, 0 ); - - level waittill( "sleight_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( level.machine_assets["speedcola"].on_model ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "sleight_light" ); - machine[i] thread play_loop_on_machine(); - } - - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["speedcola"].power_on_callback ) ) - array_thread( machine, level.machine_assets["speedcola"].power_on_callback ); - - level notify( "specialty_fastreload_power_on" ); - - level waittill( "sleight_off" ); - - array_thread( machine, ::turn_perk_off ); - - if ( isdefined( level.machine_assets["speedcola"].power_off_callback ) ) - array_thread( machine, level.machine_assets["speedcola"].power_off_callback ); - } + while ( 1 ) + { + machine = getentarray( "vending_sleight", "targetname" ); + machine_triggers = getentarray( "vending_sleight", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "speedcola" ].off_model ); + } + level thread do_initial_power_off_callback( machine, "speedcola" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "sleight_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "speedcola" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "sleight_light" ); + machine[ i ] thread play_loop_on_machine(); + } + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "speedcola" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "speedcola" ].power_on_callback ); + } + level notify( "specialty_fastreload_power_on" ); + level waittill( "sleight_off" ); + array_thread( machine, ::turn_perk_off ); + if ( isDefined( level.machine_assets[ "speedcola" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "speedcola" ].power_off_callback ); + } + } } -use_solo_revive() +use_solo_revive() //checked matches cerberus output { - if ( isdefined( level.using_solo_revive ) ) - return level.using_solo_revive; - - players = get_players(); - solo_mode = 0; - - if ( players.size == 1 || isdefined( level.force_solo_quick_revive ) && level.force_solo_quick_revive ) - solo_mode = 1; - - level.using_solo_revive = solo_mode; - return solo_mode; + if ( isDefined( level.using_solo_revive ) ) + { + return level.using_solo_revive; + } + players = get_players(); + solo_mode = 0; + if ( players.size == 1 || is_true( level.force_solo_quick_revive ) ) + { + solo_mode = 1; + } + level.using_solo_revive = solo_mode; + return solo_mode; } -turn_revive_on() +turn_revive_on() //checked partially changed to match cerberus output { - level endon( "stop_quickrevive_logic" ); - machine = getentarray( "vending_revive", "targetname" ); - machine_triggers = getentarray( "vending_revive", "target" ); - machine_model = undefined; - machine_clip = undefined; - - if ( !( isdefined( level.zombiemode_using_revive_perk ) && level.zombiemode_using_revive_perk ) ) - return; - - flag_wait( "start_zombie_round_logic" ); - players = get_players(); - solo_mode = 0; - - if ( use_solo_revive() ) - solo_mode = 1; - - start_state = 0; - start_state = solo_mode; - - while ( true ) - { - machine = getentarray( "vending_revive", "targetname" ); - machine_triggers = getentarray( "vending_revive", "target" ); - - for ( i = 0; i < machine.size; i++ ) - { - if ( flag_exists( "solo_game" ) && flag_exists( "solo_revive" ) && flag( "solo_game" ) && flag( "solo_revive" ) ) - machine[i] hide(); - - machine[i] setmodel( level.machine_assets["revive"].off_model ); - - if ( isdefined( level.quick_revive_final_pos ) ) - level.quick_revive_default_origin = level.quick_revive_final_pos; - - if ( !isdefined( level.quick_revive_default_origin ) ) - { - level.quick_revive_default_origin = machine[i].origin; - level.quick_revive_default_angles = machine[i].angles; - } - - level.quick_revive_machine = machine[i]; - } - - array_thread( machine_triggers, ::set_power_on, 0 ); - - if ( !( isdefined( start_state ) && start_state ) ) - level waittill( "revive_on" ); - - start_state = 0; - - for ( i = 0; i < machine.size; i++ ) - { - if ( isdefined( machine[i].classname ) && machine[i].classname == "script_model" ) - { - if ( isdefined( machine[i].script_noteworthy ) && machine[i].script_noteworthy == "clip" ) - { - machine_clip = machine[i]; - continue; - } - - machine[i] setmodel( level.machine_assets["revive"].on_model ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine_model = machine[i]; - machine[i] thread perk_fx( "revive_light" ); - machine[i] notify( "stop_loopsound" ); - machine[i] thread play_loop_on_machine(); - - if ( isdefined( machine_triggers[i] ) ) - machine_clip = machine_triggers[i].clip; - - if ( isdefined( machine_triggers[i] ) ) - blocker_model = machine_triggers[i].blocker_model; - } - } - - wait_network_frame(); - - if ( solo_mode && isdefined( machine_model ) && !is_true( machine_model.ishidden ) ) - machine_model thread revive_solo_fx( machine_clip, blocker_model ); - - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["revive"].power_on_callback ) ) - array_thread( machine, level.machine_assets["revive"].power_on_callback ); - - level notify( "specialty_quickrevive_power_on" ); - - if ( isdefined( machine_model ) ) - machine_model.ishidden = 0; - - notify_str = level waittill_any_return( "revive_off", "revive_hide" ); - should_hide = 0; - - if ( notify_str == "revive_hide" ) - should_hide = 1; - - if ( isdefined( level.machine_assets["revive"].power_off_callback ) ) - array_thread( machine, level.machine_assets["revive"].power_off_callback ); - - for ( i = 0; i < machine.size; i++ ) - { - if ( isdefined( machine[i].classname ) && machine[i].classname == "script_model" ) - machine[i] turn_perk_off( should_hide ); - } - } + level endon( "stop_quickrevive_logic" ); + machine = getentarray( "vending_revive", "targetname" ); + machine_triggers = getentarray( "vending_revive", "target" ); + machine_model = undefined; + machine_clip = undefined; + if ( !is_true( level.zombiemode_using_revive_perk ) ) + { + return; + } + flag_wait( "start_zombie_round_logic" ); + players = get_players(); + solo_mode = 0; + if ( use_solo_revive() ) + { + solo_mode = 1; + } + start_state = 0; + start_state = solo_mode; + while ( 1 ) + { + machine = getentarray( "vending_revive", "targetname" ); + machine_triggers = getentarray( "vending_revive", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + if ( flag_exists( "solo_game" ) && flag_exists( "solo_revive" ) && flag( "solo_game" ) && flag( "solo_revive" ) ) + { + machine[ i ] hide(); + } + machine[ i ] setmodel( level.machine_assets[ "revive" ].off_model ); + if ( isDefined( level.quick_revive_final_pos ) ) + { + level.quick_revive_default_origin = level.quick_revive_final_pos; + } + if ( !isDefined( level.quick_revive_default_origin ) ) + { + level.quick_revive_default_origin = machine[ i ].origin; + level.quick_revive_default_angles = machine[ i ].angles; + } + level.quick_revive_machine = machine[ i ]; + } + array_thread( machine_triggers, ::set_power_on, 0 ); + if ( !is_true( start_state ) ) + { + level waittill( "revive_on" ); + } + start_state = 0; + i = 0; + while ( i < machine.size ) + { + if ( isDefined( machine[ i ].classname ) && machine[ i ].classname == "script_model" ) + { + if ( isDefined( machine[ i ].script_noteworthy ) && machine[ i ].script_noteworthy == "clip" ) + { + machine_clip = machine[ i ]; + i++; + continue; + } + machine[ i ] setmodel( level.machine_assets[ "revive" ].on_model ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine_model = machine[ i ]; + machine[ i ] thread perk_fx( "revive_light" ); + machine[ i ] notify( "stop_loopsound" ); + machine[ i ] thread play_loop_on_machine(); + if ( isDefined( machine_triggers[ i ] ) ) + { + machine_clip = machine_triggers[ i ].clip; + } + if ( isDefined( machine_triggers[ i ] ) ) + { + blocker_model = machine_triggers[ i ].blocker_model; + } + } + i++; + } + wait_network_frame(); + if ( solo_mode && isDefined( machine_model ) && !is_true( machine_model.ishidden ) ) + { + machine_model thread revive_solo_fx( machine_clip, blocker_model ); + } + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "revive" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "revive" ].power_on_callback ); + } + level notify( "specialty_quickrevive_power_on" ); + if ( isDefined( machine_model ) ) + { + machine_model.ishidden = 0; + } + notify_str = level waittill_any_return( "revive_off", "revive_hide" ); + should_hide = 0; + if ( notify_str == "revive_hide" ) + { + should_hide = 1; + } + if ( isDefined( level.machine_assets[ "revive" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "revive" ].power_off_callback ); + } + for ( i = 0; i < machine.size; i++ ) + { + if ( isDefined( machine[ i ].classname ) && machine[ i ].classname == "script_model" ) + { + machine[ i ] turn_perk_off( should_hide ); + } + } + } } -revive_solo_fx( machine_clip, blocker_model ) +revive_solo_fx( machine_clip, blocker_model ) //checked matches cerberus output { - if ( level flag_exists( "solo_revive" ) && flag( "solo_revive" ) && !flag( "solo_game" ) ) - return; - - if ( isdefined( machine_clip ) ) - level.quick_revive_machine_clip = machine_clip; - - if ( !isdefined( level.solo_revive_init ) ) - { - level.solo_revive_init = 1; - flag_init( "solo_revive" ); - } - - level notify( "revive_solo_fx" ); - level endon( "revive_solo_fx" ); - self endon( "death" ); - flag_wait( "solo_revive" ); - - if ( isdefined( level.revive_solo_fx_func ) ) - level thread [[ level.revive_solo_fx_func ]](); - - wait 2.0; - self playsound( "zmb_box_move" ); - playsoundatposition( "zmb_whoosh", self.origin ); - - if ( isdefined( self._linked_ent ) ) - self unlink(); - - self moveto( self.origin + vectorscale( ( 0, 0, 1 ), 40.0 ), 3 ); - - if ( isdefined( level.custom_vibrate_func ) ) - [[ level.custom_vibrate_func ]]( self ); - else - { - direction = self.origin; - direction = ( direction[1], direction[0], 0 ); - - if ( direction[1] < 0 || direction[0] > 0 && direction[1] > 0 ) - direction = ( direction[0], direction[1] * -1, 0 ); - else if ( direction[0] < 0 ) - direction = ( direction[0] * -1, direction[1], 0 ); - - self vibrate( direction, 10, 0.5, 5 ); - } - - self waittill( "movedone" ); - - playfx( level._effect["poltergeist"], self.origin ); - playsoundatposition( "zmb_box_poof", self.origin ); - level clientnotify( "drb" ); - - if ( isdefined( self.fx ) ) - { - self.fx unlink(); - self.fx delete(); - } - - if ( isdefined( machine_clip ) ) - { - machine_clip trigger_off(); - machine_clip connectpaths(); - } - - if ( isdefined( blocker_model ) ) - blocker_model show(); - - level notify( "revive_hide" ); + if ( level flag_exists( "solo_revive" ) && flag( "solo_revive" ) && !flag( "solo_game" ) ) + { + return; + } + if ( isDefined( machine_clip ) ) + { + level.quick_revive_machine_clip = machine_clip; + } + if ( !isDefined( level.solo_revive_init ) ) + { + level.solo_revive_init = 1; + flag_init( "solo_revive" ); + } + level notify( "revive_solo_fx" ); + level endon( "revive_solo_fx" ); + self endon( "death" ); + flag_wait( "solo_revive" ); + if ( isDefined( level.revive_solo_fx_func ) ) + { + level thread [[ level.revive_solo_fx_func ]](); + } + wait 2; + self playsound( "zmb_box_move" ); + playsoundatposition( "zmb_whoosh", self.origin ); + if ( isDefined( self._linked_ent ) ) + { + self unlink(); + } + self moveto( self.origin + vectorScale( ( 0, 0, 1 ), 40 ), 3 ); + if ( isDefined( level.custom_vibrate_func ) ) + { + [[ level.custom_vibrate_func ]]( self ); + } + else + { + direction = self.origin; + direction = ( direction[ 1 ], direction[ 0 ], 0 ); + if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 ) + { + direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 ); + } + else + { + if ( direction[ 0 ] < 0 ) + { + direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 ); + } + } + self vibrate( direction, 10, 0.5, 5 ); + } + self waittill( "movedone" ); + playfx( level._effect[ "poltergeist" ], self.origin ); + playsoundatposition( "zmb_box_poof", self.origin ); + level clientnotify( "drb" ); + if ( isDefined( self.fx ) ) + { + self.fx unlink(); + self.fx delete(); + } + if ( isDefined( machine_clip ) ) + { + machine_clip trigger_off(); + machine_clip connectpaths(); + } + if ( isDefined( blocker_model ) ) + { + blocker_model show(); + } + level notify( "revive_hide" ); } -turn_jugger_on() +turn_jugger_on() //checked changed to match cerberus output { - while ( true ) - { - machine = getentarray( "vending_jugg", "targetname" ); - machine_triggers = getentarray( "vending_jugg", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( level.machine_assets["juggernog"].off_model ); - - level thread do_initial_power_off_callback( machine, "juggernog" ); - array_thread( machine_triggers, ::set_power_on, 0 ); - - level waittill( "juggernog_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( level.machine_assets["juggernog"].on_model ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "jugger_light" ); - machine[i] thread play_loop_on_machine(); - } - - level notify( "specialty_armorvest_power_on" ); - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["juggernog"].power_on_callback ) ) - array_thread( machine, level.machine_assets["juggernog"].power_on_callback ); - - level waittill( "juggernog_off" ); - - if ( isdefined( level.machine_assets["juggernog"].power_off_callback ) ) - array_thread( machine, level.machine_assets["juggernog"].power_off_callback ); - - array_thread( machine, ::turn_perk_off ); - } + while ( 1 ) + { + machine = getentarray( "vending_jugg", "targetname" ); + machine_triggers = getentarray( "vending_jugg", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "juggernog" ].off_model ); + } + level thread do_initial_power_off_callback( machine, "juggernog" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "juggernog_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "juggernog" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "jugger_light" ); + machine[ i ] thread play_loop_on_machine(); + } + level notify( "specialty_armorvest_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "juggernog" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "juggernog" ].power_on_callback ); + } + level waittill( "juggernog_off" ); + if ( isDefined( level.machine_assets[ "juggernog" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "juggernog" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + } } -turn_doubletap_on() +turn_doubletap_on() //checked changed to match cerberus output { - while ( true ) - { - machine = getentarray( "vending_doubletap", "targetname" ); - machine_triggers = getentarray( "vending_doubletap", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( level.machine_assets["doubletap"].off_model ); - - level thread do_initial_power_off_callback( machine, "doubletap" ); - array_thread( machine_triggers, ::set_power_on, 0 ); - - level waittill( "doubletap_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( level.machine_assets["doubletap"].on_model ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "doubletap_light" ); - machine[i] thread play_loop_on_machine(); - } - - level notify( "specialty_rof_power_on" ); - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["doubletap"].power_on_callback ) ) - array_thread( machine, level.machine_assets["doubletap"].power_on_callback ); - - level waittill( "doubletap_off" ); - - if ( isdefined( level.machine_assets["doubletap"].power_off_callback ) ) - array_thread( machine, level.machine_assets["doubletap"].power_off_callback ); - - array_thread( machine, ::turn_perk_off ); - } + while ( 1 ) + { + machine = getentarray( "vending_doubletap", "targetname" ); + machine_triggers = getentarray( "vending_doubletap", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "doubletap" ].off_model ); + } + level thread do_initial_power_off_callback( machine, "doubletap" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "doubletap_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "doubletap" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "doubletap_light" ); + machine[ i ] thread play_loop_on_machine(); + } + level notify( "specialty_rof_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "doubletap" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "doubletap" ].power_on_callback ); + } + level waittill( "doubletap_off" ); + if ( isDefined( level.machine_assets[ "doubletap" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "doubletap" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + } } -turn_marathon_on() +turn_marathon_on() //checked changed to match cerberus output { - while ( true ) - { - machine = getentarray( "vending_marathon", "targetname" ); - machine_triggers = getentarray( "vending_marathon", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( level.machine_assets["marathon"].off_model ); - - array_thread( machine_triggers, ::set_power_on, 0 ); - level thread do_initial_power_off_callback( machine, "marathon" ); - - level waittill( "marathon_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( level.machine_assets["marathon"].on_model ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "marathon_light" ); - machine[i] thread play_loop_on_machine(); - } - - level notify( "specialty_longersprint_power_on" ); - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["marathon"].power_on_callback ) ) - array_thread( machine, level.machine_assets["marathon"].power_on_callback ); - - level waittill( "marathon_off" ); - - if ( isdefined( level.machine_assets["marathon"].power_off_callback ) ) - array_thread( machine, level.machine_assets["marathon"].power_off_callback ); - - array_thread( machine, ::turn_perk_off ); - } + while ( 1 ) + { + machine = getentarray( "vending_marathon", "targetname" ); + machine_triggers = getentarray( "vending_marathon", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "marathon" ].off_model ); + } + array_thread( machine_triggers, ::set_power_on, 0 ); + level thread do_initial_power_off_callback( machine, "marathon" ); + level waittill( "marathon_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "marathon" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "marathon_light" ); + machine[ i ] thread play_loop_on_machine(); + i++; + } + level notify( "specialty_longersprint_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "marathon" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "marathon" ].power_on_callback ); + } + level waittill( "marathon_off" ); + if ( isDefined( level.machine_assets[ "marathon" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "marathon" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + } } -turn_deadshot_on() +turn_deadshot_on() //checked changed to match cerberus output { - while ( true ) - { - machine = getentarray( "vending_deadshot_model", "targetname" ); - machine_triggers = getentarray( "vending_deadshot", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( level.machine_assets["deadshot"].off_model ); - - level thread do_initial_power_off_callback( machine, "deadshot" ); - array_thread( machine_triggers, ::set_power_on, 0 ); - - level waittill( "deadshot_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( level.machine_assets["deadshot"].on_model ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "deadshot_light" ); - machine[i] thread play_loop_on_machine(); - } - - level notify( "specialty_deadshot_power_on" ); - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["deadshot"].power_on_callback ) ) - array_thread( machine, level.machine_assets["deadshot"].power_on_callback ); - - level waittill( "deadshot_off" ); - - if ( isdefined( level.machine_assets["deadshot"].power_off_callback ) ) - array_thread( machine, level.machine_assets["deadshot"].power_off_callback ); - - array_thread( machine, ::turn_perk_off ); - } + while ( 1 ) + { + machine = getentarray( "vending_deadshot_model", "targetname" ); + machine_triggers = getentarray( "vending_deadshot", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "deadshot" ].off_model ); + } + level thread do_initial_power_off_callback( machine, "deadshot" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "deadshot_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "deadshot" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "deadshot_light" ); + machine[ i ] thread play_loop_on_machine(); + } + level notify( "specialty_deadshot_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "deadshot" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "deadshot" ].power_on_callback ); + } + level waittill( "deadshot_off" ); + if ( isDefined( level.machine_assets[ "deadshot" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "deadshot" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + } } -turn_tombstone_on() +turn_tombstone_on() //checked changed to match cerberus output { - level endon( "tombstone_removed" ); - - while ( true ) - { - machine = getentarray( "vending_tombstone", "targetname" ); - machine_triggers = getentarray( "vending_tombstone", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( level.machine_assets["tombstone"].off_model ); - - level thread do_initial_power_off_callback( machine, "tombstone" ); - array_thread( machine_triggers, ::set_power_on, 0 ); - - level waittill( "tombstone_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( level.machine_assets["tombstone"].on_model ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "tombstone_light" ); - machine[i] thread play_loop_on_machine(); - } - - level notify( "specialty_scavenger_power_on" ); - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["tombstone"].power_on_callback ) ) - array_thread( machine, level.machine_assets["tombstone"].power_on_callback ); - - level waittill( "tombstone_off" ); - - if ( isdefined( level.machine_assets["tombstone"].power_off_callback ) ) - array_thread( machine, level.machine_assets["tombstone"].power_off_callback ); - - array_thread( machine, ::turn_perk_off ); - players = get_players(); - - foreach ( player in players ) - player.hasperkspecialtytombstone = undefined; - } + level endon( "tombstone_removed" ); + while ( 1 ) + { + machine = getentarray( "vending_tombstone", "targetname" ); + machine_triggers = getentarray( "vending_tombstone", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "tombstone" ].off_model ); + } + level thread do_initial_power_off_callback( machine, "tombstone" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "tombstone_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "tombstone" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "tombstone_light" ); + machine[ i ] thread play_loop_on_machine(); + } + level notify( "specialty_scavenger_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "tombstone" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "tombstone" ].power_on_callback ); + } + level waittill( "tombstone_off" ); + if ( isDefined( level.machine_assets[ "tombstone" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "tombstone" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + players = get_players(); + foreach ( player in players ) + { + player.hasperkspecialtytombstone = undefined; + } + } } -turn_additionalprimaryweapon_on() +turn_additionalprimaryweapon_on() //checked changed to match cerberus output { - while ( true ) - { - machine = getentarray( "vending_additionalprimaryweapon", "targetname" ); - machine_triggers = getentarray( "vending_additionalprimaryweapon", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( level.machine_assets["additionalprimaryweapon"].off_model ); - - level thread do_initial_power_off_callback( machine, "additionalprimaryweapon" ); - array_thread( machine_triggers, ::set_power_on, 0 ); - - level waittill( "additionalprimaryweapon_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( level.machine_assets["additionalprimaryweapon"].on_model ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "additionalprimaryweapon_light" ); - machine[i] thread play_loop_on_machine(); - } - - level notify( "specialty_additionalprimaryweapon_power_on" ); - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["additionalprimaryweapon"].power_on_callback ) ) - array_thread( machine, level.machine_assets["additionalprimaryweapon"].power_on_callback ); - - level waittill( "additionalprimaryweapon_off" ); - - if ( isdefined( level.machine_assets["additionalprimaryweapon"].power_off_callback ) ) - array_thread( machine, level.machine_assets["additionalprimaryweapon"].power_off_callback ); - - array_thread( machine, ::turn_perk_off ); - } + while ( 1 ) + { + machine = getentarray( "vending_additionalprimaryweapon", "targetname" ); + machine_triggers = getentarray( "vending_additionalprimaryweapon", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "additionalprimaryweapon" ].off_model ); + } + level thread do_initial_power_off_callback( machine, "additionalprimaryweapon" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "additionalprimaryweapon_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "additionalprimaryweapon" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "additionalprimaryweapon_light" ); + machine[ i ] thread play_loop_on_machine(); + } + level notify( "specialty_additionalprimaryweapon_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "additionalprimaryweapon" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "additionalprimaryweapon" ].power_on_callback ); + } + level waittill( "additionalprimaryweapon_off" ); + if ( isDefined( level.machine_assets[ "additionalprimaryweapon" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "additionalprimaryweapon" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + } } -turn_chugabud_on() +turn_chugabud_on() //checked changed to match cerberus output { - maps\mp\zombies\_zm_chugabud::init(); - - if ( isdefined( level.vsmgr_prio_visionset_zm_whos_who ) ) - maps\mp\_visionset_mgr::vsmgr_register_info( "visionset", "zm_whos_who", 5000, level.vsmgr_prio_visionset_zm_whos_who, 1, 1 ); - - while ( true ) - { - machine = getentarray( "vending_chugabud", "targetname" ); - machine_triggers = getentarray( "vending_chugabud", "target" ); - - for ( i = 0; i < machine.size; i++ ) - machine[i] setmodel( level.machine_assets["whoswho"].off_model ); - - level thread do_initial_power_off_callback( machine, "whoswho" ); - array_thread( machine_triggers, ::set_power_on, 0 ); - - level waittill( "chugabud_on" ); - - for ( i = 0; i < machine.size; i++ ) - { - machine[i] setmodel( level.machine_assets["whoswho"].on_model ); - machine[i] vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - machine[i] playsound( "zmb_perks_power_on" ); - machine[i] thread perk_fx( "tombstone_light" ); - machine[i] thread play_loop_on_machine(); - } - - level notify( "specialty_finalstand_power_on" ); - array_thread( machine_triggers, ::set_power_on, 1 ); - - if ( isdefined( level.machine_assets["whoswho"].power_on_callback ) ) - array_thread( machine, level.machine_assets["whoswho"].power_on_callback ); - - level waittill( "chugabud_off" ); - - if ( isdefined( level.machine_assets["whoswho"].power_off_callback ) ) - array_thread( machine, level.machine_assets["whoswho"].power_off_callback ); - - array_thread( machine, ::turn_perk_off ); - players = get_players(); - - foreach ( player in players ) - player.hasperkspecialtychugabud = undefined; - } + maps/mp/zombies/_zm_chugabud::init(); + if ( isDefined( level.vsmgr_prio_visionset_zm_whos_who ) ) + { + maps/mp/_visionset_mgr::vsmgr_register_info( "visionset", "zm_whos_who", 5000, level.vsmgr_prio_visionset_zm_whos_who, 1, 1 ); + } + while ( 1 ) + { + machine = getentarray( "vending_chugabud", "targetname" ); + machine_triggers = getentarray( "vending_chugabud", "target" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "whoswho" ].off_model ); + } + level thread do_initial_power_off_callback( machine, "whoswho" ); + array_thread( machine_triggers, ::set_power_on, 0 ); + level waittill( "chugabud_on" ); + for ( i = 0; i < machine.size; i++ ) + { + machine[ i ] setmodel( level.machine_assets[ "whoswho" ].on_model ); + machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + machine[ i ] playsound( "zmb_perks_power_on" ); + machine[ i ] thread perk_fx( "tombstone_light" ); + machine[ i ] thread play_loop_on_machine(); + } + level notify( "specialty_finalstand_power_on" ); + array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "whoswho" ].power_on_callback ) ) + { + array_thread( machine, level.machine_assets[ "whoswho" ].power_on_callback ); + } + level waittill( "chugabud_off" ); + if ( isDefined( level.machine_assets[ "whoswho" ].power_off_callback ) ) + { + array_thread( machine, level.machine_assets[ "whoswho" ].power_off_callback ); + } + array_thread( machine, ::turn_perk_off ); + players = get_players(); + foreach ( player in players ) + { + player.hasperkspecialtychugabud = undefined; + } + } } -set_power_on( state ) +set_power_on( state ) //checked matches cerberus output { - self.power_on = state; + self.power_on = state; } -turn_perk_off( ishidden ) +turn_perk_off( ishidden ) //checked matches cerberus output { - self notify( "stop_loopsound" ); - newmachine = spawn( "script_model", self.origin ); - newmachine.angles = self.angles; - newmachine.targetname = self.targetname; - - if ( is_true( ishidden ) ) - { - newmachine.ishidden = 1; - newmachine hide(); - } - - self delete(); + self notify( "stop_loopsound" ); + newmachine = spawn( "script_model", self.origin ); + newmachine.angles = self.angles; + newmachine.targetname = self.targetname; + if ( is_true( ishidden ) ) + { + newmachine.ishidden = 1; + newmachine hide(); + } + self delete(); } -play_loop_on_machine() +play_loop_on_machine() //checked matches cerberus output { - if ( isdefined( level.sndperksacolaloopoverride ) ) - return; - - sound_ent = spawn( "script_origin", self.origin ); - sound_ent playloopsound( "zmb_perks_machine_loop" ); - sound_ent linkto( self ); - - self waittill( "stop_loopsound" ); - - sound_ent unlink(); - sound_ent delete(); + if ( isDefined( level.sndperksacolaloopoverride ) ) + { + return; + } + sound_ent = spawn( "script_origin", self.origin ); + sound_ent playloopsound( "zmb_perks_machine_loop" ); + sound_ent linkto( self ); + self waittill( "stop_loopsound" ); + sound_ent unlink(); + sound_ent delete(); } -perk_fx( fx, turnofffx ) +perk_fx( fx, turnofffx ) //checked matches cerberus output { - if ( isdefined( turnofffx ) ) - self.perk_fx = 0; - else - { - wait 3; - - if ( isdefined( self ) && !is_true( self.perk_fx ) ) - { - playfxontag( level._effect[fx], self, "tag_origin" ); - self.perk_fx = 1; - } - } + if ( isDefined( turnofffx ) ) + { + self.perk_fx = 0; + } + else + { + wait 3; + if ( isDefined( self ) && !is_true( self.perk_fx ) ) + { + playfxontag( level._effect[ fx ], self, "tag_origin" ); + self.perk_fx = 1; + } + } } -electric_perks_dialog() +electric_perks_dialog() //checked partially changed to match cerberus output { - self endon( "death" ); - wait 0.01; - flag_wait( "start_zombie_round_logic" ); - players = get_players(); - - if ( players.size == 1 ) - return; - - self endon( "warning_dialog" ); - level endon( "switch_flipped" ); - timer = 0; - - while ( true ) - { - wait 0.5; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( !isdefined( players[i] ) ) - continue; - - dist = distancesquared( players[i].origin, self.origin ); - - if ( dist > 4900 ) - { - timer = 0; - continue; - } - - if ( dist < 4900 && timer < 3 ) - { - wait 0.5; - timer++; - } - - if ( dist < 4900 && timer == 3 ) - { - if ( !isdefined( players[i] ) ) - continue; - - players[i] thread do_player_vo( "vox_start", 5 ); - wait 3; - self notify( "warning_dialog" ); + self endon( "death" ); + wait 0.01; + flag_wait( "start_zombie_round_logic" ); + players = get_players(); + if ( players.size == 1 ) + { + return; + } + self endon( "warning_dialog" ); + level endon( "switch_flipped" ); + timer = 0; + while ( 1 ) + { + wait 0.5; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( !isDefined( players[ i ] ) ) + { + i++; + continue; + } + else + { + dist = distancesquared( players[ i ].origin, self.origin ); + } + if ( dist > 4900 ) + { + timer = 0; + i++; + continue; + } + else if ( dist < 4900 && timer < 3 ) + { + wait 0.5; + timer++; + } + if ( dist < 4900 && timer == 3 ) + { + if ( !isDefined( players[ i ] ) ) + { + i++; + continue; + } + players[ i ] thread do_player_vo( "vox_start", 5 ); + wait 3; + self notify( "warning_dialog" ); + /* /# - iprintlnbold( "warning_given" ); + iprintlnbold( "warning_given" ); #/ - } - } - } + */ + } + i++; + } + } } -reset_vending_hint_string() +reset_vending_hint_string() //checked matches cerberus output { - perk = self.script_noteworthy; - solo = maps\mp\zombies\_zm_perks::use_solo_revive(); - - switch ( perk ) - { - case "specialty_armorvest_upgrade": - case "specialty_armorvest": - self sethintstring( &"ZOMBIE_PERK_JUGGERNAUT", self.cost ); - break; - case "specialty_quickrevive_upgrade": - case "specialty_quickrevive": - if ( solo ) - self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE_SOLO", self.cost ); - else - self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE", self.cost ); - - break; - case "specialty_fastreload_upgrade": - case "specialty_fastreload": - self sethintstring( &"ZOMBIE_PERK_FASTRELOAD", self.cost ); - break; - case "specialty_rof_upgrade": - case "specialty_rof": - self sethintstring( &"ZOMBIE_PERK_DOUBLETAP", self.cost ); - break; - case "specialty_longersprint_upgrade": - case "specialty_longersprint": - self sethintstring( &"ZOMBIE_PERK_MARATHON", self.cost ); - break; - case "specialty_deadshot_upgrade": - case "specialty_deadshot": - self sethintstring( &"ZOMBIE_PERK_DEADSHOT", self.cost ); - break; - case "specialty_additionalprimaryweapon_upgrade": - case "specialty_additionalprimaryweapon": - self sethintstring( &"ZOMBIE_PERK_ADDITIONALPRIMARYWEAPON", self.cost ); - break; - case "specialty_scavenger_upgrade": - case "specialty_scavenger": - self sethintstring( &"ZOMBIE_PERK_TOMBSTONE", self.cost ); - break; - case "specialty_finalstand_upgrade": - case "specialty_finalstand": - self sethintstring( &"ZOMBIE_PERK_CHUGABUD", self.cost ); - break; - default: - self sethintstring( perk + " Cost: " + level.zombie_vars["zombie_perk_cost"] ); - } - - if ( isdefined( level._custom_perks ) ) - { - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].cost ) && isdefined( level._custom_perks[perk].hint_string ) ) - self sethintstring( level._custom_perks[perk].hint_string, level._custom_perks[perk].cost ); - } + perk = self.script_noteworthy; + solo = maps/mp/zombies/_zm_perks::use_solo_revive(); + switch( perk ) + { + case "specialty_armorvest": + case "specialty_armorvest_upgrade": + self sethintstring( &"ZOMBIE_PERK_JUGGERNAUT", self.cost ); + break; + case "specialty_quickrevive": + case "specialty_quickrevive_upgrade": + if ( solo ) + { + self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE_SOLO", self.cost ); + } + else + { + self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE", self.cost ); + } + break; + case "specialty_fastreload": + case "specialty_fastreload_upgrade": + self sethintstring( &"ZOMBIE_PERK_FASTRELOAD", self.cost ); + break; + case "specialty_rof": + case "specialty_rof_upgrade": + self sethintstring( &"ZOMBIE_PERK_DOUBLETAP", self.cost ); + break; + case "specialty_longersprint": + case "specialty_longersprint_upgrade": + self sethintstring( &"ZOMBIE_PERK_MARATHON", self.cost ); + break; + case "specialty_deadshot": + case "specialty_deadshot_upgrade": + self sethintstring( &"ZOMBIE_PERK_DEADSHOT", self.cost ); + break; + case "specialty_additionalprimaryweapon": + case "specialty_additionalprimaryweapon_upgrade": + self sethintstring( &"ZOMBIE_PERK_ADDITIONALPRIMARYWEAPON", self.cost ); + break; + case "specialty_scavenger": + case "specialty_scavenger_upgrade": + self sethintstring( &"ZOMBIE_PERK_TOMBSTONE", self.cost ); + break; + case "specialty_finalstand": + case "specialty_finalstand_upgrade": + self sethintstring( &"ZOMBIE_PERK_CHUGABUD", self.cost ); + break; + default: + self sethintstring( ( perk + " Cost: " ) + level.zombie_vars[ "zombie_perk_cost" ] ); + } + if ( isDefined( level._custom_perks ) ) + { + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].cost ) && isDefined( level._custom_perks[ perk ].hint_string ) ) + { + self sethintstring( level._custom_perks[ perk ].hint_string, level._custom_perks[ perk ].cost ); + } + } } -vending_trigger_think() +vending_trigger_think() //checked changed to match cerberus output { - self endon( "death" ); - wait 0.01; - perk = self.script_noteworthy; - solo = 0; - start_on = 0; - level.revive_machine_is_solo = 0; - - if ( isdefined( perk ) && ( perk == "specialty_quickrevive" || perk == "specialty_quickrevive_upgrade" ) ) - { - flag_wait( "start_zombie_round_logic" ); - solo = use_solo_revive(); - self endon( "stop_quickrevive_logic" ); - level.quick_revive_trigger = self; - - if ( solo ) - { - if ( !is_true( level.revive_machine_is_solo ) ) - { - start_on = 1; - players = get_players(); - - foreach ( player in players ) - { - if ( !isdefined( player.lives ) ) - player.lives = 0; - } - - level maps\mp\zombies\_zm::set_default_laststand_pistol( 1 ); - } - - level.revive_machine_is_solo = 1; - } - } - - self sethintstring( &"ZOMBIE_NEED_POWER" ); - self setcursorhint( "HINT_NOICON" ); - self usetriggerrequirelookat(); - cost = level.zombie_vars["zombie_perk_cost"]; - - switch ( perk ) - { - case "specialty_armorvest_upgrade": - case "specialty_armorvest": - cost = 2500; - break; - case "specialty_quickrevive_upgrade": - case "specialty_quickrevive": - if ( solo ) - cost = 500; - else - cost = 1500; - - break; - case "specialty_fastreload_upgrade": - case "specialty_fastreload": - cost = 3000; - break; - case "specialty_rof_upgrade": - case "specialty_rof": - cost = 2000; - break; - case "specialty_longersprint_upgrade": - case "specialty_longersprint": - cost = 2000; - break; - case "specialty_deadshot_upgrade": - case "specialty_deadshot": - cost = 1500; - break; - case "specialty_additionalprimaryweapon_upgrade": - case "specialty_additionalprimaryweapon": - cost = 4000; - break; - } - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].cost ) ) - cost = level._custom_perks[perk].cost; - - self.cost = cost; - - if ( !start_on ) - { - notify_name = perk + "_power_on"; - - level waittill( notify_name ); - } - - start_on = 0; - - if ( !isdefined( level._perkmachinenetworkchoke ) ) - level._perkmachinenetworkchoke = 0; - else - level._perkmachinenetworkchoke++; - - for ( i = 0; i < level._perkmachinenetworkchoke; i++ ) - wait_network_frame(); - - self thread maps\mp\zombies\_zm_audio::perks_a_cola_jingle_timer(); - self thread check_player_has_perk( perk ); - - switch ( perk ) - { - case "specialty_armorvest_upgrade": - case "specialty_armorvest": - self sethintstring( &"ZOMBIE_PERK_JUGGERNAUT", cost ); - break; - case "specialty_quickrevive_upgrade": - case "specialty_quickrevive": - if ( solo ) - self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE_SOLO", cost ); - else - self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE", cost ); - - break; - case "specialty_fastreload_upgrade": - case "specialty_fastreload": - self sethintstring( &"ZOMBIE_PERK_FASTRELOAD", cost ); - break; - case "specialty_rof_upgrade": - case "specialty_rof": - self sethintstring( &"ZOMBIE_PERK_DOUBLETAP", cost ); - break; - case "specialty_longersprint_upgrade": - case "specialty_longersprint": - self sethintstring( &"ZOMBIE_PERK_MARATHON", cost ); - break; - case "specialty_deadshot_upgrade": - case "specialty_deadshot": - self sethintstring( &"ZOMBIE_PERK_DEADSHOT", cost ); - break; - case "specialty_additionalprimaryweapon_upgrade": - case "specialty_additionalprimaryweapon": - self sethintstring( &"ZOMBIE_PERK_ADDITIONALPRIMARYWEAPON", cost ); - break; - case "specialty_scavenger_upgrade": - case "specialty_scavenger": - self sethintstring( &"ZOMBIE_PERK_TOMBSTONE", cost ); - break; - case "specialty_finalstand_upgrade": - case "specialty_finalstand": - self sethintstring( &"ZOMBIE_PERK_CHUGABUD", cost ); - break; - default: - self sethintstring( perk + " Cost: " + level.zombie_vars["zombie_perk_cost"] ); - } - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].hint_string ) ) - self sethintstring( level._custom_perks[perk].hint_string, cost ); - - for (;;) - { - self waittill( "trigger", player ); - - index = maps\mp\zombies\_zm_weapons::get_player_index( player ); - - if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( player.intermission ) && player.intermission ) - continue; - - if ( player in_revive_trigger() ) - continue; - - if ( !player maps\mp\zombies\_zm_magicbox::can_buy_weapon() ) - { - wait 0.1; - continue; - } - - if ( player isthrowinggrenade() ) - { - wait 0.1; - continue; - } - - if ( player isswitchingweapons() ) - { - wait 0.1; - continue; - } - - if ( player.is_drinking > 0 ) - { - wait 0.1; - continue; - } - - if ( player hasperk( perk ) || player has_perk_paused( perk ) ) - { - cheat = 0; + self endon( "death" ); + wait 0.01; + perk = self.script_noteworthy; + solo = 0; + start_on = 0; + level.revive_machine_is_solo = 0; + + if ( isdefined( perk ) && perk == "specialty_quickrevive" || perk == "specialty_quickrevive_upgrade" ) + { + flag_wait("start_zombie_round_logic"); + solo = use_solo_revive(); + self endon("stop_quickrevive_logic"); + level.quick_revive_trigger = self; + if( solo ) + { + if ( !is_true( level.revive_machine_is_solo ) ) + { + start_on = 1; + players = get_players(); + foreach ( player in players ) + { + if ( !isdefined( player.lives ) ) + { + player.lives = 0; + } + } + level maps/mp/zombies/_zm::set_default_laststand_pistol( 1 ); + } + level.revive_machine_is_solo = 1; + } + } + self sethintstring( &"ZOMBIE_NEED_POWER" ); + self setcursorhint( "HINT_NOICON" ); + self usetriggerrequirelookat(); + cost = level.zombie_vars[ "zombie_perk_cost" ]; + switch( perk ) + { + case "specialty_armorvest": + case "specialty_armorvest_upgrade": + cost = 2500; + break; + case "specialty_quickrevive": + case "specialty_quickrevive_upgrade": + if ( solo ) + { + cost = 500; + } + else + { + cost = 1500; + } + break; + case "specialty_fastreload": + case "specialty_fastreload_upgrade": + cost = 3000; + break; + case "specialty_rof": + case "specialty_rof_upgrade": + cost = 2000; + break; + case "specialty_longersprint": + case "specialty_longersprint_upgrade": + cost = 2000; + break; + case "specialty_deadshot": + case "specialty_deadshot_upgrade": + cost = 1500; + break; + case "specialty_additionalprimaryweapon": + case "specialty_additionalprimaryweapon_upgrade": + cost = 4000; + break; + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].cost ) ) + { + cost = level._custom_perks[ perk ].cost; + } + self.cost = cost; + if ( !start_on ) + { + notify_name = perk + "_power_on"; + level waittill( notify_name ); + } + start_on = 0; + if ( !isDefined( level._perkmachinenetworkchoke ) ) + { + level._perkmachinenetworkchoke = 0; + } + else + { + level._perkmachinenetworkchoke++; + } + for ( i = 0; i < level._perkmachinenetworkchoke; i++ ) + { + wait_network_frame(); + } + self thread maps/mp/zombies/_zm_audio::perks_a_cola_jingle_timer(); + self thread check_player_has_perk( perk ); + switch( perk ) + { + case "specialty_armorvest": + case "specialty_armorvest_upgrade": + self sethintstring( &"ZOMBIE_PERK_JUGGERNAUT", cost ); + break; + case "specialty_quickrevive": + case "specialty_quickrevive_upgrade": + if ( solo ) + { + self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE_SOLO", cost ); + } + else + { + self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE", cost ); + } + break; + case "specialty_fastreload": + case "specialty_fastreload_upgrade": + self sethintstring( &"ZOMBIE_PERK_FASTRELOAD", cost ); + break; + case "specialty_rof": + case "specialty_rof_upgrade": + self sethintstring( &"ZOMBIE_PERK_DOUBLETAP", cost ); + break; + case "specialty_longersprint": + case "specialty_longersprint_upgrade": + self sethintstring( &"ZOMBIE_PERK_MARATHON", cost ); + break; + case "specialty_deadshot": + case "specialty_deadshot_upgrade": + self sethintstring( &"ZOMBIE_PERK_DEADSHOT", cost ); + break; + case "specialty_additionalprimaryweapon": + case "specialty_additionalprimaryweapon_upgrade": + self sethintstring( &"ZOMBIE_PERK_ADDITIONALPRIMARYWEAPON", cost ); + break; + case "specialty_scavenger": + case "specialty_scavenger_upgrade": + self sethintstring( &"ZOMBIE_PERK_TOMBSTONE", cost ); + break; + case "specialty_finalstand": + case "specialty_finalstand_upgrade": + self sethintstring( &"ZOMBIE_PERK_CHUGABUD", cost ); + break; + default: + self sethintstring( ( perk + " Cost: " ) + level.zombie_vars[ "zombie_perk_cost" ] ); + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].hint_string ) ) + { + self sethintstring( level._custom_perks[ perk ].hint_string, cost ); + } + for ( ;; ) + { + self waittill( "trigger", player ); + index = maps/mp/zombies/_zm_weapons::get_player_index( player ); + if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || is_true( player.intermission ) ) + { + wait 0.1; + continue; + } + if ( player in_revive_trigger() ) + { + wait 0.1; + continue; + } + if ( !player maps/mp/zombies/_zm_magicbox::can_buy_weapon() ) + { + wait 0.1; + continue; + } + if ( player isthrowinggrenade() ) + { + wait 0.1; + continue; + } + if ( player isswitchingweapons() ) + { + wait 0.1; + continue; + } + if ( player.is_drinking > 0 ) + { + wait 0.1; + continue; + } + if ( player hasperk( perk ) || player has_perk_paused( perk ) ) + { + cheat = 0; + /* /# - if ( getdvarint( _hash_FA81816F ) >= 5 ) - cheat = 1; + if ( getDvarInt( "zombie_cheat" ) >= 5 ) + { + cheat = 1; #/ - if ( cheat != 1 ) - { - self playsound( "deny" ); - player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 1 ); - continue; - } - } - - if ( isdefined( level.custom_perk_validation ) ) - { - valid = self [[ level.custom_perk_validation ]]( player ); - - if ( !valid ) - continue; - } - - current_cost = cost; - - if ( player maps\mp\zombies\_zm_pers_upgrades_functions::is_pers_double_points_active() ) - current_cost = player maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_double_points_cost( current_cost ); - - if ( player.score < current_cost ) - { - self playsound( "evt_perk_deny" ); - player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); - continue; - } - - if ( player.num_perks >= player get_player_perk_purchase_limit() ) - { - self playsound( "evt_perk_deny" ); - player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "sigh" ); - continue; - } - - sound = "evt_bottle_dispense"; - playsoundatposition( sound, self.origin ); - player maps\mp\zombies\_zm_score::minus_to_player_score( current_cost, 1 ); - player.perk_purchased = perk; - self thread maps\mp\zombies\_zm_audio::play_jingle_or_stinger( self.script_label ); - self thread vending_trigger_post_think( player, perk ); - } + } + */ + if ( cheat != 1 ) + { + self playsound( "deny" ); + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 1 ); + continue; + } + } + if ( isDefined( level.custom_perk_validation ) ) + { + valid = self [[ level.custom_perk_validation ]]( player ); + if ( !valid ) + { + continue; + } + } + current_cost = cost; + if ( player maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() ) + { + current_cost = player maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_double_points_cost( current_cost ); + } + if ( player.score < current_cost ) + { + self playsound( "evt_perk_deny" ); + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); + continue; + } + + if ( player.num_perks >= player get_player_perk_purchase_limit() ) + { + self playsound( "evt_perk_deny" ); + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "sigh" ); + continue; + } + sound = "evt_bottle_dispense"; + playsoundatposition( sound, self.origin ); + player maps/mp/zombies/_zm_score::minus_to_player_score( current_cost, 1 ); + player.perk_purchased = perk; + self thread maps/mp/zombies/_zm_audio::play_jingle_or_stinger( self.script_label ); + self thread vending_trigger_post_think( player, perk ); + } } -vending_trigger_post_think( player, perk ) +vending_trigger_post_think( player, perk ) //checked matches cerberus output { - player endon( "disconnect" ); - player endon( "end_game" ); - player endon( "perk_abort_drinking" ); - gun = player perk_give_bottle_begin( perk ); - evt = player waittill_any_return( "fake_death", "death", "player_downed", "weapon_change_complete" ); - - if ( evt == "weapon_change_complete" ) - player thread wait_give_perk( perk, 1 ); - - player perk_give_bottle_end( gun, perk ); - - if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( player.intermission ) && player.intermission ) - return; - - player notify( "burp" ); - - if ( isdefined( level.pers_upgrade_cash_back ) && level.pers_upgrade_cash_back ) - player maps\mp\zombies\_zm_pers_upgrades_functions::cash_back_player_drinks_perk(); - - if ( isdefined( level.pers_upgrade_perk_lose ) && level.pers_upgrade_perk_lose ) - player thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_bought(); - - if ( isdefined( level.perk_bought_func ) ) - player [[ level.perk_bought_func ]]( perk ); - - player.perk_purchased = undefined; - - if ( is_false( self.power_on ) ) - { - wait 1; - perk_pause( self.script_noteworthy ); - } - - bbprint( "zombie_uses", "playername %s playerscore %d round %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, perk, self.origin, "perk" ); + player endon( "disconnect" ); + player endon( "end_game" ); + player endon( "perk_abort_drinking" ); + gun = player perk_give_bottle_begin( perk ); + evt = player waittill_any_return( "fake_death", "death", "player_downed", "weapon_change_complete" ); + if ( evt == "weapon_change_complete" ) + { + player thread wait_give_perk( perk, 1 ); + } + player perk_give_bottle_end( gun, perk ); + if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() || isDefined( player.intermission ) && player.intermission ) + { + return; + } + player notify( "burp" ); + if ( is_true( level.pers_upgrade_cash_back ) ) + { + player maps/mp/zombies/_zm_pers_upgrades_functions::cash_back_player_drinks_perk(); + } + if ( is_true( level.pers_upgrade_perk_lose ) ) + { + player thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_perk_lose_bought(); + } + if ( isDefined( level.perk_bought_func ) ) + { + player [[ level.perk_bought_func ]]( perk ); + } + player.perk_purchased = undefined; + if ( is_false( self.power_on ) ) + { + wait 1; + perk_pause( self.script_noteworthy ); + } + bbprint( "zombie_uses", "playername %s playerscore %d round %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, perk, self.origin, "perk" ); } -solo_revive_buy_trigger_move( revive_trigger_noteworthy ) +solo_revive_buy_trigger_move( revive_trigger_noteworthy ) //checked changed to match cerberus output { - self endon( "death" ); - revive_perk_triggers = getentarray( revive_trigger_noteworthy, "script_noteworthy" ); - - foreach ( revive_perk_trigger in revive_perk_triggers ) - self thread solo_revive_buy_trigger_move_trigger( revive_perk_trigger ); + self endon( "death" ); + revive_perk_triggers = getentarray( revive_trigger_noteworthy, "script_noteworthy" ); + foreach ( revive_perk_trigger in revive_perk_triggers ) + { + self thread solo_revive_buy_trigger_move_trigger( revive_perk_trigger ); + } } -solo_revive_buy_trigger_move_trigger( revive_perk_trigger ) +solo_revive_buy_trigger_move_trigger( revive_perk_trigger ) //checked matches cerberus output { - self endon( "death" ); - revive_perk_trigger setinvisibletoplayer( self ); - - if ( level.solo_lives_given >= 3 ) - { - revive_perk_trigger trigger_off(); - - if ( isdefined( level._solo_revive_machine_expire_func ) ) - revive_perk_trigger [[ level._solo_revive_machine_expire_func ]](); - - return; - } - - while ( self.lives > 0 ) - wait 0.1; - - revive_perk_trigger setvisibletoplayer( self ); + self endon( "death" ); + revive_perk_trigger setinvisibletoplayer( self ); + if ( level.solo_lives_given >= 3 ) + { + revive_perk_trigger trigger_off(); + if ( isDefined( level._solo_revive_machine_expire_func ) ) + { + revive_perk_trigger [[ level._solo_revive_machine_expire_func ]](); + } + return; + } + while ( self.lives > 0 ) + { + wait 0.1; + } + revive_perk_trigger setvisibletoplayer( self ); } -wait_give_perk( perk, bought ) +wait_give_perk( perk, bought ) //checked matches cerberus output { - self endon( "player_downed" ); - self endon( "disconnect" ); - self endon( "end_game" ); - self endon( "perk_abort_drinking" ); - self waittill_notify_or_timeout( "burp", 0.5 ); - self give_perk( perk, bought ); + self endon( "player_downed" ); + self endon( "disconnect" ); + self endon( "end_game" ); + self endon( "perk_abort_drinking" ); + self waittill_notify_or_timeout( "burp", 0.5 ); + self give_perk( perk, bought ); } -return_retained_perks() +return_retained_perks() //checked changed to match cerberus output { - if ( isdefined( self._retain_perks_array ) ) - { - keys = getarraykeys( self._retain_perks_array ); - - foreach ( perk in keys ) - { - if ( isdefined( self._retain_perks_array[perk] ) && self._retain_perks_array[perk] ) - self give_perk( perk, 0 ); - } - } + if ( isDefined( self._retain_perks_array ) ) + { + keys = getarraykeys( self._retain_perks_array ); + foreach ( perk in keys ) + { + if ( is_true( self._retain_perks_array[ perk ] ) ) + { + self give_perk( perk, 0 ); + } + } + } } -give_perk( perk, bought ) +give_perk( perk, bought ) //checked changed to match cerberus output { - self setperk( perk ); - self.num_perks++; - - if ( isdefined( bought ) && bought ) - { - self maps\mp\zombies\_zm_audio::playerexert( "burp" ); - - if ( isdefined( level.remove_perk_vo_delay ) && level.remove_perk_vo_delay ) - self maps\mp\zombies\_zm_audio::perk_vox( perk ); - else - self delay_thread( 1.5, maps\mp\zombies\_zm_audio::perk_vox, perk ); - - self setblur( 4, 0.1 ); - wait 0.1; - self setblur( 0, 0.1 ); - self notify( "perk_bought", perk ); - } - - self perk_set_max_health_if_jugg( perk, 1, 0 ); - - if ( !( isdefined( level.disable_deadshot_clientfield ) && level.disable_deadshot_clientfield ) ) - { - if ( perk == "specialty_deadshot" ) - self setclientfieldtoplayer( "deadshot_perk", 1 ); - else if ( perk == "specialty_deadshot_upgrade" ) - self setclientfieldtoplayer( "deadshot_perk", 1 ); - } - - if ( perk == "specialty_scavenger" ) - self.hasperkspecialtytombstone = 1; - - players = get_players(); - - if ( use_solo_revive() && perk == "specialty_quickrevive" ) - { - self.lives = 1; - - if ( !isdefined( level.solo_lives_given ) ) - level.solo_lives_given = 0; - - if ( isdefined( level.solo_game_free_player_quickrevive ) ) - level.solo_game_free_player_quickrevive = undefined; - else - level.solo_lives_given++; - - if ( level.solo_lives_given >= 3 ) - flag_set( "solo_revive" ); - - self thread solo_revive_buy_trigger_move( perk ); - } - - if ( perk == "specialty_finalstand" ) - { - self.lives = 1; - self.hasperkspecialtychugabud = 1; - self notify( "perk_chugabud_activated" ); - } - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].player_thread_give ) ) - self thread [[ level._custom_perks[perk].player_thread_give ]](); - - self set_perk_clientfield( perk, 1 ); - maps\mp\_demo::bookmark( "zm_player_perk", gettime(), self ); - self maps\mp\zombies\_zm_stats::increment_client_stat( "perks_drank" ); - self maps\mp\zombies\_zm_stats::increment_client_stat( perk + "_drank" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( perk + "_drank" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "perks_drank" ); - - if ( !isdefined( self.perk_history ) ) - self.perk_history = []; - - self.perk_history = add_to_array( self.perk_history, perk, 0 ); - - if ( !isdefined( self.perks_active ) ) - self.perks_active = []; - - self.perks_active[self.perks_active.size] = perk; - self notify( "perk_acquired" ); - self thread perk_think( perk ); + self setperk( perk ); + self.num_perks++; + if ( is_true( bought ) ) + { + self maps/mp/zombies/_zm_audio::playerexert( "burp" ); + if ( is_true( level.remove_perk_vo_delay ) ) + { + self maps/mp/zombies/_zm_audio::perk_vox( perk ); + } + else + { + self delay_thread( 1.5, ::perk_vox, perk ); + } + self setblur( 4, 0.1 ); + wait 0.1; + self setblur( 0, 0.1 ); + self notify( "perk_bought", perk ); + } + self perk_set_max_health_if_jugg( perk, 1, 0 ); + if ( !is_true( level.disable_deadshot_clientfield ) ) + { + if ( perk == "specialty_deadshot" ) + { + self setclientfieldtoplayer( "deadshot_perk", 1 ); + } + else if ( perk == "specialty_deadshot_upgrade" ) + { + self setclientfieldtoplayer( "deadshot_perk", 1 ); + } + } + if ( perk == "specialty_scavenger" ) + { + self.hasperkspecialtytombstone = 1; + } + players = get_players(); + if ( use_solo_revive() && perk == "specialty_quickrevive" ) + { + self.lives = 1; + if ( !isDefined( level.solo_lives_given ) ) + { + level.solo_lives_given = 0; + } + if ( isDefined( level.solo_game_free_player_quickrevive ) ) + { + level.solo_game_free_player_quickrevive = undefined; + } + else + { + level.solo_lives_given++; + } + if ( level.solo_lives_given >= 3 ) + { + flag_set( "solo_revive" ); + } + self thread solo_revive_buy_trigger_move( perk ); + } + if ( perk == "specialty_finalstand" ) + { + self.lives = 1; + self.hasperkspecialtychugabud = 1; + self notify( "perk_chugabud_activated" ); + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].player_thread_give ) ) + { + self thread [[ level._custom_perks[ perk ].player_thread_give ]](); + } + self set_perk_clientfield( perk, 1 ); + maps/mp/_demo::bookmark( "zm_player_perk", getTime(), self ); + self maps/mp/zombies/_zm_stats::increment_client_stat( "perks_drank" ); + self maps/mp/zombies/_zm_stats::increment_client_stat( perk + "_drank" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( perk + "_drank" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "perks_drank" ); + if ( !isDefined( self.perk_history ) ) + { + self.perk_history = []; + } + self.perk_history = add_to_array( self.perk_history, perk, 0 ); + if ( !isDefined( self.perks_active ) ) + { + self.perks_active = []; + } + self.perks_active[ self.perks_active.size ] = perk; + self notify( "perk_acquired" ); + self thread perk_think( perk ); } -perk_set_max_health_if_jugg( perk, set_premaxhealth, clamp_health_to_max_health ) +perk_set_max_health_if_jugg( perk, set_premaxhealth, clamp_health_to_max_health ) //checked matches cerberus output { - max_total_health = undefined; - - if ( perk == "specialty_armorvest" ) - { - if ( set_premaxhealth ) - self.premaxhealth = self.maxhealth; - - max_total_health = level.zombie_vars["zombie_perk_juggernaut_health"]; - } - else if ( perk == "specialty_armorvest_upgrade" ) - { - if ( set_premaxhealth ) - self.premaxhealth = self.maxhealth; - - max_total_health = level.zombie_vars["zombie_perk_juggernaut_health_upgrade"]; - } - else if ( perk == "jugg_upgrade" ) - { - if ( set_premaxhealth ) - self.premaxhealth = self.maxhealth; - - if ( self hasperk( "specialty_armorvest" ) ) - max_total_health = level.zombie_vars["zombie_perk_juggernaut_health"]; - else - max_total_health = 100; - } - else if ( perk == "health_reboot" ) - max_total_health = 100; - - if ( isdefined( max_total_health ) ) - { - if ( self maps\mp\zombies\_zm_pers_upgrades_functions::pers_jugg_active() ) - max_total_health += level.pers_jugg_upgrade_health_bonus; - - self setmaxhealth( max_total_health ); - - if ( isdefined( clamp_health_to_max_health ) && clamp_health_to_max_health == 1 ) - { - if ( self.health > self.maxhealth ) - self.health = self.maxhealth; - } - } + max_total_health = undefined; + if ( perk == "specialty_armorvest" ) + { + if ( set_premaxhealth ) + { + self.premaxhealth = self.maxhealth; + } + max_total_health = level.zombie_vars[ "zombie_perk_juggernaut_health" ]; + } + else if ( perk == "specialty_armorvest_upgrade" ) + { + if ( set_premaxhealth ) + { + self.premaxhealth = self.maxhealth; + } + max_total_health = level.zombie_vars[ "zombie_perk_juggernaut_health_upgrade" ]; + } + else if ( perk == "jugg_upgrade" ) + { + if ( set_premaxhealth ) + { + self.premaxhealth = self.maxhealth; + } + if ( self hasperk( "specialty_armorvest" ) ) + { + max_total_health = level.zombie_vars[ "zombie_perk_juggernaut_health" ]; + } + else + { + max_total_health = 100; + } + } + else + { + if ( perk == "health_reboot" ) + { + max_total_health = 100; + } + } + if ( isDefined( max_total_health ) ) + { + if ( self maps/mp/zombies/_zm_pers_upgrades_functions::pers_jugg_active() ) + { + max_total_health += level.pers_jugg_upgrade_health_bonus; + } + self setmaxhealth( max_total_health ); + if ( isDefined( clamp_health_to_max_health ) && clamp_health_to_max_health == 1 ) + { + if ( self.health > self.maxhealth ) + { + self.health = self.maxhealth; + } + } + } } -check_player_has_perk( perk ) +check_player_has_perk( perk ) //checked partially changed to match cerberus output { - self endon( "death" ); + self endon( "death" ); + /* /# - if ( getdvarint( _hash_FA81816F ) >= 5 ) - return; + if ( getDvarInt( "zombie_cheat" ) >= 5 ) + { + return; #/ - dist = 16384; - - while ( true ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( distancesquared( players[i].origin, self.origin ) < dist ) - { - if ( !players[i] hasperk( perk ) && !players[i] has_perk_paused( perk ) && !players[i] in_revive_trigger() && !is_equipment_that_blocks_purchase( players[i] getcurrentweapon() ) && !players[i] hacker_active() ) - { - self setinvisibletoplayer( players[i], 0 ); - continue; - } - - self setinvisibletoplayer( players[i], 1 ); - } - } - - wait 0.1; - } + } + */ + dist = 16384; + while ( 1 ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( distancesquared( players[ i ].origin, self.origin ) < dist ) + { + if ( !players[ i ] hasperk( perk ) && !players[ i ] has_perk_paused( perk ) && !players[ i ] in_revive_trigger() && !is_equipment_that_blocks_purchase( players[ i ] getcurrentweapon() ) && !players[ i ] hacker_active() ) + { + self setinvisibletoplayer( players[ i ], 0 ); + i++; + continue; + } + self setinvisibletoplayer( players[ i ], 1 ); + } + i++; + } + wait 0.1; + } } -vending_set_hintstring( perk ) +vending_set_hintstring( perk ) //checked matches cerberus output { - switch ( perk ) - { - case "specialty_armorvest_upgrade": - case "specialty_armorvest": - break; - } + switch( perk ) + { + case "specialty_armorvest": + case "specialty_armorvest_upgrade": + break; + } } -perk_think( perk ) +perk_think( perk ) //checked changed to match cerberus output { +/* /# - if ( getdvarint( _hash_FA81816F ) >= 5 ) - { - if ( isdefined( self.perk_hud[perk] ) ) - return; - } + if ( getDvarInt( "zombie_cheat" ) >= 5 ) + { + if ( isDefined( self.perk_hud[ perk ] ) ) + { + return; #/ - perk_str = perk + "_stop"; - result = self waittill_any_return( "fake_death", "death", "player_downed", perk_str ); - do_retain = 1; + } + } +*/ + perk_str = perk + "_stop"; + result = self waittill_any_return( "fake_death", "death", "player_downed", perk_str ); + do_retain = 1; + if ( use_solo_revive() && perk == "specialty_quickrevive" ) + { + do_retain = 0; + } + if ( do_retain ) + { + if ( is_true( self._retain_perks ) ) + { + return; + } + else if ( isDefined( self._retain_perks_array ) && is_true( self._retain_perks_array[ perk ] ) ) + { + return; + } + } + self unsetperk( perk ); + self.num_perks--; - if ( use_solo_revive() && perk == "specialty_quickrevive" ) - do_retain = 0; - - if ( do_retain ) - { - if ( isdefined( self._retain_perks ) && self._retain_perks ) - return; - else if ( isdefined( self._retain_perks_array ) && ( isdefined( self._retain_perks_array[perk] ) && self._retain_perks_array[perk] ) ) - return; - } - - self unsetperk( perk ); - self.num_perks--; - - switch ( perk ) - { - case "specialty_armorvest": - self setmaxhealth( 100 ); - break; - case "specialty_additionalprimaryweapon": - if ( result == perk_str ) - self maps\mp\zombies\_zm::take_additionalprimaryweapon(); - - break; - case "specialty_deadshot": - if ( !( isdefined( level.disable_deadshot_clientfield ) && level.disable_deadshot_clientfield ) ) - self setclientfieldtoplayer( "deadshot_perk", 0 ); - - break; - case "specialty_deadshot_upgrade": - if ( !( isdefined( level.disable_deadshot_clientfield ) && level.disable_deadshot_clientfield ) ) - self setclientfieldtoplayer( "deadshot_perk", 0 ); - - break; - } - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].player_thread_take ) ) - self thread [[ level._custom_perks[perk].player_thread_take ]](); - - self set_perk_clientfield( perk, 0 ); - self.perk_purchased = undefined; - - if ( isdefined( level.perk_lost_func ) ) - self [[ level.perk_lost_func ]]( perk ); - - if ( isdefined( self.perks_active ) && isinarray( self.perks_active, perk ) ) - arrayremovevalue( self.perks_active, perk, 0 ); - - self notify( "perk_lost" ); + switch( perk ) + { + case "specialty_armorvest": + self setmaxhealth( 100 ); + break; + case "specialty_additionalprimaryweapon": + if ( result == perk_str ) + { + self maps/mp/zombies/_zm::take_additionalprimaryweapon(); + } + break; + case "specialty_deadshot": + if ( !is_true( level.disable_deadshot_clientfield ) ) + { + self setclientfieldtoplayer( "deadshot_perk", 0 ); + } + break; + case "specialty_deadshot_upgrade": + if ( !is_true( level.disable_deadshot_clientfield ) ) + { + self setclientfieldtoplayer( "deadshot_perk", 0 ); + } + break; + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].player_thread_take ) ) + { + self thread [[ level._custom_perks[ perk ].player_thread_take ]](); + } + self set_perk_clientfield( perk, 0 ); + self.perk_purchased = undefined; + if ( isDefined( level.perk_lost_func ) ) + { + self [[ level.perk_lost_func ]]( perk ); + } + if ( isDefined( self.perks_active ) && isinarray( self.perks_active, perk ) ) + { + arrayremovevalue( self.perks_active, perk, 0 ); + } + self notify( "perk_lost" ); } -set_perk_clientfield( perk, state ) +set_perk_clientfield( perk, state ) //checked matches cerberus output { - switch ( perk ) - { - case "specialty_additionalprimaryweapon": - self setclientfieldtoplayer( "perk_additional_primary_weapon", state ); - break; - case "specialty_deadshot": - self setclientfieldtoplayer( "perk_dead_shot", state ); - break; - case "specialty_flakjacket": - self setclientfieldtoplayer( "perk_dive_to_nuke", state ); - break; - case "specialty_rof": - self setclientfieldtoplayer( "perk_double_tap", state ); - break; - case "specialty_armorvest": - self setclientfieldtoplayer( "perk_juggernaut", state ); - break; - case "specialty_longersprint": - self setclientfieldtoplayer( "perk_marathon", state ); - break; - case "specialty_quickrevive": - self setclientfieldtoplayer( "perk_quick_revive", state ); - break; - case "specialty_fastreload": - self setclientfieldtoplayer( "perk_sleight_of_hand", state ); - break; - case "specialty_scavenger": - self setclientfieldtoplayer( "perk_tombstone", state ); - break; - case "specialty_finalstand": - self setclientfieldtoplayer( "perk_chugabud", state ); - break; - default: - break; - } - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].clientfield_set ) ) - self [[ level._custom_perks[perk].clientfield_set ]]( state ); + switch( perk ) + { + case "specialty_additionalprimaryweapon": + self setclientfieldtoplayer( "perk_additional_primary_weapon", state ); + break; + case "specialty_deadshot": + self setclientfieldtoplayer( "perk_dead_shot", state ); + break; + case "specialty_flakjacket": + self setclientfieldtoplayer( "perk_dive_to_nuke", state ); + break; + case "specialty_rof": + self setclientfieldtoplayer( "perk_double_tap", state ); + break; + case "specialty_armorvest": + self setclientfieldtoplayer( "perk_juggernaut", state ); + break; + case "specialty_longersprint": + self setclientfieldtoplayer( "perk_marathon", state ); + break; + case "specialty_quickrevive": + self setclientfieldtoplayer( "perk_quick_revive", state ); + break; + case "specialty_fastreload": + self setclientfieldtoplayer( "perk_sleight_of_hand", state ); + break; + case "specialty_scavenger": + self setclientfieldtoplayer( "perk_tombstone", state ); + break; + case "specialty_finalstand": + self setclientfieldtoplayer( "perk_chugabud", state ); + break; + default: + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].clientfield_set ) ) + { + self [[ level._custom_perks[ perk ].clientfield_set ]]( state ); + } + } } -perk_hud_destroy( perk ) +perk_hud_destroy( perk ) //checked changed to match cerberus output { - self.perk_hud[perk] destroy_hud(); - self.perk_hud[perk] = undefined; + self.perk_hud[ perk ] destroy_hud(); + self.perk_hud[ perk ] = undefined; } -perk_hud_grey( perk, grey_on_off ) +perk_hud_grey( perk, grey_on_off ) //checked matches cerberus output { - if ( grey_on_off ) - self.perk_hud[perk].alpha = 0.3; - else - self.perk_hud[perk].alpha = 1.0; + if ( grey_on_off ) + { + self.perk_hud[ perk ].alpha = 0.3; + } + else + { + self.perk_hud[ perk ].alpha = 1; + } } -perk_hud_flash() +perk_hud_flash() //checked matches cerberus output { - self endon( "death" ); - self.flash = 1; - self scaleovertime( 0.05, 32, 32 ); - wait 0.3; - self scaleovertime( 0.05, 24, 24 ); - wait 0.3; - self.flash = 0; + self endon( "death" ); + self.flash = 1; + self scaleovertime( 0.05, 32, 32 ); + wait 0.3; + self scaleovertime( 0.05, 24, 24 ); + wait 0.3; + self.flash = 0; } -perk_flash_audio( perk ) +perk_flash_audio( perk ) //checked matches cerberus output { - alias = undefined; - - switch ( perk ) - { - case "specialty_armorvest": - alias = "zmb_hud_flash_jugga"; - break; - case "specialty_quickrevive": - alias = "zmb_hud_flash_revive"; - break; - case "specialty_fastreload": - alias = "zmb_hud_flash_speed"; - break; - case "specialty_longersprint": - alias = "zmb_hud_flash_stamina"; - break; - case "specialty_flakjacket": - alias = "zmb_hud_flash_phd"; - break; - case "specialty_deadshot": - alias = "zmb_hud_flash_deadshot"; - break; - case "specialty_additionalprimaryweapon": - alias = "zmb_hud_flash_additionalprimaryweapon"; - break; - } - - if ( isdefined( alias ) ) - self playlocalsound( alias ); + alias = undefined; + switch( perk ) + { + case "specialty_armorvest": + alias = "zmb_hud_flash_jugga"; + break; + case "specialty_quickrevive": + alias = "zmb_hud_flash_revive"; + break; + case "specialty_fastreload": + alias = "zmb_hud_flash_speed"; + break; + case "specialty_longersprint": + alias = "zmb_hud_flash_stamina"; + break; + case "specialty_flakjacket": + alias = "zmb_hud_flash_phd"; + break; + case "specialty_deadshot": + alias = "zmb_hud_flash_deadshot"; + break; + case "specialty_additionalprimaryweapon": + alias = "zmb_hud_flash_additionalprimaryweapon"; + break; + } + if ( isDefined( alias ) ) + { + self playlocalsound( alias ); + } } -perk_hud_start_flash( perk ) +perk_hud_start_flash( perk ) //checked does not match cerberus output did not change { - if ( self hasperk( perk ) && isdefined( self.perk_hud ) ) - { - hud = self.perk_hud[perk]; - - if ( isdefined( hud ) ) - { - if ( !( isdefined( hud.flash ) && hud.flash ) ) - { - hud thread perk_hud_flash(); - self thread perk_flash_audio( perk ); - } - } - } + if ( self hasperk( perk ) && isDefined( self.perk_hud ) ) + { + hud = self.perk_hud[ perk ]; + if ( isDefined( hud ) ) + { + if ( !is_true( hud.flash ) ) + { + hud thread perk_hud_flash(); + self thread perk_flash_audio( perk ); + } + } + } } -perk_hud_stop_flash( perk, taken ) +perk_hud_stop_flash( perk, taken ) //checked matches cerberus output { - if ( self hasperk( perk ) && isdefined( self.perk_hud ) ) - { - hud = self.perk_hud[perk]; - - if ( isdefined( hud ) ) - { - hud.flash = undefined; - - if ( isdefined( taken ) ) - hud notify( "stop_flash_perk" ); - } - } + if ( self hasperk( perk ) && isDefined( self.perk_hud ) ) + { + hud = self.perk_hud[ perk ]; + if ( isDefined( hud ) ) + { + hud.flash = undefined; + if ( isDefined( taken ) ) + { + hud notify( "stop_flash_perk" ); + } + } + } } -perk_give_bottle_begin( perk ) +perk_give_bottle_begin( perk ) //checked matches cerberus output { - self increment_is_drinking(); - self disable_player_move_states( 1 ); - gun = self getcurrentweapon(); - weapon = ""; - - switch ( perk ) - { - case "specialty_armorvest": - case " _upgrade": - weapon = level.machine_assets["juggernog"].weapon; - break; - case "specialty_quickrevive_upgrade": - case "specialty_quickrevive": - weapon = level.machine_assets["revive"].weapon; - break; - case "specialty_fastreload_upgrade": - case "specialty_fastreload": - weapon = level.machine_assets["speedcola"].weapon; - break; - case "specialty_rof_upgrade": - case "specialty_rof": - weapon = level.machine_assets["doubletap"].weapon; - break; - case "specialty_longersprint_upgrade": - case "specialty_longersprint": - weapon = level.machine_assets["marathon"].weapon; - break; - case "specialty_flakjacket_upgrade": - case "specialty_flakjacket": - weapon = level.machine_assets["divetonuke"].weapon; - break; - case "specialty_deadshot_upgrade": - case "specialty_deadshot": - weapon = level.machine_assets["deadshot"].weapon; - break; - case "specialty_additionalprimaryweapon_upgrade": - case "specialty_additionalprimaryweapon": - weapon = level.machine_assets["additionalprimaryweapon"].weapon; - break; - case "specialty_scavenger_upgrade": - case "specialty_scavenger": - weapon = level.machine_assets["tombstone"].weapon; - break; - case "specialty_finalstand_upgrade": - case "specialty_finalstand": - weapon = level.machine_assets["whoswho"].weapon; - break; - } - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].perk_bottle ) ) - weapon = level._custom_perks[perk].perk_bottle; - - self giveweapon( weapon ); - self switchtoweapon( weapon ); - return gun; + self increment_is_drinking(); + self disable_player_move_states( 1 ); + gun = self getcurrentweapon(); + weapon = ""; + switch( perk ) + { + case " _upgrade": + case "specialty_armorvest": + weapon = level.machine_assets[ "juggernog" ].weapon; + break; + case "specialty_quickrevive": + case "specialty_quickrevive_upgrade": + weapon = level.machine_assets[ "revive" ].weapon; + break; + case "specialty_fastreload": + case "specialty_fastreload_upgrade": + weapon = level.machine_assets[ "speedcola" ].weapon; + break; + case "specialty_rof": + case "specialty_rof_upgrade": + weapon = level.machine_assets[ "doubletap" ].weapon; + break; + case "specialty_longersprint": + case "specialty_longersprint_upgrade": + weapon = level.machine_assets[ "marathon" ].weapon; + break; + case "specialty_flakjacket": + case "specialty_flakjacket_upgrade": + weapon = level.machine_assets[ "divetonuke" ].weapon; + break; + case "specialty_deadshot": + case "specialty_deadshot_upgrade": + weapon = level.machine_assets[ "deadshot" ].weapon; + break; + case "specialty_additionalprimaryweapon": + case "specialty_additionalprimaryweapon_upgrade": + weapon = level.machine_assets[ "additionalprimaryweapon" ].weapon; + break; + case "specialty_scavenger": + case "specialty_scavenger_upgrade": + weapon = level.machine_assets[ "tombstone" ].weapon; + break; + case "specialty_finalstand": + case "specialty_finalstand_upgrade": + weapon = level.machine_assets[ "whoswho" ].weapon; + break; + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].perk_bottle ) ) + { + weapon = level._custom_perks[ perk ].perk_bottle; + } + self giveweapon( weapon ); + self switchtoweapon( weapon ); + return gun; } -perk_give_bottle_end( gun, perk ) +perk_give_bottle_end( gun, perk ) //checked matches cerberus output { - self endon( "perk_abort_drinking" ); + self endon( "perk_abort_drinking" ); + /* /# - assert( !is_zombie_perk_bottle( gun ) ); + assert( !is_zombie_perk_bottle( gun ) ); #/ /# - assert( gun != level.revive_tool ); + assert( gun != level.revive_tool ); #/ - self enable_player_move_states(); - weapon = ""; + */ + self enable_player_move_states(); + weapon = ""; + switch( perk ) + { + case "specialty_rof": + case "specialty_rof_upgrade": + weapon = level.machine_assets[ "doubletap" ].weapon; + break; + case "specialty_longersprint": + case "specialty_longersprint_upgrade": + weapon = level.machine_assets[ "marathon" ].weapon; + break; + case "specialty_flakjacket": + case "specialty_flakjacket_upgrade": + weapon = level.machine_assets[ "divetonuke" ].weapon; + break; + case "specialty_armorvest": + case "specialty_armorvest_upgrade": + weapon = level.machine_assets[ "juggernog" ].weapon; + self.jugg_used = 1; + break; + case "specialty_quickrevive": + case "specialty_quickrevive_upgrade": + weapon = level.machine_assets[ "revive" ].weapon; + break; + case "specialty_fastreload": + case "specialty_fastreload_upgrade": + weapon = level.machine_assets[ "speedcola" ].weapon; + self.speed_used = 1; + break; + case "specialty_deadshot": + case "specialty_deadshot_upgrade": + weapon = level.machine_assets[ "deadshot" ].weapon; + break; + case "specialty_additionalprimaryweapon": + case "specialty_additionalprimaryweapon_upgrade": + weapon = level.machine_assets[ "additionalprimaryweapon" ].weapon; + break; + case "specialty_scavenger": + case "specialty_scavenger_upgrade": + weapon = level.machine_assets[ "tombstone" ].weapon; + break; + case "specialty_finalstand": + case "specialty_finalstand_upgrade": + weapon = level.machine_assets[ "whoswho" ].weapon; + break; + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].perk_bottle ) ) + { + weapon = level._custom_perks[ perk ].perk_bottle; + } + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() || is_true( self.intermission ) ) + { + self takeweapon( weapon ); + return; + } + self takeweapon( weapon ); + if ( self is_multiple_drinking() ) + { + self decrement_is_drinking(); + return; + } + else if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment_that_blocks_purchase( gun ) ) + { + self switchtoweapon( gun ); + if ( is_melee_weapon( gun ) ) + { + self decrement_is_drinking(); + return; + } + } + else + { + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + } + } + self waittill( "weapon_change_complete" ); + self decrement_is_drinking(); + if ( !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() && !is_true( self.intermission ) ) + { + self decrement_is_drinking(); + } - switch ( perk ) - { - case "specialty_rof_upgrade": - case "specialty_rof": - weapon = level.machine_assets["doubletap"].weapon; - break; - case "specialty_longersprint_upgrade": - case "specialty_longersprint": - weapon = level.machine_assets["marathon"].weapon; - break; - case "specialty_flakjacket_upgrade": - case "specialty_flakjacket": - weapon = level.machine_assets["divetonuke"].weapon; - break; - case "specialty_armorvest_upgrade": - case "specialty_armorvest": - weapon = level.machine_assets["juggernog"].weapon; - self.jugg_used = 1; - break; - case "specialty_quickrevive_upgrade": - case "specialty_quickrevive": - weapon = level.machine_assets["revive"].weapon; - break; - case "specialty_fastreload_upgrade": - case "specialty_fastreload": - weapon = level.machine_assets["speedcola"].weapon; - self.speed_used = 1; - break; - case "specialty_deadshot_upgrade": - case "specialty_deadshot": - weapon = level.machine_assets["deadshot"].weapon; - break; - case "specialty_additionalprimaryweapon_upgrade": - case "specialty_additionalprimaryweapon": - weapon = level.machine_assets["additionalprimaryweapon"].weapon; - break; - case "specialty_scavenger_upgrade": - case "specialty_scavenger": - weapon = level.machine_assets["tombstone"].weapon; - break; - case "specialty_finalstand_upgrade": - case "specialty_finalstand": - weapon = level.machine_assets["whoswho"].weapon; - break; - } - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].perk_bottle ) ) - weapon = level._custom_perks[perk].perk_bottle; - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() || isdefined( self.intermission ) && self.intermission ) - { - self takeweapon( weapon ); - return; - } - - self takeweapon( weapon ); - - if ( self is_multiple_drinking() ) - { - self decrement_is_drinking(); - return; - } - else if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment_that_blocks_purchase( gun ) ) - { - self switchtoweapon( gun ); - - if ( is_melee_weapon( gun ) ) - { - self decrement_is_drinking(); - return; - } - } - else - { - primaryweapons = self getweaponslistprimaries(); - - if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) - self switchtoweapon( primaryweapons[0] ); - } - - self waittill( "weapon_change_complete" ); - - if ( !self maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( isdefined( self.intermission ) && self.intermission ) ) - self decrement_is_drinking(); } -perk_abort_drinking( post_delay ) +perk_abort_drinking( post_delay ) //checked matches cerberus output { - if ( self.is_drinking ) - { - self notify( "perk_abort_drinking" ); - self decrement_is_drinking(); - self enable_player_move_states(); - - if ( isdefined( post_delay ) ) - wait( post_delay ); - } + if ( self.is_drinking ) + { + self notify( "perk_abort_drinking" ); + self decrement_is_drinking(); + self enable_player_move_states(); + if ( isDefined( post_delay ) ) + { + wait post_delay; + } + } } -give_random_perk() +give_random_perk() //checked partially changed to match cerberus output { - random_perk = undefined; - vending_triggers = getentarray( "zombie_vending", "targetname" ); - perks = []; - - for ( i = 0; i < vending_triggers.size; i++ ) - { - perk = vending_triggers[i].script_noteworthy; - - if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk ) - continue; - - if ( perk == "specialty_weapupgrade" ) - continue; - - if ( !self hasperk( perk ) && !self has_perk_paused( perk ) ) - perks[perks.size] = perk; - } - - if ( perks.size > 0 ) - { - perks = array_randomize( perks ); - random_perk = perks[0]; - self give_perk( random_perk ); - } - else - self playsoundtoplayer( level.zmb_laugh_alias, self ); - - return random_perk; + random_perk = undefined; + vending_triggers = getentarray( "zombie_vending", "targetname" ); + perks = []; + i = 0; + while ( i < vending_triggers.size ) + { + perk = vending_triggers[ i ].script_noteworthy; + if ( isDefined( self.perk_purchased ) && self.perk_purchased == perk ) + { + i++; + continue; + } + if ( perk == "specialty_weapupgrade" ) + { + i++; + continue; + } + if ( !self hasperk( perk ) && !self has_perk_paused( perk ) ) + { + perks[ perks.size ] = perk; + } + i++; + } + if ( perks.size > 0 ) + { + perks = array_randomize( perks ); + random_perk = perks[ 0 ]; + self give_perk( random_perk ); + } + else + { + self playsoundtoplayer( level.zmb_laugh_alias, self ); + } + return random_perk; } -lose_random_perk() +lose_random_perk() //checked partially changed to match cerberus output { - vending_triggers = getentarray( "zombie_vending", "targetname" ); - perks = []; + vending_triggers = getentarray( "zombie_vending", "targetname" ); + perks = []; + i = 0; + while ( i < vending_triggers.size ) + { + perk = vending_triggers[ i ].script_noteworthy; + if ( isDefined( self.perk_purchased ) && self.perk_purchased == perk ) + { + i++; + continue; + } + if ( self hasperk( perk ) || self has_perk_paused( perk ) ) + { + perks[ perks.size ] = perk; + } + i++; + } + if ( perks.size > 0 ) + { + perks = array_randomize( perks ); + perk = perks[ 0 ]; + perk_str = perk + "_stop"; + self notify( perk_str ); + if ( use_solo_revive() && perk == "specialty_quickrevive" ) + { + self.lives--; - for ( i = 0; i < vending_triggers.size; i++ ) - { - perk = vending_triggers[i].script_noteworthy; - - if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk ) - continue; - - if ( self hasperk( perk ) || self has_perk_paused( perk ) ) - perks[perks.size] = perk; - } - - if ( perks.size > 0 ) - { - perks = array_randomize( perks ); - perk = perks[0]; - perk_str = perk + "_stop"; - self notify( perk_str ); - - if ( use_solo_revive() && perk == "specialty_quickrevive" ) - self.lives--; - } + } + } } update_perk_hud() { - if ( isdefined( self.perk_hud ) ) - { - keys = getarraykeys( self.perk_hud ); - - for ( i = 0; i < self.perk_hud.size; i++ ) - self.perk_hud[keys[i]].x = i * 30; - } + if ( isDefined( self.perk_hud ) ) + { + keys = getarraykeys( self.perk_hud ); + for ( i = 0; i < self.perk_hud.size; i++) + { + self.perk_hud[ keys[ i ] ].x = i * 30; + } + } } -quantum_bomb_give_nearest_perk_validation( position ) +quantum_bomb_give_nearest_perk_validation( position ) //checked changed to match cerberus output { - vending_triggers = getentarray( "zombie_vending", "targetname" ); - range_squared = 32400; - - for ( i = 0; i < vending_triggers.size; i++ ) - { - if ( distancesquared( vending_triggers[i].origin, position ) < range_squared ) - return true; - } - - return false; + vending_triggers = getentarray( "zombie_vending", "targetname" ); + range_squared = 32400; + for ( i = 0; i < vending_triggers.size; i++ ) + { + if ( distancesquared( vending_triggers[ i ].origin, position ) < range_squared ) + { + return 1; + } + } + return 0; } -quantum_bomb_give_nearest_perk_result( position ) +quantum_bomb_give_nearest_perk_result( position ) //checked partially changed to match cerberus output { - [[ level.quantum_bomb_play_mystery_effect_func ]]( position ); - vending_triggers = getentarray( "zombie_vending", "targetname" ); - nearest = 0; - - for ( i = 1; i < vending_triggers.size; i++ ) - { - if ( distancesquared( vending_triggers[i].origin, position ) < distancesquared( vending_triggers[nearest].origin, position ) ) - nearest = i; - } - - players = get_players(); - perk = vending_triggers[nearest].script_noteworthy; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( player.sessionstate == "spectator" || player maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - continue; - - if ( !player hasperk( perk ) && ( !isdefined( player.perk_purchased ) || player.perk_purchased != perk ) && randomint( 5 ) ) - { - if ( player == self ) - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "quant_good" ); - - player give_perk( perk ); - player [[ level.quantum_bomb_play_player_effect_func ]](); - } - } + [[ level.quantum_bomb_play_mystery_effect_func ]]( position ); + vending_triggers = getentarray( "zombie_vending", "targetname" ); + nearest = 0; + for ( i = 1; i < vending_triggers.size; i++ ) + { + if ( distancesquared( vending_triggers[ i ].origin, position ) < distancesquared( vending_triggers[ nearest ].origin, position ) ) + { + nearest = i; + } + } + players = get_players(); + perk = vending_triggers[ nearest ].script_noteworthy; + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + if ( player.sessionstate == "spectator" || player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + i++; + continue; + } + if ( !player hasperk( perk ) && isDefined( player.perk_purchased ) && player.perk_purchased != perk && randomint( 5 ) ) + { + if ( player == self ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); + } + player give_perk( perk ); + player [[ level.quantum_bomb_play_player_effect_func ]](); + } + i++; + } } -perk_pause( perk ) +perk_pause( perk ) //checked changed to match cerberus output { - if ( perk == "Pack_A_Punch" || perk == "specialty_weapupgrade" ) - return; - - for ( j = 0; j < get_players().size; j++ ) - { - player = get_players()[j]; - - if ( !isdefined( player.disabled_perks ) ) - player.disabled_perks = []; - - player.disabled_perks[perk] = isdefined( player.disabled_perks[perk] ) && player.disabled_perks[perk] || player hasperk( perk ); - - if ( player.disabled_perks[perk] ) - { - player unsetperk( perk ); - player set_perk_clientfield( perk, 2 ); - - if ( perk == "specialty_armorvest" || perk == "specialty_armorvest_upgrade" ) - { - player setmaxhealth( player.premaxhealth ); - - if ( player.health > player.maxhealth ) - player.health = player.maxhealth; - } - - if ( perk == "specialty_additionalprimaryweapon" || perk == "specialty_additionalprimaryweapon_upgrade" ) - player maps\mp\zombies\_zm::take_additionalprimaryweapon(); - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].player_thread_take ) ) - player thread [[ level._custom_perks[perk].player_thread_take ]](); + if ( perk == "Pack_A_Punch" || perk == "specialty_weapupgrade" ) + { + return; + } + for ( j = 0; j < get_players().size; j++ ) + { + player = get_players()[ j ]; + if ( !isDefined( player.disabled_perks ) ) + { + player.disabled_perks = []; + } + if ( !is_true( player.disabled_perks[ perk ] ) ) + { + player.disabled_perks[ perk ] = player hasperk( perk ); + } + if ( player.disabled_perks[ perk ] ) + { + player unsetperk( perk ); + player set_perk_clientfield( perk, 2 ); + if ( perk == "specialty_armorvest" || perk == "specialty_armorvest_upgrade" ) + { + player setmaxhealth( player.premaxhealth ); + if ( player.health > player.maxhealth ) + { + player.health = player.maxhealth; + } + } + if ( perk == "specialty_additionalprimaryweapon" || perk == "specialty_additionalprimaryweapon_upgrade" ) + { + player maps/mp/zombies/_zm::take_additionalprimaryweapon(); + } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].player_thread_take ) ) + { + player thread [[ level._custom_perks[ perk ].player_thread_take ]](); + } + /* /# - println( " ZM PERKS " + player.name + " paused perk " + perk + "\n" ); + println( " ZM PERKS " + player.name + " paused perk " + perk + "\n" ); #/ - } - } + */ + } + } } -perk_unpause( perk ) +perk_unpause( perk ) //checked changed to match cerberus output { - if ( !isdefined( perk ) ) - return; - - if ( perk == "Pack_A_Punch" ) - return; - - for ( j = 0; j < get_players().size; j++ ) - { - player = get_players()[j]; - - if ( isdefined( player.disabled_perks ) && ( isdefined( player.disabled_perks[perk] ) && player.disabled_perks[perk] ) ) - { - player.disabled_perks[perk] = 0; - player set_perk_clientfield( perk, 1 ); - player setperk( perk ); + if ( !isDefined( perk ) ) + { + return; + } + if ( perk == "Pack_A_Punch" ) + { + return; + } + for ( j = 0; j < get_players().size; j++ ) + { + player = get_players()[ j ]; + if ( isDefined( player.disabled_perks ) && is_true( player.disabled_perks[ perk ] ) ) + { + player.disabled_perks[ perk ] = 0; + player set_perk_clientfield( perk, 1 ); + player setperk( perk ); + /* /# - println( " ZM PERKS " + player.name + " unpaused perk " + perk + "\n" ); + println( " ZM PERKS " + player.name + " unpaused perk " + perk + "\n" ); #/ - if ( issubstr( perk, "specialty_scavenger" ) ) - player.hasperkspecialtytombstone = 1; - - player perk_set_max_health_if_jugg( perk, 0, 0 ); - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].player_thread_give ) ) - player thread [[ level._custom_perks[perk].player_thread_give ]](); - } - } + */ + if ( issubstr( perk, "specialty_scavenger" ) ) + { + player.hasperkspecialtytombstone = 1; + } + player perk_set_max_health_if_jugg( perk, 0, 0 ); + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].player_thread_give ) ) + { + player thread [[ level._custom_perks[ perk ].player_thread_give ]](); + } + } + } } -perk_pause_all_perks() +perk_pause_all_perks() //checked changed to match cerberus output { - vending_triggers = getentarray( "zombie_vending", "targetname" ); - - foreach ( trigger in vending_triggers ) - maps\mp\zombies\_zm_perks::perk_pause( trigger.script_noteworthy ); + vending_triggers = getentarray( "zombie_vending", "targetname" ); + foreach ( trigger in vending_triggers ) + { + maps/mp/zombies/_zm_perks::perk_pause( trigger.script_noteworthy ); + } } -perk_unpause_all_perks() +perk_unpause_all_perks() //checked changed to match cerberus output { - vending_triggers = getentarray( "zombie_vending", "targetname" ); - - foreach ( trigger in vending_triggers ) - maps\mp\zombies\_zm_perks::perk_unpause( trigger.script_noteworthy ); + vending_triggers = getentarray( "zombie_vending", "targetname" ); + foreach ( trigger in vending_triggers ) + { + maps/mp/zombies/_zm_perks::perk_unpause( trigger.script_noteworthy ); + } } -has_perk_paused( perk ) +has_perk_paused( perk ) //checked matches cerberus output { - if ( isdefined( self.disabled_perks ) && isdefined( self.disabled_perks[perk] ) && self.disabled_perks[perk] ) - return true; - - return false; + if ( isDefined( self.disabled_perks ) && is_true( self.disabled_perks[ perk ] ) ) + { + return 1; + } + return 0; } -getvendingmachinenotify() +getvendingmachinenotify() //checked matches cerberus output { - if ( !isdefined( self ) ) - return ""; - - switch ( self.script_noteworthy ) - { - case "specialty_armorvest_upgrade": - case "specialty_armorvest": - return "juggernog"; - break; - case "specialty_quickrevive_upgrade": - case "specialty_quickrevive": - return "revive"; - break; - case "specialty_fastreload_upgrade": - case "specialty_fastreload": - return "sleight"; - break; - case "specialty_rof_upgrade": - case "specialty_rof": - return "doubletap"; - break; - case "specialty_longersprint_upgrade": - case "specialty_longersprint": - return "marathon"; - break; - case "specialty_flakjacket_upgrade": - case "specialty_flakjacket": - return "divetonuke"; - break; - case "specialty_deadshot_upgrade": - case "specialty_deadshot": - return "deadshot"; - break; - case "specialty_additionalprimaryweapon_upgrade": - case "specialty_additionalprimaryweapon": - return "additionalprimaryweapon"; - break; - case "specialty_scavenger_upgrade": - case "specialty_scavenger": - return "tombstone"; - break; - case "specialty_finalstand_upgrade": - case "specialty_finalstand": - return "chugabud"; - break; - case "specialty_weapupgrade": - return "Pack_A_Punch"; - } - - str_perk = undefined; - - if ( isdefined( level._custom_perks[self.script_noteworthy] ) && isdefined( isdefined( level._custom_perks[self.script_noteworthy].alias ) ) ) - str_perk = level._custom_perks[self.script_noteworthy].alias; - - return str_perk; + if ( !isDefined( self ) ) + { + return ""; + } + switch( self.script_noteworthy ) + { + case "specialty_armorvest": + case "specialty_armorvest_upgrade": + return "juggernog"; + case "specialty_quickrevive": + case "specialty_quickrevive_upgrade": + return "revive"; + case "specialty_fastreload": + case "specialty_fastreload_upgrade": + return "sleight"; + case "specialty_rof": + case "specialty_rof_upgrade": + return "doubletap"; + case "specialty_longersprint": + case "specialty_longersprint_upgrade": + return "marathon"; + case "specialty_flakjacket": + case "specialty_flakjacket_upgrade": + return "divetonuke"; + case "specialty_deadshot": + case "specialty_deadshot_upgrade": + return "deadshot"; + case "specialty_additionalprimaryweapon": + case "specialty_additionalprimaryweapon_upgrade": + return "additionalprimaryweapon"; + case "specialty_scavenger": + case "specialty_scavenger_upgrade": + return "tombstone"; + case "specialty_finalstand": + case "specialty_finalstand_upgrade": + return "chugabud"; + case "specialty_weapupgrade": + return "Pack_A_Punch"; + } + str_perk = undefined; + if ( isDefined( level._custom_perks[ self.script_noteworthy ] ) && isDefined( isDefined( level._custom_perks[ self.script_noteworthy ].alias ) ) ) + { + str_perk = level._custom_perks[ self.script_noteworthy ].alias; + } + return str_perk; } -perk_machine_removal( machine, replacement_model ) +perk_machine_removal( machine, replacement_model ) //checked changed to match cerberus output { - if ( !isdefined( machine ) ) - return; - - trig = getent( machine, "script_noteworthy" ); - machine_model = undefined; - - if ( isdefined( trig ) ) - { - trig notify( "warning_dialog" ); - - if ( isdefined( trig.target ) ) - { - parts = getentarray( trig.target, "targetname" ); - - for ( i = 0; i < parts.size; i++ ) - { - if ( isdefined( parts[i].classname ) && parts[i].classname == "script_model" ) - { - machine_model = parts[i]; - continue; - } - - if ( isdefined( parts[i].script_noteworthy && parts[i].script_noteworthy == "clip" ) ) - { - model_clip = parts[i]; - continue; - } - - parts[i] delete(); - } - } - - if ( isdefined( replacement_model ) && isdefined( machine_model ) ) - machine_model setmodel( replacement_model ); - else if ( !isdefined( replacement_model ) && isdefined( machine_model ) ) - { - machine_model delete(); - - if ( isdefined( model_clip ) ) - model_clip delete(); - - if ( isdefined( trig.clip ) ) - trig.clip delete(); - } - - if ( isdefined( trig.bump ) ) - trig.bump delete(); - - trig delete(); - } + if ( !isdefined( machine ) ) + { + return; + } + trig = getent( machine, "script_noteworthy" ); + machine_model = undefined; + if ( isdefined( trig ) ) + { + trig notify( "warning_dialog" ); + if ( isdefined( trig.target ) ) + { + parts = getentarray( trig.target, "targetname" ); + for ( i = 0; i < parts.size; i++ ) + { + if ( isdefined( parts[ i ].classname ) && parts[ i ].classname == "script_model" ) + { + machine_model = parts[ i ]; + } + if ( isdefined( parts[ i ].script_noteworthy ) && parts[ i ].script_noteworthy == "clip" ) + { + model_clip = parts[ i ]; + } + parts[ i ] delete(); + } + } + else if ( isdefined( replacement_model ) && isdefined( machine_model ) ) + { + machine_model setmodel( replacement_model ); + } + else if ( !isdefined( replacement_model ) && isdefined( machine_model ) ) + { + machine_model delete(); + if ( isdefined( model_clip ) ) + { + model_clip delete(); + } + if ( isdefined( trig.clip ) ) + { + trig.clip delete(); + } + } + if ( isdefined( trig.bump ) ) + { + trig.bump delete(); + } + trig delete(); + } } perk_machine_spawn_init() { - 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 = ""; - match_string = level.scr_zm_ui_gametype + "_perks_" + location; - pos = []; + location = level.scr_zm_map_start_location; + if ( ( location == "default" || location == "" ) && IsDefined( level.default_start_location ) ) + { + location = level.default_start_location; + } - if ( isdefined( level.override_perk_targetname ) ) - structs = getstructarray( level.override_perk_targetname, "targetname" ); - else - structs = getstructarray( "zm_perk_machine", "targetname" ); + match_string = level.scr_zm_ui_gametype + "_perks_" + location; + pos = []; + if ( isdefined( level.override_perk_targetname ) ) + { + structs = getstructarray( level.override_perk_targetname, "targetname" ); + } + else + { + structs = getstructarray( "zm_perk_machine", "targetname" ); + } + if ( match_string == "zclassic_perks_rooftop" || match_string == "zclassic_perks_tomb" || match_string == "zstandard_perks_nuked" ) + { + useDefaultLocation = 1; + } + i = 0; + while ( i < structs.size ) + { + if ( isdefined( structs[ i ].script_string ) ) + { + tokens = strtok( structs[ i ].script_string, " " ); + k = 0; + while ( k < tokens.size ) + { + if ( tokens[ k ] == match_string ) + { + pos[ pos.size ] = structs[ i ]; + } + k++; + } + } + else if ( is_true( useDefaultLocation ) ) + { + pos[ pos.size ] = structs[ i ]; + } + i++; + } + if ( !IsDefined( pos ) || pos.size == 0 ) + { + return; + } + PreCacheModel("zm_collision_perks1"); + for ( i = 0; i < pos.size; i++ ) + { + perk = pos[ i ].script_noteworthy; + if ( IsDefined( perk ) && IsDefined( pos[ i ].model ) ) + { + use_trigger = Spawn( "trigger_radius_use", pos[ i ].origin + ( 0, 0, 30 ), 0, 40, 70 ); + use_trigger.targetname = "zombie_vending"; + use_trigger.script_noteworthy = perk; + use_trigger TriggerIgnoreTeam(); + //use_trigger thread debug_spot(); + + perk_machine = Spawn( "script_model", pos[ i ].origin ); + perk_machine.angles = pos[ i ].angles; + perk_machine SetModel( pos[ i ].model ); + if ( is_true( level._no_vending_machine_bump_trigs ) ) + { + bump_trigger = undefined; + } + else + { + bump_trigger = spawn("trigger_radius", pos[ i ].origin, 0, 35, 64); + bump_trigger.script_activated = 1; + bump_trigger.script_sound = "zmb_perks_bump_bottle"; + bump_trigger.targetname = "audio_bump_trigger"; + if ( perk != "specialty_weapupgrade" ) + { + bump_trigger thread thread_bump_trigger(); + } + } + collision = Spawn( "script_model", pos[ i ].origin, 1 ); + collision.angles = pos[ i ].angles; + collision SetModel( "zm_collision_perks1" ); + collision.script_noteworthy = "clip"; + collision DisconnectPaths(); + + // Connect all of the pieces for easy access. + use_trigger.clip = collision; + use_trigger.machine = perk_machine; + use_trigger.bump = bump_trigger; + //missing code found in cerberus output + if ( isdefined( pos[ i ].blocker_model ) ) + { + use_trigger.blocker_model = pos[ i ].blocker_model; + } + if ( isdefined( pos[ i ].script_int ) ) + { + perk_machine.script_int = pos[ i ].script_int; + } + if ( isdefined( pos[ i ].turn_on_notify ) ) + { + perk_machine.turn_on_notify = pos[ i ].turn_on_notify; + } + switch( perk ) + { + case "specialty_quickrevive": + case "specialty_quickrevive_upgrade": + use_trigger.script_sound = "mus_perks_revive_jingle"; + use_trigger.script_string = "revive_perk"; + use_trigger.script_label = "mus_perks_revive_sting"; + use_trigger.target = "vending_revive"; + perk_machine.script_string = "revive_perk"; + perk_machine.targetname = "vending_revive"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "revive_perk"; + } + break; + case "specialty_fastreload": + case "specialty_fastreload_upgrade": + use_trigger.script_sound = "mus_perks_speed_jingle"; + use_trigger.script_string = "speedcola_perk"; + use_trigger.script_label = "mus_perks_speed_sting"; + use_trigger.target = "vending_sleight"; + perk_machine.script_string = "speedcola_perk"; + perk_machine.targetname = "vending_sleight"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "speedcola_perk"; + } + break; + case "specialty_longersprint": + case "specialty_longersprint_upgrade": + use_trigger.script_sound = "mus_perks_stamin_jingle"; + use_trigger.script_string = "marathon_perk"; + use_trigger.script_label = "mus_perks_stamin_sting"; + use_trigger.target = "vending_marathon"; + perk_machine.script_string = "marathon_perk"; + perk_machine.targetname = "vending_marathon"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "marathon_perk"; + } + break; + case "specialty_armorvest": + case "specialty_armorvest_upgrade": + use_trigger.script_sound = "mus_perks_jugganog_jingle"; + use_trigger.script_string = "jugg_perk"; + use_trigger.script_label = "mus_perks_jugganog_sting"; + use_trigger.longjinglewait = 1; + use_trigger.target = "vending_jugg"; + perk_machine.script_string = "jugg_perk"; + perk_machine.targetname = "vending_jugg"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "jugg_perk"; + } + break; + case "specialty_scavenger": + case "specialty_scavenger_upgrade": + use_trigger.script_sound = "mus_perks_tombstone_jingle"; + use_trigger.script_string = "tombstone_perk"; + use_trigger.script_label = "mus_perks_tombstone_sting"; + use_trigger.target = "vending_tombstone"; + perk_machine.script_string = "tombstone_perk"; + perk_machine.targetname = "vending_tombstone"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "tombstone_perk"; + } + break; + case "specialty_rof": + case "specialty_rof_upgrade": + use_trigger.script_sound = "mus_perks_doubletap_jingle"; + use_trigger.script_string = "tap_perk"; + use_trigger.script_label = "mus_perks_doubletap_sting"; + use_trigger.target = "vending_doubletap"; + perk_machine.script_string = "tap_perk"; + perk_machine.targetname = "vending_doubletap"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "tap_perk"; + } + break; + case "specialty_finalstand": + case "specialty_finalstand_upgrade": + use_trigger.script_sound = "mus_perks_whoswho_jingle"; + use_trigger.script_string = "tap_perk"; + use_trigger.script_label = "mus_perks_whoswho_sting"; + use_trigger.target = "vending_chugabud"; + perk_machine.script_string = "tap_perk"; + perk_machine.targetname = "vending_chugabud"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "tap_perk"; + } + break; + case "specialty_additionalprimaryweapon": + case "specialty_additionalprimaryweapon_upgrade": + use_trigger.script_sound = "mus_perks_mulekick_jingle"; + use_trigger.script_string = "tap_perk"; + use_trigger.script_label = "mus_perks_mulekick_sting"; + use_trigger.target = "vending_additionalprimaryweapon"; + perk_machine.script_string = "tap_perk"; + perk_machine.targetname = "vending_additionalprimaryweapon"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "tap_perk"; + } + break; + case "specialty_weapupgrade": + use_trigger.target = "vending_packapunch"; + use_trigger.script_sound = "mus_perks_packa_jingle"; + use_trigger.script_label = "mus_perks_packa_sting"; + use_trigger.longjinglewait = 1; + perk_machine.targetname = "vending_packapunch"; + flag_pos = getstruct( pos[ i ].target, "targetname" ); + if ( isDefined( flag_pos ) ) + { + perk_machine_flag = spawn( "script_model", flag_pos.origin ); + perk_machine_flag.angles = flag_pos.angles; + perk_machine_flag setmodel( flag_pos.model ); + perk_machine_flag.targetname = "pack_flag"; + perk_machine.target = "pack_flag"; + } + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "perks_rattle"; + } + break; + case "specialty_deadshot": + case "specialty_deadshot_upgrade": + use_trigger.script_sound = "mus_perks_deadshot_jingle"; + use_trigger.script_string = "deadshot_perk"; + use_trigger.script_label = "mus_perks_deadshot_sting"; + use_trigger.target = "vending_deadshot"; + perk_machine.script_string = "deadshot_vending"; + perk_machine.targetname = "vending_deadshot_model"; + if ( isDefined( bump_trigger ) ) + { + bump_trigger.script_string = "deadshot_vending"; + } + break; + default: + if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].perk_machine_set_kvps ) ) + { + [[ level._custom_perks[ perk ].perk_machine_set_kvps ]]( use_trigger, perk_machine, bump_trigger, collision ); + } + break; + } + } + } +} - foreach ( struct in structs ) - { - if ( isdefined( struct.script_string ) ) - { - tokens = strtok( struct.script_string, " " ); - - foreach ( token in tokens ) - { - if ( token == match_string ) - pos[pos.size] = struct; - } - - continue; - } - - pos[pos.size] = struct; - } - - if ( !isdefined( pos ) || pos.size == 0 ) - return; - - precachemodel( "zm_collision_perks1" ); - - for ( i = 0; i < pos.size; i++ ) - { - perk = pos[i].script_noteworthy; - - if ( isdefined( perk ) && isdefined( pos[i].model ) ) - { - use_trigger = spawn( "trigger_radius_use", pos[i].origin + vectorscale( ( 0, 0, 1 ), 30.0 ), 0, 40, 70 ); - use_trigger.targetname = "zombie_vending"; - use_trigger.script_noteworthy = perk; - use_trigger triggerignoreteam(); - perk_machine = spawn( "script_model", pos[i].origin ); - perk_machine.angles = pos[i].angles; - perk_machine setmodel( pos[i].model ); - - if ( isdefined( level._no_vending_machine_bump_trigs ) && level._no_vending_machine_bump_trigs ) - bump_trigger = undefined; - else - { - bump_trigger = spawn( "trigger_radius", pos[i].origin, 0, 35, 64 ); - bump_trigger.script_activated = 1; - bump_trigger.script_sound = "zmb_perks_bump_bottle"; - bump_trigger.targetname = "audio_bump_trigger"; - - if ( perk != "specialty_weapupgrade" ) - bump_trigger thread thread_bump_trigger(); - } - - collision = spawn( "script_model", pos[i].origin, 1 ); - collision.angles = pos[i].angles; - collision setmodel( "zm_collision_perks1" ); - collision.script_noteworthy = "clip"; - collision disconnectpaths(); - use_trigger.clip = collision; - use_trigger.machine = perk_machine; - use_trigger.bump = bump_trigger; - - if ( isdefined( pos[i].blocker_model ) ) - use_trigger.blocker_model = pos[i].blocker_model; - - if ( isdefined( pos[i].script_int ) ) - perk_machine.script_int = pos[i].script_int; - - if ( isdefined( pos[i].turn_on_notify ) ) - perk_machine.turn_on_notify = pos[i].turn_on_notify; - - switch ( perk ) - { - case "specialty_quickrevive_upgrade": - case "specialty_quickrevive": - use_trigger.script_sound = "mus_perks_revive_jingle"; - use_trigger.script_string = "revive_perk"; - use_trigger.script_label = "mus_perks_revive_sting"; - use_trigger.target = "vending_revive"; - perk_machine.script_string = "revive_perk"; - perk_machine.targetname = "vending_revive"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "revive_perk"; - - break; - case "specialty_fastreload_upgrade": - case "specialty_fastreload": - use_trigger.script_sound = "mus_perks_speed_jingle"; - use_trigger.script_string = "speedcola_perk"; - use_trigger.script_label = "mus_perks_speed_sting"; - use_trigger.target = "vending_sleight"; - perk_machine.script_string = "speedcola_perk"; - perk_machine.targetname = "vending_sleight"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "speedcola_perk"; - - break; - case "specialty_longersprint_upgrade": - case "specialty_longersprint": - use_trigger.script_sound = "mus_perks_stamin_jingle"; - use_trigger.script_string = "marathon_perk"; - use_trigger.script_label = "mus_perks_stamin_sting"; - use_trigger.target = "vending_marathon"; - perk_machine.script_string = "marathon_perk"; - perk_machine.targetname = "vending_marathon"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "marathon_perk"; - - break; - case "specialty_armorvest_upgrade": - case "specialty_armorvest": - use_trigger.script_sound = "mus_perks_jugganog_jingle"; - use_trigger.script_string = "jugg_perk"; - use_trigger.script_label = "mus_perks_jugganog_sting"; - use_trigger.longjinglewait = 1; - use_trigger.target = "vending_jugg"; - perk_machine.script_string = "jugg_perk"; - perk_machine.targetname = "vending_jugg"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "jugg_perk"; - - break; - case "specialty_scavenger_upgrade": - case "specialty_scavenger": - use_trigger.script_sound = "mus_perks_tombstone_jingle"; - use_trigger.script_string = "tombstone_perk"; - use_trigger.script_label = "mus_perks_tombstone_sting"; - use_trigger.target = "vending_tombstone"; - perk_machine.script_string = "tombstone_perk"; - perk_machine.targetname = "vending_tombstone"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "tombstone_perk"; - - break; - case "specialty_rof_upgrade": - case "specialty_rof": - use_trigger.script_sound = "mus_perks_doubletap_jingle"; - use_trigger.script_string = "tap_perk"; - use_trigger.script_label = "mus_perks_doubletap_sting"; - use_trigger.target = "vending_doubletap"; - perk_machine.script_string = "tap_perk"; - perk_machine.targetname = "vending_doubletap"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "tap_perk"; - - break; - case "specialty_finalstand_upgrade": - case "specialty_finalstand": - use_trigger.script_sound = "mus_perks_whoswho_jingle"; - use_trigger.script_string = "tap_perk"; - use_trigger.script_label = "mus_perks_whoswho_sting"; - use_trigger.target = "vending_chugabud"; - perk_machine.script_string = "tap_perk"; - perk_machine.targetname = "vending_chugabud"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "tap_perk"; - - break; - case "specialty_additionalprimaryweapon_upgrade": - case "specialty_additionalprimaryweapon": - use_trigger.script_sound = "mus_perks_mulekick_jingle"; - use_trigger.script_string = "tap_perk"; - use_trigger.script_label = "mus_perks_mulekick_sting"; - use_trigger.target = "vending_additionalprimaryweapon"; - perk_machine.script_string = "tap_perk"; - perk_machine.targetname = "vending_additionalprimaryweapon"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "tap_perk"; - - break; - case "specialty_weapupgrade": - use_trigger.target = "vending_packapunch"; - use_trigger.script_sound = "mus_perks_packa_jingle"; - use_trigger.script_label = "mus_perks_packa_sting"; - use_trigger.longjinglewait = 1; - perk_machine.targetname = "vending_packapunch"; - flag_pos = getstruct( pos[i].target, "targetname" ); - - if ( isdefined( flag_pos ) ) - { - perk_machine_flag = spawn( "script_model", flag_pos.origin ); - perk_machine_flag.angles = flag_pos.angles; - perk_machine_flag setmodel( flag_pos.model ); - perk_machine_flag.targetname = "pack_flag"; - perk_machine.target = "pack_flag"; - } - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "perks_rattle"; - - break; - case "specialty_deadshot_upgrade": - case "specialty_deadshot": - use_trigger.script_sound = "mus_perks_deadshot_jingle"; - use_trigger.script_string = "deadshot_perk"; - use_trigger.script_label = "mus_perks_deadshot_sting"; - use_trigger.target = "vending_deadshot"; - perk_machine.script_string = "deadshot_vending"; - perk_machine.targetname = "vending_deadshot_model"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "deadshot_vending"; - - break; - default: - use_trigger.script_sound = "mus_perks_speed_jingle"; - use_trigger.script_string = "speedcola_perk"; - use_trigger.script_label = "mus_perks_speed_sting"; - use_trigger.target = "vending_sleight"; - perk_machine.script_string = "speedcola_perk"; - perk_machine.targetname = "vending_sleight"; - - if ( isdefined( bump_trigger ) ) - bump_trigger.script_string = "speedcola_perk"; - - break; - } - - if ( isdefined( level._custom_perks[perk] ) && isdefined( level._custom_perks[perk].perk_machine_set_kvps ) ) - [[ level._custom_perks[perk].perk_machine_set_kvps ]]( use_trigger, perk_machine, bump_trigger, collision ); - } - } +get_perk_machine_start_state( perk ) //checked matches cerberus output +{ + if ( is_true( level.vending_machines_powered_on_at_start ) ) + { + return 1; + } + if ( perk == "specialty_quickrevive" || perk == "specialty_quickrevive_upgrade" ) + { + return level.revive_machine_is_solo; + } + return 0; } -get_perk_machine_start_state( perk ) +perks_register_clientfield() //checked matches cerberus output { - if ( isdefined( level.vending_machines_powered_on_at_start ) && level.vending_machines_powered_on_at_start ) - return 1; + if ( is_true( level.zombiemode_using_additionalprimaryweapon_perk ) ) + { + registerclientfield( "toplayer", "perk_additional_primary_weapon", 1, 2, "int" ); + } + if ( is_true( level.zombiemode_using_deadshot_perk ) ) + { + registerclientfield( "toplayer", "perk_dead_shot", 1, 2, "int" ); + } + if ( is_true( level.zombiemode_using_doubletap_perk ) ) + { + registerclientfield( "toplayer", "perk_double_tap", 1, 2, "int" ); + } + if ( is_true( level.zombiemode_using_juggernaut_perk ) ) + { + registerclientfield( "toplayer", "perk_juggernaut", 1, 2, "int" ); + } + if ( is_true( level.zombiemode_using_marathon_perk ) ) + { + registerclientfield( "toplayer", "perk_marathon", 1, 2, "int" ); + } + if ( is_true( level.zombiemode_using_revive_perk ) ) + { + registerclientfield( "toplayer", "perk_quick_revive", 1, 2, "int" ); + } + if ( is_true( level.zombiemode_using_sleightofhand_perk ) ) + { + registerclientfield( "toplayer", "perk_sleight_of_hand", 1, 2, "int" ); + } + if ( is_true( level.zombiemode_using_tombstone_perk ) ) + { + registerclientfield( "toplayer", "perk_tombstone", 1, 2, "int" ); + } + if ( is_true( level.zombiemode_using_perk_intro_fx ) ) + { + registerclientfield( "scriptmover", "clientfield_perk_intro_fx", 1000, 1, "int" ); + } + if ( is_true( level.zombiemode_using_chugabud_perk ) ) + { + registerclientfield( "toplayer", "perk_chugabud", 1000, 1, "int" ); + } + if ( isdefined( level._custom_perks ) ) + { + a_keys = getarraykeys(level._custom_perks); + for ( i = 0; i < a_keys.size; i++ ) + { + if ( isdefined( level._custom_perks[ a_keys[ i ] ].clientfield_register ) ) + { + level [[ level._custom_perks[ a_keys[ i ] ].clientfield_register ]](); + } + } + } +} - if ( perk == "specialty_quickrevive" || perk == "specialty_quickrevive_upgrade" ) - { +thread_bump_trigger() //checked matches cerberus output +{ + for ( ;; ) + { + self waittill( "trigger", trigplayer ); + trigplayer playsound( self.script_sound ); + while ( is_player_valid( trigplayer ) && trigplayer istouching( self ) ) + { + wait 0.5; + } + } +} + +reenable_quickrevive( machine_clip, solo_mode ) //checked changed to match cerberus output +{ + if ( isDefined( level.revive_machine_spawned ) && !is_true( level.revive_machine_spawned ) ) + { + return; + } + wait 0.1; + power_state = 0; + if ( is_true( solo_mode ) ) + { + power_state = 1; + should_pause = 1; + players = get_players(); + foreach ( player in players ) + { + if ( isdefined( player.lives ) && player.lives > 0 && power_state ) + { + should_pause = 0; + } + if ( isdefined( player.lives ) && player.lives < 1 ) + { + should_pause = 1; + } + } + if ( should_pause ) + { + perk_pause( "specialty_quickrevive" ); + } + else + { + perk_unpause( "specialty_quickrevive" ); + } + if ( is_true( level.solo_revive_init ) && flag( "solo_revive" ) ) + { + disable_quickrevive( machine_clip ); + return; + } + update_quickrevive_power_state( 1 ); + unhide_quickrevive(); + restart_quickrevive(); + level notify( "revive_off" ); + wait 0.1; + level notify( "stop_quickrevive_logic" ); + } + else + { + if ( !is_true( level._dont_unhide_quickervive_on_hotjoin ) ) + { + unhide_quickrevive(); + level notify( "revive_off" ); + wait 0.1; + } + level notify( "revive_hide" ); + level notify( "stop_quickrevive_logic" ); + restart_quickrevive(); + if ( flag( "power_on" ) ) + { + power_state = 1; + } + update_quickrevive_power_state( power_state ); + } + level thread turn_revive_on(); + if ( power_state ) + { + perk_unpause( "specialty_quickrevive" ); + level notify( "revive_on" ); + wait 0.1; + level notify( "specialty_quickrevive_power_on" ); + } + else + { + perk_pause( "specialty_quickrevive" ); + } + if ( !is_true( solo_mode ) ) + { + return; + } + should_pause = 1; + players = get_players(); + foreach ( player in players ) + { + if ( !is_player_valid( player ) ) + { + continue; + } + if ( player hasperk("specialty_quickrevive" ) ) + { + if ( !isdefined( player.lives ) ) + { + player.lives = 0; + } + if ( !isdefined( level.solo_lives_given ) ) + { + level.solo_lives_given = 0; + } + level.solo_lives_given++; + player.lives++; + if ( isdefined( player.lives ) && player.lives > 0 && power_state ) + { + should_pause = 0; + } + should_pause = 1; + } + } + if ( should_pause ) + { + perk_pause( "specialty_quickrevive" ); + } + else + { + perk_unpause( "specialty_quickrevive" ); + } +} + +update_quickrevive_power_state( poweron ) //checked matches cerberus output +{ + foreach ( item in level.powered_items ) + { + if ( isdefined( item.target ) && isdefined( item.target.script_noteworthy ) && item.target.script_noteworthy == "specialty_quickrevive" ) + { + if ( item.power && !poweron ) + { + if ( !isdefined( item.powered_count ) ) + { + item.powered_count = 0; + } + else if ( item.powered_count > 0 ) + { + item.powered_count--; + } + } + else if ( !item.power && poweron ) + { + if ( !isdefined( item.powered_count ) ) + { + item.powered_count = 0; + } + item.powered_count++; + } + if ( !isdefined( item.depowered_count ) ) + { + item.depowered_count = 0; + } + item.power = poweron; + } + } +} + +restart_quickrevive() //checked changed to match cerberus output //changed at own discretion +{ + triggers = getentarray( "zombie_vending", "targetname" ); + foreach ( trigger in triggers ) + { + if ( trigger.script_noteworthy == "specialty_quickrevive" || trigger.script_noteworthy == "specialty_quickrevive_upgrade" ) + { + trigger notify( "stop_quickrevive_logic" ); + trigger thread vending_trigger_think(); + trigger trigger_on(); + } + } +} + +disable_quickrevive( machine_clip ) //checked changed to match cerberus output +{ + if ( is_true( level.solo_revive_init ) && flag( "solo_revive" ) && isDefined( level.quick_revive_machine ) ) + { + triggers = getentarray( "zombie_vending", "targetname" ); + foreach ( trigger in triggers ) + { + if ( !isdefined( trigger.script_noteworthy ) ) + { + continue; + } + if ( trigger.script_noteworthy == "specialty_quickrevive" || trigger.script_noteworthy == "specialty_quickrevive_upgrade" ) + { + trigger trigger_off(); + } + } + foreach ( item in level.powered_items ) + { + if ( isdefined( item.target ) && isdefined( item.target.script_noteworthy ) && item.target.script_noteworthy == "specialty_quickrevive" ) + { + item.power = 1; + item.self_powered = 1; + } + } + if ( isDefined( level.quick_revive_machine.original_pos ) ) + { + level.quick_revive_default_origin = level.quick_revive_machine.original_pos; + level.quick_revive_default_angles = level.quick_revive_machine.original_angles; + } + move_org = level.quick_revive_default_origin; + if ( isDefined( level.quick_revive_linked_ent ) ) + { + move_org = level.quick_revive_linked_ent.origin; + if ( isDefined( level.quick_revive_linked_ent_offset ) ) + { + move_org += level.quick_revive_linked_ent_offset; + } + level.quick_revive_machine unlink(); + } + level.quick_revive_machine moveto( move_org + vectorScale( ( 0, 0, 1 ), 40 ), 3 ); + direction = level.quick_revive_machine.origin; + direction = ( direction[ 1 ], direction[ 0 ], 0 ); + if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 ) + { + direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 ); + } + else + { + if ( direction[ 0 ] < 0 ) + { + direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 ); + } + } + level.quick_revive_machine vibrate( direction, 10, 0.5, 4 ); + level.quick_revive_machine waittill( "movedone" ); + level.quick_revive_machine hide(); + level.quick_revive_machine.ishidden = 1; + if ( isDefined( level.quick_revive_machine_clip ) ) + { + level.quick_revive_machine_clip connectpaths(); + level.quick_revive_machine_clip trigger_off(); + } + playfx( level._effect[ "poltergeist" ], level.quick_revive_machine.origin ); + if ( isDefined( level.quick_revive_trigger ) && isDefined( level.quick_revive_trigger.blocker_model ) ) + { + level.quick_revive_trigger.blocker_model show(); + } + level notify( "revive_hide" ); + } +} + +unhide_quickrevive() //checked matches cerberus output +{ + while ( players_are_in_perk_area( level.quick_revive_machine ) ) + { + wait 0.1; + } + if ( isDefined( level.quick_revive_machine_clip ) ) + { + level.quick_revive_machine_clip trigger_on(); + level.quick_revive_machine_clip disconnectpaths(); + } + if ( isDefined( level.quick_revive_final_pos ) ) + { + level.quick_revive_machine.origin = level.quick_revive_final_pos; + } + playfx( level._effect[ "poltergeist" ], level.quick_revive_machine.origin ); + if ( isDefined( level.quick_revive_trigger ) && isDefined( level.quick_revive_trigger.blocker_model ) ) + { + level.quick_revive_trigger.blocker_model hide(); + } + level.quick_revive_machine show(); + if ( isDefined( level.quick_revive_machine.original_pos ) ) + { + level.quick_revive_default_origin = level.quick_revive_machine.original_pos; + level.quick_revive_default_angles = level.quick_revive_machine.original_angles; + } + direction = level.quick_revive_machine.origin; + direction = ( direction[ 1 ], direction[ 0 ], 0 ); + if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 ) + { + direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 ); + } + else + { + if ( direction[ 0 ] < 0 ) + { + direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 ); + } + } + org = level.quick_revive_default_origin; + if ( isDefined( level.quick_revive_linked_ent ) ) + { + org = level.quick_revive_linked_ent.origin; + if ( isDefined( level.quick_revive_linked_ent_offset ) ) + { + org += level.quick_revive_linked_ent_offset; + } + } + if ( !is_true( level.quick_revive_linked_ent_moves ) && level.quick_revive_machine.origin != org ) + { + level.quick_revive_machine moveto( org, 3 ); + level.quick_revive_machine vibrate( direction, 10, 0.5, 2.9 ); + level.quick_revive_machine waittill( "movedone" ); + level.quick_revive_machine.angles = level.quick_revive_default_angles; + } + else + { + if ( isDefined( level.quick_revive_linked_ent ) ) + { + org = level.quick_revive_linked_ent.origin; + if ( isDefined( level.quick_revive_linked_ent_offset ) ) + { + org += level.quick_revive_linked_ent_offset; + } + level.quick_revive_machine.origin = org; + } + level.quick_revive_machine vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0.3, 0.4, 3 ); + } + if ( isDefined( level.quick_revive_linked_ent ) ) + { + level.quick_revive_machine linkto( level.quick_revive_linked_ent ); + } + level.quick_revive_machine.ishidden = 0; +} + +players_are_in_perk_area( perk_machine ) //checked changed to match cerberus output +{ + perk_area_origin = level.quick_revive_default_origin; + if ( isDefined( perk_machine._linked_ent ) ) + { + perk_area_origin = perk_machine._linked_ent.origin; + if ( isDefined( perk_machine._linked_ent_offset ) ) + { + perk_area_origin += perk_machine._linked_ent_offset; + } + } + in_area = 0; + players = get_players(); + dist_check = 9216; + foreach ( player in players ) + { + if ( distancesquared( player.origin, perk_area_origin ) < dist_check ) + { + return 1; + } + } + return 0; +} + +perk_hostmigration() //checked changed to match cerberus output +{ + level endon( "end_game" ); + level notify( "perk_hostmigration" ); + level endon( "perk_hostmigration" ); + while ( 1 ) + { + level waittill( "host_migration_end" ); + jug = getentarray( "vending_jugg", "targetname" ); + tap = getentarray( "vending_doubletap", "targetname" ); + mar = getentarray( "vending_marathon", "targetname" ); + deadshot = getentarray( "vending_deadshot", "targetname" ); + tomb = getentarray( "vending_tombstone", "targetname" ); + extraweap = getentarray( "vending_additionalprimaryweapon", "targetname" ); + sleight = getentarray( "vending_sleight", "targetname" ); + revive = getentarray( "vending_revive", "targetname" ); + chugabud = getentarray( "vending_chugabud", "targetname" ); + foreach ( perk in jug ) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "juggernog" ].on_model ) + { + perk perk_fx( undefined, 1 ); + perk thread perk_fx( "jugger_light" ); + } + } + foreach ( perk in tap ) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "doubletap" ].on_model ) + { + perk perk_fx(undefined, 1); + perk thread perk_fx("doubletap_light"); + } + } + foreach ( perk in mar ) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "marathon" ].on_model ) + { + perk perk_fx( undefined, 1 ); + perk thread perk_fx( "marathon_light" ); + } + } + foreach ( perk in deadshot ) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "deadshot" ].on_model ) + { + perk perk_fx( undefined, 1 ); + perk thread perk_fx( "deadshot_light" ); + } + } + foreach ( perk in tomb ) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "tombstone" ].on_model ) + { + perk perk_fx( undefined, 1 ); + perk thread perk_fx( "tombstone_light" ); + } + } + foreach ( perk in extraweap ) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "additionalprimaryweapon" ].on_model ) + { + perk perk_fx( undefined, 1 ); + perk thread perk_fx( "additionalprimaryweapon_light" ); + } + } + foreach(perk in sleight) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "speedcola" ].on_model ) + { + perk perk_fx( undefined, 1 ); + perk thread perk_fx( "sleight_light" ); + } + } + foreach ( perk in revive ) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "revive" ].on_model ) + { + perk perk_fx( undefined, 1 ); + perk thread perk_fx( "revive_light" ); + } + } + foreach ( perk in chugabud ) + { + if ( isdefined( perk.model ) && perk.model == level.machine_assets[ "revive" ].on_model ) + { + perk perk_fx( undefined, 1 ); + perk thread perk_fx( "tombstone_light" ); + } + } + if ( level._custom_perks.size > 0 ) + { + a_keys = getarraykeys( level._custom_perks ); + for ( i = 0; i < a_keys.size; i++ ) + { + if ( isdefined( level._custom_perks[ a_keys[ i ] ].host_migration_func ) ) + { + level thread [[ level._custom_perks[ a_keys[ i ] ].host_migration_func ]](); + } + } + } + } +} + +get_perk_array( ignore_chugabud ) //checked matches cerberus output +{ + perk_array = []; + if ( self hasperk( "specialty_armorvest" ) ) + { + perk_array[ perk_array.size ] = "specialty_armorvest"; + } + if ( self hasperk( "specialty_deadshot" ) ) + { + perk_array[ perk_array.size ] = "specialty_deadshot"; + } + if ( self hasperk( "specialty_fastreload" ) ) + { + perk_array[ perk_array.size ] = "specialty_fastreload"; + } + if ( self hasperk( "specialty_flakjacket" ) ) + { + perk_array[ perk_array.size ] = "specialty_flakjacket"; + } + if ( self hasperk( "specialty_longersprint" ) ) + { + perk_array[ perk_array.size ] = "specialty_longersprint"; + } + if ( self hasperk( "specialty_quickrevive" ) ) + { + perk_array[ perk_array.size ] = "specialty_quickrevive"; + } + if ( self hasperk( "specialty_rof" ) ) + { + perk_array[ perk_array.size ] = "specialty_rof"; + } + if ( self hasperk( "specialty_additionalprimaryweapon" ) ) + { + perk_array[ perk_array.size ] = "specialty_additionalprimaryweapon"; + } + if ( !isDefined( ignore_chugabud ) || ignore_chugabud == 0 ) + { + if ( self hasperk( "specialty_finalstand" ) ) + { + perk_array[ perk_array.size ] = "specialty_finalstand"; + } + } + if ( level._custom_perks.size > 0 ) + { + a_keys = getarraykeys( level._custom_perks ); + for ( i = 0; i < a_keys.size; i++ ) + { + if ( self hasperk( a_keys[ i ] ) ) + { + perk_array[ perk_array.size ] = a_keys[ i ]; + } + } + } + return perk_array; +} + +initialize_custom_perk_arrays() //checked matches cerberus output +{ + if ( !isDefined( level._custom_perks ) ) + { + level._custom_perks = []; + } +} + +register_perk_basic_info( str_perk, str_alias, n_perk_cost, str_hint_string, str_perk_bottle_weapon ) //checked matches cerberus output +{ +/* /# - assert( isdefined( level.revive_machine_is_solo ) ); -#/ - return level.revive_machine_is_solo; - } - - return 0; -} - -perks_register_clientfield() -{ - if ( isdefined( level.zombiemode_using_additionalprimaryweapon_perk ) && level.zombiemode_using_additionalprimaryweapon_perk ) - registerclientfield( "toplayer", "perk_additional_primary_weapon", 1, 2, "int" ); - - if ( isdefined( level.zombiemode_using_deadshot_perk ) && level.zombiemode_using_deadshot_perk ) - registerclientfield( "toplayer", "perk_dead_shot", 1, 2, "int" ); - - if ( isdefined( level.zombiemode_using_doubletap_perk ) && level.zombiemode_using_doubletap_perk ) - registerclientfield( "toplayer", "perk_double_tap", 1, 2, "int" ); - - if ( isdefined( level.zombiemode_using_juggernaut_perk ) && level.zombiemode_using_juggernaut_perk ) - registerclientfield( "toplayer", "perk_juggernaut", 1, 2, "int" ); - - if ( isdefined( level.zombiemode_using_marathon_perk ) && level.zombiemode_using_marathon_perk ) - registerclientfield( "toplayer", "perk_marathon", 1, 2, "int" ); - - if ( isdefined( level.zombiemode_using_revive_perk ) && level.zombiemode_using_revive_perk ) - registerclientfield( "toplayer", "perk_quick_revive", 1, 2, "int" ); - - if ( isdefined( level.zombiemode_using_sleightofhand_perk ) && level.zombiemode_using_sleightofhand_perk ) - registerclientfield( "toplayer", "perk_sleight_of_hand", 1, 2, "int" ); - - if ( isdefined( level.zombiemode_using_tombstone_perk ) && level.zombiemode_using_tombstone_perk ) - registerclientfield( "toplayer", "perk_tombstone", 1, 2, "int" ); - - if ( isdefined( level.zombiemode_using_perk_intro_fx ) && level.zombiemode_using_perk_intro_fx ) - registerclientfield( "scriptmover", "clientfield_perk_intro_fx", 1000, 1, "int" ); - - if ( isdefined( level.zombiemode_using_chugabud_perk ) && level.zombiemode_using_chugabud_perk ) - registerclientfield( "toplayer", "perk_chugabud", 1000, 1, "int" ); - - if ( isdefined( level._custom_perks ) ) - { - a_keys = getarraykeys( level._custom_perks ); - - for ( i = 0; i < a_keys.size; i++ ) - { - if ( isdefined( level._custom_perks[a_keys[i]].clientfield_register ) ) - level [[ level._custom_perks[a_keys[i]].clientfield_register ]](); - } - } -} - -thread_bump_trigger() -{ - for (;;) - { - self waittill( "trigger", trigplayer ); - - trigplayer playsound( self.script_sound ); - - while ( is_player_valid( trigplayer ) && trigplayer istouching( self ) ) - wait 0.5; - } -} - -reenable_quickrevive( machine_clip, solo_mode ) -{ - if ( isdefined( level.revive_machine_spawned ) && !is_true( level.revive_machine_spawned ) ) - return; - - wait 0.1; - power_state = 0; - - if ( is_true( solo_mode ) ) - { - power_state = 1; - should_pause = 1; - players = get_players(); - - foreach ( player in players ) - { - if ( isdefined( player.lives ) && player.lives > 0 && power_state ) - { - should_pause = 0; - continue; - } - - if ( isdefined( player.lives ) && player.lives < 1 ) - should_pause = 1; - } - - if ( should_pause ) - perk_pause( "specialty_quickrevive" ); - else - perk_unpause( "specialty_quickrevive" ); - - if ( isdefined( level.solo_revive_init ) && level.solo_revive_init && flag( "solo_revive" ) ) - { - disable_quickrevive( machine_clip ); - return; - } - - update_quickrevive_power_state( 1 ); - unhide_quickrevive(); - restart_quickrevive(); - level notify( "revive_off" ); - wait 0.1; - level notify( "stop_quickrevive_logic" ); - } - else - { - if ( !( isdefined( level._dont_unhide_quickervive_on_hotjoin ) && level._dont_unhide_quickervive_on_hotjoin ) ) - { - unhide_quickrevive(); - level notify( "revive_off" ); - wait 0.1; - } - - level notify( "revive_hide" ); - level notify( "stop_quickrevive_logic" ); - restart_quickrevive(); - - if ( flag( "power_on" ) ) - power_state = 1; - - update_quickrevive_power_state( power_state ); - } - - level thread turn_revive_on(); - - if ( power_state ) - { - perk_unpause( "specialty_quickrevive" ); - level notify( "revive_on" ); - wait 0.1; - level notify( "specialty_quickrevive_power_on" ); - } - else - perk_pause( "specialty_quickrevive" ); - - if ( !is_true( solo_mode ) ) - return; - - should_pause = 1; - players = get_players(); - - foreach ( player in players ) - { - if ( !is_player_valid( player ) ) - continue; - - if ( player hasperk( "specialty_quickrevive" ) ) - { - if ( !isdefined( player.lives ) ) - player.lives = 0; - - if ( !isdefined( level.solo_lives_given ) ) - level.solo_lives_given = 0; - - level.solo_lives_given++; - player.lives++; - - if ( isdefined( player.lives ) && player.lives > 0 && power_state ) - { - should_pause = 0; - continue; - } - - should_pause = 1; - } - } - - if ( should_pause ) - perk_pause( "specialty_quickrevive" ); - else - perk_unpause( "specialty_quickrevive" ); -} - -update_quickrevive_power_state( poweron ) -{ - foreach ( item in level.powered_items ) - { - if ( isdefined( item.target ) && isdefined( item.target.script_noteworthy ) && item.target.script_noteworthy == "specialty_quickrevive" ) - { - if ( item.power && !poweron ) - { - if ( !isdefined( item.powered_count ) ) - item.powered_count = 0; - else if ( item.powered_count > 0 ) - item.powered_count--; - } - else if ( !item.power && poweron ) - { - if ( !isdefined( item.powered_count ) ) - item.powered_count = 0; - - item.powered_count++; - } - - if ( !isdefined( item.depowered_count ) ) - item.depowered_count = 0; - - item.power = poweron; - } - } -} - -restart_quickrevive() -{ - triggers = getentarray( "zombie_vending", "targetname" ); - - foreach ( trigger in triggers ) - { - if ( !isdefined( trigger.script_noteworthy ) ) - continue; - - if ( trigger.script_noteworthy == "specialty_quickrevive" || trigger.script_noteworthy == "specialty_quickrevive_upgrade" ) - { - trigger notify( "stop_quickrevive_logic" ); - trigger thread vending_trigger_think(); - trigger trigger_on(); - } - } -} - -disable_quickrevive( machine_clip ) -{ - if ( is_true( level.solo_revive_init ) && flag( "solo_revive" ) && isdefined( level.quick_revive_machine ) ) - { - triggers = getentarray( "zombie_vending", "targetname" ); - - foreach ( trigger in triggers ) - { - if ( !isdefined( trigger.script_noteworthy ) ) - continue; - - if ( trigger.script_noteworthy == "specialty_quickrevive" || trigger.script_noteworthy == "specialty_quickrevive_upgrade" ) - trigger trigger_off(); - } - - foreach ( item in level.powered_items ) - { - if ( isdefined( item.target ) && isdefined( item.target.script_noteworthy ) && item.target.script_noteworthy == "specialty_quickrevive" ) - { - item.power = 1; - item.self_powered = 1; - } - } - - if ( isdefined( level.quick_revive_machine.original_pos ) ) - { - level.quick_revive_default_origin = level.quick_revive_machine.original_pos; - level.quick_revive_default_angles = level.quick_revive_machine.original_angles; - } - - move_org = level.quick_revive_default_origin; - - if ( isdefined( level.quick_revive_linked_ent ) ) - { - move_org = level.quick_revive_linked_ent.origin; - - if ( isdefined( level.quick_revive_linked_ent_offset ) ) - move_org += level.quick_revive_linked_ent_offset; - - level.quick_revive_machine unlink(); - } - - level.quick_revive_machine moveto( move_org + vectorscale( ( 0, 0, 1 ), 40.0 ), 3 ); - direction = level.quick_revive_machine.origin; - direction = ( direction[1], direction[0], 0 ); - - if ( direction[1] < 0 || direction[0] > 0 && direction[1] > 0 ) - direction = ( direction[0], direction[1] * -1, 0 ); - else if ( direction[0] < 0 ) - direction = ( direction[0] * -1, direction[1], 0 ); - - level.quick_revive_machine vibrate( direction, 10, 0.5, 4 ); - - level.quick_revive_machine waittill( "movedone" ); - - level.quick_revive_machine hide(); - level.quick_revive_machine.ishidden = 1; - - if ( isdefined( level.quick_revive_machine_clip ) ) - { - level.quick_revive_machine_clip connectpaths(); - level.quick_revive_machine_clip trigger_off(); - } - - playfx( level._effect["poltergeist"], level.quick_revive_machine.origin ); - - if ( isdefined( level.quick_revive_trigger ) && isdefined( level.quick_revive_trigger.blocker_model ) ) - level.quick_revive_trigger.blocker_model show(); - - level notify( "revive_hide" ); - } -} - -unhide_quickrevive() -{ - while ( players_are_in_perk_area( level.quick_revive_machine ) ) - wait 0.1; - - if ( isdefined( level.quick_revive_machine_clip ) ) - { - level.quick_revive_machine_clip trigger_on(); - level.quick_revive_machine_clip disconnectpaths(); - } - - if ( isdefined( level.quick_revive_final_pos ) ) - level.quick_revive_machine.origin = level.quick_revive_final_pos; - - playfx( level._effect["poltergeist"], level.quick_revive_machine.origin ); - - if ( isdefined( level.quick_revive_trigger ) && isdefined( level.quick_revive_trigger.blocker_model ) ) - level.quick_revive_trigger.blocker_model hide(); - - level.quick_revive_machine show(); - - if ( isdefined( level.quick_revive_machine.original_pos ) ) - { - level.quick_revive_default_origin = level.quick_revive_machine.original_pos; - level.quick_revive_default_angles = level.quick_revive_machine.original_angles; - } - - direction = level.quick_revive_machine.origin; - direction = ( direction[1], direction[0], 0 ); - - if ( direction[1] < 0 || direction[0] > 0 && direction[1] > 0 ) - direction = ( direction[0], direction[1] * -1, 0 ); - else if ( direction[0] < 0 ) - direction = ( direction[0] * -1, direction[1], 0 ); - - org = level.quick_revive_default_origin; - - if ( isdefined( level.quick_revive_linked_ent ) ) - { - org = level.quick_revive_linked_ent.origin; - - if ( isdefined( level.quick_revive_linked_ent_offset ) ) - org += level.quick_revive_linked_ent_offset; - } - - if ( !( isdefined( level.quick_revive_linked_ent_moves ) && level.quick_revive_linked_ent_moves ) && level.quick_revive_machine.origin != org ) - { - level.quick_revive_machine moveto( org, 3 ); - level.quick_revive_machine vibrate( direction, 10, 0.5, 2.9 ); - - level.quick_revive_machine waittill( "movedone" ); - - level.quick_revive_machine.angles = level.quick_revive_default_angles; - } - else - { - if ( isdefined( level.quick_revive_linked_ent ) ) - { - org = level.quick_revive_linked_ent.origin; - - if ( isdefined( level.quick_revive_linked_ent_offset ) ) - org += level.quick_revive_linked_ent_offset; - - level.quick_revive_machine.origin = org; - } - - level.quick_revive_machine vibrate( vectorscale( ( 0, -1, 0 ), 100.0 ), 0.3, 0.4, 3 ); - } - - if ( isdefined( level.quick_revive_linked_ent ) ) - level.quick_revive_machine linkto( level.quick_revive_linked_ent ); - - level.quick_revive_machine.ishidden = 0; -} - -players_are_in_perk_area( perk_machine ) -{ - perk_area_origin = level.quick_revive_default_origin; - - if ( isdefined( perk_machine._linked_ent ) ) - { - perk_area_origin = perk_machine._linked_ent.origin; - - if ( isdefined( perk_machine._linked_ent_offset ) ) - perk_area_origin += perk_machine._linked_ent_offset; - } - - in_area = 0; - players = get_players(); - dist_check = 9216; - - foreach ( player in players ) - { - if ( distancesquared( player.origin, perk_area_origin ) < dist_check ) - return true; - } - - return false; -} - -perk_hostmigration() -{ - level endon( "end_game" ); - level notify( "perk_hostmigration" ); - level endon( "perk_hostmigration" ); - - while ( true ) - { - level waittill( "host_migration_end" ); - - jug = getentarray( "vending_jugg", "targetname" ); - tap = getentarray( "vending_doubletap", "targetname" ); - mar = getentarray( "vending_marathon", "targetname" ); - deadshot = getentarray( "vending_deadshot", "targetname" ); - tomb = getentarray( "vending_tombstone", "targetname" ); - extraweap = getentarray( "vending_additionalprimaryweapon", "targetname" ); - sleight = getentarray( "vending_sleight", "targetname" ); - revive = getentarray( "vending_revive", "targetname" ); - chugabud = getentarray( "vending_chugabud", "targetname" ); - - foreach ( perk in jug ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["juggernog"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "jugger_light" ); - } - } - - foreach ( perk in tap ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["doubletap"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "doubletap_light" ); - } - } - - foreach ( perk in mar ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["marathon"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "marathon_light" ); - } - } - - foreach ( perk in deadshot ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["deadshot"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "deadshot_light" ); - } - } - - foreach ( perk in tomb ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["tombstone"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "tombstone_light" ); - } - } - - foreach ( perk in extraweap ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["additionalprimaryweapon"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "additionalprimaryweapon_light" ); - } - } - - foreach ( perk in sleight ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["speedcola"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "sleight_light" ); - } - } - - foreach ( perk in revive ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["revive"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "revive_light" ); - } - } - - foreach ( perk in chugabud ) - { - if ( isdefined( perk.model ) && perk.model == level.machine_assets["revive"].on_model ) - { - perk perk_fx( undefined, 1 ); - perk thread perk_fx( "tombstone_light" ); - } - } - - if ( level._custom_perks.size > 0 ) - { - a_keys = getarraykeys( level._custom_perks ); - - for ( i = 0; i < a_keys.size; i++ ) - { - if ( isdefined( level._custom_perks[a_keys[i]].host_migration_func ) ) - level thread [[ level._custom_perks[a_keys[i]].host_migration_func ]](); - } - } - } -} - -get_perk_array( ignore_chugabud ) -{ - perk_array = []; - - if ( self hasperk( "specialty_armorvest" ) ) - perk_array[perk_array.size] = "specialty_armorvest"; - - if ( self hasperk( "specialty_deadshot" ) ) - perk_array[perk_array.size] = "specialty_deadshot"; - - if ( self hasperk( "specialty_fastreload" ) ) - perk_array[perk_array.size] = "specialty_fastreload"; - - if ( self hasperk( "specialty_flakjacket" ) ) - perk_array[perk_array.size] = "specialty_flakjacket"; - - if ( self hasperk( "specialty_longersprint" ) ) - perk_array[perk_array.size] = "specialty_longersprint"; - - if ( self hasperk( "specialty_quickrevive" ) ) - perk_array[perk_array.size] = "specialty_quickrevive"; - - if ( self hasperk( "specialty_rof" ) ) - perk_array[perk_array.size] = "specialty_rof"; - - if ( self hasperk( "specialty_additionalprimaryweapon" ) ) - perk_array[perk_array.size] = "specialty_additionalprimaryweapon"; - - if ( !isdefined( ignore_chugabud ) || ignore_chugabud == 0 ) - { - if ( self hasperk( "specialty_finalstand" ) ) - perk_array[perk_array.size] = "specialty_finalstand"; - } - - if ( level._custom_perks.size > 0 ) - { - a_keys = getarraykeys( level._custom_perks ); - - for ( i = 0; i < a_keys.size; i++ ) - { - if ( self hasperk( a_keys[i] ) ) - perk_array[perk_array.size] = a_keys[i]; - } - } - - return perk_array; -} - -initialize_custom_perk_arrays() -{ - if ( !isdefined( level._custom_perks ) ) - level._custom_perks = []; -} - -register_perk_basic_info( str_perk, str_alias, n_perk_cost, str_hint_string, str_perk_bottle_weapon ) -{ -/# - assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_basic_info!" ); + assert( isDefined( str_perk ), "str_perk is a required argument for register_perk_basic_info!" ); #/ /# - assert( isdefined( str_alias ), "str_alias is a required argument for register_perk_basic_info!" ); + assert( isDefined( str_alias ), "str_alias is a required argument for register_perk_basic_info!" ); #/ /# - assert( isdefined( n_perk_cost ), "n_perk_cost is a required argument for register_perk_basic_info!" ); + assert( isDefined( n_perk_cost ), "n_perk_cost is a required argument for register_perk_basic_info!" ); #/ /# - assert( isdefined( str_hint_string ), "str_hint_string is a required argument for register_perk_basic_info!" ); + assert( isDefined( str_hint_string ), "str_hint_string is a required argument for register_perk_basic_info!" ); #/ /# - assert( isdefined( str_perk_bottle_weapon ), "str_perk_bottle_weapon is a required argument for register_perk_basic_info!" ); + assert( isDefined( str_perk_bottle_weapon ), "str_perk_bottle_weapon is a required argument for register_perk_basic_info!" ); #/ - _register_undefined_perk( str_perk ); - level._custom_perks[str_perk].alias = str_perk; - level._custom_perks[str_perk].cost = n_perk_cost; - level._custom_perks[str_perk].hint_string = str_hint_string; - level._custom_perks[str_perk].perk_bottle = str_perk_bottle_weapon; +*/ + _register_undefined_perk( str_perk ); + level._custom_perks[ str_perk ].alias = str_perk; + level._custom_perks[ str_perk ].cost = n_perk_cost; + level._custom_perks[ str_perk ].hint_string = str_hint_string; + level._custom_perks[ str_perk ].perk_bottle = str_perk_bottle_weapon; } -register_perk_machine( str_perk, func_perk_machine_setup, func_perk_machine_thread ) +register_perk_machine( str_perk, func_perk_machine_setup, func_perk_machine_thread ) //checked matches cerberus output { +/* /# - assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_machine!" ); + assert( isDefined( str_perk ), "str_perk is a required argument for register_perk_machine!" ); #/ /# - assert( isdefined( func_perk_machine_setup ), "func_perk_machine_setup is a required argument for register_perk_machine!" ); + assert( isDefined( func_perk_machine_setup ), "func_perk_machine_setup is a required argument for register_perk_machine!" ); #/ /# - assert( isdefined( func_perk_machine_thread ), "func_perk_machine_thread is a required argument for register_perk_machine!" ); + assert( isDefined( func_perk_machine_thread ), "func_perk_machine_thread is a required argument for register_perk_machine!" ); #/ - _register_undefined_perk( str_perk ); - - if ( !isdefined( level._custom_perks[str_perk].perk_machine_set_kvps ) ) - level._custom_perks[str_perk].perk_machine_set_kvps = func_perk_machine_setup; - - if ( !isdefined( level._custom_perks[str_perk].perk_machine_thread ) ) - level._custom_perks[str_perk].perk_machine_thread = func_perk_machine_thread; +*/ + _register_undefined_perk( str_perk ); + if ( !isDefined( level._custom_perks[ str_perk ].perk_machine_set_kvps ) ) + { + level._custom_perks[ str_perk ].perk_machine_set_kvps = func_perk_machine_setup; + } + if ( !isDefined( level._custom_perks[ str_perk ].perk_machine_thread ) ) + { + level._custom_perks[ str_perk ].perk_machine_thread = func_perk_machine_thread; + } } -register_perk_precache_func( str_perk, func_precache ) +register_perk_precache_func( str_perk, func_precache ) //checked matches cerberus output { +/* /# - assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_precache_func!" ); + assert( isDefined( str_perk ), "str_perk is a required argument for register_perk_precache_func!" ); #/ /# - assert( isdefined( func_precache ), "func_precache is a required argument for register_perk_precache_func!" ); + assert( isDefined( func_precache ), "func_precache is a required argument for register_perk_precache_func!" ); #/ - _register_undefined_perk( str_perk ); - - if ( !isdefined( level._custom_perks[str_perk].precache_func ) ) - level._custom_perks[str_perk].precache_func = func_precache; +*/ + _register_undefined_perk( str_perk ); + if ( !isDefined( level._custom_perks[ str_perk ].precache_func ) ) + { + level._custom_perks[ str_perk ].precache_func = func_precache; + } } -register_perk_threads( str_perk, func_give_player_perk, func_take_player_perk ) +register_perk_threads( str_perk, func_give_player_perk, func_take_player_perk ) //checked matches cerberus output { +/* /# - assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_threads!" ); + assert( isDefined( str_perk ), "str_perk is a required argument for register_perk_threads!" ); #/ /# - assert( isdefined( func_give_player_perk ), "func_give_player_perk is a required argument for register_perk_threads!" ); + assert( isDefined( func_give_player_perk ), "func_give_player_perk is a required argument for register_perk_threads!" ); #/ - _register_undefined_perk( str_perk ); - - if ( !isdefined( level._custom_perks[str_perk].player_thread_give ) ) - level._custom_perks[str_perk].player_thread_give = func_give_player_perk; - - if ( isdefined( func_take_player_perk ) ) - { - if ( !isdefined( level._custom_perks[str_perk].player_thread_take ) ) - level._custom_perks[str_perk].player_thread_take = func_take_player_perk; - } +*/ + _register_undefined_perk( str_perk ); + if ( !isDefined( level._custom_perks[ str_perk ].player_thread_give ) ) + { + level._custom_perks[ str_perk ].player_thread_give = func_give_player_perk; + } + if ( isDefined( func_take_player_perk ) ) + { + if ( !isDefined( level._custom_perks[ str_perk ].player_thread_take ) ) + { + level._custom_perks[ str_perk ].player_thread_take = func_take_player_perk; + } + } } -register_perk_clientfields( str_perk, func_clientfield_register, func_clientfield_set ) +register_perk_clientfields( str_perk, func_clientfield_register, func_clientfield_set ) //checked matches cerberus output { +/* /# - assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_clientfields!" ); + assert( isDefined( str_perk ), "str_perk is a required argument for register_perk_clientfields!" ); #/ /# - assert( isdefined( func_clientfield_register ), "func_clientfield_register is a required argument for register_perk_clientfields!" ); + assert( isDefined( func_clientfield_register ), "func_clientfield_register is a required argument for register_perk_clientfields!" ); #/ /# - assert( isdefined( func_clientfield_set ), "func_clientfield_set is a required argument for register_perk_clientfields!" ); + assert( isDefined( func_clientfield_set ), "func_clientfield_set is a required argument for register_perk_clientfields!" ); #/ - _register_undefined_perk( str_perk ); - - if ( !isdefined( level._custom_perks[str_perk].clientfield_register ) ) - level._custom_perks[str_perk].clientfield_register = func_clientfield_register; - - if ( !isdefined( level._custom_perks[str_perk].clientfield_set ) ) - level._custom_perks[str_perk].clientfield_set = func_clientfield_set; +*/ + _register_undefined_perk( str_perk ); + if ( !isDefined( level._custom_perks[ str_perk ].clientfield_register ) ) + { + level._custom_perks[ str_perk ].clientfield_register = func_clientfield_register; + } + if ( !isDefined( level._custom_perks[ str_perk ].clientfield_set ) ) + { + level._custom_perks[ str_perk ].clientfield_set = func_clientfield_set; + } } -register_perk_host_migration_func( str_perk, func_host_migration ) +register_perk_host_migration_func( str_perk, func_host_migration ) //checked matches cerberus output { +/* /# - assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_host_migration_func!" ); + assert( isDefined( str_perk ), "str_perk is a required argument for register_perk_host_migration_func!" ); #/ /# - assert( isdefined( func_host_migration ), "func_host_migration is a required argument for register_perk_host_migration_func!" ); + assert( isDefined( func_host_migration ), "func_host_migration is a required argument for register_perk_host_migration_func!" ); #/ - _register_undefined_perk( str_perk ); - - if ( !isdefined( level._custom_perks[str_perk].host_migration_func ) ) - level._custom_perks[str_perk].host_migration_func = func_host_migration; +*/ + _register_undefined_perk( str_perk ); + if ( !isDefined( level._custom_perks[ str_perk ].host_migration_func ) ) + { + level._custom_perks[ str_perk ].host_migration_func = func_host_migration; + } } -_register_undefined_perk( str_perk ) +_register_undefined_perk( str_perk ) //checked matches cerberus output { - if ( !isdefined( level._custom_perks ) ) - level._custom_perks = []; - - if ( !isdefined( level._custom_perks[str_perk] ) ) - level._custom_perks[str_perk] = spawnstruct(); + if ( !isDefined( level._custom_perks ) ) + { + level._custom_perks = []; + } + if ( !isDefined( level._custom_perks[ str_perk ] ) ) + { + level._custom_perks[ str_perk ] = spawnstruct(); + } } + + + + + + + + + + + + + + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades.gsc index 29557ea..dd27be7 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades.gsc @@ -1,684 +1,665 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_pers_upgrades_system; -#include maps\mp\zombies\_zm_pers_upgrades; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_powerups; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\zombies\_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_pers_upgrades; +#include maps/mp/zombies/_zm_pers_upgrades_system; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -pers_upgrade_init() +pers_upgrade_init() //checked matches cerberus output { - setup_pers_upgrade_boards(); - setup_pers_upgrade_revive(); - setup_pers_upgrade_multi_kill_headshots(); - setup_pers_upgrade_cash_back(); - setup_pers_upgrade_insta_kill(); - setup_pers_upgrade_jugg(); - setup_pers_upgrade_carpenter(); - setup_pers_upgrade_flopper(); - setup_pers_upgrade_perk_lose(); - setup_pers_upgrade_pistol_points(); - setup_pers_upgrade_double_points(); - setup_pers_upgrade_sniper(); - setup_pers_upgrade_box_weapon(); - setup_pers_upgrade_nube(); - level thread pers_upgrades_monitor(); + setup_pers_upgrade_boards(); + setup_pers_upgrade_revive(); + setup_pers_upgrade_multi_kill_headshots(); + setup_pers_upgrade_cash_back(); + setup_pers_upgrade_insta_kill(); + setup_pers_upgrade_jugg(); + setup_pers_upgrade_carpenter(); + setup_pers_upgrade_flopper(); + setup_pers_upgrade_perk_lose(); + setup_pers_upgrade_pistol_points(); + setup_pers_upgrade_double_points(); + setup_pers_upgrade_sniper(); + setup_pers_upgrade_box_weapon(); + setup_pers_upgrade_nube(); + level thread pers_upgrades_monitor(); } -pers_abilities_init_globals() +pers_abilities_init_globals() //checked matches cerberus output { - self.successful_revives = 0; - self.failed_revives = 0; - self.failed_cash_back_prones = 0; - self.pers["last_headshot_kill_time"] = gettime(); - self.pers["zombies_multikilled"] = 0; - self.non_headshot_kill_counter = 0; - - if ( isdefined( level.pers_upgrade_box_weapon ) && level.pers_upgrade_box_weapon ) - self.pers_box_weapon_awarded = undefined; - - if ( isdefined( level.pers_upgrade_nube ) && level.pers_upgrade_nube ) - self thread pers_nube_unlock_watcher(); + self.successful_revives = 0; + self.failed_revives = 0; + self.failed_cash_back_prones = 0; + self.pers[ "last_headshot_kill_time" ] = getTime(); + self.pers[ "zombies_multikilled" ] = 0; + self.non_headshot_kill_counter = 0; + if ( is_true( level.pers_upgrade_box_weapon ) ) + { + self.pers_box_weapon_awarded = undefined; + } + if ( is_true( level.pers_upgrade_nube ) ) + { + self thread pers_nube_unlock_watcher(); + } } -is_pers_system_active() +is_pers_system_active() //checked matches cerberus output { - if ( !is_classic() ) - return false; - - if ( is_pers_system_disabled() ) - return false; - - return true; + if ( !is_classic() ) + { + return 0; + } + if ( is_pers_system_disabled() ) + { + return 0; + } + return 1; } -is_pers_system_disabled() +is_pers_system_disabled() //checked matches cerberus output { - if ( level flag_exists( "sq_minigame_active" ) && flag( "sq_minigame_active" ) ) - return true; - - return false; + if ( level flag_exists( "sq_minigame_active" ) && flag( "sq_minigame_active" ) ) + { + return 1; + } + return 0; } -setup_pers_upgrade_boards() +setup_pers_upgrade_boards() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_boards ) && level.pers_upgrade_boards ) - { - level.pers_boarding_round_start = 10; - level.pers_boarding_number_of_boards_required = 74; - pers_register_upgrade( "board", ::pers_upgrade_boards_active, "pers_boarding", level.pers_boarding_number_of_boards_required, 0 ); - } + if ( is_true( level.pers_upgrade_boards ) ) + { + level.pers_boarding_round_start = 10; + level.pers_boarding_number_of_boards_required = 74; + pers_register_upgrade( "board", ::pers_upgrade_boards_active, "pers_boarding", level.pers_boarding_number_of_boards_required, 0 ); + } } -setup_pers_upgrade_revive() +setup_pers_upgrade_revive() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_revive ) && level.pers_upgrade_revive ) - { - level.pers_revivenoperk_number_of_revives_required = 17; - level.pers_revivenoperk_number_of_chances_to_keep = 1; - pers_register_upgrade( "revive", ::pers_upgrade_revive_active, "pers_revivenoperk", level.pers_revivenoperk_number_of_revives_required, 1 ); - } + if ( is_true( level.pers_upgrade_revive ) ) + { + level.pers_revivenoperk_number_of_revives_required = 17; + level.pers_revivenoperk_number_of_chances_to_keep = 1; + pers_register_upgrade( "revive", ::pers_upgrade_revive_active, "pers_revivenoperk", level.pers_revivenoperk_number_of_revives_required, 1 ); + } } -setup_pers_upgrade_multi_kill_headshots() +setup_pers_upgrade_multi_kill_headshots() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_multi_kill_headshots ) && level.pers_upgrade_multi_kill_headshots ) - { - level.pers_multikill_headshots_required = 5; - level.pers_multikill_headshots_upgrade_reset_counter = 25; - pers_register_upgrade( "multikill_headshots", ::pers_upgrade_headshot_active, "pers_multikill_headshots", level.pers_multikill_headshots_required, 0 ); - } + if ( is_true( level.pers_upgrade_multi_kill_headshots ) ) + { + level.pers_multikill_headshots_required = 5; + level.pers_multikill_headshots_upgrade_reset_counter = 25; + pers_register_upgrade( "multikill_headshots", ::pers_upgrade_headshot_active, "pers_multikill_headshots", level.pers_multikill_headshots_required, 0 ); + } } -setup_pers_upgrade_cash_back() +setup_pers_upgrade_cash_back() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_cash_back ) && level.pers_upgrade_cash_back ) - { - level.pers_cash_back_num_perks_required = 50; - level.pers_cash_back_perk_buys_prone_required = 15; - level.pers_cash_back_failed_prones = 1; - level.pers_cash_back_money_reward = 1000; - pers_register_upgrade( "cash_back", ::pers_upgrade_cash_back_active, "pers_cash_back_bought", level.pers_cash_back_num_perks_required, 0 ); - add_pers_upgrade_stat( "cash_back", "pers_cash_back_prone", level.pers_cash_back_perk_buys_prone_required ); - } + if ( is_true( level.pers_upgrade_cash_back ) ) + { + level.pers_cash_back_num_perks_required = 50; + level.pers_cash_back_perk_buys_prone_required = 15; + level.pers_cash_back_failed_prones = 1; + level.pers_cash_back_money_reward = 1000; + pers_register_upgrade( "cash_back", ::pers_upgrade_cash_back_active, "pers_cash_back_bought", level.pers_cash_back_num_perks_required, 0 ); + add_pers_upgrade_stat( "cash_back", "pers_cash_back_prone", level.pers_cash_back_perk_buys_prone_required ); + } } -setup_pers_upgrade_insta_kill() +setup_pers_upgrade_insta_kill() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_insta_kill ) && level.pers_upgrade_insta_kill ) - { - level.pers_insta_kill_num_required = 2; - level.pers_insta_kill_upgrade_active_time = 18; - pers_register_upgrade( "insta_kill", ::pers_upgrade_insta_kill_active, "pers_insta_kill", level.pers_insta_kill_num_required, 0 ); - } + if ( is_true( level.pers_upgrade_insta_kill ) ) + { + level.pers_insta_kill_num_required = 2; + level.pers_insta_kill_upgrade_active_time = 18; + pers_register_upgrade( "insta_kill", ::pers_upgrade_insta_kill_active, "pers_insta_kill", level.pers_insta_kill_num_required, 0 ); + } } -setup_pers_upgrade_jugg() +setup_pers_upgrade_jugg() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_jugg ) && level.pers_upgrade_jugg ) - { - level.pers_jugg_hit_and_die_total = 3; - level.pers_jugg_hit_and_die_round_limit = 2; - level.pers_jugg_round_reached_max = 1; - level.pers_jugg_round_lose_target = 15; - level.pers_jugg_upgrade_health_bonus = 90; - pers_register_upgrade( "jugg", ::pers_upgrade_jugg_active, "pers_jugg", level.pers_jugg_hit_and_die_total, 0 ); - } + if ( is_true( level.pers_upgrade_jugg ) ) + { + level.pers_jugg_hit_and_die_total = 3; + level.pers_jugg_hit_and_die_round_limit = 2; + level.pers_jugg_round_reached_max = 1; + level.pers_jugg_round_lose_target = 15; + level.pers_jugg_upgrade_health_bonus = 90; + pers_register_upgrade( "jugg", ::pers_upgrade_jugg_active, "pers_jugg", level.pers_jugg_hit_and_die_total, 0 ); + } } -setup_pers_upgrade_carpenter() +setup_pers_upgrade_carpenter() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_carpenter ) && level.pers_upgrade_carpenter ) - { - level.pers_carpenter_zombie_kills = 1; - pers_register_upgrade( "carpenter", ::pers_upgrade_carpenter_active, "pers_carpenter", level.pers_carpenter_zombie_kills, 0 ); - } + if ( is_true( level.pers_upgrade_carpenter ) ) + { + level.pers_carpenter_zombie_kills = 1; + pers_register_upgrade( "carpenter", ::pers_upgrade_carpenter_active, "pers_carpenter", level.pers_carpenter_zombie_kills, 0 ); + } } -setup_pers_upgrade_flopper() +setup_pers_upgrade_flopper() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_flopper ) && level.pers_upgrade_flopper ) - { - level.pers_flopper_damage_counter = 6; - level.pers_flopper_counter = 1; - level.pers_flopper_min_fall_damage_activate = 30; - level.pers_flopper_min_fall_damage_deactivate = 50; - pers_register_upgrade( "flopper", ::pers_upgrade_flopper_active, "pers_flopper_counter", level.pers_flopper_counter, 0 ); - } + if ( is_true( level.pers_upgrade_flopper ) ) + { + level.pers_flopper_damage_counter = 6; + level.pers_flopper_counter = 1; + level.pers_flopper_min_fall_damage_activate = 30; + level.pers_flopper_min_fall_damage_deactivate = 50; + pers_register_upgrade( "flopper", ::pers_upgrade_flopper_active, "pers_flopper_counter", level.pers_flopper_counter, 0 ); + } } -setup_pers_upgrade_perk_lose() +setup_pers_upgrade_perk_lose() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_perk_lose ) && level.pers_upgrade_perk_lose ) - { - level.pers_perk_round_reached_max = 6; - level.pers_perk_lose_counter = 3; - pers_register_upgrade( "perk_lose", ::pers_upgrade_perk_lose_active, "pers_perk_lose_counter", level.pers_perk_lose_counter, 0 ); - } + if ( is_true( level.pers_upgrade_perk_lose ) ) + { + level.pers_perk_round_reached_max = 6; + level.pers_perk_lose_counter = 3; + pers_register_upgrade( "perk_lose", ::pers_upgrade_perk_lose_active, "pers_perk_lose_counter", level.pers_perk_lose_counter, 0 ); + } } -setup_pers_upgrade_pistol_points() +setup_pers_upgrade_pistol_points() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_pistol_points ) && level.pers_upgrade_pistol_points ) - { - level.pers_pistol_points_num_kills_in_game = 8; - level.pers_pistol_points_accuracy = 0.25; - level.pers_pistol_points_counter = 1; - pers_register_upgrade( "pistol_points", ::pers_upgrade_pistol_points_active, "pers_pistol_points_counter", level.pers_pistol_points_counter, 0 ); - } + if ( is_true( level.pers_upgrade_pistol_points ) ) + { + level.pers_pistol_points_num_kills_in_game = 8; + level.pers_pistol_points_accuracy = 0.25; + level.pers_pistol_points_counter = 1; + pers_register_upgrade( "pistol_points", ::pers_upgrade_pistol_points_active, "pers_pistol_points_counter", level.pers_pistol_points_counter, 0 ); + } } -setup_pers_upgrade_double_points() +setup_pers_upgrade_double_points() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_double_points ) && level.pers_upgrade_double_points ) - { - level.pers_double_points_score = 2500; - level.pers_double_points_counter = 1; - pers_register_upgrade( "double_points", ::pers_upgrade_double_points_active, "pers_double_points_counter", level.pers_double_points_counter, 0 ); - } + if ( is_true( level.pers_upgrade_double_points ) ) + { + level.pers_double_points_score = 2500; + level.pers_double_points_counter = 1; + pers_register_upgrade( "double_points", ::pers_upgrade_double_points_active, "pers_double_points_counter", level.pers_double_points_counter, 0 ); + } } -setup_pers_upgrade_sniper() +setup_pers_upgrade_sniper() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_sniper ) && level.pers_upgrade_sniper ) - { - level.pers_sniper_round_kills_counter = 5; - level.pers_sniper_kill_distance = 800; - level.pers_sniper_counter = 1; - level.pers_sniper_misses = 3; - pers_register_upgrade( "sniper", ::pers_upgrade_sniper_active, "pers_sniper_counter", level.pers_sniper_counter, 0 ); - } + if ( is_true( level.pers_upgrade_sniper ) ) + { + level.pers_sniper_round_kills_counter = 5; + level.pers_sniper_kill_distance = 800; + level.pers_sniper_counter = 1; + level.pers_sniper_misses = 3; + pers_register_upgrade( "sniper", ::pers_upgrade_sniper_active, "pers_sniper_counter", level.pers_sniper_counter, 0 ); + } } -setup_pers_upgrade_box_weapon() +setup_pers_upgrade_box_weapon() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_box_weapon ) && level.pers_upgrade_box_weapon ) - { - level.pers_box_weapon_counter = 5; - level.pers_box_weapon_lose_round = 10; - pers_register_upgrade( "box_weapon", ::pers_upgrade_box_weapon_active, "pers_box_weapon_counter", level.pers_box_weapon_counter, 0 ); - } + if ( is_true( level.pers_upgrade_box_weapon ) ) + { + level.pers_box_weapon_counter = 5; + level.pers_box_weapon_lose_round = 10; + pers_register_upgrade( "box_weapon", ::pers_upgrade_box_weapon_active, "pers_box_weapon_counter", level.pers_box_weapon_counter, 0 ); + } } -setup_pers_upgrade_nube() +setup_pers_upgrade_nube() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_nube ) && level.pers_upgrade_nube ) - { - level.pers_nube_counter = 1; - level.pers_nube_lose_round = 10; - level.pers_numb_num_kills_unlock = 5; - pers_register_upgrade( "nube", ::pers_upgrade_nube_active, "pers_nube_counter", level.pers_nube_counter, 0 ); - } + if ( is_true( level.pers_upgrade_nube ) ) + { + level.pers_nube_counter = 1; + level.pers_nube_lose_round = 10; + level.pers_numb_num_kills_unlock = 5; + pers_register_upgrade( "nube", ::pers_upgrade_nube_active, "pers_nube_counter", level.pers_nube_counter, 0 ); + } } -pers_upgrade_boards_active() +pers_upgrade_boards_active() //checked matches cerberus output { - self endon( "disconnect" ); - - for ( last_round_number = level.round_number; 1; last_round_number = level.round_number ) - { - self waittill( "pers_stats_end_of_round" ); - - if ( level.round_number >= last_round_number ) - { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( self.rebuild_barrier_reward == 0 ) - { - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_boarding", 0 ); - return; - } - } - } - } + self endon( "disconnect" ); + last_round_number = level.round_number; + while ( 1 ) + { + self waittill( "pers_stats_end_of_round" ); + if ( level.round_number >= last_round_number ) + { + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( self.rebuild_barrier_reward == 0 ) + { + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_boarding", 0 ); + return; + } + } + } + last_round_number = level.round_number; + } } -pers_upgrade_revive_active() +pers_upgrade_revive_active() //checked matches cerberus output { - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "player_failed_revive" ); - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( self.failed_revives >= level.pers_revivenoperk_number_of_chances_to_keep ) - { - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_revivenoperk", 0 ); - self.failed_revives = 0; - return; - } - } - } + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "player_failed_revive" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( self.failed_revives >= level.pers_revivenoperk_number_of_chances_to_keep ) + { + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_revivenoperk", 0 ); + self.failed_revives = 0; + return; + } + } + } } -pers_upgrade_headshot_active() +pers_upgrade_headshot_active() //checked matches cerberus output { - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "zombie_death_no_headshot" ); - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - self.non_headshot_kill_counter++; - - if ( self.non_headshot_kill_counter >= level.pers_multikill_headshots_upgrade_reset_counter ) - { - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_multikill_headshots", 0 ); - self.non_headshot_kill_counter = 0; - return; - } - } - } + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "zombie_death_no_headshot" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + self.non_headshot_kill_counter++; + if ( self.non_headshot_kill_counter >= level.pers_multikill_headshots_upgrade_reset_counter ) + { + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_multikill_headshots", 0 ); + self.non_headshot_kill_counter = 0; + return; + } + } + } } -pers_upgrade_cash_back_active() +pers_upgrade_cash_back_active() //checked matches cerberus output { - self endon( "disconnect" ); - wait 0.5; + self endon( "disconnect" ); + wait 0.5; + + wait 0.5; + while ( 1 ) + { + self waittill( "cash_back_failed_prone" ); + wait 0.1; + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + self.failed_cash_back_prones++; + if ( self.failed_cash_back_prones >= level.pers_cash_back_failed_prones ) + { + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_cash_back_bought", 0 ); + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_cash_back_prone", 0 ); + self.failed_cash_back_prones = 0; + wait 0.4; + return; + } + } + } +} + +pers_upgrade_insta_kill_active() //checked changed to match cerberus output +{ + self endon( "disconnect" ); + wait 0.2; + wait 0.2; + while ( 1 ) + { + self waittill( "pers_melee_swipe" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( isDefined( level.pers_melee_swipe_zombie_swiper ) ) + { + e_zombie = level.pers_melee_swipe_zombie_swiper; + if ( isalive( e_zombie ) && is_true( e_zombie.is_zombie ) ) + { + e_zombie.marked_for_insta_upgraded_death = 1; + e_zombie dodamage( e_zombie.health + 666, e_zombie.origin, self, self, "none", "MOD_PISTOL_BULLET", 0, "knife_zm" ); + } + level.pers_melee_swipe_zombie_swiper = undefined; + } + break; + } + } + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_insta_kill", 0 ); + self kill_insta_kill_upgrade_hud_icon(); + wait 0.4; +} + +is_insta_kill_upgraded_and_active() //checked matches cerberus output +{ + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( self maps/mp/zombies/_zm_powerups::is_insta_kill_active() ) + { + if ( is_true( self.pers_upgrades_awarded[ "insta_kill" ] ) ) + { + return 1; + } + } + } + return 0; +} + +pers_upgrade_jugg_active() //checked changed to match cerberus output +{ + self endon( "disconnect" ); + wait 0.5; + + wait 0.5; + self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "jugg_upgrade", 1, 0 ); + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( level.round_number == level.pers_jugg_round_lose_target ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_jugg_downgrade_count", 0 ); + wait 0.5; + if ( self.pers[ "pers_jugg_downgrade_count" ] >= level.pers_jugg_round_reached_max ) + { + break; + } + } + } + } + self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "jugg_upgrade", 1, 1 ); + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_jugg", 0 ); + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_jugg_downgrade_count", 0 ); +} + +pers_upgrade_carpenter_active() //checked changed to match cerberus output +{ + self endon( "disconnect" ); + wait 0.2; + wait 0.2; + level waittill( "carpenter_finished" ); + self.pers_carpenter_kill = undefined; + while ( 1 ) + { + self waittill( "carpenter_zombie_killed_check_finished" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( !isDefined( self.pers_carpenter_kill ) ) + { + break; + } + } + self.pers_carpenter_kill = undefined; + } + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_carpenter", 0 ); + wait 0.4; +} + +persistent_carpenter_ability_check() //checked changed to match cerberus output +{ + if ( is_true( level.pers_upgrade_carpenter ) ) + { + self endon( "disconnect" ); + if ( is_true( self.pers_upgrades_awarded[ "carpenter" ] ) ) + { + level.pers_carpenter_boards_active = 1; + } + self.pers_carpenter_zombie_check_active = 1; + self.pers_carpenter_kill = undefined; + carpenter_extra_time = 3; + carpenter_finished_start_time = undefined; + level.carpenter_finished_start_time = undefined; + while ( 1 ) + { + if ( !is_pers_system_disabled() ) + { + if ( !isDefined( level.carpenter_powerup_active ) ) + { + if ( !isDefined( level.carpenter_finished_start_time ) ) + { + level.carpenter_finished_start_time = getTime(); + } + time = getTime(); + dt = ( time - level.carpenter_finished_start_time ) / 1000; + if ( dt >= carpenter_extra_time ) + { + break; + } + } + else if ( isDefined( self.pers_carpenter_kill ) ) + { + if ( is_true( self.pers_upgrades_awarded[ "carpenter" ] ) ) + { + break; + } + else + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_carpenter", 0 ); + } + } + } + wait 0.05; + } + self notify( "carpenter_zombie_killed_check_finished" ); + self.pers_carpenter_zombie_check_active = undefined; + level.pers_carpenter_boards_active = undefined; + } +} + +pers_zombie_death_location_check( attacker, v_pos ) //checked matches cerberus output +{ + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( is_player_valid( attacker ) ) + { + if ( isDefined( attacker.pers_carpenter_zombie_check_active ) ) + { + if ( !check_point_in_playable_area( v_pos ) ) + { + attacker.pers_carpenter_kill = 1; + } + } + } + } +} + +insta_kill_pers_upgrade_icon() //checked matches cerberus output +{ + if ( self.zombie_vars[ "zombie_powerup_insta_kill_ug_on" ] ) + { + self.zombie_vars[ "zombie_powerup_insta_kill_ug_time" ] = level.pers_insta_kill_upgrade_active_time; + return; + } + self.zombie_vars[ "zombie_powerup_insta_kill_ug_on" ] = 1; + self._show_solo_hud = 1; + self thread time_remaining_pers_upgrade(); +} + +time_remaining_pers_upgrade() //checked matches cerberus output +{ + self endon( "disconnect" ); + self endon( "kill_insta_kill_upgrade_hud_icon" ); + while ( self.zombie_vars[ "zombie_powerup_insta_kill_ug_time" ] >= 0 ) + { + wait 0.05; + self.zombie_vars[ "zombie_powerup_insta_kill_ug_time" ] -= 0.05; + } + self kill_insta_kill_upgrade_hud_icon(); +} + +kill_insta_kill_upgrade_hud_icon() //checked matches cerberus output +{ + self.zombie_vars[ "zombie_powerup_insta_kill_ug_on" ] = 0; + self._show_solo_hud = 0; + self.zombie_vars[ "zombie_powerup_insta_kill_ug_time" ] = level.pers_insta_kill_upgrade_active_time; + self notify( "kill_insta_kill_upgrade_hud_icon" ); +} + +pers_upgrade_flopper_active() //checked matches cerberus output +{ + self endon( "disconnect" ); + wait 0.5; + /* /# - + iprintlnbold( "*** WE'VE GOT FLOPPER UPGRADED ***" ); #/ - wait 0.5; - - while ( true ) - { - self waittill( "cash_back_failed_prone" ); - - wait 0.1; + */ + wait 0.5; + self thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_flopper_watcher(); + self waittill( "pers_flopper_lost" ); + /* /# - -#/ - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - self.failed_cash_back_prones++; - - if ( self.failed_cash_back_prones >= level.pers_cash_back_failed_prones ) - { - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_cash_back_bought", 0 ); - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_cash_back_prone", 0 ); - self.failed_cash_back_prones = 0; - wait 0.4; -/# - -#/ - return; - } - } - } + iprintlnbold( "*** OH NO: Lost FLOPPER Upgrade ***" ); +#/ + */ + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_flopper_counter", 0 ); + self.pers_num_flopper_damages = 0; } -pers_upgrade_insta_kill_active() +pers_upgrade_perk_lose_active() //checked matches cerberus output { - self endon( "disconnect" ); - wait 0.2; + self endon( "disconnect" ); + wait 0.5; + /* /# - + iprintlnbold( "*** WE'VE GOT PERK LOSE UPGRADED ***" ); #/ - wait 0.2; - - while ( true ) - { - self waittill( "pers_melee_swipe" ); - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( level.pers_melee_swipe_zombie_swiper ) ) - { - e_zombie = level.pers_melee_swipe_zombie_swiper; - - if ( isalive( e_zombie ) && ( isdefined( e_zombie.is_zombie ) && e_zombie.is_zombie ) ) - { - e_zombie.marked_for_insta_upgraded_death = 1; - e_zombie dodamage( e_zombie.health + 666, e_zombie.origin, self, self, "none", "MOD_PISTOL_BULLET", 0, "knife_zm" ); - } - - level.pers_melee_swipe_zombie_swiper = undefined; - } - - break; - } - } - - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_insta_kill", 0 ); - self kill_insta_kill_upgrade_hud_icon(); - wait 0.4; + */ + wait 0.5; + self.pers_perk_lose_start_round = level.round_number; + self waittill( "pers_perk_lose_lost" ); + /* /# - + iprintlnbold( "*** OH NO: Lost PERK LOSE Upgrade ***" ); #/ + */ + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_perk_lose_counter", 0 ); } -is_insta_kill_upgraded_and_active() +pers_upgrade_pistol_points_active() //checked changed to match cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( self maps\mp\zombies\_zm_powerups::is_insta_kill_active() ) - { - if ( isdefined( self.pers_upgrades_awarded["insta_kill"] ) && self.pers_upgrades_awarded["insta_kill"] ) - return true; - } - } - - return false; + self endon( "disconnect" ); + wait 0.5; + /* +/# + iprintlnbold( "*** WE'VE GOT PISTOL POINTS UPGRADED ***" ); +#/ + */ + wait 0.5; + while ( 1 ) + { + self waittill( "pers_pistol_points_kill" ); + accuracy = self maps/mp/zombies/_zm_pers_upgrades_functions::pers_get_player_accuracy(); + if ( accuracy > level.pers_pistol_points_accuracy ) + { + break; + } + } + /* +/# + iprintlnbold( "*** OH NO: Lost PISTOL POINTS Upgrade ***" ); +#/ + */ + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_pistol_points_counter", 0 ); } -pers_upgrade_jugg_active() +pers_upgrade_double_points_active() //checked matches cerberus output { - self endon( "disconnect" ); - wait 0.5; + self endon( "disconnect" ); + wait 0.5; + /* /# - + iprintlnbold( "*** WE'VE GOT DOUBLE POINTS UPGRADED ***" ); #/ - wait 0.5; - self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( "jugg_upgrade", 1, 0 ); - - while ( true ) - { - level waittill( "start_of_round" ); - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( level.round_number == level.pers_jugg_round_lose_target ) - { + */ + wait 0.5; + self waittill( "double_points_lost" ); + /* /# - + iprintlnbold( "*** OH NO: Lost DOUBLE POINTS Upgrade ***" ); #/ - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_jugg_downgrade_count", 0 ); - wait 0.5; - - if ( self.pers["pers_jugg_downgrade_count"] >= level.pers_jugg_round_reached_max ) - break; - } - } - } - - self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( "jugg_upgrade", 1, 1 ); -/# - -#/ - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_jugg", 0 ); - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_jugg_downgrade_count", 0 ); + */ + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_double_points_counter", 0 ); } -pers_upgrade_carpenter_active() +pers_upgrade_sniper_active() //checked matches cerberus output { - self endon( "disconnect" ); - wait 0.2; + self endon( "disconnect" ); + wait 0.5; + /* /# - + iprintlnbold( "*** WE'VE GOT SNIPER UPGRADED ***" ); #/ - wait 0.2; - - level waittill( "carpenter_finished" ); - - for ( self.pers_carpenter_kill = undefined; 1; self.pers_carpenter_kill = undefined ) - { - self waittill( "carpenter_zombie_killed_check_finished" ); - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( !isdefined( self.pers_carpenter_kill ) ) - break; + */ + wait 0.5; + self waittill( "pers_sniper_lost" ); + /* /# - -#/ - } - } - - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_carpenter", 0 ); - wait 0.4; -/# - + iprintlnbold( "*** OH NO: Lost SNIPER Upgrade ***" ); #/ + */ + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_sniper_counter", 0 ); } -persistent_carpenter_ability_check() +pers_upgrade_box_weapon_active() //checked changed to match cerberus output { - if ( isdefined( level.pers_upgrade_carpenter ) && level.pers_upgrade_carpenter ) - { - self endon( "disconnect" ); + self endon( "disconnect" ); + wait 0.5; + /* /# - + iprintlnbold( "*** WE'VE GOT BOX WEAPON UPGRADED ***" ); #/ - if ( isdefined( self.pers_upgrades_awarded["carpenter"] ) && self.pers_upgrades_awarded["carpenter"] ) - level.pers_carpenter_boards_active = 1; - - self.pers_carpenter_zombie_check_active = 1; - self.pers_carpenter_kill = undefined; - carpenter_extra_time = 3.0; - carpenter_finished_start_time = undefined; - level.carpenter_finished_start_time = undefined; - - while ( true ) - { - if ( !is_pers_system_disabled() ) - { - if ( !isdefined( level.carpenter_powerup_active ) ) - { - if ( !isdefined( level.carpenter_finished_start_time ) ) - level.carpenter_finished_start_time = gettime(); - - time = gettime(); - dt = ( time - level.carpenter_finished_start_time ) / 1000; - - if ( dt >= carpenter_extra_time ) - break; - } - - if ( isdefined( self.pers_carpenter_kill ) ) - { - if ( isdefined( self.pers_upgrades_awarded["carpenter"] ) && self.pers_upgrades_awarded["carpenter"] ) - break; - else - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_carpenter", 0 ); - } - } - - wait 0.01; - } - - self notify( "carpenter_zombie_killed_check_finished" ); - self.pers_carpenter_zombie_check_active = undefined; - level.pers_carpenter_boards_active = undefined; - } + */ + self thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_magic_box_teddy_bear(); + wait 0.5; + self.pers_box_weapon_awarded = 1; + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( level.round_number >= level.pers_box_weapon_lose_round ) + { + break; + } + } + } + /* +/# + iprintlnbold( "*** OH NO: Lost BOX WEAPON Upgrade ***" ); +#/ + */ + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_box_weapon_counter", 0 ); } -pers_zombie_death_location_check( attacker, v_pos ) +pers_upgrade_nube_active() //checked changed to match cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( is_player_valid( attacker ) ) - { - if ( isdefined( attacker.pers_carpenter_zombie_check_active ) ) - { - if ( !check_point_in_playable_area( v_pos ) ) - attacker.pers_carpenter_kill = 1; - } - } - } + self endon( "disconnect" ); + wait 0.5; + /* +/# + iprintlnbold( "*** WE'VE GOT NUBE UPGRADED ***" ); +#/ + */ + wait 0.5; + while ( 1 ) + { + level waittill( "start_of_round" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( level.round_number >= level.pers_nube_lose_round ) + { + break; + } + } + } + /* +/# + iprintlnbold( "*** OH NO: Lost NUBE Upgrade ***" ); +#/ + */ + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_nube_counter", 0 ); } -insta_kill_pers_upgrade_icon() -{ - if ( self.zombie_vars["zombie_powerup_insta_kill_ug_on"] ) - { - self.zombie_vars["zombie_powerup_insta_kill_ug_time"] = level.pers_insta_kill_upgrade_active_time; - return; - } - self.zombie_vars["zombie_powerup_insta_kill_ug_on"] = 1; - self._show_solo_hud = 1; - self thread time_remaining_pers_upgrade(); -} - -time_remaining_pers_upgrade() -{ - self endon( "disconnect" ); - self endon( "kill_insta_kill_upgrade_hud_icon" ); - - while ( self.zombie_vars["zombie_powerup_insta_kill_ug_time"] >= 0 ) - { - wait 0.05; - self.zombie_vars["zombie_powerup_insta_kill_ug_time"] -= 0.05; - } - - self kill_insta_kill_upgrade_hud_icon(); -} - -kill_insta_kill_upgrade_hud_icon() -{ - self.zombie_vars["zombie_powerup_insta_kill_ug_on"] = 0; - self._show_solo_hud = 0; - self.zombie_vars["zombie_powerup_insta_kill_ug_time"] = level.pers_insta_kill_upgrade_active_time; - self notify( "kill_insta_kill_upgrade_hud_icon" ); -} - -pers_upgrade_flopper_active() -{ - self endon( "disconnect" ); - wait 0.5; -/# - iprintlnbold( "*** WE'VE GOT FLOPPER UPGRADED ***" ); -#/ - wait 0.5; - self thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_flopper_watcher(); - - self waittill( "pers_flopper_lost" ); -/# - iprintlnbold( "*** OH NO: Lost FLOPPER Upgrade ***" ); -#/ - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_flopper_counter", 0 ); - self.pers_num_flopper_damages = 0; -} - -pers_upgrade_perk_lose_active() -{ - self endon( "disconnect" ); - wait 0.5; -/# - iprintlnbold( "*** WE'VE GOT PERK LOSE UPGRADED ***" ); -#/ - wait 0.5; - self.pers_perk_lose_start_round = level.round_number; - - self waittill( "pers_perk_lose_lost" ); -/# - iprintlnbold( "*** OH NO: Lost PERK LOSE Upgrade ***" ); -#/ - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_perk_lose_counter", 0 ); -} - -pers_upgrade_pistol_points_active() -{ - self endon( "disconnect" ); - wait 0.5; -/# - iprintlnbold( "*** WE'VE GOT PISTOL POINTS UPGRADED ***" ); -#/ - wait 0.5; - - while ( true ) - { - self waittill( "pers_pistol_points_kill" ); - - accuracy = self maps\mp\zombies\_zm_pers_upgrades_functions::pers_get_player_accuracy(); - - if ( accuracy > level.pers_pistol_points_accuracy ) - break; - } -/# - iprintlnbold( "*** OH NO: Lost PISTOL POINTS Upgrade ***" ); -#/ - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_pistol_points_counter", 0 ); -} - -pers_upgrade_double_points_active() -{ - self endon( "disconnect" ); - wait 0.5; -/# - iprintlnbold( "*** WE'VE GOT DOUBLE POINTS UPGRADED ***" ); -#/ - wait 0.5; - - self waittill( "double_points_lost" ); -/# - iprintlnbold( "*** OH NO: Lost DOUBLE POINTS Upgrade ***" ); -#/ - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_double_points_counter", 0 ); -} - -pers_upgrade_sniper_active() -{ - self endon( "disconnect" ); - wait 0.5; -/# - iprintlnbold( "*** WE'VE GOT SNIPER UPGRADED ***" ); -#/ - wait 0.5; - - self waittill( "pers_sniper_lost" ); -/# - iprintlnbold( "*** OH NO: Lost SNIPER Upgrade ***" ); -#/ - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_sniper_counter", 0 ); -} - -pers_upgrade_box_weapon_active() -{ - self endon( "disconnect" ); - wait 0.5; -/# - iprintlnbold( "*** WE'VE GOT BOX WEAPON UPGRADED ***" ); -#/ - self thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_magic_box_teddy_bear(); - wait 0.5; - self.pers_box_weapon_awarded = 1; - - while ( true ) - { - level waittill( "start_of_round" ); - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( level.round_number >= level.pers_box_weapon_lose_round ) - break; - } - } -/# - iprintlnbold( "*** OH NO: Lost BOX WEAPON Upgrade ***" ); -#/ - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_box_weapon_counter", 0 ); -} - -pers_upgrade_nube_active() -{ - self endon( "disconnect" ); - wait 0.5; -/# - iprintlnbold( "*** WE'VE GOT NUBE UPGRADED ***" ); -#/ - wait 0.5; - - while ( true ) - { - level waittill( "start_of_round" ); - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( level.round_number >= level.pers_nube_lose_round ) - break; - } - } -/# - iprintlnbold( "*** OH NO: Lost NUBE Upgrade ***" ); -#/ - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_nube_counter", 0 ); -} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades_functions.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades_functions.gsc index 9267274..77b7977 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades_functions.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades_functions.gsc @@ -1,1298 +1,1354 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_pers_upgrades; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_score; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\zombies\_zm_powerups; -#include maps\mp\_visionset_mgr; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\zombies\_zm_magicbox; +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/_visionset_mgr; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_pers_upgrades; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -pers_boards_updated( zbarrier ) +pers_boards_updated( zbarrier ) //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_boards ) && level.pers_upgrade_boards ) - { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( !( isdefined( self.pers_upgrades_awarded["board"] ) && self.pers_upgrades_awarded["board"] ) ) - { - if ( level.round_number >= level.pers_boarding_round_start ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_boarding", 0 ); - - if ( self.pers["pers_boarding"] >= level.pers_boarding_number_of_boards_required ) - { - if ( isdefined( zbarrier ) ) - self.upgrade_fx_origin = zbarrier.origin; - } - } - } - } - } + if ( is_true( level.pers_upgrade_boards ) ) + { + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( !is_true( self.pers_upgrades_awarded[ "board" ] ) ) + { + if ( level.round_number >= level.pers_boarding_round_start ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_boarding", 0 ); + if ( self.pers[ "pers_boarding" ] >= level.pers_boarding_number_of_boards_required ) + { + if ( isDefined( zbarrier ) ) + { + self.upgrade_fx_origin = zbarrier.origin; + } + } + } + } + } + } } -pers_revive_active() +pers_revive_active() //checked matches cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( self.pers_upgrades_awarded["revive"] ) && self.pers_upgrades_awarded["revive"] ) - return true; - } - - return false; + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( is_true( self.pers_upgrades_awarded[ "revive" ] ) ) + { + return 1; + } + } + return 0; } -pers_increment_revive_stat( reviver ) +pers_increment_revive_stat( reviver ) //checked matches cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - reviver maps\mp\zombies\_zm_stats::increment_client_stat( "pers_revivenoperk", 0 ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + reviver maps/mp/zombies/_zm_stats::increment_client_stat( "pers_revivenoperk", 0 ); + } } -pers_mulit_kill_headshot_active() +pers_mulit_kill_headshot_active() //checked matches cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( self.pers_upgrades_awarded["multikill_headshots"] ) && self.pers_upgrades_awarded["multikill_headshots"] ) - return true; - } - - return false; + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( is_true( self.pers_upgrades_awarded[ "multikill_headshots" ] ) ) + { + return 1; + } + } + return 0; } -pers_check_for_pers_headshot( time_of_death, zombie ) +pers_check_for_pers_headshot( time_of_death, zombie ) //checked matches cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( self.pers["last_headshot_kill_time"] == time_of_death ) - self.pers["zombies_multikilled"]++; - else - self.pers["zombies_multikilled"] = 1; - - self.pers["last_headshot_kill_time"] = time_of_death; - - if ( self.pers["zombies_multikilled"] == 2 ) - { - if ( isdefined( zombie ) ) - self.upgrade_fx_origin = zombie.origin; - - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_multikill_headshots", 0 ); - self.non_headshot_kill_counter = 0; - } - } + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( self.pers[ "last_headshot_kill_time" ] == time_of_death ) + { + self.pers[ "zombies_multikilled" ]++; + } + else + { + self.pers[ "zombies_multikilled" ] = 1; + } + self.pers[ "last_headshot_kill_time" ] = time_of_death; + if ( self.pers[ "zombies_multikilled" ] == 2 ) + { + if ( isDefined( zombie ) ) + { + self.upgrade_fx_origin = zombie.origin; + } + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_multikill_headshots", 0 ); + self.non_headshot_kill_counter = 0; + } + } } -cash_back_player_drinks_perk() +cash_back_player_drinks_perk() //checked matches cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( level.pers_upgrade_cash_back ) && level.pers_upgrade_cash_back ) - { - if ( isdefined( self.pers_upgrades_awarded["cash_back"] ) && self.pers_upgrades_awarded["cash_back"] ) - { - self thread cash_back_money_reward(); - self thread cash_back_player_prone_check( 1 ); - } - else if ( self.pers["pers_cash_back_bought"] < level.pers_cash_back_num_perks_required ) - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_cash_back_bought", 0 ); - else - self thread cash_back_player_prone_check( 0 ); - } - } + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( is_true( level.pers_upgrade_cash_back ) ) + { + if ( is_true self.pers_upgrades_awarded[ "cash_back" ] ) ) + { + self thread cash_back_money_reward(); + self thread cash_back_player_prone_check( 1 ); + } + else if ( self.pers[ "pers_cash_back_bought" ] < level.pers_cash_back_num_perks_required ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_cash_back_bought", 0 ); + return; + } + else + { + self thread cash_back_player_prone_check( 0 ); + } + } + } } -cash_back_money_reward() +cash_back_money_reward() //checked matches cerberus output { - self endon( "death" ); - step = 5; - amount_per_step = int( level.pers_cash_back_money_reward / step ); - - for ( i = 0; i < step; i++ ) - { - self maps\mp\zombies\_zm_score::add_to_player_score( amount_per_step ); - wait 0.2; - } + self endon( "death" ); + step = 5; + amount_per_step = int( level.pers_cash_back_money_reward / step ); + for ( i = 0; i < step; i++ ) + { + self maps/mp/zombies/_zm_score::add_to_player_score( amount_per_step ); + wait 0.2; + } } -cash_back_player_prone_check( got_ability ) +cash_back_player_prone_check( got_ability ) //checked changed to match cerberus output { - self endon( "death" ); - prone_time = 2.5; - start_time = gettime(); - - while ( true ) - { - time = gettime(); - dt = ( time - start_time ) / 1000; - - if ( dt > prone_time ) - break; - - if ( self getstance() == "prone" ) - { - if ( !got_ability ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_cash_back_prone", 0 ); - wait 0.8; - } - - return; - } - - wait 0.01; - } - - if ( got_ability ) - self notify( "cash_back_failed_prone" ); + self endon( "death" ); + prone_time = 2.5; + start_time = getTime(); + while ( 1 ) + { + time = getTime(); + dt = ( time - start_time ) / 1000; + if ( dt > prone_time ) + { + break; + } + if ( self getstance() == "prone" ) + { + if ( !got_ability ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_cash_back_prone", 0 ); + wait 0.8; + } + return; + } + wait 0.01; + } + if ( got_ability ) + { + self notify( "cash_back_failed_prone" ); + } } -pers_upgrade_insta_kill_upgrade_check() +pers_upgrade_insta_kill_upgrade_check() //checked changed to match cerberus output { - if ( isdefined( level.pers_upgrade_insta_kill ) && level.pers_upgrade_insta_kill ) - { - self endon( "death" ); - - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return; - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - e_player = players[i]; - - if ( isdefined( e_player.pers_upgrades_awarded["insta_kill"] ) && e_player.pers_upgrades_awarded["insta_kill"] ) - e_player thread insta_kill_upgraded_player_kill_func( level.pers_insta_kill_upgrade_active_time ); - } - - if ( !( isdefined( self.pers_upgrades_awarded["insta_kill"] ) && self.pers_upgrades_awarded["insta_kill"] ) ) - { - kills_start = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "kills" ); - - self waittill( "insta_kill_over" ); - - kills_end = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "kills" ); - num_killed = kills_end - kills_start; - - if ( num_killed > 0 ) - self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_insta_kill", 0 ); - else - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_insta_kill", 0 ); - } - } + if ( is_true( level.pers_upgrade_insta_kill ) ) + { + self endon( "death" ); + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + e_player = players[ i ]; + if ( is_true( e_player.pers_upgrades_awarded[ "insta_kill" ] ) ) + { + e_player thread insta_kill_upgraded_player_kill_func( level.pers_insta_kill_upgrade_active_time ); + } + } + if ( !is_true( self.pers_upgrades_awarded[ "insta_kill" ] ) ) + { + kills_start = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "kills" ); + self waittill( "insta_kill_over" ); + kills_end = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "kills" ); + num_killed = kills_end - kills_start; + if ( num_killed > 0 ) + { + self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_insta_kill", 0 ); + } + else + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_insta_kill", 0 ); + } + } + } } -insta_kill_upgraded_player_kill_func( active_time ) +insta_kill_upgraded_player_kill_func( active_time ) //checked changed to match cerberus output { - self endon( "death" ); - wait 0.25; - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_disabled() ) - return; - - self thread maps\mp\zombies\_zm_pers_upgrades::insta_kill_pers_upgrade_icon(); - start_time = gettime(); - zombie_collide_radius = 50; - zombie_player_height_test = 100; - - while ( true ) - { - time = gettime(); - dt = ( time - start_time ) / 1000; - - if ( dt > active_time ) - break; - - if ( !maps\mp\zombies\_zm_powerups::is_insta_kill_active() ) - break; - - a_zombies = getaiarray( level.zombie_team ); - e_closest = undefined; - - for ( i = 0; i < a_zombies.size; i++ ) - { - e_zombie = a_zombies[i]; - - if ( isdefined( e_zombie.marked_for_insta_upgraded_death ) ) - continue; - - height_diff = abs( self.origin[2] - e_zombie.origin[2] ); - - if ( height_diff < zombie_player_height_test ) - { - dist = distance2d( self.origin, e_zombie.origin ); - - if ( dist < zombie_collide_radius ) - { - dist_max = dist; - e_closest = e_zombie; - } - } - } - - if ( isdefined( e_closest ) ) - { - e_closest.marked_for_insta_upgraded_death = 1; - e_closest dodamage( e_closest.health + 666, e_closest.origin, self, self, "none", "MOD_PISTOL_BULLET", 0, "knife_zm" ); - } - - wait 0.01; - } + self endon( "death" ); + wait 0.25; + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_disabled() ) + { + return; + } + self thread maps/mp/zombies/_zm_pers_upgrades::insta_kill_pers_upgrade_icon(); + start_time = getTime(); + zombie_collide_radius = 50; + zombie_player_height_test = 100; + while ( 1 ) + { + time = getTime(); + dt = ( time - start_time ) / 1000; + if ( dt > active_time ) + { + break; + } + if ( !maps/mp/zombies/_zm_powerups::is_insta_kill_active() ) + { + break; + } + a_zombies = getaiarray( level.zombie_team ); + e_closest = undefined; + i = 0; + while ( i < a_zombies.size ) + { + e_zombie = a_zombies[ i ]; + if ( isDefined( e_zombie.marked_for_insta_upgraded_death ) ) + { + i++; + continue; + } + height_diff = abs( self.origin[ 2 ] - e_zombie.origin[ 2 ] ); + if ( height_diff < zombie_player_height_test ) + { + dist = distance2d( self.origin, e_zombie.origin ); + if ( dist < zombie_collide_radius ) + { + dist_max = dist; + e_closest = e_zombie; + } + } + i++; + } + if ( isDefined( e_closest ) ) + { + e_closest.marked_for_insta_upgraded_death = 1; + e_closest dodamage( e_closest.health + 666, e_closest.origin, self, self, "none", "MOD_PISTOL_BULLET", 0, "knife_zm" ); + } + wait 0.01; + } } -pers_insta_kill_melee_swipe( smeansofdeath, eattacker ) +pers_insta_kill_melee_swipe( smeansofdeath, eattacker ) //checked matches cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( smeansofdeath ) && smeansofdeath == "MOD_MELEE" ) - { - if ( isplayer( self ) && maps\mp\zombies\_zm_pers_upgrades::is_insta_kill_upgraded_and_active() ) - { - self notify( "pers_melee_swipe" ); - level.pers_melee_swipe_zombie_swiper = eattacker; - } - } - } + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( isDefined( smeansofdeath ) && smeansofdeath == "MOD_MELEE" ) + { + if ( isplayer( self ) && maps/mp/zombies/_zm_pers_upgrades::is_insta_kill_upgraded_and_active() ) + { + self notify( "pers_melee_swipe" ); + level.pers_melee_swipe_zombie_swiper = eattacker; + } + } + } } -pers_upgrade_jugg_player_death_stat() +pers_upgrade_jugg_player_death_stat() //checked matches cerberus output { - if ( isdefined( level.pers_upgrade_jugg ) && level.pers_upgrade_jugg ) - { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( !( isdefined( self.pers_upgrades_awarded["jugg"] ) && self.pers_upgrades_awarded["jugg"] ) ) - { - if ( level.round_number <= level.pers_jugg_hit_and_die_round_limit ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_jugg", 0 ); + if ( is_true( level.pers_upgrade_jugg ) ) + { + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( !is_true( self.pers_upgrades_awarded[ "jugg" ] ) ) + { + if ( level.round_number <= level.pers_jugg_hit_and_die_round_limit ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_jugg", 0 ); + } + } + } + } +} + +pers_jugg_active() //checked matches cerberus output +{ + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( is_true( self.pers_upgrades_awarded[ "jugg" ] ) ) + { + return 1; + } + } + return 0; +} + +pers_upgrade_flopper_damage_check( smeansofdeath, idamage ) //checked changed to match cerberus output +{ + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return 0; + } + if ( !isDefined( smeansofdeath ) || smeansofdeath != "MOD_FALLING" ) + { + return 0; + } + if ( !is_true( self.pers_upgrades_awarded[ "flopper" ] ) ) + { + if ( idamage < level.pers_flopper_min_fall_damage_activate ) + { + return 0; + } + if ( !isDefined( self.pers_num_flopper_damages ) ) + { + self.pers_num_flopper_damages = 0; + } + self.pers_num_flopper_damages++; + if ( self.pers_num_flopper_damages >= level.pers_flopper_damage_counter ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_flopper_counter", 0 ); + /* /# - + iprintlnbold( "FLOPPER STAT: INCREMENTED" ); #/ - } - } - } - } + */ + } + } + else if ( !is_true( self.pers_flopper_active ) ) + { + if ( idamage >= level.pers_flopper_min_fall_damage_deactivate ) + { + self notify( "pers_flopper_lost" ); + } + return 0; + } + if ( idamage > 0 ) + { + self notify( "activate_pers_flopper_effect" ); + return 1; + } + return 0; } -pers_jugg_active() +divetonuke_precache_override_func() //checked matches cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( self.pers_upgrades_awarded["jugg"] ) && self.pers_upgrades_awarded["jugg"] ) - return true; - } - - return false; + precacheshader( "specialty_divetonuke_zombies" ); + level._effect[ "divetonuke_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" ); } -pers_upgrade_flopper_damage_check( smeansofdeath, idamage ) +pers_upgrade_flopper_watcher() //checked changed to match cerberus output { - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return false; + self endon( "death" ); + self endon( "disconnect" ); + self endon( "pers_flopper_lost" ); + while ( 1 ) + { + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_disabled() ) + { + wait 0.01; + } + else + { + self waittill( "dtp_start" ); + self.pers_flopper_active = 1; + self thread pers_flopper_dtn(); + self waittill( "dtp_end" ); + self.pers_flopper_active = undefined; + } + } +} - if ( !isdefined( smeansofdeath ) || smeansofdeath != "MOD_FALLING" ) - return false; +pers_flopper_dtn() //checked matches cerberus output +{ + self endon( "disconnect" ); + self waittill( "activate_pers_flopper_effect" ); + if ( isDefined( level.pers_flopper_divetonuke_func ) ) + { + self thread [[ level.pers_flopper_divetonuke_func ]]( self, self.origin ); + } +} - if ( !( isdefined( self.pers_upgrades_awarded["flopper"] ) && self.pers_upgrades_awarded["flopper"] ) ) - { - if ( idamage < level.pers_flopper_min_fall_damage_activate ) - return false; +pers_flopper_explode( attacker, origin ) //checked matches cerberus output +{ + self endon( "disconnect" ); + radius = level.zombie_vars[ "zombie_perk_divetonuke_radius" ]; + min_damage = level.zombie_vars[ "zombie_perk_divetonuke_min_damage" ]; + max_damage = level.zombie_vars[ "zombie_perk_divetonuke_max_damage" ]; + if ( is_true( level.pers_flopper_network_optimized ) ) + { + attacker thread pers_flopper_damage_network_optimized( origin, radius, max_damage, min_damage, "MOD_GRENADE_SPLASH" ); + } + else + { + radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" ); + } + attacker setclientfield( "phd_flopper_effects", 1 ); + maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_perk_divetonuke", attacker ); + wait 1; + maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_perk_divetonuke", attacker ); + attacker setclientfield( "phd_flopper_effects", 0 ); +} - if ( !isdefined( self.pers_num_flopper_damages ) ) - self.pers_num_flopper_damages = 0; +pers_flopper_damage_network_optimized( origin, radius, max_damage, min_damage, damage_mod ) //checked partially changed to match cerberus output //for loops don't work with continues used while loop +{ + self endon( "disconnect" ); + a_zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius ); + network_stall_counter = 0; + if ( isDefined( a_zombies ) ) + { + i = 0; + while ( i < a_zombies.size ) + { + e_zombie = a_zombies[ i ]; + if ( !isDefined( e_zombie ) || !isalive( e_zombie ) ) + { + i++; + continue; + } + dist = distance( e_zombie.origin, origin ); + damage = min_damage + ( ( max_damage - min_damage ) * ( 1 - ( dist / radius ) ) ); + e_zombie dodamage( damage, e_zombie.origin, self, self, 0, damage_mod ); + network_stall_counter--; + if ( network_stall_counter <= 0 ) + { + wait_network_frame(); + network_stall_counter = randomintrange( 1, 3 ); + } + i++; + } + } +} - self.pers_num_flopper_damages++; - - if ( self.pers_num_flopper_damages >= level.pers_flopper_damage_counter ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_flopper_counter", 0 ); +pers_upgrade_pistol_points_kill() //checked matches cerberus output +{ + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return; + } + if ( !isDefined( self.pers_num_zombies_killed_in_game ) ) + { + self.pers_num_zombies_killed_in_game = 0; + } + self.pers_num_zombies_killed_in_game++; + if ( !is_true( self.pers_upgrades_awarded[ "pistol_points" ] ) ) + { + if ( self.pers_num_zombies_killed_in_game >= level.pers_pistol_points_num_kills_in_game ) + { + accuracy = self pers_get_player_accuracy(); + if ( accuracy <= level.pers_pistol_points_accuracy ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_pistol_points_counter", 0 ); + /* /# - iprintlnbold( "FLOPPER STAT: INCREMENTED" ); + iprintlnbold( "PISTOL POINTS STAT: INCREMENTED" ); #/ - } - } - else - { - if ( !( isdefined( self.pers_flopper_active ) && self.pers_flopper_active ) ) - { - if ( idamage >= level.pers_flopper_min_fall_damage_deactivate ) - self notify( "pers_flopper_lost" ); - - return false; - } - - if ( idamage > 0 ) - { - self notify( "activate_pers_flopper_effect" ); - return true; - } - } - - return false; + */ + } + } + } + else + { + self notify( "pers_pistol_points_kill" ); + } } -divetonuke_precache_override_func() +pers_upgrade_pistol_points_set_score( score, event, mod, damage_weapon ) //checked matches cerberus output { - precacheshader( "specialty_divetonuke_zombies" ); - level._effect["divetonuke_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( is_true( self.pers_upgrades_awarded[ "pistol_points" ] ) ) + { + if ( isDefined( event ) ) + { + if ( event == "rebuild_board" ) + { + return score; + } + if ( isDefined( damage_weapon ) ) + { + weapon_class = getweaponclasszm( damage_weapon ); + if ( weapon_class != "weapon_pistol" ) + { + return score; + } + } + if ( isDefined( mod ) && isstring( mod ) && mod == "MOD_PISTOL_BULLET" ) + { + score *= 2; + } + } + } + } + return score; } -pers_upgrade_flopper_watcher() +pers_upgrade_double_points_pickup_start() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "pers_flopper_lost" ); - - while ( true ) - { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_disabled() ) - wait 0.01; - else - { - self waittill( "dtp_start" ); - - self.pers_flopper_active = 1; - self thread pers_flopper_dtn(); - - self waittill( "dtp_end" ); - - self.pers_flopper_active = undefined; - } - } -} - -pers_flopper_dtn() -{ - self endon( "disconnect" ); - - self waittill( "activate_pers_flopper_effect" ); - - if ( isdefined( level.pers_flopper_divetonuke_func ) ) - self thread [[ level.pers_flopper_divetonuke_func ]]( self, self.origin ); -} - -pers_flopper_explode( attacker, origin ) -{ - self endon( "disconnect" ); - radius = level.zombie_vars["zombie_perk_divetonuke_radius"]; - min_damage = level.zombie_vars["zombie_perk_divetonuke_min_damage"]; - max_damage = level.zombie_vars["zombie_perk_divetonuke_max_damage"]; - - if ( isdefined( level.pers_flopper_network_optimized ) && level.pers_flopper_network_optimized ) - attacker thread pers_flopper_damage_network_optimized( origin, radius, max_damage, min_damage, "MOD_GRENADE_SPLASH" ); - else - radiusdamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" ); - - attacker setclientfield( "phd_flopper_effects", 1 ); - maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_perk_divetonuke", attacker ); - wait 1; - maps\mp\_visionset_mgr::vsmgr_deactivate( "visionset", "zm_perk_divetonuke", attacker ); - attacker setclientfield( "phd_flopper_effects", 0 ); -} - -pers_flopper_damage_network_optimized( origin, radius, max_damage, min_damage, damage_mod ) -{ - self endon( "disconnect" ); - a_zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius ); - network_stall_counter = 0; - - if ( isdefined( a_zombies ) ) - { - for ( i = 0; i < a_zombies.size; i++ ) - { - e_zombie = a_zombies[i]; - - if ( !isdefined( e_zombie ) || !isalive( e_zombie ) ) - continue; - - dist = distance( e_zombie.origin, origin ); - damage = min_damage + ( max_damage - min_damage ) * ( 1.0 - dist / radius ); - e_zombie dodamage( damage, e_zombie.origin, self, self, 0, damage_mod ); - network_stall_counter--; - - if ( network_stall_counter <= 0 ) - { - wait_network_frame(); - network_stall_counter = randomintrange( 1, 3 ); - } - } - } -} - -pers_upgrade_pistol_points_kill() -{ - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return; - - if ( !isdefined( self.pers_num_zombies_killed_in_game ) ) - self.pers_num_zombies_killed_in_game = 0; - - self.pers_num_zombies_killed_in_game++; - - if ( !( isdefined( self.pers_upgrades_awarded["pistol_points"] ) && self.pers_upgrades_awarded["pistol_points"] ) ) - { - if ( self.pers_num_zombies_killed_in_game >= level.pers_pistol_points_num_kills_in_game ) - { - accuracy = self pers_get_player_accuracy(); - - if ( accuracy <= level.pers_pistol_points_accuracy ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_pistol_points_counter", 0 ); + self endon( "death" ); + self endon( "disconnect" ); + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return; + } + if ( is_true( self.double_points_ability_check_active ) ) + { + self.double_points_ability_start_time = getTime(); + return; + } + self.double_points_ability_check_active = 1; + level.pers_double_points_active = 1; + start_points = self.score; + if ( isDefined( self.account_value ) ) + { + bank_account_value_start = self.account_value; + } + else + { + bank_account_value_start = 0; + } + self.double_points_ability_start_time = getTime(); + last_score = self.score; + ability_lost = 0; + while ( 1 ) + { + if ( self.score > last_score ) + { + ability_lost = 1; + } + last_score = self.score; + time = getTime(); + dt = time - self.double_points_ability_start_time / 1000; + if ( dt >= 30 ) + { + break; + } + wait 0.1; + } + level.pers_double_points_active = undefined; + if ( isDefined( self.account_value ) ) + { + bank_account_value_end = self.account_value; + } + else + { + bank_account_value_end = 0; + } + if ( bank_account_value_end < bank_account_value_start ) + { + withdrawal_number = bank_account_value_start - bank_account_value_end; + withdrawal_fees = level.ta_vaultfee * withdrawal_number; + withdrawal_amount = level.bank_deposit_ddl_increment_amount * withdrawal_number; + bank_withdrawal_total = withdrawal_amount - withdrawal_fees; + } + else + { + bank_withdrawal_total = 0; + } + if ( is_true( self.pers_upgrades_awarded[ "double_points" ] ) ) + { + if ( ability_lost == 1 ) + { + self notify( "double_points_lost" ); + } + } + else + { + total_points = self.score - start_points; + total_points -= bank_withdrawal_total; + if ( total_points >= level.pers_double_points_score ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_double_points_counter", 0 ); + /* /# - iprintlnbold( "PISTOL POINTS STAT: INCREMENTED" ); + iprintlnbold( "PISTOL POINTS STAT: INCREMENTED" ); #/ - } - } - } - else - self notify( "pers_pistol_points_kill" ); + */ + } + } + self.double_points_ability_check_active = undefined; } -pers_upgrade_pistol_points_set_score( score, event, mod, damage_weapon ) +pers_upgrade_double_points_set_score( score ) //checked matches cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( self.pers_upgrades_awarded["pistol_points"] ) && self.pers_upgrades_awarded["pistol_points"] ) - { - if ( isdefined( event ) ) - { - if ( event == "rebuild_board" ) - return score; - - if ( isdefined( damage_weapon ) ) - { - weapon_class = getweaponclasszm( damage_weapon ); - - if ( weapon_class != "weapon_pistol" ) - return score; - } - - if ( isdefined( mod ) && isstring( mod ) && mod == "MOD_PISTOL_BULLET" ) - score *= 2; - } - } - } - - return score; + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( is_true( self.pers_upgrades_awarded[ "double_points" ] ) ) + { + if ( is_true( level.pers_double_points_active ) ) + { + score = int( score * 0.5 ); + } + } + } + return score; } -pers_upgrade_double_points_pickup_start() +pers_upgrade_double_points_cost( current_cost ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( is_true( self.pers_upgrades_awarded[ "double_points" ] ) ) + { + current_cost = int( current_cost / 2 ); + } + } + return current_cost; +} - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return; +is_pers_double_points_active() //checked matches cerberus output +{ + if ( is_true( self.pers_upgrades_awarded[ "double_points" ] ) ) + { + if ( is_true( level.pers_double_points_active ) ) + { + return 1; + } + } + return 0; +} - if ( isdefined( self.double_points_ability_check_active ) && self.double_points_ability_check_active ) - { - self.double_points_ability_start_time = gettime(); - return; - } - - self.double_points_ability_check_active = 1; - level.pers_double_points_active = 1; - start_points = self.score; - - if ( isdefined( self.account_value ) ) - bank_account_value_start = self.account_value; - else - bank_account_value_start = 0; - - self.double_points_ability_start_time = gettime(); - last_score = self.score; - ability_lost = 0; - - while ( true ) - { - if ( self.score > last_score ) - ability_lost = 1; - - last_score = self.score; - time = gettime(); - dt = ( time - self.double_points_ability_start_time ) / 1000; - - if ( dt >= 30 ) - break; - - wait 0.1; - } - - level.pers_double_points_active = undefined; - - if ( isdefined( self.account_value ) ) - bank_account_value_end = self.account_value; - else - bank_account_value_end = 0; - - if ( bank_account_value_end < bank_account_value_start ) - { - withdrawal_number = bank_account_value_start - bank_account_value_end; - withdrawal_fees = level.ta_vaultfee * withdrawal_number; - withdrawal_amount = level.bank_deposit_ddl_increment_amount * withdrawal_number; - bank_withdrawal_total = withdrawal_amount - withdrawal_fees; - } - else - bank_withdrawal_total = 0; - - if ( isdefined( self.pers_upgrades_awarded["double_points"] ) && self.pers_upgrades_awarded["double_points"] ) - { - if ( ability_lost == 1 ) - self notify( "double_points_lost" ); - } - else - { - total_points = self.score - start_points; - total_points -= bank_withdrawal_total; - - if ( total_points >= level.pers_double_points_score ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_double_points_counter", 0 ); +pers_upgrade_perk_lose_bought() //checked changed to match cerberus output +{ + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return; + } + wait 1; + if ( !is_true( self.pers_upgrades_awarded[ "perk_lose" ] ) ) + { + if ( level.round_number <= level.pers_perk_round_reached_max ) + { + if ( !isDefined( self.bought_all_perks ) ) + { + a_perks = self get_perk_array( 0 ); + if ( isDefined( a_perks ) && a_perks.size == 4 ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_perk_lose_counter", 0 ); + /* /# - iprintlnbold( "PISTOL POINTS STAT: INCREMENTED" ); + iprintlnbold( "PERK LOSE STAT: INCREMENTED" ); #/ - } - } - - self.double_points_ability_check_active = undefined; + */ + self.bought_all_perks = 1; + } + } + } + } + else if ( isDefined( self.pers_perk_lose_start_round ) ) + { + if ( level.round_number > 1 && self.pers_perk_lose_start_round == level.round_number ) + { + self notify( "pers_perk_lose_lost" ); + } + } } -pers_upgrade_double_points_set_score( score ) +pers_upgrade_perk_lose_save() //checked changed to match cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( self.pers_upgrades_awarded["double_points"] ) && self.pers_upgrades_awarded["double_points"] ) - { - if ( isdefined( level.pers_double_points_active ) && level.pers_double_points_active ) - { + while ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( isDefined( self.perks_active ) ) + { + self.a_saved_perks = []; + self.a_saved_perks = arraycopy( self.perks_active ); + } + else + { + self.a_saved_perks = self get_perk_array( 0 ); + } + self.a_saved_primaries = self getweaponslistprimaries(); + self.a_saved_primaries_weapons = []; + index = 0; + foreach ( weapon in self.a_saved_primaries ) + { + self.a_saved_primaries_weapons[ index ] = maps/mp/zombies/_zm_weapons::get_player_weapondata( self, weapon ); + index++; + } + } +} + +pers_upgrade_perk_lose_restore() //checked changed to match cerberus output +{ + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + player_has_mule_kick = 0; + discard_quickrevive = 0; + if ( isDefined( self.a_saved_perks ) && self.a_saved_perks.size >= 2 ) + { + for ( i = 0; i < self.a_saved_perks.size; i++ ) + { + perk = self.a_saved_perks[ i ]; + if ( perk == "specialty_quickrevive" ) + { + discard_quickrevive = 1; + } + } + if ( discard_quickrevive == 1 ) + { + size = self.a_saved_perks.size; + } + else + { + size = self.a_saved_perks.size - 1; + } + i = 0; + while ( i < size ) + { + perk = self.a_saved_perks[ i ]; + if ( discard_quickrevive == 1 && perk == "specialty_quickrevive" ) + { + i++; + continue; + } + if ( perk == "specialty_additionalprimaryweapon" ) + { + player_has_mule_kick = 1; + } + if ( self hasperk( perk ) ) + { + i++; + continue; + } + self maps/mp/zombies/_zm_perks::give_perk( perk ); + wait_network_frame(); + i++; + } + } + else if ( player_has_mule_kick ) + { + a_current_weapons = self getweaponslistprimaries(); + for ( i = 0; i < self.a_saved_primaries_weapons.size; i++ ) + { + saved_weapon = self.a_saved_primaries_weapons[ i ]; + found = 0; + for ( j = 0; j < a_current_weapons.size; j++ ) + { + current_weapon = a_current_weapons[ j ]; + if ( current_weapon == saved_weapon[ "name" ] ) + { + found = 1; + break; + } + } + if ( found == 0 ) + { + self maps/mp/zombies/_zm_weapons::weapondata_give( self.a_saved_primaries_weapons[ i ] ); + self switchtoweapon( a_current_weapons[ 0 ] ); + break; + } + } + } + self.a_saved_perks = undefined; + self.a_saved_primaries = undefined; + self.a_saved_primaries_weapons = undefined; + } +} + +pers_upgrade_sniper_kill_check( zombie, attacker ) //checked changed to match cerberus output +{ + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return; + } + if ( !isDefined( zombie ) || !isDefined( attacker ) || !isDefined( zombie.damageweapon ) ) + { + return; + } + if ( is_true( zombie.marked_for_insta_upgraded_death ) ) + { + return; + } + weapon = zombie.damageweapon; + if ( !is_sniper_weapon( weapon ) ) + { + return; + } + if ( is_true( self.pers_upgrades_awarded[ "sniper" ] ) ) + { + self thread pers_sniper_score_reward(); + } + else + { + dist = distance( zombie.origin, attacker.origin ); + if ( dist < level.pers_sniper_kill_distance ) + { + return; + } + if ( !isDefined( self.pers_sniper_round ) ) + { + self.pers_sniper_round = level.round_number; + self.pers_sniper_kills = 0; + } + else if ( self.pers_sniper_round != level.round_number ) + { + self.pers_sniper_round = level.round_number; + self.pers_sniper_kills = 0; + } + self.pers_sniper_kills++; + /* /# - + iprintlnbold( "Pers: Long range Sniper Kill" ); #/ - score = int( score * 0.5 ); - } - } - } - - return score; -} - -pers_upgrade_double_points_cost( current_cost ) -{ - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( self.pers_upgrades_awarded["double_points"] ) && self.pers_upgrades_awarded["double_points"] ) - current_cost = int( current_cost / 2 ); - } - - return current_cost; -} - -is_pers_double_points_active() -{ - if ( isdefined( self.pers_upgrades_awarded["double_points"] ) && self.pers_upgrades_awarded["double_points"] ) - { - if ( isdefined( level.pers_double_points_active ) && level.pers_double_points_active ) - return true; - } - - return false; -} - -pers_upgrade_perk_lose_bought() -{ - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return; - - wait 1; - - if ( !( isdefined( self.pers_upgrades_awarded["perk_lose"] ) && self.pers_upgrades_awarded["perk_lose"] ) ) - { - if ( level.round_number <= level.pers_perk_round_reached_max ) - { - if ( !isdefined( self.bought_all_perks ) ) - { - a_perks = self get_perk_array( 0 ); - - if ( isdefined( a_perks ) && a_perks.size == 4 ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_perk_lose_counter", 0 ); + */ + if ( self.pers_sniper_kills >= level.pers_sniper_round_kills_counter ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_sniper_counter", 0 ); + /* /# - iprintlnbold( "PERK LOSE STAT: INCREMENTED" ); + iprintlnbold( "SNIPER STAT: INCREMENTED" ); #/ - self.bought_all_perks = 1; - } - } - } - } - else if ( isdefined( self.pers_perk_lose_start_round ) ) - { - if ( level.round_number > 1 && self.pers_perk_lose_start_round == level.round_number ) - self notify( "pers_perk_lose_lost" ); - } + */ + } + } } -pers_upgrade_perk_lose_save() +pers_sniper_score_reward() //checked changed to match cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( isdefined( self.perks_active ) ) - { - self.a_saved_perks = []; - self.a_saved_perks = arraycopy( self.perks_active ); - } - else - self.a_saved_perks = self get_perk_array( 0 ); - - self.a_saved_primaries = self getweaponslistprimaries(); - self.a_saved_primaries_weapons = []; - index = 0; - - foreach ( weapon in self.a_saved_primaries ) - { - self.a_saved_primaries_weapons[index] = maps\mp\zombies\_zm_weapons::get_player_weapondata( self, weapon ); - index++; - } - } + self endon( "disconnect" ); + self endon( "death" ); + while ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + total_score = 300; + steps = 10; + score_inc = int( total_score / steps ); + for ( i = 0; i < steps; i++ ) + { + self maps/mp/zombies/_zm_score::add_to_player_score( score_inc ); + wait 0.25; + } + } } -pers_upgrade_perk_lose_restore() +pers_sniper_player_fires( weapon, hit ) //checked changed to match cerberus output { - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - player_has_mule_kick = 0; - discard_quickrevive = 0; - - if ( isdefined( self.a_saved_perks ) && self.a_saved_perks.size >= 2 ) - { - for ( i = 0; i < self.a_saved_perks.size; i++ ) - { - perk = self.a_saved_perks[i]; - - if ( perk == "specialty_quickrevive" ) - discard_quickrevive = 1; - } - - if ( discard_quickrevive == 1 ) - size = self.a_saved_perks.size; - else - size = self.a_saved_perks.size - 1; - - for ( i = 0; i < size; i++ ) - { - perk = self.a_saved_perks[i]; - - if ( discard_quickrevive == 1 && perk == "specialty_quickrevive" ) - continue; - - if ( perk == "specialty_additionalprimaryweapon" ) - player_has_mule_kick = 1; - - if ( self hasperk( perk ) ) - continue; - - self maps\mp\zombies\_zm_perks::give_perk( perk ); - wait_network_frame(); - } - } - - if ( player_has_mule_kick ) - { - a_current_weapons = self getweaponslistprimaries(); - - for ( i = 0; i < self.a_saved_primaries_weapons.size; i++ ) - { - saved_weapon = self.a_saved_primaries_weapons[i]; - found = 0; - - for ( j = 0; j < a_current_weapons.size; j++ ) - { - current_weapon = a_current_weapons[j]; - - if ( current_weapon == saved_weapon["name"] ) - { - found = 1; - break; - } - } - - if ( found == 0 ) - { - self maps\mp\zombies\_zm_weapons::weapondata_give( self.a_saved_primaries_weapons[i] ); - self switchtoweapon( a_current_weapons[0] ); - break; - } - } - } - - self.a_saved_perks = undefined; - self.a_saved_primaries = undefined; - self.a_saved_primaries_weapons = undefined; - } + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return; + } + if ( isDefined( weapon ) && isDefined( hit ) ) + { + if ( is_true( self.pers_upgrades_awarded[ "sniper" ] ) ) + { + if ( is_sniper_weapon( weapon ) ) + { + if ( !isDefined( self.num_sniper_misses ) ) + { + self.num_sniper_misses = 0; + } + if ( hit ) + { + self.num_sniper_misses = 0; + } + else + { + self.num_sniper_misses++; + if ( self.num_sniper_misses >= level.pers_sniper_misses ) + { + self notify( "pers_sniper_lost" ); + self.num_sniper_misses = 0; + } + } + } + } + } } -pers_upgrade_sniper_kill_check( zombie, attacker ) +pers_get_player_accuracy() //checked matches cerberus output { - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return; + accuracy = 1; + total_shots = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "total_shots" ); + total_hits = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "hits" ); + if ( total_shots > 0 ) + { + accuracy = total_hits / total_shots; + } + return accuracy; +} - if ( !isdefined( zombie ) || !isdefined( attacker ) || !isdefined( zombie.damageweapon ) ) - return; +is_sniper_weapon( weapon ) //checked matches cerberus output +{ + if ( !isDefined( weapon ) ) + { + return 0; + } + if ( !isstring( weapon ) ) + { + return 0; + } + if ( getsubstr( weapon, 0, 4 ) == "svu_" ) + { + return 1; + } + if ( getsubstr( weapon, 0, 6 ) == "dsr50_" ) + { + return 1; + } + if ( getsubstr( weapon, 0, 10 ) == "barretm82_" ) + { + return 1; + } + return 0; +} - if ( isdefined( zombie.marked_for_insta_upgraded_death ) && zombie.marked_for_insta_upgraded_death ) - return; +pers_upgrade_box_weapon_used( e_user, e_grabber ) //checked changed to match cerberus output +{ + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return; + } + if ( level.round_number >= level.pers_box_weapon_lose_round ) + { + return; + } + if ( isDefined( e_grabber ) && isplayer( e_grabber ) ) + { + if ( is_true( e_grabber.pers_box_weapon_awarded ) ) + { + return; + } + if ( is_true( e_grabber.pers_upgrades_awarded[ "box_weapon" ] ) ) + { + return; + } + e_grabber maps/mp/zombies/_zm_stats::increment_client_stat( "pers_box_weapon_counter", 0 ); + } + else if ( isDefined( e_user ) && isplayer( e_user ) ) + { + if ( is_true( e_user.pers_upgrades_awarded[ "box_weapon" ] ) ) + { + return; + } + e_user maps/mp/zombies/_zm_stats::zero_client_stat( "pers_box_weapon_counter", 0 ); + } +} - weapon = zombie.damageweapon; +pers_magic_box_teddy_bear() //checked changed to match cerberus output +{ + self endon( "disconnect" ); + if ( is_true( level.pers_magic_box_firesale ) ) + { + self thread pers_magic_box_firesale(); + } + m_bear = spawn( "script_model", self.origin ); + m_bear setmodel( level.chest_joker_model ); + m_bear pers_magic_box_set_teddy_location( level.chest_index ); + self.pers_magix_box_teddy_bear = m_bear; + m_bear setinvisibletoall(); + wait 0.1; + m_bear setvisibletoplayer( self ); + while ( 1 ) + { + box = level.chests[ level.chest_index ]; + if ( level.round_number >= level.pers_box_weapon_lose_round ) + { + break; + } + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_disabled() ) + { + m_bear setinvisibletoall(); + while ( 1 ) + { + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_disabled() ) + { + break; + } + wait 0.01; + } + m_bear setvisibletoplayer( self ); + } + if ( flag( "moving_chest_now" ) ) + { + m_bear setinvisibletoall(); + while ( flag( "moving_chest_now" ) ) + { + wait 0.1; + } + m_bear pers_magic_box_set_teddy_location( level.chest_index ); + wait 0.1; + m_bear setvisibletoplayer( self ); + } + if ( is_true( level.sloth_moving_box ) ) + { + m_bear setinvisibletoall(); + while ( is_true( level.sloth_moving_box ) ) + { + wait 0.1; + } + m_bear pers_magic_box_set_teddy_location( level.chest_index ); + wait 0.1; + m_bear setvisibletoplayer( self ); + } + if ( is_true( box._box_open ) ) + { + m_bear setinvisibletoall(); + while ( 1 ) + { + if ( !is_true( box._box_open ) ) + { + break; + } + wait 0.01; + } + m_bear setvisibletoplayer( self ); + } + wait 0.01; + } + m_bear delete(); +} - if ( !is_sniper_weapon( weapon ) ) - return; +pers_magic_box_set_teddy_location( box_index ) //checked changed to match cerberus output +{ + box = level.chests[ box_index ]; + if ( isDefined( box.zbarrier ) ) + { + v_origin = box.zbarrier.origin; + v_angles = box.zbarrier.angles; + } + else + { + v_origin = box.origin; + v_angles = box.angles; + } + v_up = anglesToUp( v_angles ); + height_offset = 22; + self.origin = v_origin + ( v_up * height_offset ); + dp = vectordot( v_up, ( 0, 0, 1 ) ); + if ( dp > 0 ) + { + v_angles_offset = vectorScale( ( 0, 1, 0 ), 90 ); + } + else + { + v_angles_offset = ( 0, -90, -10 ); + } + self.angles = v_angles + v_angles_offset; +} - if ( isdefined( self.pers_upgrades_awarded["sniper"] ) && self.pers_upgrades_awarded["sniper"] ) - self thread pers_sniper_score_reward(); - else - { - dist = distance( zombie.origin, attacker.origin ); - - if ( dist < level.pers_sniper_kill_distance ) - return; - - if ( !isdefined( self.pers_sniper_round ) ) - { - self.pers_sniper_round = level.round_number; - self.pers_sniper_kills = 0; - } - else if ( self.pers_sniper_round != level.round_number ) - { - self.pers_sniper_round = level.round_number; - self.pers_sniper_kills = 0; - } - - self.pers_sniper_kills++; +pers_treasure_chest_choosespecialweapon( player ) //checked changed to match cerberus output +{ + rval = randomfloat( 1 ); + if ( !isDefined( player.pers_magic_box_weapon_count ) ) + { + player.pers_magic_box_weapon_count = 0; + } + if ( ( player.pers_magic_box_weapon_count == 0 || rval < 0.6 ) && player.pers_magic_box_weapon_count < 2 ) + { + player.pers_magic_box_weapon_count++; + if ( isDefined( level.pers_treasure_chest_get_weapons_array_func ) ) + { + [[ level.pers_treasure_chest_get_weapons_array_func ]](); + } + else + { + pers_treasure_chest_get_weapons_array(); + } + keys = array_randomize( level.pers_box_weapons ); + /* /# - iprintlnbold( "Pers: Long range Sniper Kill" ); + forced_weapon = getDvar( "scr_force_weapon" ); + if ( forced_weapon != "" && isDefined( level.zombie_weapons[ forced_weapon ] ) ) + { + arrayinsert( keys, forced_weapon, 0 ); #/ - if ( self.pers_sniper_kills >= level.pers_sniper_round_kills_counter ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "pers_sniper_counter", 0 ); -/# - iprintlnbold( "SNIPER STAT: INCREMENTED" ); -#/ - } - } + } + */ + pap_triggers = getentarray( "specialty_weapupgrade", "script_noteworthy" ); + for ( i = 0; i < keys.size; i++ ) + { + if ( maps/mp/zombies/_zm_magicbox::treasure_chest_canplayerreceiveweapon( player, keys[ i ], pap_triggers ) ) + { + return keys[ i ]; + } + } + return keys[ 0 ]; + } + else + { + player.pers_magic_box_weapon_count = 0; + weapon = maps/mp/zombies/_zm_magicbox::treasure_chest_chooseweightedrandomweapon( player ); + return weapon; + } } -pers_sniper_score_reward() +pers_treasure_chest_get_weapons_array() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "death" ); - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - total_score = 300; - steps = 10; - score_inc = int( total_score / steps ); - - for ( i = 0; i < steps; i++ ) - { - self maps\mp\zombies\_zm_score::add_to_player_score( score_inc ); - wait 0.25; - } - } + if ( !isDefined( level.pers_box_weapons ) ) + { + level.pers_box_weapons = []; + level.pers_box_weapons[ level.pers_box_weapons.size ] = "ray_gun_zm"; + level.pers_box_weapons[ level.pers_box_weapons.size ] = "galil_zm"; + level.pers_box_weapons[ level.pers_box_weapons.size ] = "knife_ballistic_zm"; + level.pers_box_weapons[ level.pers_box_weapons.size ] = "srm1216_zm"; + level.pers_box_weapons[ level.pers_box_weapons.size ] = "hamr_zm"; + level.pers_box_weapons[ level.pers_box_weapons.size ] = "tar21_zm"; + level.pers_box_weapons[ level.pers_box_weapons.size ] = "raygun_mark2_zm"; + } } -pers_sniper_player_fires( weapon, hit ) +pers_magic_box_firesale() //checked partially changed to match cerberus output //for loop not changed because continues are broken in for loops while loops used instead { - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return; - - if ( isdefined( weapon ) && isdefined( hit ) ) - { - if ( isdefined( self.pers_upgrades_awarded["sniper"] ) && self.pers_upgrades_awarded["sniper"] ) - { - if ( is_sniper_weapon( weapon ) ) - { - if ( !isdefined( self.num_sniper_misses ) ) - self.num_sniper_misses = 0; - - if ( hit ) - self.num_sniper_misses = 0; - else - { - self.num_sniper_misses++; - - if ( self.num_sniper_misses >= level.pers_sniper_misses ) - { - self notify( "pers_sniper_lost" ); - self.num_sniper_misses = 0; - } - } - } - } - } + self endon( "disconnect" ); + wait 1; + while ( 1 ) + { + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 ) + { + wait 5; + i = 0; + while ( i < level.chests.size ) + { + if ( i == level.chest_index ) + { + i++; + continue; + } + box = level.chests[ i ]; + self thread box_firesale_teddy_bear( box, i ); + i++; + } + while ( 1 ) + { + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 0 ) + { + break; + } + wait 0.01; + } + } + if ( level.round_number >= level.pers_box_weapon_lose_round ) + { + return; + } + wait 0.5; + } } -pers_get_player_accuracy() +box_firesale_teddy_bear( box, box_index ) //checked changed to match cerberus output { - accuracy = 1.0; - total_shots = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "total_shots" ); - total_hits = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "hits" ); - - if ( total_shots > 0 ) - accuracy = total_hits / total_shots; - - return accuracy; + self endon( "disconnect" ); + m_bear = spawn( "script_model", self.origin ); + m_bear setmodel( level.chest_joker_model ); + m_bear pers_magic_box_set_teddy_location( box_index ); + m_bear setinvisibletoall(); + wait 0.1; + m_bear setvisibletoplayer( self ); + while ( 1 ) + { + if ( is_true( box._box_open ) ) + { + m_bear setinvisibletoall(); + while ( 1 ) + { + if ( !is_true( box._box_open ) ) + { + break; + } + wait 0.01; + } + m_bear setvisibletoplayer( self ); + } + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 0 ) + { + break; + } + wait 0.01; + } + m_bear delete(); } -is_sniper_weapon( weapon ) +pers_nube_unlock_watcher() //checked changed to match cerberus output { - if ( !isdefined( weapon ) ) - return false; - - if ( !isstring( weapon ) ) - return false; - - if ( getsubstr( weapon, 0, 4 ) == "svu_" ) - return true; - - if ( getsubstr( weapon, 0, 6 ) == "dsr50_" ) - return true; - - if ( getsubstr( weapon, 0, 10 ) == "barretm82_" ) - return true; - - return false; + self endon( "disconnect" ); + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return; + } + self.pers_num_nube_kills = 0; + if ( self.pers[ "pers_max_round_reached" ] >= level.pers_nube_lose_round ) + { + return; + } + num_melee_kills = self.pers[ "melee_kills" ]; + num_headshot_kills = self.pers[ "headshots" ]; + num_boards = self.pers[ "boards" ]; + while ( 1 ) + { + self waittill( "pers_player_zombie_kill" ); + if ( self.pers[ "pers_max_round_reached" ] >= level.pers_nube_lose_round ) + { + self.pers_num_nube_kills = 0; + return; + } + if ( num_melee_kills == self.pers[ "melee_kills" ] && num_headshot_kills == self.pers[ "headshots" ] && num_boards == self.pers[ "boards" ] ) + { + self.pers_num_nube_kills++; + } + else + { + self.pers_num_nube_kills = 0; + num_melee_kills = self.pers[ "melee_kills" ]; + num_headshot_kills = self.pers[ "headshots" ]; + num_boards = self.pers[ "boards" ]; + } + } } -pers_upgrade_box_weapon_used( e_user, e_grabber ) +pers_nube_player_ranked_as_nube( player ) //checked matches cerberus output { - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return; - - if ( level.round_number >= level.pers_box_weapon_lose_round ) - return; - - if ( isdefined( e_grabber ) && isplayer( e_grabber ) ) - { - if ( is_true( e_grabber.pers_box_weapon_awarded ) ) - return; - - if ( isdefined( e_grabber.pers_upgrades_awarded["box_weapon"] ) && e_grabber.pers_upgrades_awarded["box_weapon"] ) - return; - - e_grabber maps\mp\zombies\_zm_stats::increment_client_stat( "pers_box_weapon_counter", 0 ); -/# - -#/ - } - else if ( isdefined( e_user ) && isplayer( e_user ) ) - { - if ( isdefined( e_user.pers_upgrades_awarded["box_weapon"] ) && e_user.pers_upgrades_awarded["box_weapon"] ) - return; - - e_user maps\mp\zombies\_zm_stats::zero_client_stat( "pers_box_weapon_counter", 0 ); -/# - -#/ - } + if ( player.pers_num_nube_kills >= level.pers_numb_num_kills_unlock ) + { + return 1; + } + return 0; } -pers_magic_box_teddy_bear() +pers_nube_weapon_upgrade_check( player, str_weapon ) //checked matches cerberus output { - self endon( "disconnect" ); - - if ( isdefined( level.pers_magic_box_firesale ) && level.pers_magic_box_firesale ) - self thread pers_magic_box_firesale(); - - m_bear = spawn( "script_model", self.origin ); - m_bear setmodel( level.chest_joker_model ); - m_bear pers_magic_box_set_teddy_location( level.chest_index ); - self.pers_magix_box_teddy_bear = m_bear; - m_bear setinvisibletoall(); - wait 0.1; - m_bear setvisibletoplayer( self ); - - while ( true ) - { - box = level.chests[level.chest_index]; - - if ( level.round_number >= level.pers_box_weapon_lose_round ) - break; - - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_disabled() ) - { - m_bear setinvisibletoall(); - - while ( true ) - { - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_disabled() ) - break; - - wait 0.01; - } - - m_bear setvisibletoplayer( self ); - } - - if ( flag( "moving_chest_now" ) ) - { - m_bear setinvisibletoall(); - - while ( flag( "moving_chest_now" ) ) - wait 0.1; - - m_bear pers_magic_box_set_teddy_location( level.chest_index ); - wait 0.1; - m_bear setvisibletoplayer( self ); - } - - if ( isdefined( level.sloth_moving_box ) && level.sloth_moving_box ) - { - m_bear setinvisibletoall(); - - while ( isdefined( level.sloth_moving_box ) && level.sloth_moving_box ) - wait 0.1; - - m_bear pers_magic_box_set_teddy_location( level.chest_index ); - wait 0.1; - m_bear setvisibletoplayer( self ); - } - - if ( isdefined( box._box_open ) && box._box_open ) - { - m_bear setinvisibletoall(); - - while ( true ) - { - if ( !( isdefined( box._box_open ) && box._box_open ) ) - break; - - wait 0.01; - } - - m_bear setvisibletoplayer( self ); - } - - wait 0.01; - } - - m_bear delete(); + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( getsubstr( str_weapon, 0, 11 ) == "rottweil72_" ) + { + if ( !is_true( player.pers_upgrades_awarded[ "nube" ] ) ) + { + if ( pers_nube_player_ranked_as_nube( player ) ) + { + player maps/mp/zombies/_zm_stats::increment_client_stat( "pers_nube_counter", 0 ); + str_weapon = "ray_gun_zm"; + fx_org = player.origin; + v_dir = anglesToForward( player getplayerangles() ); + v_up = anglesToUp( player getplayerangles() ); + fx_org = ( fx_org + ( v_dir * 5 ) ) + v_up * 12; + player.upgrade_fx_origin = fx_org; + } + } + else + { + str_weapon = "ray_gun_zm"; + } + } + } + return str_weapon; } -pers_magic_box_set_teddy_location( box_index ) +pers_nube_weapon_ammo_check( player, str_weapon ) //checked matches cerberus output { - box = level.chests[box_index]; - - if ( isdefined( box.zbarrier ) ) - { - v_origin = box.zbarrier.origin; - v_angles = box.zbarrier.angles; - } - else - { - v_origin = box.origin; - v_angles = box.angles; - } - - v_up = anglestoup( v_angles ); - height_offset = 22; - self.origin = v_origin + v_up * height_offset; - dp = vectordot( v_up, ( 0, 0, 1 ) ); - - if ( dp > 0 ) - v_angles_offset = vectorscale( ( 0, 1, 0 ), 90.0 ); - else - v_angles_offset = ( 0, -90, -10 ); - - self.angles = v_angles + v_angles_offset; + if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + if ( getsubstr( str_weapon, 0, 11 ) == "rottweil72_" ) + { + if ( is_true( player.pers_upgrades_awarded[ "nube" ] ) ) + { + if ( player hasweapon( "ray_gun_zm" ) ) + { + str_weapon = "ray_gun_zm"; + } + if ( player hasweapon( "ray_gun_upgraded_zm" ) ) + { + str_weapon = "ray_gun_upgraded_zm"; + } + } + } + } + return str_weapon; } -pers_treasure_chest_choosespecialweapon( player ) +pers_nube_should_we_give_raygun( player_has_weapon, player, weapon_buy ) //checked partially changed to match cerberus output //changed at own discretion { - rval = randomfloat( 1 ); - - if ( !isdefined( player.pers_magic_box_weapon_count ) ) - player.pers_magic_box_weapon_count = 0; - - if ( player.pers_magic_box_weapon_count < 2 && ( player.pers_magic_box_weapon_count == 0 || rval < 0.6 ) ) - { -/# - -#/ - player.pers_magic_box_weapon_count++; - - if ( isdefined( level.pers_treasure_chest_get_weapons_array_func ) ) - [[ level.pers_treasure_chest_get_weapons_array_func ]](); - else - pers_treasure_chest_get_weapons_array(); - - keys = array_randomize( level.pers_box_weapons ); -/# - forced_weapon = getdvar( _hash_45ED7744 ); - - if ( forced_weapon != "" && isdefined( level.zombie_weapons[forced_weapon] ) ) - arrayinsert( keys, forced_weapon, 0 ); -#/ - pap_triggers = getentarray( "specialty_weapupgrade", "script_noteworthy" ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( maps\mp\zombies\_zm_magicbox::treasure_chest_canplayerreceiveweapon( player, keys[i], pap_triggers ) ) - return keys[i]; - } - - return keys[0]; - } - else - { -/# - -#/ - player.pers_magic_box_weapon_count = 0; - weapon = maps\mp\zombies\_zm_magicbox::treasure_chest_chooseweightedrandomweapon( player ); - return weapon; - } + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return player_has_weapon; + } + if ( player.pers[ "pers_max_round_reached" ] >= level.pers_nube_lose_round ) + { + return player_has_weapon; + } + if ( !pers_nube_player_ranked_as_nube( player ) ) + { + return player_has_weapon; + } + if ( isDefined( weapon_buy ) && getsubstr( weapon_buy, 0, 11 ) != "rottweil72_" ) + { + return player_has_weapon; + } + if ( player hasweapon( "rottweil72_zm" ) || player hasweapon( "rottweil72_upgraded_zm" ) ) + { + player_has_olympia = 1; + } + if ( player hasweapon( "ray_gun_zm" ) || player hasweapon( "ray_gun_upgraded_zm" ) ) + { + player_has_raygun = 1; + } + if ( player_has_olympia && player_has_raygun ) + { + player_has_weapon = 1; + } + else if ( pers_nube_player_ranked_as_nube( player ) && player_has_olympia && player_has_raygun == 0 ) + { + player_has_weapon = 0; + } + else if ( is_true( player.pers_upgrades_awarded[ "nube" ] ) && player_has_raygun ) + { + player_has_weapon = 1; + } + return player_has_weapon; } -pers_treasure_chest_get_weapons_array() +pers_nube_ammo_hint_string( player, weapon ) //checked matches cerberus output { - if ( !isdefined( level.pers_box_weapons ) ) - { - level.pers_box_weapons = []; - level.pers_box_weapons[level.pers_box_weapons.size] = "ray_gun_zm"; - level.pers_box_weapons[level.pers_box_weapons.size] = "galil_zm"; - level.pers_box_weapons[level.pers_box_weapons.size] = "knife_ballistic_zm"; - level.pers_box_weapons[level.pers_box_weapons.size] = "srm1216_zm"; - level.pers_box_weapons[level.pers_box_weapons.size] = "hamr_zm"; - level.pers_box_weapons[level.pers_box_weapons.size] = "tar21_zm"; - level.pers_box_weapons[level.pers_box_weapons.size] = "raygun_mark2_zm"; - } + ammo_cost = 0; + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return 0; + } + if ( getsubstr( weapon, 0, 11 ) == "rottweil72_" ) + { + ammo_cost = pers_nube_ammo_cost( player, ammo_cost ); + } + if ( !ammo_cost ) + { + return 0; + } + self.stub.hint_string = &"ZOMBIE_WEAPONAMMOONLY"; + self sethintstring( self.stub.hint_string, ammo_cost ); + return 1; } -pers_magic_box_firesale() +pers_nube_ammo_cost( player, ammo_cost ) //checked matches cerberus output { - self endon( "disconnect" ); - wait 1; - - while ( true ) - { - if ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 1 ) - { - wait 5; - - for ( i = 0; i < level.chests.size; i++ ) - { - if ( i == level.chest_index ) - continue; - - box = level.chests[i]; - self thread box_firesale_teddy_bear( box, i ); - } - - while ( true ) - { - if ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 0 ) - break; - - wait 0.01; - } - } - - if ( level.round_number >= level.pers_box_weapon_lose_round ) - return; - - wait 0.5; - } + if ( player hasweapon( "ray_gun_zm" ) ) + { + ammo_cost = 250; + } + if ( player hasweapon( "ray_gun_upgraded_zm" ) ) + { + ammo_cost = 4500; + } + return ammo_cost; } -box_firesale_teddy_bear( box, box_index ) +pers_nube_override_ammo_cost( player, weapon, ammo_cost ) //checked matches cerberus output { - self endon( "disconnect" ); - m_bear = spawn( "script_model", self.origin ); - m_bear setmodel( level.chest_joker_model ); - m_bear pers_magic_box_set_teddy_location( box_index ); - m_bear setinvisibletoall(); - wait 0.1; - m_bear setvisibletoplayer( self ); - - while ( true ) - { - if ( isdefined( box._box_open ) && box._box_open ) - { - m_bear setinvisibletoall(); - - while ( true ) - { - if ( !( isdefined( box._box_open ) && box._box_open ) ) - break; - - wait 0.01; - } - - m_bear setvisibletoplayer( self ); - } - - if ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 0 ) - break; - - wait 0.01; - } - - m_bear delete(); + if ( !maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) + { + return ammo_cost; + } + if ( getsubstr( weapon, 0, 11 ) == "rottweil72_" ) + { + ammo_cost = pers_nube_ammo_cost( player, ammo_cost ); + } + return ammo_cost; } -pers_nube_unlock_watcher() -{ - self endon( "disconnect" ); - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return; - self.pers_num_nube_kills = 0; - - if ( self.pers["pers_max_round_reached"] >= level.pers_nube_lose_round ) - return; - - num_melee_kills = self.pers["melee_kills"]; - num_headshot_kills = self.pers["headshots"]; - - for ( num_boards = self.pers["boards"]; 1; num_boards = self.pers["boards"] ) - { - self waittill( "pers_player_zombie_kill" ); - - if ( self.pers["pers_max_round_reached"] >= level.pers_nube_lose_round ) - { - self.pers_num_nube_kills = 0; - return; - } - - self.pers_num_nube_kills = 0; - num_melee_kills = self.pers["melee_kills"]; - num_headshot_kills = self.pers["headshots"]; - } -} - -pers_nube_player_ranked_as_nube( player ) -{ - if ( player.pers_num_nube_kills >= level.pers_numb_num_kills_unlock ) - return true; - - return false; -} - -pers_nube_weapon_upgrade_check( player, str_weapon ) -{ - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( getsubstr( str_weapon, 0, 11 ) == "rottweil72_" ) - { - if ( !( isdefined( player.pers_upgrades_awarded["nube"] ) && player.pers_upgrades_awarded["nube"] ) ) - { - if ( pers_nube_player_ranked_as_nube( player ) ) - { - player maps\mp\zombies\_zm_stats::increment_client_stat( "pers_nube_counter", 0 ); - str_weapon = "ray_gun_zm"; - fx_org = player.origin; - v_dir = anglestoforward( player getplayerangles() ); - v_up = anglestoup( player getplayerangles() ); - fx_org = fx_org + v_dir * 5 + v_up * 12; - player.upgrade_fx_origin = fx_org; - } - } - else - str_weapon = "ray_gun_zm"; - } - } - - return str_weapon; -} - -pers_nube_weapon_ammo_check( player, str_weapon ) -{ - if ( maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - { - if ( getsubstr( str_weapon, 0, 11 ) == "rottweil72_" ) - { - if ( isdefined( player.pers_upgrades_awarded["nube"] ) && player.pers_upgrades_awarded["nube"] ) - { - if ( player hasweapon( "ray_gun_zm" ) ) - str_weapon = "ray_gun_zm"; - - if ( player hasweapon( "ray_gun_upgraded_zm" ) ) - str_weapon = "ray_gun_upgraded_zm"; - } - } - } - - return str_weapon; -} - -pers_nube_should_we_give_raygun( player_has_weapon, player, weapon_buy ) -{ - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return player_has_weapon; - - if ( player.pers["pers_max_round_reached"] >= level.pers_nube_lose_round ) - return player_has_weapon; - - if ( !pers_nube_player_ranked_as_nube( player ) ) - return player_has_weapon; - - if ( isdefined( weapon_buy ) && getsubstr( weapon_buy, 0, 11 ) != "rottweil72_" ) - return player_has_weapon; - - player_has_olympia = player hasweapon( "rottweil72_zm" ) || player hasweapon( "rottweil72_upgraded_zm" ); - player_has_raygun = player hasweapon( "ray_gun_zm" ) || player hasweapon( "ray_gun_upgraded_zm" ); - - if ( player_has_olympia && player_has_raygun ) - player_has_weapon = 1; - else if ( pers_nube_player_ranked_as_nube( player ) && player_has_olympia && player_has_raygun == 0 ) - player_has_weapon = 0; - else if ( isdefined( player.pers_upgrades_awarded["nube"] ) && player.pers_upgrades_awarded["nube"] && player_has_raygun ) - player_has_weapon = 1; - - return player_has_weapon; -} - -pers_nube_ammo_hint_string( player, weapon ) -{ - ammo_cost = 0; - - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return false; - - if ( getsubstr( weapon, 0, 11 ) == "rottweil72_" ) - ammo_cost = pers_nube_ammo_cost( player, ammo_cost ); - - if ( !ammo_cost ) - return false; - - self.stub.hint_string = &"ZOMBIE_WEAPONAMMOONLY"; - self sethintstring( self.stub.hint_string, ammo_cost ); - return true; -} - -pers_nube_ammo_cost( player, ammo_cost ) -{ - if ( player hasweapon( "ray_gun_zm" ) ) - ammo_cost = 250; - - if ( player hasweapon( "ray_gun_upgraded_zm" ) ) - ammo_cost = 4500; - - return ammo_cost; -} - -pers_nube_override_ammo_cost( player, weapon, ammo_cost ) -{ - if ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) - return ammo_cost; - - if ( getsubstr( weapon, 0, 11 ) == "rottweil72_" ) - ammo_cost = pers_nube_ammo_cost( player, ammo_cost ); - - return ammo_cost; -} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades_system.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades_system.gsc index 87a7d90..bcf91f5 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades_system.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_pers_upgrades_system.gsc @@ -1,243 +1,255 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm; -#include maps\mp\zombies\_zm_stats; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -pers_register_upgrade( name, upgrade_active_func, stat_name, stat_desired_value, game_end_reset_if_not_achieved ) +pers_register_upgrade( name, upgrade_active_func, stat_name, stat_desired_value, game_end_reset_if_not_achieved ) //checked matches cerberus output { - if ( !isdefined( level.pers_upgrades ) ) - { - level.pers_upgrades = []; - level.pers_upgrades_keys = []; - } - - if ( isdefined( level.pers_upgrades[name] ) ) - { + if ( !isDefined( level.pers_upgrades ) ) + { + level.pers_upgrades = []; + level.pers_upgrades_keys = []; + } + if ( isDefined( level.pers_upgrades[ name ] ) ) + { + /* /# - assert( 0, "A persistent upgrade is already registered for name: " + name ); + assert( 0, "A persistent upgrade is already registered for name: " + name ); #/ - } - - level.pers_upgrades_keys[level.pers_upgrades_keys.size] = name; - level.pers_upgrades[name] = spawnstruct(); - level.pers_upgrades[name].stat_names = []; - level.pers_upgrades[name].stat_desired_values = []; - level.pers_upgrades[name].upgrade_active_func = upgrade_active_func; - level.pers_upgrades[name].game_end_reset_if_not_achieved = game_end_reset_if_not_achieved; - add_pers_upgrade_stat( name, stat_name, stat_desired_value ); + */ + } + level.pers_upgrades_keys[ level.pers_upgrades_keys.size ] = name; + level.pers_upgrades[ name ] = spawnstruct(); + level.pers_upgrades[ name ].stat_names = []; + level.pers_upgrades[ name ].stat_desired_values = []; + level.pers_upgrades[ name ].upgrade_active_func = upgrade_active_func; + level.pers_upgrades[ name ].game_end_reset_if_not_achieved = game_end_reset_if_not_achieved; + add_pers_upgrade_stat( name, stat_name, stat_desired_value ); + /* /# - if ( isdefined( level.devgui_add_ability ) ) - [[ level.devgui_add_ability ]]( name, upgrade_active_func, stat_name, stat_desired_value, game_end_reset_if_not_achieved ); + if ( isDefined( level.devgui_add_ability ) ) + { + [[ level.devgui_add_ability ]]( name, upgrade_active_func, stat_name, stat_desired_value, game_end_reset_if_not_achieved ); #/ + } + */ } -add_pers_upgrade_stat( name, stat_name, stat_desired_value ) +add_pers_upgrade_stat( name, stat_name, stat_desired_value ) //checked matches cerberus output { - if ( !isdefined( level.pers_upgrades[name] ) ) - { + if ( !isDefined( level.pers_upgrades[ name ] ) ) + { + /* /# - assert( 0, name + " - Persistent upgrade is not registered yet." ); + assert( 0, name + " - Persistent upgrade is not registered yet." ); #/ - } - - stats_size = level.pers_upgrades[name].stat_names.size; - level.pers_upgrades[name].stat_names[stats_size] = stat_name; - level.pers_upgrades[name].stat_desired_values[stats_size] = stat_desired_value; + */ + } + stats_size = level.pers_upgrades[ name ].stat_names.size; + level.pers_upgrades[ name ].stat_names[ stats_size ] = stat_name; + level.pers_upgrades[ name ].stat_desired_values[ stats_size ] = stat_desired_value; } -pers_upgrades_monitor() +pers_upgrades_monitor() //checked partially changed to match cerberus output //did not change while loops to for loops because continues are broken in for loops { - if ( !isdefined( level.pers_upgrades ) ) - return; - - if ( !is_classic() ) - return; - - level thread wait_for_game_end(); - - while ( true ) - { - waittillframeend; - players = getplayers(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - { - player = players[player_index]; - - if ( is_player_valid( player ) && isdefined( player.stats_this_frame ) ) - { - if ( !player.stats_this_frame.size && !( isdefined( player.pers_upgrade_force_test ) && player.pers_upgrade_force_test ) ) - continue; - - for ( pers_upgrade_index = 0; pers_upgrade_index < level.pers_upgrades_keys.size; pers_upgrade_index++ ) - { - pers_upgrade = level.pers_upgrades[level.pers_upgrades_keys[pers_upgrade_index]]; - is_stat_updated = player is_any_pers_upgrade_stat_updated( pers_upgrade ); - - if ( is_stat_updated ) - { - should_award = player check_pers_upgrade( pers_upgrade ); - - if ( should_award ) - { - if ( isdefined( player.pers_upgrades_awarded[level.pers_upgrades_keys[pers_upgrade_index]] ) && player.pers_upgrades_awarded[level.pers_upgrades_keys[pers_upgrade_index]] ) - continue; - - player.pers_upgrades_awarded[level.pers_upgrades_keys[pers_upgrade_index]] = 1; - - if ( flag( "initial_blackscreen_passed" ) && !is_true( player.is_hotjoining ) ) - { - type = "upgrade"; - - if ( isdefined( level.snd_pers_upgrade_force_type ) ) - type = level.snd_pers_upgrade_force_type; - - player playsoundtoplayer( "evt_player_upgrade", player ); - - if ( isdefined( level.pers_upgrade_vo_spoken ) && level.pers_upgrade_vo_spoken ) - player delay_thread( 1, maps\mp\zombies\_zm_audio::create_and_play_dialog, "general", type, undefined, level.snd_pers_upgrade_force_variant ); - else - player delay_thread( 1, ::play_vox_to_player, "general", type, level.snd_pers_upgrade_force_variant ); - - if ( isdefined( player.upgrade_fx_origin ) ) - { - fx_org = player.upgrade_fx_origin; - player.upgrade_fx_origin = undefined; - } - else - { - fx_org = player.origin; - v_dir = anglestoforward( player getplayerangles() ); - v_up = anglestoup( player getplayerangles() ); - fx_org = fx_org + v_dir * 30 + v_up * 12; - } - - playfx( level._effect["upgrade_aquired"], fx_org ); - level thread maps\mp\zombies\_zm::disable_end_game_intermission( 1.5 ); - } + if ( !isDefined( level.pers_upgrades ) ) + { + return; + } + if ( !is_classic() ) + { + return; + } + level thread wait_for_game_end(); + while ( 1 ) + { + waittillframeend; + players = getplayers(); + player_index = 0; + while ( player_index < players.size ) + { + player = players[ player_index ]; + if ( is_player_valid( player ) && isDefined( player.stats_this_frame ) ) + { + if ( !player.stats_this_frame.size && !is_true( player.pers_upgrade_force_test ) ) + { + player_index++; + continue; + } + pers_upgrade_index = 0; + while ( pers_upgrade_index < level.pers_upgrades_keys.size ) + { + pers_upgrade = level.pers_upgrades[ level.pers_upgrades_keys[ pers_upgrade_index ] ]; + is_stat_updated = player is_any_pers_upgrade_stat_updated( pers_upgrade ); + if ( is_stat_updated ) + { + should_award = player check_pers_upgrade( pers_upgrade ); + if ( should_award ) + { + if ( is_true( player.pers_upgrades_awarded[ level.pers_upgrades_keys[ pers_upgrade_index ] ] ) ) + { + pers_upgrade_index++; + continue; + } + player.pers_upgrades_awarded[ level.pers_upgrades_keys[ pers_upgrade_index ] ] = 1; + if ( flag( "initial_blackscreen_passed" ) && !is_true( player.is_hotjoining ) ) + { + type = "upgrade"; + if ( isDefined( level.snd_pers_upgrade_force_type ) ) + { + type = level.snd_pers_upgrade_force_type; + } + player playsoundtoplayer( "evt_player_upgrade", player ); + if ( is_true( level.pers_upgrade_vo_spoken ) ) + { + player delay_thread( 1, maps/mp/zombies/_zm_audio::create_and_play_dialog, "general", type, undefined, level.snd_pers_upgrade_force_variant ); + } + else + { + player delay_thread( 1, ::play_vox_to_player, "general", type, level.snd_pers_upgrade_force_variant ); + } + if ( isDefined( player.upgrade_fx_origin ) ) + { + fx_org = player.upgrade_fx_origin; + player.upgrade_fx_origin = undefined; + } + else + { + fx_org = player.origin; + v_dir = anglesToForward( player getplayerangles() ); + v_up = anglesToUp( player getplayerangles() ); + fx_org = ( fx_org + ( v_dir * 30 ) ) + ( v_up * 12 ); + } + playfx( level._effect[ "upgrade_aquired" ], fx_org ); + level thread maps/mp/zombies/_zm::disable_end_game_intermission( 1.5 ); + } + /* /# - player iprintlnbold( "Upgraded!" ); + player iprintlnbold( "Upgraded!" ); #/ - if ( isdefined( pers_upgrade.upgrade_active_func ) ) - player thread [[ pers_upgrade.upgrade_active_func ]](); - - continue; - } - - if ( isdefined( player.pers_upgrades_awarded[level.pers_upgrades_keys[pers_upgrade_index]] ) && player.pers_upgrades_awarded[level.pers_upgrades_keys[pers_upgrade_index]] ) - { - if ( flag( "initial_blackscreen_passed" ) && !is_true( player.is_hotjoining ) ) - player playsoundtoplayer( "evt_player_downgrade", player ); + */ + if ( isDefined( pers_upgrade.upgrade_active_func ) ) + { + player thread [[ pers_upgrade.upgrade_active_func ]](); + } + pers_upgrade_index++; + continue; + } + if ( is_true( player.pers_upgrades_awarded[ level.pers_upgrades_keys[ pers_upgrade_index ] ] ) ) + { + if ( flag( "initial_blackscreen_passed" ) && !is_true( player.is_hotjoining ) ) + { + player playsoundtoplayer( "evt_player_downgrade", player ); + } + /* /# - player iprintlnbold( "Downgraded!" ); + player iprintlnbold( "Downgraded!" ); #/ - } - - player.pers_upgrades_awarded[level.pers_upgrades_keys[pers_upgrade_index]] = 0; - } - } - - player.pers_upgrade_force_test = 0; - player.stats_this_frame = []; - } - } - - wait 0.05; - } + */ + } + player.pers_upgrades_awarded[ level.pers_upgrades_keys[ pers_upgrade_index ] ] = 0; + } + pers_upgrade_index++; + } + player.pers_upgrade_force_test = 0; + player.stats_this_frame = []; + } + player_index++; + } + wait 0.05; + } } -wait_for_game_end() +wait_for_game_end() //checked changed to match cerberus output { - if ( !is_classic() ) - return; - - level waittill( "end_game" ); - - players = getplayers(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - { - player = players[player_index]; - - for ( index = 0; index < level.pers_upgrades_keys.size; index++ ) - { - str_name = level.pers_upgrades_keys[index]; - game_end_reset_if_not_achieved = level.pers_upgrades[str_name].game_end_reset_if_not_achieved; - - if ( isdefined( game_end_reset_if_not_achieved ) && game_end_reset_if_not_achieved == 1 ) - { - if ( !( isdefined( player.pers_upgrades_awarded[str_name] ) && player.pers_upgrades_awarded[str_name] ) ) - { - for ( stat_index = 0; stat_index < level.pers_upgrades[str_name].stat_names.size; stat_index++ ) - player maps\mp\zombies\_zm_stats::zero_client_stat( level.pers_upgrades[str_name].stat_names[stat_index], 0 ); - } - } - } - } + if ( !is_classic() ) + { + return; + } + level waittill( "end_game" ); + players = getplayers(); + for ( player_index = 0; player_index < players.size; player_index++ ) + { + player = players[ player_index ]; + for ( index = 0; index < level.pers_upgrades_keys.size; index++ ) + { + str_name = level.pers_upgrades_keys[ index ]; + game_end_reset_if_not_achieved = level.pers_upgrades[ str_name ].game_end_reset_if_not_achieved; + if ( isDefined( game_end_reset_if_not_achieved ) && game_end_reset_if_not_achieved == 1 ) + { + if ( !is_true( player.pers_upgrades_awarded[ str_name ] ) ) + { + for ( stat_index = 0; stat_index < level.pers_upgrades[ str_name ].stat_names.size; stat_index++ ) + { + player maps/mp/zombies/_zm_stats::zero_client_stat( level.pers_upgrades[ str_name ].stat_names[ stat_index ], 0 ); + } + } + } + } + } } -check_pers_upgrade( pers_upgrade ) +check_pers_upgrade( pers_upgrade ) //checked changed to match cerberus output { - should_award = 1; - - for ( i = 0; i < pers_upgrade.stat_names.size; i++ ) - { - stat_name = pers_upgrade.stat_names[i]; - should_award = self check_pers_upgrade_stat( stat_name, pers_upgrade.stat_desired_values[i] ); - - if ( !should_award ) - break; - } - - return should_award; + should_award = 1; + for ( i = 0; i < pers_upgrade.stat_names.size; i++ ) + { + stat_name = pers_upgrade.stat_names[ i ]; + should_award = self check_pers_upgrade_stat( stat_name, pers_upgrade.stat_desired_values[ i ] ); + if ( !should_award ) + { + break; + } + } + return should_award; } -is_any_pers_upgrade_stat_updated( pers_upgrade ) +is_any_pers_upgrade_stat_updated( pers_upgrade ) //checked changed to match cerberus output { - if ( isdefined( self.pers_upgrade_force_test ) && self.pers_upgrade_force_test ) - return 1; - - result = 0; - - for ( i = 0; i < pers_upgrade.stat_names.size; i++ ) - { - stat_name = pers_upgrade.stat_names[i]; - - if ( isdefined( self.stats_this_frame[stat_name] ) ) - { - result = 1; - break; - } - } - - return result; + if ( is_true( self.pers_upgrade_force_test ) ) + { + return 1; + } + result = 0; + for ( i = 0; i < pers_upgrade.stat_names.size; i++ ) + { + stat_name = pers_upgrade.stat_names[ i ]; + if ( isDefined( self.stats_this_frame[ stat_name ] ) ) + { + result = 1; + break; + } + } + return result; } -check_pers_upgrade_stat( stat_name, stat_desired_value ) +check_pers_upgrade_stat( stat_name, stat_desired_value ) //checked matches cerberus output { - should_award = 1; - current_stat_value = self maps\mp\zombies\_zm_stats::get_global_stat( stat_name ); - - if ( current_stat_value < stat_desired_value ) - should_award = 0; - - return should_award; + should_award = 1; + current_stat_value = self maps/mp/zombies/_zm_stats::get_global_stat( stat_name ); + if ( current_stat_value < stat_desired_value ) + { + should_award = 0; + } + return should_award; } -round_end() +round_end() //checked matches cerberus output { - if ( !is_classic() ) - return; - - self notify( "pers_stats_end_of_round" ); - - if ( isdefined( self.pers["pers_max_round_reached"] ) ) - { - if ( level.round_number > self.pers["pers_max_round_reached"] ) - self maps\mp\zombies\_zm_stats::set_client_stat( "pers_max_round_reached", level.round_number, 0 ); - } + if ( !is_classic() ) + { + return; + } + self notify( "pers_stats_end_of_round" ); + if ( isDefined( self.pers[ "pers_max_round_reached" ] ) ) + { + if ( level.round_number > self.pers[ "pers_max_round_reached" ] ) + { + self maps/mp/zombies/_zm_stats::set_client_stat( "pers_max_round_reached", level.round_number, 0 ); + } + } } + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_playerhealth.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_playerhealth.gsc index 6cc9b15..4a15427 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_playerhealth.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_playerhealth.gsc @@ -1,573 +1,582 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_perks; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - if ( !isdefined( level.script ) ) - level.script = tolower( getdvar( "mapname" ) ); - - precacheshader( "overlay_low_health" ); - level.global_damage_func_ads = ::empty_kill_func; - level.global_damage_func = ::empty_kill_func; - level.difficultytype[0] = "easy"; - level.difficultytype[1] = "normal"; - level.difficultytype[2] = "hardened"; - level.difficultytype[3] = "veteran"; - level.difficultystring["easy"] = &"GAMESKILL_EASY"; - level.difficultystring["normal"] = &"GAMESKILL_NORMAL"; - level.difficultystring["hardened"] = &"GAMESKILL_HARDENED"; - level.difficultystring["veteran"] = &"GAMESKILL_VETERAN"; + if ( !isDefined( level.script ) ) + { + level.script = tolower( getDvar( "mapname" ) ); + } + precacheshader( "overlay_low_health" ); + level.global_damage_func_ads = ::empty_kill_func; + level.global_damage_func = ::empty_kill_func; + level.difficultytype[ 0 ] = "easy"; + level.difficultytype[ 1 ] = "normal"; + level.difficultytype[ 2 ] = "hardened"; + level.difficultytype[ 3 ] = "veteran"; + level.difficultystring[ "easy" ] = &"GAMESKILL_EASY"; + level.difficultystring[ "normal" ] = &"GAMESKILL_NORMAL"; + level.difficultystring[ "hardened" ] = &"GAMESKILL_HARDENED"; + level.difficultystring[ "veteran" ] = &"GAMESKILL_VETERAN"; + /* /# - thread playerhealthdebug(); + thread playerhealthdebug(); #/ - level.gameskill = 1; - - switch ( level.gameskill ) - { - case "0": - setdvar( "currentDifficulty", "easy" ); - break; - case "1": - setdvar( "currentDifficulty", "normal" ); - break; - case "2": - setdvar( "currentDifficulty", "hardened" ); - break; - case "3": - setdvar( "currentDifficulty", "veteran" ); - break; - } - - logstring( "difficulty: " + level.gameskill ); - level.player_deathinvulnerabletime = 1700; - level.longregentime = 5000; - level.healthoverlaycutoff = 0.2; - level.invultime_preshield = 0.35; - level.invultime_onshield = 0.5; - level.invultime_postshield = 0.3; - level.playerhealth_regularregendelay = 2400; - level.worthydamageratio = 0.1; - setdvar( "player_meleeDamageMultiplier", 0.4 ); - onplayerconnect_callback( ::onplayerconnect ); + */ + level.gameskill = 1; + switch( level.gameskill ) + { + case 0: + setdvar( "currentDifficulty", "easy" ); + break; + case 1: + setdvar( "currentDifficulty", "normal" ); + break; + case 2: + setdvar( "currentDifficulty", "hardened" ); + break; + case 3: + setdvar( "currentDifficulty", "veteran" ); + break; + } + logstring( "difficulty: " + level.gameskill ); + level.player_deathinvulnerabletime = 1700; + level.longregentime = 5000; + level.healthoverlaycutoff = 0.2; + level.invultime_preshield = 0.35; + level.invultime_onshield = 0.5; + level.invultime_postshield = 0.3; + level.playerhealth_regularregendelay = 2400; + level.worthydamageratio = 0.1; + setdvar( "player_meleeDamageMultiplier", 0.4 ); + onplayerconnect_callback( ::onplayerconnect ); } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - self thread onplayerspawned(); + self thread onplayerspawned(); } -onplayerspawned() +onplayerspawned() //checked changed to match cerberus output { - for (;;) - { - self waittill( "spawned_player" ); - - self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); - - if ( level.createfx_enabled ) - continue; - - self notify( "noHealthOverlay" ); - self thread playerhealthregen(); - } + for ( ;; ) + { + self waittill( "spawned_player" ); + self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); + if ( level.createfx_enabled ) + { + continue; + } + self notify( "noHealthOverlay" ); + self thread playerhealthregen(); + } } -playerhurtcheck() +playerhurtcheck() //checked changed to match cerberus output { - self endon( "noHealthOverlay" ); - self.hurtagain = 0; - - for (;;) - { - self waittill( "damage", amount, attacker, dir, point, mod ); - - if ( isdefined( attacker ) && isplayer( attacker ) && attacker.team == self.team ) - continue; - - self.hurtagain = 1; - self.damagepoint = point; - self.damageattacker = attacker; - } + self endon( "noHealthOverlay" ); + self.hurtagain = 0; + for ( ;; ) + { + self waittill( "damage", amount, attacker, dir, point, mod ); + if ( isDefined( attacker ) && isplayer( attacker ) && attacker.team == self.team ) + { + continue; + } + self.hurtagain = 1; + self.damagepoint = point; + self.damageattacker = attacker; + } } -playerhealthregen() +playerhealthregen() //checked changed to match cerberus output { - self notify( "playerHealthRegen" ); - self endon( "playerHealthRegen" ); - self endon( "death" ); - self endon( "disconnect" ); - - if ( !isdefined( self.flag ) ) - { - self.flag = []; - self.flags_lock = []; - } - - if ( !isdefined( self.flag["player_has_red_flashing_overlay"] ) ) - { - self player_flag_init( "player_has_red_flashing_overlay" ); - self player_flag_init( "player_is_invulnerable" ); - } - - self player_flag_clear( "player_has_red_flashing_overlay" ); - self player_flag_clear( "player_is_invulnerable" ); - self thread healthoverlay(); - oldratio = 1; - health_add = 0; - regenrate = 0.1; - veryhurt = 0; - playerjustgotredflashing = 0; - invultime = 0; - hurttime = 0; - newhealth = 0; - lastinvulratio = 1; - self thread playerhurtcheck(); - - if ( !isdefined( self.veryhurt ) ) - self.veryhurt = 0; - - self.bolthit = 0; - - if ( getdvar( _hash_FCECE67E ) == "" ) - setdvar( "scr_playerInvulTimeScale", 1.0 ); - - playerinvultimescale = getdvarfloat( _hash_FCECE67E ); - - for (;;) - { - wait 0.05; - waittillframeend; - - if ( self.health == self.maxhealth ) - { - if ( self player_flag( "player_has_red_flashing_overlay" ) ) - player_flag_clear( "player_has_red_flashing_overlay" ); - - lastinvulratio = 1; - playerjustgotredflashing = 0; - veryhurt = 0; - continue; - } - - if ( self.health <= 0 ) - { + self notify( "playerHealthRegen" ); + self endon( "playerHealthRegen" ); + self endon( "death" ); + self endon( "disconnect" ); + if ( !isDefined( self.flag ) ) + { + self.flag = []; + self.flags_lock = []; + } + if ( !isDefined( self.flag[ "player_has_red_flashing_overlay" ] ) ) + { + self player_flag_init( "player_has_red_flashing_overlay" ); + self player_flag_init( "player_is_invulnerable" ); + } + self player_flag_clear( "player_has_red_flashing_overlay" ); + self player_flag_clear( "player_is_invulnerable" ); + self thread healthoverlay(); + oldratio = 1; + health_add = 0; + regenrate = 0.1; + veryhurt = 0; + playerjustgotredflashing = 0; + invultime = 0; + hurttime = 0; + newhealth = 0; + lastinvulratio = 1; + self thread playerhurtcheck(); + if ( !isDefined( self.veryhurt ) ) + { + self.veryhurt = 0; + } + self.bolthit = 0; + if ( getDvar( "scr_playerInvulTimeScale" ) == "" ) + { + setdvar( "scr_playerInvulTimeScale", 1 ); + } + playerinvultimescale = getDvarFloat( "scr_playerInvulTimeScale" ); + for ( ;; ) + { + wait 0.05; + waittillframeend; + if ( self.health == self.maxhealth ) + { + if ( self player_flag( "player_has_red_flashing_overlay" ) ) + { + player_flag_clear( "player_has_red_flashing_overlay" ); + } + lastinvulratio = 1; + playerjustgotredflashing = 0; + veryhurt = 0; + continue; + } + if ( self.health <= 0 ) + { + /* /# - showhitlog(); + showhitlog(); #/ - return; - } - - wasveryhurt = veryhurt; - health_ratio = self.health / self.maxhealth; - - if ( health_ratio <= level.healthoverlaycutoff ) - { - veryhurt = 1; - - if ( !wasveryhurt ) - { - hurttime = gettime(); - self startfadingblur( 3.6, 2 ); - self player_flag_set( "player_has_red_flashing_overlay" ); - playerjustgotredflashing = 1; - } - } - - if ( self.hurtagain ) - { - hurttime = gettime(); - self.hurtagain = 0; - } - - if ( health_ratio >= oldratio ) - { - if ( gettime() - hurttime < level.playerhealth_regularregendelay ) - continue; - - if ( veryhurt ) - { - self.veryhurt = 1; - newhealth = health_ratio; - - if ( gettime() > hurttime + level.longregentime ) - newhealth += regenrate; - } - else - { - newhealth = 1; - self.veryhurt = 0; - } - - if ( newhealth > 1.0 ) - newhealth = 1.0; - - if ( newhealth <= 0 ) - return; + */ + return; + } + wasveryhurt = veryhurt; + health_ratio = self.health / self.maxhealth; + if ( health_ratio <= level.healthoverlaycutoff ) + { + veryhurt = 1; + if ( !wasveryhurt ) + { + hurttime = getTime(); + self startfadingblur( 3.6, 2 ); + self player_flag_set( "player_has_red_flashing_overlay" ); + playerjustgotredflashing = 1; + } + } + if ( self.hurtagain ) + { + hurttime = getTime(); + self.hurtagain = 0; + } + if ( health_ratio >= oldratio ) + { + if ( getTime() - hurttime < level.playerhealth_regularregendelay ) + { + continue; + } + if ( veryhurt ) + { + self.veryhurt = 1; + newhealth = health_ratio; + if ( getTime() > ( hurttime + level.longregentime ) ) + { + newhealth += regenrate; + } + } + else + { + newhealth = 1; + self.veryhurt = 0; + } + if ( newhealth > 1 ) + { + newhealth = 1; + } + if ( newhealth <= 0 ) + { + return; + } + /* /# - if ( newhealth > health_ratio ) - logregen( newhealth ); + if ( newhealth > health_ratio ) + { + logregen( newhealth ); #/ - self setnormalhealth( newhealth ); - oldratio = self.health / self.maxhealth; - continue; - } - - invulworthyhealthdrop = lastinvulratio - health_ratio > level.worthydamageratio; - - if ( self.health <= 1 ) - { - self setnormalhealth( 2 / self.maxhealth ); - invulworthyhealthdrop = 1; + } + */ + self setnormalhealth( newhealth ); + oldratio = self.health / self.maxhealth; + continue; + } + invulworthyhealthdrop = lastinvulratio - health_ratio > level.worthydamageratio; + if ( self.health <= 1 ) + { + self setnormalhealth( 2 / self.maxhealth ); + invulworthyhealthdrop = 1; + /* /# - if ( !isdefined( level.player_deathinvulnerabletimeout ) ) - level.player_deathinvulnerabletimeout = 0; - - if ( level.player_deathinvulnerabletimeout < gettime() ) - level.player_deathinvulnerabletimeout = gettime() + getdvarint( _hash_4E44E32D ); + if ( !isDefined( level.player_deathinvulnerabletimeout ) ) + { + level.player_deathinvulnerabletimeout = 0; + } + if ( level.player_deathinvulnerabletimeout < getTime() ) + { + level.player_deathinvulnerabletimeout = getTime() + getDvarInt( "player_deathInvulnerableTime" ); #/ - } - - oldratio = self.health / self.maxhealth; - level notify( "hit_again" ); - health_add = 0; - hurttime = gettime(); - self startfadingblur( 3, 0.8 ); - - if ( !invulworthyhealthdrop || playerinvultimescale <= 0.0 ) - { + } + */ + } + oldratio = self.health / self.maxhealth; + level notify( "hit_again" ); + health_add = 0; + hurttime = getTime(); + self startfadingblur( 3, 0.8 ); + if ( !invulworthyhealthdrop || playerinvultimescale <= 0 ) + { + /* /# - loghit( self.health, 0 ); + loghit( self.health, 0 ); #/ - continue; - } - - if ( self player_flag( "player_is_invulnerable" ) ) - continue; - - self player_flag_set( "player_is_invulnerable" ); - level notify( "player_becoming_invulnerable" ); - - if ( playerjustgotredflashing ) - { - invultime = level.invultime_onshield; - playerjustgotredflashing = 0; - } - else if ( veryhurt ) - invultime = level.invultime_postshield; - else - invultime = level.invultime_preshield; - - invultime *= playerinvultimescale; + */ + continue; + } + if ( self player_flag( "player_is_invulnerable" ) ) + { + continue; + } + self player_flag_set( "player_is_invulnerable" ); + level notify( "player_becoming_invulnerable" ); + if ( playerjustgotredflashing ) + { + invultime = level.invultime_onshield; + playerjustgotredflashing = 0; + } + else if ( veryhurt ) + { + invultime = level.invultime_postshield; + } + else + { + invultime = level.invultime_preshield; + } + invultime *= playerinvultimescale; + /* /# - loghit( self.health, invultime ); + loghit( self.health, invultime ); #/ - lastinvulratio = self.health / self.maxhealth; - self thread playerinvul( invultime ); - } + */ + lastinvulratio = self.health / self.maxhealth; + self thread playerinvul( invultime ); + } } -playerinvul( timer ) +playerinvul( timer ) //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - - if ( timer > 0 ) - { + self endon( "death" ); + self endon( "disconnect" ); + if ( timer > 0 ) + { + /* /# - level.playerinvultimeend = gettime() + timer * 1000; -#/ - wait( timer ); - } - - self player_flag_clear( "player_is_invulnerable" ); + level.playerinvultimeend = getTime() + ( timer * 1000 ); +#/ + */ + wait timer; + } + self player_flag_clear( "player_is_invulnerable" ); } -healthoverlay() +healthoverlay() //checked changed to match cerberus output { - self endon( "disconnect" ); - self endon( "noHealthOverlay" ); - - if ( !isdefined( self._health_overlay ) ) - { - self._health_overlay = newclienthudelem( self ); - self._health_overlay.x = 0; - self._health_overlay.y = 0; - self._health_overlay setshader( "overlay_low_health", 640, 480 ); - self._health_overlay.alignx = "left"; - self._health_overlay.aligny = "top"; - self._health_overlay.horzalign = "fullscreen"; - self._health_overlay.vertalign = "fullscreen"; - self._health_overlay.alpha = 0; - } - - overlay = self._health_overlay; - self thread healthoverlay_remove( overlay ); - self thread watchhideredflashingoverlay( overlay ); - pulsetime = 0.8; - - for (;;) - { - if ( overlay.alpha > 0 ) - overlay fadeovertime( 0.5 ); - - overlay.alpha = 0; - self player_flag_wait( "player_has_red_flashing_overlay" ); - self redflashingoverlay( overlay ); - } + self endon( "disconnect" ); + self endon( "noHealthOverlay" ); + if ( !isDefined( self._health_overlay ) ) + { + self._health_overlay = newclienthudelem( self ); + self._health_overlay.x = 0; + self._health_overlay.y = 0; + self._health_overlay setshader( "overlay_low_health", 640, 480 ); + self._health_overlay.alignx = "left"; + self._health_overlay.aligny = "top"; + self._health_overlay.horzalign = "fullscreen"; + self._health_overlay.vertalign = "fullscreen"; + self._health_overlay.alpha = 0; + } + overlay = self._health_overlay; + self thread healthoverlay_remove( overlay ); + self thread watchhideredflashingoverlay( overlay ); + pulsetime = 0.8; + while ( overlay.alpha > 0 ) + { + overlay fadeovertime( 0.5 ); + overlay.alpha = 0; + self player_flag_wait( "player_has_red_flashing_overlay" ); + self redflashingoverlay( overlay ); + } } -fadefunc( overlay, severity, mult, hud_scaleonly ) +fadefunc( overlay, severity, mult, hud_scaleonly ) //checkec matches cerberus output { - pulsetime = 0.8; - scalemin = 0.5; - fadeintime = pulsetime * 0.1; - stayfulltime = pulsetime * ( 0.1 + severity * 0.2 ); - fadeouthalftime = pulsetime * ( 0.1 + severity * 0.1 ); - fadeoutfulltime = pulsetime * 0.3; - remainingtime = pulsetime - fadeintime - stayfulltime - fadeouthalftime - fadeoutfulltime; + pulsetime = 0.8; + scalemin = 0.5; + fadeintime = pulsetime * 0.1; + stayfulltime = pulsetime * ( 0.1 + severity * 0.2 ); + fadeouthalftime = pulsetime * ( 0.1 + severity * 0.1 ); + fadeoutfulltime = pulsetime * 0.3; + remainingtime = pulsetime - fadeintime - stayfulltime - fadeouthalftime - fadeoutfulltime; + /* /# - assert( remainingtime >= -0.001 ); + assert( remainingtime >= -0.001 ); #/ - if ( remainingtime < 0 ) - remainingtime = 0; - - halfalpha = 0.8 + severity * 0.1; - leastalpha = 0.5 + severity * 0.3; - overlay fadeovertime( fadeintime ); - overlay.alpha = mult * 1.0; - wait( fadeintime + stayfulltime ); - overlay fadeovertime( fadeouthalftime ); - overlay.alpha = mult * halfalpha; - wait( fadeouthalftime ); - overlay fadeovertime( fadeoutfulltime ); - overlay.alpha = mult * leastalpha; - wait( fadeoutfulltime ); - wait( remainingtime ); + */ + if ( remainingtime < 0 ) + { + remainingtime = 0; + } + halfalpha = 0.8 + severity * 0.1; + leastalpha = 0.5 + severity * 0.3; + overlay fadeovertime( fadeintime ); + overlay.alpha = mult * 1; + wait ( fadeintime + stayfulltime ); + overlay fadeovertime( fadeouthalftime ); + overlay.alpha = mult * halfalpha; + wait fadeouthalftime; + overlay fadeovertime( fadeoutfulltime ); + overlay.alpha = mult * leastalpha; + wait fadeoutfulltime; + wait remainingtime; } -watchhideredflashingoverlay( overlay ) +watchhideredflashingoverlay( overlay ) //checked matches cerberus output { - self endon( "death_or_disconnect" ); - - while ( isdefined( overlay ) ) - { - self waittill( "clear_red_flashing_overlay" ); - - self player_flag_clear( "player_has_red_flashing_overlay" ); - overlay fadeovertime( 0.05 ); - overlay.alpha = 0; - setclientsysstate( "levelNotify", "rfo3", self ); - self notify( "hit_again" ); - } + self endon( "death_or_disconnect" ); + while ( isDefined( overlay ) ) + { + self waittill( "clear_red_flashing_overlay" ); + self player_flag_clear( "player_has_red_flashing_overlay" ); + overlay fadeovertime( 0.05 ); + overlay.alpha = 0; + setclientsysstate( "levelNotify", "rfo3", self ); + self notify( "hit_again" ); + } } -redflashingoverlay( overlay ) +redflashingoverlay( overlay ) //checked matches cerberus output { - self endon( "hit_again" ); - self endon( "damage" ); - self endon( "death" ); - self endon( "disconnect" ); - self endon( "clear_red_flashing_overlay" ); - self.stopflashingbadlytime = gettime() + level.longregentime; - - if ( !( isdefined( self.is_in_process_of_zombify ) && self.is_in_process_of_zombify ) && !( isdefined( self.is_zombie ) && self.is_zombie ) ) - { - fadefunc( overlay, 1, 1, 0 ); - - while ( gettime() < self.stopflashingbadlytime && isalive( self ) && ( !( isdefined( self.is_in_process_of_zombify ) && self.is_in_process_of_zombify ) && !( isdefined( self.is_zombie ) && self.is_zombie ) ) ) - fadefunc( overlay, 0.9, 1, 0 ); - - if ( !( isdefined( self.is_in_process_of_zombify ) && self.is_in_process_of_zombify ) && !( isdefined( self.is_zombie ) && self.is_zombie ) ) - { - if ( isalive( self ) ) - fadefunc( overlay, 0.65, 0.8, 0 ); - - fadefunc( overlay, 0, 0.6, 1 ); - } - } - - overlay fadeovertime( 0.5 ); - overlay.alpha = 0; - self player_flag_clear( "player_has_red_flashing_overlay" ); - setclientsysstate( "levelNotify", "rfo3", self ); - wait 0.5; - self notify( "hit_again" ); + self endon( "hit_again" ); + self endon( "damage" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "clear_red_flashing_overlay" ); + self.stopflashingbadlytime = getTime() + level.longregentime; + if ( !is_true( self.is_in_process_of_zombify ) && !is_true( self.is_zombie ) ) + { + fadefunc( overlay, 1, 1, 0 ); + while ( getTime() < self.stopflashingbadlytime && isalive( self ) && !is_true( self.is_in_process_of_zombify ) && !is_true( self.is_zombie ) ) + { + fadefunc( overlay, 0.9, 1, 0 ); + } + if ( !is_true( self.is_in_process_of_zombify ) && !is_true( self.is_zombie ) ) + { + if ( isalive( self ) ) + { + fadefunc( overlay, 0.65, 0.8, 0 ); + } + fadefunc( overlay, 0, 0.6, 1 ); + } + } + overlay fadeovertime( 0.5 ); + overlay.alpha = 0; + self player_flag_clear( "player_has_red_flashing_overlay" ); + setclientsysstate( "levelNotify", "rfo3", self ); + wait 0.5; + self notify( "hit_again" ); } -healthoverlay_remove( overlay ) +healthoverlay_remove( overlay ) //checked matches cerberus output { - self endon( "disconnect" ); - self waittill_any( "noHealthOverlay", "death" ); - overlay fadeovertime( 3.5 ); - overlay.alpha = 0; + self endon( "disconnect" ); + self waittill_any( "noHealthOverlay", "death" ); + overlay fadeovertime( 3.5 ); + overlay.alpha = 0; } -empty_kill_func( type, loc, point, attacker, amount ) +empty_kill_func( type, loc, point, attacker, amount ) //checked matches cerberus output { - } -loghit( newhealth, invultime ) +loghit( newhealth, invultime ) //checked matches cerberus output { + /* /# - #/ + */ } -logregen( newhealth ) +logregen( newhealth ) //checked matches cerberus output { + /* /# - #/ + */ } -showhitlog() +showhitlog() //checked matches cerberus output { + /* /# - #/ + */ } -playerhealthdebug() +playerhealthdebug() //checked changed to match cerberus output { + /* /# - if ( getdvar( "scr_health_debug" ) == "" ) - setdvar( "scr_health_debug", "0" ); - - waittillframeend; - - while ( true ) - { - while ( true ) - { - if ( getdvar( "scr_health_debug" ) != "0" ) - break; - - wait 0.5; - } - - thread printhealthdebug(); - - while ( true ) - { - if ( getdvar( "scr_health_debug" ) == "0" ) - break; - - wait 0.5; - } - - level notify( "stop_printing_grenade_timers" ); - destroyhealthdebug(); - } + if ( getDvar( "scr_health_debug" ) == "" ) + { + setdvar( "scr_health_debug", "0" ); + } + waittillframeend; + while ( 1 ) + { + while ( 1 ) + { + if ( getDvar( "scr_health_debug" ) != "0" ) + { + break; + } + wait 0.5; + } + thread printhealthdebug(); + while ( 1 ) + { + if ( getDvar( "scr_health_debug" ) == "0" ) + { + break; + } + wait 0.5; + } + level notify( "stop_printing_grenade_timers" ); + destroyhealthdebug(); #/ + } + */ } -printhealthdebug() +printhealthdebug() //checked changed to match cerberus output { + /* /# - level notify( "stop_printing_health_bars" ); - level endon( "stop_printing_health_bars" ); - x = 40; - y = 40; - level.healthbarhudelems = []; - level.healthbarkeys[0] = "Health"; - level.healthbarkeys[1] = "No Hit Time"; - level.healthbarkeys[2] = "No Die Time"; - - if ( !isdefined( level.playerinvultimeend ) ) - level.playerinvultimeend = 0; - - if ( !isdefined( level.player_deathinvulnerabletimeout ) ) - level.player_deathinvulnerabletimeout = 0; - - for ( i = 0; i < level.healthbarkeys.size; i++ ) - { - key = level.healthbarkeys[i]; - textelem = newhudelem(); - textelem.x = x; - textelem.y = y; - textelem.alignx = "left"; - textelem.aligny = "top"; - textelem.horzalign = "fullscreen"; - textelem.vertalign = "fullscreen"; - textelem settext( key ); - bgbar = newhudelem(); - bgbar.x = x + 79; - bgbar.y = y + 1; - bgbar.alignx = "left"; - bgbar.aligny = "top"; - bgbar.horzalign = "fullscreen"; - bgbar.vertalign = "fullscreen"; - bgbar.maxwidth = 3; - bgbar setshader( "white", bgbar.maxwidth, 10 ); - bgbar.color = vectorscale( ( 1, 1, 1 ), 0.5 ); - bar = newhudelem(); - bar.x = x + 80; - bar.y = y + 2; - bar.alignx = "left"; - bar.aligny = "top"; - bar.horzalign = "fullscreen"; - bar.vertalign = "fullscreen"; - bar setshader( "black", 1, 8 ); - textelem.bar = bar; - textelem.bgbar = bgbar; - textelem.key = key; - y += 10; - level.healthbarhudelems[key] = textelem; - } - - flag_wait( "start_zombie_round_logic" ); - - while ( true ) - { - wait 0.05; - players = get_players(); - - for ( i = 0; i < level.healthbarkeys.size && players.size > 0; i++ ) - { - key = level.healthbarkeys[i]; - player = players[0]; - width = 0; - - if ( i == 0 ) - width = player.health / player.maxhealth * 300; - else if ( i == 1 ) - width = ( level.playerinvultimeend - gettime() ) / 1000 * 40; - else if ( i == 2 ) - width = ( level.player_deathinvulnerabletimeout - gettime() ) / 1000 * 40; - - width = int( max( width, 1 ) ); - width = int( min( width, 300 ) ); - bar = level.healthbarhudelems[key].bar; - bar setshader( "black", width, 8 ); - bgbar = level.healthbarhudelems[key].bgbar; - - if ( width + 2 > bgbar.maxwidth ) - { - bgbar.maxwidth = width + 2; - bgbar setshader( "white", bgbar.maxwidth, 10 ); - bgbar.color = vectorscale( ( 1, 1, 1 ), 0.5 ); - } - } - } + level notify( "stop_printing_health_bars" ); + level endon( "stop_printing_health_bars" ); + x = 40; + y = 40; + level.healthbarhudelems = []; + level.healthbarkeys[ 0 ] = "Health"; + level.healthbarkeys[ 1 ] = "No Hit Time"; + level.healthbarkeys[ 2 ] = "No Die Time"; + if ( !isDefined( level.playerinvultimeend ) ) + { + level.playerinvultimeend = 0; + } + if ( !isDefined( level.player_deathinvulnerabletimeout ) ) + { + level.player_deathinvulnerabletimeout = 0; + } + for ( i = 0; i < level.healthbarkeys.size; i++ ) + { + key = level.healthbarkeys[ i ]; + textelem = newhudelem(); + textelem.x = x; + textelem.y = y; + textelem.alignx = "left"; + textelem.aligny = "top"; + textelem.horzalign = "fullscreen"; + textelem.vertalign = "fullscreen"; + textelem settext( key ); + bgbar = newhudelem(); + bgbar.x = x + 79; + bgbar.y = y + 1; + bgbar.alignx = "left"; + bgbar.aligny = "top"; + bgbar.horzalign = "fullscreen"; + bgbar.vertalign = "fullscreen"; + bgbar.maxwidth = 3; + bgbar setshader( "white", bgbar.maxwidth, 10 ); + bgbar.color = vectorScale( ( 1, 1, 1 ), 0.5 ); + bar = newhudelem(); + bar.x = x + 80; + bar.y = y + 2; + bar.alignx = "left"; + bar.aligny = "top"; + bar.horzalign = "fullscreen"; + bar.vertalign = "fullscreen"; + bar setshader( "black", 1, 8 ); + textelem.bar = bar; + textelem.bgbar = bgbar; + textelem.key = key; + y += 10; + level.healthbarhudelems[ key ] = textelem; + } + flag_wait( "start_zombie_round_logic" ); + while ( 1 ) + { + wait 0.05; + players = get_players(); + for ( i = 0; i < level.healthbarkeys.size && players.size > 0; i++ ) + { + key = level.healthbarkeys[ i ]; + player = players[ 0 ]; + width = 0; + if ( i == 0 ) + { + width = ( player.health / player.maxhealth ) * 300; + } + else if ( i == 1 ) + { + width = ( ( level.playerinvultimeend - getTime() ) / 1000 ) * 40; + } + else if ( i == 2 ) + { + width = ( ( level.player_deathinvulnerabletimeout - getTime() ) / 1000 ) * 40; + } + width = int( max( width, 1 ) ); + width = int( min( width, 300 ) ); + bar = level.healthbarhudelems[ key ].bar; + bar setshader( "black", width, 8 ); + bgbar = level.healthbarhudelems[ key ].bgbar; + if ( ( width + 2 ) > bgbar.maxwidth ) + { + bgbar.maxwidth = width + 2; + bgbar setshader( "white", bgbar.maxwidth, 10 ); + bgbar.color = vectorScale( ( 1, 1, 1 ), 0.5 ); + } + } #/ + } + */ } -destroyhealthdebug() +destroyhealthdebug() //checked changed to match cerberus output { + /* /# - if ( !isdefined( level.healthbarhudelems ) ) - return; - - for ( i = 0; i < level.healthbarkeys.size; i++ ) - { - level.healthbarhudelems[level.healthbarkeys[i]].bgbar destroy(); - level.healthbarhudelems[level.healthbarkeys[i]].bar destroy(); - level.healthbarhudelems[level.healthbarkeys[i]] destroy(); - } + if ( !isDefined( level.healthbarhudelems ) ) + { + return; + } + while ( i = 0; i < level.healthbarkeys.size; i++ ) + { + level.healthbarhudelems[ level.healthbarkeys[ i ] ].bgbar destroy(); + level.healthbarhudelems[ level.healthbarkeys[ i ] ].bar destroy(); + level.healthbarhudelems[ level.healthbarkeys[ i ] ] destroy(); #/ + } + */ } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_power.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_power.gsc index ad8387b..b40f5f2 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_power.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_power.gsc @@ -1,679 +1,716 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\_demo; -#include maps\mp\zombies\_zm_ai_basic; +#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() +init() //checked matches cerberus output { - if ( !isdefined( level.powered_items ) ) - level.powered_items = []; - - if ( !isdefined( level.local_power ) ) - level.local_power = []; - - thread standard_powered_items(); + if ( !isDefined( level.powered_items ) ) + { + level.powered_items = []; + } + if ( !isDefined( level.local_power ) ) + { + level.local_power = []; + } + thread standard_powered_items(); + /* /# - thread debug_powered_items(); + thread debug_powered_items(); #/ + */ } -debug_powered_items() +debug_powered_items() //checked changed to match cerberus output { +/* /# - while ( true ) - { - if ( getdvarint( _hash_EB512CB7 ) ) - { - if ( isdefined( level.local_power ) ) - { - foreach ( localpower in level.local_power ) - circle( localpower.origin, localpower.radius, ( 1, 0, 0 ), 0, 1, 1 ); - } - } - - wait 0.05; - } + while ( 1 ) + { + if ( getDvarInt( #"EB512CB7" ) ) + { + if ( isDefined( level.local_power ) ) + { + foreach(localpower in level.local_power) + { + circle( localpower.origin, localpower.radius, ( 1, 0, 0 ), 0, 1, 1 ); + } + } + } + wait 0.05; #/ + } + */ } -watch_global_power() +watch_global_power() //checked matches cerberus output { - while ( true ) - { - flag_wait( "power_on" ); - level thread set_global_power( 1 ); - flag_waitopen( "power_on" ); - level thread set_global_power( 0 ); - } + 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() +standard_powered_items() //checked partially changed to match cerberus output //did not use foreach with continue to prevent infinite loop bug { - flag_wait( "start_zombie_round_logic" ); - vending_triggers = getentarray( "zombie_vending", "targetname" ); - - foreach ( trigger in vending_triggers ) - { - if ( trigger.script_noteworthy == "specialty_weapupgrade" ) - continue; - - powered_on = maps\mp\zombies\_zm_perks::get_perk_machine_start_state( trigger.script_noteworthy ); - add_powered_item( ::perk_power_on, ::perk_power_off, ::perk_range, ::cost_low_if_local, 0, powered_on, trigger ); - } - - 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 ); - continue; - } - - if ( isdefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" ) - { - power_sources = 0; - - if ( !( isdefined( level.power_local_doors_globally ) && 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(); + 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 ) +add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target ) //checked matches cerberus output { - 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; + 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 ) +remove_powered_item( powered ) //checked matches cerberus output { - arrayremovevalue( level.powered_items, powered, 0 ); + 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 ) +add_temp_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target ) //checked changed to match cerberus output { - 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; + 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 ) +watch_temp_powered_item( powered ) //checked changed to match cerberus output { - 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 ); - } - } + 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 ) +change_power_in_radius( delta, origin, radius ) //checked changed to match cerberus output { - 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; + 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 ) +change_power( delta, origin, radius ) //checked changed to match cerberus output { - 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++; - } + 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 ) +revert_power_to_list( delta, origin, radius, powered_list ) //checked changed to match cerberus output { - for ( i = 0; i < powered_list.size; i++ ) - { - powered = powered_list[i]; - powered revert_power( delta, origin, radius ); - } + 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 ) +revert_power( delta, origin, radius, powered_list ) //checked changed to match cerberus output { - if ( delta > 0 ) - { - self.depowered_count--; + if ( delta > 0 ) + { + self.depowered_count--; + /* /# - assert( self.depowered_count >= 0, "Depower underflow in power system" ); + assert( self.depowered_count >= 0, "Depower underflow in power system" ); #/ - if ( self.depowered_count == 0 && self.powered_count > 0 && !self.power ) - { - self.power = 1; - self [[ self.power_on_func ]]( origin, radius ); - } - } - else if ( delta < 0 ) - { - self.powered_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--; + /* /# - assert( self.powered_count >= 0, "Repower underflow in power system" ); + assert( self.powered_count >= 0, "Repower underflow in power system" ); #/ - if ( self.powered_count == 0 && self.power ) - { - self.power = 0; - self [[ self.power_off_func ]]( origin, radius ); - } - } + */ + if ( self.powered_count == 0 && self.power ) + { + self.power = 0; + self [[ self.power_off_func ]]( origin, radius ); + } + } } -add_local_power( origin, radius ) +add_local_power( origin, radius ) //checked matches cerberus output { - localpower = spawnstruct(); + localpower = spawnstruct(); + /* /# - println( "ZM POWER: local power on at " + origin + " radius " + radius + "\n" ); + println( "ZM POWER: local power on at " + origin + " radius " + radius + "\n" ); #/ - 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; + */ + 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 ) +move_local_power( localpower, origin ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite continue loop bug { - changed_list = []; - - for ( i = 0; i < level.powered_items.size; i++ ) - { - powered = level.powered_items[i]; - - if ( powered.power_sources == 2 ) - 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; - continue; - } - - if ( !ispowered && waspowered ) - { - powered revert_power( -1, localpower.origin, localpower.radius, localpower.enabled_list ); - arrayremovevalue( localpower.enabled_list, powered, 0 ); - } - } - - localpower.origin = origin; - return localpower; + 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 ) +end_local_power( localpower ) //checked matches cerberus output { + /* /# - println( "ZM POWER: local power off at " + localpower.origin + " radius " + localpower.radius + "\n" ); + println( "ZM POWER: local power off at " + localpower.origin + " radius " + localpower.radius + "\n" ); #/ - 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 ); + */ + 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 ) +has_local_power( origin ) //checked changed to match cerberus output { - if ( isdefined( level.local_power ) ) - { - foreach ( localpower in level.local_power ) - { - if ( distancesquared( localpower.origin, origin ) < localpower.radius * localpower.radius ) - return true; - } - } - - return false; + 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() +get_powered_item_cost() //checked matches cerberus output { - if ( !( isdefined( self.power ) && self.power ) ) - return 0; - - if ( isdefined( level._power_global ) && 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; + 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 ) +get_local_power_cost( localpower ) //checked changed to match cerberus output { - cost = 0; - - if ( isdefined( localpower ) && isdefined( localpower.enabled_list ) ) - { - foreach ( powered in localpower.enabled_list ) - cost += powered get_powered_item_cost(); - } - - if ( isdefined( localpower ) && isdefined( localpower.added_list ) ) - { - foreach ( powered in localpower.added_list ) - cost += powered get_powered_item_cost(); - } - - return cost; + 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 ) +set_global_power( on_off ) //checked changed to match cerberus output { - 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(); - } - } + 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 ) +global_power( on_off ) //checked matches cerberus output { - if ( on_off ) - { + if ( on_off ) + { + /* /# - println( "ZM POWER: global power on\n" ); + println( "ZM POWER: global power on\n" ); #/ - if ( !self.power ) - { - self.power = 1; - self [[ self.power_on_func ]](); - } - - self.powered_count++; - } - else - { + */ + if ( !self.power ) + { + self.power = 1; + self [[ self.power_on_func ]](); + } + self.powered_count++; + } + else + { + /* /# - println( "ZM POWER: global power off\n" ); + println( "ZM POWER: global power off\n" ); #/ - self.powered_count--; + */ + self.powered_count--; + /* /# - assert( self.powered_count >= 0, "Repower underflow in power system" ); + assert( self.powered_count >= 0, "Repower underflow in power system" ); #/ - if ( self.powered_count == 0 && self.power ) - { - self.power = 0; - self [[ self.power_off_func ]](); - } - } + */ + if ( self.powered_count == 0 && self.power ) + { + self.power = 0; + self [[ self.power_off_func ]](); + } + } } -never_power_on( origin, radius ) +never_power_on( origin, radius ) //checked matches cerberus output { - } -never_power_off( origin, radius ) +never_power_off( origin, radius ) //checked matches cerberus output { - } -cost_negligible() +cost_negligible() //checked matches cerberus output { - if ( isdefined( self.one_time_cost ) ) - { - cost = self.one_time_cost; - self.one_time_cost = undefined; - return cost; - } - - return 0; + if ( isDefined( self.one_time_cost ) ) + { + cost = self.one_time_cost; + self.one_time_cost = undefined; + return cost; + } + return 0; } -cost_low_if_local() +cost_low_if_local() //checked matches cerberus output { - if ( isdefined( self.one_time_cost ) ) - { - cost = self.one_time_cost; - self.one_time_cost = undefined; - return cost; - } - - if ( isdefined( level._power_global ) && level._power_global ) - return 0; - - if ( isdefined( self.self_powered ) && self.self_powered ) - return 0; - - return 1; + 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() +cost_high() //checked matches cerberus output { - if ( isdefined( self.one_time_cost ) ) - { - cost = self.one_time_cost; - self.one_time_cost = undefined; - return cost; - } - - return 10; + 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 ) +door_range( delta, origin, radius ) //checked matches cerberus output { - if ( delta < 0 ) - return false; - - if ( distancesquared( self.target.origin, origin ) < radius * radius ) - return true; - - return false; + if ( delta < 0 ) + { + return 0; + } + if ( distancesquared( self.target.origin, origin ) < radius * radius ) + { + return 1; + } + return 0; } -door_power_on( origin, radius ) +door_power_on( origin, radius ) //checked matches cerberus output { + /* /# - println( "^1ZM POWER: door on\n" ); -#/ - self.target.power_on = 1; - self.target notify( "power_on" ); + println( "^1ZM POWER: door on\n" ); +#/ + */ + self.target.power_on = 1; + self.target notify( "power_on" ); } -door_power_off( origin, radius ) +door_power_off( origin, radius ) //checked matches cerberus output { + /* /# - println( "^1ZM POWER: door off\n" ); + println( "^1ZM POWER: door off\n" ); #/ - self.target notify( "power_off" ); - self.target.power_on = 0; + */ + self.target notify( "power_off" ); + self.target.power_on = 0; } -door_local_power_on( origin, radius ) +door_local_power_on( origin, radius ) //checked matches cerberus output { + /* /# - println( "^1ZM POWER: door on (local)\n" ); + println( "^1ZM POWER: door on (local)\n" ); #/ - self.target.local_power_on = 1; - self.target notify( "local_power_on" ); + */ + self.target.local_power_on = 1; + self.target notify( "local_power_on" ); } -door_local_power_off( origin, radius ) +door_local_power_off( origin, radius ) //checked matches cerberus output { + /* /# - println( "^1ZM POWER: door off (local)\n" ); + println( "^1ZM POWER: door off (local)\n" ); #/ - self.target notify( "local_power_off" ); - self.target.local_power_on = 0; + */ + self.target notify( "local_power_off" ); + self.target.local_power_on = 0; } -cost_door() +cost_door() //checked matches cerberus output { - 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; + 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 ) +zombie_range( delta, origin, radius ) //checked matches cerberus output { - if ( delta > 0 ) - return false; - - self.zombies = get_array_of_closest( origin, get_round_enemy_array(), undefined, undefined, radius ); - - if ( !isdefined( self.zombies ) ) - return false; - - self.power = 1; - return true; + 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 ) +zombie_power_off( origin, radius ) //checked changed to match cerberus output { + /* /# - println( "^1ZM POWER: zombies off\n" ); + println( "^1ZM POWER: zombies off\n" ); #/ - for ( i = 0; i < self.zombies.size; i++ ) - { - self.zombies[i] thread stun_zombie(); - wait 0.05; - } + */ + for ( i = 0; i < self.zombies.size; i++ ) + { + self.zombies[ i ] thread stun_zombie(); + wait 0.05; + } } -stun_zombie() +stun_zombie() //checked matches cerberus output { - self endon( "death" ); - self notify( "stun_zombie" ); - self endon( "stun_zombie" ); - - if ( self.health <= 0 ) - { + self endon( "death" ); + self notify( "stun_zombie" ); + self endon( "stun_zombie" ); + if ( self.health <= 0 ) + { + /* /# - iprintln( "trying to stun a dead zombie" ); + iprintln( "trying to stun a dead zombie" ); #/ - return; - } - - if ( isdefined( self.ignore_inert ) && 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(); + */ + 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 ) +perk_range( delta, origin, radius ) //checked changed to match cerberus output { - if ( isdefined( self.target ) ) - { - perkorigin = self.target.origin; - - if ( isdefined( self.target.trigger_off ) && self.target.trigger_off ) - perkorigin = self.target.realorigin; - else if ( isdefined( self.target.disabled ) && self.target.disabled ) - perkorigin += vectorscale( ( 0, 0, 1 ), 10000.0 ); - - if ( distancesquared( perkorigin, origin ) < radius * radius ) - return true; - } - - return false; + 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 ) +perk_power_on( origin, radius ) //checked matches cerberus output { + /* /# - println( "^1ZM POWER: perk " + self.target maps\mp\zombies\_zm_perks::getvendingmachinenotify() + " on\n" ); + println( "^1ZM POWER: perk " + self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + " on\n" ); #/ - level notify( self.target maps\mp\zombies\_zm_perks::getvendingmachinenotify() + "_on" ); - maps\mp\zombies\_zm_perks::perk_unpause( self.target.script_noteworthy ); + */ + 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 ) +perk_power_off( origin, radius ) //checked matches cerberus output { - 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; - } + 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; + } + } + /* /# - println( "^1ZM POWER: perk " + self.target.script_noteworthy + " off\n" ); + println( "^1ZM POWER: perk " + self.target.script_noteworthy + " off\n" ); #/ - 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" ); + */ + 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 ) +pap_range( delta, origin, radius ) //checked changed to match cerberus output { - if ( isdefined( self.target ) ) - { - paporigin = self.target.origin; - - if ( isdefined( self.target.trigger_off ) && self.target.trigger_off ) - paporigin = self.target.realorigin; - else if ( isdefined( self.target.disabled ) && self.target.disabled ) - paporigin += vectorscale( ( 0, 0, 1 ), 10000.0 ); - - if ( distancesquared( paporigin, origin ) < radius * radius ) - return true; - } - - return false; + 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 ) +pap_power_on( origin, radius ) //checked matches cerberus output { + /* /# - println( "^1ZM POWER: PaP on\n" ); + println( "^1ZM POWER: PaP on\n" ); #/ - level notify( "Pack_A_Punch_on" ); + */ + level notify( "Pack_A_Punch_on" ); } -pap_power_off( origin, radius ) +pap_power_off( origin, radius ) //checked matches cerberus output { + /* /# - println( "^1ZM POWER: PaP off\n" ); + println( "^1ZM POWER: PaP off\n" ); #/ - level notify( "Pack_A_Punch_off" ); - self.target notify( "death" ); - self.target thread maps\mp\zombies\_zm_perks::vending_weapon_upgrade(); + */ + level notify( "Pack_A_Punch_off" ); + self.target notify( "death" ); + self.target thread maps/mp/zombies/_zm_perks::vending_weapon_upgrade(); } -pap_is_on() +pap_is_on() //checked matches cerberus output { - if ( isdefined( self.powered ) ) - return self.powered.power; - - return 0; + if ( isDefined( self.powered ) ) + { + return self.powered.power; + } + return 0; } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_powerups.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_powerups.gsc index 922eaa4..ba88958 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_powerups.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_powerups.gsc @@ -1,2772 +1,2862 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_net; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_magicbox; -#include maps\mp\_demo; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_pers_upgrades; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_audio_announcer; -#include maps\mp\zombies\_zm_blockers; -#include maps\mp\zombies\_zm_powerups; -#include maps\mp\zombies\_zm_score; -#include maps\mp\animscripts\zm_death; -#include maps\mp\zombies\_zm_spawner; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\zombies\_zm_perks; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_melee_weapon; - -init() -{ - precacheshader( "specialty_doublepoints_zombies" ); - precacheshader( "specialty_instakill_zombies" ); - precacheshader( "specialty_firesale_zombies" ); - precacheshader( "zom_icon_bonfire" ); - precacheshader( "zom_icon_minigun" ); - precacheshader( "black" ); - set_zombie_var( "zombie_insta_kill", 0, undefined, undefined, 1 ); - set_zombie_var( "zombie_point_scalar", 1, undefined, undefined, 1 ); - set_zombie_var( "zombie_drop_item", 0 ); - set_zombie_var( "zombie_timer_offset", 350 ); - set_zombie_var( "zombie_timer_offset_interval", 30 ); - set_zombie_var( "zombie_powerup_fire_sale_on", 0 ); - set_zombie_var( "zombie_powerup_fire_sale_time", 30 ); - set_zombie_var( "zombie_powerup_bonfire_sale_on", 0 ); - set_zombie_var( "zombie_powerup_bonfire_sale_time", 30 ); - set_zombie_var( "zombie_powerup_insta_kill_on", 0, undefined, undefined, 1 ); - set_zombie_var( "zombie_powerup_insta_kill_time", 30, undefined, undefined, 1 ); - set_zombie_var( "zombie_powerup_point_doubler_on", 0, undefined, undefined, 1 ); - set_zombie_var( "zombie_powerup_point_doubler_time", 30, undefined, undefined, 1 ); - set_zombie_var( "zombie_powerup_drop_increment", 2000 ); - set_zombie_var( "zombie_powerup_drop_max_per_round", 4 ); - onplayerconnect_callback( ::init_player_zombie_vars ); - level._effect["powerup_on"] = loadfx( "misc/fx_zombie_powerup_on" ); - level._effect["powerup_off"] = loadfx( "misc/fx_zombie_powerup_off" ); - level._effect["powerup_grabbed"] = loadfx( "misc/fx_zombie_powerup_grab" ); - level._effect["powerup_grabbed_wave"] = loadfx( "misc/fx_zombie_powerup_wave" ); - - if ( isdefined( level.using_zombie_powerups ) && level.using_zombie_powerups ) - { - level._effect["powerup_on_red"] = loadfx( "misc/fx_zombie_powerup_on_red" ); - level._effect["powerup_grabbed_red"] = loadfx( "misc/fx_zombie_powerup_red_grab" ); - level._effect["powerup_grabbed_wave_red"] = loadfx( "misc/fx_zombie_powerup_red_wave" ); - } - - level._effect["powerup_on_solo"] = loadfx( "misc/fx_zombie_powerup_solo_on" ); - level._effect["powerup_grabbed_solo"] = loadfx( "misc/fx_zombie_powerup_solo_grab" ); - level._effect["powerup_grabbed_wave_solo"] = loadfx( "misc/fx_zombie_powerup_solo_wave" ); - level._effect["powerup_on_caution"] = loadfx( "misc/fx_zombie_powerup_caution_on" ); - level._effect["powerup_grabbed_caution"] = loadfx( "misc/fx_zombie_powerup_caution_grab" ); - level._effect["powerup_grabbed_wave_caution"] = loadfx( "misc/fx_zombie_powerup_caution_wave" ); - init_powerups(); - - if ( !level.enable_magic ) - return; - - thread watch_for_drop(); - thread setup_firesale_audio(); - thread setup_bonfiresale_audio(); - level.use_new_carpenter_func = ::start_carpenter_new; - level.board_repair_distance_squared = 562500; -} - -init_powerups() -{ - flag_init( "zombie_drop_powerups" ); - - if ( isdefined( level.enable_magic ) && level.enable_magic ) - flag_set( "zombie_drop_powerups" ); - - if ( !isdefined( level.active_powerups ) ) - level.active_powerups = []; - - if ( !isdefined( level.zombie_powerup_array ) ) - level.zombie_powerup_array = []; - - if ( !isdefined( level.zombie_special_drop_array ) ) - level.zombie_special_drop_array = []; - - add_zombie_powerup( "nuke", "zombie_bomb", &"ZOMBIE_POWERUP_NUKE", ::func_should_always_drop, 0, 0, 0, "misc/fx_zombie_mini_nuke_hotness" ); - add_zombie_powerup( "insta_kill", "zombie_skull", &"ZOMBIE_POWERUP_INSTA_KILL", ::func_should_always_drop, 0, 0, 0, undefined, "powerup_instant_kill", "zombie_powerup_insta_kill_time", "zombie_powerup_insta_kill_on" ); - add_zombie_powerup( "full_ammo", "zombie_ammocan", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_always_drop, 0, 0, 0 ); - add_zombie_powerup( "double_points", "zombie_x2_icon", &"ZOMBIE_POWERUP_DOUBLE_POINTS", ::func_should_always_drop, 0, 0, 0, undefined, "powerup_double_points", "zombie_powerup_point_doubler_time", "zombie_powerup_point_doubler_on" ); - add_zombie_powerup( "carpenter", "zombie_carpenter", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_drop_carpenter, 0, 0, 0 ); - add_zombie_powerup( "fire_sale", "zombie_firesale", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_drop_fire_sale, 0, 0, 0, undefined, "powerup_fire_sale", "zombie_powerup_fire_sale_time", "zombie_powerup_fire_sale_on" ); - add_zombie_powerup( "bonfire_sale", "zombie_pickup_bonfire", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 0, undefined, "powerup_bon_fire", "zombie_powerup_bonfire_sale_time", "zombie_powerup_bonfire_sale_on" ); - add_zombie_powerup( "minigun", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MINIGUN", ::func_should_drop_minigun, 1, 0, 0, undefined, "powerup_mini_gun", "zombie_powerup_minigun_time", "zombie_powerup_minigun_on" ); - add_zombie_powerup( "free_perk", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_FREE_PERK", ::func_should_never_drop, 0, 0, 0 ); - add_zombie_powerup( "tesla", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MINIGUN", ::func_should_never_drop, 1, 0, 0, undefined, "powerup_tesla", "zombie_powerup_tesla_time", "zombie_powerup_tesla_on" ); - add_zombie_powerup( "random_weapon", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 1, 0, 0 ); - add_zombie_powerup( "bonus_points_player", "zombie_z_money_icon", &"ZOMBIE_POWERUP_BONUS_POINTS", ::func_should_never_drop, 1, 0, 0 ); - add_zombie_powerup( "bonus_points_team", "zombie_z_money_icon", &"ZOMBIE_POWERUP_BONUS_POINTS", ::func_should_never_drop, 0, 0, 0 ); - add_zombie_powerup( "lose_points_team", "zombie_z_money_icon", &"ZOMBIE_POWERUP_LOSE_POINTS", ::func_should_never_drop, 0, 0, 1 ); - add_zombie_powerup( "lose_perk", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 1 ); - add_zombie_powerup( "empty_clip", "zombie_ammocan", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 1 ); - add_zombie_powerup( "insta_kill_ug", "zombie_skull", &"ZOMBIE_POWERUP_INSTA_KILL", ::func_should_never_drop, 1, 0, 0, undefined, "powerup_instant_kill_ug", "zombie_powerup_insta_kill_ug_time", "zombie_powerup_insta_kill_ug_on", 5000 ); - - if ( isdefined( level.level_specific_init_powerups ) ) - [[ level.level_specific_init_powerups ]](); - - randomize_powerups(); - level.zombie_powerup_index = 0; - randomize_powerups(); - level.rare_powerups_active = 0; - level.firesale_vox_firstime = 0; - level thread powerup_hud_monitor(); - - if ( isdefined( level.quantum_bomb_register_result_func ) ) - { - [[ level.quantum_bomb_register_result_func ]]( "random_powerup", ::quantum_bomb_random_powerup_result, 5, level.quantum_bomb_in_playable_area_validation_func ); - [[ level.quantum_bomb_register_result_func ]]( "random_zombie_grab_powerup", ::quantum_bomb_random_zombie_grab_powerup_result, 5, level.quantum_bomb_in_playable_area_validation_func ); - [[ level.quantum_bomb_register_result_func ]]( "random_weapon_powerup", ::quantum_bomb_random_weapon_powerup_result, 60, level.quantum_bomb_in_playable_area_validation_func ); - [[ level.quantum_bomb_register_result_func ]]( "random_bonus_or_lose_points_powerup", ::quantum_bomb_random_bonus_or_lose_points_powerup_result, 25, level.quantum_bomb_in_playable_area_validation_func ); - } - - registerclientfield( "scriptmover", "powerup_fx", 1000, 3, "int" ); -} - -init_player_zombie_vars() -{ - self.zombie_vars["zombie_powerup_minigun_on"] = 0; - self.zombie_vars["zombie_powerup_minigun_time"] = 0; - self.zombie_vars["zombie_powerup_tesla_on"] = 0; - self.zombie_vars["zombie_powerup_tesla_time"] = 0; - self.zombie_vars["zombie_powerup_insta_kill_ug_on"] = 0; - self.zombie_vars["zombie_powerup_insta_kill_ug_time"] = 18; -} - -set_weapon_ignore_max_ammo( str_weapon ) -{ - if ( !isdefined( level.zombie_weapons_no_max_ammo ) ) - level.zombie_weapons_no_max_ammo = []; - - level.zombie_weapons_no_max_ammo[str_weapon] = 1; -} - -powerup_hud_monitor() -{ - flag_wait( "start_zombie_round_logic" ); - - if ( isdefined( level.current_game_module ) && level.current_game_module == 2 ) - return; - - flashing_timers = []; - flashing_values = []; - flashing_timer = 10; - flashing_delta_time = 0; - flashing_is_on = 0; - flashing_value = 3; - flashing_min_timer = 0.15; - - while ( flashing_timer >= flashing_min_timer ) - { - if ( flashing_timer < 5 ) - flashing_delta_time = 0.1; - else - flashing_delta_time = 0.2; - - if ( flashing_is_on ) - { - flashing_timer = flashing_timer - flashing_delta_time - 0.05; - flashing_value = 2; - } - else - { - flashing_timer -= flashing_delta_time; - flashing_value = 3; - } - - flashing_timers[flashing_timers.size] = flashing_timer; - flashing_values[flashing_values.size] = flashing_value; - flashing_is_on = !flashing_is_on; - } - - client_fields = []; - powerup_keys = getarraykeys( level.zombie_powerups ); - - for ( powerup_key_index = 0; powerup_key_index < powerup_keys.size; powerup_key_index++ ) - { - if ( isdefined( level.zombie_powerups[powerup_keys[powerup_key_index]].client_field_name ) ) - { - powerup_name = powerup_keys[powerup_key_index]; - client_fields[powerup_name] = spawnstruct(); - client_fields[powerup_name].client_field_name = level.zombie_powerups[powerup_name].client_field_name; - client_fields[powerup_name].solo = level.zombie_powerups[powerup_name].solo; - client_fields[powerup_name].time_name = level.zombie_powerups[powerup_name].time_name; - client_fields[powerup_name].on_name = level.zombie_powerups[powerup_name].on_name; - } - } - - client_field_keys = getarraykeys( client_fields ); - - while ( true ) - { - wait 0.05; - waittillframeend; - players = get_players(); - - for ( playerindex = 0; playerindex < players.size; playerindex++ ) - { - for ( client_field_key_index = 0; client_field_key_index < client_field_keys.size; client_field_key_index++ ) - { - player = players[playerindex]; -/# - if ( isdefined( player.pers["isBot"] ) && player.pers["isBot"] ) - continue; -#/ - if ( isdefined( level.powerup_player_valid ) ) - { - if ( ![[ level.powerup_player_valid ]]( player ) ) - continue; - } - - client_field_name = client_fields[client_field_keys[client_field_key_index]].client_field_name; - time_name = client_fields[client_field_keys[client_field_key_index]].time_name; - on_name = client_fields[client_field_keys[client_field_key_index]].on_name; - powerup_timer = undefined; - powerup_on = undefined; - - if ( client_fields[client_field_keys[client_field_key_index]].solo ) - { - if ( isdefined( player._show_solo_hud ) && player._show_solo_hud == 1 ) - { - powerup_timer = player.zombie_vars[time_name]; - powerup_on = player.zombie_vars[on_name]; - } - } - else if ( isdefined( level.zombie_vars[player.team][time_name] ) ) - { - powerup_timer = level.zombie_vars[player.team][time_name]; - powerup_on = level.zombie_vars[player.team][on_name]; - } - else if ( isdefined( level.zombie_vars[time_name] ) ) - { - powerup_timer = level.zombie_vars[time_name]; - powerup_on = level.zombie_vars[on_name]; - } - - if ( isdefined( powerup_timer ) && isdefined( powerup_on ) ) - { - player set_clientfield_powerups( client_field_name, powerup_timer, powerup_on, flashing_timers, flashing_values ); - continue; - } - - player setclientfieldtoplayer( client_field_name, 0 ); - } - } - } -} - -set_clientfield_powerups( clientfield_name, powerup_timer, powerup_on, flashing_timers, flashing_values ) -{ - if ( powerup_on ) - { - if ( powerup_timer < 10 ) - { - flashing_value = 3; - - for ( i = flashing_timers.size - 1; i > 0; i-- ) - { - if ( powerup_timer < flashing_timers[i] ) - { - flashing_value = flashing_values[i]; - break; - } - } - - self setclientfieldtoplayer( clientfield_name, flashing_value ); - } - else - self setclientfieldtoplayer( clientfield_name, 1 ); - } - else - self setclientfieldtoplayer( clientfield_name, 0 ); -} - -randomize_powerups() -{ - level.zombie_powerup_array = array_randomize( level.zombie_powerup_array ); -} - -get_next_powerup() -{ - powerup = level.zombie_powerup_array[level.zombie_powerup_index]; - level.zombie_powerup_index++; - - if ( level.zombie_powerup_index >= level.zombie_powerup_array.size ) - { - level.zombie_powerup_index = 0; - randomize_powerups(); - } - - return powerup; -} - -get_valid_powerup() -{ -/# - if ( isdefined( level.zombie_devgui_power ) && level.zombie_devgui_power == 1 ) - return level.zombie_powerup_array[level.zombie_powerup_index]; -#/ - if ( isdefined( level.zombie_powerup_boss ) ) - { - i = level.zombie_powerup_boss; - level.zombie_powerup_boss = undefined; - return level.zombie_powerup_array[i]; - } - - if ( isdefined( level.zombie_powerup_ape ) ) - { - powerup = level.zombie_powerup_ape; - level.zombie_powerup_ape = undefined; - return powerup; - } - - powerup = get_next_powerup(); - - while ( true ) - { - if ( ![[ level.zombie_powerups[powerup].func_should_drop_with_regular_powerups ]]() ) - { - powerup = get_next_powerup(); - continue; - } - - return powerup; - } +#include maps/mp/zombies/_zm_melee_weapon; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/animscripts/zm_death; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_blockers; +#include maps/mp/zombies/_zm_audio_announcer; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_pers_upgrades; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/_demo; +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init() //checked matches cerberus output +{ + precacheshader( "specialty_doublepoints_zombies" ); + precacheshader( "specialty_instakill_zombies" ); + precacheshader( "specialty_firesale_zombies" ); + precacheshader( "zom_icon_bonfire" ); + precacheshader( "zom_icon_minigun" ); + precacheshader( "black" ); + set_zombie_var( "zombie_insta_kill", 0, undefined, undefined, 1 ); + set_zombie_var( "zombie_point_scalar", 1, undefined, undefined, 1 ); + set_zombie_var( "zombie_drop_item", 0 ); + set_zombie_var( "zombie_timer_offset", 350 ); + set_zombie_var( "zombie_timer_offset_interval", 30 ); + set_zombie_var( "zombie_powerup_fire_sale_on", 0 ); + set_zombie_var( "zombie_powerup_fire_sale_time", 30 ); + set_zombie_var( "zombie_powerup_bonfire_sale_on", 0 ); + set_zombie_var( "zombie_powerup_bonfire_sale_time", 30 ); + set_zombie_var( "zombie_powerup_insta_kill_on", 0, undefined, undefined, 1 ); + set_zombie_var( "zombie_powerup_insta_kill_time", 30, undefined, undefined, 1 ); + set_zombie_var( "zombie_powerup_point_doubler_on", 0, undefined, undefined, 1 ); + set_zombie_var( "zombie_powerup_point_doubler_time", 30, undefined, undefined, 1 ); + set_zombie_var( "zombie_powerup_drop_increment", 2000 ); + set_zombie_var( "zombie_powerup_drop_max_per_round", 4 ); + onplayerconnect_callback( ::init_player_zombie_vars ); + level._effect[ "powerup_on" ] = loadfx( "misc/fx_zombie_powerup_on" ); + level._effect[ "powerup_off" ] = loadfx( "misc/fx_zombie_powerup_off" ); + level._effect[ "powerup_grabbed" ] = loadfx( "misc/fx_zombie_powerup_grab" ); + level._effect[ "powerup_grabbed_wave" ] = loadfx( "misc/fx_zombie_powerup_wave" ); + if ( is_true( level.using_zombie_powerups ) ) + { + level._effect[ "powerup_on_red" ] = loadfx( "misc/fx_zombie_powerup_on_red" ); + level._effect[ "powerup_grabbed_red" ] = loadfx( "misc/fx_zombie_powerup_red_grab" ); + level._effect[ "powerup_grabbed_wave_red" ] = loadfx( "misc/fx_zombie_powerup_red_wave" ); + } + level._effect[ "powerup_on_solo" ] = loadfx( "misc/fx_zombie_powerup_solo_on" ); + level._effect[ "powerup_grabbed_solo" ] = loadfx( "misc/fx_zombie_powerup_solo_grab" ); + level._effect[ "powerup_grabbed_wave_solo" ] = loadfx( "misc/fx_zombie_powerup_solo_wave" ); + level._effect[ "powerup_on_caution" ] = loadfx( "misc/fx_zombie_powerup_caution_on" ); + level._effect[ "powerup_grabbed_caution" ] = loadfx( "misc/fx_zombie_powerup_caution_grab" ); + level._effect[ "powerup_grabbed_wave_caution" ] = loadfx( "misc/fx_zombie_powerup_caution_wave" ); + init_powerups(); + if ( !level.enable_magic ) + { + return; + } + thread watch_for_drop(); + thread setup_firesale_audio(); + thread setup_bonfiresale_audio(); + level.use_new_carpenter_func = ::start_carpenter_new; + level.board_repair_distance_squared = 562500; +} + +init_powerups() //checked matches cerberus output +{ + flag_init( "zombie_drop_powerups" ); + if ( is_true( level.enable_magic ) ) + { + flag_set( "zombie_drop_powerups" ); + } + if ( !isDefined( level.active_powerups ) ) + { + level.active_powerups = []; + } + if ( !isDefined( level.zombie_powerup_array ) ) + { + level.zombie_powerup_array = []; + } + if ( !isDefined( level.zombie_special_drop_array ) ) + { + level.zombie_special_drop_array = []; + } + add_zombie_powerup( "nuke", "zombie_bomb", &"ZOMBIE_POWERUP_NUKE", ::func_should_always_drop, 0, 0, 0, "misc/fx_zombie_mini_nuke_hotness" ); + add_zombie_powerup( "insta_kill", "zombie_skull", &"ZOMBIE_POWERUP_INSTA_KILL", ::func_should_always_drop, 0, 0, 0, undefined, "powerup_instant_kill", "zombie_powerup_insta_kill_time", "zombie_powerup_insta_kill_on" ); + add_zombie_powerup( "full_ammo", "zombie_ammocan", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_always_drop, 0, 0, 0 ); + add_zombie_powerup( "double_points", "zombie_x2_icon", &"ZOMBIE_POWERUP_DOUBLE_POINTS", ::func_should_always_drop, 0, 0, 0, undefined, "powerup_double_points", "zombie_powerup_point_doubler_time", "zombie_powerup_point_doubler_on" ); + add_zombie_powerup( "carpenter", "zombie_carpenter", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_drop_carpenter, 0, 0, 0 ); + add_zombie_powerup( "fire_sale", "zombie_firesale", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_drop_fire_sale, 0, 0, 0, undefined, "powerup_fire_sale", "zombie_powerup_fire_sale_time", "zombie_powerup_fire_sale_on" ); + add_zombie_powerup( "bonfire_sale", "zombie_pickup_bonfire", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 0, undefined, "powerup_bon_fire", "zombie_powerup_bonfire_sale_time", "zombie_powerup_bonfire_sale_on" ); + add_zombie_powerup( "minigun", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MINIGUN", ::func_should_drop_minigun, 1, 0, 0, undefined, "powerup_mini_gun", "zombie_powerup_minigun_time", "zombie_powerup_minigun_on" ); + add_zombie_powerup( "free_perk", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_FREE_PERK", ::func_should_never_drop, 0, 0, 0 ); + add_zombie_powerup( "tesla", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MINIGUN", ::func_should_never_drop, 1, 0, 0, undefined, "powerup_tesla", "zombie_powerup_tesla_time", "zombie_powerup_tesla_on" ); + add_zombie_powerup( "random_weapon", "zombie_pickup_minigun", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 1, 0, 0 ); + add_zombie_powerup( "bonus_points_player", "zombie_z_money_icon", &"ZOMBIE_POWERUP_BONUS_POINTS", ::func_should_never_drop, 1, 0, 0 ); + add_zombie_powerup( "bonus_points_team", "zombie_z_money_icon", &"ZOMBIE_POWERUP_BONUS_POINTS", ::func_should_never_drop, 0, 0, 0 ); + add_zombie_powerup( "lose_points_team", "zombie_z_money_icon", &"ZOMBIE_POWERUP_LOSE_POINTS", ::func_should_never_drop, 0, 0, 1 ); + add_zombie_powerup( "lose_perk", "zombie_pickup_perk_bottle", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 1 ); + add_zombie_powerup( "empty_clip", "zombie_ammocan", &"ZOMBIE_POWERUP_MAX_AMMO", ::func_should_never_drop, 0, 0, 1 ); + add_zombie_powerup( "insta_kill_ug", "zombie_skull", &"ZOMBIE_POWERUP_INSTA_KILL", ::func_should_never_drop, 1, 0, 0, undefined, "powerup_instant_kill_ug", "zombie_powerup_insta_kill_ug_time", "zombie_powerup_insta_kill_ug_on", 5000 ); + if ( isDefined( level.level_specific_init_powerups ) ) + { + [[ level.level_specific_init_powerups ]](); + } + randomize_powerups(); + level.zombie_powerup_index = 0; + randomize_powerups(); + level.rare_powerups_active = 0; + level.firesale_vox_firstime = 0; + level thread powerup_hud_monitor(); + if ( isDefined( level.quantum_bomb_register_result_func ) ) + { + [[ level.quantum_bomb_register_result_func ]]( "random_powerup", ::quantum_bomb_random_powerup_result, 5, level.quantum_bomb_in_playable_area_validation_func ); + [[ level.quantum_bomb_register_result_func ]]( "random_zombie_grab_powerup", ::quantum_bomb_random_zombie_grab_powerup_result, 5, level.quantum_bomb_in_playable_area_validation_func ); + [[ level.quantum_bomb_register_result_func ]]( "random_weapon_powerup", ::quantum_bomb_random_weapon_powerup_result, 60, level.quantum_bomb_in_playable_area_validation_func ); + [[ level.quantum_bomb_register_result_func ]]( "random_bonus_or_lose_points_powerup", ::quantum_bomb_random_bonus_or_lose_points_powerup_result, 25, level.quantum_bomb_in_playable_area_validation_func ); + } + registerclientfield( "scriptmover", "powerup_fx", 1000, 3, "int" ); +} + +init_player_zombie_vars() //checked matches cerberus output +{ + self.zombie_vars[ "zombie_powerup_minigun_on" ] = 0; + self.zombie_vars[ "zombie_powerup_minigun_time" ] = 0; + self.zombie_vars[ "zombie_powerup_tesla_on" ] = 0; + self.zombie_vars[ "zombie_powerup_tesla_time" ] = 0; + self.zombie_vars[ "zombie_powerup_insta_kill_ug_on" ] = 0; + self.zombie_vars[ "zombie_powerup_insta_kill_ug_time" ] = 18; +} + +set_weapon_ignore_max_ammo( str_weapon ) //checked matches cerberus output +{ + if ( !isDefined( level.zombie_weapons_no_max_ammo ) ) + { + level.zombie_weapons_no_max_ammo = []; + } + level.zombie_weapons_no_max_ammo[ str_weapon ] = 1; +} + +powerup_hud_monitor() //checked partially changed to match cerberus output +{ + flag_wait( "start_zombie_round_logic" ); + if ( isDefined( level.current_game_module ) && level.current_game_module == 2 ) + { + return; + } + flashing_timers = []; + flashing_values = []; + flashing_timer = 10; + flashing_delta_time = 0; + flashing_is_on = 0; + flashing_value = 3; + flashing_min_timer = 0.15; + while ( flashing_timer >= flashing_min_timer ) + { + if ( flashing_timer < 5 ) + { + flashing_delta_time = 0.1; + } + else + { + flashing_delta_time = 0.2; + } + if ( flashing_is_on ) + { + flashing_timer = flashing_timer - flashing_delta_time - 0.05; + flashing_value = 2; + } + else + { + flashing_timer -= flashing_delta_time; + flashing_value = 3; + } + flashing_timers[ flashing_timers.size ] = flashing_timer; + flashing_values[ flashing_values.size ] = flashing_value; + flashing_is_on = !flashing_is_on; + } + client_fields = []; + powerup_keys = getarraykeys( level.zombie_powerups ); + for ( powerup_key_index = 0; powerup_key_index < powerup_keys.size; powerup_key_index++ ) + { + if ( isDefined( level.zombie_powerups[ powerup_keys[ powerup_key_index ] ].client_field_name ) ) + { + powerup_name = powerup_keys[ powerup_key_index ]; + client_fields[ powerup_name ] = spawnstruct(); + client_fields[ powerup_name ].client_field_name = level.zombie_powerups[ powerup_name ].client_field_name; + client_fields[ powerup_name ].solo = level.zombie_powerups[ powerup_name ].solo; + client_fields[ powerup_name ].time_name = level.zombie_powerups[ powerup_name ].time_name; + client_fields[ powerup_name ].on_name = level.zombie_powerups[ powerup_name ].on_name; + } + } + client_field_keys = getarraykeys( client_fields ); + + while ( 1 ) + { + wait 0.05; + waittillframeend; + players = get_players(); + + for ( playerindex = 0; playerindex < players.size; playerindex++ ) + { + client_field_key_index = 0; + while ( client_field_key_index < client_field_keys.size ) + { + + player = players[ playerindex ]; + if ( isdefined(level.powerup_player_valid ) ) + { + if ( ![[ level.powerup_player_valid ]]( player ) ) + { + client_field_key_index++; + continue; + } + } + + client_field_name = client_fields[ client_field_keys[ client_field_key_index ] ].client_field_name; + time_name = client_fields[ client_field_keys[ client_field_key_index ] ].time_name; + on_name = client_fields[ client_field_keys[ client_field_key_index ] ].on_name; + powerup_timer = undefined; + powerup_on = undefined; + if ( client_fields[ client_field_keys[ client_field_key_index ] ].solo ) + { + if ( isdefined( player._show_solo_hud ) && player._show_solo_hud == 1 ) + { + powerup_timer = player.zombie_vars[ time_name ]; + powerup_on = player.zombie_vars[ on_name ]; + } + } + + else if ( isdefined( level.zombie_vars[ player.team ][ time_name ] ) ) + { + powerup_timer = level.zombie_vars[ player.team ][ time_name ]; + powerup_on = level.zombie_vars[ player.team ][on_name ]; + } + else if ( isdefined( level.zombie_vars[ time_name ] ) ) + { + powerup_timer = level.zombie_vars[ time_name ]; + powerup_on = level.zombie_vars[ on_name ]; + } + + if ( isdefined( powerup_timer ) && isdefined( powerup_on ) ) + { + player set_clientfield_powerups( client_field_name, powerup_timer, powerup_on, flashing_timers, flashing_values ); + } + else + { + player setclientfieldtoplayer( client_field_name, 0 ); + } + client_field_key_index++; + } + } + + } +} + +set_clientfield_powerups( clientfield_name, powerup_timer, powerup_on, flashing_timers, flashing_values ) //checked changed to match cerberus output +{ + if ( powerup_on ) + { + if ( powerup_timer < 10 ) + { + flashing_value = 3; + for ( i = flashing_timers.size - 1; i > 0; i-- ) + { + if ( powerup_timer < flashing_timers[ i ] ) + { + flashing_value = flashing_values[ i ]; + break; + } + } + self setclientfieldtoplayer( clientfield_name, flashing_value ); + } + else + { + self setclientfieldtoplayer( clientfield_name, 1 ); + } + } + else + { + self setclientfieldtoplayer( clientfield_name, 0 ); + } +} + +randomize_powerups() //checked matches cerberus output +{ + level.zombie_powerup_array = array_randomize( level.zombie_powerup_array ); +} + +get_next_powerup() //checked matches cerberus output +{ + powerup = level.zombie_powerup_array[ level.zombie_powerup_index ]; + level.zombie_powerup_index++; + if ( level.zombie_powerup_index >= level.zombie_powerup_array.size ) + { + level.zombie_powerup_index = 0; + randomize_powerups(); + } + return powerup; +} + +get_valid_powerup() //checked partially matches cerberus output did not change +{ + if ( isDefined( level.zombie_powerup_boss ) ) + { + i = level.zombie_powerup_boss; + level.zombie_powerup_boss = undefined; + return level.zombie_powerup_array[ i ]; + } + if ( isDefined( level.zombie_powerup_ape ) ) + { + powerup = level.zombie_powerup_ape; + level.zombie_powerup_ape = undefined; + return powerup; + } + powerup = get_next_powerup(); + while ( 1 ) + { + while ( !( [[ level.zombie_powerups[ powerup ].func_should_drop_with_regular_powerups ]]() ) ) + { + powerup = get_next_powerup(); + } + return powerup; + } +} + +minigun_no_drop() //checked matches cerberus output +{ + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ].zombie_vars[ "zombie_powerup_minigun_on" ] == 1 ) + { + return 1; + } + i++; + } + if ( !flag( "power_on" ) ) + { + if ( flag( "solo_game" ) ) + { + if ( level.solo_lives_given == 0 ) + { + return 1; + } + } + else + { + return 1; + } + } + return 0; +} + +get_num_window_destroyed() //checked partially matches cerberus output did not change +{ + num = 0; + for ( i = 0; i < level.exterior_goals.size; i++ ) + { + if ( all_chunks_destroyed( level.exterior_goals[ i ], level.exterior_goals[ i ].barrier_chunks ) ) + { + num += 1; + } + } + return num; +} + +watch_for_drop() //checked partially matches cerberus output did not change +{ + flag_wait( "start_zombie_round_logic" ); + flag_wait( "begin_spawning" ); + players = get_players(); + score_to_drop = ( players.size * level.zombie_vars[ "zombie_score_start_" + players.size + "p" ] ) + level.zombie_vars[ "zombie_powerup_drop_increment" ]; + while ( 1 ) + { + flag_wait( "zombie_drop_powerups" ); + players = get_players(); + curr_total_score = 0; + for ( i = 0; i < players.size; i++ ) + { + if ( isDefined( players[ i ].score_total ) ) + { + curr_total_score += players[ i ].score_total; + } + } + if ( curr_total_score > score_to_drop ) + { + level.zombie_vars[ "zombie_powerup_drop_increment" ] *= 1.14; + score_to_drop = curr_total_score + level.zombie_vars[ "zombie_powerup_drop_increment" ]; + level.zombie_vars[ "zombie_drop_item" ] = 1; + } + wait 0.5; + } + +} + +add_zombie_powerup( powerup_name, model_name, hint, func_should_drop_with_regular_powerups, solo, caution, zombie_grabbable, fx, client_field_name, time_name, on_name, clientfield_version ) //checked matches cerberus output +{ + if ( !isDefined( clientfield_version ) ) + { + clientfield_version = 1; + } + if ( isDefined( level.zombie_include_powerups ) && !isDefined( level.zombie_include_powerups[ powerup_name ] ) ) + { + return; + } + precachemodel( model_name ); + precachestring( hint ); + struct = spawnstruct(); + if ( !isDefined( level.zombie_powerups ) ) + { + level.zombie_powerups = []; + } + struct.powerup_name = powerup_name; + struct.model_name = model_name; + struct.weapon_classname = "script_model"; + struct.hint = hint; + struct.func_should_drop_with_regular_powerups = func_should_drop_with_regular_powerups; + struct.solo = solo; + struct.caution = caution; + struct.zombie_grabbable = zombie_grabbable; + if ( isDefined( fx ) ) + { + struct.fx = loadfx( fx ); + } + level.zombie_powerups[ powerup_name ] = struct; + level.zombie_powerup_array[ level.zombie_powerup_array.size ] = powerup_name; + add_zombie_special_drop( powerup_name ); + if ( !level.createfx_enabled ) + { + if ( isDefined( client_field_name ) ) + { + registerclientfield( "toplayer", client_field_name, clientfield_version, 2, "int" ); + struct.client_field_name = client_field_name; + struct.time_name = time_name; + struct.on_name = on_name; + } + } +} + +powerup_set_can_pick_up_in_last_stand( powerup_name, b_can_pick_up ) //checked matches cerberus output +{ + level.zombie_powerups[ powerup_name ].can_pick_up_in_last_stand = b_can_pick_up; +} + +add_zombie_special_drop( powerup_name ) //checked matches cerberus output +{ + level.zombie_special_drop_array[ level.zombie_special_drop_array.size ] = powerup_name; +} + +include_zombie_powerup( powerup_name ) //checked matches cerberus output +{ + if ( !isDefined( level.zombie_include_powerups ) ) + { + level.zombie_include_powerups = []; + } + level.zombie_include_powerups[ powerup_name ] = 1; +} + +powerup_round_start() //checked matches cerberus output +{ + level.powerup_drop_count = 0; +} + +powerup_drop( drop_point ) //checked partially changed to match cerberus output +{ + if ( level.powerup_drop_count >= level.zombie_vars[ "zombie_powerup_drop_max_per_round" ] ) + { + return; + } + if ( !isDefined( level.zombie_include_powerups ) || level.zombie_include_powerups.size == 0 ) + { + return; + } + rand_drop = randomint( 100 ); + if ( rand_drop > 2 ) + { + if ( !level.zombie_vars[ "zombie_drop_item" ] ) + { + return; + } + debug = "score"; + } + else + { + debug = "random"; + } + playable_area = getentarray( "player_volume", "script_noteworthy" ); + level.powerup_drop_count++; + powerup = maps/mp/zombies/_zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_point + vectorScale( ( 0, 0, 1 ), 40 ) ); + valid_drop = 0; + for ( i = 0; i < playable_area.size; i++ ) + { + if ( powerup istouching( playable_area[ i ] ) ) + { + valid_drop = 1; + break; + } + } + if ( valid_drop && level.rare_powerups_active ) + { + pos = ( drop_point[ 0 ], drop_point[ 1 ], drop_point[ 2 ] + 42 ); + if ( check_for_rare_drop_override( pos ) ) + { + level.zombie_vars[ "zombie_drop_item" ] = 0; + valid_drop = 0; + } + } + if ( !valid_drop ) + { + level.powerup_drop_count--; + + powerup delete(); + return; + } + powerup powerup_setup(); + print_powerup_drop( powerup.powerup_name, debug ); + powerup thread powerup_timeout(); + powerup thread powerup_wobble(); + powerup thread powerup_grab(); + powerup thread powerup_move(); + powerup thread powerup_emp(); + level.zombie_vars[ "zombie_drop_item" ] = 0; + level notify( "powerup_dropped", powerup ); +} + +specific_powerup_drop( powerup_name, drop_spot, powerup_team, powerup_location ) //checked partially changed to match cerberus output +{ + powerup = maps/mp/zombies/_zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_spot + vectorScale( ( 0, 0, 1 ), 40 ) ); + level notify( "powerup_dropped", powerup ); + if ( isDefined( powerup ) ) + { + powerup powerup_setup( powerup_name, powerup_team, powerup_location ); + powerup thread powerup_timeout(); + powerup thread powerup_wobble(); + powerup thread powerup_grab( powerup_team ); + powerup thread powerup_move(); + powerup thread powerup_emp(); + return powerup; + } +} + +quantum_bomb_random_powerup_result( position ) //changed to match cerberus output +{ + if ( !isDefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size ) + { + return; + } + keys = getarraykeys( level.zombie_include_powerups ); + while ( keys.size ) + { + index = randomint( keys.size ); + if ( !level.zombie_powerups[ keys[ index ] ].zombie_grabbable ) + { + skip = 0; + switch( keys[ index ] ) + { + case "bonus_points_player": + case "bonus_points_team": + case "random_weapon": + skip = 1; + break; + case "fire_sale": + case "full_ammo": + case "insta_kill": + case "minigun": + if ( randomint( 4 ) ) + { + skip = 1; + } + break; + case "bonfire_sale": + case "free_perk": + case "tesla": + if ( randomint( 20 ) ) + { + skip = 1; + } + break; + default: + } + if ( skip ) + { + arrayremovevalue( keys, keys[ index ] ); + continue; + } + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); + [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); + level specific_powerup_drop( keys[ index ], position ); + return; + } + else + { + arrayremovevalue( keys, keys[ index ] ); + } + } +} + +quantum_bomb_random_zombie_grab_powerup_result( position ) //changed to match cerberus output +{ + if ( !isDefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size ) + { + return; + } + keys = getarraykeys( level.zombie_include_powerups ); + while ( keys.size ) + { + index = randomint( keys.size ); + if ( level.zombie_powerups[ keys[ index ] ].zombie_grabbable ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_bad" ); + [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); + level specific_powerup_drop( keys[ index ], position ); + return; + } + else + { + arrayremovevalue( keys, keys[ index ] ); + } + } +} + +quantum_bomb_random_weapon_powerup_result( position ) //checked matches cerberus output +{ + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); + [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); + level specific_powerup_drop( "random_weapon", position ); +} + +quantum_bomb_random_bonus_or_lose_points_powerup_result( position ) //checked matches cerberus output +{ + rand = randomint( 10 ); + powerup = "bonus_points_team"; + switch( rand ) + { + case 0: + case 1: + powerup = "lose_points_team"; + if ( isDefined( level.zombie_include_powerups[ powerup ] ) ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_bad" ); + break; + } + case 2: + case 3: + case 4: + powerup = "bonus_points_player"; + if ( isDefined( level.zombie_include_powerups[ powerup ] ) ) + { + break; + } + default: + powerup = "bonus_points_team"; + break; + } + [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); + level specific_powerup_drop( powerup, position ); +} + +special_powerup_drop( drop_point ) //checked changed to match cerberus output +{ + if ( !isDefined( level.zombie_include_powerups ) || level.zombie_include_powerups.size == 0 ) + { + return; + } + powerup = spawn( "script_model", drop_point + vectorScale( ( 0, 0, 1 ), 40 ) ); + playable_area = getentarray( "player_volume", "script_noteworthy" ); + valid_drop = 0; + for ( i = 0; i < playable_area.size; i++ ) + { + if ( powerup istouching( playable_area[ i ] ) ) + { + valid_drop = 1; + break; + } + } + if ( !valid_drop ) + { + powerup delete(); + return; + } + powerup special_drop_setup(); +} + +cleanup_random_weapon_list() //checked matches cerberus output +{ + self waittill( "death" ); + arrayremovevalue( level.random_weapon_powerups, self ); +} + +powerup_setup( powerup_override, powerup_team, powerup_location ) //checked partially changed to match cerberus output +{ + powerup = undefined; + if ( !isDefined( powerup_override ) ) + { + powerup = get_valid_powerup(); + } + else + { + powerup = powerup_override; + if ( powerup == "tesla" && tesla_powerup_active() ) + { + powerup = "minigun"; + } + } + struct = level.zombie_powerups[ powerup ]; + if ( powerup == "random_weapon" ) + { + players = get_players(); + self.weapon = maps/mp/zombies/_zm_magicbox::treasure_chest_chooseweightedrandomweapon( players[ 0 ] ); + self.base_weapon = self.weapon; + if ( !isDefined( level.random_weapon_powerups ) ) + { + level.random_weapon_powerups = []; + } + level.random_weapon_powerups[ level.random_weapon_powerups.size ] = self; + self thread cleanup_random_weapon_list(); + if ( isDefined( level.zombie_weapons[ self.weapon ].upgrade_name ) && !randomint( 4 ) ) + { + self.weapon = level.zombie_weapons[ self.weapon ].upgrade_name; + } + self setmodel( getweaponmodel( self.weapon ) ); + self useweaponhidetags( self.weapon ); + offsetdw = vectorScale( ( 1, 1, 1 ), 3 ); + self.worldgundw = undefined; + if ( maps/mp/zombies/_zm_magicbox::weapon_is_dual_wield( self.weapon ) ) + { + self.worldgundw = spawn( "script_model", self.origin + offsetdw ); + self.worldgundw.angles = self.angles; + self.worldgundw setmodel( maps/mp/zombies/_zm_magicbox::get_left_hand_weapon_model_name( self.weapon ) ); + self.worldgundw useweaponhidetags( self.weapon ); + self.worldgundw linkto( self, "tag_weapon", offsetdw, ( 0, 0, 0 ) ); + } + } + else + { + self setmodel( struct.model_name ); + } + maps/mp/_demo::bookmark( "zm_powerup_dropped", getTime(), undefined, undefined, 1 ); + playsoundatposition( "zmb_spawn_powerup", self.origin ); + if ( isDefined( powerup_team ) ) + { + self.powerup_team = powerup_team; + } + if ( isDefined( powerup_location ) ) + { + self.powerup_location = powerup_location; + } + self.powerup_name = struct.powerup_name; + self.hint = struct.hint; + self.solo = struct.solo; + self.caution = struct.caution; + self.zombie_grabbable = struct.zombie_grabbable; + self.func_should_drop_with_regular_powerups = struct.func_should_drop_with_regular_powerups; + if ( isDefined( struct.fx ) ) + { + self.fx = struct.fx; + } + if ( isDefined( struct.can_pick_up_in_last_stand ) ) + { + self.can_pick_up_in_last_stand = struct.can_pick_up_in_last_stand; + } + self playloopsound( "zmb_spawn_powerup_loop" ); + level.active_powerups[ level.active_powerups.size ] = self; +} + +special_drop_setup() //checked matches cerberus output +{ + powerup = undefined; + is_powerup = 1; + if ( level.round_number <= 10 ) + { + powerup = get_valid_powerup(); + } + else + { + powerup = level.zombie_special_drop_array[ randomint( level.zombie_special_drop_array.size ) ]; + if ( level.round_number > 15 && randomint( 100 ) < ( ( level.round_number - 15 ) * 5 ) ) + { + powerup = "nothing"; + } + } + switch( powerup ) + { + case "all_revive": + case "bonfire_sale": + case "bonus_points_player": + case "bonus_points_team": + case "carpenter": + case "double_points": + case "empty_clip": + case "fire_sale": + case "free_perk": + case "insta_kill": + case "lose_perk": + case "lose_points_team": + case "minigun": + case "nuke": + case "random_weapon": + case "tesla": + case "zombie_blood": + break; + case "full_ammo": + if ( level.round_number > 10 && randomint( 100 ) < ( ( level.round_number - 10 ) * 5 ) ) + { + powerup = level.zombie_powerup_array[ randomint( level.zombie_powerup_array.size ) ]; + } + break; + case "dog": + if ( level.round_number >= 15 ) + { + is_powerup = 0; + dog_spawners = getentarray( "special_dog_spawner", "targetname" ); + thread play_sound_2d( "sam_nospawn" ); + } + else + { + powerup = get_valid_powerup(); + } + break; + default: + if ( isDefined( level._zombiemode_special_drop_setup ) ) + { + is_powerup = [[ level._zombiemode_special_drop_setup ]]( powerup ); + } + else + { + is_powerup = 0; + playfx( level._effect[ "lightning_dog_spawn" ], self.origin ); + playsoundatposition( "pre_spawn", self.origin ); + wait 1.5; + playsoundatposition( "zmb_bolt", self.origin ); + earthquake( 0.5, 0.75, self.origin, 1000 ); + playrumbleonposition( "explosion_generic", self.origin ); + playsoundatposition( "spawn", self.origin ); + wait 1; + thread play_sound_2d( "sam_nospawn" ); + self delete(); + } + } + if ( is_powerup ) + { + playfx( level._effect[ "lightning_dog_spawn" ], self.origin ); + playsoundatposition( "pre_spawn", self.origin ); + wait 1.5; + playsoundatposition( "zmb_bolt", self.origin ); + earthquake( 0.5, 0.75, self.origin, 1000 ); + playrumbleonposition( "explosion_generic", self.origin ); + playsoundatposition( "spawn", self.origin ); + self powerup_setup( powerup ); + self thread powerup_timeout(); + self thread powerup_wobble(); + self thread powerup_grab(); + self thread powerup_move(); + self thread powerup_emp(); + } +} + +powerup_zombie_grab_trigger_cleanup( trigger ) //checked matches cerberus output +{ + self waittill_any( "powerup_timedout", "powerup_grabbed", "hacked" ); + trigger delete(); +} + +powerup_zombie_grab( powerup_team ) //checked changed to match cerberus output +{ + self endon( "powerup_timedout" ); + self endon( "powerup_grabbed" ); + self endon( "hacked" ); + zombie_grab_trigger = spawn( "trigger_radius", self.origin - vectorScale( ( 0, 0, 1 ), 40 ), 4, 32, 72 ); + zombie_grab_trigger enablelinkto(); + zombie_grab_trigger linkto( self ); + zombie_grab_trigger setteamfortrigger( level.zombie_team ); + self thread powerup_zombie_grab_trigger_cleanup( zombie_grab_trigger ); + poi_dist = 300; + if ( isDefined( level._zombie_grabbable_poi_distance_override ) ) + { + poi_dist = level._zombie_grabbable_poi_distance_override; + } + zombie_grab_trigger create_zombie_point_of_interest( poi_dist, 2, 0, 1, undefined, undefined, powerup_team ); + while ( isDefined( self ) ) + { + zombie_grab_trigger waittill( "trigger", who ); + if ( isDefined( level._powerup_grab_check ) ) + { + if ( !self [[ level._powerup_grab_check ]]( who ) ) + { + continue; + } + } + else if ( !isDefined( who ) || !isai( who ) ) + { + continue; + } + playfx( level._effect[ "powerup_grabbed_red" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave_red" ], self.origin ); + switch( self.powerup_name ) + { + case "lose_points_team": + level thread lose_points_team_powerup( self ); + players = get_players(); + players[ randomintrange( 0, players.size ) ] thread powerup_vo( "lose_points" ); + break; + case "lose_perk": + level thread lose_perk_powerup( self ); + break; + case "empty_clip": + level thread empty_clip_powerup( self ); + break; + default: + if ( isDefined( level._zombiemode_powerup_zombie_grab ) ) + { + level thread [[ level._zombiemode_powerup_zombie_grab ]]( self ); + } + if ( isDefined( level._game_mode_powerup_zombie_grab ) ) + { + level thread [[ level._game_mode_powerup_zombie_grab ]]( self, who ); + } + break; + } + level thread maps/mp/zombies/_zm_audio::do_announcer_playvox( "powerup", self.powerup_name ); + wait 0.1; + playsoundatposition( "zmb_powerup_grabbed", self.origin ); + self stoploopsound(); + self powerup_delete(); + self notify( "powerup_grabbed" ); + } +} + +powerup_grab(powerup_team) //checked partially changed to match cerberus output +{ + if ( isdefined( self ) && self.zombie_grabbable ) + { + self thread powerup_zombie_grab( powerup_team ); + return; + } + + self endon ( "powerup_timedout" ); + self endon ( "powerup_grabbed" ); + + range_squared = 4096; + while ( isdefined( self ) ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + // Don't let them grab the minigun, tesla, or random weapon if they're downed or reviving + // due to weapon switching issues. + if ( ( self.powerup_name == "minigun" || self.powerup_name == "tesla" ) && players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && ( self.powerup_name == "random_weapon" || self.powerup_name == "meat_stink" ) || players[ i ] usebuttonpressed() && players[ i ] in_revive_trigger() ) + { + i++; + continue; + } + if ( !is_true( self.can_pick_up_in_last_stand ) && players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + i++; + continue; + } + ignore_range = 0; + if ( isdefined( players[ i ].ignore_range_powerup ) && players[ i ].ignore_range_powerup == self ) + { + players[ i ].ignore_range_powerup = undefined; + ignore_range = 1; + } + if ( DistanceSquared( players[ i ].origin, self.origin ) < range_squared || ignore_range ) + { + if ( isdefined(level._powerup_grab_check ) ) + { + if ( !self [[ level._powerup_grab_check ]]( players[ i ] ) ) + { + i++; + continue; + } + } + else if ( isdefined( level.zombie_powerup_grab_func ) ) + { + level thread [[ level.zombie_powerup_grab_func ]](); + break; + } + switch ( self.powerup_name ) + { + case "nuke": + level thread nuke_powerup( self, players[ i ].team ); + players[ i ] thread powerup_vo( "nuke" ); + zombies = getaiarray( level.zombie_team ); + players[ i ].zombie_nuked = arraysort( zombies, self.origin ); + players[ i ] notify( "nuke_triggered" ); + break; + case "full_ammo": + level thread full_ammo_powerup( self ,players[ i ] ); + players[ i ] thread powerup_vo( "full_ammo" ); + break; + case "double_points": + level thread double_points_powerup( self, players[ i ] ); + players[ i ] thread powerup_vo( "double_points" ); + break; + case "insta_kill": + level thread insta_kill_powerup( self,players[ i ] ); + players[ i ] thread powerup_vo( "insta_kill" ); + break; + case "carpenter": + if ( is_classic() ) + { + players[ i ] thread maps/mp/zombies/_zm_pers_upgrades::persistent_carpenter_ability_check(); + } + if ( isdefined( level.use_new_carpenter_func ) ) + { + level thread [[ level.use_new_carpenter_func ]]( self.origin ); + } + else + { + level thread start_carpenter( self.origin ); + } + players[ i ] thread powerup_vo( "carpenter" ); + break; + case "fire_sale": + level thread start_fire_sale( self ); + players[ i ] thread powerup_vo( "firesale" ); + break; + case "bonfire_sale": + level thread start_bonfire_sale( self ); + players[ i ] thread powerup_vo( "firesale" ); + break; + case "minigun": + level thread minigun_weapon_powerup( players[ i ] ); + players[ i ] thread powerup_vo( "minigun" ); + break; + case "free_perk": + level thread free_perk_powerup( self ); + break; + case "tesla": + level thread tesla_weapon_powerup( players[ i ] ); + players[ i ] thread powerup_vo( "tesla" ); + break; + case "random_weapon": + if ( !level random_weapon_powerup( self, players[ i ] ) ) + { + i++; + continue; + } + break; + case "bonus_points_player": + level thread bonus_points_player_powerup( self, players[ i ] ); + players[ i ] thread powerup_vo( "bonus_points_solo" ); + break; + case "bonus_points_team": + level thread bonus_points_team_powerup( self ); + players[ i ] thread powerup_vo( "bonus_points_team" ); + break; + case "teller_withdrawl": + level thread teller_withdrawl( self ,players[ i ] ); + break; + default: + if ( IsDefined( level._zombiemode_powerup_grab ) ) + { + level thread [[ level._zombiemode_powerup_grab ]]( self, players[ i ] ); + } + break; + } + + maps\mp\_demo::bookmark( "zm_player_powerup_grabbed", gettime(), players[ i ] ); + + if( should_award_stat ( self.powerup_name )) //don't do this for things that aren't really a powerup + { + //track # of picked up powerups/drops for the player + players[i] maps/mp/zombies/_zm_stats::increment_client_stat( "drops" ); + players[i] maps/mp/zombies/_zm_stats::increment_player_stat( "drops" ); + players[i] maps/mp/zombies/_zm_stats::increment_client_stat( self.powerup_name + "_pickedup" ); + players[i] maps/mp/zombies/_zm_stats::increment_player_stat( self.powerup_name + "_pickedup" ); + } + + if ( self.solo ) + { + playfx( level._effect[ "powerup_grabbed_solo" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave_solo" ], self.origin ); + } + else if ( self.caution ) + { + playfx( level._effect[ "powerup_grabbed_caution" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave_caution" ], self.origin ); + } + else + { + playfx( level._effect[ "powerup_grabbed" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave" ], self.origin ); + } + + if ( is_true( self.stolen ) ) + { + level notify( "monkey_see_monkey_dont_achieved" ); + } + if ( isdefined( self.grabbed_level_notify ) ) + { + level notify( self.grabbed_level_notify ); + } + + // RAVEN BEGIN bhackbarth: since there is a wait here, flag the powerup as being taken + self.claimed = true; + self.power_up_grab_player = players[ i ]; //Player who grabbed the power up + // RAVEN END + + wait 0.1 ; + + playsoundatposition("zmb_powerup_grabbed", self.origin); + self stoploopsound(); + self hide(); + + //Preventing the line from playing AGAIN if fire sale becomes active before it runs out + if ( self.powerup_name != "fire_sale" ) + { + if ( isdefined( self.power_up_grab_player ) ) + { + if ( isdefined( level.powerup_intro_vox ) ) + { + level thread [[ level.powerup_intro_vox ]]( self ); + return; + } + else if ( isdefined( level.powerup_vo_available ) ) + { + can_say_vo = [[ level.powerup_vo_available ]](); + if ( !can_say_vo ) + { + self powerup_delete(); + self notify( "powerup_grabbed" ); + return; + } + } + } + } + level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( self.powerup_name, self.power_up_grab_player.pers[ "team" ] ); + self powerup_delete(); + self notify( "powerup_grabbed" ); + } + i++; + } + wait 0.1; + } +} + + +start_fire_sale( item ) //checked matches cerberus output +{ + if ( level.zombie_vars[ "zombie_powerup_fire_sale_time" ] > 0 && is_true( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) ) + { + level.zombie_vars[ "zombie_powerup_fire_sale_time" ] += 30; + return; + } + level notify( "powerup fire sale" ); + level endon( "powerup fire sale" ); + level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( "fire_sale" ); + level.zombie_vars[ "zombie_powerup_fire_sale_on" ] = 1; + level thread toggle_fire_sale_on(); + level.zombie_vars[ "zombie_powerup_fire_sale_time" ] = 30; + while ( level.zombie_vars[ "zombie_powerup_fire_sale_time" ] > 0 ) + { + wait 0.05; + level.zombie_vars[ "zombie_powerup_fire_sale_time" ] -= 0.05; + } + level.zombie_vars[ "zombie_powerup_fire_sale_on" ] = 0; + level notify( "fire_sale_off" ); +} + +start_bonfire_sale( item ) //checked matches cerberus output +{ + level notify( "powerup bonfire sale" ); + level endon( "powerup bonfire sale" ); + temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + temp_ent playloopsound( "zmb_double_point_loop" ); + level.zombie_vars[ "zombie_powerup_bonfire_sale_on" ] = 1; + level thread toggle_bonfire_sale_on(); + level.zombie_vars[ "zombie_powerup_bonfire_sale_time" ] = 30; + while ( level.zombie_vars[ "zombie_powerup_bonfire_sale_time" ] > 0 ) + { + wait 0.05; + level.zombie_vars[ "zombie_powerup_bonfire_sale_time" ] -= 0.05; + } + level.zombie_vars[ "zombie_powerup_bonfire_sale_on" ] = 0; + level notify( "bonfire_sale_off" ); + players = get_players(); + i = 0; + while ( i < players.size ) + { + players[ i ] playsound( "zmb_points_loop_off" ); + i++; + } + temp_ent delete(); +} + +start_carpenter( origin ) //checked partially changed to match cerberus output +{ + window_boards = getstructarray( "exterior_goal", "targetname" ); + total = level.exterior_goals.size; + carp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + carp_ent playloopsound( "evt_carpenter" ); + while ( 1 ) + { + windows = get_closest_window_repair( window_boards, origin ); + if ( !isDefined( windows ) ) + { + carp_ent stoploopsound( 1 ); + carp_ent playsoundwithnotify( "evt_carpenter_end", "sound_done" ); + carp_ent waittill( "sound_done" ); + break; + } + else arrayremovevalue( window_boards, windows ); + while ( 1 ) + { + if ( all_chunks_intact( windows, windows.barrier_chunks ) ) + { + break; + } + else chunk = get_random_destroyed_chunk( windows, windows.barrier_chunks ); + if ( !isDefined( chunk ) ) + { + break; + } + windows thread maps/mp/zombies/_zm_blockers::replace_chunk( windows, chunk, undefined, maps/mp/zombies/_zm_powerups::is_carpenter_boards_upgraded(), 1 ); + if ( isDefined( windows.clip ) ) + { + windows.clip enable_trigger(); + windows.clip disconnectpaths(); + } + else + { + blocker_disconnect_paths( windows.neg_start, windows.neg_end ); + } + wait_network_frame(); + wait 0.05; + } + wait_network_frame(); + } + players = get_players(); + i = 0; + while ( i < players.size ) + { + players[ i ] maps/mp/zombies/_zm_score::player_add_points( "carpenter_powerup", 200 ); + i++; + } + carp_ent delete(); +} + +get_closest_window_repair( windows, origin ) //checked partially changed to match cerberus output +{ + current_window = undefined; + shortest_distance = undefined; + i = 0; + while ( i < windows.size ) + { + if ( all_chunks_intact( windows, windows[ i ].barrier_chunks ) ) + { + i++; + continue; + } + if ( !isDefined( current_window ) ) + { + current_window = windows[ i ]; + shortest_distance = distancesquared( current_window.origin, origin ); + i++; + continue; + } + if ( distancesquared( windows[ i ].origin, origin ) < shortest_distance ) + { + current_window = windows[ i ]; + shortest_distance = distancesquared( windows[ i ].origin, origin ); + } + i++; + } + return current_window; +} + +powerup_vo( type ) //checked matches cerberus output +{ + self endon( "death" ); + self endon( "disconnect" ); + if ( isDefined( level.powerup_vo_available ) ) + { + if ( ![[ level.powerup_vo_available ]]() ) + { + return; + } + } + wait randomfloatrange( 2, 2.5 ); + if ( type == "tesla" ) + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", type ); + } + else + { + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "powerup", type ); + } + if ( isDefined( level.custom_powerup_vo_response ) ) + { + level [[ level.custom_powerup_vo_response ]]( self, type ); + } +} + +powerup_wobble_fx() //checked matches cerberus output +{ + self endon( "death" ); + if ( !isDefined( self ) ) + { + return; + } + if ( isDefined( level.powerup_fx_func ) ) + { + self thread [[ level.powerup_fx_func ]](); + return; + } + if ( self.solo ) + { + self setclientfield( "powerup_fx", 2 ); + } + else if ( self.caution ) + { + self setclientfield( "powerup_fx", 4 ); + } + else if ( self.zombie_grabbable ) + { + self setclientfield( "powerup_fx", 3 ); + } + else + { + self setclientfield( "powerup_fx", 1 ); + } +} + +powerup_wobble() //checked matches cerberus output +{ + self endon( "powerup_grabbed" ); + self endon( "powerup_timedout" ); + self thread powerup_wobble_fx(); + while ( isDefined( self ) ) + { + waittime = randomfloatrange( 2.5, 5 ); + yaw = randomint( 360 ); + if ( yaw > 300 ) + { + yaw = 300; + } + else + { + if ( yaw < 60 ) + { + yaw = 60; + } + } + yaw = self.angles[ 1 ] + yaw; + new_angles = ( -60 + randomint( 120 ), yaw, -45 + randomint( 90 ) ); + self rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 ); + if ( isDefined( self.worldgundw ) ) + { + self.worldgundw rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 ); + } + wait randomfloat( waittime - 0.1 ); + } +} + +powerup_timeout() //checked partially changed to match cerberus output +{ + if ( isDefined( level._powerup_timeout_override ) && !isDefined( self.powerup_team ) ) + { + self thread [[ level._powerup_timeout_override ]](); + return; + } + self endon( "powerup_grabbed" ); + self endon( "death" ); + self endon( "powerup_reset" ); + self show(); + wait_time = 15; + if ( isDefined( level._powerup_timeout_custom_time ) ) + { + time = [[ level._powerup_timeout_custom_time ]]( self ); + if ( time == 0 ) + { + return; + } + wait_time = time; + } + wait wait_time; + i = 0; + while ( i < 40 ) + { + if ( i % 2 ) + { + self ghost(); + if ( isDefined( self.worldgundw ) ) + { + self.worldgundw ghost(); + } + } + else + { + self show(); + if ( isDefined( self.worldgundw ) ) + { + self.worldgundw show(); + } + } + if ( i < 15 ) + { + wait 0.5; + i++; + continue; + } + if ( i < 25 ) + { + wait 0.25; + i++; + continue; + } + wait 0.1; + i++; + } + self notify( "powerup_timedout" ); + self powerup_delete(); +} + +powerup_delete() //checked matches cerberus output +{ + arrayremovevalue( level.active_powerups, self, 0 ); + if ( isDefined( self.worldgundw ) ) + { + self.worldgundw delete(); + } + self delete(); +} + +powerup_delete_delayed( time ) //checked matches cerberus output +{ + if ( isDefined( time ) ) + { + wait time; + } + else + { + wait 0.01; + } + self powerup_delete(); +} + +nuke_powerup( drop_item, player_team ) //checked changed to match cerberus output +{ + location = drop_item.origin; + playfx( drop_item.fx, location ); + level thread nuke_flash( player_team ); + wait 0.5; + zombies = getaiarray( level.zombie_team ); + zombies = arraysort( zombies, location ); + zombies_nuked = []; + i = 0; + while ( i < zombies.size ) + { + if ( is_true( zombies[ i ].ignore_nuke ) ) + { + i++; + continue; + } + if ( is_true( zombies[ i ].marked_for_death ) ) + { + i++; + continue; + } + if ( isdefined( zombies[ i ].nuke_damage_func ) ) + { + zombies[ i ] thread [[ zombies[ i ].nuke_damage_func ]](); + i++; + continue; + } + if ( is_magic_bullet_shield_enabled( zombies[ i ] ) ) + { + i++; + continue; + } + zombies[ i ].marked_for_death = 1; + //imported from bo3 _zm_powerup_nuke.gsc + if ( !zombies[ i ].nuked && !is_magic_bullet_shield_enabled( zombies[ i ] ) ) + { + zombies[ i ].nuked = 1; + zombies_nuked[ zombies_nuked.size ] = zombies[ i ]; + } + i++; + } + i = 0; + while ( i < zombies_nuked.size ) + { + wait randomfloatrange( 0.1, 0.7 ); + if ( !isdefined( zombies_nuked[ i ] ) ) + { + i++; + continue; + } + if ( is_magic_bullet_shield_enabled( zombies_nuked[ i ] ) ) + { + i++; + continue; + } + if ( i < 5 && !zombies_nuked[ i ].isdog ) + { + zombies_nuked[ i ] thread maps/mp/animscripts/zm_death::flame_death_fx(); + } + if ( !zombies_nuked[ i ].isdog ) + { + if ( !is_true( zombies_nuked[ i ].no_gib ) ) + { + zombies_nuked[ i ] maps/mp/zombies/_zm_spawner::zombie_head_gib(); + } + zombies_nuked[ i ] playsound("evt_nuked"); + } + zombies_nuked[ i ] dodamage(zombies_nuked[i].health + 666, zombies_nuked[ i ].origin ); + i++; + } + players = get_players( player_team ); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] maps/mp/zombies/_zm_score::player_add_points( "nuke_powerup", 400 ); + } +} + +nuke_flash( team ) //checked matches cerberus output +{ + if ( isDefined( team ) ) + { + get_players()[ 0 ] playsoundtoteam( "evt_nuke_flash", team ); + } + else + { + get_players()[ 0 ] playsound( "evt_nuke_flash" ); + } + fadetowhite = newhudelem(); + fadetowhite.x = 0; + fadetowhite.y = 0; + fadetowhite.alpha = 0; + fadetowhite.horzalign = "fullscreen"; + fadetowhite.vertalign = "fullscreen"; + fadetowhite.foreground = 1; + fadetowhite setshader( "white", 640, 480 ); + fadetowhite fadeovertime( 0.2 ); + fadetowhite.alpha = 0.8; + wait 0.5; + fadetowhite fadeovertime( 1 ); + fadetowhite.alpha = 0; + wait 1.1; + fadetowhite destroy(); +} + +double_points_powerup( drop_item, player ) //checked partially matches cerberus output did not change +{ + level notify( "powerup points scaled_" + player.team ); + level endon( "powerup points scaled_" + player.team ); + team = player.team; + level thread point_doubler_on_hud( drop_item, team ); + if ( is_true( level.pers_upgrade_double_points ) ) + { + player thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_double_points_pickup_start(); + } + if ( isDefined( level.current_game_module ) && level.current_game_module == 2 ) + { + if ( isDefined( player._race_team ) ) + { + if ( player._race_team == 1 ) + { + level._race_team_double_points = 1; + } + else + { + level._race_team_double_points = 2; + } + } + } + level.zombie_vars[ team ][ "zombie_point_scalar" ] = 2; + players = get_players(); + for ( player_index = 0; player_index < players.size; player_index++ ) + { + if ( team == players[ player_index ].team ) + { + players[ player_index ] setclientfield( "score_cf_double_points_active", 1 ); + } + } + wait 30; + level.zombie_vars[ team ][ "zombie_point_scalar" ] = 1; + level._race_team_double_points = undefined; + players = get_players(); + for ( player_index = 0; player_index < players.size; player_index++ ) + { + if ( team == players[ player_index ].team ) + { + players[ player_index ] setclientfield( "score_cf_double_points_active", 0 ); + } + } +} + +full_ammo_powerup( drop_item, player ) //checked changed to match cerberus output +{ + players = get_players( player.team ); + if ( isdefined( level._get_game_module_players ) ) + { + players = [[ level._get_game_module_players ]]( player ); + } + i = 0; + while ( i < players.size ) + { + if ( players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + i++; + continue; + } + primary_weapons = players[ i ] getweaponslist( 1 ); + players[ i ] notify( "zmb_max_ammo" ); + players[ i ] notify( "zmb_lost_knife" ); + players[ i ] notify( "zmb_disable_claymore_prompt" ); + players[ i ] notify( "zmb_disable_spikemore_prompt" ); + x = 0; + while ( x < primary_weapons.size ) + { + if ( level.headshots_only && is_lethal_grenade(primary_weapons[ x ] ) ) + { + x++; + continue; + } + if ( isdefined( level.zombie_include_equipment ) && isdefined( level.zombie_include_equipment[ primary_weapons[ x ] ] ) ) + { + x++; + continue; + } + if ( isdefined( level.zombie_weapons_no_max_ammo ) && isdefined( level.zombie_weapons_no_max_ammo[ primary_weapons[ x ] ] ) ) + { + x++; + continue; + } + if ( players[ i ] hasweapon( primary_weapons[ x ] ) ) + { + players[ i ] givemaxammo( primary_weapons[ x ] ); + } + x++; + } + i++; + } + level thread full_ammo_on_hud( drop_item, player.team ); +} + +insta_kill_powerup( drop_item, player ) //checked matches cerberus output +{ + level notify( "powerup instakill_" + player.team ); + level endon( "powerup instakill_" + player.team ); + if ( isDefined( level.insta_kill_powerup_override ) ) + { + level thread [[ level.insta_kill_powerup_override ]]( drop_item, player ); + return; + } + if ( is_classic() ) + { + player thread maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_insta_kill_upgrade_check(); + } + team = player.team; + level thread insta_kill_on_hud( drop_item, team ); + level.zombie_vars[ team ][ "zombie_insta_kill" ] = 1; + wait 30; + level.zombie_vars[ team ][ "zombie_insta_kill" ] = 0; + players = get_players( team ); + i = 0; + while ( i < players.size ) + { + if ( isDefined( players[ i ] ) ) + { + players[ i ] notify( "insta_kill_over" ); + } + i++; + } +} + +is_insta_kill_active() //checked matches cerberus output +{ + return level.zombie_vars[ self.team ][ "zombie_insta_kill" ]; +} + +check_for_instakill( player, mod, hit_location ) //checked changed to match cerberus output +{ + if ( isDefined( player ) && isalive( player ) && isDefined( level.check_for_instakill_override ) ) + { + if ( !self [[ level.check_for_instakill_override ]]( player ) ) + { + return; + } + if ( player.use_weapon_type == "MOD_MELEE" ) + { + player.last_kill_method = "MOD_MELEE"; + } + else + { + player.last_kill_method = "MOD_UNKNOWN"; + } + modname = remove_mod_from_methodofdeath( mod ); + if ( isDefined( self.no_gib ) && self.no_gib ) + { + self maps/mp/zombies/_zm_spawner::zombie_head_gib(); + } + self.health = 1; + self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); + player notify( "zombie_killed" ); + } + if ( isDefined( player ) && isalive( player ) && level.zombie_vars[ player.team ][ "zombie_insta_kill" ] || is_true( player.personal_instakill ) ) + { + if ( is_magic_bullet_shield_enabled( self ) ) + { + return; + } + if ( isDefined( self.instakill_func ) ) + { + self thread [[ self.instakill_func ]](); + return; + } + if ( player.use_weapon_type == "MOD_MELEE" ) + { + player.last_kill_method = "MOD_MELEE"; + } + else + { + player.last_kill_method = "MOD_UNKNOWN"; + } + modname = remove_mod_from_methodofdeath( mod ); + if ( flag( "dog_round" ) ) + { + self.health = 1; + self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); + player notify( "zombie_killed" ); + } + else if ( isdefined( self.no_gib ) && !self.no_gib ) + { + self maps/mp/zombies/_zm_spawner::zombie_head_gib(); + } + self.health = 1; + self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); + player notify( "zombie_killed" ); + } +} + +insta_kill_on_hud( drop_item, player_team ) //checked matches cerberus output +{ + if ( level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_on" ] ) + { + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_time" ] = 30; + return; + } + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_on" ] = 1; + level thread time_remaning_on_insta_kill_powerup( player_team ); +} + +time_remaning_on_insta_kill_powerup( player_team ) //checked matches cerberus output +{ + temp_enta = spawn( "script_origin", ( 0, 0, 0 ) ); + temp_enta playloopsound( "zmb_insta_kill_loop" ); + while ( level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_time" ] >= 0 ) + { + wait 0.05; + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_time" ] -= 0.05; + } + get_players()[ 0 ] playsoundtoteam( "zmb_insta_kill", player_team ); + temp_enta stoploopsound( 2 ); + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_on" ] = 0; + level.zombie_vars[ player_team ][ "zombie_powerup_insta_kill_time" ] = 30; + temp_enta delete(); +} + +point_doubler_on_hud( drop_item, player_team ) //checked matches cerberus output +{ + self endon( "disconnect" ); + if ( level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_on" ] ) + { + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] = 30; + return; + } + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_on" ] = 1; + level thread time_remaining_on_point_doubler_powerup( player_team ); +} + +time_remaining_on_point_doubler_powerup( player_team ) //checked partially matches cerberus output did not change +{ + temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + temp_ent playloopsound( "zmb_double_point_loop" ); + while ( level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] >= 0 ) + { + wait 0.05; + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] -= 0.05; + } + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_on" ] = 0; + players = get_players( player_team ); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] playsound( "zmb_points_loop_off" ); + } + temp_ent stoploopsound( 2 ); + level.zombie_vars[ player_team ][ "zombie_powerup_point_doubler_time" ] = 30; + temp_ent delete(); +} + +toggle_bonfire_sale_on() //checked matches cerberus output +{ + level endon( "powerup bonfire sale" ); + if ( !isDefined( level.zombie_vars[ "zombie_powerup_bonfire_sale_on" ] ) ) + { + return; + } + if ( level.zombie_vars[ "zombie_powerup_bonfire_sale_on" ] ) + { + if ( isDefined( level.bonfire_init_func ) ) + { + level thread [[ level.bonfire_init_func ]](); + } + level waittill( "bonfire_sale_off" ); + } +} + +toggle_fire_sale_on() //checked partially matches cerberus output did not change +{ + level endon( "powerup fire sale" ); + if ( !isDefined( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) ) + { + return; + } + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) + { + for ( i = 0; i < level.chests.size; i++ ) + { + show_firesale_box = level.chests[ i ] [[ level._zombiemode_check_firesale_loc_valid_func ]](); + if ( show_firesale_box ) + { + level.chests[ i ].zombie_cost = 10; + if ( level.chest_index != i ) + { + level.chests[ i ].was_temp = 1; + if ( is_true( level.chests[ i ].hidden ) ) + { + level.chests[ i ] thread maps/mp/zombies/_zm_magicbox::show_chest(); + } + wait_network_frame(); + } + } + } + level waittill( "fire_sale_off" ); + waittillframeend; + for ( i = 0; i < level.chests.size; i++ ) + { + show_firesale_box = level.chests[ i ] [[ level._zombiemode_check_firesale_loc_valid_func ]](); + if ( show_firesale_box ) + { + if ( level.chest_index != i && isDefined( level.chests[ i ].was_temp ) ) + { + level.chests[ i ].was_temp = undefined; + level thread remove_temp_chest( i ); + } + level.chests[ i ].zombie_cost = level.chests[ i ].old_cost; + } + } + } +} + +fire_sale_weapon_wait() //checked matches cerberus output +{ + self.zombie_cost = self.old_cost; + while ( isDefined( self.chest_user ) ) + { + wait_network_frame(); + } + self set_hint_string( self, "default_treasure_chest", self.zombie_cost ); +} + +remove_temp_chest( chest_index ) //checked partially matches cerberus output did not change +{ + while ( isDefined( level.chests[ chest_index ].chest_user ) || isDefined( level.chests[ chest_index ]._box_open ) && level.chests[ chest_index ]._box_open == 1 ) + { + wait_network_frame(); + } + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] ) + { + level.chests[ chest_index ].was_temp = 1; + level.chests[ chest_index ].zombie_cost = 10; + return; + } + for ( i = 0; i < chest_index; i++ ) + { + wait_network_frame(); + } + playfx( level._effect[ "poltergeist" ], level.chests[ chest_index ].orig_origin ); + level.chests[ chest_index ].zbarrier playsound( "zmb_box_poof_land" ); + level.chests[ chest_index ].zbarrier playsound( "zmb_couch_slam" ); + wait_network_frame(); + level.chests[ chest_index ] maps/mp/zombies/_zm_magicbox::hide_chest(); +} + +devil_dialog_delay() //checked matches cerberus output +{ + wait 1; +} + +full_ammo_on_hud( drop_item, player_team ) //checked matches cerberus output +{ + self endon( "disconnect" ); + hudelem = maps/mp/gametypes_zm/_hud_util::createserverfontstring( "objective", 2, player_team ); + hudelem maps/mp/gametypes_zm/_hud_util::setpoint( "TOP", undefined, 0, level.zombie_vars[ "zombie_timer_offset" ] - ( level.zombie_vars[ "zombie_timer_offset_interval" ] * 2 ) ); + hudelem.sort = 0.5; + hudelem.alpha = 0; + hudelem fadeovertime( 0.5 ); + hudelem.alpha = 1; + if ( isDefined( drop_item ) ) + { + hudelem.label = drop_item.hint; + } + hudelem thread full_ammo_move_hud( player_team ); +} + +full_ammo_move_hud( player_team ) //checked matches cerberus output +{ + players = get_players( player_team ); + players[ 0 ] playsoundtoteam( "zmb_full_ammo", player_team ); + wait 0.5; + move_fade_time = 1.5; + self fadeovertime( move_fade_time ); + self moveovertime( move_fade_time ); + self.y = 270; + self.alpha = 0; + wait move_fade_time; + self destroy(); +} + +check_for_rare_drop_override( pos ) //checked matches cerberus output +{ + if ( isDefined( flag( "ape_round" ) ) && flag( "ape_round" ) ) + { + return 0; + } + return 0; +} + +setup_firesale_audio() //checked changed to match cerberus output +{ + wait 2; + intercom = getentarray( "intercom", "targetname" ); + while ( 1 ) + { + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 0 ) + { + wait 0.2; + } + for ( i = 0; i < intercom.size; i++ ) + { + intercom [i ] thread play_firesale_audio(); + } + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 ) + { + wait 0.1; + } + level notify( "firesale_over" ); + } +} + +play_firesale_audio() //checked matches cerberus output +{ + if ( is_true( level.sndfiresalemusoff ) ) + { + return; + } + if ( is_true( level.sndannouncerisrich ) ) + { + self playloopsound( "mus_fire_sale_rich" ); + } + else + { + self playloopsound( "mus_fire_sale" ); + } + level waittill( "firesale_over" ); + self stoploopsound(); +} + +setup_bonfiresale_audio() //checked changed to match cerberus output +{ + wait 2; + intercom = getentarray( "intercom", "targetname" ); + while ( 1 ) + { + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 0 ) + { + wait 0.2; + } + for ( i = 0; i < intercom.size; i++ ) + { + intercom[ i ] thread play_bonfiresale_audio(); + } + while ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 ) + { + wait 0.1; + } + level notify( "firesale_over" ); + } +} + +play_bonfiresale_audio() //checked matches cerberus output +{ + if ( is_true( level.sndfiresalemusoff ) ) + { + return; + } + if ( is_true( level.sndannouncerisrich ) ) + { + self playloopsound( "mus_fire_sale_rich" ); + } + else + { + self playloopsound( "mus_fire_sale" ); + } + level waittill( "firesale_over" ); + self stoploopsound(); +} + +free_perk_powerup( item ) //checked changed to match cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" ) + { + player = players[ i ]; + if ( isDefined( item.ghost_powerup ) ) + { + player maps/mp/zombies/_zm_stats::increment_client_stat( "buried_ghost_perk_acquired", 0 ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "buried_ghost_perk_acquired" ); + player notify( "player_received_ghost_round_free_perk" ); + } + free_perk = player maps/mp/zombies/_zm_perks::give_random_perk(); + if ( is_true( level.disable_free_perks_before_power ) ) + { + player thread disable_perk_before_power( free_perk ); + } + } + } +} + +disable_perk_before_power( perk ) //checked matches cerberus output +{ + self endon( "disconnect" ); + if ( isDefined( perk ) ) + { + wait 0.1; + if ( !flag( "power_on" ) ) + { + a_players = get_players(); + if ( isDefined( a_players ) && a_players.size == 1 && perk == "specialty_quickrevive" ) + { + return; + } + self perk_pause( perk ); + flag_wait( "power_on" ); + self perk_unpause( perk ); + } + } +} + +random_weapon_powerup_throttle() //checked matches cerberus output +{ + self.random_weapon_powerup_throttle = 1; + wait 0.25; + self.random_weapon_powerup_throttle = 0; +} + +random_weapon_powerup( item, player ) //checked partially matches cerberus output did not change +{ + if ( player.sessionstate == "spectator" || player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return 0; + } + if ( !is_true( player.random_weapon_powerup_throttle ) || player isswitchingweapons() && player.is_drinking > 0 ) + { + return 0; + } + current_weapon = player getcurrentweapon(); + current_weapon_type = weaponinventorytype( current_weapon ); + if ( !is_tactical_grenade( item.weapon ) ) + { + if ( current_weapon_type != "primary" && current_weapon_type != "altmode" ) + { + return 0; + } + if ( !isDefined( level.zombie_weapons[ current_weapon ] ) && !maps/mp/zombies/_zm_weapons::is_weapon_upgraded( current_weapon ) && current_weapon_type != "altmode" ) + { + return 0; + } + } + player thread random_weapon_powerup_throttle(); + weapon_string = item.weapon; + if ( weapon_string == "knife_ballistic_zm" ) + { + weapon = player maps/mp/zombies/_zm_melee_weapon::give_ballistic_knife( weapon_string, 0 ); + } + else + { + if ( weapon_string == "knife_ballistic_upgraded_zm" ) + { + weapon = player maps/mp/zombies/_zm_melee_weapon::give_ballistic_knife( weapon_string, 1 ); + } + } + player thread maps/mp/zombies/_zm_weapons::weapon_give( weapon_string ); + return 1; +} + +bonus_points_player_powerup( item, player ) //checked matches cerberus output +{ + points = randomintrange( 1, 25 ) * 100; + if ( isDefined( level.bonus_points_powerup_override ) ) + { + points = [[ level.bonus_points_powerup_override ]](); + } + if ( !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && player.sessionstate != "spectator" ) + { + player maps/mp/zombies/_zm_score::player_add_points( "bonus_points_powerup", points ); + } +} + +bonus_points_team_powerup( item ) //checked changed to match cerberus output +{ + points = randomintrange( 1, 25 ) * 100; + if ( isDefined( level.bonus_points_powerup_override ) ) + { + points = [[ level.bonus_points_powerup_override ]](); + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" ) + { + players[ i ] maps/mp/zombies/_zm_score::player_add_points( "bonus_points_powerup", points ); + } + } +} + +lose_points_team_powerup( item ) //checked partially changed to match cerberus output +{ + points = randomintrange( 1, 25 ) * 100; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( !players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() && players[ i ].sessionstate != "spectator" ) + { + if ( ( players[ i ].score - points ) <= 0 ) + { + players[ i ] maps/mp/zombies/_zm_score::minus_to_player_score( players[ i ].score ); + i++; + continue; + } + else + { + players[ i ] maps/mp/zombies/_zm_score::minus_to_player_score( points ); + } + } + i++; + } +} + +lose_perk_powerup( item ) //checked partially matches cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + if ( !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && player.sessionstate != "spectator" ) + { + player maps/mp/zombies/_zm_perks::lose_random_perk(); + } + } +} + +empty_clip_powerup( item ) //checked partially matches cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + if ( !player maps/mp/zombies/_zm_laststand::player_is_in_laststand() && player.sessionstate != "spectator" ) + { + weapon = player getcurrentweapon(); + player setweaponammoclip( weapon, 0 ); + } + } +} + +minigun_weapon_powerup( ent_player, time ) //checked matches cerberus output +{ + ent_player endon( "disconnect" ); + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + if ( !isDefined( time ) ) + { + time = 30; + } + if ( isDefined( level._minigun_time_override ) ) + { + time = level._minigun_time_override; + } + if ( ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] || ent_player getcurrentweapon() == "minigun_zm" && is_true( ent_player.has_minigun ) ) + { + if ( ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] < time ) + { + ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] = time; + } + return; + } + ent_player notify( "replace_weapon_powerup" ); + ent_player._show_solo_hud = 1; + level._zombie_minigun_powerup_last_stand_func = ::minigun_watch_gunner_downed; + ent_player.has_minigun = 1; + ent_player.has_powerup_weapon = 1; + ent_player increment_is_drinking(); + ent_player._zombie_gun_before_minigun = ent_player getcurrentweapon(); + ent_player giveweapon( "minigun_zm" ); + ent_player switchtoweapon( "minigun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = 1; + level thread minigun_weapon_powerup_countdown( ent_player, "minigun_time_over", time ); + level thread minigun_weapon_powerup_replace( ent_player, "minigun_time_over" ); +} + +minigun_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) //checked matches cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "disconnect" ); + ent_player endon( "player_downed" ); + ent_player endon( str_gun_return_notify ); + ent_player endon( "replace_weapon_powerup" ); + setclientsysstate( "levelNotify", "minis", ent_player ); + ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] = time; + while ( ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] > 0 ) + { + wait 0.05; + ent_player.zombie_vars[ "zombie_powerup_minigun_time" ] -= 0.05; + } + setclientsysstate( "levelNotify", "minie", ent_player ); + level thread minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ); +} + +minigun_weapon_powerup_replace( ent_player, str_gun_return_notify ) //checked matches cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "disconnect" ); + ent_player endon( "player_downed" ); + ent_player endon( str_gun_return_notify ); + ent_player waittill( "replace_weapon_powerup" ); + ent_player takeweapon( "minigun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = 0; + ent_player.has_minigun = 0; + ent_player decrement_is_drinking(); +} + +minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ) //checked partially matches cerberus output did not change +{ + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + ent_player takeweapon( "minigun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_minigun_on" ] = 0; + ent_player._show_solo_hud = 0; + ent_player.has_minigun = 0; + ent_player.has_powerup_weapon = 0; + ent_player notify( str_gun_return_notify ); + ent_player decrement_is_drinking(); + while ( isDefined( ent_player._zombie_gun_before_minigun ) ) + { + player_weapons = ent_player getweaponslistprimaries(); + + for ( i = 0; i < player_weapons.size; i++ ) + { + if ( player_weapons[ i ] == ent_player._zombie_gun_before_minigun ) + { + ent_player switchtoweapon( ent_player._zombie_gun_before_minigun ); + return; + } + } + } + primaryweapons = ent_player getweaponslistprimaries(); + if ( primaryweapons.size > 0 ) + { + ent_player switchtoweapon( primaryweapons[ 0 ] ); + } + else + { + allweapons = ent_player getweaponslist( 1 ); + for ( i = 0; i < allweapons.size; i++ ) + { + if ( is_melee_weapon( allweapons[ i ] ) ) + { + ent_player switchtoweapon( allweapons[ i ] ); + return; + } + } + } +} + +minigun_weapon_powerup_off() //checked matches cerberus output +{ + self.zombie_vars[ "zombie_powerup_minigun_time" ] = 0; +} + +minigun_watch_gunner_downed() //checked partially matches cerberus output did not change +{ + if ( !is_true( self.has_minigun ) ) + { + return; + } + primaryweapons = self getweaponslistprimaries(); + for ( i = 0; i < primaryweapons.size; i++ ) + { + if ( primaryweapons[ i ] == "minigun_zm" ) + { + self takeweapon( "minigun_zm" ); + } + } + self notify( "minigun_time_over" ); + self.zombie_vars[ "zombie_powerup_minigun_on" ] = 0; + self._show_solo_hud = 0; + wait 0.05; + self.has_minigun = 0; + self.has_powerup_weapon = 0; +} + +tesla_weapon_powerup( ent_player, time ) //checked changed to match cerberus output +{ + ent_player endon( "disconnect" ); + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + if ( !isDefined( time ) ) + { + time = 11; + } + if ( ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] && ent_player getcurrentweapon() == "tesla_gun_zm" || is_true( ent_player.has_tesla ) ) + { + ent_player givemaxammo( "tesla_gun_zm" ); + if ( ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] < time ) + { + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = time; + } + return; + } + ent_player notify( "replace_weapon_powerup" ); + ent_player._show_solo_hud = 1; + level._zombie_tesla_powerup_last_stand_func = ::tesla_watch_gunner_downed; + ent_player.has_tesla = 1; + ent_player.has_powerup_weapon = 1; + ent_player increment_is_drinking(); + ent_player._zombie_gun_before_tesla = ent_player getcurrentweapon(); + ent_player giveweapon( "tesla_gun_zm" ); + ent_player givemaxammo( "tesla_gun_zm" ); + ent_player switchtoweapon( "tesla_gun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = 1; + level thread tesla_weapon_powerup_countdown( ent_player, "tesla_time_over", time ); + level thread tesla_weapon_powerup_replace( ent_player, "tesla_time_over" ); +} + +tesla_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) //checked changed to match cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + ent_player endon( str_gun_return_notify ); + ent_player endon( "replace_weapon_powerup" ); + setclientsysstate( "levelNotify", "minis", ent_player ); + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = time; + while ( 1 ) + { + ent_player waittill_any( "weapon_fired", "reload", "zmb_max_ammo" ); + if ( !ent_player getweaponammostock( "tesla_gun_zm" ) ) + { + clip_count = ent_player getweaponammoclip( "tesla_gun_zm" ); + if ( !clip_count ) + { + break; + } + else if ( clip_count == 1 ) + { + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 1; + } + else if ( clip_count == 3 ) + { + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 6; + } + } + else + { + ent_player.zombie_vars[ "zombie_powerup_tesla_time" ] = 11; + } + } + setclientsysstate( "levelNotify", "minie", ent_player ); + level thread tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ); +} + +tesla_weapon_powerup_replace( ent_player, str_gun_return_notify ) //checked matches cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "disconnect" ); + ent_player endon( "player_downed" ); + ent_player endon( str_gun_return_notify ); + ent_player waittill( "replace_weapon_powerup" ); + ent_player takeweapon( "tesla_gun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = 0; + ent_player.has_tesla = 0; + ent_player decrement_is_drinking(); +} + +tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ) //checked changed to match cerberus output +{ + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + ent_player takeweapon( "tesla_gun_zm" ); + ent_player.zombie_vars[ "zombie_powerup_tesla_on" ] = 0; + ent_player._show_solo_hud = 0; + ent_player.has_tesla = 0; + ent_player.has_powerup_weapon = 0; + ent_player notify( str_gun_return_notify ); + ent_player decrement_is_drinking(); + if ( isDefined( ent_player._zombie_gun_before_tesla ) ) + { + player_weapons = ent_player getweaponslistprimaries(); + for ( i = 0; i < player_weapons.size; i++ ) + { + if ( player_weapons[ i ] == ent_player._zombie_gun_before_tesla ) + { + ent_player switchtoweapon( ent_player._zombie_gun_before_tesla ); + return; + } + } + } + primaryweapons = ent_player getweaponslistprimaries(); + if ( primaryweapons.size > 0 ) + { + ent_player switchtoweapon( primaryweapons[ 0 ] ); + } + allweapons = ent_player getweaponslist( 1 ); + for ( i = 0; i < allweapons.size; i++ ) + { + if ( is_melee_weapon( allweapons[ i ] ) ) + { + ent_player switchtoweapon( allweapons[ i ] ); + return; + } + } +} + +tesla_weapon_powerup_off() //checked matches cerberus output +{ + self.zombie_vars[ "zombie_powerup_tesla_time" ] = 0; +} + +tesla_watch_gunner_downed() //checked changed to match cerberus output +{ + if ( !is_true( self.has_tesla ) ) + { + return; + } + primaryweapons = self getweaponslistprimaries(); + for ( i = 0; i < primaryweapons.size; i++ ) + { + if ( primaryweapons[ i ] == "tesla_gun_zm" ) + { + self takeweapon( "tesla_gun_zm" ); + } + } + self notify( "tesla_time_over" ); + self.zombie_vars[ "zombie_powerup_tesla_on" ] = 0; + self._show_solo_hud = 0; + wait 0.05; + self.has_tesla = 0; + self.has_powerup_weapon = 0; +} + +tesla_powerup_active() //checked changed to match cerberus output +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ].zombie_vars[ "zombie_powerup_tesla_on" ] ) + { + return 1; + } + } + return 0; +} + +print_powerup_drop( powerup, type ) //devcall only, deleted +{ + /* + /# + if(!isdefined(level.powerup_drop_time)) + { + level.powerup_drop_time = 0; + level.powerup_random_count = 0; + level.powerup_score_count = 0; + } + time = GetTime() - level.powerup_drop_time * 0.001; + level.powerup_drop_time = GetTime(); + if(type == "random") + { + level.powerup_random_count++; + } + else + { + level.powerup_score_count++; + } + println("========== POWER UP DROPPED =========="); + println("DROPPED: " + powerup); + println("HOW IT DROPPED: " + type); + println("--------------------"); + println("Drop Time: " + time); + println("Random Powerup Count: " + level.powerup_random_count); + println("Random Powerup Count: " + level.powerup_score_count); + println("======================================"); + #/ + */ +} + +register_carpenter_node( node, callback ) //checked matches cerberus output +{ + if ( !isDefined( level._additional_carpenter_nodes ) ) + { + level._additional_carpenter_nodes = []; + } + node._post_carpenter_callback = callback; + level._additional_carpenter_nodes[ level._additional_carpenter_nodes.size ] = node; +} + +start_carpenter_new( origin ) //checked partially changed to match cerberus output +{ + level.carpenter_powerup_active = 1; + window_boards = getstructarray( "exterior_goal", "targetname" ); + if ( isDefined( level._additional_carpenter_nodes ) ) + { + window_boards = arraycombine( window_boards, level._additional_carpenter_nodes, 0, 0 ); + } + carp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + carp_ent playloopsound( "evt_carpenter" ); + boards_near_players = get_near_boards( window_boards ); + boards_far_from_players = get_far_boards( window_boards ); + level repair_far_boards( boards_far_from_players, maps/mp/zombies/_zm_powerups::is_carpenter_boards_upgraded() ); + + i = 0; + while ( i < boards_near_players.size ) + { + window = boards_near_players[ i ]; + num_chunks_checked = 0; + last_repaired_chunk = undefined; + while ( 1 ) + { + if ( all_chunks_intact( window, window.barrier_chunks ) ) + { + break; + } + chunk = get_random_destroyed_chunk( window, window.barrier_chunks ); + if ( !isDefined( chunk ) ) + { + break; + } + window thread maps/mp/zombies/_zm_blockers::replace_chunk( window, chunk, undefined, maps/mp/zombies/_zm_powerups::is_carpenter_boards_upgraded(), 1 ); + last_repaired_chunk = chunk; + if ( isDefined( window.clip ) ) + { + window.clip enable_trigger(); + window.clip disconnectpaths(); + } + else + { + blocker_disconnect_paths( window.neg_start, window.neg_end ); + } + wait_network_frame(); + num_chunks_checked++; + if ( num_chunks_checked >= 20 ) + { + break; + } + } + if ( isDefined( window.zbarrier ) ) + { + if ( isDefined( last_repaired_chunk ) ) + { + while ( window.zbarrier getzbarrierpiecestate( last_repaired_chunk ) == "closing" ) + { + wait 0.05; + } + if ( isDefined( window._post_carpenter_callback ) ) + { + window [[ window._post_carpenter_callback ]](); + } + } + i++; + continue; + } + while ( isDefined( last_repaired_chunk ) && last_repaired_chunk.state == "mid_repair" ) + { + wait 0.05; + } + i++; + } + carp_ent stoploopsound( 1 ); + carp_ent playsoundwithnotify( "evt_carpenter_end", "sound_done" ); + carp_ent waittill( "sound_done" ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] maps/mp/zombies/_zm_score::player_add_points( "carpenter_powerup", 200 ); + } + carp_ent delete(); + level notify( "carpenter_finished" ); + level.carpenter_powerup_active = undefined; +} + +is_carpenter_boards_upgraded() //checked matches cerberus output +{ + if ( isDefined( level.pers_carpenter_boards_active ) && level.pers_carpenter_boards_active == 1 ) + { + return 1; + } + return 0; +} + +get_near_boards( windows ) //checked changed to match cerberus output +{ + players = get_players(); + boards_near_players = []; + for ( j = 0; j < windows.size; j++ ) + { + close = 0; + for ( i = 0; i < players.size; i++ ) + { + origin = undefined; + if ( isdefined( windows[ j ].zbarrier ) ) + { + origin = windows[ j ].zbarrier.origin; + } + else + { + origin = windows[ j ].origin; + } + if ( distancesquared( players[ i ].origin, origin ) <= level.board_repair_distance_squared ) + { + close = 1; + break; + } + } + if ( close ) + { + boards_near_players[ boards_near_players.size ] = windows[ j ]; + } + } + return boards_near_players; +} + +get_far_boards( windows ) //checked changed to match cerberus output +{ + players = get_players(); + boards_far_from_players = []; + for ( j = 0; j < windows.size; j++ ) + { + close = 0; + for ( i = 0; i < players.size; i++ ) + { + origin = undefined; + if ( isdefined( windows[ j ].zbarrier ) ) + { + origin = windows[ j ].zbarrier.origin; + } + else + { + origin = windows[ j ].origin; + } + if ( distancesquared( players[ i ].origin, origin ) >= level.board_repair_distance_squared ) + { + close = 1; + break; + } + } + if ( close ) + { + boards_far_from_players[ boards_far_from_players.size ] = windows[ j ]; + } + } + return boards_far_from_players; +} + +repair_far_boards( barriers, upgrade ) //checked changed to match cerberus output +{ + i = 0; + while ( i < barriers.size ) + { + barrier = barriers[ i ]; + if ( all_chunks_intact( barrier, barrier.barrier_chunks ) ) + { + i++; + continue; + } + if ( isdefined( barrier.zbarrier ) ) + { + a_pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); + if ( isdefined( a_pieces ) ) + { + xx = 0; + while ( xx < a_pieces.size ) + { + chunk = a_pieces[ xx ]; + if ( upgrade ) + { + barrier.zbarrier zbarrierpieceuseupgradedmodel( chunk ); + barrier.zbarrier.chunk_health[ chunk ] = barrier.zbarrier getupgradedpiecenumlives( chunk ); + xx++; + continue; + } + barrier.zbarrier zbarrierpieceusedefaultmodel( chunk ); + barrier.zbarrier.chunk_health[ chunk ] = 0; + xx++; + } + } + for ( x = 0; x < barrier.zbarrier getnumzbarrierpieces(); x++ ) + { + barrier.zbarrier setzbarrierpiecestate( x, "closed" ); + barrier.zbarrier showzbarrierpiece( x ); + } + } + else if ( isdefined( barrier.clip ) ) + { + barrier.clip enable_trigger(); + barrier.clip disconnectpaths(); + } + else + { + blocker_disconnect_paths( barrier.neg_start, barrier.neg_end ); + } + if ( i % 4 == 0 ) + { + wait_network_frame(); + } + i++; + } +} + +func_should_never_drop() //checked matches cerberus output +{ + return 0; +} + +func_should_always_drop() //checked matches cerberus output +{ + return 1; +} + +func_should_drop_minigun() //checked matches cerberus output +{ + if ( minigun_no_drop() ) + { + return 0; + } + return 1; +} + +func_should_drop_carpenter() //checked matches cerberus output +{ + if ( get_num_window_destroyed() < 5 ) + { + return 0; + } + return 1; +} + +func_should_drop_fire_sale() //checked partially changed to match cerberus output +{ + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 || level.chest_moves < 1 || is_true( level.disable_firesale_drop ) ) + { + return 0; + } + return 1; +} + +powerup_move() //checked partially changed to match cerberus output +{ + self endon( "powerup_timedout" ); + self endon( "powerup_grabbed" ); + drag_speed = 75; + while ( 1 ) + { + self waittill( "move_powerup", moveto, distance ); + drag_vector = moveto - self.origin; + range_squared = lengthsquared( drag_vector ); + if ( range_squared > distance * distance ) + { + drag_vector = vectornormalize( drag_vector ); + drag_vector = distance * drag_vector; + moveto = self.origin + drag_vector; + } + self.origin = moveto; + } +} + +powerup_emp() //checked matches cerberus output +{ + self endon( "powerup_timedout" ); + self endon( "powerup_grabbed" ); + if ( !should_watch_for_emp() ) + { + return; + } + while ( 1 ) + { + level waittill( "emp_detonate", origin, radius ); + if ( distancesquared( origin, self.origin ) < ( radius * radius ) ) + { + playfx( level._effect[ "powerup_off" ], self.origin ); + self thread powerup_delete_delayed(); + self notify( "powerup_timedout" ); + } + } } -minigun_no_drop() +get_powerups( origin, radius ) //checked changed to match cerberus output { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i].zombie_vars["zombie_powerup_minigun_on"] == 1 ) - return true; - } - - if ( !flag( "power_on" ) ) - { - if ( flag( "solo_game" ) ) - { - if ( level.solo_lives_given == 0 ) - return true; - } - else - return true; - } - - return false; -} - -get_num_window_destroyed() -{ - num = 0; - - for ( i = 0; i < level.exterior_goals.size; i++ ) - { - if ( all_chunks_destroyed( level.exterior_goals[i], level.exterior_goals[i].barrier_chunks ) ) - num += 1; - } - - return num; -} - -watch_for_drop() -{ - flag_wait( "start_zombie_round_logic" ); - flag_wait( "begin_spawning" ); - players = get_players(); - score_to_drop = players.size * level.zombie_vars["zombie_score_start_" + players.size + "p"] + level.zombie_vars["zombie_powerup_drop_increment"]; - - while ( true ) - { - flag_wait( "zombie_drop_powerups" ); - players = get_players(); - curr_total_score = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( players[i].score_total ) ) - curr_total_score += players[i].score_total; - } - - if ( curr_total_score > score_to_drop ) - { - level.zombie_vars["zombie_powerup_drop_increment"] *= 1.14; - score_to_drop = curr_total_score + level.zombie_vars["zombie_powerup_drop_increment"]; - level.zombie_vars["zombie_drop_item"] = 1; - } - - wait 0.5; - } -} - -add_zombie_powerup( powerup_name, model_name, hint, func_should_drop_with_regular_powerups, solo, caution, zombie_grabbable, fx, client_field_name, time_name, on_name, clientfield_version ) -{ - if ( !isdefined( clientfield_version ) ) - clientfield_version = 1; - - if ( isdefined( level.zombie_include_powerups ) && !isdefined( level.zombie_include_powerups[powerup_name] ) ) - return; - - precachemodel( model_name ); - precachestring( hint ); - struct = spawnstruct(); - - if ( !isdefined( level.zombie_powerups ) ) - level.zombie_powerups = []; - - struct.powerup_name = powerup_name; - struct.model_name = model_name; - struct.weapon_classname = "script_model"; - struct.hint = hint; - struct.func_should_drop_with_regular_powerups = func_should_drop_with_regular_powerups; - struct.solo = solo; - struct.caution = caution; - struct.zombie_grabbable = zombie_grabbable; - - if ( isdefined( fx ) ) - struct.fx = loadfx( fx ); - - level.zombie_powerups[powerup_name] = struct; - level.zombie_powerup_array[level.zombie_powerup_array.size] = powerup_name; - add_zombie_special_drop( powerup_name ); - - if ( !level.createfx_enabled ) - { - if ( isdefined( client_field_name ) ) - { - registerclientfield( "toplayer", client_field_name, clientfield_version, 2, "int" ); - struct.client_field_name = client_field_name; - struct.time_name = time_name; - struct.on_name = on_name; - } - } -} - -powerup_set_can_pick_up_in_last_stand( powerup_name, b_can_pick_up ) -{ - level.zombie_powerups[powerup_name].can_pick_up_in_last_stand = b_can_pick_up; -} - -add_zombie_special_drop( powerup_name ) -{ - level.zombie_special_drop_array[level.zombie_special_drop_array.size] = powerup_name; -} - -include_zombie_powerup( powerup_name ) -{ - if ( !isdefined( level.zombie_include_powerups ) ) - level.zombie_include_powerups = []; - - level.zombie_include_powerups[powerup_name] = 1; -} - -powerup_round_start() -{ - level.powerup_drop_count = 0; -} - -powerup_drop( drop_point ) -{ - if ( level.powerup_drop_count >= level.zombie_vars["zombie_powerup_drop_max_per_round"] ) - { -/# - println( "^3POWERUP DROP EXCEEDED THE MAX PER ROUND!" ); -#/ - return; - } - - if ( !isdefined( level.zombie_include_powerups ) || level.zombie_include_powerups.size == 0 ) - return; - - rand_drop = randomint( 100 ); - - if ( rand_drop > 2 ) - { - if ( !level.zombie_vars["zombie_drop_item"] ) - return; - - debug = "score"; - } - else - debug = "random"; - - playable_area = getentarray( "player_volume", "script_noteworthy" ); - level.powerup_drop_count++; - powerup = maps\mp\zombies\_zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_point + vectorscale( ( 0, 0, 1 ), 40.0 ) ); - valid_drop = 0; - - for ( i = 0; i < playable_area.size; i++ ) - { - if ( powerup istouching( playable_area[i] ) ) - valid_drop = 1; - } - - if ( valid_drop && level.rare_powerups_active ) - { - pos = ( drop_point[0], drop_point[1], drop_point[2] + 42 ); - - if ( check_for_rare_drop_override( pos ) ) - { - level.zombie_vars["zombie_drop_item"] = 0; - valid_drop = 0; - } - } - - if ( !valid_drop ) - { - level.powerup_drop_count--; - powerup delete(); - return; - } - - powerup powerup_setup(); - print_powerup_drop( powerup.powerup_name, debug ); - powerup thread powerup_timeout(); - powerup thread powerup_wobble(); - powerup thread powerup_grab(); - powerup thread powerup_move(); - powerup thread powerup_emp(); - level.zombie_vars["zombie_drop_item"] = 0; - level notify( "powerup_dropped", powerup ); -} - -specific_powerup_drop( powerup_name, drop_spot, powerup_team, powerup_location ) -{ - powerup = maps\mp\zombies\_zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_spot + vectorscale( ( 0, 0, 1 ), 40.0 ) ); - level notify( "powerup_dropped", powerup ); - - if ( isdefined( powerup ) ) - { - powerup powerup_setup( powerup_name, powerup_team, powerup_location ); - powerup thread powerup_timeout(); - powerup thread powerup_wobble(); - powerup thread powerup_grab( powerup_team ); - powerup thread powerup_move(); - powerup thread powerup_emp(); - return powerup; - } -} - -quantum_bomb_random_powerup_result( position ) -{ - if ( !isdefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size ) - return; - - keys = getarraykeys( level.zombie_include_powerups ); - - while ( keys.size ) - { - index = randomint( keys.size ); - - if ( !level.zombie_powerups[keys[index]].zombie_grabbable ) - { - skip = 0; - - switch ( keys[index] ) - { - case "random_weapon": - case "bonus_points_team": - case "bonus_points_player": - skip = 1; - break; - case "minigun": - case "insta_kill": - case "full_ammo": - case "fire_sale": - if ( randomint( 4 ) ) - skip = 1; - - break; - case "tesla": - case "free_perk": - case "bonfire_sale": - if ( randomint( 20 ) ) - skip = 1; - - break; - } - - asm_endswitch( 11 case bonfire_sale loc_45F4 case bonus_points_player loc_45D4 case bonus_points_team loc_45D4 case fire_sale loc_45DC case free_perk loc_45F4 case full_ammo loc_45DC case insta_kill loc_45DC case minigun loc_45DC case random_weapon loc_45D4 case tesla loc_45F4 default loc_460C ); - - if ( skip ) - { - arrayremovevalue( keys, keys[index] ); - continue; - } - - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "quant_good" ); - [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); - level specific_powerup_drop( keys[index], position ); - return; - } - else - arrayremovevalue( keys, keys[index] ); - } -} - -quantum_bomb_random_zombie_grab_powerup_result( position ) -{ - if ( !isdefined( level.zombie_include_powerups ) || !level.zombie_include_powerups.size ) - return; - - keys = getarraykeys( level.zombie_include_powerups ); - - while ( keys.size ) - { - index = randomint( keys.size ); - - if ( level.zombie_powerups[keys[index]].zombie_grabbable ) - { - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "quant_bad" ); - [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); - level specific_powerup_drop( keys[index], position ); - return; - } - else - arrayremovevalue( keys, keys[index] ); - } -} - -quantum_bomb_random_weapon_powerup_result( position ) -{ - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "quant_good" ); - [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); - level specific_powerup_drop( "random_weapon", position ); -} - -quantum_bomb_random_bonus_or_lose_points_powerup_result( position ) -{ - rand = randomint( 10 ); - powerup = "bonus_points_team"; - - switch ( rand ) - { - case "1": - case "0": - powerup = "lose_points_team"; - - if ( isdefined( level.zombie_include_powerups[powerup] ) ) - { - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "quant_bad" ); - break; - } - case "4": - case "3": - case "2": - powerup = "bonus_points_player"; - - if ( isdefined( level.zombie_include_powerups[powerup] ) ) - break; - default: - powerup = "bonus_points_team"; - break; - } - - [[ level.quantum_bomb_play_player_effect_at_position_func ]]( position ); - level specific_powerup_drop( powerup, position ); -} - -special_powerup_drop( drop_point ) -{ - if ( !isdefined( level.zombie_include_powerups ) || level.zombie_include_powerups.size == 0 ) - return; - - powerup = spawn( "script_model", drop_point + vectorscale( ( 0, 0, 1 ), 40.0 ) ); - playable_area = getentarray( "player_volume", "script_noteworthy" ); - valid_drop = 0; - - for ( i = 0; i < playable_area.size; i++ ) - { - if ( powerup istouching( playable_area[i] ) ) - { - valid_drop = 1; - break; - } - } - - if ( !valid_drop ) - { - powerup delete(); - return; - } - - powerup special_drop_setup(); -} - -cleanup_random_weapon_list() -{ - self waittill( "death" ); - - arrayremovevalue( level.random_weapon_powerups, self ); -} - -powerup_setup( powerup_override, powerup_team, powerup_location ) -{ - powerup = undefined; - - if ( !isdefined( powerup_override ) ) - powerup = get_valid_powerup(); - else - { - powerup = powerup_override; - - if ( "tesla" == powerup && tesla_powerup_active() ) - powerup = "minigun"; - } - - struct = level.zombie_powerups[powerup]; - - if ( powerup == "random_weapon" ) - { - players = get_players(); - self.weapon = maps\mp\zombies\_zm_magicbox::treasure_chest_chooseweightedrandomweapon( players[0] ); -/# - weapon = getdvar( _hash_45ED7744 ); - - if ( weapon != "" && isdefined( level.zombie_weapons[weapon] ) ) - { - self.weapon = weapon; - setdvar( "scr_force_weapon", "" ); - } -#/ - self.base_weapon = self.weapon; - - if ( !isdefined( level.random_weapon_powerups ) ) - level.random_weapon_powerups = []; - - level.random_weapon_powerups[level.random_weapon_powerups.size] = self; - self thread cleanup_random_weapon_list(); - - if ( isdefined( level.zombie_weapons[self.weapon].upgrade_name ) && !randomint( 4 ) ) - self.weapon = level.zombie_weapons[self.weapon].upgrade_name; - - self setmodel( getweaponmodel( self.weapon ) ); - self useweaponhidetags( self.weapon ); - offsetdw = vectorscale( ( 1, 1, 1 ), 3.0 ); - self.worldgundw = undefined; - - if ( maps\mp\zombies\_zm_magicbox::weapon_is_dual_wield( self.weapon ) ) - { - self.worldgundw = spawn( "script_model", self.origin + offsetdw ); - self.worldgundw.angles = self.angles; - self.worldgundw setmodel( maps\mp\zombies\_zm_magicbox::get_left_hand_weapon_model_name( self.weapon ) ); - self.worldgundw useweaponhidetags( self.weapon ); - self.worldgundw linkto( self, "tag_weapon", offsetdw, ( 0, 0, 0 ) ); - } - } - else - self setmodel( struct.model_name ); - - maps\mp\_demo::bookmark( "zm_powerup_dropped", gettime(), undefined, undefined, 1 ); - playsoundatposition( "zmb_spawn_powerup", self.origin ); - - if ( isdefined( powerup_team ) ) - self.powerup_team = powerup_team; - - if ( isdefined( powerup_location ) ) - self.powerup_location = powerup_location; - - self.powerup_name = struct.powerup_name; - self.hint = struct.hint; - self.solo = struct.solo; - self.caution = struct.caution; - self.zombie_grabbable = struct.zombie_grabbable; - self.func_should_drop_with_regular_powerups = struct.func_should_drop_with_regular_powerups; - - if ( isdefined( struct.fx ) ) - self.fx = struct.fx; - - if ( isdefined( struct.can_pick_up_in_last_stand ) ) - self.can_pick_up_in_last_stand = struct.can_pick_up_in_last_stand; - - self playloopsound( "zmb_spawn_powerup_loop" ); - level.active_powerups[level.active_powerups.size] = self; -} - -special_drop_setup() -{ - powerup = undefined; - is_powerup = 1; - - if ( level.round_number <= 10 ) - powerup = get_valid_powerup(); - else - { - powerup = level.zombie_special_drop_array[randomint( level.zombie_special_drop_array.size )]; - - if ( level.round_number > 15 && randomint( 100 ) < ( level.round_number - 15 ) * 5 ) - powerup = "nothing"; - } - - switch ( powerup ) - { - case "zombie_blood": - case "tesla": - case "random_weapon": - case "nuke": - case "minigun": - case "lose_points_team": - case "lose_perk": - case "insta_kill": - case "free_perk": - case "fire_sale": - case "empty_clip": - case "double_points": - case "carpenter": - case "bonus_points_team": - case "bonus_points_player": - case "bonfire_sale": - case "all_revive": - break; - case "full_ammo": - if ( level.round_number > 10 && randomint( 100 ) < ( level.round_number - 10 ) * 5 ) - powerup = level.zombie_powerup_array[randomint( level.zombie_powerup_array.size )]; - - break; - case "dog": - if ( level.round_number >= 15 ) - { - is_powerup = 0; - dog_spawners = getentarray( "special_dog_spawner", "targetname" ); - thread play_sound_2d( "sam_nospawn" ); - } - else - powerup = get_valid_powerup(); - - break; - default: - if ( isdefined( level._zombiemode_special_drop_setup ) ) - is_powerup = [[ level._zombiemode_special_drop_setup ]]( powerup ); - else - { - is_powerup = 0; - playfx( level._effect["lightning_dog_spawn"], self.origin ); - playsoundatposition( "pre_spawn", self.origin ); - wait 1.5; - playsoundatposition( "zmb_bolt", self.origin ); - earthquake( 0.5, 0.75, self.origin, 1000 ); - playrumbleonposition( "explosion_generic", self.origin ); - playsoundatposition( "spawn", self.origin ); - wait 1.0; - thread play_sound_2d( "sam_nospawn" ); - self delete(); - } - } - - if ( is_powerup ) - { - playfx( level._effect["lightning_dog_spawn"], self.origin ); - playsoundatposition( "pre_spawn", self.origin ); - wait 1.5; - playsoundatposition( "zmb_bolt", self.origin ); - earthquake( 0.5, 0.75, self.origin, 1000 ); - playrumbleonposition( "explosion_generic", self.origin ); - playsoundatposition( "spawn", self.origin ); - self powerup_setup( powerup ); - self thread powerup_timeout(); - self thread powerup_wobble(); - self thread powerup_grab(); - self thread powerup_move(); - self thread powerup_emp(); - } -} - -powerup_zombie_grab_trigger_cleanup( trigger ) -{ - self waittill_any( "powerup_timedout", "powerup_grabbed", "hacked" ); - trigger delete(); -} - -powerup_zombie_grab( powerup_team ) -{ - self endon( "powerup_timedout" ); - self endon( "powerup_grabbed" ); - self endon( "hacked" ); - zombie_grab_trigger = spawn( "trigger_radius", self.origin - vectorscale( ( 0, 0, 1 ), 40.0 ), 4, 32, 72 ); - zombie_grab_trigger enablelinkto(); - zombie_grab_trigger linkto( self ); - zombie_grab_trigger setteamfortrigger( level.zombie_team ); - self thread powerup_zombie_grab_trigger_cleanup( zombie_grab_trigger ); - poi_dist = 300; - - if ( isdefined( level._zombie_grabbable_poi_distance_override ) ) - poi_dist = level._zombie_grabbable_poi_distance_override; - - zombie_grab_trigger create_zombie_point_of_interest( poi_dist, 2, 0, 1, undefined, undefined, powerup_team ); - - while ( isdefined( self ) ) - { - zombie_grab_trigger waittill( "trigger", who ); - - if ( isdefined( level._powerup_grab_check ) ) - { - if ( !self [[ level._powerup_grab_check ]]( who ) ) - continue; - } - else if ( !isdefined( who ) || !isai( who ) ) - continue; - - playfx( level._effect["powerup_grabbed_red"], self.origin ); - playfx( level._effect["powerup_grabbed_wave_red"], self.origin ); - - switch ( self.powerup_name ) - { - case "lose_points_team": - level thread lose_points_team_powerup( self ); - players = get_players(); - players[randomintrange( 0, players.size )] thread powerup_vo( "lose_points" ); - break; - case "lose_perk": - level thread lose_perk_powerup( self ); - break; - case "empty_clip": - level thread empty_clip_powerup( self ); - break; - default: - if ( isdefined( level._zombiemode_powerup_zombie_grab ) ) - level thread [[ level._zombiemode_powerup_zombie_grab ]]( self ); - - if ( isdefined( level._game_mode_powerup_zombie_grab ) ) - level thread [[ level._game_mode_powerup_zombie_grab ]]( self, who ); - else - { -/# - println( "Unrecognized poweup." ); -#/ - } - - break; - } - - level thread maps\mp\zombies\_zm_audio::do_announcer_playvox( "powerup", self.powerup_name ); - wait 0.1; - playsoundatposition( "zmb_powerup_grabbed", self.origin ); - self stoploopsound(); - self powerup_delete(); - self notify( "powerup_grabbed" ); - } -} - -powerup_grab( powerup_team ) -{ - if ( isdefined( self ) && self.zombie_grabbable ) - { - self thread powerup_zombie_grab( powerup_team ); - return; - } - - self endon( "powerup_timedout" ); - self endon( "powerup_grabbed" ); - range_squared = 4096; - - while ( isdefined( self ) ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( ( self.powerup_name == "minigun" || self.powerup_name == "tesla" || self.powerup_name == "random_weapon" || self.powerup_name == "meat_stink" ) && ( players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() || players[i] usebuttonpressed() && players[i] in_revive_trigger() ) ) - continue; - - if ( isdefined( self.can_pick_up_in_last_stand ) && !self.can_pick_up_in_last_stand && players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - continue; - - ignore_range = 0; - - if ( isdefined( players[i].ignore_range_powerup ) && players[i].ignore_range_powerup == self ) - { - players[i].ignore_range_powerup = undefined; - ignore_range = 1; - } - - if ( distancesquared( players[i].origin, self.origin ) < range_squared || ignore_range ) - { - if ( isdefined( level._powerup_grab_check ) ) - { - if ( !self [[ level._powerup_grab_check ]]( players[i] ) ) - continue; - } - - if ( isdefined( level.zombie_powerup_grab_func ) ) - level thread [[ level.zombie_powerup_grab_func ]](); - else - { - switch ( self.powerup_name ) - { - case "nuke": - level thread nuke_powerup( self, players[i].team ); - players[i] thread powerup_vo( "nuke" ); - zombies = getaiarray( level.zombie_team ); - players[i].zombie_nuked = arraysort( zombies, self.origin ); - players[i] notify( "nuke_triggered" ); - break; - case "full_ammo": - level thread full_ammo_powerup( self, players[i] ); - players[i] thread powerup_vo( "full_ammo" ); - break; - case "double_points": - level thread double_points_powerup( self, players[i] ); - players[i] thread powerup_vo( "double_points" ); - break; - case "insta_kill": - level thread insta_kill_powerup( self, players[i] ); - players[i] thread powerup_vo( "insta_kill" ); - break; - case "carpenter": - if ( is_classic() ) - players[i] thread maps\mp\zombies\_zm_pers_upgrades::persistent_carpenter_ability_check(); - - if ( isdefined( level.use_new_carpenter_func ) ) - level thread [[ level.use_new_carpenter_func ]]( self.origin ); - else - level thread start_carpenter( self.origin ); - - players[i] thread powerup_vo( "carpenter" ); - break; - case "fire_sale": - level thread start_fire_sale( self ); - players[i] thread powerup_vo( "firesale" ); - break; - case "bonfire_sale": - level thread start_bonfire_sale( self ); - players[i] thread powerup_vo( "firesale" ); - break; - case "minigun": - level thread minigun_weapon_powerup( players[i] ); - players[i] thread powerup_vo( "minigun" ); - break; - case "free_perk": - level thread free_perk_powerup( self ); - break; - case "tesla": - level thread tesla_weapon_powerup( players[i] ); - players[i] thread powerup_vo( "tesla" ); - break; - case "random_weapon": - if ( !level random_weapon_powerup( self, players[i] ) ) - continue; - - break; - case "bonus_points_player": - level thread bonus_points_player_powerup( self, players[i] ); - players[i] thread powerup_vo( "bonus_points_solo" ); - break; - case "bonus_points_team": - level thread bonus_points_team_powerup( self ); - players[i] thread powerup_vo( "bonus_points_team" ); - break; - case "teller_withdrawl": - level thread teller_withdrawl( self, players[i] ); - break; - default: - if ( isdefined( level._zombiemode_powerup_grab ) ) - level thread [[ level._zombiemode_powerup_grab ]]( self, players[i] ); - else - { -/# - println( "Unrecognized poweup." ); -#/ - } - - break; - } - } - - maps\mp\_demo::bookmark( "zm_player_powerup_grabbed", gettime(), players[i] ); - - if ( should_award_stat( self.powerup_name ) ) - { - players[i] maps\mp\zombies\_zm_stats::increment_client_stat( "drops" ); - players[i] maps\mp\zombies\_zm_stats::increment_player_stat( "drops" ); - players[i] maps\mp\zombies\_zm_stats::increment_client_stat( self.powerup_name + "_pickedup" ); - players[i] maps\mp\zombies\_zm_stats::increment_player_stat( self.powerup_name + "_pickedup" ); - } - - if ( self.solo ) - { - playfx( level._effect["powerup_grabbed_solo"], self.origin ); - playfx( level._effect["powerup_grabbed_wave_solo"], self.origin ); - } - else if ( self.caution ) - { - playfx( level._effect["powerup_grabbed_caution"], self.origin ); - playfx( level._effect["powerup_grabbed_wave_caution"], self.origin ); - } - else - { - playfx( level._effect["powerup_grabbed"], self.origin ); - playfx( level._effect["powerup_grabbed_wave"], self.origin ); - } - - if ( isdefined( self.stolen ) && self.stolen ) - level notify( "monkey_see_monkey_dont_achieved" ); - - if ( isdefined( self.grabbed_level_notify ) ) - level notify( self.grabbed_level_notify ); - - self.claimed = 1; - self.power_up_grab_player = players[i]; - wait 0.1; - playsoundatposition( "zmb_powerup_grabbed", self.origin ); - self stoploopsound(); - self hide(); - - if ( self.powerup_name != "fire_sale" ) - { - if ( isdefined( self.power_up_grab_player ) ) - { - if ( isdefined( level.powerup_intro_vox ) ) - { - level thread [[ level.powerup_intro_vox ]]( self ); - return; - } - else if ( isdefined( level.powerup_vo_available ) ) - { - can_say_vo = [[ level.powerup_vo_available ]](); - - if ( !can_say_vo ) - { - self powerup_delete(); - self notify( "powerup_grabbed" ); - return; - } - } - } - } - - level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( self.powerup_name, self.power_up_grab_player.pers["team"] ); - self powerup_delete(); - self notify( "powerup_grabbed" ); - } - } - - wait 0.1; - } -} - -start_fire_sale( item ) -{ - if ( level.zombie_vars["zombie_powerup_fire_sale_time"] > 0 && is_true( level.zombie_vars["zombie_powerup_fire_sale_on"] ) ) - { - level.zombie_vars["zombie_powerup_fire_sale_time"] += 30; - return; - } - - level notify( "powerup fire sale" ); - level endon( "powerup fire sale" ); - level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog( "fire_sale" ); - level.zombie_vars["zombie_powerup_fire_sale_on"] = 1; - level thread toggle_fire_sale_on(); - - for ( level.zombie_vars["zombie_powerup_fire_sale_time"] = 30; level.zombie_vars["zombie_powerup_fire_sale_time"] > 0; level.zombie_vars["zombie_powerup_fire_sale_time"] -= 0.05 ) - wait 0.05; - - level.zombie_vars["zombie_powerup_fire_sale_on"] = 0; - level notify( "fire_sale_off" ); -} - -start_bonfire_sale( item ) -{ - level notify( "powerup bonfire sale" ); - level endon( "powerup bonfire sale" ); - temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); - temp_ent playloopsound( "zmb_double_point_loop" ); - level.zombie_vars["zombie_powerup_bonfire_sale_on"] = 1; - level thread toggle_bonfire_sale_on(); - - for ( level.zombie_vars["zombie_powerup_bonfire_sale_time"] = 30; level.zombie_vars["zombie_powerup_bonfire_sale_time"] > 0; level.zombie_vars["zombie_powerup_bonfire_sale_time"] -= 0.05 ) - wait 0.05; - - level.zombie_vars["zombie_powerup_bonfire_sale_on"] = 0; - level notify( "bonfire_sale_off" ); - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] playsound( "zmb_points_loop_off" ); - - temp_ent delete(); -} - -start_carpenter( origin ) -{ - window_boards = getstructarray( "exterior_goal", "targetname" ); - total = level.exterior_goals.size; - carp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); - carp_ent playloopsound( "evt_carpenter" ); - - while ( true ) - { - windows = get_closest_window_repair( window_boards, origin ); - - if ( !isdefined( windows ) ) - { - carp_ent stoploopsound( 1 ); - carp_ent playsoundwithnotify( "evt_carpenter_end", "sound_done" ); - - carp_ent waittill( "sound_done" ); - - break; - } - else - arrayremovevalue( window_boards, windows ); - - while ( true ) - { - if ( all_chunks_intact( windows, windows.barrier_chunks ) ) - break; - - chunk = get_random_destroyed_chunk( windows, windows.barrier_chunks ); - - if ( !isdefined( chunk ) ) - break; - - windows thread maps\mp\zombies\_zm_blockers::replace_chunk( windows, chunk, undefined, maps\mp\zombies\_zm_powerups::is_carpenter_boards_upgraded(), 1 ); - - if ( isdefined( windows.clip ) ) - { - windows.clip enable_trigger(); - windows.clip disconnectpaths(); - } - else - blocker_disconnect_paths( windows.neg_start, windows.neg_end ); - - wait_network_frame(); - wait 0.05; - } - - wait_network_frame(); - } - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] maps\mp\zombies\_zm_score::player_add_points( "carpenter_powerup", 200 ); - - carp_ent delete(); -} - -get_closest_window_repair( windows, origin ) -{ - current_window = undefined; - shortest_distance = undefined; - - for ( i = 0; i < windows.size; i++ ) - { - if ( all_chunks_intact( windows, windows[i].barrier_chunks ) ) - continue; - - if ( !isdefined( current_window ) ) - { - current_window = windows[i]; - shortest_distance = distancesquared( current_window.origin, origin ); - continue; - } - - if ( distancesquared( windows[i].origin, origin ) < shortest_distance ) - { - current_window = windows[i]; - shortest_distance = distancesquared( windows[i].origin, origin ); - } - } - - return current_window; -} - -powerup_vo( type ) -{ - self endon( "death" ); - self endon( "disconnect" ); - - if ( isdefined( level.powerup_vo_available ) ) - { - if ( ![[ level.powerup_vo_available ]]() ) - return; - } - - wait( randomfloatrange( 2, 2.5 ) ); - - if ( type == "tesla" ) - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "weapon_pickup", type ); - else - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "powerup", type ); - - if ( isdefined( level.custom_powerup_vo_response ) ) - level [[ level.custom_powerup_vo_response ]]( self, type ); -} - -powerup_wobble_fx() -{ - self endon( "death" ); - - if ( !isdefined( self ) ) - return; - - if ( isdefined( level.powerup_fx_func ) ) - { - self thread [[ level.powerup_fx_func ]](); - return; - } - - if ( self.solo ) - self setclientfield( "powerup_fx", 2 ); - else if ( self.caution ) - self setclientfield( "powerup_fx", 4 ); - else if ( self.zombie_grabbable ) - self setclientfield( "powerup_fx", 3 ); - else - self setclientfield( "powerup_fx", 1 ); -} - -powerup_wobble() -{ - self endon( "powerup_grabbed" ); - self endon( "powerup_timedout" ); - self thread powerup_wobble_fx(); - - while ( isdefined( self ) ) - { - waittime = randomfloatrange( 2.5, 5 ); - yaw = randomint( 360 ); - - if ( yaw > 300 ) - yaw = 300; - else if ( yaw < 60 ) - yaw = 60; - - yaw = self.angles[1] + yaw; - new_angles = ( -60 + randomint( 120 ), yaw, -45 + randomint( 90 ) ); - self rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 ); - - if ( isdefined( self.worldgundw ) ) - self.worldgundw rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 ); - - wait( randomfloat( waittime - 0.1 ) ); - } -} - -powerup_timeout() -{ - if ( isdefined( level._powerup_timeout_override ) && !isdefined( self.powerup_team ) ) - { - self thread [[ level._powerup_timeout_override ]](); - return; - } - - self endon( "powerup_grabbed" ); - self endon( "death" ); - self endon( "powerup_reset" ); - self show(); - wait_time = 15; - - if ( isdefined( level._powerup_timeout_custom_time ) ) - { - time = [[ level._powerup_timeout_custom_time ]]( self ); - - if ( time == 0 ) - return; - - wait_time = time; - } - - wait( wait_time ); - - for ( i = 0; i < 40; i++ ) - { - if ( i % 2 ) - { - self ghost(); - - if ( isdefined( self.worldgundw ) ) - self.worldgundw ghost(); - } - else - { - self show(); - - if ( isdefined( self.worldgundw ) ) - self.worldgundw show(); - } - - if ( i < 15 ) - { - wait 0.5; - continue; - } - - if ( i < 25 ) - { - wait 0.25; - continue; - } - - wait 0.1; - } - - self notify( "powerup_timedout" ); - self powerup_delete(); -} - -powerup_delete() -{ - arrayremovevalue( level.active_powerups, self, 0 ); - - if ( isdefined( self.worldgundw ) ) - self.worldgundw delete(); - - self delete(); -} - -powerup_delete_delayed( time ) -{ - if ( isdefined( time ) ) - wait( time ); - else - wait 0.01; - - self powerup_delete(); -} - -nuke_powerup( drop_item, player_team ) -{ - location = drop_item.origin; - playfx( drop_item.fx, location ); - level thread nuke_flash( player_team ); - wait 0.5; - zombies = getaiarray( level.zombie_team ); - zombies = arraysort( zombies, location ); - zombies_nuked = []; - - for ( i = 0; i < zombies.size; i++ ) - { - if ( isdefined( zombies[i].ignore_nuke ) && zombies[i].ignore_nuke ) - continue; - - if ( isdefined( zombies[i].marked_for_death ) && zombies[i].marked_for_death ) - continue; - - if ( isdefined( zombies[i].nuke_damage_func ) ) - { - zombies[i] thread [[ zombies[i].nuke_damage_func ]](); - continue; - } - - if ( is_magic_bullet_shield_enabled( zombies[i] ) ) - continue; - - zombies[i].marked_for_death = 1; - zombies[i].nuked = 1; - zombies_nuked[zombies_nuked.size] = zombies[i]; - } - - for ( i = 0; i < zombies_nuked.size; i++ ) - { - wait( randomfloatrange( 0.1, 0.7 ) ); - - if ( !isdefined( zombies_nuked[i] ) ) - continue; - - if ( is_magic_bullet_shield_enabled( zombies_nuked[i] ) ) - continue; - - if ( i < 5 && !zombies_nuked[i].isdog ) - zombies_nuked[i] thread maps\mp\animscripts\zm_death::flame_death_fx(); - - if ( !zombies_nuked[i].isdog ) - { - if ( !( isdefined( zombies_nuked[i].no_gib ) && zombies_nuked[i].no_gib ) ) - zombies_nuked[i] maps\mp\zombies\_zm_spawner::zombie_head_gib(); - - zombies_nuked[i] playsound( "evt_nuked" ); - } - - zombies_nuked[i] dodamage( zombies_nuked[i].health + 666, zombies_nuked[i].origin ); - } - - players = get_players( player_team ); - - for ( i = 0; i < players.size; i++ ) - players[i] maps\mp\zombies\_zm_score::player_add_points( "nuke_powerup", 400 ); -} - -nuke_flash( team ) -{ - if ( isdefined( team ) ) - get_players()[0] playsoundtoteam( "evt_nuke_flash", team ); - else - get_players()[0] playsound( "evt_nuke_flash" ); - - fadetowhite = newhudelem(); - fadetowhite.x = 0; - fadetowhite.y = 0; - fadetowhite.alpha = 0; - fadetowhite.horzalign = "fullscreen"; - fadetowhite.vertalign = "fullscreen"; - fadetowhite.foreground = 1; - fadetowhite setshader( "white", 640, 480 ); - fadetowhite fadeovertime( 0.2 ); - fadetowhite.alpha = 0.8; - wait 0.5; - fadetowhite fadeovertime( 1.0 ); - fadetowhite.alpha = 0; - wait 1.1; - fadetowhite destroy(); -} - -double_points_powerup( drop_item, player ) -{ - level notify( "powerup points scaled_" + player.team ); - level endon( "powerup points scaled_" + player.team ); - team = player.team; - level thread point_doubler_on_hud( drop_item, team ); - - if ( isdefined( level.pers_upgrade_double_points ) && level.pers_upgrade_double_points ) - player thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_double_points_pickup_start(); - - if ( isdefined( level.current_game_module ) && level.current_game_module == 2 ) - { - if ( isdefined( player._race_team ) ) - { - if ( player._race_team == 1 ) - level._race_team_double_points = 1; - else - level._race_team_double_points = 2; - } - } - - level.zombie_vars[team]["zombie_point_scalar"] = 2; - players = get_players(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - { - if ( team == players[player_index].team ) - players[player_index] setclientfield( "score_cf_double_points_active", 1 ); - } - - wait 30; - level.zombie_vars[team]["zombie_point_scalar"] = 1; - level._race_team_double_points = undefined; - players = get_players(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - { - if ( team == players[player_index].team ) - players[player_index] setclientfield( "score_cf_double_points_active", 0 ); - } -} - -full_ammo_powerup( drop_item, player ) -{ - players = get_players( player.team ); - - if ( isdefined( level._get_game_module_players ) ) - players = [[ level._get_game_module_players ]]( player ); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - continue; - - primary_weapons = players[i] getweaponslist( 1 ); - players[i] notify( "zmb_max_ammo" ); - players[i] notify( "zmb_lost_knife" ); - players[i] notify( "zmb_disable_claymore_prompt" ); - players[i] notify( "zmb_disable_spikemore_prompt" ); - - for ( x = 0; x < primary_weapons.size; x++ ) - { - if ( level.headshots_only && is_lethal_grenade( primary_weapons[x] ) ) - continue; - - if ( isdefined( level.zombie_include_equipment ) && isdefined( level.zombie_include_equipment[primary_weapons[x]] ) ) - continue; - - if ( isdefined( level.zombie_weapons_no_max_ammo ) && isdefined( level.zombie_weapons_no_max_ammo[primary_weapons[x]] ) ) - continue; - - if ( players[i] hasweapon( primary_weapons[x] ) ) - players[i] givemaxammo( primary_weapons[x] ); - } - } - - level thread full_ammo_on_hud( drop_item, player.team ); -} - -insta_kill_powerup( drop_item, player ) -{ - level notify( "powerup instakill_" + player.team ); - level endon( "powerup instakill_" + player.team ); - - if ( isdefined( level.insta_kill_powerup_override ) ) - { - level thread [[ level.insta_kill_powerup_override ]]( drop_item, player ); - return; - } - - if ( is_classic() ) - player thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_insta_kill_upgrade_check(); - - team = player.team; - level thread insta_kill_on_hud( drop_item, team ); - level.zombie_vars[team]["zombie_insta_kill"] = 1; - wait 30; - level.zombie_vars[team]["zombie_insta_kill"] = 0; - players = get_players( team ); - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( players[i] ) ) - players[i] notify( "insta_kill_over" ); - } -} - -is_insta_kill_active() -{ - return level.zombie_vars[self.team]["zombie_insta_kill"]; -} - -check_for_instakill( player, mod, hit_location ) -{ - if ( isdefined( player ) && isalive( player ) && isdefined( level.check_for_instakill_override ) ) - { - if ( !self [[ level.check_for_instakill_override ]]( player ) ) - return; - - if ( player.use_weapon_type == "MOD_MELEE" ) - player.last_kill_method = "MOD_MELEE"; - else - player.last_kill_method = "MOD_UNKNOWN"; - - modname = remove_mod_from_methodofdeath( mod ); - - if ( !( isdefined( self.no_gib ) && self.no_gib ) ) - self maps\mp\zombies\_zm_spawner::zombie_head_gib(); - - self.health = 1; - self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); - player notify( "zombie_killed" ); - } - - if ( isdefined( player ) && isalive( player ) && ( level.zombie_vars[player.team]["zombie_insta_kill"] || isdefined( player.personal_instakill ) && player.personal_instakill ) ) - { - if ( is_magic_bullet_shield_enabled( self ) ) - return; - - if ( isdefined( self.instakill_func ) ) - { - self thread [[ self.instakill_func ]](); - return; - } - - if ( player.use_weapon_type == "MOD_MELEE" ) - player.last_kill_method = "MOD_MELEE"; - else - player.last_kill_method = "MOD_UNKNOWN"; - - modname = remove_mod_from_methodofdeath( mod ); - - if ( flag( "dog_round" ) ) - { - self.health = 1; - self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); - player notify( "zombie_killed" ); - } - else - { - if ( !( isdefined( self.no_gib ) && self.no_gib ) ) - self maps\mp\zombies\_zm_spawner::zombie_head_gib(); - - self.health = 1; - self dodamage( self.health + 666, self.origin, player, self, hit_location, modname ); - player notify( "zombie_killed" ); - } - } -} - -insta_kill_on_hud( drop_item, player_team ) -{ - if ( level.zombie_vars[player_team]["zombie_powerup_insta_kill_on"] ) - { - level.zombie_vars[player_team]["zombie_powerup_insta_kill_time"] = 30; - return; - } - - level.zombie_vars[player_team]["zombie_powerup_insta_kill_on"] = 1; - level thread time_remaning_on_insta_kill_powerup( player_team ); -} - -time_remaning_on_insta_kill_powerup( player_team ) -{ - temp_enta = spawn( "script_origin", ( 0, 0, 0 ) ); - temp_enta playloopsound( "zmb_insta_kill_loop" ); - - while ( level.zombie_vars[player_team]["zombie_powerup_insta_kill_time"] >= 0 ) - { - wait 0.05; - level.zombie_vars[player_team]["zombie_powerup_insta_kill_time"] -= 0.05; - } - - get_players()[0] playsoundtoteam( "zmb_insta_kill", player_team ); - temp_enta stoploopsound( 2 ); - level.zombie_vars[player_team]["zombie_powerup_insta_kill_on"] = 0; - level.zombie_vars[player_team]["zombie_powerup_insta_kill_time"] = 30; - temp_enta delete(); -} - -point_doubler_on_hud( drop_item, player_team ) -{ - self endon( "disconnect" ); - - if ( level.zombie_vars[player_team]["zombie_powerup_point_doubler_on"] ) - { - level.zombie_vars[player_team]["zombie_powerup_point_doubler_time"] = 30; - return; - } - - level.zombie_vars[player_team]["zombie_powerup_point_doubler_on"] = 1; - level thread time_remaining_on_point_doubler_powerup( player_team ); -} - -time_remaining_on_point_doubler_powerup( player_team ) -{ - temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); - temp_ent playloopsound( "zmb_double_point_loop" ); - - while ( level.zombie_vars[player_team]["zombie_powerup_point_doubler_time"] >= 0 ) - { - wait 0.05; - level.zombie_vars[player_team]["zombie_powerup_point_doubler_time"] -= 0.05; - } - - level.zombie_vars[player_team]["zombie_powerup_point_doubler_on"] = 0; - players = get_players( player_team ); - - for ( i = 0; i < players.size; i++ ) - players[i] playsound( "zmb_points_loop_off" ); - - temp_ent stoploopsound( 2 ); - level.zombie_vars[player_team]["zombie_powerup_point_doubler_time"] = 30; - temp_ent delete(); -} - -toggle_bonfire_sale_on() -{ - level endon( "powerup bonfire sale" ); - - if ( !isdefined( level.zombie_vars["zombie_powerup_bonfire_sale_on"] ) ) - return; - - if ( level.zombie_vars["zombie_powerup_bonfire_sale_on"] ) - { - if ( isdefined( level.bonfire_init_func ) ) - level thread [[ level.bonfire_init_func ]](); - - level waittill( "bonfire_sale_off" ); - } -} - -toggle_fire_sale_on() -{ - level endon( "powerup fire sale" ); - - if ( !isdefined( level.zombie_vars["zombie_powerup_fire_sale_on"] ) ) - return; - - if ( level.zombie_vars["zombie_powerup_fire_sale_on"] ) - { - for ( i = 0; i < level.chests.size; i++ ) - { - show_firesale_box = level.chests[i] [[ level._zombiemode_check_firesale_loc_valid_func ]](); - - if ( show_firesale_box ) - { - level.chests[i].zombie_cost = 10; - - if ( level.chest_index != i ) - { - level.chests[i].was_temp = 1; - - if ( is_true( level.chests[i].hidden ) ) - level.chests[i] thread maps\mp\zombies\_zm_magicbox::show_chest(); - - wait_network_frame(); - } - } - } - - level waittill( "fire_sale_off" ); - - waittillframeend; - - for ( i = 0; i < level.chests.size; i++ ) - { - show_firesale_box = level.chests[i] [[ level._zombiemode_check_firesale_loc_valid_func ]](); - - if ( show_firesale_box ) - { - if ( level.chest_index != i && isdefined( level.chests[i].was_temp ) ) - { - level.chests[i].was_temp = undefined; - level thread remove_temp_chest( i ); - } - - level.chests[i].zombie_cost = level.chests[i].old_cost; - } - } - } -} - -fire_sale_weapon_wait() -{ - self.zombie_cost = self.old_cost; - - while ( isdefined( self.chest_user ) ) - wait_network_frame(); - - self set_hint_string( self, "default_treasure_chest", self.zombie_cost ); -} - -remove_temp_chest( chest_index ) -{ - while ( isdefined( level.chests[chest_index].chest_user ) || isdefined( level.chests[chest_index]._box_open ) && level.chests[chest_index]._box_open == 1 ) - wait_network_frame(); - - if ( level.zombie_vars["zombie_powerup_fire_sale_on"] ) - { - level.chests[chest_index].was_temp = 1; - level.chests[chest_index].zombie_cost = 10; - return; - } - - for ( i = 0; i < chest_index; i++ ) - wait_network_frame(); - - playfx( level._effect["poltergeist"], level.chests[chest_index].orig_origin ); - level.chests[chest_index].zbarrier playsound( "zmb_box_poof_land" ); - level.chests[chest_index].zbarrier playsound( "zmb_couch_slam" ); - wait_network_frame(); - level.chests[chest_index] maps\mp\zombies\_zm_magicbox::hide_chest(); -} - -devil_dialog_delay() -{ - wait 1.0; -} - -full_ammo_on_hud( drop_item, player_team ) -{ - self endon( "disconnect" ); - hudelem = maps\mp\gametypes_zm\_hud_util::createserverfontstring( "objective", 2, player_team ); - hudelem maps\mp\gametypes_zm\_hud_util::setpoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] - level.zombie_vars["zombie_timer_offset_interval"] * 2 ); - hudelem.sort = 0.5; - hudelem.alpha = 0; - hudelem fadeovertime( 0.5 ); - hudelem.alpha = 1; - - if ( isdefined( drop_item ) ) - hudelem.label = drop_item.hint; - - hudelem thread full_ammo_move_hud( player_team ); -} - -full_ammo_move_hud( player_team ) -{ - players = get_players( player_team ); - players[0] playsoundtoteam( "zmb_full_ammo", player_team ); - wait 0.5; - move_fade_time = 1.5; - self fadeovertime( move_fade_time ); - self moveovertime( move_fade_time ); - self.y = 270; - self.alpha = 0; - wait( move_fade_time ); - self destroy(); + if ( isDefined( origin ) && isDefined( radius ) ) + { + powerups = []; + foreach ( powerup in level.active_powerups ) + { + if ( distancesquared( origin, powerup.origin ) < radius * radius ) + { + powerups[ powerups.size ] = powerup; + } + } + return powerups; + } + return level.active_powerups; } -check_for_rare_drop_override( pos ) +should_award_stat( powerup_name ) //checked changed to matched cerberus output { - if ( isdefined( flag( "ape_round" ) ) && flag( "ape_round" ) ) - return false; - - return false; -} - -setup_firesale_audio() -{ - wait 2; - intercom = getentarray( "intercom", "targetname" ); - - while ( true ) - { - while ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 0 ) - wait 0.2; - - for ( i = 0; i < intercom.size; i++ ) - intercom[i] thread play_firesale_audio(); - - while ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 1 ) - wait 0.1; - - level notify( "firesale_over" ); - } -} - -play_firesale_audio() -{ - if ( isdefined( level.sndfiresalemusoff ) && level.sndfiresalemusoff ) - return; - - if ( isdefined( level.sndannouncerisrich ) && level.sndannouncerisrich ) - self playloopsound( "mus_fire_sale_rich" ); - else - self playloopsound( "mus_fire_sale" ); - - level waittill( "firesale_over" ); - - self stoploopsound(); -} - -setup_bonfiresale_audio() -{ - wait 2; - intercom = getentarray( "intercom", "targetname" ); - - while ( true ) - { - while ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 0 ) - wait 0.2; - - for ( i = 0; i < intercom.size; i++ ) - intercom[i] thread play_bonfiresale_audio(); - - while ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 1 ) - wait 0.1; - - level notify( "firesale_over" ); - } -} - -play_bonfiresale_audio() -{ - if ( isdefined( level.sndfiresalemusoff ) && level.sndfiresalemusoff ) - return; - - if ( isdefined( level.sndannouncerisrich ) && level.sndannouncerisrich ) - self playloopsound( "mus_fire_sale_rich" ); - else - self playloopsound( "mus_fire_sale" ); - - level waittill( "firesale_over" ); - - self stoploopsound(); -} - -free_perk_powerup( item ) -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( players[i].sessionstate == "spectator" ) ) - { - player = players[i]; - - if ( isdefined( item.ghost_powerup ) ) - { - player maps\mp\zombies\_zm_stats::increment_client_stat( "buried_ghost_perk_acquired", 0 ); - player maps\mp\zombies\_zm_stats::increment_player_stat( "buried_ghost_perk_acquired" ); - player notify( "player_received_ghost_round_free_perk" ); - } - - free_perk = player maps\mp\zombies\_zm_perks::give_random_perk(); - - if ( isdefined( level.disable_free_perks_before_power ) && level.disable_free_perks_before_power ) - player thread disable_perk_before_power( free_perk ); - } - } -} - -disable_perk_before_power( perk ) -{ - self endon( "disconnect" ); - - if ( isdefined( perk ) ) - { - wait 0.1; - - if ( !flag( "power_on" ) ) - { - a_players = get_players(); - - if ( isdefined( a_players ) && a_players.size == 1 && perk == "specialty_quickrevive" ) - return; - - self perk_pause( perk ); - flag_wait( "power_on" ); - self perk_unpause( perk ); - } - } -} - -random_weapon_powerup_throttle() -{ - self.random_weapon_powerup_throttle = 1; - wait 0.25; - self.random_weapon_powerup_throttle = 0; -} - -random_weapon_powerup( item, player ) -{ - if ( player.sessionstate == "spectator" || player maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - return false; - - if ( isdefined( player.random_weapon_powerup_throttle ) && player.random_weapon_powerup_throttle || player isswitchingweapons() || player.is_drinking > 0 ) - return false; - - current_weapon = player getcurrentweapon(); - current_weapon_type = weaponinventorytype( current_weapon ); - - if ( !is_tactical_grenade( item.weapon ) ) - { - if ( "primary" != current_weapon_type && "altmode" != current_weapon_type ) - return false; - - if ( !isdefined( level.zombie_weapons[current_weapon] ) && !maps\mp\zombies\_zm_weapons::is_weapon_upgraded( current_weapon ) && "altmode" != current_weapon_type ) - return false; - } - - player thread random_weapon_powerup_throttle(); - weapon_string = item.weapon; - - if ( weapon_string == "knife_ballistic_zm" ) - weapon = player maps\mp\zombies\_zm_melee_weapon::give_ballistic_knife( weapon_string, 0 ); - else if ( weapon_string == "knife_ballistic_upgraded_zm" ) - weapon = player maps\mp\zombies\_zm_melee_weapon::give_ballistic_knife( weapon_string, 1 ); - - player thread maps\mp\zombies\_zm_weapons::weapon_give( weapon_string ); - return true; -} - -bonus_points_player_powerup( item, player ) -{ - points = randomintrange( 1, 25 ) * 100; - - if ( isdefined( level.bonus_points_powerup_override ) ) - points = [[ level.bonus_points_powerup_override ]](); - - if ( !player maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( player.sessionstate == "spectator" ) ) - player maps\mp\zombies\_zm_score::player_add_points( "bonus_points_powerup", points ); -} - -bonus_points_team_powerup( item ) -{ - points = randomintrange( 1, 25 ) * 100; - - if ( isdefined( level.bonus_points_powerup_override ) ) - points = [[ level.bonus_points_powerup_override ]](); - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( players[i].sessionstate == "spectator" ) ) - players[i] maps\mp\zombies\_zm_score::player_add_points( "bonus_points_powerup", points ); - } -} - -lose_points_team_powerup( item ) -{ - points = randomintrange( 1, 25 ) * 100; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( !players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( players[i].sessionstate == "spectator" ) ) - { - if ( 0 > players[i].score - points ) - { - players[i] maps\mp\zombies\_zm_score::minus_to_player_score( players[i].score ); - continue; - } - - players[i] maps\mp\zombies\_zm_score::minus_to_player_score( points ); - } - } -} - -lose_perk_powerup( item ) -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( !player maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( player.sessionstate == "spectator" ) ) - player maps\mp\zombies\_zm_perks::lose_random_perk(); - } -} - -empty_clip_powerup( item ) -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( !player maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( player.sessionstate == "spectator" ) ) - { - weapon = player getcurrentweapon(); - player setweaponammoclip( weapon, 0 ); - } - } -} - -minigun_weapon_powerup( ent_player, time ) -{ - ent_player endon( "disconnect" ); - ent_player endon( "death" ); - ent_player endon( "player_downed" ); - - if ( !isdefined( time ) ) - time = 30; - - if ( isdefined( level._minigun_time_override ) ) - time = level._minigun_time_override; - - if ( ent_player.zombie_vars["zombie_powerup_minigun_on"] && ( "minigun_zm" == ent_player getcurrentweapon() || isdefined( ent_player.has_minigun ) && ent_player.has_minigun ) ) - { - if ( ent_player.zombie_vars["zombie_powerup_minigun_time"] < time ) - ent_player.zombie_vars["zombie_powerup_minigun_time"] = time; - - return; - } - - ent_player notify( "replace_weapon_powerup" ); - ent_player._show_solo_hud = 1; - level._zombie_minigun_powerup_last_stand_func = ::minigun_watch_gunner_downed; - ent_player.has_minigun = 1; - ent_player.has_powerup_weapon = 1; - ent_player increment_is_drinking(); - ent_player._zombie_gun_before_minigun = ent_player getcurrentweapon(); - ent_player giveweapon( "minigun_zm" ); - ent_player switchtoweapon( "minigun_zm" ); - ent_player.zombie_vars["zombie_powerup_minigun_on"] = 1; - level thread minigun_weapon_powerup_countdown( ent_player, "minigun_time_over", time ); - level thread minigun_weapon_powerup_replace( ent_player, "minigun_time_over" ); -} - -minigun_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) -{ - ent_player endon( "death" ); - ent_player endon( "disconnect" ); - ent_player endon( "player_downed" ); - ent_player endon( str_gun_return_notify ); - ent_player endon( "replace_weapon_powerup" ); - setclientsysstate( "levelNotify", "minis", ent_player ); - - for ( ent_player.zombie_vars["zombie_powerup_minigun_time"] = time; ent_player.zombie_vars["zombie_powerup_minigun_time"] > 0; ent_player.zombie_vars["zombie_powerup_minigun_time"] -= 0.05 ) - wait 0.05; - - setclientsysstate( "levelNotify", "minie", ent_player ); - level thread minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ); -} - -minigun_weapon_powerup_replace( ent_player, str_gun_return_notify ) -{ - ent_player endon( "death" ); - ent_player endon( "disconnect" ); - ent_player endon( "player_downed" ); - ent_player endon( str_gun_return_notify ); - - ent_player waittill( "replace_weapon_powerup" ); - - ent_player takeweapon( "minigun_zm" ); - ent_player.zombie_vars["zombie_powerup_minigun_on"] = 0; - ent_player.has_minigun = 0; - ent_player decrement_is_drinking(); -} - -minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ) -{ - ent_player endon( "death" ); - ent_player endon( "player_downed" ); - ent_player takeweapon( "minigun_zm" ); - ent_player.zombie_vars["zombie_powerup_minigun_on"] = 0; - ent_player._show_solo_hud = 0; - ent_player.has_minigun = 0; - ent_player.has_powerup_weapon = 0; - ent_player notify( str_gun_return_notify ); - ent_player decrement_is_drinking(); - - if ( isdefined( ent_player._zombie_gun_before_minigun ) ) - { - player_weapons = ent_player getweaponslistprimaries(); - - for ( i = 0; i < player_weapons.size; i++ ) - { - if ( player_weapons[i] == ent_player._zombie_gun_before_minigun ) - { - ent_player switchtoweapon( ent_player._zombie_gun_before_minigun ); - return; - } - } - } - - primaryweapons = ent_player getweaponslistprimaries(); - - if ( primaryweapons.size > 0 ) - ent_player switchtoweapon( primaryweapons[0] ); - else - { - allweapons = ent_player getweaponslist( 1 ); - - for ( i = 0; i < allweapons.size; i++ ) - { - if ( is_melee_weapon( allweapons[i] ) ) - { - ent_player switchtoweapon( allweapons[i] ); - return; - } - } - } -} - -minigun_weapon_powerup_off() -{ - self.zombie_vars["zombie_powerup_minigun_time"] = 0; -} - -minigun_watch_gunner_downed() -{ - if ( !( isdefined( self.has_minigun ) && self.has_minigun ) ) - return; - - primaryweapons = self getweaponslistprimaries(); - - for ( i = 0; i < primaryweapons.size; i++ ) - { - if ( primaryweapons[i] == "minigun_zm" ) - self takeweapon( "minigun_zm" ); - } - - self notify( "minigun_time_over" ); - self.zombie_vars["zombie_powerup_minigun_on"] = 0; - self._show_solo_hud = 0; - wait 0.05; - self.has_minigun = 0; - self.has_powerup_weapon = 0; -} - -tesla_weapon_powerup( ent_player, time ) -{ - ent_player endon( "disconnect" ); - ent_player endon( "death" ); - ent_player endon( "player_downed" ); - - if ( !isdefined( time ) ) - time = 11; - - if ( ent_player.zombie_vars["zombie_powerup_tesla_on"] && ( "tesla_gun_zm" == ent_player getcurrentweapon() || isdefined( ent_player.has_tesla ) && ent_player.has_tesla ) ) - { - ent_player givemaxammo( "tesla_gun_zm" ); - - if ( ent_player.zombie_vars["zombie_powerup_tesla_time"] < time ) - ent_player.zombie_vars["zombie_powerup_tesla_time"] = time; - - return; - } - - ent_player notify( "replace_weapon_powerup" ); - ent_player._show_solo_hud = 1; - level._zombie_tesla_powerup_last_stand_func = ::tesla_watch_gunner_downed; - ent_player.has_tesla = 1; - ent_player.has_powerup_weapon = 1; - ent_player increment_is_drinking(); - ent_player._zombie_gun_before_tesla = ent_player getcurrentweapon(); - ent_player giveweapon( "tesla_gun_zm" ); - ent_player givemaxammo( "tesla_gun_zm" ); - ent_player switchtoweapon( "tesla_gun_zm" ); - ent_player.zombie_vars["zombie_powerup_tesla_on"] = 1; - level thread tesla_weapon_powerup_countdown( ent_player, "tesla_time_over", time ); - level thread tesla_weapon_powerup_replace( ent_player, "tesla_time_over" ); -} - -tesla_weapon_powerup_countdown( ent_player, str_gun_return_notify, time ) -{ - ent_player endon( "death" ); - ent_player endon( "player_downed" ); - ent_player endon( str_gun_return_notify ); - ent_player endon( "replace_weapon_powerup" ); - setclientsysstate( "levelNotify", "minis", ent_player ); - - for ( ent_player.zombie_vars["zombie_powerup_tesla_time"] = time; 1; ent_player.zombie_vars["zombie_powerup_tesla_time"] = 11 ) - ent_player waittill_any( "weapon_fired", "reload", "zmb_max_ammo" ); - - setclientsysstate( "levelNotify", "minie", ent_player ); - level thread tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ); -} - -tesla_weapon_powerup_replace( ent_player, str_gun_return_notify ) -{ - ent_player endon( "death" ); - ent_player endon( "disconnect" ); - ent_player endon( "player_downed" ); - ent_player endon( str_gun_return_notify ); - - ent_player waittill( "replace_weapon_powerup" ); - - ent_player takeweapon( "tesla_gun_zm" ); - ent_player.zombie_vars["zombie_powerup_tesla_on"] = 0; - ent_player.has_tesla = 0; - ent_player decrement_is_drinking(); -} - -tesla_weapon_powerup_remove( ent_player, str_gun_return_notify ) -{ - ent_player endon( "death" ); - ent_player endon( "player_downed" ); - ent_player takeweapon( "tesla_gun_zm" ); - ent_player.zombie_vars["zombie_powerup_tesla_on"] = 0; - ent_player._show_solo_hud = 0; - ent_player.has_tesla = 0; - ent_player.has_powerup_weapon = 0; - ent_player notify( str_gun_return_notify ); - ent_player decrement_is_drinking(); - - if ( isdefined( ent_player._zombie_gun_before_tesla ) ) - { - player_weapons = ent_player getweaponslistprimaries(); - - for ( i = 0; i < player_weapons.size; i++ ) - { - if ( player_weapons[i] == ent_player._zombie_gun_before_tesla ) - { - ent_player switchtoweapon( ent_player._zombie_gun_before_tesla ); - return; - } - } - } - - primaryweapons = ent_player getweaponslistprimaries(); - - if ( primaryweapons.size > 0 ) - ent_player switchtoweapon( primaryweapons[0] ); - else - { - allweapons = ent_player getweaponslist( 1 ); - - for ( i = 0; i < allweapons.size; i++ ) - { - if ( is_melee_weapon( allweapons[i] ) ) - { - ent_player switchtoweapon( allweapons[i] ); - return; - } - } - } -} - -tesla_weapon_powerup_off() -{ - self.zombie_vars["zombie_powerup_tesla_time"] = 0; -} - -tesla_watch_gunner_downed() -{ - if ( !( isdefined( self.has_tesla ) && self.has_tesla ) ) - return; - - primaryweapons = self getweaponslistprimaries(); - - for ( i = 0; i < primaryweapons.size; i++ ) - { - if ( primaryweapons[i] == "tesla_gun_zm" ) - self takeweapon( "tesla_gun_zm" ); - } - - self notify( "tesla_time_over" ); - self.zombie_vars["zombie_powerup_tesla_on"] = 0; - self._show_solo_hud = 0; - wait 0.05; - self.has_tesla = 0; - self.has_powerup_weapon = 0; -} - -tesla_powerup_active() -{ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i].zombie_vars["zombie_powerup_tesla_on"] ) - return true; - } - - return false; -} - -print_powerup_drop( powerup, type ) -{ -/# - if ( !isdefined( level.powerup_drop_time ) ) - { - level.powerup_drop_time = 0; - level.powerup_random_count = 0; - level.powerup_score_count = 0; - } - - time = ( gettime() - level.powerup_drop_time ) * 0.001; - level.powerup_drop_time = gettime(); - - if ( type == "random" ) - level.powerup_random_count++; - else - level.powerup_score_count++; - - println( "========== POWER UP DROPPED ==========" ); - println( "DROPPED: " + powerup ); - println( "HOW IT DROPPED: " + type ); - println( "--------------------" ); - println( "Drop Time: " + time ); - println( "Random Powerup Count: " + level.powerup_random_count ); - println( "Random Powerup Count: " + level.powerup_score_count ); - println( "======================================" ); -#/ -} - -register_carpenter_node( node, callback ) -{ - if ( !isdefined( level._additional_carpenter_nodes ) ) - level._additional_carpenter_nodes = []; - - node._post_carpenter_callback = callback; - level._additional_carpenter_nodes[level._additional_carpenter_nodes.size] = node; -} - -start_carpenter_new( origin ) -{ - level.carpenter_powerup_active = 1; - window_boards = getstructarray( "exterior_goal", "targetname" ); - - if ( isdefined( level._additional_carpenter_nodes ) ) - window_boards = arraycombine( window_boards, level._additional_carpenter_nodes, 0, 0 ); - - carp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); - carp_ent playloopsound( "evt_carpenter" ); - boards_near_players = get_near_boards( window_boards ); - boards_far_from_players = get_far_boards( window_boards ); - level repair_far_boards( boards_far_from_players, maps\mp\zombies\_zm_powerups::is_carpenter_boards_upgraded() ); - - for ( i = 0; i < boards_near_players.size; i++ ) - { - window = boards_near_players[i]; - num_chunks_checked = 0; - last_repaired_chunk = undefined; - - while ( true ) - { - if ( all_chunks_intact( window, window.barrier_chunks ) ) - break; - - chunk = get_random_destroyed_chunk( window, window.barrier_chunks ); - - if ( !isdefined( chunk ) ) - break; - - window thread maps\mp\zombies\_zm_blockers::replace_chunk( window, chunk, undefined, maps\mp\zombies\_zm_powerups::is_carpenter_boards_upgraded(), 1 ); - last_repaired_chunk = chunk; - - if ( isdefined( window.clip ) ) - { - window.clip enable_trigger(); - window.clip disconnectpaths(); - } - else - blocker_disconnect_paths( window.neg_start, window.neg_end ); - - wait_network_frame(); - num_chunks_checked++; - - if ( num_chunks_checked >= 20 ) - break; - } - - if ( isdefined( window.zbarrier ) ) - { - if ( isdefined( last_repaired_chunk ) ) - { - while ( window.zbarrier getzbarrierpiecestate( last_repaired_chunk ) == "closing" ) - wait 0.05; - - if ( isdefined( window._post_carpenter_callback ) ) - window [[ window._post_carpenter_callback ]](); - } - - continue; - } - - while ( isdefined( last_repaired_chunk ) && last_repaired_chunk.state == "mid_repair" ) - wait 0.05; - } - - carp_ent stoploopsound( 1 ); - carp_ent playsoundwithnotify( "evt_carpenter_end", "sound_done" ); - - carp_ent waittill( "sound_done" ); - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] maps\mp\zombies\_zm_score::player_add_points( "carpenter_powerup", 200 ); - - carp_ent delete(); - level notify( "carpenter_finished" ); - level.carpenter_powerup_active = undefined; -} - -is_carpenter_boards_upgraded() -{ - if ( isdefined( level.pers_carpenter_boards_active ) && level.pers_carpenter_boards_active == 1 ) - return true; - - return false; -} - -get_near_boards( windows ) -{ - players = get_players(); - boards_near_players = []; - - for ( j = 0; j < windows.size; j++ ) - { - close = 0; - - for ( i = 0; i < players.size; i++ ) - { - origin = undefined; - - if ( isdefined( windows[j].zbarrier ) ) - origin = windows[j].zbarrier.origin; - else - origin = windows[j].origin; - - if ( distancesquared( players[i].origin, origin ) <= level.board_repair_distance_squared ) - { - close = 1; - break; - } - } - - if ( close ) - boards_near_players[boards_near_players.size] = windows[j]; - } - - return boards_near_players; -} - -get_far_boards( windows ) -{ - players = get_players(); - boards_far_from_players = []; - - for ( j = 0; j < windows.size; j++ ) - { - close = 0; - - for ( i = 0; i < players.size; i++ ) - { - origin = undefined; - - if ( isdefined( windows[j].zbarrier ) ) - origin = windows[j].zbarrier.origin; - else - origin = windows[j].origin; - - if ( distancesquared( players[i].origin, origin ) >= level.board_repair_distance_squared ) - { - close = 1; - break; - } - } - - if ( close ) - boards_far_from_players[boards_far_from_players.size] = windows[j]; - } - - return boards_far_from_players; -} - -repair_far_boards( barriers, upgrade ) -{ - for ( i = 0; i < barriers.size; i++ ) - { - barrier = barriers[i]; - - if ( all_chunks_intact( barrier, barrier.barrier_chunks ) ) - continue; - - if ( isdefined( barrier.zbarrier ) ) - { - a_pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); - - if ( isdefined( a_pieces ) ) - { - for ( xx = 0; xx < a_pieces.size; xx++ ) - { - chunk = a_pieces[xx]; - - if ( upgrade ) - { - barrier.zbarrier zbarrierpieceuseupgradedmodel( chunk ); - barrier.zbarrier.chunk_health[chunk] = barrier.zbarrier getupgradedpiecenumlives( chunk ); - continue; - } - - barrier.zbarrier zbarrierpieceusedefaultmodel( chunk ); - barrier.zbarrier.chunk_health[chunk] = 0; - } - } - - for ( x = 0; x < barrier.zbarrier getnumzbarrierpieces(); x++ ) - { - barrier.zbarrier setzbarrierpiecestate( x, "closed" ); - barrier.zbarrier showzbarrierpiece( x ); - } - } - - if ( isdefined( barrier.clip ) ) - { - barrier.clip enable_trigger(); - barrier.clip disconnectpaths(); - } - else - blocker_disconnect_paths( barrier.neg_start, barrier.neg_end ); - - if ( i % 4 == 0 ) - wait_network_frame(); - } -} - -func_should_never_drop() -{ - return 0; -} - -func_should_always_drop() -{ - return 1; -} - -func_should_drop_minigun() -{ - if ( minigun_no_drop() ) - return false; - - return true; -} - -func_should_drop_carpenter() -{ - if ( get_num_window_destroyed() < 5 ) - return false; - - return true; -} - -func_should_drop_fire_sale() -{ - if ( level.zombie_vars["zombie_powerup_fire_sale_on"] == 1 || level.chest_moves < 1 || isdefined( level.disable_firesale_drop ) && level.disable_firesale_drop ) - return false; - - return true; -} - -powerup_move() -{ - self endon( "powerup_timedout" ); - self endon( "powerup_grabbed" ); - drag_speed = 75; - - while ( true ) - { - self waittill( "move_powerup", moveto, distance ); - - drag_vector = moveto - self.origin; - range_squared = lengthsquared( drag_vector ); - - if ( range_squared > distance * distance ) - { - drag_vector = vectornormalize( drag_vector ); - drag_vector = distance * drag_vector; - moveto = self.origin + drag_vector; - } - - self.origin = moveto; - } + if ( powerup_name == "teller_withdrawl" || powerup_name == "blue_monkey" || powerup_name == "free_perk" || powerup_name == "bonus_points_player" ) + { + return 0; + } + if ( isDefined( level.statless_powerups ) && isDefined( level.statless_powerups[ powerup_name ] ) ) + { + return 0; + } + return 1; } -powerup_emp() +teller_withdrawl( powerup, player ) //checked matches cerberus output { - self endon( "powerup_timedout" ); - self endon( "powerup_grabbed" ); - - if ( !should_watch_for_emp() ) - return; - - while ( true ) - { - level waittill( "emp_detonate", origin, radius ); - - if ( distancesquared( origin, self.origin ) < radius * radius ) - { - playfx( level._effect["powerup_off"], self.origin ); - self thread powerup_delete_delayed(); - self notify( "powerup_timedout" ); - } - } + player maps/mp/zombies/_zm_score::add_to_player_score( powerup.value ); } -get_powerups( origin, radius ) -{ - if ( isdefined( origin ) && isdefined( radius ) ) - { - powerups = []; - - foreach ( powerup in level.active_powerups ) - { - if ( distancesquared( origin, powerup.origin ) < radius * radius ) - powerups[powerups.size] = powerup; - } - - return powerups; - } - - return level.active_powerups; -} -should_award_stat( powerup_name ) -{ - if ( powerup_name == "teller_withdrawl" || powerup_name == "blue_monkey" || powerup_name == "free_perk" || powerup_name == "bonus_points_player" ) - return false; - if ( isdefined( level.statless_powerups ) && isdefined( level.statless_powerups[powerup_name] ) ) - return false; - return true; -} -teller_withdrawl( powerup, player ) -{ - player maps\mp\zombies\_zm_score::add_to_player_score( powerup.value ); -} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_score.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_score.gsc index ff6c46a..91101e7 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_score.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_score.gsc @@ -1,375 +1,393 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - level.score_cf_info = []; - score_cf_register_info( "damage", 1, 7 ); - score_cf_register_info( "death_normal", 1, 3 ); - score_cf_register_info( "death_torso", 1, 3 ); - score_cf_register_info( "death_neck", 1, 3 ); - score_cf_register_info( "death_head", 1, 3 ); - score_cf_register_info( "death_melee", 1, 3 ); - - if ( !level.createfx_enabled ) - registerclientfield( "allplayers", "score_cf_double_points_active", 1, 1, "int" ); + level.score_cf_info = []; + score_cf_register_info( "damage", 1, 7 ); + score_cf_register_info( "death_normal", 1, 3 ); + score_cf_register_info( "death_torso", 1, 3 ); + score_cf_register_info( "death_neck", 1, 3 ); + score_cf_register_info( "death_head", 1, 3 ); + score_cf_register_info( "death_melee", 1, 3 ); + if ( !level.createfx_enabled ) + { + registerclientfield( "allplayers", "score_cf_double_points_active", 1, 1, "int" ); + } } -score_cf_register_info( name, version, max_count ) +score_cf_register_info( name, version, max_count ) //checked matches cerberus output { - if ( level.createfx_enabled ) - return; - - info = spawnstruct(); - info.name = name; - info.cf_field = "score_cf_" + name; - info.version = version; - info.max_count = max_count; - info.bit_count = getminbitcountfornum( max_count ); - info.players = []; - level.score_cf_info[name] = info; - registerclientfield( "allplayers", info.cf_field, info.version, info.bit_count, "int" ); + if ( level.createfx_enabled ) + { + return; + } + info = spawnstruct(); + info.name = name; + info.cf_field = "score_cf_" + name; + info.version = version; + info.max_count = max_count; + info.bit_count = getminbitcountfornum( max_count ); + info.players = []; + level.score_cf_info[ name ] = info; + registerclientfield( "allplayers", info.cf_field, info.version, info.bit_count, "int" ); } -score_cf_increment_info( name ) +score_cf_increment_info( name ) //checked matches cerberus output { - info = level.score_cf_info[name]; - player_ent_index = self getentitynumber(); - - if ( !isdefined( info.players[player_ent_index] ) ) - info.players[player_ent_index] = 0; - - info.players[player_ent_index]++; - - if ( info.players[player_ent_index] > info.max_count ) - info.players[player_ent_index] = 0; - - self setclientfield( info.cf_field, info.players[player_ent_index] ); + info = level.score_cf_info[ name ]; + player_ent_index = self getentitynumber(); + if ( !isDefined( info.players[ player_ent_index ] ) ) + { + info.players[ player_ent_index ] = 0; + } + info.players[ player_ent_index ]++; + if ( info.players[ player_ent_index ] > info.max_count ) + { + info.players[ player_ent_index ] = 0; + } + self setclientfield( info.cf_field, info.players[ player_ent_index ] ); } -score_cf_monitor() +score_cf_monitor() //checked changed to match cerberus output { - if ( level.createfx_enabled ) - return; - - info_keys = getarraykeys( level.score_cf_info ); - - while ( true ) - { - wait_network_frame(); - players = get_players(); - - for ( player_index = 0; player_index < players.size; player_index++ ) - { - player = players[player_index]; - player_ent_index = player getentitynumber(); - - for ( info_index = 0; info_index < info_keys.size; info_index++ ) - { - info = level.score_cf_info[info_keys[info_index]]; - info.players[player_ent_index] = 0; - player setclientfield( info.cf_field, 0 ); - } - } - } + if ( level.createfx_enabled ) + { + return; + } + info_keys = getarraykeys( level.score_cf_info ); + while ( 1 ) + { + wait_network_frame(); + players = get_players(); + for ( player_index = 0; player_index < players.size; player_index++ ) + { + player = players[ player_index ]; + player_ent_index = player getentitynumber(); + info_index = 0; + for ( info_index = 0; info_index < info_keys.size; info_index++ ) + { + info = level.score_cf_info[ info_keys[ info_index ] ]; + info.players[ player_ent_index ] = 0; + player setclientfield( info.cf_field, 0 ); + } + } + } } -player_add_points( event, mod, hit_location, is_dog, zombie_team, damage_weapon ) +player_add_points( event, mod, hit_location, is_dog, zombie_team, damage_weapon ) //checked changed to match cerberus output { - if ( level.intermission ) - return; - - if ( !is_player_valid( self ) ) - return; - - player_points = 0; - team_points = 0; - multiplier = get_points_multiplier( self ); - - switch ( event ) - { - case "death": - player_points = get_zombie_death_player_points(); - team_points = get_zombie_death_team_points(); - points = self player_add_points_kill_bonus( mod, hit_location ); - - if ( level.zombie_vars[self.team]["zombie_powerup_insta_kill_on"] == 1 && mod == "MOD_UNKNOWN" ) - points *= 2; - - player_points += points; - - if ( team_points > 0 ) - team_points += points; - - if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" ) - { - self maps\mp\zombies\_zm_stats::increment_client_stat( "grenade_kills" ); - self maps\mp\zombies\_zm_stats::increment_player_stat( "grenade_kills" ); - } - - break; - case "ballistic_knife_death": - player_points = get_zombie_death_player_points() + level.zombie_vars["zombie_score_bonus_melee"]; - self score_cf_increment_info( "death_melee" ); - break; - case "damage_light": - player_points = level.zombie_vars["zombie_score_damage_light"]; - self score_cf_increment_info( "damage" ); - break; - case "damage": - player_points = level.zombie_vars["zombie_score_damage_normal"]; - self score_cf_increment_info( "damage" ); - break; - case "damage_ads": - player_points = int( level.zombie_vars["zombie_score_damage_normal"] * 1.25 ); - self score_cf_increment_info( "damage" ); - break; - case "rebuild_board": - case "carpenter_powerup": - player_points = mod; - break; - case "bonus_points_powerup": - player_points = mod; - break; - case "nuke_powerup": - player_points = mod; - team_points = mod; - break; - case "thundergun_fling": - case "riotshield_fling": - case "jetgun_fling": - player_points = mod; - break; - case "hacker_transfer": - player_points = mod; - break; - case "reviver": - player_points = mod; - break; - case "vulture": - player_points = mod; - break; - case "build_wallbuy": - player_points = mod; - break; - default: + if ( level.intermission ) + { + return; + } + if ( !is_player_valid( self ) ) + { + return; + } + player_points = 0; + team_points = 0; + multiplier = get_points_multiplier( self ); + switch( event ) + { + case "death": + player_points = get_zombie_death_player_points(); + team_points = get_zombie_death_team_points(); + points = self player_add_points_kill_bonus( mod, hit_location ); + if ( level.zombie_vars[ self.team ][ "zombie_powerup_insta_kill_on" ] == 1 && mod == "MOD_UNKNOWN" ) + { + points *= 2; + } + player_points += points; + if ( team_points > 0 ) + { + team_points += points; + } + if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" ) + { + self maps/mp/zombies/_zm_stats::increment_client_stat( "grenade_kills" ); + self maps/mp/zombies/_zm_stats::increment_player_stat( "grenade_kills" ); + } + break; + case "ballistic_knife_death": + player_points = get_zombie_death_player_points() + level.zombie_vars[ "zombie_score_bonus_melee" ]; + self score_cf_increment_info( "death_melee" ); + break; + case "damage_light": + player_points = level.zombie_vars[ "zombie_score_damage_light" ]; + self score_cf_increment_info( "damage" ); + break; + case "damage": + player_points = level.zombie_vars[ "zombie_score_damage_normal" ]; + self score_cf_increment_info( "damage" ); + break; + case "damage_ads": + player_points = int( level.zombie_vars[ "zombie_score_damage_normal" ] * 1.25 ); + self score_cf_increment_info( "damage" ); + break; + case "carpenter_powerup": + case "rebuild_board": + player_points = mod; + break; + case "bonus_points_powerup": + player_points = mod; + break; + case "nuke_powerup": + player_points = mod; + team_points = mod; + break; + case "jetgun_fling": + case "riotshield_fling": + case "thundergun_fling": + player_points = mod; + break; + case "hacker_transfer": + player_points = mod; + break; + case "reviver": + player_points = mod; + break; + case "vulture": + player_points = mod; + break; + case "build_wallbuy": + player_points = mod; + break; + default: + /* /# - assert( 0, "Unknown point event" ); + assert( 0, "Unknown point event" ); #/ - break; - } - - player_points = multiplier * round_up_score( player_points, 5 ); - team_points = multiplier * round_up_score( team_points, 5 ); - - if ( isdefined( self.point_split_receiver ) && ( event == "death" || event == "ballistic_knife_death" ) ) - { - split_player_points = player_points - round_up_score( player_points * self.point_split_keep_percent, 10 ); - self.point_split_receiver add_to_player_score( split_player_points ); - player_points -= split_player_points; - } - - if ( is_true( level.pers_upgrade_pistol_points ) ) - player_points = self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_pistol_points_set_score( player_points, event, mod, damage_weapon ); - - self add_to_player_score( player_points ); - self.pers["score"] = self.score; - - if ( isdefined( level._game_module_point_adjustment ) ) - level [[ level._game_module_point_adjustment ]]( self, zombie_team, player_points ); + */ + break; + } + player_points = multiplier * round_up_score( player_points, 5 ); + team_points = multiplier * round_up_score( team_points, 5 ); + if ( isDefined( self.point_split_receiver ) && event == "death" || isDefined( self.point_split_receiver ) && event == "ballistic_knife_death" ) + { + split_player_points = player_points - round_up_score( player_points * self.point_split_keep_percent, 10 ); + self.point_split_receiver add_to_player_score( split_player_points ); + player_points -= split_player_points; + } + if ( is_true( level.pers_upgrade_pistol_points ) ) + { + player_points = self maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_pistol_points_set_score( player_points, event, mod, damage_weapon ); + } + self add_to_player_score( player_points ); + self.pers[ "score" ] = self.score; + if ( isDefined( level._game_module_point_adjustment ) ) + { + level [[ level._game_module_point_adjustment ]]( self, zombie_team, player_points ); + } } -get_points_multiplier( player ) +get_points_multiplier( player ) //checked matches cerberus output { - multiplier = level.zombie_vars[player.team]["zombie_point_scalar"]; - - if ( isdefined( level.current_game_module ) && level.current_game_module == 2 ) - { - if ( isdefined( level._race_team_double_points ) && level._race_team_double_points == player._race_team ) - return multiplier; - else - return 1; - } - - return multiplier; + multiplier = level.zombie_vars[ player.team ][ "zombie_point_scalar" ]; + if ( isDefined( level.current_game_module ) && level.current_game_module == 2 ) + { + if ( isDefined( level._race_team_double_points ) && level._race_team_double_points == player._race_team ) + { + return multiplier; + } + else + { + return 1; + } + } + return multiplier; } -get_zombie_death_player_points() +get_zombie_death_player_points() //checked matches cerberus output { - players = get_players(); - - if ( players.size == 1 ) - points = level.zombie_vars["zombie_score_kill_1player"]; - else if ( players.size == 2 ) - points = level.zombie_vars["zombie_score_kill_2player"]; - else if ( players.size == 3 ) - points = level.zombie_vars["zombie_score_kill_3player"]; - else - points = level.zombie_vars["zombie_score_kill_4player"]; - - return points; + players = get_players(); + if ( players.size == 1 ) + { + points = level.zombie_vars[ "zombie_score_kill_1player" ]; + } + else if ( players.size == 2 ) + { + points = level.zombie_vars[ "zombie_score_kill_2player" ]; + } + else if ( players.size == 3 ) + { + points = level.zombie_vars[ "zombie_score_kill_3player" ]; + } + else + { + points = level.zombie_vars[ "zombie_score_kill_4player" ]; + } + return points; } -get_zombie_death_team_points() +get_zombie_death_team_points() //checked matches cerberus output { - players = get_players(); - - if ( players.size == 1 ) - points = level.zombie_vars["zombie_score_kill_1p_team"]; - else if ( players.size == 2 ) - points = level.zombie_vars["zombie_score_kill_2p_team"]; - else if ( players.size == 3 ) - points = level.zombie_vars["zombie_score_kill_3p_team"]; - else - points = level.zombie_vars["zombie_score_kill_4p_team"]; - - return points; + players = get_players(); + if ( players.size == 1 ) + { + points = level.zombie_vars[ "zombie_score_kill_1p_team" ]; + } + else if ( players.size == 2 ) + { + points = level.zombie_vars[ "zombie_score_kill_2p_team" ]; + } + else if ( players.size == 3 ) + { + points = level.zombie_vars[ "zombie_score_kill_3p_team" ]; + } + else + { + points = level.zombie_vars[ "zombie_score_kill_4p_team" ]; + } + return points; } -player_add_points_kill_bonus( mod, hit_location ) +player_add_points_kill_bonus( mod, hit_location ) //checked matches cerberus output { - if ( mod == "MOD_MELEE" ) - { - self score_cf_increment_info( "death_melee" ); - return level.zombie_vars["zombie_score_bonus_melee"]; - } - - if ( mod == "MOD_BURNED" ) - { - self score_cf_increment_info( "death_torso" ); - return level.zombie_vars["zombie_score_bonus_burn"]; - } - - score = 0; - - if ( isdefined( hit_location ) ) - { - switch ( hit_location ) - { - case "helmet": - case "head": - self score_cf_increment_info( "death_head" ); - score = level.zombie_vars["zombie_score_bonus_head"]; - break; - case "neck": - self score_cf_increment_info( "death_neck" ); - score = level.zombie_vars["zombie_score_bonus_neck"]; - break; - case "torso_upper": - case "torso_lower": - self score_cf_increment_info( "death_torso" ); - score = level.zombie_vars["zombie_score_bonus_torso"]; - break; - default: - self score_cf_increment_info( "death_normal" ); - break; - } - } - - return score; + if ( mod == "MOD_MELEE" ) + { + self score_cf_increment_info( "death_melee" ); + return level.zombie_vars[ "zombie_score_bonus_melee" ]; + } + if ( mod == "MOD_BURNED" ) + { + self score_cf_increment_info( "death_torso" ); + return level.zombie_vars[ "zombie_score_bonus_burn" ]; + } + score = 0; + if ( isDefined( hit_location ) ) + { + switch( hit_location ) + { + case "head": + case "helmet": + self score_cf_increment_info( "death_head" ); + score = level.zombie_vars[ "zombie_score_bonus_head" ]; + break; + case "neck": + self score_cf_increment_info( "death_neck" ); + score = level.zombie_vars[ "zombie_score_bonus_neck" ]; + break; + case "torso_lower": + case "torso_upper": + self score_cf_increment_info( "death_torso" ); + score = level.zombie_vars[ "zombie_score_bonus_torso" ]; + break; + default: + self score_cf_increment_info( "death_normal" ); + break; + } + } + return score; } -player_reduce_points( event, mod, hit_location ) +player_reduce_points( event, mod, hit_location ) //checked matches cerberus output { - if ( level.intermission ) - return; - - points = 0; - - switch ( event ) - { - case "no_revive_penalty": - percent = level.zombie_vars["penalty_no_revive"]; - points = self.score * percent; - break; - case "died": - percent = level.zombie_vars["penalty_died"]; - points = self.score * percent; - break; - case "downed": - percent = level.zombie_vars["penalty_downed"]; - self notify( "I_am_down" ); - points = self.score * percent; - self.score_lost_when_downed = round_up_to_ten( int( points ) ); - break; - default: + if ( level.intermission ) + { + return; + } + points = 0; + switch( event ) + { + case "no_revive_penalty": + percent = level.zombie_vars[ "penalty_no_revive" ]; + points = self.score * percent; + break; + case "died": + percent = level.zombie_vars[ "penalty_died" ]; + points = self.score * percent; + break; + case "downed": + percent = level.zombie_vars[ "penalty_downed" ]; + self notify( "I_am_down" ); + points = self.score * percent; + self.score_lost_when_downed = round_up_to_ten( int( points ) ); + break; + default: + /* /# - assert( 0, "Unknown point event" ); + assert( 0, "Unknown point event" ); #/ - break; - } - - points = self.score - round_up_to_ten( int( points ) ); - - if ( points < 0 ) - points = 0; - - self.score = points; + */ + break; + } + points = self.score - round_up_to_ten( int( points ) ); + if ( points < 0 ) + { + points = 0; + } + self.score = points; } -add_to_player_score( points, add_to_total ) +add_to_player_score( points, add_to_total ) //checked matches cerberus output { - if ( !isdefined( add_to_total ) ) - add_to_total = 1; - - if ( !isdefined( points ) || level.intermission ) - return; - - self.score += points; - self.pers["score"] = self.score; - - if ( add_to_total ) - self.score_total += points; - - self incrementplayerstat( "score", points ); + if ( !isDefined( add_to_total ) ) + { + add_to_total = 1; + } + if ( !isDefined( points ) || level.intermission ) + { + return; + } + self.score += points; + self.pers[ "score" ] = self.score; + if ( add_to_total ) + { + self.score_total += points; + } + self incrementplayerstat( "score", points ); } -minus_to_player_score( points, ignore_double_points_upgrade ) +minus_to_player_score( points, ignore_double_points_upgrade ) //checked matches cerberus output { - if ( !isdefined( points ) || level.intermission ) - return; - - if ( !is_true( ignore_double_points_upgrade ) ) - { - if ( is_true( level.pers_upgrade_double_points ) ) - points = maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_double_points_set_score( points ); - } - - self.score -= points; - self.pers["score"] = self.score; - level notify( "spent_points", self, points ); + if ( !isDefined( points ) || level.intermission ) + { + return; + } + if ( !is_true( ignore_double_points_upgrade ) ) + { + if ( is_true( level.pers_upgrade_double_points ) ) + { + points = maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_double_points_set_score( points ); + } + } + self.score -= points; + self.pers[ "score" ] = self.score; + level notify( "spent_points" ); } -add_to_team_score( points ) +add_to_team_score( points ) //checked matches cerberus output { - } -minus_to_team_score( points ) +minus_to_team_score( points ) //checked matches cerberus output { - } -player_died_penalty() +player_died_penalty() //checked changed to match cerberus output { - players = get_players( self.team ); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] != self && !players[i].is_zombie ) - players[i] player_reduce_points( "no_revive_penalty" ); - } + players = get_players( self.team ); + for ( i = 0; i < players.size; i++ ) + { + if ( players[ i ] != self && !players[ i ].is_zombie ) + { + players[ i ] player_reduce_points( "no_revive_penalty" ); + } + } } -player_downed_penalty() +player_downed_penalty() //checked matches cerberus output { +/* /# - println( "ZM >> LAST STAND - player_downed_penalty " ); + println( "ZM >> LAST STAND - player_downed_penalty " ); #/ - self player_reduce_points( "downed" ); +*/ + self player_reduce_points( "downed" ); } + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_server_throttle.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_server_throttle.gsc index 3ca4222..a00508d 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_server_throttle.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_server_throttle.gsc @@ -1,92 +1,100 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; server_choke_init( id, max ) { - if ( !isdefined( level.zombie_server_choke_ids_max ) ) - { - level.zombie_server_choke_ids_max = []; - level.zombie_server_choke_ids_count = []; - } - - level.zombie_server_choke_ids_max[id] = max; - level.zombie_server_choke_ids_count[id] = 0; - level thread server_choke_thread( id ); + if ( !isDefined( level.zombie_server_choke_ids_max ) ) + { + level.zombie_server_choke_ids_max = []; + level.zombie_server_choke_ids_count = []; + } + level.zombie_server_choke_ids_max[ id ] = max; + level.zombie_server_choke_ids_count[ id ] = 0; + level thread server_choke_thread( id ); } server_choke_thread( id ) { - while ( true ) - { - wait 0.05; - level.zombie_server_choke_ids_count[id] = 0; - } + while ( 1 ) + { + wait 0.05; + level.zombie_server_choke_ids_count[ id ] = 0; + } } server_choke_safe( id ) { - return level.zombie_server_choke_ids_count[id] < level.zombie_server_choke_ids_max[id]; + return level.zombie_server_choke_ids_count[ id ] < level.zombie_server_choke_ids_max[ id ]; } server_choke_action( id, choke_action, arg1, arg2, arg3 ) { +/* /# - assert( isdefined( level.zombie_server_choke_ids_max[id] ), "server Choke: " + id + " undefined" ); + assert( isDefined( level.zombie_server_choke_ids_max[ id ] ), "server Choke: " + id + " undefined" ); #/ - while ( !server_choke_safe( id ) ) - wait 0.05; - - level.zombie_server_choke_ids_count[id]++; - - if ( !isdefined( arg1 ) ) - return [[ choke_action ]](); - - if ( !isdefined( arg2 ) ) - return [[ choke_action ]]( arg1 ); - - if ( !isdefined( arg3 ) ) - return [[ choke_action ]]( arg1, arg2 ); - - return [[ choke_action ]]( arg1, arg2, arg3 ); +*/ + while ( !server_choke_safe( id ) ) + { + wait 0.05; + } + level.zombie_server_choke_ids_count[ id ]++; + if ( !isDefined( arg1 ) ) + { + return [[ choke_action ]](); + } + if ( !isDefined( arg2 ) ) + { + return [[ choke_action ]]( arg1 ); + } + if ( !isDefined( arg3 ) ) + { + return [[ choke_action ]]( arg1, arg2 ); + } + return [[ choke_action ]]( arg1, arg2, arg3 ); } server_entity_valid( entity ) { - if ( !isdefined( entity ) ) - return false; - - return true; + if ( !isDefined( entity ) ) + { + return 0; + } + return 1; } server_safe_init( id, max ) { - if ( !isdefined( level.zombie_server_choke_ids_max ) || !isdefined( level.zombie_server_choke_ids_max[id] ) ) - server_choke_init( id, max ); + if ( !isDefined( level.zombie_server_choke_ids_max ) || !isDefined( level.zombie_server_choke_ids_max[ id ] ) ) + { + server_choke_init( id, max ); + } + /* /# - assert( max == level.zombie_server_choke_ids_max[id] ); + assert( max == level.zombie_server_choke_ids_max[ id ] ); #/ + */ } _server_safe_ground_trace( pos ) { - return groundpos( pos ); + return groundpos( pos ); } server_safe_ground_trace( id, max, origin ) { - server_safe_init( id, max ); - return server_choke_action( id, ::_server_safe_ground_trace, origin ); + server_safe_init( id, max ); + return server_choke_action( id, ::_server_safe_ground_trace, origin ); } _server_safe_ground_trace_ignore_water( pos ) { - return groundpos_ignore_water( pos ); + return groundpos_ignore_water( pos ); } server_safe_ground_trace_ignore_water( id, max, origin ) { - server_safe_init( id, max ); - return server_choke_action( id, ::_server_safe_ground_trace_ignore_water, origin ); + server_safe_init( id, max ); + return server_choke_action( id, ::_server_safe_ground_trace_ignore_water, origin ); } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_sidequests.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_sidequests.gsc index 7431f68..6283a0e 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_sidequests.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_sidequests.gsc @@ -1,1076 +1,1120 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init_sidequests() +init_sidequests() //checked matches cerberus output { - level._sidequest_icons_base_x = -225; - level._zombie_sidequests = []; + level._sidequest_icons_base_x = -225; + level._zombie_sidequests = []; + /* /# - level thread sidequest_debug(); + level thread sidequest_debug(); #/ + */ } -is_sidequest_allowed( a_gametypes ) +is_sidequest_allowed( a_gametypes ) //checked changed to match cerberus output { - if ( isdefined( level.gamedifficulty ) && level.gamedifficulty == 0 ) - return 0; - - b_is_gametype_active = 0; - - if ( !isarray( a_gametypes ) ) - a_gametypes = array( a_gametypes ); - - for ( i = 0; i < a_gametypes.size; i++ ) - { - if ( getdvar( "g_gametype" ) == a_gametypes[i] ) - b_is_gametype_active = 1; - } - - return b_is_gametype_active; + if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 ) + { + return 0; + } + b_is_gametype_active = 0; + if ( !isarray( a_gametypes ) ) + { + a_gametypes = array( a_gametypes ); + } + for ( i = 0; i < a_gametypes.size; i++ ) + { + if ( getDvar( "g_gametype" ) == a_gametypes[ i ] ) + { + b_is_gametype_active = 1; + } + } + return b_is_gametype_active; } -sidequest_debug() +sidequest_debug() //checked matches cerberus output { + /* /# - if ( getdvar( _hash_A7AC338D ) != "1" ) - return; - - while ( true ) - wait 1; + //dvar name is unknown + if ( getDvar( #"A7AC338D" ) != "1" ) + { + return; + } + while ( 1 ) + { + wait 1; #/ + } + */ } -damager_trigger_thread( dam_types, trigger_func ) +damager_trigger_thread( dam_types, trigger_func ) //checked changed to match cerberus output { - while ( true ) - { - self waittill( "damage", amount, attacker, dir, point, type ); - - self.dam_amount = amount; - self.attacker = attacker; - self.dam_dir = dir; - self.dam_point = point; - self.dam_type = type; - - for ( i = 0; i < dam_types.size; i++ ) - { - if ( type == dam_types[i] ) - break; - } - } - - if ( isdefined( trigger_func ) ) - self [[ trigger_func ]](); - - self notify( "triggered" ); + while ( 1 ) + { + self waittill( "damage", amount, attacker, dir, point, type ); + self.dam_amount = amount; + self.attacker = attacker; + self.dam_dir = dir; + self.dam_point = point; + self.dam_type = type; + for ( i = 0; i < dam_types.size; i++ ) + { + if ( type == dam_types[ i ] ) + { + break; + } + } + } + if ( isDefined( trigger_func ) ) + { + self [[ trigger_func ]](); + } + self notify( "triggered" ); } -damage_trigger_thread() +damage_trigger_thread() //checked matches cerberus output { - self endon( "death" ); - - while ( true ) - { - self waittill( "damage" ); - - self.owner_ent notify( "triggered" ); - } + self endon( "death" ); + while ( 1 ) + { + self waittill( "damage" ); + self.owner_ent notify( "triggered" ); + } } -sidequest_uses_teleportation( name ) +sidequest_uses_teleportation( name ) //checked matches cerberus output { - level._zombie_sidequests[name].uses_teleportation = 1; + level._zombie_sidequests[ name ].uses_teleportation = 1; } -declare_sidequest_icon( sidequest_name, icon_name, shader_name ) +declare_sidequest_icon( sidequest_name, icon_name, shader_name ) //checked matches cerberus output { - sidequest = level._zombie_sidequests[sidequest_name]; - sidequest.icons[icon_name] = shader_name; + sidequest = level._zombie_sidequests[ sidequest_name ]; + sidequest.icons[ icon_name ] = shader_name; } -create_icon( shader_name, x ) +create_icon( shader_name, x ) //checked matches cerberus output { - icon = create_simple_hud( self ); - icon.foreground = 1; - icon.sort = 2; - icon.hidewheninmenu = 0; - icon.alignx = "center"; - icon.aligny = "bottom"; - icon.horzalign = "user_right"; - icon.vertalign = "user_bottom"; - icon.x = x; - icon.y = 0; - icon.alpha = 1; - icon setshader( shader_name, 32, 32 ); - return icon; + icon = create_simple_hud( self ); + icon.foreground = 1; + icon.sort = 2; + icon.hidewheninmenu = 0; + icon.alignx = "center"; + icon.aligny = "bottom"; + icon.horzalign = "user_right"; + icon.vertalign = "user_bottom"; + icon.x = x; + icon.y = 0; + icon.alpha = 1; + icon setshader( shader_name, 32, 32 ); + return icon; } -add_sidequest_icon( sidequest_name, icon_name ) +add_sidequest_icon( sidequest_name, icon_name ) //checked matches cerberus output { - if ( !isdefined( self.sidequest_icons ) ) - self.sidequest_icons = []; - - if ( isdefined( self.sidequest_icons[icon_name] ) ) - return; - - sq = level._zombie_sidequests[sidequest_name]; - base_x = level._sidequest_icons_base_x; - - if ( isdefined( level._zombiemode_sidequest_icon_offset ) ) - base_x += level._zombiemode_sidequest_icon_offset; - - self.sidequest_icons[icon_name] = self create_icon( sq.icons[icon_name], base_x + self.sidequest_icons.size * 34 ); + if ( !isDefined( self.sidequest_icons ) ) + { + self.sidequest_icons = []; + } + if ( isDefined( self.sidequest_icons[ icon_name ] ) ) + { + return; + } + sq = level._zombie_sidequests[ sidequest_name ]; + base_x = level._sidequest_icons_base_x; + if ( isDefined( level._zombiemode_sidequest_icon_offset ) ) + { + base_x += level._zombiemode_sidequest_icon_offset; + } + self.sidequest_icons[ icon_name ] = self create_icon( sq.icons[ icon_name ], base_x + self.sidequest_icons.size * 34 ); } -remove_sidequest_icon( sidequest_name, icon_name ) +remove_sidequest_icon( sidequest_name, icon_name ) //checked changed to match cerberus output { - if ( !isdefined( self.sidequest_icons ) ) - return; - - if ( !isdefined( self.sidequest_icons[icon_name] ) ) - return; - - icon = self.sidequest_icons[icon_name]; - new_array = []; - keys = getarraykeys( self.sidequest_icons ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( keys[i] != icon_name ) - new_array[keys[i]] = self.sidequest_icons[keys[i]]; - } - - self.sidequest_icons = new_array; - icon destroy(); - keys = getarraykeys( self.sidequest_icons ); - base_x = level._sidequest_icons_base_x; - - if ( isdefined( level._zombiemode_sidequest_icon_offset ) ) - base_x += level._zombiemode_sidequest_icon_offset; - - for ( i = 0; i < keys.size; i++ ) - self.sidequest_icons[keys[i]].x = base_x + i * 34; + if ( !isDefined( self.sidequest_icons ) ) + { + return; + } + if ( !isDefined( self.sidequest_icons[ icon_name ] ) ) + { + return; + } + icon = self.sidequest_icons[ icon_name ]; + new_array = []; + keys = getarraykeys( self.sidequest_icons ); + for ( i = 0; i < keys.size; i++ ) + { + if ( keys[ i ] != icon_name ) + { + new_array[ keys[ i ] ] = self.sidequest_icons[ keys[ i ] ]; + } + } + self.sidequest_icons = new_array; + icon destroy(); + keys = getarraykeys( self.sidequest_icons ); + base_x = level._sidequest_icons_base_x; + if ( isDefined( level._zombiemode_sidequest_icon_offset ) ) + { + base_x += level._zombiemode_sidequest_icon_offset; + } + for ( i = 0; i < keys.size; i++ ) + { + self.sidequest_icons[ keys[ i ] ].x = base_x + i * 34; + } } -declare_sidequest( name, init_func, logic_func, complete_func, generic_stage_start_func, generic_stage_end_func ) +declare_sidequest( name, init_func, logic_func, complete_func, generic_stage_start_func, generic_stage_end_func ) //checked matches cerberus output { - if ( !isdefined( level._zombie_sidequests ) ) - init_sidequests(); + if ( !isDefined( level._zombie_sidequests ) ) + { + init_sidequests(); + } + /* /# - if ( isdefined( level._zombie_sidequests[name] ) ) - { - println( "*** ERROR: Attempt to re-declare sidequest with name " + name ); - return; - } + if ( isDefined( level._zombie_sidequests[ name ] ) ) + { + println( "*** ERROR: Attempt to re-declare sidequest with name " + name ); + return; #/ - sq = spawnstruct(); - sq.name = name; - sq.stages = []; - sq.last_completed_stage = -1; - sq.active_stage = -1; - sq.sidequest_complete = 0; - sq.init_func = init_func; - sq.logic_func = logic_func; - sq.complete_func = complete_func; - sq.generic_stage_start_func = generic_stage_start_func; - sq.generic_stage_end_func = generic_stage_end_func; - sq.assets = []; - sq.uses_teleportation = 0; - sq.active_assets = []; - sq.icons = []; - sq.num_reps = 0; - level._zombie_sidequests[name] = sq; + } + */ + sq = spawnstruct(); + sq.name = name; + sq.stages = []; + sq.last_completed_stage = -1; + sq.active_stage = -1; + sq.sidequest_complete = 0; + sq.init_func = init_func; + sq.logic_func = logic_func; + sq.complete_func = complete_func; + sq.generic_stage_start_func = generic_stage_start_func; + sq.generic_stage_end_func = generic_stage_end_func; + sq.assets = []; + sq.uses_teleportation = 0; + sq.active_assets = []; + sq.icons = []; + sq.num_reps = 0; + level._zombie_sidequests[ name ] = sq; } -declare_sidequest_stage( sidequest_name, stage_name, init_func, logic_func, exit_func ) +declare_sidequest_stage( sidequest_name, stage_name, init_func, logic_func, exit_func ) //checked matches cerberus output { + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to declare a side quest stage before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to add stage " + stage_name + " to side quest " + sidequest_name + " but no such side quest exists." ); - return; - } - - if ( isdefined( level._zombie_sidequests[sidequest_name].stages[stage_name] ) ) - { - println( "*** ERROR: Sidequest " + sidequest_name + " already has a stage called " + stage_name ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to declare a side quest stage before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to add stage " + stage_name + " to side quest " + sidequest_name + " but no such side quest exists." ); + return; + } + if ( isDefined( level._zombie_sidequests[ sidequest_name ].stages[ stage_name ] ) ) + { + println( "*** ERROR: Sidequest " + sidequest_name + " already has a stage called " + stage_name ); + return; #/ - stage = spawnstruct(); - stage.name = stage_name; - stage.stage_number = level._zombie_sidequests[sidequest_name].stages.size; - stage.assets = []; - stage.active_assets = []; - stage.logic_func = logic_func; - stage.init_func = init_func; - stage.exit_func = exit_func; - stage.completed = 0; - stage.time_limit = 0; - level._zombie_sidequests[sidequest_name].stages[stage_name] = stage; + } + */ + stage = spawnstruct(); + stage.name = stage_name; + stage.stage_number = level._zombie_sidequests[ sidequest_name ].stages.size; + stage.assets = []; + stage.active_assets = []; + stage.logic_func = logic_func; + stage.init_func = init_func; + stage.exit_func = exit_func; + stage.completed = 0; + stage.time_limit = 0; + level._zombie_sidequests[ sidequest_name ].stages[ stage_name ] = stage; } -set_stage_time_limit( sidequest_name, stage_name, time_limit, timer_func ) +set_stage_time_limit( sidequest_name, stage_name, time_limit, timer_func ) //checked matches cerberus output { + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to set a side quest stage time limit before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to add timelimit to stage " + stage_name + " in side quest " + sidequest_name + " but no such side quest exists." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name].stages[stage_name] ) ) - { - println( "*** ERROR: Attempt to add timelimit to stage " + stage_name + " in Sidequest " + sidequest_name + " but stage does not exist." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to set a side quest stage time limit before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to add timelimit to stage " + stage_name + " in side quest " + sidequest_name + " but no such side quest exists." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ].stages[ stage_name ] ) ) + { + println( "*** ERROR: Attempt to add timelimit to stage " + stage_name + " in Sidequest " + sidequest_name + " but stage does not exist." ); + return; #/ - level._zombie_sidequests[sidequest_name].stages[stage_name].time_limit = time_limit; - level._zombie_sidequests[sidequest_name].stages[stage_name].time_limit_func = timer_func; + } + */ + level._zombie_sidequests[ sidequest_name ].stages[ stage_name ].time_limit = time_limit; + level._zombie_sidequests[ sidequest_name ].stages[ stage_name ].time_limit_func = timer_func; } -declare_stage_asset_from_struct( sidequest_name, stage_name, target_name, thread_func, trigger_thread_func ) +declare_stage_asset_from_struct( sidequest_name, stage_name, target_name, thread_func, trigger_thread_func ) //checked changed to match cerberus output { - structs = getstructarray( target_name, "targetname" ); + structs = getstructarray( target_name, "targetname" ); + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to declare a side quest asset " + target_name + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " but no such side quest exists." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name].stages[stage_name] ) ) - { - println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " : " + stage_name + " but no such stage exists." ); - return; - } - - if ( !structs.size ) - { - println( "*** ERROR: No Structs with " + target_name + " not found." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to declare a side quest asset " + target_name + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " but no such side quest exists." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ].stages[ stage_name ] ) ) + { + println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " : " + stage_name + " but no such stage exists." ); + return; + } + if ( !structs.size ) + { + println( "*** ERROR: No Structs with " + target_name + " not found." ); + return; #/ - for ( i = 0; i < structs.size; i++ ) - { - asset = spawnstruct(); - asset.type = "struct"; - asset.struct = structs[i]; - asset.thread_func = thread_func; - asset.trigger_thread_func = trigger_thread_func; - level._zombie_sidequests[sidequest_name].stages[stage_name].assets[level._zombie_sidequests[sidequest_name].stages[stage_name].assets.size] = asset; - } + } + */ + for ( i = 0; i < structs.size; i++ ) + { + asset = spawnstruct(); + asset.type = "struct"; + asset.struct = structs[ i ]; + asset.thread_func = thread_func; + asset.trigger_thread_func = trigger_thread_func; + level._zombie_sidequests[ sidequest_name ].stages[ stage_name ].assets[ level._zombie_sidequests[ sidequest_name ].stages[ stage_name ].assets.size ] = asset; + } } -declare_stage_title( sidequest_name, stage_name, title ) +declare_stage_title( sidequest_name, stage_name, title ) //checked matches cerberus output { + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to declare a stage title " + title + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to declare a stage title " + title + " to side quest " + sidequest_name + " but no such side quest exists." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name].stages[stage_name] ) ) - { - println( "*** ERROR: Attempt to declare stage title " + title + " to side quest " + sidequest_name + " : " + stage_name + " but no such stage exists." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to declare a stage title " + title + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to declare a stage title " + title + " to side quest " + sidequest_name + " but no such side quest exists." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ].stages[ stage_name ] ) ) + { + println( "*** ERROR: Attempt to declare stage title " + title + " to side quest " + sidequest_name + " : " + stage_name + " but no such stage exists." ); + return; #/ - level._zombie_sidequests[sidequest_name].stages[stage_name].title = title; + } + */ + level._zombie_sidequests[ sidequest_name ].stages[ stage_name ].title = title; } -declare_stage_asset( sidequest_name, stage_name, target_name, thread_func, trigger_thread_func ) +declare_stage_asset( sidequest_name, stage_name, target_name, thread_func, trigger_thread_func ) //checked changed to match cerberus output { - ents = getentarray( target_name, "targetname" ); + ents = getentarray( target_name, "targetname" ); + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to declare a side quest asset " + target_name + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " but no such side quest exists." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name].stages[stage_name] ) ) - { - println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " : " + stage_name + " but no such stage exists." ); - return; - } - - if ( !ents.size ) - { - println( "*** ERROR: No Ents with " + target_name + " not found." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to declare a side quest asset " + target_name + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " but no such side quest exists." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ].stages[ stage_name ] ) ) + { + println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " : " + stage_name + " but no such stage exists." ); + return; + } + if ( !ents.size ) + { + println( "*** ERROR: No Ents with " + target_name + " not found." ); + return; #/ - for ( i = 0; i < ents.size; i++ ) - { - asset = spawnstruct(); - asset.type = "entity"; - asset.ent = ents[i]; - asset.thread_func = thread_func; - asset.trigger_thread_func = trigger_thread_func; - level._zombie_sidequests[sidequest_name].stages[stage_name].assets[level._zombie_sidequests[sidequest_name].stages[stage_name].assets.size] = asset; - } + } + */ + for ( i = 0; i < ents.size; i++ ) + { + asset = spawnstruct(); + asset.type = "entity"; + asset.ent = ents[ i ]; + asset.thread_func = thread_func; + asset.trigger_thread_func = trigger_thread_func; + level._zombie_sidequests[ sidequest_name ].stages[ stage_name ].assets[ level._zombie_sidequests[ sidequest_name ].stages[ stage_name ].assets.size ] = asset; + } } -declare_sidequest_asset( sidequest_name, target_name, thread_func, trigger_thread_func ) +declare_sidequest_asset( sidequest_name, target_name, thread_func, trigger_thread_func ) //checked changed to match cerberus output { - ents = getentarray( target_name, "targetname" ); + ents = getentarray( target_name, "targetname" ); + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to declare a side quest asset " + target_name + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " but no such side quest exists." ); - return; - } - - if ( !ents.size ) - { - println( "*** ERROR: No Ents with " + target_name + " not found." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to declare a side quest asset " + target_name + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " but no such side quest exists." ); + return; + } + if ( !ents.size ) + { + println( "*** ERROR: No Ents with " + target_name + " not found." ); + return; #/ - for ( i = 0; i < ents.size; i++ ) - { - asset = spawnstruct(); - asset.type = "entity"; - asset.ent = ents[i]; - asset.thread_func = thread_func; - asset.trigger_thread_func = trigger_thread_func; - asset.ent.thread_func = thread_func; - asset.ent.trigger_thread_func = trigger_thread_func; - level._zombie_sidequests[sidequest_name].assets[level._zombie_sidequests[sidequest_name].assets.size] = asset; - } + } + */ + for ( i = 0; i < ents.size; i++ ) + { + asset = spawnstruct(); + asset.type = "entity"; + asset.ent = ents[ i ]; + asset.thread_func = thread_func; + asset.trigger_thread_func = trigger_thread_func; + asset.ent.thread_func = thread_func; + asset.ent.trigger_thread_func = trigger_thread_func; + level._zombie_sidequests[ sidequest_name ].assets[ level._zombie_sidequests[ sidequest_name ].assets.size ] = asset; + } } -declare_sidequest_asset_from_struct( sidequest_name, target_name, thread_func, trigger_thread_func ) +declare_sidequest_asset_from_struct( sidequest_name, target_name, thread_func, trigger_thread_func ) //checked changed to match cerberus output { - structs = getstructarray( target_name, "targetname" ); + structs = getstructarray( target_name, "targetname" ); + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to declare a side quest asset " + target_name + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " but no such side quest exists." ); - return; - } - - if ( !structs.size ) - { - println( "*** ERROR: No Structs with " + target_name + " not found." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to declare a side quest asset " + target_name + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to add asset " + target_name + " to side quest " + sidequest_name + " but no such side quest exists." ); + return; + } + if ( !structs.size ) + { + println( "*** ERROR: No Structs with " + target_name + " not found." ); + return; #/ - for ( i = 0; i < structs.size; i++ ) - { - asset = spawnstruct(); - asset.type = "struct"; - asset.struct = structs[i]; - asset.thread_func = thread_func; - asset.trigger_thread_func = trigger_thread_func; - level._zombie_sidequests[sidequest_name].assets[level._zombie_sidequests[sidequest_name].assets.size] = asset; - } + } + */ + for ( i = 0; i < structs.size; i++ ) + { + asset = spawnstruct(); + asset.type = "struct"; + asset.struct = structs[ i ]; + asset.thread_func = thread_func; + asset.trigger_thread_func = trigger_thread_func; + level._zombie_sidequests[ sidequest_name ].assets[ level._zombie_sidequests[ sidequest_name ].assets.size ] = asset; + } } -build_asset_from_struct( asset, parent_struct ) +build_asset_from_struct( asset, parent_struct ) //checked matches cerberus output { - ent = spawn( "script_model", asset.origin ); - - if ( isdefined( asset.model ) ) - ent setmodel( asset.model ); - - if ( isdefined( asset.angles ) ) - ent.angles = asset.angles; - - ent.script_noteworthy = asset.script_noteworthy; - ent.type = "struct"; - ent.radius = asset.radius; - ent.thread_func = parent_struct.thread_func; - ent.trigger_thread_func = parent_struct.trigger_thread_func; - ent.script_vector = parent_struct.script_vector; - asset.trigger_thread_func = parent_struct.trigger_thread_func; - asset.script_vector = parent_struct.script_vector; - ent.target = asset.target; - ent.script_float = asset.script_float; - ent.script_int = asset.script_int; - ent.script_trigger_spawnflags = asset.script_trigger_spawnflags; - ent.targetname = asset.targetname; - return ent; + ent = spawn( "script_model", asset.origin ); + if ( isDefined( asset.model ) ) + { + ent setmodel( asset.model ); + } + if ( isDefined( asset.angles ) ) + { + ent.angles = asset.angles; + } + ent.script_noteworthy = asset.script_noteworthy; + ent.type = "struct"; + ent.radius = asset.radius; + ent.thread_func = parent_struct.thread_func; + ent.trigger_thread_func = parent_struct.trigger_thread_func; + ent.script_vector = parent_struct.script_vector; + asset.trigger_thread_func = parent_struct.trigger_thread_func; + asset.script_vector = parent_struct.script_vector; + ent.target = asset.target; + ent.script_float = asset.script_float; + ent.script_int = asset.script_int; + ent.script_trigger_spawnflags = asset.script_trigger_spawnflags; + ent.targetname = asset.targetname; + return ent; } -delete_stage_assets() +delete_stage_assets() //checked changed to match cerberus output { - for ( i = 0; i < self.active_assets.size; i++ ) - { - asset = self.active_assets[i]; - - switch ( asset.type ) - { - case "struct": - if ( isdefined( asset.trigger ) ) - { + for ( i = 0; i < self.active_assets.size; i++ ) + { + asset = self.active_assets[ i ]; + switch( asset.type ) + { + case "struct": + if ( isDefined( asset.trigger ) ) + { + /* /# - println( "Deleting trigger from struct type asset." ); + println( "Deleting trigger from struct type asset." ); #/ - asset.trigger delete(); - asset.trigger = undefined; - } - - asset delete(); - continue; - case "entity": - if ( isdefined( asset.trigger ) ) - { + */ + asset.trigger delete(); + asset.trigger = undefined; + } + asset delete(); + break; + case "entity": + if ( isDefined( asset.trigger ) ) + { + /* /# - println( "Deleting trigger from ent type asset." ); + println( "Deleting trigger from ent type asset." ); #/ - asset.trigger delete(); - asset.trigger = undefined; - } - - continue; - } - } - - remaining_assets = []; - - for ( i = 0; i < self.active_assets.size; i++ ) - { - if ( isdefined( self.active_assets[i] ) ) - remaining_assets[remaining_assets.size] = self.active_assets[i]; - } - - self.active_assets = remaining_assets; + */ + asset.trigger delete(); + asset.trigger = undefined; + } + break; + } + } + remaining_assets = []; + for ( i = 0; i < self.active_assets.size; i++ ) + { + if ( isDefined( self.active_assets[ i ] ) ) + { + remaining_assets[ remaining_assets.size ] = self.active_assets[ i ]; + } + } + self.active_assets = remaining_assets; } -build_assets() +build_assets() //checked changed to match cerberus output { - for ( i = 0; i < self.assets.size; i++ ) - { - asset = undefined; - - switch ( self.assets[i].type ) - { - case "struct": - asset = self.assets[i].struct; - self.active_assets[self.active_assets.size] = build_asset_from_struct( asset, self.assets[i] ); - break; - case "entity": - for ( j = 0; j < self.active_assets.size; j++ ) - { - if ( self.active_assets[j] == self.assets[i].ent ) - { - asset = self.active_assets[j]; - break; - } - } - - asset = self.assets[i].ent; - asset.type = "entity"; - self.active_assets[self.active_assets.size] = asset; - break; - default: + for ( i = 0; i < self.assets.size; i++ ) + { + asset = undefined; + switch( self.assets[ i ].type ) + { + case "struct": + asset = self.assets[ i ].struct; + self.active_assets[ self.active_assets.size ] = build_asset_from_struct( asset, self.assets[ i ] ); + break; + case "entity": + for ( j = 0; j < self.active_assets.size; j++ ) + { + if ( self.active_assets[ j ] == self.assets[ i ].ent ) + { + asset = self.active_assets[ j ]; + break; + } + } + asset = self.assets[ i ].ent; + asset.type = "entity"; + self.active_assets[ self.active_assets.size ] = asset; + break; + default: + /* /# - println( "*** ERROR: Don't know how to build asset of type " + self.assets.type ); + println( "*** ERROR: Don't know how to build asset of type " + self.assets.type ); #/ - break; - } + */ + break; + } + if ( isDefined( asset.script_noteworthy ) && self.assets[ i ].type == "entity" && !isDefined( asset.trigger ) || isDefined( asset.script_noteworthy ) ) + { + trigger_radius = 15; + trigger_height = 72; + if ( isDefined( asset.radius ) ) + { + trigger_radius = asset.radius; + } + if ( isDefined( asset.height ) ) + { + trigger_height = asset.height; + } + trigger_spawnflags = 0; + if ( isDefined( asset.script_trigger_spawnflags ) ) + { + trigger_spawnflags = asset.script_trigger_spawnflags; + } + trigger_offset = ( 0, 0, 0 ); + if ( isDefined( asset.script_vector ) ) + { + trigger_offset = asset.script_vector; + } + switch( asset.script_noteworthy ) + { + case "trigger_radius_use": + use_trigger = spawn( "trigger_radius_use", asset.origin + trigger_offset, trigger_spawnflags, trigger_radius, trigger_height ); + use_trigger setcursorhint( "HINT_NOICON" ); + use_trigger triggerignoreteam(); + if ( isDefined( asset.radius ) ) + { + use_trigger.radius = asset.radius; + } + use_trigger.owner_ent = self.active_assets[ self.active_assets.size - 1 ]; + if ( isDefined( asset.trigger_thread_func ) ) + { + use_trigger thread [[ asset.trigger_thread_func ]](); + } + else + { + use_trigger thread use_trigger_thread(); + } + self.active_assets[ self.active_assets.size - 1 ].trigger = use_trigger; + break; + case "trigger_radius_damage": + damage_trigger = spawn( "trigger_damage", asset.origin + trigger_offset, trigger_spawnflags, trigger_radius, trigger_height ); + if ( isDefined( asset.radius ) ) + { + damage_trigger.radius = asset.radius; + } + damage_trigger.owner_ent = self.active_assets[ self.active_assets.size - 1 ]; + if ( isDefined( asset.trigger_thread_func ) ) + { + damage_trigger thread [[ asset.trigger_thread_func ]](); + } + else + { + damage_trigger thread damage_trigger_thread(); + } + self.active_assets[ self.active_assets.size - 1 ].trigger = damage_trigger; + break; + case "trigger_radius": + radius_trigger = spawn( "trigger_radius", asset.origin + trigger_offset, trigger_spawnflags, trigger_radius, trigger_height ); + if ( isDefined( asset.radius ) ) + { + radius_trigger.radius = asset.radius; + } + radius_trigger.owner_ent = self.active_assets[ self.active_assets.size - 1 ]; + if ( isDefined( asset.trigger_thread_func ) ) + { + radius_trigger thread [[ asset.trigger_thread_func ]](); + } + else + { + radius_trigger thread radius_trigger_thread(); + } + self.active_assets[ self.active_assets.size - 1 ].trigger = radius_trigger; + break; - if ( isdefined( asset.script_noteworthy ) && ( self.assets[i].type == "entity" && !isdefined( asset.trigger ) ) || isdefined( asset.script_noteworthy ) ) - { - trigger_radius = 15; - trigger_height = 72; - - if ( isdefined( asset.radius ) ) - trigger_radius = asset.radius; - - if ( isdefined( asset.height ) ) - trigger_height = asset.height; - - trigger_spawnflags = 0; - - if ( isdefined( asset.script_trigger_spawnflags ) ) - trigger_spawnflags = asset.script_trigger_spawnflags; - - trigger_offset = ( 0, 0, 0 ); - - if ( isdefined( asset.script_vector ) ) - trigger_offset = asset.script_vector; - - switch ( asset.script_noteworthy ) - { - case "trigger_radius_use": - use_trigger = spawn( "trigger_radius_use", asset.origin + trigger_offset, trigger_spawnflags, trigger_radius, trigger_height ); - use_trigger setcursorhint( "HINT_NOICON" ); - use_trigger triggerignoreteam(); - - if ( isdefined( asset.radius ) ) - use_trigger.radius = asset.radius; - - use_trigger.owner_ent = self.active_assets[self.active_assets.size - 1]; - - if ( isdefined( asset.trigger_thread_func ) ) - use_trigger thread [[ asset.trigger_thread_func ]](); - else - use_trigger thread use_trigger_thread(); - - self.active_assets[self.active_assets.size - 1].trigger = use_trigger; - break; - case "trigger_radius_damage": - damage_trigger = spawn( "trigger_damage", asset.origin + trigger_offset, trigger_spawnflags, trigger_radius, trigger_height ); - - if ( isdefined( asset.radius ) ) - damage_trigger.radius = asset.radius; - - damage_trigger.owner_ent = self.active_assets[self.active_assets.size - 1]; - - if ( isdefined( asset.trigger_thread_func ) ) - damage_trigger thread [[ asset.trigger_thread_func ]](); - else - damage_trigger thread damage_trigger_thread(); - - self.active_assets[self.active_assets.size - 1].trigger = damage_trigger; - break; - case "trigger_radius": - radius_trigger = spawn( "trigger_radius", asset.origin + trigger_offset, trigger_spawnflags, trigger_radius, trigger_height ); - - if ( isdefined( asset.radius ) ) - radius_trigger.radius = asset.radius; - - radius_trigger.owner_ent = self.active_assets[self.active_assets.size - 1]; - - if ( isdefined( asset.trigger_thread_func ) ) - radius_trigger thread [[ asset.trigger_thread_func ]](); - else - radius_trigger thread radius_trigger_thread(); - - self.active_assets[self.active_assets.size - 1].trigger = radius_trigger; - break; - } - } - - if ( isdefined( self.assets[i].thread_func ) && !isdefined( self.active_assets[self.active_assets.size - 1].dont_rethread ) ) - self.active_assets[self.active_assets.size - 1] thread [[ self.assets[i].thread_func ]](); - - if ( i % 2 == 0 ) - wait_network_frame(); - } + } + } + if ( isDefined( self.assets[ i ].thread_func ) && !isDefined( self.active_assets[ self.active_assets.size - 1 ].dont_rethread ) ) + { + self.active_assets[ self.active_assets.size - 1 ] thread [[ self.assets[ i ].thread_func ]](); + } + if ( i % 2 == 0 ) + { + wait_network_frame(); + } + } } -radius_trigger_thread() +radius_trigger_thread() //checked matches cerberus output { - self endon( "death" ); - - while ( true ) - { - self waittill( "trigger", player ); - - if ( !isplayer( player ) ) - continue; - - self.owner_ent notify( "triggered" ); - - while ( player istouching( self ) ) - wait 0.05; - - self.owner_ent notify( "untriggered" ); - } + self endon( "death" ); + while ( 1 ) + { + self waittill( "trigger", player ); + while ( !isplayer( player ) ) + { + continue; + } + self.owner_ent notify( "triggered" ); + while ( player istouching( self ) ) + { + wait 0.05; + } + self.owner_ent notify( "untriggered" ); + } } -thread_on_assets( target_name, thread_func ) +thread_on_assets( target_name, thread_func ) //checked changed to match cerberus output { - for ( i = 0; i < self.active_assets.size; i++ ) - { - if ( self.active_assets[i].targetname == target_name ) - self.active_assets[i] thread [[ thread_func ]](); - } + for ( i = 0; i < self.active_assets.size; i++ ) + { + if ( self.active_assets[ i ].targetname == target_name ) + { + self.active_assets[ i ] thread [[ thread_func ]](); + } + } } -stage_logic_func_wrapper( sidequest, stage ) +stage_logic_func_wrapper( sidequest, stage ) //checked matches cerberus output { - if ( isdefined( stage.logic_func ) ) - { - level endon( sidequest.name + "_" + stage.name + "_over" ); - stage [[ stage.logic_func ]](); - } + if ( isDefined( stage.logic_func ) ) + { + level endon( sidequest.name + "_" + stage.name + "_over" ); + stage [[ stage.logic_func ]](); + } } -sidequest_start( sidequest_name ) +sidequest_start( sidequest_name ) //checked matches cerberus output { + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt start a side quest asset " + sidequest_name + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to start " + sidequest_name + " but no such side quest exists." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt start a side quest asset " + sidequest_name + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to start " + sidequest_name + " but no such side quest exists." ); + return; #/ - sidequest = level._zombie_sidequests[sidequest_name]; - sidequest build_assets(); - - if ( isdefined( sidequest.init_func ) ) - sidequest [[ sidequest.init_func ]](); - - if ( isdefined( sidequest.logic_func ) ) - sidequest thread [[ sidequest.logic_func ]](); + } + */ + sidequest = level._zombie_sidequests[ sidequest_name ]; + sidequest build_assets(); + if ( isDefined( sidequest.init_func ) ) + { + sidequest [[ sidequest.init_func ]](); + } + if ( isDefined( sidequest.logic_func ) ) + { + sidequest thread [[ sidequest.logic_func ]](); + } } -stage_start( sidequest, stage ) +stage_start( sidequest, stage ) //checked matches cerberus output { - if ( isstring( sidequest ) ) - sidequest = level._zombie_sidequests[sidequest]; - - if ( isstring( stage ) ) - stage = sidequest.stages[stage]; - - stage build_assets(); - sidequest.active_stage = stage.stage_number; - level notify( sidequest.name + "_" + stage.name + "_started" ); - stage.completed = 0; - - if ( isdefined( sidequest.generic_stage_start_func ) ) - stage [[ sidequest.generic_stage_start_func ]](); - - if ( isdefined( stage.init_func ) ) - stage [[ stage.init_func ]](); - - level._last_stage_started = stage.name; - level thread stage_logic_func_wrapper( sidequest, stage ); - - if ( stage.time_limit > 0 ) - stage thread time_limited_stage( sidequest ); - - if ( isdefined( stage.title ) ) - stage thread display_stage_title( sidequest.uses_teleportation ); + if ( isstring( sidequest ) ) + { + sidequest = level._zombie_sidequests[ sidequest ]; + } + if ( isstring( stage ) ) + { + stage = sidequest.stages[ stage ]; + } + stage build_assets(); + sidequest.active_stage = stage.stage_number; + level notify( sidequest.name + "_" + stage.name + "_started" ); + stage.completed = 0; + if ( isDefined( sidequest.generic_stage_start_func ) ) + { + stage [[ sidequest.generic_stage_start_func ]](); + } + if ( isDefined( stage.init_func ) ) + { + stage [[ stage.init_func ]](); + } + level._last_stage_started = stage.name; + level thread stage_logic_func_wrapper( sidequest, stage ); + if ( stage.time_limit > 0 ) + { + stage thread time_limited_stage( sidequest ); + } + if ( isDefined( stage.title ) ) + { + stage thread display_stage_title( sidequest.uses_teleportation ); + } } -display_stage_title( wait_for_teleport_done_notify ) +display_stage_title( wait_for_teleport_done_notify ) //checked changed to match cerberus output { - if ( wait_for_teleport_done_notify ) - { - level waittill( "teleport_done" ); - - wait 2.0; - } - - stage_text = newhudelem(); - stage_text.location = 0; - stage_text.alignx = "center"; - stage_text.aligny = "middle"; - stage_text.foreground = 1; - stage_text.fontscale = 1.6; - stage_text.sort = 20; - stage_text.x = 320; - stage_text.y = 300; - stage_text.og_scale = 1; - stage_text.color = vectorscale( ( 1, 0, 0 ), 128.0 ); - stage_text.alpha = 0; - stage_text.fontstyle3d = "shadowedmore"; - stage_text settext( self.title ); - stage_text fadeovertime( 0.5 ); - stage_text.alpha = 1; - wait 5.0; - stage_text fadeovertime( 1.0 ); - stage_text.alpha = 0; - wait 1.0; - stage_text destroy(); + if ( wait_for_teleport_done_notify ) + { + level waittill( "teleport_done" ); + wait 2; + } + stage_text = newhudelem(); + stage_text.location = 0; + stage_text.alignx = "center"; + stage_text.aligny = "middle"; + stage_text.foreground = 1; + stage_text.fontscale = 1.6; + stage_text.sort = 20; + stage_text.x = 320; + stage_text.y = 300; + stage_text.og_scale = 1; + stage_text.color = vectorScale( ( 1, 0, 0 ), 128 ); + stage_text.alpha = 0; + stage_text.fontstyle3d = "shadowedmore"; + stage_text settext( self.title ); + stage_text fadeovertime( 0.5 ); + stage_text.alpha = 1; + wait 5; + stage_text fadeovertime( 1 ); + stage_text.alpha = 0; + wait 1; + stage_text destroy(); } -time_limited_stage( sidequest ) +time_limited_stage( sidequest ) //checked matches cerberus output { + /* /# - println( "*** Starting timer for sidequest " + sidequest.name + " stage " + self.name + " : " + self.time_limit + " seconds." ); + println( "*** Starting timer for sidequest " + sidequest.name + " stage " + self.name + " : " + self.time_limit + " seconds." ); #/ - level endon( sidequest.name + "_" + self.name + "_over" ); - level endon( "suspend_timer" ); - level endon( "end_game" ); - time_limit = undefined; - - if ( isdefined( self.time_limit_func ) ) - time_limit = [[ self.time_limit_func ]]() * 0.25; - else - time_limit = self.time_limit * 0.25; - - wait( time_limit ); - level notify( "timed_stage_75_percent" ); - wait( time_limit ); - level notify( "timed_stage_50_percent" ); - wait( time_limit ); - level notify( "timed_stage_25_percent" ); - wait( time_limit - 10 ); - level notify( "timed_stage_10_seconds_to_go" ); - wait 10; - stage_failed( sidequest, self ); + */ + level endon( sidequest.name + "_" + self.name + "_over" ); + level endon( "suspend_timer" ); + level endon( "end_game" ); + time_limit = undefined; + if ( isDefined( self.time_limit_func ) ) + { + time_limit = [[ self.time_limit_func ]]() * 0.25; + } + else + { + time_limit = self.time_limit * 0.25; + } + wait time_limit; + level notify( "timed_stage_75_percent" ); + wait time_limit; + level notify( "timed_stage_50_percent" ); + wait time_limit; + level notify( "timed_stage_25_percent" ); + wait ( time_limit - 10 ); + level notify( "timed_stage_10_seconds_to_go" ); + wait 10; + stage_failed( sidequest, self ); } -sidequest_println( str ) +sidequest_println( str ) //checked matches cerberus output { + /* /# - if ( getdvar( _hash_A7AC338D ) != "1" ) - return; - - println( str ); + if ( getDvar( #"A7AC338D" ) != "1" ) + { + return; + } + println( str ); #/ + */ } -precache_sidequest_assets() +precache_sidequest_assets() //checked changed to match cerberus output { - sidequest_names = getarraykeys( level._zombie_sidequests ); - - for ( i = 0; i < sidequest_names.size; i++ ) - { - sq = level._zombie_sidequests[sidequest_names[i]]; - icon_keys = getarraykeys( sq.icons ); - - for ( j = 0; j < icon_keys.size; j++ ) - precacheshader( sq.icons[icon_keys[j]] ); - - stage_names = getarraykeys( sq.stages ); - - for ( j = 0; j < stage_names.size; j++ ) - { - stage = sq.stages[stage_names[j]]; - - for ( k = 0; k < stage.assets.size; k++ ) - { - asset = stage.assets[k]; - - if ( isdefined( asset.type ) && asset.type == "struct" ) - { - if ( isdefined( asset.model ) ) - precachemodel( asset.model ); - } - } - } - } + sidequest_names = getarraykeys( level._zombie_sidequests ); + for ( i = 0; i < sidequest_names.size; i++ ) + { + sq = level._zombie_sidequests[ sidequest_names[ i ] ]; + icon_keys = getarraykeys( sq.icons ); + for ( j = 0; j < icon_keys.size; j++ ) + { + precacheshader( sq.icons[ icon_keys[ j ] ] ); + } + stage_names = getarraykeys( sq.stages ); + for ( j = 0; j < stage_names.size; j++ ) + { + stage = sq.stages[ stage_names[ j ] ]; + for ( k = 0; k < stage.assets.size; k++ ) + { + asset = stage.assets[ k ]; + if ( isDefined( asset.type ) && asset.type == "struct" ) + { + if ( isDefined( asset.model ) ) + { + precachemodel( asset.model ); + } + } + } + } + } } -sidequest_complete( sidequest_name ) +sidequest_complete( sidequest_name ) //checked matches cerberus output { + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to call sidequest_complete for sidequest " + sidequest_name + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to call sidequest_complete for sidequest " + sidequest_name + " but no such side quest exists." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to call sidequest_complete for sidequest " + sidequest_name + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to call sidequest_complete for sidequest " + sidequest_name + " but no such side quest exists." ); + return; #/ - return level._zombie_sidequests[sidequest_name].sidequest_complete; + } + */ + return level._zombie_sidequests[ sidequest_name ].sidequest_complete; } -stage_completed( sidequest_name, stage_name ) +stage_completed( sidequest_name, stage_name ) //checked matches cerberus output { + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt to call stage_complete for sidequest " + sidequest_name + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to call stage_complete for sidequest " + sidequest_name + " but no such side quest exists." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name].stages[stage_name] ) ) - { - println( "*** ERROR: Attempt to call stage_complete in sq " + sidequest_name + " : " + stage_name + " but no such stage exists." ); - return; - } - - println( "*** stage completed called." ); + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt to call stage_complete for sidequest " + sidequest_name + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to call stage_complete for sidequest " + sidequest_name + " but no such side quest exists." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ].stages[ stage_name ] ) ) + { + println( "*** ERROR: Attempt to call stage_complete in sq " + sidequest_name + " : " + stage_name + " but no such stage exists." ); + return; + } + println( "*** stage completed called." ); #/ - sidequest = level._zombie_sidequests[sidequest_name]; - stage = sidequest.stages[stage_name]; - level thread stage_completed_internal( sidequest, stage ); + */ + sidequest = level._zombie_sidequests[ sidequest_name ]; + stage = sidequest.stages[ stage_name ]; + level thread stage_completed_internal( sidequest, stage ); } -stage_completed_internal( sidequest, stage ) +stage_completed_internal( sidequest, stage ) //checked changed to match cerberus output { - level notify( sidequest.name + "_" + stage.name + "_over" ); - level notify( sidequest.name + "_" + stage.name + "_completed" ); - - if ( isdefined( sidequest.generic_stage_end_func ) ) - { + level notify( sidequest.name + "_" + stage.name + "_over" ); + level notify( sidequest.name + "_" + stage.name + "_completed" ); + if ( isDefined( sidequest.generic_stage_end_func ) ) + { + /* /# - println( "Calling generic end func." ); + println( "Calling generic end func." ); #/ - stage [[ sidequest.generic_stage_end_func ]](); - } - - if ( isdefined( stage.exit_func ) ) - { + */ + stage [[ sidequest.generic_stage_end_func ]](); + } + if ( isDefined( stage.exit_func ) ) + { + /* /# - println( "Calling stage end func." ); + println( "Calling stage end func." ); #/ - stage [[ stage.exit_func ]]( 1 ); - } - - stage.completed = 1; - sidequest.last_completed_stage = sidequest.active_stage; - sidequest.active_stage = -1; - stage delete_stage_assets(); - all_complete = 1; - stage_names = getarraykeys( sidequest.stages ); - - for ( i = 0; i < stage_names.size; i++ ) - { - if ( sidequest.stages[stage_names[i]].completed == 0 ) - { - all_complete = 0; - break; - } - } - - if ( all_complete == 1 ) - { - if ( isdefined( sidequest.complete_func ) ) - sidequest thread [[ sidequest.complete_func ]](); - - level notify( "sidequest_" + sidequest.name + "_complete" ); - sidequest.sidequest_completed = 1; - } + */ + stage [[ stage.exit_func ]]( 1 ); + } + stage.completed = 1; + sidequest.last_completed_stage = sidequest.active_stage; + sidequest.active_stage = -1; + stage delete_stage_assets(); + all_complete = 1; + stage_names = getarraykeys( sidequest.stages ); + for ( i = 0; i < stage_names.size; i++ ) + { + if ( sidequest.stages[ stage_names[ i ] ].completed == 0 ) + { + all_complete = 0; + break; + } + } + if ( all_complete == 1 ) + { + if ( isDefined( sidequest.complete_func ) ) + { + sidequest thread [[ sidequest.complete_func ]](); + } + level notify( "sidequest_" + sidequest.name + "_complete" ); + sidequest.sidequest_completed = 1; + } } -stage_failed_internal( sidequest, stage ) +stage_failed_internal( sidequest, stage ) //checked matches cerberus output { - level notify( sidequest.name + "_" + stage.name + "_over" ); - level notify( sidequest.name + "_" + stage.name + "_failed" ); - - if ( isdefined( sidequest.generic_stage_end_func ) ) - stage [[ sidequest.generic_stage_end_func ]](); - - if ( isdefined( stage.exit_func ) ) - stage [[ stage.exit_func ]]( 0 ); - - sidequest.active_stage = -1; - stage delete_stage_assets(); + level notify( sidequest.name + "_" + stage.name + "_over" ); + level notify( sidequest.name + "_" + stage.name + "_failed" ); + if ( isDefined( sidequest.generic_stage_end_func ) ) + { + stage [[ sidequest.generic_stage_end_func ]](); + } + if ( isDefined( stage.exit_func ) ) + { + stage [[ stage.exit_func ]]( 0 ); + } + sidequest.active_stage = -1; + stage delete_stage_assets(); } -stage_failed( sidequest, stage ) +stage_failed( sidequest, stage ) //checked matches cerberus output { + /* /# - println( "*** Stage failed called." ); + println( "*** Stage failed called." ); #/ - if ( isstring( sidequest ) ) - sidequest = level._zombie_sidequests[sidequest]; - - if ( isstring( stage ) ) - stage = sidequest.stages[stage]; - - level thread stage_failed_internal( sidequest, stage ); + */ + if ( isstring( sidequest ) ) + { + sidequest = level._zombie_sidequests[ sidequest ]; + } + if ( isstring( stage ) ) + { + stage = sidequest.stages[ stage ]; + } + level thread stage_failed_internal( sidequest, stage ); } -get_sidequest_stage( sidequest, stage_number ) +get_sidequest_stage( sidequest, stage_number ) //checked changed to match cerberus output { - stage = undefined; - stage_names = getarraykeys( sidequest.stages ); - - for ( i = 0; i < stage_names.size; i++ ) - { - if ( sidequest.stages[stage_names[i]].stage_number == stage_number ) - { - stage = sidequest.stages[stage_names[i]]; - break; - } - } - - return stage; + stage = undefined; + stage_names = getarraykeys( sidequest.stages ); + for ( i = 0; i < stage_names.size; i++ ) + { + if ( sidequest.stages[ stage_names[ i ] ].stage_number == stage_number ) + { + stage = sidequest.stages[ stage_names[ i ] ]; + break; + } + } + return stage; } -get_damage_trigger( radius, origin, damage_types ) +get_damage_trigger( radius, origin, damage_types ) //checked matches cerberus output { - trig = spawn( "trigger_damage", origin, 0, radius, 72 ); - trig thread dam_trigger_thread( damage_types ); - return trig; + trig = spawn( "trigger_damage", origin, 0, radius, 72 ); + trig thread dam_trigger_thread( damage_types ); + return trig; } -dam_trigger_thread( damage_types ) +dam_trigger_thread( damage_types ) //checked changed to match cerberus output { - self endon( "death" ); - damage_type = "NONE"; - - while ( true ) - { - self waittill( "damage", amount, attacker, dir, point, mod ); - - for ( i = 0; i < damage_types.size; i++ ) - { - if ( mod == damage_types[i] ) - self notify( "triggered" ); - } - } + self endon( "death" ); + damage_type = "NONE"; + while ( 1 ) + { + self waittill( "damage", amount, attacker, dir, point, mod ); + for ( i = 0; i < damage_types.size; i++ ) + { + if ( mod == damage_types[ i ] ) + { + self notify( "triggered" ); + } + } + } } -use_trigger_thread() +use_trigger_thread() //checked matches cerberus output { - self endon( "death" ); - - while ( true ) - { - self waittill( "trigger", player ); - - self.owner_ent notify( "triggered", player ); - wait 0.1; - } + self endon( "death" ); + while ( 1 ) + { + self waittill( "trigger", player ); + self.owner_ent notify( "triggered" ); + wait 0.1; + } } -sidequest_stage_active( sidequest_name, stage_name ) +sidequest_stage_active( sidequest_name, stage_name ) //checked matches cerberus output { - sidequest = level._zombie_sidequests[sidequest_name]; - stage = sidequest.stages[stage_name]; - - if ( sidequest.active_stage == stage.stage_number ) - return true; - else - return false; + sidequest = level._zombie_sidequests[ sidequest_name ]; + stage = sidequest.stages[ stage_name ]; + if ( sidequest.active_stage == stage.stage_number ) + { + return 1; + } + else + { + return 0; + } } -sidequest_start_next_stage( sidequest_name ) +sidequest_start_next_stage( sidequest_name ) //checked matches cerberus output { + /* /# - if ( !isdefined( level._zombie_sidequests ) ) - { - println( "*** ERROR: Attempt start next stage in side quest asset " + sidequest_name + " before sidequests declared." ); - return; - } - - if ( !isdefined( level._zombie_sidequests[sidequest_name] ) ) - { - println( "*** ERROR: Attempt to start next sidequest in sidequest " + sidequest_name + " but no such side quest exists." ); - return; - } + if ( !isDefined( level._zombie_sidequests ) ) + { + println( "*** ERROR: Attempt start next stage in side quest asset " + sidequest_name + " before sidequests declared." ); + return; + } + if ( !isDefined( level._zombie_sidequests[ sidequest_name ] ) ) + { + println( "*** ERROR: Attempt to start next sidequest in sidequest " + sidequest_name + " but no such side quest exists." ); + return; #/ - sidequest = level._zombie_sidequests[sidequest_name]; - - if ( sidequest.sidequest_complete == 1 ) - return; - - last_completed = sidequest.last_completed_stage; - - if ( last_completed == -1 ) - last_completed = 0; - else - last_completed++; - - stage = get_sidequest_stage( sidequest, last_completed ); - - if ( !isdefined( stage ) ) - { + } + */ + sidequest = level._zombie_sidequests[ sidequest_name ]; + if ( sidequest.sidequest_complete == 1 ) + { + return; + } + last_completed = sidequest.last_completed_stage; + if ( last_completed == -1 ) + { + last_completed = 0; + } + else + { + last_completed++; + } + stage = get_sidequest_stage( sidequest, last_completed ); + if ( !isDefined( stage ) ) + { + /* /# - println( "*** ERROR: Sidequest " + sidequest_name + " has no stage number " + last_completed ); + println( "*** ERROR: Sidequest " + sidequest_name + " has no stage number " + last_completed ); #/ - return; - } - - stage_start( sidequest, stage ); - return stage; + */ + return; + } + stage_start( sidequest, stage ); + return stage; } -main() +main() //checked matches cerberus output { - } -is_facing( facee ) +is_facing( facee ) //checked matches cerberus output { - orientation = self getplayerangles(); - forwardvec = anglestoforward( orientation ); - forwardvec2d = ( forwardvec[0], forwardvec[1], 0 ); - unitforwardvec2d = vectornormalize( forwardvec2d ); - tofaceevec = facee.origin - self.origin; - tofaceevec2d = ( tofaceevec[0], tofaceevec[1], 0 ); - unittofaceevec2d = vectornormalize( tofaceevec2d ); - dotproduct = vectordot( unitforwardvec2d, unittofaceevec2d ); - return dotproduct > 0.9; + orientation = self getplayerangles(); + forwardvec = anglesToForward( orientation ); + forwardvec2d = ( forwardvec[ 0 ], forwardvec[ 1 ], 0 ); + unitforwardvec2d = vectornormalize( forwardvec2d ); + tofaceevec = facee.origin - self.origin; + tofaceevec2d = ( tofaceevec[ 0 ], tofaceevec[ 1 ], 0 ); + unittofaceevec2d = vectornormalize( tofaceevec2d ); + dotproduct = vectordot( unitforwardvec2d, unittofaceevec2d ); + return dotproduct > 0.9; } -fake_use( notify_string, qualifier_func ) +fake_use( notify_string, qualifier_func ) //checked changed to match cerberus output { - waittillframeend; - - while ( true ) - { - if ( !isdefined( self ) ) - return; + waittillframeend; + while ( 1 ) + { + if ( !isDefined( self ) ) + { + return; + } + /* /# - print3d( self.origin, "+", vectorscale( ( 0, 1, 0 ), 255.0 ), 1 ); + print3d( self.origin, "+", vectorScale( ( 0, 1, 0 ), 255 ), 1 ); #/ - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - qualifier_passed = 1; - - if ( isdefined( qualifier_func ) ) - qualifier_passed = players[i] [[ qualifier_func ]](); - - if ( qualifier_passed && distancesquared( self.origin, players[i].origin ) < 4096 ) - { - if ( players[i] is_facing( self ) ) - { - if ( players[i] usebuttonpressed() ) - { - self notify( notify_string, players[i] ); - return; - } - } - } - } - - wait 0.1; - } + */ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + qualifier_passed = 1; + if ( isDefined( qualifier_func ) ) + { + qualifier_passed = players[ i ] [[ qualifier_func ]](); + } + if ( qualifier_passed && distancesquared( self.origin, players[ i ].origin ) < 4096 ) + { + if ( players[ i ] is_facing( self ) ) + { + if ( players[ i ] usebuttonpressed() ) + { + self notify( notify_string, players[ i ] ); + return; + } + } + } + } + wait 0.1; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_spawner.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_spawner.gsc index 8f1437e..34889df 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_spawner.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_spawner.gsc @@ -1,3101 +1,3290 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_net; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_ai_basic; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\animscripts\zm_shared; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_blockers; -#include maps\mp\animscripts\zm_death; -#include maps\mp\animscripts\zm_run; -#include maps\mp\zombies\_zm_powerups; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_pers_upgrades; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\zombies\_zm; -#include maps\mp\zombies\_zm_spawner; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_ai_faller; +#include maps/mp/zombies/_zm_ai_faller; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_pers_upgrades; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/animscripts/zm_run; +#include maps/mp/animscripts/zm_death; +#include maps/mp/zombies/_zm_blockers; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/zombies/_zm_ai_basic; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked changed to match cerberus output { - level._contextual_grab_lerp_time = 0.3; - level.zombie_spawners = getentarray( "zombie_spawner", "script_noteworthy" ); - - if ( isdefined( level.use_multiple_spawns ) && level.use_multiple_spawns ) - { - level.zombie_spawn = []; - - for ( i = 0; i < level.zombie_spawners.size; i++ ) - { - if ( isdefined( level.zombie_spawners[i].script_int ) ) - { - int = level.zombie_spawners[i].script_int; - - if ( !isdefined( level.zombie_spawn[int] ) ) - level.zombie_spawn[int] = []; - - level.zombie_spawn[int][level.zombie_spawn[int].size] = level.zombie_spawners[i]; - } - } - } - - precachemodel( "p6_anim_zm_barricade_board_01_upgrade" ); - precachemodel( "p6_anim_zm_barricade_board_02_upgrade" ); - precachemodel( "p6_anim_zm_barricade_board_03_upgrade" ); - precachemodel( "p6_anim_zm_barricade_board_04_upgrade" ); - precachemodel( "p6_anim_zm_barricade_board_05_upgrade" ); - precachemodel( "p6_anim_zm_barricade_board_06_upgrade" ); - - if ( isdefined( level.ignore_spawner_func ) ) - { - for ( i = 0; i < level.zombie_spawners.size; i++ ) - { - ignore = [[ level.ignore_spawner_func ]]( level.zombie_spawners[i] ); - - if ( ignore ) - arrayremovevalue( level.zombie_spawners, level.zombie_spawners[i] ); - } - } - - gametype = getdvar( "ui_gametype" ); - - if ( !isdefined( level.attack_player_thru_boards_range ) ) - level.attack_player_thru_boards_range = 109.8; - - if ( isdefined( level._game_module_custom_spawn_init_func ) ) - [[ level._game_module_custom_spawn_init_func ]](); - - registerclientfield( "actor", "zombie_has_eyes", 1, 1, "int" ); - registerclientfield( "actor", "zombie_ragdoll_explode", 1, 1, "int" ); - registerclientfield( "actor", "zombie_gut_explosion", 9000, 1, "int" ); + level._contextual_grab_lerp_time = 0.3; + level.zombie_spawners = getentarray( "zombie_spawner", "script_noteworthy" ); + if ( is_true( level.use_multiple_spawns ) ) + { + level.zombie_spawn = []; + for ( i = 0; i < level.zombie_spawners.size; i++ ) + { + if ( isDefined( level.zombie_spawners[ i ].script_int ) ) + { + int = level.zombie_spawners[ i ].script_int; + if ( !isDefined( level.zombie_spawn[ int ] ) ) + { + level.zombie_spawn[ int ] = []; + } + level.zombie_spawn[ int ][ level.zombie_spawn[ int ].size ] = level.zombie_spawners[ i ]; + } + } + } + precachemodel( "p6_anim_zm_barricade_board_01_upgrade" ); + precachemodel( "p6_anim_zm_barricade_board_02_upgrade" ); + precachemodel( "p6_anim_zm_barricade_board_03_upgrade" ); + precachemodel( "p6_anim_zm_barricade_board_04_upgrade" ); + precachemodel( "p6_anim_zm_barricade_board_05_upgrade" ); + precachemodel( "p6_anim_zm_barricade_board_06_upgrade" ); + if ( isDefined( level.ignore_spawner_func ) ) + { + for ( i = 0; i < level.zombie_spawners.size; i++ ) + { + ignore = [[ level.ignore_spawner_func ]]( level.zombie_spawners[ i ] ); + if ( ignore ) + { + arrayremovevalue( level.zombie_spawners, level.zombie_spawners[ i ] ); + } + } + } + gametype = getDvar( "ui_gametype" ); + if ( !isDefined( level.attack_player_thru_boards_range ) ) + { + level.attack_player_thru_boards_range = 109.8; + } + if ( isDefined( level._game_module_custom_spawn_init_func ) ) + { + [[ level._game_module_custom_spawn_init_func ]](); + } + registerclientfield( "actor", "zombie_has_eyes", 1, 1, "int" ); + registerclientfield( "actor", "zombie_ragdoll_explode", 1, 1, "int" ); + registerclientfield( "actor", "zombie_gut_explosion", 9000, 1, "int" ); } -add_cusom_zombie_spawn_logic( func ) +add_cusom_zombie_spawn_logic( func ) //checked matches cerberus output { - if ( !isdefined( level._zombie_custom_spawn_logic ) ) - level._zombie_custom_spawn_logic = []; - - level._zombie_custom_spawn_logic[level._zombie_custom_spawn_logic.size] = func; + if ( !isDefined( level._zombie_custom_spawn_logic ) ) + { + level._zombie_custom_spawn_logic = []; + } + level._zombie_custom_spawn_logic[ level._zombie_custom_spawn_logic.size ] = func; } -player_attacks_enemy( player, amount, type, point ) +player_attacks_enemy( player, amount, type, point ) //checked matches cerberus output { - team = undefined; - - if ( isdefined( self._race_team ) ) - team = self._race_team; - - if ( !isads( player ) ) - { - [[ level.global_damage_func ]]( type, self.damagelocation, point, player, amount, team ); - return false; - } - - if ( !bullet_attack( type ) ) - { - [[ level.global_damage_func ]]( type, self.damagelocation, point, player, amount, team ); - return false; - } - - [[ level.global_damage_func_ads ]]( type, self.damagelocation, point, player, amount, team ); - return true; + team = undefined; + if ( isDefined( self._race_team ) ) + { + team = self._race_team; + } + if ( !isads( player ) ) + { + [[ level.global_damage_func ]]( type, self.damagelocation, point, player, amount, team ); + return 0; + } + if ( !bullet_attack( type ) ) + { + [[ level.global_damage_func ]]( type, self.damagelocation, point, player, amount, team ); + return 0; + } + [[ level.global_damage_func_ads ]]( type, self.damagelocation, point, player, amount, team ); + return 1; } -player_attacker( attacker ) +player_attacker( attacker ) //checked matches cerberus output { - if ( isplayer( attacker ) ) - return true; - - return false; + if ( isplayer( attacker ) ) + { + return 1; + } + return 0; } -enemy_death_detection() +enemy_death_detection() //checked changed to match cerberus output { - self endon( "death" ); - - for (;;) - { - self waittill( "damage", amount, attacker, direction_vec, point, type ); - - if ( !isdefined( amount ) ) - continue; - - if ( !isalive( self ) || self.delayeddeath ) - return; - - if ( !player_attacker( attacker ) ) - continue; - - self.has_been_damaged_by_player = 1; - self player_attacks_enemy( attacker, amount, type, point ); - } + self endon( "death" ); + for ( ;; ) + { + self waittill( "damage", amount, attacker, direction_vec, point, type ); + if ( !isDefined( amount ) ) + { + continue; + } + if ( !isalive( self ) || self.delayeddeath ) + { + return; + } + if ( !player_attacker( attacker ) ) + { + continue; + } + self.has_been_damaged_by_player = 1; + self player_attacks_enemy( attacker, amount, type, point ); + } } -is_spawner_targeted_by_blocker( ent ) +is_spawner_targeted_by_blocker( ent ) //checked changed to match cerberus output { - if ( isdefined( ent.targetname ) ) - { - targeters = getentarray( ent.targetname, "target" ); - - for ( i = 0; i < targeters.size; i++ ) - { - if ( targeters[i].targetname == "zombie_door" || targeters[i].targetname == "zombie_debris" ) - return true; - - result = is_spawner_targeted_by_blocker( targeters[i] ); - - if ( result ) - return true; - } - } - - return false; + if ( isDefined( ent.targetname ) ) + { + targeters = getentarray( ent.targetname, "target" ); + for ( i = 0; i < targeters.size; i++ ) + { + if ( targeters[ i ].targetname == "zombie_door" || targeters[ i ].targetname == "zombie_debris" ) + { + return 1; + } + result = is_spawner_targeted_by_blocker( targeters[ i ] ); + if ( result ) + { + return 1; + } + i++; + } + } + return 0; } -add_custom_zombie_spawn_logic( func ) +add_custom_zombie_spawn_logic( func ) //checked matches cerberus output { - if ( !isdefined( level._zombie_custom_spawn_logic ) ) - level._zombie_custom_spawn_logic = []; - - level._zombie_custom_spawn_logic[level._zombie_custom_spawn_logic.size] = func; + if ( !isDefined( level._zombie_custom_spawn_logic ) ) + { + level._zombie_custom_spawn_logic = []; + } + level._zombie_custom_spawn_logic[ level._zombie_custom_spawn_logic.size ] = func; } -zombie_spawn_init( animname_set ) +zombie_spawn_init( animname_set ) //checked partially changed to match cerberus output { - if ( !isdefined( animname_set ) ) - animname_set = 0; - - self.targetname = "zombie"; - self.script_noteworthy = undefined; - recalc_zombie_array(); - - if ( !animname_set ) - self.animname = "zombie"; - - if ( isdefined( get_gamemode_var( "pre_init_zombie_spawn_func" ) ) ) - self [[ get_gamemode_var( "pre_init_zombie_spawn_func" ) ]](); - - self thread play_ambient_zombie_vocals(); - self.zmb_vocals_attack = "zmb_vocals_zombie_attack"; - self.ignoreall = 1; - self.ignoreme = 1; - self.allowdeath = 1; - self.force_gib = 1; - self.is_zombie = 1; - self.has_legs = 1; - self allowedstances( "stand" ); - self.zombie_damaged_by_bar_knockdown = 0; - self.gibbed = 0; - self.head_gibbed = 0; - self setphysparams( 15, 0, 72 ); - self.disablearrivals = 1; - self.disableexits = 1; - self.grenadeawareness = 0; - self.badplaceawareness = 0; - self.ignoresuppression = 1; - self.suppressionthreshold = 1; - self.nododgemove = 1; - self.dontshootwhilemoving = 1; - self.pathenemylookahead = 0; - self.badplaceawareness = 0; - self.chatinitialized = 0; - self.a.disablepain = 1; - self disable_react(); - - if ( isdefined( level.zombie_health ) ) - { - self.maxhealth = level.zombie_health; - - if ( isdefined( level.zombie_respawned_health ) && level.zombie_respawned_health.size > 0 ) - { - self.health = level.zombie_respawned_health[0]; - arrayremovevalue( level.zombie_respawned_health, level.zombie_respawned_health[0] ); - } - else - self.health = level.zombie_health; - } - else - { - self.maxhealth = level.zombie_vars["zombie_health_start"]; - self.health = self.maxhealth; - } - - self.freezegun_damage = 0; - self.dropweapon = 0; - level thread zombie_death_event( self ); - self init_zombie_run_cycle(); - self thread zombie_think(); - self thread zombie_gib_on_damage(); - self thread zombie_damage_failsafe(); - self thread enemy_death_detection(); - - if ( isdefined( level._zombie_custom_spawn_logic ) ) - { - if ( isarray( level._zombie_custom_spawn_logic ) ) - { - for ( i = 0; i < level._zombie_custom_spawn_logic.size; i++ ) - self thread [[ level._zombie_custom_spawn_logic[i] ]](); - } - else - self thread [[ level._zombie_custom_spawn_logic ]](); - } - - if ( !isdefined( self.no_eye_glow ) || !self.no_eye_glow ) - { - if ( !( isdefined( self.is_inert ) && self.is_inert ) ) - self thread delayed_zombie_eye_glow(); - } - - self.deathfunction = ::zombie_death_animscript; - self.flame_damage_time = 0; - self.meleedamage = 60; - self.no_powerups = 1; - self zombie_history( "zombie_spawn_init -> Spawned = " + self.origin ); - self.thundergun_knockdown_func = level.basic_zombie_thundergun_knockdown; - self.tesla_head_gib_func = ::zombie_tesla_head_gib; - self.team = level.zombie_team; - - if ( isdefined( level.achievement_monitor_func ) ) - self [[ level.achievement_monitor_func ]](); - - if ( isdefined( get_gamemode_var( "post_init_zombie_spawn_func" ) ) ) - self [[ get_gamemode_var( "post_init_zombie_spawn_func" ) ]](); - - if ( isdefined( level.zombie_init_done ) ) - self [[ level.zombie_init_done ]](); - - self.zombie_init_done = 1; - self notify( "zombie_init_done" ); + if ( !isDefined( animname_set ) ) + { + animname_set = 0; + } + self.targetname = "zombie"; + self.script_noteworthy = undefined; + recalc_zombie_array(); + if ( !animname_set ) + { + self.animname = "zombie"; + } + if ( isDefined( get_gamemode_var( "pre_init_zombie_spawn_func" ) ) ) + { + self [[ get_gamemode_var( "pre_init_zombie_spawn_func" ) ]](); + } + self thread play_ambient_zombie_vocals(); + self.zmb_vocals_attack = "zmb_vocals_zombie_attack"; + self.ignoreall = 1; + self.ignoreme = 1; + self.allowdeath = 1; + self.force_gib = 1; + self.is_zombie = 1; + self.has_legs = 1; + self allowedstances( "stand" ); + self.zombie_damaged_by_bar_knockdown = 0; + self.gibbed = 0; + self.head_gibbed = 0; + self setphysparams( 15, 0, 72 ); + self.disablearrivals = 1; + self.disableexits = 1; + self.grenadeawareness = 0; + self.badplaceawareness = 0; + self.ignoresuppression = 1; + self.suppressionthreshold = 1; + self.nododgemove = 1; + self.dontshootwhilemoving = 1; + self.pathenemylookahead = 0; + self.badplaceawareness = 0; + self.chatinitialized = 0; + self.a.disablepain = 1; + + self disable_react(); + if ( isDefined( level.zombie_health ) ) + { + self.maxhealth = level.zombie_health; + if ( isDefined( level.zombie_respawned_health ) && level.zombie_respawned_health.size > 0 ) + { + self.health = level.zombie_respawned_health[ 0 ]; + arrayremovevalue( level.zombie_respawned_health, level.zombie_respawned_health[ 0 ] ); + } + else + { + self.health = level.zombie_health; + } + } + else + { + self.maxhealth = level.zombie_vars[ "zombie_health_start" ]; + self.health = self.maxhealth; + } + self.freezegun_damage = 0; + self.dropweapon = 0; + level thread zombie_death_event( self ); + self init_zombie_run_cycle(); + self thread zombie_think(); + self thread zombie_gib_on_damage(); + self thread zombie_damage_failsafe(); + self thread enemy_death_detection(); + if ( isDefined( level._zombie_custom_spawn_logic ) ) + { + if ( isarray( level._zombie_custom_spawn_logic ) ) + { + for ( i = 0; i < level._zombie_custom_spawn_logic.size; i++ ) + { + self thread [[ level._zombie_custom_spawn_logic[ i ] ]](); + } + } + else + { + self thread [[ level._zombie_custom_spawn_logic ]](); + } + } + if ( !is_true( self.no_eye_glow ) ) + { + if ( !is_true( self.is_inert ) ) //imported from beta dump + { + self thread delayed_zombie_eye_glow(); + } + } + self.deathfunction = ::zombie_death_animscript; + self.flame_damage_time = 0; + self.meleedamage = 60; + self.no_powerups = 1; + self zombie_history( "zombie_spawn_init -> Spawned = " + self.origin ); + self.thundergun_knockdown_func = level.basic_zombie_thundergun_knockdown; + self.tesla_head_gib_func = ::zombie_tesla_head_gib; + self.team = level.zombie_team; + if ( isDefined( level.achievement_monitor_func ) ) + { + self [[ level.achievement_monitor_func ]](); + } + if ( isDefined( get_gamemode_var( "post_init_zombie_spawn_func" ) ) ) + { + self [[ get_gamemode_var( "post_init_zombie_spawn_func" ) ]](); + } + if ( isDefined( level.zombie_init_done ) ) + { + self [[ level.zombie_init_done ]](); + } + self.zombie_init_done = 1; + self notify( "zombie_init_done" ); } -delayed_zombie_eye_glow() +delayed_zombie_eye_glow() //checked changed to match cerberus output { - self endon( "zombie_delete" ); - - if ( isdefined( self.in_the_ground ) && self.in_the_ground || isdefined( self.in_the_ceiling ) && self.in_the_ceiling ) - { - while ( !isdefined( self.create_eyes ) ) - wait 0.1; - } - else - wait 0.5; - - self zombie_eye_glow(); + self endon( "zombie_delete" ); + if ( is_true( self.in_the_ground ) || is_true( self.in_the_ceiling ) ) + { + while ( !isDefined( self.create_eyes ) ) + { + wait 0.1; + } + } + else + { + wait 0.5; + } + self zombie_eye_glow(); } -zombie_damage_failsafe() +zombie_damage_failsafe() //checked changed to match cerberus output { - self endon( "death" ); - continue_failsafe_damage = 0; - - while ( true ) - { - wait 0.5; - - if ( !isdefined( self.enemy ) || !isplayer( self.enemy ) ) - continue; - - if ( self istouching( self.enemy ) ) - { - old_org = self.origin; - - if ( !continue_failsafe_damage ) - wait 5; - - if ( !isdefined( self.enemy ) || !isplayer( self.enemy ) || self.enemy hasperk( "specialty_armorvest" ) ) - continue; - - if ( self istouching( self.enemy ) && !self.enemy maps\mp\zombies\_zm_laststand::player_is_in_laststand() && isalive( self.enemy ) ) - { - if ( distancesquared( old_org, self.origin ) < 3600 ) - { - self.enemy dodamage( self.enemy.health + 1000, self.enemy.origin, self, self, "none", "MOD_RIFLE_BULLET" ); - continue_failsafe_damage = 1; - } - } - } - else - continue_failsafe_damage = 0; - } + self endon( "death" ); + continue_failsafe_damage = 0; + while ( 1 ) + { + wait 0.5; + if ( !isDefined( self.enemy ) || !isplayer( self.enemy ) ) + { + continue; + } + if ( self istouching( self.enemy ) ) + { + old_org = self.origin; + if ( !continue_failsafe_damage ) + { + wait 5; + } + if ( !isDefined( self.enemy ) || !isplayer( self.enemy ) || self.enemy hasperk( "specialty_armorvest" ) ) + { + continue; + } + if ( self istouching( self.enemy ) && !self.enemy maps/mp/zombies/_zm_laststand::player_is_in_laststand() && isalive( self.enemy ) ) + { + if ( distancesquared( old_org, self.origin ) < 3600 ) + { + self.enemy dodamage( self.enemy.health + 1000, self.enemy.origin, self, self, "none", "MOD_RIFLE_BULLET" ); + continue_failsafe_damage = 1; + } + } + } + else + { + continue_failsafe_damage = 0; + } + } } -should_skip_teardown( find_flesh_struct_string ) +should_skip_teardown( find_flesh_struct_string ) //checked matches cerberus output { - if ( isdefined( find_flesh_struct_string ) && find_flesh_struct_string == "find_flesh" ) - return true; - - if ( isdefined( self.script_string ) && self.script_string == "zombie_chaser" ) - return true; - - return false; + if ( isDefined( find_flesh_struct_string ) && find_flesh_struct_string == "find_flesh" ) + { + return 1; + } + if ( isDefined( self.script_string ) && self.script_string == "zombie_chaser" ) + { + return 1; + } + return 0; } -zombie_think() +zombie_think() //checked changed to match cerberus output { - self endon( "death" ); + self endon( "death" ); + /* /# - assert( !self.isdog ); + assert( !self.isdog ); #/ - self.ai_state = "zombie_think"; - find_flesh_struct_string = undefined; - - if ( isdefined( level.zombie_custom_think_logic ) ) - { - shouldwait = self [[ level.zombie_custom_think_logic ]](); - - if ( shouldwait ) - self waittill( "zombie_custom_think_done", find_flesh_struct_string ); - } - else if ( isdefined( self.start_inert ) && self.start_inert ) - find_flesh_struct_string = "find_flesh"; - else - { - if ( isdefined( self.custom_location ) ) - self thread [[ self.custom_location ]](); - else - self thread do_zombie_spawn(); - - self waittill( "risen", find_flesh_struct_string ); - } - - node = undefined; - desired_nodes = []; - self.entrance_nodes = []; - - if ( isdefined( level.max_barrier_search_dist_override ) ) - max_dist = level.max_barrier_search_dist_override; - else - max_dist = 500; - - if ( !isdefined( find_flesh_struct_string ) && isdefined( self.target ) && self.target != "" ) - { - desired_origin = get_desired_origin(); + */ + self.ai_state = "zombie_think"; + find_flesh_struct_string = undefined; + if ( isDefined( level.zombie_custom_think_logic ) ) + { + shouldwait = self [[ level.zombie_custom_think_logic ]](); + if ( shouldwait ) + { + self waittill( "zombie_custom_think_done", find_flesh_struct_string ); + } + } + else if ( is_true( self.start_inert ) ) + { + find_flesh_struct_string = "find_flesh"; + } + else + { + if ( isDefined( self.custom_location ) ) + { + self thread [[ self.custom_location ]](); + } + else + { + self thread do_zombie_spawn(); + } + self waittill( "risen", find_flesh_struct_string ); + } + node = undefined; + desired_nodes = []; + self.entrance_nodes = []; + if ( isDefined( level.max_barrier_search_dist_override ) ) + { + max_dist = level.max_barrier_search_dist_override; + } + else + { + max_dist = 500; + } + if ( !isDefined( find_flesh_struct_string ) && isDefined( self.target ) && self.target != "" ) + { + desired_origin = get_desired_origin(); + /* /# - assert( isdefined( desired_origin ), "Spawner @ " + self.origin + " has a .target but did not find a target" ); + assert( isDefined( desired_origin ), "Spawner @ " + self.origin + " has a .target but did not find a target" ); #/ - origin = desired_origin; - node = getclosest( origin, level.exterior_goals ); - self.entrance_nodes[self.entrance_nodes.size] = node; - self zombie_history( "zombie_think -> #1 entrance (script_forcegoal) origin = " + self.entrance_nodes[0].origin ); - } - else if ( self should_skip_teardown( find_flesh_struct_string ) ) - { - self zombie_setup_attack_properties(); - - if ( isdefined( self.target ) ) - { - end_at_node = getnode( self.target, "targetname" ); - - if ( isdefined( end_at_node ) ) - { - self setgoalnode( end_at_node ); - - self waittill( "goal" ); - } - } - - if ( isdefined( self.start_inert ) && self.start_inert ) - { - self thread maps\mp\zombies\_zm_ai_basic::start_inert( 1 ); - self zombie_complete_emerging_into_playable_area(); - } - else - { - self thread maps\mp\zombies\_zm_ai_basic::find_flesh(); - self thread zombie_entered_playable(); - } - - return; - } - else if ( isdefined( find_flesh_struct_string ) ) - { + */ + origin = desired_origin; + node = getclosest( origin, level.exterior_goals ); + self.entrance_nodes[ self.entrance_nodes.size ] = node; + self zombie_history( "zombie_think -> #1 entrance (script_forcegoal) origin = " + self.entrance_nodes[ 0 ].origin ); + } + else if ( self should_skip_teardown( find_flesh_struct_string ) ) + { + self zombie_setup_attack_properties(); + if ( isDefined( self.target ) ) + { + end_at_node = getnode( self.target, "targetname" ); + if ( isDefined( end_at_node ) ) + { + self setgoalnode( end_at_node ); + self waittill( "goal" ); + } + } + if ( is_true( self.start_inert ) ) + { + self thread maps/mp/zombies/_zm_ai_basic::start_inert( 1 ); + self zombie_complete_emerging_into_playable_area(); + } + else + { + self thread maps/mp/zombies/_zm_ai_basic::find_flesh(); + self thread zombie_entered_playable(); + } + return; + } + else if ( isDefined( find_flesh_struct_string ) ) + { + /* /# - assert( isdefined( find_flesh_struct_string ) ); + assert( isDefined( find_flesh_struct_string ) ); #/ - for ( i = 0; i < level.exterior_goals.size; i++ ) - { - if ( isdefined( level.exterior_goals[i].script_string ) && level.exterior_goals[i].script_string == find_flesh_struct_string ) - { - node = level.exterior_goals[i]; - break; - } - } - - self.entrance_nodes[self.entrance_nodes.size] = node; - self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin ); - self thread zombie_assure_node(); - } - else - { - origin = self.origin; - desired_origin = get_desired_origin(); - - if ( isdefined( desired_origin ) ) - origin = desired_origin; - - nodes = get_array_of_closest( origin, level.exterior_goals, undefined, 3 ); - desired_nodes[0] = nodes[0]; - prev_dist = distance( self.origin, nodes[0].origin ); - - for ( i = 1; i < nodes.size; i++ ) - { - dist = distance( self.origin, nodes[i].origin ); - - if ( dist - prev_dist > max_dist ) - break; - - prev_dist = dist; - desired_nodes[i] = nodes[i]; - } - - node = desired_nodes[0]; - - if ( desired_nodes.size > 1 ) - node = desired_nodes[randomint( desired_nodes.size )]; - - self.entrance_nodes = desired_nodes; - self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin ); - self thread zombie_assure_node(); - } + */ + for ( i = 0; i < level.exterior_goals.size; i++ ) + { + if ( isDefined( level.exterior_goals[ i ].script_string ) && level.exterior_goals[ i ].script_string == find_flesh_struct_string ) + { + node = level.exterior_goals[ i ]; + break; + } + } + self.entrance_nodes[ self.entrance_nodes.size ] = node; + self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin ); + self thread zombie_assure_node(); + } + else + { + origin = self.origin; + desired_origin = get_desired_origin(); + if ( isDefined( desired_origin ) ) + { + origin = desired_origin; + } + nodes = get_array_of_closest( origin, level.exterior_goals, undefined, 3 ); + desired_nodes[ 0 ] = nodes[ 0 ]; + prev_dist = distance( self.origin, nodes[ 0 ].origin ); + for ( i = 1; i < nodes.size; i++ ) + { + dist = distance( self.origin, nodes[ i ].origin ); + if ( ( dist - prev_dist ) > max_dist ) + { + break; + } + prev_dist = dist; + desired_nodes[ i ] = nodes[ i ]; + } + node = desired_nodes[ 0 ]; + if ( desired_nodes.size > 1 ) + { + node = desired_nodes[ randomint( desired_nodes.size ) ]; + } + self.entrance_nodes = desired_nodes; + self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin ); + self thread zombie_assure_node(); + } +/* /# - assert( isdefined( node ), "Did not find a node!!! [Should not see this!]" ); + assert( isDefined( node ), "Did not find a node!!! [Should not see this!]" ); #/ - level thread draw_line_ent_to_pos( self, node.origin, "goal" ); - self.first_node = node; - self thread zombie_goto_entrance( node ); +*/ + level thread draw_line_ent_to_pos( self, node.origin, "goal" ); + self.first_node = node; + self thread zombie_goto_entrance( node ); } -zombie_entered_playable() +zombie_entered_playable() //checked changed to match cerberus output { - self endon( "death" ); - - if ( !isdefined( level.playable_areas ) ) - level.playable_areas = getentarray( "player_volume", "script_noteworthy" ); - - while ( true ) - { - foreach ( area in level.playable_areas ) - { - if ( self istouching( area ) ) - { - self zombie_complete_emerging_into_playable_area(); - return; - } - } - - wait 1; - } + self endon( "death" ); + if ( !isDefined( level.playable_areas ) ) + { + level.playable_areas = getentarray( "player_volume", "script_noteworthy" ); + } + while ( 1 ) + { + foreach ( area in level.playable_areas ) + { + if ( self istouching( area ) ) + { + wait 1.5; + self zombie_complete_emerging_into_playable_area(); + return; + } + } + wait 1; + } } -get_desired_origin() +get_desired_origin() //checked matches cerberus output { - if ( isdefined( self.target ) ) - { - ent = getent( self.target, "targetname" ); - - if ( !isdefined( ent ) ) - ent = getstruct( self.target, "targetname" ); - - if ( !isdefined( ent ) ) - ent = getnode( self.target, "targetname" ); + if ( isDefined( self.target ) ) + { + ent = getent( self.target, "targetname" ); + if ( !isDefined( ent ) ) + { + ent = getstruct( self.target, "targetname" ); + } + if ( !isDefined( ent ) ) + { + ent = getnode( self.target, "targetname" ); + } + /* /# - assert( isdefined( ent ), "Cannot find the targeted ent/node/struct, \"" + self.target + "\" at " + self.origin ); + assert( isDefined( ent ), "Cannot find the targeted ent/node/struct, "" + self.target + "" at " + self.origin ); #/ - return ent.origin; - } - - return undefined; + */ + return ent.origin; + } + return undefined; } -zombie_goto_entrance( node, endon_bad_path ) +zombie_goto_entrance( node, endon_bad_path ) //checked matches cerberus output { +/* /# - assert( !self.isdog ); + assert( !self.isdog ); #/ - self endon( "death" ); - self endon( "stop_zombie_goto_entrance" ); - level endon( "intermission" ); - self.ai_state = "zombie_goto_entrance"; - - if ( isdefined( endon_bad_path ) && endon_bad_path ) - self endon( "bad_path" ); - - self zombie_history( "zombie_goto_entrance -> start goto entrance " + node.origin ); - self.got_to_entrance = 0; - self.goalradius = 128; - self setgoalpos( node.origin ); - - self waittill( "goal" ); - - self.got_to_entrance = 1; - self zombie_history( "zombie_goto_entrance -> reached goto entrance " + node.origin ); - self tear_into_building(); - - if ( isdefined( level.pre_aggro_pathfinding_func ) ) - self [[ level.pre_aggro_pathfinding_func ]](); - - barrier_pos = []; - barrier_pos[0] = "m"; - barrier_pos[1] = "r"; - barrier_pos[2] = "l"; - self.barricade_enter = 1; - animstate = maps\mp\animscripts\zm_utility::append_missing_legs_suffix( "zm_barricade_enter" ); - substate = "barrier_" + self.zombie_move_speed + "_" + barrier_pos[self.attacking_spot_index]; - self animscripted( self.first_node.zbarrier.origin, self.first_node.zbarrier.angles, animstate, substate ); - maps\mp\animscripts\zm_shared::donotetracks( "barricade_enter_anim" ); - self zombie_setup_attack_properties(); - self thread maps\mp\zombies\_zm_ai_basic::find_flesh(); - self.pathenemyfightdist = 4; - self zombie_complete_emerging_into_playable_area(); - self.pathenemyfightdist = 64; - self.barricade_enter = 0; +*/ + self endon( "death" ); + self endon( "stop_zombie_goto_entrance" ); + level endon( "intermission" ); + self.ai_state = "zombie_goto_entrance"; + if ( is_true( endon_bad_path ) ) + { + self endon( "bad_path" ); + } + self zombie_history( "zombie_goto_entrance -> start goto entrance " + node.origin ); + self.got_to_entrance = 0; + self.goalradius = 128; + self setgoalpos( node.origin ); + self waittill( "goal" ); + self.got_to_entrance = 1; + self zombie_history( "zombie_goto_entrance -> reached goto entrance " + node.origin ); + self tear_into_building(); + if ( isDefined( level.pre_aggro_pathfinding_func ) ) + { + self [[ level.pre_aggro_pathfinding_func ]](); + } + barrier_pos = []; + barrier_pos[ 0 ] = "m"; + barrier_pos[ 1 ] = "r"; + barrier_pos[ 2 ] = "l"; + self.barricade_enter = 1; + animstate = maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "zm_barricade_enter" ); + substate = "barrier_" + self.zombie_move_speed + "_" + barrier_pos[ self.attacking_spot_index ]; + self animscripted( self.first_node.zbarrier.origin, self.first_node.zbarrier.angles, animstate, substate ); + maps/mp/animscripts/zm_shared::donotetracks( "barricade_enter_anim" ); + self zombie_setup_attack_properties(); + self thread maps/mp/zombies/_zm_ai_basic::find_flesh(); + self.pathenemyfightdist = 4; + self zombie_complete_emerging_into_playable_area(); + self.pathenemyfightdist = 64; + self.barricade_enter = 0; } -zombie_assure_node() +zombie_assure_node() //checked changed to match cerberus output //changed for loops to while loops to prevent infinite loops with continues { - self endon( "death" ); - self endon( "goal" ); - level endon( "intermission" ); - start_pos = self.origin; - - if ( isdefined( self.entrance_nodes ) ) - { - for ( i = 0; i < self.entrance_nodes.size; i++ ) - { - if ( self zombie_bad_path() ) - { - self zombie_history( "zombie_assure_node -> assigned assured node = " + self.entrance_nodes[i].origin ); + self endon( "death" ); + self endon( "goal" ); + level endon( "intermission" ); + start_pos = self.origin; + if ( isDefined( self.entrance_nodes ) ) + { + for ( i = 0; i < self.entrance_nodes.size; i++ ) + { + if ( self zombie_bad_path() ) + { + self zombie_history( "zombie_assure_node -> assigned assured node = " + self.entrance_nodes[ i ].origin ); + /* /# - println( "^1Zombie @ " + self.origin + " did not move for 1 second. Going to next closest node @ " + self.entrance_nodes[i].origin ); + println( "^1Zombie @ " + self.origin + " did not move for 1 second. Going to next closest node @ " + self.entrance_nodes[ i ].origin ); #/ - level thread draw_line_ent_to_pos( self, self.entrance_nodes[i].origin, "goal" ); - self.first_node = self.entrance_nodes[i]; - self setgoalpos( self.entrance_nodes[i].origin ); - continue; - } - - return; - } - } - - wait 2; - nodes = get_array_of_closest( self.origin, level.exterior_goals, undefined, 20 ); - - if ( isdefined( nodes ) ) - { - self.entrance_nodes = nodes; - - for ( i = 0; i < self.entrance_nodes.size; i++ ) - { - if ( self zombie_bad_path() ) - { - self zombie_history( "zombie_assure_node -> assigned assured node = " + self.entrance_nodes[i].origin ); + */ + level thread draw_line_ent_to_pos( self, self.entrance_nodes[ i ].origin, "goal" ); + self.first_node = self.entrance_nodes[ i ]; + self setgoalpos( self.entrance_nodes[ i ].origin ); + } + else + { + return; + } + } + } + wait 2; + nodes = get_array_of_closest( self.origin, level.exterior_goals, undefined, 20 ); + if ( isDefined( nodes ) ) + { + self.entrance_nodes = nodes; + for ( i = 0; i < self.entrance_nodes.size; i++ ) + { + if ( self zombie_bad_path() ) + { + self zombie_history( "zombie_assure_node -> assigned assured node = " + self.entrance_nodes[ i ].origin ); + /* /# - println( "^1Zombie @ " + self.origin + " did not move for 1 second. Going to next closest node @ " + self.entrance_nodes[i].origin ); + println( "^1Zombie @ " + self.origin + " did not move for 1 second. Going to next closest node @ " + self.entrance_nodes[ i ].origin ); #/ - level thread draw_line_ent_to_pos( self, self.entrance_nodes[i].origin, "goal" ); - self.first_node = self.entrance_nodes[i]; - self setgoalpos( self.entrance_nodes[i].origin ); - continue; - } - - return; - } - } - - self zombie_history( "zombie_assure_node -> failed to find a good entrance point" ); - wait 20; - self dodamage( self.health + 10, self.origin ); - level.zombies_timeout_spawn++; + */ + level thread draw_line_ent_to_pos( self, self.entrance_nodes[ i ].origin, "goal" ); + self.first_node = self.entrance_nodes[ i ]; + self setgoalpos( self.entrance_nodes[ i ].origin ); + } + else + { + return; + } + } + } + self zombie_history( "zombie_assure_node -> failed to find a good entrance point" ); + wait 20; + self dodamage( self.health + 10, self.origin ); + level.zombies_timeout_spawn++; } -zombie_bad_path() +zombie_bad_path() //checked matches cerberus output { - self endon( "death" ); - self endon( "goal" ); - self thread zombie_bad_path_notify(); - self thread zombie_bad_path_timeout(); - self.zombie_bad_path = undefined; - - while ( !isdefined( self.zombie_bad_path ) ) - wait 0.05; - - self notify( "stop_zombie_bad_path" ); - return self.zombie_bad_path; + self endon( "death" ); + self endon( "goal" ); + self thread zombie_bad_path_notify(); + self thread zombie_bad_path_timeout(); + self.zombie_bad_path = undefined; + while ( !isDefined( self.zombie_bad_path ) ) + { + wait 0.05; + } + self notify( "stop_zombie_bad_path" ); + return self.zombie_bad_path; } -zombie_bad_path_notify() +zombie_bad_path_notify() //checked matches cerberus output { - self endon( "death" ); - self endon( "stop_zombie_bad_path" ); - - self waittill( "bad_path" ); - - self.zombie_bad_path = 1; + self endon( "death" ); + self endon( "stop_zombie_bad_path" ); + self waittill( "bad_path" ); + self.zombie_bad_path = 1; } -zombie_bad_path_timeout() +zombie_bad_path_timeout() //checked matches cerberus output { - self endon( "death" ); - self endon( "stop_zombie_bad_path" ); - wait 2; - self.zombie_bad_path = 0; + self endon( "death" ); + self endon( "stop_zombie_bad_path" ); + wait 2; + self.zombie_bad_path = 0; } -tear_into_building() +tear_into_building() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "teleporting" ); - self zombie_history( "tear_into_building -> start" ); + self endon( "death" ); + self endon( "teleporting" ); + self zombie_history( "tear_into_building -> start" ); + while ( 1 ) + { + if ( isDefined( self.first_node.script_noteworthy ) ) + { + if ( self.first_node.script_noteworthy == "no_blocker" ) + { + return; + } + } + if ( !isDefined( self.first_node.target ) ) + { + return; + } + if ( all_chunks_destroyed( self.first_node, self.first_node.barrier_chunks ) ) + { + self zombie_history( "tear_into_building -> all chunks destroyed" ); + } + if ( !get_attack_spot( self.first_node ) ) + { + self zombie_history( "tear_into_building -> Could not find an attack spot" ); + self thread do_a_taunt(); + wait 0.5; + continue; + } + self.goalradius = 2; + if ( isDefined( level.tear_into_position ) ) + { + self [[ level.tear_into_position ]](); + } + else + { + angles = self.first_node.zbarrier.angles; + self setgoalpos( self.attacking_spot, angles ); + } + self waittill( "goal" ); + if ( isDefined( level.tear_into_wait ) ) + { + self [[ level.tear_into_wait ]](); + } + else + { + self waittill_notify_or_timeout( "orientdone", 1 ); + } + self zombie_history( "tear_into_building -> Reach position and orientated" ); + if ( all_chunks_destroyed( self.first_node, self.first_node.barrier_chunks ) ) + { + self zombie_history( "tear_into_building -> all chunks destroyed" ); + for ( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) + { + self.first_node.attack_spots_taken[ i ] = 0; + } + return; + } + while ( 1 ) + { + if ( isDefined( self.zombie_board_tear_down_callback ) ) + { + self [[ self.zombie_board_tear_down_callback ]](); + } + chunk = get_closest_non_destroyed_chunk( self.origin, self.first_node, self.first_node.barrier_chunks ); + if ( !isDefined( chunk ) ) + { + if ( !all_chunks_destroyed( self.first_node, self.first_node.barrier_chunks ) ) + { + attack = self should_attack_player_thru_boards(); + if ( !is_true( attack ) && self.has_legs ) + { + self do_a_taunt(); + } + else + { + wait 0.1; + } + continue; + } + for ( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) + { + self.first_node.attack_spots_taken[ i ] = 0; + } + return; + } + self zombie_history( "tear_into_building -> animating" ); + self.first_node.zbarrier setzbarrierpiecestate( chunk, "targetted_by_zombie" ); + self.first_node thread check_zbarrier_piece_for_zombie_inert( chunk, self.first_node.zbarrier, self ); + self.first_node thread check_zbarrier_piece_for_zombie_death( chunk, self.first_node.zbarrier, self ); + self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "teardown", self.animname ); + if ( isDefined( level.zbarrier_override_tear_in ) ) + { + animstatebase = self [[ level.zbarrier_override_tear_in ]]( chunk ); + } + else + { + animstatebase = self.first_node.zbarrier getzbarrierpieceanimstate( chunk ); + } + animsubstate = "spot_" + self.attacking_spot_index + "_piece_" + self.first_node.zbarrier getzbarrierpieceanimsubstate( chunk ); + anim_sub_index = self getanimsubstatefromasd( animstatebase + "_in", animsubstate ); + self animscripted( self.first_node.zbarrier.origin, self.first_node.zbarrier.angles, maps/mp/animscripts/zm_utility::append_missing_legs_suffix( animstatebase + "_in" ), anim_sub_index ); + self zombie_tear_notetracks( "tear_anim", chunk, self.first_node ); + while ( self.first_node.zbarrier.chunk_health[ chunk ] > 0 ) + { + self animscripted( self.first_node.zbarrier.origin, self.first_node.zbarrier.angles, maps/mp/animscripts/zm_utility::append_missing_legs_suffix( animstatebase + "_loop" ), anim_sub_index ); + self zombie_tear_notetracks( "tear_anim", chunk, self.first_node ); + self.first_node.zbarrier.chunk_health[ chunk ]--; - while ( true ) - { - if ( isdefined( self.first_node.script_noteworthy ) ) - { - if ( self.first_node.script_noteworthy == "no_blocker" ) - return; - } - - if ( !isdefined( self.first_node.target ) ) - return; - - if ( all_chunks_destroyed( self.first_node, self.first_node.barrier_chunks ) ) - self zombie_history( "tear_into_building -> all chunks destroyed" ); - - if ( !get_attack_spot( self.first_node ) ) - { - self zombie_history( "tear_into_building -> Could not find an attack spot" ); - self thread do_a_taunt(); - wait 0.5; - continue; - } - - self.goalradius = 2; - - if ( isdefined( level.tear_into_position ) ) - self [[ level.tear_into_position ]](); - else - { - angles = self.first_node.zbarrier.angles; - self setgoalpos( self.attacking_spot, angles ); - } - - self waittill( "goal" ); - - if ( isdefined( level.tear_into_wait ) ) - self [[ level.tear_into_wait ]](); - else - self waittill_notify_or_timeout( "orientdone", 1 ); - - self zombie_history( "tear_into_building -> Reach position and orientated" ); - - if ( all_chunks_destroyed( self.first_node, self.first_node.barrier_chunks ) ) - { - self zombie_history( "tear_into_building -> all chunks destroyed" ); - - for ( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) - self.first_node.attack_spots_taken[i] = 0; - - return; - } - - while ( true ) - { - if ( isdefined( self.zombie_board_tear_down_callback ) ) - self [[ self.zombie_board_tear_down_callback ]](); - - chunk = get_closest_non_destroyed_chunk( self.origin, self.first_node, self.first_node.barrier_chunks ); - - if ( !isdefined( chunk ) ) - { - if ( !all_chunks_destroyed( self.first_node, self.first_node.barrier_chunks ) ) - { - attack = self should_attack_player_thru_boards(); - - if ( isdefined( attack ) && !attack && self.has_legs ) - self do_a_taunt(); - else - wait 0.1; - - continue; - } - - for ( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) - self.first_node.attack_spots_taken[i] = 0; - - return; - } - - self zombie_history( "tear_into_building -> animating" ); - self.first_node.zbarrier setzbarrierpiecestate( chunk, "targetted_by_zombie" ); - self.first_node thread check_zbarrier_piece_for_zombie_inert( chunk, self.first_node.zbarrier, self ); - self.first_node thread check_zbarrier_piece_for_zombie_death( chunk, self.first_node.zbarrier, self ); - self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "teardown", self.animname ); - - if ( isdefined( level.zbarrier_override_tear_in ) ) - animstatebase = self [[ level.zbarrier_override_tear_in ]]( chunk ); - else - animstatebase = self.first_node.zbarrier getzbarrierpieceanimstate( chunk ); - - animsubstate = "spot_" + self.attacking_spot_index + "_piece_" + self.first_node.zbarrier getzbarrierpieceanimsubstate( chunk ); - anim_sub_index = self getanimsubstatefromasd( animstatebase + "_in", animsubstate ); - self animscripted( self.first_node.zbarrier.origin, self.first_node.zbarrier.angles, maps\mp\animscripts\zm_utility::append_missing_legs_suffix( animstatebase + "_in" ), anim_sub_index ); - self zombie_tear_notetracks( "tear_anim", chunk, self.first_node ); - - while ( 0 < self.first_node.zbarrier.chunk_health[chunk] ) - { - self animscripted( self.first_node.zbarrier.origin, self.first_node.zbarrier.angles, maps\mp\animscripts\zm_utility::append_missing_legs_suffix( animstatebase + "_loop" ), anim_sub_index ); - self zombie_tear_notetracks( "tear_anim", chunk, self.first_node ); - self.first_node.zbarrier.chunk_health[chunk]--; - } - - self animscripted( self.first_node.zbarrier.origin, self.first_node.zbarrier.angles, maps\mp\animscripts\zm_utility::append_missing_legs_suffix( animstatebase + "_out" ), anim_sub_index ); - self zombie_tear_notetracks( "tear_anim", chunk, self.first_node ); - self.lastchunk_destroy_time = gettime(); - attack = self should_attack_player_thru_boards(); - - if ( isdefined( attack ) && !attack && self.has_legs ) - self do_a_taunt(); - - if ( all_chunks_destroyed( self.first_node, self.first_node.barrier_chunks ) ) - { - for ( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) - self.first_node.attack_spots_taken[i] = 0; - - level notify( "last_board_torn", self.first_node.zbarrier.origin ); - return; - } - } - - self reset_attack_spot(); - } + } + self animscripted( self.first_node.zbarrier.origin, self.first_node.zbarrier.angles, maps/mp/animscripts/zm_utility::append_missing_legs_suffix( animstatebase + "_out" ), anim_sub_index ); + self zombie_tear_notetracks( "tear_anim", chunk, self.first_node ); + self.lastchunk_destroy_time = getTime(); + attack = self should_attack_player_thru_boards(); + if ( !is_true( attack ) && self.has_legs ) + { + self do_a_taunt(); + } + if ( all_chunks_destroyed( self.first_node, self.first_node.barrier_chunks ) ) + { + for ( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) + { + self.first_node.attack_spots_taken[ i ] = 0; + } + level notify( "last_board_torn", self.first_node.zbarrier.origin ); + return; + } + } + self reset_attack_spot(); + } } -do_a_taunt() +do_a_taunt() //checked matches cerberus output { - self endon( "death" ); - - if ( !self.has_legs ) - return 0; - - if ( !self.first_node.zbarrier zbarriersupportszombietaunts() ) - return; - - self.old_origin = self.origin; - - if ( getdvar( _hash_6896A7C3 ) == "" ) - setdvar( "zombie_taunt_freq", "5" ); - - freq = getdvarint( _hash_6896A7C3 ); - - if ( freq >= randomint( 100 ) ) - { - self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "taunt", self.animname ); - tauntstate = "zm_taunt"; - - if ( isdefined( self.first_node.zbarrier ) && self.first_node.zbarrier getzbarriertauntanimstate() != "" ) - tauntstate = self.first_node.zbarrier getzbarriertauntanimstate(); - - self animscripted( self.origin, self.angles, tauntstate ); - self taunt_notetracks( "taunt_anim" ); - } + self endon( "death" ); + if ( !self.has_legs ) + { + return 0; + } + if ( !self.first_node.zbarrier zbarriersupportszombietaunts() ) + { + return; + } + self.old_origin = self.origin; + if ( getDvar( "zombie_taunt_freq" ) == "" ) + { + setdvar( "zombie_taunt_freq", "5" ); + } + freq = getDvarInt( "zombie_taunt_freq" ); + if ( freq >= randomint( 100 ) ) + { + self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "taunt", self.animname ); + tauntstate = "zm_taunt"; + if ( isDefined( self.first_node.zbarrier ) && self.first_node.zbarrier getzbarriertauntanimstate() != "" ) + { + tauntstate = self.first_node.zbarrier getzbarriertauntanimstate(); + } + self animscripted( self.origin, self.angles, tauntstate ); + self taunt_notetracks( "taunt_anim" ); + } } -taunt_notetracks( msg ) +taunt_notetracks( msg ) //see info.md No 8. { - self endon( "death" ); - - while ( true ) - { - self waittill( msg, notetrack ); - - if ( notetrack == "end" ) - { - self forceteleport( self.old_origin ); - return; - } - } + self endon( "death" ); + while ( 1 ) + { + self waittill( "taunt_anim", notetrack ); + if ( notetrack == "end" ) + { + self forceteleport( self.old_origin ); + return; + } + } } -should_attack_player_thru_boards() +should_attack_player_thru_boards() //checked changed to match cerberus output { - if ( !self.has_legs ) - return false; - - if ( isdefined( self.first_node.zbarrier ) ) - { - if ( !self.first_node.zbarrier zbarriersupportszombiereachthroughattacks() ) - return false; - } - - if ( getdvar( _hash_4A4203B1 ) == "" ) - setdvar( "zombie_reachin_freq", "50" ); - - freq = getdvarint( _hash_4A4203B1 ); - players = get_players(); - attack = 0; - self.player_targets = []; - - for ( i = 0; i < players.size; i++ ) - { - if ( isalive( players[i] ) && !isdefined( players[i].revivetrigger ) && distance2d( self.origin, players[i].origin ) <= level.attack_player_thru_boards_range && !( isdefined( players[i].zombie_vars["zombie_powerup_zombie_blood_on"] ) && players[i].zombie_vars["zombie_powerup_zombie_blood_on"] ) ) - { - self.player_targets[self.player_targets.size] = players[i]; - attack = 1; - } - } - - if ( !attack || freq < randomint( 100 ) ) - return false; - - self.old_origin = self.origin; - attackanimstate = "zm_window_melee"; - - if ( isdefined( self.first_node.zbarrier ) && self.first_node.zbarrier getzbarrierreachthroughattackanimstate() != "" ) - attackanimstate = self.first_node.zbarrier getzbarrierreachthroughattackanimstate(); - - self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "attack", self.animname ); - self animscripted( self.origin, self.angles, attackanimstate, self.attacking_spot_index - 1 ); - self window_notetracks( "window_melee_anim" ); - return true; + if ( !self.has_legs ) + { + return 0; + } + if ( isDefined( self.first_node.zbarrier ) ) + { + if ( !self.first_node.zbarrier zbarriersupportszombiereachthroughattacks() ) + { + return 0; + } + } + if ( getDvar( "zombie_reachin_freq" ) == "" ) + { + setdvar( "zombie_reachin_freq", "50" ); + } + freq = getDvarInt( "zombie_reachin_freq" ); + players = get_players(); + attack = 0; + self.player_targets = []; + for ( i = 0; i < players.size; i++ ) + { + if ( isalive( players[ i ] ) && !isDefined( players[ i ].revivetrigger ) && distance2d( self.origin, players[ i ].origin ) <= level.attack_player_thru_boards_range && !is_true( players[ i ].zombie_vars[ "zombie_powerup_zombie_blood_on" ] ) ) + { + self.player_targets[ self.player_targets.size ] = players[ i ]; + attack = 1; + } + } + if ( !attack || freq < randomint( 100 ) ) + { + return 0; + } + self.old_origin = self.origin; + attackanimstate = "zm_window_melee"; + if ( isDefined( self.first_node.zbarrier ) && self.first_node.zbarrier getzbarrierreachthroughattackanimstate() != "" ) + { + attackanimstate = self.first_node.zbarrier getzbarrierreachthroughattackanimstate(); + } + self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "attack", self.animname ); + self animscripted( self.origin, self.angles, attackanimstate, self.attacking_spot_index - 1 ); + self window_notetracks( "window_melee_anim" ); + return 1; } -window_notetracks( msg ) +window_notetracks( msg ) //see info.md No 8. { - self endon( "death" ); - - while ( true ) - { - self waittill( msg, notetrack ); - - if ( notetrack == "end" ) - { - self teleport( self.old_origin ); - return; - } - - if ( notetrack == "fire" ) - { - if ( self.ignoreall ) - self.ignoreall = 0; - - if ( isdefined( self.first_node ) ) - { - _melee_dist_sq = 8100; - - if ( isdefined( level.attack_player_thru_boards_range ) ) - _melee_dist_sq = level.attack_player_thru_boards_range * level.attack_player_thru_boards_range; - - _trigger_dist_sq = 2601; - - for ( i = 0; i < self.player_targets.size; i++ ) - { - playerdistsq = distance2dsquared( self.player_targets[i].origin, self.origin ); - heightdiff = abs( self.player_targets[i].origin[2] - self.origin[2] ); - - if ( playerdistsq < _melee_dist_sq && heightdiff * heightdiff < _melee_dist_sq ) - { - triggerdistsq = distance2dsquared( self.player_targets[i].origin, self.first_node.trigger_location.origin ); - heightdiff = abs( self.player_targets[i].origin[2] - self.first_node.trigger_location.origin[2] ); - - if ( triggerdistsq < _trigger_dist_sq && heightdiff * heightdiff < _trigger_dist_sq ) - { - self.player_targets[i] dodamage( self.meleedamage, self.origin, self, self, "none", "MOD_MELEE" ); - break; - } - } - } - } - else - self melee(); - } - } + self endon( "death" ); + while ( 1 ) + { + self waittill( "window_melee_anim", notetrack ); + if ( notetrack == "end" ) + { + self teleport( self.old_origin ); + return; + } + if ( notetrack == "fire" ) + { + if ( self.ignoreall ) + { + self.ignoreall = 0; + } + if ( isDefined( self.first_node ) ) + { + _melee_dist_sq = 8100; + if ( isDefined( level.attack_player_thru_boards_range ) ) + { + _melee_dist_sq = level.attack_player_thru_boards_range * level.attack_player_thru_boards_range; + } + _trigger_dist_sq = 2601; + for ( i = 0; i < self.player_targets.size; i++ ) + { + playerdistsq = distance2dsquared( self.player_targets[ i ].origin, self.origin ); + heightdiff = abs( self.player_targets[ i ].origin[ 2 ] - self.origin[ 2 ] ); + if ( playerdistsq < _melee_dist_sq && ( heightdiff * heightdiff ) < _melee_dist_sq ) + { + triggerdistsq = distance2dsquared( self.player_targets[ i ].origin, self.first_node.trigger_location.origin ); + heightdiff = abs( self.player_targets[ i ].origin[ 2 ] - self.first_node.trigger_location.origin[ 2 ] ); + if ( triggerdistsq < _trigger_dist_sq && ( heightdiff * heightdiff ) < _trigger_dist_sq ) + { + self.player_targets[ i ] dodamage( self.meleedamage, self.origin, self, self, "none", "MOD_MELEE" ); + break; + } + } + } + } + else + { + self melee(); + } + } + } } -reset_attack_spot() +reset_attack_spot() //checked matches cerberus output { - if ( isdefined( self.attacking_node ) ) - { - node = self.attacking_node; - index = self.attacking_spot_index; - node.attack_spots_taken[index] = 0; - self.attacking_node = undefined; - self.attacking_spot_index = undefined; - } + if ( isDefined( self.attacking_node ) ) + { + node = self.attacking_node; + index = self.attacking_spot_index; + node.attack_spots_taken[ index ] = 0; + self.attacking_node = undefined; + self.attacking_spot_index = undefined; + } } -get_attack_spot( node ) +get_attack_spot( node ) //checked matches cerberus output { - index = get_attack_spot_index( node ); - - if ( !isdefined( index ) ) - return false; - - self.attacking_node = node; - self.attacking_spot_index = index; - node.attack_spots_taken[index] = 1; - self.attacking_spot = node.attack_spots[index]; - return true; + index = get_attack_spot_index( node ); + if ( !isDefined( index ) ) + { + return 0; + } + self.attacking_node = node; + self.attacking_spot_index = index; + node.attack_spots_taken[ index ] = 1; + self.attacking_spot = node.attack_spots[ index ]; + return 1; } -get_attack_spot_index( node ) +get_attack_spot_index( node ) //checked changed to match cerberus output { - indexes = []; - - for ( i = 0; i < node.attack_spots.size; i++ ) - { - if ( !node.attack_spots_taken[i] ) - indexes[indexes.size] = i; - } - - if ( indexes.size == 0 ) - return undefined; - - return indexes[randomint( indexes.size )]; + indexes = []; + for ( i = 0; i < node.attack_spots.size; i++ ) + { + if ( !node.attack_spots_taken[ i ] ) + { + indexes[ indexes.size ] = i; + } + } + if ( indexes.size == 0 ) + { + return undefined; + } + return indexes[ randomint( indexes.size ) ]; } -zombie_tear_notetracks( msg, chunk, node ) +zombie_tear_notetracks( msg, chunk, node ) //checked again see info.md No 8. { - self endon( "death" ); - - while ( true ) - { - self waittill( msg, notetrack ); - - if ( notetrack == "end" ) - return; - - if ( notetrack == "board" || notetrack == "destroy_piece" || notetrack == "bar" ) - { - if ( isdefined( level.zbarrier_zombie_tear_notetrack_override ) ) - self thread [[ level.zbarrier_zombie_tear_notetrack_override ]]( node, chunk ); - - node.zbarrier setzbarrierpiecestate( chunk, "opening" ); - } - } + self endon( "death" ); + while ( 1 ) + { + self waittill( "tear_anim", notetrack ); //fix for the compiler + if ( notetrack == "end" ) + { + return; + } + if ( notetrack == "board" || notetrack == "destroy_piece" || notetrack == "bar" ) + { + if ( isDefined( level.zbarrier_zombie_tear_notetrack_override ) ) + { + self thread [[ level.zbarrier_zombie_tear_notetrack_override ]]( node, chunk ); + } + node.zbarrier setzbarrierpiecestate( chunk, "opening" ); + } + } } -zombie_boardtear_offset_fx_horizontle( chunk, node ) +zombie_boardtear_offset_fx_horizontle( chunk, node ) //checked changed to match cerberus output { - if ( isdefined( chunk.script_parameters ) && ( chunk.script_parameters == "repair_board" || chunk.script_parameters == "board" ) ) - { - if ( isdefined( chunk.unbroken ) && chunk.unbroken == 1 ) - { - if ( isdefined( chunk.material ) && chunk.material == "glass" ) - { - playfx( level._effect["glass_break"], chunk.origin, node.angles ); - chunk.unbroken = 0; - } - else if ( isdefined( chunk.material ) && chunk.material == "metal" ) - { - playfx( level._effect["fx_zombie_bar_break"], chunk.origin ); - chunk.unbroken = 0; - } - else if ( isdefined( chunk.material ) && chunk.material == "rock" ) - { - if ( isdefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) - chunk setclientflag( level._zombie_scriptmover_flag_rock_fx ); - else - playfx( level._effect["wall_break"], chunk.origin ); - - chunk.unbroken = 0; - } - } - } - - if ( isdefined( chunk.script_parameters ) && chunk.script_parameters == "barricade_vents" ) - { - if ( isdefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) - chunk setclientflag( level._zombie_scriptmover_flag_board_horizontal_fx ); - else - playfx( level._effect["fx_zombie_bar_break"], chunk.origin ); - } - else if ( isdefined( chunk.material ) && chunk.material == "rock" ) - { - if ( isdefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) - chunk setclientflag( level._zombie_scriptmover_flag_rock_fx ); - } - else if ( isdefined( level.use_clientside_board_fx ) ) - chunk setclientflag( level._zombie_scriptmover_flag_board_horizontal_fx ); - else - { - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 0, 0, 1 ), 30.0 ) ); - wait( randomfloatrange( 0.2, 0.4 ) ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 0, 0, -1 ), 30.0 ) ); - } + if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "repair_board" || isDefined( chunk.script_parameters ) && chunk.script_parameters == "board" ) + { + if ( isDefined( chunk.unbroken ) && chunk.unbroken == 1 ) + { + if ( isDefined( chunk.material ) && chunk.material == "glass" ) + { + playfx( level._effect[ "glass_break" ], chunk.origin, node.angles ); + chunk.unbroken = 0; + } + else if ( isDefined( chunk.material ) && chunk.material == "metal" ) + { + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin ); + chunk.unbroken = 0; + } + else if ( isDefined( chunk.material ) && chunk.material == "rock" ) + { + if ( is_true( level.use_clientside_rock_tearin_fx ) ) + { + chunk setclientflag( level._zombie_scriptmover_flag_rock_fx ); + } + else + { + playfx( level._effect[ "wall_break" ], chunk.origin ); + } + chunk.unbroken = 0; + } + } + } + if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "barricade_vents" ) + { + if ( is_true( level.use_clientside_board_fx ) ) + { + chunk setclientflag( level._zombie_scriptmover_flag_board_horizontal_fx ); + } + else + { + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin ); + } + } + else if ( isDefined( chunk.material ) && chunk.material == "rock" ) + { + if ( is_true( level.use_clientside_rock_tearin_fx ) ) + { + chunk setclientflag( level._zombie_scriptmover_flag_rock_fx ); + } + } + else if ( isDefined( level.use_clientside_board_fx ) ) + { + chunk setclientflag( level._zombie_scriptmover_flag_board_horizontal_fx ); + } + else + { + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, 1 ), 30 ) ); + wait randomfloatrange( 0.2, 0.4 ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, -1 ), 30 ) ); + } } -zombie_boardtear_offset_fx_verticle( chunk, node ) +zombie_boardtear_offset_fx_verticle( chunk, node ) //checked changed to match cerberus output { - if ( isdefined( chunk.script_parameters ) && ( chunk.script_parameters == "repair_board" || chunk.script_parameters == "board" ) ) - { - if ( isdefined( chunk.unbroken ) && chunk.unbroken == 1 ) - { - if ( isdefined( chunk.material ) && chunk.material == "glass" ) - { - playfx( level._effect["glass_break"], chunk.origin, node.angles ); - chunk.unbroken = 0; - } - else if ( isdefined( chunk.material ) && chunk.material == "metal" ) - { - playfx( level._effect["fx_zombie_bar_break"], chunk.origin ); - chunk.unbroken = 0; - } - else if ( isdefined( chunk.material ) && chunk.material == "rock" ) - { - if ( isdefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) - chunk setclientflag( level._zombie_scriptmover_flag_rock_fx ); - else - playfx( level._effect["wall_break"], chunk.origin ); - - chunk.unbroken = 0; - } - } - } - - if ( isdefined( chunk.script_parameters ) && chunk.script_parameters == "barricade_vents" ) - { - if ( isdefined( level.use_clientside_board_fx ) ) - chunk setclientflag( level._zombie_scriptmover_flag_board_vertical_fx ); - else - playfx( level._effect["fx_zombie_bar_break"], chunk.origin ); - } - else if ( isdefined( chunk.material ) && chunk.material == "rock" ) - { - if ( isdefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) - chunk setclientflag( level._zombie_scriptmover_flag_rock_fx ); - } - else if ( isdefined( level.use_clientside_board_fx ) ) - chunk setclientflag( level._zombie_scriptmover_flag_board_vertical_fx ); - else - { - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( 1, 0, 0 ), 30.0 ) ); - wait( randomfloatrange( 0.2, 0.4 ) ); - playfx( level._effect["wood_chunk_destory"], chunk.origin + vectorscale( ( -1, 0, 0 ), 30.0 ) ); - } + if ( ( chunk.script_parameters == "repair_board" || chunk.script_parameters == "board" ) && isDefined( chunk.script_parameters ) ) + { + if ( isDefined( chunk.unbroken ) && chunk.unbroken == 1 ) + { + if ( isDefined( chunk.material ) && chunk.material == "glass" ) + { + playfx( level._effect[ "glass_break" ], chunk.origin, node.angles ); + chunk.unbroken = 0; + } + else if ( isDefined( chunk.material ) && chunk.material == "metal" ) + { + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin ); + chunk.unbroken = 0; + } + else if ( isDefined( chunk.material ) && chunk.material == "rock" ) + { + if ( is_true( level.use_clientside_rock_tearin_fx ) ) + { + chunk setclientflag( level._zombie_scriptmover_flag_rock_fx ); + } + else + { + playfx( level._effect[ "wall_break" ], chunk.origin ); + } + chunk.unbroken = 0; + } + } + } + if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "barricade_vents" ) + { + if ( isDefined( level.use_clientside_board_fx ) ) + { + chunk setclientflag( level._zombie_scriptmover_flag_board_vertical_fx ); + } + else + { + playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin ); + } + } + else if ( isDefined( chunk.material ) && chunk.material == "rock" ) + { + if ( is_true( level.use_clientside_rock_tearin_fx ) ) + { + chunk setclientflag( level._zombie_scriptmover_flag_rock_fx ); + } + return; + } + else if ( isDefined( level.use_clientside_board_fx ) ) + { + chunk setclientflag( level._zombie_scriptmover_flag_board_vertical_fx ); + return; + } + else + { + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 1, 0, 0 ), 30 ) ); + wait randomfloatrange( 0.2, 0.4 ); + playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); + } } -zombie_bartear_offset_fx_verticle( chunk ) +zombie_bartear_offset_fx_verticle( chunk ) //checked changed to match cerberus output { - if ( isdefined( chunk.script_parameters ) && chunk.script_parameters == "bar" || chunk.script_noteworthy == "board" ) - { - possible_tag_array_1 = []; - possible_tag_array_1[0] = "Tag_fx_top"; - possible_tag_array_1[1] = ""; - possible_tag_array_1[2] = "Tag_fx_top"; - possible_tag_array_1[3] = ""; - possible_tag_array_2 = []; - possible_tag_array_2[0] = ""; - possible_tag_array_2[1] = "Tag_fx_bottom"; - possible_tag_array_2[2] = ""; - possible_tag_array_2[3] = "Tag_fx_bottom"; - possible_tag_array_2 = array_randomize( possible_tag_array_2 ); - random_fx = []; - random_fx[0] = level._effect["fx_zombie_bar_break"]; - random_fx[1] = level._effect["fx_zombie_bar_break_lite"]; - random_fx[2] = level._effect["fx_zombie_bar_break"]; - random_fx[3] = level._effect["fx_zombie_bar_break_lite"]; - random_fx = array_randomize( random_fx ); - - switch ( randomint( 9 ) ) - { - case "0": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); - break; - case "1": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); - break; - case "2": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); - break; - case "3": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); - break; - case "4": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); - break; - case "5": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); - break; - case "6": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); - break; - case "7": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); - break; - case "8": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); - break; - } - } + if ( ( chunk.script_parameters == "bar" || chunk.script_noteworthy == "board" ) && isDefined( chunk.script_parameters ) ) + { + possible_tag_array_1 = []; + possible_tag_array_1[ 0 ] = "Tag_fx_top"; + possible_tag_array_1[ 1 ] = ""; + possible_tag_array_1[ 2 ] = "Tag_fx_top"; + possible_tag_array_1[ 3 ] = ""; + possible_tag_array_2 = []; + possible_tag_array_2[ 0 ] = ""; + possible_tag_array_2[ 1 ] = "Tag_fx_bottom"; + possible_tag_array_2[ 2 ] = ""; + possible_tag_array_2[ 3 ] = "Tag_fx_bottom"; + possible_tag_array_2 = array_randomize( possible_tag_array_2 ); + random_fx = []; + random_fx[ 0 ] = level._effect[ "fx_zombie_bar_break" ]; + random_fx[ 1 ] = level._effect[ "fx_zombie_bar_break_lite" ]; + random_fx[ 2 ] = level._effect[ "fx_zombie_bar_break" ]; + random_fx[ 3 ] = level._effect[ "fx_zombie_bar_break_lite" ]; + random_fx = array_randomize( random_fx ); + switch( randomint( 9 ) ) + { + case 0: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); + break; + case 1: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); + break; + case 2: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); + break; + case 3: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); + break; + case 4: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); + break; + case 5: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); + break; + case 6: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); + break; + case 7: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); + break; + case 8: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); + break; + } + } } -zombie_bartear_offset_fx_horizontle( chunk ) +zombie_bartear_offset_fx_horizontle( chunk ) //checked changed to match cerberus output { - if ( isdefined( chunk.script_parameters ) && chunk.script_parameters == "bar" || chunk.script_noteworthy == "board" ) - { - switch ( randomint( 10 ) ) - { - case "0": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); - break; - case "1": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); - break; - case "2": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); - break; - case "3": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); - break; - case "4": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); - wait( randomfloatrange( 0.0, 0.3 ) ); - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); - break; - case "5": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); - break; - case "6": - playfxontag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); - break; - case "7": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); - break; - case "8": - playfxontag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); - break; - } - } + if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "bar" || chunk.script_noteworthy == "board" ) + { + switch( randomint( 10 ) ) + { + case 0: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); + break; + case 1: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); + break; + case 2: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); + break; + case 3: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); + break; + case 4: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); + wait randomfloatrange( 0, 0.3 ); + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); + break; + case 5: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); + break; + case 6: + playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); + break; + case 7: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); + break; + case 8: + playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); + break; + } + } } -check_zbarrier_piece_for_zombie_inert( chunk_index, zbarrier, zombie ) +check_zbarrier_piece_for_zombie_inert( chunk_index, zbarrier, zombie ) //checked matches cerberus output { - zombie endon( "completed_emerging_into_playable_area" ); - - zombie waittill( "stop_zombie_goto_entrance" ); - - if ( zbarrier getzbarrierpiecestate( chunk_index ) == "targetted_by_zombie" ) - zbarrier setzbarrierpiecestate( chunk_index, "closed" ); + zombie endon( "completed_emerging_into_playable_area" ); + zombie waittill( "stop_zombie_goto_entrance" ); + if ( zbarrier getzbarrierpiecestate( chunk_index ) == "targetted_by_zombie" ) + { + zbarrier setzbarrierpiecestate( chunk_index, "closed" ); + } } -check_zbarrier_piece_for_zombie_death( chunk_index, zbarrier, zombie ) +check_zbarrier_piece_for_zombie_death( chunk_index, zbarrier, zombie ) //checked matches cerberus output { - while ( true ) - { - if ( zbarrier getzbarrierpiecestate( chunk_index ) != "targetted_by_zombie" ) - return; - - if ( !isdefined( zombie ) || !isalive( zombie ) ) - { - zbarrier setzbarrierpiecestate( chunk_index, "closed" ); - return; - } - - wait 0.05; - } + while ( 1 ) + { + if ( zbarrier getzbarrierpiecestate( chunk_index ) != "targetted_by_zombie" ) + { + return; + } + if ( !isDefined( zombie ) || !isalive( zombie ) ) + { + zbarrier setzbarrierpiecestate( chunk_index, "closed" ); + return; + } + wait 0.05; + } } -check_for_zombie_death( zombie ) +check_for_zombie_death( zombie ) //checked matches cerberus output { - self endon( "destroyed" ); - wait 2.5; - self maps\mp\zombies\_zm_blockers::update_states( "repaired" ); + self endon( "destroyed" ); + wait 2.5; + self maps/mp/zombies/_zm_blockers::update_states( "repaired" ); } -zombie_hat_gib( attacker, means_of_death ) +zombie_hat_gib( attacker, means_of_death ) //checked matches cerberus output { - self endon( "death" ); - - if ( !is_mature() ) - return 0; - - if ( isdefined( self.hat_gibbed ) && self.hat_gibbed ) - return; - - if ( !isdefined( self.gibspawn5 ) || !isdefined( self.gibspawntag5 ) ) - return; - - self.hat_gibbed = 1; - - if ( isdefined( self.hatmodel ) ) - self detach( self.hatmodel, "" ); - - temp_array = []; - temp_array[0] = level._zombie_gib_piece_index_hat; - self gib( "normal", temp_array ); - - if ( isdefined( level.track_gibs ) ) - level [[ level.track_gibs ]]( self, temp_array ); + self endon( "death" ); + if ( !is_mature() ) + { + return 0; + } + if ( is_true( self.hat_gibbed ) ) + { + return; + } + if ( !isDefined( self.gibspawn5 ) || !isDefined( self.gibspawntag5 ) ) + { + return; + } + self.hat_gibbed = 1; + if ( isDefined( self.hatmodel ) ) + { + self detach( self.hatmodel, "" ); + } + temp_array = []; + temp_array[ 0 ] = level._zombie_gib_piece_index_hat; + self gib( "normal", temp_array ); + if ( isDefined( level.track_gibs ) ) + { + level [[ level.track_gibs ]]( self, temp_array ); + } } -zombie_head_gib( attacker, means_of_death ) +zombie_head_gib( attacker, means_of_death ) //checked changed to match cerberus output { - self endon( "death" ); - - if ( !is_mature() ) - return 0; - - if ( isdefined( self.head_gibbed ) && self.head_gibbed ) - return; - - self.head_gibbed = 1; - self zombie_eye_glow_stop(); - size = self getattachsize(); - - for ( i = 0; i < size; i++ ) - { - model = self getattachmodelname( i ); - - if ( issubstr( model, "head" ) ) - { - if ( isdefined( self.hatmodel ) ) - self detach( self.hatmodel, "" ); - - self detach( model, "" ); - - if ( isdefined( self.torsodmg5 ) ) - self attach( self.torsodmg5, "", 1 ); - - break; - } - } - - temp_array = []; - temp_array[0] = level._zombie_gib_piece_index_head; - - if ( !( isdefined( self.hat_gibbed ) && self.hat_gibbed ) && isdefined( self.gibspawn5 ) && isdefined( self.gibspawntag5 ) ) - temp_array[1] = level._zombie_gib_piece_index_hat; - - self.hat_gibbed = 1; - self gib( "normal", temp_array ); - - if ( isdefined( level.track_gibs ) ) - level [[ level.track_gibs ]]( self, temp_array ); - - self thread damage_over_time( ceil( self.health * 0.2 ), 1, attacker, means_of_death ); + self endon( "death" ); + if ( !is_mature() ) + { + return 0; + } + if ( is_true( self.head_gibbed ) ) + { + return; + } + self.head_gibbed = 1; + self zombie_eye_glow_stop(); + size = self getattachsize(); + for ( i = 0; i < size; i++ ) + { + model = self getattachmodelname( i ); + if ( issubstr( model, "head" ) ) + { + if ( isDefined( self.hatmodel ) ) + { + self detach( self.hatmodel, "" ); + } + self detach( model, "" ); + if ( isDefined( self.torsodmg5 ) ) + { + self attach( self.torsodmg5, "", 1 ); + } + break; + } + } + temp_array = []; + temp_array[ 0 ] = level._zombie_gib_piece_index_head; + if ( !is_true( self.hat_gibbed ) && isDefined( self.gibspawn5 ) && isDefined( self.gibspawntag5 ) ) + { + temp_array[ 1 ] = level._zombie_gib_piece_index_hat; + } + self.hat_gibbed = 1; + self gib( "normal", temp_array ); + if ( isDefined( level.track_gibs ) ) + { + level [[ level.track_gibs ]]( self, temp_array ); + } + self thread damage_over_time( ceil( self.health * 0.2 ), 1, attacker, means_of_death ); } -damage_over_time( dmg, delay, attacker, means_of_death ) +damage_over_time( dmg, delay, attacker, means_of_death ) //checked matches cerberus output { - self endon( "death" ); - self endon( "exploding" ); - - if ( !isalive( self ) ) - return; - - if ( !isplayer( attacker ) ) - attacker = self; - - if ( !isdefined( means_of_death ) ) - means_of_death = "MOD_UNKNOWN"; - - while ( true ) - { - if ( isdefined( delay ) ) - wait( delay ); - - if ( isdefined( self ) ) - self dodamage( dmg, self gettagorigin( "j_neck" ), attacker, self, self.damagelocation, means_of_death, 0, self.damageweapon ); - } + self endon( "death" ); + self endon( "exploding" ); + if ( !isalive( self ) ) + { + return; + } + if ( !isplayer( attacker ) ) + { + attacker = self; + } + if ( !isDefined( means_of_death ) ) + { + means_of_death = "MOD_UNKNOWN"; + } + while ( 1 ) + { + if ( isDefined( delay ) ) + { + wait delay; + } + if ( isDefined( self ) ) + { + self dodamage( dmg, self gettagorigin( "j_neck" ), attacker, self, self.damagelocation, means_of_death, 0, self.damageweapon ); + } + } } -head_should_gib( attacker, type, point ) +head_should_gib( attacker, type, point ) //checked changed to match cerberus output { - if ( !is_mature() ) - return false; - - if ( self.head_gibbed ) - return false; - - if ( !isdefined( attacker ) || !isplayer( attacker ) ) - return false; - - weapon = attacker getcurrentweapon(); - - if ( type != "MOD_RIFLE_BULLET" && type != "MOD_PISTOL_BULLET" ) - { - if ( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" ) - { - if ( distance( point, self gettagorigin( "j_head" ) ) > 55 ) - return false; - else - return true; - } - else if ( type == "MOD_PROJECTILE" ) - { - if ( distance( point, self gettagorigin( "j_head" ) ) > 10 ) - return false; - else - return true; - } - else if ( weaponclass( weapon ) != "spread" ) - return false; - } - - if ( !self maps\mp\animscripts\zm_utility::damagelocationisany( "head", "helmet", "neck" ) ) - return false; - - if ( weapon == "none" || weapon == level.start_weapon || weaponisgasweapon( self.weapon ) ) - return false; - - low_health_percent = self.health / self.maxhealth * 100; - - if ( low_health_percent > 10 ) - { - self zombie_hat_gib( attacker, type ); - return false; - } - - return true; + if ( !is_mature() ) + { + return 0; + } + if ( self.head_gibbed ) + { + return 0; + } + if ( !isDefined( attacker ) || !isplayer( attacker ) ) + { + return 0; + } + weapon = attacker getcurrentweapon(); + if ( type != "MOD_RIFLE_BULLET" && type != "MOD_PISTOL_BULLET" ) + { + if ( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" ) + { + if ( distance( point, self gettagorigin( "j_head" ) ) > 55 ) + { + return 0; + } + else + { + return 1; + } + } + else if ( type == "MOD_PROJECTILE" ) + { + if ( distance( point, self gettagorigin( "j_head" ) ) > 10 ) + { + return 0; + } + else + { + return 1; + } + } + else if ( weaponclass( weapon ) != "spread" ) + { + return 0; + } + } + if ( !self maps/mp/animscripts/zm_utility::damagelocationisany( "head", "helmet", "neck" ) ) + { + return 0; + } + if ( weapon == "none" || weapon == level.start_weapon || weaponisgasweapon( self.weapon ) ) + { + return 0; + } + low_health_percent = ( self.health / self.maxhealth ) * 100; + if ( low_health_percent > 10 ) + { + self zombie_hat_gib( attacker, type ); + return 0; + } + return 1; } -headshot_blood_fx() +headshot_blood_fx() //checked matches cerberus output { - if ( !isdefined( self ) ) - return; - - if ( !is_mature() ) - return; - - fxtag = "j_neck"; - fxorigin = self gettagorigin( fxtag ); - upvec = anglestoup( self gettagangles( fxtag ) ); - forwardvec = anglestoforward( self gettagangles( fxtag ) ); - playfx( level._effect["headshot"], fxorigin, forwardvec, upvec ); - playfx( level._effect["headshot_nochunks"], fxorigin, forwardvec, upvec ); - wait 0.3; - - if ( isdefined( self ) ) - playfxontag( level._effect["bloodspurt"], self, fxtag ); + if ( !isDefined( self ) ) + { + return; + } + if ( !is_mature() ) + { + return; + } + fxtag = "j_neck"; + fxorigin = self gettagorigin( fxtag ); + upvec = anglesToUp( self gettagangles( fxtag ) ); + forwardvec = anglesToForward( self gettagangles( fxtag ) ); + playfx( level._effect[ "headshot" ], fxorigin, forwardvec, upvec ); + playfx( level._effect[ "headshot_nochunks" ], fxorigin, forwardvec, upvec ); + wait 0.3; + if ( isDefined( self ) ) + { + playfxontag( level._effect[ "bloodspurt" ], self, fxtag ); + } } -zombie_gib_on_damage() +zombie_gib_on_damage() //checked changed to match cerberus output { - while ( true ) - { - self waittill( "damage", amount, attacker, direction_vec, point, type, tagname, modelname, partname, weaponname ); - if ( !isdefined( self ) ) - return; - - if ( !self zombie_should_gib( amount, attacker, type ) ) - continue; - - if ( self head_should_gib( attacker, type, point ) && type != "MOD_BURNED" ) - { - self zombie_head_gib( attacker, type ); - continue; - } - - if ( !self.gibbed ) - { - if ( self maps\mp\animscripts\zm_utility::damagelocationisany( "head", "helmet", "neck" ) ) - continue; - - refs = []; - - switch ( self.damagelocation ) - { - case "torso_upper": - case "torso_lower": - refs[refs.size] = "guts"; - refs[refs.size] = "right_arm"; - break; - case "right_hand": - case "right_arm_upper": - case "right_arm_lower": - refs[refs.size] = "right_arm"; - break; - case "left_hand": - case "left_arm_upper": - case "left_arm_lower": - refs[refs.size] = "left_arm"; - break; - case "right_leg_upper": - case "right_leg_lower": - case "right_foot": - if ( self.health <= 0 ) - { - refs[refs.size] = "right_leg"; - refs[refs.size] = "right_leg"; - refs[refs.size] = "right_leg"; - refs[refs.size] = "no_legs"; - } - - break; - case "left_leg_upper": - case "left_leg_lower": - case "left_foot": - if ( self.health <= 0 ) - { - refs[refs.size] = "left_leg"; - refs[refs.size] = "left_leg"; - refs[refs.size] = "left_leg"; - refs[refs.size] = "no_legs"; - } - - break; - default: - if ( self.damagelocation == "none" ) - { - if ( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_PROJECTILE" || type == "MOD_PROJECTILE_SPLASH" ) - { - refs = self derive_damage_refs( point ); - break; - } - } - else - { - refs[refs.size] = "guts"; - refs[refs.size] = "right_arm"; - refs[refs.size] = "left_arm"; - refs[refs.size] = "right_leg"; - refs[refs.size] = "left_leg"; - refs[refs.size] = "no_legs"; - break; - } - } - - if ( isdefined( level.custom_derive_damage_refs ) ) - refs = self [[ level.custom_derive_damage_refs ]]( refs, point, weaponname ); - - if ( refs.size ) - { - self.a.gib_ref = maps\mp\animscripts\zm_death::get_random( refs ); - - if ( ( self.a.gib_ref == "no_legs" || self.a.gib_ref == "right_leg" || self.a.gib_ref == "left_leg" ) && self.health > 0 ) - { - self.has_legs = 0; - self allowedstances( "crouch" ); - self setphysparams( 15, 0, 24 ); - self allowpitchangle( 1 ); - self setpitchorient(); - health = self.health; - health *= 0.1; - self thread maps\mp\animscripts\zm_run::needsdelayedupdate(); - - if ( isdefined( self.crawl_anim_override ) ) - self [[ self.crawl_anim_override ]](); - } - } - - if ( self.health > 0 ) - { - self thread maps\mp\animscripts\zm_death::do_gib(); - - if ( isdefined( level.gib_on_damage ) ) - self thread [[ level.gib_on_damage ]](); - } - } - } + while ( 1 ) + { + self waittill( "damage", amount, attacker, direction_vec, point, type, tagname, modelname, partname, weaponname ); + if ( !isDefined( self ) ) + { + return; + } + if ( !self zombie_should_gib( amount, attacker, type ) ) + { + continue; + } + if ( self head_should_gib( attacker, type, point ) && type != "MOD_BURNED" ) + { + self zombie_head_gib( attacker, type ); + continue; //added from cerberus output + } + if ( !self.gibbed ) + { + if ( self maps/mp/animscripts/zm_utility::damagelocationisany( "head", "helmet", "neck" ) ) + { + continue; + } + refs = []; + switch( self.damagelocation ) + { + case "torso_lower": + case "torso_upper": + refs[ refs.size ] = "guts"; + refs[ refs.size ] = "right_arm"; + break; + case "right_arm_lower": + case "right_arm_upper": + case "right_hand": + refs[ refs.size ] = "right_arm"; + break; + case "left_arm_lower": + case "left_arm_upper": + case "left_hand": + refs[ refs.size ] = "left_arm"; + break; + case "right_foot": + case "right_leg_lower": + case "right_leg_upper": + if ( self.health <= 0 ) + { + refs[ refs.size ] = "right_leg"; + refs[ refs.size ] = "right_leg"; + refs[ refs.size ] = "right_leg"; + refs[ refs.size ] = "no_legs"; + } + break; + case "left_foot": + case "left_leg_lower": + case "left_leg_upper": + if ( self.health <= 0 ) + { + refs[ refs.size ] = "left_leg"; + refs[ refs.size ] = "left_leg"; + refs[ refs.size ] = "left_leg"; + refs[ refs.size ] = "no_legs"; + } + break; + default: + if ( self.damagelocation == "none" ) + { + if ( type != "MOD_GRENADE" && type != "MOD_GRENADE_SPLASH" || type == "MOD_PROJECTILE" && type == "MOD_PROJECTILE_SPLASH" ) + { + refs = self derive_damage_refs( point ); + break; + } + } + else + { + refs[ refs.size ] = "guts"; + refs[ refs.size ] = "right_arm"; + refs[ refs.size ] = "left_arm"; + refs[ refs.size ] = "right_leg"; + refs[ refs.size ] = "left_leg"; + refs[ refs.size ] = "no_legs"; + break; + } + } + } + if ( isDefined( level.custom_derive_damage_refs ) ) + { + refs = self [[ level.custom_derive_damage_refs ]]( refs, point, weaponname ); + } + if ( refs.size ) + { + self.a.gib_ref = maps/mp/animscripts/zm_death::get_random( refs ); + if ( self.a.gib_ref == "no_legs" && self.health > 0 || self.a.gib_ref == "right_leg" && self.health > 0 || self.a.gib_ref == "left_leg" && self.health > 0 ) + { + self.has_legs = 0; + self allowedstances( "crouch" ); + self setphysparams( 15, 0, 24 ); + self allowpitchangle( 1 ); + self setpitchorient(); + health = self.health; + health *= 0.1; + self thread maps/mp/animscripts/zm_run::needsdelayedupdate(); + if ( isDefined( self.crawl_anim_override ) ) + { + self [[ self.crawl_anim_override ]](); + } + } + } + if ( self.health > 0 ) + { + self thread maps/mp/animscripts/zm_death::do_gib(); + if ( isDefined( level.gib_on_damage ) ) + { + self thread [[ level.gib_on_damage ]](); + } + } + } } -zombie_should_gib( amount, attacker, type ) +zombie_should_gib( amount, attacker, type ) //checked changed to match cerberus output { - if ( !is_mature() ) - return false; - - if ( !isdefined( type ) ) - return false; - - if ( isdefined( self.is_on_fire ) && self.is_on_fire ) - return false; - - if ( isdefined( self.no_gib ) && self.no_gib == 1 ) - return false; - - switch ( type ) - { - case "MOD_UNKNOWN": - case "MOD_TRIGGER_HURT": - case "MOD_TELEFRAG": - case "MOD_SUICIDE": - case "MOD_FALLING": - case "MOD_CRUSH": - case "MOD_BURNED": - return false; - case "MOD_MELEE": - return false; - } - - if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" ) - { - if ( !isdefined( attacker ) || !isplayer( attacker ) ) - return false; - - weapon = attacker getcurrentweapon(); - - if ( weapon == "none" || weapon == level.start_weapon ) - return false; - - if ( weaponisgasweapon( self.weapon ) ) - return false; - } - else if ( type == "MOD_PROJECTILE" ) - { - if ( isdefined( attacker ) && isplayer( attacker ) ) - { - weapon = attacker getcurrentweapon(); - - if ( weapon == "slipgun_zm" || weapon == "slipgun_upgraded_zm" ) - return false; - } - } - - prev_health = amount + self.health; - - if ( prev_health <= 0 ) - prev_health = 1; - - damage_percent = amount / prev_health * 100; - - if ( damage_percent < 10 ) - return false; - - return true; + if ( !is_mature() ) + { + return 0; + } + if ( !isDefined( type ) ) + { + return 0; + } + if ( is_true( self.is_on_fire ) ) + { + return 0; + } + if ( isDefined( self.no_gib ) && self.no_gib == 1 ) + { + return 0; + } + switch( type ) + { + case "MOD_BURNED": + case "MOD_CRUSH": + case "MOD_FALLING": + case "MOD_SUICIDE": + case "MOD_TELEFRAG": + case "MOD_TRIGGER_HURT": + case "MOD_UNKNOWN": + return 0; + case "MOD_MELEE": + return 0; + } + if ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" ) + { + if ( !isDefined( attacker ) || !isplayer( attacker ) ) + { + return 0; + } + weapon = attacker getcurrentweapon(); + if ( weapon == "none" || weapon == level.start_weapon ) + { + return 0; + } + if ( weaponisgasweapon( self.weapon ) ) + { + return 0; + } + } + else if ( type == "MOD_PROJECTILE" ) + { + if ( isDefined( attacker ) && isplayer( attacker ) ) + { + weapon = attacker getcurrentweapon(); + if ( weapon == "slipgun_zm" || weapon == "slipgun_upgraded_zm" ) + { + return 0; + } + } + } + prev_health = amount + self.health; + if ( prev_health <= 0 ) + { + prev_health = 1; + } + damage_percent = ( amount / prev_health ) * 100; + if ( damage_percent < 10 ) + { + return 0; + } + return 1; } -derive_damage_refs( point ) +derive_damage_refs( point ) //checked changed to match cerberus output { - if ( !isdefined( level.gib_tags ) ) - init_gib_tags(); - - closesttag = undefined; - - for ( i = 0; i < level.gib_tags.size; i++ ) - { - if ( !isdefined( closesttag ) ) - { - closesttag = level.gib_tags[i]; - continue; - } - - if ( distancesquared( point, self gettagorigin( level.gib_tags[i] ) ) < distancesquared( point, self gettagorigin( closesttag ) ) ) - closesttag = level.gib_tags[i]; - } - - refs = []; - - if ( closesttag == "J_SpineLower" || closesttag == "J_SpineUpper" || closesttag == "J_Spine4" ) - { - refs[refs.size] = "guts"; - refs[refs.size] = "right_arm"; - } - else if ( closesttag == "J_Shoulder_LE" || closesttag == "J_Elbow_LE" || closesttag == "J_Wrist_LE" ) - refs[refs.size] = "left_arm"; - else if ( closesttag == "J_Shoulder_RI" || closesttag == "J_Elbow_RI" || closesttag == "J_Wrist_RI" ) - refs[refs.size] = "right_arm"; - else if ( closesttag == "J_Hip_LE" || closesttag == "J_Knee_LE" || closesttag == "J_Ankle_LE" ) - { - refs[refs.size] = "left_leg"; - refs[refs.size] = "no_legs"; - } - else if ( closesttag == "J_Hip_RI" || closesttag == "J_Knee_RI" || closesttag == "J_Ankle_RI" ) - { - refs[refs.size] = "right_leg"; - refs[refs.size] = "no_legs"; - } + if ( !isDefined( level.gib_tags ) ) + { + init_gib_tags(); + } + closesttag = undefined; + i = 0; + while ( i < level.gib_tags.size ) + { + if ( !isDefined( closesttag ) ) + { + closesttag = level.gib_tags[ i ]; + i++; + continue; + } + if ( distancesquared( point, self gettagorigin( level.gib_tags[ i ] ) ) < distancesquared( point, self gettagorigin( closesttag ) ) ) + { + closesttag = level.gib_tags[ i ]; + } + i++; + } + refs = []; + if ( closesttag != "J_SpineLower" || closesttag == "J_SpineUpper" || closesttag == "J_Spine4" ) + { + refs[ refs.size ] = "guts"; + refs[ refs.size ] = "right_arm"; + } + else if ( closesttag != "J_Shoulder_LE" || closesttag == "J_Elbow_LE" && closesttag == "J_Wrist_LE" ) + { + refs[ refs.size ] = "left_arm"; + } + else if ( closesttag != "J_Shoulder_RI" || closesttag == "J_Elbow_RI" && closesttag == "J_Wrist_RI" ) + { + refs[ refs.size ] = "right_arm"; + } + else if ( closesttag != "J_Hip_LE" || closesttag == "J_Knee_LE" && closesttag == "J_Ankle_LE" ) + { + refs[ refs.size ] = "left_leg"; + refs[ refs.size ] = "no_legs"; + } + else if ( closesttag != "J_Hip_RI" || closesttag == "J_Knee_RI" && closesttag == "J_Ankle_RI" ) + { + refs[ refs.size ] = "right_leg"; + refs[ refs.size ] = "no_legs"; + } + /* /# - assert( array_validate( refs ), "get_closest_damage_refs(): couldn't derive refs from closestTag " + closesttag ); + assert( array_validate( refs ), "get_closest_damage_refs(): couldn't derive refs from closestTag " + closesttag ); #/ - return refs; + */ + return refs; } -init_gib_tags() +init_gib_tags() //checked matches cerberus output { - tags = []; - tags[tags.size] = "J_SpineLower"; - tags[tags.size] = "J_SpineUpper"; - tags[tags.size] = "J_Spine4"; - tags[tags.size] = "J_Shoulder_LE"; - tags[tags.size] = "J_Elbow_LE"; - tags[tags.size] = "J_Wrist_LE"; - tags[tags.size] = "J_Shoulder_RI"; - tags[tags.size] = "J_Elbow_RI"; - tags[tags.size] = "J_Wrist_RI"; - tags[tags.size] = "J_Hip_LE"; - tags[tags.size] = "J_Knee_LE"; - tags[tags.size] = "J_Ankle_LE"; - tags[tags.size] = "J_Hip_RI"; - tags[tags.size] = "J_Knee_RI"; - tags[tags.size] = "J_Ankle_RI"; - level.gib_tags = tags; + tags = []; + tags[ tags.size ] = "J_SpineLower"; + tags[ tags.size ] = "J_SpineUpper"; + tags[ tags.size ] = "J_Spine4"; + tags[ tags.size ] = "J_Shoulder_LE"; + tags[ tags.size ] = "J_Elbow_LE"; + tags[ tags.size ] = "J_Wrist_LE"; + tags[ tags.size ] = "J_Shoulder_RI"; + tags[ tags.size ] = "J_Elbow_RI"; + tags[ tags.size ] = "J_Wrist_RI"; + tags[ tags.size ] = "J_Hip_LE"; + tags[ tags.size ] = "J_Knee_LE"; + tags[ tags.size ] = "J_Ankle_LE"; + tags[ tags.size ] = "J_Hip_RI"; + tags[ tags.size ] = "J_Knee_RI"; + tags[ tags.size ] = "J_Ankle_RI"; + level.gib_tags = tags; } -zombie_can_drop_powerups( zombie ) +zombie_can_drop_powerups( zombie ) //checked matches cerberus output { - if ( is_tactical_grenade( zombie.damageweapon ) || !flag( "zombie_drop_powerups" ) ) - return false; - - if ( isdefined( zombie.no_powerups ) && zombie.no_powerups ) - return false; - - return true; + if ( is_tactical_grenade( zombie.damageweapon ) || !flag( "zombie_drop_powerups" ) ) + { + return 0; + } + if ( is_true( zombie.no_powerups ) ) + { + return 0; + } + return 1; } -zombie_delay_powerup_drop( origin ) +zombie_delay_powerup_drop( origin ) //checked matches cerberus output { - wait_network_frame(); - level thread maps\mp\zombies\_zm_powerups::powerup_drop( origin ); + wait_network_frame(); + level thread maps/mp/zombies/_zm_powerups::powerup_drop( origin ); } -zombie_death_points( origin, mod, hit_location, attacker, zombie, team ) +zombie_death_points( origin, mod, hit_location, attacker, zombie, team ) //checked matches cerberus output { - if ( !isdefined( attacker ) || !isplayer( attacker ) ) - return; - - if ( zombie_can_drop_powerups( zombie ) ) - { - if ( isdefined( zombie.in_the_ground ) && zombie.in_the_ground == 1 ) - { - trace = bullettrace( zombie.origin + vectorscale( ( 0, 0, 1 ), 100.0 ), zombie.origin + vectorscale( ( 0, 0, -1 ), 100.0 ), 0, undefined ); - origin = trace["position"]; - level thread zombie_delay_powerup_drop( origin ); - } - else - { - trace = groundtrace( zombie.origin + vectorscale( ( 0, 0, 1 ), 5.0 ), zombie.origin + vectorscale( ( 0, 0, -1 ), 300.0 ), 0, undefined ); - origin = trace["position"]; - level thread zombie_delay_powerup_drop( origin ); - } - } - - level thread maps\mp\zombies\_zm_audio::player_zombie_kill_vox( hit_location, attacker, mod, zombie ); - event = "death"; - - if ( isdefined( zombie.damageweapon ) && issubstr( zombie.damageweapon, "knife_ballistic_" ) && ( mod == "MOD_MELEE" || mod == "MOD_IMPACT" ) ) - event = "ballistic_knife_death"; - - if ( isdefined( zombie.deathpoints_already_given ) && zombie.deathpoints_already_given ) - return; - - zombie.deathpoints_already_given = 1; - - if ( isdefined( zombie.damageweapon ) && is_equipment( zombie.damageweapon ) ) - return; - - attacker maps\mp\zombies\_zm_score::player_add_points( event, mod, hit_location, undefined, team, attacker.currentweapon ); + if ( !isDefined( attacker ) || !isplayer( attacker ) ) + { + return; + } + if ( zombie_can_drop_powerups( zombie ) ) + { + if ( isDefined( zombie.in_the_ground ) && zombie.in_the_ground == 1 ) + { + trace = bullettrace( zombie.origin + vectorScale( ( 0, 0, 1 ), 100 ), zombie.origin + vectorScale( ( 0, 0, 0 ), -100 ), 0, undefined ); + origin = trace[ "position" ]; + level thread zombie_delay_powerup_drop( origin ); + } + else + { + trace = groundtrace( zombie.origin + vectorScale( ( 0, 0, 1 ), 5 ), zombie.origin + vectorScale( ( 0, 0, 0 ), -300 ), 0, undefined ); + origin = trace[ "position" ]; + level thread zombie_delay_powerup_drop( origin ); + } + } + level thread maps/mp/zombies/_zm_audio::player_zombie_kill_vox( hit_location, attacker, mod, zombie ); + event = "death"; + if ( isDefined( zombie.damageweapon ) && issubstr( zombie.damageweapon, "knife_ballistic_" ) || mod == "MOD_MELEE" && mod == "MOD_IMPACT" ) + { + event = "ballistic_knife_death"; + } + if ( is_true( zombie.deathpoints_already_given ) ) + { + return; + } + zombie.deathpoints_already_given = 1; + if ( isDefined( zombie.damageweapon ) && is_equipment( zombie.damageweapon ) ) + { + return; + } + attacker maps/mp/zombies/_zm_score::player_add_points( event, mod, hit_location, undefined, team, attacker.currentweapon ); } -get_number_variants( aliasprefix ) +get_number_variants( aliasprefix ) //checked matches cerberus output { - for ( i = 0; i < 100; i++ ) - { - if ( !soundexists( aliasprefix + "_" + i ) ) - return i; - } + for ( i = 0; i < 100; i++ ) + { + if ( !soundexists( aliasprefix + "_" + i ) ) + { + return i; + } + } } -dragons_breath_flame_death_fx() +dragons_breath_flame_death_fx() //checked matches cerberus output { - if ( self.isdog ) - return; - - if ( !isdefined( level._effect ) || !isdefined( level._effect["character_fire_death_sm"] ) ) - { + if ( self.isdog ) + { + return; + } + if ( !isDefined( level._effect ) || !isDefined( level._effect[ "character_fire_death_sm" ] ) ) + { + /* /# - println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_fire_death_sm\"], please set it in your levelname_fx.gsc. Use \"env/fire/fx_fire_zombie_md\"" ); + println( "^3ANIMSCRIPT WARNING: You are missing level._effect["character_fire_death_sm"], please set it in your levelname_fx.gsc. Use "env/fire/fx_fire_zombie_md"" ); #/ - return; - } - - playfxontag( level._effect["character_fire_death_sm"], self, "J_SpineLower" ); - tagarray = []; - - if ( !isdefined( self.a.gib_ref ) || self.a.gib_ref != "left_arm" ) - { - tagarray[tagarray.size] = "J_Elbow_LE"; - tagarray[tagarray.size] = "J_Wrist_LE"; - } - - if ( !isdefined( self.a.gib_ref ) || self.a.gib_ref != "right_arm" ) - { - tagarray[tagarray.size] = "J_Elbow_RI"; - tagarray[tagarray.size] = "J_Wrist_RI"; - } - - if ( !isdefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" && self.a.gib_ref != "left_leg" ) - { - tagarray[tagarray.size] = "J_Knee_LE"; - tagarray[tagarray.size] = "J_Ankle_LE"; - } - - if ( !isdefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" && self.a.gib_ref != "right_leg" ) - { - tagarray[tagarray.size] = "J_Knee_RI"; - tagarray[tagarray.size] = "J_Ankle_RI"; - } - - tagarray = array_randomize( tagarray ); - playfxontag( level._effect["character_fire_death_sm"], self, tagarray[0] ); + */ + return; + } + playfxontag( level._effect[ "character_fire_death_sm" ], self, "J_SpineLower" ); + tagarray = []; + if ( !isDefined( self.a.gib_ref ) || self.a.gib_ref != "left_arm" ) + { + tagarray[ tagarray.size ] = "J_Elbow_LE"; + tagarray[ tagarray.size ] = "J_Wrist_LE"; + } + if ( !isDefined( self.a.gib_ref ) || self.a.gib_ref != "right_arm" ) + { + tagarray[ tagarray.size ] = "J_Elbow_RI"; + tagarray[ tagarray.size ] = "J_Wrist_RI"; + } + if ( !isDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" && self.a.gib_ref != "left_leg" ) + { + tagarray[ tagarray.size ] = "J_Knee_LE"; + tagarray[ tagarray.size ] = "J_Ankle_LE"; + } + if ( !isDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" && self.a.gib_ref != "right_leg" ) + { + tagarray[ tagarray.size ] = "J_Knee_RI"; + tagarray[ tagarray.size ] = "J_Ankle_RI"; + } + tagarray = array_randomize( tagarray ); + playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] ); } -zombie_ragdoll_then_explode( launchvector, attacker ) +zombie_ragdoll_then_explode( launchvector, attacker ) //checked changed to match cerberus output { - if ( !isdefined( self ) ) - return; - - self zombie_eye_glow_stop(); - self setclientfield( "zombie_ragdoll_explode", 1 ); - self notify( "exploding" ); - self notify( "end_melee" ); - self notify( "death", attacker ); - self.dont_die_on_me = 1; - self.exploding = 1; - self.a.nodeath = 1; - self.dont_throw_gib = 1; - self startragdoll(); - self setplayercollision( 0 ); - self reset_attack_spot(); - - if ( isdefined( launchvector ) ) - self launchragdoll( launchvector ); - - wait 2.1; - - if ( isdefined( self ) ) - { - self ghost(); - self delay_thread( 0.25, ::self_delete ); - } + if ( !isDefined( self ) ) + { + return; + } + self zombie_eye_glow_stop(); + self setclientfield( "zombie_ragdoll_explode", 1 ); + self notify( "exploding" ); + self notify( "end_melee" ); + self notify( "death", attacker ); + self.dont_die_on_me = 1; + self.exploding = 1; + self.a.nodeath = 1; + self.dont_throw_gib = 1; + self startragdoll(); + self setplayercollision( 0 ); + self reset_attack_spot(); + if ( isDefined( launchvector ) ) + { + self launchragdoll( launchvector ); + } + wait 2.1; + if ( isDefined( self ) ) + { + self ghost(); + self delay_thread( 0.25, ::self_delete ); + } } -zombie_death_animscript() +zombie_death_animscript() //checked changed to match cerberus output { - team = undefined; - recalc_zombie_array(); - - if ( isdefined( self._race_team ) ) - team = self._race_team; - - self reset_attack_spot(); - - if ( self check_zombie_death_animscript_callbacks() ) - return false; - - if ( isdefined( level.zombie_death_animscript_override ) ) - self [[ level.zombie_death_animscript_override ]](); - - if ( self.has_legs && isdefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" ) - self.deathanim = "zm_death"; - - self.grenadeammo = 0; - - if ( isdefined( self.nuked ) ) - { - if ( zombie_can_drop_powerups( self ) ) - { - if ( isdefined( self.in_the_ground ) && self.in_the_ground == 1 ) - { - trace = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 100.0 ), self.origin + vectorscale( ( 0, 0, -1 ), 100.0 ), 0, undefined ); - origin = trace["position"]; - level thread zombie_delay_powerup_drop( origin ); - } - else - { - trace = groundtrace( self.origin + vectorscale( ( 0, 0, 1 ), 5.0 ), self.origin + vectorscale( ( 0, 0, -1 ), 300.0 ), 0, undefined ); - origin = trace["position"]; - level thread zombie_delay_powerup_drop( self.origin ); - } - } - } - else - level zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker, self, team ); - - if ( isdefined( self.attacker ) && isai( self.attacker ) ) - self.attacker notify( "killed", self ); - - if ( "rottweil72_upgraded_zm" == self.damageweapon && "MOD_RIFLE_BULLET" == self.damagemod ) - self thread dragons_breath_flame_death_fx(); - - if ( "tazer_knuckles_zm" == self.damageweapon && "MOD_MELEE" == self.damagemod ) - { - self.is_on_fire = 0; - self notify( "stop_flame_damage" ); - } - - if ( self.damagemod == "MOD_BURNED" ) - self thread maps\mp\animscripts\zm_death::flame_death_fx(); - - if ( self.damagemod == "MOD_GRENADE" || self.damagemod == "MOD_GRENADE_SPLASH" ) - level notify( "zombie_grenade_death", self.origin ); - - return false; + team = undefined; + recalc_zombie_array(); + if ( isDefined( self._race_team ) ) + { + team = self._race_team; + } + self reset_attack_spot(); + if ( self check_zombie_death_animscript_callbacks() ) + { + return 0; + } + if ( isDefined( level.zombie_death_animscript_override ) ) + { + self [[ level.zombie_death_animscript_override ]](); + } + if ( self.has_legs && isDefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" ) + { + self.deathanim = "zm_death"; + } + self.grenadeammo = 0; + if ( isDefined( self.nuked ) ) + { + if ( zombie_can_drop_powerups( self ) ) + { + if ( isDefined( self.in_the_ground ) && self.in_the_ground == 1 ) + { + trace = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 100 ), self.origin + vectorScale( ( 0, 0, 0 ), -100 ), 0, undefined ); + origin = trace[ "position" ]; + level thread zombie_delay_powerup_drop( origin ); + } + else + { + trace = groundtrace( self.origin + vectorScale( ( 0, 0, 1 ), 5 ), self.origin + vectorScale( ( 0, 0, 0 ), -300 ), 0, undefined ); + origin = trace[ "position" ]; + level thread zombie_delay_powerup_drop( self.origin ); + } + } + } + else + { + level zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker, self, team ); + } + if ( isDefined( self.attacker ) && isai( self.attacker ) ) + { + self.attacker notify( "killed", self ); + } + if ( self.damageweapon == "rottweil72_upgraded_zm" && self.damagemod == "MOD_RIFLE_BULLET" ) + { + self thread dragons_breath_flame_death_fx(); + } + if ( self.damageweapon == "tazer_knuckles_zm" && self.damagemod == "MOD_MELEE" ) + { + self.is_on_fire = 0; + self notify( "stop_flame_damage" ); + } + if ( self.damagemod == "MOD_BURNED" ) + { + self thread maps/mp/animscripts/zm_death::flame_death_fx(); + } + if ( self.damagemod == "MOD_GRENADE" || self.damagemod == "MOD_GRENADE_SPLASH" ) + { + level notify( "zombie_grenade_death", self.origin ); + } + return 0; } -check_zombie_death_animscript_callbacks() +check_zombie_death_animscript_callbacks() //checked changed to match cerberus output { - if ( !isdefined( level.zombie_death_animscript_callbacks ) ) - return false; - - for ( i = 0; i < level.zombie_death_animscript_callbacks.size; i++ ) - { - if ( self [[ level.zombie_death_animscript_callbacks[i] ]]() ) - return true; - } - - return false; + if ( !isDefined( level.zombie_death_animscript_callbacks ) ) + { + return 0; + } + for ( i = 0; i < level.zombie_death_animscript_callbacks.size; i++ ) + { + if ( self [[ level.zombie_death_animscript_callbacks[ i ] ]]() ) + { + return 1; + } + } + return 0; } -register_zombie_death_animscript_callback( func ) +register_zombie_death_animscript_callback( func ) //checked matches cerberus output { - if ( !isdefined( level.zombie_death_animscript_callbacks ) ) - level.zombie_death_animscript_callbacks = []; - - level.zombie_death_animscript_callbacks[level.zombie_death_animscript_callbacks.size] = func; + if ( !isDefined( level.zombie_death_animscript_callbacks ) ) + { + level.zombie_death_animscript_callbacks = []; + } + level.zombie_death_animscript_callbacks[ level.zombie_death_animscript_callbacks.size ] = func; } -damage_on_fire( player ) +damage_on_fire( player ) //checked matches cerberus output { - self endon( "death" ); - self endon( "stop_flame_damage" ); - wait 2; - - while ( isdefined( self.is_on_fire ) && self.is_on_fire ) - { - if ( level.round_number < 6 ) - dmg = level.zombie_health * randomfloatrange( 0.2, 0.3 ); - else if ( level.round_number < 9 ) - dmg = level.zombie_health * randomfloatrange( 0.15, 0.25 ); - else if ( level.round_number < 11 ) - dmg = level.zombie_health * randomfloatrange( 0.1, 0.2 ); - else - dmg = level.zombie_health * randomfloatrange( 0.1, 0.15 ); - - if ( isdefined( player ) && isalive( player ) ) - self dodamage( dmg, self.origin, player ); - else - self dodamage( dmg, self.origin, level ); - - wait( randomfloatrange( 1.0, 3.0 ) ); - } + self endon( "death" ); + self endon( "stop_flame_damage" ); + wait 2; + while ( is_true( self.is_on_fire ) ) + { + if ( level.round_number < 6 ) + { + dmg = level.zombie_health * randomfloatrange( 0.2, 0.3 ); + } + else if ( level.round_number < 9 ) + { + dmg = level.zombie_health * randomfloatrange( 0.15, 0.25 ); + } + else if ( level.round_number < 11 ) + { + dmg = level.zombie_health * randomfloatrange( 0.1, 0.2 ); + } + else + { + dmg = level.zombie_health * randomfloatrange( 0.1, 0.15 ); + } + if ( isDefined( player ) && isalive( player ) ) + { + self dodamage( dmg, self.origin, player ); + } + else + { + self dodamage( dmg, self.origin, level ); + } + wait randomfloatrange( 1, 3 ); + } } -player_using_hi_score_weapon( player ) +player_using_hi_score_weapon( player ) //checked matches cerberus output { - weapon = player getcurrentweapon(); - - if ( weapon == "none" || weaponissemiauto( weapon ) ) - return true; - - return false; + weapon = player getcurrentweapon(); + if ( weapon == "none" || weaponissemiauto( weapon ) ) + { + return 1; + } + return 0; } -zombie_damage( mod, hit_location, hit_origin, player, amount, team ) +zombie_damage( mod, hit_location, hit_origin, player, amount, team ) //checked changed to match cerberus output { - if ( is_magic_bullet_shield_enabled( self ) ) - return; - - player.use_weapon_type = mod; - - if ( isdefined( self.marked_for_death ) ) - return; - - if ( !isdefined( player ) ) - return; - - if ( isdefined( hit_origin ) ) - self.damagehit_origin = hit_origin; - else - self.damagehit_origin = player getweaponmuzzlepoint(); - - if ( self check_zombie_damage_callbacks( mod, hit_location, hit_origin, player, amount ) ) - return; - else if ( self zombie_flame_damage( mod, player ) ) - { - if ( self zombie_give_flame_damage_points() ) - player maps\mp\zombies\_zm_score::player_add_points( "damage", mod, hit_location, self.isdog, team ); - } - else - { - if ( player_using_hi_score_weapon( player ) ) - damage_type = "damage"; - else - damage_type = "damage_light"; - - if ( !( isdefined( self.no_damage_points ) && self.no_damage_points ) ) - player maps\mp\zombies\_zm_score::player_add_points( damage_type, mod, hit_location, self.isdog, team, self.damageweapon ); - } - - if ( isdefined( self.zombie_damage_fx_func ) ) - self [[ self.zombie_damage_fx_func ]]( mod, hit_location, hit_origin, player ); - - modname = remove_mod_from_methodofdeath( mod ); - - if ( is_placeable_mine( self.damageweapon ) ) - { - if ( isdefined( self.zombie_damage_claymore_func ) ) - self [[ self.zombie_damage_claymore_func ]]( mod, hit_location, hit_origin, player ); - else if ( isdefined( player ) && isalive( player ) ) - self dodamage( level.round_number * randomintrange( 100, 200 ), self.origin, player, self, hit_location, mod ); - else - self dodamage( level.round_number * randomintrange( 100, 200 ), self.origin, undefined, self, hit_location, mod ); - } - else if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" ) - { - if ( isdefined( player ) && isalive( player ) ) - { - player.grenade_multiattack_count++; - player.grenade_multiattack_ent = self; - self dodamage( level.round_number + randomintrange( 100, 200 ), self.origin, player, self, hit_location, modname ); - } - else - self dodamage( level.round_number + randomintrange( 100, 200 ), self.origin, undefined, self, hit_location, modname ); - } - else if ( mod == "MOD_PROJECTILE" || mod == "MOD_EXPLOSIVE" || mod == "MOD_PROJECTILE_SPLASH" ) - { - if ( isdefined( player ) && isalive( player ) ) - self dodamage( level.round_number * randomintrange( 0, 100 ), self.origin, player, self, hit_location, modname ); - else - self dodamage( level.round_number * randomintrange( 0, 100 ), self.origin, undefined, self, hit_location, modname ); - } - - if ( isdefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" && isalive( self ) ) - { - if ( isdefined( player ) ) - { - rand = randomintrange( 0, 100 ); - - if ( rand < 10 ) - player create_and_play_dialog( "general", "crawl_spawn" ); - } - } - else if ( isdefined( self.a.gib_ref ) && ( self.a.gib_ref == "right_arm" || self.a.gib_ref == "left_arm" ) ) - { - if ( self.has_legs && isalive( self ) ) - { - if ( isdefined( player ) ) - { - rand = randomintrange( 0, 100 ); - - if ( rand < 7 ) - player create_and_play_dialog( "general", "shoot_arm" ); - } - } - } - - self thread maps\mp\zombies\_zm_powerups::check_for_instakill( player, mod, hit_location ); + if ( is_magic_bullet_shield_enabled( self ) ) + { + return; + } + player.use_weapon_type = mod; + if ( isDefined( self.marked_for_death ) ) + { + return; + } + if ( !isDefined( player ) ) + { + return; + } + if ( isDefined( hit_origin ) ) + { + self.damagehit_origin = hit_origin; + } + else + { + self.damagehit_origin = player getweaponmuzzlepoint(); + } + if ( self check_zombie_damage_callbacks( mod, hit_location, hit_origin, player, amount ) ) + { + return; + } + else if ( self zombie_flame_damage( mod, player ) ) + { + if ( self zombie_give_flame_damage_points() ) + { + player maps/mp/zombies/_zm_score::player_add_points( "damage", mod, hit_location, self.isdog, team ); + } + } + else if ( player_using_hi_score_weapon( player ) ) + { + damage_type = "damage"; + } + else + { + damage_type = "damage_light"; + } + if ( !is_true( self.no_damage_points ) ) + { + player maps/mp/zombies/_zm_score::player_add_points( damage_type, mod, hit_location, self.isdog, team, self.damageweapon ); + } + if ( isDefined( self.zombie_damage_fx_func ) ) + { + self [[ self.zombie_damage_fx_func ]]( mod, hit_location, hit_origin, player ); + } + modname = remove_mod_from_methodofdeath( mod ); + if ( is_placeable_mine( self.damageweapon ) ) + { + if ( isDefined( self.zombie_damage_claymore_func ) ) + { + self [[ self.zombie_damage_claymore_func ]]( mod, hit_location, hit_origin, player ); + } + else if ( isDefined( player ) && isalive( player ) ) + { + self dodamage( level.round_number * randomintrange( 100, 200 ), self.origin, player, self, hit_location, mod ); + } + else + { + self dodamage( level.round_number * randomintrange( 100, 200 ), self.origin, undefined, self, hit_location, mod ); + } + } + else if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" ) + { + if ( isDefined( player ) && isalive( player ) ) + { + player.grenade_multiattack_count++; + player.grenade_multiattack_ent = self; + self dodamage( level.round_number + randomintrange( 100, 200 ), self.origin, player, self, hit_location, modname ); + } + else + { + self dodamage( level.round_number + randomintrange( 100, 200 ), self.origin, undefined, self, hit_location, modname ); + } + } + else if ( mod != "MOD_PROJECTILE" || mod == "MOD_EXPLOSIVE" && mod == "MOD_PROJECTILE_SPLASH" ) + { + if ( isDefined( player ) && isalive( player ) ) + { + self dodamage( level.round_number * randomintrange( 0, 100 ), self.origin, player, self, hit_location, modname ); + } + else + { + self dodamage( level.round_number * randomintrange( 0, 100 ), self.origin, undefined, self, hit_location, modname ); + } + } + if ( isDefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" && isalive( self ) ) + { + if ( isDefined( player ) ) + { + rand = randomintrange( 0, 100 ); + if ( rand < 10 ) + { + player create_and_play_dialog( "general", "crawl_spawn" ); + } + } + } + else if ( isDefined( self.a.gib_ref ) || self.a.gib_ref == "right_arm" && self.a.gib_ref == "left_arm" ) + { + if ( self.has_legs && isalive( self ) ) + { + if ( isDefined( player ) ) + { + rand = randomintrange( 0, 100 ); + if ( rand < 7 ) + { + player create_and_play_dialog( "general", "shoot_arm" ); + } + } + } + } + self thread maps/mp/zombies/_zm_powerups::check_for_instakill( player, mod, hit_location ); } -zombie_damage_ads( mod, hit_location, hit_origin, player, amount, team ) +zombie_damage_ads( mod, hit_location, hit_origin, player, amount, team ) //checked changed to match cerberus output { - if ( is_magic_bullet_shield_enabled( self ) ) - return; - - player.use_weapon_type = mod; - - if ( !isdefined( player ) ) - return; - - if ( isdefined( hit_origin ) ) - self.damagehit_origin = hit_origin; - else - self.damagehit_origin = player getweaponmuzzlepoint(); - - if ( self check_zombie_damage_callbacks( mod, hit_location, hit_origin, player, amount ) ) - return; - else if ( self zombie_flame_damage( mod, player ) ) - { - if ( self zombie_give_flame_damage_points() ) - player maps\mp\zombies\_zm_score::player_add_points( "damage_ads", mod, hit_location, undefined, team ); - } - else - { - if ( player_using_hi_score_weapon( player ) ) - damage_type = "damage"; - else - damage_type = "damage_light"; - - if ( !( isdefined( self.no_damage_points ) && self.no_damage_points ) ) - player maps\mp\zombies\_zm_score::player_add_points( damage_type, mod, hit_location, undefined, team, self.damageweapon ); - } - - self thread maps\mp\zombies\_zm_powerups::check_for_instakill( player, mod, hit_location ); + if ( is_magic_bullet_shield_enabled( self ) ) + { + return; + } + player.use_weapon_type = mod; + if ( !isDefined( player ) ) + { + return; + } + if ( isDefined( hit_origin ) ) + { + self.damagehit_origin = hit_origin; + } + else + { + self.damagehit_origin = player getweaponmuzzlepoint(); + } + if ( self check_zombie_damage_callbacks( mod, hit_location, hit_origin, player, amount ) ) + { + return; + } + else if ( self zombie_flame_damage( mod, player ) ) + { + if ( self zombie_give_flame_damage_points() ) + { + player maps/mp/zombies/_zm_score::player_add_points( "damage_ads", mod, hit_location, undefined, team ); + } + } + else if ( player_using_hi_score_weapon( player ) ) + { + damage_type = "damage"; + } + else + { + damage_type = "damage_light"; + } + if ( !is_true( self.no_damage_points ) ) + { + player maps/mp/zombies/_zm_score::player_add_points( damage_type, mod, hit_location, undefined, team, self.damageweapon ); + } + self thread maps/mp/zombies/_zm_powerups::check_for_instakill( player, mod, hit_location ); } -check_zombie_damage_callbacks( mod, hit_location, hit_origin, player, amount ) +check_zombie_damage_callbacks( mod, hit_location, hit_origin, player, amount ) //checked changed to match cerberus output { - if ( !isdefined( level.zombie_damage_callbacks ) ) - return false; - - for ( i = 0; i < level.zombie_damage_callbacks.size; i++ ) - { - if ( self [[ level.zombie_damage_callbacks[i] ]]( mod, hit_location, hit_origin, player, amount ) ) - return true; - } - - return false; + if ( !isDefined( level.zombie_damage_callbacks ) ) + { + return 0; + } + for ( i = 0; i < level.zombie_damage_callbacks.size; i++ ) + { + if ( self [[ level.zombie_damage_callbacks[ i ] ]]( mod, hit_location, hit_origin, player, amount ) ) + { + return 1; + } + } + return 0; } -register_zombie_damage_callback( func ) +register_zombie_damage_callback( func ) //checked matches cerberus output { - if ( !isdefined( level.zombie_damage_callbacks ) ) - level.zombie_damage_callbacks = []; - - level.zombie_damage_callbacks[level.zombie_damage_callbacks.size] = func; + if ( !isDefined( level.zombie_damage_callbacks ) ) + { + level.zombie_damage_callbacks = []; + } + level.zombie_damage_callbacks[ level.zombie_damage_callbacks.size ] = func; } -zombie_give_flame_damage_points() +zombie_give_flame_damage_points() //checked matches cerberus output { - if ( gettime() > self.flame_damage_time ) - { - self.flame_damage_time = gettime() + level.zombie_vars["zombie_flame_dmg_point_delay"]; - return true; - } - - return false; + if ( getTime() > self.flame_damage_time ) + { + self.flame_damage_time = getTime() + level.zombie_vars[ "zombie_flame_dmg_point_delay" ]; + return 1; + } + return 0; } -zombie_flame_damage( mod, player ) +zombie_flame_damage( mod, player ) //checked changed to match cerberus output { - if ( mod == "MOD_BURNED" ) - { - if ( !isdefined( self.is_on_fire ) || isdefined( self.is_on_fire ) && !self.is_on_fire ) - self thread damage_on_fire( player ); - - do_flame_death = 1; - dist = 10000; - ai = getaiarray( level.zombie_team ); - - for ( i = 0; i < ai.size; i++ ) - { - if ( isdefined( ai[i].is_on_fire ) && ai[i].is_on_fire ) - { - if ( distancesquared( ai[i].origin, self.origin ) < dist ) - { - do_flame_death = 0; - break; - } - } - } - - if ( do_flame_death ) - self thread maps\mp\animscripts\zm_death::flame_death_fx(); - - return true; - } - - return false; + if ( mod == "MOD_BURNED" ) + { + if ( !is_true( self.is_on_fire ) ) + { + self thread damage_on_fire( player ); + } + do_flame_death = 1; + dist = 10000; + ai = getaiarray( level.zombie_team ); + for ( i = 0; i < ai.size; i++ ) + { + if ( is_true( ai[ i ].is_on_fire ) ) + { + if ( distancesquared( ai[ i ].origin, self.origin ) < dist ) + { + do_flame_death = 0; + break; + } + } + } + if ( do_flame_death ) + { + self thread maps/mp/animscripts/zm_death::flame_death_fx(); + } + return 1; + } + return 0; } -is_weapon_shotgun( sweapon ) +is_weapon_shotgun( sweapon ) //checked matches cerberus output { - if ( isdefined( sweapon ) && weaponclass( sweapon ) == "spread" ) - return true; - - return false; + if ( isDefined( sweapon ) && weaponclass( sweapon ) == "spread" ) + { + return 1; + } + return 0; } -zombie_death_event( zombie ) +zombie_death_event( zombie ) //checked changed to match cerberus output { - zombie.marked_for_recycle = 0; - force_explode = 0; - force_head_gib = 0; - - zombie waittill( "death", attacker ); - - time_of_death = gettime(); - - if ( isdefined( zombie ) ) - zombie stopsounds(); - - if ( isdefined( zombie ) && isdefined( zombie.marked_for_insta_upgraded_death ) ) - force_head_gib = 1; - - if ( !isdefined( zombie.damagehit_origin ) && isdefined( attacker ) ) - zombie.damagehit_origin = attacker getweaponmuzzlepoint(); - - if ( isdefined( attacker ) && isplayer( attacker ) ) - { - if ( isdefined( level.pers_upgrade_carpenter ) && level.pers_upgrade_carpenter ) - maps\mp\zombies\_zm_pers_upgrades::pers_zombie_death_location_check( attacker, zombie.origin ); - - if ( isdefined( level.pers_upgrade_sniper ) && level.pers_upgrade_sniper ) - attacker pers_upgrade_sniper_kill_check( zombie, attacker ); - - if ( isdefined( zombie ) && isdefined( zombie.damagelocation ) ) - { - if ( is_headshot( zombie.damageweapon, zombie.damagelocation, zombie.damagemod ) ) - { - attacker.headshots++; - attacker maps\mp\zombies\_zm_stats::increment_client_stat( "headshots" ); - attacker addweaponstat( zombie.damageweapon, "headshots", 1 ); - attacker maps\mp\zombies\_zm_stats::increment_player_stat( "headshots" ); - - if ( is_classic() ) - attacker maps\mp\zombies\_zm_pers_upgrades_functions::pers_check_for_pers_headshot( time_of_death, zombie ); - } - else - attacker notify( "zombie_death_no_headshot" ); - } - - if ( isdefined( zombie ) && isdefined( zombie.damagemod ) && zombie.damagemod == "MOD_MELEE" ) - { - attacker maps\mp\zombies\_zm_stats::increment_client_stat( "melee_kills" ); - attacker maps\mp\zombies\_zm_stats::increment_player_stat( "melee_kills" ); - attacker notify( "melee_kill" ); - - if ( attacker maps\mp\zombies\_zm_pers_upgrades::is_insta_kill_upgraded_and_active() ) - force_explode = 1; - } - - attacker maps\mp\zombies\_zm::add_rampage_bookmark_kill_time(); - attacker.kills++; - attacker maps\mp\zombies\_zm_stats::increment_client_stat( "kills" ); - attacker maps\mp\zombies\_zm_stats::increment_player_stat( "kills" ); - - if ( isdefined( level.pers_upgrade_pistol_points ) && level.pers_upgrade_pistol_points ) - attacker maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_pistol_points_kill(); - - dmgweapon = zombie.damageweapon; - - if ( is_alt_weapon( dmgweapon ) ) - dmgweapon = weaponaltweaponname( dmgweapon ); - - attacker addweaponstat( dmgweapon, "kills", 1 ); - - if ( attacker maps\mp\zombies\_zm_pers_upgrades_functions::pers_mulit_kill_headshot_active() || force_head_gib ) - zombie maps\mp\zombies\_zm_spawner::zombie_head_gib(); - - if ( isdefined( level.pers_upgrade_nube ) && level.pers_upgrade_nube ) - attacker notify( "pers_player_zombie_kill" ); - } - - zombie_death_achievement_sliquifier_check( attacker, zombie ); - recalc_zombie_array(); - - if ( !isdefined( zombie ) ) - return; - - level.global_zombies_killed++; - - if ( isdefined( zombie.marked_for_death ) && !isdefined( zombie.nuked ) ) - level.zombie_trap_killed_count++; - - zombie check_zombie_death_event_callbacks(); - name = zombie.animname; - - if ( isdefined( zombie.sndname ) ) - name = zombie.sndname; - - zombie thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "death", name ); - zombie thread zombie_eye_glow_stop(); - - if ( isdefined( zombie.damageweapon ) && is_weapon_shotgun( zombie.damageweapon ) && maps\mp\zombies\_zm_weapons::is_weapon_upgraded( zombie.damageweapon ) || isdefined( zombie.damageweapon ) && is_placeable_mine( zombie.damageweapon ) || zombie.damagemod == "MOD_GRENADE" || zombie.damagemod == "MOD_GRENADE_SPLASH" || zombie.damagemod == "MOD_EXPLOSIVE" || force_explode == 1 ) - { - splode_dist = 180; - - if ( isdefined( zombie.damagehit_origin ) && distancesquared( zombie.origin, zombie.damagehit_origin ) < splode_dist * splode_dist ) - { - tag = "J_SpineLower"; - - if ( isdefined( zombie.isdog ) && zombie.isdog ) - tag = "tag_origin"; - - if ( !( isdefined( zombie.is_on_fire ) && zombie.is_on_fire ) && !( isdefined( zombie.guts_explosion ) && zombie.guts_explosion ) ) - zombie thread zombie_gut_explosion(); - } - } - - if ( zombie.damagemod == "MOD_GRENADE" || zombie.damagemod == "MOD_GRENADE_SPLASH" ) - { - if ( isdefined( attacker ) && isalive( attacker ) ) - { - attacker.grenade_multiattack_count++; - attacker.grenade_multiattack_ent = zombie; - } - } - - if ( !( isdefined( zombie.has_been_damaged_by_player ) && zombie.has_been_damaged_by_player ) && ( isdefined( zombie.marked_for_recycle ) && zombie.marked_for_recycle ) ) - { - level.zombie_total++; - level.zombie_total_subtract++; - } - else if ( isdefined( zombie.attacker ) && isplayer( zombie.attacker ) ) - { - level.zombie_player_killed_count++; - - if ( isdefined( zombie.sound_damage_player ) && zombie.sound_damage_player == zombie.attacker ) - { - chance = get_response_chance( "damage" ); - - if ( chance != 0 ) - { - if ( chance > randomintrange( 1, 100 ) ) - zombie.attacker maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "damage" ); - } - else - zombie.attacker maps\mp\zombies\_zm_audio::create_and_play_dialog( "kill", "damage" ); - } - - zombie.attacker notify( "zom_kill", zombie ); - damageloc = zombie.damagelocation; - damagemod = zombie.damagemod; - attacker = zombie.attacker; - weapon = zombie.damageweapon; - bbprint( "zombie_kills", "round %d zombietype %s damagetype %s damagelocation %s playername %s playerweapon %s playerx %f playery %f playerz %f zombiex %f zombiey %f zombiez %f", level.round_number, zombie.animname, damagemod, damageloc, attacker.name, weapon, attacker.origin, zombie.origin ); - } - else if ( zombie.ignoreall && !( isdefined( zombie.marked_for_death ) && zombie.marked_for_death ) ) - level.zombies_timeout_spawn++; - - level notify( "zom_kill" ); - level.total_zombies_killed++; + zombie.marked_for_recycle = 0; + force_explode = 0; + force_head_gib = 0; + zombie waittill( "death", attacker ); + time_of_death = getTime(); + if ( isDefined( zombie ) ) + { + zombie stopsounds(); + } + if ( isDefined( zombie ) && isDefined( zombie.marked_for_insta_upgraded_death ) ) + { + force_head_gib = 1; + } + if ( !isDefined( zombie.damagehit_origin ) && isDefined( attacker ) ) + { + zombie.damagehit_origin = attacker getweaponmuzzlepoint(); + } + if ( isDefined( attacker ) && isplayer( attacker ) ) + { + if ( is_true( level.pers_upgrade_carpenter ) ) + { + maps/mp/zombies/_zm_pers_upgrades::pers_zombie_death_location_check( attacker, zombie.origin ); + } + if ( is_true( level.pers_upgrade_sniper ) ) + { + attacker pers_upgrade_sniper_kill_check( zombie, attacker ); + } + if ( isDefined( zombie ) && isDefined( zombie.damagelocation ) ) + { + if ( is_headshot( zombie.damageweapon, zombie.damagelocation, zombie.damagemod ) ) + { + attacker.headshots++; + attacker maps/mp/zombies/_zm_stats::increment_client_stat( "headshots" ); + attacker addweaponstat( zombie.damageweapon, "headshots", 1 ); + attacker maps/mp/zombies/_zm_stats::increment_player_stat( "headshots" ); + if ( is_classic() ) + { + attacker maps/mp/zombies/_zm_pers_upgrades_functions::pers_check_for_pers_headshot( time_of_death, zombie ); + } + } + else + { + attacker notify( "zombie_death_no_headshot" ); + } + } + if ( isDefined( zombie ) && isDefined( zombie.damagemod ) && zombie.damagemod == "MOD_MELEE" ) + { + attacker maps/mp/zombies/_zm_stats::increment_client_stat( "melee_kills" ); + attacker maps/mp/zombies/_zm_stats::increment_player_stat( "melee_kills" ); + attacker notify( "melee_kill" ); + if ( attacker maps/mp/zombies/_zm_pers_upgrades::is_insta_kill_upgraded_and_active() ) + { + force_explode = 1; + } + } + attacker maps/mp/zombies/_zm::add_rampage_bookmark_kill_time(); + attacker.kills++; + attacker maps/mp/zombies/_zm_stats::increment_client_stat( "kills" ); + attacker maps/mp/zombies/_zm_stats::increment_player_stat( "kills" ); + if ( is_true( level.pers_upgrade_pistol_points ) ) + { + attacker maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_pistol_points_kill(); + } + dmgweapon = zombie.damageweapon; + if ( is_alt_weapon( dmgweapon ) ) + { + dmgweapon = weaponaltweaponname( dmgweapon ); + } + attacker addweaponstat( dmgweapon, "kills", 1 ); + if ( attacker maps/mp/zombies/_zm_pers_upgrades_functions::pers_mulit_kill_headshot_active() || force_head_gib ) + { + zombie maps/mp/zombies/_zm_spawner::zombie_head_gib(); + } + if ( is_true( level.pers_upgrade_nube ) ) + { + attacker notify( "pers_player_zombie_kill" ); + } + } + zombie_death_achievement_sliquifier_check( attacker, zombie ); + recalc_zombie_array(); + if ( !isDefined( zombie ) ) + { + return; + } + level.global_zombies_killed++; + if ( isDefined( zombie.marked_for_death ) && !isDefined( zombie.nuked ) ) + { + level.zombie_trap_killed_count++; + } + zombie check_zombie_death_event_callbacks(); + name = zombie.animname; + if ( isDefined( zombie.sndname ) ) + { + name = zombie.sndname; + } + zombie thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "death", name ); + zombie thread zombie_eye_glow_stop(); + if ( isDefined( zombie.damageweapon ) && is_weapon_shotgun( zombie.damageweapon ) && !maps/mp/zombies/_zm_weapons::is_weapon_upgraded( zombie.damageweapon ) || isDefined( zombie.damageweapon ) && is_placeable_mine( zombie.damageweapon ) || zombie.damagemod == "MOD_GRENADE" || zombie.damagemod == "MOD_GRENADE_SPLASH" || zombie.damagemod == "MOD_EXPLOSIVE" || force_explode == 1 ) + { + splode_dist = 180; + if ( isDefined( zombie.damagehit_origin ) && distancesquared( zombie.origin, zombie.damagehit_origin ) < ( splode_dist * splode_dist ) ) + { + tag = "J_SpineLower"; + if ( is_true( zombie.isdog ) ) + { + tag = "tag_origin"; + } + if ( !is_true( zombie.is_on_fire ) && !is_true( zombie.guts_explosion ) ) + { + zombie thread zombie_gut_explosion(); + } + } + } + if ( zombie.damagemod == "MOD_GRENADE" || zombie.damagemod == "MOD_GRENADE_SPLASH" ) + { + if ( isDefined( attacker ) && isalive( attacker ) ) + { + attacker.grenade_multiattack_count++; + attacker.grenade_multiattack_ent = zombie; + } + } + if ( !is_true( zombie.has_been_damaged_by_player ) && is_true( zombie.marked_for_recycle ) ) + { + level.zombie_total++; + level.zombie_total_subtract++; + } + else if ( isDefined( zombie.attacker ) && isplayer( zombie.attacker ) ) + { + level.zombie_player_killed_count++; + if ( isDefined( zombie.sound_damage_player ) && zombie.sound_damage_player == zombie.attacker ) + { + chance = get_response_chance( "damage" ); + if ( chance != 0 ) + { + if ( chance > randomintrange( 1, 100 ) ) + { + zombie.attacker maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "damage" ); + } + } + else + { + zombie.attacker maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "damage" ); + } + } + zombie.attacker notify( "zom_kill", zombie ); + damageloc = zombie.damagelocation; + damagemod = zombie.damagemod; + attacker = zombie.attacker; + weapon = zombie.damageweapon; + bbprint( "zombie_kills", "round %d zombietype %s damagetype %s damagelocation %s playername %s playerweapon %s playerx %f playery %f playerz %f zombiex %f zombiey %f zombiez %f", level.round_number, zombie.animname, damagemod, damageloc, attacker.name, weapon, attacker.origin, zombie.origin ); + } + else if ( zombie.ignoreall && !is_true( zombie.marked_for_death ) ) + { + level.zombies_timeout_spawn++; + } + level notify( "zom_kill" ); + level.total_zombies_killed++; } -zombie_gut_explosion() +zombie_gut_explosion() //checked matches cerberus output { - self.guts_explosion = 1; - - if ( is_mature() ) - self setclientfield( "zombie_gut_explosion", 1 ); - - if ( !( isdefined( self.isdog ) && self.isdog ) ) - wait 0.1; - - if ( isdefined( self ) ) - self ghost(); + self.guts_explosion = 1; + if ( is_mature() ) + { + self setclientfield( "zombie_gut_explosion", 1 ); + } + if ( !is_true( self.isdog ) ) + { + wait 0.1; + } + if ( isDefined( self ) ) + { + self ghost(); + } } -zombie_death_achievement_sliquifier_check( e_player, e_zombie ) +zombie_death_achievement_sliquifier_check( e_player, e_zombie ) //checked matches cerberus output { - if ( !isplayer( e_player ) ) - return; - - if ( isdefined( e_zombie ) ) - { - if ( isdefined( e_zombie.damageweapon ) && e_zombie.damageweapon == "slipgun_zm" ) - { - if ( !isdefined( e_player.num_sliquifier_kills ) ) - e_player.num_sliquifier_kills = 0; - - e_player.num_sliquifier_kills++; - e_player notify( "sliquifier_kill" ); - } - } + if ( !isplayer( e_player ) ) + { + return; + } + if ( isDefined( e_zombie ) ) + { + if ( isDefined( e_zombie.damageweapon ) && e_zombie.damageweapon == "slipgun_zm" ) + { + if ( !isDefined( e_player.num_sliquifier_kills ) ) + { + e_player.num_sliquifier_kills = 0; + } + e_player.num_sliquifier_kills++; + e_player notify( "sliquifier_kill" ); + } + } } -check_zombie_death_event_callbacks() +check_zombie_death_event_callbacks() //checked changed to match cerberus output { - if ( !isdefined( level.zombie_death_event_callbacks ) ) - return; - - for ( i = 0; i < level.zombie_death_event_callbacks.size; i++ ) - self [[ level.zombie_death_event_callbacks[i] ]](); + if ( !isDefined( level.zombie_death_event_callbacks ) ) + { + return; + } + for ( i = 0; i < level.zombie_death_event_callbacks.size; i++ ) + { + self [[ level.zombie_death_event_callbacks[ i ] ]](); + } } -register_zombie_death_event_callback( func ) +register_zombie_death_event_callback( func ) //checked matches cerberus output { - if ( !isdefined( level.zombie_death_event_callbacks ) ) - level.zombie_death_event_callbacks = []; - - level.zombie_death_event_callbacks[level.zombie_death_event_callbacks.size] = func; + if ( !isDefined( level.zombie_death_event_callbacks ) ) + { + level.zombie_death_event_callbacks = []; + } + level.zombie_death_event_callbacks[ level.zombie_death_event_callbacks.size ] = func; } -deregister_zombie_death_event_callback( func ) +deregister_zombie_death_event_callback( func ) //checked matches cerberus output { - if ( isdefined( level.zombie_death_event_callbacks ) ) - arrayremovevalue( level.zombie_death_event_callbacks, func ); + if ( isDefined( level.zombie_death_event_callbacks ) ) + { + arrayremovevalue( level.zombie_death_event_callbacks, func ); + } } -zombie_setup_attack_properties() +zombie_setup_attack_properties() //checked matches cerberus output { - self zombie_history( "zombie_setup_attack_properties()" ); - self.ignoreall = 0; - self.pathenemyfightdist = 64; - self.meleeattackdist = 64; - self.maxsightdistsqrd = 16384; - self.disablearrivals = 1; - self.disableexits = 1; + self zombie_history( "zombie_setup_attack_properties()" ); + self.ignoreall = 0; + self.pathenemyfightdist = 64; + self.meleeattackdist = 64; + self.maxsightdistsqrd = 16384; + self.disablearrivals = 1; + self.disableexits = 1; } -attractors_generated_listener() +attractors_generated_listener() //checked matches cerberus output { - self endon( "death" ); - level endon( "intermission" ); - self endon( "stop_find_flesh" ); - self endon( "path_timer_done" ); - - level waittill( "attractor_positions_generated" ); - - self.zombie_path_timer = 0; + self endon( "death" ); + level endon( "intermission" ); + self endon( "stop_find_flesh" ); + self endon( "path_timer_done" ); + level waittill( "attractor_positions_generated" ); + self.zombie_path_timer = 0; } -zombie_pathing() +zombie_pathing() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "zombie_acquire_enemy" ); - level endon( "intermission" ); + self endon( "death" ); + self endon( "zombie_acquire_enemy" ); + level endon( "intermission" ); + /* /# - assert( isdefined( self.favoriteenemy ) || isdefined( self.enemyoverride ) ); + if ( !isDefined( self.favoriteenemy ) ) + { + assert( isDefined( self.enemyoverride ) ); + } #/ - self._skip_pathing_first_delay = 1; - self thread zombie_follow_enemy(); - - self waittill( "bad_path" ); - - level.zombie_pathing_failed++; - - if ( isdefined( self.enemyoverride ) ) - { - debug_print( "Zombie couldn't path to point of interest at origin: " + self.enemyoverride[0] + " Falling back to breadcrumb system" ); - - if ( isdefined( self.enemyoverride[1] ) ) - { - self.enemyoverride = self.enemyoverride[1] invalidate_attractor_pos( self.enemyoverride, self ); - self.zombie_path_timer = 0; - return; - } - } - else if ( isdefined( self.favoriteenemy ) ) - debug_print( "Zombie couldn't path to player at origin: " + self.favoriteenemy.origin + " Falling back to breadcrumb system" ); - else - debug_print( "Zombie couldn't path to a player ( the other 'prefered' player might be ignored for encounters mode ). Falling back to breadcrumb system" ); - - if ( !isdefined( self.favoriteenemy ) ) - { - self.zombie_path_timer = 0; - return; - } - else - self.favoriteenemy endon( "disconnect" ); - - players = get_players(); - valid_player_num = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( is_player_valid( players[i], 1 ) ) - valid_player_num += 1; - } - - if ( players.size > 1 ) - { - if ( isdefined( level._should_skip_ignore_player_logic ) && [[ level._should_skip_ignore_player_logic ]]() ) - { - self.zombie_path_timer = 0; - return; - } - - if ( array_check_for_dupes( self.ignore_player, self.favoriteenemy ) ) - self.ignore_player[self.ignore_player.size] = self.favoriteenemy; - - if ( self.ignore_player.size < valid_player_num ) - { - self.zombie_path_timer = 0; - return; - } - } - - crumb_list = self.favoriteenemy.zombie_breadcrumbs; - bad_crumbs = []; - - while ( true ) - { - if ( !is_player_valid( self.favoriteenemy, 1 ) ) - { - self.zombie_path_timer = 0; - return; - } - - goal = zombie_pathing_get_breadcrumb( self.favoriteenemy.origin, crumb_list, bad_crumbs, randomint( 100 ) < 20 ); - - if ( !isdefined( goal ) ) - { - debug_print( "Zombie exhausted breadcrumb search" ); - level.zombie_breadcrumb_failed++; - goal = self.favoriteenemy.spectator_respawn.origin; - } - - debug_print( "Setting current breadcrumb to " + goal ); - self.zombie_path_timer += 100; - self setgoalpos( goal ); - - self waittill( "bad_path" ); - - debug_print( "Zombie couldn't path to breadcrumb at " + goal + " Finding next breadcrumb" ); - - for ( i = 0; i < crumb_list.size; i++ ) - { - if ( goal == crumb_list[i] ) - { - bad_crumbs[bad_crumbs.size] = i; - break; - } - } - } + */ + self._skip_pathing_first_delay = 1; + self thread zombie_follow_enemy(); + self waittill( "bad_path" ); + level.zombie_pathing_failed++; + if ( isDefined( self.enemyoverride ) ) + { + //debug_print( "Zombie couldn't path to point of interest at origin: " + self.enemyoverride[ 0 ] + " Falling back to breadcrumb system" ); + if ( isDefined( self.enemyoverride[ 1 ] ) ) + { + self.enemyoverride = self.enemyoverride[ 1 ] invalidate_attractor_pos( self.enemyoverride, self ); + self.zombie_path_timer = 0; + return; + } + } + else if ( isDefined( self.favoriteenemy ) ) + { + //debug_print( "Zombie couldn't path to player at origin: " + self.favoriteenemy.origin + " Falling back to breadcrumb system" ); + } + else + { + //debug_print( "Zombie couldn't path to a player ( the other 'prefered' player might be ignored for encounters mode ). Falling back to breadcrumb system" ); + } + if ( !isDefined( self.favoriteenemy ) ) + { + self.zombie_path_timer = 0; + return; + } + else + { + self.favoriteenemy endon( "disconnect" ); + } + players = get_players(); + valid_player_num = 0; + for ( i = 0; i < players.size; i++ ) + { + if ( is_player_valid( players[ i ], 1 ) ) + { + valid_player_num += 1; + } + } + if ( players.size > 1 ) + { + if ( isDefined( level._should_skip_ignore_player_logic ) && [[ level._should_skip_ignore_player_logic ]]() ) + { + self.zombie_path_timer = 0; + return; + } + if ( array_check_for_dupes( self.ignore_player, self.favoriteenemy ) ) + { + self.ignore_player[ self.ignore_player.size ] = self.favoriteenemy; + } + if ( self.ignore_player.size < valid_player_num ) + { + self.zombie_path_timer = 0; + return; + } + } + crumb_list = self.favoriteenemy.zombie_breadcrumbs; + bad_crumbs = []; + while ( 1 ) + { + if ( !is_player_valid( self.favoriteenemy, 1 ) ) + { + self.zombie_path_timer = 0; + return; + } + goal = zombie_pathing_get_breadcrumb( self.favoriteenemy.origin, crumb_list, bad_crumbs, randomint( 100 ) < 20 ); + if ( !isDefined( goal ) ) + { + //debug_print( "Zombie exhausted breadcrumb search" ); + level.zombie_breadcrumb_failed++; + goal = self.favoriteenemy.spectator_respawn.origin; + } + //debug_print( "Setting current breadcrumb to " + goal ); + self.zombie_path_timer += 100; + self setgoalpos( goal ); + self waittill( "bad_path" ); + //debug_print( "Zombie couldn't path to breadcrumb at " + goal + " Finding next breadcrumb" ); + for ( i = 0; i < crumb_list.size; i++ ) + { + if ( goal == crumb_list[ i ] ) + { + bad_crumbs[ bad_crumbs.size ] = i; + break; + } + } + } } -zombie_pathing_get_breadcrumb( origin, breadcrumbs, bad_crumbs, pick_random ) +zombie_pathing_get_breadcrumb( origin, breadcrumbs, bad_crumbs, pick_random ) //checked changed to match cerberus output { +/* /# - assert( isdefined( origin ) ); + assert( isDefined( origin ) ); #/ /# - assert( isdefined( breadcrumbs ) ); + assert( isDefined( breadcrumbs ) ); #/ /# - assert( isarray( breadcrumbs ) ); + assert( isarray( breadcrumbs ) ); #/ /# - if ( pick_random ) - debug_print( "Finding random breadcrumb" ); + if ( pick_random ) + { + debug_print( "Finding random breadcrumb" ); #/ - for ( i = 0; i < breadcrumbs.size; i++ ) - { - if ( pick_random ) - crumb_index = randomint( breadcrumbs.size ); - else - crumb_index = i; - - if ( crumb_is_bad( crumb_index, bad_crumbs ) ) - continue; - - return breadcrumbs[crumb_index]; - } - - return undefined; + } +*/ + i = 0; + while ( i < breadcrumbs.size ) + { + if ( pick_random ) + { + crumb_index = randomint( breadcrumbs.size ); + } + else + { + crumb_index = i; + } + if ( crumb_is_bad( crumb_index, bad_crumbs ) ) + { + i++; + continue; + } + i++; + return breadcrumbs[ crumb_index ]; + } + return undefined; } -crumb_is_bad( crumb, bad_crumbs ) +crumb_is_bad( crumb, bad_crumbs ) //checked changed to match cerberus output { - for ( i = 0; i < bad_crumbs.size; i++ ) - { - if ( bad_crumbs[i] == crumb ) - return true; - } - - return false; + for ( i = 0; i < bad_crumbs.size; i++ ) + { + if ( bad_crumbs[ i ] == crumb ) + { + return 1; + } + } + return 0; } -jitter_enemies_bad_breadcrumbs( start_crumb ) +jitter_enemies_bad_breadcrumbs( start_crumb ) //checked changed to match cerberus output { - trace_distance = 35; - jitter_distance = 2; - index = start_crumb; - - while ( isdefined( self.favoriteenemy.zombie_breadcrumbs[index + 1] ) ) - { - current_crumb = self.favoriteenemy.zombie_breadcrumbs[index]; - next_crumb = self.favoriteenemy.zombie_breadcrumbs[index + 1]; - angles = vectortoangles( current_crumb - next_crumb ); - right = anglestoright( angles ); - left = anglestoright( angles + vectorscale( ( 0, 1, 0 ), 180.0 ) ); - dist_pos = current_crumb + vectorscale( right, trace_distance ); - trace = bullettrace( current_crumb, dist_pos, 1, undefined ); - vector = trace["position"]; - - if ( distance( vector, current_crumb ) < 17 ) - { - self.favoriteenemy.zombie_breadcrumbs[index] = current_crumb + vectorscale( left, jitter_distance ); - continue; - } - - dist_pos = current_crumb + vectorscale( left, trace_distance ); - trace = bullettrace( current_crumb, dist_pos, 1, undefined ); - vector = trace["position"]; - - if ( distance( vector, current_crumb ) < 17 ) - { - self.favoriteenemy.zombie_breadcrumbs[index] = current_crumb + vectorscale( right, jitter_distance ); - continue; - } - - index++; - } + trace_distance = 35; + jitter_distance = 2; + index = start_crumb; + while ( isDefined( self.favoriteenemy.zombie_breadcrumbs[ index + 1 ] ) ) + { + current_crumb = self.favoriteenemy.zombie_breadcrumbs[ index ]; + next_crumb = self.favoriteenemy.zombie_breadcrumbs[ index + 1 ]; + angles = vectorToAngles( current_crumb - next_crumb ); + right = anglesToRight( angles ); + left = anglesToRight( angles + vectorScale( ( 0, 1, 0 ), 180 ) ); + dist_pos = current_crumb + vectorScale( right, trace_distance ); + trace = bullettrace( current_crumb, dist_pos, 1, undefined ); + vector = trace[ "position" ]; + if ( distance( vector, current_crumb ) < 17 ) + { + self.favoriteenemy.zombie_breadcrumbs[ index ] = current_crumb + vectorScale( left, jitter_distance ); + continue; + } + dist_pos = current_crumb + vectorScale( left, trace_distance ); + trace = bullettrace( current_crumb, dist_pos, 1, undefined ); + vector = trace[ "position" ]; + if ( distance( vector, current_crumb ) < 17 ) + { + self.favoriteenemy.zombie_breadcrumbs[ index ] = current_crumb + vectorScale( right, jitter_distance ); + continue; + } + index++; + } } -zombie_repath_notifier() +zombie_repath_notifier() //checked changed to match cerberus output { - note = 0; - notes = []; - - for ( i = 0; i < 4; i++ ) - notes[notes.size] = "zombie_repath_notify_" + i; - - while ( true ) - { - level notify( notes[note] ); - note = ( note + 1 ) % 4; - wait 0.05; - } + note = 0; + notes = []; + for ( i = 0; i < 4; i++ ) + { + notes[ notes.size ] = "zombie_repath_notify_" + i; + } + while ( 1 ) + { + level notify( notes[ note ] ); + note = ( note + 1 ) % 4; + wait 0.05; + } } -zombie_follow_enemy() +zombie_follow_enemy() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "zombie_acquire_enemy" ); - self endon( "bad_path" ); - level endon( "intermission" ); - - if ( !isdefined( level.repathnotifierstarted ) ) - { - level.repathnotifierstarted = 1; - level thread zombie_repath_notifier(); - } - - if ( !isdefined( self.zombie_repath_notify ) ) - self.zombie_repath_notify = "zombie_repath_notify_" + self getentitynumber() % 4; - - while ( true ) - { - if ( !isdefined( self._skip_pathing_first_delay ) ) - level waittill( self.zombie_repath_notify ); - else - self._skip_pathing_first_delay = undefined; - - if ( !( isdefined( self.ignore_enemyoverride ) && self.ignore_enemyoverride ) && isdefined( self.enemyoverride ) && isdefined( self.enemyoverride[1] ) ) - { - if ( distancesquared( self.origin, self.enemyoverride[0] ) > 1 ) - self orientmode( "face motion" ); - else - self orientmode( "face point", self.enemyoverride[1].origin ); - - self.ignoreall = 1; - goalpos = self.enemyoverride[0]; - - if ( isdefined( level.adjust_enemyoverride_func ) ) - goalpos = self [[ level.adjust_enemyoverride_func ]](); - - self setgoalpos( goalpos ); - } - else if ( isdefined( self.favoriteenemy ) ) - { - self.ignoreall = 0; - self orientmode( "face default" ); - goalpos = self.favoriteenemy.origin; - - if ( isdefined( level.enemy_location_override_func ) ) - goalpos = [[ level.enemy_location_override_func ]]( self, self.favoriteenemy ); - - self setgoalpos( goalpos ); - - if ( !isdefined( level.ignore_path_delays ) ) - { - distsq = distancesquared( self.origin, self.favoriteenemy.origin ); - - if ( distsq > 10240000 ) - wait( 2.0 + randomfloat( 1.0 ) ); - else if ( distsq > 4840000 ) - wait( 1.0 + randomfloat( 0.5 ) ); - else if ( distsq > 1440000 ) - wait( 0.5 + randomfloat( 0.5 ) ); - } - } - - if ( isdefined( level.inaccesible_player_func ) ) - self [[ level.inaccessible_player_func ]](); - } + self endon( "death" ); + self endon( "zombie_acquire_enemy" ); + self endon( "bad_path" ); + level endon( "intermission" ); + if ( !isDefined( level.repathnotifierstarted ) ) + { + level.repathnotifierstarted = 1; + level thread zombie_repath_notifier(); + } + if ( !isDefined( self.zombie_repath_notify ) ) + { + self.zombie_repath_notify = "zombie_repath_notify_" + self getentitynumber() % 4; + } + while ( 1 ) + { + if ( !isDefined( self._skip_pathing_first_delay ) ) + { + level waittill( self.zombie_repath_notify ); + } + else + { + self._skip_pathing_first_delay = undefined; + } + if ( !is_true( self.ignore_enemyoverride ) && isDefined( self.enemyoverride ) && isDefined( self.enemyoverride[ 1 ] ) ) + { + if ( distancesquared( self.origin, self.enemyoverride[ 0 ] ) > 1 ) + { + self orientmode( "face motion" ); + } + else + { + self orientmode( "face point", self.enemyoverride[ 1 ].origin ); + } + self.ignoreall = 1; + goalpos = self.enemyoverride[ 0 ]; + if ( isDefined( level.adjust_enemyoverride_func ) ) + { + goalpos = self [[ level.adjust_enemyoverride_func ]](); + } + self setgoalpos( goalpos ); + } + else if ( isDefined( self.favoriteenemy ) ) + { + self.ignoreall = 0; + self orientmode( "face default" ); + goalpos = self.favoriteenemy.origin; + if ( isDefined( level.enemy_location_override_func ) ) + { + goalpos = [[ level.enemy_location_override_func ]]( self, self.favoriteenemy ); + } + self setgoalpos( goalpos ); + if ( !isDefined( level.ignore_path_delays ) ) + { + distsq = distancesquared( self.origin, self.favoriteenemy.origin ); + if ( distsq > 10240000 ) + { + wait ( 2 + randomfloat( 1 ) ); + } + else if ( distsq > 4840000 ) + { + wait ( 1 + randomfloat( 0.5 ) ); + } + else if ( distsq > 1440000 ) + { + wait ( 0.5 + randomfloat( 0.5 ) ); + } + } + } + if ( isDefined( level.inaccesible_player_func ) ) + { + self [[ level.inaccessible_player_func ]](); + } + } } -zombie_eye_glow() +zombie_eye_glow() //checked matches cerberus output { - if ( !isdefined( self ) ) - return; - - if ( !isdefined( self.no_eye_glow ) || !self.no_eye_glow ) - self setclientfield( "zombie_has_eyes", 1 ); + if ( !isDefined( self ) ) + { + return; + } + if ( !is_true( self.no_eye_glow ) ) + { + self setclientfield( "zombie_has_eyes", 1 ); + } } -zombie_eye_glow_stop() +zombie_eye_glow_stop() //checked matches cerberus output { - if ( !isdefined( self ) ) - return; - - if ( !isdefined( self.no_eye_glow ) || !self.no_eye_glow ) - self setclientfield( "zombie_has_eyes", 0 ); + if ( !isDefined( self ) ) + { + return; + } + if ( !is_true( self.no_eye_glow ) ) + { + self setclientfield( "zombie_has_eyes", 0 ); + } } -zombie_history( msg ) +zombie_history( msg ) //dev call did not check { +/* /# - if ( !isdefined( self.zombie_history ) || 32 <= self.zombie_history.size ) - self.zombie_history = []; - - self.zombie_history[self.zombie_history.size] = msg; + if ( !isDefined( self.zombie_history ) || self.zombie_history.size > 32 ) + { + self.zombie_history = []; + } + self.zombie_history[ self.zombie_history.size ] = msg; #/ +*/ } -do_zombie_spawn() +do_zombie_spawn() //checked changed to match cerberus output { - self endon( "death" ); - spots = []; - - if ( isdefined( self._rise_spot ) ) - { - spot = self._rise_spot; - self thread do_zombie_rise( spot ); - return; - } - - if ( isdefined( level.zombie_spawn_locations ) ) - { - for ( i = 0; i < level.zombie_spawn_locations.size; i++ ) - { - if ( isdefined( level.use_multiple_spawns ) && level.use_multiple_spawns && isdefined( self.script_int ) ) - { - if ( !( isdefined( level.spawner_int ) && level.spawner_int == self.script_int ) && !( isdefined( level.zombie_spawn_locations[i].script_int ) || isdefined( level.zones[level.zombie_spawn_locations[i].zone_name].script_int ) ) ) - continue; - - if ( isdefined( level.zombie_spawn_locations[i].script_int ) && level.zombie_spawn_locations[i].script_int != self.script_int ) - continue; - else if ( isdefined( level.zones[level.zombie_spawn_locations[i].zone_name].script_int ) && level.zones[level.zombie_spawn_locations[i].zone_name].script_int != self.script_int ) - continue; - } - - spots[spots.size] = level.zombie_spawn_locations[i]; - } - } + self endon( "death" ); + spots = []; + if ( isDefined( self._rise_spot ) ) + { + spot = self._rise_spot; + self thread do_zombie_rise( spot ); + return; + } + if ( isDefined( level.zombie_spawn_locations ) ) + { + i = 0; + while ( i < level.zombie_spawn_locations.size ) + { + if ( is_true( level.use_multiple_spawns ) && isDefined( self.script_int ) ) + { + if ( isDefined( level.spawner_int ) && self.script_int == level.spawner_int && ( !isDefined( level.zombie_spawn_locations[ i ].script_int ) || !isDefined( level.zones[ level.zombie_spawn_locations[ i ].zone_name ].script_int ) ) ) + { + i++; + continue; + } + if ( isDefined( level.zombie_spawn_locations[ i ].script_int ) && level.zombie_spawn_locations[ i ].script_int != self.script_int ) + { + i++; + continue; + } + if ( isDefined( level.zones[ level.zombie_spawn_locations[ i ].zone_name ].script_int ) && level.zones[ level.zombie_spawn_locations[ i ].zone_name ].script_int != self.script_int ) + { + i++; + continue; + } + } + spots[ spots.size ] = level.zombie_spawn_locations[ i ]; + i++; + } + } + /* /# - if ( getdvarint( _hash_A8C231AA ) ) - { - if ( isdefined( level.zombie_spawn_locations ) ) - { - player = get_players()[0]; - spots = []; - - for ( i = 0; i < level.zombie_spawn_locations.size; i++ ) - { - player_vec = vectornormalize( anglestoforward( player.angles ) ); - player_spawn = vectornormalize( level.zombie_spawn_locations[i].origin - player.origin ); - dot = vectordot( player_vec, player_spawn ); - - if ( dot > 0.707 ) - { - spots[spots.size] = level.zombie_spawn_locations[i]; - debugstar( level.zombie_spawn_locations[i].origin, 1000, ( 1, 1, 1 ) ); - } - } - - if ( spots.size <= 0 ) - { - spots[spots.size] = level.zombie_spawn_locations[0]; - iprintln( "no spawner in view" ); - } - } - } + if ( getDvarInt( #"A8C231AA" ) ) + { + if ( isDefined( level.zombie_spawn_locations ) ) + { + player = get_players()[ 0 ]; + spots = []; + i = 0; + while ( i < level.zombie_spawn_locations.size ) + { + player_vec = vectornormalize( anglesToForward( player.angles ) ); + player_spawn = vectornormalize( level.zombie_spawn_locations[ i ].origin - player.origin ); + dot = vectordot( player_vec, player_spawn ); + if ( dot > 0,707 ) + { + spots[ spots.size ] = level.zombie_spawn_locations[ i ]; + debugstar( level.zombie_spawn_locations[ i ].origin, 1000, ( 0, 0, 0 ) ); + } + i++; + } + if ( spots.size <= 0 ) + { + spots[ spots.size ] = level.zombie_spawn_locations[ 0 ]; + iprintln( "no spawner in view" ); #/ + } + } + } + */ + /* /# - assert( spots.size > 0, "No spawn locations found" ); + assert( spots.size > 0, "No spawn locations found" ); #/ - spot = random( spots ); - self.spawn_point = spot; + */ + spot = random( spots ); + self.spawn_point = spot; + /* /# - if ( isdefined( level.toggle_show_spawn_locations ) && level.toggle_show_spawn_locations ) - { - debugstar( spot.origin, getdvarint( _hash_BB9101B2 ), ( 0, 1, 0 ) ); - host_player = gethostplayer(); - distance = distance( spot.origin, host_player.origin ); - iprintln( "Distance to player: " + distance / 12 + "feet" ); - } + if ( is_true( level.toggle_show_spawn_locations ) ) + { + debugstar( spot.origin, getDvarInt( #"BB9101B2" ), ( 0, 0, 0 ) ); + host_player = gethostplayer(); + distance = distance( spot.origin, host_player.origin ); + iprintln( "Distance to player: " + ( distance / 12 ) + "feet" ); #/ - if ( isdefined( spot.target ) ) - self.target = spot.target; - - if ( isdefined( spot.zone_name ) ) - self.zone_name = spot.zone_name; - - if ( isdefined( spot.script_parameters ) ) - self.script_parameters = spot.script_parameters; - - tokens = strtok( spot.script_noteworthy, " " ); - - foreach ( index, token in tokens ) - { - if ( isdefined( self.spawn_point_override ) ) - { - spot = self.spawn_point_override; - token = spot.script_noteworthy; - } - - if ( token == "custom_spawner_entry" ) - { - next_token = index + 1; - - if ( isdefined( tokens[next_token] ) ) - { - str_spawn_entry = tokens[next_token]; - - if ( isdefined( level.custom_spawner_entry ) && isdefined( level.custom_spawner_entry[str_spawn_entry] ) ) - { - self thread [[ level.custom_spawner_entry[str_spawn_entry] ]]( spot ); - continue; - } - } - } - - if ( token == "riser_location" ) - { - self thread do_zombie_rise( spot ); - continue; - } - - if ( token == "faller_location" ) - { - self thread maps\mp\zombies\_zm_ai_faller::do_zombie_fall( spot ); - continue; - } - - if ( token == "dog_location" ) - { - continue; - continue; - } - - if ( token == "screecher_location" ) - { - continue; - continue; - } - - if ( token == "leaper_location" ) - { - continue; - continue; - } - - if ( isdefined( self.anchor ) ) - return; - - self.anchor = spawn( "script_origin", self.origin ); - self.anchor.angles = self.angles; - self linkto( self.anchor ); - - if ( !isdefined( spot.angles ) ) - spot.angles = ( 0, 0, 0 ); - - self ghost(); - self.anchor moveto( spot.origin, 0.05 ); - - self.anchor waittill( "movedone" ); - - target_org = get_desired_origin(); - - if ( isdefined( target_org ) ) - { - anim_ang = vectortoangles( target_org - self.origin ); - self.anchor rotateto( ( 0, anim_ang[1], 0 ), 0.05 ); - - self.anchor waittill( "rotatedone" ); - } - - if ( isdefined( level.zombie_spawn_fx ) ) - playfx( level.zombie_spawn_fx, spot.origin ); - - self unlink(); - - if ( isdefined( self.anchor ) ) - self.anchor delete(); - - self show(); - self notify( "risen", spot.script_string ); - } + } + */ + if ( isDefined( spot.target ) ) + { + self.target = spot.target; + } + if ( isDefined( spot.zone_name ) ) + { + self.zone_name = spot.zone_name; + } + if ( isDefined( spot.script_parameters ) ) + { + self.script_parameters = spot.script_parameters; + } + tokens = strtok( spot.script_noteworthy, " " ); + i = 0; + while ( i < tokens.size ) + { + if ( isdefined( self.spawn_point_override ) ) + { + spot = self.spawn_point_override; + tokens[ i ] = spot.script_noteworthy; + } + if ( tokens[ i ] == "custom_spawner_entry" ) + { + if ( isdefined( tokens[ i ] ) ) + { + str_spawn_entry = tokens[ i ]; + if ( isdefined( level.custom_spawner_entry ) && isdefined( level.custom_spawner_entry[ str_spawn_entry ] ) ) + { + self thread [[ level.custom_spawner_entry[ str_spawn_entry ] ]](spot); + i++; + continue; + } + } + } + if ( tokens[ i ] == "riser_location" ) + { + self thread do_zombie_rise( spot ); + i++; + continue; + } + if ( tokens[ i ] == "faller_location" ) + { + self thread maps/mp/zombies/_zm_ai_faller::do_zombie_fall( spot ); + i++; + continue; + } + if ( tokens[ i ] == "dog_location" ) + { + i++; + continue; + } + if ( tokens[ i ] == "screecher_location" ) + { + i++; + continue; + } + if ( tokens[ i ] == "leaper_location" ) + { + i++; + continue; + } + if ( isdefined(self.anchor ) ) + { + i++; + return; + } + self.anchor = spawn( "script_origin", self.origin ); + self.anchor.angles = self.angles; + self linkto( self.anchor ); + if ( !isDefined( spot.angles ) ) + { + spot.angles = ( 0, 0, 0 ); + } + self ghost(); + self.anchor moveto( spot.origin, 0.05 ); + self.anchor waittill( "movedone" ); + target_org = get_desired_origin(); + if ( isDefined( target_org ) ) + { + anim_ang = vectorToAngles( target_org - self.origin ); + self.anchor rotateto( ( 0, anim_ang[ 1 ], 0 ), 0.05 ); + self.anchor waittill( "rotatedone" ); + } + if ( isDefined( level.zombie_spawn_fx ) ) + { + playfx( level.zombie_spawn_fx, spot.origin ); + } + self unlink(); + if ( isDefined( self.anchor ) ) + { + self.anchor delete(); + } + self show(); + self notify( "risen", spot.script_string ); + i++; + } } -do_zombie_rise( spot ) +do_zombie_rise( spot ) //checked changed to match cerberus output { - self endon( "death" ); - self.in_the_ground = 1; - - if ( isdefined( self.anchor ) ) - self.anchor delete(); - - self.anchor = spawn( "script_origin", self.origin ); - self.anchor.angles = self.angles; - self linkto( self.anchor ); - - if ( !isdefined( spot.angles ) ) - spot.angles = ( 0, 0, 0 ); - - anim_org = spot.origin; - anim_ang = spot.angles; - anim_org += ( 0, 0, 0 ); - self ghost(); - self.anchor moveto( anim_org, 0.05 ); - - self.anchor waittill( "movedone" ); - - target_org = get_desired_origin(); - - if ( isdefined( target_org ) ) - { - anim_ang = vectortoangles( target_org - self.origin ); - self.anchor rotateto( ( 0, anim_ang[1], 0 ), 0.05 ); - - self.anchor waittill( "rotatedone" ); - } - - self unlink(); - - if ( isdefined( self.anchor ) ) - self.anchor delete(); - - self thread hide_pop(); - level thread zombie_rise_death( self, spot ); - spot thread zombie_rise_fx( self ); - substate = 0; - - if ( self.zombie_move_speed == "walk" ) - substate = randomint( 2 ); - else if ( self.zombie_move_speed == "run" ) - substate = 2; - else if ( self.zombie_move_speed == "sprint" ) - substate = 3; - - self orientmode( "face default" ); - self animscripted( self.origin, spot.angles, "zm_rise", substate ); - self maps\mp\animscripts\zm_shared::donotetracks( "rise_anim", ::handle_rise_notetracks, spot ); - self notify( "rise_anim_finished" ); - spot notify( "stop_zombie_rise_fx" ); - self.in_the_ground = 0; - self notify( "risen", spot.script_string ); + self endon( "death" ); + self.in_the_ground = 1; + if ( isDefined( self.anchor ) ) + { + self.anchor delete(); + } + self.anchor = spawn( "script_origin", self.origin ); + self.anchor.angles = self.angles; + self linkto( self.anchor ); + if ( !isDefined( spot.angles ) ) + { + spot.angles = ( 0, 0, 0 ); + } + anim_org = spot.origin; + anim_ang = spot.angles; + anim_org += ( 0, 0, 0 ); + self ghost(); + self.anchor moveto( anim_org, 0.05 ); + self.anchor waittill( "movedone" ); + target_org = get_desired_origin(); + if ( isDefined( target_org ) ) + { + anim_ang = vectorToAngles( target_org - self.origin ); + self.anchor rotateto( ( 0, anim_ang[ 1 ], 0 ), 0.05 ); + self.anchor waittill( "rotatedone" ); + } + self unlink(); + if ( isDefined( self.anchor ) ) + { + self.anchor delete(); + } + self thread hide_pop(); + level thread zombie_rise_death( self, spot ); + spot thread zombie_rise_fx( self ); + substate = 0; + if ( self.zombie_move_speed == "walk" ) + { + substate = randomint( 2 ); + } + else if ( self.zombie_move_speed == "run" ) + { + substate = 2; + } + else if ( self.zombie_move_speed == "sprint" ) + { + substate = 3; + } + self orientmode( "face default" ); + self animscripted( self.origin, spot.angles, "zm_rise", substate ); + self maps/mp/animscripts/zm_shared::donotetracks( "rise_anim", ::handle_rise_notetracks, spot ); + self notify( "rise_anim_finished" ); + spot notify( "stop_zombie_rise_fx" ); + self.in_the_ground = 0; + self notify( "risen", spot.script_string ); } -hide_pop() +hide_pop() //checked matches cerberus output { - self endon( "death" ); - wait 0.5; - - if ( isdefined( self ) ) - { - self show(); - wait_network_frame(); - - if ( isdefined( self ) ) - self.create_eyes = 1; - } + self endon( "death" ); + wait 0.5; + if ( isDefined( self ) ) + { + self show(); + wait_network_frame(); + if ( isDefined( self ) ) + { + self.create_eyes = 1; + } + } } -handle_rise_notetracks( note, spot ) +handle_rise_notetracks( note, spot ) //checked matches cerberus output { - if ( note == "deathout" || note == "deathhigh" ) - { - self.zombie_rise_death_out = 1; - self notify( "zombie_rise_death_out" ); - wait 2; - spot notify( "stop_zombie_rise_fx" ); - } + if ( note == "deathout" || note == "deathhigh" ) + { + self.zombie_rise_death_out = 1; + self notify( "zombie_rise_death_out" ); + wait 2; + spot notify( "stop_zombie_rise_fx" ); + } } -zombie_rise_death( zombie, spot ) +zombie_rise_death( zombie, spot ) //checked matches cerberus output { - zombie.zombie_rise_death_out = 0; - zombie endon( "rise_anim_finished" ); - - while ( isdefined( zombie ) && isdefined( zombie.health ) && zombie.health > 1 ) - zombie waittill( "damage", amount ); - - spot notify( "stop_zombie_rise_fx" ); - - if ( isdefined( zombie ) ) - { - zombie.deathanim = zombie get_rise_death_anim(); - zombie stopanimscripted(); - } + zombie.zombie_rise_death_out = 0; + zombie endon( "rise_anim_finished" ); + while ( isDefined( zombie ) && isDefined( zombie.health ) && zombie.health > 1 ) + { + zombie waittill( "damage", amount ); + } + spot notify( "stop_zombie_rise_fx" ); + if ( isDefined( zombie ) ) + { + zombie.deathanim = zombie get_rise_death_anim(); + zombie stopanimscripted(); + } } -zombie_rise_fx( zombie ) +zombie_rise_fx( zombie ) //checked matches cerberus output { - if ( !( isdefined( level.riser_fx_on_client ) && level.riser_fx_on_client ) ) - { - self thread zombie_rise_dust_fx( zombie ); - self thread zombie_rise_burst_fx( zombie ); - } - else - self thread zombie_rise_burst_fx( zombie ); - - zombie endon( "death" ); - self endon( "stop_zombie_rise_fx" ); - wait 1; - - if ( zombie.zombie_move_speed != "sprint" ) - wait 1; + if ( !is_true( level.riser_fx_on_client ) ) + { + self thread zombie_rise_dust_fx( zombie ); + self thread zombie_rise_burst_fx( zombie ); + } + else + { + self thread zombie_rise_burst_fx( zombie ); + } + zombie endon( "death" ); + self endon( "stop_zombie_rise_fx" ); + wait 1; + if ( zombie.zombie_move_speed != "sprint" ) + { + wait 1; + } } -zombie_rise_burst_fx( zombie ) +zombie_rise_burst_fx( zombie ) //checked changed to match cerberus output { - self endon( "stop_zombie_rise_fx" ); - self endon( "rise_anim_finished" ); - - if ( isdefined( self.script_parameters ) && self.script_parameters == "in_water" && !( isdefined( level._no_water_risers ) && level._no_water_risers ) ) - zombie setclientfield( "zombie_riser_fx_water", 1 ); - else if ( isdefined( self.script_parameters ) && self.script_parameters == "in_foliage" && ( isdefined( level._foliage_risers ) && level._foliage_risers ) ) - zombie setclientfield( "zombie_riser_fx_foliage", 1 ); - else if ( isdefined( self.script_parameters ) && self.script_parameters == "in_snow" ) - zombie setclientfield( "zombie_riser_fx", 1 ); - else if ( isdefined( zombie.zone_name ) && isdefined( level.zones[zombie.zone_name] ) ) - { - low_g_zones = getentarray( zombie.zone_name, "targetname" ); - - if ( isdefined( low_g_zones[0].script_string ) && low_g_zones[0].script_string == "lowgravity" ) - zombie setclientfield( "zombie_riser_fx_lowg", 1 ); - else - zombie setclientfield( "zombie_riser_fx", 1 ); - } - else - zombie setclientfield( "zombie_riser_fx", 1 ); + self endon( "stop_zombie_rise_fx" ); + self endon( "rise_anim_finished" ); + if ( isDefined( self.script_parameters ) && self.script_parameters == "in_water" && !is_true( level._no_water_risers ) ) + { + zombie setclientfield( "zombie_riser_fx_water", 1 ); + } + else if ( isDefined( self.script_parameters ) && self.script_parameters == "in_foliage" && is_true( level._foliage_risers ) ) + { + zombie setclientfield( "zombie_riser_fx_foliage", 1 ); + return; + } + else if ( isDefined( self.script_parameters ) && self.script_parameters == "in_snow" ) + { + zombie setclientfield( "zombie_riser_fx", 1 ); + return; + } + else if ( isDefined( zombie.zone_name ) && isDefined( level.zones[ zombie.zone_name ] ) ) + { + low_g_zones = getentarray( zombie.zone_name, "targetname" ); + if ( isDefined( low_g_zones[ 0 ].script_string ) && low_g_zones[ 0 ].script_string == "lowgravity" ) + { + zombie setclientfield( "zombie_riser_fx_lowg", 1 ); + } + else + { + zombie setclientfield( "zombie_riser_fx", 1 ); + } + } + else + { + zombie setclientfield( "zombie_riser_fx", 1 ); + } } -zombie_rise_dust_fx( zombie ) +zombie_rise_dust_fx( zombie ) //checked does not match cerberus output did not change { - dust_tag = "J_SpineUpper"; - self endon( "stop_zombie_rise_dust_fx" ); - self thread stop_zombie_rise_dust_fx( zombie ); - wait 2; - dust_time = 5.5; - dust_interval = 0.3; - - if ( isdefined( self.script_string ) && self.script_string == "in_water" ) - { - for ( t = 0; t < dust_time; t += dust_interval ) - { - playfxontag( level._effect["rise_dust_water"], zombie, dust_tag ); - wait( dust_interval ); - } - } - else if ( isdefined( self.script_string ) && self.script_string == "in_snow" ) - { - for ( t = 0; t < dust_time; t += dust_interval ) - { - playfxontag( level._effect["rise_dust_snow"], zombie, dust_tag ); - wait( dust_interval ); - } - } - else if ( isdefined( self.script_string ) && self.script_string == "in_foliage" ) - { - for ( t = 0; t < dust_time; t += dust_interval ) - { - playfxontag( level._effect["rise_dust_foliage"], zombie, dust_tag ); - wait( dust_interval ); - } - } - else - { - for ( t = 0; t < dust_time; t += dust_interval ) - { - playfxontag( level._effect["rise_dust"], zombie, dust_tag ); - wait( dust_interval ); - } - } + dust_tag = "J_SpineUpper"; + self endon( "stop_zombie_rise_dust_fx" ); + self thread stop_zombie_rise_dust_fx( zombie ); + wait 2; + dust_time = 5.5; + dust_interval = 0.3; + if ( isDefined( self.script_string ) && self.script_string == "in_water" ) + { + t = 0; + while ( t < dust_time ) + { + playfxontag( level._effect[ "rise_dust_water" ], zombie, dust_tag ); + wait dust_interval; + t += dust_interval; + } + } + if ( isDefined( self.script_string ) && self.script_string == "in_snow" ) + { + t = 0; + while ( t < dust_time ) + { + playfxontag( level._effect[ "rise_dust_snow" ], zombie, dust_tag ); + wait dust_interval; + t += dust_interval; + } + } + if ( isDefined( self.script_string ) && self.script_string == "in_foliage" ) + { + t = 0; + while ( t < dust_time ) + { + playfxontag( level._effect[ "rise_dust_foliage" ], zombie, dust_tag ); + wait dust_interval; + t += dust_interval; + } + } + while ( t < dust_time ) + { + playfxontag( level._effect[ "rise_dust" ], zombie, dust_tag ); + wait dust_interval; + t += dust_interval; + } } -stop_zombie_rise_dust_fx( zombie ) +stop_zombie_rise_dust_fx( zombie ) //checked matches cerberus output { - zombie waittill( "death" ); - - self notify( "stop_zombie_rise_dust_fx" ); + zombie waittill( "death" ); + self notify( "stop_zombie_rise_dust_fx" ); } -get_rise_death_anim() +get_rise_death_anim() //checked matches cerberus output { - if ( self.zombie_rise_death_out ) - return "zm_rise_death_out"; - - self.noragdoll = 1; - self.nodeathragdoll = 1; - return "zm_rise_death_in"; + if ( self.zombie_rise_death_out ) + { + return "zm_rise_death_out"; + } + self.noragdoll = 1; + self.nodeathragdoll = 1; + return "zm_rise_death_in"; } -zombie_tesla_head_gib() +zombie_tesla_head_gib() //checked matches cerberus output { - self endon( "death" ); - - if ( self.animname == "quad_zombie" ) - return; - - if ( randomint( 100 ) < level.zombie_vars["tesla_head_gib_chance"] ) - { - wait( randomfloatrange( 0.53, 1.0 ) ); - self zombie_head_gib(); - } - else - network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect["tesla_shock_eyes"], self, "J_Eyeball_LE" ); + self endon( "death" ); + if ( self.animname == "quad_zombie" ) + { + return; + } + if ( randomint( 100 ) < level.zombie_vars[ "tesla_head_gib_chance" ] ) + { + wait randomfloatrange( 0.53, 1 ); + self zombie_head_gib(); + } + else + { + network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect[ "tesla_shock_eyes" ], self, "J_Eyeball_LE" ); + } } -play_ambient_zombie_vocals() +play_ambient_zombie_vocals() //checked changed to match cerberus output { - self endon( "death" ); - - if ( self.animname == "monkey_zombie" || isdefined( self.is_avogadro ) && self.is_avogadro ) - return; - - while ( true ) - { - type = "ambient"; - float = 2; - - if ( !isdefined( self.zombie_move_speed ) ) - { - wait 0.5; - continue; - } - - switch ( self.zombie_move_speed ) - { - case "walk": - type = "ambient"; - float = 4; - break; - case "run": - type = "sprint"; - float = 4; - break; - case "sprint": - type = "sprint"; - float = 4; - break; - } - - if ( self.animname == "zombie" && !self.has_legs ) - type = "crawler"; - else if ( self.animname == "thief_zombie" || self.animname == "leaper_zombie" ) - float = 1.2; - - name = self.animname; - - if ( isdefined( self.sndname ) ) - name = self.sndname; - - self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( type, name ); - wait( randomfloatrange( 1, float ) ); - } + self endon( "death" ); + if ( self.animname == "monkey_zombie" || isDefined( self.is_avogadro ) && self.is_avogadro ) + { + return; + } + while ( 1 ) + { + type = "ambient"; + float = 2; + while ( !isDefined( self.zombie_move_speed ) ) + { + wait 0.5; + } + switch( self.zombie_move_speed ) + { + case "walk": + type = "ambient"; + float = 4; + break; + case "run": + type = "sprint"; + float = 4; + break; + case "sprint": + type = "sprint"; + float = 4; + break; + } + if ( self.animname == "zombie" && !self.has_legs ) + { + type = "crawler"; + } + else if ( self.animname == "thief_zombie" || self.animname == "leaper_zombie" ) + { + float = 1.2; + } + name = self.animname; + if ( isDefined( self.sndname ) ) + { + name = self.sndname; + } + self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( type, name ); + wait randomfloatrange( 1, float ); + } } -zombie_complete_emerging_into_playable_area() +zombie_complete_emerging_into_playable_area() //checked matches cerberus output { - self.completed_emerging_into_playable_area = 1; - self notify( "completed_emerging_into_playable_area" ); - self.no_powerups = 0; - self thread zombie_free_cam_allowed(); + self.completed_emerging_into_playable_area = 1; + self notify( "completed_emerging_into_playable_area" ); + self.no_powerups = 0; + self thread zombie_free_cam_allowed(); } -zombie_free_cam_allowed() +zombie_free_cam_allowed() //checked matches cerberus output { - self endon( "death" ); - wait 1.5; - self setfreecameralockonallowed( 1 ); + self endon( "death" ); + wait 1.5; + self setfreecameralockonallowed( 1 ); } + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_stats.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_stats.gsc index 98c8494..6459e15 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_stats.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_stats.gsc @@ -1,1011 +1,1059 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\gametypes_zm\_globallogic_score; -#include maps\mp\zombies\_zm_pers_upgrades; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\gametypes_zm\_globallogic; +#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() +init() //checked matches cerberus output { - level.player_stats_init = ::player_stats_init; - level.add_client_stat = ::add_client_stat; - level.increment_client_stat = ::increment_client_stat; - level.track_gibs = ::do_stats_for_gibs; + level.player_stats_init = ::player_stats_init; + level.add_client_stat = ::add_client_stat; + level.increment_client_stat = ::increment_client_stat; + level.track_gibs = ::do_stats_for_gibs; } -player_stats_init() +player_stats_init() //checked matches cerberus output { - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "kills", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "suicides", 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( "right_arm_gibs", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "left_arm_gibs", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "right_leg_gibs", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "left_leg_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.totalwins = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "totalwins" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "losses", 0 ); - self.totallosses = self maps\mp\gametypes_zm\_globallogic_score::getpersstat( "totallosses" ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "failed_revives", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "sacrifices", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "failed_sacrifices", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "drops", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "nuke_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "insta_kill_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "full_ammo_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "double_points_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "meat_stink_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "carpenter_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "fire_sale_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zombie_blood_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "time_bomb_ammo_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "use_magicbox", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "grabbed_from_magicbox", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "use_perk_random", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "grabbed_from_perk_random", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "use_pap", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "pap_weapon_grabbed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "pap_weapon_not_grabbed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_armorvest_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_quickrevive_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_rof_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_fastreload_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_flakjacket_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_additionalprimaryweapon_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_longersprint_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_deadshot_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_scavenger_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_finalstand_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_grenadepulldeath_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "specialty_nomotionsensor" + "_drank", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "claymores_planted", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "claymores_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "ballistic_knives_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "wallbuy_weapons_purchased", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "ammo_purchased", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "upgraded_ammo_purchased", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "power_turnedon", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "power_turnedoff", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "planted_buildables_pickedup", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buildables_built", 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( "contaminations_received", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "contaminations_given", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zdogs_killed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zdog_rounds_finished", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zdog_rounds_lost", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "killed_by_zdog", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "screecher_minigames_won", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "screecher_minigames_lost", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "screechers_killed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "screecher_teleporters_used", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "avogadro_defeated", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "killed_by_avogadro", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "cheat_too_many_weapons", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "cheat_out_of_playable", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "cheat_too_friendly", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "cheat_total", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "prison_tomahawk_acquired", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "prison_fan_trap_used", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "prison_acid_trap_used", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "prison_sniper_tower_used", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "prison_ee_good_ending", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "prison_ee_bad_ending", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "prison_ee_spoon_acquired", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "prison_brutus_killed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_lsat_purchased", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_fountain_transporter_used", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_ghost_killed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_ghost_drained_player", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_ghost_perk_acquired", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_booze_given", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_booze_break_barricade", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_given", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_protect", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_build_buildable", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_wallbuy", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_fetch_buildable", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_box_lock", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_box_move", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_box_spin", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_powerup_cycle", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_dance", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_sloth_candy_crawler", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_wallbuy_placed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_wallbuy_placed_ak74u_zm", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_wallbuy_placed_an94_zm", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_wallbuy_placed_pdw57_zm", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_wallbuy_placed_svu_zm", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_wallbuy_placed_tazer_knuckles_zm", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "buried_wallbuy_placed_870mcs_zm", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_mechz_killed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_giant_robot_stomped", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_giant_robot_accessed", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_generator_captured", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_generator_defended", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_generator_lost", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_dig", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_golden_shovel", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_golden_hard_hat", 0 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "tomb_perk_extension", 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_marathon_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_zombie_kiting_counter", 0, 1 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "pers_max_ammo_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\gametypes_zm\_globallogic_score::initpersstat( "pers_last_man_standing_counter", 0, 1 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "pers_reload_speed_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 ); - self maps\mp\gametypes_zm\_globallogic_score::initpersstat( "zteam", 0 ); - - 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 = []; - } + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "kills", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "suicides", 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( "right_arm_gibs", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "left_arm_gibs", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "right_leg_gibs", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "left_leg_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.totalwins = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "totalwins" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "losses", 0 ); + self.totallosses = self maps/mp/gametypes_zm/_globallogic_score::getpersstat( "totallosses" ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "failed_revives", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sacrifices", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "failed_sacrifices", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "drops", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "nuke_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "insta_kill_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "full_ammo_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "double_points_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "meat_stink_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "carpenter_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "fire_sale_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zombie_blood_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "time_bomb_ammo_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "use_magicbox", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "grabbed_from_magicbox", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "use_perk_random", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "grabbed_from_perk_random", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "use_pap", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pap_weapon_grabbed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pap_weapon_not_grabbed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_armorvest_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_quickrevive_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_rof_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_fastreload_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_flakjacket_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_additionalprimaryweapon_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_longersprint_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_deadshot_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_scavenger_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_finalstand_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_grenadepulldeath_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "specialty_nomotionsensor" + "_drank", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "claymores_planted", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "claymores_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "ballistic_knives_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "wallbuy_weapons_purchased", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "ammo_purchased", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "upgraded_ammo_purchased", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "power_turnedon", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "power_turnedoff", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "planted_buildables_pickedup", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buildables_built", 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( "contaminations_received", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "contaminations_given", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zdogs_killed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zdog_rounds_finished", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zdog_rounds_lost", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "killed_by_zdog", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "screecher_minigames_won", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "screecher_minigames_lost", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "screechers_killed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "screecher_teleporters_used", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "avogadro_defeated", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "killed_by_avogadro", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "cheat_too_many_weapons", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "cheat_out_of_playable", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "cheat_too_friendly", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "cheat_total", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "prison_tomahawk_acquired", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "prison_fan_trap_used", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "prison_acid_trap_used", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "prison_sniper_tower_used", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "prison_ee_good_ending", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "prison_ee_bad_ending", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "prison_ee_spoon_acquired", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "prison_brutus_killed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_lsat_purchased", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_fountain_transporter_used", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_ghost_killed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_ghost_drained_player", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_ghost_perk_acquired", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_booze_given", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_booze_break_barricade", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_given", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_protect", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_build_buildable", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_wallbuy", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_fetch_buildable", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_box_lock", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_box_move", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_box_spin", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_powerup_cycle", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_dance", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_sloth_candy_crawler", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_wallbuy_placed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_wallbuy_placed_ak74u_zm", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_wallbuy_placed_an94_zm", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_wallbuy_placed_pdw57_zm", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_wallbuy_placed_svu_zm", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_wallbuy_placed_tazer_knuckles_zm", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "buried_wallbuy_placed_870mcs_zm", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_mechz_killed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_giant_robot_stomped", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_giant_robot_accessed", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_generator_captured", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_generator_defended", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_generator_lost", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_dig", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_golden_shovel", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_golden_hard_hat", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "tomb_perk_extension", 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_marathon_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_zombie_kiting_counter", 0, 1 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_max_ammo_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/gametypes_zm/_globallogic_score::initpersstat( "pers_last_man_standing_counter", 0, 1 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "pers_reload_speed_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 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zteam", 0 ); + 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 ) +update_players_stats_at_match_end( players ) //checked partially matches cerberus output //did not change while loop to for loop to prevent infinite loop continue bug { - 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(); - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( player is_bot() ) - 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" ); - player.pers["matchesHostedStatsTracked"] = undefined; - } - - player.pers["matchesPlayedStatsTracked"] = undefined; - } - } - - 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 ); - } + 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 ) +update_playing_utc_time( matchendutctime ) //checked changed to match cerberus output //order of operations may need to be reviewed { - 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 = ""; + 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 ); - 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 ); - } + } + 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() +survival_classic_custom_stat_update() //checked matches cerberus output { - } -grief_custom_stat_update() -{ - +grief_custom_stat_update() //checked matches cerberus output +{ } -add_game_mode_group_stat( game_mode, stat_name, value ) +add_game_mode_group_stat( game_mode, stat_name, value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self adddstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue", 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 ) +set_game_mode_group_stat( game_mode, stat_name, value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self setdstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue", 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 ) +get_game_mode_group_stat( game_mode, stat_name ) //checked matches cerberus output { - return self getdstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue" ); + return self getdstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue" ); } -add_game_mode_stat( game_mode, stat_name, value ) +add_game_mode_stat( game_mode, stat_name, value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self adddstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue", 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 ) +set_game_mode_stat( game_mode, stat_name, value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self setdstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue", 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 ) +get_game_mode_stat( game_mode, stat_name ) //checked matches cerberus output { - return self getdstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue" ); + return self getdstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue" ); } -get_global_stat( stat_name ) +get_global_stat( stat_name ) //checked matches cerberus output { - return self getdstat( "PlayerStatsList", stat_name, "StatValue" ); + return self getdstat( "PlayerStatsList", stat_name, "StatValue" ); } -set_global_stat( stat_name, value ) +set_global_stat( stat_name, value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self setdstat( "PlayerStatsList", stat_name, "StatValue", value ); + if ( is_true( level.zm_disable_recording_stats ) ) + { + return; + } + self setdstat( "PlayerStatsList", stat_name, "StatValue", value ); } -add_global_stat( stat_name, value ) +add_global_stat( stat_name, value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self adddstat( "PlayerStatsList", stat_name, "StatValue", value ); + if ( is_true( level.zm_disable_recording_stats ) ) + { + return; + } + self adddstat( "PlayerStatsList", stat_name, "StatValue", value ); } -get_map_stat( stat_name, map ) +get_map_stat( stat_name, map ) //checked matches cerberus output { - if ( !isdefined( map ) ) - map = level.script; - - return self getdstat( "PlayerStatsByMap", map, stat_name ); + if ( !isDefined( map ) ) + { + map = level.script; + } + return self getdstat( "PlayerStatsByMap", map, stat_name ); } -set_map_stat( stat_name, value, map ) +set_map_stat( stat_name, value, map ) //checked matches cerberus output { - if ( !isdefined( map ) ) - map = level.script; - - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self setdstat( "PlayerStatsByMap", map, stat_name, value ); + 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 ) +add_map_stat( stat_name, value, map ) //checked matches cerberus output { - if ( !isdefined( map ) ) - map = level.script; - - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self adddstat( "PlayerStatsByMap", map, stat_name, value ); + 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 ) +get_location_gametype_stat( start_location, game_type, stat_name ) //checked matches cerberus output { - return self getdstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue" ); + return self getdstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue" ); } -set_location_gametype_stat( start_location, game_type, stat_name, value ) +set_location_gametype_stat( start_location, game_type, stat_name, value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self setdstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue", 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 ) +add_location_gametype_stat( start_location, game_type, stat_name, value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self adddstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue", 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 ) +get_map_weaponlocker_stat( stat_name, map ) //checked matches cerberus output { - if ( !isdefined( map ) ) - map = level.script; - - return self getdstat( "PlayerStatsByMap", map, "weaponLocker", stat_name ); + if ( !isDefined( map ) ) + { + map = level.script; + } + return self getdstat( "PlayerStatsByMap", map, "weaponLocker", stat_name ); } -set_map_weaponlocker_stat( stat_name, value, map ) +set_map_weaponlocker_stat( stat_name, value, map ) //checked matches cerberus output { - 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 ); + 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 ) +add_map_weaponlocker_stat( stat_name, value, map ) //checked matches cerberus output { - if ( !isdefined( map ) ) - map = level.script; - - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self adddstat( "PlayerStatsByMap", map, "weaponLocker", stat_name, value ); + 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 ) +has_stored_weapondata( map ) //checked changed to match cerberus output { - 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 false; - - return true; + 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 ) +get_stored_weapondata( map ) //checked matches cerberus output { - 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; + 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 ) +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 ); + 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 ) +set_stored_weapondata( weapondata, map ) //checked matches cerberus output { - 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 ); + 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 ) +add_client_stat( stat_name, stat_value, include_gametype ) //checked matches cerberus output { - if ( getdvar( _hash_C955B4CD ) == "" || 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; + 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 ) +increment_player_stat( stat_name ) //checked matches cerberus output { - if ( getdvar( _hash_C955B4CD ) == "" || is_true( level.zm_disable_recording_stats ) ) - return; - - self incrementplayerstat( stat_name, 1 ); + if ( getDvar( "ui_zm_mapstartlocation" ) == "" || is_true( level.zm_disable_recording_stats ) ) + { + return; + } + self incrementplayerstat( stat_name, 1 ); } -increment_root_stat( stat_name, stat_value ) +increment_root_stat( stat_name, stat_value ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self adddstat( stat_name, stat_value ); + if ( is_true( level.zm_disable_recording_stats ) ) + { + return; + } + self adddstat( stat_name, stat_value ); } -increment_client_stat( stat_name, include_gametype ) +increment_client_stat( stat_name, include_gametype ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - add_client_stat( stat_name, 1, include_gametype ); + 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 ) +set_client_stat( stat_name, stat_value, include_gametype ) //checked matches cerberus output { - 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; + 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 ) +zero_client_stat( stat_name, include_gametype ) //checked matches cerberus output { - 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; + 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 ) +increment_map_cheat_stat( stat_name ) //checked matches cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - self adddstat( "PlayerStatsByMap", level.script, "cheats", stat_name, 1 ); + if ( is_true( level.zm_disable_recording_stats ) ) + { + return; + } + self adddstat( "PlayerStatsByMap", level.script, "cheats", stat_name, 1 ); } -get_stat_distance_traveled() +get_stat_distance_traveled() //checked changed to match cerberu output { - 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; + 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; } -get_stat_round_number() +get_stat_round_number() //checked matches cerberus output { - return level.round_number; + return level.round_number; } -get_stat_combined_rank_value_survival_classic() +get_stat_combined_rank_value_survival_classic() //checked matches cerberus output { - rounds = get_stat_round_number(); - kills = self.pers["kills"]; - - if ( rounds > 99 ) - rounds = 99; - - result = rounds * 10000000 + kills; - return result; + rounds = get_stat_round_number(); + kills = self.pers[ "kills" ]; + if ( rounds > 99 ) + { + rounds = 99; + } + result = rounds * 10000000 + kills; + return result; } -get_stat_combined_rank_value_grief() +get_stat_combined_rank_value_grief() //checked matches cerberus output { - wins = self.pers["wins"]; - losses = self.pers["losses"]; - - if ( wins > 9999 ) - wins = 9999; - - if ( losses > 9999 ) - losses = 9999; - - losses_value = 9999 - losses; - result = wins * 10000 + losses_value; - return result; + wins = self.pers[ "wins" ]; + losses = self.pers[ "losses" ]; + if ( wins > 9999 ) + { + wins = 9999; + } + if ( losses > 9999 ) + { + losses = 9999; + } + losses_value = 9999 - losses; + result = wins * 10000 + losses_value; + return result; } -update_global_counters_on_match_end() +update_global_counters_on_match_end() //checked changed to match cerberus output { - if ( is_true( level.zm_disable_recording_stats ) ) - return; - - deaths = 0; - kills = 0; - melee_kills = 0; - headshots = 0; - suicides = 0; - downs = 0; - revives = 0; - perks_drank = 0; - gibs = 0; - doors_purchased = 0; - distance_traveled = 0; - total_shots = 0; - boards = 0; - sacrifices = 0; - drops = 0; - nuke_pickedup = 0; - insta_kill_pickedup = 0; - full_ammo_pickedup = 0; - double_points_pickedup = 0; - meat_stink_pickedup = 0; - carpenter_pickedup = 0; - fire_sale_pickedup = 0; - zombie_blood_pickedup = 0; - use_magicbox = 0; - grabbed_from_magicbox = 0; - use_perk_random = 0; - grabbed_from_perk_random = 0; - use_pap = 0; - pap_weapon_grabbed = 0; - specialty_armorvest_drank = 0; - specialty_quickrevive_drank = 0; - specialty_fastreload_drank = 0; - specialty_longersprint_drank = 0; - specialty_scavenger_drank = 0; - specialty_rof_drank = 0; - specialty_deadshot_drank = 0; - specialty_flakjacket_drank = 0; - specialty_additionalprimaryweapon_drank = 0; - specialty_finalstand_drank = 0; - specialty_grenadepulldeath_drank = 0; - specialty_nomotionsensor_drank = 0; - claymores_planted = 0; - claymores_pickedup = 0; - ballistic_knives_pickedup = 0; - wallbuy_weapons_purchased = 0; - power_turnedon = 0; - power_turnedoff = 0; - planted_buildables_pickedup = 0; - ammo_purchased = 0; - upgraded_ammo_purchased = 0; - buildables_built = 0; - time_played = 0; - contaminations_received = 0; - contaminations_given = 0; - cheat_too_many_weapons = 0; - cheat_out_of_playable_area = 0; - cheat_too_friendly = 0; - cheat_total = 0; - prison_tomahawk_acquired = 0; - prison_fan_trap_used = 0; - prison_acid_trap_used = 0; - prison_sniper_tower_used = 0; - prison_ee_good_ending = 0; - prison_ee_bad_ending = 0; - prison_ee_spoon_acquired = 0; - prison_brutus_killed = 0; - buried_lsat_purchased = 0; - buried_fountain_transporter_used = 0; - buried_ghost_killed = 0; - buried_ghost_drained_player = 0; - buried_ghost_perk_acquired = 0; - buried_sloth_booze_given = 0; - buried_sloth_booze_break_barricade = 0; - buried_sloth_candy_given = 0; - buried_sloth_candy_protect = 0; - buried_sloth_candy_build_buildable = 0; - buried_sloth_candy_wallbuy = 0; - buried_sloth_candy_fetch_buildable = 0; - buried_sloth_candy_box_lock = 0; - buried_sloth_candy_box_move = 0; - buried_sloth_candy_box_spin = 0; - buried_sloth_candy_powerup_cycle = 0; - buried_sloth_candy_dance = 0; - buried_sloth_candy_crawler = 0; - buried_wallbuy_placed = 0; - buried_wallbuy_placed_ak74u_zm = 0; - buried_wallbuy_placed_an94_zm = 0; - buried_wallbuy_placed_pdw57_zm = 0; - buried_wallbuy_placed_svu_zm = 0; - buried_wallbuy_placed_tazer_knuckles_zm = 0; - buried_wallbuy_placed_870mcs_zm = 0; - tomb_mechz_killed = 0; - tomb_giant_robot_stomped = 0; - tomb_giant_robot_accessed = 0; - tomb_generator_captured = 0; - tomb_generator_defended = 0; - tomb_generator_lost = 0; - tomb_dig = 0; - tomb_golden_shovel = 0; - tomb_golden_hard_hat = 0; - tomb_perk_extension = 0; - players = get_players(); - - foreach ( player in players ) - { - deaths += player.pers["deaths"]; - kills += player.pers["kills"]; - headshots += player.pers["headshots"]; - suicides += player.pers["suicides"]; - melee_kills += player.pers["melee_kills"]; - downs += player.pers["downs"]; - revives += player.pers["revives"]; - perks_drank += player.pers["perks_drank"]; - specialty_armorvest_drank += player.pers["specialty_armorvest_drank"]; - specialty_quickrevive_drank += player.pers["specialty_quickrevive_drank"]; - specialty_fastreload_drank += player.pers["specialty_fastreload_drank"]; - specialty_longersprint_drank += player.pers["specialty_longersprint_drank"]; - specialty_rof_drank += player.pers["specialty_rof_drank"]; - specialty_deadshot_drank += player.pers["specialty_deadshot_drank"]; - specialty_scavenger_drank += player.pers["specialty_scavenger_drank"]; - specialty_flakjacket_drank += player.pers["specialty_flakjacket_drank"]; - specialty_additionalprimaryweapon_drank += player.pers["specialty_additionalprimaryweapon_drank"]; - specialty_finalstand_drank += player.pers["specialty_finalstand_drank"]; - specialty_grenadepulldeath_drank += player.pers["specialty_grenadepulldeath_drank"]; - specialty_nomotionsensor_drank += player.pers["specialty_nomotionsensor" + "_drank"]; - gibs += player.pers["gibs"]; - doors_purchased += player.pers["doors_purchased"]; - distance_traveled += player get_stat_distance_traveled(); - boards += player.pers["boards"]; - sacrifices += player.pers["sacrifices"]; - drops += player.pers["drops"]; - nuke_pickedup += player.pers["nuke_pickedup"]; - insta_kill_pickedup += player.pers["insta_kill_pickedup"]; - full_ammo_pickedup += player.pers["full_ammo_pickedup"]; - double_points_pickedup += player.pers["double_points_pickedup"]; - meat_stink_pickedup += player.pers["meat_stink_pickedup"]; - carpenter_pickedup += player.pers["carpenter_pickedup"]; - fire_sale_pickedup += player.pers["fire_sale_pickedup"]; - zombie_blood_pickedup += player.pers["zombie_blood_pickedup"]; - use_magicbox += player.pers["use_magicbox"]; - grabbed_from_magicbox += player.pers["grabbed_from_magicbox"]; - use_perk_random += player.pers["use_perk_random"]; - grabbed_from_perk_random += player.pers["grabbed_from_perk_random"]; - use_pap += player.pers["use_pap"]; - pap_weapon_grabbed += player.pers["pap_weapon_grabbed"]; - claymores_planted += player.pers["claymores_planted"]; - claymores_pickedup += player.pers["claymores_pickedup"]; - ballistic_knives_pickedup += player.pers["ballistic_knives_pickedup"]; - wallbuy_weapons_purchased += player.pers["wallbuy_weapons_purchased"]; - power_turnedon += player.pers["power_turnedon"]; - power_turnedoff += player.pers["power_turnedoff"]; - planted_buildables_pickedup += player.pers["planted_buildables_pickedup"]; - buildables_built += player.pers["buildables_built"]; - ammo_purchased += player.pers["ammo_purchased"]; - upgraded_ammo_purchased += player.pers["upgraded_ammo_purchased"]; - total_shots += player.total_shots; - time_played += player.pers["time_played_total"]; - contaminations_received += player.pers["contaminations_received"]; - contaminations_given += player.pers["contaminations_given"]; - cheat_too_many_weapons += player.pers["cheat_too_many_weapons"]; - cheat_out_of_playable_area += player.pers["cheat_out_of_playable"]; - cheat_too_friendly += player.pers["cheat_too_friendly"]; - cheat_total += player.pers["cheat_total"]; - prison_tomahawk_acquired += player.pers["prison_tomahawk_acquired"]; - prison_fan_trap_used += player.pers["prison_fan_trap_used"]; - prison_acid_trap_used += player.pers["prison_acid_trap_used"]; - prison_sniper_tower_used += player.pers["prison_sniper_tower_used"]; - prison_ee_good_ending += player.pers["prison_ee_good_ending"]; - prison_ee_bad_ending += player.pers["prison_ee_bad_ending"]; - prison_ee_spoon_acquired += player.pers["prison_ee_spoon_acquired"]; - prison_brutus_killed += player.pers["prison_brutus_killed"]; - buried_lsat_purchased += player.pers["buried_lsat_purchased"]; - buried_fountain_transporter_used += player.pers["buried_fountain_transporter_used"]; - buried_ghost_killed += player.pers["buried_ghost_killed"]; - buried_ghost_drained_player += player.pers["buried_ghost_drained_player"]; - buried_ghost_perk_acquired += player.pers["buried_ghost_perk_acquired"]; - buried_sloth_booze_given += player.pers["buried_sloth_booze_given"]; - buried_sloth_booze_break_barricade += player.pers["buried_sloth_booze_break_barricade"]; - buried_sloth_candy_given += player.pers["buried_sloth_candy_given"]; - buried_sloth_candy_protect += player.pers["buried_sloth_candy_protect"]; - buried_sloth_candy_build_buildable += player.pers["buried_sloth_candy_build_buildable"]; - buried_sloth_candy_wallbuy += player.pers["buried_sloth_candy_wallbuy"]; - buried_sloth_candy_fetch_buildable += player.pers["buried_sloth_candy_fetch_buildable"]; - buried_sloth_candy_box_lock += player.pers["buried_sloth_candy_box_lock"]; - buried_sloth_candy_box_move += player.pers["buried_sloth_candy_box_move"]; - buried_sloth_candy_box_spin += player.pers["buried_sloth_candy_box_spin"]; - buried_sloth_candy_powerup_cycle += player.pers["buried_sloth_candy_powerup_cycle"]; - buried_sloth_candy_dance += player.pers["buried_sloth_candy_dance"]; - buried_sloth_candy_crawler += player.pers["buried_sloth_candy_crawler"]; - buried_wallbuy_placed += player.pers["buried_wallbuy_placed"]; - buried_wallbuy_placed_ak74u_zm += player.pers["buried_wallbuy_placed_ak74u_zm"]; - buried_wallbuy_placed_an94_zm += player.pers["buried_wallbuy_placed_an94_zm"]; - buried_wallbuy_placed_pdw57_zm += player.pers["buried_wallbuy_placed_pdw57_zm"]; - buried_wallbuy_placed_svu_zm += player.pers["buried_wallbuy_placed_svu_zm"]; - buried_wallbuy_placed_tazer_knuckles_zm += player.pers["buried_wallbuy_placed_tazer_knuckles_zm"]; - buried_wallbuy_placed_870mcs_zm += player.pers["buried_wallbuy_placed_870mcs_zm"]; - tomb_mechz_killed += player.pers["tomb_mechz_killed"]; - tomb_giant_robot_stomped += player.pers["tomb_giant_robot_stomped"]; - tomb_giant_robot_accessed += player.pers["tomb_giant_robot_accessed"]; - tomb_generator_captured += player.pers["tomb_generator_captured"]; - tomb_generator_defended += player.pers["tomb_generator_defended"]; - tomb_generator_lost += player.pers["tomb_generator_lost"]; - tomb_dig += player.pers["tomb_dig"]; - tomb_golden_shovel += player.pers["tomb_golden_shovel"]; - tomb_golden_hard_hat += player.pers["tomb_golden_hard_hat"]; - tomb_perk_extension += player.pers["tomb_perk_extension"]; - } - - game_mode = getdvar( "ui_gametype" ); - incrementcounter( "global_zm_" + game_mode, 1 ); - incrementcounter( "global_zm_games", 1 ); - - if ( "zclassic" == game_mode || "zm_nuked" == level.script ) - incrementcounter( "global_zm_games_" + level.script, 1 ); - - incrementcounter( "global_zm_killed", level.global_zombies_killed ); - incrementcounter( "global_zm_killed_by_players", kills ); - incrementcounter( "global_zm_killed_by_traps", level.zombie_trap_killed_count ); - incrementcounter( "global_zm_headshots", headshots ); - incrementcounter( "global_zm_suicides", suicides ); - incrementcounter( "global_zm_melee_kills", melee_kills ); - incrementcounter( "global_zm_downs", downs ); - incrementcounter( "global_zm_deaths", deaths ); - incrementcounter( "global_zm_revives", revives ); - incrementcounter( "global_zm_perks_drank", perks_drank ); - incrementcounter( "global_zm_specialty_armorvest_drank", specialty_armorvest_drank ); - incrementcounter( "global_zm_specialty_quickrevive_drank", specialty_quickrevive_drank ); - incrementcounter( "global_zm_specialty_fastreload_drank", specialty_fastreload_drank ); - incrementcounter( "global_zm_specialty_longersprint_drank", specialty_longersprint_drank ); - incrementcounter( "global_zm_specialty_rof_drank", specialty_rof_drank ); - incrementcounter( "global_zm_specialty_deadshot_drank", specialty_deadshot_drank ); - incrementcounter( "global_zm_specialty_scavenger_drank", specialty_scavenger_drank ); - incrementcounter( "global_zm_specialty_flakjacket_drank", specialty_flakjacket_drank ); - incrementcounter( "global_zm_specialty_additionalprimaryweapon_drank", specialty_additionalprimaryweapon_drank ); - incrementcounter( "global_zm_specialty_finalstand_drank", specialty_finalstand_drank ); - incrementcounter( "global_zm_specialty_grenadepulldeath_drank", specialty_grenadepulldeath_drank ); - incrementcounter( "global_zm_" + "specialty_nomotionsensor" + "_drank", specialty_nomotionsensor_drank ); - incrementcounter( "global_zm_gibs", gibs ); - incrementcounter( "global_zm_distance_traveled", int( distance_traveled ) ); - incrementcounter( "global_zm_doors_purchased", doors_purchased ); - incrementcounter( "global_zm_boards", boards ); - incrementcounter( "global_zm_sacrifices", sacrifices ); - incrementcounter( "global_zm_drops", drops ); - incrementcounter( "global_zm_total_nuke_pickedup", nuke_pickedup ); - incrementcounter( "global_zm_total_insta_kill_pickedup", insta_kill_pickedup ); - incrementcounter( "global_zm_total_full_ammo_pickedup", full_ammo_pickedup ); - incrementcounter( "global_zm_total_double_points_pickedup", double_points_pickedup ); - incrementcounter( "global_zm_total_meat_stink_pickedup", double_points_pickedup ); - incrementcounter( "global_zm_total_carpenter_pickedup", carpenter_pickedup ); - incrementcounter( "global_zm_total_fire_sale_pickedup", fire_sale_pickedup ); - incrementcounter( "global_zm_total_zombie_blood_pickedup", zombie_blood_pickedup ); - incrementcounter( "global_zm_use_magicbox", use_magicbox ); - incrementcounter( "global_zm_grabbed_from_magicbox", grabbed_from_magicbox ); - incrementcounter( "global_zm_use_perk_random", use_perk_random ); - incrementcounter( "global_zm_grabbed_from_perk_random", grabbed_from_perk_random ); - incrementcounter( "global_zm_use_pap", use_pap ); - incrementcounter( "global_zm_pap_weapon_grabbed", pap_weapon_grabbed ); - incrementcounter( "global_zm_claymores_planted", claymores_planted ); - incrementcounter( "global_zm_claymores_pickedup", claymores_pickedup ); - incrementcounter( "global_zm_ballistic_knives_pickedup", ballistic_knives_pickedup ); - incrementcounter( "global_zm_wallbuy_weapons_purchased", wallbuy_weapons_purchased ); - incrementcounter( "global_zm_power_turnedon", power_turnedon ); - incrementcounter( "global_zm_power_turnedoff", power_turnedoff ); - incrementcounter( "global_zm_planted_buildables_pickedup", planted_buildables_pickedup ); - incrementcounter( "global_zm_buildables_built", buildables_built ); - incrementcounter( "global_zm_ammo_purchased", ammo_purchased ); - incrementcounter( "global_zm_upgraded_ammo_purchased", upgraded_ammo_purchased ); - incrementcounter( "global_zm_total_shots", total_shots ); - incrementcounter( "global_zm_time_played", time_played ); - incrementcounter( "global_zm_contaminations_received", contaminations_received ); - incrementcounter( "global_zm_contaminations_given", contaminations_given ); - incrementcounter( "global_zm_cheat_players_too_friendly", cheat_too_friendly ); - incrementcounter( "global_zm_cheats_cheat_too_many_weapons", cheat_too_many_weapons ); - incrementcounter( "global_zm_cheats_out_of_playable", cheat_out_of_playable_area ); - incrementcounter( "global_zm_total_cheats", cheat_total ); - incrementcounter( "global_zm_prison_tomahawk_acquired", prison_tomahawk_acquired ); - incrementcounter( "global_zm_prison_fan_trap_used", prison_fan_trap_used ); - incrementcounter( "global_zm_prison_acid_trap_used", prison_acid_trap_used ); - incrementcounter( "global_zm_prison_sniper_tower_used", prison_sniper_tower_used ); - incrementcounter( "global_zm_prison_ee_good_ending", prison_ee_good_ending ); - incrementcounter( "global_zm_prison_ee_bad_ending", prison_ee_bad_ending ); - incrementcounter( "global_zm_prison_ee_spoon_acquired", prison_ee_spoon_acquired ); - incrementcounter( "global_zm_prison_brutus_killed", prison_brutus_killed ); - incrementcounter( "global_zm_buried_lsat_purchased", buried_lsat_purchased ); - incrementcounter( "global_zm_buried_fountain_transporter_used", buried_fountain_transporter_used ); - incrementcounter( "global_zm_buried_ghost_killed", buried_ghost_killed ); - incrementcounter( "global_zm_buried_ghost_drained_player", buried_ghost_drained_player ); - incrementcounter( "global_zm_buried_ghost_perk_acquired", buried_ghost_perk_acquired ); - incrementcounter( "global_zm_buried_sloth_booze_given", buried_sloth_booze_given ); - incrementcounter( "global_zm_buried_sloth_booze_break_barricade", buried_sloth_booze_break_barricade ); - incrementcounter( "global_zm_buried_sloth_candy_given", buried_sloth_candy_given ); - incrementcounter( "global_zm_buried_sloth_candy_protect", buried_sloth_candy_protect ); - incrementcounter( "global_zm_buried_sloth_candy_build_buildable", buried_sloth_candy_build_buildable ); - incrementcounter( "global_zm_buried_sloth_candy_wallbuy", buried_sloth_candy_wallbuy ); - incrementcounter( "global_zm_buried_sloth_candy_fetch_buildable", buried_sloth_candy_fetch_buildable ); - incrementcounter( "global_zm_buried_sloth_candy_box_lock", buried_sloth_candy_box_lock ); - incrementcounter( "global_zm_buried_sloth_candy_box_move", buried_sloth_candy_box_move ); - incrementcounter( "global_zm_buried_sloth_candy_box_spin", buried_sloth_candy_box_spin ); - incrementcounter( "global_zm_buried_sloth_candy_powerup_cycle", buried_sloth_candy_powerup_cycle ); - incrementcounter( "global_zm_buried_sloth_candy_dance", buried_sloth_candy_dance ); - incrementcounter( "global_zm_buried_sloth_candy_crawler", buried_sloth_candy_crawler ); - incrementcounter( "global_zm_buried_wallbuy_placed", buried_wallbuy_placed ); - incrementcounter( "global_zm_buried_wallbuy_placed_ak74u_zm", buried_wallbuy_placed_ak74u_zm ); - incrementcounter( "global_zm_buried_wallbuy_placed_an94_zm", buried_wallbuy_placed_an94_zm ); - incrementcounter( "global_zm_buried_wallbuy_placed_pdw57_zm", buried_wallbuy_placed_pdw57_zm ); - incrementcounter( "global_zm_buried_wallbuy_placed_svu_zm", buried_wallbuy_placed_svu_zm ); - incrementcounter( "global_zm_buried_wallbuy_placed_tazer_knuckles_zm", buried_wallbuy_placed_tazer_knuckles_zm ); - incrementcounter( "global_zm_buried_wallbuy_placed_870mcs_zm", buried_wallbuy_placed_870mcs_zm ); - incrementcounter( "global_zm_tomb_mechz_killed", tomb_mechz_killed ); - incrementcounter( "global_zm_tomb_giant_robot_stomped", tomb_giant_robot_stomped ); - incrementcounter( "global_zm_tomb_giant_robot_accessed", tomb_giant_robot_accessed ); - incrementcounter( "global_zm_tomb_generator_captured", tomb_generator_captured ); - incrementcounter( "global_zm_tomb_generator_defended", tomb_generator_defended ); - incrementcounter( "global_zm_tomb_generator_lost", tomb_generator_lost ); - incrementcounter( "global_zm_tomb_dig", tomb_dig ); - incrementcounter( "global_zm_tomb_golden_shovel", tomb_golden_shovel ); - incrementcounter( "global_zm_tomb_golden_hard_hat", tomb_golden_hard_hat ); - incrementcounter( "global_zm_tomb_perk_extension", tomb_perk_extension ); + if ( is_true( level.zm_disable_recording_stats ) ) + { + return; + } + deaths = 0; + kills = 0; + melee_kills = 0; + headshots = 0; + suicides = 0; + downs = 0; + revives = 0; + perks_drank = 0; + gibs = 0; + doors_purchased = 0; + distance_traveled = 0; + total_shots = 0; + boards = 0; + sacrifices = 0; + drops = 0; + nuke_pickedup = 0; + insta_kill_pickedup = 0; + full_ammo_pickedup = 0; + double_points_pickedup = 0; + meat_stink_pickedup = 0; + carpenter_pickedup = 0; + fire_sale_pickedup = 0; + zombie_blood_pickedup = 0; + use_magicbox = 0; + grabbed_from_magicbox = 0; + use_perk_random = 0; + grabbed_from_perk_random = 0; + use_pap = 0; + pap_weapon_grabbed = 0; + specialty_armorvest_drank = 0; + specialty_quickrevive_drank = 0; + specialty_fastreload_drank = 0; + specialty_longersprint_drank = 0; + specialty_scavenger_drank = 0; + specialty_rof_drank = 0; + specialty_deadshot_drank = 0; + specialty_flakjacket_drank = 0; + specialty_additionalprimaryweapon_drank = 0; + specialty_finalstand_drank = 0; + specialty_grenadepulldeath_drank = 0; + specialty_nomotionsensor_drank = 0; + claymores_planted = 0; + claymores_pickedup = 0; + ballistic_knives_pickedup = 0; + wallbuy_weapons_purchased = 0; + power_turnedon = 0; + power_turnedoff = 0; + planted_buildables_pickedup = 0; + ammo_purchased = 0; + upgraded_ammo_purchased = 0; + buildables_built = 0; + time_played = 0; + contaminations_received = 0; + contaminations_given = 0; + cheat_too_many_weapons = 0; + cheat_out_of_playable_area = 0; + cheat_too_friendly = 0; + cheat_total = 0; + prison_tomahawk_acquired = 0; + prison_fan_trap_used = 0; + prison_acid_trap_used = 0; + prison_sniper_tower_used = 0; + prison_ee_good_ending = 0; + prison_ee_bad_ending = 0; + prison_ee_spoon_acquired = 0; + prison_brutus_killed = 0; + buried_lsat_purchased = 0; + buried_fountain_transporter_used = 0; + buried_ghost_killed = 0; + buried_ghost_drained_player = 0; + buried_ghost_perk_acquired = 0; + buried_sloth_booze_given = 0; + buried_sloth_booze_break_barricade = 0; + buried_sloth_candy_given = 0; + buried_sloth_candy_protect = 0; + buried_sloth_candy_build_buildable = 0; + buried_sloth_candy_wallbuy = 0; + buried_sloth_candy_fetch_buildable = 0; + buried_sloth_candy_box_lock = 0; + buried_sloth_candy_box_move = 0; + buried_sloth_candy_box_spin = 0; + buried_sloth_candy_powerup_cycle = 0; + buried_sloth_candy_dance = 0; + buried_sloth_candy_crawler = 0; + buried_wallbuy_placed = 0; + buried_wallbuy_placed_ak74u_zm = 0; + buried_wallbuy_placed_an94_zm = 0; + buried_wallbuy_placed_pdw57_zm = 0; + buried_wallbuy_placed_svu_zm = 0; + buried_wallbuy_placed_tazer_knuckles_zm = 0; + buried_wallbuy_placed_870mcs_zm = 0; + tomb_mechz_killed = 0; + tomb_giant_robot_stomped = 0; + tomb_giant_robot_accessed = 0; + tomb_generator_captured = 0; + tomb_generator_defended = 0; + tomb_generator_lost = 0; + tomb_dig = 0; + tomb_golden_shovel = 0; + tomb_golden_hard_hat = 0; + tomb_perk_extension = 0; + players = get_players(); + foreach ( player in players ) + { + deaths += player.pers[ "deaths" ]; + kills += player.pers[ "kills" ]; + headshots += player.pers[ "headshots" ]; + suicides += player.pers[ "suicides" ]; + melee_kills += player.pers[ "melee_kills" ]; + downs += player.pers[ "downs" ]; + revives += player.pers[ "revives" ]; + perks_drank += player.pers[ "perks_drank" ]; + specialty_armorvest_drank += player.pers[ "specialty_armorvest_drank" ]; + specialty_quickrevive_drank += player.pers[ "specialty_quickrevive_drank" ]; + specialty_fastreload_drank += player.pers[ "specialty_fastreload_drank" ]; + specialty_longersprint_drank += player.pers[ "specialty_longersprint_drank" ]; + specialty_rof_drank += player.pers[ "specialty_rof_drank" ]; + specialty_deadshot_drank += player.pers[ "specialty_deadshot_drank" ]; + specialty_scavenger_drank += player.pers[ "specialty_scavenger_drank" ]; + specialty_flakjacket_drank += player.pers[ "specialty_flakjacket_drank" ]; + specialty_additionalprimaryweapon_drank += player.pers[ "specialty_additionalprimaryweapon_drank" ]; + specialty_finalstand_drank += player.pers[ "specialty_finalstand_drank" ]; + specialty_grenadepulldeath_drank += player.pers[ "specialty_grenadepulldeath_drank" ]; + specialty_nomotionsensor_drank += player.pers[ "specialty_nomotionsensor" + "_drank" ]; + gibs += player.pers[ "gibs" ]; + doors_purchased += player.pers[ "doors_purchased" ]; + distance_traveled += player get_stat_distance_traveled(); + boards += player.pers[ "boards" ]; + sacrifices += player.pers[ "sacrifices" ]; + drops += player.pers[ "drops" ]; + nuke_pickedup += player.pers[ "nuke_pickedup" ]; + insta_kill_pickedup += player.pers[ "insta_kill_pickedup" ]; + full_ammo_pickedup += player.pers[ "full_ammo_pickedup" ]; + double_points_pickedup += player.pers[ "double_points_pickedup" ]; + meat_stink_pickedup += player.pers[ "meat_stink_pickedup" ]; + carpenter_pickedup += player.pers[ "carpenter_pickedup" ]; + fire_sale_pickedup += player.pers[ "fire_sale_pickedup" ]; + zombie_blood_pickedup += player.pers[ "zombie_blood_pickedup" ]; + use_magicbox += player.pers[ "use_magicbox" ]; + grabbed_from_magicbox += player.pers[ "grabbed_from_magicbox" ]; + use_perk_random += player.pers[ "use_perk_random" ]; + grabbed_from_perk_random += player.pers[ "grabbed_from_perk_random" ]; + use_pap += player.pers[ "use_pap" ]; + pap_weapon_grabbed += player.pers[ "pap_weapon_grabbed" ]; + claymores_planted += player.pers[ "claymores_planted" ]; + claymores_pickedup += player.pers[ "claymores_pickedup" ]; + ballistic_knives_pickedup += player.pers[ "ballistic_knives_pickedup" ]; + wallbuy_weapons_purchased += player.pers[ "wallbuy_weapons_purchased" ]; + power_turnedon += player.pers[ "power_turnedon" ]; + power_turnedoff += player.pers[ "power_turnedoff" ]; + planted_buildables_pickedup += player.pers[ "planted_buildables_pickedup" ]; + buildables_built += player.pers[ "buildables_built" ]; + ammo_purchased += player.pers[ "ammo_purchased" ]; + upgraded_ammo_purchased += player.pers[ "upgraded_ammo_purchased" ]; + total_shots += player.total_shots; + time_played += player.pers[ "time_played_total" ]; + contaminations_received += player.pers[ "contaminations_received" ]; + contaminations_given += player.pers[ "contaminations_given" ]; + cheat_too_many_weapons += player.pers[ "cheat_too_many_weapons" ]; + cheat_out_of_playable_area += player.pers[ "cheat_out_of_playable" ]; + cheat_too_friendly += player.pers[ "cheat_too_friendly" ]; + cheat_total += player.pers[ "cheat_total" ]; + prison_tomahawk_acquired += player.pers[ "prison_tomahawk_acquired" ]; + prison_fan_trap_used += player.pers[ "prison_fan_trap_used" ]; + prison_acid_trap_used += player.pers[ "prison_acid_trap_used" ]; + prison_sniper_tower_used += player.pers[ "prison_sniper_tower_used" ]; + prison_ee_good_ending += player.pers[ "prison_ee_good_ending" ]; + prison_ee_bad_ending += player.pers[ "prison_ee_bad_ending" ]; + prison_ee_spoon_acquired += player.pers[ "prison_ee_spoon_acquired" ]; + prison_brutus_killed += player.pers[ "prison_brutus_killed" ]; + buried_lsat_purchased += player.pers[ "buried_lsat_purchased" ]; + buried_fountain_transporter_used += player.pers[ "buried_fountain_transporter_used" ]; + buried_ghost_killed += player.pers[ "buried_ghost_killed" ]; + buried_ghost_drained_player += player.pers[ "buried_ghost_drained_player" ]; + buried_ghost_perk_acquired += player.pers[ "buried_ghost_perk_acquired" ]; + buried_sloth_booze_given += player.pers[ "buried_sloth_booze_given" ]; + buried_sloth_booze_break_barricade += player.pers[ "buried_sloth_booze_break_barricade" ]; + buried_sloth_candy_given += player.pers[ "buried_sloth_candy_given" ]; + buried_sloth_candy_protect += player.pers[ "buried_sloth_candy_protect" ]; + buried_sloth_candy_build_buildable += player.pers[ "buried_sloth_candy_build_buildable" ]; + buried_sloth_candy_wallbuy += player.pers[ "buried_sloth_candy_wallbuy" ]; + buried_sloth_candy_fetch_buildable += player.pers[ "buried_sloth_candy_fetch_buildable" ]; + buried_sloth_candy_box_lock += player.pers[ "buried_sloth_candy_box_lock" ]; + buried_sloth_candy_box_move += player.pers[ "buried_sloth_candy_box_move" ]; + buried_sloth_candy_box_spin += player.pers[ "buried_sloth_candy_box_spin" ]; + buried_sloth_candy_powerup_cycle += player.pers[ "buried_sloth_candy_powerup_cycle" ]; + buried_sloth_candy_dance += player.pers[ "buried_sloth_candy_dance" ]; + buried_sloth_candy_crawler += player.pers[ "buried_sloth_candy_crawler" ]; + buried_wallbuy_placed += player.pers[ "buried_wallbuy_placed" ]; + buried_wallbuy_placed_ak74u_zm += player.pers[ "buried_wallbuy_placed_ak74u_zm" ]; + buried_wallbuy_placed_an94_zm += player.pers[ "buried_wallbuy_placed_an94_zm" ]; + buried_wallbuy_placed_pdw57_zm += player.pers[ "buried_wallbuy_placed_pdw57_zm" ]; + buried_wallbuy_placed_svu_zm += player.pers[ "buried_wallbuy_placed_svu_zm" ]; + buried_wallbuy_placed_tazer_knuckles_zm += player.pers[ "buried_wallbuy_placed_tazer_knuckles_zm" ]; + buried_wallbuy_placed_870mcs_zm += player.pers[ "buried_wallbuy_placed_870mcs_zm" ]; + tomb_mechz_killed += player.pers[ "tomb_mechz_killed" ]; + tomb_giant_robot_stomped += player.pers[ "tomb_giant_robot_stomped" ]; + tomb_giant_robot_accessed += player.pers[ "tomb_giant_robot_accessed" ]; + tomb_generator_captured += player.pers[ "tomb_generator_captured" ]; + tomb_generator_defended += player.pers[ "tomb_generator_defended" ]; + tomb_generator_lost += player.pers[ "tomb_generator_lost" ]; + tomb_dig += player.pers[ "tomb_dig" ]; + tomb_golden_shovel += player.pers[ "tomb_golden_shovel" ]; + tomb_golden_hard_hat += player.pers[ "tomb_golden_hard_hat" ]; + tomb_perk_extension += player.pers[ "tomb_perk_extension" ]; + } + game_mode = getDvar( "ui_gametype" ); + incrementcounter( "global_zm_" + game_mode, 1 ); + incrementcounter( "global_zm_games", 1 ); + if ( game_mode == "zclassic" || level.script == "zm_nuked" ) + { + incrementcounter( "global_zm_games_" + level.script, 1 ); + } + incrementcounter( "global_zm_killed", level.global_zombies_killed ); + incrementcounter( "global_zm_killed_by_players", kills ); + incrementcounter( "global_zm_killed_by_traps", level.zombie_trap_killed_count ); + incrementcounter( "global_zm_headshots", headshots ); + incrementcounter( "global_zm_suicides", suicides ); + incrementcounter( "global_zm_melee_kills", melee_kills ); + incrementcounter( "global_zm_downs", downs ); + incrementcounter( "global_zm_deaths", deaths ); + incrementcounter( "global_zm_revives", revives ); + incrementcounter( "global_zm_perks_drank", perks_drank ); + incrementcounter( "global_zm_specialty_armorvest_drank", specialty_armorvest_drank ); + incrementcounter( "global_zm_specialty_quickrevive_drank", specialty_quickrevive_drank ); + incrementcounter( "global_zm_specialty_fastreload_drank", specialty_fastreload_drank ); + incrementcounter( "global_zm_specialty_longersprint_drank", specialty_longersprint_drank ); + incrementcounter( "global_zm_specialty_rof_drank", specialty_rof_drank ); + incrementcounter( "global_zm_specialty_deadshot_drank", specialty_deadshot_drank ); + incrementcounter( "global_zm_specialty_scavenger_drank", specialty_scavenger_drank ); + incrementcounter( "global_zm_specialty_flakjacket_drank", specialty_flakjacket_drank ); + incrementcounter( "global_zm_specialty_additionalprimaryweapon_drank", specialty_additionalprimaryweapon_drank ); + incrementcounter( "global_zm_specialty_finalstand_drank", specialty_finalstand_drank ); + incrementcounter( "global_zm_specialty_grenadepulldeath_drank", specialty_grenadepulldeath_drank ); + incrementcounter( "global_zm_" + "specialty_nomotionsensor" + "_drank", specialty_nomotionsensor_drank ); + incrementcounter( "global_zm_gibs", gibs ); + incrementcounter( "global_zm_distance_traveled", int( distance_traveled ) ); + incrementcounter( "global_zm_doors_purchased", doors_purchased ); + incrementcounter( "global_zm_boards", boards ); + incrementcounter( "global_zm_sacrifices", sacrifices ); + incrementcounter( "global_zm_drops", drops ); + incrementcounter( "global_zm_total_nuke_pickedup", nuke_pickedup ); + incrementcounter( "global_zm_total_insta_kill_pickedup", insta_kill_pickedup ); + incrementcounter( "global_zm_total_full_ammo_pickedup", full_ammo_pickedup ); + incrementcounter( "global_zm_total_double_points_pickedup", double_points_pickedup ); + incrementcounter( "global_zm_total_meat_stink_pickedup", double_points_pickedup ); + incrementcounter( "global_zm_total_carpenter_pickedup", carpenter_pickedup ); + incrementcounter( "global_zm_total_fire_sale_pickedup", fire_sale_pickedup ); + incrementcounter( "global_zm_total_zombie_blood_pickedup", zombie_blood_pickedup ); + incrementcounter( "global_zm_use_magicbox", use_magicbox ); + incrementcounter( "global_zm_grabbed_from_magicbox", grabbed_from_magicbox ); + incrementcounter( "global_zm_use_perk_random", use_perk_random ); + incrementcounter( "global_zm_grabbed_from_perk_random", grabbed_from_perk_random ); + incrementcounter( "global_zm_use_pap", use_pap ); + incrementcounter( "global_zm_pap_weapon_grabbed", pap_weapon_grabbed ); + incrementcounter( "global_zm_claymores_planted", claymores_planted ); + incrementcounter( "global_zm_claymores_pickedup", claymores_pickedup ); + incrementcounter( "global_zm_ballistic_knives_pickedup", ballistic_knives_pickedup ); + incrementcounter( "global_zm_wallbuy_weapons_purchased", wallbuy_weapons_purchased ); + incrementcounter( "global_zm_power_turnedon", power_turnedon ); + incrementcounter( "global_zm_power_turnedoff", power_turnedoff ); + incrementcounter( "global_zm_planted_buildables_pickedup", planted_buildables_pickedup ); + incrementcounter( "global_zm_buildables_built", buildables_built ); + incrementcounter( "global_zm_ammo_purchased", ammo_purchased ); + incrementcounter( "global_zm_upgraded_ammo_purchased", upgraded_ammo_purchased ); + incrementcounter( "global_zm_total_shots", total_shots ); + incrementcounter( "global_zm_time_played", time_played ); + incrementcounter( "global_zm_contaminations_received", contaminations_received ); + incrementcounter( "global_zm_contaminations_given", contaminations_given ); + incrementcounter( "global_zm_cheat_players_too_friendly", cheat_too_friendly ); + incrementcounter( "global_zm_cheats_cheat_too_many_weapons", cheat_too_many_weapons ); + incrementcounter( "global_zm_cheats_out_of_playable", cheat_out_of_playable_area ); + incrementcounter( "global_zm_total_cheats", cheat_total ); + incrementcounter( "global_zm_prison_tomahawk_acquired", prison_tomahawk_acquired ); + incrementcounter( "global_zm_prison_fan_trap_used", prison_fan_trap_used ); + incrementcounter( "global_zm_prison_acid_trap_used", prison_acid_trap_used ); + incrementcounter( "global_zm_prison_sniper_tower_used", prison_sniper_tower_used ); + incrementcounter( "global_zm_prison_ee_good_ending", prison_ee_good_ending ); + incrementcounter( "global_zm_prison_ee_bad_ending", prison_ee_bad_ending ); + incrementcounter( "global_zm_prison_ee_spoon_acquired", prison_ee_spoon_acquired ); + incrementcounter( "global_zm_prison_brutus_killed", prison_brutus_killed ); + incrementcounter( "global_zm_buried_lsat_purchased", buried_lsat_purchased ); + incrementcounter( "global_zm_buried_fountain_transporter_used", buried_fountain_transporter_used ); + incrementcounter( "global_zm_buried_ghost_killed", buried_ghost_killed ); + incrementcounter( "global_zm_buried_ghost_drained_player", buried_ghost_drained_player ); + incrementcounter( "global_zm_buried_ghost_perk_acquired", buried_ghost_perk_acquired ); + incrementcounter( "global_zm_buried_sloth_booze_given", buried_sloth_booze_given ); + incrementcounter( "global_zm_buried_sloth_booze_break_barricade", buried_sloth_booze_break_barricade ); + incrementcounter( "global_zm_buried_sloth_candy_given", buried_sloth_candy_given ); + incrementcounter( "global_zm_buried_sloth_candy_protect", buried_sloth_candy_protect ); + incrementcounter( "global_zm_buried_sloth_candy_build_buildable", buried_sloth_candy_build_buildable ); + incrementcounter( "global_zm_buried_sloth_candy_wallbuy", buried_sloth_candy_wallbuy ); + incrementcounter( "global_zm_buried_sloth_candy_fetch_buildable", buried_sloth_candy_fetch_buildable ); + incrementcounter( "global_zm_buried_sloth_candy_box_lock", buried_sloth_candy_box_lock ); + incrementcounter( "global_zm_buried_sloth_candy_box_move", buried_sloth_candy_box_move ); + incrementcounter( "global_zm_buried_sloth_candy_box_spin", buried_sloth_candy_box_spin ); + incrementcounter( "global_zm_buried_sloth_candy_powerup_cycle", buried_sloth_candy_powerup_cycle ); + incrementcounter( "global_zm_buried_sloth_candy_dance", buried_sloth_candy_dance ); + incrementcounter( "global_zm_buried_sloth_candy_crawler", buried_sloth_candy_crawler ); + incrementcounter( "global_zm_buried_wallbuy_placed", buried_wallbuy_placed ); + incrementcounter( "global_zm_buried_wallbuy_placed_ak74u_zm", buried_wallbuy_placed_ak74u_zm ); + incrementcounter( "global_zm_buried_wallbuy_placed_an94_zm", buried_wallbuy_placed_an94_zm ); + incrementcounter( "global_zm_buried_wallbuy_placed_pdw57_zm", buried_wallbuy_placed_pdw57_zm ); + incrementcounter( "global_zm_buried_wallbuy_placed_svu_zm", buried_wallbuy_placed_svu_zm ); + incrementcounter( "global_zm_buried_wallbuy_placed_tazer_knuckles_zm", buried_wallbuy_placed_tazer_knuckles_zm ); + incrementcounter( "global_zm_buried_wallbuy_placed_870mcs_zm", buried_wallbuy_placed_870mcs_zm ); + incrementcounter( "global_zm_tomb_mechz_killed", tomb_mechz_killed ); + incrementcounter( "global_zm_tomb_giant_robot_stomped", tomb_giant_robot_stomped ); + incrementcounter( "global_zm_tomb_giant_robot_accessed", tomb_giant_robot_accessed ); + incrementcounter( "global_zm_tomb_generator_captured", tomb_generator_captured ); + incrementcounter( "global_zm_tomb_generator_defended", tomb_generator_defended ); + incrementcounter( "global_zm_tomb_generator_lost", tomb_generator_lost ); + incrementcounter( "global_zm_tomb_dig", tomb_dig ); + incrementcounter( "global_zm_tomb_golden_shovel", tomb_golden_shovel ); + incrementcounter( "global_zm_tomb_golden_hard_hat", tomb_golden_hard_hat ); + incrementcounter( "global_zm_tomb_perk_extension", tomb_perk_extension ); } -get_specific_stat( stat_category, stat_name ) +get_specific_stat( stat_category, stat_name ) //checked matches cerberus output { - return self getdstat( stat_category, stat_name, "StatValue" ); + return self getdstat( stat_category, stat_name, "StatValue" ); } -do_stats_for_gibs( zombie, limb_tags_array ) +do_stats_for_gibs( zombie, limb_tags_array ) //checked partially changed to match cerberus output //did not use foreach to prevent infinite loop due to continue { - if ( isdefined( zombie ) && isdefined( zombie.attacker ) && isplayer( zombie.attacker ) ) - { - foreach ( limb in limb_tags_array ) - { - stat_name = undefined; - - if ( limb == level._zombie_gib_piece_index_right_arm ) - stat_name = "right_arm_gibs"; - else if ( limb == level._zombie_gib_piece_index_left_arm ) - stat_name = "left_arm_gibs"; - else if ( limb == level._zombie_gib_piece_index_right_leg ) - stat_name = "right_leg_gibs"; - else if ( limb == level._zombie_gib_piece_index_left_leg ) - stat_name = "left_leg_gibs"; - else if ( limb == level._zombie_gib_piece_index_head ) - stat_name = "head_gibs"; - - if ( !isdefined( stat_name ) ) - continue; - - zombie.attacker increment_client_stat( stat_name, 0 ); - zombie.attacker increment_client_stat( "gibs" ); - } - } + if ( isDefined( zombie ) && isDefined( zombie.attacker ) && isplayer( zombie.attacker ) ) + { + i = 0; + while ( i < limb_tags_array.size ) + { + stat_name = undefined; + if ( limb_tags_array[ i ] == level._zombie_gib_piece_index_right_arm ) + { + stat_name = "right_arm_gibs"; + } + else if ( limb_tags_array[ i ] == level._zombie_gib_piece_index_left_arm ) + { + stat_name = "left_arm_gibs"; + } + else if ( limb_tags_array[ i ] == level._zombie_gib_piece_index_right_leg ) + { + stat_name = "right_leg_gibs"; + } + else if ( limb_tags_array[ i ] == level._zombie_gib_piece_index_left_leg ) + { + stat_name = "left_leg_gibs"; + } + else 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++; + } + } } -initializematchstats() +initializematchstats() //checked matches cerberus output { - 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 ) ); + 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 ) ); } -adjustrecentstats() +adjustrecentstats() //checked matches cerberus output { + /* /# - if ( getdvarint( "scr_writeConfigStrings" ) == 1 || getdvarint( "scr_hostmigrationtest" ) == 1 ) - return; + if ( getDvarInt( "scr_writeConfigStrings" ) == 1 || getDvarInt( "scr_hostmigrationtest" ) == 1 ) + { + return; #/ - initializematchstats(); + } + */ + initializematchstats(); } -uploadstatssoon() +uploadstatssoon() //checked matches cerberus output { - self notify( "upload_stats_soon" ); - self endon( "upload_stats_soon" ); - self endon( "disconnect" ); - wait 1; - uploadstats( self ); + self notify( "upload_stats_soon" ); + self endon( "upload_stats_soon" ); + self endon( "disconnect" ); + wait 1; + uploadstats( self ); } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_timer.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_timer.gsc index 09a6d97..dba9537 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_timer.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_timer.gsc @@ -1,84 +1,80 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - precacheshader( "zombie_stopwatchneedle" ); - precacheshader( "zombie_stopwatch" ); - precacheshader( "zombie_stopwatch_glass" ); - - if ( !isdefined( level.stopwatch_length_width ) ) - level.stopwatch_length_width = 96; + precacheshader( "zombie_stopwatchneedle" ); + precacheshader( "zombie_stopwatch" ); + precacheshader( "zombie_stopwatch_glass" ); + if ( !isDefined( level.stopwatch_length_width ) ) + { + level.stopwatch_length_width = 96; + } } -start_timer( time, stop_notify ) +start_timer( time, stop_notify ) //checked matches cerberus output { - self notify( "stop_prev_timer" ); - self endon( "stop_prev_timer" ); - - if ( !isdefined( self.stopwatch_elem ) ) - { - self.stopwatch_elem = newclienthudelem( self ); - self.stopwatch_elem.horzalign = "left"; - self.stopwatch_elem.vertalign = "top"; - self.stopwatch_elem.alignx = "left"; - self.stopwatch_elem.aligny = "top"; - self.stopwatch_elem.x = 10; - self.stopwatch_elem.alpha = 0; - self.stopwatch_elem.sort = 2; - self.stopwatch_elem_glass = newclienthudelem( self ); - self.stopwatch_elem_glass.horzalign = "left"; - self.stopwatch_elem_glass.vertalign = "top"; - self.stopwatch_elem_glass.alignx = "left"; - self.stopwatch_elem_glass.aligny = "top"; - self.stopwatch_elem_glass.x = 10; - self.stopwatch_elem_glass.alpha = 0; - self.stopwatch_elem_glass.sort = 3; - self.stopwatch_elem_glass setshader( "zombie_stopwatch_glass", level.stopwatch_length_width, level.stopwatch_length_width ); - } - - self thread update_hud_position(); - - if ( isdefined( stop_notify ) ) - self thread wait_for_stop_notify( stop_notify ); - - if ( time > 60 ) - time = 0; - - self.stopwatch_elem setclock( time, 60, "zombie_stopwatch", level.stopwatch_length_width, level.stopwatch_length_width ); - self.stopwatch_elem.alpha = 1; - self.stopwatch_elem_glass.alpha = 1; - wait( time ); - self notify( "countdown_finished" ); - wait 1; - self.stopwatch_elem.alpha = 0; - self.stopwatch_elem_glass.alpha = 0; + self notify( "stop_prev_timer" ); + self endon( "stop_prev_timer" ); + if ( !isDefined( self.stopwatch_elem ) ) + { + self.stopwatch_elem = newclienthudelem( self ); + self.stopwatch_elem.horzalign = "left"; + self.stopwatch_elem.vertalign = "top"; + self.stopwatch_elem.alignx = "left"; + self.stopwatch_elem.aligny = "top"; + self.stopwatch_elem.x = 10; + self.stopwatch_elem.alpha = 0; + self.stopwatch_elem.sort = 2; + self.stopwatch_elem_glass = newclienthudelem( self ); + self.stopwatch_elem_glass.horzalign = "left"; + self.stopwatch_elem_glass.vertalign = "top"; + self.stopwatch_elem_glass.alignx = "left"; + self.stopwatch_elem_glass.aligny = "top"; + self.stopwatch_elem_glass.x = 10; + self.stopwatch_elem_glass.alpha = 0; + self.stopwatch_elem_glass.sort = 3; + self.stopwatch_elem_glass setshader( "zombie_stopwatch_glass", level.stopwatch_length_width, level.stopwatch_length_width ); + } + self thread update_hud_position(); + if ( isDefined( stop_notify ) ) + { + self thread wait_for_stop_notify( stop_notify ); + } + if ( time > 60 ) + { + time = 0; + } + self.stopwatch_elem setclock( time, 60, "zombie_stopwatch", level.stopwatch_length_width, level.stopwatch_length_width ); + self.stopwatch_elem.alpha = 1; + self.stopwatch_elem_glass.alpha = 1; + wait time; + self notify( "countdown_finished" ); + wait 1; + self.stopwatch_elem.alpha = 0; + self.stopwatch_elem_glass.alpha = 0; } -wait_for_stop_notify( stop_notify ) +wait_for_stop_notify( stop_notify ) //checked matches cerberus output { - self endon( "stop_prev_timer" ); - self endon( "countdown_finished" ); - - self waittill( stop_notify ); - - self.stopwatch_elem.alpha = 0; - self.stopwatch_elem_glass.alpha = 0; + self endon( "stop_prev_timer" ); + self endon( "countdown_finished" ); + self waittill( stop_notify ); + self.stopwatch_elem.alpha = 0; + self.stopwatch_elem_glass.alpha = 0; } -update_hud_position() +update_hud_position() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "stop_prev_timer" ); - self endon( "countdown_finished" ); - - while ( true ) - { - self.stopwatch_elem.y = 20; - self.stopwatch_elem_glass.y = 20; - wait 0.05; - } + self endon( "disconnect" ); + self endon( "stop_prev_timer" ); + self endon( "countdown_finished" ); + while ( 1 ) + { + self.stopwatch_elem.y = 20; + self.stopwatch_elem_glass.y = 20; + wait 0.05; + } } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_tombstone.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_tombstone.gsc index 215fa3f..f48f055 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_tombstone.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_tombstone.gsc @@ -1,477 +1,502 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_melee_weapon; -#include maps\mp\zombies\_zm_weap_cymbal_monkey; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm_perks; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_weap_cymbal_monkey; +#include maps/mp/zombies/_zm_melee_weapon; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; -init() +init() //checked matches cerberus output { - onplayerconnect_callback( ::tombstone_player_init ); - level.tombstone_laststand_func = ::tombstone_laststand; - level.tombstone_spawn_func = ::tombstone_spawn; - level thread tombstone_hostmigration(); - - if ( isdefined( level.zombiemode_using_tombstone_perk ) && level.zombiemode_using_tombstone_perk ) - add_custom_limited_weapon_check( ::is_weapon_available_in_tombstone ); + onplayerconnect_callback( ::tombstone_player_init ); + level.tombstone_laststand_func = ::tombstone_laststand; + level.tombstone_spawn_func = ::tombstone_spawn; + level thread tombstone_hostmigration(); + if ( is_true( level.zombiemode_using_tombstone_perk ) ) + { + add_custom_limited_weapon_check( ::is_weapon_available_in_tombstone ); + } } -tombstone_player_init() +tombstone_player_init() //checked matches cerberus output { - while ( !isdefined( self.tombstone_index ) ) - wait 0.1; - - level.tombstones[self.tombstone_index] = spawnstruct(); + while ( !isDefined( self.tombstone_index ) ) + { + wait 0.1; + } + level.tombstones[ self.tombstone_index ] = spawnstruct(); } -tombstone_spawn() +tombstone_spawn() //checked matches cerberus output { - dc = spawn( "script_model", self.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); - dc.angles = self.angles; - dc setmodel( "tag_origin" ); - dc_icon = spawn( "script_model", self.origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); - dc_icon.angles = self.angles; - dc_icon setmodel( "ch_tombstone1" ); - dc_icon linkto( dc ); - dc.icon = dc_icon; - dc.script_noteworthy = "player_tombstone_model"; - dc.player = self; - self thread tombstone_clear(); - dc thread tombstone_wobble(); - dc thread tombstone_revived( self ); - result = self waittill_any_return( "player_revived", "spawned_player", "disconnect" ); - - if ( result == "player_revived" || result == "disconnect" ) - { - dc notify( "tombstone_timedout" ); - dc_icon unlink(); - dc_icon delete(); - dc delete(); - return; - } - - dc thread tombstone_timeout(); - dc thread tombstone_grab(); + dc = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) ); + dc.angles = self.angles; + dc setmodel( "tag_origin" ); + dc_icon = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) ); + dc_icon.angles = self.angles; + dc_icon setmodel( "ch_tombstone1" ); + dc_icon linkto( dc ); + dc.icon = dc_icon; + dc.script_noteworthy = "player_tombstone_model"; + dc.player = self; + self thread tombstone_clear(); + dc thread tombstone_wobble(); + dc thread tombstone_revived( self ); + result = self waittill_any_return( "player_revived", "spawned_player", "disconnect" ); + if ( result == "player_revived" || result == "disconnect" ) + { + dc notify( "tombstone_timedout" ); + dc_icon unlink(); + dc_icon delete(); + dc delete(); + return; + } + dc thread tombstone_timeout(); + dc thread tombstone_grab(); } -tombstone_clear() +tombstone_clear() //checked matches cerberus output { - result = self waittill_any_return( "tombstone_timedout", "tombstone_grabbed" ); - level.tombstones[self.tombstone_index] = spawnstruct(); + result = self waittill_any_return( "tombstone_timedout", "tombstone_grabbed" ); + level.tombstones[ self.tombstone_index ] = spawnstruct(); } -tombstone_revived( player ) +tombstone_revived( player ) //checked changed to match cerberus output { - self endon( "tombstone_timedout" ); - player endon( "disconnect" ); - shown = 1; - - while ( isdefined( self ) && isdefined( player ) ) - { - if ( isdefined( player.revivetrigger ) && ( isdefined( player.revivetrigger.beingrevived ) && player.revivetrigger.beingrevived ) ) - { - if ( shown ) - { - shown = 0; - self.icon hide(); - } - } - else if ( !shown ) - { - shown = 1; - self.icon show(); - } - - wait 0.05; - } + self endon( "tombstone_timedout" ); + player endon( "disconnect" ); + shown = 1; + while ( isDefined( self ) && isDefined( player ) ) + { + if ( isDefined( player.revivetrigger ) && is_true( player.revivetrigger.beingrevived ) ) + { + if ( shown ) + { + shown = 0; + self.icon hide(); + } + } + else if ( !shown ) + { + shown = 1; + self.icon show(); + } + wait 0.05; + } } -tombstone_laststand() +tombstone_laststand() //checked changed to match cerberus output { - primaries = self getweaponslistprimaries(); - currentweapon = self getcurrentweapon(); - dc = level.tombstones[self.tombstone_index]; - dc.player = self; - dc.weapon = []; - dc.current_weapon = -1; - - foreach ( index, weapon in primaries ) - { - dc.weapon[index] = weapon; - dc.stockcount[index] = self getweaponammostock( weapon ); - - if ( weapon == currentweapon ) - dc.current_weapon = index; - } - - if ( isdefined( self.hasriotshield ) && self.hasriotshield ) - dc.hasriotshield = 1; - - dc save_weapons_for_tombstone( self ); - - if ( self hasweapon( "claymore_zm" ) ) - { - dc.hasclaymore = 1; - dc.claymoreclip = self getweaponammoclip( "claymore_zm" ); - } - - if ( self hasweapon( "emp_grenade_zm" ) ) - { - dc.hasemp = 1; - dc.empclip = self getweaponammoclip( "emp_grenade_zm" ); - } - - dc.perk = tombstone_save_perks( self ); - lethal_grenade = self get_player_lethal_grenade(); - - if ( self hasweapon( lethal_grenade ) ) - dc.grenade = self getweaponammoclip( lethal_grenade ); - else - dc.grenade = 0; - - if ( maps\mp\zombies\_zm_weap_cymbal_monkey::cymbal_monkey_exists() ) - dc.zombie_cymbal_monkey_count = self getweaponammoclip( "cymbal_monkey_zm" ); + primaries = self getweaponslistprimaries(); + currentweapon = self getcurrentweapon(); + dc = level.tombstones[ self.tombstone_index ]; + dc.player = self; + dc.weapon = []; + dc.current_weapon = -1; + foreach ( weapon in primaries ) + { + dc.weapon[ index ] = weapon; + dc.stockcount[ index ] = self getweaponammostock( weapon ); + if ( weapon == currentweapon ) + { + dc.current_weapon = index; + } + } + if ( is_true( self.hasriotshield ) ) + { + dc.hasriotshield = 1; + } + dc save_weapons_for_tombstone( self ); + if ( self hasweapon( "claymore_zm" ) ) + { + dc.hasclaymore = 1; + dc.claymoreclip = self getweaponammoclip( "claymore_zm" ); + } + if ( self hasweapon( "emp_grenade_zm" ) ) + { + dc.hasemp = 1; + dc.empclip = self getweaponammoclip( "emp_grenade_zm" ); + } + dc.perk = tombstone_save_perks( self ); + lethal_grenade = self get_player_lethal_grenade(); + if ( self hasweapon( lethal_grenade ) ) + { + dc.grenade = self getweaponammoclip( lethal_grenade ); + } + else + { + dc.grenade = 0; + } + if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() ) + { + dc.zombie_cymbal_monkey_count = self getweaponammoclip( "cymbal_monkey_zm" ); + } } -tombstone_save_perks( ent ) +tombstone_save_perks( ent ) //checked matches cerberus output { - perk_array = []; - - if ( ent hasperk( "specialty_armorvest" ) ) - perk_array[perk_array.size] = "specialty_armorvest"; - - if ( ent hasperk( "specialty_deadshot" ) ) - perk_array[perk_array.size] = "specialty_deadshot"; - - if ( ent hasperk( "specialty_fastreload" ) ) - perk_array[perk_array.size] = "specialty_fastreload"; - - if ( ent hasperk( "specialty_flakjacket" ) ) - perk_array[perk_array.size] = "specialty_flakjacket"; - - if ( ent hasperk( "specialty_longersprint" ) ) - perk_array[perk_array.size] = "specialty_longersprint"; - - if ( ent hasperk( "specialty_quickrevive" ) ) - perk_array[perk_array.size] = "specialty_quickrevive"; - - if ( ent hasperk( "specialty_rof" ) ) - perk_array[perk_array.size] = "specialty_rof"; - - return perk_array; + perk_array = []; + if ( ent hasperk( "specialty_armorvest" ) ) + { + perk_array[ perk_array.size ] = "specialty_armorvest"; + } + if ( ent hasperk( "specialty_deadshot" ) ) + { + perk_array[ perk_array.size ] = "specialty_deadshot"; + } + if ( ent hasperk( "specialty_fastreload" ) ) + { + perk_array[ perk_array.size ] = "specialty_fastreload"; + } + if ( ent hasperk( "specialty_flakjacket" ) ) + { + perk_array[ perk_array.size ] = "specialty_flakjacket"; + } + if ( ent hasperk( "specialty_longersprint" ) ) + { + perk_array[ perk_array.size ] = "specialty_longersprint"; + } + if ( ent hasperk( "specialty_quickrevive" ) ) + { + perk_array[ perk_array.size ] = "specialty_quickrevive"; + } + if ( ent hasperk( "specialty_rof" ) ) + { + perk_array[ perk_array.size ] = "specialty_rof"; + } + return perk_array; } -tombstone_grab() +tombstone_grab() //checked partially changed to match cerberus output { - self endon( "tombstone_timedout" ); - wait 1; - - while ( isdefined( self ) ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i].is_zombie ) - continue; - - if ( isdefined( self.player ) && players[i] == self.player ) - { - tombstone_machine_triggers = getentarray( "specialty_scavenger", "script_noteworthy" ); - istombstonepowered = 0; - - foreach ( trigger in tombstone_machine_triggers ) - { - if ( isdefined( trigger.power_on ) && trigger.power_on || isdefined( trigger.turbine_power_on ) && trigger.turbine_power_on ) - istombstonepowered = 1; - } - - if ( istombstonepowered ) - { - dist = distance( players[i].origin, self.origin ); - - if ( dist < 64 ) - { - playfx( level._effect["powerup_grabbed"], self.origin ); - playfx( level._effect["powerup_grabbed_wave"], self.origin ); - players[i] tombstone_give(); - wait 0.1; - playsoundatposition( "zmb_tombstone_grab", self.origin ); - self stoploopsound(); - self.icon unlink(); - self.icon delete(); - self delete(); - self notify( "tombstone_grabbed" ); - players[i] clientnotify( "dc0" ); - players[i] notify( "dance_on_my_grave" ); - } - } - } - } - - wait_network_frame(); - } + self endon( "tombstone_timedout" ); + wait 1; + while ( isDefined( self ) ) + { + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ].is_zombie ) + { + i++; + continue; + } + if ( isDefined( self.player ) && players[ i ] == self.player ) + { + tombstone_machine_triggers = getentarray( "specialty_scavenger", "script_noteworthy" ); + istombstonepowered = 0; + foreach ( trigger in tombstone_machine_triggers ) + { + if ( is_true( trigger.power_on ) || is_true( trigger.turbine_power_on ) ) + { + istombstonepowered = 1; + } + } + if ( istombstonepowered ) + { + dist = distance( players[ i ].origin, self.origin ); + if ( dist < 64 ) + { + playfx( level._effect[ "powerup_grabbed" ], self.origin ); + playfx( level._effect[ "powerup_grabbed_wave" ], self.origin ); + players[ i ] tombstone_give(); + wait 0.1; + playsoundatposition( "zmb_tombstone_grab", self.origin ); + self stoploopsound(); + self.icon unlink(); + self.icon delete(); + self delete(); + self notify( "tombstone_grabbed" ); + players[ i ] clientnotify( "dc0" ); + players[ i ] notify( "dance_on_my_grave" ); + } + } + } + i++; + } + wait_network_frame(); + } } -tombstone_give() +tombstone_give() //checked partially changed to match cerberus output { - dc = level.tombstones[self.tombstone_index]; - - if ( !flag( "solo_game" ) ) - { - primaries = self getweaponslistprimaries(); - - if ( dc.weapon.size > 1 || primaries.size > 1 ) - { - foreach ( weapon in primaries ) - self takeweapon( weapon ); - } - - for ( i = 0; i < dc.weapon.size; i++ ) - { - if ( !isdefined( dc.weapon[i] ) ) - continue; - - if ( dc.weapon[i] == "none" ) - continue; - - weapon = dc.weapon[i]; - stock = dc.stockcount[i]; - - if ( !self hasweapon( weapon ) ) - { - self giveweapon( weapon, 0, self maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( weapon ) ); - self setweaponammoclip( weapon, weaponclipsize( weapon ) ); - self setweaponammostock( weapon, stock ); - - if ( i == dc.current_weapon ) - self switchtoweapon( weapon ); - } - } - } - - if ( isdefined( dc.hasriotshield ) && dc.hasriotshield ) - { - self maps\mp\zombies\_zm_equipment::equipment_give( "riotshield_zm" ); - - if ( isdefined( self.player_shield_reset_health ) ) - self [[ self.player_shield_reset_health ]](); - } - - dc restore_weapons_for_tombstone( self ); - - if ( isdefined( dc.hasclaymore ) && dc.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", dc.claymoreclip ); - } - - if ( isdefined( dc.hasemp ) && dc.hasemp ) - { - self giveweapon( "emp_grenade_zm" ); - self setweaponammoclip( "emp_grenade_zm", dc.empclip ); - } - - if ( isdefined( dc.perk ) && dc.perk.size > 0 ) - { - for ( i = 0; i < dc.perk.size; i++ ) - { - if ( self hasperk( dc.perk[i] ) ) - continue; - - if ( dc.perk[i] == "specialty_quickrevive" && flag( "solo_game" ) ) - continue; - - maps\mp\zombies\_zm_perks::give_perk( dc.perk[i] ); - } - } - - if ( dc.grenade > 0 && !flag( "solo_game" ) ) - { - curgrenadecount = 0; - - if ( self hasweapon( self get_player_lethal_grenade() ) ) - self getweaponammoclip( self get_player_lethal_grenade() ); - else - self giveweapon( self get_player_lethal_grenade() ); - - self setweaponammoclip( self get_player_lethal_grenade(), dc.grenade + curgrenadecount ); - } - - if ( maps\mp\zombies\_zm_weap_cymbal_monkey::cymbal_monkey_exists() && !flag( "solo_game" ) ) - { - if ( dc.zombie_cymbal_monkey_count ) - { - self maps\mp\zombies\_zm_weap_cymbal_monkey::player_give_cymbal_monkey(); - self setweaponammoclip( "cymbal_monkey_zm", dc.zombie_cymbal_monkey_count ); - } - } + dc = level.tombstones[ self.tombstone_index ]; + if ( !flag( "solo_game" ) ) + { + primaries = self getweaponslistprimaries(); + if ( dc.weapon.size > 1 || primaries.size > 1 ) + { + foreach ( weapon in primaries ) + { + self takeweapon( weapon ); + } + } + i = 0; + while ( i < dc.weapon.size ) + { + if ( !isDefined( dc.weapon[ i ] ) ) + { + i++; + continue; + } + if ( dc.weapon[ i ] == "none" ) + { + i++; + continue; + } + weapon = dc.weapon[ i ]; + stock = dc.stockcount[ i ]; + if ( !self hasweapon( weapon ) ) + { + self giveweapon( weapon, 0, self maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( weapon ) ); + self setweaponammoclip( weapon, weaponclipsize( weapon ) ); + self setweaponammostock( weapon, stock ); + if ( i == dc.current_weapon ) + { + self switchtoweapon( weapon ); + } + } + i++; + } + } + if ( is_true( dc.hasriotshield ) ) + { + self maps/mp/zombies/_zm_equipment::equipment_give( "riotshield_zm" ); + if ( isDefined( self.player_shield_reset_health ) ) + { + self [[ self.player_shield_reset_health ]](); + } + } + dc restore_weapons_for_tombstone( self ); + if ( is_true( dc.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", dc.claymoreclip ); + } + if ( is_true( dc.hasemp ) ) + { + self giveweapon( "emp_grenade_zm" ); + self setweaponammoclip( "emp_grenade_zm", dc.empclip ); + } + if ( isDefined( dc.perk ) && dc.perk.size > 0 ) + { + i = 0; + while ( i < dc.perk.size ) + { + if ( self hasperk( dc.perk[ i ] ) ) + { + i++; + continue; + } + if ( dc.perk[ i ] == "specialty_quickrevive" && flag( "solo_game" ) ) + { + i++; + continue; + } + maps/mp/zombies/_zm_perks::give_perk( dc.perk[ i ] ); + i++; + } + } + else if ( dc.grenade > 0 && !flag( "solo_game" ) ) + { + curgrenadecount = 0; + if ( self hasweapon( self get_player_lethal_grenade() ) ) + { + self getweaponammoclip( self get_player_lethal_grenade() ); + } + else + { + self giveweapon( self get_player_lethal_grenade() ); + } + self setweaponammoclip( self get_player_lethal_grenade(), dc.grenade + curgrenadecount ); + } + if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() && !flag( "solo_game" ) ) + { + if ( dc.zombie_cymbal_monkey_count ) + { + self maps/mp/zombies/_zm_weap_cymbal_monkey::player_give_cymbal_monkey(); + self setweaponammoclip( "cymbal_monkey_zm", dc.zombie_cymbal_monkey_count ); + } + } } -tombstone_wobble() +tombstone_wobble() //checked matches cerberus output { - self endon( "tombstone_grabbed" ); - self endon( "tombstone_timedout" ); - - if ( isdefined( self ) ) - { - wait 1; - playfxontag( level._effect["powerup_on"], self, "tag_origin" ); - self playsound( "zmb_tombstone_spawn" ); - self playloopsound( "zmb_tombstone_looper" ); - } - - while ( isdefined( self ) ) - { - self rotateyaw( 360, 3 ); - wait 2.9; - } + self endon( "tombstone_grabbed" ); + self endon( "tombstone_timedout" ); + if ( isDefined( self ) ) + { + wait 1; + playfxontag( level._effect[ "powerup_on" ], self, "tag_origin" ); + self playsound( "zmb_tombstone_spawn" ); + self playloopsound( "zmb_tombstone_looper" ); + } + while ( isDefined( self ) ) + { + self rotateyaw( 360, 3 ); + wait 2.9; + } } -tombstone_timeout() +tombstone_timeout() //checked partially changed to match cerberus output { - self endon( "tombstone_grabbed" ); - self thread playtombstonetimeraudio(); - wait 48.5; - - for ( i = 0; i < 40; i++ ) - { - if ( i % 2 ) - self.icon ghost(); - else - self.icon show(); - - if ( i < 15 ) - { - wait 0.5; - continue; - } - - if ( i < 25 ) - { - wait 0.25; - continue; - } - - wait 0.1; - } - - self notify( "tombstone_timedout" ); - self.icon unlink(); - self.icon delete(); - self delete(); + self endon( "tombstone_grabbed" ); + self thread playtombstonetimeraudio(); + wait 48.5; + i = 0; + while ( i < 40 ) + { + if ( i % 2 ) + { + self.icon ghost(); + } + else + { + self.icon show(); + } + if ( i < 15 ) + { + wait 0.5; + i++; + continue; + } + if ( i < 25 ) + { + wait 0.25; + i++; + continue; + } + wait 0.1; + i++; + } + self notify( "tombstone_timedout" ); + self.icon unlink(); + self.icon delete(); + self delete(); } -playtombstonetimeraudio() +playtombstonetimeraudio() //checked matches cerberus output { - self endon( "tombstone_grabbed" ); - self endon( "tombstone_timedout" ); - player = self.player; - self thread playtombstonetimerout( player ); - - while ( true ) - { - player playsoundtoplayer( "zmb_tombstone_timer_count", player ); - wait 1; - } + self endon( "tombstone_grabbed" ); + self endon( "tombstone_timedout" ); + player = self.player; + self thread playtombstonetimerout( player ); + while ( 1 ) + { + player playsoundtoplayer( "zmb_tombstone_timer_count", player ); + wait 1; + } } -playtombstonetimerout( player ) +playtombstonetimerout( player ) //checked matches cerberus output { - self endon( "tombstone_grabbed" ); - - self waittill( "tombstone_timedout" ); - - player playsoundtoplayer( "zmb_tombstone_timer_out", player ); + self endon( "tombstone_grabbed" ); + self waittill( "tombstone_timedout" ); + player playsoundtoplayer( "zmb_tombstone_timer_out", player ); } -save_weapons_for_tombstone( player ) +save_weapons_for_tombstone( player ) //checked changed to match cerberus output { - self.tombstone_melee_weapons = []; + self.tombstone_melee_weapons = []; - for ( i = 0; i < level._melee_weapons.size; i++ ) - self save_weapon_for_tombstone( player, level._melee_weapons[i].weapon_name ); + for ( i = 0; i < level._melee_weapons.size; i++ ) + { + self save_weapon_for_tombstone( player, level._melee_weapons[ i ].weapon_name ); + } } -save_weapon_for_tombstone( player, weapon_name ) +save_weapon_for_tombstone( player, weapon_name ) //checked matches cerberus output { - if ( player hasweapon( weapon_name ) ) - self.tombstone_melee_weapons[weapon_name] = 1; + if ( player hasweapon( weapon_name ) ) + { + self.tombstone_melee_weapons[ weapon_name ] = 1; + } } restore_weapons_for_tombstone( player ) { - for ( i = 0; i < level._melee_weapons.size; i++ ) - self restore_weapon_for_tombstone( player, level._melee_weapons[i].weapon_name ); - - self.tombstone_melee_weapons = undefined; + for ( i = 0; i < level._melee_weapons.size; i++ ) + { + self restore_weapon_for_tombstone( player, level._melee_weapons[ i ].weapon_name ); + } + self.tombstone_melee_weapons = undefined; } -restore_weapon_for_tombstone( player, weapon_name ) +restore_weapon_for_tombstone( player, weapon_name ) //checked changed to match cerberus output { - if ( !isdefined( weapon_name ) || !isdefined( self.tombstone_melee_weapons ) || !isdefined( self.tombstone_melee_weapons[weapon_name] ) ) - return; - - if ( isdefined( self.tombstone_melee_weapons[weapon_name] ) && self.tombstone_melee_weapons[weapon_name] ) - { - player giveweapon( weapon_name ); - player change_melee_weapon( weapon_name, "none" ); - self.tombstone_melee_weapons[weapon_name] = 0; - } + if ( !isDefined( weapon_name ) || !isDefined( self.tombstone_melee_weapons ) || !isDefined( self.tombstone_melee_weapons[ weapon_name ] ) ) + { + return; + } + if ( is_true( self.tombstone_melee_weapons[ weapon_name ] ) ) + { + player giveweapon( weapon_name ); + player change_melee_weapon( weapon_name, "none" ); + self.tombstone_melee_weapons[ weapon_name ] = 0; + } } -tombstone_hostmigration() +tombstone_hostmigration() //checked changed to match cerberus output { - level endon( "end_game" ); - level notify( "tombstone_hostmigration" ); - level endon( "tombstone_hostmigration" ); - - while ( true ) - { - level waittill( "host_migration_end" ); - - tombstones = getentarray( "player_tombstone_model", "script_noteworthy" ); - - foreach ( model in tombstones ) - playfxontag( level._effect["powerup_on"], model, "tag_origin" ); - } + level endon( "end_game" ); + level notify( "tombstone_hostmigration" ); + level endon( "tombstone_hostmigration" ); + while ( 1 ) + { + level waittill( "host_migration_end" ); + tombstones = getentarray( "player_tombstone_model", "script_noteworthy" ); + foreach ( model in tombstones ) + { + playfxontag( level._effect[ "powerup_on" ], model, "tag_origin" ); + } + } } -is_weapon_available_in_tombstone( weapon, player_to_check ) +is_weapon_available_in_tombstone( 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; - - for ( tombstone_index = 0; tombstone_index < level.tombstones.size; tombstone_index++ ) - { - dc = level.tombstones[tombstone_index]; - - if ( !isdefined( dc.weapon ) ) - continue; - - if ( isdefined( player_to_check ) && dc.player != player_to_check ) - continue; - - for ( weapon_index = 0; weapon_index < dc.weapon.size; weapon_index++ ) - { - if ( !isdefined( dc.weapon[weapon_index] ) ) - continue; - - tombstone_weapon = dc.weapon[weapon_index]; - - if ( tombstone_weapon == weapon || tombstone_weapon == upgradedweapon ) - count++; - } - } - - return count; + count = 0; + upgradedweapon = weapon; + if ( isDefined( level.zombie_weapons[ weapon ] ) && isDefined( level.zombie_weapons[ weapon ].upgrade_name ) ) + { + upgradedweapon = level.zombie_weapons[ weapon ].upgrade_name; + } + tombstone_index = 0; + while ( tombstone_index < level.tombstones.size ) + { + dc = level.tombstones[ tombstone_index ]; + if ( !isDefined( dc.weapon ) ) + { + tombstone_index++; + continue; + } + if ( isDefined( player_to_check ) && dc.player != player_to_check ) + { + tombstone_index++; + continue; + } + weapon_index = 0; + while ( weapon_index < dc.weapon.size ) + { + if ( !isDefined( dc.weapon[ weapon_index ] ) ) + { + weapon_index++; + continue; + } + tombstone_weapon = dc.weapon[ weapon_index ]; + if ( tombstone_weapon == weapon || tombstone_weapon == upgradedweapon ) + { + count++; + } + weapon_index++; + } + tombstone_index++; + } + return count; } + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_traps.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_traps.gsc index dc3cb77..2596f3c 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_traps.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_traps.gsc @@ -1,877 +1,866 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_net; -#include maps\mp\_visionset_mgr; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\animscripts\zm_death; -#include maps\mp\zombies\_zm_weapons; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/animscripts/zm_death; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/_visionset_mgr; +#include maps/mp/zombies/_zm_net; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - level.trap_kills = 0; - traps = getentarray( "zombie_trap", "targetname" ); - array_thread( traps, ::trap_init ); - level thread register_visionsets( traps ); - level.burning_zombies = []; - level.elec_trap_time = 40; - level.elec_trap_cooldown_time = 60; + level.trap_kills = 0; + traps = getentarray( "zombie_trap", "targetname" ); + array_thread( traps, ::trap_init ); + level thread register_visionsets( traps ); + level.burning_zombies = []; + level.elec_trap_time = 40; + level.elec_trap_cooldown_time = 60; } -trap_init() +trap_init() //checked partially changed to match cerberus output //did not change for loop to while loop to prevent infinite loop bug caused by continue in a for loop { - self ent_flag_init( "flag_active" ); - self ent_flag_init( "flag_cooldown" ); - self._trap_type = ""; - - if ( isdefined( self.script_noteworthy ) ) - { - self._trap_type = self.script_noteworthy; - - if ( isdefined( level._zombiemode_trap_activate_funcs ) && isdefined( level._zombiemode_trap_activate_funcs[self._trap_type] ) ) - self._trap_activate_func = level._zombiemode_trap_activate_funcs[self._trap_type]; - else - { - switch ( self.script_noteworthy ) - { - case "rotating": - self._trap_activate_func = ::trap_activate_rotating; - break; - case "electric": - self._trap_activate_func = ::trap_activate_electric; - break; - case "flipper": - self._trap_activate_func = ::trap_activate_flipper; - break; - case "fire": - default: - self._trap_activate_func = ::trap_activate_fire; - } - } - - if ( isdefined( level._zombiemode_trap_use_funcs ) && isdefined( level._zombiemode_trap_use_funcs[self._trap_type] ) ) - self._trap_use_func = level._zombiemode_trap_use_funcs[self._trap_type]; - else - self._trap_use_func = ::trap_use_think; - } - - self trap_model_type_init(); - self._trap_use_trigs = []; - self._trap_lights = []; - self._trap_movers = []; - self._trap_switches = []; - components = getentarray( self.target, "targetname" ); - - for ( i = 0; i < components.size; i++ ) - { - if ( isdefined( components[i].script_noteworthy ) ) - { - switch ( components[i].script_noteworthy ) - { - case "counter_1s": - self.counter_1s = components[i]; - continue; - case "counter_10s": - self.counter_10s = components[i]; - continue; - case "counter_100s": - self.counter_100s = components[i]; - continue; - case "mover": - self._trap_movers[self._trap_movers.size] = components[i]; - continue; - case "switch": - self._trap_switches[self._trap_switches.size] = components[i]; - continue; - case "light": - self._trap_lightes[self._trap_lightes.size] = components[i]; - continue; - } - } - - if ( isdefined( components[i].script_string ) ) - { - switch ( components[i].script_string ) - { - case "flipper1": - self.flipper1 = components[i]; - continue; - case "flipper2": - self.flipper2 = components[i]; - continue; - case "flipper1_radius_check": - self.flipper1_radius_check = components[i]; - continue; - case "flipper2_radius_check": - self.flipper2_radius_check = components[i]; - continue; - case "target1": - self.target1 = components[i]; - continue; - case "target2": - self.target2 = components[i]; - continue; - case "target3": - self.target3 = components[i]; - continue; - } - } - - switch ( components[i].classname ) - { - case "trigger_use": - self._trap_use_trigs[self._trap_use_trigs.size] = components[i]; - continue; - case "script_model": - if ( components[i].model == self._trap_light_model_off ) - self._trap_lights[self._trap_lights.size] = components[i]; - else if ( components[i].model == self._trap_switch_model ) - self._trap_switches[self._trap_switches.size] = components[i]; - } - } - - self._trap_fx_structs = []; - components = getstructarray( self.target, "targetname" ); - - for ( i = 0; i < components.size; i++ ) - { - if ( isdefined( components[i].script_string ) && components[i].script_string == "use_this_angle" ) - { - self.use_this_angle = components[i]; - continue; - } - - self._trap_fx_structs[self._trap_fx_structs.size] = components[i]; - } -/# - assert( self._trap_use_trigs.size > 0, "_zm_traps::init no use triggers found for " + self.target ); -#/ - if ( !isdefined( self.zombie_cost ) ) - self.zombie_cost = 1000; - - self._trap_in_use = 0; - self._trap_cooling_down = 0; - self thread trap_dialog(); - flag_wait( "start_zombie_round_logic" ); - self trap_lights_red(); - - for ( i = 0; i < self._trap_use_trigs.size; i++ ) - self._trap_use_trigs[i] setcursorhint( "HINT_NOICON" ); - - if ( !isdefined( self.script_flag_wait ) ) - { - self trap_set_string( &"ZOMBIE_NEED_POWER" ); - flag_wait( "power_on" ); - } - else - { - if ( !isdefined( level.flag[self.script_flag_wait] ) ) - flag_init( self.script_flag_wait ); - - flag_wait( self.script_flag_wait ); - } - - self trap_set_string( &"ZOMBIE_BUTTON_BUY_TRAP", self.zombie_cost ); - self trap_lights_green(); - - for ( i = 0; i < self._trap_use_trigs.size; i++ ) - self._trap_use_trigs[i] thread [[ self._trap_use_func ]]( self ); + self ent_flag_init( "flag_active" ); + self ent_flag_init( "flag_cooldown" ); + self._trap_type = ""; + if ( isDefined( self.script_noteworthy ) ) + { + self._trap_type = self.script_noteworthy; + if ( isDefined( level._zombiemode_trap_activate_funcs ) && isDefined( level._zombiemode_trap_activate_funcs[ self._trap_type ] ) ) + { + self._trap_activate_func = level._zombiemode_trap_activate_funcs[ self._trap_type ]; + } + switch( self.script_noteworthy ) + { + case "rotating": + self._trap_activate_func = ::trap_activate_rotating; + break; + case "electric": + self._trap_activate_func = ::trap_activate_electric; + break; + case "flipper": + self._trap_activate_func = ::trap_activate_flipper; + break; + case "fire": + default: + self._trap_activate_func = ::trap_activate_fire; + } + if ( isDefined( level._zombiemode_trap_use_funcs ) && isDefined( level._zombiemode_trap_use_funcs[ self._trap_type ] ) ) + { + self._trap_use_func = level._zombiemode_trap_use_funcs[ self._trap_type ]; + } + else + { + self._trap_use_func = ::trap_use_think; + } + } + self trap_model_type_init(); + self._trap_use_trigs = []; + self._trap_lights = []; + self._trap_movers = []; + self._trap_switches = []; + components = getentarray( self.target, "targetname" ); + for ( i = 0; i < components.size; i++ ) + { + if ( isDefined( components[ i ].script_noteworthy ) ) + { + switch( components[ i ].script_noteworthy ) + { + case "counter_1s": + self.counter_1s = components[ i ]; + break; + case "counter_10s": + self.counter_10s = components[ i ]; + break; + case "counter_100s": + self.counter_100s = components[ i ]; + break; + case "mover": + self._trap_movers[ self._trap_movers.size ] = components[ i ]; + break; + case "switch": + self._trap_switches[ self._trap_switches.size ] = components[ i ]; + break; + case "light": + self._trap_lightes[ self._trap_lightes.size ] = components[ i ]; + break; + } + } + if ( isDefined( components[ i ].script_string ) ) + { + switch( components[ i ].script_string ) + { + case "flipper1": + self.flipper1 = components[ i ]; + break; + case "flipper2": + self.flipper2 = components[ i ]; + break; + case "flipper1_radius_check": + self.flipper1_radius_check = components[ i ]; + break; + case "flipper2_radius_check": + self.flipper2_radius_check = components[ i ]; + break; + case "target1": + self.target1 = components[ i ]; + break; + case "target2": + self.target2 = components[ i ]; + break; + case "target3": + self.target3 = components[ i ]; + break; + } + } + switch( components[ i ].classname ) + { + case "trigger_use": + self._trap_use_trigs[ self._trap_use_trigs.size ] = components[ i ]; + break; + case "script_model": + if ( components[ i ].model == self._trap_light_model_off ) + { + self._trap_lights[ self._trap_lights.size ] = components[ i ]; + } + else if ( components[ i ].model == self._trap_switch_model ) + { + self._trap_switches[ self._trap_switches.size ] = components[ i ]; + } + } + } + self._trap_fx_structs = []; + components = getstructarray( self.target, "targetname" ); + i = 0; + while ( i < components.size ) + { + if ( isDefined( components[ i ].script_string ) && components[ i ].script_string == "use_this_angle" ) + { + self.use_this_angle = components[ i ]; + i++; + continue; + } + self._trap_fx_structs[ self._trap_fx_structs.size ] = components[ i ]; + i++; + } + /* + /# + assert( self._trap_use_trigs.size > 0, "_zm_traps::init no use triggers found for " + self.target ); + #/ + */ + if ( !isDefined( self.zombie_cost ) ) + { + self.zombie_cost = 1000; + } + self._trap_in_use = 0; + self._trap_cooling_down = 0; + self thread trap_dialog(); + flag_wait( "start_zombie_round_logic" ); + self trap_lights_red(); + for ( i = 0; i < self._trap_use_trigs.size; i++ ) + { + self._trap_use_trigs[ i ] setcursorhint( "HINT_NOICON" ); + } + if ( !isDefined( self.script_flag_wait ) ) + { + self trap_set_string( &"ZOMBIE_NEED_POWER" ); + flag_wait( "power_on" ); + } + else if ( !isDefined( level.flag[ self.script_flag_wait ] ) ) + { + flag_init( self.script_flag_wait ); + } + flag_wait( self.script_flag_wait ); + self trap_set_string( &"ZOMBIE_BUTTON_BUY_TRAP", self.zombie_cost ); + self trap_lights_green(); + for ( i = 0; i < self._trap_use_trigs.size; i++ ) + { + self._trap_use_trigs[ i ] thread [[ self._trap_use_func ]]( self ); + } } -trap_use_think( trap ) +trap_use_think( trap ) //checked changed to match cerberus output { - while ( true ) - { - self waittill( "trigger", who ); - - if ( who in_revive_trigger() ) - continue; - - if ( is_player_valid( who ) && !trap._trap_in_use ) - { - if ( who.score >= trap.zombie_cost ) - who maps\mp\zombies\_zm_score::minus_to_player_score( trap.zombie_cost ); - else - continue; - - trap._trap_in_use = 1; - trap trap_set_string( &"ZOMBIE_TRAP_ACTIVE" ); - play_sound_at_pos( "purchase", who.origin ); - - if ( trap._trap_switches.size ) - { - trap thread trap_move_switches(); - - trap waittill( "switch_activated" ); - } - - trap trigger_on(); - trap thread [[ trap._trap_activate_func ]](); - - trap waittill( "trap_done" ); - - trap trigger_off(); - trap._trap_cooling_down = 1; - trap trap_set_string( &"ZOMBIE_TRAP_COOLDOWN" ); -/# - if ( getdvarint( _hash_FA81816F ) >= 1 ) - trap._trap_cooldown_time = 5; -#/ - wait( trap._trap_cooldown_time ); - trap._trap_cooling_down = 0; - trap notify( "available" ); - trap._trap_in_use = 0; - trap trap_set_string( &"ZOMBIE_BUTTON_BUY_TRAP", trap.zombie_cost ); - } - } + while ( 1 ) + { + self waittill( "trigger", who ); + if ( who in_revive_trigger() ) + { + continue; + } + if ( is_player_valid( who ) && !trap._trap_in_use ) + { + if ( who.score >= trap.zombie_cost ) + { + who maps/mp/zombies/_zm_score::minus_to_player_score( trap.zombie_cost ); + } + else + { + continue; + } + trap._trap_in_use = 1; + trap trap_set_string( &"ZOMBIE_TRAP_ACTIVE" ); + play_sound_at_pos( "purchase", who.origin ); + if ( trap._trap_switches.size ) + { + trap thread trap_move_switches(); + trap waittill( "switch_activated" ); + } + trap trigger_on(); + trap thread [[ trap._trap_activate_func ]](); + trap waittill( "trap_done" ); + trap trigger_off(); + trap._trap_cooling_down = 1; + trap trap_set_string( &"ZOMBIE_TRAP_COOLDOWN" ); + /* + /# + if ( getDvarInt( "zombie_cheat" ) >= 1 ) + { + trap._trap_cooldown_time = 5; + #/ + } + */ + wait trap._trap_cooldown_time; + trap._trap_cooling_down = 0; + trap notify( "available" ); + trap._trap_in_use = 0; + trap trap_set_string( &"ZOMBIE_BUTTON_BUY_TRAP", trap.zombie_cost ); + } + } } -trap_lights_red() +trap_lights_red() //checked changed to match cerberus output { - for ( i = 0; i < self._trap_lights.size; i++ ) - { - light = self._trap_lights[i]; - light setmodel( self._trap_light_model_red ); - - if ( isdefined( light.fx ) ) - light.fx delete(); - - light.fx = maps\mp\zombies\_zm_net::network_safe_spawn( "trap_lights_red", 2, "script_model", light.origin ); - light.fx setmodel( "tag_origin" ); - light.fx.angles = light.angles; - playfxontag( level._effect["zapper_light_notready"], light.fx, "tag_origin" ); - } + for ( i = 0; i < self._trap_lights.size; i++ ) + { + light = self._trap_lights[ i ]; + light setmodel( self._trap_light_model_red ); + if ( isDefined( light.fx ) ) + { + light.fx delete(); + } + light.fx = maps/mp/zombies/_zm_net::network_safe_spawn( "trap_lights_red", 2, "script_model", light.origin ); + light.fx setmodel( "tag_origin" ); + light.fx.angles = light.angles; + playfxontag( level._effect[ "zapper_light_notready" ], light.fx, "tag_origin" ); + } } -trap_lights_green() +trap_lights_green() //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug { - for ( i = 0; i < self._trap_lights.size; i++ ) - { - light = self._trap_lights[i]; - - if ( isdefined( light._switch_disabled ) ) - continue; - - light setmodel( self._trap_light_model_green ); - - if ( isdefined( light.fx ) ) - light.fx delete(); - - light.fx = maps\mp\zombies\_zm_net::network_safe_spawn( "trap_lights_green", 2, "script_model", light.origin ); - light.fx setmodel( "tag_origin" ); - light.fx.angles = light.angles; - playfxontag( level._effect["zapper_light_ready"], light.fx, "tag_origin" ); - } + i = 0; + while ( i < self._trap_lights.size ) + { + light = self._trap_lights[ i ]; + if ( isDefined( light._switch_disabled ) ) + { + i++; + continue; + } + light setmodel( self._trap_light_model_green ); + if ( isDefined( light.fx ) ) + { + light.fx delete(); + } + light.fx = maps/mp/zombies/_zm_net::network_safe_spawn( "trap_lights_green", 2, "script_model", light.origin ); + light.fx setmodel( "tag_origin" ); + light.fx.angles = light.angles; + playfxontag( level._effect[ "zapper_light_ready" ], light.fx, "tag_origin" ); + i++; + } } -trap_set_string( string, param1, param2 ) +trap_set_string( string, param1, param2 ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug with continues { - for ( i = 0; i < self._trap_use_trigs.size; i++ ) - { - if ( !isdefined( param1 ) ) - { - self._trap_use_trigs[i] sethintstring( string ); - continue; - } - - if ( !isdefined( param2 ) ) - { - self._trap_use_trigs[i] sethintstring( string, param1 ); - continue; - } - - self._trap_use_trigs[i] sethintstring( string, param1, param2 ); - } + i = 0; + while ( i < self._trap_use_trigs.size ) + { + if ( !isDefined( param1 ) ) + { + self._trap_use_trigs[ i ] sethintstring( string ); + i++; + continue; + } + if ( !isDefined( param2 ) ) + { + self._trap_use_trigs[ i ] sethintstring( string, param1 ); + i++; + continue; + } + self._trap_use_trigs[ i ] sethintstring( string, param1, param2 ); + i++; + } } -trap_move_switches() +trap_move_switches() //checked checked changed to match cerberus output { - self trap_lights_red(); - - for ( i = 0; i < self._trap_switches.size; i++ ) - { - self._trap_switches[i] rotatepitch( 180, 0.5 ); - self._trap_switches[i] playsound( "amb_sparks_l_b" ); - } - - self._trap_switches[0] waittill( "rotatedone" ); - - self notify( "switch_activated" ); - - self waittill( "available" ); - - for ( i = 0; i < self._trap_switches.size; i++ ) - self._trap_switches[i] rotatepitch( -180, 0.5 ); - - self._trap_switches[0] waittill( "rotatedone" ); - - self trap_lights_green(); + self trap_lights_red(); + for ( i = 0; i < self._trap_switches.size; i++ ) + { + self._trap_switches[ i ] rotatepitch( 180, 0,5 ); + self._trap_switches[ i ] playsound( "amb_sparks_l_b" ); + } + self._trap_switches[ 0 ] waittill( "rotatedone" ); + self notify( "switch_activated" ); + self waittill( "available" ); + for ( i = 0; i < self._trap_switches.size; i++ ) + { + self._trap_switches[ i ] rotatepitch( -180, 0,5 ); + } + self._trap_switches[ 0 ] waittill( "rotatedone" ); + self trap_lights_green(); } -trap_activate_electric() +trap_activate_electric() //checked changed to match cerberus output { - self._trap_duration = 40; - self._trap_cooldown_time = 60; - self notify( "trap_activate" ); - - if ( isdefined( self.script_string ) ) - { - number = int( self.script_string ); - - if ( number != 0 ) - exploder( number ); - else - clientnotify( self.script_string + "1" ); - } - - fx_points = getstructarray( self.target, "targetname" ); - - for ( i = 0; i < fx_points.size; i++ ) - { - wait_network_frame(); - fx_points[i] thread trap_audio_fx( self ); - } - - self thread trap_damage(); - wait( self._trap_duration ); - self notify( "trap_done" ); - - if ( isdefined( self.script_string ) ) - clientnotify( self.script_string + "0" ); + self._trap_duration = 40; + self._trap_cooldown_time = 60; + self notify( "trap_activate" ); + if ( isDefined( self.script_string ) ) + { + number = int( self.script_string ); + if ( number != 0 ) + { + exploder( number ); + } + else + { + clientnotify( self.script_string + "1" ); + } + } + fx_points = getstructarray( self.target, "targetname" ); + for ( i = 0; i < fx_points.size; i++ ) + { + wait_network_frame(); + fx_points[ i ] thread trap_audio_fx( self ); + } + self thread trap_damage(); + wait self._trap_duration; + self notify( "trap_done" ); + if ( isDefined( self.script_string ) ) + { + clientnotify( self.script_string + "0" ); + } } -trap_activate_fire() +trap_activate_fire() //checked changed to match cerberus output { - self._trap_duration = 40; - self._trap_cooldown_time = 60; - clientnotify( self.script_string + "1" ); - clientnotify( self.script_parameters ); - fx_points = getstructarray( self.target, "targetname" ); - - for ( i = 0; i < fx_points.size; i++ ) - { - wait_network_frame(); - fx_points[i] thread trap_audio_fx( self ); - } - - self thread trap_damage(); - wait( self._trap_duration ); - self notify( "trap_done" ); - clientnotify( self.script_string + "0" ); - clientnotify( self.script_parameters ); + self._trap_duration = 40; + self._trap_cooldown_time = 60; + clientnotify( self.script_string + "1" ); + clientnotify( self.script_parameters ); + fx_points = getstructarray( self.target, "targetname" ); + for ( i = 0; i < fx_points.size; i++ ) + { + wait_network_frame(); + fx_points[ i ] thread trap_audio_fx( self ); + } + self thread trap_damage(); + wait self._trap_duration; + self notify( "trap_done" ); + clientnotify( self.script_string + "0" ); + clientnotify( self.script_parameters ); } -trap_activate_rotating() +trap_activate_rotating() //checked partially changed to match cerberus output { - self endon( "trap_done" ); - self._trap_duration = 30; - self._trap_cooldown_time = 60; - self thread trap_damage(); - self thread trig_update( self._trap_movers[0] ); - old_angles = self._trap_movers[0].angles; - - for ( i = 0; i < self._trap_movers.size; i++ ) - self._trap_movers[i] rotateyaw( 360, 5.0, 4.5 ); - - wait 5.0; - step = 1.5; - - for ( t = 0; t < self._trap_duration; t += step ) - { - for ( i = 0; i < self._trap_movers.size; i++ ) - self._trap_movers[i] rotateyaw( 360, step ); - - wait( step ); - } - - for ( i = 0; i < self._trap_movers.size; i++ ) - self._trap_movers[i] rotateyaw( 360, 5.0, 0.0, 4.5 ); - - wait 5.0; - - for ( i = 0; i < self._trap_movers.size; i++ ) - self._trap_movers[i].angles = old_angles; - - self notify( "trap_done" ); + self endon( "trap_done" ); + self._trap_duration = 30; + self._trap_cooldown_time = 60; + self thread trap_damage(); + self thread trig_update( self._trap_movers[ 0 ] ); + old_angles = self._trap_movers[ 0 ].angles; + for ( i = 0; i < self._trap_movers.size; i++ ) + { + self._trap_movers[ i ] rotateyaw( 360, 5, 4.5 ); + } + wait 5; + step = 1.5; + t = 0; + while ( t < self._trap_duration ) //this would not make sense as a for loop leaving as a while loop + { + for ( i = 0; i < self._trap_movers.size; i++ ) + { + self._trap_movers[ i ] rotateyaw( 360, step ); + } + wait step; + t += step; + } + for ( i = 0; i < self._trap_movers.size; i++ ) + { + self._trap_movers[ i ] rotateyaw( 360, 5, 0, 4.5 ); + } + wait 5; + for ( i = 0; i < self._trap_movers.size; i++ ) + { + self._trap_movers[ i ].angles = old_angles; + } + self notify( "trap_done" ); } -trap_activate_flipper() +trap_activate_flipper() //checked matches cerberus output { - } -trap_audio_fx( trap ) +trap_audio_fx( trap ) //checked matches cerberus output { - sound_origin = undefined; - - if ( trap.script_noteworthy == "electric" ) - { - sound_origin = spawn( "script_origin", self.origin ); - sound_origin playsound( "zmb_elec_start" ); - sound_origin playloopsound( "zmb_elec_loop" ); - self thread play_electrical_sound( trap ); - } - else if ( trap.script_noteworthy == "fire" ) - { - sound_origin = spawn( "script_origin", self.origin ); - sound_origin playsound( "zmb_firetrap_start" ); - sound_origin playloopsound( "zmb_firetrap_loop" ); - } - - trap waittill_any_or_timeout( trap._trap_duration, "trap_done" ); - - if ( isdefined( sound_origin ) ) - { - if ( trap.script_noteworthy == "fire" ) - playsoundatposition( "zmb_firetrap_end", sound_origin.origin ); - - sound_origin stoploopsound(); - wait 0.05; - sound_origin delete(); - } + sound_origin = undefined; + if ( trap.script_noteworthy == "electric" ) + { + sound_origin = spawn( "script_origin", self.origin ); + sound_origin playsound( "zmb_elec_start" ); + sound_origin playloopsound( "zmb_elec_loop" ); + self thread play_electrical_sound( trap ); + } + else + { + if ( trap.script_noteworthy == "fire" ) + { + sound_origin = spawn( "script_origin", self.origin ); + sound_origin playsound( "zmb_firetrap_start" ); + sound_origin playloopsound( "zmb_firetrap_loop" ); + } + } + trap waittill_any_or_timeout( trap._trap_duration, "trap_done" ); + if ( isDefined( sound_origin ) ) + { + if ( trap.script_noteworthy == "fire" ) + { + playsoundatposition( "zmb_firetrap_end", sound_origin.origin ); + } + sound_origin stoploopsound(); + wait 0.05; + sound_origin delete(); + } } -play_electrical_sound( trap ) +play_electrical_sound( trap ) //checked matches cerberus output { - trap endon( "trap_done" ); - - while ( true ) - { - wait( randomfloatrange( 0.1, 0.5 ) ); - playsoundatposition( "zmb_elec_arc", self.origin ); - } + trap endon( "trap_done" ); + while ( 1 ) + { + wait randomfloatrange( 0.1, 0.5 ); + playsoundatposition( "zmb_elec_arc", self.origin ); + } } -trap_damage() +trap_damage() //checked partially changed to match cerberus output { - self endon( "trap_done" ); - - while ( true ) - { - self waittill( "trigger", ent ); - - if ( isplayer( ent ) ) - { - switch ( self._trap_type ) - { - case "electric": - ent thread player_elec_damage(); - break; - case "rocket": - case "fire": - ent thread player_fire_damage(); - break; - case "rotating": - if ( ent getstance() == "stand" ) - { - ent dodamage( 50, ent.origin + vectorscale( ( 0, 0, 1 ), 20.0 ) ); - ent setstance( "crouch" ); - } - - break; - } - } - else if ( !isdefined( ent.marked_for_death ) ) - { - switch ( self._trap_type ) - { - case "rocket": - ent thread zombie_trap_death( self, 100 ); - break; - case "rotating": - ent thread zombie_trap_death( self, 200 ); - break; - case "fire": - case "electric": - default: - ent thread zombie_trap_death( self, randomint( 100 ) ); - break; - } - } - } + self endon( "trap_done" ); + while ( 1 ) + { + self waittill( "trigger", ent ); + if ( isplayer( ent ) ) + { + switch( self._trap_type ) + { + case "electric": + ent thread player_elec_damage(); + break; + case "fire": + case "rocket": + ent thread player_fire_damage(); + break; + case "rotating": + if ( ent getstance() == "stand" ) + { + ent dodamage( 50, ent.origin + vectorScale( ( 0, 0, 1 ), 20 ) ); + ent setstance( "crouch" ); + } + break; + } + //break; //this doesn't make much sense commenting out + } + else if ( !isDefined( ent.marked_for_death ) ) + { + switch( self._trap_type ) + { + case "rocket": + ent thread zombie_trap_death( self, 100 ); + break; + break; + case "rotating": + ent thread zombie_trap_death( self, 200 ); + break; + break; + case "electric": + case "fire": + default: + ent thread zombie_trap_death( self, randomint( 100 ) ); + break; + } + } + } } -trig_update( parent ) +trig_update( parent ) //checked matches cerberus output { - self endon( "trap_done" ); - start_angles = self.angles; - - while ( true ) - { - self.angles = parent.angles; - wait 0.05; - } + self endon( "trap_done" ); + start_angles = self.angles; + while ( 1 ) + { + self.angles = parent.angles; + wait 0.05; + } } -player_elec_damage() +player_elec_damage() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - - if ( !isdefined( level.elec_loop ) ) - level.elec_loop = 0; - - if ( !isdefined( self.is_burning ) && is_player_valid( self ) ) - { - self.is_burning = 1; - - if ( is_true( level.trap_electric_visionset_registered ) ) - maps\mp\_visionset_mgr::vsmgr_activate( "overlay", "zm_trap_electric", self, 1.25, 1.25 ); - else - self setelectrified( 1.25 ); - - shocktime = 2.5; - self shellshock( "electrocution", shocktime ); - - if ( level.elec_loop == 0 ) - { - elec_loop = 1; - self playsound( "zmb_zombie_arc" ); - } - - if ( !self hasperk( "specialty_armorvest" ) || self.health - 100 < 1 ) - { - radiusdamage( self.origin, 10, self.health + 100, self.health + 100 ); - self.is_burning = undefined; - } - else - { - self dodamage( 50, self.origin ); - wait 0.1; - self.is_burning = undefined; - } - } + self endon( "death" ); + self endon( "disconnect" ); + if ( !isDefined( level.elec_loop ) ) + { + level.elec_loop = 0; + } + if ( !isDefined( self.is_burning ) && is_player_valid( self ) ) + { + self.is_burning = 1; + if ( is_true( level.trap_electric_visionset_registered ) ) + { + maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_trap_electric", self, 1.25, 1.25 ); + } + else + { + self setelectrified( 1.25 ); + } + shocktime = 2.5; + self shellshock( "electrocution", shocktime ); + if ( level.elec_loop == 0 ) + { + elec_loop = 1; + self playsound( "zmb_zombie_arc" ); + } + if ( !self hasperk( "specialty_armorvest" ) || self.health - 100 < 1 ) + { + radiusdamage( self.origin, 10, self.health + 100, self.health + 100 ); + self.is_burning = undefined; + } + else + { + self dodamage( 50, self.origin ); + wait 0.1; + self.is_burning = undefined; + } + } } -player_fire_damage() +player_fire_damage() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - - if ( !isdefined( self.is_burning ) && !self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - self.is_burning = 1; - - if ( is_true( level.trap_fire_visionset_registered ) ) - maps\mp\_visionset_mgr::vsmgr_activate( "overlay", "zm_trap_burn", self, 1.25, 1.25 ); - else - self setburn( 1.25 ); - - self notify( "burned" ); - - if ( !self hasperk( "specialty_armorvest" ) || self.health - 100 < 1 ) - { - radiusdamage( self.origin, 10, self.health + 100, self.health + 100 ); - self.is_burning = undefined; - } - else - { - self dodamage( 50, self.origin ); - wait 0.1; - self.is_burning = undefined; - } - } + self endon( "death" ); + self endon( "disconnect" ); + if ( !isDefined( self.is_burning ) && !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + self.is_burning = 1; + if ( is_true( level.trap_fire_visionset_registered ) ) + { + maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_trap_burn", self, 1.25, 1.25 ); + } + else + { + self setburn( 1.25 ); + } + self notify( "burned" ); + if ( !self hasperk( "specialty_armorvest" ) || self.health - 100 < 1 ) + { + radiusdamage( self.origin, 10, self.health + 100, self.health + 100 ); + self.is_burning = undefined; + } + else + { + self dodamage( 50, self.origin ); + wait 0.1; + self.is_burning = undefined; + } + } } -zombie_trap_death( trap, param ) +zombie_trap_death( trap, param ) //checked matches cerberus output { - self endon( "death" ); - self.marked_for_death = 1; - - switch ( trap._trap_type ) - { - case "rocket": - case "fire": - case "electric": - if ( isdefined( self.animname ) && self.animname != "zombie_dog" ) - { - if ( param > 90 && level.burning_zombies.size < 6 ) - { - level.burning_zombies[level.burning_zombies.size] = self; - self thread zombie_flame_watch(); - self playsound( "ignite" ); - self thread maps\mp\animscripts\zm_death::flame_death_fx(); - playfxontag( level._effect["character_fire_death_torso"], self, "J_SpineLower" ); - wait( randomfloat( 1.25 ) ); - } - else - { - refs[0] = "guts"; - refs[1] = "right_arm"; - refs[2] = "left_arm"; - refs[3] = "right_leg"; - refs[4] = "left_leg"; - refs[5] = "no_legs"; - refs[6] = "head"; - self.a.gib_ref = refs[randomint( refs.size )]; - playsoundatposition( "zmb_zombie_arc", self.origin ); - - if ( trap._trap_type == "electric" ) - { - if ( randomint( 100 ) > 50 ) - { - self thread electroctute_death_fx(); - self thread play_elec_vocals(); - } - } - - wait( randomfloat( 1.25 ) ); - self playsound( "zmb_zombie_arc" ); - } - } - - if ( isdefined( self.fire_damage_func ) ) - self [[ self.fire_damage_func ]]( trap ); - else - { - level notify( "trap_kill", self, trap ); - self dodamage( self.health + 666, self.origin, trap ); - } - - break; - case "rotating": - case "centrifuge": - ang = vectortoangles( trap.origin - self.origin ); - direction_vec = vectorscale( anglestoright( ang ), param ); - - if ( isdefined( self.trap_reaction_func ) ) - self [[ self.trap_reaction_func ]]( trap ); - - level notify( "trap_kill", self, trap ); - self startragdoll(); - self launchragdoll( direction_vec ); - wait_network_frame(); - self.a.gib_ref = "head"; - self dodamage( self.health, self.origin, trap ); - break; - } + self endon( "death" ); + self.marked_for_death = 1; + switch( trap._trap_type ) + { + case "electric": + case "fire": + case "rocket": + if ( isDefined( self.animname ) && self.animname != "zombie_dog" ) + { + if ( param > 90 && level.burning_zombies.size < 6 ) + { + level.burning_zombies[ level.burning_zombies.size ] = self; + self thread zombie_flame_watch(); + self playsound( "ignite" ); + self thread maps/mp/animscripts/zm_death::flame_death_fx(); + playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_SpineLower" ); + wait randomfloat( 1.25 ); + } + else + { + refs[ 0 ] = "guts"; + refs[ 1 ] = "right_arm"; + refs[ 2 ] = "left_arm"; + refs[ 3 ] = "right_leg"; + refs[ 4 ] = "left_leg"; + refs[ 5 ] = "no_legs"; + refs[ 6 ] = "head"; + self.a.gib_ref = refs[ randomint( refs.size ) ]; + playsoundatposition( "zmb_zombie_arc", self.origin ); + if ( trap._trap_type == "electric" ) + { + if ( randomint( 100 ) > 50 ) + { + self thread electroctute_death_fx(); + self thread play_elec_vocals(); + } + } + wait randomfloat( 1.25 ); + self playsound( "zmb_zombie_arc" ); + } + } + if ( isDefined( self.fire_damage_func ) ) + { + self [[ self.fire_damage_func ]]( trap ); + } + else + { + level notify( "trap_kill" ); + self dodamage( self.health + 666, self.origin, trap ); + } + break; + case "centrifuge": + case "rotating": + ang = vectorToAngle( trap.origin - self.origin ); + direction_vec = vectorScale( anglesToRight( ang ), param ); + if ( isDefined( self.trap_reaction_func ) ) + { + self [[ self.trap_reaction_func ]]( trap ); + } + level notify( "trap_kill" ); + self startragdoll(); + self launchragdoll( direction_vec ); + wait_network_frame(); + self.a.gib_ref = "head"; + self dodamage( self.health, self.origin, trap ); + break; + } } -zombie_flame_watch() +zombie_flame_watch() //checked matches cerberus output { - self waittill( "death" ); - - self stoploopsound(); - arrayremovevalue( level.burning_zombies, self ); + self waittill( "death" ); + self stoploopsound(); + arrayremovevalue( level.burning_zombies, self ); } -play_elec_vocals() +play_elec_vocals() //checked matches cerberus output { - if ( isdefined( self ) ) - { - org = self.origin; - wait 0.15; - playsoundatposition( "zmb_elec_vocals", org ); - playsoundatposition( "zmb_zombie_arc", org ); - playsoundatposition( "zmb_exp_jib_zombie", org ); - } + if ( isDefined( self ) ) + { + org = self.origin; + wait 0.15; + playsoundatposition( "zmb_elec_vocals", org ); + playsoundatposition( "zmb_zombie_arc", org ); + playsoundatposition( "zmb_exp_jib_zombie", org ); + } } -electroctute_death_fx() +electroctute_death_fx() //checked matches cerberus output { - self endon( "death" ); - - if ( isdefined( self.is_electrocuted ) && self.is_electrocuted ) - return; - - self.is_electrocuted = 1; - self thread electrocute_timeout(); - - if ( self.team == level.zombie_team ) - { - level.bconfiretime = gettime(); - level.bconfireorg = self.origin; - } - - if ( isdefined( level._effect["elec_torso"] ) ) - playfxontag( level._effect["elec_torso"], self, "J_SpineLower" ); - - self playsound( "zmb_elec_jib_zombie" ); - wait 1; - tagarray = []; - tagarray[0] = "J_Elbow_LE"; - tagarray[1] = "J_Elbow_RI"; - tagarray[2] = "J_Knee_RI"; - tagarray[3] = "J_Knee_LE"; - tagarray = array_randomize( tagarray ); - - if ( isdefined( level._effect["elec_md"] ) ) - playfxontag( level._effect["elec_md"], self, tagarray[0] ); - - self playsound( "zmb_elec_jib_zombie" ); - wait 1; - self playsound( "zmb_elec_jib_zombie" ); - tagarray[0] = "J_Wrist_RI"; - tagarray[1] = "J_Wrist_LE"; - - if ( !isdefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" ) - { - tagarray[2] = "J_Ankle_RI"; - tagarray[3] = "J_Ankle_LE"; - } - - tagarray = array_randomize( tagarray ); - - if ( isdefined( level._effect["elec_sm"] ) ) - { - playfxontag( level._effect["elec_sm"], self, tagarray[0] ); - playfxontag( level._effect["elec_sm"], self, tagarray[1] ); - } + self endon( "death" ); + if ( is_true( self.is_electrocuted ) ) + { + return; + } + self.is_electrocuted = 1; + self thread electrocute_timeout(); + if ( self.team == level.zombie_team ) + { + level.bconfiretime = getTime(); + level.bconfireorg = self.origin; + } + if ( isDefined( level._effect[ "elec_torso" ] ) ) + { + playfxontag( level._effect[ "elec_torso" ], self, "J_SpineLower" ); + } + self playsound( "zmb_elec_jib_zombie" ); + wait 1; + tagarray = []; + tagarray[ 0 ] = "J_Elbow_LE"; + tagarray[ 1 ] = "J_Elbow_RI"; + tagarray[ 2 ] = "J_Knee_RI"; + tagarray[ 3 ] = "J_Knee_LE"; + tagarray = array_randomize( tagarray ); + if ( isDefined( level._effect[ "elec_md" ] ) ) + { + playfxontag( level._effect[ "elec_md" ], self, tagarray[ 0 ] ); + } + self playsound( "zmb_elec_jib_zombie" ); + wait 1; + self playsound( "zmb_elec_jib_zombie" ); + tagarray[ 0 ] = "J_Wrist_RI"; + tagarray[ 1 ] = "J_Wrist_LE"; + if ( !isDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" ) + { + tagarray[ 2 ] = "J_Ankle_RI"; + tagarray[ 3 ] = "J_Ankle_LE"; + } + tagarray = array_randomize( tagarray ); + if ( isDefined( level._effect[ "elec_sm" ] ) ) + { + playfxontag( level._effect[ "elec_sm" ], self, tagarray[ 0 ] ); + playfxontag( level._effect[ "elec_sm" ], self, tagarray[ 1 ] ); + } } -electrocute_timeout() +electrocute_timeout() //checked matches cerberus output { - self endon( "death" ); - self playloopsound( "fire_manager_0" ); - wait 12; - self stoploopsound(); - - if ( isdefined( self ) && isalive( self ) ) - { - self.is_electrocuted = 0; - self notify( "stop_flame_damage" ); - } + self endon( "death" ); + self playloopsound( "fire_manager_0" ); + wait 12; + self stoploopsound(); + if ( isDefined( self ) && isalive( self ) ) + { + self.is_electrocuted = 0; + self notify( "stop_flame_damage" ); + } } -trap_dialog() +trap_dialog() //checked partially changed to match cerberus output //did not change while loop to for loop to prevent in the infinite for loop bug caused by continues { - self endon( "warning_dialog" ); - level endon( "switch_flipped" ); - timer = 0; - - while ( true ) - { - wait 0.5; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - dist = distancesquared( players[i].origin, self.origin ); - - if ( dist > 4900 ) - { - timer = 0; - continue; - } - - if ( dist < 4900 && timer < 3 ) - { - wait 0.5; - timer++; - } - - if ( dist < 4900 && timer == 3 ) - { - index = maps\mp\zombies\_zm_weapons::get_player_index( players[i] ); - plr = "plr_" + index + "_"; - wait 3; - self notify( "warning_dialog" ); - } - } - } + self endon( "warning_dialog" ); + level endon( "switch_flipped" ); + timer = 0; + while ( 1 ) + { + wait 0.5; + players = get_players(); + i = 0; + while ( i < players.size ) + { + dist = distancesquared( players[ i ].origin, self.origin ); + if ( dist > 4900 ) + { + timer = 0; + i++; + continue; + } + if ( dist < 4900 && timer < 3 ) + { + wait 0.5; + timer++; + } + if ( dist < 4900 && timer == 3 ) + { + index = maps/mp/zombies/_zm_weapons::get_player_index( players[ i ] ); + plr = "plr_" + index + "_"; + wait 3; + self notify( "warning_dialog" ); + } + i++; + } + } } -get_trap_array( trap_type ) +get_trap_array( trap_type ) //checked changed to match cerberus output { - ents = getentarray( "zombie_trap", "targetname" ); - traps = []; - - for ( i = 0; i < ents.size; i++ ) - { - if ( ents[i].script_noteworthy == trap_type ) - traps[traps.size] = ents[i]; - } - - return traps; + ents = getentarray( "zombie_trap", "targetname" ); + traps = []; + for ( i = 0; i < ents.size; i++ ) + { + if ( ents[ i ].script_noteworthy == trap_type ) + { + traps[ traps.size ] = ents[ i ]; + } + } + return traps; } -trap_disable() +trap_disable() //checked matches cerberus output { - cooldown = self._trap_cooldown_time; - - if ( self._trap_in_use ) - { - self notify( "trap_done" ); - self._trap_cooldown_time = 0.05; - - self waittill( "available" ); - } - - array_thread( self._trap_use_trigs, ::trigger_off ); - self trap_lights_red(); - self._trap_cooldown_time = cooldown; + cooldown = self._trap_cooldown_time; + if ( self._trap_in_use ) + { + self notify( "trap_done" ); + self._trap_cooldown_time = 0.05; + self waittill( "available" ); + } + array_thread( self._trap_use_trigs, ::trigger_off ); + self trap_lights_red(); + self._trap_cooldown_time = cooldown; } -trap_enable() +trap_enable() //checked matches cerberus output { - array_thread( self._trap_use_trigs, ::trigger_on ); - self trap_lights_green(); + array_thread( self._trap_use_trigs, ::trigger_on ); + self trap_lights_green(); } -trap_model_type_init() +trap_model_type_init() //checked matches cerberus output { - if ( !isdefined( self.script_parameters ) ) - self.script_parameters = "default"; - - switch ( self.script_parameters ) - { - case "pentagon_electric": - self._trap_light_model_off = "zombie_trap_switch_light"; - self._trap_light_model_green = "zombie_trap_switch_light_on_green"; - self._trap_light_model_red = "zombie_trap_switch_light_on_red"; - self._trap_switch_model = "zombie_trap_switch_handle"; - break; - case "default": - default: - self._trap_light_model_off = "zombie_zapper_cagelight"; - self._trap_light_model_green = "zombie_zapper_cagelight_green"; - self._trap_light_model_red = "zombie_zapper_cagelight_red"; - self._trap_switch_model = "zombie_zapper_handle"; - break; - } + if ( !isDefined( self.script_parameters ) ) + { + self.script_parameters = "default"; + } + switch( self.script_parameters ) + { + case "pentagon_electric": + self._trap_light_model_off = "zombie_trap_switch_light"; + self._trap_light_model_green = "zombie_trap_switch_light_on_green"; + self._trap_light_model_red = "zombie_trap_switch_light_on_red"; + self._trap_switch_model = "zombie_trap_switch_handle"; + break; + case "default": + default: + self._trap_light_model_off = "zombie_zapper_cagelight"; + self._trap_light_model_green = "zombie_zapper_cagelight_green"; + self._trap_light_model_red = "zombie_zapper_cagelight_red"; + self._trap_switch_model = "zombie_zapper_handle"; + break; + } } -register_visionsets( a_traps ) +register_visionsets( a_traps ) //checked changed to match cerberus output { - a_registered_traps = []; - - foreach ( trap in a_traps ) - { - if ( isdefined( trap.script_noteworthy ) ) - { - if ( !trap is_trap_registered( a_registered_traps ) ) - a_registered_traps[trap.script_noteworthy] = 1; - } - } - - keys = getarraykeys( a_registered_traps ); - - foreach ( key in keys ) - { - switch ( key ) - { - case "electric": - if ( !isdefined( level.vsmgr_prio_overlay_zm_trap_electrified ) ) - level.vsmgr_prio_overlay_zm_trap_electrified = 60; - - maps\mp\_visionset_mgr::vsmgr_register_info( "overlay", "zm_trap_electric", 16000, level.vsmgr_prio_overlay_zm_trap_electrified, 15, 1, maps\mp\_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 ); - level.trap_electric_visionset_registered = 1; - continue; - case "fire": - if ( !isdefined( level.vsmgr_prio_overlay_zm_trap_burn ) ) - level.vsmgr_prio_overlay_zm_trap_burn = 61; - - maps\mp\_visionset_mgr::vsmgr_register_info( "overlay", "zm_trap_burn", 16000, level.vsmgr_prio_overlay_zm_trap_burn, 15, 1, maps\mp\_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 ); - level.trap_fire_visionset_registered = 1; - continue; - } - } + a_registered_traps = []; + foreach ( trap in a_traps ) + { + if ( isDefined( trap.script_noteworthy ) ) + { + if ( !trap is_trap_registered( a_registered_traps ) ) + { + a_registered_traps[ trap.script_noteworthy ] = 1; + } + } + } + keys = getarraykeys( a_registered_traps ); + foreach ( key in keys ) + { + switch( key ) + { + case "electric": + if ( !isDefined( level.vsmgr_prio_overlay_zm_trap_electrified ) ) + { + level.vsmgr_prio_overlay_zm_trap_electrified = 60; + } + maps/mp/_visionset_mgr::vsmgr_register_info( "overlay", "zm_trap_electric", 16000, level.vsmgr_prio_overlay_zm_trap_electrified, 15, 1, ::maps/mp/_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 ); + level.trap_electric_visionset_registered = 1; + break; + case "fire": + if ( !isDefined( level.vsmgr_prio_overlay_zm_trap_burn ) ) + { + level.vsmgr_prio_overlay_zm_trap_burn = 61; + } + maps/mp/_visionset_mgr::vsmgr_register_info( "overlay", "zm_trap_burn", 16000, level.vsmgr_prio_overlay_zm_trap_burn, 15, 1, ::maps/mp/_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 ); + level.trap_fire_visionset_registered = 1; + break; + } + } } -is_trap_registered( a_registered_traps ) +is_trap_registered( a_registered_traps ) //checked matches cerberus output { - return isdefined( a_registered_traps[self.script_noteworthy] ); + return isDefined( a_registered_traps[ self.script_noteworthy ] ); } + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_turned.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_turned.gsc index cef6681..cd5ea5b 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_turned.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_turned.gsc @@ -1,423 +1,431 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\gametypes_zm\_hud_util; -#include maps\mp\_visionset_mgr; -#include maps\mp\gametypes_zm\_zm_gametype; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\gametypes_zm\_spawnlogic; +#include maps/mp/gametypes_zm/_spawnlogic; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/_visionset_mgr; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked matches cerberus output { - level.turnedmeleeweapon = "zombiemelee_zm"; - level.turnedmeleeweapon_dw = "zombiemelee_dw"; - precacheitem( level.turnedmeleeweapon ); - precacheitem( level.turnedmeleeweapon_dw ); - - if ( !( isdefined( level.custom_zombie_player_loadout_init ) && level.custom_zombie_player_loadout_init ) ) - { - precachemodel( "c_zom_player_zombie_fb" ); - precachemodel( "c_zom_zombie_viewhands" ); - } - - if ( !isdefined( level.vsmgr_prio_visionset_zombie_turned ) ) - level.vsmgr_prio_visionset_zombie_turned = 123; - - maps\mp\_visionset_mgr::vsmgr_register_info( "visionset", "zm_turned", 3000, level.vsmgr_prio_visionset_zombie_turned, 1, 1 ); - registerclientfield( "toplayer", "turned_ir", 3000, 1, "int" ); - registerclientfield( "allplayers", "player_has_eyes", 3000, 1, "int" ); - registerclientfield( "allplayers", "player_eyes_special", 5000, 1, "int" ); - level._effect["player_eye_glow"] = loadfx( "maps/zombie/fx_zombie_eye_returned_blue" ); - level._effect["player_eye_glow_orng"] = loadfx( "maps/zombie/fx_zombie_eye_returned_orng" ); - thread setup_zombie_exerts(); + level.turnedmeleeweapon = "zombiemelee_zm"; + level.turnedmeleeweapon_dw = "zombiemelee_dw"; + precacheitem( level.turnedmeleeweapon ); + precacheitem( level.turnedmeleeweapon_dw ); + if ( !is_true( level.custom_zombie_player_loadout_init ) ) + { + precachemodel( "c_zom_player_zombie_fb" ); + precachemodel( "c_zom_zombie_viewhands" ); + } + if ( !isDefined( level.vsmgr_prio_visionset_zombie_turned ) ) + { + level.vsmgr_prio_visionset_zombie_turned = 123; + } + maps/mp/_visionset_mgr::vsmgr_register_info( "visionset", "zm_turned", 3000, level.vsmgr_prio_visionset_zombie_turned, 1, 1 ); + registerclientfield( "toplayer", "turned_ir", 3000, 1, "int" ); + registerclientfield( "allplayers", "player_has_eyes", 3000, 1, "int" ); + registerclientfield( "allplayers", "player_eyes_special", 5000, 1, "int" ); + level._effect[ "player_eye_glow" ] = loadfx( "maps/zombie/fx_zombie_eye_returned_blue" ); + level._effect[ "player_eye_glow_orng" ] = loadfx( "maps/zombie/fx_zombie_eye_returned_orng" ); + thread setup_zombie_exerts(); } -setup_zombie_exerts() +setup_zombie_exerts() //checked matches cerberus output { - wait 0.05; - level.exert_sounds[1]["burp"] = "null"; - level.exert_sounds[1]["hitmed"] = "null"; - level.exert_sounds[1]["hitlrg"] = "null"; + wait 0.05; + level.exert_sounds[ 1 ][ "burp" ] = "null"; + level.exert_sounds[ 1 ][ "hitmed" ] = "null"; + level.exert_sounds[ 1 ][ "hitlrg" ] = "null"; } -delay_turning_on_eyes() +delay_turning_on_eyes() //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - wait_network_frame(); - wait 0.1; - self setclientfield( "player_has_eyes", 1 ); + self endon( "death" ); + self endon( "disconnect" ); + wait_network_frame(); + wait 0.1; + self setclientfield( "player_has_eyes", 1 ); } -turn_to_zombie() +turn_to_zombie() //checked changed to match cerberus output { - if ( self.sessionstate == "playing" && ( isdefined( self.is_zombie ) && self.is_zombie ) && !( isdefined( self.laststand ) && self.laststand ) ) - return; - - if ( isdefined( self.is_in_process_of_zombify ) && self.is_in_process_of_zombify ) - return; - - while ( isdefined( self.is_in_process_of_humanify ) && self.is_in_process_of_humanify ) - wait 0.1; - - if ( !flag( "pregame" ) ) - { - self playsoundtoplayer( "evt_spawn", self ); - playsoundatposition( "evt_disappear_3d", self.origin ); - - if ( !self.is_zombie ) - playsoundatposition( "vox_plr_" + randomintrange( 0, 4 ) + "_exert_death_high_" + randomintrange( 0, 4 ), self.origin ); - } - - self._can_score = 1; - self setclientfield( "player_has_eyes", 0 ); - self ghost(); - self turned_disable_player_weapons(); - self notify( "clear_red_flashing_overlay" ); - self notify( "zombify" ); - self.is_in_process_of_zombify = 1; - self.team = level.zombie_team; - self.pers["team"] = level.zombie_team; - self.sessionteam = level.zombie_team; - wait_network_frame(); - self maps\mp\gametypes_zm\_zm_gametype::onspawnplayer(); - self freezecontrols( 1 ); - self.is_zombie = 1; - self setburn( 0 ); - - if ( isdefined( self.turned_visionset ) && self.turned_visionset ) - { - maps\mp\_visionset_mgr::vsmgr_deactivate( "visionset", "zm_turned", self ); - wait_network_frame(); - wait_network_frame(); - - if ( !isdefined( self ) ) - return; - } - - maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_turned", self ); - self.turned_visionset = 1; - self setclientfieldtoplayer( "turned_ir", 1 ); - self maps\mp\zombies\_zm_audio::setexertvoice( 1 ); - self.laststand = undefined; - wait_network_frame(); - - if ( !isdefined( self ) ) - return; - - self enableweapons(); - self show(); - playsoundatposition( "evt_appear_3d", self.origin ); - playsoundatposition( "zmb_zombie_spawn", self.origin ); - self thread delay_turning_on_eyes(); - self thread turned_player_buttons(); - self setperk( "specialty_noname" ); - self setperk( "specialty_unlimitedsprint" ); - self setperk( "specialty_fallheight" ); - self turned_give_melee_weapon(); - self setmovespeedscale( 1.0 ); - self.animname = "zombie"; - self disableoffhandweapons(); - self allowstand( 1 ); - self allowprone( 0 ); - self allowcrouch( 0 ); - self allowads( 0 ); - self allowjump( 0 ); - self disableweaponcycling(); - self setmovespeedscale( 1 ); - self setsprintduration( 4 ); - self setsprintcooldown( 0 ); - self stopshellshock(); - self.maxhealth = 256; - self.health = 256; - self.meleedamage = 1000; - self detachall(); - - if ( isdefined( level.custom_zombie_player_loadout ) ) - self [[ level.custom_zombie_player_loadout ]](); - else - { - self setmodel( "c_zom_player_zombie_fb" ); - self.voice = "american"; - self.skeleton = "base"; - self setviewmodel( "c_zom_zombie_viewhands" ); - } - - self.shock_onpain = 0; - self disableinvulnerability(); - - if ( isdefined( level.player_movement_suppressed ) ) - self freezecontrols( level.player_movement_suppressed ); - else if ( !( isdefined( self.hostmigrationcontrolsfrozen ) && self.hostmigrationcontrolsfrozen ) ) - self freezecontrols( 0 ); - - self.is_in_process_of_zombify = 0; + if ( self.sessionstate == "playing" && is_true( self.is_zombie ) && !is_true( self.laststand ) ) + { + return; + } + if ( is_true( self.is_in_process_of_zombify ) ) + { + return; + } + while ( is_true( self.is_in_process_of_humanify ) ) + { + wait 0.1; + } + if ( !flag( "pregame" ) ) + { + self playsoundtoplayer( "evt_spawn", self ); + playsoundatposition( "evt_disappear_3d", self.origin ); + if ( !self.is_zombie ) + { + playsoundatposition( "vox_plr_" + randomintrange( 0, 4 ) + "_exert_death_high_" + randomintrange( 0, 4 ), self.origin ); + } + } + self._can_score = 1; + self setclientfield( "player_has_eyes", 0 ); + self ghost(); + self turned_disable_player_weapons(); + self notify( "clear_red_flashing_overlay" ); + self notify( "zombify" ); + self.is_in_process_of_zombify = 1; + self.team = level.zombie_team; + self.pers[ "team" ] = level.zombie_team; + self.sessionteam = level.zombie_team; + wait_network_frame(); + self maps/mp/gametypes_zm/_zm_gametype::onspawnplayer(); + self freezecontrols( 1 ); + self.is_zombie = 1; + self setburn( 0 ); + if ( is_true( self.turned_visionset ) ) + { + maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_turned", self ); + wait_network_frame(); + wait_network_frame(); + if ( !isDefined( self ) ) + { + return; + } + } + maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_turned", self ); + self.turned_visionset = 1; + self setclientfieldtoplayer( "turned_ir", 1 ); + self maps/mp/zombies/_zm_audio::setexertvoice( 1 ); + self.laststand = undefined; + wait_network_frame(); + if ( !isDefined( self ) ) + { + return; + } + self enableweapons(); + self show(); + playsoundatposition( "evt_appear_3d", self.origin ); + playsoundatposition( "zmb_zombie_spawn", self.origin ); + self thread delay_turning_on_eyes(); + self thread turned_player_buttons(); + self setperk( "specialty_noname" ); + self setperk( "specialty_unlimitedsprint" ); + self setperk( "specialty_fallheight" ); + self turned_give_melee_weapon(); + self setmovespeedscale( 1 ); + self.animname = "zombie"; + self disableoffhandweapons(); + self allowstand( 1 ); + self allowprone( 0 ); + self allowcrouch( 0 ); + self allowads( 0 ); + self allowjump( 0 ); + self disableweaponcycling(); + self setmovespeedscale( 1 ); + self setsprintduration( 4 ); + self setsprintcooldown( 0 ); + self stopshellshock(); + self.maxhealth = 256; + self.health = 256; + self.meleedamage = 1000; + self detachall(); + if ( isDefined( level.custom_zombie_player_loadout ) ) + { + self [[ level.custom_zombie_player_loadout ]](); + } + else + { + self setmodel( "c_zom_player_zombie_fb" ); + self.voice = "american"; + self.skeleton = "base"; + self setviewmodel( "c_zom_zombie_viewhands" ); + } + self.shock_onpain = 0; + self disableinvulnerability(); + if ( isDefined( level.player_movement_suppressed ) ) + { + self freezecontrols( level.player_movement_suppressed ); + } + else if ( isDefined( self.hostmigrationcontrolsfrozen ) && !self.hostmigrationcontrolsfrozen ) + { + self freezecontrols( 0 ); + } + self.is_in_process_of_zombify = 0; } -turn_to_human() +turn_to_human() //checked changed to match cerberus output { - if ( self.sessionstate == "playing" && !( isdefined( self.is_zombie ) && self.is_zombie ) && !( isdefined( self.laststand ) && self.laststand ) ) - return; - - if ( isdefined( self.is_in_process_of_humanify ) && self.is_in_process_of_humanify ) - return; - - while ( isdefined( self.is_in_process_of_zombify ) && self.is_in_process_of_zombify ) - wait 0.1; - - self playsoundtoplayer( "evt_spawn", self ); - playsoundatposition( "evt_disappear_3d", self.origin ); - self setclientfield( "player_has_eyes", 0 ); - self ghost(); - self notify( "humanify" ); - self.is_in_process_of_humanify = 1; - self.is_zombie = 0; - self notify( "clear_red_flashing_overlay" ); - self.team = self.prevteam; - self.pers["team"] = self.prevteam; - self.sessionteam = self.prevteam; - wait_network_frame(); - self maps\mp\gametypes_zm\_zm_gametype::onspawnplayer(); - self.maxhealth = 100; - self.health = 100; - self freezecontrols( 1 ); - - if ( self hasweapon( "death_throe_zm" ) ) - self takeweapon( "death_throe_zm" ); - - self unsetperk( "specialty_noname" ); - self unsetperk( "specialty_unlimitedsprint" ); - self unsetperk( "specialty_fallheight" ); - self turned_enable_player_weapons(); - self maps\mp\zombies\_zm_audio::setexertvoice( 0 ); - self.turned_visionset = 0; - maps\mp\_visionset_mgr::vsmgr_deactivate( "visionset", "zm_turned", self ); - self setclientfieldtoplayer( "turned_ir", 0 ); - self setmovespeedscale( 1.0 ); - self.ignoreme = 0; - self.shock_onpain = 1; - self enableweaponcycling(); - self allowstand( 1 ); - self allowprone( 1 ); - self allowcrouch( 1 ); - self allowads( 1 ); - self allowjump( 1 ); - self turnedhuman(); - self enableoffhandweapons(); - self stopshellshock(); - self.laststand = undefined; - self.is_burning = undefined; - self.meleedamage = undefined; - self detachall(); - self [[ level.givecustomcharacters ]](); - - if ( !self hasweapon( "knife_zm" ) ) - self giveweapon( "knife_zm" ); - - wait_network_frame(); - - if ( !isdefined( self ) ) - return; - - self disableinvulnerability(); - - if ( isdefined( level.player_movement_suppressed ) ) - self freezecontrols( level.player_movement_suppressed ); - else if ( !( isdefined( self.hostmigrationcontrolsfrozen ) && self.hostmigrationcontrolsfrozen ) ) - self freezecontrols( 0 ); - - self show(); - playsoundatposition( "evt_appear_3d", self.origin ); - self.is_in_process_of_humanify = 0; + if ( self.sessionstate == "playing" && !is_true( self.is_zombie ) && !is_true( self.laststand ) ) + { + return; + } + if ( is_true( self.is_in_process_of_humanify ) ) + { + return; + } + while ( is_true( self.is_in_process_of_zombify ) ) + { + wait 0.1; + } + self playsoundtoplayer( "evt_spawn", self ); + playsoundatposition( "evt_disappear_3d", self.origin ); + self setclientfield( "player_has_eyes", 0 ); + self ghost(); + self notify( "humanify" ); + self.is_in_process_of_humanify = 1; + self.is_zombie = 0; + self notify( "clear_red_flashing_overlay" ); + self.team = self.prevteam; + self.pers[ "team" ] = self.prevteam; + self.sessionteam = self.prevteam; + wait_network_frame(); + self maps/mp/gametypes_zm/_zm_gametype::onspawnplayer(); + self.maxhealth = 100; + self.health = 100; + self freezecontrols( 1 ); + if ( self hasweapon( "death_throe_zm" ) ) + { + self takeweapon( "death_throe_zm" ); + } + self unsetperk( "specialty_noname" ); + self unsetperk( "specialty_unlimitedsprint" ); + self unsetperk( "specialty_fallheight" ); + self turned_enable_player_weapons(); + self maps/mp/zombies/_zm_audio::setexertvoice( 0 ); + self.turned_visionset = 0; + maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_turned", self ); + self setclientfieldtoplayer( "turned_ir", 0 ); + self setmovespeedscale( 1 ); + self.ignoreme = 0; + self.shock_onpain = 1; + self enableweaponcycling(); + self allowstand( 1 ); + self allowprone( 1 ); + self allowcrouch( 1 ); + self allowads( 1 ); + self allowjump( 1 ); + self turnedhuman(); + self enableoffhandweapons(); + self stopshellshock(); + self.laststand = undefined; + self.is_burning = undefined; + self.meleedamage = undefined; + self detachall(); + self [[ level.givecustomcharacters ]](); + if ( !self hasweapon( "knife_zm" ) ) + { + self giveweapon( "knife_zm" ); + } + wait_network_frame(); + if ( !isDefined( self ) ) + { + return; + } + self disableinvulnerability(); + if ( isDefined( level.player_movement_suppressed ) ) + { + self freezecontrols( level.player_movement_suppressed ); + } + else if ( !is_true( self.hostmigrationcontrolsfrozen ) ) + { + self freezecontrols( 0 ); + } + self show(); + playsoundatposition( "evt_appear_3d", self.origin ); + self.is_in_process_of_humanify = 0; } -deletezombiesinradius( origin ) +deletezombiesinradius( origin ) //checked changed to match cerberus output { - zombies = get_round_enemy_array(); - maxradius = 128; - - foreach ( zombie in zombies ) - { - if ( isdefined( zombie ) && isalive( zombie ) && !( isdefined( zombie.is_being_used_as_spawner ) && zombie.is_being_used_as_spawner ) ) - { - if ( distancesquared( zombie.origin, origin ) < maxradius * maxradius ) - { - playfx( level._effect["wood_chunk_destory"], zombie.origin ); - zombie thread silentlyremovezombie(); - } - - wait 0.05; - } - } + zombies = get_round_enemy_array(); + maxradius = 128; + foreach ( zombie in zombies ) + { + if ( isDefined( zombie ) && isalive( zombie ) && !is_true( zombie.is_being_used_as_spawner ) ) + { + if ( distancesquared( zombie.origin, origin ) < ( maxradius * maxradius ) ) + { + playfx( level._effect[ "wood_chunk_destory" ], zombie.origin ); + zombie thread silentlyremovezombie(); + } + wait 0.05; + } + } } -turned_give_melee_weapon() +turned_give_melee_weapon() //checked matches cerberus output { + /* /# - assert( isdefined( self.turnedmeleeweapon ) ); + assert( isDefined( self.turnedmeleeweapon ) ); #/ /# - assert( self.turnedmeleeweapon != "none" ); + assert( self.turnedmeleeweapon != "none" ); #/ - self.turned_had_knife = self hasweapon( "knife_zm" ); - - if ( isdefined( self.turned_had_knife ) && self.turned_had_knife ) - self takeweapon( "knife_zm" ); - - self giveweapon( self.turnedmeleeweapon_dw ); - self givemaxammo( self.turnedmeleeweapon_dw ); - self giveweapon( self.turnedmeleeweapon ); - self givemaxammo( self.turnedmeleeweapon ); - self switchtoweapon( self.turnedmeleeweapon_dw ); - self switchtoweapon( self.turnedmeleeweapon ); + */ + self.turned_had_knife = self hasweapon( "knife_zm" ); + if ( is_true( self.turned_had_knife ) ) + { + self takeweapon( "knife_zm" ); + } + self giveweapon( self.turnedmeleeweapon_dw ); + self givemaxammo( self.turnedmeleeweapon_dw ); + self giveweapon( self.turnedmeleeweapon ); + self givemaxammo( self.turnedmeleeweapon ); + self switchtoweapon( self.turnedmeleeweapon_dw ); + self switchtoweapon( self.turnedmeleeweapon ); } -turned_player_buttons() +turned_player_buttons() //checked changed to match cerberus output { - self endon( "disconnect" ); - self endon( "humanify" ); - level endon( "end_game" ); - - while ( isdefined( self.is_zombie ) && self.is_zombie ) - { - if ( self attackbuttonpressed() || self adsbuttonpressed() || self meleebuttonpressed() ) - { - if ( cointoss() ) - self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "attack", undefined ); - - while ( self attackbuttonpressed() || self adsbuttonpressed() || self meleebuttonpressed() ) - wait 0.05; - } - - if ( self usebuttonpressed() ) - { - self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "taunt", undefined ); - - while ( self usebuttonpressed() ) - wait 0.05; - } - - if ( self issprinting() ) - { - while ( self issprinting() ) - { - self thread maps\mp\zombies\_zm_audio::do_zombies_playvocals( "sprint", undefined ); - wait 0.05; - } - } - - wait 0.05; - } + self endon( "disconnect" ); + self endon( "humanify" ); + level endon( "end_game" ); + while ( is_true( self.is_zombie ) ) + { + if ( self attackbuttonpressed() || self adsbuttonpressed() || self meleebuttonpressed() ) + { + if ( cointoss() ) + { + self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "attack", undefined ); + } + while ( self attackbuttonpressed() || self adsbuttonpressed() || self meleebuttonpressed() ) + { + wait 0.05; + } + } + if ( self usebuttonpressed() ) + { + self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "taunt", undefined ); + while ( self usebuttonpressed() ) + { + wait 0.05; + } + } + if ( self issprinting() ) + { + while ( self issprinting() ) + { + self thread maps/mp/zombies/_zm_audio::do_zombies_playvocals( "sprint", undefined ); + wait 0.05; + } + } + wait 0.05; + } } -turned_disable_player_weapons() +turned_disable_player_weapons() //checked matches cerberus output { - if ( isdefined( self.is_zombie ) && self.is_zombie ) - return; - - weaponinventory = self getweaponslist(); - self.lastactiveweapon = self getcurrentweapon(); - self setlaststandprevweap( self.lastactiveweapon ); - self.laststandpistol = undefined; - self.hadpistol = 0; - - if ( !isdefined( self.turnedmeleeweapon ) ) - self.turnedmeleeweapon = level.turnedmeleeweapon; - - if ( !isdefined( self.turnedmeleeweapon_dw ) ) - self.turnedmeleeweapon_dw = level.turnedmeleeweapon_dw; - - self takeallweapons(); - self disableweaponcycling(); + if ( is_true( self.is_zombie ) ) + { + return; + } + weaponinventory = self getweaponslist(); + self.lastactiveweapon = self getcurrentweapon(); + self setlaststandprevweap( self.lastactiveweapon ); + self.laststandpistol = undefined; + self.hadpistol = 0; + if ( !isDefined( self.turnedmeleeweapon ) ) + { + self.turnedmeleeweapon = level.turnedmeleeweapon; + } + if ( !isDefined( self.turnedmeleeweapon_dw ) ) + { + self.turnedmeleeweapon_dw = level.turnedmeleeweapon_dw; + } + self takeallweapons(); + self disableweaponcycling(); } -turned_enable_player_weapons() +turned_enable_player_weapons() //checked changed to match cerberus output { - self takeallweapons(); - self enableweaponcycling(); - self enableoffhandweapons(); - self.turned_had_knife = undefined; - - if ( isdefined( level.humanify_custom_loadout ) ) - { - self thread [[ level.humanify_custom_loadout ]](); - return; - } - else if ( !self hasweapon( "rottweil72_zm" ) ) - { - self giveweapon( "rottweil72_zm" ); - self switchtoweapon( "rottweil72_zm" ); - } - - if ( !( isdefined( self.is_zombie ) && self.is_zombie ) && !self hasweapon( level.start_weapon ) ) - { - if ( !self hasweapon( "knife_zm" ) ) - self giveweapon( "knife_zm" ); - - self give_start_weapon( 0 ); - } - - if ( self hasweapon( "rottweil72_zm" ) ) - { - self setweaponammoclip( "rottweil72_zm", 2 ); - self setweaponammostock( "rottweil72_zm", 0 ); - } - - if ( self hasweapon( level.start_weapon ) ) - self givemaxammo( level.start_weapon ); - - if ( self hasweapon( self get_player_lethal_grenade() ) ) - self getweaponammoclip( self get_player_lethal_grenade() ); - else - self giveweapon( self get_player_lethal_grenade() ); - - self setweaponammoclip( self get_player_lethal_grenade(), 2 ); + self takeallweapons(); + self enableweaponcycling(); + self enableoffhandweapons(); + self.turned_had_knife = undefined; + if ( isDefined( level.humanify_custom_loadout ) ) + { + self thread [[ level.humanify_custom_loadout ]](); + return; + } + else if ( !self hasweapon( "rottweil72_zm" ) ) + { + self giveweapon( "rottweil72_zm" ); + self switchtoweapon( "rottweil72_zm" ); + } + if ( !is_true( self.is_zombie ) && !self hasweapon( level.start_weapon ) ) + { + if ( !self hasweapon( "knife_zm" ) ) + { + self giveweapon( "knife_zm" ); + } + self give_start_weapon( 0 ); + } + if ( self hasweapon( "rottweil72_zm" ) ) + { + self setweaponammoclip( "rottweil72_zm", 2 ); + self setweaponammostock( "rottweil72_zm", 0 ); + } + if ( self hasweapon( level.start_weapon ) ) + { + self givemaxammo( level.start_weapon ); + } + if ( self hasweapon( self get_player_lethal_grenade() ) ) + { + self getweaponammoclip( self get_player_lethal_grenade() ); + } + else + { + self giveweapon( self get_player_lethal_grenade() ); + } + self setweaponammoclip( self get_player_lethal_grenade(), 2 ); } -get_farthest_available_zombie( player ) +get_farthest_available_zombie( player ) //checked changed to match cerberus output { - while ( true ) - { - zombies = get_array_of_closest( player.origin, getaiarray( level.zombie_team ) ); - - for ( x = 0; x < zombies.size; x++ ) - { - zombie = zombies[x]; - - if ( isdefined( zombie ) && isalive( zombie ) && !( isdefined( zombie.in_the_ground ) && zombie.in_the_ground ) && !( isdefined( zombie.gibbed ) && zombie.gibbed ) && !( isdefined( zombie.head_gibbed ) && zombie.head_gibbed ) && !( isdefined( zombie.is_being_used_as_spawnpoint ) && zombie.is_being_used_as_spawnpoint ) && zombie in_playable_area() ) - { - zombie.is_being_used_as_spawnpoint = 1; - return zombie; - } - } - - wait 0.05; - } + while ( 1 ) + { + zombies = get_array_of_closest( player.origin, getaiarray( level.zombie_team ) ); + for ( x = 0; x < zombies.size; x++ ) + { + zombie = zombies[ x ]; + if ( isDefined( zombie ) && isalive( zombie ) && !is_true( zombie.in_the_ground ) && !is_true( zombie.gibbed ) && !is_true( zombie.head_gibbed ) && !is_true( zombie.is_being_used_as_spawnpoint ) && zombie in_playable_area() ) + { + zombie.is_being_used_as_spawnpoint = 1; + return zombie; + } + } + wait 0.05; + } } -get_available_human() +get_available_human() //checked changed to match cerberus output { - players = get_players(); - - foreach ( player in players ) - { - if ( !( isdefined( player.is_zombie ) && player.is_zombie ) ) - return player; - } + players = get_players(); + foreach ( player in players ) + { + if ( !is_true( player.is_zombie ) ) + { + return player; + } + } } -silentlyremovezombie() +silentlyremovezombie() //checked matches cerberus output { - self.skip_death_notetracks = 1; - self.nodeathragdoll = 1; - self dodamage( self.maxhealth * 2, self.origin, self, self, "none", "MOD_SUICIDE" ); - self self_delete(); + self.skip_death_notetracks = 1; + self.nodeathragdoll = 1; + self dodamage( self.maxhealth * 2, self.origin, self, self, "none", "MOD_SUICIDE" ); + self self_delete(); } -getspawnpoint() +getspawnpoint() //checked matches cerberus output { - spawnpoint = self maps\mp\gametypes_zm\_spawnlogic::getspawnpoint_dm( level._turned_zombie_respawnpoints ); - return spawnpoint; + spawnpoint = self maps/mp/gametypes_zm/_spawnlogic::getspawnpoint_dm( level._turned_zombie_respawnpoints ); + return spawnpoint; } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_unitrigger.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_unitrigger.gsc index a4a35cf..b3e19e7 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_unitrigger.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_unitrigger.gsc @@ -1,717 +1,758 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_zonemgr; +#include maps/mp/zombies/_zm_zonemgr; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +init() //checked changed to match cerberus output { - level._unitriggers = spawnstruct(); - level._unitriggers._deferredinitlist = []; - level._unitriggers.trigger_pool = []; - level._unitriggers.trigger_stubs = []; - level._unitriggers.dynamic_stubs = []; - level._unitriggers.system_trigger_funcs = []; - level._unitriggers.largest_radius = 64; - stubs_keys = array( "unitrigger_radius", "unitrigger_radius_use", "unitrigger_box", "unitrigger_box_use" ); - stubs = []; - - for ( i = 0; i < stubs_keys.size; i++ ) - stubs = arraycombine( stubs, getstructarray( stubs_keys[i], "script_unitrigger_type" ), 1, 0 ); - - for ( i = 0; i < stubs.size; i++ ) - register_unitrigger( stubs[i] ); + level._unitriggers = spawnstruct(); + level._unitriggers._deferredinitlist = []; + level._unitriggers.trigger_pool = []; + level._unitriggers.trigger_stubs = []; + level._unitriggers.dynamic_stubs = []; + level._unitriggers.system_trigger_funcs = []; + level._unitriggers.largest_radius = 64; + stubs_keys = array( "unitrigger_radius", "unitrigger_radius_use", "unitrigger_box", "unitrigger_box_use" ); + stubs = []; + for ( i = 0; i < stubs_keys.size; i++ ) + { + stubs = arraycombine( stubs, getstructarray( stubs_keys[ i ], "script_unitrigger_type" ), 1, 0 ); + } + for ( i = 0; i < stubs.size; i++ ) + { + register_unitrigger( stubs[ i ] ); + } } -register_unitrigger_system_func( system, trigger_func ) +register_unitrigger_system_func( system, trigger_func ) //checked matches cerberus output { - level._unitriggers.system_trigger_funcs[system] = trigger_func; + level._unitriggers.system_trigger_funcs[ system ] = trigger_func; } -unitrigger_force_per_player_triggers( unitrigger_stub, opt_on_off ) +unitrigger_force_per_player_triggers( unitrigger_stub, opt_on_off ) //checked matches cerberus output { - if ( !isdefined( opt_on_off ) ) - opt_on_off = 1; - - unitrigger_stub.trigger_per_player = opt_on_off; + if ( !isDefined( opt_on_off ) ) + { + opt_on_off = 1; + } + unitrigger_stub.trigger_per_player = opt_on_off; } -unitrigger_trigger( player ) +unitrigger_trigger( player ) //checked matches cerberus output { - if ( self.trigger_per_player ) - return self.playertrigger[player getentitynumber()]; - else - return self.trigger; + if ( self.trigger_per_player ) + { + return self.playertrigger[ player getentitynumber() ]; + } + else + { + return self.trigger; + } } -unitrigger_origin() +unitrigger_origin() //checked matches cerberus output { - if ( isdefined( self.originfunc ) ) - origin = self [[ self.originfunc ]](); - else - origin = self.origin; - - return origin; + if ( isDefined( self.originfunc ) ) + { + origin = self [[ self.originfunc ]](); + } + else + { + origin = self.origin; + } + return origin; } -register_unitrigger_internal( unitrigger_stub, trigger_func ) +register_unitrigger_internal( unitrigger_stub, trigger_func ) //checked changed to match cerberus output { - if ( !isdefined( unitrigger_stub.script_unitrigger_type ) ) - { + if ( !isDefined( unitrigger_stub.script_unitrigger_type ) ) + { + /* /# - println( "Cannot register a unitrigger with no script_unitrigger_type. Ignoring." ); + println( "Cannot register a unitrigger with no script_unitrigger_type. Ignoring." ); #/ - return; - } - - if ( isdefined( trigger_func ) ) - unitrigger_stub.trigger_func = trigger_func; - else if ( isdefined( unitrigger_stub.unitrigger_system ) && isdefined( level._unitriggers.system_trigger_funcs[unitrigger_stub.unitrigger_system] ) ) - unitrigger_stub.trigger_func = level._unitriggers.system_trigger_funcs[unitrigger_stub.unitrigger_system]; - - switch ( unitrigger_stub.script_unitrigger_type ) - { - case "unitrigger_radius_use": - case "unitrigger_radius": - if ( !isdefined( unitrigger_stub.radius ) ) - unitrigger_stub.radius = 32; - - if ( !isdefined( unitrigger_stub.script_height ) ) - unitrigger_stub.script_height = 64; - - unitrigger_stub.test_radius_sq = ( unitrigger_stub.radius + 15.0 ) * ( unitrigger_stub.radius + 15.0 ); - break; - case "unitrigger_box_use": - case "unitrigger_box": - if ( !isdefined( unitrigger_stub.script_width ) ) - unitrigger_stub.script_width = 64; - - if ( !isdefined( unitrigger_stub.script_height ) ) - unitrigger_stub.script_height = 64; - - if ( !isdefined( unitrigger_stub.script_length ) ) - unitrigger_stub.script_length = 64; - - box_radius = length( ( unitrigger_stub.script_width / 2, unitrigger_stub.script_length / 2, unitrigger_stub.script_height / 2 ) ); - - if ( !isdefined( unitrigger_stub.radius ) || unitrigger_stub.radius < box_radius ) - unitrigger_stub.radius = box_radius; - - unitrigger_stub.test_radius_sq = ( box_radius + 15.0 ) * ( box_radius + 15.0 ); - break; - default: + */ + return; + } + if ( isDefined( trigger_func ) ) + { + unitrigger_stub.trigger_func = trigger_func; + } + else if ( isDefined( unitrigger_stub.unitrigger_system ) && isDefined( level._unitriggers.system_trigger_funcs[ unitrigger_stub.unitrigger_system ] ) ) + { + unitrigger_stub.trigger_func = level._unitriggers.system_trigger_funcs[ unitrigger_stub.unitrigger_system ]; + } + switch( unitrigger_stub.script_unitrigger_type ) + { + case "unitrigger_radius": + case "unitrigger_radius_use": + if ( !isDefined( unitrigger_stub.radius ) ) + { + unitrigger_stub.radius = 32; + } + if ( !isDefined( unitrigger_stub.script_height ) ) + { + unitrigger_stub.script_height = 64; + } + unitrigger_stub.test_radius_sq = ( unitrigger_stub.radius + 15 ) * ( unitrigger_stub.radius + 15 ); + break; + case "unitrigger_box": + case "unitrigger_box_use": + if ( !isDefined( unitrigger_stub.script_width ) ) + { + unitrigger_stub.script_width = 64; + } + if ( !isDefined( unitrigger_stub.script_height ) ) + { + unitrigger_stub.script_height = 64; + } + if ( !isDefined( unitrigger_stub.script_length ) ) + { + unitrigger_stub.script_length = 64; + } + box_radius = length( ( unitrigger_stub.script_width / 2, unitrigger_stub.script_length / 2, unitrigger_stub.script_height / 2 ) ); + if ( !isDefined( unitrigger_stub.radius ) || unitrigger_stub.radius < box_radius ) + { + unitrigger_stub.radius = box_radius; + } + unitrigger_stub.test_radius_sq = ( box_radius + 15 ) * ( box_radius + 15 ); + break; + default: + /* /# - println( "Unknown unitrigger type registered : " + unitrigger_stub.targetname + " - ignoring." ); + println( "Unknown unitrigger type registered : " + unitrigger_stub.targetname + " - ignoring." ); #/ - return; - } - - if ( unitrigger_stub.radius > level._unitriggers.largest_radius ) - { - level._unitriggers.largest_radius = min( 113.0, unitrigger_stub.radius ); - - if ( isdefined( level.fixed_max_player_use_radius ) ) - { - if ( level.fixed_max_player_use_radius > getdvarfloat( "player_useRadius_zm" ) ) - setdvar( "player_useRadius_zm", level.fixed_max_player_use_radius ); - } - else if ( level._unitriggers.largest_radius > getdvarfloat( "player_useRadius_zm" ) ) - setdvar( "player_useRadius_zm", level._unitriggers.largest_radius ); - } - - level._unitriggers.trigger_stubs[level._unitriggers.trigger_stubs.size] = unitrigger_stub; - unitrigger_stub.registered = 1; + */ + return; + } + if ( unitrigger_stub.radius > level._unitriggers.largest_radius ) + { + level._unitriggers.largest_radius = min( 113, unitrigger_stub.radius ); + if ( isDefined( level.fixed_max_player_use_radius ) ) + { + if ( level.fixed_max_player_use_radius > getDvarFloat( "player_useRadius_zm" ) ) + { + setdvar( "player_useRadius_zm", level.fixed_max_player_use_radius ); + } + } + else if ( level._unitriggers.largest_radius > getDvarFloat( "player_useRadius_zm" ) ) + { + setdvar( "player_useRadius_zm", level._unitriggers.largest_radius ); + } + } + level._unitriggers.trigger_stubs[ level._unitriggers.trigger_stubs.size ] = unitrigger_stub; + unitrigger_stub.registered = 1; } -register_unitrigger( unitrigger_stub, trigger_func ) +register_unitrigger( unitrigger_stub, trigger_func ) //checked matches cerberus output { - register_unitrigger_internal( unitrigger_stub, trigger_func ); - level._unitriggers.dynamic_stubs[level._unitriggers.dynamic_stubs.size] = unitrigger_stub; + register_unitrigger_internal( unitrigger_stub, trigger_func ); + level._unitriggers.dynamic_stubs[ level._unitriggers.dynamic_stubs.size ] = unitrigger_stub; } -unregister_unitrigger( unitrigger_stub ) +unregister_unitrigger( unitrigger_stub ) //checked matches cerberus output { - thread unregister_unitrigger_internal( unitrigger_stub ); + thread unregister_unitrigger_internal( unitrigger_stub ); } -unregister_unitrigger_internal( unitrigger_stub ) +unregister_unitrigger_internal( unitrigger_stub ) //checked changed to match cerberus output { - if ( !isdefined( unitrigger_stub ) ) - return; - - unitrigger_stub.registered = 0; - - if ( isdefined( unitrigger_stub.trigger_per_player ) && unitrigger_stub.trigger_per_player ) - { - if ( isdefined( unitrigger_stub.playertrigger ) && unitrigger_stub.playertrigger.size > 0 ) - { - keys = getarraykeys( unitrigger_stub.playertrigger ); - - foreach ( key in keys ) - { - trigger = unitrigger_stub.playertrigger[key]; - trigger notify( "kill_trigger" ); - - if ( isdefined( trigger ) ) - trigger delete(); - } - - unitrigger_stub.playertrigger = []; - } - } - else if ( isdefined( unitrigger_stub.trigger ) ) - { - trigger = unitrigger_stub.trigger; - trigger notify( "kill_trigger" ); - trigger.stub.trigger = undefined; - trigger delete(); - } - - if ( isdefined( unitrigger_stub.in_zone ) ) - { - arrayremovevalue( level.zones[unitrigger_stub.in_zone].unitrigger_stubs, unitrigger_stub ); - unitrigger_stub.in_zone = undefined; - } - - arrayremovevalue( level._unitriggers.trigger_stubs, unitrigger_stub ); - arrayremovevalue( level._unitriggers.dynamic_stubs, unitrigger_stub ); + if ( !isDefined( unitrigger_stub ) ) + { + return; + } + unitrigger_stub.registered = 0; + if ( is_true( unitrigger_stub.trigger_per_player ) ) + { + if ( isDefined( unitrigger_stub.playertrigger ) && unitrigger_stub.playertrigger.size > 0 ) + { + keys = getarraykeys( unitrigger_stub.playertrigger ); + foreach ( key in keys ) + { + trigger = unitrigger_stub.playertrigger[ key ]; + trigger notify( "kill_trigger" ); + if ( isDefined( trigger ) ) + { + trigger delete(); + } + } + unitrigger_stub.playertrigger = []; + } + } + else if ( isDefined( unitrigger_stub.trigger ) ) + { + trigger = unitrigger_stub.trigger; + trigger notify( "kill_trigger" ); + trigger.stub.trigger = undefined; + trigger delete(); + } + if ( isDefined( unitrigger_stub.in_zone ) ) + { + arrayremovevalue( level.zones[ unitrigger_stub.in_zone ].unitrigger_stubs, unitrigger_stub ); + unitrigger_stub.in_zone = undefined; + } + arrayremovevalue( level._unitriggers.trigger_stubs, unitrigger_stub ); + arrayremovevalue( level._unitriggers.dynamic_stubs, unitrigger_stub ); } -delay_delete_contact_ent() +delay_delete_contact_ent() //checked matches cerberus output { - self.last_used_time = 0; - - while ( true ) - { - wait 1; - - if ( gettime() - self.last_used_time > 1000 ) - { - self delete(); - level._unitriggers.contact_ent = undefined; - return; - } - } + self.last_used_time = 0; + while ( 1 ) + { + wait 1; + if ( getTime() - self.last_used_time > 1000 ) + { + self delete(); + level._unitriggers.contact_ent = undefined; + return; + } + } } -register_static_unitrigger( unitrigger_stub, trigger_func, recalculate_zone ) +register_static_unitrigger( unitrigger_stub, trigger_func, recalculate_zone ) //checked changed to match cerberus output { - if ( level.zones.size == 0 ) - { - unitrigger_stub.trigger_func = trigger_func; - level._unitriggers._deferredinitlist[level._unitriggers._deferredinitlist.size] = unitrigger_stub; - return; - } - - if ( !isdefined( level._unitriggers.contact_ent ) ) - { - level._unitriggers.contact_ent = spawn( "script_origin", ( 0, 0, 0 ) ); - level._unitriggers.contact_ent thread delay_delete_contact_ent(); - } - - register_unitrigger_internal( unitrigger_stub, trigger_func ); - - if ( !isdefined( level._no_static_unitriggers ) ) - { - level._unitriggers.contact_ent.last_used_time = gettime(); - level._unitriggers.contact_ent.origin = unitrigger_stub.origin; - - if ( isdefined( unitrigger_stub.in_zone ) && !isdefined( recalculate_zone ) ) - { - level.zones[unitrigger_stub.in_zone].unitrigger_stubs[level.zones[unitrigger_stub.in_zone].unitrigger_stubs.size] = unitrigger_stub; - return; - } - - keys = getarraykeys( level.zones ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( level._unitriggers.contact_ent maps\mp\zombies\_zm_zonemgr::entity_in_zone( keys[i], 1 ) ) - { - if ( !isdefined( level.zones[keys[i]].unitrigger_stubs ) ) - level.zones[keys[i]].unitrigger_stubs = []; - - level.zones[keys[i]].unitrigger_stubs[level.zones[keys[i]].unitrigger_stubs.size] = unitrigger_stub; - unitrigger_stub.in_zone = keys[i]; - return; - } - } - } - - level._unitriggers.dynamic_stubs[level._unitriggers.dynamic_stubs.size] = unitrigger_stub; - unitrigger_stub.registered = 1; + if ( level.zones.size == 0 ) + { + unitrigger_stub.trigger_func = trigger_func; + level._unitriggers._deferredinitlist[ level._unitriggers._deferredinitlist.size ] = unitrigger_stub; + return; + } + if ( !isDefined( level._unitriggers.contact_ent ) ) + { + level._unitriggers.contact_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + level._unitriggers.contact_ent thread delay_delete_contact_ent(); + } + register_unitrigger_internal( unitrigger_stub, trigger_func ); + if ( !isDefined( level._no_static_unitriggers ) ) + { + level._unitriggers.contact_ent.last_used_time = getTime(); + level._unitriggers.contact_ent.origin = unitrigger_stub.origin; + if ( isDefined( unitrigger_stub.in_zone ) && !isDefined( recalculate_zone ) ) + { + level.zones[ unitrigger_stub.in_zone ].unitrigger_stubs[ level.zones[ unitrigger_stub.in_zone ].unitrigger_stubs.size ] = unitrigger_stub; + return; + } + keys = getarraykeys( level.zones ); + for ( i = 0; i < keys.size; i++ ) + { + if ( level._unitriggers.contact_ent maps/mp/zombies/_zm_zonemgr::entity_in_zone( keys[ i ], 1 ) ) + { + if ( !isDefined( level.zones[ keys[ i ] ].unitrigger_stubs ) ) + { + level.zones[ keys[ i ] ].unitrigger_stubs = []; + } + level.zones[ keys[ i ] ].unitrigger_stubs[ level.zones[ keys[ i ] ].unitrigger_stubs.size ] = unitrigger_stub; + unitrigger_stub.in_zone = keys[ i ]; + return; + } + } + } + level._unitriggers.dynamic_stubs[ level._unitriggers.dynamic_stubs.size ] = unitrigger_stub; + unitrigger_stub.registered = 1; } -reregister_unitrigger_as_dynamic( unitrigger_stub ) +reregister_unitrigger_as_dynamic( unitrigger_stub ) //checked matches cerberus output { - unregister_unitrigger_internal( unitrigger_stub ); - register_unitrigger( unitrigger_stub, unitrigger_stub.trigger_func ); + unregister_unitrigger_internal( unitrigger_stub ); + register_unitrigger( unitrigger_stub, unitrigger_stub.trigger_func ); } -debug_unitriggers() +debug_unitriggers() //checked changed to match cerberus output dvar taken from beta dump { + /* /# - while ( true ) - { - if ( getdvarint( _hash_D256F24B ) > 0 ) - { - for ( i = 0; i < level._unitriggers.trigger_stubs.size; i++ ) - { - triggerstub = level._unitriggers.trigger_stubs[i]; - color = vectorscale( ( 1, 0, 0 ), 0.75 ); - - if ( !isdefined( triggerstub.in_zone ) ) - color = vectorscale( ( 1, 1, 0 ), 0.65 ); - else if ( level.zones[triggerstub.in_zone].is_active ) - color = ( 1, 1, 0 ); - - if ( isdefined( triggerstub.trigger ) || isdefined( triggerstub.playertrigger ) && triggerstub.playertrigger.size > 0 ) - { - color = ( 0, 1, 0 ); - - if ( isdefined( triggerstub.playertrigger ) && triggerstub.playertrigger.size > 0 ) - print3d( triggerstub.origin, triggerstub.playertrigger.size, color, 1, 1, 1 ); - } - - origin = triggerstub unitrigger_origin(); - - switch ( triggerstub.script_unitrigger_type ) - { - case "unitrigger_radius_use": - case "unitrigger_radius": - if ( triggerstub.radius ) - circle( origin, triggerstub.radius, color, 0, 0, 1 ); - - if ( triggerstub.script_height ) - line( origin, origin + ( 0, 0, triggerstub.script_height ), color, 0, 1 ); - - continue; - case "unitrigger_box_use": - case "unitrigger_box": - vec = ( triggerstub.script_width / 2, triggerstub.script_length / 2, triggerstub.script_height / 2 ); - box( origin, vec * -1, vec, triggerstub.angles[1], color, 1, 0, 1 ); - continue; - } - } - } - - wait 0.05; - } + while ( 1 ) + { + if ( getDvarInt( "debug_unitrigger" ) > 0 ) + { + for ( i = 0; i < level._unitriggers.trigger_stubs.size; i++ ) + { + triggerstub = level._unitriggers.trigger_stubs[ i ]; + color = vectorScale( ( 1, 0, 0 ), 0.75 ); + if ( !isDefined( triggerstub.in_zone ) ) + { + color = vectorScale( ( 1, 1, 0 ), 0.65 ); + } + else + { + if ( level.zones[ triggerstub.in_zone ].is_active ) + { + color = ( 1, 1, 0 ); + } + } + if ( isDefined( triggerstub.trigger ) || isDefined( triggerstub.playertrigger ) && triggerstub.playertrigger.size > 0 ) + { + color = ( 0, 1, 0 ); + if ( isDefined( triggerstub.playertrigger ) && triggerstub.playertrigger.size > 0 ) + { + print3d( triggerstub.origin, triggerstub.playertrigger.size, color, 1, 1, 1 ); + } + } + origin = triggerstub unitrigger_origin(); + switch( triggerstub.script_unitrigger_type ) + { + case "unitrigger_radius": + case "unitrigger_radius_use": + if ( triggerstub.radius ) + { + circle( origin, triggerstub.radius, color, 0, 0, 1 ); + } + if ( triggerstub.script_height ) + { + line( origin, origin + ( 0, 0, triggerstub.script_height ), color, 0, 1 ); + } + break; + case "unitrigger_box": + case "unitrigger_box_use": + vec = ( triggerstub.script_width / 2, triggerstub.script_length / 2, triggerstub.script_height / 2 ); + box( origin, vec * -1, vec, triggerstub.angles[ 1 ], color, 1, 0, 1 ); + break; + } + } + } + wait 0.05; #/ + } + */ } -cleanup_trigger( trigger, player ) +cleanup_trigger( trigger, player ) //checked changed to match cerberus output { - trigger notify( "kill_trigger" ); - - if ( isdefined( trigger.stub.trigger_per_player ) && trigger.stub.trigger_per_player ) - trigger.stub.playertrigger[player getentitynumber()] = undefined; - else - trigger.stub.trigger = undefined; - - trigger delete(); - level._unitriggers.trigger_pool[player getentitynumber()] = undefined; + trigger notify( "kill_trigger" ); + if ( is_true( trigger.stub.trigger_per_player ) ) + { + trigger.stub.playertrigger[player getentitynumber()] = undefined; + } + else + { + trigger.stub.trigger = undefined; + } + trigger delete(); + level._unitriggers.trigger_pool[player getentitynumber()] = undefined; } -assess_and_apply_visibility( trigger, stub, player, default_keep ) +assess_and_apply_visibility( trigger, stub, player, default_keep ) //checked changed to match cerberus output { - if ( !isdefined( trigger ) || !isdefined( stub ) ) - return 0; - - keep_thread = default_keep; - - if ( !isdefined( stub.prompt_and_visibility_func ) || trigger [[ stub.prompt_and_visibility_func ]]( player ) ) - { - keep_thread = 1; - - if ( !( isdefined( trigger.thread_running ) && trigger.thread_running ) ) - trigger thread trigger_thread( trigger.stub.trigger_func ); - - trigger.thread_running = 1; - - if ( isdefined( trigger.reassess_time ) && trigger.reassess_time <= 0.0 ) - trigger.reassess_time = undefined; - } - else - { - if ( isdefined( trigger.thread_running ) && trigger.thread_running ) - keep_thread = 0; - - trigger.thread_running = 0; - - if ( isdefined( stub.inactive_reasses_time ) ) - trigger.reassess_time = stub.inactive_reasses_time; - else - trigger.reassess_time = 1.0; - } - - return keep_thread; + if ( !isDefined( trigger ) || !isDefined( stub ) ) + { + return 0; + } + keep_thread = default_keep; + if ( !isDefined( stub.prompt_and_visibility_func ) || trigger [[ stub.prompt_and_visibility_func ]]( player ) ) + { + keep_thread = 1; + if ( !is_true( trigger.thread_running ) ) + { + trigger thread trigger_thread( trigger.stub.trigger_func ); + } + trigger.thread_running = 1; + if ( isDefined( trigger.reassess_time ) && trigger.reassess_time <= 0 ) + { + trigger.reassess_time = undefined; + } + } + else if ( is_true( trigger.thread_running ) ) + { + keep_thread = 0; + } + trigger.thread_running = 0; + if ( isDefined( stub.inactive_reasses_time ) ) + { + trigger.reassess_time = stub.inactive_reasses_time; + } + else + { + trigger.reassess_time = 1; + } + return keep_thread; } -main() +main() //checked against bo3 _zm_unitrigger.gsc and cerberus output changed at own discretion { - level thread debug_unitriggers(); - - if ( level._unitriggers._deferredinitlist.size ) - { - for ( i = 0; i < level._unitriggers._deferredinitlist.size; i++ ) - register_static_unitrigger( level._unitriggers._deferredinitlist[i], level._unitriggers._deferredinitlist[i].trigger_func ); - - for ( i = 0; i < level._unitriggers._deferredinitlist.size; i++ ) - level._unitriggers._deferredinitlist[i] = undefined; - - level._unitriggers._deferredinitlist = undefined; - } - - valid_range = level._unitriggers.largest_radius + 15.0; - valid_range_sq = valid_range * valid_range; - - while ( !isdefined( level.active_zone_names ) ) - wait 0.1; - - while ( true ) - { - waited = 0; - active_zone_names = level.active_zone_names; - candidate_list = []; - - for ( j = 0; j < active_zone_names.size; j++ ) - { - if ( isdefined( level.zones[active_zone_names[j]].unitrigger_stubs ) ) - candidate_list = arraycombine( candidate_list, level.zones[active_zone_names[j]].unitrigger_stubs, 1, 0 ); - } - - candidate_list = arraycombine( candidate_list, level._unitriggers.dynamic_stubs, 1, 0 ); - players = getplayers(); + level thread debug_unitriggers(); + if ( level._unitriggers._deferredinitlist.size ) + { + for ( i = 0; i < level._unitriggers._deferredinitlist.size; i++ ) + { + register_static_unitrigger( level._unitriggers._deferredinitlist[ i ], level._unitriggers._deferredinitlist[ i ].trigger_func ); + } + for ( i = 0; i < level._unitriggers._deferredinitlist.size; i++ ) + { + level._unitriggers._deferredinitlist[i] = undefined; + } + level._unitriggers._deferredinitlist = undefined; + } + valid_range = level._unitriggers.largest_radius + 15; + valid_range_sq = valid_range * valid_range; + while ( !isDefined( level.active_zone_names ) ) + { + wait 0.1; + } + while ( 1 ) + { + waited = 0; + active_zone_names = level.active_zone_names; + candidate_list = []; + for ( j = 0; j < active_zone_names.size; j++ ) + { + if ( isDefined( level.zones[ active_zone_names[ j ] ].unitrigger_stubs ) ) + { + candidate_list = arraycombine( candidate_list, level.zones[ active_zone_names[ j ] ].unitrigger_stubs, 1, 0 ); + } + } + candidate_list = arraycombine( candidate_list, level._unitriggers.dynamic_stubs, 1, 0 ); + players = getplayers(); + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + if ( !isDefined( player ) ) + { + i++; + continue; + } + player_origin = player.origin + vectorScale( ( 0, 0, 1 ), 35 ); + trigger = level._unitriggers.trigger_pool[ player getentitynumber() ]; + closest = []; + if ( isDefined( trigger ) ) + { + dst = valid_range_sq; + origin = trigger unitrigger_origin(); + dst = trigger.stub.test_radius_sq; + time_to_ressess = 0; + if ( distance2dsquared( player_origin, origin ) < dst ) + { + if ( isDefined( trigger.reassess_time ) ) + { + trigger.reassess_time -= 0.05; + if ( trigger.reassess_time > 0 ) + { + i++; + continue; + } + time_to_ressess = 1; + } + } + closest = get_closest_unitriggers( player_origin, candidate_list, valid_range ); + if ( isDefined( trigger ) && time_to_ressess && closest.size < 2 || is_true( trigger.thread_running ) ) + { + if ( assess_and_apply_visibility( trigger, trigger.stub, player, 1 ) ) + { + i++; + continue; + } + } + else if ( isDefined( trigger ) ) + { + cleanup_trigger( trigger, player ); + } + } + else + { + closest = get_closest_unitriggers( player_origin, candidate_list, valid_range ); + } + index = 0; + last_trigger = undefined; + while ( index < closest.size ) + { + if ( !maps/mp/zombies/_zm_utility::is_player_valid( player ) && !is_true( closest[ index ].ignore_player_valid ) ) + { + index++; + continue; + } + if ( !is_true( closest[ index ].registered ) ) + { + index++; + continue; + } + if ( isDefined( last_trigger ) ) + { + cleanup_trigger( last_trigger, player ); + last_trigger = undefined; + } + trigger = undefined; + if ( is_true( closest[ index ].trigger_per_player ) ) + { + if ( !isDefined( closest[ index ].playertrigger ) ) + { + closest[ index ].playertrigger = []; + } + if ( !isDefined( closest[ index ].playertrigger[ player getentitynumber() ] ) ) + { + trigger = build_trigger_from_unitrigger_stub( closest[ index ], player ); + level._unitriggers.trigger_pool[ player getentitynumber() ] = trigger; + } + } + else if ( !isDefined( closest[ index ].trigger ) ) + { + trigger = build_trigger_from_unitrigger_stub( closest[ index ], player ); + level._unitriggers.trigger_pool[ player getentitynumber() ] = trigger; + } + if ( isDefined( trigger ) ) + { + trigger.parent_player = player; + if ( assess_and_apply_visibility( trigger, closest[ index ], player, 0 ) ) + { + break; + } + last_trigger = trigger; + } + index++; + waited = 1; + wait 0.05; + } + i++; + } + if ( !waited ) + { + wait 0.05; + } + } +} +run_visibility_function_for_all_triggers() //checked changed to match cerberus output +{ + if ( !isDefined( self.prompt_and_visibility_func ) ) + { + return; + } + if ( is_true( self.trigger_per_player ) ) + { + if ( !isDefined( self.playertrigger ) ) + { + return; + } + players = getplayers(); for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( !isdefined( player ) ) - continue; - - player_origin = player.origin + vectorscale( ( 0, 0, 1 ), 35.0 ); - trigger = level._unitriggers.trigger_pool[player getentitynumber()]; - closest = []; - - if ( isdefined( trigger ) ) - { - dst = valid_range_sq; - origin = trigger unitrigger_origin(); - dst = trigger.stub.test_radius_sq; - time_to_ressess = 0; - - if ( distance2dsquared( player_origin, origin ) < dst ) - { - if ( isdefined( trigger.reassess_time ) ) - { - trigger.reassess_time -= 0.05; - - if ( trigger.reassess_time > 0.0 ) - continue; - - time_to_ressess = 1; - } - else - continue; - } - - closest = get_closest_unitriggers( player_origin, candidate_list, valid_range ); - - if ( isdefined( trigger ) && time_to_ressess && ( closest.size < 2 || isdefined( trigger.thread_running ) && trigger.thread_running ) ) - { - if ( assess_and_apply_visibility( trigger, trigger.stub, player, 1 ) ) - continue; - } - - if ( isdefined( trigger ) ) - cleanup_trigger( trigger, player ); - } - else - closest = get_closest_unitriggers( player_origin, candidate_list, valid_range ); - - index = 0; - last_trigger = undefined; - - while ( index < closest.size ) - { - if ( !is_player_valid( player ) && !( isdefined( closest[index].ignore_player_valid ) && closest[index].ignore_player_valid ) ) - { - index++; - continue; - } - - if ( !( isdefined( closest[index].registered ) && closest[index].registered ) ) - { - index++; - continue; - } - - if ( isdefined( last_trigger ) ) - { - cleanup_trigger( last_trigger, player ); - last_trigger = undefined; - } - - trigger = undefined; - - if ( isdefined( closest[index].trigger_per_player ) && closest[index].trigger_per_player ) - { - if ( !isdefined( closest[index].playertrigger ) ) - closest[index].playertrigger = []; - - if ( !isdefined( closest[index].playertrigger[player getentitynumber()] ) ) - { - trigger = build_trigger_from_unitrigger_stub( closest[index], player ); - level._unitriggers.trigger_pool[player getentitynumber()] = trigger; - } - } - else if ( !isdefined( closest[index].trigger ) ) - { - trigger = build_trigger_from_unitrigger_stub( closest[index], player ); - level._unitriggers.trigger_pool[player getentitynumber()] = trigger; - } - - if ( isdefined( trigger ) ) - { - trigger.parent_player = player; - - if ( assess_and_apply_visibility( trigger, closest[index], player, 0 ) ) - break; - - last_trigger = trigger; - } - - index++; - waited = 1; - wait 0.05; - } - } - - if ( !waited ) - wait 0.05; - } + { + if ( isDefined( self.playertrigger[ players[ i ] getentitynumber() ] ) ) + { + self.playertrigger[ players[ i ] getentitynumber() ] [[ self.prompt_and_visibility_func ]]( players[ i ] ); + } + } + } + else if ( isDefined( self.trigger ) ) + { + self.trigger [[ self.prompt_and_visibility_func ]]( getplayers()[ 0 ] ); + } } -run_visibility_function_for_all_triggers() +build_trigger_from_unitrigger_stub( stub, player ) //checked matches cerberus output { - if ( !isdefined( self.prompt_and_visibility_func ) ) - return; - - if ( isdefined( self.trigger_per_player ) && self.trigger_per_player ) - { - if ( !isdefined( self.playertrigger ) ) - return; - - players = getplayers(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( self.playertrigger[players[i] getentitynumber()] ) ) - self.playertrigger[players[i] getentitynumber()] [[ self.prompt_and_visibility_func ]]( players[i] ); - } - } - else if ( isdefined( self.trigger ) ) - self.trigger [[ self.prompt_and_visibility_func ]]( getplayers()[0] ); + if ( isDefined( level._zm_build_trigger_from_unitrigger_stub_override ) ) + { + if ( stub [[ level._zm_build_trigger_from_unitrigger_stub_override ]]( player ) ) + { + return; + } + } + radius = stub.radius; + if ( !isDefined( radius ) ) + { + radius = 64; + } + script_height = stub.script_height; + if ( !isDefined( script_height ) ) + { + script_height = 64; + } + script_width = stub.script_width; + if ( !isDefined( script_width ) ) + { + script_width = 64; + } + script_length = stub.script_length; + if ( !isDefined( script_length ) ) + { + script_length = 64; + } + trigger = undefined; + origin = stub unitrigger_origin(); + switch( stub.script_unitrigger_type ) + { + case "unitrigger_radius": + trigger = spawn( "trigger_radius", origin, 0, radius, script_height ); + break; + case "unitrigger_radius_use": + trigger = spawn( "trigger_radius_use", origin, 0, radius, script_height ); + break; + case "unitrigger_box": + trigger = spawn( "trigger_box", origin, 0, script_width, script_length, script_height ); + break; + case "unitrigger_box_use": + trigger = spawn( "trigger_box_use", origin, 0, script_width, script_length, script_height ); + break; + } + if ( isDefined( trigger ) ) + { + if ( isDefined( stub.angles ) ) + { + trigger.angles = stub.angles; + } + if ( isDefined( stub.onspawnfunc ) ) + { + stub [[ stub.onspawnfunc ]]( trigger ); + } + if ( isDefined( stub.cursor_hint ) ) + { + if ( stub.cursor_hint == "HINT_WEAPON" && isDefined( stub.cursor_hint_weapon ) ) + { + trigger setcursorhint( stub.cursor_hint, stub.cursor_hint_weapon ); + } + else + { + trigger setcursorhint( stub.cursor_hint ); + } + } + trigger triggerignoreteam(); + if ( is_true( stub.require_look_at ) ) + { + trigger usetriggerrequirelookat(); + } + if ( isDefined( stub.hint_string ) ) + { + if ( isDefined( stub.hint_parm2 ) ) + { + trigger sethintstring( stub.hint_string, stub.hint_parm1, stub.hint_parm2 ); + } + else if ( isDefined( stub.hint_parm1 ) ) + { + trigger sethintstring( stub.hint_string, stub.hint_parm1 ); + } + else if ( isDefined( stub.cost ) ) + { + trigger sethintstring( stub.hint_string, stub.cost ); + } + else + { + trigger sethintstring( stub.hint_string ); + } + } + trigger.stub = stub; + } + copy_zombie_keys_onto_trigger( trigger, stub ); + if ( is_true( stub.trigger_per_player ) ) + { + if ( isDefined( trigger ) ) + { + trigger setinvisibletoall(); + trigger setvisibletoplayer( player ); + } + if ( !isDefined( stub.playertrigger ) ) + { + stub.playertrigger = []; + } + stub.playertrigger[ player getentitynumber() ] = trigger; + } + else + { + stub.trigger = trigger; + } + trigger.thread_running = 0; + return trigger; } -build_trigger_from_unitrigger_stub( stub, player ) +copy_zombie_keys_onto_trigger( trig, stub ) //checked matches cerberus output { - if ( isdefined( level._zm_build_trigger_from_unitrigger_stub_override ) ) - { - if ( stub [[ level._zm_build_trigger_from_unitrigger_stub_override ]]( player ) ) - return; - } - - radius = stub.radius; - - if ( !isdefined( radius ) ) - radius = 64; - - script_height = stub.script_height; - - if ( !isdefined( script_height ) ) - script_height = 64; - - script_width = stub.script_width; - - if ( !isdefined( script_width ) ) - script_width = 64; - - script_length = stub.script_length; - - if ( !isdefined( script_length ) ) - script_length = 64; - - trigger = undefined; - origin = stub unitrigger_origin(); - - switch ( stub.script_unitrigger_type ) - { - case "unitrigger_radius": - trigger = spawn( "trigger_radius", origin, 0, radius, script_height ); - break; - case "unitrigger_radius_use": - trigger = spawn( "trigger_radius_use", origin, 0, radius, script_height ); - break; - case "unitrigger_box": - trigger = spawn( "trigger_box", origin, 0, script_width, script_length, script_height ); - break; - case "unitrigger_box_use": - trigger = spawn( "trigger_box_use", origin, 0, script_width, script_length, script_height ); - break; - } - - if ( isdefined( trigger ) ) - { - if ( isdefined( stub.angles ) ) - trigger.angles = stub.angles; - - if ( isdefined( stub.onspawnfunc ) ) - stub [[ stub.onspawnfunc ]]( trigger ); - - if ( isdefined( stub.cursor_hint ) ) - { - if ( stub.cursor_hint == "HINT_WEAPON" && isdefined( stub.cursor_hint_weapon ) ) - trigger setcursorhint( stub.cursor_hint, stub.cursor_hint_weapon ); - else - trigger setcursorhint( stub.cursor_hint ); - } - - trigger triggerignoreteam(); - - if ( isdefined( stub.require_look_at ) && stub.require_look_at ) - trigger usetriggerrequirelookat(); - - if ( isdefined( stub.hint_string ) ) - { - if ( isdefined( stub.hint_parm2 ) ) - trigger sethintstring( stub.hint_string, stub.hint_parm1, stub.hint_parm2 ); - else if ( isdefined( stub.hint_parm1 ) ) - trigger sethintstring( stub.hint_string, stub.hint_parm1 ); - else if ( isdefined( stub.cost ) ) - trigger sethintstring( stub.hint_string, stub.cost ); - else - trigger sethintstring( stub.hint_string ); - } - - trigger.stub = stub; - } - - copy_zombie_keys_onto_trigger( trigger, stub ); - - if ( isdefined( stub.trigger_per_player ) && stub.trigger_per_player ) - { - if ( isdefined( trigger ) ) - { - trigger setinvisibletoall(); - trigger setvisibletoplayer( player ); - } - - if ( !isdefined( stub.playertrigger ) ) - stub.playertrigger = []; - - stub.playertrigger[player getentitynumber()] = trigger; - } - else - stub.trigger = trigger; - - trigger.thread_running = 0; - return trigger; + trig.script_noteworthy = stub.script_noteworthy; + trig.targetname = stub.targetname; + trig.target = stub.target; + trig.zombie_weapon_upgrade = stub.zombie_weapon_upgrade; + trig.clientfieldname = stub.clientfieldname; + trig.usetime = stub.usetime; } -copy_zombie_keys_onto_trigger( trig, stub ) +trigger_thread( trigger_func ) //checked matches cerberus output { - trig.script_noteworthy = stub.script_noteworthy; - trig.targetname = stub.targetname; - trig.target = stub.target; - trig.zombie_weapon_upgrade = stub.zombie_weapon_upgrade; - trig.clientfieldname = stub.clientfieldname; - trig.usetime = stub.usetime; + self endon( "kill_trigger" ); + if ( isDefined( trigger_func ) ) + { + self [[ trigger_func ]](); + } } -trigger_thread( trigger_func ) +get_closest_unitrigger_index( org, array, dist ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop due to continue { - self endon( "kill_trigger" ); - - if ( isdefined( trigger_func ) ) - self [[ trigger_func ]](); + if ( !isDefined( dist ) ) + { + dist = 9999999; + } + distsq = dist * dist; + if ( array.size < 1 ) + { + return; + } + index = undefined; + i = 0; + while ( i < array.size ) + { + origin = array[ i ] unitrigger_origin(); + radius_sq = array[ i ].test_radius_sq; + newdistsq = distance2dsquared( origin, org ); + if ( newdistsq >= radius_sq ) + { + i++; + continue; + } + else if ( newdistsq >= distsq ) + { + i++; + continue; + } + distsq = newdistsq; + index = i; + i++; + } + return index; } -get_closest_unitrigger_index( org, array, dist ) +get_closest_unitriggers( org, array, dist ) //checked partially changed to match cerberus output did not change while loop to for loop to prevent infinite loop due to continue { - if ( !isdefined( dist ) ) - dist = 9999999; - - distsq = dist * dist; - - if ( array.size < 1 ) - return; - - index = undefined; - - for ( i = 0; i < array.size; i++ ) - { - origin = array[i] unitrigger_origin(); - radius_sq = array[i].test_radius_sq; - newdistsq = distance2dsquared( origin, org ); - - if ( newdistsq >= radius_sq ) - continue; - - if ( newdistsq >= distsq ) - continue; - - distsq = newdistsq; - index = i; - } - - return index; + triggers = []; + if ( !isDefined( dist ) ) + { + dist = 9999999; + } + distsq = dist * dist; + if ( array.size < 1 ) + { + return triggers; + } + index = undefined; + i = 0; + while ( i < array.size ) + { + if ( !isDefined( array[ i ] ) ) + { + i++; + continue; + } + origin = array[ i ] unitrigger_origin(); + radius_sq = array[ i ].test_radius_sq; + newdistsq = distance2dsquared( origin, org ); + if ( newdistsq >= radius_sq ) + { + i++; + continue; + } + if ( abs( origin[ 2 ] - org[ 2 ] ) > 42 ) + { + i++; + continue; + } + array[ i ].dsquared = newdistsq; + for ( j = 0; j < triggers.size && newdistsq > triggers[j].dsquared; j++ ) + { + } + arrayinsert( triggers, array[ i ], j ); + if ( ( i % 10 ) == 9 ) + { + wait 0.05; + } + i++; + } + return triggers; } -get_closest_unitriggers( org, array, dist ) -{ - triggers = []; - if ( !isdefined( dist ) ) - dist = 9999999; - - distsq = dist * dist; - - if ( array.size < 1 ) - return triggers; - - index = undefined; - - for ( i = 0; i < array.size; i++ ) - { - if ( !isdefined( array[i] ) ) - continue; - - origin = array[i] unitrigger_origin(); - radius_sq = array[i].test_radius_sq; - newdistsq = distance2dsquared( origin, org ); - - if ( newdistsq >= radius_sq ) - continue; - - if ( abs( origin[2] - org[2] ) > 42 ) - continue; - - array[i].dsquared = newdistsq; - - for ( j = 0; j < triggers.size && newdistsq > triggers[j].dsquared; j++ ) - { - - } - - arrayinsert( triggers, array[i], j ); - - if ( 9 == i % 10 ) - wait 0.05; - } - - return triggers; -} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_utility.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_utility.gsc index ada9cc4..cee60a8 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_utility.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_utility.gsc @@ -1,5191 +1,5667 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include maps\mp\_utility; -#include common_scripts\utility; -#include maps\mp\animscripts\zm_run; -#include maps\mp\animscripts\zm_utility; -#include maps\mp\zombies\_zm_server_throttle; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_buildables; -#include maps\mp\zombies\_zm_power; -#include maps\mp\zombies\_zm_powerups; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\gametypes_zm\_hud_message; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_audio; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/gametypes_zm/_hud_message; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_powerups; +#include maps/mp/zombies/_zm_power; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_server_throttle; +#include maps/mp/animscripts/zm_utility; +#include maps/mp/animscripts/zm_run; +#include common_scripts/utility; +#include maps/mp/_utility; -init_utility() +init_utility() //checked matches cerberus output { - } -is_classic() +is_classic() //checked matches cerberus output { - var = getdvar( _hash_6B64B9B4 ); - - if ( var == "zclassic" ) - return true; - - return false; + var = getDvar( "ui_zm_gamemodegroup" ); + if ( var == "zclassic" ) + { + return 1; + } + return 0; } -is_standard() +is_standard() //checked matches cerberus output { - var = getdvar( "ui_gametype" ); - - if ( var == "zstandard" ) - return true; - - return false; + var = getDvar( "ui_gametype" ); + if ( var == "zstandard" ) + { + return 1; + } + return 0; } -convertsecondstomilliseconds( seconds ) +convertsecondstomilliseconds( seconds ) //checked matches cerberus output { - return seconds * 1000; + return seconds * 1000; } -is_player() +is_player() //checked does not match cerberus output changed at own discretion { - return isplayer( self ) || isdefined( self.pers ) && ( isdefined( self.pers["isBot"] ) && self.pers["isBot"] ); + if ( !isplayer( self ) ) + { + return 0; + } + if ( isDefined( self.pers ) && is_true( self.pers[ "isBot" ] ) ) + { + return 0; + } + return 1; } -lerp( chunk ) +lerp( chunk ) //checked matches cerberus output { - link = spawn( "script_origin", self getorigin() ); - link.angles = self.first_node.angles; - self linkto( link ); - link rotateto( self.first_node.angles, level._contextual_grab_lerp_time ); - link moveto( self.attacking_spot, level._contextual_grab_lerp_time ); - link waittill_multiple( "rotatedone", "movedone" ); - self unlink(); - link delete(); + link = spawn( "script_origin", self getorigin() ); + link.angles = self.first_node.angles; + self linkto( link ); + link rotateto( self.first_node.angles, level._contextual_grab_lerp_time ); + link moveto( self.attacking_spot, level._contextual_grab_lerp_time ); + link waittill_multiple( "rotatedone", "movedone" ); + self unlink(); + link delete(); + return; } -clear_mature_blood() +clear_mature_blood() //checked changed to match cerberus output { - blood_patch = getentarray( "mature_blood", "targetname" ); - - if ( is_mature() ) - return; - - if ( isdefined( blood_patch ) ) - { - for ( i = 0; i < blood_patch.size; i++ ) - blood_patch[i] delete(); - } + blood_patch = getentarray( "mature_blood", "targetname" ); + if ( is_mature() ) + { + return; + } + if ( isDefined( blood_patch ) ) + { + for ( i = 0; i < blood_patch.size; i++ ) + { + blood_patch[ i ] delete(); + } + } } -recalc_zombie_array() +recalc_zombie_array() //checked matches cerberus output { - } -clear_all_corpses() +clear_all_corpses() //checked changed to match cerberus output { - corpse_array = getcorpsearray(); - - for ( i = 0; i < corpse_array.size; i++ ) - { - if ( isdefined( corpse_array[i] ) ) - corpse_array[i] delete(); - } + corpse_array = getcorpsearray(); + for ( i = 0; i < corpse_array.size; i++ ) + { + if ( isDefined( corpse_array[ i ] ) ) + { + corpse_array[ i ] delete(); + } + } } -get_current_corpse_count() +get_current_corpse_count() //checked matches cerberus output { - corpse_array = getcorpsearray(); - - if ( isdefined( corpse_array ) ) - return corpse_array.size; - - return 0; + corpse_array = getcorpsearray(); + if ( isDefined( corpse_array ) ) + { + return corpse_array.size; + } + return 0; } -get_current_actor_count() +get_current_actor_count() //checked matches cerberus output { - count = 0; - actors = getaispeciesarray( level.zombie_team, "all" ); - - if ( isdefined( actors ) ) - count += actors.size; - - count += get_current_corpse_count(); - return count; + count = 0; + actors = getaispeciesarray( level.zombie_team, "all" ); + if ( isDefined( actors ) ) + { + count += actors.size; + } + count += get_current_corpse_count(); + return count; } -get_current_zombie_count() +get_current_zombie_count() //checked matches cerberus output { - enemies = get_round_enemy_array(); - return enemies.size; + enemies = get_round_enemy_array(); + return enemies.size; } -get_round_enemy_array() +get_round_enemy_array() //checked partially changed to match cerberus output//did not change while loop to for loop to prevent infinite continue loop bug { - enemies = []; - valid_enemies = []; - enemies = getaispeciesarray( level.zombie_team, "all" ); - - for ( i = 0; i < enemies.size; i++ ) - { - if ( isdefined( enemies[i].ignore_enemy_count ) && enemies[i].ignore_enemy_count ) - continue; - - valid_enemies[valid_enemies.size] = enemies[i]; - } - - return valid_enemies; + enemies = []; + valid_enemies = []; + enemies = getaispeciesarray( level.zombie_team, "all" ); + i = 0; + while ( i < enemies.size ) + { + if ( is_true( enemies[ i ].ignore_enemy_count ) ) + { + i++; + continue; + } + valid_enemies[ valid_enemies.size ] = enemies[ i ]; + i++; + } + return valid_enemies; } -init_zombie_run_cycle() +init_zombie_run_cycle() //checked matches cerberus output { - if ( isdefined( level.speed_change_round ) ) - { - if ( level.round_number >= level.speed_change_round ) - { - speed_percent = 0.2 + ( level.round_number - level.speed_change_round ) * 0.2; - speed_percent = min( speed_percent, 1 ); - change_round_max = int( level.speed_change_max * speed_percent ); - change_left = change_round_max - level.speed_change_num; - - if ( change_left == 0 ) - { - self set_zombie_run_cycle(); - return; - } - - change_speed = randomint( 100 ); - - if ( change_speed > 80 ) - { - self change_zombie_run_cycle(); - return; - } - - zombie_count = get_current_zombie_count(); - zombie_left = level.zombie_ai_limit - zombie_count; - - if ( zombie_left == change_left ) - { - self change_zombie_run_cycle(); - return; - } - } - } - - self set_zombie_run_cycle(); + if ( isDefined( level.speed_change_round ) ) + { + if ( level.round_number >= level.speed_change_round ) + { + speed_percent = 0.2 + ( ( level.round_number - level.speed_change_round ) * 0.2 ); + speed_percent = min( speed_percent, 1 ); + change_round_max = int( level.speed_change_max * speed_percent ); + change_left = change_round_max - level.speed_change_num; + if ( change_left == 0 ) + { + self set_zombie_run_cycle(); + return; + } + change_speed = randomint( 100 ); + if ( change_speed > 80 ) + { + self change_zombie_run_cycle(); + return; + } + zombie_count = get_current_zombie_count(); + zombie_left = level.zombie_ai_limit - zombie_count; + if ( zombie_left == change_left ) + { + self change_zombie_run_cycle(); + return; + } + } + } + self set_zombie_run_cycle(); } -change_zombie_run_cycle() +change_zombie_run_cycle() //checked matches cerberus output { - level.speed_change_num++; - - if ( level.gamedifficulty == 0 ) - self set_zombie_run_cycle( "sprint" ); - else - self set_zombie_run_cycle( "walk" ); - - self thread speed_change_watcher(); + level.speed_change_num++; + if ( level.gamedifficulty == 0 ) + { + self set_zombie_run_cycle( "sprint" ); + } + else + { + self set_zombie_run_cycle( "walk" ); + } + self thread speed_change_watcher(); } -speed_change_watcher() +speed_change_watcher() //checked matches cerberus output { - self waittill( "death" ); - - if ( level.speed_change_num > 0 ) - level.speed_change_num--; + self waittill( "death" ); + if ( level.speed_change_num > 0 ) + { + level.speed_change_num--; + } } -set_zombie_run_cycle( new_move_speed ) +set_zombie_run_cycle( new_move_speed ) //checked matches cerberus output { - self.zombie_move_speed_original = self.zombie_move_speed; - - if ( isdefined( new_move_speed ) ) - self.zombie_move_speed = new_move_speed; - else if ( level.gamedifficulty == 0 ) - self set_run_speed_easy(); - else - self set_run_speed(); - - self maps\mp\animscripts\zm_run::needsupdate(); - self.deathanim = self maps\mp\animscripts\zm_utility::append_missing_legs_suffix( "zm_death" ); + self.zombie_move_speed_original = self.zombie_move_speed; + if ( isDefined( new_move_speed ) ) + { + self.zombie_move_speed = new_move_speed; + } + else if ( level.gamedifficulty == 0 ) + { + self set_run_speed_easy(); + } + else + { + self set_run_speed(); + } + self maps/mp/animscripts/zm_run::needsupdate(); + self.deathanim = self maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "zm_death" ); } -set_run_speed() +set_run_speed() //checked matches cerberus output { - rand = randomintrange( level.zombie_move_speed, level.zombie_move_speed + 35 ); - - if ( rand <= 35 ) - self.zombie_move_speed = "walk"; - else if ( rand <= 70 ) - self.zombie_move_speed = "run"; - else - self.zombie_move_speed = "sprint"; + rand = randomintrange( level.zombie_move_speed, level.zombie_move_speed + 35 ); + if ( rand <= 35 ) + { + self.zombie_move_speed = "walk"; + } + else if ( rand <= 70 ) + { + self.zombie_move_speed = "run"; + } + else + { + self.zombie_move_speed = "sprint"; + } } -set_run_speed_easy() +set_run_speed_easy() //checked matches cerberus output { - rand = randomintrange( level.zombie_move_speed, level.zombie_move_speed + 25 ); - - if ( rand <= 35 ) - self.zombie_move_speed = "walk"; - else - self.zombie_move_speed = "run"; + rand = randomintrange( level.zombie_move_speed, level.zombie_move_speed + 25 ); + if ( rand <= 35 ) + { + self.zombie_move_speed = "walk"; + } + else + { + self.zombie_move_speed = "run"; + } } -spawn_zombie( spawner, target_name, spawn_point, round_number ) +spawn_zombie( spawner, target_name, spawn_point, round_number ) //checked matches cerberus output { - if ( !isdefined( spawner ) ) - { + if ( !isDefined( spawner ) ) + { + /* /# - println( "ZM >> spawn_zombie - NO SPAWNER DEFINED" ); + println( "ZM >> spawn_zombie - NO SPAWNER DEFINED" ); #/ - return undefined; - } - - while ( getfreeactorcount() < 1 ) - wait 0.05; - - spawner.script_moveoverride = 1; - - if ( isdefined( spawner.script_forcespawn ) && spawner.script_forcespawn ) - { - guy = spawner spawnactor(); - - if ( isdefined( level.giveextrazombies ) ) - guy [[ level.giveextrazombies ]](); - - guy enableaimassist(); - - if ( isdefined( round_number ) ) - guy._starting_round_number = round_number; - - guy.aiteam = level.zombie_team; - guy clearentityowner(); - level.zombiemeleeplayercounter = 0; - guy thread run_spawn_functions(); - guy forceteleport( spawner.origin ); - guy show(); - } - - spawner.count = 666; - - if ( !spawn_failed( guy ) ) - { - if ( isdefined( target_name ) ) - guy.targetname = target_name; - - return guy; - } - - return undefined; + */ + return undefined; + } + while ( getfreeactorcount() < 1 ) + { + wait 0.05; + } + spawner.script_moveoverride = 1; + if ( is_true( spawner.script_forcespawn ) ) + { + guy = spawner spawnactor(); + if ( isDefined( level.giveextrazombies ) ) + { + guy [[ level.giveextrazombies ]](); + } + guy enableaimassist(); + if ( isDefined( round_number ) ) + { + guy._starting_round_number = round_number; + } + guy.aiteam = level.zombie_team; + guy clearentityowner(); + level.zombiemeleeplayercounter = 0; + guy thread run_spawn_functions(); + guy forceteleport( spawner.origin ); + guy show(); + } + spawner.count = 666; + if ( !spawn_failed( guy ) ) + { + if ( isDefined( target_name ) ) + { + guy.targetname = target_name; + } + return guy; + } + return undefined; } -run_spawn_functions() +run_spawn_functions() //checked changed to match cerberus output { - self endon( "death" ); - waittillframeend; - - for ( i = 0; i < level.spawn_funcs[self.team].size; i++ ) - { - func = level.spawn_funcs[self.team][i]; - single_thread( self, func["function"], func["param1"], func["param2"], func["param3"], func["param4"], func["param5"] ); - } - - if ( isdefined( self.spawn_funcs ) ) - { - for ( i = 0; i < self.spawn_funcs.size; i++ ) - { - func = self.spawn_funcs[i]; - single_thread( self, func["function"], func["param1"], func["param2"], func["param3"], func["param4"] ); - } + self endon( "death" ); + waittillframeend; + for ( i = 0; i < level.spawn_funcs[ self.team ].size; i++ ) + { + func = level.spawn_funcs[ self.team ][ i ]; + single_thread( self, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ], func[ "param5" ] ); + } + if ( isDefined( self.spawn_funcs ) ) + { + for ( i = 0; i < self.spawn_funcs.size; i++ ) + { + func = self.spawn_funcs[ i ]; + single_thread( self, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ] ); + } + /* /# - self.saved_spawn_functions = self.spawn_funcs; + self.saved_spawn_functions = self.spawn_funcs; #/ - self.spawn_funcs = undefined; + */ + self.spawn_funcs = undefined; + /* /# - self.spawn_funcs = self.saved_spawn_functions; - self.saved_spawn_functions = undefined; + self.spawn_funcs = self.saved_spawn_functions; + self.saved_spawn_functions = undefined; #/ - self.spawn_funcs = undefined; - } + */ + self.spawn_funcs = undefined; + } } -create_simple_hud( client, team ) +create_simple_hud( client, team ) //checked matches cerberus output { - if ( isdefined( team ) ) - { - hud = newteamhudelem( team ); - hud.team = team; - } - else if ( isdefined( client ) ) - hud = newclienthudelem( client ); - else - hud = newhudelem(); - - level.hudelem_count++; - hud.foreground = 1; - hud.sort = 1; - hud.hidewheninmenu = 0; - return hud; + if ( isDefined( team ) ) + { + hud = newteamhudelem( team ); + hud.team = team; + } + else if ( isDefined( client ) ) + { + hud = newclienthudelem( client ); + } + else + { + hud = newhudelem(); + } + level.hudelem_count++; + hud.foreground = 1; + hud.sort = 1; + hud.hidewheninmenu = 0; + return hud; } -destroy_hud() +destroy_hud() //checked matches cerberus output { - level.hudelem_count--; - self destroy(); + level.hudelem_count--; + + self destroy(); } -all_chunks_intact( barrier, barrier_chunks ) +all_chunks_intact( barrier, barrier_chunks ) //checked changed to match cerberus output { - if ( isdefined( barrier.zbarrier ) ) - { - pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); - - if ( pieces.size != barrier.zbarrier getnumzbarrierpieces() ) - return false; - } - else - { - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( barrier_chunks[i] get_chunk_state() != "repaired" ) - return false; - } - } - - return true; + if ( isDefined( barrier.zbarrier ) ) + { + pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); + if ( pieces.size != barrier.zbarrier getnumzbarrierpieces() ) + { + return 0; + } + } + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( barrier_chunks[ i ] get_chunk_state() != "repaired" ) + { + return 0; + } + } + return 1; } -no_valid_repairable_boards( barrier, barrier_chunks ) +no_valid_repairable_boards( barrier, barrier_chunks ) //checked changed to match cerberus output { - if ( isdefined( barrier.zbarrier ) ) - { - pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); - - if ( pieces.size ) - return false; - } - else - { - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( barrier_chunks[i] get_chunk_state() == "destroyed" ) - return false; - } - } - - return true; + if ( isDefined( barrier.zbarrier ) ) + { + pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); + if ( pieces.size ) + { + return 0; + } + } + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( barrier_chunks[ i ] get_chunk_state() == "destroyed" ) + { + return 0; + } + } + return 1; } -is_survival() +is_survival() //checked matches cerberus output { - var = getdvar( _hash_6B64B9B4 ); - - if ( var == "zsurvival" ) - return true; - - return false; + var = getDvar( "ui_zm_gamemodegroup" ); + if ( var == "zsurvival" ) + { + return 1; + } + return 0; } -is_encounter() +is_encounter() //checked matches cerberus output { - if ( isdefined( level._is_encounter ) && level._is_encounter ) - return true; - - var = getdvar( _hash_6B64B9B4 ); - - if ( var == "zencounter" ) - { - level._is_encounter = 1; - return true; - } - - return false; + if ( is_true( level._is_encounter ) ) + { + return 1; + } + var = getDvar( "ui_zm_gamemodegroup" ); + if ( var == "zencounter" ) + { + level._is_encounter = 1; + return 1; + } + return 0; } -all_chunks_destroyed( barrier, barrier_chunks ) +all_chunks_destroyed( barrier, barrier_chunks ) //checked changed to match cerberus output { - if ( isdefined( barrier.zbarrier ) ) - { - pieces = arraycombine( barrier.zbarrier getzbarrierpieceindicesinstate( "open" ), barrier.zbarrier getzbarrierpieceindicesinstate( "opening" ), 1, 0 ); - - if ( pieces.size != barrier.zbarrier getnumzbarrierpieces() ) - return false; - } - else if ( isdefined( barrier_chunks ) ) - { + if ( isDefined( barrier.zbarrier ) ) + { + pieces = arraycombine( barrier.zbarrier getzbarrierpieceindicesinstate( "open" ), barrier.zbarrier getzbarrierpieceindicesinstate( "opening" ), 1, 0 ); + if ( pieces.size != barrier.zbarrier getnumzbarrierpieces() ) + { + return 0; + } + } + if ( isDefined( barrier_chunks ) ) + { + /* /# - assert( isdefined( barrier_chunks ), "_zm_utility::all_chunks_destroyed - Barrier chunks undefined" ); + assert( isDefined( barrier_chunks ), "_zm_utility::all_chunks_destroyed - Barrier chunks undefined" ); #/ - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( barrier_chunks[i] get_chunk_state() != "destroyed" ) - return false; - } - } - - return true; + */ + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( barrier_chunks[ i ] get_chunk_state() != "destroyed" ) + { + return 0; + } + } + } + return 1; } -check_point_in_playable_area( origin ) +check_point_in_playable_area( origin ) //checked changed to match cerberus output { - playable_area = getentarray( "player_volume", "script_noteworthy" ); - check_model = spawn( "script_model", origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); - valid_point = 0; - - for ( i = 0; i < playable_area.size; i++ ) - { - if ( check_model istouching( playable_area[i] ) ) - valid_point = 1; - } - - check_model delete(); - return valid_point; + playable_area = getentarray( "player_volume", "script_noteworthy" ); + check_model = spawn( "script_model", origin + vectorScale( ( 0, 0, 1 ), 40 ) ); + valid_point = 0; + for ( i = 0; i < playable_area.size; i++ ) + { + if ( check_model istouching( playable_area[ i ] ) ) + { + valid_point = 1; + } + } + check_model delete(); + return valid_point; } -check_point_in_enabled_zone( origin, zone_is_active, player_zones ) +check_point_in_enabled_zone( origin, zone_is_active, player_zones ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite continue bug { - if ( !isdefined( player_zones ) ) - player_zones = getentarray( "player_volume", "script_noteworthy" ); - - if ( !isdefined( level.zones ) || !isdefined( player_zones ) ) - return 1; - - scr_org = spawn( "script_origin", origin + vectorscale( ( 0, 0, 1 ), 40.0 ) ); - one_valid_zone = 0; - - for ( i = 0; i < player_zones.size; i++ ) - { - if ( scr_org istouching( player_zones[i] ) ) - { - zone = level.zones[player_zones[i].targetname]; - - if ( isdefined( zone ) && ( isdefined( zone.is_enabled ) && zone.is_enabled ) ) - { - if ( isdefined( zone_is_active ) && zone_is_active == 1 && !( isdefined( zone.is_active ) && zone.is_active ) ) - continue; - - one_valid_zone = 1; - break; - } - } - } - - scr_org delete(); - return one_valid_zone; + if ( !isDefined( player_zones ) ) + { + player_zones = getentarray( "player_volume", "script_noteworthy" ); + } + if ( !isDefined( level.zones ) || !isDefined( player_zones ) ) + { + return 1; + } + scr_org = spawn( "script_origin", origin + vectorScale( ( 0, 0, 1 ), 40 ) ); + one_valid_zone = 0; + i = 0; + while ( i < player_zones.size ) + { + if ( scr_org istouching( player_zones[ i ] ) ) + { + zone = level.zones[ player_zones[ i ].targetname ]; + if ( isDefined( zone ) && is_true( zone.is_enabled ) ) + { + if ( isDefined( zone_is_active ) && zone_is_active == 1 && !is_true( zone.is_active ) ) + { + i++; + continue; + } + one_valid_zone = 1; + break; + } + } + i++; + } + scr_org delete(); + return one_valid_zone; } -round_up_to_ten( score ) +round_up_to_ten( score ) //checked matches cerberus output { - new_score = score - score % 10; - - if ( new_score < score ) - new_score += 10; - - return new_score; + new_score = score - score % 10; + if ( new_score < score ) + { + new_score += 10; + } + return new_score; } -round_up_score( score, value ) +round_up_score( score, value ) //checked matches cerberus output { - score = int( score ); - new_score = score - score % value; - - if ( new_score < score ) - new_score += value; - - return new_score; + score = int( score ); + new_score = score - score % value; + if ( new_score < score ) + { + new_score += value; + } + return new_score; } -random_tan() +random_tan() //checked matches cerberus output { - rand = randomint( 100 ); - - if ( isdefined( level.char_percent_override ) ) - percentnotcharred = level.char_percent_override; - else - percentnotcharred = 65; + rand = randomint( 100 ); + if ( isDefined( level.char_percent_override ) ) + { + percentnotcharred = level.char_percent_override; + } + else + { + percentnotcharred = 65; + } } -places_before_decimal( num ) +places_before_decimal( num ) //checked matches cerberus output { - abs_num = abs( num ); - count = 0; - - while ( true ) - { - abs_num *= 0.1; - count += 1; - - if ( abs_num < 1 ) - return count; - } + abs_num = abs( num ); + count = 0; + while ( 1 ) + { + abs_num *= 0.1; + count += 1; + if ( abs_num < 1 ) + { + return count; + } + } } -create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, initial_attract_func, arrival_attract_func, poi_team ) +create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, initial_attract_func, arrival_attract_func, poi_team ) //checked matches cerberus output { - if ( !isdefined( added_poi_value ) ) - self.added_poi_value = 0; - else - self.added_poi_value = added_poi_value; - - if ( !isdefined( start_turned_on ) ) - start_turned_on = 1; - - self.script_noteworthy = "zombie_poi"; - self.poi_active = start_turned_on; - - if ( isdefined( attract_dist ) ) - self.poi_radius = attract_dist * attract_dist; - else - self.poi_radius = undefined; - - self.num_poi_attracts = num_attractors; - self.attract_to_origin = 1; - self.attractor_array = []; - self.initial_attract_func = undefined; - self.arrival_attract_func = undefined; - - if ( isdefined( poi_team ) ) - self._team = poi_team; - - if ( isdefined( initial_attract_func ) ) - self.initial_attract_func = initial_attract_func; - - if ( isdefined( arrival_attract_func ) ) - self.arrival_attract_func = arrival_attract_func; + if ( !isDefined( added_poi_value ) ) + { + self.added_poi_value = 0; + } + else + { + self.added_poi_value = added_poi_value; + } + if ( !isDefined( start_turned_on ) ) + { + start_turned_on = 1; + } + self.script_noteworthy = "zombie_poi"; + self.poi_active = start_turned_on; + if ( isDefined( attract_dist ) ) + { + self.poi_radius = attract_dist * attract_dist; + } + else + { + self.poi_radius = undefined; + } + self.num_poi_attracts = num_attractors; + self.attract_to_origin = 1; + self.attractor_array = []; + self.initial_attract_func = undefined; + self.arrival_attract_func = undefined; + if ( isDefined( poi_team ) ) + { + self._team = poi_team; + } + if ( isDefined( initial_attract_func ) ) + { + self.initial_attract_func = initial_attract_func; + } + if ( isDefined( arrival_attract_func ) ) + { + self.arrival_attract_func = arrival_attract_func; + } } -create_zombie_point_of_interest_attractor_positions( num_attract_dists, diff_per_dist, attractor_width ) +create_zombie_point_of_interest_attractor_positions( num_attract_dists, diff_per_dist, attractor_width ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug with continue { - self endon( "death" ); - forward = ( 0, 1, 0 ); - - if ( !isdefined( self.num_poi_attracts ) || isdefined( self.script_noteworthy ) && self.script_noteworthy != "zombie_poi" ) - return; - - if ( !isdefined( num_attract_dists ) ) - num_attract_dists = 4; - - if ( !isdefined( diff_per_dist ) ) - diff_per_dist = 45; - - if ( !isdefined( attractor_width ) ) - attractor_width = 45; - - self.attract_to_origin = 0; - self.num_attract_dists = num_attract_dists; - self.last_index = []; - - for ( i = 0; i < num_attract_dists; i++ ) - self.last_index[i] = -1; - - self.attract_dists = []; - - for ( i = 0; i < self.num_attract_dists; i++ ) - self.attract_dists[i] = diff_per_dist * ( i + 1 ); - - max_positions = []; - - for ( i = 0; i < self.num_attract_dists; i++ ) - max_positions[i] = int( 6.28 * self.attract_dists[i] / attractor_width ); - - num_attracts_per_dist = self.num_poi_attracts / self.num_attract_dists; - self.max_attractor_dist = self.attract_dists[self.attract_dists.size - 1] * 1.1; - diff = 0; - actual_num_positions = []; - - for ( i = 0; i < self.num_attract_dists; i++ ) - { - if ( num_attracts_per_dist > max_positions[i] + diff ) - { - actual_num_positions[i] = max_positions[i]; - diff += num_attracts_per_dist - max_positions[i]; - continue; - } - - actual_num_positions[i] = num_attracts_per_dist + diff; - diff = 0; - } - - self.attractor_positions = []; - failed = 0; - angle_offset = 0; - prev_last_index = -1; - - for ( j = 0; j < 4; j++ ) - { - if ( actual_num_positions[j] + failed < max_positions[j] ) - { - actual_num_positions[j] += failed; - failed = 0; - } - else if ( actual_num_positions[j] < max_positions[j] ) - { - actual_num_positions[j] = max_positions[j]; - failed = max_positions[j] - actual_num_positions[j]; - } - - failed += self generated_radius_attract_positions( forward, angle_offset, actual_num_positions[j], self.attract_dists[j] ); - angle_offset += 15; - self.last_index[j] = int( actual_num_positions[j] - failed + prev_last_index ); - prev_last_index = self.last_index[j]; - } - - self notify( "attractor_positions_generated" ); - level notify( "attractor_positions_generated" ); + self endon( "death" ); + forward = ( 0, 1, 0 ); + if ( !isDefined( self.num_poi_attracts ) || isDefined( self.script_noteworthy ) && self.script_noteworthy != "zombie_poi" ) + { + return; + } + if ( !isDefined( num_attract_dists ) ) + { + num_attract_dists = 4; + } + if ( !isDefined( diff_per_dist ) ) + { + diff_per_dist = 45; + } + if ( !isDefined( attractor_width ) ) + { + attractor_width = 45; + } + self.attract_to_origin = 0; + self.num_attract_dists = num_attract_dists; + self.last_index = []; + for ( i = 0; i < num_attract_dists; i++ ) + { + self.last_index[ i ] = -1; + } + self.attract_dists = []; + for ( i = 0; i < self.num_attract_dists; i++ ) + { + self.attract_dists[ i ] = diff_per_dist * ( i + 1 ); + } + max_positions = []; + for ( i = 0; i < self.num_attract_dists; i++ ) + { + max_positions[ i ] = int( ( 6.28 * self.attract_dists[ i ] ) / attractor_width ); + } + num_attracts_per_dist = self.num_poi_attracts / self.num_attract_dists; + self.max_attractor_dist = self.attract_dists[ self.attract_dists.size - 1 ] * 1.1; + diff = 0; + actual_num_positions = []; + i = 0; + while ( i < self.num_attract_dists ) + { + if ( num_attracts_per_dist > ( max_positions[ i ] + diff ) ) + { + actual_num_positions[ i ] = max_positions[ i ]; + diff += num_attracts_per_dist - max_positions[ i ]; + i++; + continue; + } + actual_num_positions[ i ] = num_attracts_per_dist + diff; + diff = 0; + i++; + } + self.attractor_positions = []; + failed = 0; + angle_offset = 0; + prev_last_index = -1; + for ( j = 0; j < 4; j++) + { + if ( ( actual_num_positions[ j ] + failed ) < max_positions[ j ] ) + { + actual_num_positions[ j ] += failed; + failed = 0; + } + else if ( actual_num_positions[ j ] < max_positions[ j ] ) + { + actual_num_positions[ j ] = max_positions[ j ]; + failed = max_positions[ j ] - actual_num_positions[ j ]; + } + failed += self generated_radius_attract_positions( forward, angle_offset, actual_num_positions[ j ], self.attract_dists[ j ] ); + angle_offset += 15; + self.last_index[ j ] = int( ( actual_num_positions[ j ] - failed ) + prev_last_index ); + prev_last_index = self.last_index[ j ]; + } + self notify( "attractor_positions_generated" ); + level notify( "attractor_positions_generated" ); } -generated_radius_attract_positions( forward, offset, num_positions, attract_radius ) +generated_radius_attract_positions( forward, offset, num_positions, attract_radius ) //checked partially changed to match cerberus output //did not change while loop to for loop because it doesn't make sense as a for loop { - self endon( "death" ); - epsilon = 0.1; - failed = 0; - degs_per_pos = 360 / num_positions; - - for ( i = offset; i < 360 + offset; i += degs_per_pos ) - { - altforward = forward * attract_radius; - rotated_forward = ( cos( i ) * altforward[0] - sin( i ) * altforward[1], sin( i ) * altforward[0] + cos( i ) * altforward[1], altforward[2] ); - - if ( isdefined( level.poi_positioning_func ) ) - pos = [[ level.poi_positioning_func ]]( self.origin, rotated_forward ); - else if ( isdefined( level.use_alternate_poi_positioning ) && level.use_alternate_poi_positioning ) - pos = maps\mp\zombies\_zm_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + vectorscale( ( 0, 0, 1 ), 10.0 ) ); - else - pos = maps\mp\zombies\_zm_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + vectorscale( ( 0, 0, 1 ), 100.0 ) ); - - if ( !isdefined( pos ) ) - { - failed++; - continue; - } - - if ( isdefined( level.use_alternate_poi_positioning ) && level.use_alternate_poi_positioning ) - { - if ( isdefined( self ) && isdefined( self.origin ) ) - { - if ( self.origin[2] >= pos[2] - epsilon && self.origin[2] - pos[2] <= 150 ) - { - pos_array = []; - pos_array[0] = pos; - pos_array[1] = self; - self.attractor_positions[self.attractor_positions.size] = pos_array; - } - } - else - failed++; - - continue; - } - - if ( abs( pos[2] - self.origin[2] ) < 60 ) - { - pos_array = []; - pos_array[0] = pos; - pos_array[1] = self; - self.attractor_positions[self.attractor_positions.size] = pos_array; - continue; - } - - failed++; - } - - return failed; + self endon( "death" ); + epsilon = 0.1; + failed = 0; + degs_per_pos = 360 / num_positions; + i = offset; + while ( i < 360 + offset ) + { + altforward = forward * attract_radius; + rotated_forward = ( ( cos( i ) * altforward[ 0 ] ) - ( sin( i ) * altforward[ 1 ] ), ( sin( i ) * altforward[ 0 ] ) + ( cos( i ) * altforward[ 1 ] ), altforward[ 2 ] ); + if ( isDefined( level.poi_positioning_func ) ) + { + pos = [[ level.poi_positioning_func ]]( self.origin, rotated_forward ); + } + else if ( is_true( level.use_alternate_poi_positioning ) ) + { + pos = maps/mp/zombies/_zm_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + vectorScale( ( 0, 0, 1 ), 10 ) ); + } + else + { + pos = maps/mp/zombies/_zm_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + vectorScale( ( 0, 0, 1 ), 100 ) ); + } + if ( !isDefined( pos ) ) + { + failed++; + } + else if ( is_true( level.use_alternate_poi_positioning ) ) + { + if ( isDefined( self ) && isDefined( self.origin ) ) + { + if ( self.origin[ 2 ] >= ( pos[ 2 ] - epsilon ) && ( self.origin[ 2 ] - pos[ 2 ] ) <= 150 ) + { + pos_array = []; + pos_array[ 0 ] = pos; + pos_array[ 1 ] = self; + self.attractor_positions[ self.attractor_positions.size ] = pos_array; + } + } + else + { + failed++; + } + } + else if ( abs( pos[ 2 ] - self.origin[ 2 ] ) < 60 ) + { + pos_array = []; + pos_array[ 0 ] = pos; + pos_array[ 1 ] = self; + self.attractor_positions[ self.attractor_positions.size ] = pos_array; + } + else + { + failed++; + } + i += degs_per_pos; + } + return failed; } -debug_draw_attractor_positions() +debug_draw_attractor_positions() //checked changed to match cerberus output { + /* /# - while ( true ) - { - while ( !isdefined( self.attractor_positions ) ) - { - wait 0.05; - continue; - } - - for ( i = 0; i < self.attractor_positions.size; i++ ) - line( self.origin, self.attractor_positions[i][0], ( 1, 0, 0 ), 1, 1 ); - - wait 0.05; - - if ( !isdefined( self ) ) - return; - } + while ( 1 ) + { + while ( !isDefined( self.attractor_positions ) ) + { + wait 0.05; + } + for ( i = 0; i < self.attractor_positions.size; i++ ) + { + line( self.origin, self.attractor_positions[ i ][ 0 ], ( 1, 0, 0 ), 1, 1 ); + } + wait 0.05; + if ( !isDefined( self ) ) + { + return; + } #/ + } + */ } -get_zombie_point_of_interest( origin, poi_array ) +get_zombie_point_of_interest( origin, poi_array ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues cause infinite loops in for loops { - if ( isdefined( self.ignore_all_poi ) && self.ignore_all_poi ) - return undefined; - - curr_radius = undefined; - - if ( isdefined( poi_array ) ) - ent_array = poi_array; - else - ent_array = getentarray( "zombie_poi", "script_noteworthy" ); - - best_poi = undefined; - position = undefined; - best_dist = 100000000; - - for ( i = 0; i < ent_array.size; i++ ) - { - if ( !isdefined( ent_array[i].poi_active ) || !ent_array[i].poi_active ) - continue; - - if ( isdefined( self.ignore_poi_targetname ) && self.ignore_poi_targetname.size > 0 ) - { - if ( isdefined( ent_array[i].targetname ) ) - { - ignore = 0; - - for ( j = 0; j < self.ignore_poi_targetname.size; j++ ) - { - if ( ent_array[i].targetname == self.ignore_poi_targetname[j] ) - { - ignore = 1; - break; - } - } - - if ( ignore ) - continue; - } - } - - if ( isdefined( self.ignore_poi ) && self.ignore_poi.size > 0 ) - { - ignore = 0; - - for ( j = 0; j < self.ignore_poi.size; j++ ) - { - if ( self.ignore_poi[j] == ent_array[i] ) - { - ignore = 1; - break; - } - } - - if ( ignore ) - continue; - } - - dist = distancesquared( origin, ent_array[i].origin ); - dist -= ent_array[i].added_poi_value; - - if ( isdefined( ent_array[i].poi_radius ) ) - curr_radius = ent_array[i].poi_radius; - - if ( ( !isdefined( curr_radius ) || dist < curr_radius ) && dist < best_dist && ent_array[i] can_attract( self ) ) - { - best_poi = ent_array[i]; - best_dist = dist; - } - } - - if ( isdefined( best_poi ) ) - { - if ( isdefined( best_poi._team ) ) - { - if ( isdefined( self._race_team ) && self._race_team != best_poi._team ) - return undefined; - } - - if ( isdefined( best_poi._new_ground_trace ) && best_poi._new_ground_trace ) - { - position = []; - position[0] = groundpos_ignore_water_new( best_poi.origin + vectorscale( ( 0, 0, 1 ), 100.0 ) ); - position[1] = self; - } - else if ( isdefined( best_poi.attract_to_origin ) && best_poi.attract_to_origin ) - { - position = []; - position[0] = groundpos( best_poi.origin + vectorscale( ( 0, 0, 1 ), 100.0 ) ); - position[1] = self; - } - else - position = self add_poi_attractor( best_poi ); - - if ( isdefined( best_poi.initial_attract_func ) ) - self thread [[ best_poi.initial_attract_func ]]( best_poi ); - - if ( isdefined( best_poi.arrival_attract_func ) ) - self thread [[ best_poi.arrival_attract_func ]]( best_poi ); - } - - return position; + if ( is_true( self.ignore_all_poi ) ) + { + return undefined; + } + curr_radius = undefined; + if ( isDefined( poi_array ) ) + { + ent_array = poi_array; + } + else + { + ent_array = getentarray( "zombie_poi", "script_noteworthy" ); + } + best_poi = undefined; + position = undefined; + best_dist = 100000000; + i = 0; + while ( i < ent_array.size ) + { + if ( !isDefined( ent_array[ i ].poi_active ) || !ent_array[ i ].poi_active ) + { + i++; + continue; + } + if ( isDefined( self.ignore_poi_targetname ) && self.ignore_poi_targetname.size > 0 ) + { + if ( isDefined( ent_array[ i ].targetname ) ) + { + ignore = 0; + for ( j = 0; j < self.ignore_poi_targetname.size; j++ ) + { + if ( ent_array[ i ].targetname == self.ignore_poi_targetname[ j ] ) + { + ignore = 1; + break; + } + } + if ( ignore ) + { + i++; + continue; + } + } + } + if ( isDefined( self.ignore_poi ) && self.ignore_poi.size > 0 ) + { + ignore = 0; + for ( j = 0; j < self.ignore_poi.size; j++ ) + { + if ( self.ignore_poi[ j ] == ent_array[ i ] ) + { + ignore = 1; + break; + } + } + if ( ignore ) + { + i++; + continue; + } + } + dist = distancesquared( origin, ent_array[ i ].origin ); + dist -= ent_array[ i ].added_poi_value; + if ( isDefined( ent_array[ i ].poi_radius ) ) + { + curr_radius = ent_array[ i ].poi_radius; + } + if ( isDefined( curr_radius ) && dist < curr_radius && dist < best_dist && ent_array[ i ] can_attract( self ) ) + { + best_poi = ent_array[ i ]; + best_dist = dist; + } + i++; + } + if ( isDefined( best_poi ) ) + { + if ( isDefined( best_poi._team ) ) + { + if ( isDefined( self._race_team ) && self._race_team != best_poi._team ) + { + return undefined; + } + } + if ( is_true( best_poi._new_ground_trace ) ) + { + position = []; + position[ 0 ] = groundpos_ignore_water_new( best_poi.origin + vectorScale( ( 0, 0, 1 ), 100 ) ); + position[ 1 ] = self; + } + else if ( is_true( best_poi.attract_to_origin ) ) + { + position = []; + position[ 0 ] = groundpos( best_poi.origin + vectorScale( ( 0, 0, 1 ), 100 ) ); + position[ 1 ] = self; + } + else + { + position = self add_poi_attractor( best_poi ); + } + if ( isDefined( best_poi.initial_attract_func ) ) + { + self thread [[ best_poi.initial_attract_func ]]( best_poi ); + } + if ( isDefined( best_poi.arrival_attract_func ) ) + { + self thread [[ best_poi.arrival_attract_func ]]( best_poi ); + } + } + return position; } -activate_zombie_point_of_interest() +activate_zombie_point_of_interest() //checked matches cerberus output { - if ( self.script_noteworthy != "zombie_poi" ) - return; - - self.poi_active = 1; + if ( self.script_noteworthy != "zombie_poi" ) + { + return; + } + self.poi_active = 1; } -deactivate_zombie_point_of_interest() +deactivate_zombie_point_of_interest() //checked changed to match cerberus output { - if ( self.script_noteworthy != "zombie_poi" ) - return; - - for ( i = 0; i < self.attractor_array.size; i++ ) - self.attractor_array[i] notify( "kill_poi" ); - - self.attractor_array = []; - self.claimed_attractor_positions = []; - self.poi_active = 0; + if ( self.script_noteworthy != "zombie_poi" ) + { + return; + } + for ( i = 0; i < self.attractor_array.size; i++ ) + { + self.attractor_array[ i ] notify( "kill_poi" ); + } + self.attractor_array = []; + self.claimed_attractor_positions = []; + self.poi_active = 0; } -assign_zombie_point_of_interest( origin, poi ) +assign_zombie_point_of_interest( origin, poi ) //checked matches cerberus output { - position = undefined; - doremovalthread = 0; - - if ( isdefined( poi ) && poi can_attract( self ) ) - { - if ( !isdefined( poi.attractor_array ) || isdefined( poi.attractor_array ) && array_check_for_dupes( poi.attractor_array, self ) ) - doremovalthread = 1; - - position = self add_poi_attractor( poi ); - - if ( isdefined( position ) && doremovalthread && !array_check_for_dupes( poi.attractor_array, self ) ) - self thread update_on_poi_removal( poi ); - } - - return position; + position = undefined; + doremovalthread = 0; + if ( isDefined( poi ) && poi can_attract( self ) ) + { + if ( !isDefined( poi.attractor_array ) || isDefined( poi.attractor_array ) && array_check_for_dupes( poi.attractor_array, self ) ) + { + doremovalthread = 1; + } + position = self add_poi_attractor( poi ); + if ( isDefined( position ) && doremovalthread && !array_check_for_dupes( poi.attractor_array, self ) ) + { + self thread update_on_poi_removal( poi ); + } + } + return position; } -remove_poi_attractor( zombie_poi ) +remove_poi_attractor( zombie_poi ) //checked changed to match cerberus output { - if ( !isdefined( zombie_poi.attractor_array ) ) - return; - - for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) - { - if ( zombie_poi.attractor_array[i] == self ) - { - self notify( "kill_poi" ); - arrayremovevalue( zombie_poi.attractor_array, zombie_poi.attractor_array[i] ); - arrayremovevalue( zombie_poi.claimed_attractor_positions, zombie_poi.claimed_attractor_positions[i] ); - } - } + if ( !isDefined( zombie_poi.attractor_array ) ) + { + return; + } + for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if ( zombie_poi.attractor_array[ i ] == self ) + { + self notify( "kill_poi" ); + arrayremovevalue( zombie_poi.attractor_array, zombie_poi.attractor_array[ i ] ); + arrayremovevalue( zombie_poi.claimed_attractor_positions, zombie_poi.claimed_attractor_positions[ i ] ); + } + } } -array_check_for_dupes_using_compare( array, single, is_equal_fn ) +array_check_for_dupes_using_compare( array, single, is_equal_fn ) //checked changed to match cerberus output { - for ( i = 0; i < array.size; i++ ) - { - if ( [[ is_equal_fn ]]( array[i], single ) ) - return false; - } - - return true; + for ( i = 0; i < array.size; i++ ) + { + if ( [[ is_equal_fn ]]( array[ i ], single ) ) + { + return 0; + } + } + return 1; } -poi_locations_equal( loc1, loc2 ) +poi_locations_equal( loc1, loc2 ) //checked matches cerberus output { - return loc1[0] == loc2[0]; + return loc1[ 0 ] == loc2[ 0 ]; } -add_poi_attractor( zombie_poi ) +add_poi_attractor( zombie_poi ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - if ( !isdefined( zombie_poi ) ) - return; - - if ( !isdefined( zombie_poi.attractor_array ) ) - zombie_poi.attractor_array = []; - - if ( array_check_for_dupes( zombie_poi.attractor_array, self ) ) - { - if ( !isdefined( zombie_poi.claimed_attractor_positions ) ) - zombie_poi.claimed_attractor_positions = []; - - if ( !isdefined( zombie_poi.attractor_positions ) || zombie_poi.attractor_positions.size <= 0 ) - return undefined; - - start = -1; - end = -1; - last_index = -1; - - for ( i = 0; i < 4; i++ ) - { - if ( zombie_poi.claimed_attractor_positions.size < zombie_poi.last_index[i] ) - { - start = last_index + 1; - end = zombie_poi.last_index[i]; - break; - } - - last_index = zombie_poi.last_index[i]; - } - - best_dist = 100000000; - best_pos = undefined; - - if ( start < 0 ) - start = 0; - - if ( end < 0 ) - return undefined; - - for ( i = int( start ); i <= int( end ); i++ ) - { - if ( !isdefined( zombie_poi.attractor_positions[i] ) ) - continue; - - if ( array_check_for_dupes_using_compare( zombie_poi.claimed_attractor_positions, zombie_poi.attractor_positions[i], ::poi_locations_equal ) ) - { - if ( isdefined( zombie_poi.attractor_positions[i][0] ) && isdefined( self.origin ) ) - { - dist = distancesquared( zombie_poi.attractor_positions[i][0], self.origin ); - - if ( dist < best_dist || !isdefined( best_pos ) ) - { - best_dist = dist; - best_pos = zombie_poi.attractor_positions[i]; - } - } - } - } - - if ( !isdefined( best_pos ) ) - return undefined; - - zombie_poi.attractor_array[zombie_poi.attractor_array.size] = self; - self thread update_poi_on_death( zombie_poi ); - zombie_poi.claimed_attractor_positions[zombie_poi.claimed_attractor_positions.size] = best_pos; - return best_pos; - } - else - { - for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) - { - if ( zombie_poi.attractor_array[i] == self ) - { - if ( isdefined( zombie_poi.claimed_attractor_positions ) && isdefined( zombie_poi.claimed_attractor_positions[i] ) ) - return zombie_poi.claimed_attractor_positions[i]; - } - } - } - - return undefined; + if ( !isDefined( zombie_poi ) ) + { + return; + } + if ( !isDefined( zombie_poi.attractor_array ) ) + { + zombie_poi.attractor_array = []; + } + if ( array_check_for_dupes( zombie_poi.attractor_array, self ) ) + { + if ( !isDefined( zombie_poi.claimed_attractor_positions ) ) + { + zombie_poi.claimed_attractor_positions = []; + } + if ( !isDefined( zombie_poi.attractor_positions ) || zombie_poi.attractor_positions.size <= 0 ) + { + return undefined; + } + start = -1; + end = -1; + last_index = -1; + for ( i = 0; i < 4; i++ ) + { + if ( zombie_poi.claimed_attractor_positions.size < zombie_poi.last_index[ i ] ) + { + start = last_index + 1; + end = zombie_poi.last_index[ i ]; + break; + } + last_index = zombie_poi.last_index[ i ]; + } + best_dist = 100000000; + best_pos = undefined; + if ( start < 0 ) + { + start = 0; + } + if ( end < 0 ) + { + return undefined; + } + i = int( start ); + while ( i <= int( end ) ) + { + if ( !isDefined( zombie_poi.attractor_positions[ i ] ) ) + { + i++; + continue; + } + if ( array_check_for_dupes_using_compare( zombie_poi.claimed_attractor_positions, zombie_poi.attractor_positions[ i ], ::poi_locations_equal ) ) + { + if ( isDefined( zombie_poi.attractor_positions[ i ][ 0 ] ) && isDefined( self.origin ) ) + { + dist = distancesquared( zombie_poi.attractor_positions[ i ][ 0 ], self.origin ); + if ( dist < best_dist || !isDefined( best_pos ) ) + { + best_dist = dist; + best_pos = zombie_poi.attractor_positions[ i ]; + } + } + } + i++; + } + if ( !isDefined( best_pos ) ) + { + return undefined; + } + zombie_poi.attractor_array[ zombie_poi.attractor_array.size ] = self; + self thread update_poi_on_death( zombie_poi ); + zombie_poi.claimed_attractor_positions[ zombie_poi.claimed_attractor_positions.size ] = best_pos; + return best_pos; + } + for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if ( zombie_poi.attractor_array[ i ] == self ) + { + if ( isDefined( zombie_poi.claimed_attractor_positions ) && isDefined( zombie_poi.claimed_attractor_positions[ i ] ) ) + { + return zombie_poi.claimed_attractor_positions[ i ]; + } + } + } + return undefined; } -can_attract( attractor ) +can_attract( attractor ) //checked matches cerberus output { - if ( !isdefined( self.attractor_array ) ) - self.attractor_array = []; - - if ( isdefined( self.attracted_array ) && !isinarray( self.attracted_array, attractor ) ) - return false; - - if ( !array_check_for_dupes( self.attractor_array, attractor ) ) - return true; - - if ( isdefined( self.num_poi_attracts ) && self.attractor_array.size >= self.num_poi_attracts ) - return false; - - return true; + if ( !isDefined( self.attractor_array ) ) + { + self.attractor_array = []; + } + if ( isDefined( self.attracted_array ) && !isinarray( self.attracted_array, attractor ) ) + { + return 0; + } + if ( !array_check_for_dupes( self.attractor_array, attractor ) ) + { + return 1; + } + if ( isDefined( self.num_poi_attracts ) && ( self.attractor_array.size >= self.num_poi_attracts ) ) + { + return 0; + } + return 1; } -update_poi_on_death( zombie_poi ) +update_poi_on_death( zombie_poi ) //checked matches cerberus output { - self endon( "kill_poi" ); - - self waittill( "death" ); - - self remove_poi_attractor( zombie_poi ); + self endon( "kill_poi" ); + self waittill( "death" ); + self remove_poi_attractor( zombie_poi ); } -update_on_poi_removal( zombie_poi ) +update_on_poi_removal( zombie_poi ) //checked changed to match cerberus output { - zombie_poi waittill( "death" ); - - if ( !isdefined( zombie_poi.attractor_array ) ) - return; - - for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) - { - if ( zombie_poi.attractor_array[i] == self ) - { - arrayremoveindex( zombie_poi.attractor_array, i ); - arrayremoveindex( zombie_poi.claimed_attractor_positions, i ); - } - } + zombie_poi waittill( "death" ); + if ( !isDefined( zombie_poi.attractor_array ) ) + { + return; + } + for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if ( zombie_poi.attractor_array[ i ] == self ) + { + arrayremoveindex( zombie_poi.attractor_array, i ); + arrayremoveindex( zombie_poi.claimed_attractor_positions, i ); + } + } } -invalidate_attractor_pos( attractor_pos, zombie ) +invalidate_attractor_pos( attractor_pos, zombie ) //checked changed to match cerberus output { - if ( !isdefined( self ) || !isdefined( attractor_pos ) ) - { - wait 0.1; - return undefined; - } - - if ( isdefined( self.attractor_positions ) && !array_check_for_dupes_using_compare( self.attractor_positions, attractor_pos, ::poi_locations_equal ) ) - { - index = 0; - - for ( i = 0; i < self.attractor_positions.size; i++ ) - { - if ( poi_locations_equal( self.attractor_positions[i], attractor_pos ) ) - index = i; - } - - for ( i = 0; i < self.last_index.size; i++ ) - { - if ( index <= self.last_index[i] ) - self.last_index[i]--; - } - - arrayremovevalue( self.attractor_array, zombie ); - arrayremovevalue( self.attractor_positions, attractor_pos ); - - for ( i = 0; i < self.claimed_attractor_positions.size; i++ ) - { - if ( self.claimed_attractor_positions[i][0] == attractor_pos[0] ) - arrayremovevalue( self.claimed_attractor_positions, self.claimed_attractor_positions[i] ); - } - } - else - wait 0.1; - - return get_zombie_point_of_interest( zombie.origin ); + if ( !isDefined( self ) || !isDefined( attractor_pos ) ) + { + wait 0.1; + return undefined; + } + if ( isDefined( self.attractor_positions ) && !array_check_for_dupes_using_compare( self.attractor_positions, attractor_pos, ::poi_locations_equal ) ) + { + index = 0; + for ( i = 0; i < self.attractor_positions.size; i++ ) + { + if ( poi_locations_equal( self.attractor_positions[ i ], attractor_pos ) ) + { + index = i; + } + } + for ( i = 0; i < self.last_index.size; i++ ) + { + if ( index <= self.last_index[ i ] ) + { + self.last_index[ i ]--; + } + } + arrayremovevalue( self.attractor_array, zombie ); + arrayremovevalue( self.attractor_positions, attractor_pos ); + for ( i = 0; i < self.claimed_attractor_positions.size; i++ ) + { + if ( self.claimed_attractor_positions[ i ][ 0 ] == attractor_pos[ 0 ] ) + { + arrayremovevalue( self.claimed_attractor_positions, self.claimed_attractor_positions[ i ] ); + } + } + } + else + { + wait 0.1; + } + return get_zombie_point_of_interest( zombie.origin ); } -remove_poi_from_ignore_list( poi ) +remove_poi_from_ignore_list( poi ) //checked changed to match cerberus output { - if ( isdefined( self.ignore_poi ) && self.ignore_poi.size > 0 ) - { - for ( i = 0; i < self.ignore_poi.size; i++ ) - { - if ( self.ignore_poi[i] == poi ) - { - arrayremovevalue( self.ignore_poi, self.ignore_poi[i] ); - return; - } - } - } + if ( isDefined( self.ignore_poi ) && self.ignore_poi.size > 0 ) + { + for ( i = 0; i < self.ignore_poi.size; i++ ) + { + if ( self.ignore_poi[ i ] == poi ) + { + arrayremovevalue( self.ignore_poi, self.ignore_poi[ i ] ); + return; + } + } + } } -add_poi_to_ignore_list( poi ) +add_poi_to_ignore_list( poi ) //checked changed to match cerberus output { - if ( !isdefined( self.ignore_poi ) ) - self.ignore_poi = []; - - add_poi = 1; - - if ( self.ignore_poi.size > 0 ) - { - for ( i = 0; i < self.ignore_poi.size; i++ ) - { - if ( self.ignore_poi[i] == poi ) - { - add_poi = 0; - break; - } - } - } - - if ( add_poi ) - self.ignore_poi[self.ignore_poi.size] = poi; + if ( !isDefined( self.ignore_poi ) ) + { + self.ignore_poi = []; + } + add_poi = 1; + if ( self.ignore_poi.size > 0 ) + { + for ( i = 0; i < self.ignore_poi.size; i++ ) + { + if ( self.ignore_poi[ i ] == poi ) + { + add_poi = 0; + break; + } + } + } + else if ( add_poi ) + { + self.ignore_poi[ self.ignore_poi.size ] = poi; + } } -default_validate_enemy_path_length( player ) +default_validate_enemy_path_length( player ) //checked matches cerberus output { - max_dist = 1296; - d = distancesquared( self.origin, player.origin ); - - if ( d <= max_dist ) - return true; - - return false; + max_dist = 1296; + d = distancesquared( self.origin, player.origin ); + if ( d <= max_dist ) + { + return 1; + } + return 0; } -get_path_length_to_enemy( enemy ) +get_path_length_to_enemy( enemy ) //checked matches cerberus output { - path_length = self calcpathlength( enemy.origin ); - return path_length; + path_length = self calcpathlength( enemy.origin ); + return path_length; } -get_closest_player_using_paths( origin, players ) +get_closest_player_using_paths( origin, players ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - min_length_to_player = 9999999; - n_2d_distance_squared = 9999999; - player_to_return = undefined; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - length_to_player = get_path_length_to_enemy( player ); - - if ( isdefined( level.validate_enemy_path_length ) ) - { - if ( length_to_player == 0 ) - { - valid = self thread [[ level.validate_enemy_path_length ]]( player ); - - if ( !valid ) - continue; - } - } - - if ( length_to_player < min_length_to_player ) - { - min_length_to_player = length_to_player; - player_to_return = player; - n_2d_distance_squared = distance2dsquared( self.origin, player.origin ); - continue; - } - - if ( length_to_player == min_length_to_player && length_to_player <= 5 ) - { - n_new_distance = distance2dsquared( self.origin, player.origin ); - - if ( n_new_distance < n_2d_distance_squared ) - { - min_length_to_player = length_to_player; - player_to_return = player; - n_2d_distance_squared = n_new_distance; - } - } - } - - return player_to_return; + min_length_to_player = 9999999; + n_2d_distance_squared = 9999999; + player_to_return = undefined; + i = 0; + while ( i < players.size ) + { + player = players[ i ]; + length_to_player = get_path_length_to_enemy( player ); + if ( isDefined( level.validate_enemy_path_length ) ) + { + if ( length_to_player == 0 ) + { + valid = self thread [[ level.validate_enemy_path_length ]]( player ); + if ( !valid ) + { + i++; + continue; + } + } + } + if ( length_to_player < min_length_to_player ) + { + min_length_to_player = length_to_player; + player_to_return = player; + n_2d_distance_squared = distance2dsquared( self.origin, player.origin ); + i++; + continue; + } + if ( length_to_player == min_length_to_player && length_to_player <= 5 ) + { + n_new_distance = distance2dsquared( self.origin, player.origin ); + if ( n_new_distance < n_2d_distance_squared ) + { + min_length_to_player = length_to_player; + player_to_return = player; + n_2d_distance_squared = n_new_distance; + } + } + i++; + } + return player_to_return; } -get_closest_valid_player( origin, ignore_player ) +get_closest_valid_player( origin, ignore_player ) //checked changed to match cerberus output { - valid_player_found = 0; - players = get_players(); - - if ( isdefined( level._zombie_using_humangun ) && level._zombie_using_humangun ) - players = arraycombine( players, level._zombie_human_array, 0, 0 ); - - if ( isdefined( ignore_player ) ) - { - for ( i = 0; i < ignore_player.size; i++ ) - arrayremovevalue( players, ignore_player[i] ); - } - - done = 0; - - while ( players.size && !done ) - { - done = 1; - - for ( i = 0; i < players.size; i++ ) - { - player = players[i]; - - if ( !is_player_valid( player, 1 ) ) - { - arrayremovevalue( players, player ); - done = 0; - break; - } - } - } - - if ( players.size == 0 ) - return undefined; - - while ( !valid_player_found ) - { - if ( isdefined( self.closest_player_override ) ) - player = [[ self.closest_player_override ]]( origin, players ); - else if ( isdefined( level.closest_player_override ) ) - player = [[ level.closest_player_override ]]( origin, players ); - else if ( isdefined( level.calc_closest_player_using_paths ) && level.calc_closest_player_using_paths ) - player = get_closest_player_using_paths( origin, players ); - else - player = getclosest( origin, players ); - - if ( !isdefined( player ) || players.size == 0 ) - return undefined; - - if ( isdefined( level._zombie_using_humangun ) && level._zombie_using_humangun && isai( player ) ) - return player; - - if ( !is_player_valid( player, 1 ) ) - { - arrayremovevalue( players, player ); - - if ( players.size == 0 ) - return undefined; - - continue; - } - - return player; - } + valid_player_found = 0; + players = get_players(); + if ( is_true( level._zombie_using_humangun ) ) + { + players = arraycombine( players, level._zombie_human_array, 0, 0 ); + } + if ( isDefined( ignore_player ) ) + { + for ( i = 0; i < ignore_player.size; i++ ) + { + arrayremovevalue( players, ignore_player[ i ] ); + } + } + done = 0; + while ( players.size && !done ) + { + done = 1; + for ( i = 0; i < players.size; i++ ) + { + player = players[ i ]; + if ( !is_player_valid( player, 1 ) ) + { + arrayremovevalue( players, player ); + done = 0; + break; + } + } + } + if ( players.size == 0 ) + { + return undefined; + } + while ( !valid_player_found ) + { + if ( isDefined( self.closest_player_override ) ) + { + player = [[ self.closest_player_override ]]( origin, players ); + } + else if ( isDefined( level.closest_player_override ) ) + { + player = [[ level.closest_player_override ]]( origin, players ); + } + else if ( is_true( level.calc_closest_player_using_paths ) ) + { + player = get_closest_player_using_paths( origin, players ); + } + else + { + player = getclosest( origin, players ); + } + if ( !isDefined( player ) || players.size == 0 ) + { + return undefined; + } + if ( is_true( level._zombie_using_humangun ) && isai( player ) ) + { + return player; + } + if ( !is_player_valid( player, 1 ) ) + { + arrayremovevalue( players, player ); + if ( players.size == 0 ) + { + return undefined; + } + } + return player; + } } -is_player_valid( player, checkignoremeflag, ignore_laststand_players ) +is_player_valid( player, checkignoremeflag, ignore_laststand_players ) //checked matches cerberus output { - if ( !isdefined( player ) ) - return 0; - - if ( !isalive( player ) ) - return 0; - - if ( !isplayer( player ) ) - return 0; - - if ( isdefined( player.is_zombie ) && player.is_zombie == 1 ) - return 0; - - if ( player.sessionstate == "spectator" ) - return 0; - - if ( player.sessionstate == "intermission" ) - return 0; - - if ( isdefined( self.intermission ) && self.intermission ) - return 0; - - if ( !( isdefined( ignore_laststand_players ) && ignore_laststand_players ) ) - { - if ( player maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - return 0; - } - - if ( isdefined( checkignoremeflag ) && checkignoremeflag && player.ignoreme ) - return 0; - - if ( isdefined( level.is_player_valid_override ) ) - return [[ level.is_player_valid_override ]]( player ); - - return 1; + if ( !isDefined( player ) ) + { + return 0; + } + if ( !isalive( player ) ) + { + return 0; + } + if ( !isplayer( player ) ) + { + return 0; + } + if ( isDefined( player.is_zombie ) && player.is_zombie == 1 ) + { + return 0; + } + if ( player.sessionstate == "spectator" ) + { + return 0; + } + if ( player.sessionstate == "intermission" ) + { + return 0; + } + if ( is_true( self.intermission ) ) + { + return 0; + } + if ( !is_true( ignore_laststand_players ) ) + { + if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + return 0; + } + } + if ( is_true( checkignoremeflag ) && player.ignoreme ) + { + return 0; + } + if ( isDefined( level.is_player_valid_override ) ) + { + return [[ level.is_player_valid_override ]]( player ); + } + return 1; } -get_number_of_valid_players() +get_number_of_valid_players() //checked changed to match cerberus output { - players = get_players(); - num_player_valid = 0; - - for ( i = 0; i < players.size; i++ ) - { - if ( is_player_valid( players[i] ) ) - num_player_valid += 1; - } - - return num_player_valid; + players = get_players(); + num_player_valid = 0; + for ( i = 0; i < players.size; i++ ) + { + if ( is_player_valid( players[ i ] ) ) + { + num_player_valid += 1; + } + } + return num_player_valid; } -in_revive_trigger() +in_revive_trigger() //checked changed to match cerberus output { - if ( isdefined( self.rt_time ) && self.rt_time + 100 >= gettime() ) - return self.in_rt_cached; - - self.rt_time = gettime(); - players = level.players; - - for ( i = 0; i < players.size; i++ ) - { - current_player = players[i]; - - if ( isdefined( current_player ) && isdefined( current_player.revivetrigger ) && isalive( current_player ) ) - { - if ( self istouching( current_player.revivetrigger ) ) - { - self.in_rt_cached = 1; - return 1; - } - } - } - - self.in_rt_cached = 0; - return 0; + if ( isDefined( self.rt_time ) && ( self.rt_time + 100 ) >= getTime() ) + { + return self.in_rt_cached; + } + self.rt_time = getTime(); + players = level.players; + for ( i = 0; i < players.size; i++ ) + { + current_player = players[ i ]; + if ( isDefined( current_player ) && isDefined( current_player.revivetrigger ) && isalive( current_player ) ) + { + if ( self istouching( current_player.revivetrigger ) ) + { + self.in_rt_cached = 1; + return 1; + } + } + } + self.in_rt_cached = 0; + return 0; } -get_closest_node( org, nodes ) +get_closest_node( org, nodes ) //checked matches cerberus output { - return getclosest( org, nodes ); + return getclosest( org, nodes ); } -non_destroyed_bar_board_order( origin, chunks ) +non_destroyed_bar_board_order( origin, chunks ) //checked partially changed to match cerberus output //did not change while loop with continue to for loop to prevent infinite continue loop bug { - first_bars = []; - first_bars1 = []; - first_bars2 = []; - - for ( i = 0; i < chunks.size; i++ ) - { - if ( isdefined( chunks[i].script_team ) && chunks[i].script_team == "classic_boards" ) - { - if ( isdefined( chunks[i].script_parameters ) && chunks[i].script_parameters == "board" ) - return get_closest_2d( origin, chunks ); - else if ( isdefined( chunks[i].script_team ) && chunks[i].script_team == "bar_board_variant1" || chunks[i].script_team == "bar_board_variant2" || chunks[i].script_team == "bar_board_variant4" || chunks[i].script_team == "bar_board_variant5" ) - return undefined; - - continue; - } - - if ( isdefined( chunks[i].script_team ) && chunks[i].script_team == "new_barricade" ) - { - if ( isdefined( chunks[i].script_parameters ) && ( chunks[i].script_parameters == "repair_board" || chunks[i].script_parameters == "barricade_vents" ) ) - return get_closest_2d( origin, chunks ); - } - } - - for ( i = 0; i < chunks.size; i++ ) - { - if ( isdefined( chunks[i].script_team ) && chunks[i].script_team == "6_bars_bent" || chunks[i].script_team == "6_bars_prestine" ) - { - if ( isdefined( chunks[i].script_parameters ) && chunks[i].script_parameters == "bar" ) - { - if ( isdefined( chunks[i].script_noteworthy ) ) - { - if ( chunks[i].script_noteworthy == "4" || chunks[i].script_noteworthy == "6" ) - first_bars[first_bars.size] = chunks[i]; - } - } - } - } - - for ( i = 0; i < first_bars.size; i++ ) - { - if ( isdefined( chunks[i].script_team ) && chunks[i].script_team == "6_bars_bent" || chunks[i].script_team == "6_bars_prestine" ) - { - if ( isdefined( chunks[i].script_parameters ) && chunks[i].script_parameters == "bar" ) - { - if ( !first_bars[i].destroyed ) - return first_bars[i]; - } - } - } - - for ( i = 0; i < chunks.size; i++ ) - { - if ( isdefined( chunks[i].script_team ) && chunks[i].script_team == "6_bars_bent" || chunks[i].script_team == "6_bars_prestine" ) - { - if ( isdefined( chunks[i].script_parameters ) && chunks[i].script_parameters == "bar" ) - { - if ( !chunks[i].destroyed ) - return get_closest_2d( origin, chunks ); - } - } - } + first_bars = []; + first_bars1 = []; + first_bars2 = []; + i = 0; + while ( i < chunks.size ) + { + if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "classic_boards" ) + { + if ( isDefined( chunks[ i ].script_parameters ) && chunks[ i ].script_parameters == "board" ) + { + return get_closest_2d( origin, chunks ); + } + else if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team != "bar_board_variant1" && chunks[ i ].script_team != "bar_board_variant2" || chunks[ i ].script_team == "bar_board_variant4" && chunks[ i ].script_team == "bar_board_variant5" ) + { + return undefined; + } + i++; + continue; + } + if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "new_barricade" ) + { + if ( isDefined( chunks[ i ].script_parameters ) || chunks[ i ].script_parameters == "repair_board" && chunks[ i ].script_parameters == "barricade_vents" ) + { + return get_closest_2d( origin, chunks ); + } + } + i++; + } + for ( i = 0; i < chunks.size; i++ ) + { + if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "6_bars_bent" || chunks[ i ].script_team == "6_bars_prestine" ) + { + if ( isDefined( chunks[ i ].script_parameters ) && chunks[ i ].script_parameters == "bar" ) + { + if ( isDefined( chunks[ i ].script_noteworthy ) ) + { + if ( chunks[ i ].script_noteworthy == "4" || chunks[ i ].script_noteworthy == "6" ) + { + first_bars[ first_bars.size ] = chunks[ i ]; + } + } + } + } + } + for ( i = 0; i < chunks.size; i++ ) + { + if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "6_bars_bent" || chunks[ i ].script_team == "6_bars_prestine" ) + { + if ( isDefined( chunks[ i ].script_parameters ) && chunks[ i ].script_parameters == "bar" ) + { + if ( !first_bars[ i ].destroyed ) + { + return first_bars[ i ]; + } + } + } + } + for ( i = 0; i < chunks.size; i++ ) + { + if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "6_bars_bent" || chunks[ i ].script_team == "6_bars_prestine" ) + { + if ( isDefined( chunks[ i ].script_parameters ) && chunks[ i ].script_parameters == "bar" ) + { + if ( !chunks[ i ].destroyed ) + { + return get_closest_2d( origin, chunks ); + } + } + } + } } -non_destroyed_grate_order( origin, chunks_grate ) +non_destroyed_grate_order( origin, chunks_grate ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { - grate_order = []; - grate_order1 = []; - grate_order2 = []; - grate_order3 = []; - grate_order4 = []; - grate_order5 = []; - grate_order6 = []; - - if ( isdefined( chunks_grate ) ) - { - for ( i = 0; i < chunks_grate.size; i++ ) - { - if ( isdefined( chunks_grate[i].script_parameters ) && chunks_grate[i].script_parameters == "grate" ) - { - if ( isdefined( chunks_grate[i].script_noteworthy ) && chunks_grate[i].script_noteworthy == "1" ) - grate_order1[grate_order1.size] = chunks_grate[i]; - - if ( isdefined( chunks_grate[i].script_noteworthy ) && chunks_grate[i].script_noteworthy == "2" ) - grate_order2[grate_order2.size] = chunks_grate[i]; - - if ( isdefined( chunks_grate[i].script_noteworthy ) && chunks_grate[i].script_noteworthy == "3" ) - grate_order3[grate_order3.size] = chunks_grate[i]; - - if ( isdefined( chunks_grate[i].script_noteworthy ) && chunks_grate[i].script_noteworthy == "4" ) - grate_order4[grate_order4.size] = chunks_grate[i]; - - if ( isdefined( chunks_grate[i].script_noteworthy ) && chunks_grate[i].script_noteworthy == "5" ) - grate_order5[grate_order5.size] = chunks_grate[i]; - - if ( isdefined( chunks_grate[i].script_noteworthy ) && chunks_grate[i].script_noteworthy == "6" ) - grate_order6[grate_order6.size] = chunks_grate[i]; - } - } - - for ( i = 0; i < chunks_grate.size; i++ ) - { - if ( isdefined( chunks_grate[i].script_parameters ) && chunks_grate[i].script_parameters == "grate" ) - { - if ( isdefined( grate_order1[i] ) ) - { - if ( grate_order1[i].state == "repaired" ) - { - grate_order2[i] thread show_grate_pull(); - return grate_order1[i]; - } - - if ( grate_order2[i].state == "repaired" ) - { + grate_order = []; + grate_order1 = []; + grate_order2 = []; + grate_order3 = []; + grate_order4 = []; + grate_order5 = []; + grate_order6 = []; + if ( isDefined( chunks_grate ) ) + { + for ( i = 0; i < chunks_grate.size; i++ ) + { + if ( isDefined( chunks_grate[ i ].script_parameters ) && chunks_grate[ i ].script_parameters == "grate" ) + { + if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "1" ) + { + grate_order1[ grate_order1.size ] = chunks_grate[ i ]; + } + if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "2" ) + { + grate_order2[ grate_order2.size ] = chunks_grate[ i ]; + } + if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "3" ) + { + grate_order3[ grate_order3.size ] = chunks_grate[ i ]; + } + if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "4" ) + { + grate_order4[ grate_order4.size ] = chunks_grate[ i ]; + } + if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "5" ) + { + grate_order5[ grate_order5.size ] = chunks_grate[ i ]; + } + if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "6" ) + { + grate_order6[ grate_order6.size ] = chunks_grate[ i ]; + } + } + } + for ( i = 0; i < chunks_grate.size; i++ ) + { + if ( isDefined( chunks_grate[ i ].script_parameters ) && chunks_grate[ i ].script_parameters == "grate" ) + { + if ( isDefined( grate_order1[ i ] ) ) + { + if ( grate_order1[ i ].state == "repaired" ) + { + grate_order2[ i ] thread show_grate_pull(); + return grate_order1[ i ]; + } + if ( grate_order2[ i ].state == "repaired" ) + { + /* /# - iprintlnbold( " pull bar2 " ); + iprintlnbold( " pull bar2 " ); #/ - grate_order3[i] thread show_grate_pull(); - return grate_order2[i]; - continue; - } - - if ( grate_order3[i].state == "repaired" ) - { + */ + grate_order3[ i ] thread show_grate_pull(); + return grate_order2[ i ]; + } + if ( grate_order3[ i ].state == "repaired" ) + { + /* /# - iprintlnbold( " pull bar3 " ); + iprintlnbold( " pull bar3 " ); #/ - grate_order4[i] thread show_grate_pull(); - return grate_order3[i]; - continue; - } - - if ( grate_order4[i].state == "repaired" ) - { + */ + grate_order4[ i ] thread show_grate_pull(); + return grate_order3[ i ]; + } + if ( grate_order4[ i ].state == "repaired" ) + { + /* /# - iprintlnbold( " pull bar4 " ); + iprintlnbold( " pull bar4 " ); #/ - grate_order5[i] thread show_grate_pull(); - return grate_order4[i]; - continue; - } - - if ( grate_order5[i].state == "repaired" ) - { + */ + grate_order5[ i ] thread show_grate_pull(); + return grate_order4[ i ]; + } + if ( grate_order5[ i ].state == "repaired" ) + { + /* /# - iprintlnbold( " pull bar5 " ); + iprintlnbold( " pull bar5 " ); #/ - grate_order6[i] thread show_grate_pull(); - return grate_order5[i]; - continue; - } - - if ( grate_order6[i].state == "repaired" ) - return grate_order6[i]; - } - } - } - } + */ + grate_order6[ i ] thread show_grate_pull(); + return grate_order5[ i ]; + } + if ( grate_order6[ i ].state == "repaired" ) + { + return grate_order6[ i ]; + } + } + } + } + } } -non_destroyed_variant1_order( origin, chunks_variant1 ) +non_destroyed_variant1_order( origin, chunks_variant1 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { - variant1_order = []; - variant1_order1 = []; - variant1_order2 = []; - variant1_order3 = []; - variant1_order4 = []; - variant1_order5 = []; - variant1_order6 = []; - - if ( isdefined( chunks_variant1 ) ) - { - for ( i = 0; i < chunks_variant1.size; i++ ) - { - if ( isdefined( chunks_variant1[i].script_team ) && chunks_variant1[i].script_team == "bar_board_variant1" ) - { - if ( isdefined( chunks_variant1[i].script_noteworthy ) ) - { - if ( chunks_variant1[i].script_noteworthy == "1" ) - variant1_order1[variant1_order1.size] = chunks_variant1[i]; - - if ( chunks_variant1[i].script_noteworthy == "2" ) - variant1_order2[variant1_order2.size] = chunks_variant1[i]; - - if ( chunks_variant1[i].script_noteworthy == "3" ) - variant1_order3[variant1_order3.size] = chunks_variant1[i]; - - if ( chunks_variant1[i].script_noteworthy == "4" ) - variant1_order4[variant1_order4.size] = chunks_variant1[i]; - - if ( chunks_variant1[i].script_noteworthy == "5" ) - variant1_order5[variant1_order5.size] = chunks_variant1[i]; - - if ( chunks_variant1[i].script_noteworthy == "6" ) - variant1_order6[variant1_order6.size] = chunks_variant1[i]; - } - } - } - - for ( i = 0; i < chunks_variant1.size; i++ ) - { - if ( isdefined( chunks_variant1[i].script_team ) && chunks_variant1[i].script_team == "bar_board_variant1" ) - { - if ( isdefined( variant1_order2[i] ) ) - { - if ( variant1_order2[i].state == "repaired" ) - { - return variant1_order2[i]; - continue; - } - - if ( variant1_order3[i].state == "repaired" ) - { - return variant1_order3[i]; - continue; - } - - if ( variant1_order4[i].state == "repaired" ) - { - return variant1_order4[i]; - continue; - } - - if ( variant1_order6[i].state == "repaired" ) - { - return variant1_order6[i]; - continue; - } - - if ( variant1_order5[i].state == "repaired" ) - { - return variant1_order5[i]; - continue; - } - - if ( variant1_order1[i].state == "repaired" ) - return variant1_order1[i]; - } - } - } - } + variant1_order = []; + variant1_order1 = []; + variant1_order2 = []; + variant1_order3 = []; + variant1_order4 = []; + variant1_order5 = []; + variant1_order6 = []; + if ( isDefined( chunks_variant1 ) ) + { + for ( i = 0; i < chunks_variant1.size; i++ ) + { + if ( isDefined( chunks_variant1[ i ].script_team ) && chunks_variant1[ i ].script_team == "bar_board_variant1" ) + { + if ( isDefined( chunks_variant1[ i ].script_noteworthy ) ) + { + if ( chunks_variant1[ i ].script_noteworthy == "1" ) + { + variant1_order1[ variant1_order1.size ] = chunks_variant1[ i ]; + } + if ( chunks_variant1[ i ].script_noteworthy == "2" ) + { + variant1_order2[ variant1_order2.size ] = chunks_variant1[ i ]; + } + if ( chunks_variant1[ i ].script_noteworthy == "3" ) + { + variant1_order3[ variant1_order3.size ] = chunks_variant1[ i ]; + } + if ( chunks_variant1[ i ].script_noteworthy == "4" ) + { + variant1_order4[ variant1_order4.size ] = chunks_variant1[ i ]; + } + if ( chunks_variant1[ i ].script_noteworthy == "5" ) + { + variant1_order5[ variant1_order5.size ] = chunks_variant1[ i ]; + } + if ( chunks_variant1[ i ].script_noteworthy == "6" ) + { + variant1_order6[ variant1_order6.size ] = chunks_variant1[ i ]; + } + } + } + } + for ( i = 0; i < chunks_variant1.size; i++ ) + { + if ( isDefined( chunks_variant1[ i ].script_team ) && chunks_variant1[ i ].script_team == "bar_board_variant1" ) + { + if ( isDefined( variant1_order2[ i ] ) ) + { + if ( variant1_order2[ i ].state == "repaired" ) + { + return variant1_order2[ i ]; + } + if ( variant1_order3[ i ].state == "repaired" ) + { + return variant1_order3[ i ]; + } + if ( variant1_order4[ i ].state == "repaired" ) + { + return variant1_order4[ i ]; + } + if ( variant1_order6[ i ].state == "repaired" ) + { + return variant1_order6[ i ]; + } + if ( variant1_order5[ i ].state == "repaired" ) + { + return variant1_order5[ i ]; + } + if ( variant1_order1[ i ].state == "repaired" ) + { + return variant1_order1[ i ]; + } + } + } + } + } } -non_destroyed_variant2_order( origin, chunks_variant2 ) +non_destroyed_variant2_order( origin, chunks_variant2 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { - variant2_order = []; - variant2_order1 = []; - variant2_order2 = []; - variant2_order3 = []; - variant2_order4 = []; - variant2_order5 = []; - variant2_order6 = []; - - if ( isdefined( chunks_variant2 ) ) - { - for ( i = 0; i < chunks_variant2.size; i++ ) - { - if ( isdefined( chunks_variant2[i].script_team ) && chunks_variant2[i].script_team == "bar_board_variant2" ) - { - if ( isdefined( chunks_variant2[i].script_noteworthy ) && chunks_variant2[i].script_noteworthy == "1" ) - variant2_order1[variant2_order1.size] = chunks_variant2[i]; - - if ( isdefined( chunks_variant2[i].script_noteworthy ) && chunks_variant2[i].script_noteworthy == "2" ) - variant2_order2[variant2_order2.size] = chunks_variant2[i]; - - if ( isdefined( chunks_variant2[i].script_noteworthy ) && chunks_variant2[i].script_noteworthy == "3" ) - variant2_order3[variant2_order3.size] = chunks_variant2[i]; - - if ( isdefined( chunks_variant2[i].script_noteworthy ) && chunks_variant2[i].script_noteworthy == "4" ) - variant2_order4[variant2_order4.size] = chunks_variant2[i]; - - if ( isdefined( chunks_variant2[i].script_noteworthy ) && chunks_variant2[i].script_noteworthy == "5" && isdefined( chunks_variant2[i].script_location ) && chunks_variant2[i].script_location == "5" ) - variant2_order5[variant2_order5.size] = chunks_variant2[i]; - - if ( isdefined( chunks_variant2[i].script_noteworthy ) && chunks_variant2[i].script_noteworthy == "5" && isdefined( chunks_variant2[i].script_location ) && chunks_variant2[i].script_location == "6" ) - variant2_order6[variant2_order6.size] = chunks_variant2[i]; - } - } - - for ( i = 0; i < chunks_variant2.size; i++ ) - { - if ( isdefined( chunks_variant2[i].script_team ) && chunks_variant2[i].script_team == "bar_board_variant2" ) - { - if ( isdefined( variant2_order1[i] ) ) - { - if ( variant2_order1[i].state == "repaired" ) - { - return variant2_order1[i]; - continue; - } - - if ( variant2_order2[i].state == "repaired" ) - { - return variant2_order2[i]; - continue; - } - - if ( variant2_order3[i].state == "repaired" ) - { - return variant2_order3[i]; - continue; - } - - if ( variant2_order5[i].state == "repaired" ) - { - return variant2_order5[i]; - continue; - } - - if ( variant2_order4[i].state == "repaired" ) - { - return variant2_order4[i]; - continue; - } - - if ( variant2_order6[i].state == "repaired" ) - return variant2_order6[i]; - } - } - } - } + variant2_order = []; + variant2_order1 = []; + variant2_order2 = []; + variant2_order3 = []; + variant2_order4 = []; + variant2_order5 = []; + variant2_order6 = []; + if ( isDefined( chunks_variant2 ) ) + { + for ( i = 0; i < chunks_variant2.size; i++ ) + { + if ( isDefined( chunks_variant2[ i ].script_team ) && chunks_variant2[ i ].script_team == "bar_board_variant2" ) + { + if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "1" ) + { + variant2_order1[ variant2_order1.size ] = chunks_variant2[ i ]; + } + if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "2" ) + { + variant2_order2[ variant2_order2.size ] = chunks_variant2[ i ]; + } + if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "3" ) + { + variant2_order3[ variant2_order3.size ] = chunks_variant2[ i ]; + } + if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "4" ) + { + variant2_order4[ variant2_order4.size ] = chunks_variant2[ i ]; + } + if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "5" && isDefined( chunks_variant2[ i ].script_location ) && chunks_variant2[ i ].script_location == "5" ) + { + variant2_order5[ variant2_order5.size ] = chunks_variant2[ i ]; + } + if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "5" && isDefined( chunks_variant2[ i ].script_location ) && chunks_variant2[ i ].script_location == "6" ) + { + variant2_order6[ variant2_order6.size ] = chunks_variant2[ i ]; + } + } + } + for ( i = 0; i < chunks_variant2.size; i++ ) + { + if ( isDefined( chunks_variant2[ i ].script_team ) && chunks_variant2[ i ].script_team == "bar_board_variant2" ) + { + if ( isDefined( variant2_order1[ i ] ) ) + { + if ( variant2_order1[ i ].state == "repaired" ) + { + return variant2_order1[ i ]; + } + if ( variant2_order2[ i ].state == "repaired" ) + { + return variant2_order2[ i ]; + } + if ( variant2_order3[ i ].state == "repaired" ) + { + return variant2_order3[ i ]; + } + if ( variant2_order5[ i ].state == "repaired" ) + { + return variant2_order5[ i ]; + } + if ( variant2_order4[ i ].state == "repaired" ) + { + return variant2_order4[ i ]; + } + if ( variant2_order6[ i ].state == "repaired" ) + { + return variant2_order6[ i ]; + } + } + } + } + } } -non_destroyed_variant4_order( origin, chunks_variant4 ) +non_destroyed_variant4_order( origin, chunks_variant4 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { - variant4_order = []; - variant4_order1 = []; - variant4_order2 = []; - variant4_order3 = []; - variant4_order4 = []; - variant4_order5 = []; - variant4_order6 = []; - - if ( isdefined( chunks_variant4 ) ) - { - for ( i = 0; i < chunks_variant4.size; i++ ) - { - if ( isdefined( chunks_variant4[i].script_team ) && chunks_variant4[i].script_team == "bar_board_variant4" ) - { - if ( isdefined( chunks_variant4[i].script_noteworthy ) && chunks_variant4[i].script_noteworthy == "1" && !isdefined( chunks_variant4[i].script_location ) ) - variant4_order1[variant4_order1.size] = chunks_variant4[i]; - - if ( isdefined( chunks_variant4[i].script_noteworthy ) && chunks_variant4[i].script_noteworthy == "2" ) - variant4_order2[variant4_order2.size] = chunks_variant4[i]; - - if ( isdefined( chunks_variant4[i].script_noteworthy ) && chunks_variant4[i].script_noteworthy == "3" ) - variant4_order3[variant4_order3.size] = chunks_variant4[i]; - - if ( isdefined( chunks_variant4[i].script_noteworthy ) && chunks_variant4[i].script_noteworthy == "1" && isdefined( chunks_variant4[i].script_location ) && chunks_variant4[i].script_location == "3" ) - variant4_order4[variant4_order4.size] = chunks_variant4[i]; - - if ( isdefined( chunks_variant4[i].script_noteworthy ) && chunks_variant4[i].script_noteworthy == "5" ) - variant4_order5[variant4_order5.size] = chunks_variant4[i]; - - if ( isdefined( chunks_variant4[i].script_noteworthy ) && chunks_variant4[i].script_noteworthy == "6" ) - variant4_order6[variant4_order6.size] = chunks_variant4[i]; - } - } - - for ( i = 0; i < chunks_variant4.size; i++ ) - { - if ( isdefined( chunks_variant4[i].script_team ) && chunks_variant4[i].script_team == "bar_board_variant4" ) - { - if ( isdefined( variant4_order1[i] ) ) - { - if ( variant4_order1[i].state == "repaired" ) - { - return variant4_order1[i]; - continue; - } - - if ( variant4_order6[i].state == "repaired" ) - { - return variant4_order6[i]; - continue; - } - - if ( variant4_order3[i].state == "repaired" ) - { - return variant4_order3[i]; - continue; - } - - if ( variant4_order4[i].state == "repaired" ) - { - return variant4_order4[i]; - continue; - } - - if ( variant4_order2[i].state == "repaired" ) - { - return variant4_order2[i]; - continue; - } - - if ( variant4_order5[i].state == "repaired" ) - return variant4_order5[i]; - } - } - } - } + variant4_order = []; + variant4_order1 = []; + variant4_order2 = []; + variant4_order3 = []; + variant4_order4 = []; + variant4_order5 = []; + variant4_order6 = []; + if ( isDefined( chunks_variant4 ) ) + { + for ( i = 0; i < chunks_variant4.size; i++ ) + { + if ( isDefined( chunks_variant4[ i ].script_team ) && chunks_variant4[ i ].script_team == "bar_board_variant4" ) + { + if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "1" && !isDefined( chunks_variant4[ i ].script_location ) ) + { + variant4_order1[ variant4_order1.size ] = chunks_variant4[ i ]; + } + if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "2" ) + { + variant4_order2[ variant4_order2.size ] = chunks_variant4[ i ]; + } + if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "3" ) + { + variant4_order3[ variant4_order3.size ] = chunks_variant4[ i ]; + } + if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "1" && isDefined( chunks_variant4[ i ].script_location ) && chunks_variant4[ i ].script_location == "3" ) + { + variant4_order4[ variant4_order4.size ] = chunks_variant4[ i ]; + } + if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "5" ) + { + variant4_order5[ variant4_order5.size ] = chunks_variant4[ i ]; + } + if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "6" ) + { + variant4_order6[ variant4_order6.size ] = chunks_variant4[ i ]; + } + } + } + for ( i = 0; i < chunks_variant4.size; i++ ) + { + if ( isDefined( chunks_variant4[ i ].script_team ) && chunks_variant4[ i ].script_team == "bar_board_variant4" ) + { + if ( isDefined( variant4_order1[ i ] ) ) + { + if ( variant4_order1[ i ].state == "repaired" ) + { + return variant4_order1[ i ]; + } + if ( variant4_order6[ i ].state == "repaired" ) + { + return variant4_order6[ i ]; + } + if ( variant4_order3[ i ].state == "repaired" ) + { + return variant4_order3[ i ]; + } + if ( variant4_order4[ i ].state == "repaired" ) + { + return variant4_order4[ i ]; + } + if ( variant4_order2[ i ].state == "repaired" ) + { + return variant4_order2[ i ]; + } + if ( variant4_order5[ i ].state == "repaired" ) + { + return variant4_order5[ i ]; + } + } + } + } + } } -non_destroyed_variant5_order( origin, chunks_variant5 ) +non_destroyed_variant5_order( origin, chunks_variant5 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { - variant5_order = []; - variant5_order1 = []; - variant5_order2 = []; - variant5_order3 = []; - variant5_order4 = []; - variant5_order5 = []; - variant5_order6 = []; - - if ( isdefined( chunks_variant5 ) ) - { - for ( i = 0; i < chunks_variant5.size; i++ ) - { - if ( isdefined( chunks_variant5[i].script_team ) && chunks_variant5[i].script_team == "bar_board_variant5" ) - { - if ( isdefined( chunks_variant5[i].script_noteworthy ) ) - { - if ( chunks_variant5[i].script_noteworthy == "1" && !isdefined( chunks_variant5[i].script_location ) ) - variant5_order1[variant5_order1.size] = chunks_variant5[i]; - - if ( chunks_variant5[i].script_noteworthy == "2" ) - variant5_order2[variant5_order2.size] = chunks_variant5[i]; - - if ( isdefined( chunks_variant5[i].script_noteworthy ) && chunks_variant5[i].script_noteworthy == "1" && isdefined( chunks_variant5[i].script_location ) && chunks_variant5[i].script_location == "3" ) - variant5_order3[variant5_order3.size] = chunks_variant5[i]; - - if ( chunks_variant5[i].script_noteworthy == "4" ) - variant5_order4[variant5_order4.size] = chunks_variant5[i]; - - if ( chunks_variant5[i].script_noteworthy == "5" ) - variant5_order5[variant5_order5.size] = chunks_variant5[i]; - - if ( chunks_variant5[i].script_noteworthy == "6" ) - variant5_order6[variant5_order6.size] = chunks_variant5[i]; - } - } - } - - for ( i = 0; i < chunks_variant5.size; i++ ) - { - if ( isdefined( chunks_variant5[i].script_team ) && chunks_variant5[i].script_team == "bar_board_variant5" ) - { - if ( isdefined( variant5_order1[i] ) ) - { - if ( variant5_order1[i].state == "repaired" ) - { - return variant5_order1[i]; - continue; - } - - if ( variant5_order6[i].state == "repaired" ) - { - return variant5_order6[i]; - continue; - } - - if ( variant5_order3[i].state == "repaired" ) - { - return variant5_order3[i]; - continue; - } - - if ( variant5_order2[i].state == "repaired" ) - { - return variant5_order2[i]; - continue; - } - - if ( variant5_order5[i].state == "repaired" ) - { - return variant5_order5[i]; - continue; - } - - if ( variant5_order4[i].state == "repaired" ) - return variant5_order4[i]; - } - } - } - } + variant5_order = []; + variant5_order1 = []; + variant5_order2 = []; + variant5_order3 = []; + variant5_order4 = []; + variant5_order5 = []; + variant5_order6 = []; + if ( isDefined( chunks_variant5 ) ) + { + for ( i = 0; i < chunks_variant5.size; i++ ) + { + if ( isDefined( chunks_variant5[ i ].script_team ) && chunks_variant5[ i ].script_team == "bar_board_variant5" ) + { + if ( isDefined( chunks_variant5[ i ].script_noteworthy ) ) + { + if ( chunks_variant5[ i ].script_noteworthy == "1" && !isDefined( chunks_variant5[ i ].script_location ) ) + { + variant5_order1[ variant5_order1.size ] = chunks_variant5[ i ]; + } + if ( chunks_variant5[ i ].script_noteworthy == "2" ) + { + variant5_order2[ variant5_order2.size ] = chunks_variant5[ i ]; + } + if ( isDefined( chunks_variant5[ i ].script_noteworthy ) && chunks_variant5[ i ].script_noteworthy == "1" && isDefined( chunks_variant5[ i ].script_location ) && chunks_variant5[ i ].script_location == "3" ) + { + variant5_order3[ variant5_order3.size ] = chunks_variant5[ i ]; + } + if ( chunks_variant5[ i ].script_noteworthy == "4" ) + { + variant5_order4[ variant5_order4.size ] = chunks_variant5[ i ]; + } + if ( chunks_variant5[ i ].script_noteworthy == "5" ) + { + variant5_order5[ variant5_order5.size ] = chunks_variant5[ i ]; + } + if ( chunks_variant5[ i ].script_noteworthy == "6" ) + { + variant5_order6[ variant5_order6.size ] = chunks_variant5[ i ]; + } + } + } + } + for ( i = 0; i < chunks_variant5.size; i++ ) + { + if ( isDefined( chunks_variant5[ i ].script_team ) && chunks_variant5[ i ].script_team == "bar_board_variant5" ) + { + if ( isDefined( variant5_order1[ i ] ) ) + { + if ( variant5_order1[ i ].state == "repaired" ) + { + return variant5_order1[ i ]; + } + if ( variant5_order6[ i ].state == "repaired" ) + { + return variant5_order6[ i ]; + } + if ( variant5_order3[ i ].state == "repaired" ) + { + return variant5_order3[ i ]; + } + if ( variant5_order2[ i ].state == "repaired" ) + { + return variant5_order2[ i ]; + } + if ( variant5_order5[ i ].state == "repaired" ) + { + return variant5_order5[ i ]; + } + if ( variant5_order4[ i ].state == "repaired" ) + { + return variant5_order4[ i ]; + } + } + } + } + } } -show_grate_pull() +show_grate_pull() //checked changed to match cerberus output { - wait 0.53; - self show(); - self vibrate( vectorscale( ( 0, 1, 0 ), 270.0 ), 0.2, 0.4, 0.4 ); + wait 0.53; + self show(); + self vibrate( vectorScale( ( 0, 1, 0 ), 270 ), 0.2, 0.4, 0.4 ); } -get_closest_2d( origin, ents ) +get_closest_2d( origin, ents ) //checked changed to match cerberus output { - if ( !isdefined( ents ) ) - return undefined; - - dist = distance2d( origin, ents[0].origin ); - index = 0; - temp_array = []; - - for ( i = 1; i < ents.size; i++ ) - { - if ( isdefined( ents[i].unbroken ) && ents[i].unbroken == 1 ) - { - ents[i].index = i; - temp_array[temp_array.size] = ents[i]; - } - } - - if ( temp_array.size > 0 ) - { - index = temp_array[randomintrange( 0, temp_array.size )].index; - return ents[index]; - } - else - { - for ( i = 1; i < ents.size; i++ ) - { - temp_dist = distance2d( origin, ents[i].origin ); - - if ( temp_dist < dist ) - { - dist = temp_dist; - index = i; - } - } - - return ents[index]; - } + if ( !isDefined( ents ) ) + { + return undefined; + } + dist = distance2d( origin, ents[ 0 ].origin ); + index = 0; + temp_array = []; + for ( i = 1; i < ents.size; i++ ) + { + if ( isDefined( ents[ i ].unbroken ) && ents[ i ].unbroken == 1 ) + { + ents[ i ].index = i; + temp_array[ temp_array.size ] = ents[ i ]; + } + } + if ( temp_array.size > 0 ) + { + index = temp_array[ randomintrange( 0, temp_array.size ) ].index; + return ents[ index ]; + } + else + { + for ( i = 1; i < ents.size; i++ ) + { + temp_dist = distance2d( origin, ents[ i ].origin ); + if ( temp_dist < dist ) + { + dist = temp_dist; + index = i; + } + } + return ents[ index ]; + } } -disable_trigger() +disable_trigger() //checked matches cerberus output { - if ( !isdefined( self.disabled ) || !self.disabled ) - { - self.disabled = 1; - self.origin -= vectorscale( ( 0, 0, 1 ), 10000.0 ); - } + if ( !is_true( self.disabled ) ) + { + self.disabled = 1; + self.origin -= vectorScale( ( 0, 0, 1 ), 10000 ); + } } -enable_trigger() +enable_trigger() //checked matches cerberus output { - if ( !isdefined( self.disabled ) || !self.disabled ) - return; - - self.disabled = 0; - self.origin += vectorscale( ( 0, 0, 1 ), 10000.0 ); + if ( !is_true( self.disabled ) ) + { + return; + } + self.disabled = 0; + self.origin += vectorScale( ( 0, 0, 1 ), 10000 ); } -in_playable_area() +in_playable_area() //checked changed to match cerberus output { - playable_area = getentarray( "player_volume", "script_noteworthy" ); - - if ( !isdefined( playable_area ) ) - { + playable_area = getentarray( "player_volume", "script_noteworthy" ); + if ( !isDefined( playable_area ) ) + { + /* /# - println( "No playable area playable_area found! Assume EVERYWHERE is PLAYABLE" ); + println( "No playable area playable_area found! Assume EVERYWHERE is PLAYABLE" ); #/ - return true; - } - - for ( i = 0; i < playable_area.size; i++ ) - { - if ( self istouching( playable_area[i] ) ) - return true; - } - - return false; + */ + return 1; + } + for ( i = 0; i < playable_area.size; i++ ) + { + if ( self istouching( playable_area[ i ] ) ) + { + return 1; + } + } + return 0; } -get_closest_non_destroyed_chunk( origin, barrier, barrier_chunks ) +get_closest_non_destroyed_chunk( origin, barrier, barrier_chunks ) //checked changed to match cerberus output { - chunks = undefined; - chunks_grate = undefined; - chunks_grate = get_non_destroyed_chunks_grate( barrier, barrier_chunks ); - chunks = get_non_destroyed_chunks( barrier, barrier_chunks ); - - if ( isdefined( barrier.zbarrier ) ) - { - if ( isdefined( chunks ) ) - return array_randomize( chunks )[0]; - - if ( isdefined( chunks_grate ) ) - return array_randomize( chunks_grate )[0]; - } - else if ( isdefined( chunks ) ) - return non_destroyed_bar_board_order( origin, chunks ); - else if ( isdefined( chunks_grate ) ) - return non_destroyed_grate_order( origin, chunks_grate ); - - return undefined; + chunks = undefined; + chunks_grate = undefined; + chunks_grate = get_non_destroyed_chunks_grate( barrier, barrier_chunks ); + chunks = get_non_destroyed_chunks( barrier, barrier_chunks ); + if ( isDefined( barrier.zbarrier ) ) + { + if ( isDefined( chunks ) ) + { + return array_randomize( chunks )[ 0 ]; + } + if ( isDefined( chunks_grate ) ) + { + return array_randomize( chunks_grate )[ 0 ]; + } + } + else if ( isDefined( chunks ) ) + { + return non_destroyed_bar_board_order( origin, chunks ); + } + else if ( isDefined( chunks_grate ) ) + { + return non_destroyed_grate_order( origin, chunks_grate ); + } + return undefined; } -get_random_destroyed_chunk( barrier, barrier_chunks ) +get_random_destroyed_chunk( barrier, barrier_chunks ) //checked changed to match cerberus output { - if ( isdefined( barrier.zbarrier ) ) - { - ret = undefined; - pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); - - if ( pieces.size ) - ret = array_randomize( pieces )[0]; - - return ret; - } - else - { - chunk = undefined; - chunks_repair_grate = undefined; - chunks = get_destroyed_chunks( barrier_chunks ); - chunks_repair_grate = get_destroyed_repair_grates( barrier_chunks ); - - if ( isdefined( chunks ) ) - return chunks[randomint( chunks.size )]; - else if ( isdefined( chunks_repair_grate ) ) - return grate_order_destroyed( chunks_repair_grate ); - - return undefined; - } + if ( isDefined( barrier.zbarrier ) ) + { + ret = undefined; + pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); + if ( pieces.size ) + { + ret = array_randomize( pieces )[ 0 ]; + } + return ret; + } + else + { + chunk = undefined; + chunks_repair_grate = undefined; + chunks = get_destroyed_chunks( barrier_chunks ); + chunks_repair_grate = get_destroyed_repair_grates( barrier_chunks ); + if ( isDefined( chunks ) ) + { + return chunks[ randomint( chunks.size ) ]; + } + else if ( isDefined( chunks_repair_grate ) ) + { + return grate_order_destroyed( chunks_repair_grate ); + } + return undefined; + } } -get_destroyed_repair_grates( barrier_chunks ) +get_destroyed_repair_grates( barrier_chunks ) //checked changed to match cerberus output { - array = []; - - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( isdefined( barrier_chunks[i] ) ) - { - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "grate" ) - array[array.size] = barrier_chunks[i]; - } - } - - if ( array.size == 0 ) - return undefined; - - return array; + array = []; + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( isDefined( barrier_chunks[ i ] ) ) + { + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "grate" ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + if ( array.size == 0 ) + { + return undefined; + } + return array; } -get_non_destroyed_chunks( barrier, barrier_chunks ) +get_non_destroyed_chunks( barrier, barrier_chunks ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - if ( isdefined( barrier.zbarrier ) ) - return barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); - else - { - array = []; - - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( isdefined( barrier_chunks[i].script_team ) && barrier_chunks[i].script_team == "classic_boards" ) - { - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "board" ) - { - if ( barrier_chunks[i] get_chunk_state() == "repaired" ) - { - if ( barrier_chunks[i].origin == barrier_chunks[i].og_origin ) - array[array.size] = barrier_chunks[i]; - } - } - } - - if ( isdefined( barrier_chunks[i].script_team ) && barrier_chunks[i].script_team == "new_barricade" ) - { - if ( isdefined( barrier_chunks[i].script_parameters ) && ( barrier_chunks[i].script_parameters == "repair_board" || barrier_chunks[i].script_parameters == "barricade_vents" ) ) - { - if ( barrier_chunks[i] get_chunk_state() == "repaired" ) - { - if ( barrier_chunks[i].origin == barrier_chunks[i].og_origin ) - array[array.size] = barrier_chunks[i]; - } - } - - continue; - } - - if ( isdefined( barrier_chunks[i].script_team ) && barrier_chunks[i].script_team == "6_bars_bent" ) - { - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "bar" ) - { - if ( barrier_chunks[i] get_chunk_state() == "repaired" ) - { - if ( barrier_chunks[i].origin == barrier_chunks[i].og_origin ) - array[array.size] = barrier_chunks[i]; - } - } - - continue; - } - - if ( isdefined( barrier_chunks[i].script_team ) && barrier_chunks[i].script_team == "6_bars_prestine" ) - { - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "bar" ) - { - if ( barrier_chunks[i] get_chunk_state() == "repaired" ) - { - if ( barrier_chunks[i].origin == barrier_chunks[i].og_origin ) - array[array.size] = barrier_chunks[i]; - } - } - } - } - - if ( array.size == 0 ) - return undefined; - - return array; - } + if ( isDefined( barrier.zbarrier ) ) + { + return barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); + } + else + { + array = []; + i = 0; + while ( i < barrier_chunks.size ) + { + if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "classic_boards" ) + { + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "board" ) + { + if ( barrier_chunks[ i ] get_chunk_state() == "repaired" ) + { + if ( barrier_chunks[ i ].origin == barrier_chunks[ i ].og_origin ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + } + if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "new_barricade" ) + { + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "repair_board" || barrier_chunks[ i ].script_parameters == "barricade_vents" ) + { + if ( barrier_chunks[ i ] get_chunk_state() == "repaired" ) + { + if ( barrier_chunks[ i ].origin == barrier_chunks[ i ].og_origin ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + i++; + continue; + } + if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "6_bars_bent" ) + { + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "bar" ) + { + if ( barrier_chunks[ i ] get_chunk_state() == "repaired" ) + { + if ( barrier_chunks[ i ].origin == barrier_chunks[ i ].og_origin ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + i++; + continue; + } + if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "6_bars_prestine" ) + { + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "bar" ) + { + if ( barrier_chunks[ i ] get_chunk_state() == "repaired" ) + { + if ( barrier_chunks[ i ].origin == barrier_chunks[ i ].og_origin ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + } + i++; + } + if ( array.size == 0 ) + { + return undefined; + } + return array; + } } -get_non_destroyed_chunks_grate( barrier, barrier_chunks ) +get_non_destroyed_chunks_grate( barrier, barrier_chunks ) //checked changed to match cerberus output { - if ( isdefined( barrier.zbarrier ) ) - return barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); - else - { - array = []; - - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "grate" ) - { - if ( isdefined( barrier_chunks[i] ) ) - array[array.size] = barrier_chunks[i]; - } - } - - if ( array.size == 0 ) - return undefined; - - return array; - } + if ( isDefined( barrier.zbarrier ) ) + { + return barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); + } + else + { + array = []; + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "grate" ) + { + if ( isDefined( barrier_chunks[ i ] ) ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + if ( array.size == 0 ) + { + return undefined; + } + return array; + } } -get_non_destroyed_variant1( barrier_chunks ) +get_non_destroyed_variant1( barrier_chunks ) //checked changed to match cerberus output { - array = []; - - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( isdefined( barrier_chunks[i].script_team ) && barrier_chunks[i].script_team == "bar_board_variant1" ) - { - if ( isdefined( barrier_chunks[i] ) ) - array[array.size] = barrier_chunks[i]; - } - } - - if ( array.size == 0 ) - return undefined; - - return array; + array = []; + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "bar_board_variant1" ) + { + if ( isDefined( barrier_chunks[ i ] ) ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + if ( array.size == 0 ) + { + return undefined; + } + return array; } -get_non_destroyed_variant2( barrier_chunks ) +get_non_destroyed_variant2( barrier_chunks ) //checked changed to match cerberus output { - array = []; - - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( isdefined( barrier_chunks[i].script_team ) && barrier_chunks[i].script_team == "bar_board_variant2" ) - { - if ( isdefined( barrier_chunks[i] ) ) - array[array.size] = barrier_chunks[i]; - } - } - - if ( array.size == 0 ) - return undefined; - - return array; + array = []; + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "bar_board_variant2" ) + { + if ( isDefined( barrier_chunks[ i ] ) ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + if ( array.size == 0 ) + { + return undefined; + } + return array; } -get_non_destroyed_variant4( barrier_chunks ) +get_non_destroyed_variant4( barrier_chunks ) //checked changed to match cerberus output { - array = []; - - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( isdefined( barrier_chunks[i].script_team ) && barrier_chunks[i].script_team == "bar_board_variant4" ) - { - if ( isdefined( barrier_chunks[i] ) ) - array[array.size] = barrier_chunks[i]; - } - } - - if ( array.size == 0 ) - return undefined; - - return array; + array = []; + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "bar_board_variant4" ) + { + if ( isDefined( barrier_chunks[ i ] ) ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + if ( array.size == 0 ) + { + return undefined; + } + return array; } -get_non_destroyed_variant5( barrier_chunks ) +get_non_destroyed_variant5( barrier_chunks ) //checked changed to match cerberus output { - array = []; - - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( isdefined( barrier_chunks[i].script_team ) && barrier_chunks[i].script_team == "bar_board_variant5" ) - { - if ( isdefined( barrier_chunks[i] ) ) - array[array.size] = barrier_chunks[i]; - } - } - - if ( array.size == 0 ) - return undefined; - - return array; + array = []; + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "bar_board_variant5" ) + { + if ( isDefined( barrier_chunks[ i ] ) ) + { + array[ array.size ] = barrier_chunks[ i ]; + } + } + } + if ( array.size == 0 ) + { + return undefined; + } + return array; } -get_destroyed_chunks( barrier_chunks ) +get_destroyed_chunks( barrier_chunks ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - array = []; - - for ( i = 0; i < barrier_chunks.size; i++ ) - { - if ( barrier_chunks[i] get_chunk_state() == "destroyed" ) - { - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "board" ) - { - array[array.size] = barrier_chunks[i]; - continue; - } - - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "repair_board" || barrier_chunks[i].script_parameters == "barricade_vents" ) - { - array[array.size] = barrier_chunks[i]; - continue; - } - - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "bar" ) - { - array[array.size] = barrier_chunks[i]; - continue; - } - - if ( isdefined( barrier_chunks[i].script_parameters ) && barrier_chunks[i].script_parameters == "grate" ) - return undefined; - } - } - - if ( array.size == 0 ) - return undefined; - - return array; + array = []; + i = 0; + while ( i < barrier_chunks.size ) + { + if ( barrier_chunks[ i ] get_chunk_state() == "destroyed" ) + { + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "board" ) + { + array[ array.size ] = barrier_chunks[ i ]; + i++; + continue; + } + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "repair_board" || barrier_chunks[ i ].script_parameters == "barricade_vents" ) + { + array[ array.size ] = barrier_chunks[ i ]; + i++; + continue; + } + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "bar" ) + { + array[ array.size ] = barrier_chunks[ i ]; + i++; + continue; + } + if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "grate" ) + { + return undefined; + } + } + i++; + } + if ( array.size == 0 ) + { + return undefined; + } + return array; } -grate_order_destroyed( chunks_repair_grate ) +grate_order_destroyed( chunks_repair_grate ) //checked changed to match cerberus output { - grate_repair_order = []; - grate_repair_order1 = []; - grate_repair_order2 = []; - grate_repair_order3 = []; - grate_repair_order4 = []; - grate_repair_order5 = []; - grate_repair_order6 = []; - - for ( i = 0; i < chunks_repair_grate.size; i++ ) - { - if ( isdefined( chunks_repair_grate[i].script_parameters ) && chunks_repair_grate[i].script_parameters == "grate" ) - { - if ( isdefined( chunks_repair_grate[i].script_noteworthy ) && chunks_repair_grate[i].script_noteworthy == "1" ) - grate_repair_order1[grate_repair_order1.size] = chunks_repair_grate[i]; - - if ( isdefined( chunks_repair_grate[i].script_noteworthy ) && chunks_repair_grate[i].script_noteworthy == "2" ) - grate_repair_order2[grate_repair_order2.size] = chunks_repair_grate[i]; - - if ( isdefined( chunks_repair_grate[i].script_noteworthy ) && chunks_repair_grate[i].script_noteworthy == "3" ) - grate_repair_order3[grate_repair_order3.size] = chunks_repair_grate[i]; - - if ( isdefined( chunks_repair_grate[i].script_noteworthy ) && chunks_repair_grate[i].script_noteworthy == "4" ) - grate_repair_order4[grate_repair_order4.size] = chunks_repair_grate[i]; - - if ( isdefined( chunks_repair_grate[i].script_noteworthy ) && chunks_repair_grate[i].script_noteworthy == "5" ) - grate_repair_order5[grate_repair_order5.size] = chunks_repair_grate[i]; - - if ( isdefined( chunks_repair_grate[i].script_noteworthy ) && chunks_repair_grate[i].script_noteworthy == "6" ) - grate_repair_order6[grate_repair_order6.size] = chunks_repair_grate[i]; - } - } - - for ( i = 0; i < chunks_repair_grate.size; i++ ) - { - if ( isdefined( chunks_repair_grate[i].script_parameters ) && chunks_repair_grate[i].script_parameters == "grate" ) - { - if ( isdefined( grate_repair_order1[i] ) ) - { - if ( grate_repair_order6[i].state == "destroyed" ) - { + grate_repair_order = []; + grate_repair_order1 = []; + grate_repair_order2 = []; + grate_repair_order3 = []; + grate_repair_order4 = []; + grate_repair_order5 = []; + grate_repair_order6 = []; + for ( i = 0; i < chunks_repair_grate.size; i++ ) + { + if ( isDefined( chunks_repair_grate[ i ].script_parameters ) && chunks_repair_grate[ i ].script_parameters == "grate" ) + { + if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "1" ) + { + grate_repair_order1[ grate_repair_order1.size ] = chunks_repair_grate[ i ]; + } + if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "2" ) + { + grate_repair_order2[ grate_repair_order2.size ] = chunks_repair_grate[ i ]; + } + if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "3" ) + { + grate_repair_order3[ grate_repair_order3.size ] = chunks_repair_grate[ i ]; + } + if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "4" ) + { + grate_repair_order4[ grate_repair_order4.size ] = chunks_repair_grate[ i ]; + } + if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "5" ) + { + grate_repair_order5[ grate_repair_order5.size ] = chunks_repair_grate[ i ]; + } + if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "6" ) + { + grate_repair_order6[ grate_repair_order6.size ] = chunks_repair_grate[ i ]; + } + } + } + for ( i = 0; i < chunks_repair_grate.size; i++ ) + { + if ( isDefined( chunks_repair_grate[ i ].script_parameters ) && chunks_repair_grate[ i ].script_parameters == "grate" ) + { + if ( isDefined( grate_repair_order1[ i ] ) ) + { + if ( grate_repair_order6[ i ].state == "destroyed" ) + { + /* /# - iprintlnbold( " Fix grate6 " ); + iprintlnbold( " Fix grate6 " ); #/ - return grate_repair_order6[i]; - } - - if ( grate_repair_order5[i].state == "destroyed" ) - { + */ + return grate_repair_order6[ i ]; + } + if ( grate_repair_order5[ i ].state == "destroyed" ) + { + /* /# - iprintlnbold( " Fix grate5 " ); + iprintlnbold( " Fix grate5 " ); #/ - grate_repair_order6[i] thread show_grate_repair(); - return grate_repair_order5[i]; - continue; - } - - if ( grate_repair_order4[i].state == "destroyed" ) - { + */ + grate_repair_order6[ i ] thread show_grate_repair(); + return grate_repair_order5[ i ]; + } + if ( grate_repair_order4[ i ].state == "destroyed" ) + { + /* /# - iprintlnbold( " Fix grate4 " ); + iprintlnbold( " Fix grate4 " ); #/ - grate_repair_order5[i] thread show_grate_repair(); - return grate_repair_order4[i]; - continue; - } - - if ( grate_repair_order3[i].state == "destroyed" ) - { + */ + grate_repair_order5[ i ] thread show_grate_repair(); + return grate_repair_order4[ i ]; + } + if ( grate_repair_order3[ i ].state == "destroyed" ) + { + /* /# - iprintlnbold( " Fix grate3 " ); + iprintlnbold( " Fix grate3 " ); #/ - grate_repair_order4[i] thread show_grate_repair(); - return grate_repair_order3[i]; - continue; - } - - if ( grate_repair_order2[i].state == "destroyed" ) - { + */ + grate_repair_order4[ i ] thread show_grate_repair(); + return grate_repair_order3[ i ]; + } + if ( grate_repair_order2[ i ].state == "destroyed" ) + { + /* /# - iprintlnbold( " Fix grate2 " ); + iprintlnbold( " Fix grate2 " ); #/ - grate_repair_order3[i] thread show_grate_repair(); - return grate_repair_order2[i]; - continue; - } - - if ( grate_repair_order1[i].state == "destroyed" ) - { + */ + grate_repair_order3[ i ] thread show_grate_repair(); + return grate_repair_order2[ i ]; + } + if ( grate_repair_order1[ i ].state == "destroyed" ) + { + /* /# - iprintlnbold( " Fix grate1 " ); + iprintlnbold( " Fix grate1 " ); #/ - grate_repair_order2[i] thread show_grate_repair(); - return grate_repair_order1[i]; - } - } - } - } + */ + grate_repair_order2[ i ] thread show_grate_repair(); + return grate_repair_order1[ i ]; + } + } + } + } } -show_grate_repair() +show_grate_repair() //checked matches cerberus output { - wait 0.34; - self hide(); + wait 0.34; + self hide(); } -get_chunk_state() +get_chunk_state() //checked matches cerberus output { + /* /# - assert( isdefined( self.state ) ); + assert( isDefined( self.state ) ); #/ - return self.state; + */ + return self.state; } -is_float( num ) +is_float( num ) //checked matches cerberus output { - val = num - int( num ); - - if ( val != 0 ) - return true; - else - return false; + val = num - int( num ); + if ( val != 0 ) + { + return 1; + } + else + { + return 0; + } } -array_limiter( array, total ) +array_limiter( array, total ) //checked changed to match cerberus output { - new_array = []; - - for ( i = 0; i < array.size; i++ ) - { - if ( i < total ) - new_array[new_array.size] = array[i]; - } - - return new_array; + new_array = []; + for ( i = 0; i < array.size; i++ ) + { + if ( i < total ) + { + new_array[ new_array.size ] = array[ i ]; + } + } + return new_array; } -array_validate( array ) +array_validate( array ) //checked matches cerberus output { - if ( isdefined( array ) && array.size > 0 ) - return true; - else - return false; + if ( isDefined( array ) && array.size > 0 ) + { + return 1; + } + else + { + return 0; + } } -add_spawner( spawner ) +add_spawner( spawner ) //checked matches cerberus output { - if ( isdefined( spawner.script_start ) && level.round_number < spawner.script_start ) - return; - - if ( isdefined( spawner.is_enabled ) && !spawner.is_enabled ) - return; - - if ( isdefined( spawner.has_been_added ) && spawner.has_been_added ) - return; - - spawner.has_been_added = 1; - level.zombie_spawn_locations[level.zombie_spawn_locations.size] = spawner; + if ( isDefined( spawner.script_start ) && level.round_number < spawner.script_start ) + { + return; + } + if ( !is_true( spawner.is_enabled ) ) + { + return; + } + if ( is_true( spawner.has_been_added ) ) + { + return; + } + spawner.has_been_added = 1; + level.zombie_spawn_locations[ level.zombie_spawn_locations.size ] = spawner; } -fake_physicslaunch( target_pos, power ) +fake_physicslaunch( target_pos, power ) //checked matches cerberus output { - start_pos = self.origin; - gravity = getdvarint( "bg_gravity" ) * -1; - dist = distance( start_pos, target_pos ); - time = dist / power; - delta = target_pos - start_pos; - drop = 0.5 * gravity * ( time * time ); - velocity = ( delta[0] / time, delta[1] / time, ( delta[2] - drop ) / time ); - level thread draw_line_ent_to_pos( self, target_pos ); - self movegravity( velocity, time ); - return time; + start_pos = self.origin; + gravity = getDvarInt( "bg_gravity" ) * -1; + dist = distance( start_pos, target_pos ); + time = dist / power; + delta = target_pos - start_pos; + drop = ( 0.5 * gravity ) * ( time * time ); + velocity = ( delta[ 0 ] / time, delta[ 1 ] / time, ( delta[ 2 ] - drop ) / time ); + level thread draw_line_ent_to_pos( self, target_pos ); + self movegravity( velocity, time ); + return time; } -add_zombie_hint( ref, text ) +add_zombie_hint( ref, text ) //checked matches cerberus output { - if ( !isdefined( level.zombie_hints ) ) - level.zombie_hints = []; - - precachestring( text ); - level.zombie_hints[ref] = text; + if ( !isDefined( level.zombie_hints ) ) + { + level.zombie_hints = []; + } + precachestring( text ); + level.zombie_hints[ ref ] = text; } -get_zombie_hint( ref ) +get_zombie_hint( ref ) //checked matches cerberus output { - if ( isdefined( level.zombie_hints[ref] ) ) - return level.zombie_hints[ref]; + if ( isDefined( level.zombie_hints[ ref ] ) ) + { + return level.zombie_hints[ ref ]; + } + /* /# - println( "UNABLE TO FIND HINT STRING " + ref ); + println( "UNABLE TO FIND HINT STRING " + ref ); #/ - return level.zombie_hints["undefined"]; + */ + return level.zombie_hints[ "undefined" ]; } -set_hint_string( ent, default_ref, cost ) +set_hint_string( ent, default_ref, cost ) //checked matches cerberus output { - ref = default_ref; - - if ( isdefined( ent.script_hint ) ) - ref = ent.script_hint; - - if ( isdefined( level.legacy_hint_system ) && level.legacy_hint_system ) - { - ref = ref + "_" + cost; - self sethintstring( get_zombie_hint( ref ) ); - } - else - { - hint = get_zombie_hint( ref ); - - if ( isdefined( cost ) ) - self sethintstring( hint, cost ); - else - self sethintstring( hint ); - } + ref = default_ref; + if ( isDefined( ent.script_hint ) ) + { + ref = ent.script_hint; + } + if ( is_true( level.legacy_hint_system ) ) + { + ref = ref + "_" + cost; + self sethintstring( get_zombie_hint( ref ) ); + } + else + { + hint = get_zombie_hint( ref ); + if ( isDefined( cost ) ) + { + self sethintstring( hint, cost ); + return; + } + else + { + self sethintstring( hint ); + } + } } -get_hint_string( ent, default_ref, cost ) +get_hint_string( ent, default_ref, cost ) //checked matches cerberus output { - ref = default_ref; - - if ( isdefined( ent.script_hint ) ) - ref = ent.script_hint; - - if ( isdefined( level.legacy_hint_system ) && level.legacy_hint_system && isdefined( cost ) ) - ref = ref + "_" + cost; - - return get_zombie_hint( ref ); + ref = default_ref; + if ( isDefined( ent.script_hint ) ) + { + ref = ent.script_hint; + } + if ( is_true( level.legacy_hint_system ) && isDefined( cost ) ) + { + ref = ref + "_" + cost; + } + return get_zombie_hint( ref ); } -unitrigger_set_hint_string( ent, default_ref, cost ) +unitrigger_set_hint_string( ent, default_ref, cost ) //checked partially changed to match cerberus output //did not change while loop to foreach to prevent infinite loop related to continues { - triggers = []; - - if ( self.trigger_per_player ) - triggers = self.playertrigger; - else - triggers[0] = self.trigger; - - foreach ( trigger in triggers ) - { - ref = default_ref; - - if ( isdefined( ent.script_hint ) ) - ref = ent.script_hint; - - if ( isdefined( level.legacy_hint_system ) && level.legacy_hint_system ) - { - ref = ref + "_" + cost; - trigger sethintstring( get_zombie_hint( ref ) ); - continue; - } - - hint = get_zombie_hint( ref ); - - if ( isdefined( cost ) ) - { - trigger sethintstring( hint, cost ); - continue; - } - - trigger sethintstring( hint ); - } + triggers = []; + if ( self.trigger_per_player ) + { + triggers = self.playertrigger; + } + else + { + triggers[ 0 ] = self.trigger; + } + i = 0; + while ( i < triggers.size ) + { + ref = default_ref; + if ( isDefined( ent.script_hint ) ) + { + ref = ent.script_hint; + } + if ( is_true( level.legacy_hint_system ) ) + { + ref = ref + "_" + cost; + triggers[ i ] sethintstring( get_zombie_hint( ref ) ); + i++; + continue; + } + hint = get_zombie_hint( ref ); + if ( isDefined( cost ) ) + { + triggers[ i ] sethintstring( hint, cost ); + i++; + continue; + } + triggers[ i ] sethintstring( hint ); + i++; + } } -add_sound( ref, alias ) +add_sound( ref, alias ) //checked matches cerberus output { - if ( !isdefined( level.zombie_sounds ) ) - level.zombie_sounds = []; - - level.zombie_sounds[ref] = alias; + if ( !isDefined( level.zombie_sounds ) ) + { + level.zombie_sounds = []; + } + level.zombie_sounds[ ref ] = alias; } -play_sound_at_pos( ref, pos, ent ) +play_sound_at_pos( ref, pos, ent ) //checked matches cerberus output { - if ( isdefined( ent ) ) - { - if ( isdefined( ent.script_soundalias ) ) - { - playsoundatposition( ent.script_soundalias, pos ); - return; - } - - if ( isdefined( self.script_sound ) ) - ref = self.script_sound; - } - - if ( ref == "none" ) - return; - - if ( !isdefined( level.zombie_sounds[ref] ) ) - { + if ( isDefined( ent ) ) + { + if ( isDefined( ent.script_soundalias ) ) + { + playsoundatposition( ent.script_soundalias, pos ); + return; + } + if ( isDefined( self.script_sound ) ) + { + ref = self.script_sound; + } + } + if ( ref == "none" ) + { + return; + } + if ( !isDefined( level.zombie_sounds[ ref ] ) ) + { + /* /# - assertmsg( "Sound \"" + ref + "\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); + assertmsg( "Sound "" + ref + "" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); #/ - return; - } - - playsoundatposition( level.zombie_sounds[ref], pos ); + */ + return; + } + playsoundatposition( level.zombie_sounds[ ref ], pos ); } -play_sound_on_ent( ref ) +play_sound_on_ent( ref ) //checked matches cerberus output { - if ( isdefined( self.script_soundalias ) ) - { - self playsound( self.script_soundalias ); - return; - } - - if ( isdefined( self.script_sound ) ) - ref = self.script_sound; - - if ( ref == "none" ) - return; - - if ( !isdefined( level.zombie_sounds[ref] ) ) - { + if ( isDefined( self.script_soundalias ) ) + { + self playsound( self.script_soundalias ); + return; + } + if ( isDefined( self.script_sound ) ) + { + ref = self.script_sound; + } + if ( ref == "none" ) + { + return; + } + if ( !isDefined( level.zombie_sounds[ ref ] ) ) + { + /* /# - assertmsg( "Sound \"" + ref + "\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); + assertmsg( "Sound "" + ref + "" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); #/ - return; - } - - self playsound( level.zombie_sounds[ref] ); + */ + return; + } + self playsound( level.zombie_sounds[ ref ] ); } -play_loopsound_on_ent( ref ) +play_loopsound_on_ent( ref ) //checked matches cerberus output { - if ( isdefined( self.script_firefxsound ) ) - ref = self.script_firefxsound; - - if ( ref == "none" ) - return; - - if ( !isdefined( level.zombie_sounds[ref] ) ) - { + if ( isDefined( self.script_firefxsound ) ) + { + ref = self.script_firefxsound; + } + if ( ref == "none" ) + { + return; + } + if ( !isDefined( level.zombie_sounds[ ref ] ) ) + { + /* /# - assertmsg( "Sound \"" + ref + "\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); + assertmsg( "Sound "" + ref + "" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); #/ - return; - } - - self playsound( level.zombie_sounds[ref] ); + */ + return; + } + self playsound( level.zombie_sounds[ ref ] ); } -string_to_float( string ) +string_to_float( string ) //checked changed to match cerberus output { - floatparts = strtok( string, "." ); - - if ( floatparts.size == 1 ) - return int( floatparts[0] ); - - whole = int( floatparts[0] ); - decimal = 0; - - for ( i = floatparts[1].size - 1; i >= 0; i-- ) - decimal = decimal / 10 + int( floatparts[1][i] ) / 10; - - if ( whole >= 0 ) - return whole + decimal; - else - return whole - decimal; + floatparts = strtok( string, "." ); + if ( floatparts.size == 1 ) + { + return int( floatparts[ 0 ] ); + } + whole = int( floatparts[ 0 ] ); + decimal = 0; + for ( i = floatparts[1].size - 1; i >= 0; i-- ) + { + decimal = ( decimal / 10 ) + ( int( floatparts[ 1 ][ i ] ) / 10 ); + } + if ( whole >= 0 ) + { + return whole + decimal; + } + else + { + return whole - decimal; + } } -onplayerconnect_callback( func ) +onplayerconnect_callback( func ) //checked matches cerberus output { - addcallback( "on_player_connect", func ); + addcallback( "on_player_connect", func ); } -onplayerdisconnect_callback( func ) +onplayerdisconnect_callback( func ) //checked matches cerberus output { - addcallback( "on_player_disconnect", func ); + addcallback( "on_player_disconnect", func ); } -set_zombie_var( var, value, is_float, column, is_team_based ) +set_zombie_var( var, value, is_float, column, is_team_based ) //checked changed to match cerberus output { - if ( !isdefined( is_float ) ) - is_float = 0; - - if ( !isdefined( column ) ) - column = 1; - - table = "mp/zombiemode.csv"; - table_value = tablelookup( table, 0, var, column ); - - if ( isdefined( table_value ) && table_value != "" ) - { - if ( is_float ) - value = float( table_value ); - else - value = int( table_value ); - } - - if ( isdefined( is_team_based ) && is_team_based ) - { - foreach ( team in level.teams ) - level.zombie_vars[team][var] = value; - } - else - level.zombie_vars[var] = value; - - return value; + if ( !isDefined( is_float ) ) + { + is_float = 0; + } + if ( !isDefined( column ) ) + { + column = 1; + } + table = "mp/zombiemode.csv"; + table_value = tablelookup( table, 0, var, column ); + if ( isDefined( table_value ) && table_value != "" ) + { + if ( is_float ) + { + value = float( table_value ); + } + else + { + value = int( table_value ); + } + } + if ( is_true( is_team_based ) ) + { + foreach ( team in level.teams ) + { + level.zombie_vars[ team ][ var ] = value; + } + } + else + { + level.zombie_vars[ var ] = value; + } + return value; } -get_table_var( table, var_name, value, is_float, column ) +get_table_var( table, var_name, value, is_float, column ) //checked matches cerberus output { - if ( !isdefined( table ) ) - table = "mp/zombiemode.csv"; - - if ( !isdefined( is_float ) ) - is_float = 0; - - if ( !isdefined( column ) ) - column = 1; - - table_value = tablelookup( table, 0, var_name, column ); - - if ( isdefined( table_value ) && table_value != "" ) - { - if ( is_float ) - value = string_to_float( table_value ); - else - value = int( table_value ); - } - - return value; + if ( !isDefined( table ) ) + { + table = "mp/zombiemode.csv"; + } + if ( !isDefined( is_float ) ) + { + is_float = 0; + } + if ( !isDefined( column ) ) + { + column = 1; + } + table_value = tablelookup( table, 0, var_name, column ); + if ( isDefined( table_value ) && table_value != "" ) + { + if ( is_float ) + { + value = string_to_float( table_value ); + } + else + { + value = int( table_value ); + } + } + return value; } -hudelem_count() +hudelem_count() //checked matches cerberus output { + /* /# - max = 0; - curr_total = 0; - - while ( true ) - { - if ( level.hudelem_count > max ) - max = level.hudelem_count; - - println( "HudElems: " + level.hudelem_count + "[Peak: " + max + "]" ); - wait 0.05; - } + max = 0; + curr_total = 0; + while ( 1 ) + { + if ( level.hudelem_count > max ) + { + max = level.hudelem_count; + } + println( "HudElems: " + level.hudelem_count + "[Peak: " + max + "]" ); + wait 0.05; #/ + } + */ } -debug_round_advancer() +debug_round_advancer() //checked changed to match cerberus output { + /* /# - while ( true ) - { - zombs = get_round_enemy_array(); - - for ( i = 0; i < zombs.size; i++ ) - { - zombs[i] dodamage( zombs[i].health + 666, ( 0, 0, 0 ) ); - wait 0.5; - } - } + while ( 1 ) + { + zombs = get_round_enemy_array(); + i = 0; + while ( i < zombs.size ) + { + zombs[ i ] dodamage( zombs[ i ].health + 666, ( 0, 0, 0 ) ); + wait 0.5; + i++; + } #/ + } + */ } -print_run_speed( speed ) +print_run_speed( speed ) //checked changed to match cerberus output { + /* /# - self endon( "death" ); - - while ( true ) - { - print3d( self.origin + vectorscale( ( 0, 0, 1 ), 64.0 ), speed, ( 1, 1, 1 ) ); - wait 0.05; - } + self endon( "death" ); + while ( 1 ) + { + print3d( self.origin + vectorScale( ( 0, 0, 1 ), 64 ), speed, ( 1, 1, 1 ) ); + wait 0.05; #/ + } + */ } -draw_line_ent_to_ent( ent1, ent2 ) +draw_line_ent_to_ent( ent1, ent2 ) //checked matches cerberus output { + /* /# - if ( getdvarint( _hash_FA91EA91 ) != 1 ) - return; - - ent1 endon( "death" ); - ent2 endon( "death" ); - - while ( true ) - { - line( ent1.origin, ent2.origin ); - wait 0.05; - } + if ( getDvarInt( "zombie_debug" ) != 1 ) + { + return; + } + ent1 endon( "death" ); + ent2 endon( "death" ); + while ( 1 ) + { + line( ent1.origin, ent2.origin ); + wait 0.05; #/ + } + */ } -draw_line_ent_to_pos( ent, pos, end_on ) +draw_line_ent_to_pos( ent, pos, end_on ) //checked changed to match cerberus output { + /* /# - if ( getdvarint( _hash_FA91EA91 ) != 1 ) - return; - - ent endon( "death" ); - ent notify( "stop_draw_line_ent_to_pos" ); - ent endon( "stop_draw_line_ent_to_pos" ); - - if ( isdefined( end_on ) ) - ent endon( end_on ); - - while ( true ) - { - line( ent.origin, pos ); - wait 0.05; - } + if ( getDvarInt( "zombie_debug" ) != 1 ) + { + return; + } + ent endon( "death" ); + ent notify( "stop_draw_line_ent_to_pos" ); + ent endon( "stop_draw_line_ent_to_pos" ); + if ( isDefined( end_on ) ) + { + ent endon( end_on ); + } + while ( 1 ) + { + line( ent.origin, pos ); + wait 0.05; #/ + } + */ } -debug_print( msg ) +debug_print( msg ) //checked matches cerberus output { + /* /# - if ( getdvarint( _hash_FA91EA91 ) > 0 ) - println( "######### ZOMBIE: " + msg ); + if ( getDvarInt( "zombie_debug" ) > 0 ) + { + println( "######### ZOMBIE: " + msg ); #/ + } + */ } -debug_blocker( pos, rad, height ) +debug_blocker( pos, rad, height ) //checked matches cerberus output { + /* /# - self notify( "stop_debug_blocker" ); - self endon( "stop_debug_blocker" ); - - for (;;) - { - if ( getdvarint( _hash_FA91EA91 ) != 1 ) - return; - - wait 0.05; - drawcylinder( pos, rad, height ); - } + self notify( "stop_debug_blocker" ); + self endon( "stop_debug_blocker" ); + for ( ;; ) + { + if ( getDvarInt( "zombie_debug" ) != 1 ) + { + return; + } + wait 0.05; + drawcylinder( pos, rad, height ); #/ + } + */ } -drawcylinder( pos, rad, height ) +drawcylinder( pos, rad, height ) //checked changed to match cerberus output { + /* /# - currad = rad; - curheight = height; - - for ( r = 0; r < 20; r++ ) - { - theta = r / 20 * 360; - theta2 = ( r + 1 ) / 20 * 360; - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); - line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); - } + currad = rad; + curheight = height; + for ( r = 0; r < 20; r++ ) + { + theta = ( r / 20 ) * 360; + theta2 = ( ( r + 1 ) / 20 ) * 360; + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); + line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); #/ + } + */ } -print3d_at_pos( msg, pos, thread_endon, offset ) +print3d_at_pos( msg, pos, thread_endon, offset ) //checked changed to match cerberus output { + /* /# - self endon( "death" ); - - if ( isdefined( thread_endon ) ) - { - self notify( thread_endon ); - self endon( thread_endon ); - } - - if ( !isdefined( offset ) ) - offset = ( 0, 0, 0 ); - - while ( true ) - { - print3d( self.origin + offset, msg ); - wait 0.05; - } + self endon( "death" ); + if ( isDefined( thread_endon ) ) + { + self notify( thread_endon ); + self endon( thread_endon ); + } + if ( !isDefined( offset ) ) + { + offset = ( 0, 0, 0 ); + } + while ( 1 ) + { + print3d( self.origin + offset, msg ); + wait 0.05; #/ + } + */ } -debug_breadcrumbs() +debug_breadcrumbs() //checked changed to match cerberus output { + /* /# - self endon( "disconnect" ); - self notify( "stop_debug_breadcrumbs" ); - self endon( "stop_debug_breadcrumbs" ); - - while ( true ) - { - if ( getdvarint( _hash_FA91EA91 ) != 1 ) - { - wait 1; - continue; - } - - for ( i = 0; i < self.zombie_breadcrumbs.size; i++ ) - drawcylinder( self.zombie_breadcrumbs[i], 5, 5 ); - - wait 0.05; - } + self endon( "disconnect" ); + self notify( "stop_debug_breadcrumbs" ); + self endon( "stop_debug_breadcrumbs" ); + while ( 1 ) + { + while ( getDvarInt( "zombie_debug" ) != 1 ) + { + wait 1; + } + for ( i = 0; i < self.zombie_breadcrumbs.size; i++ ) + { + drawcylinder( self.zombie_breadcrumbs[ i ], 5, 5 ); + } + wait 0.05; #/ + } + */ } -debug_attack_spots_taken() +debug_attack_spots_taken() //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { + /* /# - self notify( "stop_debug_breadcrumbs" ); - self endon( "stop_debug_breadcrumbs" ); - - while ( true ) - { - if ( getdvarint( _hash_FA91EA91 ) != 2 ) - { - wait 1; - continue; - } - - wait 0.05; - count = 0; - - for ( i = 0; i < self.attack_spots_taken.size; i++ ) - { - if ( self.attack_spots_taken[i] ) - { - count++; - circle( self.attack_spots[i], 12, ( 1, 0, 0 ), 0, 1, 1 ); - continue; - } - - circle( self.attack_spots[i], 12, ( 0, 1, 0 ), 0, 1, 1 ); - } - - msg = "" + count + " / " + self.attack_spots_taken.size; - print3d( self.origin, msg ); - } + self notify( "stop_debug_breadcrumbs" ); + self endon( "stop_debug_breadcrumbs" ); + while ( 1 ) + { + if ( getDvarInt( "zombie_debug" ) != 2 ) + { + wait 1; + continue; + } + wait 0.05; + count = 0; + i = 0; + while ( i < self.attack_spots_taken.size ) + { + if ( self.attack_spots_taken[ i ] ) + { + count++; + circle( self.attack_spots[ i ], 12, ( 1, 0, 0 ), 0, 1, 1 ); + i++; + continue; + } + circle( self.attack_spots[ i ], 12, ( 0, 1, 0 ), 0, 1, 1 ); + i++; + } + msg = "" + count + " / " + self.attack_spots_taken.size; + print3d( self.origin, msg ); #/ + } + */ } -float_print3d( msg, time ) +float_print3d( msg, time ) //checked changed to match cerberus output { + /* /# - self endon( "death" ); - time = gettime() + time * 1000; - offset = vectorscale( ( 0, 0, 1 ), 72.0 ); - - while ( gettime() < time ) - { - offset += vectorscale( ( 0, 0, 1 ), 2.0 ); - print3d( self.origin + offset, msg, ( 1, 1, 1 ) ); - wait 0.05; - } + self endon( "death" ); + time = getTime() + ( time * 1000 ); + offset = vectorScale( ( 0, 0, 1 ), 72 ); + while ( getTime() < time ) + { + offset += vectorScale( ( 0, 0, 1 ), 2 ); + print3d( self.origin + offset, msg, ( 1, 1, 1 ) ); + wait 0.05; #/ + } + */ } -do_player_vo( snd, variation_count ) +do_player_vo( snd, variation_count ) //checked matches cerberus output { - index = maps\mp\zombies\_zm_weapons::get_player_index( self ); - sound = "zmb_vox_plr_" + index + "_" + snd; - - if ( isdefined( variation_count ) ) - sound = sound + "_" + randomintrange( 0, variation_count ); - - if ( !isdefined( level.player_is_speaking ) ) - level.player_is_speaking = 0; - - if ( level.player_is_speaking == 0 ) - { - level.player_is_speaking = 1; - self playsoundwithnotify( sound, "sound_done" ); - - self waittill( "sound_done" ); - - wait 2; - level.player_is_speaking = 0; - } + index = maps/mp/zombies/_zm_weapons::get_player_index( self ); + sound = "zmb_vox_plr_" + index + "_" + snd; + if ( isDefined( variation_count ) ) + { + sound = sound + "_" + randomintrange( 0, variation_count ); + } + if ( !isDefined( level.player_is_speaking ) ) + { + level.player_is_speaking = 0; + } + if ( level.player_is_speaking == 0 ) + { + level.player_is_speaking = 1; + self playsoundwithnotify( sound, "sound_done" ); + self waittill( "sound_done" ); + wait 2; + level.player_is_speaking = 0; + } } -stop_magic_bullet_shield() +stop_magic_bullet_shield() //checked matches cerberus output { - self.attackeraccuracy = 1; - self notify( "stop_magic_bullet_shield" ); - self.magic_bullet_shield = undefined; - self._mbs = undefined; + self.attackeraccuracy = 1; + self notify( "stop_magic_bullet_shield" ); + self.magic_bullet_shield = undefined; + self._mbs = undefined; } -magic_bullet_shield() +magic_bullet_shield() //checked matches cerberus output { - if ( !( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) ) - { - if ( isai( self ) || isplayer( self ) ) - { - self.magic_bullet_shield = 1; + if ( !is_true( self.magic_bullet_shield ) ) + { + if ( isai( self ) || isplayer( self ) ) + { + self.magic_bullet_shield = 1; + /* /# - level thread debug_magic_bullet_shield_death( self ); + level thread debug_magic_bullet_shield_death( self ); #/ - if ( !isdefined( self._mbs ) ) - self._mbs = spawnstruct(); - - if ( isai( self ) ) - { + */ + if ( !isDefined( self._mbs ) ) + { + self._mbs = spawnstruct(); + } + if ( isai( self ) ) + { + /* /# - assert( isalive( self ), "Tried to do magic_bullet_shield on a dead or undefined guy." ); + assert( isalive( self ), "Tried to do magic_bullet_shield on a dead or undefined guy." ); #/ - self._mbs.last_pain_time = 0; - self._mbs.ignore_time = 2; - self._mbs.turret_ignore_time = 5; - } - - self.attackeraccuracy = 0.1; - } - else - { + */ + self._mbs.last_pain_time = 0; + self._mbs.ignore_time = 2; + self._mbs.turret_ignore_time = 5; + } + self.attackeraccuracy = 0.1; + return; + } + else + { + /* /# - assertmsg( "magic_bullet_shield does not support entity of classname '" + self.classname + "'." ); + assertmsg( "magic_bullet_shield does not support entity of classname '" + self.classname + "'." ); #/ - } - } + */ + } + } } -debug_magic_bullet_shield_death( guy ) +debug_magic_bullet_shield_death( guy ) //checked matches cerberus output { - targetname = "none"; - - if ( isdefined( guy.targetname ) ) - targetname = guy.targetname; - - guy endon( "stop_magic_bullet_shield" ); - - guy waittill( "death" ); + targetname = "none"; + if ( isDefined( guy.targetname ) ) + { + targetname = guy.targetname; + } + guy endon( "stop_magic_bullet_shield" ); + guy waittill( "death" ); + /* /# - assert( !isdefined( guy ), "Guy died with magic bullet shield on with targetname: " + targetname ); + assert( !isDefined( guy ), "Guy died with magic bullet shield on with targetname: " + targetname ); #/ + */ } -is_magic_bullet_shield_enabled( ent ) +is_magic_bullet_shield_enabled( ent ) //checked changed at own discretion { - if ( !isdefined( ent ) ) - return 0; - - return isdefined( ent.magic_bullet_shield ) && ent.magic_bullet_shield == 1; + if ( !isDefined( ent ) ) + { + return 0; + } + if ( isDefined( ent.magic_bullet_shield ) && ent.magic_bullet_shield == 1 ) + { + return 1; + } + return 0; } -really_play_2d_sound( sound ) +really_play_2d_sound( sound ) //checked changed to match cerberus output { - temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); - temp_ent playsoundwithnotify( sound, sound + "wait" ); - - temp_ent waittill( sound + "wait" ); - - wait 0.05; - temp_ent delete(); + temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); + temp_ent playsoundwithnotify( sound, sound + "wait" ); + temp_ent waittill( sound + "wait" ); + wait 0.05; + temp_ent delete(); } -play_sound_2d( sound ) +play_sound_2d( sound ) //checked matches cerberus output { - level thread really_play_2d_sound( sound ); + level thread really_play_2d_sound( sound ); } -include_weapon( weapon_name, in_box, collector, weighting_func ) +include_weapon( weapon_name, in_box, collector, weighting_func ) //checked matches cerberus output { + /* /# - println( "ZM >> include_weapon = " + weapon_name ); + println( "ZM >> include_weapon = " + weapon_name ); #/ - if ( !isdefined( in_box ) ) - in_box = 1; - - if ( !isdefined( collector ) ) - collector = 0; - - maps\mp\zombies\_zm_weapons::include_zombie_weapon( weapon_name, in_box, collector, weighting_func ); + */ + if ( !isDefined( in_box ) ) + { + in_box = 1; + } + if ( !isDefined( collector ) ) + { + collector = 0; + } + maps/mp/zombies/_zm_weapons::include_zombie_weapon( weapon_name, in_box, collector, weighting_func ); } -include_buildable( buildable_struct ) +include_buildable( buildable_struct ) //checked matches cerberus output { + /* /# - println( "ZM >> include_buildable = " + buildable_struct.name ); + println( "ZM >> include_buildable = " + buildable_struct.name ); #/ - maps\mp\zombies\_zm_buildables::include_zombie_buildable( buildable_struct ); + */ + maps/mp/zombies/_zm_buildables::include_zombie_buildable( buildable_struct ); } -is_buildable_included( name ) +is_buildable_included( name ) //checked matches cerberus output { - if ( isdefined( level.zombie_include_buildables[name] ) ) - return true; - - return false; + if ( isDefined( level.zombie_include_buildables[ name ] ) ) + { + return 1; + } + return 0; } -create_zombie_buildable_piece( modelname, radius, height, hud_icon ) +create_zombie_buildable_piece( modelname, radius, height, hud_icon ) //checked matches cerberus output { + /* /# - println( "ZM >> create_zombie_buildable_piece = " + modelname ); + println( "ZM >> create_zombie_buildable_piece = " + modelname ); #/ - self maps\mp\zombies\_zm_buildables::create_zombie_buildable_piece( modelname, radius, height, hud_icon ); + */ + self maps/mp/zombies/_zm_buildables::create_zombie_buildable_piece( modelname, radius, height, hud_icon ); } -is_buildable() +is_buildable() //checked matches cerberus output { - return self maps\mp\zombies\_zm_buildables::is_buildable(); + return self maps/mp/zombies/_zm_buildables::is_buildable(); } -wait_for_buildable( buildable_name ) +wait_for_buildable( buildable_name ) //checked matches cerberus output { - level waittill( buildable_name + "_built", player ); - - return player; + level waittill( buildable_name + "_built", player ); + return player; } -include_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, start_power, target ) +include_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, start_power, target ) //checked matches cerberus output { - return maps\mp\zombies\_zm_power::add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, start_power, target ); + return maps/mp/zombies/_zm_power::add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, start_power, target ); } -include_powerup( powerup_name ) +include_powerup( powerup_name ) //checked matches cerberus output { - maps\mp\zombies\_zm_powerups::include_zombie_powerup( powerup_name ); + maps/mp/zombies/_zm_powerups::include_zombie_powerup( powerup_name ); } -include_equipment( equipment_name ) +include_equipment( equipment_name ) //checked matches cerberus output { - maps\mp\zombies\_zm_equipment::include_zombie_equipment( equipment_name ); + maps/mp/zombies/_zm_equipment::include_zombie_equipment( equipment_name ); } -limit_equipment( equipment_name, limited ) +limit_equipment( equipment_name, limited ) //checked matches cerberus output { - maps\mp\zombies\_zm_equipment::limit_zombie_equipment( equipment_name, limited ); + maps/mp/zombies/_zm_equipment::limit_zombie_equipment( equipment_name, limited ); } -trigger_invisible( enable ) +trigger_invisible( enable ) //checked changed to match cerberus output { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( players[i] ) ) - self setinvisibletoplayer( players[i], enable ); - } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( isDefined( players[ i ] ) ) + { + self setinvisibletoplayer( players[ i ], enable ); + } + } } -print3d_ent( text, color, scale, offset, end_msg, overwrite ) +print3d_ent( text, color, scale, offset, end_msg, overwrite ) //checked changed to match cerberus output { - self endon( "death" ); - - if ( isdefined( overwrite ) && overwrite && isdefined( self._debug_print3d_msg ) ) - { - self notify( "end_print3d" ); - wait 0.05; - } - - self endon( "end_print3d" ); - - if ( !isdefined( color ) ) - color = ( 1, 1, 1 ); - - if ( !isdefined( scale ) ) - scale = 1.0; - - if ( !isdefined( offset ) ) - offset = ( 0, 0, 0 ); - - if ( isdefined( end_msg ) ) - self endon( end_msg ); - - self._debug_print3d_msg = text; + self endon( "death" ); + if ( is_true( overwrite ) && isDefined( self._debug_print3d_msg ) ) + { + self notify( "end_print3d" ); + wait 0.05; + } + self endon( "end_print3d" ); + if ( !isDefined( color ) ) + { + color = ( 1, 1, 1 ); + } + if ( !isDefined( scale ) ) + { + scale = 1; + } + if ( !isDefined( offset ) ) + { + offset = ( 0, 0, 0 ); + } + if ( isDefined( end_msg ) ) + { + self endon( end_msg ); + } + self._debug_print3d_msg = text; + /* /# - while ( true ) - { - print3d( self.origin + offset, self._debug_print3d_msg, color, scale ); - wait 0.05; - } + while ( 1 ) + { + print3d( self.origin + offset, self._debug_print3d_msg, color, scale ); + wait 0,05; #/ + } + */ } -isexplosivedamage( meansofdeath ) +isexplosivedamage( meansofdeath ) //checked matches cerberus output { - explosivedamage = "MOD_GRENADE MOD_GRENADE_SPLASH MOD_PROJECTILE_SPLASH MOD_EXPLOSIVE"; - - if ( issubstr( explosivedamage, meansofdeath ) ) - return true; - - return false; + explosivedamage = "MOD_GRENADE MOD_GRENADE_SPLASH MOD_PROJECTILE_SPLASH MOD_EXPLOSIVE"; + if ( issubstr( explosivedamage, meansofdeath ) ) + { + return 1; + } + return 0; } -isprimarydamage( meansofdeath ) +isprimarydamage( meansofdeath ) //checked matches cerberus output { - if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) - return true; - - return false; + if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) + { + return 1; + } + return 0; } -isfiredamage( weapon, meansofdeath ) +isfiredamage( weapon, meansofdeath ) //checked changed to match cerberus output { - if ( ( issubstr( weapon, "flame" ) || issubstr( weapon, "molotov_" ) || issubstr( weapon, "napalmblob_" ) ) && ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" || meansofdeath == "MOD_GRENADE_SPLASH" ) ) - return true; - - return false; + if ( ( issubstr( weapon, "flame" ) || issubstr( weapon, "molotov_" ) ) && ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" ) ) + { + return 1; + } + else if ( ( issubstr( weapon, "flame" ) || issubstr( weapon, "molotov_" ) ) && meansofdeath == "MOD_GRENADE_SPLASH" ) + { + return 1; + } + else if ( ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" ) && issubstr( weapon, "napalmblob_" ) ) + { + return 1; + } + else if ( issubstr( weapon, "napalmblob_" ) && meansofdeath == "MOD_GRENADE_SPLASH" ) + { + return 1; + } + return 0; } -isplayerexplosiveweapon( weapon, meansofdeath ) +isplayerexplosiveweapon( weapon, meansofdeath ) //checked matches cerberus output { - if ( !isexplosivedamage( meansofdeath ) ) - return false; - - if ( weapon == "artillery_mp" ) - return false; - - if ( issubstr( weapon, "turret" ) ) - return false; - - return true; + if ( !isexplosivedamage( meansofdeath ) ) + { + return 0; + } + if ( weapon == "artillery_mp" ) + { + return 0; + } + if ( issubstr( weapon, "turret" ) ) + { + return 0; + } + return 1; } -create_counter_hud( x ) +create_counter_hud( x ) //checked changed to match cerberus output { - if ( !isdefined( x ) ) - x = 0; - - hud = create_simple_hud(); - hud.alignx = "left"; - hud.aligny = "top"; - hud.horzalign = "user_left"; - hud.vertalign = "user_top"; - hud.color = ( 1, 1, 1 ); - hud.fontscale = 32; - hud.x = x; - hud.alpha = 0; - hud setshader( "hud_chalk_1", 64, 64 ); - return hud; + if ( !isDefined( x ) ) + { + x = 0; + } + hud = create_simple_hud(); + hud.alignx = "left"; + hud.aligny = "top"; + hud.horzalign = "user_left"; + hud.vertalign = "user_top"; + hud.color = ( 1, 1, 1 ); + hud.fontscale = 32; + hud.x = x; + hud.alpha = 0; + hud setshader( "hud_chalk_1", 64, 64 ); + return hud; } -get_current_zone( return_zone ) +get_current_zone( return_zone ) //checked changed to match cerberus output { - flag_wait( "zones_initialized" ); - - for ( z = 0; z < level.zone_keys.size; z++ ) - { - zone_name = level.zone_keys[z]; - zone = level.zones[zone_name]; - - for ( i = 0; i < zone.volumes.size; i++ ) - { - if ( self istouching( zone.volumes[i] ) ) - { - if ( isdefined( return_zone ) && return_zone ) - return zone; - - return zone_name; - } - } - } - - return undefined; + flag_wait( "zones_initialized" ); + for ( z = 0; z < level.zone_keys.size; z++ ) + { + zone_name = level.zone_keys[ z ]; + zone = level.zones[ zone_name ]; + for ( i = 0; i < zone.volumes.size; i++ ) + { + if ( self istouching( zone.volumes[ i ] ) ) + { + if ( is_true( return_zone ) ) + { + return zone; + } + return zone_name; + } + } + } + return undefined; } -remove_mod_from_methodofdeath( mod ) +remove_mod_from_methodofdeath( mod ) //checked matches cerberus output { - return mod; + return mod; } -clear_fog_threads() +clear_fog_threads() //checked changed to match cerberus output { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - players[i] notify( "stop_fog" ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] notify( "stop_fog" ); + } } -display_message( titletext, notifytext, duration ) +display_message( titletext, notifytext, duration ) //checked changed to match cerberus output { - notifydata = spawnstruct(); - notifydata.titletext = notifytext; - notifydata.notifytext = titletext; - notifydata.sound = "mus_level_up"; - notifydata.duration = duration; - notifydata.glowcolor = ( 1, 0, 0 ); - notifydata.color = ( 0, 0, 0 ); - notifydata.iconname = "hud_zombies_meat"; - self thread maps\mp\gametypes_zm\_hud_message::notifymessage( notifydata ); + notifydata = spawnstruct(); + notifydata.titletext = notifytext; + notifydata.notifytext = titletext; + notifydata.sound = "mus_level_up"; + notifydata.duration = duration; + notifydata.glowcolor = ( 1, 0, 0 ); + notifydata.color = ( 0, 0, 0 ); + notifydata.iconname = "hud_zombies_meat"; + self thread maps/mp/gametypes_zm/_hud_message::notifymessage( notifydata ); } -is_quad() +is_quad() //checked matches cerberus output { - return self.animname == "quad_zombie"; + return self.animname == "quad_zombie"; } -is_leaper() +is_leaper() //checked matches cerberus output { - return self.animname == "leaper_zombie"; + return self.animname == "leaper_zombie"; } -shock_onpain() +shock_onpain() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self notify( "stop_shock_onpain" ); - self endon( "stop_shock_onpain" ); - - if ( getdvar( _hash_7FB1F9A2 ) == "" ) - setdvar( "blurpain", "on" ); - - while ( true ) - { - oldhealth = self.health; - - self waittill( "damage", damage, attacker, direction_vec, point, mod ); - - if ( isdefined( level.shock_onpain ) && !level.shock_onpain ) - continue; - - if ( isdefined( self.shock_onpain ) && !self.shock_onpain ) - continue; - - if ( self.health < 1 ) - continue; - - if ( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" ) - continue; - else if ( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GRENADE" || mod == "MOD_EXPLOSIVE" ) - { - shocktype = undefined; - shocklight = undefined; - - if ( isdefined( self.is_burning ) && self.is_burning ) - { - shocktype = "lava"; - shocklight = "lava_small"; - } - - self shock_onexplosion( damage, shocktype, shocklight ); - } - else if ( getdvar( _hash_7FB1F9A2 ) == "on" ) - self shellshock( "pain", 0.5 ); - } + self endon( "death" ); + self endon( "disconnect" ); + self notify( "stop_shock_onpain" ); + self endon( "stop_shock_onpain" ); + if ( getDvar( "blurpain" ) == "" ) + { + setdvar( "blurpain", "on" ); + } + while ( 1 ) + { + oldhealth = self.health; + self waittill( "damage", damage, attacker, direction_vec, point, mod ); + if( IsDefined( level.shock_onpain ) && !level.shock_onpain ) + { + continue; + } + if( IsDefined( self.shock_onpain ) && !self.shock_onpain ) + { + continue; + } + if ( self.health < 1 ) + { + continue; + } + if ( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" ) + { + continue; + } + else if ( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GRENADE" || mod == "MOD_EXPLOSIVE" ) + { + shocktype = undefined; + shocklight = undefined; + if ( is_true( self.is_burning ) ) + { + shocktype = "lava"; + shocklight = "lava_small"; + } + self shock_onexplosion( damage, shocktype, shocklight ); + } + else if ( getDvar( "blurpain" ) == "on" ) + { + self shellshock( "pain", 0.5 ); + } + } } -shock_onexplosion( damage, shocktype, shocklight ) +shock_onexplosion( damage, shocktype, shocklight ) //checked changed to match cerberus output { - time = 0; - scaled_damage = 100 * damage / self.maxhealth; - - if ( scaled_damage >= 90 ) - time = 4; - else if ( scaled_damage >= 50 ) - time = 3; - else if ( scaled_damage >= 25 ) - time = 2; - else if ( scaled_damage > 10 ) - time = 1; - - if ( time ) - { - if ( !isdefined( shocktype ) ) - shocktype = "explosion"; - - self shellshock( shocktype, time ); - } - else if ( isdefined( shocklight ) ) - self shellshock( shocklight, time ); + time = 0; + scaled_damage = ( 100 * damage ) / self.maxhealth; + if ( scaled_damage >= 90 ) + { + time = 4; + } + else if ( scaled_damage >= 50 ) + { + time = 3; + } + else if ( scaled_damage >= 25 ) + { + time = 2; + } + else if ( scaled_damage > 10 ) + { + time = 1; + } + if ( time ) + { + if ( !isDefined( shocktype ) ) + { + shocktype = "explosion"; + } + self shellshock( shocktype, time ); + } + else if ( isDefined( shocklight ) ) + { + self shellshock( shocklight, time ); + } } -increment_is_drinking() +increment_is_drinking() //checked matches cerberus output { + /* /# - if ( isdefined( level.devgui_dpad_watch ) && level.devgui_dpad_watch ) - { - self.is_drinking++; - return; - } + if ( isDefined( level.devgui_dpad_watch ) && level.devgui_dpad_watch ) + { + self.is_drinking++; + return; #/ - if ( !isdefined( self.is_drinking ) ) - self.is_drinking = 0; - - if ( self.is_drinking == 0 ) - { - self disableoffhandweapons(); - self disableweaponcycling(); - } - - self.is_drinking++; + } + */ + if ( !isDefined( self.is_drinking ) ) + { + self.is_drinking = 0; + } + if ( self.is_drinking == 0 ) + { + self disableoffhandweapons(); + self disableweaponcycling(); + } + self.is_drinking++; } -is_multiple_drinking() +is_multiple_drinking() //checked matches cerberus output { - return self.is_drinking > 1; + return self.is_drinking > 1; } -decrement_is_drinking() +decrement_is_drinking() //checked matches cerberus output { - if ( self.is_drinking > 0 ) - self.is_drinking--; - else - { + if ( self.is_drinking > 0 ) + { + self.is_drinking--; + + } + else + { + /* /# - assertmsg( "making is_drinking less than 0" ); + assertmsg( "making is_drinking less than 0" ); #/ - } - - if ( self.is_drinking == 0 ) - { - self enableoffhandweapons(); - self enableweaponcycling(); - } + */ + } + if ( self.is_drinking == 0 ) + { + self enableoffhandweapons(); + self enableweaponcycling(); + } } -clear_is_drinking() +clear_is_drinking() //checked matches cerberus output { - self.is_drinking = 0; - self enableoffhandweapons(); - self enableweaponcycling(); + self.is_drinking = 0; + self enableoffhandweapons(); + self enableweaponcycling(); } -getweaponclasszm( weapon ) +getweaponclasszm( weapon ) //checked matches cerberus output { + /* /# - assert( isdefined( weapon ) ); + assert( isDefined( weapon ) ); #/ - if ( !isdefined( weapon ) ) - return undefined; - - if ( !isdefined( level.weaponclassarray ) ) - level.weaponclassarray = []; - - if ( isdefined( level.weaponclassarray[weapon] ) ) - return level.weaponclassarray[weapon]; - - baseweaponindex = getbaseweaponitemindex( weapon ) + 1; - weaponclass = tablelookupcolumnforrow( "zm/zm_statstable.csv", baseweaponindex, 2 ); - level.weaponclassarray[weapon] = weaponclass; - return weaponclass; -} - -spawn_weapon_model( weapon, model, origin, angles, options ) + */ + if ( !isDefined( weapon ) ) + { + return undefined; + } + if ( !isDefined( level.weaponclassarray ) ) + { + level.weaponclassarray = []; + } + if ( isDefined( level.weaponclassarray[ weapon ] ) ) + { + return level.weaponclassarray[ weapon ]; + } + baseweaponindex = getbaseweaponitemindex( weapon ) + 1; + weaponclass = tablelookupcolumnforrow( "zm/zm_statstable.csv", baseweaponindex, 2 ); + level.weaponclassarray[ weapon ] = weaponclass; + return weaponclass; +} + +spawn_weapon_model( weapon, model, origin, angles, options ) //checked matches cerberus output +{ + if ( !isDefined( model ) ) + { + model = getweaponmodel( weapon ); + } + weapon_model = spawn( "script_model", origin ); + if ( isDefined( angles ) ) + { + weapon_model.angles = angles; + } + if ( isDefined( options ) ) + { + weapon_model useweaponmodel( weapon, model, options ); + } + else + { + weapon_model useweaponmodel( weapon, model ); + } + return weapon_model; +} + +is_limited_weapon( weapname ) //checked matches cerberus output +{ + if ( isDefined( level.limited_weapons ) ) + { + if ( isDefined( level.limited_weapons[ weapname ] ) ) + { + return 1; + } + } + return 0; +} + +is_alt_weapon( weapname ) //checked matches cerberus output +{ + if ( getsubstr( weapname, 0, 3 ) == "gl_" ) + { + return 1; + } + if ( getsubstr( weapname, 0, 3 ) == "sf_" ) + { + return 1; + } + if ( getsubstr( weapname, 0, 10 ) == "dualoptic_" ) + { + return 1; + } + return 0; +} + +is_grenade_launcher( weapname ) //checked changed to match cerberus output +{ + return weapname == "m32_zm" || weapname == "m32_upgraded_zm"; +} + +register_lethal_grenade_for_level( weaponname ) //checked changed at own discretion +{ + if ( !is_lethal_grenade( weaponname ) ) + { + return; + } + if ( !isDefined( level.zombie_lethal_grenade_list ) ) + { + level.zombie_lethal_grenade_list = []; + } + level.zombie_lethal_grenade_list[ weaponname ] = weaponname; +} + +is_lethal_grenade( weaponname ) //checked matches cerberus output //changed at own discretion { - if ( !isdefined( model ) ) - model = getweaponmodel( weapon ); - - weapon_model = spawn( "script_model", origin ); - - if ( isdefined( angles ) ) - weapon_model.angles = angles; - - if ( isdefined( options ) ) - weapon_model useweaponmodel( weapon, model, options ); - else - weapon_model useweaponmodel( weapon, model ); - - return weapon_model; + if ( !isDefined( weaponname ) || !isDefined( level.zombie_lethal_grenade_list ) ) + { + return 0; + } + if ( isDefined( level.zombie_lethal_grenade_list[ weaponname ] ) ) + { + return 1; + } + return 0; } -is_limited_weapon( weapname ) +is_player_lethal_grenade( weaponname ) //checked matches cerberus output //changed at own discretion { - if ( isdefined( level.limited_weapons ) ) - { - if ( isdefined( level.limited_weapons[weapname] ) ) - return true; - } - - return false; + if ( !isDefined( weaponname ) || !isDefined( self.current_lethal_grenade ) ) + { + return 0; + } + if ( self.current_lethal_grenade == weaponname ) + { + return 1; + } + return 0; } -is_alt_weapon( weapname ) +get_player_lethal_grenade() //checked matches cerberus output { - if ( getsubstr( weapname, 0, 3 ) == "gl_" ) - return true; - - if ( getsubstr( weapname, 0, 3 ) == "sf_" ) - return true; - - if ( getsubstr( weapname, 0, 10 ) == "dualoptic_" ) - return true; - - return false; + grenade = ""; + if ( isDefined( self.current_lethal_grenade ) ) + { + grenade = self.current_lethal_grenade; + } + return grenade; } -is_grenade_launcher( weapname ) +set_player_lethal_grenade( weaponname ) //checked matches cerberus output { - return weapname == "m32_zm" || weapname == "m32_upgraded_zm"; + self.current_lethal_grenade = weaponname; } -register_lethal_grenade_for_level( weaponname ) +init_player_lethal_grenade() //checked matches cerberus output { - if ( is_lethal_grenade( weaponname ) ) - return; - - if ( !isdefined( level.zombie_lethal_grenade_list ) ) - level.zombie_lethal_grenade_list = []; - - level.zombie_lethal_grenade_list[weaponname] = weaponname; + self set_player_lethal_grenade( level.zombie_lethal_grenade_player_init ); } -is_lethal_grenade( weaponname ) +register_tactical_grenade_for_level( weaponname ) //checked changed at own discretion { - if ( !isdefined( weaponname ) || !isdefined( level.zombie_lethal_grenade_list ) ) - return 0; - - return isdefined( level.zombie_lethal_grenade_list[weaponname] ); + if ( !is_tactical_grenade( weaponname ) ) + { + return; + } + if ( !isDefined( level.zombie_tactical_grenade_list ) ) + { + level.zombie_tactical_grenade_list = []; + } + level.zombie_tactical_grenade_list[ weaponname ] = weaponname; } -is_player_lethal_grenade( weaponname ) +is_tactical_grenade( weaponname ) //checked matches cerberus output //checked changed at own discretion { - if ( !isdefined( weaponname ) || !isdefined( self.current_lethal_grenade ) ) - return 0; - - return self.current_lethal_grenade == weaponname; + if ( !isDefined( weaponname ) || !isDefined( level.zombie_tactical_grenade_list ) ) + { + return 0; + } + if ( isDefined( level.zombie_tactical_grenade_list[ weaponname ] ) ) + { + return 1; + } + return 0; } -get_player_lethal_grenade() +is_player_tactical_grenade( weaponname ) //checked matches cerberus output //checked changed at own discretion { - grenade = ""; - - if ( isdefined( self.current_lethal_grenade ) ) - grenade = self.current_lethal_grenade; - - return grenade; + if ( !isDefined( weaponname ) || !isDefined( self.current_tactical_grenade ) ) + { + return 0; + } + if ( self.current_tactical_grenade == weaponname ) + { + return 1; + } + return 0; } -set_player_lethal_grenade( weaponname ) +get_player_tactical_grenade() //checked matches cerberus output { - self.current_lethal_grenade = weaponname; + tactical = ""; + if ( isDefined( self.current_tactical_grenade ) ) + { + tactical = self.current_tactical_grenade; + } + return tactical; } -init_player_lethal_grenade() +set_player_tactical_grenade( weaponname ) //checked changed to match cerberus output { - self set_player_lethal_grenade( level.zombie_lethal_grenade_player_init ); + self notify( "new_tactical_grenade", weaponname ); + self.current_tactical_grenade = weaponname; } -register_tactical_grenade_for_level( weaponname ) +init_player_tactical_grenade() //checked matches cerberus output { - if ( is_tactical_grenade( weaponname ) ) - return; - - if ( !isdefined( level.zombie_tactical_grenade_list ) ) - level.zombie_tactical_grenade_list = []; - - level.zombie_tactical_grenade_list[weaponname] = weaponname; + self set_player_tactical_grenade( level.zombie_tactical_grenade_player_init ); } -is_tactical_grenade( weaponname ) +register_placeable_mine_for_level( weaponname ) //checked changed at own discretion { - if ( !isdefined( weaponname ) || !isdefined( level.zombie_tactical_grenade_list ) ) - return 0; - - return isdefined( level.zombie_tactical_grenade_list[weaponname] ); + if ( !is_placeable_mine( weaponname ) ) + { + return; + } + if ( !isDefined( level.zombie_placeable_mine_list ) ) + { + level.zombie_placeable_mine_list = []; + } + level.zombie_placeable_mine_list[ weaponname ] = weaponname; } -is_player_tactical_grenade( weaponname ) +is_placeable_mine( weaponname ) //checked matches cerberus output //changed at own discretion { - if ( !isdefined( weaponname ) || !isdefined( self.current_tactical_grenade ) ) - return 0; - - return self.current_tactical_grenade == weaponname; + if ( !isDefined( weaponname ) || !isDefined( level.zombie_placeable_mine_list ) ) + { + return 0; + } + if ( isDefined( level.zombie_placeable_mine_list[ weaponname ] ) ) + { + return 1; + } + return 0; } -get_player_tactical_grenade() +is_player_placeable_mine( weaponname ) //checked matches cerberus output //changed at own discretion { - tactical = ""; - - if ( isdefined( self.current_tactical_grenade ) ) - tactical = self.current_tactical_grenade; - - return tactical; + if ( !isDefined( weaponname ) || !isDefined( self.current_placeable_mine ) ) + { + return 0; + } + if ( self.current_placeable_mine == weaponname ) + { + return 1; + } + return 0; } -set_player_tactical_grenade( weaponname ) +get_player_placeable_mine() //checked matches cerberus output { - self notify( "new_tactical_grenade", weaponname ); - self.current_tactical_grenade = weaponname; + return self.current_placeable_mine; } -init_player_tactical_grenade() +set_player_placeable_mine( weaponname ) //checked matches cerberus output { - self set_player_tactical_grenade( level.zombie_tactical_grenade_player_init ); + self.current_placeable_mine = weaponname; } -register_placeable_mine_for_level( weaponname ) +init_player_placeable_mine() //checked matches cerberus output { - if ( is_placeable_mine( weaponname ) ) - return; - - if ( !isdefined( level.zombie_placeable_mine_list ) ) - level.zombie_placeable_mine_list = []; - - level.zombie_placeable_mine_list[weaponname] = weaponname; + self set_player_placeable_mine( level.zombie_placeable_mine_player_init ); } -is_placeable_mine( weaponname ) +register_melee_weapon_for_level( weaponname ) //checked matches cerberus output { - if ( !isdefined( weaponname ) || !isdefined( level.zombie_placeable_mine_list ) ) - return 0; - - return isdefined( level.zombie_placeable_mine_list[weaponname] ); + if ( !is_melee_weapon( weaponname ) ) + { + return; + } + if ( !isDefined( level.zombie_melee_weapon_list ) ) + { + level.zombie_melee_weapon_list = []; + } + level.zombie_melee_weapon_list[ weaponname ] = weaponname; } -is_player_placeable_mine( weaponname ) +is_melee_weapon( weaponname ) //checked matches cerberus output //changed at own discretion { - if ( !isdefined( weaponname ) || !isdefined( self.current_placeable_mine ) ) - return 0; - - return self.current_placeable_mine == weaponname; + if ( !isDefined( weaponname ) || !isDefined( level.zombie_melee_weapon_list ) ) + { + return 0; + } + if ( isDefined( level.zombie_melee_weapon_list[ weaponname ] ) ) + { + return 1; + } + return 0; } -get_player_placeable_mine() +is_player_melee_weapon( weaponname ) //checked matches cerberus output //changed at own discretion { - return self.current_placeable_mine; + if ( !isDefined( weaponname ) || !isDefined( self.current_melee_weapon ) ) + { + return 0; + } + if ( self.current_melee_weapon == weaponname ) + { + return 1; + } + return 0; } -set_player_placeable_mine( weaponname ) +get_player_melee_weapon() //checked matches cerberus output { - self.current_placeable_mine = weaponname; + return self.current_melee_weapon; } -init_player_placeable_mine() +set_player_melee_weapon( weaponname ) //checked matches cerberus output { - self set_player_placeable_mine( level.zombie_placeable_mine_player_init ); + self.current_melee_weapon = weaponname; } -register_melee_weapon_for_level( weaponname ) +init_player_melee_weapon() //checked matches cerberus output { - if ( is_melee_weapon( weaponname ) ) - return; - - if ( !isdefined( level.zombie_melee_weapon_list ) ) - level.zombie_melee_weapon_list = []; - - level.zombie_melee_weapon_list[weaponname] = weaponname; + self set_player_melee_weapon( level.zombie_melee_weapon_player_init ); } -is_melee_weapon( weaponname ) +should_watch_for_emp() //checked matches cerberus output { - if ( !isdefined( weaponname ) || !isdefined( level.zombie_melee_weapon_list ) ) - return 0; - - return isdefined( level.zombie_melee_weapon_list[weaponname] ); -} - -is_player_melee_weapon( weaponname ) -{ - if ( !isdefined( weaponname ) || !isdefined( self.current_melee_weapon ) ) - return 0; - - return self.current_melee_weapon == weaponname; + return isDefined( level.zombie_weapons[ "emp_grenade_zm" ] ); } -get_player_melee_weapon() +register_equipment_for_level( weaponname ) //checked matches cerberus output { - return self.current_melee_weapon; + if ( is_equipment( weaponname ) ) + { + return; + } + if ( !isDefined( level.zombie_equipment_list ) ) + { + level.zombie_equipment_list = []; + } + level.zombie_equipment_list[ weaponname ] = weaponname; } -set_player_melee_weapon( weaponname ) +is_equipment( weaponname ) //checked matches cerberus output //changed at own discretion { - self.current_melee_weapon = weaponname; + if ( !isDefined( weaponname ) || !isDefined( level.zombie_equipment_list ) ) + { + return 0; + } + if ( isDefined( level.zombie_equipment_list[ weaponname ] ) ) + { + return 1; + } + return 0; } -init_player_melee_weapon() +is_equipment_that_blocks_purchase( weaponname ) //checked matches cerberus output //changed at own discretion { - self set_player_melee_weapon( level.zombie_melee_weapon_player_init ); + if ( is_equipment( weaponname ) ) + { + return 1; + } + return 0; } -should_watch_for_emp() +is_player_equipment( weaponname ) //checked matches cerberus output //changed at own discretion { - return isdefined( level.zombie_weapons["emp_grenade_zm"] ); + if ( !isDefined( weaponname ) || !isDefined( self.current_equipment ) ) + { + return 0; + } + if ( self.current_equipment == weaponname ) + { + return 1; + } + return 0; } -register_equipment_for_level( weaponname ) +has_deployed_equipment( weaponname ) //checked changed to match cerberus output { - if ( is_equipment( weaponname ) ) - return; - - if ( !isdefined( level.zombie_equipment_list ) ) - level.zombie_equipment_list = []; - - level.zombie_equipment_list[weaponname] = weaponname; + if ( !isDefined( weaponname ) || !isDefined( self.deployed_equipment ) || self.deployed_equipment.size < 1 ) + { + return 0; + } + for ( i = 0; i < self.deployed_equipment.size; i++ ) + { + if ( self.deployed_equipment[ i ] == weaponname ) + { + return 1; + } + } + return 0; } -is_equipment( weaponname ) +has_player_equipment( weaponname ) //checked changed at own discretion { - if ( !isdefined( weaponname ) || !isdefined( level.zombie_equipment_list ) ) - return 0; - - return isdefined( level.zombie_equipment_list[weaponname] ); + if ( self is_player_equipment( weaponname ) || self has_deployed_equipment( weaponname ) ) + { + return 1; + } + return 0; } -is_equipment_that_blocks_purchase( weaponname ) +get_player_equipment() //checked matches cerberus output { - return is_equipment( weaponname ); + return self.current_equipment; } -is_player_equipment( weaponname ) +hacker_active() //checked matches cerberus output //changed at own discretion { - if ( !isdefined( weaponname ) || !isdefined( self.current_equipment ) ) - return 0; - - return self.current_equipment == weaponname; + if ( self maps/mp/zombies/_zm_equipment::is_equipment_active( "equip_hacker_zm" ) ) + { + return 1; + } + return 0; } -has_deployed_equipment( weaponname ) +set_player_equipment( weaponname ) //checked matches cerberus output { - if ( !isdefined( weaponname ) || !isdefined( self.deployed_equipment ) || self.deployed_equipment.size < 1 ) - return false; - - for ( i = 0; i < self.deployed_equipment.size; i++ ) - { - if ( self.deployed_equipment[i] == weaponname ) - return true; - } - - return false; + if ( !isDefined( self.current_equipment_active ) ) + { + self.current_equipment_active = []; + } + if ( isDefined( weaponname ) ) + { + self.current_equipment_active[ weaponname ] = 0; + } + if ( !isDefined( self.equipment_got_in_round ) ) + { + self.equipment_got_in_round = []; + } + if ( isDefined( weaponname ) ) + { + self.equipment_got_in_round[ weaponname ] = level.round_number; + } + self.current_equipment = weaponname; } -has_player_equipment( weaponname ) +init_player_equipment() //checked matches cerberus output { - return self is_player_equipment( weaponname ) || self has_deployed_equipment( weaponname ); + self set_player_equipment( level.zombie_equipment_player_init ); } -get_player_equipment() +register_offhand_weapons_for_level_defaults() //checked matches cerberus output { - return self.current_equipment; + if ( isDefined( level.register_offhand_weapons_for_level_defaults_override ) ) + { + [[ level.register_offhand_weapons_for_level_defaults_override ]](); + return; + } + register_lethal_grenade_for_level( "frag_grenade_zm" ); + level.zombie_lethal_grenade_player_init = "frag_grenade_zm"; + register_tactical_grenade_for_level( "cymbal_monkey_zm" ); + level.zombie_tactical_grenade_player_init = undefined; + register_placeable_mine_for_level( "claymore_zm" ); + level.zombie_placeable_mine_player_init = undefined; + register_melee_weapon_for_level( "knife_zm" ); + register_melee_weapon_for_level( "bowie_knife_zm" ); + level.zombie_melee_weapon_player_init = "knife_zm"; + level.zombie_equipment_player_init = undefined; } -hacker_active() +init_player_offhand_weapons() //checked matches cerberus output { - return self maps\mp\zombies\_zm_equipment::is_equipment_active( "equip_hacker_zm" ); + init_player_lethal_grenade(); + init_player_tactical_grenade(); + init_player_placeable_mine(); + init_player_melee_weapon(); + init_player_equipment(); } -set_player_equipment( weaponname ) +is_offhand_weapon( weaponname ) //checked changed at own discretion { - if ( !isdefined( self.current_equipment_active ) ) - self.current_equipment_active = []; - - if ( isdefined( weaponname ) ) - self.current_equipment_active[weaponname] = 0; - - if ( !isdefined( self.equipment_got_in_round ) ) - self.equipment_got_in_round = []; - - if ( isdefined( weaponname ) ) - self.equipment_got_in_round[weaponname] = level.round_number; - - self.current_equipment = weaponname; + if ( is_lethal_grenade( weaponname ) || is_tactical_grenade( weaponname ) || is_placeable_mine( weaponname ) || is_melee_weapon( weaponname ) || is_equipment( weaponname ) ) + { + return 1; + } + return 0; } -init_player_equipment() +is_player_offhand_weapon( weaponname ) //checked changed at own discretion { - self set_player_equipment( level.zombie_equipment_player_init ); + if ( self is_player_lethal_grenade( weaponname ) || self is_player_tactical_grenade( weaponname ) || self is_player_placeable_mine( weaponname ) || self is_player_melee_weapon( weaponname ) || self is_player_equipment( weaponname ) ) + { + return 1; + } + return 0; } -register_offhand_weapons_for_level_defaults() +has_powerup_weapon() //checked changed at own discretion { - if ( isdefined( level.register_offhand_weapons_for_level_defaults_override ) ) - { - [[ level.register_offhand_weapons_for_level_defaults_override ]](); - return; - } - - register_lethal_grenade_for_level( "frag_grenade_zm" ); - level.zombie_lethal_grenade_player_init = "frag_grenade_zm"; - register_tactical_grenade_for_level( "cymbal_monkey_zm" ); - level.zombie_tactical_grenade_player_init = undefined; - register_placeable_mine_for_level( "claymore_zm" ); - level.zombie_placeable_mine_player_init = undefined; - register_melee_weapon_for_level( "knife_zm" ); - register_melee_weapon_for_level( "bowie_knife_zm" ); - level.zombie_melee_weapon_player_init = "knife_zm"; - level.zombie_equipment_player_init = undefined; + if ( is_true( self.has_powerup_weapon ) ) + { + return 1; + } + return 0; } -init_player_offhand_weapons() +give_start_weapon( switch_to_weapon ) //checked matches cerberus output { - init_player_lethal_grenade(); - init_player_tactical_grenade(); - init_player_placeable_mine(); - init_player_melee_weapon(); - init_player_equipment(); + self giveweapon( level.start_weapon ); + self givestartammo( level.start_weapon ); + if ( is_true( switch_to_weapon ) ) + { + self switchtoweapon( level.start_weapon ); + } } -is_offhand_weapon( weaponname ) +array_flag_wait_any( flag_array ) //checked changed to match cerberus output { - return is_lethal_grenade( weaponname ) || is_tactical_grenade( weaponname ) || is_placeable_mine( weaponname ) || is_melee_weapon( weaponname ) || is_equipment( weaponname ); + if ( !isDefined( level._array_flag_wait_any_calls ) ) + { + level._n_array_flag_wait_any_calls = 0; + } + else + { + level._n_array_flag_wait_any_calls++; + } + str_condition = "array_flag_wait_call_" + level._n_array_flag_wait_any_calls; + for ( index = 0; index < flag_array.size; index++ ) + { + level thread array_flag_wait_any_thread( flag_array[ index ], str_condition ); + } + level waittill( str_condition ); } -is_player_offhand_weapon( weaponname ) +array_flag_wait_any_thread( flag_name, condition ) //checked matches cerberus output { - return self is_player_lethal_grenade( weaponname ) || self is_player_tactical_grenade( weaponname ) || self is_player_placeable_mine( weaponname ) || self is_player_melee_weapon( weaponname ) || self is_player_equipment( weaponname ); + level endon( condition ); + flag_wait( flag_name ); + level notify( condition ); } -has_powerup_weapon() +array_removedead( array ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - return isdefined( self.has_powerup_weapon ) && self.has_powerup_weapon; + newarray = []; + if ( !isDefined( array ) ) + { + return undefined; + } + i = 0; + while ( i < array.size ) + { + if ( !isalive( array[ i ] ) || is_true( array[ i ].isacorpse ) ) + { + i++; + continue; + } + newarray[ newarray.size ] = array[ i ]; + i++; + } + return newarray; } -give_start_weapon( switch_to_weapon ) +groundpos( origin ) //checked matches cerberus output { - self giveweapon( level.start_weapon ); - self givestartammo( level.start_weapon ); - - if ( isdefined( switch_to_weapon ) && switch_to_weapon ) - self switchtoweapon( level.start_weapon ); + return bullettrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self )[ "position" ]; } -array_flag_wait_any( flag_array ) +groundpos_ignore_water( origin ) //checked matches cerberus output { - if ( !isdefined( level._array_flag_wait_any_calls ) ) - level._n_array_flag_wait_any_calls = 0; - else - level._n_array_flag_wait_any_calls++; - - str_condition = "array_flag_wait_call_" + level._n_array_flag_wait_any_calls; - - for ( index = 0; index < flag_array.size; index++ ) - level thread array_flag_wait_any_thread( flag_array[index], str_condition ); - - level waittill( str_condition ); + return bullettrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self, 1 )[ "position" ]; } -array_flag_wait_any_thread( flag_name, condition ) +groundpos_ignore_water_new( origin ) //checked matches cerberus output { - level endon( condition ); - flag_wait( flag_name ); - level notify( condition ); + return groundtrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self, 1 )[ "position" ]; } -array_removedead( array ) +waittill_notify_or_timeout( msg, timer ) //checked matches cerberus output { - newarray = []; - - if ( !isdefined( array ) ) - return undefined; - - for ( i = 0; i < array.size; i++ ) - { - if ( !isalive( array[i] ) || isdefined( array[i].isacorpse ) && array[i].isacorpse ) - continue; - - newarray[newarray.size] = array[i]; - } - - return newarray; + self endon( msg ); + wait timer; + return timer; } -groundpos( origin ) +self_delete() //checked matches cerberus output { - return bullettrace( origin, origin + vectorscale( ( 0, 0, -1 ), 100000.0 ), 0, self )["position"]; + if ( isDefined( self ) ) + { + self delete(); + } } -groundpos_ignore_water( origin ) +script_delay() //checked changed to match cerberus output { - return bullettrace( origin, origin + vectorscale( ( 0, 0, -1 ), 100000.0 ), 0, self, 1 )["position"]; + if ( isDefined( self.script_delay ) ) + { + wait self.script_delay; + return 1; + } + else if ( isDefined( self.script_delay_min ) && isDefined( self.script_delay_max ) ) + { + wait randomfloatrange( self.script_delay_min, self.script_delay_max ); + return 1; + } + return 0; } -groundpos_ignore_water_new( origin ) +button_held_think( which_button ) //checked changed to match cerberus output { - return groundtrace( origin, origin + vectorscale( ( 0, 0, -1 ), 100000.0 ), 0, self, 1 )["position"]; + self endon( "disconnect" ); + if ( !isDefined( self._holding_button ) ) + { + self._holding_button = []; + } + self._holding_button[ which_button ] = 0; + time_started = 0; + use_time = 250; + while ( 1 ) + { + if ( self._holding_button[ which_button ] ) + { + if ( !( self [[ level._button_funcs[ which_button ] ]]() ) ) + { + self._holding_button[ which_button ] = 0; + } + } + else if ( self [[ level._button_funcs[ which_button ] ]]() ) + { + if ( time_started == 0 ) + { + time_started = getTime(); + } + if ( ( getTime() - time_started ) > use_time ) + { + self._holding_button[ which_button ] = 1; + } + } + else if ( time_started != 0 ) + { + time_started = 0; + } + wait 0.05; + } } -waittill_notify_or_timeout( msg, timer ) +use_button_held() //checked matches cerberus output { - self endon( msg ); - wait( timer ); - return timer; + init_button_wrappers(); + if ( !isDefined( self._use_button_think_threaded ) ) + { + self thread button_held_think( level.button_use ); + self._use_button_think_threaded = 1; + } + return self._holding_button[ level.button_use ]; } -self_delete() +ads_button_held() //checked matches cerberus output { - if ( isdefined( self ) ) - self delete(); -} - -script_delay() -{ - if ( isdefined( self.script_delay ) ) - { - wait( self.script_delay ); - return true; - } - else if ( isdefined( self.script_delay_min ) && isdefined( self.script_delay_max ) ) - { - wait( randomfloatrange( self.script_delay_min, self.script_delay_max ) ); - return true; - } - - return false; -} - -button_held_think( which_button ) -{ - self endon( "disconnect" ); - - if ( !isdefined( self._holding_button ) ) - self._holding_button = []; - - self._holding_button[which_button] = 0; - time_started = 0; - use_time = 250; - - while ( true ) - { - if ( self._holding_button[which_button] ) - { - if ( !self [[ level._button_funcs[which_button] ]]() ) - self._holding_button[which_button] = 0; - } - else if ( self [[ level._button_funcs[which_button] ]]() ) - { - if ( time_started == 0 ) - time_started = gettime(); - - if ( gettime() - time_started > use_time ) - self._holding_button[which_button] = 1; - } - else if ( time_started != 0 ) - time_started = 0; - - wait 0.05; - } -} - -use_button_held() -{ - init_button_wrappers(); - - if ( !isdefined( self._use_button_think_threaded ) ) - { - self thread button_held_think( level.button_use ); - self._use_button_think_threaded = 1; - } - - return self._holding_button[level.button_use]; -} - -ads_button_held() -{ - init_button_wrappers(); - - if ( !isdefined( self._ads_button_think_threaded ) ) - { - self thread button_held_think( level.button_ads ); - self._ads_button_think_threaded = 1; - } - - return self._holding_button[level.button_ads]; -} - -attack_button_held() -{ - init_button_wrappers(); - - if ( !isdefined( self._attack_button_think_threaded ) ) - { - self thread button_held_think( level.button_attack ); - self._attack_button_think_threaded = 1; - } - - return self._holding_button[level.button_attack]; -} - -use_button_pressed() -{ - return self usebuttonpressed(); -} - -ads_button_pressed() -{ - return self adsbuttonpressed(); -} - -attack_button_pressed() -{ - return self attackbuttonpressed(); -} - -init_button_wrappers() -{ - if ( !isdefined( level._button_funcs ) ) - { - level.button_use = 0; - level.button_ads = 1; - level.button_attack = 2; - level._button_funcs[level.button_use] = ::use_button_pressed; - level._button_funcs[level.button_ads] = ::ads_button_pressed; - level._button_funcs[level.button_attack] = ::attack_button_pressed; - } -} - -wait_network_frame() -{ - if ( numremoteclients() ) - { - snapshot_ids = getsnapshotindexarray(); - - for ( acked = undefined; !isdefined( acked ); acked = snapshotacknowledged( snapshot_ids ) ) - level waittill( "snapacknowledged" ); - } - else - wait 0.1; -} - -ignore_triggers( timer ) -{ - self endon( "death" ); - self.ignoretriggers = 1; - - if ( isdefined( timer ) ) - wait( timer ); - else - wait 0.5; - - self.ignoretriggers = 0; -} - -giveachievement_wrapper( achievement, all_players ) -{ - if ( achievement == "" ) - return; - - if ( isdefined( level.zm_disable_recording_stats ) && level.zm_disable_recording_stats ) - return; - - achievement_lower = tolower( achievement ); - global_counter = 0; - - if ( isdefined( all_players ) && all_players ) - { - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - players[i] giveachievement( achievement ); - has_achievement = players[i] maps\mp\zombies\_zm_stats::get_global_stat( achievement_lower ); - - if ( !( isdefined( has_achievement ) && has_achievement ) ) - global_counter++; - - players[i] maps\mp\zombies\_zm_stats::increment_client_stat( achievement_lower, 0 ); - - if ( issplitscreen() && i == 0 || !issplitscreen() ) - { - if ( isdefined( level.achievement_sound_func ) ) - players[i] thread [[ level.achievement_sound_func ]]( achievement_lower ); - } - } - } - else - { - if ( !isplayer( self ) ) - { + init_button_wrappers(); + if ( !isDefined( self._ads_button_think_threaded ) ) + { + self thread button_held_think( level.button_ads ); + self._ads_button_think_threaded = 1; + } + return self._holding_button[ level.button_ads ]; +} + +attack_button_held() //checked matches cerberus output +{ + init_button_wrappers(); + if ( !isDefined( self._attack_button_think_threaded ) ) + { + self thread button_held_think( level.button_attack ); + self._attack_button_think_threaded = 1; + } + return self._holding_button[ level.button_attack ]; +} + +use_button_pressed() //checked matches cerberus output +{ + return self usebuttonpressed(); +} + +ads_button_pressed() //checked matches cerberus output +{ + return self adsbuttonpressed(); +} + +attack_button_pressed() //checked matches cerberus output +{ + return self attackbuttonpressed(); +} + +init_button_wrappers() //checked matches cerberus output +{ + if ( !isDefined( level._button_funcs ) ) + { + level.button_use = 0; + level.button_ads = 1; + level.button_attack = 2; + level._button_funcs[ level.button_use ] = ::use_button_pressed; + level._button_funcs[ level.button_ads ] = ::ads_button_pressed; + level._button_funcs[ level.button_attack ] = ::attack_button_pressed; + } +} + +wait_network_frame() //checked partially changed to match cerberus output //did not change while loop to for loop +{ + if ( numremoteclients() ) + { + snapshot_ids = getsnapshotindexarray(); + acked = undefined; + while ( !isDefined( acked ) ) + { + level waittill( "snapacknowledged" ); + acked = snapshotacknowledged( snapshot_ids ); + } + } + else + { + wait 0.1; + } +} + +ignore_triggers( timer ) //checked matches cerberus output +{ + self endon( "death" ); + self.ignoretriggers = 1; + if ( isDefined( timer ) ) + { + wait timer; + } + else + { + wait 0.5; + } + self.ignoretriggers = 0; +} + +giveachievement_wrapper( achievement, all_players ) //checked changed to match cerberus output +{ + if ( achievement == "" ) + { + return; + } + if ( is_true( level.zm_disable_recording_stats ) ) + { + return; + } + achievement_lower = tolower( achievement ); + global_counter = 0; + if ( is_true( all_players ) ) + { + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[ i ] giveachievement( achievement ); + has_achievement = players[ i ] maps/mp/zombies/_zm_stats::get_global_stat( achievement_lower ); + if ( !is_true( has_achievement ) ) + { + global_counter++; + } + players[ i ] maps/mp/zombies/_zm_stats::increment_client_stat( achievement_lower, 0 ); + if ( issplitscreen() && i == 0 || !issplitscreen() ) + { + if ( isDefined( level.achievement_sound_func ) ) + { + players[ i ] thread [[ level.achievement_sound_func ]]( achievement_lower ); + } + } + } + } + else if ( !isplayer( self ) ) + { + /* /# - println( "^1self needs to be a player for _utility::giveachievement_wrapper()" ); + println( "^1self needs to be a player for _utility::giveachievement_wrapper()" ); #/ - return; - } - - self giveachievement( achievement ); - has_achievement = self maps\mp\zombies\_zm_stats::get_global_stat( achievement_lower ); - - if ( !( isdefined( has_achievement ) && has_achievement ) ) - global_counter++; - - self maps\mp\zombies\_zm_stats::increment_client_stat( achievement_lower, 0 ); - - if ( isdefined( level.achievement_sound_func ) ) - self thread [[ level.achievement_sound_func ]]( achievement_lower ); - } - - if ( global_counter ) - incrementcounter( "global_" + achievement_lower, global_counter ); + */ + return; + } + self giveachievement( achievement ); + has_achievement = self maps/mp/zombies/_zm_stats::get_global_stat( achievement_lower ); + if ( !is_true( has_achievement ) ) + { + global_counter++; + } + self maps/mp/zombies/_zm_stats::increment_client_stat( achievement_lower, 0 ); + if ( isDefined( level.achievement_sound_func ) ) + { + self thread [[ level.achievement_sound_func ]]( achievement_lower ); + } + if ( global_counter ) + { + incrementcounter( "global_" + achievement_lower, global_counter ); + } } -spawn_failed( spawn ) +spawn_failed( spawn ) //checked matches cerberus output { - if ( isdefined( spawn ) && isalive( spawn ) ) - { - if ( isalive( spawn ) ) - return false; - } - - return true; + if ( isDefined( spawn ) && isalive( spawn ) ) + { + if ( isalive( spawn ) ) + { + return 0; + } + } + return 1; } -getyaw( org ) +getyaw( org ) //checked matches cerberus output { - angles = vectortoangles( org - self.origin ); - return angles[1]; + angles = vectorToAngles( org - self.origin ); + return angles[ 1 ]; } -getyawtospot( spot ) +getyawtospot( spot ) //checked matches cerberus output { - pos = spot; - yaw = self.angles[1] - getyaw( pos ); - yaw = angleclamp180( yaw ); - return yaw; + pos = spot; + yaw = self.angles[ 1 ] - getyaw( pos ); + yaw = AbsAngleClamp180( yaw ); + return yaw; } -add_spawn_function( function, param1, param2, param3, param4 ) +add_spawn_function( function, param1, param2, param3, param4 ) //checked matches cerberus output { + /* /# - assert( !isdefined( level._loadstarted ) || !isalive( self ), "Tried to add_spawn_function to a living guy." ); + if ( isDefined( level._loadstarted ) ) + { + assert( !isalive( self ), "Tried to add_spawn_function to a living guy." ); + } #/ - func = []; - func["function"] = function; - func["param1"] = param1; - func["param2"] = param2; - func["param3"] = param3; - func["param4"] = param4; - - if ( !isdefined( self.spawn_funcs ) ) - self.spawn_funcs = []; - - self.spawn_funcs[self.spawn_funcs.size] = func; + */ + func = []; + func[ "function" ] = function; + func[ "param1" ] = param1; + func[ "param2" ] = param2; + func[ "param3" ] = param3; + func[ "param4" ] = param4; + if ( !isDefined( self.spawn_funcs ) ) + { + self.spawn_funcs = []; + } + self.spawn_funcs[ self.spawn_funcs.size ] = func; } -disable_react() +disable_react() //checked matches cerberus output { + /* /# - assert( isalive( self ), "Tried to disable react on a non ai" ); + assert( isalive( self ), "Tried to disable react on a non ai" ); #/ - self.a.disablereact = 1; - self.allowreact = 0; + */ + self.a.disablereact = 1; + self.allowreact = 0; } -enable_react() +enable_react() //checked matches cerberus output { + /* /# - assert( isalive( self ), "Tried to enable react on a non ai" ); + assert( isalive( self ), "Tried to enable react on a non ai" ); #/ - self.a.disablereact = 0; - self.allowreact = 1; + */ + self.a.disablereact = 0; + self.allowreact = 1; } -flag_wait_or_timeout( flagname, timer ) +flag_wait_or_timeout( flagname, timer ) //not sure what to do here { - start_time = gettime(); - - for (;;) - { - if ( level.flag[flagname] ) - break; - - if ( gettime() >= start_time + timer * 1000 ) - break; - - wait_for_flag_or_time_elapses( flagname, timer ); - } + start_time = getTime(); + for ( ;; ) + { + if ( level.flag[ flagname ] ) + { + return; + } + else if ( getTime() >= ( start_time + ( timer * 1000 ) ) ) + { + return; + } + else + { + wait_for_flag_or_time_elapses( flagname, timer ); + } + } } -wait_for_flag_or_time_elapses( flagname, timer ) +wait_for_flag_or_time_elapses( flagname, timer ) //checked matches cerberus output { - level endon( flagname ); - wait( timer ); + level endon( flagname ); + wait timer; } -isads( player ) +isads( player ) //checked matches cerberus output { - return player playerads() > 0.5; + return player playerads() > 0.5; } -bullet_attack( type ) +bullet_attack( type ) //checked matches cerberus output { - if ( type == "MOD_PISTOL_BULLET" ) - return 1; - - return type == "MOD_RIFLE_BULLET"; + if ( type == "MOD_PISTOL_BULLET" ) + { + return 1; + } + return type == "MOD_RIFLE_BULLET"; } -pick_up() +pick_up() //checked matches cerberus output { - player = self.owner; - self destroy_ent(); - clip_ammo = player getweaponammoclip( self.name ); - clip_max_ammo = weaponclipsize( self.name ); - - if ( clip_ammo < clip_max_ammo ) - clip_ammo++; - - player setweaponammoclip( self.name, clip_ammo ); + player = self.owner; + self destroy_ent(); + clip_ammo = player getweaponammoclip( self.name ); + clip_max_ammo = weaponclipsize( self.name ); + if ( clip_ammo < clip_max_ammo ) + { + clip_ammo++; + } + player setweaponammoclip( self.name, clip_ammo ); } -destroy_ent() +destroy_ent() //checked matches cerberus output { - self delete(); + self delete(); } -waittill_not_moving() +waittill_not_moving() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self endon( "detonated" ); - level endon( "game_ended" ); - - if ( self.classname == "grenade" ) - self waittill( "stationary" ); - else - { - for ( prevorigin = self.origin; 1; prevorigin = self.origin ) - { - wait 0.15; - - if ( self.origin == prevorigin ) - break; - } - } + self endon( "death" ); + self endon( "disconnect" ); + self endon( "detonated" ); + level endon( "game_ended" ); + if ( self.classname == "grenade" ) + { + self waittill( "stationary" ); + } + prevorigin = self.origin; + while ( 1 ) + { + wait 0.15; + if ( self.origin == prevorigin ) + { + return; + } + prevorigin = self.origin; + } } -get_closest_player( org ) +get_closest_player( org ) //checked matches cerberus output { - players = []; - players = get_players(); - return getclosest( org, players ); + players = []; + players = get_players(); + return getclosest( org, players ); } -ent_flag_wait( msg ) +ent_flag_wait( msg ) //checked matches cerberus output { - self endon( "death" ); - - while ( !self.ent_flag[msg] ) - self waittill( msg ); + self endon( "death" ); + while ( !self.ent_flag[ msg ] ) + { + self waittill( msg ); + } } -ent_flag_wait_either( flag1, flag2 ) +ent_flag_wait_either( flag1, flag2 ) //no idea what to do here { - self endon( "death" ); - - for (;;) - { - if ( ent_flag( flag1 ) ) - return; - - if ( ent_flag( flag2 ) ) - return; - - self waittill_either( flag1, flag2 ); - } + self endon( "death" ); + for ( ;; ) + { + if ( ent_flag( flag1 ) ) + { + return; + } + if ( ent_flag( flag2 ) ) + { + return; + } + self waittill_either( flag1, flag2 ); + } } -ent_wait_for_flag_or_time_elapses( flagname, timer ) +ent_wait_for_flag_or_time_elapses( flagname, timer ) //checked matches cerberus output { - self endon( flagname ); - wait( timer ); + self endon( flagname ); + wait timer; } -ent_flag_wait_or_timeout( flagname, timer ) +ent_flag_wait_or_timeout( flagname, timer ) //no idea what to do here { - self endon( "death" ); - start_time = gettime(); - - for (;;) - { - if ( self.ent_flag[flagname] ) - break; - - if ( gettime() >= start_time + timer * 1000 ) - break; - - self ent_wait_for_flag_or_time_elapses( flagname, timer ); - } + self endon( "death" ); + start_time = getTime(); + for ( ;; ) + { + if ( self.ent_flag[ flagname ] ) + { + return; + } + else if ( getTime() >= ( start_time + ( timer * 1000 ) ) ) + { + return; + } + else + { + self ent_wait_for_flag_or_time_elapses( flagname, timer ); + } + } } -ent_flag_waitopen( msg ) +ent_flag_waitopen( msg ) //checked matches cerberus output { - self endon( "death" ); - - while ( self.ent_flag[msg] ) - self waittill( msg ); + self endon( "death" ); + while ( self.ent_flag[ msg ] ) + { + self waittill( msg ); + } } -ent_flag_init( message, val ) +ent_flag_init( message, val ) //checked matches cerberus output { - if ( !isdefined( self.ent_flag ) ) - { - self.ent_flag = []; - self.ent_flags_lock = []; - } - - if ( !isdefined( level.first_frame ) ) - { + if ( !isDefined( self.ent_flag ) ) + { + self.ent_flag = []; + self.ent_flags_lock = []; + } + if ( !isDefined( level.first_frame ) ) + { + /* /# - assert( !isdefined( self.ent_flag[message] ), "Attempt to reinitialize existing flag '" + message + "' on entity." ); + assert( !isDefined( self.ent_flag[ message ] ), "Attempt to reinitialize existing flag '" + message + "' on entity." ); #/ - } - - if ( isdefined( val ) && val ) - { - self.ent_flag[message] = 1; + */ + } + if ( is_true( val ) ) + { + self.ent_flag[ message ] = 1; + /* /# - self.ent_flags_lock[message] = 1; + self.ent_flags_lock[ message ] = 1; #/ - } - else - { - self.ent_flag[message] = 0; + */ + } + else + { + self.ent_flag[ message ] = 0; + /* /# - self.ent_flags_lock[message] = 0; + self.ent_flags_lock[ message ] = 0; #/ - } + */ + } } -ent_flag_exist( message ) +ent_flag_exist( message ) //checked matches cerberus output { - if ( isdefined( self.ent_flag ) && isdefined( self.ent_flag[message] ) ) - return true; - - return false; + if ( isDefined( self.ent_flag ) && isDefined( self.ent_flag[ message ] ) ) + { + return 1; + } + return 0; } -ent_flag_set_delayed( message, delay ) +ent_flag_set_delayed( message, delay ) //checked matches cerberus output { - wait( delay ); - self ent_flag_set( message ); + wait delay; + self ent_flag_set( message ); } -ent_flag_set( message ) +ent_flag_set( message ) //checked matches cerberus output { + /* /# - assert( isdefined( self ), "Attempt to set a flag on entity that is not defined" ); - assert( isdefined( self.ent_flag[message] ), "Attempt to set a flag before calling flag_init: '" + message + "'." ); - assert( self.ent_flag[message] == self.ent_flags_lock[message] ); - self.ent_flags_lock[message] = 1; + assert( isDefined( self ), "Attempt to set a flag on entity that is not defined" ); + assert( isDefined( self.ent_flag[ message ] ), "Attempt to set a flag before calling flag_init: '" + message + "'." ); + assert( self.ent_flag[ message ] == self.ent_flags_lock[ message ] ); + self.ent_flags_lock[ message ] = 1; #/ - self.ent_flag[message] = 1; - self notify( message ); + */ + self.ent_flag[ message ] = 1; + self notify( message ); } -ent_flag_toggle( message ) +ent_flag_toggle( message ) //checked matches cerberus output { - if ( self ent_flag( message ) ) - self ent_flag_clear( message ); - else - self ent_flag_set( message ); + if ( self ent_flag( message ) ) + { + self ent_flag_clear( message ); + } + else + { + self ent_flag_set( message ); + } } -ent_flag_clear( message ) +ent_flag_clear( message ) //checked matches cerberus output { + /* /# - assert( isdefined( self ), "Attempt to clear a flag on entity that is not defined" ); - assert( isdefined( self.ent_flag[message] ), "Attempt to set a flag before calling flag_init: '" + message + "'." ); - assert( self.ent_flag[message] == self.ent_flags_lock[message] ); - self.ent_flags_lock[message] = 0; + assert( isDefined( self ), "Attempt to clear a flag on entity that is not defined" ); + assert( isDefined( self.ent_flag[ message ] ), "Attempt to set a flag before calling flag_init: '" + message + "'." ); + assert( self.ent_flag[ message ] == self.ent_flags_lock[ message ] ); + self.ent_flags_lock[ message ] = 0; #/ - if ( self.ent_flag[message] ) - { - self.ent_flag[message] = 0; - self notify( message ); - } + */ + if ( self.ent_flag[ message ] ) + { + self.ent_flag[ message ] = 0; + self notify( message ); + } } -ent_flag_clear_delayed( message, delay ) +ent_flag_clear_delayed( message, delay ) //checked matches cerberus output { - wait( delay ); - self ent_flag_clear( message ); + wait delay; + self ent_flag_clear( message ); } -ent_flag( message ) +ent_flag( message ) //checked matches cerberus output { + /* /# - assert( isdefined( message ), "Tried to check flag but the flag was not defined." ); + assert( isDefined( message ), "Tried to check flag but the flag was not defined." ); #/ /# - assert( isdefined( self.ent_flag[message] ), "Tried to check entity flag '" + message + "', but the flag was not initialized." ); + assert( isDefined( self.ent_flag[ message ] ), "Tried to check entity flag '" + message + "', but the flag was not initialized." ); #/ - if ( !self.ent_flag[message] ) - return false; - - return true; + */ + if ( !self.ent_flag[ message ] ) + { + return 0; + } + return 1; } -ent_flag_init_ai_standards() +ent_flag_init_ai_standards() //checked changed to match cerberus output { - message_array = []; - message_array[message_array.size] = "goal"; - message_array[message_array.size] = "damage"; - - for ( i = 0; i < message_array.size; i++ ) - { - self ent_flag_init( message_array[i] ); - self thread ent_flag_wait_ai_standards( message_array[i] ); - } + message_array = []; + message_array[ message_array.size ] = "goal"; + message_array[ message_array.size ] = "damage"; + for ( i = 0; i < message_array.size; i++ ) + { + self ent_flag_init( message_array[ i ] ); + self thread ent_flag_wait_ai_standards( message_array[ i ] ); + } } -ent_flag_wait_ai_standards( message ) +ent_flag_wait_ai_standards( message ) //checked matches cerberus output { - self endon( "death" ); - - self waittill( message ); - - self.ent_flag[message] = 1; + self endon( "death" ); + self waittill( message ); + self.ent_flag[ message ] = 1; } -flat_angle( angle ) +flat_angle( angle ) //checked matches cerberus output { - rangle = ( 0, angle[1], 0 ); - return rangle; + rangle = ( 0, angle[ 1 ], 0 ); + return rangle; } -waittill_any_or_timeout( timer, string1, string2, string3, string4, string5 ) +waittill_any_or_timeout( timer, string1, string2, string3, string4, string5 ) //checked matches cerberus output { + /* /# - assert( isdefined( string1 ) ); + assert( isDefined( string1 ) ); #/ - self endon( string1 ); - - if ( isdefined( string2 ) ) - self endon( string2 ); - - if ( isdefined( string3 ) ) - self endon( string3 ); - - if ( isdefined( string4 ) ) - self endon( string4 ); - - if ( isdefined( string5 ) ) - self endon( string5 ); - - wait( timer ); + */ + self endon( string1 ); + if ( isDefined( string2 ) ) + { + self endon( string2 ); + } + if ( isDefined( string3 ) ) + { + self endon( string3 ); + } + if ( isDefined( string4 ) ) + { + self endon( string4 ); + } + if ( isDefined( string5 ) ) + { + self endon( string5 ); + } + wait timer; } -clear_run_anim() +clear_run_anim() //checked matches cerberus output { - self.alwaysrunforward = undefined; - self.a.combatrunanim = undefined; - self.run_noncombatanim = undefined; - self.walk_combatanim = undefined; - self.walk_noncombatanim = undefined; - self.precombatrunenabled = 1; + self.alwaysrunforward = undefined; + self.a.combatrunanim = undefined; + self.run_noncombatanim = undefined; + self.walk_combatanim = undefined; + self.walk_noncombatanim = undefined; + self.precombatrunenabled = 1; } -track_players_intersection_tracker() +track_players_intersection_tracker() //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - self endon( "disconnect" ); - self endon( "death" ); - level endon( "end_game" ); - wait 5; - - while ( true ) - { - killed_players = 0; - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() || "playing" != players[i].sessionstate ) - continue; - - for ( j = 0; j < players.size; j++ ) - { - if ( i == j || players[j] maps\mp\zombies\_zm_laststand::player_is_in_laststand() || "playing" != players[j].sessionstate ) - continue; - - if ( isdefined( level.player_intersection_tracker_override ) ) - { - if ( players[i] [[ level.player_intersection_tracker_override ]]( players[j] ) ) - continue; - } - - playeri_origin = players[i].origin; - playerj_origin = players[j].origin; - - if ( abs( playeri_origin[2] - playerj_origin[2] ) > 60 ) - continue; - - distance_apart = distance2d( playeri_origin, playerj_origin ); - - if ( abs( distance_apart ) > 18 ) - continue; + self endon( "disconnect" ); + self endon( "death" ); + level endon( "end_game" ); + wait 5; + while ( 1 ) + { + killed_players = 0; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ i ].sessionstate != "playing" ) + { + i++; + continue; + } + j = 0; + while ( j < players.size ) + { + if ( j == i || players[ j ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ j ].sessionstate != "playing" ) + { + j++; + continue; + } + if ( isDefined( level.player_intersection_tracker_override ) ) + { + if ( players[ i ] [[ level.player_intersection_tracker_override ]]( players[ j ] ) ) + { + j++; + continue; + } + } + playeri_origin = players[ i ].origin; + playerj_origin = players[ j ].origin; + if ( abs( playeri_origin[ 2 ] - playerj_origin[ 2 ] ) > 60 ) + { + j++; + continue; + } + distance_apart = distance2d( playeri_origin, playerj_origin ); + if ( abs( distance_apart ) > 18 ) + { + j++; + continue; + } + /* /# - iprintlnbold( "PLAYERS ARE TOO FRIENDLY!!!!!" ); + iprintlnbold( "PLAYERS ARE TOO FRIENDLY!!!!!" ); #/ - players[i] dodamage( 1000, ( 0, 0, 0 ) ); - players[j] dodamage( 1000, ( 0, 0, 0 ) ); - - if ( !killed_players ) - players[i] playlocalsound( level.zmb_laugh_alias ); - - players[i] maps\mp\zombies\_zm_stats::increment_map_cheat_stat( "cheat_too_friendly" ); - players[i] maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_too_friendly", 0 ); - players[i] maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 ); - players[j] maps\mp\zombies\_zm_stats::increment_map_cheat_stat( "cheat_too_friendly" ); - players[j] maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_too_friendly", 0 ); - players[j] maps\mp\zombies\_zm_stats::increment_client_stat( "cheat_total", 0 ); - killed_players = 1; - } - } - - wait 0.5; - } + */ + players[ i ] dodamage( 1000, ( 0, 0, 1 ) ); + players[ j ] dodamage( 1000, ( 0, 0, 1 ) ); + if ( !killed_players ) + { + players[ i ] playlocalsound( level.zmb_laugh_alias ); + } + players[ i ] maps/mp/zombies/_zm_stats::increment_map_cheat_stat( "cheat_too_friendly" ); + players[ i ] maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_too_friendly", 0 ); + players[ i ] maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 ); + players[ j ] maps/mp/zombies/_zm_stats::increment_map_cheat_stat( "cheat_too_friendly" ); + players[ j ] maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_too_friendly", 0 ); + players[ j ] maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 ); + killed_players = 1; + j++; + } + i++; + } + wait 0.5; + } } -get_eye() +get_eye() //checked matches cerberus output { - if ( isplayer( self ) ) - { - linked_ent = self getlinkedent(); - - if ( isdefined( linked_ent ) && getdvarint( _hash_5AEFD7E9 ) > 0 ) - { - camera = linked_ent gettagorigin( "tag_camera" ); - - if ( isdefined( camera ) ) - return camera; - } - } - - pos = self geteye(); - return pos; + if ( isplayer( self ) ) + { + linked_ent = self getlinkedent(); + if ( isDefined( linked_ent ) && getDvarInt( "cg_cameraUseTagCamera" ) > 0 ) + { + camera = linked_ent gettagorigin( "tag_camera" ); + if ( isDefined( camera ) ) + { + return camera; + } + } + } + pos = self geteye(); + return pos; } -is_player_looking_at( origin, dot, do_trace, ignore_ent ) +is_player_looking_at( origin, dot, do_trace, ignore_ent ) //checked matches cerberus output { + /* /# - assert( isplayer( self ), "player_looking_at must be called on a player." ); + assert( isplayer( self ), "player_looking_at must be called on a player." ); #/ - if ( !isdefined( dot ) ) - dot = 0.7; - - if ( !isdefined( do_trace ) ) - do_trace = 1; - - eye = self get_eye(); - delta_vec = anglestoforward( vectortoangles( origin - eye ) ); - view_vec = anglestoforward( self getplayerangles() ); - new_dot = vectordot( delta_vec, view_vec ); - - if ( new_dot >= dot ) - { - if ( do_trace ) - return bullettracepassed( origin, eye, 0, ignore_ent ); - else - return 1; - } - - return 0; + */ + if ( !isDefined( dot ) ) + { + dot = 0.7; + } + if ( !isDefined( do_trace ) ) + { + do_trace = 1; + } + eye = self get_eye(); + delta_vec = anglesToForward( vectorToAngles( origin - eye ) ); + view_vec = anglesToForward( self getplayerangles() ); + new_dot = vectordot( delta_vec, view_vec ); + if ( new_dot >= dot ) + { + if ( do_trace ) + { + return bullettracepassed( origin, eye, 0, ignore_ent ); + } + else + { + return 1; + } + } + return 0; } -add_gametype( gt, dummy1, name, dummy2 ) +add_gametype( gt, dummy1, name, dummy2 ) //checked matches cerberus output { - } -add_gameloc( gl, dummy1, name, dummy2 ) +add_gameloc( gl, dummy1, name, dummy2 ) //checked matches cerberus output { - } -get_closest_index( org, array, dist ) +get_closest_index( org, array, dist ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - if ( !isdefined( dist ) ) - dist = 9999999; - - distsq = dist * dist; - - if ( array.size < 1 ) - return; - - index = undefined; - - for ( i = 0; i < array.size; i++ ) - { - newdistsq = distancesquared( array[i].origin, org ); - - if ( newdistsq >= distsq ) - continue; - - distsq = newdistsq; - index = i; - } - - return index; + if ( !isDefined( dist ) ) + { + dist = 9999999; + } + distsq = dist * dist; + if ( array.size < 1 ) + { + return; + } + index = undefined; + i = 0; + while ( i < array.size ) + { + newdistsq = distancesquared( array[ i ].origin, org ); + if ( newdistsq >= distsq ) + { + i++; + continue; + } + distsq = newdistsq; + index = i; + i++; + } + return index; } -is_valid_zombie_spawn_point( point ) +is_valid_zombie_spawn_point( point ) //checked matches cerberus output { - liftedorigin = point.origin + vectorscale( ( 0, 0, 1 ), 5.0 ); - size = 48; - height = 64; - mins = ( -1 * size, -1 * size, 0 ); - maxs = ( size, size, height ); - absmins = liftedorigin + mins; - absmaxs = liftedorigin + maxs; - - if ( boundswouldtelefrag( absmins, absmaxs ) ) - return false; - - return true; + liftedorigin = point.origin + vectorScale( ( 0, 0, 1 ), 5 ); + size = 48; + height = 64; + mins = ( -1 * size, -1 * size, 0 ); + maxs = ( size, size, height ); + absmins = liftedorigin + mins; + absmaxs = liftedorigin + maxs; + if ( boundswouldtelefrag( absmins, absmaxs ) ) + { + return 0; + } + return 1; } -get_closest_index_to_entity( entity, array, dist, extra_check ) +get_closest_index_to_entity( entity, array, dist, extra_check ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - org = entity.origin; - - if ( !isdefined( dist ) ) - dist = 9999999; - - distsq = dist * dist; - - if ( array.size < 1 ) - return; - - index = undefined; - - for ( i = 0; i < array.size; i++ ) - { - if ( isdefined( extra_check ) && ![[ extra_check ]]( entity, array[i] ) ) - continue; - - newdistsq = distancesquared( array[i].origin, org ); - - if ( newdistsq >= distsq ) - continue; - - distsq = newdistsq; - index = i; - } - - return index; + org = entity.origin; + if ( !isDefined( dist ) ) + { + dist = 9999999; + } + distsq = dist * dist; + if ( array.size < 1 ) + { + return; + } + index = undefined; + i = 0; + while ( i < array.size ) + { + if ( isDefined( extra_check ) && !( [[ extra_check ]]( entity, array[ i ] ) ) ) + { + i++; + continue; + } + newdistsq = distancesquared( array[ i ].origin, org ); + if ( newdistsq >= distsq ) + { + i++; + continue; + } + distsq = newdistsq; + index = i; + i++; + } + return index; } -set_gamemode_var( var, val ) +set_gamemode_var( var, val ) //checked matches cerberus output { - if ( !isdefined( game["gamemode_match"] ) ) - game["gamemode_match"] = []; - - game["gamemode_match"][var] = val; + if ( !isDefined( game[ "gamemode_match" ] ) ) + { + game[ "gamemode_match" ] = []; + } + game[ "gamemode_match" ][ var ] = val; } -set_gamemode_var_once( var, val ) +set_gamemode_var_once( var, val ) //checked matches cerberus output { - if ( !isdefined( game["gamemode_match"] ) ) - game["gamemode_match"] = []; - - if ( !isdefined( game["gamemode_match"][var] ) ) - game["gamemode_match"][var] = val; + if ( !isDefined( game[ "gamemode_match" ] ) ) + { + game[ "gamemode_match" ] = []; + } + if ( !isDefined( game[ "gamemode_match" ][ var ] ) ) + { + game[ "gamemode_match" ][ var ] = val; + } } -set_game_var( var, val ) +set_game_var( var, val ) //checked matches cerberus output { - game[var] = val; + game[ var ] = val; } -set_game_var_once( var, val ) +set_game_var_once( var, val ) //checked matches cerberus output { - if ( !isdefined( game[var] ) ) - game[var] = val; + if ( !isDefined( game[ var ] ) ) + { + game[ var ] = val; + } } -get_game_var( var ) +get_game_var( var ) //checked matches cerberus output { - if ( isdefined( game[var] ) ) - return game[var]; - - return undefined; + if ( isDefined( game[ var ] ) ) + { + return game[ var ]; + } + return undefined; } -get_gamemode_var( var ) +get_gamemode_var( var ) //checked matches cerberus output { - if ( isdefined( game["gamemode_match"] ) && isdefined( game["gamemode_match"][var] ) ) - return game["gamemode_match"][var]; - - return undefined; + if ( isDefined( game[ "gamemode_match" ] ) && isDefined( game[ "gamemode_match" ][ var ] ) ) + { + return game[ "gamemode_match" ][ var ]; + } + return undefined; } -waittill_subset( min_num, string1, string2, string3, string4, string5 ) +waittill_subset( min_num, string1, string2, string3, string4, string5 ) //checked matches cerberus output { - self endon( "death" ); - ent = spawnstruct(); - ent.threads = 0; - returned_threads = 0; + self endon( "death" ); + ent = spawnstruct(); + ent.threads = 0; + returned_threads = 0; + if ( isDefined( string1 ) ) + { + self thread waittill_string( string1, ent ); + ent.threads++; + } + if ( isDefined( string2 ) ) + { + self thread waittill_string( string2, ent ); + ent.threads++; + } + if ( isDefined( string3 ) ) + { + self thread waittill_string( string3, ent ); + ent.threads++; + } + if ( isDefined( string4 ) ) + { + self thread waittill_string( string4, ent ); + ent.threads++; + } + if ( isDefined( string5 ) ) + { + self thread waittill_string( string5, ent ); + ent.threads++; + } + while ( ent.threads ) + { + ent waittill( "returned" ); + ent.threads--; - if ( isdefined( string1 ) ) - { - self thread waittill_string( string1, ent ); - ent.threads++; - } - - if ( isdefined( string2 ) ) - { - self thread waittill_string( string2, ent ); - ent.threads++; - } - - if ( isdefined( string3 ) ) - { - self thread waittill_string( string3, ent ); - ent.threads++; - } - - if ( isdefined( string4 ) ) - { - self thread waittill_string( string4, ent ); - ent.threads++; - } - - if ( isdefined( string5 ) ) - { - self thread waittill_string( string5, ent ); - ent.threads++; - } - - while ( ent.threads ) - { - ent waittill( "returned" ); - - ent.threads--; - returned_threads++; - - if ( returned_threads >= min_num ) - break; - } - - ent notify( "die" ); + returned_threads++; + if ( returned_threads >= min_num ) + { + break; + } + } + ent notify( "die" ); } -is_headshot( sweapon, shitloc, smeansofdeath ) +is_headshot( sweapon, shitloc, smeansofdeath ) //checked changed at own diecretion { - if ( shitloc != "head" && shitloc != "helmet" ) - return 0; - - if ( smeansofdeath == "MOD_IMPACT" && issubstr( sweapon, "knife_ballistic" ) ) - return 1; - - return smeansofdeath != "MOD_MELEE" && smeansofdeath != "MOD_BAYONET" && smeansofdeath != "MOD_IMPACT" && smeansofdeath != "MOD_UNKNOWN"; + if ( shitloc == "head" && shitloc == "helmet" ) + { + return 1; + } + if ( smeansofdeath == "MOD_IMPACT" && issubstr( sweapon, "knife_ballistic" ) && shitloc == "head" ) + { + return 1; + } + if ( smeansofdeath != "MOD_MELEE" && smeansofdeath != "MOD_BAYONET" && smeansofdeath != "MOD_IMPACT" && smeansofdeath != "MOD_UNKNOWN" ) + { + return 0; + } } -is_jumping() +is_jumping() //checked matches cerberus output { - ground_ent = self getgroundent(); - return !isdefined( ground_ent ); + ground_ent = self getgroundent(); + return !isDefined( ground_ent ); } -is_explosive_damage( mod ) +is_explosive_damage( mod ) //checked changed to match cerberus output { - if ( !isdefined( mod ) ) - return false; - - if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" || mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" || mod == "MOD_EXPLOSIVE" ) - return true; - - return false; + if ( !isDefined( mod ) ) + { + return 0; + } + if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" || mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" || mod == "MOD_EXPLOSIVE" ) + { + return 1; + } + return 0; } -sndswitchannouncervox( who ) +sndswitchannouncervox( who ) //checked matches cerberus output { - switch ( who ) - { - case "sam": - game["zmbdialog"]["prefix"] = "vox_zmba_sam"; - level.zmb_laugh_alias = "zmb_laugh_sam"; - level.sndannouncerisrich = 0; - break; - case "richtofen": - game["zmbdialog"]["prefix"] = "vox_zmba"; - level.zmb_laugh_alias = "zmb_laugh_richtofen"; - level.sndannouncerisrich = 1; - break; - } + switch( who ) + { + case "sam": + game[ "zmbdialog" ][ "prefix" ] = "vox_zmba_sam"; + level.zmb_laugh_alias = "zmb_laugh_sam"; + level.sndannouncerisrich = 0; + break; + case "richtofen": + game[ "zmbdialog" ][ "prefix" ] = "vox_zmba"; + level.zmb_laugh_alias = "zmb_laugh_richtofen"; + level.sndannouncerisrich = 1; + break; + } } -do_player_general_vox( category, type, timer, chance ) +do_player_general_vox( category, type, timer, chance ) //checked matches cerberus output { - if ( isdefined( timer ) && isdefined( level.votimer[type] ) && level.votimer[type] > 0 ) - return; - - if ( !isdefined( chance ) ) - chance = maps\mp\zombies\_zm_audio::get_response_chance( type ); - - if ( chance > randomint( 100 ) ) - { - self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( category, type ); - - if ( isdefined( timer ) ) - { - level.votimer[type] = timer; - level thread general_vox_timer( level.votimer[type], type ); - } - } + if ( isDefined( timer ) && isDefined( level.votimer[ type ] ) && level.votimer[ type ] > 0 ) + { + return; + } + if ( !isDefined( chance ) ) + { + chance = maps/mp/zombies/_zm_audio::get_response_chance( type ); + } + if ( chance > randomint( 100 ) ) + { + self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( category, type ); + if ( isDefined( timer ) ) + { + level.votimer[ type ] = timer; + level thread general_vox_timer( level.votimer[ type ], type ); + } + } } -general_vox_timer( timer, type ) +general_vox_timer( timer, type ) //checked matches cerberus output { - level endon( "end_game" ); + level endon( "end_game" ); + /* /# - println( "ZM >> VOX TIMER STARTED FOR " + type + " ( " + timer + ")" ); + println( "ZM >> VOX TIMER STARTED FOR " + type + " ( " + timer + ")" ); #/ - while ( timer > 0 ) - { - wait 1; - timer--; - } + */ + while ( timer > 0 ) + { + wait 1; + timer--; - level.votimer[type] = timer; + } + level.votimer[ type ] = timer; + /* /# - println( "ZM >> VOX TIMER ENDED FOR " + type + " ( " + timer + ")" ); + println( "ZM >> VOX TIMER ENDED FOR " + type + " ( " + timer + ")" ); #/ + */ } -create_vox_timer( type ) +create_vox_timer( type ) //checked matches cerberus output { - level.votimer[type] = 0; + level.votimer[ type ] = 0; } -play_vox_to_player( category, type, force_variant ) +play_vox_to_player( category, type, force_variant ) //checked matches cerberus output { - self thread maps\mp\zombies\_zm_audio::playvoxtoplayer( category, type, force_variant ); + self thread maps/mp/zombies/_zm_audio::playvoxtoplayer( category, type, force_variant ); } is_favorite_weapon( weapon_to_check ) { - if ( !isdefined( self.favorite_wall_weapons_list ) ) - return false; - - foreach ( weapon in self.favorite_wall_weapons_list ) - { - if ( weapon_to_check == weapon ) - return true; - } - - return false; + if ( !isDefined( self.favorite_wall_weapons_list ) ) + { + return 0; + } + foreach ( weapon in self.favorite_wall_weapons_list ) + { + if ( weapon_to_check == weapon ) + { + return 1; + } + } + return 0; } add_vox_response_chance( event, chance ) { - level.response_chances[event] = chance; + level.response_chances[ event ] = chance; } -set_demo_intermission_point() +set_demo_intermission_point() //checked changed to match cerberus output { - spawnpoints = getentarray( "mp_global_intermission", "classname" ); - - if ( !spawnpoints.size ) - return; - - spawnpoint = spawnpoints[0]; - 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; - - for ( i = 0; i < spawnpoints.size; i++ ) - { - if ( isdefined( spawnpoints[i].script_string ) ) - { - tokens = strtok( spawnpoints[i].script_string, " " ); - - foreach ( token in tokens ) - { - if ( token == match_string ) - { - spawnpoint = spawnpoints[i]; - i = spawnpoints.size; - break; - } - } - } - } - - setdemointermissionpoint( spawnpoint.origin, spawnpoint.angles ); + spawnpoints = getentarray( "mp_global_intermission", "classname" ); + if ( !spawnpoints.size ) + { + return; + } + spawnpoint = spawnpoints[ 0 ]; + 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; + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( isDefined( spawnpoints[ i ].script_string ) ) + { + tokens = strtok( spawnpoints[ i ].script_string, " " ); + foreach ( token in tokens ) + { + if ( token == match_string ) + { + spawnpoint = spawnpoints[ i ]; + i = spawnpoints.size; + break; + } + } + } + } + setdemointermissionpoint( spawnpoint.origin, spawnpoint.angles ); } -register_map_navcard( navcard_on_map, navcard_needed_for_computer ) +register_map_navcard( navcard_on_map, navcard_needed_for_computer ) //checked matches cerberus output { - level.navcard_needed = navcard_needed_for_computer; - level.map_navcard = navcard_on_map; + level.navcard_needed = navcard_needed_for_computer; + level.map_navcard = navcard_on_map; } -does_player_have_map_navcard( player ) +does_player_have_map_navcard( player ) //checked matches cerberus output { - return player maps\mp\zombies\_zm_stats::get_global_stat( level.map_navcard ); + return player maps/mp/zombies/_zm_stats::get_global_stat( level.map_navcard ); } -does_player_have_correct_navcard( player ) +does_player_have_correct_navcard( player ) //checked matches cerberus output { - if ( !isdefined( level.navcard_needed ) ) - return 0; - - return player maps\mp\zombies\_zm_stats::get_global_stat( level.navcard_needed ); + if ( !isDefined( level.navcard_needed ) ) + { + return 0; + } + return player maps/mp/zombies/_zm_stats::get_global_stat( level.navcard_needed ); } -place_navcard( str_model, str_stat, org, angles ) +place_navcard( str_model, str_stat, org, angles ) //checked changed to match cerberus output { - navcard = spawn( "script_model", org ); - navcard setmodel( str_model ); - navcard.angles = angles; - wait 1; - navcard_pickup_trig = spawn( "trigger_radius_use", org, 0, 84, 72 ); - navcard_pickup_trig setcursorhint( "HINT_NOICON" ); - navcard_pickup_trig sethintstring( &"ZOMBIE_NAVCARD_PICKUP" ); - navcard_pickup_trig triggerignoreteam(); - a_navcard_stats = array( "navcard_held_zm_transit", "navcard_held_zm_highrise", "navcard_held_zm_buried" ); - is_holding_card = 0; - str_placing_stat = undefined; - - while ( true ) - { - navcard_pickup_trig waittill( "trigger", who ); - - if ( is_player_valid( who ) ) - { - foreach ( str_cur_stat in a_navcard_stats ) - { - if ( who maps\mp\zombies\_zm_stats::get_global_stat( str_cur_stat ) ) - { - str_placing_stat = str_cur_stat; - is_holding_card = 1; - who maps\mp\zombies\_zm_stats::set_global_stat( str_cur_stat, 0 ); - } - } - - who playsound( "zmb_buildable_piece_add" ); - who maps\mp\zombies\_zm_stats::set_global_stat( str_stat, 1 ); - who.navcard_grabbed = str_stat; - wait_network_frame(); - is_stat = who maps\mp\zombies\_zm_stats::get_global_stat( str_stat ); - thread sq_refresh_player_navcard_hud(); - break; - } - } - - navcard delete(); - navcard_pickup_trig delete(); - - if ( is_holding_card ) - level thread place_navcard( str_model, str_placing_stat, org, angles ); + navcard = spawn( "script_model", org ); + navcard setmodel( str_model ); + navcard.angles = angles; + wait 1; + navcard_pickup_trig = spawn( "trigger_radius_use", org, 0, 84, 72 ); + navcard_pickup_trig setcursorhint( "HINT_NOICON" ); + navcard_pickup_trig sethintstring( &"ZOMBIE_NAVCARD_PICKUP" ); + navcard_pickup_trig triggerignoreteam(); + a_navcard_stats = array( "navcard_held_zm_transit", "navcard_held_zm_highrise", "navcard_held_zm_buried" ); + is_holding_card = 0; + str_placing_stat = undefined; + while ( 1 ) + { + navcard_pickup_trig waittill( "trigger", who ); + if ( is_player_valid( who ) ) + { + foreach ( str_cur_stat in a_navcard_stats ) + { + if ( who maps/mp/zombies/_zm_stats::get_global_stat( str_cur_stat ) ) + { + str_placing_stat = str_cur_stat; + is_holding_card = 1; + who maps/mp/zombies/_zm_stats::set_global_stat( str_cur_stat, 0 ); + } + } + who playsound( "zmb_buildable_piece_add" ); + who maps/mp/zombies/_zm_stats::set_global_stat( str_stat, 1 ); + who.navcard_grabbed = str_stat; + wait_network_frame(); + is_stat = who maps/mp/zombies/_zm_stats::get_global_stat( str_stat ); + thread sq_refresh_player_navcard_hud(); + break; + } + } + navcard delete(); + navcard_pickup_trig delete(); + if ( is_holding_card ) + { + level thread place_navcard( str_model, str_placing_stat, org, angles ); + } } -sq_refresh_player_navcard_hud() +sq_refresh_player_navcard_hud() //checked changed to match cerberus output { - if ( !isdefined( level.navcards ) ) - return; - - players = get_players(); - - foreach ( player in players ) - player thread sq_refresh_player_navcard_hud_internal(); + if ( !isDefined( level.navcards ) ) + { + return; + } + players = get_players(); + foreach ( player in players ) + { + player thread sq_refresh_player_navcard_hud_internal(); + } } -sq_refresh_player_navcard_hud_internal() +sq_refresh_player_navcard_hud_internal() //checked changed to match cerberus output { - self endon( "disconnect" ); - navcard_bits = 0; - - for ( i = 0; i < level.navcards.size; i++ ) - { - hasit = self maps\mp\zombies\_zm_stats::get_global_stat( level.navcards[i] ); - - if ( isdefined( self.navcard_grabbed ) && self.navcard_grabbed == level.navcards[i] ) - hasit = 1; - - if ( hasit ) - navcard_bits += ( 1 << i ); - } - - wait_network_frame(); - self setclientfield( "navcard_held", 0 ); - - if ( navcard_bits > 0 ) - { - wait_network_frame(); - self setclientfield( "navcard_held", navcard_bits ); - } + self endon( "disconnect" ); + navcard_bits = 0; + for ( i = 0; i < level.navcards.size; i++ ) + { + hasit = self maps/mp/zombies/_zm_stats::get_global_stat( level.navcards[ i ] ); + if ( isDefined( self.navcard_grabbed ) && self.navcard_grabbed == level.navcards[ i ] ) + { + hasit = 1; + } + if ( hasit ) + { + navcard_bits += 1; + } + } + wait_network_frame(); + self setclientfield( "navcard_held", 0 ); + if ( navcard_bits > 0 ) + { + wait_network_frame(); + self setclientfield( "navcard_held", navcard_bits ); + } } -set_player_is_female( onoff ) +set_player_is_female( onoff ) //checked matches cerberus output { - if ( isdefined( level.use_female_animations ) && level.use_female_animations ) - { - female_perk = "specialty_gpsjammer"; - - if ( onoff ) - self setperk( female_perk ); - else - self unsetperk( female_perk ); - } + if ( is_true( level.use_female_animations ) ) + { + female_perk = "specialty_gpsjammer"; + if ( onoff ) + { + self setperk( female_perk ); + return; + } + else + { + self unsetperk( female_perk ); + } + } } -disable_player_move_states( forcestancechange ) +disable_player_move_states( forcestancechange ) //checked matches cerberus output { - self allowcrouch( 1 ); - self allowlean( 0 ); - self allowads( 0 ); - self allowsprint( 0 ); - self allowprone( 0 ); - self allowmelee( 0 ); - - if ( isdefined( forcestancechange ) && forcestancechange == 1 ) - { - if ( self getstance() == "prone" ) - self setstance( "crouch" ); - } + self allowcrouch( 1 ); + self allowlean( 0 ); + self allowads( 0 ); + self allowsprint( 0 ); + self allowprone( 0 ); + self allowmelee( 0 ); + if ( isDefined( forcestancechange ) && forcestancechange == 1 ) + { + if ( self getstance() == "prone" ) + { + self setstance( "crouch" ); + } + } } -enable_player_move_states() +enable_player_move_states() //checked matches cerberus output { - if ( !isdefined( self._allow_lean ) || self._allow_lean == 1 ) - self allowlean( 1 ); - - if ( !isdefined( self._allow_ads ) || self._allow_ads == 1 ) - self allowads( 1 ); - - if ( !isdefined( self._allow_sprint ) || self._allow_sprint == 1 ) - self allowsprint( 1 ); - - if ( !isdefined( self._allow_prone ) || self._allow_prone == 1 ) - self allowprone( 1 ); - - if ( !isdefined( self._allow_melee ) || self._allow_melee == 1 ) - self allowmelee( 1 ); + if ( !isDefined( self._allow_lean ) || self._allow_lean == 1 ) + { + self allowlean( 1 ); + } + if ( !isDefined( self._allow_ads ) || self._allow_ads == 1 ) + { + self allowads( 1 ); + } + if ( !isDefined( self._allow_sprint ) || self._allow_sprint == 1 ) + { + self allowsprint( 1 ); + } + if ( !isDefined( self._allow_prone ) || self._allow_prone == 1 ) + { + self allowprone( 1 ); + } + if ( !isDefined( self._allow_melee ) || self._allow_melee == 1 ) + { + self allowmelee( 1 ); + } } -check_and_create_node_lists() +check_and_create_node_lists() //checked matches cerberus output { - if ( !isdefined( level._link_node_list ) ) - level._link_node_list = []; - - if ( !isdefined( level._unlink_node_list ) ) - level._unlink_node_list = []; + if ( !isDefined( level._link_node_list ) ) + { + level._link_node_list = []; + } + if ( !isDefined( level._unlink_node_list ) ) + { + level._unlink_node_list = []; + } } -link_nodes( a, b, bdontunlinkonmigrate ) +link_nodes( a, b, bdontunlinkonmigrate ) //checked changed to match cerberus output { - if ( !isdefined( bdontunlinkonmigrate ) ) - bdontunlinkonmigrate = 0; - - if ( nodesarelinked( a, b ) ) - return; - - check_and_create_node_lists(); - a_index_string = "" + a.origin; - b_index_string = "" + b.origin; - - if ( !isdefined( level._link_node_list[a_index_string] ) ) - { - level._link_node_list[a_index_string] = spawnstruct(); - level._link_node_list[a_index_string].node = a; - level._link_node_list[a_index_string].links = []; - level._link_node_list[a_index_string].ignore_on_migrate = []; - } - - if ( !isdefined( level._link_node_list[a_index_string].links[b_index_string] ) ) - { - level._link_node_list[a_index_string].links[b_index_string] = b; - level._link_node_list[a_index_string].ignore_on_migrate[b_index_string] = bdontunlinkonmigrate; - } - - if ( isdefined( level._unlink_node_list[a_index_string] ) ) - { - if ( isdefined( level._unlink_node_list[a_index_string].links[b_index_string] ) ) - { - level._unlink_node_list[a_index_string].links[b_index_string] = undefined; - level._unlink_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined; - } - } - - linknodes( a, b ); + if ( !isDefined( bdontunlinkonmigrate ) ) + { + bdontunlinkonmigrate = 0; + } + if ( nodesarelinked( a, b ) ) + { + return; + } + check_and_create_node_lists(); + a_index_string = "" + a.origin; + b_index_string = "" + b.origin; + if ( !isDefined( level._link_node_list[ a_index_string ] ) ) + { + level._link_node_list[ a_index_string ] = spawnstruct(); + level._link_node_list[ a_index_string ].node = a; + level._link_node_list[ a_index_string ].links = []; + level._link_node_list[ a_index_string ].ignore_on_migrate = []; + } + if ( !isDefined( level._link_node_list[ a_index_string ].links[ b_index_string ] ) ) + { + level._link_node_list[ a_index_string ].links[ b_index_string ] = b; + level._link_node_list[ a_index_string ].ignore_on_migrate[ b_index_string ] = bdontunlinkonmigrate; + } + if ( isDefined( level._unlink_node_list[ a_index_string ] ) ) + { + if ( isDefined( level._unlink_node_list[ a_index_string ].links[ b_index_string ] ) ) + { + level._unlink_node_list[a_index_string].links[b_index_string] = undefined; + level._unlink_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined; + } + } + linknodes( a, b ); } -unlink_nodes( a, b, bdontlinkonmigrate ) +unlink_nodes( a, b, bdontlinkonmigrate ) //checked changed to match cerberus output { - if ( !isdefined( bdontlinkonmigrate ) ) - bdontlinkonmigrate = 0; - - if ( !nodesarelinked( a, b ) ) - return; - - check_and_create_node_lists(); - a_index_string = "" + a.origin; - b_index_string = "" + b.origin; - - if ( !isdefined( level._unlink_node_list[a_index_string] ) ) - { - level._unlink_node_list[a_index_string] = spawnstruct(); - level._unlink_node_list[a_index_string].node = a; - level._unlink_node_list[a_index_string].links = []; - level._unlink_node_list[a_index_string].ignore_on_migrate = []; - } - - if ( !isdefined( level._unlink_node_list[a_index_string].links[b_index_string] ) ) - { - level._unlink_node_list[a_index_string].links[b_index_string] = b; - level._unlink_node_list[a_index_string].ignore_on_migrate[b_index_string] = bdontlinkonmigrate; - } - - if ( isdefined( level._link_node_list[a_index_string] ) ) - { - if ( isdefined( level._link_node_list[a_index_string].links[b_index_string] ) ) - { - level._link_node_list[a_index_string].links[b_index_string] = undefined; - level._link_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined; - } - } - - unlinknodes( a, b ); + if ( !isDefined( bdontlinkonmigrate ) ) + { + bdontlinkonmigrate = 0; + } + if ( !nodesarelinked( a, b ) ) + { + return; + } + check_and_create_node_lists(); + a_index_string = "" + a.origin; + b_index_string = "" + b.origin; + if ( !isDefined( level._unlink_node_list[ a_index_string ] ) ) + { + level._unlink_node_list[ a_index_string ] = spawnstruct(); + level._unlink_node_list[ a_index_string ].node = a; + level._unlink_node_list[ a_index_string ].links = []; + level._unlink_node_list[ a_index_string ].ignore_on_migrate = []; + } + if ( !isDefined( level._unlink_node_list[ a_index_string ].links[ b_index_string ] ) ) + { + level._unlink_node_list[ a_index_string ].links[ b_index_string ] = b; + level._unlink_node_list[ a_index_string ].ignore_on_migrate[ b_index_string ] = bdontlinkonmigrate; + } + if ( isDefined( level._link_node_list[ a_index_string ] ) ) + { + if ( isDefined( level._link_node_list[ a_index_string ].links[ b_index_string ] ) ) + { + level._link_node_list[a_index_string].links[b_index_string] = undefined; + level._link_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined; + } + } + unlinknodes( a, b ); } -spawn_path_node( origin, angles, k1, v1, k2, v2 ) +spawn_path_node( origin, angles, k1, v1, k2, v2 ) //checked matches cerberus output { - if ( !isdefined( level._spawned_path_nodes ) ) - level._spawned_path_nodes = []; - - node = spawnstruct(); - node.origin = origin; - node.angles = angles; - node.k1 = k1; - node.v1 = v1; - node.k2 = k2; - node.v2 = v2; - node.node = spawn_path_node_internal( origin, angles, k1, v1, k2, v2 ); - level._spawned_path_nodes[level._spawned_path_nodes.size] = node; - return node.node; + if ( !isDefined( level._spawned_path_nodes ) ) + { + level._spawned_path_nodes = []; + } + node = spawnstruct(); + node.origin = origin; + node.angles = angles; + node.k1 = k1; + node.v1 = v1; + node.k2 = k2; + node.v2 = v2; + node.node = spawn_path_node_internal( origin, angles, k1, v1, k2, v2 ); + level._spawned_path_nodes[ level._spawned_path_nodes.size ] = node; + return node.node; } -spawn_path_node_internal( origin, angles, k1, v1, k2, v2 ) +spawn_path_node_internal( origin, angles, k1, v1, k2, v2 ) //checked matches cerberus output { - if ( isdefined( k2 ) ) - return spawnpathnode( "node_pathnode", origin, angles, k1, v1, k2, v2 ); - else if ( isdefined( k1 ) ) - return spawnpathnode( "node_pathnode", origin, angles, k1, v1 ); - else - return spawnpathnode( "node_pathnode", origin, angles ); - - return undefined; + if ( isDefined( k2 ) ) + { + return spawnpathnode( "node_pathnode", origin, angles, k1, v1, k2, v2 ); + } + else if ( isDefined( k1 ) ) + { + return spawnpathnode( "node_pathnode", origin, angles, k1, v1 ); + } + else + { + return spawnpathnode( "node_pathnode", origin, angles ); + } + return undefined; } -delete_spawned_path_nodes() +delete_spawned_path_nodes() //checked matches cerberus output { - } -respawn_path_nodes() +respawn_path_nodes() //checked changed to match cerberus output { - if ( !isdefined( level._spawned_path_nodes ) ) - return; - - for ( i = 0; i < level._spawned_path_nodes.size; i++ ) - { - node_struct = level._spawned_path_nodes[i]; + if ( !isDefined( level._spawned_path_nodes ) ) + { + return; + } + for ( i = 0; i < level._spawned_path_nodes.size; i++ ) + { + node_struct = level._spawned_path_nodes[ i ]; + /* /# - println( "Re-spawning spawned path node @ " + node_struct.origin ); + println( "Re-spawning spawned path node @ " + node_struct.origin ); #/ - node_struct.node = spawn_path_node_internal( node_struct.origin, node_struct.angles, node_struct.k1, node_struct.v1, node_struct.k2, node_struct.v2 ); - } + */ + node_struct.node = spawn_path_node_internal( node_struct.origin, node_struct.angles, node_struct.k1, node_struct.v1, node_struct.k2, node_struct.v2 ); + } } -link_changes_internal_internal( list, func ) +link_changes_internal_internal( list, func ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { - keys = getarraykeys( list ); - - for ( i = 0; i < keys.size; i++ ) - { - node = list[keys[i]].node; - node_keys = getarraykeys( list[keys[i]].links ); - - for ( j = 0; j < node_keys.size; j++ ) - { - if ( isdefined( list[keys[i]].links[node_keys[j]] ) ) - { - if ( isdefined( list[keys[i]].ignore_on_migrate[node_keys[j]] ) && list[keys[i]].ignore_on_migrate[node_keys[j]] ) - { + keys = getarraykeys( list ); + for ( i = 0; i < keys.size; i++ ) + { + node = list[ keys[ i ] ].node; + node_keys = getarraykeys( list[ keys[ i ] ].links ); + j = 0; + while ( j < node_keys.size ) + { + if ( isDefined( list[ keys[ i ] ].links[ node_keys[ j ] ] ) ) + { + if ( isDefined( list[ keys[ i ] ].ignore_on_migrate[ node_keys[ j ] ] ) && list[ keys[ i ] ].ignore_on_migrate[ node_keys[ j ] ] ) + { + /* /# - println( "Node at " + keys[i] + " to node at " + node_keys[j] + " - IGNORED" ); + println( "Node at " + keys[ i ] + " to node at " + node_keys[ j ] + " - IGNORED" ); #/ - continue; - } + */ + j++; + continue; + } + /* /# - println( "Node at " + keys[i] + " to node at " + node_keys[j] ); + println( "Node at " + keys[ i ] + " to node at " + node_keys[ j ] ); #/ - [[ func ]]( node, list[keys[i]].links[node_keys[j]] ); - } - } - } + */ + [[ func ]]( node, list[ keys[ i ] ].links[ node_keys[ j ] ] ); + } + j++; + } + } } -link_changes_internal( func_for_link_list, func_for_unlink_list ) +link_changes_internal( func_for_link_list, func_for_unlink_list ) //checked matches cerberus output { - if ( isdefined( level._link_node_list ) ) - { + if ( isDefined( level._link_node_list ) ) + { + /* /# - println( "Link List" ); + println( "Link List" ); #/ - link_changes_internal_internal( level._link_node_list, func_for_link_list ); - } - - if ( isdefined( level._unlink_node_list ) ) - { + */ + link_changes_internal_internal( level._link_node_list, func_for_link_list ); + } + if ( isDefined( level._unlink_node_list ) ) + { + /* /# - println( "UnLink List" ); + println( "UnLink List" ); #/ - link_changes_internal_internal( level._unlink_node_list, func_for_unlink_list ); - } + */ + link_changes_internal_internal( level._unlink_node_list, func_for_unlink_list ); + } } -link_nodes_wrapper( a, b ) +link_nodes_wrapper( a, b ) //checked matches cerberus output { - if ( !nodesarelinked( a, b ) ) - linknodes( a, b ); + if ( !nodesarelinked( a, b ) ) + { + linknodes( a, b ); + } } -unlink_nodes_wrapper( a, b ) +unlink_nodes_wrapper( a, b ) //checked matches cerberus output { - if ( nodesarelinked( a, b ) ) - unlinknodes( a, b ); + if ( nodesarelinked( a, b ) ) + { + unlinknodes( a, b ); + } } -undo_link_changes() +undo_link_changes() //checked matches cerberus output { + /* /# - println( "***" ); - println( "***" ); - println( "*** Undoing link changes" ); + println( "***" ); + println( "***" ); + println( "*** Undoing link changes" ); #/ - link_changes_internal( ::unlink_nodes_wrapper, ::link_nodes_wrapper ); - delete_spawned_path_nodes(); + */ + link_changes_internal( ::unlink_nodes_wrapper, ::link_nodes_wrapper ); + delete_spawned_path_nodes(); } -redo_link_changes() +redo_link_changes() //checked matches cerberus output { + /* /# - println( "***" ); - println( "***" ); - println( "*** Redoing link changes" ); + println( "***" ); + println( "***" ); + println( "*** Redoing link changes" ); #/ - respawn_path_nodes(); - link_changes_internal( ::link_nodes_wrapper, ::unlink_nodes_wrapper ); + */ + respawn_path_nodes(); + link_changes_internal( ::link_nodes_wrapper, ::unlink_nodes_wrapper ); } -set_player_tombstone_index() +set_player_tombstone_index() //checked matches cerberus output { - if ( !isdefined( level.tombstone_index ) ) - level.tombstone_index = 0; - - if ( !isdefined( self.tombstone_index ) ) - { - self.tombstone_index = level.tombstone_index; - level.tombstone_index++; - } + if ( !isDefined( level.tombstone_index ) ) + { + level.tombstone_index = 0; + } + if ( !isDefined( self.tombstone_index ) ) + { + self.tombstone_index = level.tombstone_index; + level.tombstone_index++; + } } -hotjoin_setup_player( viewmodel ) +hotjoin_setup_player( viewmodel ) //checked matches cerberus output { - if ( is_true( level.passed_introscreen ) && !isdefined( self.first_spawn ) && !isdefined( self.characterindex ) ) - { - self.first_spawn = 1; - self setviewmodel( viewmodel ); - return true; - } - - return false; + if ( is_true( level.passed_introscreen ) && !isDefined( self.first_spawn ) && !isDefined( self.characterindex ) ) + { + self.first_spawn = 1; + self setviewmodel( viewmodel ); + return 1; + } + return 0; } -is_temporary_zombie_weapon( str_weapon ) +is_temporary_zombie_weapon( str_weapon ) //checked changed at own discretion { - return is_zombie_perk_bottle( str_weapon ) || str_weapon == level.revive_tool || str_weapon == "zombie_builder_zm" || str_weapon == "chalk_draw_zm" || str_weapon == "no_hands_zm" || str_weapon == level.machine_assets["packapunch"].weapon; + if ( is_zombie_perk_bottle(str_weapon) || str_weapon == level.revive_tool || str_weapon == "zombie_builder_zm" || str_weapon == "chalk_draw_zm" || str_weapon == "no_hands_zm" || str_weapon == level.machine_assets["packapunch"].weapon ) + { + return 1; + } + return 0; } -is_gametype_active( a_gametypes ) +is_gametype_active( a_gametypes ) //checked changed to match cerberus output { - b_is_gametype_active = 0; - - if ( !isarray( a_gametypes ) ) - a_gametypes = array( a_gametypes ); - - for ( i = 0; i < a_gametypes.size; i++ ) - { - if ( getdvar( "g_gametype" ) == a_gametypes[i] ) - b_is_gametype_active = 1; - } - - return b_is_gametype_active; + b_is_gametype_active = 0; + if ( !isarray( a_gametypes ) ) + { + a_gametypes = array( a_gametypes ); + } + for ( i = 0; i < a_gametypes.size; i++ ) + { + if ( getDvar( "g_gametype" ) == a_gametypes[ i ] ) + { + b_is_gametype_active = 1; + } + } + return b_is_gametype_active; } -is_createfx_active() +is_createfx_active() //checked changed at own discretion { - if ( !isdefined( level.createfx_enabled ) ) - level.createfx_enabled = getdvar( "createfx" ) != ""; - - return level.createfx_enabled; + if ( !isDefined( level.createfx_enabled ) ) + { + level.createfx_enabled = getDvar( "createfx" ); + } + return level.createfx_enabled; } -is_zombie_perk_bottle( str_weapon ) +is_zombie_perk_bottle( str_weapon ) //checked matches cerberus output { - switch ( str_weapon ) - { - case "zombie_perk_bottle_whoswho": - case "zombie_perk_bottle_vulture": - case "zombie_perk_bottle_tombstone": - case "zombie_perk_bottle_sleight": - case "zombie_perk_bottle_sixth_sense": - case "zombie_perk_bottle_revive": - case "zombie_perk_bottle_oneinch": - case "zombie_perk_bottle_nuke": - case "zombie_perk_bottle_marathon": - case "zombie_perk_bottle_jugg": - case "zombie_perk_bottle_doubletap": - case "zombie_perk_bottle_deadshot": - case "zombie_perk_bottle_cherry": - case "zombie_perk_bottle_additionalprimaryweapon": - b_is_perk_bottle = 1; - break; - default: - b_is_perk_bottle = 0; - break; - } - - return b_is_perk_bottle; + switch( str_weapon ) + { + case "zombie_perk_bottle_additionalprimaryweapon": + case "zombie_perk_bottle_cherry": + case "zombie_perk_bottle_deadshot": + case "zombie_perk_bottle_doubletap": + case "zombie_perk_bottle_jugg": + case "zombie_perk_bottle_marathon": + case "zombie_perk_bottle_nuke": + case "zombie_perk_bottle_oneinch": + case "zombie_perk_bottle_revive": + case "zombie_perk_bottle_sixth_sense": + case "zombie_perk_bottle_sleight": + case "zombie_perk_bottle_tombstone": + case "zombie_perk_bottle_vulture": + case "zombie_perk_bottle_whoswho": + b_is_perk_bottle = 1; + break; + default: + b_is_perk_bottle = 0; + break; + } + return b_is_perk_bottle; } -register_custom_spawner_entry( spot_noteworthy, func ) +register_custom_spawner_entry( spot_noteworthy, func ) //checked matches cerberus output { - if ( !isdefined( level.custom_spawner_entry ) ) - level.custom_spawner_entry = []; - - level.custom_spawner_entry[spot_noteworthy] = func; + if ( !isDefined( level.custom_spawner_entry ) ) + { + level.custom_spawner_entry = []; + } + level.custom_spawner_entry[ spot_noteworthy ] = func; } -get_player_weapon_limit( player ) +get_player_weapon_limit( player ) //checked matches cerberus output { - if ( isdefined( level.get_player_weapon_limit ) ) - return [[ level.get_player_weapon_limit ]]( player ); - - weapon_limit = 2; - - if ( player hasperk( "specialty_additionalprimaryweapon" ) ) - weapon_limit = level.additionalprimaryweapon_limit; - - return weapon_limit; + if ( isDefined( level.get_player_weapon_limit ) ) + { + return [[ level.get_player_weapon_limit ]]( player ); + } + weapon_limit = 2; + if ( player hasperk( "specialty_additionalprimaryweapon" ) ) + { + weapon_limit = level.additionalprimaryweapon_limit; + } + return weapon_limit; } -get_player_perk_purchase_limit() +get_player_perk_purchase_limit() //checked matches cerberus output { - if ( isdefined( level.get_player_perk_purchase_limit ) ) - return self [[ level.get_player_perk_purchase_limit ]](); - - return level.perk_purchase_limit; + if ( isDefined( level.get_player_perk_purchase_limit ) ) + { + return self [[ level.get_player_perk_purchase_limit ]](); + } + return level.perk_purchase_limit; } + + + + + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc index 9cbde27..10ad76c 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_weap_cymbal_monkey.gsc @@ -1,559 +1,568 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_laststand; -#include maps\mp\zombies\_zm_clone; +#include maps/mp/zombies/_zm_clone; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; -init() +//#using_animtree( "zombie_cymbal_monkey" ); + +init() //checked matches cerberus output { - if ( !cymbal_monkey_exists() ) - return; + if ( !cymbal_monkey_exists() ) + { + return; + } + /* /# - level.zombiemode_devgui_cymbal_monkey_give = ::player_give_cymbal_monkey; + level.zombiemode_devgui_cymbal_monkey_give = ::player_give_cymbal_monkey; #/ - if ( isdefined( level.legacy_cymbal_monkey ) && level.legacy_cymbal_monkey ) - level.cymbal_monkey_model = "weapon_zombie_monkey_bomb"; - else - level.cymbal_monkey_model = "t6_wpn_zmb_monkey_bomb_world"; - - level._effect["monkey_glow"] = loadfx( "maps/zombie/fx_zombie_monkey_light" ); - level._effect["grenade_samantha_steal"] = loadfx( "maps/zombie/fx_zmb_blackhole_trap_end" ); - level.cymbal_monkeys = []; - scriptmodelsuseanimtree( -1 ); + */ + if ( is_true( level.legacy_cymbal_monkey ) ) + { + level.cymbal_monkey_model = "weapon_zombie_monkey_bomb"; + } + else + { + level.cymbal_monkey_model = "t6_wpn_zmb_monkey_bomb_world"; + } + level._effect[ "monkey_glow" ] = loadfx( "maps/zombie/fx_zombie_monkey_light" ); + level._effect[ "grenade_samantha_steal" ] = loadfx( "maps/zombie/fx_zmb_blackhole_trap_end" ); + level.cymbal_monkeys = []; + scriptmodelsuseanimtree( -1 ); } -player_give_cymbal_monkey() +player_give_cymbal_monkey() //checked matches cerberus output { - self giveweapon( "cymbal_monkey_zm" ); - self set_player_tactical_grenade( "cymbal_monkey_zm" ); - self thread player_handle_cymbal_monkey(); + self giveweapon( "cymbal_monkey_zm" ); + self set_player_tactical_grenade( "cymbal_monkey_zm" ); + self thread player_handle_cymbal_monkey(); } -player_handle_cymbal_monkey() +player_handle_cymbal_monkey() //checked matches cerberus output { - self notify( "starting_monkey_watch" ); - self endon( "disconnect" ); - self endon( "starting_monkey_watch" ); - attract_dist_diff = level.monkey_attract_dist_diff; - - if ( !isdefined( attract_dist_diff ) ) - attract_dist_diff = 45; - - num_attractors = level.num_monkey_attractors; - - if ( !isdefined( num_attractors ) ) - num_attractors = 96; - - max_attract_dist = level.monkey_attract_dist; - - if ( !isdefined( max_attract_dist ) ) - max_attract_dist = 1536; - - while ( true ) - { - grenade = get_thrown_monkey(); - self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff ); - wait 0.05; - } + self notify( "starting_monkey_watch" ); + self endon( "disconnect" ); + self endon( "starting_monkey_watch" ); + attract_dist_diff = level.monkey_attract_dist_diff; + if ( !isDefined( attract_dist_diff ) ) + { + attract_dist_diff = 45; + } + num_attractors = level.num_monkey_attractors; + if ( !isDefined( num_attractors ) ) + { + num_attractors = 96; + } + max_attract_dist = level.monkey_attract_dist; + if ( !isDefined( max_attract_dist ) ) + { + max_attract_dist = 1536; + } + while ( 1 ) + { + grenade = get_thrown_monkey(); + self player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff ); + wait 0.05; + } } -watch_for_dud( model, actor ) +watch_for_dud( model, actor ) //checked matches cerberus output { - self endon( "death" ); - - self waittill( "grenade_dud" ); - - model.dud = 1; - self playsound( "zmb_vox_monkey_scream" ); - self.monk_scream_vox = 1; - wait 3; - - if ( isdefined( model ) ) - model delete(); - - if ( isdefined( actor ) ) - actor delete(); - - if ( isdefined( self.damagearea ) ) - self.damagearea delete(); - - if ( isdefined( self ) ) - self delete(); + self endon( "death" ); + self waittill( "grenade_dud" ); + model.dud = 1; + self playsound( "zmb_vox_monkey_scream" ); + self.monk_scream_vox = 1; + wait 3; + if ( isDefined( model ) ) + { + model delete(); + } + if ( isDefined( actor ) ) + { + actor delete(); + } + if ( isDefined( self.damagearea ) ) + { + self.damagearea delete(); + } + if ( isDefined( self ) ) + { + self delete(); + } } -#using_animtree("zombie_cymbal_monkey"); - -watch_for_emp( model, actor ) +watch_for_emp( model, actor ) //checked changed to match cerberus output { - self endon( "death" ); - - if ( !should_watch_for_emp() ) - return; - - while ( true ) - { - level waittill( "emp_detonate", origin, radius ); - - if ( distancesquared( origin, self.origin ) < radius * radius ) - break; - } - - self.stun_fx = 1; - - if ( isdefined( level._equipment_emp_destroy_fx ) ) - playfx( level._equipment_emp_destroy_fx, self.origin + vectorscale( ( 0, 0, 1 ), 5.0 ), ( 0, randomfloat( 360 ), 0 ) ); - - wait 0.15; - self.attract_to_origin = 0; - self deactivate_zombie_point_of_interest(); - model clearanim( %o_monkey_bomb, 0 ); - wait 1; - self detonate(); - wait 1; - - if ( isdefined( model ) ) - model delete(); - - if ( isdefined( actor ) ) - actor delete(); - - if ( isdefined( self.damagearea ) ) - self.damagearea delete(); - - if ( isdefined( self ) ) - self delete(); + self endon( "death" ); + if ( !should_watch_for_emp() ) + { + return; + } + while ( 1 ) + { + level waittill( "emp_detonate", origin, radius ); + if ( distancesquared( origin, self.origin ) < radius * radius ) + { + break; + } + } + self.stun_fx = 1; + if ( isDefined( level._equipment_emp_destroy_fx ) ) + { + playfx( level._equipment_emp_destroy_fx, self.origin + vectorScale( ( 0, 0, 1 ), 5 ), ( 0, randomfloat( 360 ), 0 ) ); + } + wait 0.15; + self.attract_to_origin = 0; + self deactivate_zombie_point_of_interest(); + model clearanim( %o_monkey_bomb, 0 ); + wait 1; + self detonate(); + wait 1; + if ( isDefined( model ) ) + { + model delete(); + } + if ( isDefined( actor ) ) + { + actor delete(); + } + if ( isDefined( self.damagearea ) ) + { + self.damagearea delete(); + } + if ( isDefined( self ) ) + { + self delete(); + } } -clone_player_angles( owner ) +clone_player_angles( owner ) //checked matches cerberus output { - self endon( "death" ); - owner endon( "death" ); - - while ( isdefined( self ) ) - { - self.angles = owner.angles; - wait 0.05; - } + self endon( "death" ); + owner endon( "death" ); + while ( isDefined( self ) ) + { + self.angles = owner.angles; + wait 0.05; + } } -show_briefly( showtime ) +show_briefly( showtime ) //checked matches cerberus output { - self endon( "show_owner" ); - - if ( isdefined( self.show_for_time ) ) - { - self.show_for_time = showtime; - return; - } - - self.show_for_time = showtime; - self setvisibletoall(); - - while ( self.show_for_time > 0 ) - { - self.show_for_time -= 0.05; - wait 0.05; - } - - self setvisibletoallexceptteam( level.zombie_team ); - self.show_for_time = undefined; + self endon( "show_owner" ); + if ( isDefined( self.show_for_time ) ) + { + self.show_for_time = showtime; + return; + } + self.show_for_time = showtime; + self setvisibletoall(); + while ( self.show_for_time > 0 ) + { + self.show_for_time -= 0.05; + wait 0.05; + } + self setvisibletoallexceptteam( level.zombie_team ); + self.show_for_time = undefined; } -show_owner_on_attack( owner ) +show_owner_on_attack( owner ) //checked matches cerberus output { - owner endon( "hide_owner" ); - owner endon( "show_owner" ); - self endon( "explode" ); - self endon( "death" ); - self endon( "grenade_dud" ); - owner.show_for_time = undefined; - - for (;;) - { - owner waittill( "weapon_fired" ); - - owner thread show_briefly( 0.5 ); - } + owner endon( "hide_owner" ); + owner endon( "show_owner" ); + self endon( "explode" ); + self endon( "death" ); + self endon( "grenade_dud" ); + owner.show_for_time = undefined; + for ( ;; ) + { + owner waittill( "weapon_fired" ); + owner thread show_briefly( 0.5 ); + } } -hide_owner( owner ) +hide_owner( owner ) //checked matches cerberus output { - owner notify( "hide_owner" ); - owner endon( "hide_owner" ); - owner setperk( "specialty_immunemms" ); - owner.no_burning_sfx = 1; - owner notify( "stop_flame_sounds" ); - owner setvisibletoallexceptteam( level.zombie_team ); - owner.hide_owner = 1; - - if ( isdefined( level._effect["human_disappears"] ) ) - playfx( level._effect["human_disappears"], owner.origin ); - - self thread show_owner_on_attack( owner ); - evt = self waittill_any_return( "explode", "death", "grenade_dud" ); + owner notify( "hide_owner" ); + owner endon( "hide_owner" ); + owner setperk( "specialty_immunemms" ); + owner.no_burning_sfx = 1; + owner notify( "stop_flame_sounds" ); + owner setvisibletoallexceptteam( level.zombie_team ); + owner.hide_owner = 1; + if ( isDefined( level._effect[ "human_disappears" ] ) ) + { + playfx( level._effect[ "human_disappears" ], owner.origin ); + } + self thread show_owner_on_attack( owner ); + evt = self waittill_any_return( "explode", "death", "grenade_dud" ); + /* /# - println( "ZMCLONE: Player visible again because of " + evt ); + println( "ZMCLONE: Player visible again because of " + evt ); #/ - owner notify( "show_owner" ); - owner unsetperk( "specialty_immunemms" ); - - if ( isdefined( level._effect["human_disappears"] ) ) - playfx( level._effect["human_disappears"], owner.origin ); - - owner.no_burning_sfx = undefined; - owner setvisibletoall(); - owner.hide_owner = undefined; - owner show(); + */ + owner notify( "show_owner" ); + owner unsetperk( "specialty_immunemms" ); + if ( isDefined( level._effect[ "human_disappears" ] ) ) + { + playfx( level._effect[ "human_disappears" ], owner.origin ); + } + owner.no_burning_sfx = undefined; + owner setvisibletoall(); + owner.hide_owner = undefined; + owner show(); } -proximity_detonate( owner ) +proximity_detonate( owner ) //checked changed to match cerberus output { - wait 1.5; - - if ( !isdefined( self ) ) - return; - - detonateradius = 96; - explosionradius = detonateradius * 2; - damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 1.5 ); - damagearea setexcludeteamfortrigger( owner.team ); - damagearea enablelinkto(); - damagearea linkto( self ); - self.damagearea = damagearea; - - while ( isdefined( self ) ) - { - damagearea waittill( "trigger", ent ); - - if ( isdefined( owner ) && ent == owner ) - continue; - - if ( isdefined( ent.team ) && ent.team == owner.team ) - continue; - - self playsound( "wpn_claymore_alert" ); - dist = distance( self.origin, ent.origin ); - radiusdamage( self.origin + vectorscale( ( 0, 0, 1 ), 12.0 ), explosionradius, 1, 1, owner, "MOD_GRENADE_SPLASH", "cymbal_monkey_zm" ); - - if ( isdefined( owner ) ) - self detonate( owner ); - else - self detonate( undefined ); - - break; - } - - if ( isdefined( damagearea ) ) - damagearea delete(); + wait 1.5; + if ( !isDefined( self ) ) + { + return; + } + detonateradius = 96; + explosionradius = detonateradius * 2; + damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - detonateradius ), 4, detonateradius, detonateradius * 1.5 ); + damagearea setexcludeteamfortrigger( owner.team ); + damagearea enablelinkto(); + damagearea linkto( self ); + self.damagearea = damagearea; + while ( isDefined( self ) ) + { + damagearea waittill( "trigger", ent ); + if ( isDefined( owner ) && ent == owner ) + { + continue; + } + if ( isDefined( ent.team ) && ent.team == owner.team ) + { + continue; + } + self playsound( "wpn_claymore_alert" ); + dist = distance( self.origin, ent.origin ); + radiusdamage( self.origin + vectorScale( ( 0, 0, 1 ), 12 ), explosionradius, 1, 1, owner, "MOD_GRENADE_SPLASH", "cymbal_monkey_zm" ); + if ( isDefined( owner ) ) + { + self detonate( owner ); + } + else + { + self detonate( undefined ); + } + break; + } + if ( isDefined( damagearea ) ) + { + damagearea delete(); + } } -player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff ) +player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff ) //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "starting_monkey_watch" ); - - if ( isdefined( grenade ) ) - { - grenade endon( "death" ); - - if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) - { - if ( isdefined( grenade.damagearea ) ) - grenade.damagearea delete(); - - grenade delete(); - return; - } - - grenade hide(); - model = spawn( "script_model", grenade.origin ); - model setmodel( level.cymbal_monkey_model ); - model useanimtree( -1 ); - model linkto( grenade ); - model.angles = grenade.angles; - model thread monkey_cleanup( grenade ); - clone = undefined; - - if ( isdefined( level.cymbal_monkey_dual_view ) && level.cymbal_monkey_dual_view ) - { - model setvisibletoallexceptteam( level.zombie_team ); - clone = maps\mp\zombies\_zm_clone::spawn_player_clone( self, vectorscale( ( 0, 0, -1 ), 999.0 ), level.cymbal_monkey_clone_weapon, undefined ); - model.simulacrum = clone; - clone maps\mp\zombies\_zm_clone::clone_animate( "idle" ); - clone thread clone_player_angles( self ); - clone notsolid(); - clone ghost(); - } - - grenade thread watch_for_dud( model, clone ); - grenade thread watch_for_emp( model, clone ); - info = spawnstruct(); - info.sound_attractors = []; - grenade thread monitor_zombie_groans( info ); - - grenade waittill( "stationary" ); - - if ( isdefined( level.grenade_planted ) ) - self thread [[ level.grenade_planted ]]( grenade, model ); - - if ( isdefined( grenade ) ) - { - if ( isdefined( model ) ) - { - model setanim( %o_monkey_bomb ); - - if ( !( isdefined( grenade.backlinked ) && grenade.backlinked ) ) - { - model unlink(); - model.origin = grenade.origin; - model.angles = grenade.angles; - } - } - - if ( isdefined( clone ) ) - { - clone forceteleport( grenade.origin, grenade.angles ); - clone thread hide_owner( self ); - grenade thread proximity_detonate( self ); - clone show(); - clone setinvisibletoall(); - clone setvisibletoteam( level.zombie_team ); - } - - grenade resetmissiledetonationtime(); - playfxontag( level._effect["monkey_glow"], model, "origin_animate_jnt" ); - valid_poi = check_point_in_enabled_zone( grenade.origin, undefined, undefined ); - - if ( isdefined( level.check_valid_poi ) ) - valid_poi = grenade [[ level.check_valid_poi ]]( valid_poi ); - - if ( valid_poi ) - { - grenade create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 ); - grenade.attract_to_origin = 1; - grenade thread create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff ); - grenade thread wait_for_attractor_positions_complete(); - grenade thread do_monkey_sound( model, info ); - level.cymbal_monkeys[level.cymbal_monkeys.size] = grenade; - } - else - { - grenade.script_noteworthy = undefined; - level thread grenade_stolen_by_sam( grenade, model, clone ); - } - } - else - { - grenade.script_noteworthy = undefined; - level thread grenade_stolen_by_sam( grenade, model, clone ); - } - } + self endon( "disconnect" ); + self endon( "starting_monkey_watch" ); + if ( isDefined( grenade ) ) + { + grenade endon( "death" ); + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + if ( isDefined( grenade.damagearea ) ) + { + grenade.damagearea delete(); + } + grenade delete(); + return; + } + grenade hide(); + model = spawn( "script_model", grenade.origin ); + model setmodel( level.cymbal_monkey_model ); + model useanimtree( -1 ); + model linkto( grenade ); + model.angles = grenade.angles; + model thread monkey_cleanup( grenade ); + clone = undefined; + if ( is_true( level.cymbal_monkey_dual_view ) ) + { + model setvisibletoallexceptteam( level.zombie_team ); + clone = maps/mp/zombies/_zm_clone::spawn_player_clone( self, vectorScale( ( 0, 0, -1 ), 999 ), level.cymbal_monkey_clone_weapon, undefined ); + model.simulacrum = clone; + clone maps/mp/zombies/_zm_clone::clone_animate( "idle" ); + clone thread clone_player_angles( self ); + clone notsolid(); + clone ghost(); + } + grenade thread watch_for_dud( model, clone ); + grenade thread watch_for_emp( model, clone ); + info = spawnstruct(); + info.sound_attractors = []; + grenade thread monitor_zombie_groans( info ); + grenade waittill( "stationary" ); + if ( isDefined( level.grenade_planted ) ) + { + self thread [[ level.grenade_planted ]]( grenade, model ); + } + if ( isDefined( grenade ) ) + { + if ( isDefined( model ) ) + { + model setanim( %o_monkey_bomb ); + if ( !is_true( grenade.backlinked ) ) + { + model unlink(); + model.origin = grenade.origin; + model.angles = grenade.angles; + } + } + if ( isDefined( clone ) ) + { + clone forceteleport( grenade.origin, grenade.angles ); + clone thread hide_owner( self ); + grenade thread proximity_detonate( self ); + clone show(); + clone setinvisibletoall(); + clone setvisibletoteam( level.zombie_team ); + } + grenade resetmissiledetonationtime(); + playfxontag( level._effect[ "monkey_glow" ], model, "origin_animate_jnt" ); + valid_poi = check_point_in_enabled_zone( grenade.origin, undefined, undefined ); + if ( isDefined( level.check_valid_poi ) ) + { + valid_poi = grenade [[ level.check_valid_poi ]]( valid_poi ); + } + if ( valid_poi ) + { + grenade create_zombie_point_of_interest( max_attract_dist, num_attractors, 10000 ); + grenade.attract_to_origin = 1; + grenade thread create_zombie_point_of_interest_attractor_positions( 4, attract_dist_diff ); + grenade thread wait_for_attractor_positions_complete(); + grenade thread do_monkey_sound( model, info ); + level.cymbal_monkeys[ level.cymbal_monkeys.size ] = grenade; + } + else + { + grenade.script_noteworthy = undefined; + level thread grenade_stolen_by_sam( grenade, model, clone ); + } + return; + } + else + { + grenade.script_noteworthy = undefined; + level thread grenade_stolen_by_sam( grenade, model, clone ); + } + } } -grenade_stolen_by_sam( ent_grenade, ent_model, ent_actor ) +grenade_stolen_by_sam( ent_grenade, ent_model, ent_actor ) //checked changed to match cerberus output { - if ( !isdefined( ent_model ) ) - return; - - direction = ent_model.origin; - direction = ( direction[1], direction[0], 0 ); - - if ( direction[1] < 0 || direction[0] > 0 && direction[1] > 0 ) - direction = ( direction[0], direction[1] * -1, 0 ); - else if ( direction[0] < 0 ) - direction = ( direction[0] * -1, direction[1], 0 ); - - players = get_players(); - - for ( i = 0; i < players.size; i++ ) - { - if ( isalive( players[i] ) ) - players[i] playlocalsound( level.zmb_laugh_alias ); - } - - playfxontag( level._effect["grenade_samantha_steal"], ent_model, "tag_origin" ); - ent_model movez( 60, 1.0, 0.25, 0.25 ); - ent_model vibrate( direction, 1.5, 2.5, 1.0 ); - - ent_model waittill( "movedone" ); - - if ( isdefined( self.damagearea ) ) - self.damagearea delete(); - - ent_model delete(); - - if ( isdefined( ent_actor ) ) - ent_actor delete(); - - if ( isdefined( ent_grenade ) ) - { - if ( isdefined( ent_grenade.damagearea ) ) - ent_grenade.damagearea delete(); - - ent_grenade delete(); - } + if ( !isDefined( ent_model ) ) + { + return; + } + direction = ent_model.origin; + direction = ( direction[ 1 ], direction[ 0 ], 0 ); + if ( direction[ 1 ] < 0 || direction[ 0 ] > 0 && direction[ 1 ] > 0 ) + { + direction = ( direction[ 0 ], direction[ 1 ] * -1, 0 ); + } + else + { + if ( direction[ 0 ] < 0 ) + { + direction = ( direction[ 0 ] * -1, direction[ 1 ], 0 ); + } + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( isalive( players[ i ] ) ) + { + players[ i ] playlocalsound( level.zmb_laugh_alias ); + } + } + playfxontag( level._effect[ "grenade_samantha_steal" ], ent_model, "tag_origin" ); + ent_model movez( 60, 1, 0.25, 0.25 ); + ent_model vibrate( direction, 1.5, 2.5, 1 ); + ent_model waittill( "movedone" ); + if ( isDefined( self.damagearea ) ) + { + self.damagearea delete(); + } + ent_model delete(); + if ( isDefined( ent_actor ) ) + { + ent_actor delete(); + } + if ( isDefined( ent_grenade ) ) + { + if ( isDefined( ent_grenade.damagearea ) ) + { + ent_grenade.damagearea delete(); + } + ent_grenade delete(); + } } -wait_for_attractor_positions_complete() +wait_for_attractor_positions_complete() //checked matches cerberus output { - self waittill( "attractor_positions_generated" ); - - self.attract_to_origin = 0; + self waittill( "attractor_positions_generated" ); + self.attract_to_origin = 0; } -monkey_cleanup( parent ) +monkey_cleanup( parent ) //checked matches cerberus output { - while ( true ) - { - if ( !isdefined( parent ) ) - { - if ( isdefined( self ) && ( isdefined( self.dud ) && self.dud ) ) - wait 6; - - if ( isdefined( self.simulacrum ) ) - self.simulacrum delete(); - - self_delete(); - return; - } - - wait 0.05; - } + while ( 1 ) + { + if ( !isDefined( parent ) ) + { + if ( isDefined( self ) && is_true( self.dud ) ) + { + wait 6; + } + if ( isDefined( self.simulacrum ) ) + { + self.simulacrum delete(); + } + self_delete(); + return; + } + wait 0.05; + } } -do_monkey_sound( model, info ) +do_monkey_sound( model, info ) //checked changed to match cerberus output { - self.monk_scream_vox = 0; - - if ( isdefined( level.grenade_safe_to_bounce ) ) - { - if ( ![[ level.grenade_safe_to_bounce ]]( self.owner, "cymbal_monkey_zm" ) ) - { - self playsound( "zmb_vox_monkey_scream" ); - self.monk_scream_vox = 1; - } - } - - if ( !self.monk_scream_vox && level.music_override == 0 ) - { - if ( isdefined( level.cymbal_monkey_dual_view ) && level.cymbal_monkey_dual_view ) - self playsoundtoteam( "zmb_monkey_song", "allies" ); - else - self playsound( "zmb_monkey_song" ); - } - - if ( !self.monk_scream_vox ) - self thread play_delayed_explode_vox(); - - self waittill( "explode", position ); - - level notify( "grenade_exploded", position, 100, 5000, 450 ); - monkey_index = -1; - - for ( i = 0; i < level.cymbal_monkeys.size; i++ ) - { - if ( !isdefined( level.cymbal_monkeys[i] ) ) - { - monkey_index = i; - break; - } - } - - if ( monkey_index >= 0 ) - arrayremoveindex( level.cymbal_monkeys, monkey_index ); - - if ( isdefined( model ) ) - model clearanim( %o_monkey_bomb, 0.2 ); - - for ( i = 0; i < info.sound_attractors.size; i++ ) - { - if ( isdefined( info.sound_attractors[i] ) ) - info.sound_attractors[i] notify( "monkey_blown_up" ); - } + self.monk_scream_vox = 0; + if ( isDefined( level.grenade_safe_to_bounce ) ) + { + if ( ![[ level.grenade_safe_to_bounce ]]( self.owner, "cymbal_monkey_zm" ) ) + { + self playsound( "zmb_vox_monkey_scream" ); + self.monk_scream_vox = 1; + } + } + if ( !self.monk_scream_vox && level.music_override == 0 ) + { + if ( is_true( level.cymbal_monkey_dual_view ) ) + { + self playsoundtoteam( "zmb_monkey_song", "allies" ); + } + else + { + self playsound( "zmb_monkey_song" ); + } + } + if ( !self.monk_scream_vox ) + { + self thread play_delayed_explode_vox(); + } + self waittill( "explode", position ); + level notify( "grenade_exploded", position, 100, 5000, 450 ); + monkey_index = -1; + for ( i = 0; i < level.cymbal_monkeys.size; i++ ) + { + if ( !isDefined( level.cymbal_monkeys[ i ] ) ) + { + monkey_index = i; + break; + } + } + if ( monkey_index >= 0 ) + { + arrayremoveindex( level.cymbal_monkeys, monkey_index ); + } + if ( isDefined( model ) ) + { + model clearanim( %o_monkey_bomb, 0,2 ); + } + for ( i = 0; i < info.sound_attractors.size; i++ ) + { + if ( isDefined( info.sound_attractors[ i ] ) ) + { + info.sound_attractors[ i ] notify( "monkey_blown_up" ); + } + } } -play_delayed_explode_vox() +play_delayed_explode_vox() //checked matches cerberus output { - wait 6.5; - - if ( isdefined( self ) ) - self playsound( "zmb_vox_monkey_explode" ); + wait 6.5; + if ( isDefined( self ) ) + { + self playsound( "zmb_vox_monkey_explode" ); + } } -get_thrown_monkey() +get_thrown_monkey() //checked matches cerberus output { - self endon( "disconnect" ); - self endon( "starting_monkey_watch" ); - - while ( true ) - { - self waittill( "grenade_fire", grenade, weapname ); - - if ( weapname == "cymbal_monkey_zm" ) - { - grenade.use_grenade_special_long_bookmark = 1; - grenade.grenade_multiattack_bookmark_count = 1; - return grenade; - } - - wait 0.05; - } + self endon( "disconnect" ); + self endon( "starting_monkey_watch" ); + while ( 1 ) + { + self waittill( "grenade_fire", grenade, weapname ); + if ( weapname == "cymbal_monkey_zm" ) + { + grenade.use_grenade_special_long_bookmark = 1; + grenade.grenade_multiattack_bookmark_count = 1; + return grenade; + } + wait 0.05; + } } -monitor_zombie_groans( info ) +monitor_zombie_groans( info ) //checked changed to match cerberus output { - self endon( "explode" ); - - while ( true ) - { - if ( !isdefined( self ) ) - return; - - if ( !isdefined( self.attractor_array ) ) - { - wait 0.05; - continue; - } - - for ( i = 0; i < self.attractor_array.size; i++ ) - { - if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[i] ) ) - { - if ( isdefined( self.origin ) && isdefined( self.attractor_array[i].origin ) ) - { - if ( distancesquared( self.origin, self.attractor_array[i].origin ) < 250000 ) - { - info.sound_attractors[info.sound_attractors.size] = self.attractor_array[i]; - self.attractor_array[i] thread play_zombie_groans(); - } - } - } - } - - wait 0.05; - } + self endon( "explode" ); + while ( 1 ) + { + if ( !isDefined( self ) ) + { + return; + } + if ( !isDefined( self.attractor_array ) ) + { + wait 0.05; + continue; + } + for ( i = 0; i < self.attractor_array.size; i++ ) + { + if ( array_check_for_dupes( info.sound_attractors, self.attractor_array[ i ] ) ) + { + if ( isDefined( self.origin ) && isDefined( self.attractor_array[ i ].origin ) ) + { + if ( distancesquared( self.origin, self.attractor_array[ i ].origin ) < 250000 ) + { + info.sound_attractors[ info.sound_attractors.size ] = self.attractor_array[ i ]; + self.attractor_array[ i ] thread play_zombie_groans(); + } + } + } + } + wait 0.05; + } } -play_zombie_groans() +play_zombie_groans() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "monkey_blown_up" ); - - while ( true ) - { - if ( isdefined( self ) ) - { - self playsound( "zmb_vox_zombie_groan" ); - wait( randomfloatrange( 2, 3 ) ); - } - else - return; - } + self endon( "death" ); + self endon( "monkey_blown_up" ); + while ( 1 ) + { + if ( isDefined( self ) ) + { + self playsound( "zmb_vox_zombie_groan" ); + wait randomfloatrange( 2, 3 ); + } + else + { + return; + } + } } -cymbal_monkey_exists() +cymbal_monkey_exists() //checked matches cerberus output { - return isdefined( level.zombie_weapons["cymbal_monkey_zm"] ); + return isDefined( level.zombie_weapons[ "cymbal_monkey_zm" ] ); } + diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_weapons.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_weapons.gsc index 437c810..a4476cf 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_weapons.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_weapons.gsc @@ -1,2746 +1,2799 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\zombies\_zm_magicbox; -#include maps\mp\gametypes_zm\_weaponobjects; -#include maps\mp\gametypes_zm\_weapons; -#include maps\mp\zombies\_zm_weap_claymore; -#include maps\mp\zombies\_zm_weap_ballistic_knife; -#include maps\mp\zombies\_zm_audio; -#include maps\mp\zombies\_zm_unitrigger; -#include maps\mp\zombies\_zm_melee_weapon; -#include maps\mp\zombies\_zm_pers_upgrades_functions; -#include maps\mp\zombies\_zm_score; -#include maps\mp\zombies\_zm_equipment; -#include maps\mp\zombies\_zm_stats; -#include maps\mp\zombies\_zm_weapons; -#include maps\mp\zombies\_zm_weap_cymbal_monkey; +#include maps/mp/zombies/_zm_weap_cymbal_monkey; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_score; +#include maps/mp/zombies/_zm_pers_upgrades_functions; +#include maps/mp/zombies/_zm_melee_weapon; +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/gametypes_zm/_weapons; +#include maps/mp/gametypes_zm/_weaponobjects; +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; +#include maps/mp/zombies/_zm_weap_claymore; +#include maps/mp/zombies/_zm_weap_ballistic_knife; -init() + +init() //checked matches cerberus output { -/# - println( "ZM >> init (_zm_weapons.gsc)" ); -#/ - init_weapons(); - init_weapon_upgrade(); - init_weapon_toggle(); - precacheshader( "minimap_icon_mystery_box" ); - precacheshader( "specialty_instakill_zombies" ); - precacheshader( "specialty_firesale_zombies" ); - precacheitem( "zombie_fists_zm" ); - level._weaponobjects_on_player_connect_override = ::weaponobjects_on_player_connect_override; - level._zombiemode_check_firesale_loc_valid_func = ::default_check_firesale_loc_valid_func; - level.missileentities = []; - setupretrievablehintstrings(); - level thread onplayerconnect(); + init_weapons(); + init_weapon_upgrade(); + init_weapon_toggle(); + precacheshader( "minimap_icon_mystery_box" ); + precacheshader( "specialty_instakill_zombies" ); + precacheshader( "specialty_firesale_zombies" ); + precacheitem( "zombie_fists_zm" ); + level._weaponobjects_on_player_connect_override = ::weaponobjects_on_player_connect_override; + level._zombiemode_check_firesale_loc_valid_func = ::default_check_firesale_loc_valid_func; + level.missileentities = []; + setupretrievablehintstrings(); + level thread onplayerconnect(); + } -setupretrievablehintstrings() +setupretrievablehintstrings() //checked matches cerberus output { - maps\mp\gametypes_zm\_weaponobjects::createretrievablehint( "claymore", &"ZOMBIE_CLAYMORE_PICKUP" ); + maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "claymore", &"ZOMBIE_CLAYMORE_PICKUP" ); } -onplayerconnect() +onplayerconnect() //checked matches cerberus output { - for (;;) - { - level waittill( "connecting", player ); - - player thread onplayerspawned(); - } + for ( ;; ) + { + level waittill( "connecting", player ); + player thread onplayerspawned(); + } } -onplayerspawned() +onplayerspawned() //checked matches cerberus output { - self endon( "disconnect" ); - - for (;;) - { - self waittill( "spawned_player" ); - - self thread watchforgrenadeduds(); - self thread watchforgrenadelauncherduds(); - self.staticweaponsstarttime = gettime(); - } + self endon( "disconnect" ); + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread watchforgrenadeduds(); + self thread watchforgrenadelauncherduds(); + self.staticweaponsstarttime = getTime(); + } } -watchforgrenadeduds() +watchforgrenadeduds() //checked matches cerberus output { - self endon( "spawned_player" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "grenade_fire", grenade, weapname ); - - if ( !is_equipment( weapname ) && weapname != "claymore_zm" ) - { - grenade thread checkgrenadefordud( weapname, 1, self ); - grenade thread watchforscriptexplosion( weapname, 1, self ); - } - } + self endon( "spawned_player" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "grenade_fire", grenade, weapname ); + if ( !is_equipment( weapname ) && weapname != "claymore_zm" ) + { + grenade thread checkgrenadefordud( weapname, 1, self ); + grenade thread watchforscriptexplosion( weapname, 1, self ); + } + } } -watchforgrenadelauncherduds() +watchforgrenadelauncherduds() //checked matches cerberus output { - self endon( "spawned_player" ); - self endon( "disconnect" ); - - while ( true ) - { - self waittill( "grenade_launcher_fire", grenade, weapname ); - - grenade thread checkgrenadefordud( weapname, 0, self ); - grenade thread watchforscriptexplosion( weapname, 0, self ); - } + self endon( "spawned_player" ); + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "grenade_launcher_fire", grenade, weapname ); + grenade thread checkgrenadefordud( weapname, 0, self ); + grenade thread watchforscriptexplosion( weapname, 0, self ); + } } -grenade_safe_to_throw( player, weapname ) +grenade_safe_to_throw( player, weapname ) //checked matches cerberus output { - if ( isdefined( level.grenade_safe_to_throw ) ) - return self [[ level.grenade_safe_to_throw ]]( player, weapname ); - - return 1; + if ( isDefined( level.grenade_safe_to_throw ) ) + { + return self [[ level.grenade_safe_to_throw ]]( player, weapname ); + } + return 1; } -grenade_safe_to_bounce( player, weapname ) +grenade_safe_to_bounce( player, weapname ) //checked matches cerberus output { - if ( isdefined( level.grenade_safe_to_bounce ) ) - return self [[ level.grenade_safe_to_bounce ]]( player, weapname ); - - return 1; + if ( isDefined( level.grenade_safe_to_bounce ) ) + { + return self [[ level.grenade_safe_to_bounce ]]( player, weapname ); + } + return 1; } -makegrenadedudanddestroy() +makegrenadedudanddestroy() //checked matches cerberus output { - self endon( "death" ); - self notify( "grenade_dud" ); - self makegrenadedud(); - wait 3; - - if ( isdefined( self ) ) - self delete(); + self endon( "death" ); + self notify( "grenade_dud" ); + self makegrenadedud(); + wait 3; + if ( isDefined( self ) ) + { + self delete(); + } } -checkgrenadefordud( weapname, isthrowngrenade, player ) +checkgrenadefordud( weapname, isthrowngrenade, player ) //checked matches cerberus output { - self endon( "death" ); - player endon( "zombify" ); - - if ( !self grenade_safe_to_throw( player, weapname ) ) - { - self thread makegrenadedudanddestroy(); - return; - } - - for (;;) - { - self waittill_any_timeout( 0.25, "grenade_bounce", "stationary" ); - - if ( !self grenade_safe_to_bounce( player, weapname ) ) - { - self thread makegrenadedudanddestroy(); - return; - } - } + self endon( "death" ); + player endon( "zombify" ); + if ( !self grenade_safe_to_throw( player, weapname ) ) + { + self thread makegrenadedudanddestroy(); + return; + } + for ( ;; ) + { + self waittill_any_timeout( 0.25, "grenade_bounce", "stationary" ); + if ( !self grenade_safe_to_bounce( player, weapname ) ) + { + self thread makegrenadedudanddestroy(); + return; + } + } } -wait_explode() +wait_explode() //checked matches cerberus output { - self endon( "grenade_dud" ); - self endon( "done" ); - - self waittill( "explode", position ); - - level.explode_position = position; - level.explode_position_valid = 1; - self notify( "done" ); + self endon( "grenade_dud" ); + self endon( "done" ); + self waittill( "explode", position ); + level.explode_position = position; + level.explode_position_valid = 1; + self notify( "done" ); } -wait_timeout( time ) +wait_timeout( time ) //checked matches cerberus output { - self endon( "grenade_dud" ); - self endon( "done" ); - wait( time ); - self notify( "done" ); + self endon( "grenade_dud" ); + self endon( "done" ); + wait time; + self notify( "done" ); } -wait_for_explosion( time ) +wait_for_explosion( time ) //checked changed to match cerberus output { - level.explode_position = ( 0, 0, 0 ); - level.explode_position_valid = 0; - self thread wait_explode(); - self thread wait_timeout( time ); - - self waittill( "done" ); - - self notify( "death_or_explode", level.explode_position_valid, level.explode_position ); + level.explode_position = ( 0, 0, 0 ); + level.explode_position_valid = 0; + self thread wait_explode(); + self thread wait_timeout( time ); + self waittill( "done" ); + self notify( "death_or_explode", level.explode_position_valid, level.explode_position ); } -watchforscriptexplosion( weapname, isthrowngrenade, player ) +watchforscriptexplosion( weapname, isthrowngrenade, player ) //checked changed to match cerberus output { - self endon( "grenade_dud" ); - - if ( is_lethal_grenade( weapname ) || is_grenade_launcher( weapname ) ) - { - self thread wait_for_explosion( 20 ); - - self waittill( "death_or_explode", exploded, position ); - - if ( exploded ) - level notify( "grenade_exploded", position, 256, 300, 75 ); - } + self endon( "grenade_dud" ); + if ( is_lethal_grenade( weapname ) || is_grenade_launcher( weapname ) ) + { + self thread wait_for_explosion( 20 ); + self waittill( "death_or_explode", exploded, position ); + if ( exploded ) + { + level notify( "grenade_exploded", position, 256, 300, 75 ); + } + } } -get_nonalternate_weapon( altweapon ) +get_nonalternate_weapon( altweapon ) //checked changed to match cerberus output { - if ( is_alt_weapon( altweapon ) ) - { - alt = weaponaltweaponname( altweapon ); - - if ( alt == "none" ) - { - primaryweapons = self getweaponslistprimaries(); - alt = primaryweapons[0]; - - foreach ( weapon in primaryweapons ) - { - if ( weaponaltweaponname( weapon ) == altweapon ) - { - alt = weapon; - break; - } - } - } - - return alt; - } - - return altweapon; + if ( is_alt_weapon( altweapon ) ) + { + alt = weaponaltweaponname( altweapon ); + if ( alt == "none" ) + { + primaryweapons = self getweaponslistprimaries(); + alt = primaryweapons[ 0 ]; + foreach ( weapon in primaryweapons ) + { + if ( weaponaltweaponname( weapon ) == altweapon ) + { + alt = weapon; + break; + } + } + } + return alt; + } + return altweapon; } -switch_from_alt_weapon( current_weapon ) +switch_from_alt_weapon( current_weapon ) //checked changed to match cerberus output { - if ( is_alt_weapon( current_weapon ) ) - { - alt = weaponaltweaponname( current_weapon ); - - if ( alt == "none" ) - { - primaryweapons = self getweaponslistprimaries(); - alt = primaryweapons[0]; - - foreach ( weapon in primaryweapons ) - { - if ( weaponaltweaponname( weapon ) == current_weapon ) - { - alt = weapon; - break; - } - } - } - - self switchtoweaponimmediate( alt ); - self waittill_notify_or_timeout( "weapon_change_complete", 1 ); - return alt; - } - - return current_weapon; + if ( is_alt_weapon( current_weapon ) ) + { + alt = weaponaltweaponname( current_weapon ); + if ( alt == "none" ) + { + primaryweapons = self getweaponslistprimaries(); + alt = primaryweapons[ 0 ]; + foreach ( weapon in primaryweapons ) + { + if ( weaponaltweaponname( weapon ) == current_weapon ) + { + alt = weapon; + break; + } + } + } + self switchtoweaponimmediate( alt ); + self waittill_notify_or_timeout( "weapon_change_complete", 1 ); + return alt; + } + return current_weapon; } -give_fallback_weapon() +give_fallback_weapon() //checked matches cerberus output { - self giveweapon( "zombie_fists_zm" ); - self switchtoweapon( "zombie_fists_zm" ); + self giveweapon( "zombie_fists_zm" ); + self switchtoweapon( "zombie_fists_zm" ); } -take_fallback_weapon() +take_fallback_weapon() //checked matches cerberus output { - if ( self hasweapon( "zombie_fists_zm" ) ) - self takeweapon( "zombie_fists_zm" ); + if ( self hasweapon( "zombie_fists_zm" ) ) + { + self takeweapon( "zombie_fists_zm" ); + } } -switch_back_primary_weapon( oldprimary ) +switch_back_primary_weapon( oldprimary ) //checked changed to match cerberus output { - if ( isdefined( self.laststand ) && self.laststand ) - return; - - primaryweapons = self getweaponslistprimaries(); - - if ( isdefined( oldprimary ) && isinarray( primaryweapons, oldprimary ) ) - self switchtoweapon( oldprimary ); - else if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) - self switchtoweapon( primaryweapons[0] ); + if ( is_true( self.laststand ) ) + { + return; + } + primaryweapons = self getweaponslistprimaries(); + if ( isDefined( oldprimary ) && isinarray( primaryweapons, oldprimary ) ) + { + self switchtoweapon( oldprimary ); + } + else if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) + { + self switchtoweapon( primaryweapons[ 0 ] ); + } } -add_retrievable_knife_init_name( name ) +add_retrievable_knife_init_name( name ) //checked matches cerberus output { - if ( !isdefined( level.retrievable_knife_init_names ) ) - level.retrievable_knife_init_names = []; - - level.retrievable_knife_init_names[level.retrievable_knife_init_names.size] = name; + if ( !isDefined( level.retrievable_knife_init_names ) ) + { + level.retrievable_knife_init_names = []; + } + level.retrievable_knife_init_names[ level.retrievable_knife_init_names.size ] = name; } -watchweaponusagezm() +watchweaponusagezm() //checked changed to match cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - level endon( "game_ended" ); - - for (;;) - { - self waittill( "weapon_fired", curweapon ); - - self.lastfiretime = gettime(); - self.hasdonecombat = 1; - - if ( isdefined( self.hitsthismag[curweapon] ) ) - self thread updatemagshots( curweapon ); - - switch ( weaponclass( curweapon ) ) - { - case "rifle": - if ( curweapon == "crossbow_explosive_mp" ) - { - level.globalcrossbowfired++; - self addweaponstat( curweapon, "shots", 1 ); - self thread begingrenadetracking(); - break; - } - case "spread": - case "smg": - case "pistolspread": - case "pistol spread": - case "pistol": - case "mg": - self trackweaponfire( curweapon ); - level.globalshotsfired++; - break; - case "rocketlauncher": - case "grenade": - if ( is_alt_weapon( curweapon ) ) - curweapon = weaponaltweaponname( curweapon ); - - self addweaponstat( curweapon, "shots", 1 ); - break; - default: - break; - } - - switch ( curweapon ) - { - case "mp40_blinged_mp": - case "minigun_mp": - case "m32_mp": - case "m220_tow_mp": - case "m202_flash_mp": - self.usedkillstreakweapon[curweapon] = 1; - continue; - default: - continue; - } - } + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + for ( ;; ) + { + self waittill( "weapon_fired", curweapon ); + self.lastfiretime = getTime(); + self.hasdonecombat = 1; + if ( isDefined( self.hitsthismag[ curweapon ] ) ) + { + self thread updatemagshots( curweapon ); + } + switch( weaponclass( curweapon ) ) + { + case "rifle": + if ( curweapon == "crossbow_explosive_mp" ) + { + level.globalcrossbowfired++; + self addweaponstat( curweapon, "shots", 1 ); + self thread begingrenadetracking(); + break; + } + case "pistol": + case "pistol spread": + case "pistolspread": + case "mg": + case "smg": + case "spread": + self trackweaponfire( curweapon ); + level.globalshotsfired++; + break; + case "grenade": + case "rocketlauncher": + if ( is_alt_weapon( curweapon ) ) + { + curweapon = weaponaltweaponname( curweapon ); + } + self addweaponstat( curweapon, "shots", 1 ); + break; + default: + + switch( curweapon ) + { + case "m202_flash_mp": + case "m220_tow_mp": + case "m32_mp": + case "minigun_mp": + case "mp40_blinged_mp": + self.usedkillstreakweapon[ curweapon ] = 1; + break; + default: + + } + } + } } -trackweaponzm() +trackweaponzm() //checked changed to match cerberus output { - self.currentweapon = self getcurrentweapon(); - self.currenttime = gettime(); - spawnid = getplayerspawnid( self ); - - while ( true ) - { - event = self waittill_any_return( "weapon_change", "death", "disconnect", "bled_out" ); - newtime = gettime(); - - if ( event == "weapon_change" ) - { - newweapon = self getcurrentweapon(); - - if ( newweapon != "none" && newweapon != self.currentweapon ) - { - updatelastheldweapontimingszm( newtime ); - self.currentweapon = newweapon; - self.currenttime = newtime; - } - } - else - { - if ( event != "disconnect" ) - updateweapontimingszm( newtime ); - - return; - } - } + self.currentweapon = self getcurrentweapon(); + self.currenttime = getTime(); + spawnid = getplayerspawnid( self ); + while ( 1 ) + { + event = self waittill_any_return( "weapon_change", "death", "disconnect", "bled_out" ); + newtime = getTime(); + if ( event == "weapon_change" ) + { + newweapon = self getcurrentweapon(); + if ( newweapon != "none" && newweapon != self.currentweapon ) + { + updatelastheldweapontimingszm( newtime ); + self.currentweapon = newweapon; + self.currenttime = newtime; + } + } + if ( event != "disconnect" ) + { + updateweapontimingszm( newtime ); + } + //return; //changed at own discretion + } } -updatelastheldweapontimingszm( newtime ) +updatelastheldweapontimingszm( newtime ) //checked matches cerberus output { - if ( isdefined( self.currentweapon ) && isdefined( self.currenttime ) ) - { - curweapon = self.currentweapon; - totaltime = int( ( newtime - self.currenttime ) / 1000 ); - - if ( totaltime > 0 ) - { - if ( is_alt_weapon( curweapon ) ) - curweapon = weaponaltweaponname( curweapon ); - - self addweaponstat( curweapon, "timeUsed", totaltime ); - } - } + if ( isDefined( self.currentweapon ) && isDefined( self.currenttime ) ) + { + curweapon = self.currentweapon; + totaltime = int( ( newtime - self.currenttime ) / 1000 ); + if ( totaltime > 0 ) + { + if ( is_alt_weapon( curweapon ) ) + { + curweapon = weaponaltweaponname( curweapon ); + } + self addweaponstat( curweapon, "timeUsed", totaltime ); + } + } } -updateweapontimingszm( newtime ) +updateweapontimingszm( newtime ) //checked matches cerberus output { - if ( self is_bot() ) - return; - - updatelastheldweapontimingszm( newtime ); - - if ( !isdefined( self.staticweaponsstarttime ) ) - return; - - totaltime = int( ( newtime - self.staticweaponsstarttime ) / 1000 ); - - if ( totaltime < 0 ) - return; - - self.staticweaponsstarttime = newtime; + if ( self is_bot() ) + { + return; + } + updatelastheldweapontimingszm( newtime ); + if ( !isDefined( self.staticweaponsstarttime ) ) + { + return; + } + totaltime = int( ( newtime - self.staticweaponsstarttime ) / 1000 ); + if ( totaltime < 0 ) + { + return; + } + self.staticweaponsstarttime = newtime; } -watchweaponchangezm() +watchweaponchangezm() //checked matches cerberus output { - self endon( "death" ); - self endon( "disconnect" ); - self.lastdroppableweapon = self getcurrentweapon(); - self.hitsthismag = []; - weapon = self getcurrentweapon(); - - if ( isdefined( weapon ) && weapon != "none" && !isdefined( self.hitsthismag[weapon] ) ) - self.hitsthismag[weapon] = weaponclipsize( weapon ); - - while ( true ) - { - previous_weapon = self getcurrentweapon(); - - self waittill( "weapon_change", newweapon ); - - if ( maydropweapon( newweapon ) ) - self.lastdroppableweapon = newweapon; - - if ( newweapon != "none" ) - { - if ( !isdefined( self.hitsthismag[newweapon] ) ) - self.hitsthismag[newweapon] = weaponclipsize( newweapon ); - } - } + self endon( "death" ); + self endon( "disconnect" ); + self.lastdroppableweapon = self getcurrentweapon(); + self.hitsthismag = []; + weapon = self getcurrentweapon(); + if ( isDefined( weapon ) && weapon != "none" && !isDefined( self.hitsthismag[ weapon ] ) ) + { + self.hitsthismag[ weapon ] = weaponclipsize( weapon ); + } + while ( 1 ) + { + previous_weapon = self getcurrentweapon(); + self waittill( "weapon_change", newweapon ); + if ( maydropweapon( newweapon ) ) + { + self.lastdroppableweapon = newweapon; + } + if ( newweapon != "none" ) + { + if ( !isDefined( self.hitsthismag[ newweapon ] ) ) + { + self.hitsthismag[ newweapon ] = weaponclipsize( newweapon ); + } + } + } } -weaponobjects_on_player_connect_override_internal() +weaponobjects_on_player_connect_override_internal() //checked changed to match cerberus output { - self maps\mp\gametypes_zm\_weaponobjects::createbasewatchers(); - self createclaymorewatcher_zm(); - - for ( i = 0; i < level.retrievable_knife_init_names.size; i++ ) - self createballisticknifewatcher_zm( level.retrievable_knife_init_names[i], level.retrievable_knife_init_names[i] + "_zm" ); - - self maps\mp\gametypes_zm\_weaponobjects::setupretrievablewatcher(); - - if ( !isdefined( self.weaponobjectwatcherarray ) ) - self.weaponobjectwatcherarray = []; - - self thread maps\mp\gametypes_zm\_weaponobjects::watchweaponobjectspawn(); - self thread maps\mp\gametypes_zm\_weaponobjects::watchweaponprojectileobjectspawn(); - self thread maps\mp\gametypes_zm\_weaponobjects::deleteweaponobjectson(); - self.concussionendtime = 0; - self.hasdonecombat = 0; - self.lastfiretime = 0; - self thread watchweaponusagezm(); - self thread maps\mp\gametypes_zm\_weapons::watchgrenadeusage(); - self thread maps\mp\gametypes_zm\_weapons::watchmissileusage(); - self thread watchweaponchangezm(); - self thread maps\mp\gametypes_zm\_weapons::watchturretuse(); - self thread trackweaponzm(); - self notify( "weapon_watchers_created" ); + self maps/mp/gametypes_zm/_weaponobjects::createbasewatchers(); + self createclaymorewatcher_zm(); + for ( i = 0; i < level.retrievable_knife_init_names.size; i++ ) + { + self createballisticknifewatcher_zm( level.retrievable_knife_init_names[ i ], level.retrievable_knife_init_names[ i ] + "_zm" ); + } + self maps/mp/gametypes_zm/_weaponobjects::setupretrievablewatcher(); + if ( !isDefined( self.weaponobjectwatcherarray ) ) + { + self.weaponobjectwatcherarray = []; + } + self thread maps/mp/gametypes_zm/_weaponobjects::watchweaponobjectspawn(); + self thread maps/mp/gametypes_zm/_weaponobjects::watchweaponprojectileobjectspawn(); + self thread maps/mp/gametypes_zm/_weaponobjects::deleteweaponobjectson(); + self.concussionendtime = 0; + self.hasdonecombat = 0; + self.lastfiretime = 0; + self thread watchweaponusagezm(); + self thread maps/mp/gametypes_zm/_weapons::watchgrenadeusage(); + self thread maps/mp/gametypes_zm/_weapons::watchmissileusage(); + self thread watchweaponchangezm(); + self thread maps/mp/gametypes_zm/_weapons::watchturretuse(); + self thread trackweaponzm(); + self notify( "weapon_watchers_created" ); } -weaponobjects_on_player_connect_override() +weaponobjects_on_player_connect_override() //checked matches cerberus output { - add_retrievable_knife_init_name( "knife_ballistic" ); - add_retrievable_knife_init_name( "knife_ballistic_upgraded" ); - onplayerconnect_callback( ::weaponobjects_on_player_connect_override_internal ); + add_retrievable_knife_init_name( "knife_ballistic" ); + add_retrievable_knife_init_name( "knife_ballistic_upgraded" ); + onplayerconnect_callback( ::weaponobjects_on_player_connect_override_internal ); } -createclaymorewatcher_zm() +createclaymorewatcher_zm() //checked changed to match cerberus output { - watcher = self maps\mp\gametypes_zm\_weaponobjects::createuseweaponobjectwatcher( "claymore", "claymore_zm", self.team ); - watcher.onspawnretrievetriggers = maps\mp\zombies\_zm_weap_claymore::on_spawn_retrieve_trigger; - watcher.adjusttriggerorigin = maps\mp\zombies\_zm_weap_claymore::adjust_trigger_origin; - watcher.pickup = level.pickup_claymores; - watcher.pickup_trigger_listener = level.pickup_claymores_trigger_listener; - watcher.skip_weapon_object_damage = 1; - watcher.headicon = 0; - watcher.watchforfire = 1; - watcher.detonate = ::claymoredetonate; - watcher.ondamage = level.claymores_on_damage; + watcher = self maps/mp/gametypes_zm/_weaponobjects::createuseweaponobjectwatcher( "claymore", "claymore_zm", self.team ); + watcher.onspawnretrievetriggers = maps/mp/zombies/_zm_weap_claymore::on_spawn_retrieve_trigger; + watcher.adjusttriggerorigin = maps/mp/zombies/_zm_weap_claymore::adjust_trigger_origin; + watcher.pickup = level.pickup_claymores; + watcher.pickup_trigger_listener = level.pickup_claymores_trigger_listener; + watcher.skip_weapon_object_damage = 1; + watcher.headicon = 0; + watcher.watchforfire = 1; + watcher.detonate = ::claymoredetonate; + watcher.ondamage = level.claymores_on_damage; } -createballisticknifewatcher_zm( name, weapon ) +createballisticknifewatcher_zm( name, weapon ) //checked changed to match cerberus output { - watcher = self maps\mp\gametypes_zm\_weaponobjects::createuseweaponobjectwatcher( name, weapon, self.team ); - watcher.onspawn = maps\mp\zombies\_zm_weap_ballistic_knife::on_spawn; - watcher.onspawnretrievetriggers = maps\mp\zombies\_zm_weap_ballistic_knife::on_spawn_retrieve_trigger; - watcher.storedifferentobject = 1; - watcher.headicon = 0; + watcher = self maps/mp/gametypes_zm/_weaponobjects::createuseweaponobjectwatcher( name, weapon, self.team ); + watcher.onspawn = maps/mp/zombies/_zm_weap_ballistic_knife::on_spawn; + watcher.onspawnretrievetriggers = maps/mp/zombies/_zm_weap_ballistic_knife::on_spawn_retrieve_trigger; + watcher.storedifferentobject = 1; + watcher.headicon = 0; } -isempweapon( weaponname ) +isempweapon( weaponname ) //checked changed at own discretion { - if ( isdefined( weaponname ) && ( weaponname == "emp_mp" || weaponname == "emp_grenade_mp" || weaponname == "emp_grenade_zm" ) ) - return true; - - return false; + if ( isDefined( weaponname ) && weaponname == "emp_grenade_zm" ) + { + return 1; + } + return 0; } -claymoredetonate( attacker, weaponname ) +claymoredetonate( attacker, weaponname ) //checked matches cerberus output { - from_emp = isempweapon( weaponname ); - - if ( from_emp ) - { - self delete(); - return; - } - - if ( isdefined( attacker ) ) - self detonate( attacker ); - else if ( isdefined( self.owner ) && isplayer( self.owner ) ) - self detonate( self.owner ); - else - self detonate(); + from_emp = isempweapon( weaponname ); + if ( from_emp ) + { + self delete(); + return; + } + if ( isDefined( attacker ) ) + { + self detonate( attacker ); + } + else if ( isDefined( self.owner ) && isplayer( self.owner ) ) + { + self detonate( self.owner ); + } + else + { + self detonate(); + } } -default_check_firesale_loc_valid_func() +default_check_firesale_loc_valid_func() //checked matches cerberus output { - return 1; + return 1; } -add_zombie_weapon( weapon_name, upgrade_name, hint, cost, weaponvo, weaponvoresp, ammo_cost, create_vox ) +add_zombie_weapon( weapon_name, upgrade_name, hint, cost, weaponvo, weaponvoresp, ammo_cost, create_vox ) //checked matches cerberus output { - if ( isdefined( level.zombie_include_weapons ) && !isdefined( level.zombie_include_weapons[weapon_name] ) ) - return; + if ( isDefined( level.zombie_include_weapons ) && !isDefined( level.zombie_include_weapons[ weapon_name ] ) ) + { + return; + } + table = "mp/zombiemode.csv"; + table_cost = tablelookup( table, 0, weapon_name, 1 ); + table_ammo_cost = tablelookup( table, 0, weapon_name, 2 ); + if ( isDefined( table_cost ) && table_cost != "" ) + { + cost = round_up_to_ten( int( table_cost ) ); + } + if ( isDefined( table_ammo_cost ) && table_ammo_cost != "" ) + { + ammo_cost = round_up_to_ten( int( table_ammo_cost ) ); + } + precachestring( hint ); + struct = spawnstruct(); + if ( !isDefined( level.zombie_weapons ) ) + { + level.zombie_weapons = []; + } + if ( !isDefined( level.zombie_weapons_upgraded ) ) + { + level.zombie_weapons_upgraded = []; + } + if ( isDefined( upgrade_name ) ) + { + level.zombie_weapons_upgraded[ upgrade_name ] = weapon_name; + } - table = "mp/zombiemode.csv"; - table_cost = tablelookup( table, 0, weapon_name, 1 ); - table_ammo_cost = tablelookup( table, 0, weapon_name, 2 ); - - if ( isdefined( table_cost ) && table_cost != "" ) - cost = round_up_to_ten( int( table_cost ) ); - - if ( isdefined( table_ammo_cost ) && table_ammo_cost != "" ) - ammo_cost = round_up_to_ten( int( table_ammo_cost ) ); - - precachestring( hint ); - struct = spawnstruct(); - - if ( !isdefined( level.zombie_weapons ) ) - level.zombie_weapons = []; - - if ( !isdefined( level.zombie_weapons_upgraded ) ) - level.zombie_weapons_upgraded = []; - - if ( isdefined( upgrade_name ) ) - level.zombie_weapons_upgraded[upgrade_name] = weapon_name; - - struct.weapon_name = weapon_name; - struct.upgrade_name = upgrade_name; - struct.weapon_classname = "weapon_" + weapon_name; - struct.hint = hint; - struct.cost = cost; - struct.vox = weaponvo; - struct.vox_response = weaponvoresp; -/# - println( "ZM >> Looking for weapon - " + weapon_name ); -#/ - struct.is_in_box = level.zombie_include_weapons[weapon_name]; - - if ( !isdefined( ammo_cost ) ) - ammo_cost = round_up_to_ten( int( cost * 0.5 ) ); - - struct.ammo_cost = ammo_cost; - level.zombie_weapons[weapon_name] = struct; - - if ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch && isdefined( upgrade_name ) ) - add_attachments( weapon_name, upgrade_name ); - - if ( isdefined( create_vox ) ) - level.vox maps\mp\zombies\_zm_audio::zmbvoxadd( "player", "weapon_pickup", weapon_name, weaponvo, undefined ); -/# - if ( isdefined( level.devgui_add_weapon ) ) - [[ level.devgui_add_weapon ]]( weapon_name, upgrade_name, hint, cost, weaponvo, weaponvoresp, ammo_cost ); -#/ + struct.weapon_name = weapon_name; + struct.upgrade_name = upgrade_name; + struct.weapon_classname = "weapon_" + weapon_name; + struct.hint = hint; + struct.cost = cost; + struct.vox = weaponvo; + struct.vox_response = weaponvoresp; + struct.is_in_box = level.zombie_include_weapons[ weapon_name ]; + if ( !isDefined( ammo_cost ) ) + { + ammo_cost = round_up_to_ten( int( cost * 0.5 ) ); + } + struct.ammo_cost = ammo_cost; + + + level.zombie_weapons[ weapon_name ] = struct; + if ( is_true( level.zombiemode_reusing_pack_a_punch ) && isDefined( upgrade_name ) ) + { + add_attachments( weapon_name, upgrade_name ); + } + if ( isDefined( create_vox ) ) + { + level.vox maps/mp/zombies/_zm_audio::zmbvoxadd( "player", "weapon_pickup", weapon_name, weaponvo, undefined ); + } } -add_attachments( weapon_name, upgrade_name ) +add_attachments( weapon_name, upgrade_name ) //checked does not match cerberus output did not change { - table = "zm/pap_attach.csv"; + table = "zm/pap_attach.csv"; + if ( isDefined( level.weapon_attachment_table ) ) + { + table = level.weapon_attachment_table; + } + row = tablelookuprownum( table, 0, upgrade_name ); + if ( row > -1 ) + { + level.zombie_weapons[ weapon_name ].default_attachment = TableLookUp( table, 0, upgrade_name, 1 ); + level.zombie_weapons[ weapon_name ].addon_attachments = []; + index = 2; + next_addon = TableLookUp( table, 0, upgrade_name, index ); - if ( isdefined( level.weapon_attachment_table ) ) - table = level.weapon_attachment_table; - - row = tablelookuprownum( table, 0, upgrade_name ); - - if ( row > -1 ) - { - level.zombie_weapons[weapon_name].default_attachment = tablelookup( table, 0, upgrade_name, 1 ); - level.zombie_weapons[weapon_name].addon_attachments = []; - index = 2; - - for ( next_addon = tablelookup( table, 0, upgrade_name, index ); isdefined( next_addon ) && next_addon.size > 0; next_addon = tablelookup( table, 0, upgrade_name, index ) ) - { - level.zombie_weapons[weapon_name].addon_attachments[level.zombie_weapons[weapon_name].addon_attachments.size] = next_addon; - index++; - } - } + while ( isdefined( next_addon ) && next_addon.size > 0 ) + { + level.zombie_weapons[ weapon_name ].addon_attachments[ level.zombie_weapons[ weapon_name ].addon_attachments.size ] = next_addon; + index++; + next_addon = TableLookUp( table, 0, upgrade_name, index ); + } + } } -default_weighting_func() +default_weighting_func() //checked matches cerberus output { - return 1; + return 1; } -default_tesla_weighting_func() +default_tesla_weighting_func() //checked changed to match cerberus output { - num_to_add = 1; - - if ( isdefined( level.pulls_since_last_tesla_gun ) ) - { - if ( isdefined( level.player_drops_tesla_gun ) && level.player_drops_tesla_gun == 1 ) - num_to_add += int( 0.2 * level.zombie_include_weapons.size ); - - if ( !isdefined( level.player_seen_tesla_gun ) || level.player_seen_tesla_gun == 0 ) - { - if ( level.round_number > 10 ) - num_to_add += int( 0.2 * level.zombie_include_weapons.size ); - else if ( level.round_number > 5 ) - num_to_add += int( 0.15 * level.zombie_include_weapons.size ); - } - } - - return num_to_add; + num_to_add = 1; + if ( isDefined( level.pulls_since_last_tesla_gun ) ) + { + if ( isDefined( level.player_drops_tesla_gun ) && level.player_drops_tesla_gun == 1 ) + { + num_to_add += int( 0.2 * level.zombie_include_weapons.size ); + } + if ( !isDefined( level.player_seen_tesla_gun ) || level.player_seen_tesla_gun == 0 ) + { + if ( level.round_number > 10 ) + { + num_to_add += int( 0.2 * level.zombie_include_weapons.size ); + } + else if ( level.round_number > 5 ) + { + num_to_add += int( 0.15 * level.zombie_include_weapons.size ); + } + } + } + return num_to_add; } -default_1st_move_weighting_func() +default_1st_move_weighting_func() //checked matches cerberus output { - if ( level.chest_moves > 0 ) - { - num_to_add = 1; - return num_to_add; - } - else - return 0; + if ( level.chest_moves > 0 ) + { + num_to_add = 1; + return num_to_add; + } + else + { + return 0; + } } -default_upgrade_weapon_weighting_func() +default_upgrade_weapon_weighting_func() //checked matches cerberus output { - if ( level.chest_moves > 1 ) - return true; - else - return false; + if ( level.chest_moves > 1 ) + { + return 1; + } + else + { + return 0; + } } -default_cymbal_monkey_weighting_func() +default_cymbal_monkey_weighting_func() //checked changed to match cerberus output { - players = get_players(); - count = 0; - + players = get_players(); + count = 0; for ( i = 0; i < players.size; i++ ) - { - if ( players[i] has_weapon_or_upgrade( "cymbal_monkey_zm" ) ) - count++; - } - - if ( count > 0 ) - return 1; - else if ( level.round_number < 10 ) - return 3; - else - return 5; -} - -is_weapon_included( weapon_name ) -{ - if ( !isdefined( level.zombie_weapons ) ) - return 0; - - return isdefined( level.zombie_weapons[weapon_name] ); -} - -is_weapon_or_base_included( weapon_name ) -{ - if ( !isdefined( level.zombie_weapons ) ) - return false; - - if ( isdefined( level.zombie_weapons[weapon_name] ) ) - return true; - - base = get_base_weapon_name( weapon_name, 1 ); - - if ( isdefined( level.zombie_weapons[base] ) ) - return true; - - return false; + { + if ( players[ i ] has_weapon_or_upgrade( "cymbal_monkey_zm" ) ) + { + count++; + } + } + if ( count > 0 ) + { + return 1; + } + else if ( level.round_number < 10 ) + { + return 3; + } + else + { + return 5; + } +} + +is_weapon_included( weapon_name ) //checked matches cerberus output +{ + if ( !isDefined( level.zombie_weapons ) ) + { + return 0; + } + return isDefined( level.zombie_weapons[ weapon_name ] ); +} + +is_weapon_or_base_included( weapon_name ) //checked matches cerberus output +{ + if ( !isDefined( level.zombie_weapons ) ) + { + return 0; + } + if ( isDefined( level.zombie_weapons[ weapon_name ] ) ) + { + return 1; + } + base = get_base_weapon_name( weapon_name, 1 ); + if ( isDefined( level.zombie_weapons[ base ] ) ) + { + return 1; + } + return 0; +} + +include_zombie_weapon( weapon_name, in_box, collector, weighting_func ) //checked matches cerberus output +{ + if ( !isDefined( level.zombie_include_weapons ) ) + { + level.zombie_include_weapons = []; + } + if ( !isDefined( in_box ) ) + { + in_box = 1; + } + + level.zombie_include_weapons[ weapon_name ] = in_box; + precacheitem( weapon_name ); + if ( !isDefined( weighting_func ) ) + { + level.weapon_weighting_funcs[ weapon_name ] = ::default_weighting_func; + } + else + { + level.weapon_weighting_funcs[ weapon_name ] = weighting_func; + } +} + +init_weapons() //checked matches cerberus output +{ + if ( isdefined( level._zombie_custom_add_weapons ) ) + { + [[ level._zombie_custom_add_weapons ]](); + } + precachemodel( "zombie_teddybear" ); +} + +add_limited_weapon( weapon_name, amount ) //checked matches cerberus output +{ + if ( !isDefined( level.limited_weapons ) ) + { + level.limited_weapons = []; + } + level.limited_weapons[ weapon_name ] = amount; +} + +limited_weapon_below_quota( weapon, ignore_player, pap_triggers ) //checked changed to match cerberus output +{ + if ( isDefined( level.limited_weapons[ weapon ] ) ) + { + if ( !isDefined( pap_triggers ) ) + { + if ( !isDefined( level.pap_triggers ) ) + { + pap_triggers = getentarray( "specialty_weapupgrade", "script_noteworthy" ); + } + else + { + pap_triggers = level.pap_triggers; + } + } + if ( is_true( level.no_limited_weapons ) ) + { + return 0; + } + upgradedweapon = weapon; + if ( isDefined( level.zombie_weapons[ weapon ] ) && isDefined( level.zombie_weapons[ weapon ].upgrade_name ) ) + { + upgradedweapon = level.zombie_weapons[ weapon ].upgrade_name; + } + players = get_players(); + count = 0; + limit = level.limited_weapons[ weapon ]; + i = 0; + while ( i < players.size) + { + if ( isDefined( ignore_player ) && ignore_player == players[ i ] ) + { + i++; + continue; + } + if ( players[ i ] has_weapon_or_upgrade( weapon ) ) + { + count++; + if ( count >= limit ) + { + return 0; + } + } + i++; + } + for ( k = 0; k < pap_triggers.size; k++ ) + { + if ( isDefined( pap_triggers[ k ].current_weapon ) && pap_triggers[ k ].current_weapon == weapon || isDefined( pap_triggers[ k ].current_weapon ) && pap_triggers[ k ].current_weapon == upgradedweapon ) + { + count++; + if ( count >= limit ) + { + return 0; + } + } + } + for ( chestindex = 0; chestindex < level.chests.size; chestindex++ ) + { + if ( isDefined( level.chests[ chestindex ].zbarrier.weapon_string ) && level.chests[ chestindex ].zbarrier.weapon_string == weapon ) + { + count++; + if ( count >= limit ) + { + return 0; + } + } + } + if ( isDefined( level.custom_limited_weapon_checks ) ) + { + foreach ( check in level.custom_limited_weapon_checks ) + { + count = count + [[ check ]]( weapon ); + } + if ( count >= limit ) + { + return 0; + } + } + if ( isDefined( level.random_weapon_powerups ) ) + { + for ( powerupindex = 0; powerupindex < level.random_weapon_powerups.size; powerupindex++ ) + { + if ( isDefined( level.random_weapon_powerups[ powerupindex ] ) && level.random_weapon_powerups[ powerupindex ].base_weapon == weapon ) + { + count++; + if ( count >= limit ) + { + return 0; + } + } + } + } + } + return 1; +} + +add_custom_limited_weapon_check( callback ) //checked matches cerberus output +{ + if ( !isDefined( level.custom_limited_weapon_checks ) ) + { + level.custom_limited_weapon_checks = []; + } + level.custom_limited_weapon_checks[ level.custom_limited_weapon_checks.size ] = callback; +} + +add_weapon_to_content( weapon_name, package ) //checked matches cerberus output +{ + if ( !isDefined( level.content_weapons ) ) + { + level.content_weapons = []; + } + level.content_weapons[ weapon_name ] = package; +} + +player_can_use_content( weapon ) //checked matches cerberus output +{ + if ( isDefined( level.content_weapons ) ) + { + if ( isDefined( level.content_weapons[ weapon ] ) ) + { + return self hasdlcavailable( level.content_weapons[ weapon ] ); + } + } + return 1; +} + +init_spawnable_weapon_upgrade() //checked partially changed to match cerberus output +{ + spawn_list = []; + spawnable_weapon_spawns = getstructarray( "weapon_upgrade", "targetname" ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "bowie_upgrade", "targetname" ), 1, 0 ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "sickle_upgrade", "targetname" ), 1, 0 ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "tazer_upgrade", "targetname" ), 1, 0 ); + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "buildable_wallbuy", "targetname" ), 1, 0 ); + if ( !is_true( level.headshots_only ) ) + { + spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "claymore_purchase", "targetname" ), 1, 0 ); + } + 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; + if ( location != "" ) + { + match_string = match_string + "_" + location; + } + match_string_plus_space = " " + match_string; + i = 0; + while ( i < spawnable_weapon_spawns.size ) + { + spawnable_weapon = spawnable_weapon_spawns[ i ]; + if ( isDefined( spawnable_weapon.zombie_weapon_upgrade ) && spawnable_weapon.zombie_weapon_upgrade == "sticky_grenade_zm" && is_true( level.headshots_only ) ) + { + i++; + continue; + } + if ( !isDefined( spawnable_weapon.script_noteworthy ) || spawnable_weapon.script_noteworthy == "" ) + { + spawn_list[ spawn_list.size ] = spawnable_weapon; + i++; + continue; + } + matches = strtok( spawnable_weapon.script_noteworthy, "," ); + for ( j = 0; j < matches.size; j++ ) + { + if ( matches[ j ] == match_string || matches[ j ] == match_string_plus_space ) + { + spawn_list[ spawn_list.size ] = spawnable_weapon; + } + } + i++; + } + tempmodel = spawn( "script_model", ( 0, 0, 0 ) ); + i = 0; + while ( i < spawn_list.size ) + { + clientfieldname = spawn_list[ i ].zombie_weapon_upgrade + "_" + spawn_list[ i ].origin; + numbits = 2; + if ( isDefined( level._wallbuy_override_num_bits ) ) + { + numbits = level._wallbuy_override_num_bits; + } + registerclientfield( "world", clientfieldname, 1, numbits, "int" ); + target_struct = getstruct( spawn_list[ i ].target, "targetname" ); + if ( spawn_list[ i ].targetname == "buildable_wallbuy" ) + { + bits = 4; + if ( isDefined( level.buildable_wallbuy_weapons ) ) + { + bits = getminbitcountfornum( level.buildable_wallbuy_weapons.size + 1 ); + } + registerclientfield( "world", clientfieldname + "_idx", 12000, bits, "int" ); + spawn_list[ i ].clientfieldname = clientfieldname; + i++; + continue; + } + precachemodel( target_struct.model ); + unitrigger_stub = spawnstruct(); + unitrigger_stub.origin = spawn_list[ i ].origin; + unitrigger_stub.angles = spawn_list[ i ].angles; + tempmodel.origin = spawn_list[ i ].origin; + tempmodel.angles = spawn_list[ i ].angles; + mins = undefined; + maxs = undefined; + absmins = undefined; + absmaxs = undefined; + tempmodel setmodel( target_struct.model ); + tempmodel useweaponhidetags( spawn_list[ i ].zombie_weapon_upgrade ); + mins = tempmodel getmins(); + maxs = tempmodel getmaxs(); + absmins = tempmodel getabsmins(); + absmaxs = tempmodel getabsmaxs(); + bounds = absmaxs - absmins; + unitrigger_stub.script_length = bounds[ 0 ] * 0.25; + unitrigger_stub.script_width = bounds[ 1 ]; + unitrigger_stub.script_height = bounds[ 2 ]; + unitrigger_stub.origin -= anglesToRight( unitrigger_stub.angles ) * ( unitrigger_stub.script_length * 0.4 ); + unitrigger_stub.target = spawn_list[ i ].target; + unitrigger_stub.targetname = spawn_list[ i ].targetname; + unitrigger_stub.cursor_hint = "HINT_NOICON"; + if ( spawn_list[ i ].targetname == "weapon_upgrade" ) + { + unitrigger_stub.cost = get_weapon_cost( spawn_list[ i ].zombie_weapon_upgrade ); + if ( !is_true( level.monolingustic_prompt_format ) ) + { + unitrigger_stub.hint_string = get_weapon_hint( spawn_list[ i ].zombie_weapon_upgrade ); + unitrigger_stub.hint_parm1 = unitrigger_stub.cost; + } + else + { + unitrigger_stub.hint_parm1 = get_weapon_display_name( spawn_list[ i ].zombie_weapon_upgrade ); + if ( !isDefined( unitrigger_stub.hint_parm1 ) || unitrigger_stub.hint_parm1 == "" || unitrigger_stub.hint_parm1 == "none" ) + { + unitrigger_stub.hint_parm1 = "missing weapon name " + spawn_list[ i ].zombie_weapon_upgrade; + } + unitrigger_stub.hint_parm2 = unitrigger_stub.cost; + unitrigger_stub.hint_string = &"ZOMBIE_WEAPONCOSTONLY"; + } + } + unitrigger_stub.weapon_upgrade = spawn_list[ i ].zombie_weapon_upgrade; + unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + unitrigger_stub.require_look_at = 1; + if ( isDefined( spawn_list[ i ].require_look_from ) && spawn_list[ i ].require_look_from ) + { + unitrigger_stub.require_look_from = 1; + } + unitrigger_stub.zombie_weapon_upgrade = spawn_list[ i ].zombie_weapon_upgrade; + unitrigger_stub.clientfieldname = clientfieldname; + maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); + if ( is_melee_weapon( unitrigger_stub.zombie_weapon_upgrade ) ) + { + if ( unitrigger_stub.zombie_weapon_upgrade == "tazer_knuckles_zm" && isDefined( level.taser_trig_adjustment ) ) + { + unitrigger_stub.origin += level.taser_trig_adjustment; + } + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::weapon_spawn_think ); + } + else if ( unitrigger_stub.zombie_weapon_upgrade == "claymore_zm" ) + { + unitrigger_stub.prompt_and_visibility_func = ::claymore_unitrigger_update_prompt; + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::buy_claymores ); + } + else + { + unitrigger_stub.prompt_and_visibility_func = ::wall_weapon_update_prompt; + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::weapon_spawn_think ); + } + spawn_list[ i ].trigger_stub = unitrigger_stub; + i++; + } + level._spawned_wallbuys = spawn_list; + tempmodel delete(); +} + +add_dynamic_wallbuy( weapon, wallbuy, pristine ) //checked partially changed to match cerberus output +{ + spawned_wallbuy = undefined; + for ( i = 0; i < level._spawned_wallbuys.size; i++ ) + { + if ( level._spawned_wallbuys[ i ].target == wallbuy ) + { + spawned_wallbuy = level._spawned_wallbuys[ i ]; + break; + } + } + if ( !isDefined( spawned_wallbuy ) ) + { + return; + } + if ( isDefined( spawned_wallbuy.trigger_stub ) ) + { + return; + } + target_struct = getstruct( wallbuy, "targetname" ); + wallmodel = spawn_weapon_model( weapon, undefined, target_struct.origin, target_struct.angles ); + clientfieldname = spawned_wallbuy.clientfieldname; + model = getweaponmodel( weapon ); + unitrigger_stub = spawnstruct(); + unitrigger_stub.origin = target_struct.origin; + unitrigger_stub.angles = target_struct.angles; + wallmodel.origin = target_struct.origin; + wallmodel.angles = target_struct.angles; + mins = undefined; + maxs = undefined; + absmins = undefined; + absmaxs = undefined; + wallmodel setmodel( model ); + wallmodel useweaponhidetags( weapon ); + mins = wallmodel getmins(); + maxs = wallmodel getmaxs(); + absmins = wallmodel getabsmins(); + absmaxs = wallmodel getabsmaxs(); + bounds = absmaxs - absmins; + unitrigger_stub.script_length = bounds[ 0 ] * 0.25; + unitrigger_stub.script_width = bounds[ 1 ]; + unitrigger_stub.script_height = bounds[ 2 ]; + unitrigger_stub.origin -= anglesToRight( unitrigger_stub.angles ) * ( unitrigger_stub.script_length * 0.4 ); + unitrigger_stub.target = spawned_wallbuy.target; + unitrigger_stub.targetname = "weapon_upgrade"; + unitrigger_stub.cursor_hint = "HINT_NOICON"; + unitrigger_stub.first_time_triggered = !pristine; + if ( !is_melee_weapon( weapon ) ) + { + if ( pristine || weapon == "claymore_zm" ) + { + unitrigger_stub.hint_string = get_weapon_hint( weapon ); + } + else + { + unitrigger_stub.hint_string = get_weapon_hint_ammo(); + } + unitrigger_stub.cost = get_weapon_cost( weapon ); + unitrigger_stub.hint_parm1 = unitrigger_stub.cost; + } + unitrigger_stub.weapon_upgrade = weapon; + unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + unitrigger_stub.require_look_at = 1; + unitrigger_stub.zombie_weapon_upgrade = weapon; + unitrigger_stub.clientfieldname = clientfieldname; + maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); + if ( is_melee_weapon( weapon ) ) + { + if ( weapon == "tazer_knuckles_zm" && isDefined( level.taser_trig_adjustment ) ) + { + unitrigger_stub.origin += level.taser_trig_adjustment; + } + maps/mp/zombies/_zm_melee_weapon::add_stub( unitrigger_stub, weapon ); + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::melee_weapon_think ); + } + else if ( weapon == "claymore_zm" ) + { + unitrigger_stub.prompt_and_visibility_func = ::claymore_unitrigger_update_prompt; + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::buy_claymores ); + } + else + { + unitrigger_stub.prompt_and_visibility_func = ::wall_weapon_update_prompt; + maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::weapon_spawn_think ); + } + spawned_wallbuy.trigger_stub = unitrigger_stub; + weaponidx = undefined; + if ( isDefined( level.buildable_wallbuy_weapons ) ) + { + for ( i = 0; i < level.buildable_wallbuy_weapons.size; i++ ) + { + if ( weapon == level.buildable_wallbuy_weapons[ i ] ) + { + weaponidx = i; + break; + } + } + } + if ( isDefined( weaponidx ) ) + { + level setclientfield( clientfieldname + "_idx", weaponidx + 1 ); + wallmodel delete(); + if ( !pristine ) + { + level setclientfield( clientfieldname, 1 ); + } + } + else + { + level setclientfield( clientfieldname, 1 ); + wallmodel show(); + } +} + +wall_weapon_update_prompt( player ) //checked partially changed to match cerberus output //partially changed at own discretion +{ + weapon = self.stub.zombie_weapon_upgrade; + if ( isDefined( level.monolingustic_prompt_format ) && !level.monolingustic_prompt_format ) + { + player_has_weapon = player has_weapon_or_upgrade( weapon ); + if ( !player_has_weapon && is_true( level.weapons_using_ammo_sharing ) ) + { + shared_ammo_weapon = player get_shared_ammo_weapon( self.zombie_weapon_upgrade ); + if ( isDefined( shared_ammo_weapon ) ) + { + weapon = shared_ammo_weapon; + player_has_weapon = 1; + } + } + if ( !player_has_weapon ) + { + cost = get_weapon_cost( weapon ); + self.stub.hint_string = get_weapon_hint( weapon ); + self sethintstring( self.stub.hint_string, cost ); + } + else if ( is_true( level.use_legacy_weapon_prompt_format ) ) + { + cost = get_weapon_cost( weapon ); + ammo_cost = get_ammo_cost( weapon ); + self.stub.hint_string = get_weapon_hint_ammo(); + self sethintstring( self.stub.hint_string, cost, ammo_cost ); + } + else if ( player has_upgrade( weapon ) ) + { + ammo_cost = get_upgraded_ammo_cost( weapon ); + } + else + { + ammo_cost = get_ammo_cost( weapon ); + } + self.stub.hint_string = &"ZOMBIE_WEAPONAMMOONLY"; + self sethintstring( self.stub.hint_string, ammo_cost ); + } + else if ( !player has_weapon_or_upgrade( weapon ) ) + { + string_override = 0; + if ( is_true( player.pers_upgrades_awarded[ "nube" ] ) ) + { + string_override = maps/mp/zombies/_zm_pers_upgrades_functions::pers_nube_ammo_hint_string( player, weapon ); + } + if ( !string_override ) + { + cost = get_weapon_cost( weapon ); + weapon_display = get_weapon_display_name( weapon ); + if ( !isDefined( weapon_display ) || weapon_display == "" || weapon_display == "none" ) + { + weapon_display = "missing weapon name " + weapon; + } + self.stub.hint_string = &"ZOMBIE_WEAPONCOSTONLY"; + self sethintstring( self.stub.hint_string, weapon_display, cost ); + } + } + else if ( player has_upgrade( weapon ) ) + { + ammo_cost = get_upgraded_ammo_cost( weapon ); + } + else + { + ammo_cost = get_ammo_cost( weapon ); + } + self.stub.hint_string = &"ZOMBIE_WEAPONAMMOONLY"; + self sethintstring( self.stub.hint_string, ammo_cost ); + self.stub.cursor_hint = "HINT_WEAPON"; + self.stub.cursor_hint_weapon = weapon; + self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon ); + return 1; +} + +reset_wallbuy_internal( set_hint_string ) //checked matches cerberus output +{ + if ( isDefined( self.first_time_triggered ) && self.first_time_triggered == 1 ) + { + self.first_time_triggered = 0; + if ( isDefined( self.clientfieldname ) ) + { + level setclientfield( self.clientfieldname, 0 ); + } + if ( set_hint_string ) + { + hint_string = get_weapon_hint( self.zombie_weapon_upgrade ); + cost = get_weapon_cost( self.zombie_weapon_upgrade ); + self sethintstring( hint_string, cost ); + } + } +} + +reset_wallbuys() //checked changed to match cerberus output +{ + weapon_spawns = []; + weapon_spawns = getentarray( "weapon_upgrade", "targetname" ); + melee_and_grenade_spawns = []; + melee_and_grenade_spawns = getentarray( "bowie_upgrade", "targetname" ); + melee_and_grenade_spawns = arraycombine( melee_and_grenade_spawns, getentarray( "sickle_upgrade", "targetname" ), 1, 0 ); + melee_and_grenade_spawns = arraycombine( melee_and_grenade_spawns, getentarray( "tazer_upgrade", "targetname" ), 1, 0 ); + if ( !is_true( level.headshots_only ) ) + { + melee_and_grenade_spawns = arraycombine( melee_and_grenade_spawns, getentarray( "claymore_purchase", "targetname" ), 1, 0 ); + } + for ( i = 0; i < weapon_spawns.size; i++ ) + { + weapon_spawns[ i ] reset_wallbuy_internal( 1 ); + } + for ( i = 0; i < melee_and_grenade_spawns.size; i++ ) + { + melee_and_grenade_spawns[ i ] reset_wallbuy_internal( 0 ); + } + if ( isDefined( level._unitriggers ) ) + { + candidates = []; + for ( i = 0; i < level._unitriggers.trigger_stubs.size; i++ ) + { + stub = level._unitriggers.trigger_stubs[ i ]; + tn = stub.targetname; + if ( tn == "weapon_upgrade" || tn == "bowie_upgrade" || tn == "sickle_upgrade" || tn == "tazer_upgrade" || tn == "claymore_purchase" ) + { + stub.first_time_triggered = 0; + if ( isDefined( stub.clientfieldname ) ) + { + level setclientfield( stub.clientfieldname, 0 ); + } + if ( tn == "weapon_upgrade" ) + { + stub.hint_string = get_weapon_hint( stub.zombie_weapon_upgrade ); + stub.cost = get_weapon_cost( stub.zombie_weapon_upgrade ); + stub.hint_parm1 = stub.cost; + } + } + } + } +} + +init_weapon_upgrade() //checked changed to match cerberus output +{ + init_spawnable_weapon_upgrade(); + weapon_spawns = []; + weapon_spawns = getentarray( "weapon_upgrade", "targetname" ); + for ( i = 0; i < weapon_spawns.size; i++ ) + { + if ( !is_true( level.monolingustic_prompt_format ) ) + { + hint_string = get_weapon_hint( weapon_spawns[ i ].zombie_weapon_upgrade ); + cost = get_weapon_cost( weapon_spawns[ i ].zombie_weapon_upgrade ); + weapon_spawns[ i ] sethintstring( hint_string, cost ); + weapon_spawns[ i ] setcursorhint( "HINT_NOICON" ); + } + else + { + cost = get_weapon_cost( weapon_spawns[ i ].zombie_weapon_upgrade ); + weapon_display = get_weapon_display_name( weapon_spawns[ i ].zombie_weapon_upgrade ); + if ( !isDefined( weapon_display ) || weapon_display == "" || weapon_display == "none" ) + { + weapon_display = "missing weapon name " + weapon_spawns[ i ].zombie_weapon_upgrade; + } + hint_string = &"ZOMBIE_WEAPONCOSTONLY"; + weapon_spawns[ i ] sethintstring( hint_string, weapon_display, cost ); + } + weapon_spawns[ i ] usetriggerrequirelookat(); + weapon_spawns[ i ] thread weapon_spawn_think(); + model = getent( weapon_spawns[ i ].target, "targetname" ); + if ( isDefined( model ) ) + { + model useweaponhidetags( weapon_spawns[ i ].zombie_weapon_upgrade ); + model hide(); + } + } +} + +init_weapon_toggle() //checked changed to match cerberus output +{ + if ( !isDefined( level.magic_box_weapon_toggle_init_callback ) ) + { + return; + } + level.zombie_weapon_toggles = []; + level.zombie_weapon_toggle_max_active_count = 0; + level.zombie_weapon_toggle_active_count = 0; + precachestring( &"ZOMBIE_WEAPON_TOGGLE_DISABLED" ); + precachestring( &"ZOMBIE_WEAPON_TOGGLE_ACTIVATE" ); + precachestring( &"ZOMBIE_WEAPON_TOGGLE_DEACTIVATE" ); + precachestring( &"ZOMBIE_WEAPON_TOGGLE_ACQUIRED" ); + level.zombie_weapon_toggle_disabled_hint = &"ZOMBIE_WEAPON_TOGGLE_DISABLED"; + level.zombie_weapon_toggle_activate_hint = &"ZOMBIE_WEAPON_TOGGLE_ACTIVATE"; + level.zombie_weapon_toggle_deactivate_hint = &"ZOMBIE_WEAPON_TOGGLE_DEACTIVATE"; + level.zombie_weapon_toggle_acquired_hint = &"ZOMBIE_WEAPON_TOGGLE_ACQUIRED"; + precachemodel( "zombie_zapper_cagelight" ); + precachemodel( "zombie_zapper_cagelight_green" ); + precachemodel( "zombie_zapper_cagelight_red" ); + precachemodel( "zombie_zapper_cagelight_on" ); + level.zombie_weapon_toggle_disabled_light = "zombie_zapper_cagelight"; + level.zombie_weapon_toggle_active_light = "zombie_zapper_cagelight_green"; + level.zombie_weapon_toggle_inactive_light = "zombie_zapper_cagelight_red"; + level.zombie_weapon_toggle_acquired_light = "zombie_zapper_cagelight_on"; + weapon_toggle_ents = []; + weapon_toggle_ents = getentarray( "magic_box_weapon_toggle", "targetname" ); + for ( i = 0; i < weapon_toggle_ents.size; i++ ) + { + struct = spawnstruct(); + struct.trigger = weapon_toggle_ents[ i ]; + struct.weapon_name = struct.trigger.script_string; + struct.upgrade_name = level.zombie_weapons[ struct.trigger.script_string ].upgrade_name; + struct.enabled = 0; + struct.active = 0; + struct.acquired = 0; + target_array = []; + target_array = getentarray( struct.trigger.target, "targetname" ); + for ( j = 0; j < target_array.size; j++ ) + { + switch( target_array[ j ].script_string ) + { + case "light": + struct.light = target_array[ j ]; + struct.light setmodel( level.zombie_weapon_toggle_disabled_light ); + break; + case "weapon": + struct.weapon_model = target_array[ j ]; + struct.weapon_model hide(); + break; + } + } + struct.trigger sethintstring( level.zombie_weapon_toggle_disabled_hint ); + struct.trigger setcursorhint( "HINT_NOICON" ); + struct.trigger usetriggerrequirelookat(); + struct thread weapon_toggle_think(); + level.zombie_weapon_toggles[ struct.weapon_name ] = struct; + } + level thread [[ level.magic_box_weapon_toggle_init_callback ]](); +} + +get_weapon_toggle( weapon_name ) //checked changed to match cerberus output +{ + if ( !isDefined( level.zombie_weapon_toggles ) ) + { + return undefined; + } + if ( isDefined( level.zombie_weapon_toggles[ weapon_name ] ) ) + { + return level.zombie_weapon_toggles[ weapon_name ]; + } + keys = getarraykeys( level.zombie_weapon_toggles ); + for ( i = 0; i < keys.size; i++ ) + { + if ( weapon_name == level.zombie_weapon_toggles[ keys[ i ] ].upgrade_name ) + { + return level.zombie_weapon_toggles[ keys[ i ] ]; + } + } + return undefined; +} + +is_weapon_toggle( weapon_name ) //checked matches cerberus output +{ + return isDefined( get_weapon_toggle( weapon_name ) ); +} + +disable_weapon_toggle( weapon_name ) //checked matches cerberus output +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isDefined( toggle ) ) + { + return; + } + if ( toggle.active ) + { + level.zombie_weapon_toggle_active_count--; + + } + toggle.enabled = 0; + toggle.active = 0; + toggle.light setmodel( level.zombie_weapon_toggle_disabled_light ); + toggle.weapon_model hide(); + toggle.trigger sethintstring( level.zombie_weapon_toggle_disabled_hint ); +} + +enable_weapon_toggle( weapon_name ) //checked matches cerberus output +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isDefined( toggle ) ) + { + return; + } + toggle.enabled = 1; + toggle.weapon_model show(); + toggle.weapon_model useweaponhidetags( weapon_name ); + deactivate_weapon_toggle( weapon_name ); +} + +activate_weapon_toggle( weapon_name, trig_for_vox ) //checked matches cerberus output +{ + if ( level.zombie_weapon_toggle_active_count >= level.zombie_weapon_toggle_max_active_count ) + { + if ( isDefined( trig_for_vox ) ) + { + trig_for_vox thread maps/mp/zombies/_zm_audio::weapon_toggle_vox( "max" ); + } + return; + } + toggle = get_weapon_toggle( weapon_name ); + if ( !isDefined( toggle ) ) + { + return; + } + if ( isDefined( trig_for_vox ) ) + { + trig_for_vox thread maps/mp/zombies/_zm_audio::weapon_toggle_vox( "activate", weapon_name ); + } + level.zombie_weapon_toggle_active_count++; + toggle.active = 1; + toggle.light setmodel( level.zombie_weapon_toggle_active_light ); + toggle.trigger sethintstring( level.zombie_weapon_toggle_deactivate_hint ); +} + +deactivate_weapon_toggle( weapon_name, trig_for_vox ) //checked matches cerberus output +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isDefined( toggle ) ) + { + return; + } + if ( isDefined( trig_for_vox ) ) + { + trig_for_vox thread maps/mp/zombies/_zm_audio::weapon_toggle_vox( "deactivate", weapon_name ); + } + if ( toggle.active ) + { + level.zombie_weapon_toggle_active_count--; + + } + toggle.active = 0; + toggle.light setmodel( level.zombie_weapon_toggle_inactive_light ); + toggle.trigger sethintstring( level.zombie_weapon_toggle_activate_hint ); +} + +acquire_weapon_toggle( weapon_name, player ) //checked matches cerberus output +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isDefined( toggle ) ) + { + return; + } + if ( !toggle.active || toggle.acquired ) + { + return; + } + toggle.acquired = 1; + toggle.light setmodel( level.zombie_weapon_toggle_acquired_light ); + toggle.trigger sethintstring( level.zombie_weapon_toggle_acquired_hint ); + toggle thread unacquire_weapon_toggle_on_death_or_disconnect_thread( player ); } -include_zombie_weapon( weapon_name, in_box, collector, weighting_func ) +unacquire_weapon_toggle_on_death_or_disconnect_thread( player ) //checked matches cerberus output { - if ( !isdefined( level.zombie_include_weapons ) ) - level.zombie_include_weapons = []; - - if ( !isdefined( in_box ) ) - in_box = 1; -/# - println( "ZM >> Including weapon - " + weapon_name ); -#/ - level.zombie_include_weapons[weapon_name] = in_box; - precacheitem( weapon_name ); - - if ( !isdefined( weighting_func ) ) - level.weapon_weighting_funcs[weapon_name] = ::default_weighting_func; - else - level.weapon_weighting_funcs[weapon_name] = weighting_func; + self notify( "end_unacquire_weapon_thread" ); + self endon( "end_unacquire_weapon_thread" ); + player waittill_any( "spawned_spectator", "disconnect" ); + unacquire_weapon_toggle( self.weapon_name ); +} + +unacquire_weapon_toggle( weapon_name ) //checked matches cerberus output +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isDefined( toggle ) ) + { + return; + } + if ( !toggle.active || !toggle.acquired ) + { + return; + } + toggle.acquired = 0; + toggle.light setmodel( level.zombie_weapon_toggle_active_light ); + toggle.trigger sethintstring( level.zombie_weapon_toggle_deactivate_hint ); + toggle notify( "end_unacquire_weapon_thread" ); +} + +weapon_toggle_think() //checked changed to match cerberus output +{ + for ( ;; ) + { + self.trigger waittill( "trigger", player ); + if ( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0.5 ); + continue; + } + if ( !self.enabled || self.acquired ) + { + self.trigger thread maps/mp/zombies/_zm_audio::weapon_toggle_vox( "max" ); + continue; + } + if ( !self.active ) + { + activate_weapon_toggle( self.weapon_name, self.trigger ); + break; + } + deactivate_weapon_toggle( self.weapon_name, self.trigger ); + } +} + +get_weapon_hint( weapon_name ) //checked matches cerberus output +{ + return level.zombie_weapons[ weapon_name ].hint; +} + +get_weapon_cost( weapon_name ) //checked matches cerberus output +{ + return level.zombie_weapons[ weapon_name ].cost; +} + +get_ammo_cost( weapon_name ) //checked matches cerberus output +{ + return level.zombie_weapons[ weapon_name ].ammo_cost; +} + +get_upgraded_ammo_cost( weapon_name ) //checked matches cerberus output +{ + if ( isDefined( level.zombie_weapons[ weapon_name ].upgraded_ammo_cost ) ) + { + return level.zombie_weapons[ weapon_name ].upgraded_ammo_cost; + } + return 4500; +} + +get_weapon_display_name( weapon_name ) //checked changed to match cerberus output +{ + weapon_display = getweapondisplayname( weapon_name ); + if ( !isDefined( weapon_display ) || weapon_display == "" || weapon_display == "none" ) + { + weapon_display = &"MPUI_NONE"; + } + return weapon_display; +} + +get_is_in_box( weapon_name ) //checked matches cerberus output +{ + return level.zombie_weapons[ weapon_name ].is_in_box; +} + +weapon_supports_default_attachment( weaponname ) //checked matches cerberus output +{ + weaponname = get_base_weapon_name( weaponname ); + if ( isDefined( weaponname ) ) + { + attachment = level.zombie_weapons[ weaponname ].default_attachment; + } + return isDefined( attachment ); +} + +default_attachment( weaponname ) //checked matches cerberus output +{ + weaponname = get_base_weapon_name( weaponname ); + if ( isDefined( weaponname ) ) + { + attachment = level.zombie_weapons[ weaponname ].default_attachment; + } + if ( isDefined( attachment ) ) + { + return attachment; + } + else + { + return "none"; + } +} + +weapon_supports_attachments( weaponname ) //checked changed at own discretion +{ + weaponname = get_base_weapon_name( weaponname ); + if ( isDefined( weaponname ) ) + { + attachments = level.zombie_weapons[ weaponname ].addon_attachments; + } + if ( isDefined( attachments ) && attachments.size > 0 ) //was 1 + { + return 1; + } + return 0; +} + +random_attachment( weaponname, exclude ) //checked changed to match cerberus output +{ + lo = 0; + if ( isDefined( level.zombie_weapons[ weaponname ].addon_attachments ) && level.zombie_weapons[ weaponname ].addon_attachments.size > 0 ) + { + attachments = level.zombie_weapons[ weaponname ].addon_attachments; + } + else + { + attachments = getweaponsupportedattachments( weaponname ); + lo = 1; + } + minatt = lo; + if ( isDefined( exclude ) && exclude != "none" ) + { + minatt = lo + 1; + } + if ( attachments.size > minatt ) + { + while ( 1 ) + { + idx = randomint( attachments.size - lo ) + lo; + if ( !isDefined( exclude ) || attachments[ idx ] != exclude ) + { + return attachments[ idx ]; + } + } + } + return "none"; +} + +get_base_name( weaponname ) //checked matches cerberus output +{ + split = strtok( weaponname, "+" ); + if ( split.size > 1 ) + { + return split[ 0 ]; + } + return weaponname; +} + +get_attachment_name( weaponname, att_id ) //checked changed to match cerberus output +{ + split = strtok( weaponname, "+" ); + if ( isDefined( att_id ) ) + { + attachment = att_id + 1; + if ( split.size > attachment ) + { + return split[ attachment ]; + } + } + else if ( split.size > 1 ) + { + att = split[ 1 ]; + for ( idx = 2; split.size > idx; idx++ ) + { + att = ( att + "+" ) + split[ idx ]; + } + return att; + } + return undefined; +} + +get_attachment_index( weapon ) //checked changed to match cerberus output +{ + att = get_attachment_name( weapon ); + if ( att == "none" ) + { + return -1; + } + base = get_base_name( weapon ); + if ( att == level.zombie_weapons[ base ].default_attachment ) + { + return 0; + } + if ( isDefined( level.zombie_weapons[ base ].addon_attachments ) ) + { + for ( i = 0; i < level.zombie_weapons[base].addon_attachments.size; i++ ) + { + if ( level.zombie_weapons[ base ].addon_attachments[ i ] == att ) + { + return i + 1; + } + } + } + return -1; +} + +weapon_supports_this_attachment( weapon, att ) //checked changed to match cerberus output +{ + base = get_base_name( weapon ); + if ( att == level.zombie_weapons[ base ].default_attachment ) + { + return 1; + } + if ( isDefined( level.zombie_weapons[ base ].addon_attachments ) ) + { + for(i = 0; i < level.zombie_weapons[base].addon_attachments.size; i++) + { + if ( level.zombie_weapons[ base ].addon_attachments[ i ] == att ) + { + return 1; + } + } + } + return 0; +} + +has_attachment( weaponname, att ) //checked matches cerberus output +{ + split = strtok( weaponname, "+" ); + idx = 1; + while ( split.size > idx ) + { + if ( att == split[ idx ] ) + { + return 1; + } + } + return 0; +} + +get_base_weapon_name( upgradedweaponname, base_if_not_upgraded ) //checked matches cerberus output +{ + if ( !isDefined( upgradedweaponname ) || upgradedweaponname == "" ) + { + return undefined; + } + upgradedweaponname = tolower( upgradedweaponname ); + upgradedweaponname = get_base_name( upgradedweaponname ); + if ( isDefined( level.zombie_weapons_upgraded[ upgradedweaponname ] ) ) + { + return level.zombie_weapons_upgraded[ upgradedweaponname ]; + } + if ( isDefined( base_if_not_upgraded ) && base_if_not_upgraded ) + { + return upgradedweaponname; + } + return undefined; +} + +get_upgrade_weapon( weaponname, add_attachment ) //checked changed to match cerberus output +{ + rootweaponname = tolower( weaponname ); + rootweaponname = get_base_name( rootweaponname ); + baseweaponname = get_base_weapon_name( rootweaponname, 1 ); + newweapon = rootweaponname; + if ( !is_weapon_upgraded( rootweaponname ) ) + { + newweapon = level.zombie_weapons[ rootweaponname ].upgrade_name; + } + if ( is_true( add_attachment ) && is_true( level.zombiemode_reusing_pack_a_punch ) ) + { + oldatt = get_attachment_name( weaponname ); + att = random_attachment( baseweaponname, oldatt ); + newweapon = newweapon + "+" + att; + } + else if ( isDefined( level.zombie_weapons[ rootweaponname ] ) && isDefined( level.zombie_weapons[ rootweaponname ].default_attachment ) ) + { + att = level.zombie_weapons[ rootweaponname ].default_attachment; + newweapon = newweapon + "+" + att; + } + return newweapon; +} + +can_upgrade_weapon( weaponname ) //checked changed to match cerberus output +{ + if ( !isDefined( weaponname ) || weaponname == "" || weaponname == "zombie_fists_zm" ) + { + return 0; + } + weaponname = tolower( weaponname ); + weaponname = get_base_name( weaponname ); + if ( !is_weapon_upgraded( weaponname ) && isDefined( level.zombie_weapons[ weaponname ].upgrade_name ) ) + { + return 1; + } + if ( is_true( level.zombiemode_reusing_pack_a_punch ) && weapon_supports_attachments( weaponname ) ) + { + return 1; + } + return 0; +} + +will_upgrade_weapon_as_attachment( weaponname ) //checked changed to match cerberus output +{ + if ( !isDefined( weaponname ) || weaponname == "" || weaponname == "zombie_fists_zm" ) + { + return 0; + } + weaponname = tolower( weaponname ); + weaponname = get_base_name( weaponname ); + if ( !is_weapon_upgraded( weaponname ) ) + { + return 0; + } + if ( is_true( level.zombiemode_reusing_pack_a_punch ) && weapon_supports_attachments( weaponname ) ) + { + return 1; + } + return 0; +} + +is_weapon_upgraded( weaponname ) //checked changed to match cerberus output +{ + if ( !isDefined( weaponname ) || weaponname == "" || weaponname == "zombie_fists_zm" ) + { + return 0; + } + weaponname = tolower( weaponname ); + weaponname = get_base_name( weaponname ); + if ( isDefined( level.zombie_weapons_upgraded[ weaponname ] ) ) + { + return 1; + } + return 0; +} + +get_weapon_with_attachments( weaponname ) //checked changed to match cerberus output +{ + if ( self hasweapon( weaponname ) ) + { + return weaponname; + } + if ( is_true( level.zombiemode_reusing_pack_a_punch ) ) + { + weaponname = tolower( weaponname ); + weaponname = get_base_name( weaponname ); + weapons = self getweaponslist( 1 ); + foreach ( weapon in weapons ) + { + weapon = tolower( weapon ); + weapon_base = get_base_name( weapon ); + if ( weaponname == weapon_base ) + { + return weapon; + } + } + } + return undefined; +} + +has_weapon_or_attachments( weaponname ) //checked changed to match cerberus output +{ + if ( self hasweapon( weaponname ) ) + { + return 1; + } + if ( is_true( level.zombiemode_reusing_pack_a_punch ) ) + { + weaponname = tolower( weaponname ); + weaponname = get_base_name( weaponname ); + weapons = self getweaponslist( 1 ); + foreach ( weapon in weapons ) + { + weapon = tolower( weapon ); + weapon = get_base_name( weapon ); + if ( weaponname == weapon ) + { + return 1; + } + } + } + return 0; +} + +has_upgrade( weaponname ) //checked matches cerberus output +{ + weaponname = get_base_name( weaponname ); + has_upgrade = 0; + if ( isDefined( level.zombie_weapons[ weaponname ] ) && isDefined( level.zombie_weapons[ weaponname ].upgrade_name ) ) + { + has_upgrade = self has_weapon_or_attachments( level.zombie_weapons[ weaponname ].upgrade_name ); + } + if ( !has_upgrade && weaponname == "knife_ballistic_zm" ) + { + has_weapon = self maps/mp/zombies/_zm_melee_weapon::has_upgraded_ballistic_knife(); + } + return has_upgrade; +} + +has_weapon_or_upgrade( weaponname ) //checked changed at own discretion +{ + weaponname = get_base_name( weaponname ); + upgradedweaponname = weaponname; + if ( isDefined( level.zombie_weapons[ weaponname ] ) && isDefined( level.zombie_weapons[ weaponname ].upgrade_name ) ) + { + upgradedweaponname = level.zombie_weapons[ weaponname ].upgrade_name; + } + has_weapon = 0; + if ( isDefined( level.zombie_weapons[ weaponname ] ) ) + { + if ( self has_weapon_or_attachments( weaponname ) || self has_upgrade( weaponname ) ) + { + has_weapon = 1; + } + } + if ( !has_weapon && weaponname == "knife_ballistic_zm" ) + { + has_weapon = self maps/mp/zombies/_zm_melee_weapon::has_any_ballistic_knife(); + } + if ( !has_weapon && is_equipment( weaponname ) ) + { + has_weapon = self is_equipment_active( weaponname ); + } + return has_weapon; +} + +add_shared_ammo_weapon( str_weapon, str_base_weapon ) //checked matches cerberus output +{ + level.zombie_weapons[ str_weapon ].shared_ammo_weapon = str_base_weapon; +} + +get_shared_ammo_weapon( base_weapon ) //checked changed to match cerberus output +{ + base_weapon = get_base_name( base_weapon ); + weapons = self getweaponslist( 1 ); + foreach ( weapon in weapons ) + { + weapon = tolower( weapon ); + weapon = get_base_name( weapon ); + if ( !isdefined( level.zombie_weapons[ weapon ] ) && isdefined( level.zombie_weapons_upgraded[ weapon ] ) ) + { + weapon = level.zombie_weapons_upgraded[ weapon ]; + } + if ( isdefined( level.zombie_weapons[ weapon ] ) && isdefined( level.zombie_weapons[ weapon ].shared_ammo_weapon ) && level.zombie_weapons[ weapon ].shared_ammo_weapon == base_weapon ) + { + return weapon; + } + } + return undefined; +} + +get_player_weapon_with_same_base( weaponname ) //checked changed tp match cerberus output +{ + weaponname = tolower( weaponname ); + weaponname = get_base_name( weaponname ); + retweapon = get_weapon_with_attachments( weaponname ); + if ( !isDefined( retweapon ) ) + { + if ( isDefined( level.zombie_weapons[ weaponname ] ) ) + { + retweapon = get_weapon_with_attachments( level.zombie_weapons[ weaponname ].upgrade_name ); + } + else if ( isDefined( level.zombie_weapons_upgraded[ weaponname ] ) ) + { + return get_weapon_with_attachments( level.zombie_weapons_upgraded[ weaponname ] ); + } + } + return retweapon; +} + +get_weapon_hint_ammo() //checked matches cerberus output +{ + if ( !is_true( level.has_pack_a_punch ) ) + { + return &"ZOMBIE_WEAPONCOSTAMMO"; + } + else + { + return &"ZOMBIE_WEAPONCOSTAMMO_UPGRADE"; + } +} + +weapon_set_first_time_hint( cost, ammo_cost ) //checked matches cerberus output +{ + self sethintstring( get_weapon_hint_ammo(), cost, ammo_cost ); +} + +weapon_spawn_think() //checked changed to match cerberus output +{ + cost = get_weapon_cost( self.zombie_weapon_upgrade ); + ammo_cost = get_ammo_cost( self.zombie_weapon_upgrade ); + is_grenade = weapontype( self.zombie_weapon_upgrade ) == "grenade"; + shared_ammo_weapon = undefined; + second_endon = undefined; + if ( isDefined( self.stub ) ) + { + second_endon = "kill_trigger"; + self.first_time_triggered = self.stub.first_time_triggered; + } + if ( isDefined( self.stub ) && is_true( self.stub.trigger_per_player ) ) + { + self thread decide_hide_show_hint( "stop_hint_logic", second_endon, self.parent_player ); + } + else + { + self thread decide_hide_show_hint( "stop_hint_logic", second_endon ); + } + if ( is_grenade ) + { + self.first_time_triggered = 0; + hint = get_weapon_hint( self.zombie_weapon_upgrade ); + self sethintstring( hint, cost ); + } + else if ( !isDefined( self.first_time_triggered ) ) + { + self.first_time_triggered = 0; + if ( isDefined( self.stub ) ) + { + self.stub.first_time_triggered = 0; + } + } + else if ( self.first_time_triggered ) + { + if ( is_true( level.use_legacy_weapon_prompt_format ) ) + { + self weapon_set_first_time_hint( cost, get_ammo_cost( self.zombie_weapon_upgrade ) ); + } + } + for ( ;; ) + { + self waittill( "trigger", player ); + if ( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0.5 ); + continue; + } + if ( !player can_buy_weapon() ) + { + wait 0.1; + continue; + } + if ( isDefined( self.stub ) && is_true( self.stub.require_look_from ) ) + { + toplayer = player get_eye() - self.origin; + forward = -1 * anglesToRight( self.angles ); + dot = vectordot( toplayer, forward ); + if ( dot < 0 ) + { + continue; + } + } + if ( player has_powerup_weapon() ) + { + wait 0.1; + continue; + } + player_has_weapon = player has_weapon_or_upgrade( self.zombie_weapon_upgrade ); + if ( !player_has_weapon && is_true( level.weapons_using_ammo_sharing ) ) + { + shared_ammo_weapon = player get_shared_ammo_weapon( self.zombie_weapon_upgrade ); + if ( isDefined( shared_ammo_weapon ) ) + { + player_has_weapon = 1; + } + } + if ( is_true( level.pers_upgrade_nube ) ) + { + player_has_weapon = maps/mp/zombies/_zm_pers_upgrades_functions::pers_nube_should_we_give_raygun( player_has_weapon, player, self.zombie_weapon_upgrade ); + } + cost = get_weapon_cost( self.zombie_weapon_upgrade ); + if ( player maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() ) + { + cost = int( cost / 2 ); + } + if ( !player_has_weapon ) + { + if ( player.score >= cost ) + { + if ( self.first_time_triggered == 0 ) + { + self show_all_weapon_buys( player, cost, ammo_cost, is_grenade ); + } + player maps/mp/zombies/_zm_score::minus_to_player_score( cost, 1 ); + bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, cost, self.zombie_weapon_upgrade, self.origin, "weapon" ); + level notify( "weapon_bought", player, self.zombie_weapon_upgrade ); + if ( self.zombie_weapon_upgrade == "riotshield_zm" ) + { + player maps/mp/zombies/_zm_equipment::equipment_give( "riotshield_zm" ); + if ( isDefined( player.player_shield_reset_health ) ) + { + player [[ player.player_shield_reset_health ]](); + } + } + else if ( self.zombie_weapon_upgrade == "jetgun_zm" ) + { + player maps/mp/zombies/_zm_equipment::equipment_give( "jetgun_zm" ); + } + else if ( is_lethal_grenade( self.zombie_weapon_upgrade ) ) + { + player takeweapon( player get_player_lethal_grenade() ); + player set_player_lethal_grenade( self.zombie_weapon_upgrade ); + } + str_weapon = self.zombie_weapon_upgrade; + if ( is_true( level.pers_upgrade_nube ) ) + { + str_weapon = maps/mp/zombies/_zm_pers_upgrades_functions::pers_nube_weapon_upgrade_check( player, str_weapon ); + } + player weapon_give( str_weapon ); + player maps/mp/zombies/_zm_stats::increment_client_stat( "wallbuy_weapons_purchased" ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "wallbuy_weapons_purchased" ); + } + else + { + play_sound_on_ent( "no_purchase" ); + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_weapon" ); + } + } + else + { + str_weapon = self.zombie_weapon_upgrade; + if ( isDefined( shared_ammo_weapon ) ) + { + str_weapon = shared_ammo_weapon; + } + if ( is_true( level.pers_upgrade_nube ) ) + { + str_weapon = maps/mp/zombies/_zm_pers_upgrades_functions::pers_nube_weapon_ammo_check( player, str_weapon ); + } + if ( is_true( self.hacked ) ) + { + if ( !player has_upgrade( str_weapon ) ) + { + ammo_cost = 4500; + } + else + { + ammo_cost = get_ammo_cost( str_weapon ); + } + } + else if ( player has_upgrade( str_weapon ) ) + { + ammo_cost = 4500; + } + else + { + ammo_cost = get_ammo_cost( str_weapon ); + } + if ( is_true( player.pers_upgrades_awarded[ "nube" ] ) ) + { + ammo_cost = maps/mp/zombies/_zm_pers_upgrades_functions::pers_nube_override_ammo_cost( player, self.zombie_weapon_upgrade, ammo_cost ); + } + if ( player maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() ) + { + ammo_cost = int( ammo_cost / 2 ); + } + if ( str_weapon == "riotshield_zm" ) + { + play_sound_on_ent( "no_purchase" ); + } + else if ( player.score >= ammo_cost ) + { + if ( self.first_time_triggered == 0 ) + { + self show_all_weapon_buys( player, cost, ammo_cost, is_grenade ); + } + if ( player has_upgrade( str_weapon ) ) + { + player maps/mp/zombies/_zm_stats::increment_client_stat( "upgraded_ammo_purchased" ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "upgraded_ammo_purchased" ); + } + else + { + player maps/mp/zombies/_zm_stats::increment_client_stat( "ammo_purchased" ); + player maps/mp/zombies/_zm_stats::increment_player_stat( "ammo_purchased" ); + } + if ( str_weapon == "riotshield_zm" ) + { + if ( isDefined( player.player_shield_reset_health ) ) + { + ammo_given = player [[ player.player_shield_reset_health ]](); + } + else + { + ammo_given = 0; + } + } + else if ( player has_upgrade( str_weapon ) ) + { + ammo_given = player ammo_give( level.zombie_weapons[ str_weapon ].upgrade_name ); + } + else + { + ammo_given = player ammo_give( str_weapon ); + } + if ( ammo_given ) + { + player maps/mp/zombies/_zm_score::minus_to_player_score( ammo_cost, 1 ); + bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, ammo_cost, str_weapon, self.origin, "ammo" ); + } + } + else + { + play_sound_on_ent( "no_purchase" ); + if ( isDefined( level.custom_generic_deny_vo_func ) ) + { + player [[ level.custom_generic_deny_vo_func ]](); + } + else + { + player maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "no_money_weapon" ); + } + } + } + if ( isDefined( self.stub ) && isDefined( self.stub.prompt_and_visibility_func ) ) + { + self [[ self.stub.prompt_and_visibility_func ]]( player ); + } + } +} + +show_all_weapon_buys( player, cost, ammo_cost, is_grenade ) //checked changed to match cerberus output +{ + model = getent( self.target, "targetname" ); + if ( isDefined( model ) ) + { + model thread weapon_show( player ); + } + else if ( isDefined( self.clientfieldname ) ) + { + level setclientfield( self.clientfieldname, 1 ); + } + self.first_time_triggered = 1; + if ( isDefined( self.stub ) ) + { + self.stub.first_time_triggered = 1; + } + if ( !is_grenade ) + { + self weapon_set_first_time_hint( cost, ammo_cost ); + } + if ( !is_true( level.dont_link_common_wallbuys ) && isDefined( level._spawned_wallbuys ) ) + { + i = 0; + while ( i < level._spawned_wallbuys.size ) + { + wallbuy = level._spawned_wallbuys[ i ]; + if ( isDefined( self.stub ) && isDefined( wallbuy.trigger_stub ) && self.stub.clientfieldname == wallbuy.trigger_stub.clientfieldname ) + { + i++; + continue; + } + if ( self.zombie_weapon_upgrade == wallbuy.zombie_weapon_upgrade ) + { + if ( isDefined( wallbuy.trigger_stub ) && isDefined( wallbuy.trigger_stub.clientfieldname ) ) + { + level setclientfield( wallbuy.trigger_stub.clientfieldname, 1 ); + } + else if ( isDefined( wallbuy.target ) ) + { + model = getent( wallbuy.target, "targetname" ); + if ( isDefined( model ) ) + { + model thread weapon_show( player ); + } + } + if ( isDefined( wallbuy.trigger_stub ) ) + { + wallbuy.trigger_stub.first_time_triggered = 1; + if ( isDefined( wallbuy.trigger_stub.trigger ) ) + { + wallbuy.trigger_stub.trigger.first_time_triggered = 1; + if ( !is_grenade ) + { + wallbuy.trigger_stub.trigger weapon_set_first_time_hint( cost, ammo_cost ); + } + } + i++; + continue; + } + if ( !is_grenade ) + { + wallbuy weapon_set_first_time_hint( cost, ammo_cost ); + } + } + i++; + } + } +} + +weapon_show( player ) //checked matches cerberus output +{ + player_angles = vectorToAngles( player.origin - self.origin ); + player_yaw = player_angles[ 1 ]; + weapon_yaw = self.angles[ 1 ]; + if ( isDefined( self.script_int ) ) + { + weapon_yaw -= self.script_int; + } + yaw_diff = absAngleClamp180( player_yaw - weapon_yaw ); + if ( yaw_diff > 0 ) + { + yaw = weapon_yaw - 90; + } + else + { + yaw = weapon_yaw + 90; + } + self.og_origin = self.origin; + self.origin += anglesToForward( ( 0, yaw, 0 ) ) * 8; + wait 0.05; + self show(); + play_sound_at_pos( "weapon_show", self.origin, self ); + time = 1; + if ( !isDefined( self._linked_ent ) ) + { + self moveto( self.og_origin, time ); + } +} + +get_pack_a_punch_weapon_options( weapon ) //checked changed to match cerberus output +{ + if ( !isDefined( self.pack_a_punch_weapon_options ) ) + { + self.pack_a_punch_weapon_options = []; + } + if ( !is_weapon_upgraded( weapon ) ) + { + return self calcweaponoptions( 0, 0, 0, 0, 0 ); + } + if ( isDefined( self.pack_a_punch_weapon_options[ weapon ] ) ) + { + return self.pack_a_punch_weapon_options[ weapon ]; + } + smiley_face_reticle_index = 1; + base = get_base_name( weapon ); + camo_index = 39; + if ( level.script == "zm_prison" ) + { + camo_index = 40; + } + else if ( level.script == "zm_tomb" ) + { + camo_index = 45; + } + lens_index = randomintrange( 0, 6 ); + reticle_index = randomintrange( 0, 16 ); + reticle_color_index = randomintrange( 0, 6 ); + plain_reticle_index = 16; + r = randomint( 10 ); + use_plain = r < 3; + if ( base == "saritch_upgraded_zm" ) + { + reticle_index = smiley_face_reticle_index; + } + else if ( use_plain ) + { + reticle_index = plain_reticle_index; + } + scary_eyes_reticle_index = 8; + purple_reticle_color_index = 3; + if ( reticle_index == scary_eyes_reticle_index ) + { + reticle_color_index = purple_reticle_color_index; + } + letter_a_reticle_index = 2; + pink_reticle_color_index = 6; + if ( reticle_index == letter_a_reticle_index ) + { + reticle_color_index = pink_reticle_color_index; + } + letter_e_reticle_index = 7; + green_reticle_color_index = 1; + if ( reticle_index == letter_e_reticle_index ) + { + reticle_color_index = green_reticle_color_index; + } + self.pack_a_punch_weapon_options[ weapon ] = self calcweaponoptions( camo_index, lens_index, reticle_index, reticle_color_index ); + return self.pack_a_punch_weapon_options[ weapon ]; +} + +weapon_give( weapon, is_upgrade, magic_box, nosound ) //checked changed to match cerberus output +{ + primaryweapons = self getweaponslistprimaries(); + current_weapon = self getcurrentweapon(); + current_weapon = self maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( current_weapon ); + if ( !isDefined( is_upgrade ) ) + { + is_upgrade = 0; + } + weapon_limit = get_player_weapon_limit( self ); + if ( is_equipment( weapon ) ) + { + self maps/mp/zombies/_zm_equipment::equipment_give( weapon ); + } + if ( weapon == "riotshield_zm" ) + { + if ( isDefined( self.player_shield_reset_health ) ) + { + self [[ self.player_shield_reset_health ]](); + } + } + if ( self hasweapon( weapon ) ) + { + if ( issubstr( weapon, "knife_ballistic_" ) ) + { + self notify( "zmb_lost_knife" ); + } + self givestartammo( weapon ); + if ( !is_offhand_weapon( weapon ) ) + { + self switchtoweapon( weapon ); + } + return; + } + if ( is_melee_weapon( weapon ) ) + { + current_weapon = maps/mp/zombies/_zm_melee_weapon::change_melee_weapon( weapon, current_weapon ); + } + else if ( is_lethal_grenade( weapon ) ) + { + old_lethal = self get_player_lethal_grenade(); + if ( isDefined( old_lethal ) && old_lethal != "" ) + { + self takeweapon( old_lethal ); + unacquire_weapon_toggle( old_lethal ); + } + self set_player_lethal_grenade( weapon ); + } + else if ( is_tactical_grenade( weapon ) ) + { + old_tactical = self get_player_tactical_grenade(); + if ( isDefined( old_tactical ) && old_tactical != "" ) + { + self takeweapon( old_tactical ); + unacquire_weapon_toggle( old_tactical ); + } + self set_player_tactical_grenade( weapon ); + } + else if ( is_placeable_mine( weapon ) ) + { + old_mine = self get_player_placeable_mine(); + if ( isDefined( old_mine ) ) + { + self takeweapon( old_mine ); + unacquire_weapon_toggle( old_mine ); + } + self set_player_placeable_mine( weapon ); + } + if ( !is_offhand_weapon( weapon ) ) + { + self maps/mp/zombies/_zm_weapons::take_fallback_weapon(); + } + if ( primaryweapons.size >= weapon_limit ) + { + if ( is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) ) + { + current_weapon = undefined; + } + if ( isDefined( current_weapon ) ) + { + if ( !is_offhand_weapon( weapon ) ) + { + if ( current_weapon == "tesla_gun_zm" ) + { + level.player_drops_tesla_gun = 1; + } + if ( issubstr( current_weapon, "knife_ballistic_" ) ) + { + self notify( "zmb_lost_knife" ); + } + self takeweapon( current_weapon ); + unacquire_weapon_toggle( current_weapon ); + } + } + } + if ( isDefined( level.zombiemode_offhand_weapon_give_override ) ) + { + if ( self [[ level.zombiemode_offhand_weapon_give_override ]]( weapon ) ) + { + return; + } + } + if ( weapon == "cymbal_monkey_zm" ) + { + self maps/mp/zombies/_zm_weap_cymbal_monkey::player_give_cymbal_monkey(); + self play_weapon_vo( weapon, magic_box ); + return; + } + else if ( issubstr( weapon, "knife_ballistic_" ) ) + { + weapon = self maps/mp/zombies/_zm_melee_weapon::give_ballistic_knife( weapon, issubstr( weapon, "upgraded" ) ); + } + else if ( weapon == "claymore_zm" ) + { + self thread maps/mp/zombies/_zm_weap_claymore::claymore_setup(); + self play_weapon_vo( weapon, magic_box ); + return; + } + if ( isDefined( level.zombie_weapons_callbacks ) && isDefined( level.zombie_weapons_callbacks[ weapon ] ) ) + { + self thread [[ level.zombie_weapons_callbacks[ weapon ] ]](); + play_weapon_vo( weapon, magic_box ); + return; + } + if ( !is_true( nosound ) ) + { + self play_sound_on_ent( "purchase" ); + } + if ( weapon == "ray_gun_zm" ) + { + playsoundatposition( "mus_raygun_stinger", ( 0, 0, 0 ) ); + } + if ( !is_weapon_upgraded( weapon ) ) + { + self giveweapon( weapon ); + } + else + { + self giveweapon( weapon, 0, self get_pack_a_punch_weapon_options( weapon ) ); + } + acquire_weapon_toggle( weapon, self ); + self givestartammo( weapon ); + if ( !is_offhand_weapon( weapon ) ) + { + if ( !is_melee_weapon( weapon ) ) + { + self switchtoweapon( weapon ); + } + else + { + self switchtoweapon( current_weapon ); + } + } + self play_weapon_vo( weapon, magic_box ); +} + +play_weapon_vo( weapon, magic_box ) //checked matches cerberus output +{ + if ( isDefined( level._audio_custom_weapon_check ) ) + { + type = self [[ level._audio_custom_weapon_check ]]( weapon, magic_box ); + } + else + { + type = self weapon_type_check( weapon ); + } + if ( type == "crappy" ) + { + return; + } + if ( type != "favorite" && type != "upgrade" ) + { + type = weapon; + } + self maps/mp/zombies/_zm_audio::create_and_play_dialog( "weapon_pickup", type ); +} + +weapon_type_check( weapon ) //checked matches cerberus output +{ + if ( !isDefined( self.entity_num ) ) + { + return "crappy"; + } + weapon = get_base_name( weapon ); + if ( self is_favorite_weapon( weapon ) ) + { + return "favorite"; + } + if ( issubstr( weapon, "upgraded" ) ) + { + return "upgrade"; + } + else + { + return level.zombie_weapons[ weapon ].vox; + } +} + +get_player_index( player ) //checked matches cerberus output +{ + return player.characterindex; +} + +ammo_give( weapon ) //checked changed to match cerberus output +{ + give_ammo = 0; + if ( !is_offhand_weapon( weapon ) ) + { + weapon = get_weapon_with_attachments( weapon ); + if ( isDefined( weapon ) ) + { + stockmax = 0; + stockmax = weaponstartammo( weapon ); + clipcount = self getweaponammoclip( weapon ); + currstock = self getammocount( weapon ); + if ( ( currstock - clipcount ) >= stockmax ) + { + give_ammo = 0; + } + else + { + give_ammo = 1; + } + } + } + else if ( self has_weapon_or_upgrade( weapon ) ) + { + if ( self getammocount( weapon ) < weaponmaxammo( weapon ) ) + { + give_ammo = 1; + } + } + if ( give_ammo ) + { + self play_sound_on_ent( "purchase" ); + self givemaxammo( weapon ); + alt_weap = weaponaltweaponname( weapon ); + if ( alt_weap != "none" ) + { + self givemaxammo( alt_weap ); + } + return 1; + } + if ( !give_ammo ) + { + return 0; + } +} + +get_player_weapondata( player, weapon ) //checked matches cerberus output +{ + weapondata = []; + if ( !isDefined( weapon ) ) + { + weapondata[ "name" ] = player getcurrentweapon(); + } + else + { + weapondata[ "name" ] = weapon; + } + weapondata[ "dw_name" ] = weapondualwieldweaponname( weapondata[ "name" ] ); + weapondata[ "alt_name" ] = weaponaltweaponname( weapondata[ "name" ] ); + if ( weapondata[ "name" ] != "none" ) + { + weapondata[ "clip" ] = player getweaponammoclip( weapondata[ "name" ] ); + weapondata[ "stock" ] = player getweaponammostock( weapondata[ "name" ] ); + weapondata[ "fuel" ] = player getweaponammofuel( weapondata[ "name" ] ); + weapondata[ "heat" ] = player isweaponoverheating( 1, weapondata[ "name" ] ); + weapondata[ "overheat" ] = player isweaponoverheating( 0, weapondata[ "name" ] ); + } + else + { + weapondata[ "clip" ] = 0; + weapondata[ "stock" ] = 0; + weapondata[ "fuel" ] = 0; + weapondata[ "heat" ] = 0; + weapondata[ "overheat" ] = 0; + } + if ( weapondata[ "dw_name" ] != "none" ) + { + weapondata[ "lh_clip" ] = player getweaponammoclip( weapondata[ "dw_name" ] ); + } + else + { + weapondata[ "lh_clip" ] = 0; + } + if ( weapondata[ "alt_name" ] != "none" ) + { + weapondata[ "alt_clip" ] = player getweaponammoclip( weapondata[ "alt_name" ] ); + weapondata[ "alt_stock" ] = player getweaponammostock( weapondata[ "alt_name" ] ); + } + else + { + weapondata[ "alt_clip" ] = 0; + weapondata[ "alt_stock" ] = 0; + } + return weapondata; +} + +weapon_is_better( left, right ) //checked changed to match cerberus output +{ + if ( left != right ) + { + left_upgraded = !isDefined( level.zombie_weapons[ left ] ); + right_upgraded = !isDefined( level.zombie_weapons[ right ] ); + if ( left_upgraded && right_upgraded ) + { + leftatt = get_attachment_index( left ); + rightatt = get_attachment_index( right ); + return leftatt > rightatt; + } + else if ( left_upgraded ) + { + return 1; + } + } + return 0; +} + +merge_weapons( oldweapondata, newweapondata ) //checked matches cerberus output +{ + weapondata = []; + weapondata[ "name" ] = "none"; + if ( weapon_is_better( oldweapondata[ "name" ], newweapondata[ "name" ] ) ) + { + weapondata[ "name" ] = oldweapondata[ "name" ]; + } + else + { + weapondata[ "name" ] = newweapondata[ "name" ]; + } + name = weapondata[ "name" ]; + dw_name = weapondualwieldweaponname( name ); + alt_name = weaponaltweaponname( name ); + if ( name != "none" ) + { + weapondata[ "clip" ] = newweapondata[ "clip" ] + oldweapondata[ "clip" ]; + weapondata[ "clip" ] = int( min( weapondata[ "clip" ], weaponclipsize( name ) ) ); + weapondata[ "stock" ] = newweapondata[ "stock" ] + oldweapondata[ "stock" ]; + weapondata[ "stock" ] = int( min( weapondata[ "stock" ], weaponmaxammo( name ) ) ); + weapondata[ "fuel" ] = newweapondata[ "fuel" ] + oldweapondata[ "fuel" ]; + weapondata[ "fuel" ] = int( min( weapondata[ "fuel" ], weaponfuellife( name ) ) ); + weapondata[ "heat" ] = int( min( newweapondata[ "heat" ], oldweapondata[ "heat" ] ) ); + weapondata[ "overheat" ] = int( min( newweapondata[ "overheat" ], oldweapondata[ "overheat" ] ) ); + } + if ( dw_name != "none" ) + { + weapondata[ "lh_clip" ] = newweapondata[ "lh_clip" ] + oldweapondata[ "lh_clip" ]; + weapondata[ "lh_clip" ] = int( min( weapondata[ "lh_clip" ], weaponclipsize( dw_name ) ) ); + } + if ( alt_name != "none" ) + { + weapondata[ "alt_clip" ] = newweapondata[ "alt_clip" ] + oldweapondata[ "alt_clip" ]; + weapondata[ "alt_clip" ] = int( min( weapondata[ "alt_clip" ], weaponclipsize( alt_name ) ) ); + weapondata[ "alt_stock" ] = newweapondata[ "alt_stock" ] + oldweapondata[ "alt_stock" ]; + weapondata[ "alt_stock" ] = int( min( weapondata[ "alt_stock" ], weaponmaxammo( alt_name ) ) ); + } + return weapondata; +} + +weapondata_give( weapondata ) //checked matches cerberus output +{ + current = get_player_weapon_with_same_base( weapondata[ "name" ] ); + if ( isDefined( current ) ) + { + curweapondata = get_player_weapondata( self, current ); + self takeweapon( current ); + weapondata = merge_weapons( curweapondata, weapondata ); + } + name = weapondata[ "name" ]; + weapon_give( name, undefined, undefined, 1 ); + dw_name = weapondualwieldweaponname( name ); + alt_name = weaponaltweaponname( name ); + if ( name != "none" ) + { + self setweaponammoclip( name, weapondata[ "clip" ] ); + self setweaponammostock( name, weapondata[ "stock" ] ); + if ( isDefined( weapondata[ "fuel" ] ) ) + { + self setweaponammofuel( name, weapondata[ "fuel" ] ); + } + if ( isDefined( weapondata[ "heat" ] ) && isDefined( weapondata[ "overheat" ] ) ) + { + self setweaponoverheating( weapondata[ "overheat" ], weapondata[ "heat" ], name ); + } + } + if ( dw_name != "none" ) + { + self setweaponammoclip( dw_name, weapondata[ "lh_clip" ] ); + } + if ( alt_name != "none" ) + { + self setweaponammoclip( alt_name, weapondata[ "alt_clip" ] ); + self setweaponammostock( alt_name, weapondata[ "alt_stock" ] ); + } +} + +register_zombie_weapon_callback( str_weapon, func ) //checked matches cerberus output +{ + if ( !isDefined( level.zombie_weapons_callbacks ) ) + { + level.zombie_weapons_callbacks = []; + } + if ( !isDefined( level.zombie_weapons_callbacks[ str_weapon ] ) ) + { + level.zombie_weapons_callbacks[ str_weapon ] = func; + } } -init_weapons() -{ - if ( isdefined( level._zombie_custom_add_weapons ) ) - [[ level._zombie_custom_add_weapons ]](); - - precachemodel( "zombie_teddybear" ); -} -add_limited_weapon( weapon_name, amount ) -{ - if ( !isdefined( level.limited_weapons ) ) - level.limited_weapons = []; - level.limited_weapons[weapon_name] = amount; -} -limited_weapon_below_quota( weapon, ignore_player, pap_triggers ) -{ - if ( isdefined( level.limited_weapons[weapon] ) ) - { - if ( !isdefined( pap_triggers ) ) - { - if ( !isdefined( level.pap_triggers ) ) - pap_triggers = getentarray( "specialty_weapupgrade", "script_noteworthy" ); - else - pap_triggers = level.pap_triggers; - } - if ( is_true( level.no_limited_weapons ) ) - return false; - upgradedweapon = weapon; - - if ( isdefined( level.zombie_weapons[weapon] ) && isdefined( level.zombie_weapons[weapon].upgrade_name ) ) - upgradedweapon = level.zombie_weapons[weapon].upgrade_name; - - players = get_players(); - count = 0; - limit = level.limited_weapons[weapon]; - - for ( i = 0; i < players.size; i++ ) - { - if ( isdefined( ignore_player ) && ignore_player == players[i] ) - continue; - - if ( players[i] has_weapon_or_upgrade( weapon ) ) - { - count++; - - if ( count >= limit ) - return false; - } - } - - for ( k = 0; k < pap_triggers.size; k++ ) - { - if ( isdefined( pap_triggers[k].current_weapon ) && ( pap_triggers[k].current_weapon == weapon || pap_triggers[k].current_weapon == upgradedweapon ) ) - { - count++; - - if ( count >= limit ) - return false; - } - } - - for ( chestindex = 0; chestindex < level.chests.size; chestindex++ ) - { - if ( isdefined( level.chests[chestindex].zbarrier.weapon_string ) && level.chests[chestindex].zbarrier.weapon_string == weapon ) - { - count++; - - if ( count >= limit ) - return false; - } - } - - if ( isdefined( level.custom_limited_weapon_checks ) ) - { - foreach ( check in level.custom_limited_weapon_checks ) - count += [[ check ]]( weapon ); - - if ( count >= limit ) - return false; - } - - if ( isdefined( level.random_weapon_powerups ) ) - { - for ( powerupindex = 0; powerupindex < level.random_weapon_powerups.size; powerupindex++ ) - { - if ( isdefined( level.random_weapon_powerups[powerupindex] ) && level.random_weapon_powerups[powerupindex].base_weapon == weapon ) - { - count++; - - if ( count >= limit ) - return false; - } - } - } - } - - return true; -} - -add_custom_limited_weapon_check( callback ) -{ - if ( !isdefined( level.custom_limited_weapon_checks ) ) - level.custom_limited_weapon_checks = []; - - level.custom_limited_weapon_checks[level.custom_limited_weapon_checks.size] = callback; -} - -add_weapon_to_content( weapon_name, package ) -{ - if ( !isdefined( level.content_weapons ) ) - level.content_weapons = []; - - level.content_weapons[weapon_name] = package; -} - -player_can_use_content( weapon ) -{ - if ( isdefined( level.content_weapons ) ) - { - if ( isdefined( level.content_weapons[weapon] ) ) - return self hasdlcavailable( level.content_weapons[weapon] ); - } - - return 1; -} - -init_spawnable_weapon_upgrade() -{ - spawn_list = []; - spawnable_weapon_spawns = getstructarray( "weapon_upgrade", "targetname" ); - spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "bowie_upgrade", "targetname" ), 1, 0 ); - spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "sickle_upgrade", "targetname" ), 1, 0 ); - spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "tazer_upgrade", "targetname" ), 1, 0 ); - spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "buildable_wallbuy", "targetname" ), 1, 0 ); - - if ( !is_true( level.headshots_only ) ) - spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "claymore_purchase", "targetname" ), 1, 0 ); - - 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; - - if ( "" != location ) - match_string = match_string + "_" + location; - - match_string_plus_space = " " + match_string; - - for ( i = 0; i < spawnable_weapon_spawns.size; i++ ) - { - spawnable_weapon = spawnable_weapon_spawns[i]; - - if ( isdefined( spawnable_weapon.zombie_weapon_upgrade ) && spawnable_weapon.zombie_weapon_upgrade == "sticky_grenade_zm" && is_true( level.headshots_only ) ) - continue; - - if ( !isdefined( spawnable_weapon.script_noteworthy ) || spawnable_weapon.script_noteworthy == "" ) - { - spawn_list[spawn_list.size] = spawnable_weapon; - continue; - } - - matches = strtok( spawnable_weapon.script_noteworthy, "," ); - - for ( j = 0; j < matches.size; j++ ) - { - if ( matches[j] == match_string || matches[j] == match_string_plus_space ) - spawn_list[spawn_list.size] = spawnable_weapon; - } - } - - tempmodel = spawn( "script_model", ( 0, 0, 0 ) ); - - for ( i = 0; i < spawn_list.size; i++ ) - { - clientfieldname = spawn_list[i].zombie_weapon_upgrade + "_" + spawn_list[i].origin; - numbits = 2; - - if ( isdefined( level._wallbuy_override_num_bits ) ) - numbits = level._wallbuy_override_num_bits; - - registerclientfield( "world", clientfieldname, 1, numbits, "int" ); - target_struct = getstruct( spawn_list[i].target, "targetname" ); - - if ( spawn_list[i].targetname == "buildable_wallbuy" ) - { - bits = 4; - - if ( isdefined( level.buildable_wallbuy_weapons ) ) - bits = getminbitcountfornum( level.buildable_wallbuy_weapons.size + 1 ); - - registerclientfield( "world", clientfieldname + "_idx", 12000, bits, "int" ); - spawn_list[i].clientfieldname = clientfieldname; - continue; - } - - precachemodel( target_struct.model ); - unitrigger_stub = spawnstruct(); - unitrigger_stub.origin = spawn_list[i].origin; - unitrigger_stub.angles = spawn_list[i].angles; - tempmodel.origin = spawn_list[i].origin; - tempmodel.angles = spawn_list[i].angles; - mins = undefined; - maxs = undefined; - absmins = undefined; - absmaxs = undefined; - tempmodel setmodel( target_struct.model ); - tempmodel useweaponhidetags( spawn_list[i].zombie_weapon_upgrade ); - mins = tempmodel getmins(); - maxs = tempmodel getmaxs(); - absmins = tempmodel getabsmins(); - absmaxs = tempmodel getabsmaxs(); - bounds = absmaxs - absmins; - unitrigger_stub.script_length = bounds[0] * 0.25; - unitrigger_stub.script_width = bounds[1]; - unitrigger_stub.script_height = bounds[2]; - unitrigger_stub.origin -= anglestoright( unitrigger_stub.angles ) * ( unitrigger_stub.script_length * 0.4 ); - unitrigger_stub.target = spawn_list[i].target; - unitrigger_stub.targetname = spawn_list[i].targetname; - unitrigger_stub.cursor_hint = "HINT_NOICON"; - - if ( spawn_list[i].targetname == "weapon_upgrade" ) - { - unitrigger_stub.cost = get_weapon_cost( spawn_list[i].zombie_weapon_upgrade ); - - if ( !( isdefined( level.monolingustic_prompt_format ) && level.monolingustic_prompt_format ) ) - { - unitrigger_stub.hint_string = get_weapon_hint( spawn_list[i].zombie_weapon_upgrade ); - unitrigger_stub.hint_parm1 = unitrigger_stub.cost; - } - else - { - unitrigger_stub.hint_parm1 = get_weapon_display_name( spawn_list[i].zombie_weapon_upgrade ); - - if ( !isdefined( unitrigger_stub.hint_parm1 ) || unitrigger_stub.hint_parm1 == "" || unitrigger_stub.hint_parm1 == "none" ) - unitrigger_stub.hint_parm1 = "missing weapon name " + spawn_list[i].zombie_weapon_upgrade; - - unitrigger_stub.hint_parm2 = unitrigger_stub.cost; - unitrigger_stub.hint_string = &"ZOMBIE_WEAPONCOSTONLY"; - } - } - - unitrigger_stub.weapon_upgrade = spawn_list[i].zombie_weapon_upgrade; - unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; - unitrigger_stub.require_look_at = 1; - - if ( isdefined( spawn_list[i].require_look_from ) && spawn_list[i].require_look_from ) - unitrigger_stub.require_look_from = 1; - - unitrigger_stub.zombie_weapon_upgrade = spawn_list[i].zombie_weapon_upgrade; - unitrigger_stub.clientfieldname = clientfieldname; - maps\mp\zombies\_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); - - if ( is_melee_weapon( unitrigger_stub.zombie_weapon_upgrade ) ) - { - if ( unitrigger_stub.zombie_weapon_upgrade == "tazer_knuckles_zm" && isdefined( level.taser_trig_adjustment ) ) - unitrigger_stub.origin += level.taser_trig_adjustment; - - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::weapon_spawn_think ); - } - else if ( unitrigger_stub.zombie_weapon_upgrade == "claymore_zm" ) - { - unitrigger_stub.prompt_and_visibility_func = maps\mp\zombies\_zm_weap_claymore::claymore_unitrigger_update_prompt; - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, maps\mp\zombies\_zm_weap_claymore::buy_claymores ); - } - else - { - unitrigger_stub.prompt_and_visibility_func = ::wall_weapon_update_prompt; - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::weapon_spawn_think ); - } - - spawn_list[i].trigger_stub = unitrigger_stub; - } - - level._spawned_wallbuys = spawn_list; - tempmodel delete(); -} - -add_dynamic_wallbuy( weapon, wallbuy, pristine ) -{ - spawned_wallbuy = undefined; - - for ( i = 0; i < level._spawned_wallbuys.size; i++ ) - { - if ( level._spawned_wallbuys[i].target == wallbuy ) - { - spawned_wallbuy = level._spawned_wallbuys[i]; - break; - } - } - - if ( !isdefined( spawned_wallbuy ) ) - { -/# - assertmsg( "Cannot find dynamic wallbuy" ); -#/ - return; - } - - if ( isdefined( spawned_wallbuy.trigger_stub ) ) - { -/# - assertmsg( "Dynamic wallbuy already added" ); -#/ - return; - } - - target_struct = getstruct( wallbuy, "targetname" ); - wallmodel = spawn_weapon_model( weapon, undefined, target_struct.origin, target_struct.angles ); - clientfieldname = spawned_wallbuy.clientfieldname; - model = getweaponmodel( weapon ); - unitrigger_stub = spawnstruct(); - unitrigger_stub.origin = target_struct.origin; - unitrigger_stub.angles = target_struct.angles; - wallmodel.origin = target_struct.origin; - wallmodel.angles = target_struct.angles; - mins = undefined; - maxs = undefined; - absmins = undefined; - absmaxs = undefined; - wallmodel setmodel( model ); - wallmodel useweaponhidetags( weapon ); - mins = wallmodel getmins(); - maxs = wallmodel getmaxs(); - absmins = wallmodel getabsmins(); - absmaxs = wallmodel getabsmaxs(); - bounds = absmaxs - absmins; - unitrigger_stub.script_length = bounds[0] * 0.25; - unitrigger_stub.script_width = bounds[1]; - unitrigger_stub.script_height = bounds[2]; - unitrigger_stub.origin -= anglestoright( unitrigger_stub.angles ) * ( unitrigger_stub.script_length * 0.4 ); - unitrigger_stub.target = spawned_wallbuy.target; - unitrigger_stub.targetname = "weapon_upgrade"; - unitrigger_stub.cursor_hint = "HINT_NOICON"; - unitrigger_stub.first_time_triggered = !pristine; - - if ( !is_melee_weapon( weapon ) ) - { - if ( pristine || weapon == "claymore_zm" ) - unitrigger_stub.hint_string = get_weapon_hint( weapon ); - else - unitrigger_stub.hint_string = get_weapon_hint_ammo(); - - unitrigger_stub.cost = get_weapon_cost( weapon ); - unitrigger_stub.hint_parm1 = unitrigger_stub.cost; - } - - unitrigger_stub.weapon_upgrade = weapon; - unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; - unitrigger_stub.require_look_at = 1; - unitrigger_stub.zombie_weapon_upgrade = weapon; - unitrigger_stub.clientfieldname = clientfieldname; - unitrigger_force_per_player_triggers( unitrigger_stub, 1 ); - - if ( is_melee_weapon( weapon ) ) - { - if ( weapon == "tazer_knuckles_zm" && isdefined( level.taser_trig_adjustment ) ) - unitrigger_stub.origin += level.taser_trig_adjustment; - - maps\mp\zombies\_zm_melee_weapon::add_stub( unitrigger_stub, weapon ); - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, maps\mp\zombies\_zm_melee_weapon::melee_weapon_think ); - } - else if ( weapon == "claymore_zm" ) - { - unitrigger_stub.prompt_and_visibility_func = maps\mp\zombies\_zm_weap_claymore::claymore_unitrigger_update_prompt; - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, maps\mp\zombies\_zm_weap_claymore::buy_claymores ); - } - else - { - unitrigger_stub.prompt_and_visibility_func = ::wall_weapon_update_prompt; - maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::weapon_spawn_think ); - } - - spawned_wallbuy.trigger_stub = unitrigger_stub; - weaponidx = undefined; - - if ( isdefined( level.buildable_wallbuy_weapons ) ) - { - for ( i = 0; i < level.buildable_wallbuy_weapons.size; i++ ) - { - if ( weapon == level.buildable_wallbuy_weapons[i] ) - { - weaponidx = i; - break; - } - } - } - - if ( isdefined( weaponidx ) ) - { - level setclientfield( clientfieldname + "_idx", weaponidx + 1 ); - wallmodel delete(); - - if ( !pristine ) - level setclientfield( clientfieldname, 1 ); - } - else - { - level setclientfield( clientfieldname, 1 ); - wallmodel show(); - } -} - -wall_weapon_update_prompt( player ) -{ - weapon = self.stub.zombie_weapon_upgrade; - - if ( !( isdefined( level.monolingustic_prompt_format ) && level.monolingustic_prompt_format ) ) - { - player_has_weapon = player has_weapon_or_upgrade( weapon ); - - if ( !player_has_weapon && ( isdefined( level.weapons_using_ammo_sharing ) && level.weapons_using_ammo_sharing ) ) - { - shared_ammo_weapon = player get_shared_ammo_weapon( self.zombie_weapon_upgrade ); - - if ( isdefined( shared_ammo_weapon ) ) - { - weapon = shared_ammo_weapon; - player_has_weapon = 1; - } - } - - if ( !player_has_weapon ) - { - cost = get_weapon_cost( weapon ); - self.stub.hint_string = get_weapon_hint( weapon ); - self sethintstring( self.stub.hint_string, cost ); - } - else if ( isdefined( level.use_legacy_weapon_prompt_format ) && level.use_legacy_weapon_prompt_format ) - { - cost = get_weapon_cost( weapon ); - ammo_cost = get_ammo_cost( weapon ); - self.stub.hint_string = get_weapon_hint_ammo(); - self sethintstring( self.stub.hint_string, cost, ammo_cost ); - } - else - { - if ( player has_upgrade( weapon ) ) - ammo_cost = get_upgraded_ammo_cost( weapon ); - else - ammo_cost = get_ammo_cost( weapon ); - - self.stub.hint_string = &"ZOMBIE_WEAPONAMMOONLY"; - self sethintstring( self.stub.hint_string, ammo_cost ); - } - } - else if ( !player has_weapon_or_upgrade( weapon ) ) - { - string_override = 0; - - if ( isdefined( player.pers_upgrades_awarded["nube"] ) && player.pers_upgrades_awarded["nube"] ) - string_override = maps\mp\zombies\_zm_pers_upgrades_functions::pers_nube_ammo_hint_string( player, weapon ); - - if ( !string_override ) - { - cost = get_weapon_cost( weapon ); - weapon_display = get_weapon_display_name( weapon ); - - if ( !isdefined( weapon_display ) || weapon_display == "" || weapon_display == "none" ) - weapon_display = "missing weapon name " + weapon; - - self.stub.hint_string = &"ZOMBIE_WEAPONCOSTONLY"; - self sethintstring( self.stub.hint_string, weapon_display, cost ); - } - } - else - { - if ( player has_upgrade( weapon ) ) - ammo_cost = get_upgraded_ammo_cost( weapon ); - else - ammo_cost = get_ammo_cost( weapon ); - - self.stub.hint_string = &"ZOMBIE_WEAPONAMMOONLY"; - self sethintstring( self.stub.hint_string, ammo_cost ); - } - - if ( getdvarint( "tu12_zombies_allow_hint_weapon_from_script" ) ) - { - self.stub.cursor_hint = "HINT_WEAPON"; - self.stub.cursor_hint_weapon = weapon; - self setcursorhint( self.stub.cursor_hint, self.stub.cursor_hint_weapon ); - } - else - { - self.stub.cursor_hint = "HINT_NOICON"; - self.stub.cursor_hint_weapon = undefined; - self setcursorhint( self.stub.cursor_hint ); - } - - return 1; -} - -reset_wallbuy_internal( set_hint_string ) -{ - if ( isdefined( self.first_time_triggered ) && self.first_time_triggered == 1 ) - { - self.first_time_triggered = 0; - - if ( isdefined( self.clientfieldname ) ) - level setclientfield( self.clientfieldname, 0 ); - - if ( set_hint_string ) - { - hint_string = get_weapon_hint( self.zombie_weapon_upgrade ); - cost = get_weapon_cost( self.zombie_weapon_upgrade ); - self sethintstring( hint_string, cost ); - } - } -} - -reset_wallbuys() -{ - weapon_spawns = []; - weapon_spawns = getentarray( "weapon_upgrade", "targetname" ); - melee_and_grenade_spawns = []; - melee_and_grenade_spawns = getentarray( "bowie_upgrade", "targetname" ); - melee_and_grenade_spawns = arraycombine( melee_and_grenade_spawns, getentarray( "sickle_upgrade", "targetname" ), 1, 0 ); - melee_and_grenade_spawns = arraycombine( melee_and_grenade_spawns, getentarray( "tazer_upgrade", "targetname" ), 1, 0 ); - - if ( !is_true( level.headshots_only ) ) - melee_and_grenade_spawns = arraycombine( melee_and_grenade_spawns, getentarray( "claymore_purchase", "targetname" ), 1, 0 ); - - for ( i = 0; i < weapon_spawns.size; i++ ) - weapon_spawns[i] reset_wallbuy_internal( 1 ); - - for ( i = 0; i < melee_and_grenade_spawns.size; i++ ) - melee_and_grenade_spawns[i] reset_wallbuy_internal( 0 ); - - if ( isdefined( level._unitriggers ) ) - { - candidates = []; - - for ( i = 0; i < level._unitriggers.trigger_stubs.size; i++ ) - { - stub = level._unitriggers.trigger_stubs[i]; - tn = stub.targetname; - - if ( tn == "weapon_upgrade" || tn == "bowie_upgrade" || tn == "sickle_upgrade" || tn == "tazer_upgrade" || tn == "claymore_purchase" ) - { - stub.first_time_triggered = 0; - - if ( isdefined( stub.clientfieldname ) ) - level setclientfield( stub.clientfieldname, 0 ); - - if ( tn == "weapon_upgrade" ) - { - stub.hint_string = get_weapon_hint( stub.zombie_weapon_upgrade ); - stub.cost = get_weapon_cost( stub.zombie_weapon_upgrade ); - stub.hint_parm1 = stub.cost; - } - } - } - } -} - -init_weapon_upgrade() -{ - init_spawnable_weapon_upgrade(); - weapon_spawns = []; - weapon_spawns = getentarray( "weapon_upgrade", "targetname" ); - - for ( i = 0; i < weapon_spawns.size; i++ ) - { - if ( !( isdefined( level.monolingustic_prompt_format ) && level.monolingustic_prompt_format ) ) - { - hint_string = get_weapon_hint( weapon_spawns[i].zombie_weapon_upgrade ); - cost = get_weapon_cost( weapon_spawns[i].zombie_weapon_upgrade ); - weapon_spawns[i] sethintstring( hint_string, cost ); - weapon_spawns[i] setcursorhint( "HINT_NOICON" ); - } - else - { - cost = get_weapon_cost( weapon_spawns[i].zombie_weapon_upgrade ); - weapon_display = get_weapon_display_name( weapon_spawns[i].zombie_weapon_upgrade ); - - if ( !isdefined( weapon_display ) || weapon_display == "" || weapon_display == "none" ) - weapon_display = "missing weapon name " + weapon_spawns[i].zombie_weapon_upgrade; - - hint_string = &"ZOMBIE_WEAPONCOSTONLY"; - weapon_spawns[i] sethintstring( hint_string, weapon_display, cost ); - } - - weapon_spawns[i] usetriggerrequirelookat(); - weapon_spawns[i] thread weapon_spawn_think(); - model = getent( weapon_spawns[i].target, "targetname" ); - - if ( isdefined( model ) ) - { - model useweaponhidetags( weapon_spawns[i].zombie_weapon_upgrade ); - model hide(); - } - } -} - -init_weapon_toggle() -{ - if ( !isdefined( level.magic_box_weapon_toggle_init_callback ) ) - return; - - level.zombie_weapon_toggles = []; - level.zombie_weapon_toggle_max_active_count = 0; - level.zombie_weapon_toggle_active_count = 0; - precachestring( &"ZOMBIE_WEAPON_TOGGLE_DISABLED" ); - precachestring( &"ZOMBIE_WEAPON_TOGGLE_ACTIVATE" ); - precachestring( &"ZOMBIE_WEAPON_TOGGLE_DEACTIVATE" ); - precachestring( &"ZOMBIE_WEAPON_TOGGLE_ACQUIRED" ); - level.zombie_weapon_toggle_disabled_hint = &"ZOMBIE_WEAPON_TOGGLE_DISABLED"; - level.zombie_weapon_toggle_activate_hint = &"ZOMBIE_WEAPON_TOGGLE_ACTIVATE"; - level.zombie_weapon_toggle_deactivate_hint = &"ZOMBIE_WEAPON_TOGGLE_DEACTIVATE"; - level.zombie_weapon_toggle_acquired_hint = &"ZOMBIE_WEAPON_TOGGLE_ACQUIRED"; - precachemodel( "zombie_zapper_cagelight" ); - precachemodel( "zombie_zapper_cagelight_green" ); - precachemodel( "zombie_zapper_cagelight_red" ); - precachemodel( "zombie_zapper_cagelight_on" ); - level.zombie_weapon_toggle_disabled_light = "zombie_zapper_cagelight"; - level.zombie_weapon_toggle_active_light = "zombie_zapper_cagelight_green"; - level.zombie_weapon_toggle_inactive_light = "zombie_zapper_cagelight_red"; - level.zombie_weapon_toggle_acquired_light = "zombie_zapper_cagelight_on"; - weapon_toggle_ents = []; - weapon_toggle_ents = getentarray( "magic_box_weapon_toggle", "targetname" ); - - for ( i = 0; i < weapon_toggle_ents.size; i++ ) - { - struct = spawnstruct(); - struct.trigger = weapon_toggle_ents[i]; - struct.weapon_name = struct.trigger.script_string; - struct.upgrade_name = level.zombie_weapons[struct.trigger.script_string].upgrade_name; - struct.enabled = 0; - struct.active = 0; - struct.acquired = 0; - target_array = []; - target_array = getentarray( struct.trigger.target, "targetname" ); - - for ( j = 0; j < target_array.size; j++ ) - { - switch ( target_array[j].script_string ) - { - case "light": - struct.light = target_array[j]; - struct.light setmodel( level.zombie_weapon_toggle_disabled_light ); - continue; - case "weapon": - struct.weapon_model = target_array[j]; - struct.weapon_model hide(); - continue; - } - } - - struct.trigger sethintstring( level.zombie_weapon_toggle_disabled_hint ); - struct.trigger setcursorhint( "HINT_NOICON" ); - struct.trigger usetriggerrequirelookat(); - struct thread weapon_toggle_think(); - level.zombie_weapon_toggles[struct.weapon_name] = struct; - } - - level thread [[ level.magic_box_weapon_toggle_init_callback ]](); -} - -get_weapon_toggle( weapon_name ) -{ - if ( !isdefined( level.zombie_weapon_toggles ) ) - return undefined; - - if ( isdefined( level.zombie_weapon_toggles[weapon_name] ) ) - return level.zombie_weapon_toggles[weapon_name]; - - keys = getarraykeys( level.zombie_weapon_toggles ); - - for ( i = 0; i < keys.size; i++ ) - { - if ( weapon_name == level.zombie_weapon_toggles[keys[i]].upgrade_name ) - return level.zombie_weapon_toggles[keys[i]]; - } - - return undefined; -} - -is_weapon_toggle( weapon_name ) -{ - return isdefined( get_weapon_toggle( weapon_name ) ); -} - -disable_weapon_toggle( weapon_name ) -{ - toggle = get_weapon_toggle( weapon_name ); - - if ( !isdefined( toggle ) ) - return; - - if ( toggle.active ) - level.zombie_weapon_toggle_active_count--; - - toggle.enabled = 0; - toggle.active = 0; - toggle.light setmodel( level.zombie_weapon_toggle_disabled_light ); - toggle.weapon_model hide(); - toggle.trigger sethintstring( level.zombie_weapon_toggle_disabled_hint ); -} - -enable_weapon_toggle( weapon_name ) -{ - toggle = get_weapon_toggle( weapon_name ); - if ( !isdefined( toggle ) ) - return; - toggle.enabled = 1; - toggle.weapon_model show(); - toggle.weapon_model useweaponhidetags( weapon_name ); - deactivate_weapon_toggle( weapon_name ); -} - -activate_weapon_toggle( weapon_name, trig_for_vox ) -{ - if ( level.zombie_weapon_toggle_active_count >= level.zombie_weapon_toggle_max_active_count ) - { - if ( isdefined( trig_for_vox ) ) - trig_for_vox thread maps\mp\zombies\_zm_audio::weapon_toggle_vox( "max" ); - - return; - } - - toggle = get_weapon_toggle( weapon_name ); - - if ( !isdefined( toggle ) ) - return; - - if ( isdefined( trig_for_vox ) ) - trig_for_vox thread maps\mp\zombies\_zm_audio::weapon_toggle_vox( "activate", weapon_name ); - - level.zombie_weapon_toggle_active_count++; - toggle.active = 1; - toggle.light setmodel( level.zombie_weapon_toggle_active_light ); - toggle.trigger sethintstring( level.zombie_weapon_toggle_deactivate_hint ); -} - -deactivate_weapon_toggle( weapon_name, trig_for_vox ) -{ - toggle = get_weapon_toggle( weapon_name ); - - if ( !isdefined( toggle ) ) - return; - - if ( isdefined( trig_for_vox ) ) - trig_for_vox thread maps\mp\zombies\_zm_audio::weapon_toggle_vox( "deactivate", weapon_name ); - - if ( toggle.active ) - level.zombie_weapon_toggle_active_count--; - - toggle.active = 0; - toggle.light setmodel( level.zombie_weapon_toggle_inactive_light ); - toggle.trigger sethintstring( level.zombie_weapon_toggle_activate_hint ); -} - -acquire_weapon_toggle( weapon_name, player ) -{ - toggle = get_weapon_toggle( weapon_name ); - - if ( !isdefined( toggle ) ) - return; - - if ( !toggle.active || toggle.acquired ) - return; - - toggle.acquired = 1; - toggle.light setmodel( level.zombie_weapon_toggle_acquired_light ); - toggle.trigger sethintstring( level.zombie_weapon_toggle_acquired_hint ); - toggle thread unacquire_weapon_toggle_on_death_or_disconnect_thread( player ); -} - -unacquire_weapon_toggle_on_death_or_disconnect_thread( player ) -{ - self notify( "end_unacquire_weapon_thread" ); - self endon( "end_unacquire_weapon_thread" ); - player waittill_any( "spawned_spectator", "disconnect" ); - unacquire_weapon_toggle( self.weapon_name ); -} - -unacquire_weapon_toggle( weapon_name ) -{ - toggle = get_weapon_toggle( weapon_name ); - - if ( !isdefined( toggle ) ) - return; - - if ( !toggle.active || !toggle.acquired ) - return; - - toggle.acquired = 0; - toggle.light setmodel( level.zombie_weapon_toggle_active_light ); - toggle.trigger sethintstring( level.zombie_weapon_toggle_deactivate_hint ); - toggle notify( "end_unacquire_weapon_thread" ); -} - -weapon_toggle_think() -{ - for (;;) - { - self.trigger waittill( "trigger", player ); - - if ( !is_player_valid( player ) ) - { - player thread ignore_triggers( 0.5 ); - continue; - } - - if ( !self.enabled || self.acquired ) - { - self.trigger thread maps\mp\zombies\_zm_audio::weapon_toggle_vox( "max" ); - continue; - } - - if ( !self.active ) - { - activate_weapon_toggle( self.weapon_name, self.trigger ); - continue; - } - - deactivate_weapon_toggle( self.weapon_name, self.trigger ); - } -} - -get_weapon_hint( weapon_name ) -{ -/# - assert( isdefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); -#/ - return level.zombie_weapons[weapon_name].hint; -} - -get_weapon_cost( weapon_name ) -{ -/# - assert( isdefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); -#/ - return level.zombie_weapons[weapon_name].cost; -} - -get_ammo_cost( weapon_name ) -{ -/# - assert( isdefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); -#/ - return level.zombie_weapons[weapon_name].ammo_cost; -} - -get_upgraded_ammo_cost( weapon_name ) -{ -/# - assert( isdefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); -#/ - if ( isdefined( level.zombie_weapons[weapon_name].upgraded_ammo_cost ) ) - return level.zombie_weapons[weapon_name].upgraded_ammo_cost; - - return 4500; -} - -get_weapon_display_name( weapon_name ) -{ - weapon_display = getweapondisplayname( weapon_name ); - - if ( !isdefined( weapon_display ) || weapon_display == "" || weapon_display == "none" ) - { - weapon_display = &"MPUI_NONE"; -/# - weapon_display = "missing weapon name " + weapon_name; -#/ - } - - return weapon_display; -} - -get_is_in_box( weapon_name ) -{ -/# - assert( isdefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); -#/ - return level.zombie_weapons[weapon_name].is_in_box; -} - -weapon_supports_default_attachment( weaponname ) -{ - weaponname = get_base_weapon_name( weaponname ); - - if ( isdefined( weaponname ) ) - attachment = level.zombie_weapons[weaponname].default_attachment; - - return isdefined( attachment ); -} - -default_attachment( weaponname ) -{ - weaponname = get_base_weapon_name( weaponname ); - - if ( isdefined( weaponname ) ) - attachment = level.zombie_weapons[weaponname].default_attachment; - - if ( isdefined( attachment ) ) - return attachment; - else - return "none"; -} - -weapon_supports_attachments( weaponname ) -{ - weaponname = get_base_weapon_name( weaponname ); - - if ( isdefined( weaponname ) ) - attachments = level.zombie_weapons[weaponname].addon_attachments; - - return isdefined( attachments ) && attachments.size > 1; -} - -random_attachment( weaponname, exclude ) -{ - lo = 0; - if ( isdefined( level.zombie_weapons[weaponname].addon_attachments ) && level.zombie_weapons[weaponname].addon_attachments.size > 0 ) - attachments = level.zombie_weapons[weaponname].addon_attachments; - else - { - attachments = getweaponsupportedattachments( weaponname ); - lo = 1; - } - minatt = lo; - - if ( isdefined( exclude ) && exclude != "none" ) - minatt = lo + 1; - - if ( attachments.size > minatt ) - { - while ( true ) - { - idx = randomint( attachments.size - lo ) + lo; - - if ( !isdefined( exclude ) || attachments[idx] != exclude ) - return attachments[idx]; - } - } - - return "none"; -} - -get_base_name( weaponname ) -{ - split = strtok( weaponname, "+" ); - - if ( split.size > 1 ) - return split[0]; - - return weaponname; -} - -get_attachment_name( weaponname, att_id ) -{ - split = strtok( weaponname, "+" ); - - if ( isdefined( att_id ) ) - { - attachment = att_id + 1; - - if ( split.size > attachment ) - return split[attachment]; - } - else if ( split.size > 1 ) - { - att = split[1]; - - for ( idx = 2; split.size > idx; idx++ ) - att = att + "+" + split[idx]; - - return att; - } - - return undefined; -} - -get_attachment_index( weapon ) -{ - att = get_attachment_name( weapon ); - - if ( att == "none" ) - return -1; - - base = get_base_name( weapon ); - - if ( att == level.zombie_weapons[base].default_attachment ) - return 0; - - if ( isdefined( level.zombie_weapons[base].addon_attachments ) ) - { - for ( i = 0; i < level.zombie_weapons[base].addon_attachments.size; i++ ) - { - if ( level.zombie_weapons[base].addon_attachments[i] == att ) - return i + 1; - } - } -/# - println( "ZM WEAPON ERROR: Unrecognized attachment in weapon " + weapon ); -#/ - return -1; -} - -weapon_supports_this_attachment( weapon, att ) -{ - base = get_base_name( weapon ); - - if ( att == level.zombie_weapons[base].default_attachment ) - return true; - - if ( isdefined( level.zombie_weapons[base].addon_attachments ) ) - { - for ( i = 0; i < level.zombie_weapons[base].addon_attachments.size; i++ ) - { - if ( level.zombie_weapons[base].addon_attachments[i] == att ) - return true; - } - } - - return false; -} - -has_attachment( weaponname, att ) -{ - split = strtok( weaponname, "+" ); - idx = 1; - - while ( split.size > idx ) - { - if ( att == split[idx] ) - return true; - } - - return false; -} - -get_base_weapon_name( upgradedweaponname, base_if_not_upgraded ) -{ - if ( !isdefined( upgradedweaponname ) || upgradedweaponname == "" ) - return undefined; - - upgradedweaponname = tolower( upgradedweaponname ); - upgradedweaponname = get_base_name( upgradedweaponname ); - - if ( isdefined( level.zombie_weapons_upgraded[upgradedweaponname] ) ) - return level.zombie_weapons_upgraded[upgradedweaponname]; - - if ( isdefined( base_if_not_upgraded ) && base_if_not_upgraded ) - return upgradedweaponname; - - return undefined; -} - -get_upgrade_weapon( weaponname, add_attachment ) -{ - rootweaponname = tolower( weaponname ); - rootweaponname = get_base_name( rootweaponname ); - baseweaponname = get_base_weapon_name( rootweaponname, 1 ); - newweapon = rootweaponname; - - if ( !is_weapon_upgraded( rootweaponname ) ) - newweapon = level.zombie_weapons[rootweaponname].upgrade_name; - - if ( isdefined( add_attachment ) && add_attachment && ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch ) ) - { - oldatt = get_attachment_name( weaponname ); - att = random_attachment( baseweaponname, oldatt ); - newweapon = newweapon + "+" + att; - } - else if ( isdefined( level.zombie_weapons[rootweaponname] ) && isdefined( level.zombie_weapons[rootweaponname].default_attachment ) ) - { - att = level.zombie_weapons[rootweaponname].default_attachment; - newweapon = newweapon + "+" + att; - } - - return newweapon; -} - -can_upgrade_weapon( weaponname ) -{ - if ( !isdefined( weaponname ) || weaponname == "" || weaponname == "zombie_fists_zm" ) - return 0; - - weaponname = tolower( weaponname ); - weaponname = get_base_name( weaponname ); - - if ( !is_weapon_upgraded( weaponname ) ) - return isdefined( level.zombie_weapons[weaponname].upgrade_name ); - - if ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch && weapon_supports_attachments( weaponname ) ) - return 1; - - return 0; -} - -will_upgrade_weapon_as_attachment( weaponname ) -{ - if ( !isdefined( weaponname ) || weaponname == "" || weaponname == "zombie_fists_zm" ) - return false; - - weaponname = tolower( weaponname ); - weaponname = get_base_name( weaponname ); - - if ( !is_weapon_upgraded( weaponname ) ) - return false; - - if ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch && weapon_supports_attachments( weaponname ) ) - return true; - - return false; -} - -is_weapon_upgraded( weaponname ) -{ - if ( !isdefined( weaponname ) || weaponname == "" || weaponname == "zombie_fists_zm" ) - return false; - - weaponname = tolower( weaponname ); - weaponname = get_base_name( weaponname ); - - if ( isdefined( level.zombie_weapons_upgraded[weaponname] ) ) - return true; - - return false; -} - -get_weapon_with_attachments( weaponname ) -{ - if ( self hasweapon( weaponname ) ) - return weaponname; - - if ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch ) - { - weaponname = tolower( weaponname ); - weaponname = get_base_name( weaponname ); - weapons = self getweaponslist( 1 ); - - foreach ( weapon in weapons ) - { - weapon = tolower( weapon ); - weapon_base = get_base_name( weapon ); - - if ( weaponname == weapon_base ) - return weapon; - } - } - - return undefined; -} - -has_weapon_or_attachments( weaponname ) -{ - if ( self hasweapon( weaponname ) ) - return true; - - if ( isdefined( level.zombiemode_reusing_pack_a_punch ) && level.zombiemode_reusing_pack_a_punch ) - { - weaponname = tolower( weaponname ); - weaponname = get_base_name( weaponname ); - weapons = self getweaponslist( 1 ); - - foreach ( weapon in weapons ) - { - weapon = tolower( weapon ); - weapon = get_base_name( weapon ); - - if ( weaponname == weapon ) - return true; - } - } - - return false; -} - -has_upgrade( weaponname ) -{ - weaponname = get_base_name( weaponname ); - has_upgrade = 0; - - if ( isdefined( level.zombie_weapons[weaponname] ) && isdefined( level.zombie_weapons[weaponname].upgrade_name ) ) - has_upgrade = self has_weapon_or_attachments( level.zombie_weapons[weaponname].upgrade_name ); - - if ( !has_upgrade && "knife_ballistic_zm" == weaponname ) - has_weapon = self maps\mp\zombies\_zm_melee_weapon::has_upgraded_ballistic_knife(); - - return has_upgrade; -} - -has_weapon_or_upgrade( weaponname ) -{ - weaponname = get_base_name( weaponname ); - upgradedweaponname = weaponname; - - if ( isdefined( level.zombie_weapons[weaponname] ) && isdefined( level.zombie_weapons[weaponname].upgrade_name ) ) - upgradedweaponname = level.zombie_weapons[weaponname].upgrade_name; - - has_weapon = 0; - - if ( isdefined( level.zombie_weapons[weaponname] ) ) - has_weapon = self has_weapon_or_attachments( weaponname ) || self has_upgrade( weaponname ); - - if ( !has_weapon && "knife_ballistic_zm" == weaponname ) - has_weapon = self maps\mp\zombies\_zm_melee_weapon::has_any_ballistic_knife(); - - if ( !has_weapon && is_equipment( weaponname ) ) - has_weapon = self is_equipment_active( weaponname ); - - return has_weapon; -} - -add_shared_ammo_weapon( str_weapon, str_base_weapon ) -{ - level.zombie_weapons[str_weapon].shared_ammo_weapon = str_base_weapon; -} - -get_shared_ammo_weapon( base_weapon ) -{ - base_weapon = get_base_name( base_weapon ); - weapons = self getweaponslist( 1 ); - - foreach ( weapon in weapons ) - { - weapon = tolower( weapon ); - weapon = get_base_name( weapon ); - - if ( !isdefined( level.zombie_weapons[weapon] ) && isdefined( level.zombie_weapons_upgraded[weapon] ) ) - weapon = level.zombie_weapons_upgraded[weapon]; - - if ( isdefined( level.zombie_weapons[weapon] ) && isdefined( level.zombie_weapons[weapon].shared_ammo_weapon ) && level.zombie_weapons[weapon].shared_ammo_weapon == base_weapon ) - return weapon; - } - - return undefined; -} - -get_player_weapon_with_same_base( weaponname ) -{ - weaponname = tolower( weaponname ); - weaponname = get_base_name( weaponname ); - retweapon = get_weapon_with_attachments( weaponname ); - - if ( !isdefined( retweapon ) ) - { - if ( isdefined( level.zombie_weapons[weaponname] ) ) - retweapon = get_weapon_with_attachments( level.zombie_weapons[weaponname].upgrade_name ); - else if ( isdefined( level.zombie_weapons_upgraded[weaponname] ) ) - return get_weapon_with_attachments( level.zombie_weapons_upgraded[weaponname] ); - } - - return retweapon; -} - -get_weapon_hint_ammo() -{ - if ( isdefined( level.has_pack_a_punch ) && !level.has_pack_a_punch ) - return &"ZOMBIE_WEAPONCOSTAMMO"; - else - return &"ZOMBIE_WEAPONCOSTAMMO_UPGRADE"; -} - -weapon_set_first_time_hint( cost, ammo_cost ) -{ - self sethintstring( get_weapon_hint_ammo(), cost, ammo_cost ); -} - -weapon_spawn_think() -{ - cost = get_weapon_cost( self.zombie_weapon_upgrade ); - ammo_cost = get_ammo_cost( self.zombie_weapon_upgrade ); - is_grenade = weapontype( self.zombie_weapon_upgrade ) == "grenade"; - shared_ammo_weapon = undefined; - second_endon = undefined; - - if ( isdefined( self.stub ) ) - { - second_endon = "kill_trigger"; - self.first_time_triggered = self.stub.first_time_triggered; - } - - if ( isdefined( self.stub ) && ( isdefined( self.stub.trigger_per_player ) && self.stub.trigger_per_player ) ) - self thread decide_hide_show_hint( "stop_hint_logic", second_endon, self.parent_player ); - else - self thread decide_hide_show_hint( "stop_hint_logic", second_endon ); - - if ( is_grenade ) - { - self.first_time_triggered = 0; - hint = get_weapon_hint( self.zombie_weapon_upgrade ); - self sethintstring( hint, cost ); - } - else if ( !isdefined( self.first_time_triggered ) ) - { - self.first_time_triggered = 0; - - if ( isdefined( self.stub ) ) - self.stub.first_time_triggered = 0; - } - else if ( self.first_time_triggered ) - { - if ( isdefined( level.use_legacy_weapon_prompt_format ) && level.use_legacy_weapon_prompt_format ) - self weapon_set_first_time_hint( cost, get_ammo_cost( self.zombie_weapon_upgrade ) ); - } - - for (;;) - { - self waittill( "trigger", player ); - - if ( !is_player_valid( player ) ) - { - player thread ignore_triggers( 0.5 ); - continue; - } - - if ( !player can_buy_weapon() ) - { - wait 0.1; - continue; - } - - if ( isdefined( self.stub ) && ( isdefined( self.stub.require_look_from ) && self.stub.require_look_from ) ) - { - toplayer = player get_eye() - self.origin; - forward = -1 * anglestoright( self.angles ); - dot = vectordot( toplayer, forward ); - - if ( dot < 0 ) - continue; - } - - if ( player has_powerup_weapon() ) - { - wait 0.1; - continue; - } - - player_has_weapon = player has_weapon_or_upgrade( self.zombie_weapon_upgrade ); - - if ( !player_has_weapon && ( isdefined( level.weapons_using_ammo_sharing ) && level.weapons_using_ammo_sharing ) ) - { - shared_ammo_weapon = player get_shared_ammo_weapon( self.zombie_weapon_upgrade ); - - if ( isdefined( shared_ammo_weapon ) ) - player_has_weapon = 1; - } - - if ( isdefined( level.pers_upgrade_nube ) && level.pers_upgrade_nube ) - player_has_weapon = maps\mp\zombies\_zm_pers_upgrades_functions::pers_nube_should_we_give_raygun( player_has_weapon, player, self.zombie_weapon_upgrade ); - - cost = get_weapon_cost( self.zombie_weapon_upgrade ); - - if ( player maps\mp\zombies\_zm_pers_upgrades_functions::is_pers_double_points_active() ) - cost = int( cost / 2 ); - - if ( !player_has_weapon ) - { - if ( player.score >= cost ) - { - if ( self.first_time_triggered == 0 ) - self show_all_weapon_buys( player, cost, ammo_cost, is_grenade ); - - player maps\mp\zombies\_zm_score::minus_to_player_score( cost, 1 ); - bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, cost, self.zombie_weapon_upgrade, self.origin, "weapon" ); - level notify( "weapon_bought", player, self.zombie_weapon_upgrade ); - - if ( self.zombie_weapon_upgrade == "riotshield_zm" ) - { - player maps\mp\zombies\_zm_equipment::equipment_give( "riotshield_zm" ); - - if ( isdefined( player.player_shield_reset_health ) ) - player [[ player.player_shield_reset_health ]](); - } - else if ( self.zombie_weapon_upgrade == "jetgun_zm" ) - player maps\mp\zombies\_zm_equipment::equipment_give( "jetgun_zm" ); - else - { - if ( is_lethal_grenade( self.zombie_weapon_upgrade ) ) - { - player takeweapon( player get_player_lethal_grenade() ); - player set_player_lethal_grenade( self.zombie_weapon_upgrade ); - } - - str_weapon = self.zombie_weapon_upgrade; - - if ( isdefined( level.pers_upgrade_nube ) && level.pers_upgrade_nube ) - str_weapon = maps\mp\zombies\_zm_pers_upgrades_functions::pers_nube_weapon_upgrade_check( player, str_weapon ); - - player weapon_give( str_weapon ); - } - - player maps\mp\zombies\_zm_stats::increment_client_stat( "wallbuy_weapons_purchased" ); - player maps\mp\zombies\_zm_stats::increment_player_stat( "wallbuy_weapons_purchased" ); - } - else - { - play_sound_on_ent( "no_purchase" ); - player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_weapon" ); - } - } - else - { - str_weapon = self.zombie_weapon_upgrade; - - if ( isdefined( shared_ammo_weapon ) ) - str_weapon = shared_ammo_weapon; - - if ( isdefined( level.pers_upgrade_nube ) && level.pers_upgrade_nube ) - str_weapon = maps\mp\zombies\_zm_pers_upgrades_functions::pers_nube_weapon_ammo_check( player, str_weapon ); - - if ( isdefined( self.hacked ) && self.hacked ) - { - if ( !player has_upgrade( str_weapon ) ) - ammo_cost = 4500; - else - ammo_cost = get_ammo_cost( str_weapon ); - } - else if ( player has_upgrade( str_weapon ) ) - ammo_cost = 4500; - else - ammo_cost = get_ammo_cost( str_weapon ); - - if ( isdefined( player.pers_upgrades_awarded["nube"] ) && player.pers_upgrades_awarded["nube"] ) - ammo_cost = maps\mp\zombies\_zm_pers_upgrades_functions::pers_nube_override_ammo_cost( player, self.zombie_weapon_upgrade, ammo_cost ); - - if ( player maps\mp\zombies\_zm_pers_upgrades_functions::is_pers_double_points_active() ) - ammo_cost = int( ammo_cost / 2 ); - - if ( str_weapon == "riotshield_zm" ) - play_sound_on_ent( "no_purchase" ); - else if ( player.score >= ammo_cost ) - { - if ( self.first_time_triggered == 0 ) - self show_all_weapon_buys( player, cost, ammo_cost, is_grenade ); - - if ( player has_upgrade( str_weapon ) ) - { - player maps\mp\zombies\_zm_stats::increment_client_stat( "upgraded_ammo_purchased" ); - player maps\mp\zombies\_zm_stats::increment_player_stat( "upgraded_ammo_purchased" ); - } - else - { - player maps\mp\zombies\_zm_stats::increment_client_stat( "ammo_purchased" ); - player maps\mp\zombies\_zm_stats::increment_player_stat( "ammo_purchased" ); - } - - if ( str_weapon == "riotshield_zm" ) - { - if ( isdefined( player.player_shield_reset_health ) ) - ammo_given = player [[ player.player_shield_reset_health ]](); - else - ammo_given = 0; - } - else if ( player has_upgrade( str_weapon ) ) - ammo_given = player ammo_give( level.zombie_weapons[str_weapon].upgrade_name ); - else - ammo_given = player ammo_give( str_weapon ); - - if ( ammo_given ) - { - player maps\mp\zombies\_zm_score::minus_to_player_score( ammo_cost, 1 ); - bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, ammo_cost, str_weapon, self.origin, "ammo" ); - } - } - else - { - play_sound_on_ent( "no_purchase" ); - - if ( isdefined( level.custom_generic_deny_vo_func ) ) - player [[ level.custom_generic_deny_vo_func ]](); - else - player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "no_money_weapon" ); - } - } - - if ( isdefined( self.stub ) && isdefined( self.stub.prompt_and_visibility_func ) ) - self [[ self.stub.prompt_and_visibility_func ]]( player ); - } -} - -show_all_weapon_buys( player, cost, ammo_cost, is_grenade ) -{ - model = getent( self.target, "targetname" ); - - if ( isdefined( model ) ) - model thread weapon_show( player ); - else if ( isdefined( self.clientfieldname ) ) - level setclientfield( self.clientfieldname, 1 ); - - self.first_time_triggered = 1; - - if ( isdefined( self.stub ) ) - self.stub.first_time_triggered = 1; - - if ( !is_grenade ) - self weapon_set_first_time_hint( cost, ammo_cost ); - - if ( !( isdefined( level.dont_link_common_wallbuys ) && level.dont_link_common_wallbuys ) && isdefined( level._spawned_wallbuys ) ) - { - for ( i = 0; i < level._spawned_wallbuys.size; i++ ) - { - wallbuy = level._spawned_wallbuys[i]; - - if ( isdefined( self.stub ) && isdefined( wallbuy.trigger_stub ) && self.stub.clientfieldname == wallbuy.trigger_stub.clientfieldname ) - continue; - - if ( self.zombie_weapon_upgrade == wallbuy.zombie_weapon_upgrade ) - { - if ( isdefined( wallbuy.trigger_stub ) && isdefined( wallbuy.trigger_stub.clientfieldname ) ) - level setclientfield( wallbuy.trigger_stub.clientfieldname, 1 ); - else if ( isdefined( wallbuy.target ) ) - { - model = getent( wallbuy.target, "targetname" ); - - if ( isdefined( model ) ) - model thread weapon_show( player ); - } - - if ( isdefined( wallbuy.trigger_stub ) ) - { - wallbuy.trigger_stub.first_time_triggered = 1; - - if ( isdefined( wallbuy.trigger_stub.trigger ) ) - { - wallbuy.trigger_stub.trigger.first_time_triggered = 1; - - if ( !is_grenade ) - wallbuy.trigger_stub.trigger weapon_set_first_time_hint( cost, ammo_cost ); - } - - continue; - } - - if ( !is_grenade ) - wallbuy weapon_set_first_time_hint( cost, ammo_cost ); - } - } - } -} - -weapon_show( player ) -{ - player_angles = vectortoangles( player.origin - self.origin ); - player_yaw = player_angles[1]; - weapon_yaw = self.angles[1]; - - if ( isdefined( self.script_int ) ) - weapon_yaw -= self.script_int; - - yaw_diff = angleclamp180( player_yaw - weapon_yaw ); - - if ( yaw_diff > 0 ) - yaw = weapon_yaw - 90; - else - yaw = weapon_yaw + 90; - - self.og_origin = self.origin; - self.origin += anglestoforward( ( 0, yaw, 0 ) ) * 8; - wait 0.05; - self show(); - play_sound_at_pos( "weapon_show", self.origin, self ); - time = 1; - - if ( !isdefined( self._linked_ent ) ) - self moveto( self.og_origin, time ); -} - -get_pack_a_punch_weapon_options( weapon ) -{ - if ( !isdefined( self.pack_a_punch_weapon_options ) ) - self.pack_a_punch_weapon_options = []; - - if ( !is_weapon_upgraded( weapon ) ) - return self calcweaponoptions( 0, 0, 0, 0, 0 ); - - if ( isdefined( self.pack_a_punch_weapon_options[weapon] ) ) - return self.pack_a_punch_weapon_options[weapon]; - - smiley_face_reticle_index = 1; - base = get_base_name( weapon ); - camo_index = 39; - - if ( "zm_prison" == level.script ) - camo_index = 40; - else if ( "zm_tomb" == level.script ) - camo_index = 45; - - lens_index = randomintrange( 0, 6 ); - reticle_index = randomintrange( 0, 16 ); - reticle_color_index = randomintrange( 0, 6 ); - plain_reticle_index = 16; - r = randomint( 10 ); - use_plain = r < 3; - - if ( "saritch_upgraded_zm" == base ) - reticle_index = smiley_face_reticle_index; - else if ( use_plain ) - reticle_index = plain_reticle_index; -/# - if ( getdvarint( _hash_471F9AB9 ) >= 0 ) - reticle_index = getdvarint( _hash_471F9AB9 ); -#/ - scary_eyes_reticle_index = 8; - purple_reticle_color_index = 3; - - if ( reticle_index == scary_eyes_reticle_index ) - reticle_color_index = purple_reticle_color_index; - - letter_a_reticle_index = 2; - pink_reticle_color_index = 6; - - if ( reticle_index == letter_a_reticle_index ) - reticle_color_index = pink_reticle_color_index; - - letter_e_reticle_index = 7; - green_reticle_color_index = 1; - - if ( reticle_index == letter_e_reticle_index ) - reticle_color_index = green_reticle_color_index; - - self.pack_a_punch_weapon_options[weapon] = self calcweaponoptions( camo_index, lens_index, reticle_index, reticle_color_index ); - return self.pack_a_punch_weapon_options[weapon]; -} - -weapon_give( weapon, is_upgrade, magic_box, nosound ) -{ - primaryweapons = self getweaponslistprimaries(); - current_weapon = self getcurrentweapon(); - current_weapon = self maps\mp\zombies\_zm_weapons::switch_from_alt_weapon( current_weapon ); -/# - assert( self player_can_use_content( weapon ) ); -#/ - if ( !isdefined( is_upgrade ) ) - is_upgrade = 0; - - weapon_limit = get_player_weapon_limit( self ); - - if ( is_equipment( weapon ) ) - self maps\mp\zombies\_zm_equipment::equipment_give( weapon ); - - if ( weapon == "riotshield_zm" ) - { - if ( isdefined( self.player_shield_reset_health ) ) - self [[ self.player_shield_reset_health ]](); - } - - if ( self hasweapon( weapon ) ) - { - if ( issubstr( weapon, "knife_ballistic_" ) ) - self notify( "zmb_lost_knife" ); - - self givestartammo( weapon ); - - if ( !is_offhand_weapon( weapon ) ) - self switchtoweapon( weapon ); - - return; - } - - if ( is_melee_weapon( weapon ) ) - current_weapon = maps\mp\zombies\_zm_melee_weapon::change_melee_weapon( weapon, current_weapon ); - else if ( is_lethal_grenade( weapon ) ) - { - old_lethal = self get_player_lethal_grenade(); - - if ( isdefined( old_lethal ) && old_lethal != "" ) - { - self takeweapon( old_lethal ); - unacquire_weapon_toggle( old_lethal ); - } - - self set_player_lethal_grenade( weapon ); - } - else if ( is_tactical_grenade( weapon ) ) - { - old_tactical = self get_player_tactical_grenade(); - - if ( isdefined( old_tactical ) && old_tactical != "" ) - { - self takeweapon( old_tactical ); - unacquire_weapon_toggle( old_tactical ); - } - - self set_player_tactical_grenade( weapon ); - } - else if ( is_placeable_mine( weapon ) ) - { - old_mine = self get_player_placeable_mine(); - - if ( isdefined( old_mine ) ) - { - self takeweapon( old_mine ); - unacquire_weapon_toggle( old_mine ); - } - - self set_player_placeable_mine( weapon ); - } - - if ( !is_offhand_weapon( weapon ) ) - self maps\mp\zombies\_zm_weapons::take_fallback_weapon(); - - if ( primaryweapons.size >= weapon_limit ) - { - if ( is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) ) - current_weapon = undefined; - - if ( isdefined( current_weapon ) ) - { - if ( !is_offhand_weapon( weapon ) ) - { - if ( current_weapon == "tesla_gun_zm" ) - level.player_drops_tesla_gun = 1; - - if ( issubstr( current_weapon, "knife_ballistic_" ) ) - self notify( "zmb_lost_knife" ); - - self takeweapon( current_weapon ); - unacquire_weapon_toggle( current_weapon ); - } - } - } - - if ( isdefined( level.zombiemode_offhand_weapon_give_override ) ) - { - if ( self [[ level.zombiemode_offhand_weapon_give_override ]]( weapon ) ) - return; - } - - if ( weapon == "cymbal_monkey_zm" ) - { - self maps\mp\zombies\_zm_weap_cymbal_monkey::player_give_cymbal_monkey(); - self play_weapon_vo( weapon, magic_box ); - return; - } - else if ( issubstr( weapon, "knife_ballistic_" ) ) - weapon = self maps\mp\zombies\_zm_melee_weapon::give_ballistic_knife( weapon, issubstr( weapon, "upgraded" ) ); - else if ( weapon == "claymore_zm" ) - { - self thread maps\mp\zombies\_zm_weap_claymore::claymore_setup(); - self play_weapon_vo( weapon, magic_box ); - return; - } - - if ( isdefined( level.zombie_weapons_callbacks ) && isdefined( level.zombie_weapons_callbacks[weapon] ) ) - { - self thread [[ level.zombie_weapons_callbacks[weapon] ]](); - play_weapon_vo( weapon, magic_box ); - return; - } - - if ( !( isdefined( nosound ) && nosound ) ) - self play_sound_on_ent( "purchase" ); - - if ( weapon == "ray_gun_zm" ) - playsoundatposition( "mus_raygun_stinger", ( 0, 0, 0 ) ); - - if ( !is_weapon_upgraded( weapon ) ) - self giveweapon( weapon ); - else - self giveweapon( weapon, 0, self get_pack_a_punch_weapon_options( weapon ) ); - - acquire_weapon_toggle( weapon, self ); - self givestartammo( weapon ); - - if ( !is_offhand_weapon( weapon ) ) - { - if ( !is_melee_weapon( weapon ) ) - self switchtoweapon( weapon ); - else - self switchtoweapon( current_weapon ); - } - - self play_weapon_vo( weapon, magic_box ); -} - -play_weapon_vo( weapon, magic_box ) -{ - if ( isdefined( level._audio_custom_weapon_check ) ) - type = self [[ level._audio_custom_weapon_check ]]( weapon, magic_box ); - else - type = self weapon_type_check( weapon ); - - if ( type == "crappy" ) - return; - - if ( type != "favorite" && type != "upgrade" ) - type = weapon; - - self maps\mp\zombies\_zm_audio::create_and_play_dialog( "weapon_pickup", type ); -} - -weapon_type_check( weapon ) -{ - if ( !isdefined( self.entity_num ) ) - return "crappy"; - - weapon = get_base_name( weapon ); - - if ( self is_favorite_weapon( weapon ) ) - return "favorite"; - - if ( issubstr( weapon, "upgraded" ) ) - return "upgrade"; - else - return level.zombie_weapons[weapon].vox; -} - -get_player_index( player ) -{ -/# - assert( isplayer( player ) ); -#/ -/# - assert( isdefined( player.characterindex ) ); -#/ -/# - if ( player.entity_num == 0 && getdvar( _hash_2222BA21 ) != "" ) - { - new_vo_index = getdvarint( _hash_2222BA21 ); - return new_vo_index; - } -#/ - return player.characterindex; -} - -ammo_give( weapon ) -{ - give_ammo = 0; - - if ( !is_offhand_weapon( weapon ) ) - { - weapon = get_weapon_with_attachments( weapon ); - - if ( isdefined( weapon ) ) - { - stockmax = 0; - stockmax = weaponstartammo( weapon ); - clipcount = self getweaponammoclip( weapon ); - currstock = self getammocount( weapon ); - - if ( currstock - clipcount >= stockmax ) - give_ammo = 0; - else - give_ammo = 1; - } - } - else if ( self has_weapon_or_upgrade( weapon ) ) - { - if ( self getammocount( weapon ) < weaponmaxammo( weapon ) ) - give_ammo = 1; - } - - if ( give_ammo ) - { - self play_sound_on_ent( "purchase" ); - self givemaxammo( weapon ); - alt_weap = weaponaltweaponname( weapon ); - - if ( "none" != alt_weap ) - self givemaxammo( alt_weap ); - - return true; - } - - if ( !give_ammo ) - return false; -} - -get_player_weapondata( player, weapon ) -{ - weapondata = []; - - if ( !isdefined( weapon ) ) - weapondata["name"] = player getcurrentweapon(); - else - weapondata["name"] = weapon; - - weapondata["dw_name"] = weapondualwieldweaponname( weapondata["name"] ); - weapondata["alt_name"] = weaponaltweaponname( weapondata["name"] ); - - if ( weapondata["name"] != "none" ) - { - weapondata["clip"] = player getweaponammoclip( weapondata["name"] ); - weapondata["stock"] = player getweaponammostock( weapondata["name"] ); - weapondata["fuel"] = player getweaponammofuel( weapondata["name"] ); - weapondata["heat"] = player isweaponoverheating( 1, weapondata["name"] ); - weapondata["overheat"] = player isweaponoverheating( 0, weapondata["name"] ); - } - else - { - weapondata["clip"] = 0; - weapondata["stock"] = 0; - weapondata["fuel"] = 0; - weapondata["heat"] = 0; - weapondata["overheat"] = 0; - } - - if ( weapondata["dw_name"] != "none" ) - weapondata["lh_clip"] = player getweaponammoclip( weapondata["dw_name"] ); - else - weapondata["lh_clip"] = 0; - - if ( weapondata["alt_name"] != "none" ) - { - weapondata["alt_clip"] = player getweaponammoclip( weapondata["alt_name"] ); - weapondata["alt_stock"] = player getweaponammostock( weapondata["alt_name"] ); - } - else - { - weapondata["alt_clip"] = 0; - weapondata["alt_stock"] = 0; - } - - return weapondata; -} - -weapon_is_better( left, right ) -{ - if ( left != right ) - { - left_upgraded = !isdefined( level.zombie_weapons[left] ); - right_upgraded = !isdefined( level.zombie_weapons[right] ); - - if ( left_upgraded && right_upgraded ) - { - leftatt = get_attachment_index( left ); - rightatt = get_attachment_index( right ); - return leftatt > rightatt; - } - else if ( left_upgraded ) - return 1; - } - - return 0; -} - -merge_weapons( oldweapondata, newweapondata ) -{ - weapondata = []; - weapondata["name"] = "none"; - - if ( weapon_is_better( oldweapondata["name"], newweapondata["name"] ) ) - weapondata["name"] = oldweapondata["name"]; - else - weapondata["name"] = newweapondata["name"]; - - name = weapondata["name"]; - dw_name = weapondualwieldweaponname( name ); - alt_name = weaponaltweaponname( name ); - - if ( name != "none" ) - { - weapondata["clip"] = newweapondata["clip"] + oldweapondata["clip"]; - weapondata["clip"] = int( min( weapondata["clip"], weaponclipsize( name ) ) ); - weapondata["stock"] = newweapondata["stock"] + oldweapondata["stock"]; - weapondata["stock"] = int( min( weapondata["stock"], weaponmaxammo( name ) ) ); - weapondata["fuel"] = newweapondata["fuel"] + oldweapondata["fuel"]; - weapondata["fuel"] = int( min( weapondata["fuel"], weaponfuellife( name ) ) ); - weapondata["heat"] = int( min( newweapondata["heat"], oldweapondata["heat"] ) ); - weapondata["overheat"] = int( min( newweapondata["overheat"], oldweapondata["overheat"] ) ); - } - - if ( dw_name != "none" ) - { - weapondata["lh_clip"] = newweapondata["lh_clip"] + oldweapondata["lh_clip"]; - weapondata["lh_clip"] = int( min( weapondata["lh_clip"], weaponclipsize( dw_name ) ) ); - } - - if ( alt_name != "none" ) - { - weapondata["alt_clip"] = newweapondata["alt_clip"] + oldweapondata["alt_clip"]; - weapondata["alt_clip"] = int( min( weapondata["alt_clip"], weaponclipsize( alt_name ) ) ); - weapondata["alt_stock"] = newweapondata["alt_stock"] + oldweapondata["alt_stock"]; - weapondata["alt_stock"] = int( min( weapondata["alt_stock"], weaponmaxammo( alt_name ) ) ); - } - - return weapondata; -} - -weapondata_give( weapondata ) -{ - current = get_player_weapon_with_same_base( weapondata["name"] ); - - if ( isdefined( current ) ) - { - curweapondata = get_player_weapondata( self, current ); - self takeweapon( current ); - weapondata = merge_weapons( curweapondata, weapondata ); - } - - name = weapondata["name"]; - weapon_give( name, undefined, undefined, 1 ); - dw_name = weapondualwieldweaponname( name ); - alt_name = weaponaltweaponname( name ); - - if ( name != "none" ) - { - self setweaponammoclip( name, weapondata["clip"] ); - self setweaponammostock( name, weapondata["stock"] ); - - if ( isdefined( weapondata["fuel"] ) ) - self setweaponammofuel( name, weapondata["fuel"] ); - - if ( isdefined( weapondata["heat"] ) && isdefined( weapondata["overheat"] ) ) - self setweaponoverheating( weapondata["overheat"], weapondata["heat"], name ); - } - - if ( dw_name != "none" ) - self setweaponammoclip( dw_name, weapondata["lh_clip"] ); - - if ( alt_name != "none" ) - { - self setweaponammoclip( alt_name, weapondata["alt_clip"] ); - self setweaponammostock( alt_name, weapondata["alt_stock"] ); - } -} - -register_zombie_weapon_callback( str_weapon, func ) -{ - if ( !isdefined( level.zombie_weapons_callbacks ) ) - level.zombie_weapons_callbacks = []; - - if ( !isdefined( level.zombie_weapons_callbacks[str_weapon] ) ) - level.zombie_weapons_callbacks[str_weapon] = func; -} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_zm_zonemgr.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_zm_zonemgr.gsc index 105d628..9066293 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_zonemgr.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_zonemgr.gsc @@ -1,1187 +1,1105 @@ -// T6 GSC SOURCE -// Decompiled by https://github.com/xensik/gsc-tool -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\zombies\_zm_utility; -#include maps\mp\gametypes_zm\_zm_gametype; -#include maps\mp\zombies\_zm_zonemgr; +//checked include match cerberus output +#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() +init() //checked matches cerberus output { -/# - println( "ZM >> Zombiemode Server Scripts Init (_zm_zonemgr.gsc)" ); -#/ - 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; + 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 ) +zone_is_enabled( zone_name ) //checked matches cerberus output { - if ( !isdefined( level.zones ) || !isdefined( level.zones[zone_name] ) || !level.zones[zone_name].is_enabled ) - return false; - - return true; + if ( !isDefined( level.zones ) || !isDefined( level.zones[ zone_name ] ) || !level.zones[ zone_name ].is_enabled ) + { + return 0; + } + return 1; } -get_player_zone() +get_player_zone() //checked changed to match cerberus output { - 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; + 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 ) +get_zone_from_position( v_pos, ignore_enabled_check ) //checked changed to match cerberus output { - 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; + 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 ) +get_zone_magic_boxes( zone_name ) //checked matches cerberus output { - if ( isdefined( zone_name ) && !zone_is_enabled( zone_name ) ) - return undefined; - - zone = level.zones[zone_name]; -/# - assert( isdefined( zone_name ) ); -#/ - return zone.magic_boxes; + 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 ) +get_zone_zbarriers( zone_name ) //checked matches cerberus output { - if ( isdefined( zone_name ) && !zone_is_enabled( zone_name ) ) - return undefined; - - zone = level.zones[zone_name]; -/# - assert( isdefined( zone_name ) ); -#/ - return zone.zbarriers; + 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 ) +get_players_in_zone( zone_name, return_players ) //checked changed to match cerberus output { - 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; + 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 ) +player_in_zone( zone_name ) //checked changed to match cerberus output { - if ( !zone_is_enabled( zone_name ) ) - return false; - - 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 true; - } - } - - return false; + 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 ) +entity_in_zone( zone_name, ignore_enabled_check ) //checked changed to match cerberus output { - if ( !zone_is_enabled( zone_name ) && !( isdefined( ignore_enabled_check ) && ignore_enabled_check ) ) - return false; - - zone = level.zones[zone_name]; - - for ( i = 0; i < zone.volumes.size; i++ ) - { - if ( self istouching( zone.volumes[i] ) ) - return true; - } - - return false; + 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() +deactivate_initial_barrier_goals() //checked changed to match cerberus output { - 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(); - } - } + 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 ) +zone_init( zone_name ) //checked changed to match cerberus output { - if ( isdefined( level.zones[zone_name] ) ) - return; -/# - println( "ZM >> zone_init (1) = " + zone_name ); -#/ - 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; - zone.volumes = []; - volumes = getentarray( zone_name, "targetname" ); -/# - println( "ZM >> zone_init (2) = " + volumes.size ); -#/ - for ( i = 0; i < volumes.size; i++ ) - { - if ( volumes[i].classname == "info_volume" ) - zone.volumes[zone.volumes.size] = volumes[i]; - } -/# - assert( isdefined( zone.volumes[0] ), "zone_init: No volumes found for zone: " + zone_name ); -#/ - 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 ( !( isdefined( spots[i].is_blocked ) && 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]; - continue; - } - - if ( token == "screecher_location" ) - { - zone.screecher_locations[zone.screecher_locations.size] = spots[i]; - continue; - } - - if ( token == "avogadro_location" ) - { - zone.avogadro_locations[zone.avogadro_locations.size] = spots[i]; - continue; - } - - if ( token == "inert_location" ) - { - zone.inert_locations[zone.inert_locations.size] = spots[i]; - continue; - } - - if ( token == "quad_location" ) - { - zone.quad_locations[zone.quad_locations.size] = spots[i]; - continue; - } - - if ( token == "leaper_location" ) - { - zone.leaper_locations[zone.leaper_locations.size] = spots[i]; - continue; - } - - if ( token == "brutus_location" ) - { - zone.brutus_locations[zone.brutus_locations.size] = spots[i]; - continue; - } - - if ( token == "mechz_location" ) - { - zone.mechz_locations[zone.mechz_locations.size] = spots[i]; - continue; - } - - if ( token == "astro_location" ) - { - zone.astro_locations[zone.astro_locations.size] = spots[i]; - continue; - } - - if ( token == "napalm_location" ) - { - zone.napalm_locations[zone.napalm_locations.size] = spots[i]; - continue; - } - - 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]; - } - } + + 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 ]; + } + } + } } -reinit_zone_spawners() +//unused code +/* +reinit_zone_spawners() //checked changed to match cerberus output { - zkeys = getarraykeys( level.zones ); + zkeys = getarraykeys( level.zones ); + for( i = 0; i < level.zones.size; i++ ) + { + zone = level.zones[ zkeys[ 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.quad_locations = []; + zone.leaper_locations = []; + zone.brutus_locations = []; + zone.mechz_locations = []; + zone.astro_locations = []; + zone.napalm_locations = []; + for ( j = 0; j < spots.size; j++ ) + { + spots[ j ].zone_name = zkeys[ j ]; + if ( isdefined( spots[ j ].is_blocked ) && !spots[ j ].is_blocked ) + { + spots[ j ].is_enabled = 1; + } + else + { + spots[ j ].is_enabled = 0; + } + tokens = strtok( spots[ j ].script_noteworthy, " " ); + foreach ( token in tokens ) + { + if ( token == "dog_location" ) + { + zone.dog_locations[ zone.dog_locations.size ] = spots[ j ]; + } + else if ( token == "screecher_location" ) + { + zone.screecher_locations[ zone.screecher_locations.size ] = spots[ j ]; + } + else if ( token == "avogadro_location" ) + { + zone.avogadro_locations[ zone.avogadro_locations.size ] = spots[ j ]; + } + else if ( token == "quad_location" ) + { + zone.quad_locations[ zone.quad_locations.size ] = spots[ j ]; + } + else if ( token == "leaper_location" ) + { + zone.leaper_locations[ zone.leaper_locations.size ] = spots[ j ]; + } + else if ( token == "brutus_location" ) + { + zone.brutus_locations[ zone.brutus_locations.size ] = spots[ j ]; + } + else if ( token == "mechz_location" ) + { + zone.mechz_locations[ zone.mechz_locations.size ] = spots[ j ]; + } + else if ( token == "astro_location" ) + { + zone.astro_locations[ zone.astro_locations.size ] = spots[ j ]; + } + else if ( token == "napalm_location" ) + { + zone.napalm_locations[ zone.napalm_locations.size ] = spots[ j ]; + } + else + { + zone.spawn_locations[ zone.spawn_locations.size ] = spots[ j ]; + } + } + } + } + } +} +*/ - for ( i = 0; i < level.zones.size; i++ ) - { - zone = level.zones[zkeys[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.quad_locations = []; - zone.leaper_locations = []; - zone.brutus_locations = []; - zone.mechz_locations = []; - zone.astro_locations = []; - zone.napalm_locations = []; - - for ( j = 0; j < spots.size; j++ ) - { - spots[j].zone_name = zkeys[j]; - - if ( !( isdefined( spots[j].is_blocked ) && spots[j].is_blocked ) ) - spots[j].is_enabled = 1; - else - spots[j].is_enabled = 0; - - tokens = strtok( spots[j].script_noteworthy, " " ); - - foreach ( token in tokens ) - { - if ( token == "dog_location" ) - { - zone.dog_locations[zone.dog_locations.size] = spots[j]; - continue; - } - - if ( token == "screecher_location" ) - { - zone.screecher_locations[zone.screecher_locations.size] = spots[j]; - continue; - } - - if ( token == "avogadro_location" ) - { - zone.avogadro_locations[zone.avogadro_locations.size] = spots[j]; - continue; - } - - if ( token == "quad_location" ) - { - zone.quad_locations[zone.quad_locations.size] = spots[j]; - continue; - } - - if ( token == "leaper_location" ) - { - zone.leaper_locations[zone.leaper_locations.size] = spots[j]; - continue; - } - - if ( token == "brutus_location" ) - { - zone.brutus_locations[zone.brutus_locations.size] = spots[j]; - continue; - } - - if ( token == "mechz_location" ) - { - zone.mechz_locations[zone.mechz_locations.size] = spots[j]; - continue; - } - - if ( token == "astro_location" ) - { - zone.astro_locations[zone.astro_locations.size] = spots[j]; - continue; - } - - if ( token == "napalm_location" ) - { - zone.napalm_locations[zone.napalm_locations.size] = spots[j]; - continue; - } - - zone.spawn_locations[zone.spawn_locations.size] = spots[j]; - } - } - } - } +enable_zone( zone_name ) //checked changed to match cerberus output +{ + 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(); + } } -enable_zone( zone_name ) +make_zone_adjacent( main_zone_name, adj_zone_name, flag_name ) //checked matches cerberus output { -/# - assert( isdefined( level.zones ) && isdefined( level.zones[zone_name] ), "enable_zone: zone has not been initialized" ); -#/ - 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(); - } + 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; + } } -make_zone_adjacent( main_zone_name, adj_zone_name, flag_name ) +add_zone_flags( wait_flag, add_flags ) //checked changed to match cerberus output { - 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 - { -/# - assert( !isarray( flag_name ), "make_zone_adjacent: can't mix single and arrays of flags" ); -#/ - 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; - } + 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_zone_flags( wait_flag, add_flags ) +add_adjacent_zone( zone_name_a, zone_name_b, flag_name, one_way ) //checked matches cerberus output { - if ( !isarray( add_flags ) ) - { - temp = add_flags; - add_flags = []; - add_flags[0] = temp; - } - - keys = getarraykeys( level.zone_flags ); - - 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; + 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 ); + } } -add_adjacent_zone( zone_name_a, zone_name_b, flag_name, one_way ) +setup_zone_flag_waits() //checked changed to match cerberus output { - 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] ); + 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; - } - } + 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 ] ); //essential priority over manage_zones //was disabled + azone.is_connected = 1; + if ( !level.zones[ azkeys[ az ] ].is_enabled ) + { + enable_zone( azkeys[ az ] ); //essential priority over manage_zones //was disabled + } + 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 ) +door_close_disconnect( flag_name ) //checked matches cerberus output { - while ( flag( flag_name ) ) - wait 1.0; - - self.is_connected = 0; - level thread zone_flag_wait( 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 ) +connect_zones( zone_name_a, zone_name_b, one_way ) //checked matches cerberus output { - 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; - } - } + 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 ) +manage_zones( initial_zone ) //checked changed to match cerberus output { -/# - assert( isdefined( initial_zone ), "You must specify an initial zone to manage" ); -#/ - 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++ ) - { -/# - assert( isdefined( spawn_points[i].script_noteworthy ), "player_respawn_point: You must specify a script noteworthy with the zone name" ); -#/ - spawn_points[i].locked = 1; - } + 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 ( isdefined( level.zone_manager_init_func ) ) - [[ level.zone_manager_init_func ]](); -/# - println( "ZM >> zone_init bbbb (_zm_zonemgr.gsc) = " + initial_zone.size ); -#/ - if ( isarray( initial_zone ) ) - { -/# - println( "ZM >> zone_init aaaa (_zm_zonemgr.gsc) = " + initial_zone[0] ); -#/ - for ( i = 0; i < initial_zone.size; i++ ) - { - zone_init( initial_zone[i] ); - enable_zone( initial_zone[i] ); - } - } - else - { -/# - println( "ZM >> zone_init (_zm_zonemgr.gsc) = " + initial_zone ); -#/ - 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" ); -/# - level thread _debug_zones(); -#/ - while ( getdvarint( _hash_10873CCA ) == 0 || getdvarint( _hash_762F1309 ) != 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; - - for ( z = 0; z < zkeys.size; z++ ) - { - zone = level.zones[zkeys[z]]; - newzone = level.newzones[zkeys[z]]; - - if ( !zone.is_enabled ) - 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; - } - } - - 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 ); -/# - debug_show_spawn_locations(); -#/ - level.active_zone_names = maps\mp\zombies\_zm_zonemgr::get_active_zone_names(); - wait 1; - } + 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() +debug_show_spawn_locations() //checked dev call deleted { -/# - if ( isdefined( level.toggle_show_spawn_locations ) && level.toggle_show_spawn_locations ) - { - host_player = gethostplayer(); - - foreach ( location in level.zombie_spawn_locations ) - { - distance = distance( location.origin, host_player.origin ); - color = ( 0, 0, 1 ); - - if ( distance > getdvarint( _hash_85E6B1CE ) * 12 ) - color = ( 1, 0, 0 ); - - debugstar( location.origin, getdvarint( _hash_BB9101B2 ), color ); - } - } -#/ } -old_manage_zones( initial_zone ) +//unused code +/* +old_manage_zones( initial_zone ) //checked changed to match cerberus output { -/# - assert( isdefined( initial_zone ), "You must specify an initial zone to manage" ); -#/ - deactivate_initial_barrier_goals(); - spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); - for ( i = 0; i < spawn_points.size; i++ ) - { -/# - assert( isdefined( spawn_points[i].script_noteworthy ), "player_respawn_point: You must specify a script noteworthy with the zone name" ); -#/ - spawn_points[i].locked = 1; - } - - if ( isdefined( level.zone_manager_init_func ) ) - [[ level.zone_manager_init_func ]](); -/# - println( "ZM >> zone_init bbbb (_zm_zonemgr.gsc) = " + initial_zone.size ); -#/ - if ( isarray( initial_zone ) ) - { -/# - println( "ZM >> zone_init aaaa (_zm_zonemgr.gsc) = " + initial_zone[0] ); -#/ - for ( i = 0; i < initial_zone.size; i++ ) - { - zone_init( initial_zone[i] ); - enable_zone( initial_zone[i] ); - } - } - else - { -/# - println( "ZM >> zone_init (_zm_zonemgr.gsc) = " + initial_zone ); -#/ - zone_init( initial_zone ); - enable_zone( initial_zone ); - } - - setup_zone_flag_waits(); - zkeys = getarraykeys( level.zones ); - level.zone_keys = zkeys; - flag_set( "zones_initialized" ); - flag_wait( "begin_spawning" ); -/# - level thread _debug_zones(); -#/ - while ( getdvarint( _hash_10873CCA ) == 0 || getdvarint( _hash_762F1309 ) != 0 ) - { - for ( z = 0; z < zkeys.size; z++ ) - { - level.zones[zkeys[z]].is_active = 0; - level.zones[zkeys[z]].is_occupied = 0; - } - - a_zone_is_active = 0; - a_zone_is_spawning_allowed = 0; - - for ( z = 0; z < zkeys.size; z++ ) - { - zone = level.zones[zkeys[z]]; - - if ( !zone.is_enabled ) - continue; - - if ( isdefined( level.zone_occupied_func ) ) - zone.is_occupied = [[ level.zone_occupied_func ]]( zkeys[z] ); - else - zone.is_occupied = player_in_zone( zkeys[z] ); - - if ( zone.is_occupied ) - { - zone.is_active = 1; - a_zone_is_active = 1; - - if ( zone.is_spawning_allowed ) - a_zone_is_spawning_allowed = 1; - - 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.zones[azkeys[az]].is_active = 1; - - if ( level.zones[azkeys[az]].is_spawning_allowed ) - a_zone_is_spawning_allowed = 1; - } - } - } - } - - 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; - } + deactivate_initial_barrier_goals(); + 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; + flag_set( "zones_initialized" ); + flag_wait( "begin_spawning" ); + while ( getDvarInt( "noclip" ) == 0 || getDvarInt( "notarget" ) != 0 ) + { + for(z = 0; z < zkeys.size; z++) + { + level.zones[ zkeys[ z ] ].is_active = 0; + level.zones[ zkeys[ z ] ].is_occupied = 0; + } + a_zone_is_active = 0; + a_zone_is_spawning_allowed = 0; + for ( z = 0; z < zkeys.size; z++ ) + { + zone = level.zones[ zkeys[ z ] ]; + if ( !zone.is_enabled ) + { + continue; + } + if ( isdefined( level.zone_occupied_func ) ) + { + zone.is_occupied = [[ level.zone_occupied_func ]]( zkeys[ z ] ); + } + else + { + zone.is_occupied = player_in_zone( zkeys[ z ] ); + } + if ( zone.is_occupied ) + { + zone.is_active = 1; + a_zone_is_active = 1; + if ( zone.is_spawning_allowed ) + { + a_zone_is_spawning_allowed = 1; + } + 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.zones[ azkeys[ az ] ].is_active = 1; + if ( level.zones[ azkeys[ az ] ].is_spawning_allowed ) + { + a_zone_is_spawning_allowed = 1; + } + } + } + } + } + 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; + } } - -create_spawner_list( zkeys ) +*/ +create_spawner_list( zkeys ) //checked changed to match cerberus output { - 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]; - } - } - } + 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() + +get_active_zone_names() //checked changed to match cerberus output { - 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; + 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; } -_init_debug_zones() +//commented out +/* +_init_debug_zones() //checked changed to match cerberus output { - current_y = 30; - current_x = 20; - xloc = []; - xloc[0] = 50; - xloc[1] = 60; - xloc[2] = 100; - xloc[3] = 130; - xloc[4] = 170; - zkeys = getarraykeys( level.zones ); - - for ( i = 0; i < zkeys.size; i++ ) - { - zonename = zkeys[i]; - zone = level.zones[zonename]; - zone.debug_hud = []; - - for ( j = 0; j < 5; j++ ) - { - zone.debug_hud[j] = newdebughudelem(); - - if ( !j ) - zone.debug_hud[j].alignx = "right"; - else - zone.debug_hud[j].alignx = "left"; - - zone.debug_hud[j].x = xloc[j]; - zone.debug_hud[j].y = current_y; - } - - current_y += 10; - zone.debug_hud[0] settext( zonename ); - } + current_y = 30; + current_x = 20; + xloc = []; + xloc[ 0 ] = 50; + xloc[ 1 ] = 60; + xloc[ 2 ] = 100; + xloc[ 3 ] = 130; + xloc[ 4 ] = 170; + zkeys = getarraykeys( level.zones ); + for(i = 0; i < zkeys.size; i++) + { + zonename = zkeys[i]; + zone = level.zones[zonename]; + zone.debug_hud = []; + for(j = 0; j < 5; j++) + { + zone.debug_hud[j] = newdebughudelem(); + if(!j) + { + zone.debug_hud[j].alignx = "right"; + } + else + { + zone.debug_hud[j].alignx = "left"; + } + zone.debug_hud[j].x = xloc[j]; + zone.debug_hud[j].y = current_y; + } + current_y = current_y + 10; + zone.debug_hud[0] settext(zonename); + } } -_destroy_debug_zones() +_destroy_debug_zones() //checked changed to match cerberus output { - zkeys = getarraykeys( level.zones ); - - for ( i = 0; i < zkeys.size; i++ ) - { - zonename = zkeys[i]; - zone = level.zones[zonename]; - - for ( j = 0; j < 5; j++ ) - { - zone.debug_hud[j] destroy(); - zone.debug_hud[j] = undefined; - } - } + zkeys = getarraykeys(level.zones); + for(i = 0; i < zkeys.size; i++) + { + zonename = zkeys[i]; + zone = level.zones[zonename]; + for(j = 0; j < 5; j++) + { + zone.debug_hud[j] destroy(); + zone.debug_hud[j] = undefined; + } + } } -_debug_zones() +_debug_zones() //checked changed to match cerberus output { - enabled = 0; - - if ( getdvar( _hash_10E35BC4 ) == "" ) - setdvar( "zombiemode_debug_zones", "0" ); - - while ( true ) - { - wasenabled = enabled; - enabled = getdvarint( _hash_10E35BC4 ); - - if ( enabled && !wasenabled ) - _init_debug_zones(); - else if ( !enabled && wasenabled ) - _destroy_debug_zones(); - - if ( enabled ) - { - zkeys = getarraykeys( level.zones ); - - for ( i = 0; i < zkeys.size; i++ ) - { - zonename = zkeys[i]; - zone = level.zones[zonename]; - text = zonename; - zone.debug_hud[0] settext( text ); - - if ( zone.is_enabled ) - { - text += " Enabled"; - zone.debug_hud[1] settext( "Enabled" ); - } - else - zone.debug_hud[1] settext( "" ); - - if ( zone.is_active ) - { - text += " Active"; - zone.debug_hud[2] settext( "Active" ); - } - else - zone.debug_hud[2] settext( "" ); - - if ( zone.is_occupied ) - { - text += " Occupied"; - zone.debug_hud[3] settext( "Occupied" ); - } - else - zone.debug_hud[3] settext( "" ); - - if ( zone.is_spawning_allowed ) - { - text += " SpawningAllowed"; - zone.debug_hud[4] settext( "SpawningAllowed" ); - } - else - zone.debug_hud[4] settext( "" ); -/# - println( "ZM >> DEBUG=" + text ); -#/ - } - } - - wait 0.1; - } + enabled = 0; + if ( getDvar( "zombiemode_debug_zones" ) == "" ) + { + setdvar( "zombiemode_debug_zones", "0" ); + } + while(1) + { + wasenabled = enabled; + enabled = GetDvarInt(hash_10e35bc4); + if(enabled && !wasenabled) + { + _init_debug_zones(); + } + else if(!enabled && wasenabled) + { + _destroy_debug_zones(); + } + if(enabled) + { + zkeys = getarraykeys(level.zones); + for(i = 0; i < zkeys.size; i++) + { + zonename = zkeys[i]; + zone = level.zones[zonename]; + text = zonename; + zone.debug_hud[0] settext(text); + if(zone.is_enabled) + { + text = text + " Enabled"; + zone.debug_hud[1] settext("Enabled"); + } + else + { + zone.debug_hud[1] settext(""); + } + if(zone.is_active) + { + text = text + " Active"; + zone.debug_hud[2] settext("Active"); + } + else + { + zone.debug_hud[2] settext(""); + } + if(zone.is_occupied) + { + text = text + " Occupied"; + zone.debug_hud[3] settext("Occupied"); + } + else + { + zone.debug_hud[3] settext(""); + } + if(zone.is_spawning_allowed) + { + text = text + " SpawningAllowed"; + zone.debug_hud[4] settext("SpawningAllowed"); + } + else + { + zone.debug_hud[4] settext(""); + } + } + } + wait(0.1); + } } +*/ -is_player_in_zone( zone_name ) +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 true; - } - - return false; + 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; }