diff --git a/Zombie Core/common_zm/codescripts/character.gsc b/Zombie Core/common_zm/codescripts/character.gsc index e47145d..4a4272d 100644 --- a/Zombie Core/common_zm/codescripts/character.gsc +++ b/Zombie Core/common_zm/codescripts/character.gsc @@ -1,216 +1,201 @@ +// 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 ) { - i = 0; - while ( i < a.size ) - { - precachemodel( a[ i ] ); - i++; - } + for ( i = 0; i < a.size; i++ ) + precachemodel( a[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(); - i = 0; - while ( i < attachsize ) - { - info[ "attach" ][ i ][ "model" ] = self getattachmodelname( i ); - info[ "attach" ][ i ][ "tag" ] = self getattachtagname( i ); - i++; - } - return info; + } + + 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; } 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; - i = 0; - while ( i < attachsize ) - { - self attach( attachinfo[ i ][ "model" ], attachinfo[ i ][ "tag" ] ); - i++; - } + } + + attachinfo = info["attach"]; + attachsize = attachinfo.size; + + for ( i = 0; i < attachsize; i++ ) + self attach( attachinfo[i]["model"], attachinfo[i]["tag"] ); } 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; - i = 0; - while ( i < attachsize ) - { - precachemodel( attachinfo[ i ][ "model" ] ); - i++; - } + } + + precachemodel( info["model"] ); + attachinfo = info["attach"]; + attachsize = attachinfo.size; + + for ( i = 0; i < attachsize; i++ ) + precachemodel( attachinfo[i]["model"] ); } 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; - 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++; - } + 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; + } /# - 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 ) { - i = 0; - while ( i < amount ) - { - level.character_index_cache[ prefix ][ group ][ i ] = 0; - i++; - } + for ( i = 0; i < amount; i++ ) + level.character_index_cache[prefix][group][i] = 0; } 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 082155e..67cd584 100644 --- a/Zombie Core/common_zm/codescripts/delete.gsc +++ b/Zombie Core/common_zm/codescripts/delete.gsc @@ -1,23 +1,26 @@ +// 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 8d47324..d9c0839 100644 --- a/Zombie Core/common_zm/codescripts/struct.gsc +++ b/Zombie Core/common_zm/codescripts/struct.gsc @@ -1,41 +1,29 @@ +// 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 ) { - _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 ); - } + 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; + } + } + } } diff --git a/Zombie Core/common_zm/maps/mp/_serverfaceanim_mp.gsc b/Zombie Core/common_zm/maps/mp/_serverfaceanim_mp.gsc index bbd52a4..57936ef 100644 --- a/Zombie Core/common_zm/maps/mp/_serverfaceanim_mp.gsc +++ b/Zombie Core/common_zm/maps/mp/_serverfaceanim_mp.gsc @@ -1,56 +1,61 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\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 ( 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 ] ); - } - } - } + 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] ); + } + } } 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 f66f5ad..9605ea7 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,378 +1,367 @@ -#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" ); +// 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; 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 ( 1 ) - { - 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 ( true ) + { + 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 ( 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(); - } + 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(); } 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 ); - } - return; - } - 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 ); + } + } + 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(); - 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(); - } + 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(); } 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 ( 1 ) - { - if ( !isDefined( parent ) ) - { - if ( isDefined( self ) && isDefined( self.dud ) && self.dud ) - { - wait 6; - } - self_delete(); - return; - } - wait 0,05; - } + while ( true ) + { + 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" ); - 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++; - } + 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" ); + } } 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 ( 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; - } + 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; + } } monitor_zombie_groans( info ) { - 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; - } + 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; + } } play_zombie_groans() { - 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; - } - } + 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; + } } 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 4690759..de25942 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,396 +1,379 @@ -#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; +// 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; 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( "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; + 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; + } #/ - } } 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; - 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 = []; + 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 = []; } 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 ( 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 ); + 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 ); + } #/ - } - 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++; - } + 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 ); + } } thundergun_debug_print( msg, color ) { /# - if ( !getDvarInt( #"AAC84AD6" ) ) - { - return; - } - if ( !isDefined( color ) ) - { - color = ( 0, 0, 1 ); - } - print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 ); + 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 ); #/ } 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 ( 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; - } + 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; + } } 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() { - if ( isDefined( self.damageweapon ) && self.damageweapon != "thundergun_zm" && self.damageweapon == "thundergun_upgraded_zm" ) - { - if ( self.damagemod != "MOD_GRENADE" ) - { - return self.damagemod != "MOD_GRENADE_SPLASH"; - } - } + return isdefined( self.damageweapon ) && ( self.damageweapon == "thundergun_zm" || self.damageweapon == "thundergun_upgraded_zm" ) && ( self.damagemod != "MOD_GRENADE" && self.damagemod != "MOD_GRENADE_SPLASH" ); } enemy_killed_by_thundergun() { - if ( isDefined( self.thundergun_death ) ) - { - return self.thundergun_death == 1; - } + return isdefined( self.thundergun_death ) && 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; - } - 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 ); - } - } + 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 ); + } } setup_thundergun_vox( player, fling, gib, knockdown ) { - 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" ); - } - } + 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" ); + } } diff --git a/Zombie Core/patch_zm/codescripts/character_mp.gsc b/Zombie Core/patch_zm/codescripts/character_mp.gsc index 99f3c87..6086847 100644 --- a/Zombie Core/patch_zm/codescripts/character_mp.gsc +++ b/Zombie Core/patch_zm/codescripts/character_mp.gsc @@ -1,21 +1,19 @@ -#include codescripts/character; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include codescripts\character; setmodelfromarray( a ) { - self setmodel( a[ randomint( a.size ) ] ); + self setmodel( a[randomint( a.size )] ); } precachemodelarray( a ) { - i = 0; - while ( i < a.size ) - { - precachemodel( a[ i ] ); - i++; - } + for ( i = 0; i < a.size; i++ ) + precachemodel( a[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 27d067e..cea261c 100644 --- a/Zombie Core/patch_zm/common_scripts/utility.gsc +++ b/Zombie Core/patch_zm/common_scripts/utility.gsc @@ -1,2012 +1,1739 @@ +// 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 = []; - _a92 = array; - _k92 = getFirstArrayKey( _a92 ); - while ( isDefined( _k92 ) ) - { - elem = _a92[ _k92 ]; - a_copy[ a_copy.size ] = elem; - _k92 = getNextArrayKey( _a92, _k92 ); - } - return a_copy; + a_copy = []; + + foreach ( elem in array ) + a_copy[a_copy.size] = elem; + + return a_copy; } array_delete( array, is_struct ) { - _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 ); - } + foreach ( ent in array ) + { + if ( isdefined( is_struct ) && is_struct ) + { + ent structdelete(); + ent = undefined; + continue; + } + + if ( isdefined( ent ) ) + ent delete(); + } } array_randomize( array ) { - i = 0; - while ( i < array.size ) - { - j = randomint( array.size ); - temp = array[ i ]; - array[ i ] = array[ j ]; - array[ j ] = temp; - i++; - } - return array; + for ( i = 0; i < array.size; i++ ) + { + j = randomint( array.size ); + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + return array; } array_reverse( array ) { - array2 = []; - i = array.size - 1; - while ( i >= 0 ) - { - array2[ array2.size ] = array[ i ]; - i--; + array2 = []; - } - return array2; + for ( i = array.size - 1; i >= 0; i-- ) + array2[array2.size] = array[i]; + + return array2; } array_exclude( array, arrayexclude ) { - newarray = array; - if ( isarray( arrayexclude ) ) - { - i = 0; - while ( i < arrayexclude.size ) - { - arrayremovevalue( newarray, arrayexclude[ i ] ); - i++; - } - } - else arrayremovevalue( newarray, arrayexclude ); - return newarray; + newarray = array; + + if ( isarray( arrayexclude ) ) + { + for ( i = 0; i < arrayexclude.size; i++ ) + arrayremovevalue( newarray, arrayexclude[i] ); + } + else + arrayremovevalue( newarray, arrayexclude ); + + return newarray; } array_notify( ents, notifier ) { - i = 0; - while ( i < ents.size ) - { - ents[ i ] notify( notifier ); - i++; - } + for ( i = 0; i < ents.size; i++ ) + ents[i] notify( notifier ); } array_wait( array, msg, timeout ) { - 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++; - } + 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" ); + } } array_wait_any( array, msg, timeout ) { - 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; + 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; } 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 ); + if ( msg != "death" ) + ent endon( "death" ); + + level endon( internal_msg ); + self array_waitlogic2( ent, msg, timeout ); + level notify( internal_msg, ent ); } array_check_for_dupes( array, single ) { - i = 0; - while ( i < array.size ) - { - if ( array[ i ] == single ) - { - return 0; - } - i++; - } - return 1; + for ( i = 0; i < array.size; i++ ) + { + if ( array[i] == single ) + return false; + } + + return true; } 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; - i = 0; - while ( i < array.size ) - { - total += array[ i ]; - i++; - } - return total / array.size; + total = 0; + + for ( i = 0; i < array.size; i++ ) + total += array[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 = []; - 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 ); + 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 ); } 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 * 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.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; } 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 0; - } - i = 0; - while ( i < prefix.size ) - { - if ( msg[ i ] != prefix[ i ] ) - { - return 0; - } - i++; - } - return 1; + if ( prefix.size > msg.size ) + return false; + + for ( i = 0; i < prefix.size; i++ ) + { + if ( msg[i] != prefix[i] ) + return false; + } + + return true; } is_suffix( msg, suffix ) { - 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; + 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; } vector_compare( vec1, vec2 ) { - if ( abs( vec1[ 0 ] - vec2[ 0 ] ) < 0,001 && abs( vec1[ 1 ] - vec2[ 1 ] ) < 0,001 ) - { - return abs( vec1[ 2 ] - vec2[ 2 ] ) < 0,001; - } + return abs( vec1[0] - vec2[0] ) < 0.001 && abs( vec1[1] - vec2[1] ) < 0.001 && abs( vec1[2] - vec2[2] ) < 0.001; } draw_debug_line( start, end, timer ) { /# - i = 0; - while ( i < ( timer * 20 ) ) - { - line( start, end, ( 1, 1, 0,5 ) ); - wait 0,05; - i++; + for ( i = 0; i < timer * 20; i++ ) + { + line( start, end, ( 1, 1, 0.5 ) ); + wait 0.05; + } #/ - } } waittillend( msg ) { - self waittillmatch( msg ); - return "end"; + self waittillmatch( msg, "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 ); - i = 0; - while ( i < keys.size ) - { - self.exception[ keys[ i ] ] = exceptionfunc; - i++; - } + keys = getarraykeys( self.exception ); + + for ( i = 0; i < keys.size; i++ ) + self.exception[keys[i]] = exceptionfunc; } 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" ); + if ( msg != "death" ) + self endon( "death" ); + + ent endon( "die" ); + + self waittill( msg ); + + ent notify( "returned", msg ); } waittill_multiple( string1, string2, string3, string4, string5 ) { - 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--; + self endon( "death" ); + ent = spawnstruct(); + ent.threads = 0; - } - ent notify( "die" ); + 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" ); } waittill_multiple_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4 ) { - self endon( "death" ); - ent = spawnstruct(); - ent.threads = 0; - if ( isDefined( ent1 ) ) - { -/# - assert( isDefined( string1 ) ); -#/ - ent1 thread waittill_string( string1, ent ); - ent.threads++; - } - if ( isDefined( ent2 ) ) - { -/# - assert( isDefined( string2 ) ); -#/ - ent2 thread waittill_string( string2, ent ); - ent.threads++; - } - if ( isDefined( ent3 ) ) - { -/# - assert( isDefined( string3 ) ); -#/ - ent3 thread waittill_string( string3, ent ); - ent.threads++; - } - if ( isDefined( ent4 ) ) - { -/# - assert( isDefined( string4 ) ); -#/ - ent4 thread waittill_string( string4, ent ); - ent.threads++; - } - while ( ent.threads ) - { - ent waittill( "returned" ); - ent.threads--; + self endon( "death" ); + ent = spawnstruct(); + ent.threads = 0; - } - ent notify( "die" ); + if ( isdefined( ent1 ) ) + { +/# + assert( isdefined( string1 ) ); +#/ + ent1 thread waittill_string( string1, ent ); + ent.threads++; + } + + if ( isdefined( ent2 ) ) + { +/# + assert( isdefined( string2 ) ); +#/ + ent2 thread waittill_string( string2, ent ); + ent.threads++; + } + + if ( isdefined( ent3 ) ) + { +/# + assert( isdefined( string3 ) ); +#/ + ent3 thread waittill_string( string3, ent ); + ent.threads++; + } + + if ( isdefined( ent4 ) ) + { +/# + assert( isdefined( string4 ) ); +#/ + ent4 thread waittill_string( string4, ent ); + ent.threads++; + } + + while ( ent.threads ) + { + ent waittill( "returned" ); + + ent.threads--; + } + + 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(); - _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; + 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; } 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." ); #/ - i = 1; - while ( i < a_notifies.size ) - { - if ( isDefined( a_notifies[ i ] ) ) - { - self endon( a_notifies[ i ] ); - } - i++; - } - self waittill( a_notifies[ 0 ] ); + for ( i = 1; i < a_notifies.size; i++ ) + { + if ( isdefined( a_notifies[i] ) ) + self endon( a_notifies[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" ); + self endon( "die" ); + wait( delay ); + self notify( "returned", "timeout" ); } 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 ) ) - { - return; - } - else - { - wait 0,05; - } - } + while ( !flag_exists( msg ) ) + { + waittillframeend; + + if ( flag_exists( msg ) ) + break; + + 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 0; - } - return 1; + if ( !level.flag[flagname] ) + return false; + + return true; } flag_delete( flagname ) { - if ( isDefined( level.flag[ flagname ] ) ) - { - } - else - { + if ( isdefined( level.flag[flagname] ) ) + level.flag[flagname] = undefined; + 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 ( 1 ) - { - i = 0; - while ( i < a_flags.size ) - { - if ( flag( a_flags[ i ] ) ) - { - return a_flags[ i ]; - } - i++; - } - level waittill_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 ); + } } 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 ) { - _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 ); - } + foreach ( str_flag in a_flags ) + { + if ( flag( str_flag ) ) + { + flag_waitopen( str_flag ); + continue; + } + } } flag_exists( flagname ) { - 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; + 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; } 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 ) ) - { - 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 ); + 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 ); } 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 ) ) - { - _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 ); + 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 ); } 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 ) ) - { - 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 ); + 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 ); } 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 = []; - i = 0; - while ( i < array.size ) - { - if ( !isDefined( array[ i ] ) ) - { - i++; - continue; - } - else - { - newarray[ newarray.size ] = array[ i ]; - } - i++; - } - return newarray; + newarray = []; + + for ( i = 0; i < array.size; i++ ) + { + if ( !isdefined( array[i] ) ) + continue; + + newarray[newarray.size] = array[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 ); - self.trigger_off = 1; - } + if ( !isdefined( self.trigger_off ) || !self.trigger_off ) + { + self.realorigin = self.origin; + self.origin += vectorscale( ( 0, 0, -1 ), 10000.0 ); + 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 ); - 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, trigger_hit.who ); + return trigger_hit; + } + else + return _trigger_wait( e_entity ); } _trigger_wait( e_entity ) { - 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; + 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; } _trigger_wait_think( s_tracker, e_entity ) { - self endon( "death" ); - s_tracker endon( "trigger" ); - e_other = _trigger_wait( e_entity ); - s_tracker notify( "trigger" ); + self endon( "death" ); + s_tracker endon( "trigger" ); + e_other = _trigger_wait( e_entity ); + s_tracker notify( "trigger", e_other, self ); } 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 ); - 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, ent ); + + 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; - 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 ] ]](); - } + 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] ]](); } create_flags_and_return_tokens( flags ) { - tokens = strtok( flags, " " ); - i = 0; - while ( i < tokens.size ) - { - if ( !isDefined( level.flag[ tokens[ i ] ] ) ) - { - flag_init( tokens[ i ], undefined, 1 ); - } - i++; - } - return tokens; + tokens = strtok( flags, " " ); + + for ( i = 0; i < tokens.size; i++ ) + { + if ( !isdefined( level.flag[tokens[i]] ) ) + flag_init( tokens[i], undefined, 1 ); + } + + 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 ) { - if ( isDefined( trig ) ) - { - if ( trig has_spawnflag( 256 ) ) - { - if ( !isDefined( trig.classname ) && isDefined( "trigger_damage" ) && isDefined( trig.classname ) && isDefined( "trigger_damage" )} - } - else - { - } - return 0; + return isdefined( trig ) ? trig has_spawnflag( 256 ) && !( !isdefined( trig.classname ) && !isdefined( "trigger_damage" ) || isdefined( trig.classname ) && isdefined( "trigger_damage" ) && trig.classname == "trigger_damage" ) : 0; } is_trigger_once( trig ) { - 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; + return isdefined( trig ) ? trig has_spawnflag( 1024 ) || !isdefined( self.classname ) && !isdefined( "trigger_once" ) || isdefined( self.classname ) && isdefined( "trigger_once" ) && self.classname == "trigger_once" : 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 ] ) ) - { - } - 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 ] ) ) - { - } + 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; } 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" ] = []; - _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 ) ) - { + 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 ) ) + { /# - 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; - } - _k2064 = getNextArrayKey( _a2064, _k2064 ); - } + 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; + } + } } 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 1; - } - return 0; + if ( level.language == "german" ) + return true; + + return false; } is_gib_restricted_build() { - if ( getDvar( "language" ) == "japanese" ) - { - return 1; - } - return 0; + if ( getdvar( "language" ) == "japanese" ) + return true; + + return false; } is_true( check ) { - if ( isDefined( check ) && check ) - { - return 1; - } - return 0; + return isdefined( check ) && check; } is_false( check ) { - if ( isDefined( check ) ) - { - return !check; - } + return isdefined( check ) && !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; - if ( ( k * dt ) >= 1 || k <= 0 ) - { - r = desired; - } - else - { - err = desired - curr; - r = curr + ( k * err * dt ); - } - return r; + r = 0.0; + + if ( k * dt >= 1.0 || k <= 0.0 ) + r = desired; + else + { + err = desired - curr; + r = curr + k * err * dt; + } + + return r; } death_notify_wrapper( attacker, damagetype ) { - level notify( "face" ); - self notify( "death" ); + level notify( "face", "death", self ); + self notify( "death", attacker, damagetype ); } damage_notify_wrapper( damage, attacker, direction_vec, point, type, modelname, tagname, partname, idflags ) { - level notify( "face" ); - self notify( "damage" ); + level notify( "face", "damage", self ); + self notify( "damage", damage, attacker, direction_vec, point, type, modelname, tagname, partname, idflags ); } explode_notify_wrapper() { - level notify( "face" ); - self notify( "explode" ); + level notify( "face", "explode", self ); + self notify( "explode" ); } alert_notify_wrapper() { - level notify( "face" ); - self notify( "alert" ); + level notify( "face", "alert", self ); + self notify( "alert" ); } shoot_notify_wrapper() { - level notify( "face" ); - self notify( "shoot" ); + level notify( "face", "shoot", self ); + self notify( "shoot" ); } melee_notify_wrapper() { - level notify( "face" ); - self notify( "melee" ); + level notify( "face", "melee", self ); + 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 84313fc..050b7f2 100644 --- a/Zombie Core/patch_zm/maps/mp/_art.gsc +++ b/Zombie Core/patch_zm/maps/mp/_art.gsc @@ -1,497 +1,447 @@ -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\_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 = ""; - 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; + 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; } 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( "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; + 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; + } #/ - } } 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() { /# - 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; - } - } - } + 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(); + } #/ - } } remove_reflection_objects() { /# - 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(); + 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(); + } #/ - } - } } create_reflection_objects() { /# - 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++; + 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" ); + } #/ - } } 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 = 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 ] ); - } + 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] ); + } #/ - } } debug_reflection_matte() { /# - 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; - } - } + 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(); + } #/ - } } debug_color_pallete() { /# - 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; - } - } - } + 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(); + } #/ - } } diff --git a/Zombie Core/patch_zm/maps/mp/_audio.gsc b/Zombie Core/patch_zm/maps/mp/_audio.gsc index bbfcf66..039e1ac 100644 --- a/Zombie Core/patch_zm/maps/mp/_audio.gsc +++ b/Zombie Core/patch_zm/maps/mp/_audio.gsc @@ -1,150 +1,139 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\utility; init() { + } wait_until_first_player() { - 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++; - } + 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(); } stand_think( trig ) { - 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; - } + 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; + } } monitor_player_sprint() { - 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; - } + 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" ); + } } monitor_player_movement() { - 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; - } - } + 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; + } } 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; - } - 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 ); - } - } + 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 ); + } } disable_bump_trigger( triggername ) { - 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++; - } - } + 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; + } + } } get_player_index_number( player ) { - players = get_players(); - i = 0; - while ( i < players.size ) - { - if ( players[ i ] == player ) - { - return i; - } - i++; - } - return 1; + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] == player ) + return 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 8b4286c..e9eca74 100644 --- a/Zombie Core/patch_zm/maps/mp/_ballistic_knife.gsc +++ b/Zombie Core/patch_zm/maps/mp/_ballistic_knife.gsc @@ -1,273 +1,262 @@ -#include maps/mp/_challenges; -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\utility; +#include maps\mp\_challenges; 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" ); - } - else - { - player notify( "ballistic_knife_stationary" ); - } - 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", retrievable_model, normal ); + else + player notify( "ballistic_knife_stationary", retrievable_model, normal, prey ); + + 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; - 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.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(); } 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 ( 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; - } + 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; + } } 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( ( 0, 0, 1 ), 5 ) ); - self thread updateretrievetrigger(); - } + if ( distancesquared( origin, self.origin ) < radius * radius ) + { + self physicslaunch( ( 0, 0, 1 ), vectorscale( ( 1, 1, 1 ), 5.0 ) ); + 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 d24054b..9c095c5 100644 --- a/Zombie Core/patch_zm/maps/mp/_bb.gsc +++ b/Zombie Core/patch_zm/maps/mp/_bb.gsc @@ -1,87 +1,91 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\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(); - return; - } + for (;;) + { + self waittill( "disconnect" ); + + self commitspawndata(); + break; + } } 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 75250e7..5a8bf36 100644 --- a/Zombie Core/patch_zm/maps/mp/_busing.gsc +++ b/Zombie Core/patch_zm/maps/mp/_busing.gsc @@ -1,19 +1,20 @@ -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#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 7a2c03a..167ec67 100644 --- a/Zombie Core/patch_zm/maps/mp/_challenges.gsc +++ b/Zombie Core/patch_zm/maps/mp/_challenges.gsc @@ -1,2117 +1,1881 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\utility; init() { - 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 ); - } + 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 ); } 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 ); - } - 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 ); + self.destroyedaircrafttime[weapon] = undefined; + } + else + self.destroyedaircrafttime[weapon] = gettime(); } canprocesschallenges() { /# - if ( getdvarintdefault( "scr_debug_challenges", 0 ) ) - { - return 1; + if ( getdvarintdefault( "scr_debug_challenges", 0 ) ) + return true; #/ - } - if ( level.rankedmatch || level.wagermatch ) - { - return 1; - } - return 0; + if ( level.rankedmatch || level.wagermatch ) + return true; + + return false; } 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 ) ) - { - 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++; - } + 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] ]](); + } } 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 ( 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 ); - } - } + 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 ); + } } 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 1; - } - } - } - } - else - { - if ( sweapon == "ai_tank_drone_rocket_mp" ) - { - if ( isDefined( einflictor ) && !isDefined( einflictor.from_ai ) ) - { - return 1; - } - } - } - return 0; + 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; } 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 1; - } - } - } - } - return 0; + 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; } 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" ); - 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.activeuavs ) ); -#/ -/# - 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_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--; + 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; - 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 ); - } + 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; + } +/# + assert( isdefined( player.activecounteruavs ) ); +#/ +/# + assert( isdefined( player.activeuavs ) ); +#/ +/# + 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 ); } 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 ) - { - _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 ); - } - } + 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 ); + } } 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 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; + 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; } spawnwatcher() { - 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(); - } + 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(); + } } pickedupballisticknife() { - self.retreivedblades++; + self.retreivedblades++; } watchfordtp() { - self endon( "disconnect" ); - self endon( "death" ); - self.dtptime = 0; - while ( 1 ) - { - self waittill( "dtp_end" ); - self.dtptime = getTime() + 4000; - } + self endon( "disconnect" ); + self endon( "death" ); + + for ( self.dtptime = 0; 1; self.dtptime = gettime() + 4000 ) + self waittill( "dtp_end" ); } watchformantle() { - self endon( "disconnect" ); - self endon( "death" ); - self.mantletime = 0; - while ( 1 ) - { - self waittill( "mantle_start", mantleendtime ); - self.mantletime = mantleendtime; - } + self endon( "disconnect" ); + self endon( "death" ); + + for ( self.mantletime = 0; 1; self.mantletime = mantleendtime ) + self waittill( "mantle_start", 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: - } - } + 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; + } } 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; - } - } - index = 0; - while ( index < level.placement[ "all" ].size ) - { - data.player = level.placement[ "all" ][ index ]; - data.place = index; - dochallengecallback( "roundEnd", data ); - index++; - } + 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 ); + } } 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; - } - } - index = 0; - while ( index < level.placement[ "all" ].size ) - { - data.player = level.placement[ "all" ][ index ]; - data.place = index; - dochallengecallback( "gameEnd", data ); - index++; - } + 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 ); + } } 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 ); - return; - } - } - } + 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 + { + + } + } + } } 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(); - i = 0; - while ( i < players.size ) - { - if ( isDefined( players[ i ].team ) && players[ i ].team == team ) - { - players[ i ] addgametypestat( challenge, 1 ); - } - i++; - } + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i].team ) && players[i].team == team ) + players[i] addgametypestat( challenge, 1 ); + } } endedearly( winner ) { - if ( level.hostforcedend ) - { - return 1; - } - if ( !isDefined( winner ) ) - { - return 1; - } - if ( level.teambased ) - { - if ( winner == "tie" ) - { - return 1; - } - } - return 0; + if ( level.hostforcedend ) + return true; + + if ( !isdefined( winner ) ) + return true; + + if ( level.teambased ) + { + if ( winner == "tie" ) + return true; + } + + return false; } getlosersteamscores( winner ) { - 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; + teamscores = 0; + + foreach ( team in level.teams ) + { + if ( team == winner ) + continue; + + teamscores += game["teamScores"][team]; + } + + return teamscores; } didloserfailchallenge( winner, challenge ) { - _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; + foreach ( team in level.teams ) + { + if ( team == winner ) + continue; + + if ( game["challenge"][team][challenge] ) + return false; + } + + return true; } 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; - 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; - } - } + 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; + } } 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; - 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 ); - } - } - } + 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; + } + } + } } 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; - 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.0; + + 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; - } - 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 ); + 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 ); } 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 ) ) - { - 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++; - } + 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] ]](); + } } 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 1; - } - return 0; + if ( weapon == "knife_held_mp" || weapon == "knife_mp" || weapon == "knife_ballistic_mp" ) + return true; + + return false; } 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: - } - } + 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; + } } monitor_player_sprint() { - self endon( "disconnect" ); - self endon( "death" ); - self.lastsprinttime = undefined; - while ( 1 ) - { - self waittill( "sprint_begin" ); - self waittill( "sprint_end" ); - self.lastsprinttime = getTime(); - } + self endon( "disconnect" ); + self endon( "death" ); + + for ( self.lastsprinttime = undefined; 1; self.lastsprinttime = gettime() ) + { + self waittill( "sprint_begin" ); + + self waittill( "sprint_end" ); + } } diff --git a/Zombie Core/patch_zm/maps/mp/_compass.gsc b/Zombie Core/patch_zm/maps/mp/_compass.gsc index 4b074d8..d2e8842 100644 --- a/Zombie Core/patch_zm/maps/mp/_compass.gsc +++ b/Zombie Core/patch_zm/maps/mp/_compass.gsc @@ -1,67 +1,76 @@ +// 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 8d142f8..4af95df 100644 --- a/Zombie Core/patch_zm/maps/mp/_createfx.gsc +++ b/Zombie Core/patch_zm/maps/mp/_createfx.gsc @@ -1,3273 +1,2937 @@ -#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; +// 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; 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" ); - 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(); + 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(); /# - println( "We're not in MP!" ); + println( "We're not in MP!" ); #/ - } - } - 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++; - } + } + } + + 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 ]](); + } } 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" ] = ( 1, 1, 1 ); - ent.v[ "origin" ] = ( 1, 1, 1 ); - 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"] = ( 0, 0, 0 ); + ent.v["origin"] = ( 0, 0, 0 ); + 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" ] = ( 1, 1, 1 ); - ent.v[ "origin" ] = ( 1, 1, 1 ); - 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"] = ( 0, 0, 0 ); + ent.v["origin"] = ( 0, 0, 0 ); + 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( #"274F266C" ); - playerpos[ 1 ] = getDvarInt( #"274F266D" ); - playerpos[ 2 ] = getDvarInt( #"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( _hash_274F266C ); + playerpos[1] = getdvarint( _hash_274F266D ); + playerpos[2] = getdvarint( _hash_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" ); - 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 ) - { + 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 ) + { /# - adddebugcommand( "noclip" ); + adddebugcommand( "noclip" ); #/ - level thread handle_camera(); - level.is_camera_on = 1; - break; - } - else - { - if ( level.is_camera_on == 1 ) - { + level thread handle_camera(); + level.is_camera_on = 1; + } + 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 ) - { - 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; - } - } - } + 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; + } } 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; - 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"; - } + 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"; /# - 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 ); #/ - } - 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"; - } + } + } + + 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() { - i = 0; - while ( i < level.createfx_hudelements ) - { - level.createfxhudelements[ i ][ 0 ].color = ( 1, 1, 1 ); - i++; - } + for ( i = 0; i < level.createfx_hudelements; i++ ) + level.createfxhudelements[i][0].color = ( 1, 1, 1 ); } 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" ); - 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; + 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; } index_is_selected( index ) { - return isDefined( level.selected_fx[ index ] ); + return isdefined( level.selected_fx[index] ); } ent_is_selected( ent ) { - i = 0; - while ( i < level.selected_fx_ents.size ) - { - if ( level.selected_fx_ents[ i ] == ent ) - { - return 1; - } - i++; - } - return 0; + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + if ( level.selected_fx_ents[i] == ent ) + return true; + } + + return false; } 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"; - } - 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 = []; + 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 = []; } 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" ); - 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(); - } + 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(); } stop_drawing_axis_models() { - 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 ); - } + 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 ); + } } clear_fx_hudelements() { - 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; + 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; } set_fx_hudelement( text ) { - 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++; - } + 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++; + } } buttondown( button, button2 ) { - if ( !buttonpressed_internal( button ) ) - { - return buttonpressed_internal( button2 ); - } + return buttonpressed_internal( button ) || 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 = ( 1, 1, 1 ); - 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 = ( 0, 0, 0 ); + 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 ) { - if ( level.createfx_inputlocked ) - { - return isDefined( level.button_is_kb[ name ] ); - } + return level.createfx_inputlocked && 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 ) ) - { - } - } + 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; } 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, "{" ); - 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; + 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; + } #/ - } } get_fx_options( ent ) { - 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; + 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; } entity_highlight_disable() { - 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; + 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; } entity_highlight_enable() { - 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; + self notify( "highlight change" ); + self endon( "highlight change" ); + + for (;;) + { + self.textalpha += 0.05; + + if ( self.textalpha > 1 ) + break; + + wait 0.05; + } + + self.textalpha = 1; } get_center_of_array( array ) { - 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 ); + 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 ); } 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 = []; - 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; + 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; } rotate_over_time( org, rotater ) { - 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++; - } + 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; + } + } } 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" ]; - 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(); + 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(); } 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"; - 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(); + 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(); } 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; - 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++; - } + 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; + } } 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 = []; - 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; + 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; } 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() { - p = 0; - while ( p < level.cfx_center_text_max ) - { - level.cfx_center_text[ p ] settext( " " ); - p++; - } - level.cfx_center_text_index = 0; + for ( p = 0; p < level.cfx_center_text_max; p++ ) + level.cfx_center_text[p] settext( " " ); + + level.cfx_center_text_index = 0; } write_error_msg( filename ) { - 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; - } - } - } + 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; + } + } } 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 = []; - 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; + 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; } 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"; - 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(); + 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(); } 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; - 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(); + 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(); } 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() { - i = 0; - while ( i < level.selected_fx_ents.size ) - { - ent = level.selected_fx_ents[ i ]; - ent restart_fx_looper(); - i++; - } + for ( i = 0; i < level.selected_fx_ents.size; i++ ) + { + ent = level.selected_fx_ents[i]; + ent restart_fx_looper(); + } } 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"; - } - 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(); + 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(); } 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"; - } - 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(); + 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(); } 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"; - } - 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++; - } + 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"]; + } } set_off_exploders() { - 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++; - } + 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] ); } turn_off_exploders() { - 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++; - } + 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] ); } draw_distance() { - 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; + 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; /# - if ( flag( "createfx_saving" ) ) - { - println( "Waiting for createfx to save..." ); + if ( flag( "createfx_saving" ) ) + println( "Waiting for createfx to save..." ); #/ - } - 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; - } + 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; + } } 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 ) - { - 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 ); - } + 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 ); + } } get_next_ent_with_same_id( index, ent_id ) { - 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 ]; + 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]; } get_previous_ent_with_same_id( index, ent_id ) { - 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 = index - 1; i > 0; 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--; + 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]; + } + } - } - level.ent_found_index = index; - return level.createfxent[ index ]; + level.ent_found_index = index; + return level.createfxent[index]; } get_ent_index( ent ) { - i = 0; - while ( i < level.createfxent.size ) - { - if ( ent == level.createfxent[ i ] ) - { - return i; - } - i++; - } - return -1; + for ( i = 0; i < level.createfxent.size; i++ ) + { + if ( ent == level.createfxent[i] ) + return 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(); - } - 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++; - } + 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] ); + } + } } print_ambient_fx_inventory() { /# - 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" ); + 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" ); #/ - } } vector_changed( old, new ) { - if ( distancesquared( old, new ) >= 1 ) - { - return 1; - } - return 0; + if ( distancesquared( old, new ) >= 1 ) + return true; + + return false; } dot_changed( old, new ) { - dot = vectordot( old, new ); - if ( dot < 1 ) - { - return 1; - } - return 0; + dot = vectordot( old, new ); + + if ( dot < 1 ) + return true; + + return false; } damage_void( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) { + } handle_camera() { /# - 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; + 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; + } #/ - } } 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"; - _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 ); - } + 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(); + } } 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 163c53f..2e27bec 100644 --- a/Zombie Core/patch_zm/maps/mp/_createfxmenu.gsc +++ b/Zombie Core/patch_zm/maps/mp/_createfxmenu.gsc @@ -1,1019 +1,941 @@ -#include maps/mp/_createfxundo; -#include maps/mp/_createfx; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; 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" ); - } - } - 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(); + 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(); + } #/ - } - } - } } 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(); - 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" ); + 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" ); #/ } finish_creating_entity( ent ) { /# - 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(); + 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(); #/ } change_effect_to_oneshot( ent ) { /# - 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"; + 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"; #/ } change_effect_to_loop( ent ) { /# - 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"; + 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"; #/ } 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" ) - { - 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++; + 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] ); + } #/ - } - } } menu_init() { /# - 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; + 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; #/ } 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(); - 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++; + 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; + } #/ - } - } - } } 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 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 >" ); + 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 >" ); #/ } 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" ]; - } - 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(); + 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(); #/ } set_option_index( name ) { /# - 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++; + for ( i = 0; i < level.createfx_options.size; i++ ) + { + if ( level.createfx_options[i]["name"] != name ) + continue; + + level.selected_fx_option_index = i; + return; + } #/ - } } 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 ) { /# - i = 0; - while ( i < level.createfx_options.size ) - { - if ( level.createfx_options[ i ][ "name" ] == name ) - { - return level.createfx_options[ i ]; - } - i++; + for ( i = 0; i < level.createfx_options.size; i++ ) + { + if ( level.createfx_options[i]["name"] == name ) + return level.createfx_options[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; - 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" ] ); + 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"] ); + } #/ - } } 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; - } - 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 >" ); + 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 >" ); #/ } add_option_to_selected_entities( option ) { /# - 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++; + 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"]; + } #/ - } } 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 ); - } - } - 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 + " (->)" ); + 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 + " (->)" ); + } #/ - } } 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(); - 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" ); + 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" ); #/ } get_level_ambient_fx() { /# - 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; + 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; #/ } 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 082e0ed..3ef987b 100644 --- a/Zombie Core/patch_zm/maps/mp/_createfxundo.gsc +++ b/Zombie Core/patch_zm/maps/mp/_createfxundo.gsc @@ -1,545 +1,508 @@ -#include maps/mp/_createfxmenu; -#include maps/mp/_createfx; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; 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 = []; - 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" ); + 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" ); } 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; - 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--; + last_id = ent_array[ent_array.size - 1].uniqueid; - if ( j < 0 ) - { - break; - } - else - { - source_ent = ent_array[ j ]; - } - i--; + if ( last_id > level.createfxent.size - 1 ) + last_id = level.createfxent.size - 1; - } - } - update_selected_entities(); + 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(); /# - 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; - 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--; + last_id = ent_array[ent_array.size - 1].uniqueid; - if ( j < 0 ) - { - break; - } - else - { - source_ent = ent_array[ j ]; - } - i--; + if ( last_id > level.createfxent.size - 1 ) + last_id = level.createfxent.size - 1; - } - } + 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 ); - 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--; + ent_array = reorder_ent_array_by_uniqueid( ent_array ); - i++; - } - j++; - } - while ( i < ent_array.size ) - { - temp_array[ temp_array.size ] = ent_array[ i ]; - i++; - } - level.createfxent = temp_array; + 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; + } /# - 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; - 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--; + last_id = ent_array[ent_array.size - 1].uniqueid; - if ( j < 0 ) - { - break; - } - else - { - source_ent = ent_array[ j ]; - } - i--; + if ( last_id > level.createfxent.size - 1 ) + last_id = level.createfxent.size - 1; - } - } - update_selected_entities(); + 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(); } 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; - 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; + 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; } 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; - } - i = 0; - while ( i < array_size ) - { - temp_array[ i ] = array[ i ]; - i++; - } - array = temp_array; - return 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_drop( 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; + if ( array.size > 0 ) + { + temp_array = []; + + for ( i = 1; i < array.size; i++ ) + temp_array[i - 1] = array[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" ); - } - 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++; + 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"] ); + } #/ - } } 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 72e387c..ce5101f 100644 --- a/Zombie Core/patch_zm/maps/mp/_demo.gsc +++ b/Zombie Core/patch_zm/maps/mp/_demo.gsc @@ -1,97 +1,94 @@ +// 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 568ef04..32ef5e4 100644 --- a/Zombie Core/patch_zm/maps/mp/_fx.gsc +++ b/Zombie Core/patch_zm/maps/mp/_fx.gsc @@ -1,458 +1,455 @@ -#include maps/mp/_createfx; -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\_createfx; print_org( fxcommand, fxid, fxpos, waittime ) { /# - 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( "}" ); + 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( "}" ); + } #/ - } } 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" ] = 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 ); + 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 ); } 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" ] = vectorToAngle( 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"] = vectortoangles( 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" ); - return; - } - 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" ); + 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 ( 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; - } - } + 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; + } } 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 ); - i = 0; - while ( i < shotnum ) - { - triggerfx( fxent ); - wait ( shotdelaybase + randomfloat( shotdelayrange ) ); - i++; - } - 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 ); + + for ( i = 0; i < shotnum; i++ ) + { + triggerfx( fxent ); + wait( shotdelaybase + randomfloat( shotdelayrange ) ); + } + + 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 ); - 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 ) ); - } + 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 ) ); + } } 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 2a40039..73937d3 100644 --- a/Zombie Core/patch_zm/maps/mp/_fxanim.gsc +++ b/Zombie Core/patch_zm/maps/mp/_fxanim.gsc @@ -1,6 +1,8 @@ +// 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 8692423..5b002ac 100644 --- a/Zombie Core/patch_zm/maps/mp/_global_fx.gsc +++ b/Zombie Core/patch_zm/maps/mp/_global_fx.gsc @@ -1,60 +1,53 @@ -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\_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; - } - i = 0; - while ( i < ents.size ) - { - ents[ i ] global_fx_create( fxname, fxfile, delay, soundalias ); - i++; - } + 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 ); } 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 490fd54..148d9d5 100644 --- a/Zombie Core/patch_zm/maps/mp/_interactive_objects.gsc +++ b/Zombie Core/patch_zm/maps/mp/_interactive_objects.gsc @@ -1,407 +1,387 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\utility; init() { - 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; - } + 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; } 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; - } - 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(); - } - } - } - } + 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(); + } } explodable_barrel_burn() { - 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(); + 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(); } explodable_barrel_explode() { - 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; + 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; } 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; - } - 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(); - } - } - } + 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(); + } } flammable_crate_burn() { - 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(); + 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(); } flammable_crate_explode() { - 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; + 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; } 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; - 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; + 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; } diff --git a/Zombie Core/patch_zm/maps/mp/_music.gsc b/Zombie Core/patch_zm/maps/mp/_music.gsc index 9faa900..8d9c2db 100644 --- a/Zombie Core/patch_zm/maps/mp/_music.gsc +++ b/Zombie Core/patch_zm/maps/mp/_music.gsc @@ -1,30 +1,28 @@ -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#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 f5dbda6..cb9a7ff 100644 --- a/Zombie Core/patch_zm/maps/mp/_script_gen.gsc +++ b/Zombie Core/patch_zm/maps/mp/_script_gen.gsc @@ -1,342 +1,291 @@ -#include maps/mp/_script_gen; -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\_script_gen; script_gen_dump_checksaved() { - 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++; - } + 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]; + } + } } 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 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- " ); - 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 ); + 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 ); #/ /# - 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 bbd52a4..57936ef 100644 --- a/Zombie Core/patch_zm/maps/mp/_serverfaceanim_mp.gsc +++ b/Zombie Core/patch_zm/maps/mp/_serverfaceanim_mp.gsc @@ -1,56 +1,61 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\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 ( 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 ] ); - } - } - } + 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] ); + } + } } diff --git a/Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc b/Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc index eb8885c..86ae4c3 100644 --- a/Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc +++ b/Zombie Core/patch_zm/maps/mp/_sticky_grenade.gsc @@ -1,12 +1,15 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\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 0157398..70e5702 100644 --- a/Zombie Core/patch_zm/maps/mp/_utility.gsc +++ b/Zombie Core/patch_zm/maps/mp/_utility.gsc @@ -1,3077 +1,2721 @@ -#include maps/mp/_utility; -#include maps/mp/_createfx; -#include maps/mp/gametypes/_hud_util; -#include common_scripts/utility; +// 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; 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 ) { - 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++; - } - } + 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 ]](); + } + } } 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 ); - } + if ( !isdefined( self.realorigin ) ) + self.realorigin = self.origin; + + if ( self.origin == self.realorigin ) + self.origin += vectorscale( ( 0, 0, -1 ), 10000.0 ); } 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( "debug" ) != "1" ) - { - assertmsg( "This is a forced error - attach the log file" ); + println( "^c*ERROR* ", msg ); + wait 0.05; + + if ( getdvar( _hash_F49A52C ) != "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 ) { - i = 0; - while ( i < src_s.a.size ) - { - dst_s.a[ dst_s.a.size ] = src_s.a[ i ]; - i++; - } + for ( i = 0; i < src_s.a.size; i++ ) + dst_s.a[dst_s.a.size] = src_s.a[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" ] ) ) - { - 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(); + 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(); } 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" ) - { - } - 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" ) + self.v["exploder"] = undefined; + + 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; - } - 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; + } + + self.v["exploder"] = undefined; + wait 6; + self.model delete(); } getplant() { - 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; + 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; } orienttonormal( normal ) { - 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; + 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; } array_levelthread( ents, process, var, excluders ) { - 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++; - } + 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] ); + } + } } deleteplacedentity( entity ) { - entities = getentarray( entity, "classname" ); - i = 0; - while ( i < entities.size ) - { - entities[ i ] delete(); - i++; - } + entities = getentarray( entity, "classname" ); + + for ( i = 0; i < entities.size; i++ ) + entities[i] delete(); } 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 ) ) - { - 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++; - } + 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 ); + } } get_player_height() { - return 70; + return 70.0; } isbulletimpactmod( smeansofdeath ) { - if ( !issubstr( smeansofdeath, "BULLET" ) ) - { - return smeansofdeath == "MOD_HEAD_SHOT"; - } + return issubstr( smeansofdeath, "BULLET" ) || smeansofdeath == "MOD_HEAD_SHOT"; } get_team_alive_players_s( teamname ) { - 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; + 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; } get_all_alive_players_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; + 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; } 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 ) ); #/ - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player iprintln( text ); - } - i++; - } + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player iprintln( text ); + } } printboldonteam( text, team ) { /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player iprintlnbold( text ); - } - i++; - } + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player iprintlnbold( text ); + } } printboldonteamarg( text, team, arg ) { /# - assert( isDefined( level.players ) ); + assert( isdefined( level.players ) ); #/ - 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++; - } + 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 ); + } } printonteamarg( text, team, arg ) { + } printonplayers( text, team ) { - 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++; - } + 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 ); + } } 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 ) - { - 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 ) - { + 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 ) + { /# - assert( level.splitscreen ); + assert( level.splitscreen ); #/ - level.players[ 0 ] playlocalsound( soundfriendly ); - } - } - else - { + level.players[0] playlocalsound( soundfriendly ); + } + } + else + { /# - assert( shoulddosounds ); + assert( shoulddosounds ); #/ - 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++; - } - } + 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 ); + } + } + } + } + } } _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, 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(); + 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(); } 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, 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; + 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 ); } 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; - } - deactivateclientexploder( level._exploder_ids[ 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] ); } 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 ) - { - 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; + 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; + } #/ - } - 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 ); - } - } + 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 ); + } } stop_exploder( num ) { - 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++; - } - } + 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(); + } + } } 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; - 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.0; + 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; - _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; + mask = 0; + + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + mask |= getteammask( team ); + } + + 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; - } - i = 1; - while ( i < plotpoints.size ) - { - line( lastpoint, plotpoints[ i ], ( r, g, b ), 1, timer ); - lastpoint = plotpoints[ i ]; - 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; + + for ( i = 1; i < plotpoints.size; i++ ) + { + line( lastpoint, plotpoints[i], ( r, g, b ), 1, timer ); + lastpoint = plotpoints[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 0; - } - return 1; + if ( !self.flag[message] ) + return false; + + return true; } 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 ); - return; - } - else - { - maps/mp/_utility::setclientsysstate( "levelNotify", event ); - } - } + if ( level.clientscripts ) + { + if ( isplayer( self ) ) + maps\mp\_utility::setclientsysstate( "levelNotify", event, self ); + 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; - } - 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; + 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; } alphabetize( 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; + 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; } 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.lastindex--; - + structarray_swaptolast( struct, object ); + struct.array[struct.lastindex - 1] = undefined; + 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 ) { - i = 0; - while ( i < shuffle ) - { - struct structarray_swap( struct.array[ i ], struct.array[ randomint( struct.lastindex ) ] ); - i++; - } + for ( i = 0; i < shuffle; i++ ) + struct structarray_swap( struct.array[i], struct.array[randomint( struct.lastindex )] ); } 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 ) { /# - if ( !isDefined( array1 ) ) - { - assert( isDefined( array2 ) ); - } + assert( isdefined( array1 ) || isdefined( array2 ) ); #/ - 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; + if ( !isdefined( array1 ) && isdefined( array2 ) ) + return array2; + + if ( !isdefined( array2 ) && isdefined( array1 ) ) + return array1; + + foreach ( elem in array2 ) + array1[array1.size] = elem; + + 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 ); - 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; + 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; } comparesizes( org, array, dist, comparefunc ) { - 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; + 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; } 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 = []; - 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; + 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; } 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; - } - 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; + 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; + } #/ - } } is_bot() { - if ( isplayer( self ) && isDefined( self.pers[ "isBot" ] ) ) - { - return self.pers[ "isBot" ] != 0; - } + return isplayer( self ) && isdefined( self.pers["isBot"] ) && 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 0; - } - if ( !isDefined( self._triggers[ trig getentitynumber() ] ) ) - { - return 0; - } - if ( !self._triggers[ trig getentitynumber() ] ) - { - return 0; - } - return 1; + if ( !isdefined( self._triggers ) ) + return false; + + if ( !isdefined( self._triggers[trig getentitynumber()] ) ) + return false; + + if ( !self._triggers[trig getentitynumber()] ) + return false; + + return true; } 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 1; - } - return 0; + if ( level.roundlimit == 1 ) + return true; + + return false; } isfirstround() { - if ( level.roundlimit > 1 && game[ "roundsplayed" ] == 0 ) - { - return 1; - } - return 0; + if ( level.roundlimit > 1 && game["roundsplayed"] == 0 ) + return true; + + return false; } islastround() { - if ( level.roundlimit > 1 && game[ "roundsplayed" ] >= ( level.roundlimit - 1 ) ) - { - return 1; - } - return 0; + if ( level.roundlimit > 1 && game["roundsplayed"] >= level.roundlimit - 1 ) + return true; + + return false; } waslastround() { - 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; + 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; } hitroundlimit() { - if ( level.roundlimit <= 0 ) - { - return 0; - } - return getroundsplayed() >= level.roundlimit; + if ( level.roundlimit <= 0 ) + return 0; + + return getroundsplayed() >= level.roundlimit; } anyteamhitroundwinlimit() { - _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; + foreach ( team in level.teams ) + { + if ( getroundswon( team ) >= level.roundwinlimit ) + return true; + } + + return false; } anyteamhitroundlimitwithdraws() { - 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; + tie_wins = game["roundswon"]["tie"]; + + foreach ( team in level.teams ) + { + if ( getroundswon( team ) + tie_wins >= level.roundwinlimit ) + return true; + } + + return false; } getroundwinlimitwinningteam() { - 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; + 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; } hitroundwinlimit() { - if ( !isDefined( level.roundwinlimit ) || level.roundwinlimit <= 0 ) - { - return 0; - } - if ( anyteamhitroundwinlimit() ) - { - return 1; - } - if ( anyteamhitroundlimitwithdraws() ) - { - if ( getroundwinlimitwinningteam() != "tie" ) - { - return 1; - } - } - return 0; + if ( !isdefined( level.roundwinlimit ) || level.roundwinlimit <= 0 ) + return false; + + if ( anyteamhitroundwinlimit() ) + return true; + + if ( anyteamhitroundlimitwithdraws() ) + { + if ( getroundwinlimitwinningteam() != "tie" ) + return true; + } + + return false; } anyteamhitscorelimit() { - _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; + foreach ( team in level.teams ) + { + if ( game["teamScores"][team] >= level.scorelimit ) + return true; + } + + return false; } hitscorelimit() { - 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; + 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; } getroundswon( team ) { - return game[ "roundswon" ][ team ]; + return game["roundswon"][team]; } getotherteamsroundswon( skip_team ) { - 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; + roundswon = 0; + + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + roundswon += game["roundswon"][team]; + } + + 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 1; - } - return 0; + if ( level.roundlimit != 1 && level.roundwinlimit != 1 ) + return true; + + return false; } waittillnotmoving() { - 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; - } - } + 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; + } + } } 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 ) - { - 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 ); + 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 ); } 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 ) ) - { - 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++; - } + 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; + } } 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(); - index = 0; - while ( index < players.size ) - { - if ( players[ index ] ishost() ) - { - return players[ index ]; - } - index++; - } + players = get_players(); + + for ( index = 0; index < players.size; index++ ) + { + if ( players[index] ishost() ) + return players[index]; + } } gethostplayerforbots() { - players = get_players(); - index = 0; - while ( index < players.size ) - { - if ( players[ index ] ishostforbots() ) - { - return players[ index ]; - } - index++; - } + players = get_players(); + + for ( index = 0; index < players.size; index++ ) + { + if ( players[index] ishostforbots() ) + return players[index]; + } } ispregame() { - if ( isDefined( level.pregame ) ) - { - return level.pregame; - } + return isdefined( level.pregame ) && level.pregame; } iskillstreaksenabled() { - if ( isDefined( level.killstreaksenabled ) ) - { - return level.killstreaksenabled; - } + return isdefined( level.killstreaksenabled ) && level.killstreaksenabled; } isrankenabled() { - if ( isDefined( level.rankenabled ) ) - { - return level.rankenabled; - } + return isdefined( level.rankenabled ) && 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; - 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.0; + 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; - } - i = 0; - while ( i < level.players.size ) - { - if ( level.players[ i ] getentitynumber() == clientnum ) - { - return level.players[ i ]; - } - i++; - } - return undefined; + 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; } 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 0; - } - if ( level.teambased ) - { - if ( player.team == self.team ) - { - return 0; - } - } - else - { - if ( player == self ) - { - return 0; - } - } - return 1; + if ( !isplayer( player ) ) + return false; + + if ( level.teambased ) + { + if ( player.team == self.team ) + return false; + } + else if ( player == self ) + return false; + + return true; } 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( #"19B966D7" ); - if ( isDefined( buildtype ) && buildtype == "press" ) - { - return 1; - } - return 0; + buildtype = getdvar( _hash_19B966D7 ); + + if ( isdefined( buildtype ) && buildtype == "press" ) + return true; + + return false; } isflashbanged() { - if ( isDefined( self.flashendtime ) ) - { - return getTime() < self.flashendtime; - } + return isdefined( self.flashendtime ) && gettime() < self.flashendtime; } ishacked() { - if ( isDefined( self.hacked ) ) - { - return self.hacked; - } + return isdefined( self.hacked ) && 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 8eddfac..d19a7a1 100644 --- a/Zombie Core/patch_zm/maps/mp/_visionset_mgr.gsc +++ b/Zombie Core/patch_zm/maps/mp/_visionset_mgr.gsc @@ -1,474 +1,451 @@ -//checked includes matches beta dump -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\_utility; -init() //checked matches beta dump +init() { - if ( level.createfx_enabled ) - { - return; - } - level.vsmgr_initializing = 1; - level.vsmgr_default_info_name = "none"; - level.vsmgr = []; - level thread register_type( "visionset" ); - level thread register_type( "overlay" ); - onfinalizeinitialization_callback( ::finalize_clientfields ); - level thread monitor(); - level thread onplayerconnect(); + if ( level.createfx_enabled ) + return; + + level.vsmgr_initializing = 1; + level.vsmgr_default_info_name = "none"; + level.vsmgr = []; + level thread register_type( "visionset" ); + level thread register_type( "overlay" ); + onfinalizeinitialization_callback( ::finalize_clientfields ); + level thread monitor(); + level thread onplayerconnect(); } -vsmgr_register_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) //checked matches beta dump +vsmgr_register_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) { - 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 ) //checked changed to match beta dump +vsmgr_activate( type, name, player, opt_param_1, opt_param_2 ) { - if ( level.vsmgr[ type ].info[ name ].state.activate_per_player ) - { - activate_per_player( type, name, player, opt_param_1, opt_param_2 ); - return; - } - state = level.vsmgr[ type ].info[ name ].state; - if ( state.ref_count_lerp_thread ) - { - state.ref_count++; - if ( state.ref_count > 1 ) - { - return; - } - } - if ( isDefined( state.lerp_thread ) ) - { - state thread lerp_thread_wrapper( state.lerp_thread, opt_param_1, opt_param_2 ); - } - else - { - players = getplayers(); - for( player_index = 0; player_index < players.size; player_index++ ) - { - state vsmgr_set_state_active( players[ player_index ], 1 ); - } - } + 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 ); + } } -vsmgr_deactivate( type, name, player ) //checked changed to match beta dump +vsmgr_deactivate( type, name, player ) { - if ( level.vsmgr[ type ].info[ name ].state.activate_per_player ) - { - deactivate_per_player( type, name, player ); - return; - } - state = level.vsmgr[ type ].info[ name ].state; - if ( state.ref_count_lerp_thread ) - { - state.ref_count--; + if ( level.vsmgr[type].info[name].state.activate_per_player ) + { + deactivate_per_player( type, name, player ); + return; + } - 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 ] ); - } + 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] ); } -vsmgr_set_state_active( player, lerp ) //checked matches cerberus output +vsmgr_set_state_active( player, lerp ) { - player_entnum = player getentitynumber(); - if ( !isDefined( self.players[ player_entnum ] ) ) - { - return; - } - self.players[ player_entnum ].active = 1; - self.players[ player_entnum ].lerp = lerp; + player_entnum = player getentitynumber(); + + if ( !isdefined( self.players[player_entnum] ) ) + return; + + self.players[player_entnum].active = 1; + self.players[player_entnum].lerp = lerp; } -vsmgr_set_state_inactive( player ) //checked matches cerberus output +vsmgr_set_state_inactive( player ) { - player_entnum = player getentitynumber(); - if ( !isDefined( self.players[ player_entnum ] ) ) - { - return; - } - self.players[ player_entnum ].active = 0; - self.players[ player_entnum ].lerp = 0; + player_entnum = player getentitynumber(); + + if ( !isdefined( self.players[player_entnum] ) ) + return; + + self.players[player_entnum].active = 0; + self.players[player_entnum].lerp = 0; } -vsmgr_timeout_lerp_thread( timeout, opt_param_2 ) //checked changed to match beta dump +vsmgr_timeout_lerp_thread( timeout, opt_param_2 ) { - players = getplayers(); - for( player_index = 0; player_index < players.size; player_index++ ) - { - self vsmgr_set_state_active( players[ player_index ], 1 ); - } - wait timeout; - vsmgr_deactivate( self.type, self.name ); + players = getplayers(); + + for ( player_index = 0; player_index < players.size; player_index++ ) + self vsmgr_set_state_active( players[player_index], 1 ); + + wait( timeout ); + vsmgr_deactivate( self.type, self.name ); } -vsmgr_timeout_lerp_thread_per_player( player, timeout, opt_param_2 ) //checked matches beta dump +vsmgr_timeout_lerp_thread_per_player( player, timeout, opt_param_2 ) { - self vsmgr_set_state_active( player, 1 ); - wait timeout; - deactivate_per_player( self.type, self.name, player ); + self vsmgr_set_state_active( player, 1 ); + wait( timeout ); + deactivate_per_player( self.type, self.name, player ); } -vsmgr_duration_lerp_thread( duration, max_duration ) //checked changed to match beta dump +vsmgr_duration_lerp_thread( duration, max_duration ) { - start_time = getTime(); - end_time = start_time + int( duration * 1000 ); - if ( isDefined( max_duration ) ) - { - start_time = end_time - int( max_duration * 1000 ); - } - while ( 1 ) - { - lerp = calc_remaining_duration_lerp( start_time, end_time ); - if ( lerp <= 0 ) - { - break; - } - players = getplayers(); - for( player_index = 0; player_index < players.size; player_index++ ) - { - self vsmgr_set_state_active( players[ player_index ], lerp ); - } - wait 0.05; - } - vsmgr_deactivate( self.type, self.name ); + 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 ); } -vsmgr_duration_lerp_thread_per_player( player, duration, max_duration ) //checked changed to match beta dump +vsmgr_duration_lerp_thread_per_player( player, duration, max_duration ) { - start_time = getTime(); - end_time = start_time + int( duration * 1000 ); - if ( isDefined( max_duration ) ) - { - start_time = end_time - int( max_duration * 1000 ); - } - while ( 1 ) - { - lerp = calc_remaining_duration_lerp( start_time, end_time ); - if ( lerp <= 0 ) - { - break; - } - self vsmgr_set_state_active( player, lerp ); - wait 0.05; - } - deactivate_per_player( self.type, self.name, player ); + 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 ); } -register_type( type ) //checked matches beta dump +register_type( type ) { - level.vsmgr[ type ] = spawnstruct(); - level.vsmgr[ type ].type = type; - level.vsmgr[ type ].in_use = 0; - level.vsmgr[ type ].highest_version = 0; - level.vsmgr[ type ].cf_slot_name = type + "_slot"; - level.vsmgr[ type ].cf_lerp_name = type + "_lerp"; - level.vsmgr[ type ].info = []; - level.vsmgr[ type ].sorted_name_keys = []; - level.vsmgr[ type ].sorted_prio_keys = []; - vsmgr_register_info( type, level.vsmgr_default_info_name, 1, 0, 1, 0, undefined ); + level.vsmgr[type] = spawnstruct(); + level.vsmgr[type].type = type; + level.vsmgr[type].in_use = 0; + level.vsmgr[type].highest_version = 0; + level.vsmgr[type].cf_slot_name = type + "_slot"; + level.vsmgr[type].cf_lerp_name = type + "_lerp"; + level.vsmgr[type].info = []; + level.vsmgr[type].sorted_name_keys = []; + level.vsmgr[type].sorted_prio_keys = []; + vsmgr_register_info( type, level.vsmgr_default_info_name, 1, 0, 1, 0, undefined ); } -finalize_clientfields() //checked changed to match beta dump +finalize_clientfields() { - typekeys = getarraykeys( level.vsmgr ); - for ( type_index = 0; type_index < typeKeys.size; type_index++ ) - { - level.vsmgr[ typekeys[ type_index ] ] thread finalize_type_clientfields(); - } - level.vsmgr_initializing = 0; + typekeys = getarraykeys( level.vsmgr ); + + for ( type_index = 0; type_index < typekeys.size; type_index++ ) + level.vsmgr[typekeys[type_index]] thread finalize_type_clientfields(); + + level.vsmgr_initializing = 0; } -finalize_type_clientfields() //checked changed to match beta dump +finalize_type_clientfields() { - if ( self.info.size <= 1 ) - { - return; - } - self.in_use = 1; - self.cf_slot_bit_count = getminbitcountfornum( self.info.size - 1 ); - self.cf_lerp_bit_count = self.info[ self.sorted_name_keys[ 0 ] ].lerp_bit_count; - for ( i = 0; i < self.sorted_name_keys.size; i++ ) - { - self.info[ self.sorted_name_keys[ i ] ].slot_index = i; - if ( self.info[ self.sorted_name_keys[ i ] ].lerp_bit_count > self.cf_lerp_bit_count ) - { - self.cf_lerp_bit_count = self.info[ self.sorted_name_keys[ i ] ].lerp_bit_count; - } - } - registerclientfield( "toplayer", self.cf_slot_name, self.highest_version, self.cf_slot_bit_count, "int" ); - if ( self.cf_lerp_bit_count > 1 ) - { - registerclientfield( "toplayer", self.cf_lerp_name, self.highest_version, self.cf_lerp_bit_count, "float" ); - } + 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" ); } -validate_info( type, name, priority ) //checked changed to match beta dump +validate_info( type, name, priority ) { - 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 ) //checked changed to match beta dump +add_sorted_name_key( type, name ) { - for ( i = 0; i < level.vsmgr[type].sorted_name_keys.size; i++ ) - { - if ( name < level.vsmgr[ type ].sorted_name_keys[ i ] ) - { - break; - } - } - arrayinsert( level.vsmgr[ type ].sorted_name_keys, name, i ); + for ( i = 0; i < level.vsmgr[type].sorted_name_keys.size; i++ ) + { + if ( name < level.vsmgr[type].sorted_name_keys[i] ) + break; + } + + arrayinsert( level.vsmgr[type].sorted_name_keys, name, i ); } -add_sorted_priority_key( type, name, priority ) //checked changed to match beta dump +add_sorted_priority_key( type, name, priority ) { - for ( i = 0; i < level.vsmgr[type].sorted_prio_keys.size; i++ ) - { - if ( priority > level.vsmgr[ type ].info[ level.vsmgr[ type ].sorted_prio_keys[ i ] ].priority ) - { - break; - } - } - arrayinsert( level.vsmgr[ type ].sorted_prio_keys, name, i ); + for ( i = 0; i < level.vsmgr[type].sorted_prio_keys.size; i++ ) + { + if ( priority > level.vsmgr[type].info[level.vsmgr[type].sorted_prio_keys[i]].priority ) + break; + } + + arrayinsert( level.vsmgr[type].sorted_prio_keys, name, i ); } -add_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) //checked matches beta dump +add_info( type, name, version, priority, lerp_step_count, activate_per_player, lerp_thread, ref_count_lerp_thread ) { - self.type = type; - self.name = name; - self.version = version; - self.priority = priority; - self.lerp_step_count = lerp_step_count; - self.lerp_bit_count = getminbitcountfornum( lerp_step_count ); - if ( !isDefined( ref_count_lerp_thread ) ) - { - ref_count_lerp_thread = 0; - } - self.state = spawnstruct(); - self.state.type = type; - self.state.name = name; - self.state.activate_per_player = activate_per_player; - self.state.lerp_thread = lerp_thread; - self.state.ref_count_lerp_thread = ref_count_lerp_thread; - self.state.players = []; - if ( ref_count_lerp_thread && !activate_per_player ) - { - self.state.ref_count = 0; - } + self.type = type; + self.name = name; + self.version = version; + self.priority = priority; + self.lerp_step_count = lerp_step_count; + self.lerp_bit_count = getminbitcountfornum( lerp_step_count ); + + if ( !isdefined( ref_count_lerp_thread ) ) + ref_count_lerp_thread = 0; + + self.state = spawnstruct(); + self.state.type = type; + self.state.name = name; + self.state.activate_per_player = activate_per_player; + self.state.lerp_thread = lerp_thread; + self.state.ref_count_lerp_thread = ref_count_lerp_thread; + self.state.players = []; + + if ( ref_count_lerp_thread && !activate_per_player ) + self.state.ref_count = 0; } -onplayerconnect() //checked matches beta dump +onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - player thread on_player_connect(); - } + for (;;) + { + level waittill( "connected", player ); + + player thread on_player_connect(); + } } -on_player_connect() //checked partially changed to match beta dump +on_player_connect() { - self._player_entnum = self getentitynumber(); - typekeys = getarraykeys( level.vsmgr ); - for ( type_index = 0; type_index < typeKeys.size; type_index++ ) - { - type = typekeys[ type_index ]; - if ( !level.vsmgr[ type ].in_use ) - { - type_index++; - } - else - { - for ( name_index = 0; name_index < level.vsmgr[type].sorted_name_keys.size; name_index++ ) - { - name_key = level.vsmgr[ type ].sorted_name_keys[ name_index ]; - level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ] = spawnstruct(); - level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].active = 0; - level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].lerp = 0; - if ( level.vsmgr[ type ].info[ name_key ].state.ref_count_lerp_thread && level.vsmgr[ type ].info[ name_key ].state.activate_per_player ) - { - level.vsmgr[ type ].info[ name_key ].state.players[ self._player_entnum ].ref_count = 0; - } - } - level.vsmgr[ type ].info[ level.vsmgr_default_info_name ].state vsmgr_set_state_active( self, 1 ); - } - } + 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 ); + } } -monitor() //checked partially changed to match beta dump +monitor() { - while ( level.vsmgr_initializing ) - { - wait 0.05; - } - typekeys = getarraykeys( level.vsmgr ); - while ( 1 ) - { - wait 0.05; - waittillframeend; - players = get_players(); - for ( type_index = 0; type_index < typeKeys.size; type_index++ ) - { - type = typekeys[ type_index ]; - if ( !level.vsmgr[ type ].in_use ) - { - type_index++; - } - else - { - for ( player_index = 0; player_index < players.size; player_index++ ) - { - /* + 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++ ) + { /# - if ( is_true( players[ player_index ].pers[ "isBot" ] ) ) - { - player_index++; - continue; + if ( is_true( players[player_index].pers["isBot"] ) ) + continue; #/ - } - */ - update_clientfields( players[ player_index ], level.vsmgr[ type ] ); - } - } - } - } + update_clientfields( players[player_index], level.vsmgr[type] ); + } + } + } } -get_first_active_name( type_struct ) //checked partially changed to match beta dump +get_first_active_name( type_struct ) { - size = type_struct.sorted_prio_keys.size; - for ( prio_index = 0; prio_index < size; prio_index++ ) - { - prio_key = type_struct.sorted_prio_keys[ prio_index ]; - if ( type_struct.info[ prio_key ].state.players[ self._player_entnum ].active ) - { - return prio_key; - } - } - return level.vsmgr_default_info_name; + size = type_struct.sorted_prio_keys.size; + + for ( prio_index = 0; prio_index < size; prio_index++ ) + { + prio_key = type_struct.sorted_prio_keys[prio_index]; + + if ( type_struct.info[prio_key].state.players[self._player_entnum].active ) + return prio_key; + } + + return level.vsmgr_default_info_name; } -update_clientfields( player, type_struct ) //checked changed to match beta dump +update_clientfields( player, type_struct ) { - name = player get_first_active_name( type_struct ); - player setclientfieldtoplayer( type_struct.cf_slot_name, type_struct.info[ name ].slot_index ); - if ( type_struct.cf_lerp_bit_count > 1 ) - { - player setclientfieldtoplayer( type_struct.cf_lerp_name, type_struct.info[ name ].state.players[ player._player_entnum ].lerp ); - } + 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 ); } -lerp_thread_wrapper( func, opt_param_1, opt_param_2 ) //checked matches beta dump +lerp_thread_wrapper( func, opt_param_1, opt_param_2 ) { - 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 ) //checked matches beta dump +lerp_thread_per_player_wrapper( func, player, opt_param_1, opt_param_2 ) { - player_entnum = player getentitynumber(); - self notify( "deactivate" ); - self endon( "deactivate" ); - self.players[ player_entnum ] notify( "deactivate" ); - self.players[ player_entnum ] endon( "deactivate" ); - player endon( "disconnect" ); - self [[ func ]]( player, opt_param_1, opt_param_2 ); + player_entnum = player getentitynumber(); + self notify( "deactivate" ); + self endon( "deactivate" ); + self.players[player_entnum] notify( "deactivate" ); + self.players[player_entnum] endon( "deactivate" ); + player endon( "disconnect" ); + self [[ func ]]( player, opt_param_1, opt_param_2 ); } -activate_per_player( type, name, player, opt_param_1, opt_param_2 ) //checked changed to match beta dump +activate_per_player( type, name, player, opt_param_1, opt_param_2 ) { - player_entnum = player getentitynumber(); - state = level.vsmgr[ type ].info[ name ].state; - if ( state.ref_count_lerp_thread ) - { - state.players[ player_entnum ].ref_count++; - if ( state.players[ player_entnum ].ref_count > 1 ) - { - return; - } - } - if ( isDefined( state.lerp_thread ) ) - { - state thread lerp_thread_per_player_wrapper( state.lerp_thread, player, opt_param_1, opt_param_2 ); - } - else - { - state vsmgr_set_state_active( player, 1 ); - } + 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 ); } -deactivate_per_player( type, name, player ) //checked changed to match beta dump +deactivate_per_player( type, name, player ) { - player_entnum = player getentitynumber(); - state = level.vsmgr[ type ].info[ name ].state; - if ( state.ref_count_lerp_thread ) - { - state.players[ player_entnum ].ref_count--; + player_entnum = player getentitynumber(); + state = level.vsmgr[type].info[name].state; - if ( state.players[ player_entnum ].ref_count > 0 ) - { - return; - } - } - state vsmgr_set_state_inactive( player ); - state notify( "deactivate" ); + 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" ); } -calc_remaining_duration_lerp( start_time, end_time ) //checked matches beta dump +calc_remaining_duration_lerp( start_time, end_time ) { - now = getTime(); - frac = float( end_time - now ) / float( end_time - start_time ); - return clamp( frac, 0, 1 ); + 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 54d4f91..655371a 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_combat.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_combat.gsc @@ -1,106 +1,105 @@ -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; -#include common_scripts/utility; +// 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; 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 ) ); - } - 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.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 ); } 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 1; - } - } - } - return 0; + 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; } 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 8f65047..408d5ac 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_death.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_death.gsc @@ -1,30 +1,34 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; 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 e86fde0..ed89182 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_flashed.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_flashed.gsc @@ -1,29 +1,28 @@ -#include maps/mp/animscripts/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#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 c8439f7..26af7b0 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_init.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_init.gsc @@ -1,62 +1,64 @@ -#include maps/mp/animscripts/dog_combat; -#include maps/mp/animscripts/dog_move; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; +// 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; 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 ( 1 ) - { - self.meleeattackdist = 0; - if ( self maps/mp/animscripts/dog_combat::use_low_attack() ) - { - self.meleeattackdist = 64; - } - wait 1; - } + self endon( "death" ); + + while ( true ) + { + 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 acfb82a..80dd040 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_jump.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_jump.gsc @@ -1,13 +1,15 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; 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 af8604d..cddef29 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_move.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_move.gsc @@ -1,185 +1,173 @@ -#include maps/mp/animscripts/dog_stop; -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// 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; 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 ( 1 ) - { - 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 ( true ) + { + 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 ( 1 ) - { - do_movement = 1; + self endon( "killanimscript" ); + self endon( "stop_soon" ); + + while ( true ) + { + do_movement = 1; /# - if ( !debug_allow_movement() ) - { - do_movement = 0; + if ( !debug_allow_movement() ) + do_movement = 0; #/ - } - 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 " ); - } - } + 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 " ); + } + } } 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( #"DFB12081" ) != 0 ) - { - return 1; - } - else - { - if ( getDvarInt( #"D5D7999B" ) != 0 ) - { - return 0; + if ( getdvarint( _hash_DFB12081 ) != 0 ) + return true; + else if ( getdvarint( _hash_D5D7999B ) != 0 ) + return false; #/ - } - } - 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; + 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; } 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 d218129..2b6fc2f 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_pain.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_pain.gsc @@ -1,26 +1,28 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; 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 0b6e630..43d1909 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_stop.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_stop.gsc @@ -1,132 +1,129 @@ -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\shared; +#include maps\mp\animscripts\utility; main() { - 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." ); - } + 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." ); + } } 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() { - if ( isDefined( self.enemy ) && isalive( self.enemy ) ) - { - return distancesquared( self.origin, self.enemy.origin ) < 1000000; - } + return isdefined( self.enemy ) && isalive( self.enemy ) && 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 4d759cc..2c9f1a3 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/dog_turn.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/dog_turn.gsc @@ -1,117 +1,123 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; 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 1; - } - debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " NO" ); - return 0; + 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; } 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 ee523c7..a5c4b3a 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/shared.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/shared.gsc @@ -1,306 +1,287 @@ -#include maps/mp/_utility; -#include maps/mp/animscripts/utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\animscripts\utility; +#include maps\mp\_utility; handledogsoundnotetracks( note ) { - if ( note == "sound_dogstep_run_default" ) - { - return 1; - } - prefix = getsubstr( note, 0, 5 ); - if ( prefix != "sound" ) - { - return 0; - } - return 1; + if ( note == "sound_dogstep_run_default" ) + return true; + + prefix = getsubstr( note, 0, 5 ); + + if ( prefix != "sound" ) + return false; + + return true; } growling() { - return isDefined( self.script_growl ); + return isdefined( self.script_growl ); } handlenotetrack( note, flagname, customfunction, var1 ) { /# - if ( getDvarInt( #"6EBEB982" ) ) - { - println( "dog notetrack: " + flagname + " " + note + " " + getTime() ); + if ( getdvarint( _hash_6EBEB982 ) ) + println( "dog notetrack: " + flagname + " " + note + " " + gettime() ); #/ - } - 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 ); - } - } - } - } + 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; + } } 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 = 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 ) - { + 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 ) + { /# - 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 * 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.0 * 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 cbd7fe5..279b040 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/traverse/shared.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/traverse/shared.gsc @@ -1,227 +1,207 @@ -#include maps/mp/animscripts/shared; -#include common_scripts/utility; -#include maps/mp/_utility; -#include maps/mp/animscripts/utility; +// 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; 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 ); - i = 0; - while ( i < reps ) - { - self teleport( self.origin + offset ); - wait 0,05; - i++; - } + 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; + } } 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 ) - { - 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++; - } + 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; + } } 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 ) - { - 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; + 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; } 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 ) - { - 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; + 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; } 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 ) - { - 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; + 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; } 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 ) - { - 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; + 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; } 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 ) - { - 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; + 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; } 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 2e00566..3a37df9 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,44 +1,49 @@ -#include maps/mp/animscripts/traverse/zm_shared; -#include maps/mp/animscripts/traverse/shared; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\traverse\shared; +#include maps\mp\animscripts\traverse\zm_shared; main() { - 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." ); + 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." ); #/ - } - } - 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 b1f767c..e1385ca 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,151 +1,146 @@ -#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; +// 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; 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 ); - i = 0; - while ( i < reps ) - { - self teleport( self.origin + offset ); - wait 0,05; - i++; - } + 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; + } } 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 ) - { - 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++; - } + 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; + } } 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 6b325aa..66154d0 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/utility.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/utility.gsc @@ -1,166 +1,138 @@ +// 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, 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 ); + 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 ); + } #/ - } } 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 ] = ( 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; + 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; #/ - } } 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 3b06ef3..b1c5934 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_combat.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_combat.gsc @@ -1,71 +1,64 @@ -#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; +// 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; 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 ) ); - return; - } - 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 ) ); + } + else + wait 0.05; } trymelee() { - 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; + 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; } 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 2c5fcc0..60a66b7 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_death.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_death.gsc @@ -1,439 +1,408 @@ -#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; +// 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; 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" ); - return "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", "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 ) { - i = 0; - while ( i < array.size ) - { - j = randomint( array.size ); - temp = array[ i ]; - array[ i ] = array[ j ]; - array[ j ] = temp; - i++; - } - return array; + for ( i = 0; i < array.size; i++ ) + { + j = randomint( array.size ); + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + 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 ( self.damagetaken < 165 ) - { - return; - } - if ( getTime() > ( anim.lastgibtime + anim.gibdelay ) && anim.totalgibs > 0 ) - { - anim.totalgibs--; + if ( isdefined( self.a.gib_ref ) ) + return; - 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; - } + 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; } 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(); - 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" ] ); + 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"] ); + } } 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 ( 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; - } + 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; } 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 ); - return; - } - 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 ); + 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 c5fed44..a78583b 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,510 +1,495 @@ -#include maps/mp/animscripts/dog_stop; -#include maps/mp/animscripts/utility; -#include common_scripts/utility; +// 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; 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; /# - if ( isDefined( self.enemy ) ) - { - assert( isalive( self.enemy ) ); - } + assert( isdefined( self.enemy ) && isalive( self.enemy ) ); #/ - if ( isDefined( self.enemy.dogattackallowtime ) ) - { - return getTime() < self.enemy.dogattackallowtime; - } + return isdefined( self.enemy.dogattackallowtime ) && 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; - } - 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; + 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; /# - if ( getDvarInt( "debug_dog_sound" ) ) - { - iprintln( "dog " + self getentnum() + " attack player " + getTime() ); + if ( getdvarint( _hash_7B06BF0D ) ) + 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; - } - } - } - else - { - } - } - 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; + } + + 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 } - 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; - } + 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; + } } 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; - 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; + 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; } 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 ); - i = 0; - while ( i < reps ) - { - self teleport( self.origin + increment ); - wait 0,05; - i++; - } + 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; + } } player_attacked() { - if ( isalive( self ) ) - { - return self meleebuttonpressed(); - } + return isalive( self ) && 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; - } - if ( level.dogmeleeplayercounter < level.dog_hits_before_kill ) - { - return player.health > 25; - } + return 1; + } + + if ( gettime() - level.lastdogmeleeplayertime > 8000 ) + level.dogmeleeplayercounter = 0; + + return level.dogmeleeplayercounter < level.dog_hits_before_kill && 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" ); - 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; - } + 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; + } } 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 6fec47d..eddce21 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,30 +1,34 @@ -#include maps/mp/animscripts/zm_shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\zm_shared; 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 af53db4..0b904a3 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,6 +1,8 @@ +// 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 5d1b1ba..28ba909 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,61 +1,59 @@ -#include maps/mp/animscripts/dog_move; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; +// 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; 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 ( 1 ) - { - if ( isDefined( self.enemy ) ) - { - if ( isplayer( self.enemy ) ) - { - self.meleeattackdist = 64; - break; - } - else - { - self.meleeattackdist = 102; - } - } - wait 1; - } + self endon( "death" ); + + while ( true ) + { + if ( isdefined( self.enemy ) ) + { + if ( isplayer( self.enemy ) ) + self.meleeattackdist = 64; + 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 11ddcb8..e990e6a 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,14 +1,16 @@ -#include maps/mp/animscripts/zm_shared; -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// 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; 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 53dbe04..5d4abd6 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,259 +1,249 @@ -#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; +// 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; 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 ( 1 ) - { - 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 ( true ) + { + 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 ( 1 ) - { - do_movement = 1; + self endon( "killanimscript" ); + self endon( "stop_soon" ); + + while ( true ) + { + do_movement = 1; /# - if ( !debug_allow_movement() ) - { - do_movement = 0; + if ( !debug_allow_movement() ) + do_movement = 0; #/ - } - 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 - { + 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 + { /# - 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" ); - i = 0; - while ( i < 2 ) - { - lookaheadangle = vectorToAngle( self.lookaheaddir ); - self set_orient_mode( "face angle", lookaheadangle ); - i++; - } + self endon( "killanimscript" ); + + for ( i = 0; i < 2; i++ ) + { + lookaheadangle = vectortoangles( self.lookaheaddir ); + self set_orient_mode( "face angle", lookaheadangle ); + } } 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 ); - 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 ]; + 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]; } need_to_run() { - 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; + 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; } 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 b28cb45..3c3b7e8 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,8 +1,10 @@ -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#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 5c5dd06..01eb7f5 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,148 +1,145 @@ -#include maps/mp/animscripts/zm_shared; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; +// 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; main() { - 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." ); - } + 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." ); + } } 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() { - if ( isDefined( self.enemy ) && isalive( self.enemy ) ) - { - return distancesquared( self.origin, self.enemy.origin ) < 1000000; - } + return isdefined( self.enemy ) && isalive( self.enemy ) && 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 0cbc0cb..f45b5d1 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,136 +1,138 @@ -#include maps/mp/animscripts/zm_shared; -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// 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; 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 1; - } - debug_turn_print( "need_to_turn_around: " + deltayaw + " NO" ); - return 0; + 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; } 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(); - return; - } - 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(); + } + 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 bdf6899..719610b 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_flashed.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_flashed.gsc @@ -1,6 +1,9 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; 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 fb399ef..eab3e4e 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_init.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_init.gsc @@ -1,158 +1,165 @@ -#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; +// 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; 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 = ::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 = 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; } 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 bdf6899..719610b 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_jump.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_jump.gsc @@ -1,6 +1,9 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; 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 c8cfd3c..1bec96e 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_melee.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_melee.gsc @@ -1,304 +1,273 @@ -#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; +// 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; 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 = 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 ]](); - } - } - } + 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 ]](); + } /# - 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 ); + 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 ); + } + } #/ - } - } - 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(); + } + 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(); } 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 0; - } - if ( !isalive( self.enemy ) ) - { - return 0; - } - if ( isDefined( self.disablemelee ) ) - { + if ( !issentient( self.enemy ) ) + return false; + + if ( !isalive( self.enemy ) ) + return false; + + if ( isdefined( self.disablemelee ) ) + { /# - assert( self.disablemelee ); + assert( self.disablemelee ); #/ - 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; + 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; } ismeleepathclear( vectoenemy, enemypoint ) { - 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; + 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; } 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"; - 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 ); + 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 ); } 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 566ac5e..a4cca2f 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_move.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_move.gsc @@ -1,286 +1,256 @@ -#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; +// 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; 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 0; - } - if ( isDefined( self.zombie_can_sidestep ) && !self.zombie_can_sidestep ) - { - return 0; - } - while ( 1 ) - { - self trysidestep(); - wait 0,05; - } + 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; + } } 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 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; + 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; } 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 0; - } - return 1; + if ( !self maymovefrompointtopoint( self.origin, getanimendpos( stepanim ) ) ) + return false; + + return true; } 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 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; + 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; } 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 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; + 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; } dosidestep() { - self endon( "death" ); - self endon( "killanimscript" ); - self playsidestepanim( self.stepanim, self.sidesteptype ); - if ( self.desiredstepdir == "left" ) - { - self.a.steppeddir--; + self endon( "death" ); + self endon( "killanimscript" ); + self playsidestepanim( self.stepanim, self.sidesteptype ); - } - else - { - self.a.steppeddir++; - } - self.a.lastsidesteptime = getTime(); - self notify( "sidestep_done" ); + if ( self.desiredstepdir == "left" ) + self.a.steppeddir--; + 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 = vectorToAngle( 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 = vectortoangles( 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 1de8330..9d2fdb1 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_pain.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_pain.gsc @@ -1,18 +1,21 @@ -#include maps/mp/animscripts/zm_utility; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; -#include common_scripts/utility; +// 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; 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 f658594..1c9ff5c 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 @@ -#include maps/mp/animscripts/zm_shared; -#include maps/mp/animscripts/zm_utility; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; +// 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; 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 8d60fe6..13b6f89 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 0ab059c..8c04353 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_shared.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_shared.gsc @@ -1,509 +1,460 @@ -#include maps/mp/animscripts/zm_utility; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; +// 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; deleteatlimit() { - wait 30; - self delete(); + wait 30.0; + 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" ); #/ /# - if ( lookspeed != "casual" ) - { - assert( lookspeed == "alert", "lookSpeed must be casual or alert" ); - } + assert( lookspeed == "casual" || 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" ); - return; - } - 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" ); + 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 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; + 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; } 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 "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 ); - } - } - } - } + 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; + } } 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; - } - 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++; - } + 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; + } } 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 / frames ); - i = 0; - while ( i < frames ) - { - offset -= offsetreduction; - self teleport( origin + offset ); - wait 0,05; - i++; - } - self.keepclaimednodeingoal = 0; + 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; } 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 b1c5f11..1026550 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_stop.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_stop.gsc @@ -1,26 +1,27 @@ -#include maps/mp/animscripts/zm_shared; -#include maps/mp/animscripts/zm_utility; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; +// 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; 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 bdf6899..719610b 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_turn.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_turn.gsc @@ -1,6 +1,9 @@ -#include maps/mp/animscripts/shared; -#include maps/mp/animscripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\shared; 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 b357ed8..4f7e208 100644 --- a/Zombie Core/patch_zm/maps/mp/animscripts/zm_utility.gsc +++ b/Zombie Core/patch_zm/maps/mp/animscripts/zm_utility.gsc @@ -1,1243 +1,1122 @@ -#include maps/mp/_utility; -#include maps/mp/animscripts/zm_shared; -#include maps/mp/animscripts/utility; -#include maps/mp/animscripts/shared; +// 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; 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() { /# - if ( self.a.movement != "stop" && self.a.movement != "walk" ) - { - assert( self.a.movement == "run", "UpdateAnimPose " + self.a.pose + " " + self.a.movement ); - } + assert( self.a.movement == "stop" || self.a.movement == "walk" || 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 = vectorToAngle( org - self.origin ); - return angles[ 1 ]; + angles = vectortoangles( org - self.origin ); + return angles[1]; } getyaw2d( org ) { - angles = vectorToAngle( ( org[ 0 ], org[ 1 ], 0 ) - ( self.origin[ 0 ], self.origin[ 1 ], 0 ) ); - return angles[ 1 ]; + angles = vectortoangles( ( 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 = vectorToAngle( org - start ); - return angles[ 1 ]; + angles = vectortoangles( 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; - angle = ( anglefrac - floor( anglefrac ) ) * 360; - return angle; + anglefrac = angle / 360.0; + angle = ( anglefrac - floor( anglefrac ) ) * 360.0; + 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 ) { - i = set.size - 1; - while ( i >= 0 ) - { - if ( input == set[ i ] ) - { - return 1; - } - i--; + for ( i = set.size - 1; i >= 0; i-- ) + { + if ( input == set[i] ) + return true; + } - } - return 0; + return false; } 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; - i = 0; - while ( i < maxtime ) - { - print3d( org, msg, color, 1, 1 ); - wait 0,05; - i++; + maxtime = timer * 20; + + for ( i = 0; i < maxtime; i++ ) + { + print3d( org, msg, color, 1, 1 ); + wait 0.05; + } #/ - } } 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 ( 1 ) - { - wait 0,05; - while ( !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 ( true ) + { + wait 0.05; + + if ( !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 ( 1 ) - { - 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 ( true ) + { + 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; - i = 0; - while ( i < timer ) - { - wait 0,05; - line( frompoint, topoint, color ); - i += 1; + self endon( "death" ); + timer = printtime * 20; + + for ( i = 0; i < timer; i += 1 ) + { + wait 0.05; + line( frompoint, topoint, color ); + } #/ - } } showdebugline( frompoint, topoint, color, printtime ) { - self thread showdebugproc( frompoint, topoint + vectorScale( ( 0, 0, 1 ), 5 ), color, printtime ); + self thread showdebugproc( frompoint, topoint + vectorscale( ( 0, 0, -1 ), 5.0 ), 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, 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; + 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; } 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( 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; + 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; } showlines( start, end, end2 ) { /# - for ( ;; ) - { - line( start, end, ( 0, 0, 1 ), 1 ); - wait 0,05; - line( start, end2, ( 0, 0, 1 ), 1 ); - wait 0,05; + for (;;) + { + line( start, end, ( 1, 0, 0 ), 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; - 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 ]; + 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]; } notforcedcover() { - if ( self.a.forced_cover != "none" ) - { - return self.a.forced_cover == "Show"; - } + return self.a.forced_cover == "none" || self.a.forced_cover == "Show"; } forcedcover( msg ) { - if ( isDefined( self.a.forced_cover ) ) - { - return self.a.forced_cover == msg; - } + return isdefined( self.a.forced_cover ) && self.a.forced_cover == msg; } print3dtime( timer, org, msg, color, alpha, scale ) { /# - newtime = timer / 0,05; - i = 0; - while ( i < newtime ) - { - print3d( org, msg, color, alpha, scale ); - wait 0,05; - i++; + newtime = timer / 0.05; + + for ( i = 0; i < newtime; i++ ) + { + print3d( org, msg, color, alpha, scale ); + wait 0.05; + } #/ - } } print3drise( org, msg, color, alpha, scale ) { /# - 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++; + 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; + } #/ - } } 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 ); - 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; + 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; } 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(); - assert( isDefined( self.a.array[ animname ] ), "self.a.array[ "" + animname + "" ] is undefined" ); -#/ - } + if ( !isdefined( self.a.array[animname] ) ) + { + dumpanimarray(); /# - assert( self.a.array[ animname ].size > 0 ); + assert( isdefined( self.a.array[animname] ), "self.a.array[ \"" + animname + "\" ] is undefined" ); #/ - if ( self.a.array[ animname ].size > 1 ) - { - index = randomint( self.a.array[ animname ].size ); - } - else - { - index = 0; - } - return self.a.array[ animname ][ index ]; + } +#/ +/# + 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]; } dumpanimarray() { /# - 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++; + 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]] ); + } #/ - } } 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 0; - } - return 1; + if ( !isdefined( enemy ) ) + return false; + + return true; } damagelocationisany( a, b, c, d, e, f, g, h, i, j, k, ovr ) { - 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; - } + 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; /# - assert( !isDefined( ovr ) ); + assert( !isdefined( ovr ) ); #/ - return 0; + return false; } ragdolldeath( moveanim ) { - 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; - } - } + 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; + } + } } iscqbwalking() { - if ( isDefined( self.cqbwalking ) ) - { - return self.cqbwalking; - } + return isdefined( self.cqbwalking ) && 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() { - if ( isDefined( self.banzai ) ) - { - return self.banzai; - } + return isdefined( self.banzai ) && self.banzai; } is_heavy_machine_gun() { - if ( isDefined( self.heavy_machine_gunner ) ) - { - return self.heavy_machine_gunner; - } + return isdefined( self.heavy_machine_gunner ) && self.heavy_machine_gunner; } is_zombie() { - if ( isDefined( self.is_zombie ) && self.is_zombie ) - { - return 1; - } - return 0; + if ( isdefined( self.is_zombie ) && self.is_zombie ) + return true; + + return false; } is_civilian() { - if ( isDefined( self.is_civilian ) && self.is_civilian ) - { - return 1; - } - return 0; + if ( isdefined( self.is_civilian ) && self.is_civilian ) + return true; + + return false; } is_zombie_gibbed() { - if ( self is_zombie() ) - { - return self.gibbed; - } + return self is_zombie() && 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 = ( 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 ); + 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 ); + } #/ - } } 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(); - acked = undefined; - while ( !isDefined( acked ) ) - { - level waittill( "snapacknowledged" ); - acked = snapshotacknowledged( snapshot_ids ); - } - } - else wait 0,1; + if ( numremoteclients() ) + { + snapshot_ids = getsnapshotindexarray(); + + for ( acked = undefined; !isdefined( acked ); acked = snapshotacknowledged( snapshot_ids ) ) + level waittill( "snapacknowledged" ); + } + 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 db8064a..66a5537 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_callbacksetup.gsc @@ -1,209 +1,215 @@ -#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; +// 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; -codecallback_startgametype() //checked matches cerberus output +codecallback_startgametype() { - if ( !isDefined( level.gametypestarted ) || !level.gametypestarted ) - { - [[ level.callbackstartgametype ]](); - level.gametypestarted = 1; - } + if ( !isdefined( level.gametypestarted ) || !level.gametypestarted ) + { + [[ level.callbackstartgametype ]](); + level.gametypestarted = 1; + } } -codecallback_finalizeinitialization() //checked matches cerberus output +codecallback_finalizeinitialization() { - maps/mp/_utility::callback( "on_finalize_initialization" ); + maps\mp\_utility::callback( "on_finalize_initialization" ); } -codecallback_playerconnect() //checked matches cerberus output +codecallback_playerconnect() { - 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() //checked matches cerberus output +codecallback_playerdisconnect() { - self notify( "disconnect" ); - level notify( "disconnect" ); - client_num = self getentitynumber(); - [[ level.callbackplayerdisconnect ]](); + self notify( "disconnect" ); + client_num = self getentitynumber(); + [[ level.callbackplayerdisconnect ]](); } -codecallback_hostmigration() //checked matches cerberus output +codecallback_hostmigration() { - /* /# - println( "****CodeCallback_HostMigration****" ); + println( "****CodeCallback_HostMigration****" ); #/ - */ - [[ level.callbackhostmigration ]](); + [[ level.callbackhostmigration ]](); } -codecallback_hostmigrationsave() //checked matches cerberus output +codecallback_hostmigrationsave() { - /* /# - println( "****CodeCallback_HostMigrationSave****" ); + println( "****CodeCallback_HostMigrationSave****" ); #/ - */ - [[ level.callbackhostmigrationsave ]](); + [[ level.callbackhostmigrationsave ]](); } -codecallback_playermigrated() //checked matches cerberus output +codecallback_prehostmigrationsave() { - /* /# - println( "****CodeCallback_PlayerMigrated****" ); + println( "****CodeCallback_PreHostMigrationSave****" ); #/ - */ - [[ level.callbackplayermigrated ]](); + [[ level.callbackprehostmigrationsave ]](); } -codecallback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) //checked matches cerberus output +codecallback_playermigrated() { - 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( "ERROR: Aborting level - gametype is not supported" ); + println( "****CodeCallback_PlayerMigrated****" ); #/ - */ - 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 ); + [[ level.callbackplayermigrated ]](); } -codecallback_glasssmash( pos, dir ) //checked matches cerberus output +codecallback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ) { - level notify( "glass_smash" ); + self endon( "disconnect" ); + [[ level.callbackplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, timeoffset, boneindex ); } -callbackvoid() //checked matches cerberus output +codecallback_playerkilled( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, timeoffset, deathanimduration ) { + 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 de3aadd..7611d6b 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_clientids.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_clientids.gsc @@ -1,16 +1,19 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - level.clientid = 0; - level thread onplayerconnect(); + level.clientid = 0; + level thread onplayerconnect(); } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - 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 e16144a..0b61988 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_damagefeedback.gsc @@ -1,160 +1,166 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - 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() //checked matches cerberus output +onplayerconnect() { - 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 ) //checked matches cerberus output +updatedamagefeedback( mod, inflictor, perkfeedback ) { - 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; - } + 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; } -playhitsound( mod, alert ) //checked matches cerberus output +playhitsound( mod, alert ) { - 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 ) //checked matches cerberus output +updatespecialdamagefeedback( hitent ) { - 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 ) //checked changed to match cerberus output +sendhitspecialeventatframeend( hitent ) { - 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 86a3a5e..0dee973 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_dev.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_dev.gsc @@ -1,102 +1,90 @@ -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\_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" ); - 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" ); + 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" ); + } + } + } #/ - } - } - } } 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 d5054cd..b40406b 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_gameobjects.gsc @@ -1,2668 +1,2392 @@ -#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; +// 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; 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 ); - } - 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--; + if ( level.vehiclesenabled ) + { + allowed[allowed.size] = "vehicle"; + filter_script_vehicles_from_vehicle_descriptors( allowed ); + } - } - return; + 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(); + } } entity_is_allowed( entity, allowed_game_modes ) { - 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; + 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; } 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; - } - 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; + 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; } filter_script_vehicles_from_vehicle_descriptors( allowed_game_modes ) { - 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; + 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(); } 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, 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; + 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; } carryobjectusethink() { - 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 ); - } + 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 ); + } } carryobjectproxthink() { - 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 ); - } + 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 ); + } } pickupobjectdelay( origin ) { - 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; + 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; } 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 ); - 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(); + 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(); } hideobject() { - 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++; - } + 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 ) ); } 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 ); - 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; - } - } - } + 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; + } } 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; - } - else - { - 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; + } + + 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" ); - 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; + 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; } isobjectawayfromhome() { - if ( isDefined( self.carrier ) ) - { - return 1; - } - if ( distancesquared( self.trigger.origin, self.trigger.baseorigin ) > 4 ) - { - return 1; - } - return 0; + if ( isdefined( self.carrier ) ) + return true; + + if ( distancesquared( self.trigger.origin, self.trigger.baseorigin ) > 4 ) + return true; + + return false; } setposition( origin, angles ) { - 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; + 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; } 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, 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; + 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; } 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" ); - 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 ) - { + 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++ ) + { /# - assert( isDefined( elevators[ index ].occupy_volume ) ); + assert( isdefined( elevators[index].occupy_volume ) ); #/ - if ( self.visuals[ 0 ] istouchingswept( elevators[ index ].occupy_volume, minz, maxz ) ) - { - return 1; - } - index++; - } - return 0; + if ( self.visuals[0] istouchingswept( elevators[index].occupy_volume, minz, maxz ) ) + return true; + } + + return false; } 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 ), self.origin - vectorScale( ( 0, 0, 1 ), 20 ), 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.0 ), self.origin - vectorscale( ( 0, 0, 1 ), 20.0 ), 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; - 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; + 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; } 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 ) { - 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; + 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; } useobjectusethink() { - 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 ); - } - } + 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 ); + } } getearliestclaimplayer() { /# - assert( self.claimteam != "none" ); + assert( self.claimteam != "none" ); #/ - 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; + 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; } useobjectproxthink() { - 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(); - } + 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(); + } } 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 0; - } - } - if ( !isDefined( self.keyobject ) || isDefined( player.carryobject ) && player haskeyobject( self ) ) - { - return 1; - } - return 0; + 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; } proxtriggerthink() { - 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 ); - } - } + 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 ); + } } 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 0; - } - if ( self useobjectlockedforteam( team ) ) - { - return 0; - } - if ( self isinvehicle() ) - { - return 0; - } - if ( !self istouching( object.trigger ) ) - { - return 0; - } - return 1; + 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; } 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 ); - } - 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(); + 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(); } 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 != ( 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; - } + 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; + } } getnumtouchingexceptteam( ignoreteam ) { - 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; + numtouching = 0; + + foreach ( team in level.teams ) + { + if ( ignoreteam == team ) + continue; + + numtouching += self.numtouching[team]; + } + + 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 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; + 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; } 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 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; + 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; } 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 ); - } - 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 ); - } - } - } + 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 ); + } } 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 ); - return; - } - 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 ); + 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 ); - 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++; - } + 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 ); + } + } } shouldpingobject( relativeteam ) { - if ( relativeteam == "friendly" && self.objidpingfriendly ) - { - return 1; - } - else - { - if ( relativeteam == "enemy" && self.objidpingenemy ) - { - return 1; - } - } - return 0; + if ( relativeteam == "friendly" && self.objidpingfriendly ) + return true; + else if ( relativeteam == "enemy" && self.objidpingenemy ) + return true; + + return false; } getupdateteams( relativeteam ) { - 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; + 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; } shouldshowcompassduetoradar( team ) { - showcompass = 0; - return showcompass; + showcompass = 0; + return showcompass; } updatevisibilityaccordingtoradar() { - self endon( "death" ); - self endon( "carrier_cleared" ); - while ( 1 ) - { - level waittill( "radar_status_change" ); - self updatecompassicons(); - } + self endon( "death" ); + self endon( "carrier_cleared" ); + + while ( true ) + { + 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 ) - { - 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++; - } + 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(); + } + } + } } makesolid() { - 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; - } - } + 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; + } } 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 ); - _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(); - } + 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(); } disableobject( forcehide ) { - 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" ); + 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" ); } enableobject( forceshow ) { - 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" ); + 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" ); } 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 1; - } - if ( self.ownerteam == "any" ) - { - return 1; - } - if ( self.ownerteam == team ) - { - return 1; - } - return 0; + if ( !level.teambased ) + return true; + + if ( self.ownerteam == "any" ) + return true; + + if ( self.ownerteam == team ) + return true; + + return false; } caninteractwith( player ) { - 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: + 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: /# - assert( 0, "invalid interactTeam" ); + assert( 0, "invalid interactTeam" ); #/ - return 0; - } + return false; + } } isteam( team ) { - if ( team == "neutral" ) - { - return 1; - } - if ( isDefined( level.teams[ team ] ) ) - { - return 1; - } - if ( team == "any" ) - { - return 1; - } - if ( team == "none" ) - { - return 1; - } - return 0; + if ( team == "neutral" ) + return true; + + if ( isdefined( level.teams[team] ) ) + return true; + + if ( team == "any" ) + return true; + + if ( team == "none" ) + return true; + + return false; } isrelativeteam( relativeteam ) { - if ( relativeteam == "friendly" ) - { - return 1; - } - if ( relativeteam == "enemy" ) - { - return 1; - } - if ( relativeteam == "any" ) - { - return 1; - } - if ( relativeteam == "none" ) - { - return 1; - } - return 0; + if ( relativeteam == "friendly" ) + return true; + + if ( relativeteam == "enemy" ) + return true; + + if ( relativeteam == "any" ) + return true; + + if ( relativeteam == "none" ) + return true; + + return false; } 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 ]; - } - else - { - nextid = level.numgametypereservedobjectives; - level.numgametypereservedobjectives++; - } + 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++; + } /# - 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 ); #/ - i = 0; - while ( i < level.releasedobjectives.size ) - { - if ( objid == level.releasedobjectives[ i ] && objid == 31 ) - { - return; - } + for ( i = 0; i < level.releasedobjectives.size; i++ ) + { + if ( objid == level.releasedobjectives[i] && objid == 31 ) + return; /# - assert( objid != level.releasedobjectives[ i ] ); + assert( objid != level.releasedobjectives[i] ); #/ - i++; - } - level.releasedobjectives[ level.releasedobjectives.size ] = objid; + } + + 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 e69de29..df94d58 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globalentities.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globalentities.gsc @@ -0,0 +1,3 @@ +// 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 9af0f50..89111dd 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_globallogic.gsc @@ -1,2741 +1,2329 @@ -#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; +// 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; -init() //checked matches bo3 _globallogic.gsc within reason +init() { + if ( !isdefined( level.tweakablesinitialized ) ) + maps\mp\gametypes_zm\_tweakables::init(); - // 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; - - /* + 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; /# - if ( GetDvarint( "scr_forcerankedmatch" ) == 1 ) - level.rankedMatch = true; + if ( getdvarint( "scr_forcerankedmatch" ) == 1 ) + level.rankedmatch = 1; #/ - */ - - level.script = toLower( GetDvar( "mapname" ) ); - level.gametype = toLower( GetDvar( "g_gametype" ) ); + level.script = tolower( getdvar( "mapname" ) ); + level.gametype = tolower( getdvar( "g_gametype" ) ); + level.teambased = 0; + level.teamcount = getgametypesetting( "teamCount" ); + level.multiteam = level.teamcount > 2; - 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 ( sessionmodeiszombiesgame() ) + { + level.zombie_team_index = level.teamcount + 1; - // 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"; + if ( 2 == level.zombie_team_index ) + level.zombie_team = "axis"; + else + level.zombie_team = "team" + level.zombie_team_index; + } - 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; + 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.dropTeam = GetDvarint( "sv_maxclients" ); - - level.inFinalKillcam = false; + for ( teamindex = 3; teamindex <= teamcount; teamindex++ ) + { + level.teams["team" + teamindex] = "team" + teamindex; + level.teamindex["team" + teamindex] = teamindex; + } - maps\mp\gametypes_zm\_globallogic_ui::init(); + 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 = []; - registerDvars(); -// maps\mp\gametypes_zm\_class::initPerkDvars(); + foreach ( team in level.teams ) + level.placement[team] = []; - 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 ); - } + 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; - 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 ); + 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 ); + } - //thread maps\mp\_gameadvertisement::init(); - //thread maps\mp\_gamerep::init(); + 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 ); } -registerDvars() //checked matches bo3 _globallogic.gsc within reason +registerdvars() { - if ( GetDvar( "scr_oldschool" ) == "" ) - SetDvar( "scr_oldschool", "0" ); - - makeDvarServerInfo( "scr_oldschool" ); + if ( getdvar( "scr_oldschool" ) == "" ) + setdvar( "scr_oldschool", "0" ); - if ( GetDvar( "ui_guncycle" ) == "" ) - SetDvar( "ui_guncycle", 0 ); - - makedvarserverinfo( "ui_guncycle" ); + makedvarserverinfo( "scr_oldschool" ); - if ( GetDvar( "ui_weapon_tiers" ) == "" ) - SetDvar( "ui_weapon_tiers", 0 ); - makedvarserverinfo( "ui_weapon_tiers" ); + if ( getdvar( "ui_guncycle" ) == "" ) + setdvar( "ui_guncycle", 0 ); - SetDvar( "ui_text_endreason", ""); - makeDvarServerInfo( "ui_text_endreason", "" ); + makedvarserverinfo( "ui_guncycle" ); - setMatchFlag( "bomb_timer", 0 ); - - setMatchFlag( "enable_popups", 1 ); - - setMatchFlag( "pregame", isPregame() ); + if ( getdvar( "ui_weapon_tiers" ) == "" ) + setdvar( "ui_weapon_tiers", 0 ); - if ( GetDvar( "scr_vehicle_damage_scalar" ) == "" ) - SetDvar( "scr_vehicle_damage_scalar", "1" ); - - level.vehicleDamageScalar = GetDvarfloat( "scr_vehicle_damage_scalar"); + makedvarserverinfo( "ui_weapon_tiers" ); + setdvar( "ui_text_endreason", "" ); + makedvarserverinfo( "ui_text_endreason", "" ); + setmatchflag( "bomb_timer", 0 ); + setmatchflag( "enable_popups", 1 ); + setmatchflag( "pregame", ispregame() ); - level.fire_audio_repeat_duration = GetDvarint( "fire_audio_repeat_duration" ); - level.fire_audio_random_max_duration = GetDvarint( "fire_audio_random_max_duration" ); + 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 ); } -blank( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 ) //checked matches bo3 _globallogic.gsc within reason +blank( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 ) { + } -SetupCallbacks() //checked matches bo3 _globallogic.gsc within reason +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(); + 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(); } -precache_mp_leaderboards() //checked matches bo3 _globallogic.gsc within reason +precache_mp_leaderboards() { - if( SessionModeIsZombiesGame() ) - return; + if ( sessionmodeiszombiesgame() ) + return; - if( !level.rankedMatch ) - return; - - mapname = GetDvar( "mapname" ); + if ( !level.rankedmatch ) + return; - 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"; + 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; - 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 ); + if ( getdvarint( _hash_46E18E53 ) ) + gamemodeleaderboard += "_HC"; + + mapleaderboard = " LB_MP_MAP_" + getsubstr( mapname, 3, mapname.size ); + precacheleaderboards( globalleaderboards + gamemodeleaderboard + mapleaderboard ); } -compareTeamByGameStat( gameStat, teamA, teamB, previous_winner_score ) //checked matches bo3 _globallogic.gsc within reason +compareteambygamestat( gamestat, teama, teamb, previous_winner_score ) { - 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 ) //checked matches bo3 _globallogic.gsc within reason +determineteamwinnerbygamestat( gamestat ) { - 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 ) //checked matches bo3 _globallogic.gsc within reason +compareteambyteamscore( teama, teamb, previous_winner_score ) { - winner = undefined; - teamBScore = [[level._getTeamScore]]( teamB ); + winner = undefined; + teambscore = [[ level._getteamscore ]]( teamb ); - if ( teamA == "tie" ) - { - winner = "tie"; - - if ( previous_winner_score < teamBScore ) - winner = teamB; - - return winner; - } - - teamAScore = [[level._getTeamScore]]( teamA ); + if ( teama == "tie" ) + { + winner = "tie"; - if ( teamBScore == teamAScore ) - winner = "tie"; - else if ( teamBScore > teamAScore ) - winner = teamB; - else - winner = teamA; - - return winner; + 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; } -determineTeamWinnerByTeamScore( ) //checked matches bo3 _globallogic.gsc within reason +determineteamwinnerbyteamscore() { - 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) //checked matches bo3 _globallogic.gsc within reason +forceend( hostsucks ) { - if ( !isDefined(hostsucks ) ) - hostsucks = false; + if ( !isdefined( hostsucks ) ) + hostsucks = 0; - 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 = 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 ); + 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 ); } -killserverPc() //checked matches bo3 _globallogic.gsc within reason +killserverpc() { - 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"; - - /* + 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"; /# - PrintLn("kill server; ending game\n"); + println( "kill server; ending game\n" ); #/ - */ - thread endGame( winner, endString ); + thread endgame( winner, endstring ); } -someoneOnEachTeam() //checked matches bo3 _globallogic.gsc within reason +someoneoneachteam() { - 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 ) //checked matches bo3 _globallogic.gsc within reason +checkifteamforfeits( team ) { - 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() //checked matches bo3 _globallogic.gsc within reason +checkforanyteamforfeit() { - foreach( team in level.teams ) - { - if ( checkIfTeamForfeits( team ) ) - { - //allies forfeited - thread [[level.onForfeit]]( team ); - return true; - } - } - - return false; + foreach ( team in level.teams ) + { + if ( checkifteamforfeits( team ) ) + { + thread [[ level.onforfeit ]]( team ); + return true; + } + } + + return false; } -doSpawnQueueUpdates() //checked matches bo3 _globallogic.gsc within reason +dospawnqueueupdates() { - 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 ) //checked changed at own discretion +isteamalldead( team ) { - if ( level.everExisted[team] && !level.aliveCount[ team ] && !level.playerLives[ team ] ) - { - return 1; - } - return 0; + return level.everexisted[team] && !level.alivecount[team] && !level.playerlives[team]; } -areAllTeamsDead( ) //checked matches bo3 _globallogic.gsc within reason +areallteamsdead() { - foreach( team in level.teams ) - { - // if team was alive and now they are not - if ( !isTeamAllDead( team ) ) - { - return false; - } - } - - return true; + foreach ( team in level.teams ) + { + if ( !isteamalldead( team ) ) + return false; + } + + return true; } -allDeadTeamCount( ) //checked matches bo3 _globallogic.gsc within reason +alldeadteamcount() { - count = 0; - foreach( team in level.teams ) - { - // if team was alive and now they are not - if ( isTeamAllDead( team ) ) - { - count++; - } - } - - return count; + count = 0; + + foreach ( team in level.teams ) + { + if ( isteamalldead( team ) ) + count++; + } + + return count; } -doDeadEventUpdates() //checked matches bo3 _globallogic.gsc within reason +dodeadeventupdates() { - 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 ( level.teambased ) + { + if ( areallteamsdead() ) + { + [[ level.ondeadevent ]]( "all" ); + return true; + } - // 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; + 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; } -isOnlyOneLeftAliveOnTeam( team ) //checked changed at own discretion +isonlyoneleftaliveonteam( team ) { - if ( level.lastAliveCount[team] > 1 && level.aliveCount[team] == 1 && level.playerLives[team] == 1 ) - { - return 1; - } - return 0; + return level.lastalivecount[team] > 1 && level.alivecount[team] == 1 && level.playerlives[team] == 1; } - -doOneLeftEventUpdates() //checked matches bo3 _globallogic.gsc within reason +doonelefteventupdates() { - 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; + 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; } -updateGameEvents() //checked matches bo3 _globallogic.gsc within reason +updategameevents() { - /* /# - if( GetDvarint( "scr_hostmigrationtest" ) == 1 ) - { - return; - } + if ( getdvarint( "scr_hostmigrationtest" ) == 1 ) + return; #/ - */ - 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.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.playerQueuedRespawn ) - { - doSpawnQueueUpdates(); - } - - if ( doDeadEventUpdates() ) - return; - - if ( doOneLeftEventUpdates() ) - return; + if ( !level.playerqueuedrespawn && !level.numlives && !level.inovertime ) + return; + + if ( level.ingraceperiod ) + return; + + if ( level.playerqueuedrespawn ) + dospawnqueueupdates(); + + if ( dodeadeventupdates() ) + return; + + if ( doonelefteventupdates() ) + return; } - -matchStartTimer() //checked matches bo3 _globallogic.gsc within reason -{ - 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 = false; - matchStartText.hidewheninmenu = true; - - 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 = 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() //checked matches bo3 _globallogic.gsc within reason +matchstarttimer() { - if ( !isPregame() ) - visionSetNaked( GetDvar( "mapname" ), 0 ); - else - visionSetNaked( "mpIntro", 0 ); + 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 ); + + if ( counttime == 2 ) + visionsetnaked( getdvar( "mapname" ), 3.0 ); + + counttime--; + wait 1.0; + } + } + else + visionsetnaked( getdvar( "mapname" ), 1.0 ); + + matchstarttimer destroyelem(); + matchstarttext destroyelem(); } -notifyTeamWaveSpawn( team, time ) //checked matches bo3 _globallogic.gsc within reason +matchstarttimerskip() { - if ( time - level.lastWave[team] > (level.waveDelay[team] * 1000) ) - { - level notify ( "wave_respawn_" + team ); - level.lastWave[team] = time; - level.wavePlayerSpawnIndex[team] = 0; - } + if ( !ispregame() ) + visionsetnaked( getdvar( "mapname" ), 0 ); + else + visionsetnaked( "mpIntro", 0 ); } -waveSpawnTimer() //checked matches bo3 _globallogic.gsc within reason +notifyteamwavespawn( team, time ) { - level endon( "game_ended" ); - - while ( game["state"] == "playing" ) - { - time = getTime(); - - foreach( team in level.teams ) - { - notifyTeamWaveSpawn( team, time ); - } - wait ( 0.05 ); - } + if ( time - level.lastwave[team] > level.wavedelay[team] * 1000 ) + { + level notify( "wave_respawn_" + team ); + level.lastwave[team] = time; + level.waveplayerspawnindex[team] = 0; + } } - -hostIdledOut() //checked matches bo3 _globallogic.gsc within reason +wavespawntimer() { - hostPlayer = getHostPlayer(); - /* + level endon( "game_ended" ); + + while ( game["state"] == "playing" ) + { + time = gettime(); + + foreach ( team in level.teams ) + notifyteamwavespawn( team, time ); + + wait 0.05; + } +} + +hostidledout() +{ + hostplayer = gethostplayer(); /# - if( GetDvarint( "scr_writeconfigstrings" ) == 1 || GetDvarint( "scr_hostmigrationtest" ) == 1 ) - return false; + if ( getdvarint( "scr_writeConfigStrings" ) == 1 || getdvarint( "scr_hostmigrationtest" ) == 1 ) + return false; #/ - */ - // host never spawned - if ( isDefined( hostPlayer ) && !hostPlayer.hasSpawned && !isDefined( hostPlayer.selectedClass ) ) - return true; + if ( isdefined( hostplayer ) && !hostplayer.hasspawned && !isdefined( hostplayer.selectedclass ) ) + return true; - return false; + return false; } -IncrementMatchCompletionStat( gameMode, playedOrHosted, stat ) //checked matches bo3 _globallogic.gsc within reason +incrementmatchcompletionstat( gamemode, playedorhosted, stat ) { - self AddDStat( "gameHistory", gameMode, "modeHistory", playedOrHosted, stat, 1 ); + self adddstat( "gameHistory", gamemode, "modeHistory", playedorhosted, stat, 1 ); } -SetMatchCompletionStat( gameMode, playedOrHosted, stat ) //checked matches bo3 _globallogic.gsc within reason +setmatchcompletionstat( gamemode, playedorhosted, stat ) { - self SetDStat( "gameHistory", gameMode, "modeHistory", playedOrHosted, stat, 1 ); + self setdstat( "gameHistory", gamemode, "modeHistory", playedorhosted, stat, 1 ); } -GetCurrentGameMode() //doesn't exist in bo3 _globallogic.gsc leaving in -{ - return "publicmatch"; +getcurrentgamemode() +{ + return "publicmatch"; } -displayRoundEnd( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info +displayroundend( winner, endreasontext ) { - 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; - 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++; - } - } + setmatchflag( "cg_drawSpectatorMessages", 0 ); + players = level.players; - if ( wasLastRound() ) - { - roundEndWait( level.roundEndDelay, false ); - } - else - { - thread maps\mp\gametypes_zm\_globallogic_audio::announceRoundWinner( winner, level.roundEndDelay / 4 ); - roundEndWait( level.roundEndDelay, true ); - } + 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 ); + } } -displayRoundSwitch( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info +displayroundswitch( winner, endreasontext ) { - 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 ); + switchtype = level.halftimetype; - 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++; - } + 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"; + } - roundEndWait( level.halftimeRoundEndDelay, false ); + 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 ); } -displayGameEnd( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info +displaygameend( winner, endreasontext ) { - 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"] ); - // 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 ); + players = level.players; - 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 ); + for ( index = 0; index < players.size; index++ ) + { + player = players[index]; - // 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 ); + 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 ); } -getEndReasonText() //checked matches bo3 _globallogic.gsc within reason +getendreasontext() { - 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() //checked matches bo3 _globallogic.gsc within reason +resetoutcomeforallplayers() { - 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 ) //checked matches bo3 _globallogic.gsc within reason +startnextround( winner, endreasontext ) { - if ( !isOneRound() ) - { - displayRoundEnd( winner, endReasonText ); + if ( !isoneround() ) + { + displayroundend( winner, endreasontext ); + maps\mp\gametypes_zm\_globallogic_utils::executepostroundevents(); - 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 ( !waslastround() ) + { + if ( checkroundswitch() ) + displayroundswitch( winner, endreasontext ); - 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; + 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; } - -setTopPlayerStats( ) //doesn't exist in bo3 _globallogic.gsc leaving in +settopplayerstats() { - 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" ); - } + if ( level.rankedmatch || level.wagermatch ) + { + placement = level.placement["all"]; + topthreeplayers = min( 3, placement.size ); - if ( level.teambased ) - { - foreach ( team in level.teams ) - { - setTopTeamStats(team); - } - } - } + 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 ); + } + } } -setTopTeamStats(team) //doesn't exist in bo3 _globallogic.gsc leaving in +settopteamstats( team ) { - 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 ); - } - } + 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 ); + } } -getGameLength() //checked matches bo3 _globallogic.gsc within reason +getgamelength() { - 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; + 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; } -gameHistoryPlayerQuit() //checked matches bo3 _globallogic.gsc within reason +gamehistoryplayerquit() { - if ( !GameModeIsMode( level.GAMEMODE_PUBLIC_MATCH ) ) - return; - - teamScoreRatio = 0; - self GameHistoryFinishMatch( MATCH_QUIT, 0, 0, 0, 0, teamScoreRatio ); + if ( !gamemodeismode( level.gamemode_public_match ) ) + return; - 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 ); + teamscoreratio = 0; + self gamehistoryfinishmatch( 3, 0, 0, 0, 0, teamscoreratio ); - // wait until the player recieves the new stats - wait(1); + 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; } -endGame( winner, endReasonText ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info +endgame( winner, endreasontext ) { - // return if already ending via host quit or victory - if ( game["state"] == "postgame" || level.gameEnded ) - return; + if ( game["state"] == "postgame" || level.gameended ) + return; - if ( isDefined( level.onEndGame ) ) - [[level.onEndGame]]( winner ); + if ( isdefined( level.onendgame ) ) + [[ level.onendgame ]]( winner ); - //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 ( !level.wagermatch ) + setmatchflag( "enable_popups", 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(); + if ( !isdefined( level.disableoutrovisionset ) || level.disableoutrovisionset == 0 ) + { + if ( sessionmodeiszombiesgame() && level.forcedend ) + visionsetnaked( "zombie_last_stand", 2.0 ); + else + visionsetnaked( "mpOutro", 2.0 ); + } - 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]++; - } - } + 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( winner ) && isdefined( level.teams[winner] ) ) - { - level.finalKillCam_winner = winner; - } - else - { - level.finalKillCam_winner = "none"; - } - - setGameEndTime( 0 ); // stop/hide the timers - - updatePlacement(); + if ( !isdefined( game["overtime_round"] ) || waslastround() ) + { + game["roundsplayed"]++; + game["roundwinner"][game["roundsplayed"]] = winner; - updateRankedMatch( winner ); - - // freeze players - players = level.players; - - newTime = getTime(); - gameLength = getGameLength(); - - SetMatchTalkFlag( "EveryoneHearsEveryone", 1 ); + if ( level.teambased ) + game["roundswon"][winner]++; + } - bbGameOver = 0; - if ( isOneRound() || wasLastRound() ) - { - bbGameOver = 1; + if ( isdefined( winner ) && isdefined( level.teams[winner] ) ) + level.finalkillcam_winner = winner; + else + level.finalkillcam_winner = "none"; - if ( level.teambased ) - { - if ( winner == "tie" ) - { - recordGameResult( "draw" ); - } - else - { - recordGameResult( winner ); - } - } - else - { - if ( !isDefined( winner ) ) - { - recordGameResult( "draw" ); - } - else - { - recordGameResult( winner.team ); - } - } - } + setgameendtime( 0 ); + updateplacement(); + updaterankedmatch( winner ); + players = level.players; + newtime = gettime(); + gamelength = getgamelength(); + setmatchtalkflag( "EveryoneHearsEveryone", 1 ); + bbgameover = 0; - index = 0; - while ( index < players.size ) - { - player = players[index]; - player maps\mp\gametypes_zm\_globallogic_player::freezePlayerForRoundEnd(); - player thread roundEndDoF( 4.0 ); + if ( isoneround() || waslastround() ) + { + bbgameover = 1; - 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 ); + if ( level.teambased ) + { + if ( winner == "tie" ) + recordgameresult( "draw" ); + else + recordgameresult( winner ); + } + else if ( !isdefined( winner ) ) + recordgameresult( "draw" ); + else + recordgameresult( winner.team ); + } - if( isPregame() ) - { - index++; - continue; - } + 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( level.rankedMatch || level.wagerMatch || level.leagueMatch ) - { - if ( isDefined( player.setPromotion ) ) - { - player setDStat( "AfterActionReportStats", "lobbyPopup", "promotion" ); - } - else - { - player setDStat( "AfterActionReportStats", "lobbyPopup", "summary" ); - } - } - index++; - } + if ( ispregame() ) + continue; - maps\mp\_music::setmusicstate( "SILENT" ); + if ( ( level.rankedmatch || level.wagermatch || level.leaguematch ) && !player issplitscreen() ) + { + if ( isdefined( player.setpromotion ) ) + { + player setdstat( "AfterActionReportStats", "lobbyPopup", "promotion" ); + continue; + } -// temporarily disabling round end sound call to prevent the final killcam from not having sound - if ( !level.inFinalKillcam ) - { -// clientnotify ( "snd_end_rnd" ); - } + player setdstat( "AfterActionReportStats", "lobbyPopup", "summary" ); + } + } - //maps\mp\_gamerep::gameRepUpdateInformationForRound(); -// maps\mp\gametypes_zm\_wager::finalizeWagerRound(); -// maps\mp\gametypes_zm\_gametype_variants::onRoundEnd(); - thread maps\mp\_challenges::roundEnd( winner ); + maps\mp\_music::setmusicstate( "SILENT" ); - if ( startNextRound( winner, endReasonText ) ) - { - return; - } - - /////////////////////////////////////////// - // After this the match is really ending // - /////////////////////////////////////////// + if ( !level.infinalkillcam ) + { - if ( !isOneRound() ) - { - if ( isDefined( level.onRoundEndGame ) ) - { - winner = [[level.onRoundEndGame]]( winner ); - } + } - endReasonText = getEndReasonText(); - } - - skillUpdate( winner, level.teamBased ); - recordLeagueWinner( winner ); - - setTopPlayerStats(); - thread maps\mp\_challenges::gameEnd( winner ); + thread maps\mp\_challenges::roundend( winner ); - if ( ( !isDefined( level.skipGameEnd ) || !level.skipGameEnd ) && IsDefined( winner ) ) - displayGameEnd( winner, endReasonText ); - - if ( isOneRound() ) - { - maps\mp\gametypes_zm\_globallogic_utils::executePostRoundEvents(); - } - - level.intermission = true; + if ( startnextround( winner, endreasontext ) ) + return; - //maps\mp\_gamerep::gameRepAnalyzeAndReport(); + if ( !isoneround() ) + { + if ( isdefined( level.onroundendgame ) ) + winner = [[ level.onroundendgame ]]( winner ); -// maps\mp\gametypes_zm\_wager::finalizeWagerGame(); - - SetMatchTalkFlag( "EveryoneHearsEveryone", 1 ); + endreasontext = getendreasontext(); + } - //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 ); + skillupdate( winner, level.teambased ); + recordleaguewinner( winner ); + settopplayerstats(); + thread maps\mp\_challenges::gameend( winner ); - 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 ( isdefined( winner ) && ( !isdefined( level.skipgameend ) || !level.skipgameend ) ) + displaygameend( winner, endreasontext ); + 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 ) // 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; - } - } +bbplayermatchend( gamelength, endreasonstring, gameover ) +{ + playerrank = getplacementforplayer( self ); + totaltimeplayed = 0; - xuid = self GetXUID(); + if ( isdefined( self.timeplayed ) && isdefined( self.timeplayed["total"] ) ) + { + totaltimeplayed = self.timeplayed["total"]; - 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"] ); + 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"] ); } -roundEndWait( defaultDelay, matchBonus ) //checked matches bo3 _globallogic.gsc within reason changed for loop to while loop see github for more info +roundendwait( defaultdelay, matchbonus ) { - 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 ); - } + notifiesdone = 0; - if ( !matchBonus ) - { - wait ( defaultDelay ); - level notify ( "round_end_done" ); - return; - } + while ( !notifiesdone ) + { + players = level.players; + notifiesdone = 1; - wait ( defaultDelay / 2 ); - level notify ( "give_match_bonus" ); - wait ( defaultDelay / 2 ); + for ( index = 0; index < players.size; index++ ) + { + if ( !isdefined( players[index].doingnotify ) || !players[index].doingnotify ) + continue; - 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" ); + 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" ); } - -roundEndDOF( time ) //checked matches bo3 _globallogic.gsc within reason +roundenddof( time ) { - self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 ); + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); } - -checkTimeLimit() //checked matches bo3 _globallogic.gsc within reason +checktimelimit() { - 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]](); + 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 ]](); } -allTeamsUnderScoreLimit() //checked matches bo3 _globallogic.gsc within reason +allteamsunderscorelimit() { - 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() //checked matches bo3 _globallogic.gsc within reason +checkscorelimit() { - 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() //checked matches bo3 _globallogic.gsc within reason +updategametypedvars() { - 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" ); - } + level endon( "game_ended" ); - timeLimit = [[level.getTimeLimit]](); - if ( timeLimit != level.timeLimit ) - { - level.timeLimit = timeLimit; - SetDvar( "ui_timelimit", level.timeLimit ); - level notify ( "update_timelimit" ); - } - thread checkTimeLimit(); + while ( game["state"] == "playing" ) + { + roundlimit = clamp( getgametypesetting( "roundLimit" ), level.roundlimitmin, level.roundlimitmax ); - 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; - } + 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; + } } - -removeDisconnectedPlayerFromPlacement() //checked matches bo3 _globallogic.gsc within reason +removedisconnectedplayerfromplacement() { - 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" ); - } - -} + offset = 0; + numplayers = level.placement["all"].size; + found = 0; -updatePlacement() //checked matches bo3 _globallogic.gsc within reason -{ - - if ( !level.players.size ) - return; + for ( i = 0; i < numplayers; i++ ) + { + if ( level.placement["all"][i] == self ) + found = 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 ) + level.placement["all"][i] = level.placement["all"][i + 1]; + } -} + if ( !found ) + return; - -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(); -// #/ - /* + level.placement["all"][numplayers - 1] = undefined; /# - PrintLn( "Globallogic Callback_StartGametype() isPregame() = " + isPregame() + "\n" ); + assert( level.placement["all"].size == numplayers - 1 ); #/ - */ - //level thread maps\mp\gametypes_zm\_killcam::doFinalKillcam(); - - thread startGame(); - level thread updateGameTypeDvars(); - /* /# - 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(); - } + maps\mp\gametypes_zm\_globallogic_utils::assertproperplacement(); #/ - */ -} + updateteamplacement(); + if ( level.teambased ) + return; + numplayers = level.placement["all"].size; -ForceDebugHostMigration() //doesn't exist in bo3 _globallogic.gsc leaving in -{ - /* - /# - while (1) - { - maps\mp\gametypes_zm\_hostmigration::waitTillHostMigrationDone(); - wait(60); - starthostmigration(); - maps\mp\gametypes_zm\_hostmigration::waitTillHostMigrationDone(); - //thread forceEnd( false ); - } - #/ - */ + for ( i = 0; i < numplayers; i++ ) + { + player = level.placement["all"][i]; + player notify( "update_outcome" ); + } } - -registerFriendlyFireDelay( dvarString, defaultValue, minValue, maxValue ) //checked matches bo3 _globallogic.gsc within reason +updateplacement() { - 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 ); - } + if ( !level.players.size ) + return; - level.friendlyFireDelayTime = getDvarInt( dvarString ); + 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(); } -checkRoundSwitch() //checked matches bo3 _globallogic.gsc within reason +updateteamplacement() { - 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; + 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]; + + if ( isdefined( player ) ) + { + team = player.pers["team"]; + placement[team][placement[team].size] = player; + } + } + + foreach ( team in level.teams ) + level.placement[team] = placement[team]; } - -listenForGameEnd() //checked matches bo3 _globallogic.gsc within reason +getplacementforplayer( player ) { - self waittill( "host_sucks_end_game" ); - //if ( level.console ) - // endparty(); - level.skipVote = true; + updateplacement(); + playerrank = -1; + placement = level.placement["all"]; - if ( !level.gameEnded ) - { - level thread maps\mp\gametypes_zm\_globallogic::forceEnd(true); - } + for ( placementindex = 0; placementindex < placement.size; placementindex++ ) + { + if ( level.placement["all"][placementindex] == player ) + { + playerrank = placementindex + 1; + break; + } + } + + return playerrank; } - -getKillStreaks( player ) //checked matches bo3 _globallogic.gsc within reason +sortdeadplayers( team ) { - 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; + if ( !level.playerqueuedrespawn ) + return; + + 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; + } } -updateRankedMatch(winner) //checked matches bo3 _globallogic.gsc within reason +totalalivecount() { - 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 ); - } + count = 0; + + foreach ( team in level.teams ) + count += level.alivecount[team]; + + return count; } +totalplayerlives() +{ + count = 0; + foreach ( team in level.teams ) + count += level.playerlives[team]; + return count; +} + +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 d572446..9fe10ee 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,204 +1,174 @@ -//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; +// 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; -callback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) //checked changed to match cerberus output +callback_actordamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) { - 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 ( 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 ( 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 ) //checked matches cerberus output +callback_actorkilled( 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 ) ) - { - 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 2618bd9..95abc02 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,1034 +1,910 @@ -#include maps/mp/_music; -#include maps/mp/gametypes_zm/_globallogic_audio; -#include maps/mp/gametypes_zm/_globallogic_utils; -#include maps/mp/_utility; +// 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; 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - music state is undefined Waiting 15 seconds to set music state" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Setting Music State Random Underscore " + self.pers[ "music" ].returnstate + " On player " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Starting random underscore" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Starting random underscore" ); #/ - } - while ( 1 ) - { - wait randomintrange( 25, 60 ); + while ( true ) + { + wait( randomintrange( 25, 60 ) ); /# - if ( getDvarInt( #"0BC4784C" ) > 0 ) - { - println( "Music System - Checking for random underscore" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Checking for random underscore" ); #/ - } - if ( !isDefined( self.pers[ "music" ].inque ) ) - { - self.pers[ "music" ].inque = 0; - } - while ( self.pers[ "music" ].inque ) - { + if ( !isdefined( self.pers["music"].inque ) ) + self.pers["music"].inque = 0; + + if ( self.pers["music"].inque ) + { /# - if ( getDvarInt( #"0BC4784C" ) > 0 ) - { - println( "Music System - Inque no random underscore" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Inque no random underscore" ); #/ - } - } - 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; + 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 ( getDvarInt( #"0BC4784C" ) > 0 ) - { - println( "Music System - Starting random underscore" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - Starting random underscore" ); #/ - } - } - } + } + } } leaderdialogforotherteams( dialog, skip_team, 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 ); - } + foreach ( team in level.teams ) + { + if ( team != skip_team ) + leaderdialog( dialog, team, undefined, undefined, squad_dialog ); + } } 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 - { - _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" ); - } + 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" ); + } } 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 = []; - _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++; - } + 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 ); + } + } } 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; - } - 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++; - } + 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 ); + } } flushdialog() { - _a495 = level.players; - _k495 = getFirstArrayKey( _a495 ); - while ( isDefined( _k495 ) ) - { - player = _a495[ _k495 ]; - player flushdialogonplayer(); - _k495 = getNextArrayKey( _a495, _k495 ); - } + foreach ( player in level.players ) + player flushdialogonplayer(); } flushdialogonplayer() { - self.leaderdialoggroups = []; - self.leaderdialogqueue = []; - self.leaderdialogactive = 0; - self.currentleaderdialoggroup = ""; + self.leaderdialoggroups = []; + self.leaderdialogqueue = []; + self.leaderdialogactive = 0; + self.currentleaderdialoggroup = ""; } flushgroupdialog( group ) { - _a512 = level.players; - _k512 = getFirstArrayKey( _a512 ); - while ( isDefined( _k512 ) ) - { - player = _a512[ _k512 ]; - player flushgroupdialogonplayer( group ); - _k512 = getNextArrayKey( _a512, _k512 ); - } + foreach ( player in level.players ) + player flushgroupdialogonplayer( group ); } flushgroupdialogonplayer( group ) { - _a522 = self.leaderdialogqueue; - key = getFirstArrayKey( _a522 ); - while ( isDefined( key ) ) - { - dialog = _a522[ key ]; - if ( dialog == group ) - { - } - key = getNextArrayKey( _a522, key ); - } + self.leaderdialoggroups[group] = undefined; + + foreach ( key, dialog in self.leaderdialogqueue ) + { + if ( dialog == group ) + self.leaderdialogqueue[key] = undefined; + } } 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() ) - { - _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; + 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; } testdialogqueue( group ) { /# - 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; + count = 0; + + foreach ( temp in self.leaderdialogqueue ) + { + if ( temp == group ) + count++; + } + + 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 + extratime ); - } - else - { - wait ( ( time * 0,001 ) + extratime ); - } + if ( !isdefined( extratime ) ) + extratime = 0.1; + + time = soundgetplaybacktime( sound ); + + if ( time < 0 ) + wait( 3.0 + 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.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 ); - } + 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 ); + } } isteamwinning( checkteam ) { - 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; + score = game["teamScores"][checkteam]; + + foreach ( team in level.teams ) + { + if ( team != checkteam ) + { + if ( game["teamScores"][team] >= score ) + return false; + } + } + + return true; } announceteamiswinning() { - _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; + foreach ( team in level.teams ) + { + if ( isteamwinning( team ) ) + { + leaderdialog( "winning", team, undefined, undefined, "squad_winning" ); + leaderdialogforotherteams( "losing", team, "squad_losing" ); + return true; + } + } + + return false; } musiccontroller() { - 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" ); + 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" ); + } } 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 ) ); #/ - i = 0; - while ( i < level.players.size ) - { - player = level.players[ i ]; - if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) - { - player playlocalsound( alias ); - } - i++; - } + for ( i = 0; i < level.players.size; i++ ) + { + player = level.players[i]; + + if ( isdefined( player.pers["team"] ) && player.pers["team"] == team ) + player playlocalsound( alias ); + } } 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - team undefined: Setting to both" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - save_sate undefined: Setting to false" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Music System - return_state undefined: Setting to false" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - } - 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 ); + } + + 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 ); /# - if ( getDvarInt( #"0BC4784C" ) > 0 ) - { - println( "Music System - Setting Music State " + state + " On player " + player getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Music System - save_sate undefined: Setting to false" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Music System - return_state undefined: Setting to false" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - } - if ( !isDefined( state ) ) - { - state = "UNDERSCORE"; + } + + if ( !isdefined( state ) ) + { + state = "UNDERSCORE"; /# - if ( getDvarInt( #"0BC4784C" ) > 0 ) - { - println( "Music System - state undefined: Setting to UNDERSCORE" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Saving Music State " + self.pers[ "music" ].returnstate + " On " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Setting Music State " + state + " On player " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Starting Return State " + self.pers[ "music" ].returnstate + " On " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - wait_time undefined: Setting to 0" ); + if ( getdvarint( _hash_BC4784C ) > 0 ) + println( "Music System - wait_time undefined: Setting to 0" ); #/ - } - } - 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 ); + } + + 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 ); /# - if ( getDvarInt( #"0BC4784C" ) > 0 ) - { - println( "Music System - Setting Music State " + self.pers[ "music" ].returnstate + " On player " + player getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 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( #"0BC4784C" ) > 0 ) - { - println( "Music System - Setting next Music State " + self.pers[ "music" ].nextstate + " On " + self getentitynumber() ); + if ( getdvarint( _hash_BC4784C ) > 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 059642d..ce88617 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,230 +1,220 @@ -#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; +// 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; 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; - 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 - { + 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 + { /# - 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 - { - 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++; - } - } + 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" ); + } + } } 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 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; + 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; } 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 2de5b99..8fa6f5b 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,2238 +1,2121 @@ -#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; +// 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; 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" ); - 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; - } + 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; } spectate_player_watcher() { - 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(); + 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(); /# - println( " Unfreeze controls 1" ); + println( " Unfreeze controls 1" ); #/ - 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 ); + 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 ); /# - 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; - self clientnotify( "hmo" ); + self endon( "disconnect" ); + wait 1.0; + 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" ); - 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() ); + 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() ); } 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 = ""; - 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" ] = ""; + 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"] = ""; } removeplayerondisconnect() { - 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++; - } - } + 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; + } + } } 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 0; - } - if ( !isDefined( eattacker ) ) - { - return 0; - } - if ( self != eattacker ) - { - return 0; - } - if ( sweapon != "straferun_gun_mp" && sweapon != "straferun_rockets_mp" ) - { - return 0; - } - return 1; + 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; } 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" ); - } - 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" ); + 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" ); /# - 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 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; + 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; } istacticalhitmarker( sweapon, smeansofdeath, idamage ) { - if ( isgrenade( sweapon ) ) - { - if ( sweapon == "willy_pete_mp" ) - { - if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) - { - return 1; - } - } - else - { - if ( idamage == 1 ) - { - return 1; - } - } - } - return 0; + if ( isgrenade( sweapon ) ) + { + if ( sweapon == "willy_pete_mp" ) + { + if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) + return true; + } + else if ( idamage == 1 ) + return true; + } + + return false; } 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( #"C8077F47" ) != "" ) - { - 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( "scr_csmode" ) != "" ) + 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" ); - 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" ]--; + profilelog_begintiming( 7, "ship" ); + self endon( "spawned" ); + self notify( "killed_player" ); - 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.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; /# - 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 ) ) - { - 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++; + 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++; /# - 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 ) - { - } - } - } - } - 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 ( !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 ( getDvarInt( #"C1849218" ) != 0 ) - { - dokillcam = 1; - if ( lpattacknum < 0 ) - { - lpattacknum = self getentitynumber(); + if ( getdvarint( _hash_C1849218 ) != 0 ) + { + dokillcam = 1; + + if ( lpattacknum < 0 ) + lpattacknum = self getentitynumber(); + } #/ - } - } - 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; - } + 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; + } } 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; - 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.0; + 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" ); - } - 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", self.team ); + + 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 1; - } - if ( self.pers[ "teamkills_nostats" ] > 1 ) - { - return 1; - } - } - return 0; + 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; } reduceteamkillsovertime() { - 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; - } - } + 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; + } } ignoreteamkills( sweapon, smeansofdeath ) { - 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; + 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; } 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 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; + 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; } 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" ); - } + waittillframeend; + + if ( isdefined( self ) ) + level notify( "connecting", self ); } 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 "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; + 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; } 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" ); - 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; + 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; } updateinflictor( einflictor ) { - if ( isDefined( einflictor ) && einflictor.classname == "script_vehicle" ) - { - einflictor notify( "killed" ); - if ( isDefined( einflictor.bda ) ) - { - einflictor.bda++; - } - } - return einflictor; + if ( isdefined( einflictor ) && einflictor.classname == "script_vehicle" ) + { + einflictor notify( "killed", self ); + + 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; - _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; + 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; } 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 a5610a2..a6fcf15 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,873 +1,785 @@ -#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; +// 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; updatematchbonusscores( winner ) { + } givematchbonus( scoretype, score ) { + } doskillupdate( winner ) { - skillupdate( winner, level.teambased ); + skillupdate( winner, level.teambased ); } gethighestscoringplayer() { - 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; - } + 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; } 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 ); - 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 ) ) ); - } - } + 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 ) ); + } + } #/ - } } 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() { - 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(); + 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(); } resetallscores() { - resetteamscores(); - resetplayerscores(); + resetteamscores(); + resetplayerscores(); } resetplayerscores() { - players = level.players; - winner = undefined; - tie = 0; - i = 0; - while ( i < players.size ) - { - if ( isDefined( players[ i ].pers[ "score" ] ) ) - { - _setplayerscore( players[ i ], 0 ); - } - i++; - } + players = level.players; + winner = undefined; + tie = 0; + + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i].pers["score"] ) ) + _setplayerscore( players[i], 0 ); + } } 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() { - _a629 = level.teams; - _k629 = getFirstArrayKey( _a629 ); - while ( isDefined( _k629 ) ) - { - team = _a629[ _k629 ]; - updateteamscores( team ); - _k629 = getNextArrayKey( _a629, _k629 ); - } + foreach ( team in level.teams ) + updateteamscores( team ); } _getteamscore( team ) { - return game[ "teamScores" ][ team ]; + return game["teamScores"][team]; } gethighestteamscoreteam() { - 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; + 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; } areteamarraysequal( teamsa, teamsb ) { - 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; + if ( teamsa.size != teamsb.size ) + return false; + + foreach ( team in teamsa ) + { + if ( !isdefined( teamsb[team] ) ) + return false; + } + + return true; } 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(); - 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; + 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; } 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" ) - { - 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++; - } - } + 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 ); + } + } } 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; - 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.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(); } 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; - 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 ); - } + 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 ); + } } 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_aoe_mp": - case "proximity_grenade_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_mp": + case "proximity_grenade_aoe_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 d429a9d..f3a43b6 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,951 +1,885 @@ -#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; +// 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; -timeuntilspawn( includeteamkilldelay ) //checked matches cerberus output +timeuntilspawn( includeteamkilldelay ) { - 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() //checked changed to match cerberus output +allteamshaveexisted() { - foreach ( team in level.teams ) - { - if ( !level.everexisted[ team ] ) - { - return 0; - } - } - return 1; + foreach ( team in level.teams ) + { + if ( !level.everexisted[team] ) + return false; + } + + return true; } -mayspawn() //checked partially changed to match cerberus output changed at own discretion +mayspawn() { - 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; + 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; } -timeuntilwavespawn( minimumwait ) //checked matches cerberus output +timeuntilwavespawn( minimumwait ) { - 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() //checked matches cerberus output +stoppoisoningandflareonspawn() { - 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() //checked changed to match cerberus output dvar taken from beta dump +spawnplayerprediction() { - 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 ); - } - } + 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 ); + } } -giveloadoutlevelspecific( team, class ) //checked matches cerberus output +giveloadoutlevelspecific( team, class ) { - 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() //checked matches cerberus output dvars taken from beta dump +spawnplayer() { - 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(); - /* + 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(); /# - 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 ); - 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.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", "" ); /# - if ( getDvarInt( "scr_xprate" ) > 0 ) - { - self thread maps/mp/gametypes_zm/_globallogic_score::xpratethread(); + if ( getdvarint( _hash_F8D00F60 ) > 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 ) //checked matches cerberus output +spawnspectator( origin, angles ) { - 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 ) //checked matches cerberus output +respawn_asspectator( origin, angles ) { - in_spawnspectator( origin, angles ); + in_spawnspectator( origin, angles ); } -in_spawnspectator( origin, angles ) //checked matches cerberus output +in_spawnspectator( origin, angles ) { - 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() //checked matches cerberus output +spectatorthirdpersonness() { - 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 ) //checked matches cerberus output +forcespawn( time ) { - 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() //checked matches cerberus output +kickifdontspawn() { - /* /# - 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() //checked matches cerberus output dvars taken from beta dump +kickifidontspawninternal() { - 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() ); + 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() ); } -kickwait( waittime ) //checked matches cerberus output +kickwait( waittime ) { - level endon( "game_ended" ); - maps/mp/gametypes_zm/_hostmigration::waitlongdurationwithhostmigrationpause( waittime ); + level endon( "game_ended" ); + maps\mp\gametypes_zm\_hostmigration::waitlongdurationwithhostmigrationpause( waittime ); } -spawninterroundintermission() //checked matches cerberus output +spawninterroundintermission() { - 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 ) //checked changed to match cerberus output +spawnintermission( usedefaultcallback ) { - 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 ); + 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 ); } -spawnqueuedclientonteam( team ) //checked partially changed to match cerberus output see info.md +spawnqueuedclientonteam( team ) { - 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 ]](); - } + 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 ]](); + } } -spawnqueuedclient( dead_player_team, killer ) //checked partially changed to match cerberus output see info.md +spawnqueuedclient( dead_player_team, killer ) { - 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 ); - } - } + 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 ); + } } -allteamsnearscorelimit() //checked changed to match cerberus output +allteamsnearscorelimit() { - 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; + 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; } -shouldshowrespawnmessage() //checked matches cerberus output +shouldshowrespawnmessage() { - if ( waslastround() ) - { - return 0; - } - if ( isoneround() ) - { - return 0; - } - if ( isDefined( level.livesdonotreset ) && level.livesdonotreset ) - { - return 0; - } - if ( allteamsnearscorelimit() ) - { - return 0; - } - return 1; + if ( waslastround() ) + return false; + + if ( isoneround() ) + return false; + + if ( isdefined( level.livesdonotreset ) && level.livesdonotreset ) + return false; + + if ( allteamsnearscorelimit() ) + return false; + + return true; } -default_spawnmessage() //checked matches cerberus output +default_spawnmessage() { - 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() //checked matches cerberus output +showspawnmessage() { - if ( shouldshowrespawnmessage() ) - { - self thread [[ level.spawnmessage ]](); - } + if ( shouldshowrespawnmessage() ) + self thread [[ level.spawnmessage ]](); } -spawnclient( timealreadypassed ) //checked matches cerberus output +spawnclient( timealreadypassed ) { - 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 ), 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.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(); } -waitandspawnclient( timealreadypassed ) //checked matches cerberus output +waitandspawnclient( timealreadypassed ) { - 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 ]](); + 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 ]](); } -waitrespawnorsafespawnbutton() //checked changed to match cerberus output +waitrespawnorsafespawnbutton() { - self endon( "disconnect" ); - self endon( "end_respawn" ); - while ( 1 ) - { - if ( self usebuttonpressed() ) - { - return; - } - wait 0.05; - } + self endon( "disconnect" ); + self endon( "end_respawn" ); + + while ( true ) + { + if ( self usebuttonpressed() ) + break; + + wait 0.05; + } } -waitinspawnqueue() //checked matches cerberus output +waitinspawnqueue() { - 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" ); - } + 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" ); + } } -setthirdperson( value ) //checked matches cerberus output +setthirdperson( value ) { - 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() //checked matches cerberus output +setspawnvariables() { - 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 00d91fe..868e1c3 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,544 +1,494 @@ -#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; +// 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; 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() { - 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(); - } + 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(); } teamplayercountsequal( playercounts ) { - 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; + count = undefined; + + foreach ( team in level.teams ) + { + if ( !isdefined( count ) ) + { + count = playercounts[team]; + continue; + } + + if ( count != playercounts[team] ) + return false; + } + + return true; } teamwithlowestplayercount( playercounts, ignore_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; + count = 9999; + lowest_team = undefined; + + foreach ( team in level.teams ) + { + if ( count > playercounts[team] ) + { + count = playercounts[team]; + lowest_team = team; + } + } + + 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 = ""; - 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" ] ); + 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"] ); } teamscoresequal() { - 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; + score = undefined; + + foreach ( team in level.teams ) + { + if ( !isdefined( score ) ) + { + score = getteamscore( team ); + continue; + } + + if ( score != getteamscore( team ) ) + return false; + } + + return true; } teamwithlowestscore() { - 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; + score = 99999999; + lowest_team = undefined; + + foreach ( team in level.teams ) + { + if ( score > getteamscore( team ) ) + lowest_team = team; + } + + 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() { - 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 ""; + 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 ""; } 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.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(); + 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(); } 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.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" ); - } + 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" ); + } } menuclass( response ) { - self closemenus(); + self closemenus(); } removespawnmessageshortly( delay ) { - self endon( "disconnect" ); - waittillframeend; - self endon( "end_respawn" ); - wait delay; - self clearlowermessage( 2 ); + self endon( "disconnect" ); + waittillframeend; + self endon( "end_respawn" ); + wait( delay ); + self clearlowermessage( 2.0 ); } 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 4de74a7..0350113 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,478 +1,435 @@ -#include maps/mp/gametypes_zm/_globallogic_score; -#include maps/mp/gametypes_zm/_hostmigration; -#include maps/mp/gametypes_zm/_hud_message; -#include maps/mp/_utility; +// 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; 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; - 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.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 ); + } } testshock() { - 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++; - } - } + 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; + } + } } 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; - } + 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; + } } 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; - } - i = 0; - while ( i < level.postroundevents.size ) - { - [[ level.postroundevents[ i ] ]](); - i++; - } + if ( !isdefined( level.postroundevents ) ) + return; + + for ( i = 0; i < level.postroundevents.size; i++ ) + [[ level.postroundevents[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; - 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++; + 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; + } + } + } #/ - } - } } isvalidclass( class ) { - if ( level.oldschool || sessionmodeiszombiesgame() ) - { + if ( level.oldschool || sessionmodeiszombiesgame() ) + { /# - assert( !isDefined( class ) ); + assert( !isdefined( class ) ); #/ - return 1; - } - if ( isDefined( class ) ) - { - return class != ""; - } + return 1; + } + + return isdefined( class ) && class != ""; } playtickingsound( gametype_tick_sound ) { - 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(); - } + 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(); + } } 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" ]; - } - prevtime = getTime(); - while ( game[ "state" ] == "playing" ) - { - if ( !level.timerstopped ) - { - game[ "timepassed" ] += getTime() - prevtime; - } - prevtime = getTime(); - wait 1; - } + 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; + } } 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 ) { /# - if ( !isplayer( self ) ) - { - assert( isDefined( team ) ); - } + assert( isplayer( self ) || 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 ) { /# - if ( !isplayer( self ) ) - { - assert( isDefined( team ) ); - } + assert( isplayer( self ) || 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 ) { /# - if ( !isplayer( self ) ) - { - assert( isDefined( team ) ); - } + assert( isplayer( self ) || 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 ( 1 ) - { - wait 0,1; - self playrumbleonentity( "damage_heavy" ); - } + self endon( "disconnect" ); + + while ( true ) + { + 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 0; - } - switch( smeansofdeath ) - { - case "MOD_BAYONET": - case "MOD_MELEE": - return 0; - case "MOD_IMPACT": - if ( sweapon != "knife_ballistic_mp" ) - { - return 0; - } - } - return 1; + 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; } gethitlocheight( shitloc ) { - 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; + 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; } debugline( start, end ) { /# - i = 0; - while ( i < 50 ) - { - line( start, end ); - wait 0,05; - i++; + for ( i = 0; i < 50; i++ ) + { + line( start, end ); + wait 0.05; + } #/ - } } isexcluded( entity, entitylist ) { - index = 0; - while ( index < entitylist.size ) - { - if ( entity == entitylist[ index ] ) - { - return 1; - } - index++; - } - return 0; + for ( index = 0; index < entitylist.size; index++ ) + { + if ( entity == entitylist[index] ) + return true; + } + + return false; } 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; - } - _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 ); + 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 ); } 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 9bfb41d..2880978 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,471 +1,381 @@ -#include maps/mp/gametypes_zm/_damagefeedback; -#include maps/mp/gametypes_zm/_globallogic_player; -#include maps/mp/gametypes_zm/_weapons; -#include maps/mp/_utility; +// 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; 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 ); - } - 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 ); - } - } - } - } + 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 ); + } + } + } /# - 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; - return; - } - 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; + } + 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 ) ); - } - 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.0 ) ); + + 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; - } - 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; + 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; } 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; - } - 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; + 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; } getvehicleunderneathsplashscalar( sweapon ) { - if ( sweapon == "satchel_charge_mp" ) - { - scale = 10; - scale *= 3; - } - else - { - scale = 1; - } - return scale; + if ( sweapon == "satchel_charge_mp" ) + { + scale = 10.0; + scale *= 3.0; + } + else + scale = 1.0; + + 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 0b42480..125b60c 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,995 +1,873 @@ -#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; +// 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; 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 1; - } - if ( param2 == "top3" && param1 == "first" ) - { - return 1; - } - return 0; + if ( param1 == param2 ) + return true; + + if ( param2 == "top3" && param1 == "first" ) + return true; + + return false; } 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_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; + 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; } 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; - } - 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"; + 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"; } 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; - } - 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; + 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; } 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; - } - 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; + 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; } 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 = []; - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( player.pers[ "team" ] == team ) - { - playersonteam[ playersonteam.size ] = player; - } - i++; - } - return playersonteam; + playersonteam = []; + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + + if ( player.pers["team"] == team ) + playersonteam[playersonteam.size] = player; + } + + 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 ) { - if ( isDefined( rule.params ) && isarray( rule.params ) ) - { - return rule.params.size > 0; - } + return isdefined( rule.params ) && isarray( rule.params ) && rule.params.size > 0; } sortplayersbylivesdescending( players ) { - 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--; + if ( !isdefined( players ) ) + return undefined; - } - return players; + 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; } giveammo( players, 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++; - } + 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 ); + } } 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 ); - targetindex = 0; - while ( targetindex < targets.size ) - { - targets[ targetindex ].pers[ "hasRadar" ] = 1; - targets[ targetindex ].hasspyplane = 1; - targetindex++; - } + targets = gettargetsforgametypeeventrule( rule ); + + for ( targetindex = 0; targetindex < targets.size; targetindex++ ) + { + targets[targetindex].pers["hasRadar"] = 1; + targets[targetindex].hasspyplane = 1; + } } givescore( players, 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++; - } + 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 ); + } } 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 ); - 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++; - } + 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] ); + } } dosetsubheader( rule ) { - 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++; - } + 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] ); + } } 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 ); - targetindex = 0; - while ( targetindex < targets.size ) - { - thread announcemessage( targets[ targetindex ], rule.params[ 0 ], 2 ); - targetindex++; - } + if ( !doesrulehavevalidparam( rule ) ) + return; + + targets = gettargetsforgametypeeventrule( rule ); + + for ( targetindex = 0; targetindex < targets.size; targetindex++ ) + thread announcemessage( targets[targetindex], rule.params[0], 2.0 ); } announcemessage( target, messagetext, time ) { - target endon( "disconnect" ); - clientannouncement( target, messagetext, int( time * 1000 ) ); - if ( time == 0 ) - { - time = getDvarFloat( #"E8C4FC20" ); - } - target.doingnotify = 1; - wait time; - target.doingnotify = 0; + target endon( "disconnect" ); + clientannouncement( target, messagetext, int( time * 1000 ) ); + + if ( time == 0 ) + time = getdvarfloat( _hash_E8C4FC20 ); + + target.doingnotify = 1; + wait( time ); + target.doingnotify = 0; } givehealth( players, amount ) { - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - player.health += amount; - i++; - } + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + player.health += amount; + } } 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 ); - targetindex = 0; - while ( targetindex < targets.size ) - { - player = targets[ targetindex ]; - player.regenrate = rule.params[ 0 ]; - targetindex++; - } + targets = gettargetsforgametypeeventrule( rule ); + + for ( targetindex = 0; targetindex < targets.size; targetindex++ ) + { + player = targets[targetindex]; + player.regenrate = rule.params[0]; + } } 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 ); - 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++; - } + 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" ); + } } displayperk( player, imagename ) { - 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(); + 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(); } setorunsetperk( players, perks, shouldset ) { - 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++; - } + 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 ); + } } 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 ) { - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - player.pers[ "lives" ] += amount; - if ( player.pers[ "lives" ] < 0 ) - { - player.pers[ "lives" ] = 0; - } - i++; - } + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + player.pers["lives"] += amount; + + if ( player.pers["lives"] < 0 ) + player.pers["lives"] = 0; + } } 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 ) { - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - i++; - } + for ( i = 0; i < players.size; i++ ) + player = players[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 ); - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - player.damagemodifier = rule.params[ 0 ]; - i++; - } + if ( !doesrulehavevalidparam( rule ) ) + return; + + players = gettargetsforgametypeeventrule( rule ); + + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + player.damagemodifier = rule.params[0]; + } } doscalemovespeed( rule ) { - 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++; - } + 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 ); + } } doshowonradar( rule ) { - 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++; - } + 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" ); + } } 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 6e75ac6..6dff600 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_healthoverlay.gsc @@ -1,276 +1,280 @@ -#include maps/mp/gametypes/_globallogic_player; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\gametypes_zm\_globallogic_player; -init() //checked matches cerberus output +init() { - 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() //checked matches cerberus output +onplayerconnect() { - 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() //checked matches cerberus output +onjoinedteam() { - 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() //checked matches cerberus output +onjoinedspectators() { - 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() //checked matches cerberus output +onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self thread playerhealthregen(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self thread playerhealthregen(); + } } -onplayerkilled() //checked matches cerberus output +onplayerkilled() { - 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() //checked matches cerberus output +onplayerdisconnect() { - self waittill( "disconnect" ); - self notify( "end_healthregen" ); + self waittill( "disconnect" ); + + self notify( "end_healthregen" ); } -playerhealthregen() //checked changed to match cerberus output +playerhealthregen() { - 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; - } - 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; - } + 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; + } } -decayplayerdamages( decay ) //checked partially changed to match cerberus output //continues in for loops bad see github for more info +decayplayerdamages( decay ) { - 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++; - } + 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; + } } -playerbreathingsound( healthcap ) //checked changed to match cerberus output +playerbreathingsound( healthcap ) { - 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 ) ); - } + 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 ) ); + } } -playerheartbeatsound( healthcap ) //checked changed to match cerberus output +playerheartbeatsound( healthcap ) { - 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; - } - } -} + 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; + } +} 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 2fdd0a0..29a7b9d 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hostmigration.gsc @@ -1,571 +1,516 @@ -#include maps/mp/gametypes_zm/_hud; -#include maps/mp/gametypes_zm/_hud_util; -#include common_scripts/utility; -#include maps/mp/_utility; +// 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; -debug_script_structs() //dev call did not check +debug_script_structs() { - /* /# - 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." ); + 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." ); #/ - */ } -updatetimerpausedness() //checked matches cerberus output +updatetimerpausedness() { - 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() //checked matches cerberus output +callback_hostmigrationsave() { + } -callback_prehostmigrationsave() //checked matches cerberus output +callback_prehostmigrationsave() { - 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() //checked matches cerberus output +pausetimer() { - level.migrationtimerpausetime = getTime(); + level.migrationtimerpausetime = gettime(); } -resumetimer() //checked matches cerberus output +resumetimer() { - level.discardtime += getTime() - level.migrationtimerpausetime; + level.discardtime += gettime() - level.migrationtimerpausetime; } -locktimer() //checked matches cerberus output +locktimer() { - 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() //checked changed to match cerberus output +callback_hostmigration() { - 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" ); -} + redo_link_changes(); + setslowmotion( 1, 1, 0 ); + makedvarserverinfo( "ui_guncycle", 0 ); + level.hostmigrationreturnedplayercount = 0; -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; - } - /* + if ( level.gameended ) + { /# - assert( duration > 0 ); + println( "Migration starting at time " + gettime() + ", but game has ended, so no countdown." ); #/ - */ - starttime = getTime(); - endtime = getTime() + ( duration * 1000 ); - while ( getTime() < endtime ) - { - waittillhostmigrationstarts( ( endtime - getTime() ) / 1000 ); - if ( isDefined( level.hostmigrationtimer ) ) - { - timepassed = waittillhostmigrationdone(); - endtime += timepassed; - } - } - /* + 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" ); /# - if ( getTime() != endtime ) - { - println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO endtime = " + endtime ); + println( "Migration starting at time " + gettime() ); #/ - } - */ - waittillhostmigrationdone(); - return getTime() - starttime; + 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" ); } -waitlongdurationwithhostmigrationpauseemp( duration ) //checked matches cerberus output may need to check order of operations +post_migration_become_vulnerable() { - if ( duration == 0 ) - { - return; - } - /* -/# - assert( duration > 0 ); -#/ - */ - 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; - } - } - } - /* -/# - if ( getTime() != empendtime ) - { - println( "SCRIPT WARNING: gettime() = " + getTime() + " NOT EQUAL TO empendtime = " + empendtime ); -#/ - } - */ - waittillhostmigrationdone(); - level.empendtime = undefined; - return getTime() - starttime; + self endon( "disconnect" ); + wait 3; + self disableinvulnerability(); } -waitlongdurationwithgameendtimeupdate( duration ) //checked matches cerberus output may need to check order of operations +matchstarttimerconsole_internal( counttime, matchstarttimer ) { - 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; + 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 ); + } } -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 +matchstarttimerconsole( type, duration ) { - 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; + 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(); } -hostmigration_put_player_in_better_place() //checked changed to match cerberus output +hostmigrationwait() { - 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 ); - } + 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; +/# + println( "Linking player to ent " + self._host_migration_link_entity.targetname ); +#/ + } + + self.hostmigrationcontrolsfrozen = 1; + self freezecontrols( 1 ); + + level waittill( "host_migration_end" ); +} + +hostmigrationtimerthink() +{ + 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() +{ + 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; +/# + assert( duration > 0 ); +#/ + 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; +} + +waitlongdurationwithgameendtimeupdate( duration ) +{ + 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; +} + +find_alternate_player_place( v_origin, min_radius, max_radius, max_height, ignore_targetted_nodes ) +{ + 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; +} + +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 80198e4..bb49ab9 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_hud.gsc @@ -1,161 +1,160 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked changed to match cerberus output +init() { - 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() //checked matches cerberus output +fontpulseinit() { - 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 ) //checked matches cerberus output +fontpulse( player ) { - 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 ) //checked matches cerberus output +fadetoblackforxsec( startwait, blackscreenwait, fadeintime, fadeouttime, shadername, n_sort ) { - 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; - } -} + 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; + } +} 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 2425d13..255f6ba 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,1359 +1,1253 @@ -#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; +// 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; 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; - 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.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; } 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; - i = 0; - while ( i < players.size ) - { - players[ i ] notifymessage( notifydata ); - i++; - } + notifydata = spawnstruct(); + notifydata.notifytext = hinttext; + notifydata.duration = duration; + + for ( i = 0; i < players.size; i++ ) + players[i] notifymessage( notifydata ); } 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; - 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 = []; + 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 = []; } 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" ); - 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; + 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; } 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" ]; - 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 ); + 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 ); } teamoutcomenotifyzombie( winner, isround, endreasontext ) { - 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 ); + 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 ); } 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; - 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 ); + 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 ); } 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; - 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; - } + 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; + } } 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; - 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 ); + 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 ); } 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 ); - 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 ); - } - } + 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 ); + } } resetwageroutcomenotify( playernamehudelems, playercphudelems, outcometitle, outcometext ) { - self endon( "disconnect" ); - self waittill( "reset_outcome" ); - i = playernamehudelems.size - 1; - while ( i >= 0 ) - { - if ( isDefined( playernamehudelems[ i ] ) ) - { - playernamehudelems[ i ] destroy(); - } - i--; + self endon( "disconnect" ); - } - i = playercphudelems.size - 1; - while ( i >= 0 ) - { - if ( isDefined( playercphudelems[ i ] ) ) - { - playercphudelems[ i ] destroy(); - } - i--; + self waittill( "reset_outcome" ); - } - if ( isDefined( outcometext ) ) - { - outcometext destroy(); - } - if ( isDefined( outcometitle ) ) - { - outcometitle destroy(); - } + 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(); } updateoutcome( firsttitle, secondtitle, thirdtitle ) { - 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; - } - } - } + 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; + } } updatewageroutcome( playernamehudelems, playercphudelems ) { - 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++; - } - } + 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; + } + } } 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 16b74f2..189914b 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,1152 +1,1072 @@ -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#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; - } - 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; + } + + self.children[self.children.size - 1] = undefined; + 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 "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: + 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: /# - 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 "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: + 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: /# - 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, 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; + 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; } 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, 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; + 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; } 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, 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; + 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; } 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, 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; + 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; } 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 ( 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; - } - } + 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; + } + } } destroyelem() { - 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(); + 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(); } 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() { - index = 0; - while ( index < self.children.size ) - { - child = self.children[ index ]; - child setpoint( child.point, child.relativepoint, child.xoffset, child.yoffset ); - index++; - } + for ( index = 0; index < self.children.size; index++ ) + { + child = self.children[index]; + child setpoint( child.point, child.relativepoint, child.xoffset, child.yoffset ); + } } 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 c6a8a1c..e68c67c 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_menus.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_menus.gsc @@ -1,167 +1,174 @@ -#include maps/mp/gametypes_zm/_rank; -#include maps/mp/gametypes_zm/_globallogic; -#include maps/mp/_utility; +// 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; -init() //checked changed to match cerberus output +init() { - 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() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onmenuresponse(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onmenuresponse(); + } } -onmenuresponse() //checked changed to match cerberus output +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 ( 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 ); - } - } - } -} + 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 ); + } + } +} 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 a95a168..eac9f10 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_perplayer.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_perplayer.gsc @@ -1,185 +1,179 @@ -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; -init( id, playerbegincallback, playerendcallback ) //checked matches cerberus output +init( id, playerbegincallback, playerendcallback ) { - 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 ) //checked partially changed to match cerberus output didn't change while loop to for loop to prevent infinite loop continue bug +enable( 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++; - } + 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 ); + } } -onplayerconnect( handler ) //checked matches cerberus output +disable( handler ) { - 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 ); - } + 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 ); + } } -onplayerdisconnect( handler ) //checked changed to match cerberus output +onplayerconnect( 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 ); + 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 ); + } } -onjoinedteam( handler ) //checked matches cerberus output +onplayerdisconnect( handler ) { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_team" ); - self thread unhandleplayer( handler, 1, 0 ); - } + 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 ); } -onjoinedspectators( handler ) //checked matches cerberus output +onjoinedteam( handler ) { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_spectators" ); - self thread unhandleplayer( handler, 1, 0 ); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_team" ); + + self thread unhandleplayer( handler, 1, 0 ); + } } -onplayerspawned( handler ) //checked matches cerberus output +onjoinedspectators( handler ) { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self thread handleplayer( handler ); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_spectators" ); + + self thread unhandleplayer( handler, 1, 0 ); + } } -onplayerkilled( handler ) //checked matches cerberus output +onplayerspawned( handler ) { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "killed_player" ); - self thread unhandleplayer( handler, 1, 0 ); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self thread handleplayer( handler ); + } } -handleplayer( handler ) //checked matches cerberus output +onplayerkilled( handler ) { - 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 ]](); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "killed_player" ); + + self thread unhandleplayer( handler, 1, 0 ); + } } -unhandleplayer( handler, unsetready, disconnected ) //checked matches cerberus output +handleplayer( handler ) { - 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 ); + 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 ]](); } +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 9ff2831..8b412b7 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_scoreboard.gsc @@ -1,25 +1,27 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - 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 cb34b8a..ff5002b 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_serversettings.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_serversettings.gsc @@ -1,202 +1,191 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked matches cerberus output +init() { - 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() //checked matches cerberus output +updateserversettings() { - 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 ) //checked partially changed to match cerberus output did not change while loop to for for loop because of infinite loop caused by continues +constraingametype( gametype ) { - 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++; - } + 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(); + } + } } -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 +constrainmapsize( mapsize ) { - 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++; - } -} + 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(); + } + } +} 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 c718e80..31ded74 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_shellshock.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_shellshock.gsc @@ -1,65 +1,56 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\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 ce29a09..62459dc 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawning.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawning.gsc @@ -1,1073 +1,957 @@ -#include maps/mp/gametypes_zm/_spawnlogic; -#include common_scripts/utility; -#include maps/mp/_utility; +// 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; init() { - 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" ); + 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" ); /# - 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; - _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; + 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; } 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 ( 1 ) - { - self waittill( "joined_team" ); - self player_influencers_set_team(); - wait 0,05; - } + self endon( "disconnect" ); + level endon( "game_ended" ); + + while ( true ) + { + self waittill( "joined_team" ); + + self player_influencers_set_team(); + wait 0.05; + } } ongrenadethrow() { - 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; - } + 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; + } } 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 ) ); #/ /# - if ( level.teambased ) - { - assert( !isDefined( self.influencer_friendly_sphere ) ); - } + assert( !level.teambased || !isdefined( self.influencer_friendly_sphere ) ); #/ /# - if ( level.teambased ) - { - assert( !isDefined( self.influencer_friendly_cylinder ) ); - } + assert( !level.teambased || !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, 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 ); - } + 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 ); } 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; - } - 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.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(); } 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 * 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.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 ); } 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, 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 ); + 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 ); } create_vehicle_influencers() { - 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 ); + 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 ); } 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" ); - 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++; - } + 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 ); + } } 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() { - _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(); + 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(); } initialize_player_spawning_dvars() { /# - reset_dvars = 1; - while ( 1 ) - { - get_player_spawning_dvars( reset_dvars ); - reset_dvars = 0; - wait 2; + reset_dvars = 1; + + while ( true ) + { + 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 * 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 ); + 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 ); } 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; - } - 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; } 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; - _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 ]; + 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]; + } } 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 ); - 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; + 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; } is_hardcore() { - if ( isDefined( level.hardcoremode ) ) - { - return level.hardcoremode; - } + return isdefined( level.hardcoremode ) && level.hardcoremode; } teams_have_enmity( team1, team2 ) { - if ( isDefined( team1 ) || !isDefined( team2 ) && level.gametype == "dm" ) - { - return 1; - } - if ( team1 != "neutral" && team2 != "neutral" ) - { - return team1 != team2; - } + if ( !isdefined( team1 ) || !isdefined( team2 ) || level.gametype == "dm" ) + return 1; + + return team1 != "neutral" && team2 != "neutral" && 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"; - 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++; - } + 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 ); + } } delete_all_spawns( spawnpoints ) { - i = 0; - while ( i < spawnpoints.size ) - { - spawnpoints[ i ] delete(); - i++; - } + for ( i = 0; i < spawnpoints.size; i++ ) + spawnpoints[i] delete(); } spawn_point_class_name_being_used( name ) { - 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; + 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; } codecallback_updatespawnpoints() { - _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(); + foreach ( team in level.teams ) + maps\mp\gametypes_zm\_spawnlogic::rebuildspawnpoints( team ); + + 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 ba21d0f..f69cdc5 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spawnlogic.gsc @@ -1,2496 +1,2160 @@ -#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; +// 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; onplayerconnect() { - for ( ;; ) - { - level waittill( "connected", player ); - } + for (;;) + level waittill( "connected", player ); } findboxcenter( mins, maxs ) { - center = ( -1, -1, -1 ); - center = maxs - mins; - center = ( center[ 0 ] / 2, center[ 1 ] / 2, center[ 2 ] / 2 ) + mins; - return center; + center = ( 0, 0, 0 ); + 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 = []; - } - 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 ) - { + 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 ) + { /# - 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() { - _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; + foreach ( team in level.teams ) + level.teamspawnpoints[team] = []; + + 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 ] = []; - index = 0; - while ( index < level.spawn_point_team_class_names[ team ].size ) - { - addspawnpointsinternal( team, level.spawn_point_team_class_names[ team ][ index ] ); - index++; - } + 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] ); } 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; - } - index = 0; - while ( index < spawnpoints.size ) - { - spawnpoints[ index ] spawnpointinit(); + maps\mp\gametypes_zm\_callbacksetup::abortlevel(); + wait 1; + return; + } + + for ( index = 0; index < spawnpoints.size; index++ ) + { + 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; - } - index = 0; - while ( index < spawnpoints.size ) - { - spawnpoints[ index ] placespawnpoint(); - index++; - } + return; + } + + for ( index = 0; index < spawnpoints.size; index++ ) + spawnpoints[index] placespawnpoint(); } 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; - } - i = 0; - while ( i < level.extraspawnpoints[ classname ].size ) - { - spawnpoints[ spawnpoints.size ] = level.extraspawnpoints[ classname ][ i ]; - i++; - } - return spawnpoints; + 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; } 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( ( -1, -1, -1 ), 50 ); - 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( ( 0, 0, 1 ), 50.0 ); + 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 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 ); + 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 ); /# - 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; - 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(); + 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(); /# - 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(); - try++; - } + bestspawnpoint.weight -= penalty; + bestspawnpoint.lastsighttracetime = gettime(); + } } checkbad( spawnpoint ) { /# - 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++; + 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 ); + } #/ - } } badspawnline( start, end, name1, name2 ) { /# - 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++; + 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; + } #/ - } } 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 ); - 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; + 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; #/ } 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 ( 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 ); + 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 ); #/ } drawspawndata() { /# - 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; + 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; + } #/ - } } 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 ( -1, -1, -1 ); - } - return ( int( parts[ 0 ] ), int( parts[ 1 ] ), int( parts[ 2 ] ) ); + parts = strtok( str, "/" ); + + if ( parts.size != 3 ) + return ( 0, 0, 0 ); + + return ( int( parts[0] ), int( parts[1] ), int( parts[2] ) ); #/ } getspawnpoint_random( spawnpoints ) { - 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 ); + 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 ); } getallotherplayers() { - 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; + 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; } getallalliedandenemyplayers( obj ) { - if ( level.teambased ) - { + if ( level.teambased ) + { /# - assert( isDefined( level.teams[ self.team ] ) ); + assert( isdefined( level.teams[self.team] ) ); #/ - 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; + 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; + } } initweights( spawnpoints ) { - i = 0; - while ( i < spawnpoints.size ) - { - spawnpoints[ i ].weight = 0; - i++; - } + for ( i = 0; i < spawnpoints.size; i++ ) + spawnpoints[i].weight = 0; /# - while ( level.storespawndata || level.debugspawning ) - { - i = 0; - while ( i < spawnpoints.size ) - { - spawnpoints[ i ].spawndata = []; - spawnpoints[ i ].sightchecks = []; - i++; + if ( level.storespawndata || level.debugspawning ) + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + spawnpoints[i].spawndata = []; + spawnpoints[i].sightchecks = []; + } + } #/ - } - } } spawnpointupdate_zm( spawnpoint ) { - _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 ); - } + 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; + } + } } 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; - 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 ( 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 ( 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; #/ - } - i++; - continue; - } - else - { - spawnpoint.weight = 0; + continue; + } + + 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"; #/ - } - } - 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 ( 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 ); /# - 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; - 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 ); + 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 ); } 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; - 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 ); + 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 ); } 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 = ( -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" ); - } + 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" ); /# - 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 ( 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" ); + 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" ); + } #/ - } } spawnprofile() { /# - 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; + 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; + } #/ - } } spawngraphcheck() { /# - while ( 1 ) - { - while ( getDvarInt( #"C25B6B47" ) < 1 ) - { - wait 3; - } - thread spawngraph(); - return; + while ( true ) + { + if ( getdvarint( _hash_C25B6B47 ) < 1 ) + { + wait 3; + continue; + } + + 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; - 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; + 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; + } #/ - } } drawspawngraph( fakespawnpoints, w, h, weightscale ) { /# - 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++; + 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++; + } + } #/ - } } 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 ( 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; - } + 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; + } #/ - } } allowspawndatareading() { /# - 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(); + 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(); + } #/ - } } showdeathsdebug() { /# - 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; + 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; + } #/ - } } updatedeathinfodebug() { - while ( 1 ) - { - while ( getDvar( "scr_spawnpointdebug" ) == "0" ) - { - wait 3; - } - updatedeathinfo(); - wait 3; - } + while ( true ) + { + if ( getdvar( "scr_spawnpointdebug" ) == "0" ) + { + wait 3; + continue; + } + + 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 ( 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; + 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; + } #/ - } } profiledebug() { - 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; - } + 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; + } } debugnearbyplayers( players, origin ) { /# - 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; + 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; + } #/ - } } deathoccured( dier, killer ) { + } checkforsimilardeaths( deathinfo ) { - 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++; - } + 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; + } + } } updatedeathinfo() { - 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++; - } + 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]; + } } ispointvulnerable( playerorigin ) { - 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; + 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; } avoidweapondamage( spawnpoints ) { - 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 ( 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 ( 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 ( 1 ) - { - wait 0,05; - if ( !isDefined( level.spawnpoints ) ) - { - return; - } - spawnpointindex = ( spawnpointindex + 1 ) % level.spawnpoints.size; - spawnpoint = level.spawnpoints[ spawnpointindex ]; - spawnpointupdate( spawnpoint ); - } + spawnpointindex = 0; + + while ( true ) + { + 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; - _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; + value = 0; + + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + value += sums[team]; + } + + return value; } getnonteammindist( skip_team, mindists ) { - 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; + dist = 9999999; + + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + if ( dist > mindists[team] ) + dist = mindists[team]; + } + + return dist; } spawnpointupdate( spawnpoint ) { - 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; + 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; /# - debug = getDvarInt( "scr_spawnpointdebug" ) > 0; + debug = getdvarint( "scr_spawnpointdebug" ) > 0; #/ - 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++; - } + 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++; /# - if ( debug ) - { - line( player.origin + vectorScale( ( -1, -1, -1 ), 50 ), spawnpoint.sighttracepoint, ( 0,5, 1, 0,5 ) ); + if ( debug ) + line( player.origin + vectorscale( ( 0, 0, 1 ), 50.0 ), spawnpoint.sighttracepoint, ( 0.5, 1, 0.5 ) ); #/ - } - } - } - 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" ]; + } + } + + 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"]; + } } getlospenalty() { - if ( getDvar( #"CACDB8AA" ) != "" && getDvar( #"CACDB8AA" ) != "0" ) - { - return getDvarFloat( #"CACDB8AA" ); - } - return 100000; + if ( getdvar( _hash_CACDB8AA ) != "" && getdvar( _hash_CACDB8AA ) != "0" ) + return getdvarfloat( _hash_CACDB8AA ); + + return 100000; } lastminutesighttraces( spawnpoint ) { - 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; + 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; } avoidvisibleenemies( spawnpoints, teambased ) { - 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 ( 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 ( 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; + } #/ - } - } - 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; + } + } + else + { + for ( i = 0; i < spawnpoints.size; i++ ) + { + if ( !isdefined( spawnpoints[i].enemysights ) ) + continue; + + 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; + } #/ - } - } - 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; + } + + 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; /# - 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( #"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 ( 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 ( 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; - } - i++; - continue; - } - else - { - spawnpoint.lastspawnedplayer = undefined; - } - } - } - i++; - } + } + else + spawnpoint.lastspawnedplayer = undefined; + + continue; + } + + spawnpoint.lastspawnedplayer = undefined; + } } avoidsamespawn( spawnpoints ) { - 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 ( 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 ( 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"; #/ - } - return; - } - else - { - i++; - } - } + break; + } + } } 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 0752b8d..adeb9fa 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spectating.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_spectating.gsc @@ -1,251 +1,228 @@ +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool -init() //checked changed to match cerberus output +init() { - 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() //checked matches cerberus output +onplayerconnect() { - 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() //checked matches cerberus output +onplayerspawned() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "spawned_player" ); - self setspectatepermissions(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "spawned_player" ); + + self setspectatepermissions(); + } } -onjoinedteam() //checked matches cerberus output +onjoinedteam() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_team" ); - self setspectatepermissionsformachine(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_team" ); + + self setspectatepermissionsformachine(); + } } -onjoinedspectators() //checked matches cerberus output +onjoinedspectators() { - self endon( "disconnect" ); - for ( ;; ) - { - self waittill( "joined_spectators" ); - self setspectatepermissionsformachine(); - } + self endon( "disconnect" ); + + for (;;) + { + self waittill( "joined_spectators" ); + + self setspectatepermissionsformachine(); + } } -updatespectatesettings() //checked changed to match cerberus output +updatespectatesettings() { - 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() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +getsplitscreenteam() { - 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; + 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; } -otherlocalplayerstillalive() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +otherlocalplayerstillalive() { - 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; + 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; } -allowspectateallteams( allow ) //checked changed to match cerberus output +allowspectateallteams( allow ) { - foreach ( team in level.teams ) - { - self allowspectateteam( team, allow ); - } + foreach ( team in level.teams ) + self allowspectateteam( team, allow ); } -allowspectateallteamsexceptteam( skip_team, allow ) //checked partially changed to match cerberus output did not use continue in foreach see github for more info +allowspectateallteamsexceptteam( skip_team, allow ) { - foreach ( team in level.teams ) - { - if ( team == skip_team ) - { - } - else - { - self allowspectateteam( team, allow ); - } - } + foreach ( team in level.teams ) + { + if ( team == skip_team ) + continue; + + self allowspectateteam( team, allow ); + } } -setspectatepermissions() //checked changed to match cerberus output +setspectatepermissions() { - 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() //checked partially changed to match cerberus output did not change while loop to for loop see github for more info +setspectatepermissionsformachine() { - 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++; - } -} + 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(); + } +} 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 307f7a6..13f1269 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_tweakables.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_tweakables.gsc @@ -1,401 +1,382 @@ -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; -gettweakabledvarvalue( category, name ) //checked matches cerberus output +gettweakabledvarvalue( category, name ) { - 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 ) //checked matches cerberus output +gettweakabledvar( category, name ) { - 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 ) //checked matches cerberus output +gettweakablevalue( category, name ) { - 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 ) //checked matches cerberus output +gettweakablelastvalue( category, name ) { - 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 ) //checked matches cerberus output +settweakablevalue( category, name, 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 ); + 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 ) //checked changed to match cerberus output +settweakablelastvalue( category, name, value ) { - 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 ) //checked matches cerberus output +registertweakable( category, name, dvar, value ) { - 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() //checked matches cerberus output +init() { - 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 ) //checked matches cerberus output +setclienttweakable( category, name ) { - level.clienttweakables[ level.clienttweakables.size ] = name; + level.clienttweakables[level.clienttweakables.size] = name; } -updateuitweakables() //checked changed to match cerberus output +updateuitweakables() { - 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; - } + 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; + } } -updateserverdvar( dvar, value ) //checked matches cerberus output +updateserverdvar( dvar, value ) { - 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 3d9b204..d4dd932 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,124 +1,111 @@ -#include maps/mp/killstreaks/_killstreaks; -#include maps/mp/_utility; -#include common_scripts/utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include common_scripts\utility; +#include maps\mp\_utility; -isgrenadelauncherweapon( weapon ) //checked matches cerberus output +isgrenadelauncherweapon( weapon ) { - if ( getsubstr( weapon, 0, 3 ) == "gl_" ) - { - return 1; - } - switch( weapon ) - { - case "china_lake_mp": - case "xm25_mp": - return 1; - default: - return 0; - } + if ( getsubstr( weapon, 0, 3 ) == "gl_" ) + return true; + + switch ( weapon ) + { + case "xm25_mp": + case "china_lake_mp": + return true; + default: + return false; + } } -isdumbrocketlauncherweapon( weapon ) //checked matches cerberus output +isdumbrocketlauncherweapon( weapon ) { - switch( weapon ) - { - case "m220_tow_mp": - case "rpg_mp": - return 1; - default: - return 0; - } + switch ( weapon ) + { + case "rpg_mp": + case "m220_tow_mp": + return true; + default: + return false; + } } -isguidedrocketlauncherweapon( weapon ) //checked matches cerberus output +isguidedrocketlauncherweapon( weapon ) { - switch( weapon ) - { - case "fhj18_mp": - case "javelin_mp": - case "m202_flash_mp": - case "m72_law_mp": - case "smaw_mp": - return 1; - default: - return 0; - } + switch ( weapon ) + { + case "smaw_mp": + case "m72_law_mp": + case "m202_flash_mp": + case "javelin_mp": + case "fhj18_mp": + return true; + default: + return false; + } } -isrocketlauncherweapon( weapon ) //checked matches cerberus output +isrocketlauncherweapon( weapon ) { - if ( isdumbrocketlauncherweapon( weapon ) ) - { - return 1; - } - if ( isguidedrocketlauncherweapon( weapon ) ) - { - return 1; - } - return 0; + if ( isdumbrocketlauncherweapon( weapon ) ) + return true; + + if ( isguidedrocketlauncherweapon( weapon ) ) + return true; + + return false; } -islauncherweapon( weapon ) //checked matches cerberus output +islauncherweapon( weapon ) { - if ( isrocketlauncherweapon( weapon ) ) - { - return 1; - } - if ( isgrenadelauncherweapon( weapon ) ) - { - return 1; - } - return 0; + if ( isrocketlauncherweapon( weapon ) ) + return true; + + if ( isgrenadelauncherweapon( weapon ) ) + return true; + + return false; } isreducedteamkillweapon( weapon ) { - switch( weapon ) - { - case "planemortar_mp": - return 1; - default: - return 0; - } + switch ( weapon ) + { + case "planemortar_mp": + return true; + default: + return false; + } } -ishackweapon( weapon ) //checked matches cerberus output +ishackweapon( weapon ) { - return 0; + return 0; } -ispistol( weapon ) //checked changed at own discretion +ispistol( weapon ) { - if ( isDefined( level.side_arm_array[ weapon ] ) ) - { - return 1; - } - return 0; + return isdefined( level.side_arm_array[weapon] ); } -isflashorstunweapon( weapon ) //checked matches cerberus output +isflashorstunweapon( weapon ) { - 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; + 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; } -isflashorstundamage( weapon, meansofdeath ) //checked changed at own discretion +isflashorstundamage( weapon, meansofdeath ) { - if ( ( meansofdeath == "MOD_GAS" || meansofdeath == "MOD_GRENADE_SPLASH" ) && isflashorstunweapon( weapon ) ) - { - return 1; - } - return 0; + return isflashorstunweapon( weapon ) && ( meansofdeath == "MOD_GRENADE_SPLASH" || meansofdeath == "MOD_GAS" ); } - - 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 8953fc5..7e286a5 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weaponobjects.gsc @@ -1,2435 +1,2203 @@ -#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; +// 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; 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 ); - 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; + 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; } getwatchernames( weapons ) { - 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; + names = []; + + foreach ( index, weapon in weapons ) + names[index] = getsubstr( weapon, 0, weapon.size - 3 ); + + 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; - _a199 = self.weaponobjectwatcherarray; - _k199 = getFirstArrayKey( _a199 ); - while ( isDefined( _k199 ) ) - { - watcher = _a199[ _k199 ]; - resetweaponobjectwatcher( watcher, team ); - _k199 = getNextArrayKey( _a199, _k199 ); - } + if ( !isdefined( self.weaponobjectwatcherarray ) ) + return undefined; + + team = self.team; + + foreach ( watcher in self.weaponobjectwatcherarray ) + resetweaponobjectwatcher( watcher, team ); } createbasewatchers() { - _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 ); - } + 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 ); } setupretrievablewatcher() { - 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++; - } + 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; + } } 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() { - prevorigin = self.origin; - while ( 1 ) - { - wait 0,15; - if ( self.origin == prevorigin && !self isstunned() ) - { - return; - } - else - { - prevorigin = self.origin; - } - } + for ( prevorigin = self.origin; 1; prevorigin = self.origin ) + { + wait 0.15; + + if ( self.origin == prevorigin && !self isstunned() ) + break; + } } 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() { - while ( isDefined( self.objectarray ) ) - { - i = 0; - while ( i < self.objectarray.size ) - { - if ( isDefined( self.objectarray[ i ] ) ) - { - self.objectarray[ i ] delete(); - } - i++; - } - } - self.objectarray = []; + if ( isdefined( self.objectarray ) ) + { + for ( i = 0; i < self.objectarray.size; i++ ) + { + if ( isdefined( self.objectarray[i] ) ) + self.objectarray[i] delete(); + } + } + + 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, 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 ); + 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 ); } detonateweaponobjectarray( forcedetonation, weapon ) { - 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; + 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; } 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; - 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; + 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; } weaponobjectdamage( watcher ) { - 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 ); - } - } + 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 ); } 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 ( 1 ) - { - self waittill( "damage", damage, attacker ); - if ( isDefined( attacker ) && isplayer( attacker ) && attacker != owner ) - { - self.playdialog = 1; - continue; - } - else - { - self.playdialog = 0; - } - } + 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; + } } 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 ); - } - 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.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" ); } 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; - } - watcher = 0; - while ( watcher < self.weaponobjectwatcherarray.size ) - { - if ( self.weaponobjectwatcherarray[ watcher ].name == name ) - { - return self.weaponobjectwatcherarray[ watcher ]; - } - watcher++; - } - return undefined; + 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; } getweaponobjectwatcherbyweapon( weapon ) { - 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; + 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; } 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( #"38868733" ) ) - { - self thread proximityweaponobjectdebug( watcher ); + if ( getdvarint( "scr_weaponobject_debug" ) ) + 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 ( 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 ); - } - } - } - } + 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 ); + } } watchweaponprojectileobjectspawn() { - 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 ); - } - } - } + 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 ); + } + } } proximityweaponobjectdebug( watcher ) { /# - self waittillnotmoving(); - self thread showcone( acos( watcher.detectiondot ), watcher.detonateradius, ( 1, 0,85, 0 ) ); - self thread showcone( 60, 256, ( 0, 0, 1 ) ); + self waittillnotmoving(); + self thread showcone( acos( watcher.detectiondot ), watcher.detonateradius, ( 1, 0.85, 0 ) ); + self thread showcone( 60, 256, ( 1, 0, 0 ) ); #/ } 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 ( 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; + 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; + } #/ - } } 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(); - 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++; - } - } - } + 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; + } + } } 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, 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 ), 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; - } - 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" ); - } + 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 ); /# + #/ - 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; - } - } + 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; + } } ishacked() { - if ( isDefined( self.hacked ) ) - { - return self.hacked; - } + return isdefined( self.hacked ) && 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; - } - 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; + 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; } canhack( player, owner, weapon_check ) { - 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; + 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; } hackerremoveweapon( weapon ) { - 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++; - } + 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; + } } 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 ( 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 ]](); + 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 ]](); } shouldaffectweaponobject( object, watcher ) { - 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; + 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; } 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 ( 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; - } + 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; + } } watchweaponobjectaltdetonation() { - 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++; - } - } + 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 ); + } + } } watchweaponobjectaltdetonate() { - 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; - } - } + 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; + } } watchweaponobjectdetonation() { - 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 ); - } - } + 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 ); + } } deleteweaponobjectson() { - 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; - } - } + 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; + } } saydamaged( orig, amount ) { /# - i = 0; - while ( i < 60 ) - { - print3d( orig, "damaged! " + amount ); - wait 0,05; - i++; + for ( i = 0; i < 60; i++ ) + { + print3d( orig, "damaged! " + amount ); + wait 0.05; + } #/ - } } showheadicon( trigger ) { - 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; + 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; } friendlyfirecheck( owner, attacker, forcedfriendlyfirerule ) { - 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; + 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; } 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( ( 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 ); + 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 ); /# - 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 ( 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 ); - } + 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 ); + } } 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 ); - } - 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.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 ); /# - 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 ( 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; - } + 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; + } } 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 ( 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 ); - } - } + 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 ); + } + } } 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; - } - 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++; - } - } - } + 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] ); + } } 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 55c93d4..7af1be4 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapons.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/_weapons.gsc @@ -1,1950 +1,1916 @@ -//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; +// 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; -//whole script first checked as mp version then checked againt zm version - -init() //checked changed to match cerberus output +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(); - } + 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(); } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - 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() //checked matches cerberus output +onplayerspawned() { - 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(); - } + 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(); + } } -watchturretuse() //checked matches cerberus output +watchturretuse() { - self endon( "death" ); - self endon( "disconnect" ); - while ( 1 ) - { - self waittill( "turretownerchange", turret ); - self thread watchfortowfire( turret ); - } + self endon( "death" ); + self endon( "disconnect" ); + + while ( true ) + { + self waittill( "turretownerchange", turret ); + + self thread watchfortowfire( turret ); + } } -watchfortowfire( turret ) //checked matches cerberus output +watchfortowfire( turret ) { - 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" ); - } + 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" ); + } } -watchmissleunlink( turret ) //checked matches cerberus output +watchmissleunlink( turret ) { - 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() //checked changed to match cerberus output +watchweaponchange() { - 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 ); - } - } - } + 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 ); + } + } } -watchriotshielduse() //checked changed to match cerberus output +watchriotshielduse() { + } -updatelastheldweapontimings( newtime ) //checked matches cerberus output +updatelastheldweapontimings( 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; - } - } + 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 ) //checked changed to match beta dump +updateweapontimings( newtime ) { - 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() //checked changed to match beta dump +trackweapon() { - 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; - } - } + 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; + } + } } -maydropweapon( weapon ) //checked matches cerberus output +maydropweapon( weapon ) { - 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; + 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; } -dropweaponfordeath( attacker, sweapon, smeansofdeath ) //checked matches cerberus output dvars taken from beta dump +dropweaponfordeath( attacker ) { - 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( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: not defined" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: not defined" ); #/ - } - */ - return; - } - if ( weapon == "none" ) - { - /* + return; + } + + if ( weapon == "none" ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: weapon == none" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: weapon == none" ); #/ - } - */ - return; - } - if ( !self hasweapon( weapon ) ) - { - /* + return; + } + + if ( !self hasweapon( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); #/ - } - */ - return; - } - if ( !self anyammoforweaponmodes( weapon ) ) - { - /* + return; + } + + if ( !self anyammoforweaponmodes( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: no ammo for weapon modes" ); + if ( getdvar( _hash_8F7FC88 ) == "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( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: no ammo" ); + if ( getdvar( _hash_8F7FC88 ) == "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( "scr_dropdebug" ) == "1" ) - { - println( "dropped weapon: " + weapon ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "dropped weapon: " + weapon ); #/ - } - */ - 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(); + droplimitedweapon( weapon, self, item ); + self.droppeddeathweapon = 1; + item itemweaponsetammo( clipammo, stockammo ); + item.owner = self; + item.ownersattacker = attacker; + item thread watchpickup(); + item thread deletepickupafterawhile(); } -dropweapontoground( weapon ) //checked changed to match cerberus output dvars taken from beta dump +dropweapontoground( weapon ) { - if ( !isDefined( weapon ) ) - { - /* + if ( !isdefined( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: not defined" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: not defined" ); #/ - } - */ - return; - } - if ( weapon == "none" ) - { - /* + return; + } + + if ( weapon == "none" ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: weapon == none" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: weapon == none" ); #/ - } - */ - return; - } - if ( !self hasweapon( weapon ) ) - { - /* + return; + } + + if ( !self hasweapon( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: don't have it anymore (" + weapon + ")" ); #/ - } - */ - return; - } - if ( !self anyammoforweaponmodes( weapon ) ) - { - /* + return; + } + + if ( !self anyammoforweaponmodes( weapon ) ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: no ammo for weapon modes" ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "didn't drop weapon: no ammo for weapon modes" ); #/ - } - */ - 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 ) - { - /* + 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 ) + { /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "didn't drop weapon: no ammo" ); + if ( getdvar( _hash_8F7FC88 ) == "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( "scr_dropdebug" ) == "1" ) - { - println( "dropped weapon: " + weapon ); + if ( getdvar( _hash_8F7FC88 ) == "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() //checked matches cerberus output +deletepickupafterawhile() { - self endon( "death" ); - wait 60; - if ( !isDefined( self ) ) - { - return; - } - self delete(); + self endon( "death" ); + wait 60; + + if ( !isdefined( self ) ) + return; + + self delete(); } -getitemweaponname() //checked matches cerberus output +getitemweaponname() { - 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() //checked changed to match cerberus output dvar taken from beta dump +watchpickup() { - self endon( "death" ); - weapname = self getitemweaponname(); - while ( - { - self waittill( "trigger", player, droppeditem ); - if ( isdefined( droppeditem ) ) - { - break; - } - } - /* + self endon( "death" ); + weapname = self getitemweaponname(); + + while ( true ) + { + self waittill( "trigger", player, droppeditem ); + + if ( isdefined( droppeditem ) ) + break; + } /# - if ( getDvar( "scr_dropdebug" ) == "1" ) - { - println( "picked up weapon: " + weapname + ", " + isDefined( self.ownersattacker ) ); -#/ - } -/# - assert( isDefined( player.tookweaponfrom ) ); + if ( getdvar( _hash_8F7FC88 ) == "1" ) + println( "picked up weapon: " + weapname + ", " + isdefined( self.ownersattacker ) ); #/ /# - 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.tookweaponfrom ) ); #/ /# - assert( isDefined( self.class ) ); + assert( isdefined( player.pickedupweaponkills ) ); #/ - */ - 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; + 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; + } } -loadout_get_offhand_weapon( stat ) //checked matches cerberus output +itemremoveammofromaltmodes() { - if ( isDefined( level.givecustomloadout ) ) - { - return "weapon_null_mp"; - } - /* + 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; /# - assert( isDefined( self.class_num ) ); + assert( isdefined( missile ) ); #/ - */ - 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"; + level.missileentities[level.missileentities.size] = missile; + missile thread watchmissiledeath(); + } } -loadout_get_offhand_count( stat ) //checked matches cerberus output +watchmissiledeath() { - count = 0; - if ( isDefined( level.givecustomloadout ) ) - { - return 0; - } - /* + 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 ); /# - assert( isDefined( self.class_num ) ); + assert( isdefined( grenade ) ); #/ - */ - if ( isDefined( self.class_num ) ) - { - count = self maps/mp/gametypes_zm/_class::getloadoutitemfromddlstats( self.class_num, stat ); - } - return count; + 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; } -scavenger_think() //checked partially changed to match cerberus output did not use for loops see github for more info +beginothergrenadetracking() { - 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++; - } + } -scavenger_hud_create() //checked matches cerberus output +checkstucktoplayer( deleteonteamchange, awardscoreevent, weaponname ) { - 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 ); + 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; + } } -dropscavengerfordeath( attacker ) //checked matches cerberus output +checkhatchetbounce() { - 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(); + self endon( "stuck_to_player" ); + self endon( "death" ); + + self waittill( "grenade_bounce" ); + + self.bounced = 1; } -addlimitedweapon( weapon_name, owner, num_drops ) //checked matches cerberus output +stucktoplayerteamchange( player ) { - limited_info = spawnstruct(); - limited_info.weapon = weapon_name; - limited_info.drops = num_drops; - owner.limited_info = limited_info; + self endon( "death" ); + player endon( "disconnect" ); + originalteam = player.pers["team"]; + + while ( true ) + { + player waittill( "joined_team" ); + + if ( player.pers["team"] != originalteam ) + { + self detonate(); + return; + } + } } -shoulddroplimitedweapon( weapon_name, owner ) //checked matches cerberus output +beginsatcheltracking() { - 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; + self endon( "death" ); + self endon( "disconnect" ); + self waittill_any( "grenade_fire", "weapon_change" ); + self.throwinggrenade = 0; } -droplimitedweapon( weapon_name, owner, item ) //checked matches cerberus output +watchforthrowbacks() { - 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 ); + 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; + } } -limitedpickup( limited_info ) //checked matches cerberus output +registergrenadelauncherduddvar( dvarstring, defaultvalue, minvalue, maxvalue ) { - self endon( "death" ); - self waittill( "trigger", player, item ); - if ( !isDefined( item ) ) - { - return; - } - player.limited_info = limited_info; + 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 ) +{ + 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 f2f6fb0..8dc9b9e 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,2010 +1,1943 @@ -#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 -} - - - +// 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; main() { - replaceFunc( maps/mp/gametypes/dem::isscoreboosting, ::always_false ); - replaceFunc( maps/mp/gametypes/dom::isscoreboosting, ::always_false ); - replaceFunc( maps/mp/gametypes/koth::isscoreboosting, ::always_false ); + 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; + } + } } init() { - level.isKillBoosting = ::always_false; + flag_init( "pregame" ); + flag_set( "pregame" ); + level thread onplayerconnect(); } -always_false() +onplayerconnect() { - return false; + for (;;) + { + level waittill( "connected", player ); + + player thread onplayerspawned(); + + if ( isdefined( level.game_module_onplayerconnect ) ) + player [[ level.game_module_onplayerconnect ]](); + } } +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 615725b..bb3a391 100644 --- a/Zombie Core/patch_zm/maps/mp/gametypes_zm/zclassic.gsc +++ b/Zombie Core/patch_zm/maps/mp/gametypes_zm/zclassic.gsc @@ -1,30 +1,31 @@ -#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; +// 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; main() { - 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" ); + 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" ); } 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", ::zclassic_main ); -} \ No newline at end of file + maps\mp\gametypes_zm\_zm_gametype::rungametypemain( "zclassic", maps\mp\gametypes_zm\_zm_gametype::zclassic_main ); +} diff --git a/Zombie Core/patch_zm/maps/mp/zombies/_load.gsc b/Zombie Core/patch_zm/maps/mp/zombies/_load.gsc index 95dd465..62bef28 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_load.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_load.gsc @@ -1,510 +1,481 @@ -//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; +// 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; -main( bscriptgened, bcsvgened, bsgenabled ) //checked partially changed to match cerberus output +main( bscriptgened, bcsvgened, bsgenabled ) { - 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(); - /* + 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(); /# - 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() //checked matches cerberus output +level_notify_listener() { - while ( 1 ) - { - val = getDvar( "level_notify" ); - if ( val != "" ) - { - level notify( val ); - setdvar( "level_notify", "" ); - } - wait 0.2; - } + while ( true ) + { + val = getdvar( "level_notify" ); + + if ( val != "" ) + { + level notify( val ); + setdvar( "level_notify", "" ); + } + + wait 0.2; + } } -client_notify_listener() //checked matches cerberus output +client_notify_listener() { - while ( 1 ) - { - val = getDvar( "client_notify" ); - if ( val != "" ) - { - clientnotify( val ); - setdvar( "client_notify", "" ); - } - wait 0.2; - } + while ( true ) + { + val = getdvar( "client_notify" ); + + if ( val != "" ) + { + clientnotify( val ); + setdvar( "client_notify", "" ); + } + + wait 0.2; + } } -footsteps() //checked matches cerberus output +footsteps() { - 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() //checked matches cerberus output +parse_structs() { - 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 ) //checked matches cerberus output +exploder_load( trigger ) { - 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() //checked partially changed to match cerberus output +setupexploders() { - 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; - /* + 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; /# - 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 = []; - 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++; - } + 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; + } } -setup_traversals() //checked changed to match cerberus output +setup_traversals() { - 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() //checked matches cerberus output +calculate_map_center() { - 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() //checked changed to match cerberus output +start_intro_screen_zm() { - 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 ef6b809..939f1a8 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm.gsc @@ -1,5619 +1,5428 @@ -#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 ); - } +// 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 ); + } } -set_default_laststand_pistol( solo_mode ) //checked matches cerberus output +playswipesound( mod, attacker ) { - if ( !solo_mode ) - { - level.laststandpistol = level.default_laststandpistol; - } - else - { - level.laststandpistol = level.default_solo_laststandpistol; - } + if ( isdefined( attacker.is_zombie ) && attacker.is_zombie ) + { + self playsoundtoplayer( "evt_player_swiped", self ); + return; + } } -update_quick_revive( solo_mode ) //checked matches cerberus output +precache_zombie_leaderboards() { - 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 ); + 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() +{ + if ( level.passed_introscreen ) + self setclientuivisibilityflag( "hud_visible", 1 ); + + thread refresh_player_navcard_hud(); + self thread watchdisconnect(); +} -player_too_many_players_check() //checked matches cerberus output +zm_on_player_disconnect() { - 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" ); - } + thread refresh_player_navcard_hud(); } -//added these functions to get around the compiler info.md No. 6 -//////////////////////////////////////////////////////////////// -is_solo_death( self, players ) +watchdisconnect() { - if ( players.size == 1 && flag( "solo_game" ) ) - { - if ( !self hasPerk( "specialty_quickrevive" ) ) - { - return 1; - } - if ( self.lives == 0 ) - { - return 1; - } - } - return 0; -} + self notify( "watchDisconnect" ); + self endon( "watchDisconnect" ); -is_non_solo_death( self, players, count ) + self waittill( "disconnect" ); + + zm_on_player_disconnect(); +} + +increment_dog_round_stat( stat ) { - if ( count > 1 || players.size == 1 && !flag( "solo_game" ) ) - { - return 1; - } - return 0; + players = get_players(); + + foreach ( player in players ) + player maps\mp\zombies\_zm_stats::increment_client_stat( "zdog_rounds_" + stat ); } -//////////////////////////////////////////////////////////////// +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 4ef963b..96dcfee 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,546 +1,554 @@ -#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; +// 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; -find_flesh() //checked partially changed to match cerberus output +find_flesh() { - 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" ); - } + 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" ); + } } -init_inert_zombies() //checked matches cerberus output +init_inert_zombies() { - level init_inert_substates(); + level init_inert_substates(); } -init_inert_substates() //checked matches cerberus output +init_inert_substates() { - 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() //checked matches cerberus output +get_inert_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; + 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() //checked matches cerberus output +get_inert_crawl_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; + 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 ) //checked changed to match cerberus output +start_inert( 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 ); + 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 ); } -inert_think( in_place ) //checked changed to match cerberus output +inert_think( in_place ) { - 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() ); + 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() ); } -inert_watch_goal() //checked changed to match cerberus output +inert_watch_goal() { - 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 ); - } - } + 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 ); + } } -inert_wakeup() //checked changed at own discretion parity in behavior to cerberus output +inert_wakeup() { - 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; - } + 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; + } } -inert_bump() //checked changed at own discretion parity in behavior to cerberus output +inert_bump() { - 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; - } + 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; + } } -inert_damage() //checked changed to match cerberus output +inert_damage() { - 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(); + 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(); } -grenade_watcher( grenade ) //checked changed to match cerberus output +grenade_watcher( grenade ) { - 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() //checked matches cerberus output +stop_inert() { - self notify( "stop_zombie_inert" ); + self notify( "stop_zombie_inert" ); } -inert_transition() //checked changed to match cerberus output +inert_transition() { - 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() //checked changed to match cerberus output +inert_eye_glow() { - 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; - } - } + 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; + } + } } - - 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 69413fa..ad1f0e5 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,721 +1,755 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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(); + 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(); } -enable_dog_rounds() //checked matches cerberus output +enable_dog_rounds() { - 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() //checked does not match cerberus output did not change +dog_spawner_init() { - 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" ); + 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" ); } -dog_round_spawning() //checked partially matches cerberus output +dog_round_spawning() { - 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 ); - } + 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 ); + } } -waiting_for_next_dog_spawn( count, max ) //checked matches cerberus output +waiting_for_next_dog_spawn( count, max ) { - 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; + 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 ); } -dog_round_aftermath() //checked matches cerberus output +dog_round_aftermath() { - 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 ) //checked matches cerberus output +dog_spawn_fx( ai, ent ) { - 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 ]; + 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" ); } -get_favorite_enemy() //checked changed to match cerberus output //reverted back to while loop +dog_spawn_sumpf_logic( dog_array, favorite_enemy ) { - 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; +/# + 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_health_increase() //checked changed to match cerberus output +dog_spawn_factory_logic( dog_array, favorite_enemy ) { - 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; - } + 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_round_tracker() //checked changed to match cerberus output +get_favorite_enemy() { - 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_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; } -dog_round_start() //checked matches cerberus output +dog_health_increase() { - 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 ); - } + 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; } -dog_round_stop() //checked matches cerberus output +dog_round_tracker() { - 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 ); + 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; + } + } } -play_dog_round() //checked matches cerberus output +dog_round_start() { - 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" ); + 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_init() //checked matches cerberus output +dog_round_stop() { - 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 ]](); - } + 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_fx_eye_glow() //checked matches cerberus output +play_dog_round() { - 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" ); + 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_fx_trail() //checked matches cerberus output +dog_init() { - 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" ); + 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 ]](); } -dog_death() //checked changed to match cerberus output +dog_fx_eye_glow() { - 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" ); - } + 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" ); } -dog_explode_fx( origin ) //checked matches cerberus output +dog_fx_trail() { - playfx( level._effect[ "dog_gib" ], origin ); - playsoundatposition( "zmb_hellhound_explode", origin ); + 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" ); } -zombie_setup_attack_properties_dog() //checked matches cerberus output +dog_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; + 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" ); } -stop_dog_sound_on_death() //checked matches cerberus output +dog_explode_fx( origin ) { - self waittill( "death" ); - self stopsounds(); + playfx( level._effect["dog_gib"], origin ); + playsoundatposition( "zmb_hellhound_explode", origin ); } -dog_behind_audio() //checked does not match cerberus output changed at own discretion +zombie_setup_attack_properties_dog() { - 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; - } + 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_clip_monitor() //checked changed to match cerberus output +stop_dog_sound_on_death() { - 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; - } + self waittill( "death" ); + + self stopsounds(); } -special_dog_spawn( spawners, num_to_spawn ) //checked matches cerberus output +dog_behind_audio() { - 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; + 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; + } } -dog_run_think() //checked matches cerberus output +dog_clip_monitor() { - 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; - } + 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; + } } -dog_stalk_audio() //checked matches cerberus output +special_dog_spawn( spawners, num_to_spawn ) { - self endon( "death" ); - self endon( "dog_running" ); - self endon( "dog_combat" ); - while ( 1 ) - { - self playsound( "zmb_hellhound_vocals_amb" ); - wait randomfloatrange( 3, 6 ); - } + 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; } -dog_thundergun_knockdown( player, gib ) //checked matches cerberus output +dog_run_think() { - self endon( "death" ); - damage = int( self.maxhealth * 0.5 ); - self dodamage( damage, player.origin, player ); + 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; + } } +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 2fbba54..994388e 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,617 +1,629 @@ -#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; +// 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; -zombie_faller_delete() //checked matches cerberus output +zombie_faller_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(); + 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() //checked changed to match cerberus output +faller_script_parameters() { - 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 ) //checked matches cerberus output +setup_deathfunc( func_name ) { - 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; - } + 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; } -do_zombie_fall( spot ) //checked changed to match cerberus output +do_zombie_fall( spot ) { - 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 ); + 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 ); } -zombie_faller_do_fall() //checked changed to match cerberus output +zombie_faller_do_fall() { - 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() //checked changed to match cerberus output +zombie_fall_loop() { - 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; - } + 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; + } } -zombie_land() //checked matches cerberus output +zombie_land() { - 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() //checked matches cerberus output +zombie_faller_always_drop() { - if ( is_true( self.zombie_faller_location.drop_now ) ) - { - return 1; - } - return 0; + if ( isdefined( self.zombie_faller_location.drop_now ) && self.zombie_faller_location.drop_now ) + return true; + + return false; } -zombie_faller_drop_not_occupied() //checked matches cerberus output +zombie_faller_drop_not_occupied() { - 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; + 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; } -zombie_faller_watch_all_players() //checked changed to match cerberus output +zombie_faller_watch_all_players() { - 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 ) //checked changed to match cerberus output +zombie_faller_watch_player( player ) { - 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; - } + 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; + } } -zombie_fall_wait() //checked changed to match cerberus output +zombie_fall_wait() { - 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; - } - } - } + 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; + } + } + } } 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 ) //checked partially changed to match cerberus output //continues in for loops bad +zombie_fall_get_vicitims( spot ) { - 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; + 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; } -get_fall_anim( spot ) //checked matches cerberus output +get_fall_anim( spot ) { - return level._zombie_fall_anims[ self.animname ][ "fall" ]; + return level._zombie_fall_anims[self.animname]["fall"]; } -zombie_faller_enable_location() //checked matches cerberus output +zombie_faller_enable_location() { - 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 ) //checked matches cerberus output +zombie_faller_death_wait( endon_notify ) { - 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() //checked matches cerberus output +zombie_fall_death_func() { - 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 ) //checked matches cerberus output +zombie_fall_death( spot ) { - 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 ) //checked changed to match cerberus output +_damage_mod_to_damage_type( type ) { - 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 ) //checked matches cerberus output +zombie_fall_fx( spot ) { - 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() //checked matches cerberus output +zombie_fall_burst_fx() { - 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 ) //checked does not match cerberus output did not change +zombie_fall_dust_fx( zombie ) { - 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; - } + 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 ); + } } -stop_zombie_fall_dust_fx( zombie ) //checked matches cerberus output +stop_zombie_fall_dust_fx( zombie ) { - 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 ) //checked changed to match cerberus output +handle_fall_notetracks( note, spot ) { - 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; - } - } + 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; + } + } } -faller_death_ragdoll() //checked matches cerberus output +faller_death_ragdoll() { - 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 ) //checked does not match cerberus output did not change +in_player_fov( player ) { - 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; + 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; } -potentially_visible( how_close ) //checked changed to match cerberus output +potentially_visible( how_close ) { - 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 ) //checked changed to match cerberus output +do_zombie_emerge( spot ) { - 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 ) //checked matches cerberus output +zombie_faller_emerge( spot ) { - 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; + 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; } -zombie_emerge_fx( spot ) //checked matches cerberus output +zombie_emerge_fx( spot ) { - 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 ) //checked does not match cerberus output did not change +zombie_emerge_dust_fx( zombie ) { - 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; - } + 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 ); + } } -stop_zombie_emerge_dust_fx( zombie ) //checked matches cerberus output +stop_zombie_emerge_dust_fx( zombie ) { - 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 dc8eec6..588c2fd 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_audio.gsc @@ -1,1405 +1,1408 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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 ); + 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 ); } -setexertvoice( exert_id ) //checked matches cerberus output +setexertvoice( exert_id ) { - 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 ) //checked changed to match cerberus output +playerexert( exert ) { - 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 ); + 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 ); } -exert_timer() //checked matches cerberus output +exert_timer() { - self endon( "disconnect" ); - wait randomfloatrange( 1.5, 3 ); - self.isexerting = 0; + self endon( "disconnect" ); + wait( randomfloatrange( 1.5, 3 ) ); + self.isexerting = 0; } -zmbvox() //checked matches cerberus output +zmbvox() { - 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() //checked matches cerberus output +init_standard_response_chances() { - 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() //checked matches cerberus output +init_audio_functions() { - 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() //checked changed to match cerberus output one change made at one discretion +zombie_behind_vox() { - 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; - } - } + 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; + } } -attack_vox_network_choke() //checked matches cerberus output +attack_vox_network_choke() { - while ( 1 ) - { - level._num_attack_vox = 0; - wait_network_frame(); - } + while ( true ) + { + level._num_attack_vox = 0; + wait_network_frame(); + } } -do_zombies_playvocals( alias_type, zombie_type ) //checked changed to match cerberus output +do_zombies_playvocals( alias_type, zombie_type ) { - 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; - } +/# + 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; + } } -sndisnetworksafe() //checked matches cerberus output +sndisnetworksafe() { - 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; + 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; } -is_last_zombie() //checked matches cerberus output +is_last_zombie() { - if ( get_current_zombie_count() <= 1 ) - { - return 1; - } - return 0; + if ( get_current_zombie_count() <= 1 ) + return true; + + return false; } -oh_shit_vox() //checked changed to match cerberus output +oh_shit_vox() { - 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; - } - } - } - } + 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; + } + } + } + } } -create_and_play_dialog( category, type, response, force_variant, override ) //checked changed to match cerberus output +create_and_play_dialog( category, type, response, force_variant, override ) { - 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 ); - } - } + 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" ); +#/ + } } -do_player_or_npc_playvox( prefix, index, sound_to_play, waittime, category, type, override, isresponse ) //checked partially changed to match cerberus output +do_player_or_npc_playvox( prefix, index, sound_to_play, waittime, category, type, override, isresponse ) { - 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 - { - } + 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." ); +#/ + } } -setup_response_line( player, index, category, type ) //checked matches cerberus output +setup_response_line( player, index, category, type ) { - 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; + 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; + } } -setup_hero_rival( player, hero, rival, category, type ) //checked changed to match cerberus output +setup_hero_rival( player, hero, rival, category, type ) { - 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 ) //checked matches cerberus output +do_announcer_playvox( category, type, team ) { - 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 ) //checked changed to match cerberus output +zmbvoxannouncertoteam( category, type, team ) { - 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() //checked matches cerberus output +player_killstreak_timer() { - 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 ); - } - } + 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 ); + } + } } -player_zombie_kill_vox( hit_location, player, mod, zombie ) //checked does not match cerberus output did not change +player_zombie_kill_vox( hit_location, player, mod, zombie ) { - 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; - } - } + 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; + } } -get_response_chance( event ) //checked matches cerberus output +get_response_chance( event ) { - 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 ) //checked does not match cerberus output did not change +get_mod_type( impact, mod, weapon, zombie, instakill, dist, player ) { - 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"; + 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"; } -timer_actual( kills, time ) //checked matches cerberus output +timer_actual( kills, time ) { - 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() //checked matches cerberus output +perks_a_cola_jingle_timer() { - 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 ); - } - } + 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 ); + } } -play_jingle_or_stinger( perksacola ) //checked matches cerberus output +play_jingle_or_stinger( perksacola ) { - 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() //checked matches cerberus output +play_random_broken_sounds() { - 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 ); - } + 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 ); + } + } } -perk_vox( perk ) //checked matches cerberus output +perk_vox( perk ) { - self endon( "death" ); - self endon( "disconnect" ); - if ( !isDefined( level.vox.speaker[ "player" ].alias[ "perk" ][ perk ] ) ) - { - return; - } - self create_and_play_dialog( "perk", perk ); + 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 ); } -dialog_debugger( category, type ) //checked dev call deleted +dialog_debugger( category, type ) { +/# + 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() //checked matches cerberus output +init_music_states() { - 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 ) //checked matches cerberus output +setupmusicstate( state, alias, is_alias, override, round_override, 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; + 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 ) //checked changed to match cerberus output +change_zombie_music( state ) { - 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; + 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; } -weapon_toggle_vox( alias, weapon ) //checked changed to match cerberus output +weapon_toggle_vox( alias, weapon ) { - 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 ) //checked matches cerberus output +get_weapon_num( weapon ) { - 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 ) //checked matches cerberus output +addasspeakernpc( ignorenearbyspeakers ) { - 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; + 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; } -arenearbyspeakersactive() //checked partially changed to match cerberus output +arenearbyspeakersactive() { - 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; + 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; } -zmbvoxcreate() //checked matches cerberus output +zmbvoxcreate() { - vox = spawnstruct(); - vox.speaker = []; - return vox; + vox = spawnstruct(); + vox.speaker = []; + return vox; } -zmbvoxinitspeaker( speaker, prefix, ent ) //checked matches cerberus output +zmbvoxinitspeaker( speaker, prefix, 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; + 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 ) //checked matches cerberus output +zmbvoxadd( speaker, category, type, alias, response ) { - 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 ); +/# + 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 ); } -zmbvoxgetlinevariant( prefix, alias_suffix, force_variant, override ) //checked changed to match cerberus output +zmbvoxgetlinevariant( prefix, alias_suffix, force_variant, override ) { - 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; + 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; } -zmbvoxcrowdonteam( alias, team, other_alias ) //checked changed to match cerberus output +zmbvoxcrowdonteam( alias, team, other_alias ) { - 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 ) //checked matches cerberus output +playvoxtoplayer( category, type, force_variant ) { - 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 ) //checked matches cerberus output +sndmusicstingerevent( type, player ) { - if ( isDefined( level.sndmusicstingerevent ) ) - { - [[ level.sndmusicstingerevent ]]( type, player ); - } + if ( isdefined( level.sndmusicstingerevent ) ) + [[ level.sndmusicstingerevent ]]( type, player ); } -custom_kill_damaged_vo( player ) //checked matches cerberus output +custom_kill_damaged_vo( player ) { - 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 d6b98f2..ce637f9 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,431 +1,445 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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; + 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; } -init_gamemodespecificvox( mode, location ) //checked matches cerberus output +init_gamemodespecificvox( mode, location ) { - 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 ) //checked matches cerberus output +init_gamemodecommonvox( 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 ); + 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 ) //checked matches cerberus output +init_griefvox( 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_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 ) //checked matches cerberus output +init_cleansed( prefix ) { - 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 ) //checked matches cerberus output +init_meatvox( 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_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 ) //checked changed to match cerberus output +init_racevox( prefix, location ) { - 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 ) //checked matches cerberus output +createvox( type, alias, gametype ) { - 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 ) //checked changed to match cerberus output +announceroundwinner( winner, delay ) { - 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 ) //checked changed to match cerberus output +announcematchwinner( winner, delay ) { - 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() //checked matches cerberus output +announcegamemoderules() { - if ( getDvar( "ui_zm_mapstartlocation" ) == "town" ) - { - leaderdialog( "rules", undefined, undefined, undefined, 20 ); - } + if ( getdvar( _hash_C955B4CD ) == "town" ) + leaderdialog( "rules", undefined, undefined, undefined, 20 ); } -leaderdialog( dialog, team, group, queue, waittime ) //checked changed to match cerberus output +leaderdialog( dialog, team, 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 ); - } - } +/# + 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 ); + } } -leaderdialogbothteams( dialog1, team1, dialog2, team2, group, queue, waittime ) //checked changed to match cerberus output +leaderdialogbothteams( dialog1, team1, dialog2, team2, 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 ); - } - } +/# + 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 ); + } } -leaderdialogonplayer( dialog, group, queue, waittime ) //checked changed to match cerberus output +leaderdialogonplayer( dialog, group, queue, waittime ) { - 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; - } + 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; } -playleaderdialogonplayer( dialog, team, waittime ) //checked changed to match cerberus output +playleaderdialogonplayer( dialog, team, waittime ) { - self endon( "disconnect" ); + self endon( "disconnect" ); - 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 ); - } + 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 ); + } } -getleaderdialogvariant( alias ) //checked changed to match cerberus output +getleaderdialogvariant( alias ) { - 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; + 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; } -getroundswitchdialog( switchtype ) //checked matches cerberus output +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"; + } } -getotherteam( team ) //checked matches cerberus output +getotherteam( team ) { - 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 550318b..5072438 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_blockers.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_blockers.gsc @@ -1,2351 +1,2288 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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() //checked matches cerberus output +init_blockers() { - 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() //checked changed to match cerberus output +door_init() { - 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 ) //checked changed to match cerberus output +door_classify( parent_trig ) { - 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; -} + 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 = ""; -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++ ) - { - /* + switch ( self.script_string ) + { + case "anim": /# - 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( self.script_animname ), "Blocker_init: You must specify a script_animname for " + self.targetname ); #/ /# - assert( isDefined( chunk.og_angles ) ); + assert( isdefined( level.scr_anim[self.script_animname] ), "Blocker_init: You must define a level.scr_anim for script_anim -> " + self.script_animname ); #/ - */ - 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 ) ) - { - /* /# - assertmsg( "Flag Blocker at " + self.origin + " does not have a script_flag_wait key value pair" ); + assert( isdefined( level.blocker_anim_func ), "Blocker_init: You must define a level.blocker_anim_func" ); #/ - */ - 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; - } - /* + 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++ ) + { /# - assertmsg( "flag blocker at " + self.origin + ", the type "" + type + "" is not recognized" ); + 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(); + } + } } -update_states( states ) //checked matches cerberus output +door_activate( time, open, quick, use_blocker_clip_for_pathing ) { - /* + 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; /# - assert( isDefined( states ) ); + println( "ZM BLOCKER local door trigger clear\n" ); #/ - */ - self.state = states; + self notify( "trigger_clear" ); } -quantum_bomb_open_nearest_door_validation( position ) //checked changed to match cerberus output +waittill_door_trigger_clear_local_power_off( trigger, all_trigs ) { - 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; + 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" ); + } } -quantum_bomb_open_nearest_door_result( position ) //checked changed to match cerberus output +waittill_door_trigger_clear_global_power_off( trigger, all_trigs ) { - 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; - } - } + 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" ); + } } +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 bcef80d..ba070ac 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_bot.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_bot.gsc @@ -1,10 +1,12 @@ -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; 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 2483f2e..b5338d1 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_buildables.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_buildables.gsc @@ -1,3146 +1,2941 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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 ) //checked matches cerberus output +anystub_update_prompt( player ) { - 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; + 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; } -anystub_get_unitrigger_origin() //checked matches cerberus output +anystub_get_unitrigger_origin() { - 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 ) //checked matches cerberus output +anystub_on_spawn_trigger( trigger ) { - 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() //checked changed to match cerberus output +buildables_watch_swipes() { - 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 ); - } - } - } - } + 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 ); + } + } + } } -explosiondamage( damage, pos ) //checked matches cerberus output +explosiondamage( damage, pos ) { - /* /# - 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 ) //checked matches cerberus output +add_zombie_buildable( buildable_name, hint, building, 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; - /* + 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() //checked changed to match cerberus output +register_clientfields() { - 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 ) //checked matches cerberus output +set_buildable_clientfield( slot, newvalue ) { - 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 ) //checked matches cerberus output +clear_buildable_clientfield( slot ) { - self set_buildable_clientfield( slot, 0 ); + self set_buildable_clientfield( slot, 0 ); } -include_zombie_buildable( buiildable_struct ) //checked matches cerberus output +include_zombie_buildable( buiildable_struct ) { - 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 ) //checked changed to match cerberus output +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 ) { - 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" ); - /* + precachemodel( modelname ); + + if ( isdefined( hud_icon ) ) + precacheshader( hud_icon ); + + piece = spawnstruct(); + buildable_pieces = []; + buildable_pieces_structs = 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 ( 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 ( 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; } -manage_multiple_pieces( max_instances, min_instances ) //checked matches cerberus output +manage_multiple_pieces( max_instances, min_instances ) { - 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 ) //checked matches cerberus output +buildable_set_force_spawn_location( str_kvp, str_name ) { - 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 ) //checked matches cerberus output +buildable_use_cyclic_spawns( randomize_start_location ) { - 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 ) //checked matches cerberus output +combine_buildable_pieces( piece1, piece2, piece3 ) { - 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 ) //checked matches cerberus output +add_buildable_piece( piece, part_name, can_reuse ) { - 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 ) //checked matches cerberus output +create_zombie_buildable_piece( modelname, radius, height, hud_icon ) { - 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() //checked partially changed to match cerberus output +onplayerlaststand() { - 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 ); - } + 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 ); + } } -piecestub_get_unitrigger_origin() //checked matches cerberus output +piecestub_get_unitrigger_origin() { - if ( isDefined( self.origin_parent ) ) - { - return self.origin_parent.origin + vectorScale( ( 0, 0, 1 ), 12 ); - } - return self.origin; + if ( isdefined( self.origin_parent ) ) + return self.origin_parent.origin + vectorscale( ( 0, 0, 1 ), 12.0 ); + + return self.origin; } -generate_piece_unitrigger( classname, origin, angles, flags, radius, script_height, moving ) //checked matches cerberus output +generate_piece_unitrigger( classname, origin, angles, flags, radius, script_height, moving ) { - 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; + 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; } -piecetrigger_update_prompt( player ) //checked matches cerberus output +piecetrigger_update_prompt( player ) { - 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 ) //checked changed to match cerberus output +piecestub_update_prompt( player ) { - 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; + 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; } -piece_unitrigger_think() //checked changed to match cerberus output +piece_unitrigger_think() { - 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 ); - } - } + 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 ); + } } -player_get_buildable_pieces() //checked matches cerberus output +player_get_buildable_pieces() { - 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 ) //checked matches cerberus output +player_get_buildable_piece( slot ) { - 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 ) //checked matches cerberus output +player_set_buildable_piece( piece, slot ) { - 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; -} - -player_can_take_piece( piece ) //checked matches cerberus output -{ - if ( !isDefined( piece ) ) - { - return 0; - } - return 1; -} - -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; + } #/ - } - */ + if ( !isdefined( self.current_buildable_pieces ) ) + self.current_buildable_pieces = []; + + self.current_buildable_pieces[slot] = piece; } -player_throw_piece( piece, origin, dir, return_to_spawn, return_time, endangles ) //checked changed to match cerberus output +player_can_take_piece( piece ) +{ + if ( !isdefined( piece ) ) + return false; + + return true; +} + +dbline( from, to ) { - /* /# - assert( isDefined( piece ) ); + time = 20; + + while ( time > 0 ) + { + line( from, to, ( 0, 0, 1 ), 0, 1 ); + time -= 0.05; + wait 0.05; + } #/ - */ - if ( isDefined( piece ) ) - { - /* +} + +player_throw_piece( piece, origin, dir, return_to_spawn, return_time, endangles ) +{ /# - thread dbline( origin, origin + dir ); + assert( isdefined( piece ) ); #/ - */ - 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() //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 ); - } - } -} - -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(); -} - -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 ); - } -} - -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 ); - } -} - -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 ), 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 ) //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 ); - } -} - -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 ); - } -} - -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 1; - } - return 0; -} - -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 1; - } - } - return 0; -} - -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 = 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 ]; - } - /* + if ( isdefined( piece ) ) + { /# - if ( !any_good ) - { - assert( any_okay, "There is nowhere to spawn this piece" ); - } + thread dbline( origin, origin + dir ); #/ - */ - 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; - } + 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 ); + } } -piece_allocate_cyclic( piecespawn ) //checked matches cerberus output +watch_hit_players() { - 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; + self endon( "death" ); + self endon( "stationary" ); + + while ( isdefined( self ) ) + { + self waittill( "grenade_bounce", pos, normal, ent ); + + if ( isplayer( ent ) ) + ent explosiondamage( 25, pos ); + } } -piece_deallocate_spawn() //checked matches cerberus output +piece_wait_and_return( return_time ) { - if ( isDefined( self.current_spawn ) ) - { - self.piecespawn.piece_allocated[ self.current_spawn ] = 0; - self.current_spawn = undefined; - } - self.start_origin = undefined; + 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(); } -piece_pick_random_spawn() //checked partially changed to match cerberus output did not change while loop to for loop +player_return_piece_to_original_spawn( slot ) { - 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; - /* + 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 ) +{ + 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 ) +{ + 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 ); +} + +player_take_piece( 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 ) +{ + 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 ) +{ + 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; +} + +is_point_in_build_trigger( point ) +{ + 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; +} + +piece_allocate_spawn( piecespawn ) +{ + 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]; + } /# - println( "ERROR: All buildable spawn locations claimed" ); + assert( any_good || any_okay, "There is nowhere to spawn this piece" ); #/ - */ - return; - } - self.current_spawn = randomint( self.spawns.size ); - } - } + 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; + } } -piece_set_spawn( num ) //checked matches cerberus output +piece_allocate_cyclic( piecespawn ) { - self.current_spawn = 0; - if ( self.spawns.size >= 1 && self.spawns.size > 1 ) - { - self.current_spawn = int( min( num, self.spawns.size - 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_spawn_in( piecespawn ) //checked matches cerberus output +piece_deallocate_spawn() { - 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 ]](); - } + if ( isdefined( self.current_spawn ) ) + { + self.piecespawn.piece_allocated[self.current_spawn] = 0; + self.current_spawn = undefined; + } + + self.start_origin = undefined; } -piece_spawn_at_with_notify_delay( origin, angles, str_notify, unbuild_respawn_fn ) //checked matches cerberus output +piece_pick_random_spawn() { - level waittill( str_notify ); - piece_spawn_at( origin, angles ); - if ( isDefined( unbuild_respawn_fn ) ) - { - self [[ unbuild_respawn_fn ]](); - } -} + self.current_spawn = 0; -piece_spawn_at( origin, angles ) //checked changed to match cerberus output -{ - 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 ( 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; /# - if ( !isDefined( level.drop_offset ) ) - { - level.drop_offset = 0; - } - origin += ( 0, 0, level.drop_offset ); - unitrigger_offset -= ( 0, 0, level.drop_offset ); + println( "ERROR: All buildable spawn locations claimed" ); #/ - */ - 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 ]](); - } + return; + } + } + } } -piece_unspawn() //checked matches cerberus output +piece_set_spawn( num ) { - 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; + self.current_spawn = 0; + + if ( self.spawns.size >= 1 && self.spawns.size > 1 ) + self.current_spawn = int( min( num, self.spawns.size - 1 ) ); } -piece_hide() //checked matches cerberus output +piece_spawn_in( piecespawn ) { - if ( isDefined( self.model ) ) - { - self.model ghost(); - } + 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 ]](); + } } -piece_show() //checked matches cerberus output +piece_spawn_at_with_notify_delay( origin, angles, str_notify, unbuild_respawn_fn ) { - if ( isDefined( self.model ) ) - { - self.model show(); - } + level waittill( str_notify ); + + piece_spawn_at( origin, angles ); + + if ( isdefined( unbuild_respawn_fn ) ) + self [[ unbuild_respawn_fn ]](); } -piece_destroy() //checked matches cerberus output +piece_spawn_at( origin, angles ) { - if ( isDefined( self.ondestroy ) ) - { - self [[ self.ondestroy ]](); - } -} + if ( self.spawns.size < 1 ) + return; -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; -} + 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; -buildable_piece_unitriggers( buildable_name, origin ) //checked changed to match cerberus output -{ - /* + 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; /# - assert( isDefined( buildable_name ) ); + 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 ]](); +} + +piece_unspawn() +{ + 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; +} + +piece_hide() +{ + if ( isdefined( self.model ) ) + self.model ghost(); +} + +piece_show() +{ + if ( isdefined( self.model ) ) + self.model show(); +} + +piece_destroy() +{ + if ( isdefined( self.ondestroy ) ) + self [[ self.ondestroy ]](); +} + +generate_piece( buildable_piece_spawns ) +{ + 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 ) +{ +/# + 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 ) && 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; + 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; } -hide_buildable_table_model( trigger_targetname ) //checked matches cerberus output +hide_buildable_table_model( trigger_targetname ) { - 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 ) //checked matches cerberus output +setup_unitrigger_buildable( trigger_targetname, 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 ); + 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 ) //checked changed to match cerberus output +setup_unitrigger_buildable_array( trigger_targetname, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) { - 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 ) //checked changed to match cerberus output +setup_unitrigger_buildable_internal( trig, equipname, weaponname, trigger_hintstring, delete_trigger, persistent ) { - 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 ) //checked changed to match cerberus output +buildable_has_piece( piece ) { - 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; + 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; } -buildable_set_piece_built( piece ) //checked changed to match cerberus output +buildable_set_piece_built( piece ) { - 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 ) //checked changed to match cerberus output +buildable_set_piece_building( piece ) { - 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 ) //checked matches cerberus output +buildable_clear_piece_building( piece ) { - if ( isDefined( piece ) ) - { - piece.building = 0; - } + if ( isdefined( piece ) ) + piece.building = 0; } -buildable_is_piece_built( piece ) //checked partially changed to match cerberus output //changed at own discretion +buildable_is_piece_built( piece ) { - 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; + 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; } 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 ) - { - if ( isDefined( self.pieces[ i ].building ) && self.pieces[ i ].building && self.pieces[ i ] == piece ) - { - return 1; - } - } - } - return 0; + 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; } -buildable_is_piece_built_or_building( piece ) //checked partially changed to match cerberus output //changed at own discretion +buildable_is_piece_built_or_building( piece ) { - 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; + 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; } -buildable_all_built() //checked changed to match cerberus output +buildable_all_built() { - for ( i = 0; i < self.pieces.size; i++ ) - { - if ( !is_true( self.pieces[ i ].built ) ) - { - return 0; - } - } - return 1; + for ( i = 0; i < self.pieces.size; i++ ) + { + if ( !( isdefined( self.pieces[i].built ) && self.pieces[i].built ) ) + return false; + } + + return true; } -player_can_build( buildable, continuing ) //checked changed to match cerberus output +player_can_build( buildable, continuing ) { - 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; + 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; } -player_build( buildable, pieces ) //checked partially changed to match cerberus output +player_build( buildable, pieces ) { - 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" ); - /* + 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" ); /# - 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 ) //checked matches cerberus output +sndbuildablecompletealias( name ) { - 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 ) //checked matches cerberus output +player_finish_buildable( buildable ) { - buildable.built = 1; - buildable.stub.built = 1; - buildable notify( "built" ); - level.buildables_built[ buildable.buildable_name ] = 1; - level notify( buildable.buildable_name + "_built" ); + 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 ); } -buildablestub_finish_build( player ) //checked matches cerberus output +buildablestub_finish_build( player ) { - player player_finish_buildable( self.buildablezone ); + player player_finish_buildable( self.buildablezone ); } -buildablestub_remove() //checked matches cerberus output +buildablestub_remove() { - arrayremovevalue( level.buildable_stubs, self ); + arrayremovevalue( level.buildable_stubs, self ); } -buildabletrigger_update_prompt( player ) //checked matches cerberus output +buildabletrigger_update_prompt( player ) { - 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 ) //checked changed to match cerberus output +buildablestub_update_prompt( player ) { - 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; -} + if ( !self anystub_update_prompt( player ) ) + return false; -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; -} + can_use = 1; -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 ( isdefined( self.buildablestub_reject_func ) ) + { + rval = self [[ self.buildablestub_reject_func ]]( player ); -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 ( rval ) + 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" ); -} + if ( isdefined( self.custom_buildablestub_update_prompt ) && !self [[ self.custom_buildablestub_update_prompt ]]( player ) ) + return false; -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; - } -} + self.cursor_hint = "HINT_NOICON"; + self.cursor_hint_weapon = undefined; -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( self.built ) && self.built ) ) + { + slot = self.buildablestruct.buildable_slot; -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; - } - } -} + 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"; -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 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_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 -{ - /* + return false; + } + else + { /# - if ( isDefined( player ) && isDefined( player.name ) ) - { - println( "ZM >> Buildable piece recovered by - " + player.name ); + 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 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; } -ondroputs( player ) //checked matches cerberus output +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 ) { - /* /# - if ( isDefined( player ) && isDefined( player.name ) ) - { - println( "ZM >> Buildable piece dropped by - " + player.name ); + if ( isdefined( player ) && isdefined( player.name ) ) + println( "ZM >> Buildable piece recovered by - " + player.name ); #/ - } - */ - player notify( "event_ended" ); } -onbeginuseuts( player ) //checked matches cerberus output +ondroputs( player ) { - /* /# - 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 dropped 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 ); - } + player notify( "event_ended" ); } -sndbuildableusealias( name ) //checked matches cerberus output +onbeginuseuts( player ) { - 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 end use by - " + player.name ); + if ( isdefined( player ) && isdefined( player.name ) ) + println( "ZM >> Buildable piece begin 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.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 ); + } } - -oncantuseuts( player ) //checked matches cerberus output + +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 ) { - /* /# - 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 end use by - " + player.name ); #/ - } - */ - if ( isDefined( self.buildablestruct.oncantuse ) ) - { - self [[ self.buildablestruct.oncantuse ]]( player ); - } + 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" ); } -onuseplantobjectuts( player ) //checked matches cerberus output +oncantuseuts( player ) { - /* /# - if ( isDefined( player ) && isDefined( player.name ) ) - { - println( "ZM >> Buildable piece crafted by - " + player.name ); + if ( isdefined( player ) && isdefined( player.name ) ) + println( "ZM >> Buildable piece can't use by - " + player.name ); #/ - } - */ - if ( isDefined( self.buildablestruct.onuseplantobject ) ) - { - self [[ self.buildablestruct.onuseplantobject ]]( player ); - } - player notify( "bomb_planted" ); + if ( isdefined( self.buildablestruct.oncantuse ) ) + self [[ self.buildablestruct.oncantuse ]]( player ); } -add_zombie_buildable_vox_category( buildable_name, vox_id ) //checked matches cerberus output +onuseplantobjectuts( player ) { - 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 -{ - /* /# - assert( isDefined( level.zombie_buildables[ buildable_name ] ), buildable_name + " was not included or is not part of the zombie weapon list." ); + if ( isdefined( player ) && isdefined( player.name ) ) + println( "ZM >> Buildable piece crafted by - " + player.name ); #/ - */ - return level.zombie_buildables[ buildable_name ].hint; + if ( isdefined( self.buildablestruct.onuseplantobject ) ) + self [[ self.buildablestruct.onuseplantobject ]]( player ); + + player notify( "bomb_planted" ); } -delete_on_disconnect( buildable, self_notify, skip_delete ) //checked matches cerberus output +add_zombie_buildable_vox_category( buildable_name, 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(); - } - } + buildable_struct = level.zombie_include_buildables[buildable_name]; + buildable_struct.vox_id = vox_id; } -get_buildable_pickup( buildablename, modelname ) //checked changed to match cerberus output +add_zombie_buildable_piece_vox_category( buildable_name, vox_id, timer ) { - foreach ( buildablepickup in level.buildablepickups ) - { - if ( buildablepickup[ 0 ].buildablestruct.name == buildablename && buildablepickup[ 0 ].visuals[ 0 ].model == modelname ) - { - return buildablepickup[ 0 ]; - } - } - return undefined; + buildable_struct = level.zombie_include_buildables[buildable_name]; + buildable_struct.piece_vox_id = vox_id; + buildable_struct.piece_vox_timer = timer; } -track_buildable_piece_pickedup( piece ) //checked matches cerberus output +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 ) { - if ( !isDefined( piece ) || !isDefined( piece.buildablename ) ) - { - /* /# - println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildable_piece_pickedup() \n" ); + assert( isdefined( level.zombie_buildables[buildable_name] ), buildable_name + " was not included or is not part of the zombie weapon list." ); #/ - */ - 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 level.zombie_buildables[buildable_name].hint; } -buildable_piece_pickedup_vox_cooldown( piece_vox_id, timer ) //checked matches cerberus output +delete_on_disconnect( buildable, self_notify, skip_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 ); + 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(); + } } -track_buildable_pieces_built( buildable ) //checked matches cerberus output +get_buildable_pickup( buildablename, modelname ) { - if ( !isDefined( buildable ) || !isDefined( buildable.buildable_name ) ) - { - /* + 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 ) ) + { /# - println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildable_pieces_built() \n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildable_piece_pickedup() \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 ]](); - return; - } - else - { - self thread do_player_general_vox( "general", "build_add" ); - } - } + 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" ); } -track_buildables_built( buildable ) //checked matches cerberus output +buildable_piece_pickedup_vox_cooldown( piece_vox_id, timer ) { - if ( !isDefined( buildable ) || !isDefined( buildable.buildable_name ) ) - { - /* + 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 ) ) + { /# - println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildables_built() \n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildable_pieces_built() \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" ); - } + 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" ); + } } -track_buildables_pickedup( buildable ) //checked matches cerberus output +track_buildables_built( buildable ) { - if ( !isDefined( buildable ) ) - { - /* + if ( !isdefined( buildable ) || !isdefined( buildable.buildable_name ) ) + { /# - println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildables_pickedup() \n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildables_built() \n" ); #/ - */ - return; - } - stat_name = get_buildable_stat_name( buildable ); - if ( !isDefined( stat_name ) ) - { - /* + 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 ) ) + { /# - println( "STAT TRACKING FAILURE: NO STAT NAME FOR " + buildable + "\n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED IN track_buildables_pickedup() \n" ); #/ - */ - return; - } - self add_map_buildable_stat( stat_name, "buildable_pickedup", 1 ); - self say_pickup_buildable_vo( buildable, 0 ); -} + return; + } -track_buildables_planted( equipment ) //checked matches cerberus output -{ - if ( !isDefined( equipment ) ) - { - /* + stat_name = get_buildable_stat_name( buildable ); + + if ( !isdefined( stat_name ) ) + { /# - println( "STAT TRACKING FAILURE: NOT DEFINED for track_buildables_planted() \n" ); + println( "STAT TRACKING FAILURE: NO STAT NAME FOR " + buildable + "\n" ); #/ - */ - return; - } - buildable_name = undefined; - if ( isDefined( equipment.name ) ) - { - buildable_name = get_buildable_stat_name( equipment.name ); - } - if ( !isDefined( buildable_name ) ) - { - /* + 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 ) ) + { /# - println( "STAT TRACKING FAILURE: NO BUILDABLE NAME FOR track_buildables_planted() " + equipment.name + "\n" ); + println( "STAT TRACKING FAILURE: NOT DEFINED for track_buildables_planted() \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 ( !is_true( self.buildable_timer ) ) - { - self thread do_player_general_vox( "general", vo_name ); - self thread placed_buildable_vo_timer(); - } + 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(); + } } -placed_buildable_vo_timer() //checked matches cerberus output +placed_buildable_vo_timer() { - 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() //checked matches cerberus output +buildable_pickedup_timer() { - 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 ) //checked changed to match cerberus output +track_planted_buildables_pickedup( equipment ) { - 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(); - } + 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(); + } } -track_placed_buildables( buildable_name ) //checked matches cerberus output +track_placed_buildables( buildable_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 ); + 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 ) //checked changed to match cerberus output +add_map_buildable_stat( 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 ); + 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 ); } -say_pickup_buildable_vo( buildable_name, world ) //checked matches cerberus output +say_pickup_buildable_vo( buildable_name, world ) { - 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(); - } + 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(); + } } -get_buildable_vo_name( buildable_name ) //checked matches cerberus output +get_buildable_vo_name( buildable_name ) { - 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 ) //checked matches cerberus output +get_buildable_stat_name( buildable ) { - 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 cb9a6dd..48d57d9 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_chugabud.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_chugabud.gsc @@ -1,801 +1,792 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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() //checked matches cerberus output +chugabug_precache() { + } -chugabud_player_init() //checked matches cerberus output +chugabud_player_init() { + } -chugabud_laststand() //checked changed to match cerberus output +chugabud_laststand() { - 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 ); + 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 ); } -chugabud_laststand_cleanup( corpse, str_notify ) //checked matches cerberus output +chugabud_laststand_cleanup( corpse, str_notify ) { - 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 ) //checked changed to match cerberus output +chugabud_bleed_timeout( delay, corpse ) { - 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 ); + 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 ); } -chugabud_corpse_cleanup( corpse, was_revived ) //checked matches cerberus output +chugabud_corpse_cleanup( corpse, was_revived ) { - 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 ) //checked matches cerberus output +chugabud_handle_multiple_instances( corpse ) { - 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() //checked matches cerberus output +chugabud_spawn_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; + corpse = maps\mp\zombies\_zm_clone::spawn_player_clone( self, self.origin, undefined, self.whos_who_shader ); + corpse.angles = self.angles; + corpse maps\mp\zombies\_zm_clone::clone_give_weapon( "m1911_zm" ); + corpse maps\mp\zombies\_zm_clone::clone_animate( "laststand" ); + corpse.revive_hud = self chugabud_revive_hud_create(); + corpse thread maps\mp\zombies\_zm_laststand::revive_trigger_spawn(); + return corpse; } -chugabud_revive_hud_create() //checked matches cerberus output +chugabud_revive_hud_create() { - 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() //checked changed to match cerberus output +chugabud_save_loadout() { - 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" ); - } + 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" ); } -chugabud_save_grenades() //checked matches cerberus output +chugabud_save_grenades() { - 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() //checked partially changed to match cerberus output continues in for loops bad see the github for more info +chugabud_give_loadout() { - 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 ); - } - } + 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 ); + } + } } -chugabud_restore_grenades() //checked matches cerberus output +chugabud_restore_grenades() { - 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 ); - } + 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 ); + } } -chugabud_restore_claymore() //checked matches cerberus output +chugabud_restore_claymore() { - 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 ); - } + 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 ); + } } -chugabud_fake_death() //checked matches cerberus output +chugabud_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 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() //checked matches cerberus output +chugabud_fake_revive() { - 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() //checked partially changed to match cerberus output nested foreach is probably bad +chugabud_get_spawnpoint() { - 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" ); - } - /* + 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" ); /# - 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 ) //checked partially changed to match cerberus output changed at own discretion +get_chugabug_spawn_point_from_nodes( v_origin, min_radius, max_radius, max_height, ignore_targetted_nodes ) { - 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; + 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; } -force_corpse_respawn_position( forced_corpse_position ) //checked matches cerberus output +force_corpse_respawn_position( forced_corpse_position ) { - level.chugabud_force_corpse_position = forced_corpse_position; + level.chugabud_force_corpse_position = forced_corpse_position; } -force_player_respawn_position( forced_player_position ) //checked matches cerberus output +force_player_respawn_position( forced_player_position ) { - level.chugabud_force_player_position = forced_player_position; + level.chugabud_force_player_position = forced_player_position; } -save_weapons_for_chugabud( player ) //checked changed to match cerberus output +save_weapons_for_chugabud( player ) { - 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 ) //checked matches cerberus output +save_weapon_for_chugabud( player, weapon_name ) { - 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 ) //checked changed to match cerberus output +restore_weapons_for_chugabud( player ) { - 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 ) //checked changed to match cerberus output +restore_weapon_for_chugabud( player, weapon_name ) { - 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; - } + 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; + } } -chugabud_save_perks( ent ) //checked changed to match cerberus output +chugabud_save_perks( ent ) { - 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() //checked matches cerberus output +playchugabudtimeraudio() { - 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; - } + 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; + } } -playchugabudtimerout( player ) //checked matches cerberus output +playchugabudtimerout( player ) { - 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() //checked changed to match cerberus output +chugabud_hostmigration() { - 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" ); - } - } + 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" ); + } } -player_revived_cleanup_chugabud_corpse() //checked matches cerberus output +player_revived_cleanup_chugabud_corpse() { + } -player_has_chugabud_corpse() //checked matches cerberus output +player_has_chugabud_corpse() { - if ( isDefined( self.e_chugabud_corpse ) ) - { - return 1; - } - return 0; + if ( isdefined( self.e_chugabud_corpse ) ) + return true; + + return false; } -is_weapon_available_in_chugabud_corpse( weapon, player_to_check ) //checked partially changed to match cerberus output +is_weapon_available_in_chugabud_corpse( weapon, player_to_check ) { - 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; + 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; } -chugabud_corpse_cleanup_on_spectator( player ) //checked changed to match cerberus output +chugabud_corpse_cleanup_on_spectator( player ) { - self endon( "death" ); - player endon( "disconnect" ); - while ( 1 ) - { - if ( player.sessionstate == "spectator" ) - { - break; - } - wait 0.01; - } - player chugabud_corpse_cleanup( self, 0 ); + self endon( "death" ); + player endon( "disconnect" ); + + while ( true ) + { + if ( player.sessionstate == "spectator" ) + break; + + wait 0.01; + } + + player chugabud_corpse_cleanup( self, 0 ); } -chugabud_corpse_revive_icon( player ) //checked changed to match cerberus output +chugabud_corpse_revive_icon( player ) { - 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; - } + 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; + } } -activate_chugabud_effects_and_audio() //checked matches cerberus output +activate_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(); - } - } + if ( isdefined( level.whos_who_client_setup ) ) + { + if ( !isdefined( self.whos_who_effects_active ) ) + { + if ( isdefined( level.chugabud_shellshock ) ) + self shellshock( "whoswho", 60 ); + + if ( isdefined( level.vsmgr_prio_visionset_zm_whos_who ) ) + maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_whos_who", self ); + + self setclientfieldtoplayer( "clientfield_whos_who_audio", 1 ); + self setclientfieldtoplayer( "clientfield_whos_who_filter", 1 ); + self.whos_who_effects_active = 1; + self thread deactivate_chugabud_effects_and_audio(); + } + } } -deactivate_chugabud_effects_and_audio() //checked matches cerberus output +deactivate_chugabud_effects_and_audio() { - 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 6a4806a..8dbb479 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_clone.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_clone.gsc @@ -1,143 +1,137 @@ -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; -//#using_animtree( "zm_ally" ); //cannot use this in gsc - -init() //checked matches cerberus output +init() { - init_mover_tree(); + init_mover_tree(); } -spawn_player_clone( player, origin, forceweapon, forcemodel ) //checked matches cerberus output +spawn_player_clone( player, origin, forceweapon, forcemodel ) { - 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 ) //checked changed to match cerberus output +clone_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) { - 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; + 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; } -clone_give_weapon( weapon ) //checked matches cerberus output +clone_give_weapon( weapon ) { - 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 ) //checked matches cerberus output +clone_animate( animtype ) { - 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 ) //checked matches cerberus output +clone_actor_animate( animtype ) { - 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() //checked matches cerberus output +init_mover_tree() { - scriptmodelsuseanimtree( -1 ); + scriptmodelsuseanimtree( -1 ); } -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; - } -} +#using_animtree("zm_ally"); +clone_mover_animate( animtype ) +{ + 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 1aa2351..fc25a54 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_devgui.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_devgui.gsc @@ -1,2344 +1,2259 @@ -#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; +// 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; 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(); - 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++; + 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" ); + } #/ - } } 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( #"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 ); - } + 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 ); + } + } #/ - } } 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 ]; - 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++; + 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; + } + } #/ - } - } } zombie_devgui_ability_take( name ) { /# - 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++; + 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; + } + } #/ - } - } } zombie_ability_devgui_think() { /# - 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 ); - } + 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 ); + } + } #/ - } } 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, 1, 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, 0, 0 ), text, color, 1, 0.5, 1 ); #/ } devgui_zombie_healthbar() { /# - 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; + 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; + } #/ - } } zombie_devgui_watch_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++; + flag_wait( "start_zombie_round_logic" ); + wait 1; + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + players[i] thread watch_debug_input(); #/ - } } 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; - while ( isDefined( callback ) ) - { - level.devgui_dpad_watch = 1; - for ( ;; ) - { - while ( 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; + + if ( isdefined( callback ) ) + { + level.devgui_dpad_watch = 1; + + for (;;) + { + if ( 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_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; + 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; + } #/ - } - } - } - } } 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 ); - guy forceteleport( trace[ "position" ], player.angles + vectorScale( ( 0, 1, 0 ), 180 ) ); - 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.0 ); + guy forceteleport( trace["position"], player.angles + vectorscale( ( 0, 1, 0 ), 180.0 ) ); + 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 = 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 ); + 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 ); #/ } 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" ); - 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 ); + 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 ); #/ } any_player_in_noclip() { /# - _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; + foreach ( player in get_players() ) + { + if ( player isinmovemode( "ufo", "noclip" ) ) + return true; + } + + return false; #/ } diable_fog_in_noclip() { /# - 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 ); - } + 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 ); + } #/ - } } 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 + "]" ); - 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" ); + 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" ); #/ } 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" ); - while ( !is_true( self.preserving_turbines ) ) - { - self.preserving_turbines = 1; - while ( 1 ) - { - self.turbine_health = 1200; - wait 1; - } - } - self.preserving_turbines = 0; + 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; #/ } zombie_devgui_equipment_stays_healthy() { /# - 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; + 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; #/ } 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 ) ) - { - 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(); + 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(); #/ } zombie_devgui_build( buildable ) { /# - 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++; + 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 ); + } + } #/ - } } 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 ( 1 ) - { - 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 ( true ) + { + 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 ( 1 ) - { - 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 ( true ) + { + 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() ); - } - while ( isDefined( level.zombiemode_devgui_cymbal_monkey_give ) ) - { - self [[ level.zombiemode_devgui_cymbal_monkey_give ]](); - while ( 1 ) - { - 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() ); + + if ( isdefined( level.zombiemode_devgui_cymbal_monkey_give ) ) + { + self [[ level.zombiemode_devgui_cymbal_monkey_give ]](); + + while ( true ) + { + 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() ); - } - while ( isDefined( level.zombiemode_devgui_beacon_give ) ) - { - self [[ level.zombiemode_devgui_beacon_give ]](); - while ( 1 ) - { - 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() ); + + if ( isdefined( level.zombiemode_devgui_beacon_give ) ) + { + self [[ level.zombiemode_devgui_beacon_give ]](); + + while ( true ) + { + 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() ); - } - 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; + 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; + } + } #/ - } - } } 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() ); - } - while ( isDefined( level.zombiemode_devgui_nesting_dolls_give ) ) - { - self [[ level.zombiemode_devgui_nesting_dolls_give ]](); - while ( 1 ) - { - 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() ); + + if ( isdefined( level.zombiemode_devgui_nesting_dolls_give ) ) + { + self [[ level.zombiemode_devgui_nesting_dolls_give ]](); + + while ( true ) + { + 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() ); - } - while ( isDefined( level.zombiemode_devgui_quantum_bomb_give ) ) - { - self [[ level.zombiemode_devgui_quantum_bomb_give ]](); - while ( 1 ) - { - 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() ); + + if ( isdefined( level.zombiemode_devgui_quantum_bomb_give ) ) + { + self [[ level.zombiemode_devgui_quantum_bomb_give ]](); + + while ( true ) + { + 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() ); - } - while ( isDefined( level.zombiemode_devgui_emp_bomb_give ) ) - { - self [[ level.zombiemode_devgui_emp_bomb_give ]](); - while ( 1 ) - { - 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() ); + + if ( isdefined( level.zombiemode_devgui_emp_bomb_give ) ) + { + self [[ level.zombiemode_devgui_emp_bomb_give ]](); + + while ( true ) + { + self givemaxammo( "emp_grenade_zm" ); + wait 1; + } + } #/ - } - } } zombie_devgui_invulnerable( playerindex, onoff ) { /# - 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(); + 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(); + } #/ - } - } } 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" ); + 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 ); #/ } 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 ( 1 ) - { - 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 ( true ) + { + 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; - } - i = 0; - while ( i < vending_triggers.size ) - { - if ( vending_triggers[ i ].script_noteworthy == perk ) - { - vending_triggers[ i ] notify( "trigger" ); - return; - } - i++; + 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; + } + } #/ - } } zombie_devgui_give_powerup( powerup_name, now, origin ) { /# - 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" ] ); + 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"] ); #/ - } - } } 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(); - 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++; + 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 ); + } + } #/ - } - } } 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 ); - } - 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 ); + else + { + + } + + 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 ); - i = 0; - while ( i < level.zombie_vars.size ) - { - key = var_names[ i ]; - println( ( key + ": " ) + level.zombie_vars[ key ] ); - i++; - } - 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 ); + + for ( i = 0; i < level.zombie_vars.size; i++ ) + { + key = var_names[i]; + println( key + ": " + level.zombie_vars[key] ); + } + + println( "##### End Zombie Variables #####" ); #/ } zombie_devgui_pack_current_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++; + 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 ); + } + } + } #/ - } } zombie_devgui_unpack_current_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++; + 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 ); + } + } + } #/ - } } zombie_devgui_reopt_current_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++; + 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 ); + } + } + } #/ - } } zombie_devgui_take_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 ) ) - { - players[ i ] takeweapon( weap ); - players[ i ] switch_back_primary_weapon( undefined ); - } - } - i++; + 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 ); + } + } + } #/ - } } zombie_devgui_take_weapons( give_fallback ) { /# - 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++; + 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(); + } + } #/ - } } 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 = []; - _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" ); + 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" ); #/ } 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 b1364d4..bdf6897 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,201 +1,215 @@ -#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; +// 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; 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 ); - } - 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" ); - } + 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" ); + } } 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( #"4D1BCA99" ) ) - { - return; - } - if ( !isDefined( color ) ) - { - color = ( 0, 0, 1 ); - } - print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 ); -#/ -*/ -} + 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 ); +#/ +} 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 29bb3d6..d398dfe 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,915 +1,811 @@ -#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; +// 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; 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( #"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( _hash_53BD7080 ) == 1 ) + level thread hacker_debug(); } hacker_round_reward() { - 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; - } + 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; + } } hacker_debug() { - 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; - } + 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; /# - print3d( hackable.origin, "+", col, 1, 1 ); + print3d( hackable.origin, "+", col, 1, 1 ); #/ - } - else - { + } + else + { /# - print3d( hackable.origin, "+", vectorScale( ( 0, 0, 1 ), 255 ), 1, 1 ); + print3d( hackable.origin, "+", vectorscale( ( 0, 0, 1 ), 255.0 ), 1, 1 ); #/ - } - i++; - continue; - } - else - { + } + + continue; + } /# - print3d( hackable.origin, "+", vectorScale( ( 0, 0, 1 ), 255 ), 1, 1 ); + print3d( hackable.origin, "+", vectorscale( ( 1, 0, 0 ), 255.0 ), 1, 1 ); #/ - } - i++; - } - wait 0.1; - } + } + + 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 ( 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; - } + 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; + } } destroy_pooled_items() { - 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 = []; + 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 = []; } sweep_pooled_items() { - 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; + 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; } should_pooled_object_exist() { - 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; + 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; } add_eligable_pooled_items() { - 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++; - } + 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; + } } 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(); - i = 0; - while ( i < players.size ) - { - if ( players[ i ] hacker_active() ) - { - return 1; - } - i++; - } - return 0; + players = get_players(); + + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] hacker_active() ) + return true; + } + + return false; } 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; - } - 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++; - } + 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(); + } + } } 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 = []; - 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; - } + 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; + } } deregister_hackable( noteworthy ) { - 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; + 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; } hack_trigger_think() { - 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; - } + 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; + } } 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 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; + 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; } is_hacking( hackable ) { - if ( can_hack( hackable ) ) - { - return self usebuttonpressed(); - } + return can_hack( hackable ) && self usebuttonpressed(); } set_hack_hint_string() { - 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 ); - } - } + 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 ); + } } 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 = ( 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; + 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; } 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; - 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++; - } - } + 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 ); + } + } } 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 ); - 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.0 ); + 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 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; + 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; } hide_hint_when_hackers_active( custom_logic_func, custom_logic_func_param ) { - 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; - } + 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; + } } hacker_debug_print( msg, color ) { /# - if ( !getDvarInt( #"428DE100" ) ) - { - return; - } - if ( !isDefined( color ) ) - { - color = ( 0, 0, 1 ); - } - print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 ); + 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 ); #/ } - 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 9ec9f80..00436eb 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,776 +1,760 @@ -#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; +// 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; -//#using_animtree( "zombie_turbine" ); - -init( hint, howto ) //checked matches cerberus output +init( hint, howto ) { - 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() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onplayerspawned(); + } } -onplayerspawned() //checked matches cerberus output +onplayerspawned() { - 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() //checked matches cerberus output +setupwatchers() { - 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() //checked matches cerberus output +watchturbineuse() { - 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 ) //checked matches cerberus output +cleanupoldturbine( preserve_state ) { - 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; - } - } + 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; + } + } } -watchforcleanup() //checked matches cerberus output +watchforcleanup() { - 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 ) //checked matches cerberus output +depower_on_disconnect( 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 ); - } + 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 ) //checked matches cerberus output +placeturbine( origin, angles ) { - 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() //checked matches cerberus output +dropturbine() { - 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 ) //checked matches cerberus output +pickupturbine( item ) { - 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 ) //checked changed to match cerberus output +transferturbine( fromplayer, toplayer ) { - 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" ); - } + 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" ); } -startturbinedeploy( weapon ) //checked matches cerberus output +startturbinedeploy( 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 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 ( 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" ); - } + 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" ); + } } -turbine_watch_for_emp( weapon, powerradius ) //checked changed to match cerberus output +turbine_watch_for_emp( weapon, powerradius ) { - 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" ); + 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" ); } -turbinepowerthink( weapon, powerradius ) //checked changed to match cerberus output +turbinepowerthink( weapon, 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 ); - } + 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 ); + } + } } -turbinepowermove( weapon ) //checked matches cerberus output +turbinepowermove( weapon ) { - 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; - } + 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; + } } -turbinewarmup() //checked matches cerberus output //order of operations may need to be checked +turbinewarmup() { - 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; + 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; } -turbinepoweron( origin, powerradius ) //checked matches cerberus output +turbinepoweron( origin, powerradius ) { - 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(); - } + 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(); + } } -turbinepoweroff( origin, powerradius ) //checked matches cerberus output +turbinepoweroff( origin, powerradius ) { - 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(); - } - } + 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(); + } } -turbine_disappear_fx( origin, waittime ) //checked matches cerberus output +turbine_disappear_fx( origin, waittime ) { - 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 ) //checked matches cerberus output +turbinefxonce( withaoe ) { - 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 ); - } - } + 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 ); + } } -turbinefx() //checked matches cerberus output +turbinefx() { - 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; - } + 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; + } } -turbineaudio() //checked changed to match cerberus output +turbineaudio() { - 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 ); + 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 ); } -init_animtree() //checked matches cerberus output +init_animtree() { - scriptmodelsuseanimtree( -1 ); + scriptmodelsuseanimtree( -1 ); } -turbineanim( wait_for_end ) //checked changed to match cerberus output +#using_animtree("zombie_turbine"); + +turbineanim( wait_for_end ) { - 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; - } + 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 ); } -turbinedecay() //checked changed to match cerberus output //order of operations may need to be checked +turbinedecay() { - 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(); + 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(); } -destroy_placed_turbine() //checked matches cerberus output +destroy_placed_turbine() { - 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 ); - } + 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 ); + } } -wait_and_take_equipment() //checked matches cerberus output +wait_and_take_equipment() { - 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 ) //checked changed to match cerberus output +turbinepowerdiminish( origin, powerradius ) { - 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; - } - } + 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; + } } -debugturbine( radius ) //checked changed to match cerberus output may need to check order of operations +debugturbine( radius ) { - /* /# - 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; -#/ - } - */ -} + 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; + } +#/ +} 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 9f1549c..58d01d8 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_equipment.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_equipment.gsc @@ -1,1905 +1,1744 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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" ); + init_equipment_upgrade(); + onplayerconnect_callback( ::equipment_placement_watcher ); + level._equipment_disappear_fx = loadfx( "maps/zombie/fx_zmb_tranzit_electrap_explo" ); - if ( !is_true( level._no_equipment_activated_clientfield ) ) - { - 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" ); } -signal_equipment_activated( val ) //checked changed to match cerberus output +signal_equipment_activated( val ) { - 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 ); + 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 ); } -register_equipment( equipment_name, hint, howto_hint, hint_icon, equipmentvo, watcher_thread, transfer_fn, drop_fn, pickup_fn, place_fn ) //checked matches cerberus output +register_equipment( equipment_name, hint, howto_hint, hint_icon, equipmentvo, watcher_thread, transfer_fn, drop_fn, pickup_fn, place_fn ) { - 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; + 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; } -is_equipment_included( equipment_name ) //checked changed at own discretion +is_equipment_included( 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; + if ( !isdefined( level.zombie_include_equipment ) ) + return 0; + + return isdefined( level.zombie_include_equipment[equipment_name] ); } -include_zombie_equipment( equipment_name ) //checked matches cerberus output +include_zombie_equipment( equipment_name ) { - 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 ) //checked matches cerberus output +limit_zombie_equipment( equipment_name, limited ) { - 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() //checked changed to match cerberus output +init_equipment_upgrade() { - 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 ) //checked matches cerberus output +get_equipment_hint( equipment_name ) { -/* /# - 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 ) //checked matches cerberus output +get_equipment_howto_hint( equipment_name ) { -/* /# - 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 ) //checked matches cerberus output +get_equipment_icon( equipment_name ) { -/* /# - 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 ) //checked matches cerberus output +add_to_equipment_trigger_list( equipment_name ) { -/* /# - 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() //checked changed to match cerberus output +equipment_spawn_think() { - 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 ) //checked changed to match cerberus output +set_equipment_invisibility_to_player( equipment, 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 ); - } - } + 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 ) //checked matches cerberus output +equipment_take( equipment ) { - 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 ( 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 ] ); - } - } + 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] ); + } } -equipment_give( equipment ) //checked matches cerberus output +equipment_give( equipment ) { - 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 ) //checked changed to match cerberus output +equipment_slot_watcher( equipment ) { - 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; - } - } + 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; + } + } } -is_limited_equipment( equipment ) //checked changed to match cerberus output +is_limited_equipment( equipment ) { - if ( isDefined( level._limited_equipment ) ) - { - for ( i = 0; i < level._limited_equipment.size; i++ ) - { - if ( level._limited_equipment[ i ] == equipment ) - { - return 1; - } - } - } - return 0; + if ( isdefined( level._limited_equipment ) ) + { + for ( i = 0; i < level._limited_equipment.size; i++ ) + { + if ( level._limited_equipment[i] == equipment ) + return true; + } + } + + return false; } -limited_equipment_in_use( equipment ) //checked changed to match cerberus output +limited_equipment_in_use( equipment ) { - 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; + 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; } -setup_limited_equipment( equipment ) //checked changed to match cerberus output +setup_limited_equipment( 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 ); + 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 ) //checked changed to match cerberus output +release_limited_equipment_on_equipment_taken( equipment ) { - 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 ) //checked changed to match cerberus output +release_limited_equipment_on_disconnect( equipment ) { - 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 ) //changed at own discretion +is_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; + if ( !isdefined( self.current_equipment_active ) || !isdefined( self.current_equipment_active[equipment] ) ) + return 0; + + return self.current_equipment_active[equipment]; } -init_equipment_hint_hudelem( x, y, alignx, aligny, fontscale, alpha ) //checked matches cerberus output +init_equipment_hint_hudelem( x, y, alignx, aligny, fontscale, alpha ) { - 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() //checked matches cerberus output +setup_equipment_client_hintelem() { - 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 ); - } + 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 ); } -show_equipment_hint( equipment ) //checked matches cerberus output +show_equipment_hint( equipment ) { - 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 ); + 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 ); } -show_equipment_hint_text( text ) //checked matches cerberus output +show_equipment_hint_text( text ) { - 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 ) //checked partially changed to match cerberus output changed at own discretion +equipment_onspawnretrievableweaponobject( watcher, player ) { - 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"; - /* + 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"; /# - 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 -{ -/* + 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 ) ) - { - 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( player has_deployed_equipment( equipment ) ); #/ /# - assert( fromplayer has_player_equipment( weaponname ) ); + assert( !isdefined( player.current_equipment ) ); #/ -*/ - 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 ) + 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 ) +{ /# - assert( toplayer has_player_equipment( weaponname ) ); + if ( !isdefined( player.current_equipment ) || player.current_equipment != equipment ) + { +/# + assert( player has_deployed_equipment( equipment ) ); #/ /# - assert( !fromplayer has_player_equipment( weaponname ) ); + assert( !isdefined( player.current_equipment ) ); #/ -*/ - equipment_damage = 0; - toplayer player_set_equipment_damage( weaponname, fromplayer player_get_equipment_damage( weaponname ) ); - fromplayer player_set_equipment_damage( equipment_damage ); - } - else - { -/* + } +#/ + 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 ) ) + { /# - println( "ZM EQUIPMENT: " + weaponname + " swapped from " + fromplayer.name + " to " + toplayer.name + "\n" ); + println( "ZM EQUIPMENT: " + weaponname + " transferred from " + fromplayer.name + " to " + toplayer.name + "\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 ); - } -} - -equipment_release( equipment ) //checked matches cerberus output -{ -/* + toplayer equipment_orphaned( weaponname ); + wait 0.05; /# - println( "ZM EQUIPMENT: " + self.name + " release " + equipment + "\n" ); + assert( !toplayer has_player_equipment( weaponname ) ); #/ -*/ - 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 ); -/* /# - println( "ZM EQUIPMENT: " + self.name + " drop to planted " + equipment + "\n" ); + assert( fromplayer has_player_equipment( 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 ); - } -/* + 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 ); /# - println( "ZM EQUIPMENT: " + self.name + " dropped " + equipment + "\n" ); + assert( toplayer has_player_equipment( weaponname ) ); #/ -*/ - } - else - { - self equipment_take(); - } - self notify( "equipment_dropped" ); -} - -equipment_grab( equipment, item ) //checked matches cerberus output -{ -/* /# - println( "ZM EQUIPMENT: " + self.name + " picked up " + equipment + "\n" ); + assert( !fromplayer has_player_equipment( weaponname ) ); #/ -*/ - 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 -{ -/* + 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: " + self.name + " orphaned " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + weaponname + " swapped from " + fromplayer.name + " to " + toplayer.name + "\n" ); #/ -*/ - self equipment_take( equipment ); + 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_to_deployed( equipment ) //checked matches cerberus output +equipment_release( equipment ) { -/* /# - println( "ZM EQUIPMENT: " + self.name + " deployed " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " release " + equipment + "\n" ); #/ -*/ - if ( !isDefined( self.deployed_equipment ) ) - { - self.deployed_equipment = []; - } -/* + self equipment_take( equipment ); +} + +equipment_drop( equipment ) +{ + if ( isdefined( level.zombie_equipment[equipment].place_fn ) ) + { + equipment_drop_to_planted( equipment, self ); /# - assert( self.current_equipment == equipment ); + println( "ZM EQUIPMENT: " + self.name + " drop to planted " + equipment + "\n" ); #/ -*/ - 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, "" ); -} + } + else if ( isdefined( level.zombie_equipment[equipment].drop_fn ) ) + { + if ( isdefined( self.current_equipment ) && self.current_equipment == equipment ) + self equipment_to_deployed( equipment ); -equipment_from_deployed( equipment ) //checked matches cerberus output -{ - if ( !isDefined( equipment ) ) - { - equipment = "none"; - } -/* + 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 ); + } /# - println( "ZM EQUIPMENT: " + self.name + " retrieved " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " dropped " + equipment + "\n" ); #/ -*/ - if ( isDefined( self.current_equipment ) && equipment != self.current_equipment ) - { - self equipment_drop( self.current_equipment ); - } -/* + } + else + self equipment_take(); + + self notify( "equipment_dropped", equipment ); +} + +equipment_grab( equipment, item ) +{ /# - assert( self has_deployed_equipment( equipment ) ); + println( "ZM EQUIPMENT: " + self.name + " picked up " + equipment + "\n" ); #/ -*/ - 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" ); + 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 ); + } } -eqstub_get_unitrigger_origin() //checked matches cerberus output +equipment_orphaned( equipment ) { - 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 + " bought " + equipment + "\n" ); + println( "ZM EQUIPMENT: " + self.name + " orphaned " + 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 equipment_take( equipment ); } -generate_equipment_unitrigger( classname, origin, angles, flags, radius, script_height, hint, icon, think, moving ) //checked matches cerberus output +equipment_to_deployed( equipment ) { - 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 -{ -/* /# - if ( isDefined( player.pickup_equipment )assert( !player.pickup_equipment ); + println( "ZM EQUIPMENT: " + self.name + " deployed " + equipment + "\n" ); #/ -*/ - 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 -{ -/* + if ( !isdefined( self.deployed_equipment ) ) + self.deployed_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; + assert( self.current_equipment == 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, "" ); } -debughealth() //dev call did not check +equipment_from_deployed( equipment ) { -/* + if ( !isdefined( equipment ) ) + equipment = "none"; /# - 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; + println( "ZM EQUIPMENT: " + self.name + " retrieved " + equipment + "\n" ); #/ - } -*/ -} - -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" ); -/* + if ( isdefined( self.current_equipment ) && equipment != self.current_equipment ) + self equipment_drop( self.current_equipment ); /# - self thread debughealth(); + assert( self has_deployed_equipment( equipment ) ); #/ -*/ - 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; - } + 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" ); } -attack_item( item ) //checked changed to match cerberus output +eqstub_get_unitrigger_origin() { - 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" ); + 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; } -attack_item_interrupt( item ) //checked matches cerberus output +eqstub_on_spawn_trigger( trigger ) { - 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; + if ( isdefined( self.link_parent ) ) + { + trigger enablelinkto(); + trigger linkto( self.link_parent ); + trigger setmovingplatformenabled( 1 ); + } } -attack_item_stop( item ) //checked matches cerberus output +equipment_buy( 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 ]](); - } +/# + 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 ); } -window_notetracks( msg, equipment ) //checked matches cerberus output +generate_equipment_unitrigger( classname, origin, angles, flags, radius, script_height, hint, icon, think, moving ) { - 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 ); - } - } + 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; } -destructible_equipment_list_check() //checked changed at own discretion +can_pick_up_equipment( equipment_name, equipment_trigger ) { - 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 ); - } - } + 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; } -destructible_equipment_list_add( item ) //checked matches cerberus output +same_team_placed_equipment( equipment_trigger ) { - destructible_equipment_list_check(); - level.destructible_equipment[ level.destructible_equipment.size ] = item; + 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"]; } -get_destructible_equipment_list() //checked matches cerberus output +placed_equipment_think( model, equipname, origin, angles, tradius, toffset ) { - destructible_equipment_list_check(); - return level.destructible_equipment; + 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; } -equipment_disappear_fx( origin, fx, angles ) //checked matches cerberus output +watch_player_visibility( equipment ) { - 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; + 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; + } } +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 a44bfe9..c0df62d 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_ffotd.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_ffotd.gsc @@ -1,221 +1,214 @@ -#include maps/mp/zombies/_zm_stats; -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; -main_start() //checked matches cerberus output +main_start() { - 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; - } + 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; + } } -main_end() //checked matches cerberus output +main_end() { - 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() //checked changed to match cerberus output +force_navcomputer_trigger_think() { - 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; - } - } - } + 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; + } + } + } } -transit_navcomputer_remove_card_on_success() //checked changed to match cerberus output +transit_navcomputer_remove_card_on_success() { - 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(); - } + 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(); + } } -sq_refresh_player_navcard_hud() //checked changed to match cerberus output +sq_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 = navcard_bits + 1; - } - } - 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 += ( 1 << i ); + } + + 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 detected" ); + iprintlnbold( "player exploit detectect" ); #/ - */ - return 1; - } - return 0; + return true; + } + + return false; } -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 +path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ) { - 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 ( 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 ); - } - } + 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 ); + } } -exploit_reroute( zombie_trigger, player_trigger_origin, player_trigger_radius, zombie_goto_point ) //checked matches cerberus output +exploit_reroute( zombie_trigger, player_trigger_origin, player_trigger_radius, zombie_goto_point ) { - 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; + 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; } -debug_exploit( player_origin, player_radius, enemy_origin, enemy_radius, zombie_goto_point ) //dev call commented out +debug_exploit( player_origin, player_radius, enemy_origin, enemy_radius, zombie_goto_point ) { -/* /# - 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; + 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; + } #/ - } -*/ } -ffotd_melee_miss_func() //checked matches cerberus output +ffotd_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 ]](); - } -} + 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 069cf97..ca8ad48 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 @@ -#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; +// 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; -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 +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 ) { - 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 ) - { - /* + 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 ) + { /# - 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 + ")" ); #/ - */ - } - 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++; + } + } + + 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 ) //checked matches cerberus output +set_current_game_module( game_module_index ) { - 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() //checked matches cerberus output +get_current_game_module() { - return get_game_module( level.current_game_module ); + return get_game_module( level.current_game_module ); } -get_game_module( game_module_index ) //checked changed to match cerberus output +get_game_module( game_module_index ) { - 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() //checked matches cerberus output +game_module_pre_zombie_spawn_init() { - 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() //checked matches cerberus output +game_module_post_zombie_spawn_init() { - 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() //checked changed to match cerberus output +kill_all_zombies() { - 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 ) //checked changed to match cerberus output +freeze_players( freeze ) { - 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() //checked changed at own discretion +turn_power_on_and_open_doors() { - 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" ); - } - } + 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" ); + } } -respawn_spectators_and_freeze_players() //checked changed to match cerberus output +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 ); - } + 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 ) //checked matches cerberus output +damage_callback_no_pvp_damage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) { - 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() //checked changed to match cerberus output +respawn_players() { - 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 ) //checked changed to match cerberus output +zombie_goto_round( target_round ) { - 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() //checked partially changed to match cerberus output //did not use foreach with continue to prevent continue bug +wait_for_team_death_and_round_end() { - 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; - } + 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; + } } -reset_grief() //checked matches cerberus output +reset_grief() { - wait 1; - level.isresetting_grief = 0; + wait 1; + level.isresetting_grief = 0; } -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 +check_for_round_end( winner ) { - 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" ); + 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" ); } -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_for_team_death() { - 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 ); + 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 ); } -make_supersprinter() //checked matches cerberus output +make_supersprinter() { - self set_zombie_run_cycle( "super_sprint" ); + self set_zombie_run_cycle( "super_sprint" ); } -game_module_custom_intermission( intermission_struct ) //checked matches cerberus output +game_module_custom_intermission( intermission_struct ) { - 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 ) //checked changed to match cerberus output +create_fireworks( launch_spots, min_wait, max_wait, randomize ) { - 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 ); - } + 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 ) ); + } } -fireworks_launch( launch_spot ) //checked matches cerberus output +fireworks_launch( launch_spot ) { - 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 fd96161..ee0a6a1 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_gump.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_gump.gsc @@ -1,89 +1,76 @@ -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; -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 ); - } +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 ); } -player_teleport_blackscreen_on() //checked matches cerberus output +player_teleport_blackscreen_on() { - 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 ); - } + 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 ); + } } -player_connect_gump() //checked matches cerberus output +player_connect_gump() { + } -player_watch_spectate_change() //checked matches cerberus output +player_watch_spectate_change() { - 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 ); - } + 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 ); + } } 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 88fd512..2d7654d 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,131 +1,126 @@ -#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; +// 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; hack_boards() { - 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++; - } + 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 ); + } } 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 ( 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" ); + 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" ); } board_qualifier( player ) { - if ( all_chunks_intact( self.window, self.window.barrier_chunks ) || no_valid_repairable_boards( self.window, self.window.barrier_chunks ) ) - { - return 0; - } - return 1; -} + if ( all_chunks_intact( self.window, self.window.barrier_chunks ) || no_valid_repairable_boards( self.window, self.window.barrier_chunks ) ) + return false; + return true; +} 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 235fe8b..e9e2fb3 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,371 +1,349 @@ -#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; +// 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; box_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(); + 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(); } 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 0; - } - return 1; + 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; } custom_box_move_logic() { - 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; - } - } + 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; + } } check_for_free_locations( 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; + 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; } 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 ); - 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.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_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 1; - } - return 0; + if ( player == self.chest.chest_user && isdefined( self.chest.weapon_out ) ) + return true; + + return false; } 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 ); - 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.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_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,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 ); + 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 ); } 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; - 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(); - } + 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(); } init_summon_hacks() { - chests = getstructarray( "treasure_chest_use", "targetname" ); - i = 0; - while ( i < chests.size ) - { - chest = chests[ i ]; - chest init_summon_box( chest.hidden ); - i++; - } + chests = getstructarray( "treasure_chest_use", "targetname" ); + + for ( i = 0; i < chests.size; i++ ) + { + chest = chests[i]; + chest init_summon_box( chest.hidden ); + } } 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 ); - 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.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; + } } 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 0; - } - if ( isDefined( self.chest.zbarrier.chest_moving ) && self.chest.zbarrier.chest_moving ) - { - return 0; - } - return 1; -} + 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; +} 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 1c632c5..bd4c4f9 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,108 +1,100 @@ -#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; +// 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; door_struct_debug() { - 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 ); - } + 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 ); /# - 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; - } - 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++; - } + 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 ); + } } 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 = []; - 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++; - } -} + 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] ); +} 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 c9fba2a..bf17999 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,46 +1,47 @@ -#include maps/mp/zombies/_zm_equip_hacker; -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; 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 ); - 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.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(); + } } pack_trigger_think() { - if ( !flag_exists( "enter_nml" ) ) - { - return; - } - while ( 1 ) - { - flag_wait( "enter_nml" ); - self.script_int = -1000; - while ( flag( "enter_nml" ) ) - { - wait 1; - } - } + if ( !flag_exists( "enter_nml" ) ) + return; + + while ( true ) + { + flag_wait( "enter_nml" ); + self.script_int = -1000; + + while ( flag( "enter_nml" ) ) + wait 1.0; + } } 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 18cd74b..1591790 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,87 +1,80 @@ -#include maps/mp/zombies/_zm_equip_hacker; -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; hack_perks() { - 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; + 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; } 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 0; - } - if ( isDefined( self.perk ) && isDefined( self.perk.script_noteworthy ) ) - { - if ( player hasperk( self.perk.script_noteworthy ) ) - { - return 1; - } - } - return 0; + 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; } 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 ); - 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++; - } - } + 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; + } } - 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 318339f..a1aedc6 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,79 +1,82 @@ -#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; +// 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; unhackable_powerup( name ) { - ret = 0; - switch( name ) - { - case "bonus_points_player": - case "bonus_points_team": - case "lose_points_team": - case "random_weapon": - ret = 1; - break; - } - return ret; + ret = 0; + + switch ( name ) + { + case "random_weapon": + case "lose_points_team": + case "bonus_points_team": + case "bonus_points_player": + ret = 1; + break; + } + + return ret; } hack_powerups() { - 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 ); - } - } + 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 ); + } + } } 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 950a1a5..e82eadf 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,55 +1,46 @@ -#include maps/mp/zombies/_zm_equip_hacker; -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; hack_wallbuys() { - 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 ); + 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 ); } 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 22c1830..8dd9032 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,557 +1,530 @@ -#include maps/mp/zombies/_zm_audio; -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; 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; - } - 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 ); + 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 ); } 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; - 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.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 ); + } } 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; - 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; + 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; /# - if ( getDvarInt( #"D5FD01C3" ) ) - { - if ( getDvar( #"E2494021" ) != "" ) - { - z_dist *= getDvarFloat( #"E2494021" ); - } - if ( getDvar( #"4E3BC729" ) != "" ) - { - forward_scaling = getDvarFloat( #"4E3BC729" ); + if ( getdvarint( _hash_D5FD01C3 ) ) + { + if ( getdvar( _hash_E2494021 ) != "" ) + z_dist *= getdvarfloat( _hash_E2494021 ); + + if ( getdvar( _hash_4E3BC729 ) != "" ) + forward_scaling = getdvarfloat( _hash_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( #"D5FD01C3" ) ) - { - if ( getDvar( #"E2494021" ) != "" ) - { - z_dist *= getDvarFloat( #"E2494021" ); - } - if ( getDvar( #"4E3BC729" ) != "" ) - { - forward_scaling = getDvarFloat( #"4E3BC729" ); + if ( getdvarint( _hash_D5FD01C3 ) ) + { + if ( getdvar( _hash_E2494021 ) != "" ) + z_dist *= getdvarfloat( _hash_E2494021 ); + + if ( getdvar( _hash_4E3BC729 ) != "" ) + forward_scaling = getdvarfloat( _hash_4E3BC729 ); + } #/ - } - } - } - else - { - if ( z_dist < 0 ) - { - z_dist *= 2,4; - forward_scaling = 1; + } + else if ( z_dist < 0 ) + { + z_dist *= 2.4; + forward_scaling = 1.0; /# - if ( getDvarInt( #"D5FD01C3" ) ) - { - if ( getDvar( #"E2494021" ) != "" ) - { - z_dist *= getDvarFloat( #"E2494021" ); - } - if ( getDvar( #"4E3BC729" ) != "" ) - { - forward_scaling = getDvarFloat( #"4E3BC729" ); + if ( getdvarint( _hash_D5FD01C3 ) ) + { + if ( getdvar( _hash_E2494021 ) != "" ) + z_dist *= getdvarfloat( _hash_E2494021 ); + + if ( getdvar( _hash_4E3BC729 ) != "" ) + forward_scaling = getdvarfloat( _hash_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 ) ) - { - } - 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++; - } - } - } + 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] ); + } + } } 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 ( 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(); - } + 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(); + } } 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; - 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++; - } + 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 ); + } } jump_pad_ignore_poi_cleanup( 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++; - } + 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 ); + } + } } stop_chasing_the_sky( ent_poi ) { - 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" ); + 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" ); } 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 ) - { - } - default: - if ( isDefined( level._jump_pad_level_behavior ) ) - { - self [[ level._jump_pad_level_behavior ]]( 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; + } } 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 52d147a..b0b5e90 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_laststand.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_laststand.gsc @@ -1,1442 +1,1346 @@ -//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; +// 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; -laststand_global_init() //checked matches cerberus output +laststand_global_init() { - 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() //checked matches cerberus output //checked matches beta dump +init() { - 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; + 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; } -player_is_in_laststand() //checked changed to match cerberus output //changed at own discretion +player_is_in_laststand() { - if ( !is_true( self.no_revive_trigger ) && isDefined( self.revivetrigger ) ) - { - return 1; - } - if ( is_true( self.laststand ) ) - { - return 1; - } - return 0; + if ( !( isdefined( self.no_revive_trigger ) && self.no_revive_trigger ) ) + return isdefined( self.revivetrigger ); + else + return isdefined( self.laststand ) && self.laststand; } -player_num_in_laststand() //checked changed to match cerberus output //checked matches beta dump +player_num_in_laststand() { - 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() //checked changed at own discretion //checked matches beta dump +player_all_players_in_laststand() { - if ( player_num_in_laststand() == get_players().size ) - { - return 1; - } - return 0; + return player_num_in_laststand() == get_players().size; } -player_any_player_in_laststand() //checked changed at own discretion //checked matches beta dump +player_any_player_in_laststand() { - if ( player_num_in_laststand() > 0 ) - { - return 1; - } - return 0; + return player_num_in_laststand() > 0; } -player_last_stand_stats( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output +player_last_stand_stats( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - 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(); - } + 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(); + } } -increment_downed_stat() //checked matches cerberus output +increment_downed_stat() { - 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 ); + 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 ); } -playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) //checked matches cerberus output //checked changed to match beta dump +playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { - 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(); + 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(); } -refire_player_downed() //checked matches cerberus output +refire_player_downed() { - self endon( "player_revived" ); - self endon( "death" ); - self endon( "disconnect" ); - wait 1; - if ( self.num_perks ) - { - self notify( "player_downed" ); - } + self endon( "player_revived" ); + self endon( "death" ); + self endon( "disconnect" ); + wait 1.0; + + if ( self.num_perks ) + self notify( "player_downed" ); } -laststand_allowed( sweapon, smeansofdeath, shitloc ) //checked matches cerberus output +laststand_allowed( sweapon, smeansofdeath, shitloc ) { - if ( level.laststandpistol == "none" ) - { - return 0; - } - return 1; + if ( level.laststandpistol == "none" ) + return false; + + return true; } -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 +laststand_disable_player_weapons() { - 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" ); + 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" ); } -laststand_enable_player_weapons() //checked matches cerberus output +laststand_enable_player_weapons() { - 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 ] ); - } - } + 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] ); + } } -laststand_clean_up_on_disconnect( playerbeingrevived, revivergun ) //checked matches cerberus output +laststand_clean_up_on_disconnect( playerbeingrevived, 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 ); + 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 ) //checked changed to match cerberus output +laststand_clean_up_reviving_any( playerbeingrevived ) { - 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 ( self.is_reviving_any < 0 ) - { - self.is_reviving_any = 0; - } + if ( 0 > self.is_reviving_any ) + self.is_reviving_any = 0; } -laststand_give_pistol() //checked changed to match cerberus output +laststand_give_pistol() { - /* /# - 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 ) //checked changed to match cerberus output +laststand_bleedout( delay ) { - 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(); + 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(); } -bleed_out() //checked changed to match cerberus output +bleed_out() { - 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; - } + 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; } -cleanup_suicide_hud() //checked matches cerberus output +cleanup_suicide_hud() { - 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() //checked matches cerberus output +clean_up_suicide_hud_on_end_game() { - 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() //checked matches cerberus output +clean_up_suicide_hud_on_bled_out() { - 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() //checked matches cerberus output +suicide_trigger_spawn() { - 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(); + 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(); } -suicide_trigger_think() //checked changed to match cerberus output +suicide_trigger_think() { - 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; - } + 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; + } } -suicide_do_suicide( duration ) //checked matches cerberus output +suicide_do_suicide( duration ) { - 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() //checked matches cerberus output +can_suicide() { - 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; + 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; } -is_suiciding( revivee ) //checked changed at own discretion +is_suiciding( revivee ) { - if ( self usebuttonpressed() && can_suicide() ) - { - return 1; - } - return 0; + return self usebuttonpressed() && can_suicide(); } -revive_trigger_spawn() //checked changed to match cerberus output +revive_trigger_spawn() { - 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(); + 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(); } -revive_trigger_think() //checked partially changed to match cerberus output //did not change while loop to for loop because of infinite loop continue bug +revive_trigger_think() { - 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(); - /* + 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(); /# - assert( isDefined( gun ) ); + assert( isdefined( gun ) ); #/ - */ - 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++; - } - } + 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; + } + } + } } -revive_give_back_weapons( gun ) //checked matches cerberus output +revive_give_back_weapons( gun ) { - 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 ) //checked changed to match cerberus output +can_revive( revivee ) { - 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; + 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; } -is_reviving( revivee ) //checked changed at own discretion +is_reviving( revivee ) { - if ( self usebuttonpressed() && can_revive( revivee ) ) - { - return 1; - } - return 0; + return self usebuttonpressed() && can_revive( revivee ); } -is_reviving_any() //checked changed at own discretion +is_reviving_any() { - if ( is_true( self.is_reviving_any ) ) - { - return 1; - } - return 0; + return isdefined( self.is_reviving_any ) && self.is_reviving_any; } -is_facing( facee ) //checked matches cerberus output +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 ); - 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 ) //checked changed to match cerberus output +revive_do_revive( playerbeingrevived, revivergun ) { - /* /# - assert( self is_reviving( playerbeingrevived ) ); + assert( self is_reviving( playerbeingrevived ) ); #/ - */ - 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--; + revivetime = 3; - if ( !revived ) - { - playerbeingrevived thread checkforbleedout( self ); - } - return revived; + 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; } -checkforbleedout( player ) //checked matches cerberus output +checkforbleedout( player ) { - 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 ) //checked changed to match cerberus output +auto_revive( reviver, dont_enable_weapons ) { - 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" ); + 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 ); } -remote_revive( reviver ) //checked matches cerberus output +remote_revive( reviver ) { - 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 ) //checked changed to match cerberus output +revive_success( reviver, b_track_stats ) { - 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; + 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; } -revive_force_revive( reviver ) //checked matches cerberus output +revive_force_revive( reviver ) { - /* /# - 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() //checked matches cerberus output +revive_hud_create() { - 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() //checked partially changed to match cerberus output //did not change while loops to for loops to prevent infinite loop bug due to continue +revive_hud_think() { - 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; - } - } + 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; + } + } } -faderevivemessageover( playertorevive, time ) //checked matches cerberus output +faderevivemessageover( playertorevive, time ) { - 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() //checked matches cerberus output +revive_hud_show() { - /* /# - 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 ) //checked matches cerberus output +revive_hud_show_n_fade( time ) { - 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 ) //checked matches cerberus output //may need to review order of operations +drawcylinder( pos, rad, height ) { - /* /# - 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++; + 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 ) ); + } #/ - } - */ } -get_lives_remaining() //checked matches cerberus output +get_lives_remaining() { - /* /# - 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 ) //checked changed to match cerberus output //probably causes a crash since ternary operators may not be supported by the current compiler +update_lives_remaining( increment ) { - /* /# - 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: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 ); + 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" ); } -player_getup_setup() //checked matches cerberus output +player_getup_setup() { - /* /# - 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() //checked matches cerberus output +laststand_getup() { - 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() //checked matches cerberus output +laststand_getup_damage_watcher() { - 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; - } - } + 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; + } } -laststand_getup_hud() //checked matches cerberus output +laststand_getup_hud() { - 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; - } + 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; + } } -laststand_getup_hud_destroy( hudelem ) //checked matches cerberus output +laststand_getup_hud_destroy( hudelem ) { - self waittill_either( "player_revived", "disconnect" ); - hudelem destroy(); + self waittill_either( "player_revived", "disconnect" ); + hudelem destroy(); } -check_for_sacrifice() //checked matches cerberus output +check_for_sacrifice() { - 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 ) //checked matches cerberus output +check_for_failed_revive( playerbeingrevived ) { - 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() //checked matches cerberus output +add_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 ); + 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 ); } -cleanup_laststand_on_disconnect() //checked matches cerberus output +cleanup_laststand_on_disconnect() { - 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 ce8b15c..20e7048 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_magicbox.gsc @@ -1,1620 +1,1542 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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(); + 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(); } -treasure_chest_init( start_chest_name ) //checked changed to match cerberus output +treasure_chest_init( start_chest_name ) { - 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 ); + 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 ); } -init_starting_chest_location( start_chest_name ) //checked changed to match cerberus output +init_starting_chest_location( start_chest_name ) { - 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 ]](); + 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 ]](); } -set_treasure_chest_cost( cost ) //checked matches cerberus output +set_treasure_chest_cost( cost ) { - level.zombie_treasure_chest_cost = cost; + level.zombie_treasure_chest_cost = cost; } -get_chest_pieces() //checked changed to match cerberus output +get_chest_pieces() { - 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 ) //checked matches cerberus output +boxtrigger_update_prompt( player ) { - 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 ) //checked matches cerberus output +boxstub_update_prompt( player ) { - 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; + 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; } -default_magic_box_check_equipment( weapon ) //checked matches cerberus output +default_magic_box_check_equipment( weapon ) { - return is_offhand_weapon( weapon ); + return is_offhand_weapon( weapon ); } -trigger_visible_to_player( player ) //checked changed to match cerberus output +trigger_visible_to_player( player ) { - 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; + 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; } -magicbox_unitrigger_think() //checked changed to match cerberus output +magicbox_unitrigger_think() { - self endon( "kill_trigger" ); - while ( 1 ) - { - self waittill( "trigger", player ); - self.stub.trigger_target notify( "trigger", player ); - } + self endon( "kill_trigger" ); + + while ( true ) + { + self waittill( "trigger", player ); + + self.stub.trigger_target notify( "trigger", player ); + } } -play_crazi_sound() //checked matches cerberus output +play_crazi_sound() { - self playlocalsound( level.zmb_laugh_alias ); + self playlocalsound( level.zmb_laugh_alias ); } -show_chest_sound_thread() //checked matches cerberus output +show_chest_sound_thread() { - self.zbarrier setclientfield( "zbarrier_show_sounds", 1 ); - wait 1; - self.zbarrier setclientfield( "zbarrier_show_sounds", 0 ); + self.zbarrier setclientfield( "zbarrier_show_sounds", 1 ); + wait 1.0; + self.zbarrier setclientfield( "zbarrier_show_sounds", 0 ); } -show_chest() //checked matches cerberus output +show_chest() { - 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() //checked matches cerberus output +hide_chest_sound_thread() { - self.zbarrier setclientfield( "zbarrier_leave_sounds", 1 ); - wait 1; - self.zbarrier setclientfield( "zbarrier_leave_sounds", 0 ); + self.zbarrier setclientfield( "zbarrier_leave_sounds", 1 ); + wait 1.0; + self.zbarrier setclientfield( "zbarrier_leave_sounds", 0 ); } -hide_chest( doboxleave ) //checked matches cerberus output +hide_chest( doboxleave ) { - 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" ); - } - } + 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" ); + } } -magic_box_zbarrier_leave() //checked matches cerberus output +magic_box_zbarrier_leave() { - 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() //checked partially changed to match cerberus output +default_pandora_fx_func() { - 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" ); - } + 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" ); } -default_pandora_show_func( anchor, anchortarget, pieces ) //checked matches cerberus output +default_pandora_show_func( anchor, anchortarget, pieces ) { - 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() //checked matches cerberus output +unregister_unitrigger_on_kill_think() { - 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() //checked changed to match cerberus output +treasure_chest_think() { - self endon( "kill_chest_think" ); - user = undefined; - user_cost = undefined; - self.box_rerespun = undefined; - self.weapon_out = undefined; + 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 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(); + 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(); } -watch_for_emp_close() //checked changed to match cerberus output +watch_for_emp_close() { - 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 ); + 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 ); } -can_buy_weapon() //checked matches cerberus output +can_buy_weapon() { - 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; + 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; } -default_box_move_logic() //checked changed to match cerberus output +default_box_move_logic() { - 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 ) //checked changed to match cerberus output +treasure_chest_move( player_vox ) { - 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; + 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; } -fire_sale_fix() //checked matches cerberus output +fire_sale_fix() { - 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; - } + 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; + } } -check_for_desirable_chest_location() //checked changed to match cerberus output +check_for_desirable_chest_location() { - 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() //checked matches cerberus output +rotateroll_box() { - 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() //checked changed to match cerberus output +verify_chest_is_open() { - 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() //checked changed to match cerberus output +treasure_chest_timeout() { - 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() //checked matches cerberus output +treasure_chest_lid_open() { - 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 ) //checked matches cerberus output +treasure_chest_lid_close( timedout ) { - 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 ) //checked matches cerberus output +treasure_chest_chooserandomweapon( player ) { - 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 ) //checked matches cerberus output +treasure_chest_canplayerreceiveweapon( player, weapon, pap_triggers ) { - 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 ) //checked changed to match cerberus output +treasure_chest_chooseweightedrandomweapon( player ) { - 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( "scr_force_weapon" ); - if ( forced_weapon != "" && isDefined( level.zombie_weapons[ forced_weapon ] ) ) - { - arrayinsert( keys, forced_weapon, 0 ); + 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 ( 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 ) //checked matches cerberus output +weapon_is_dual_wield( name ) { - 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; - } + 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; + } } -weapon_show_hint_choke() //checked matches cerberus output +weapon_show_hint_choke() { - level._weapon_show_hint_choke = 0; - while ( 1 ) - { - wait 0.05; - level._weapon_show_hint_choke = 0; - } + for ( level._weapon_show_hint_choke = 0; 1; level._weapon_show_hint_choke = 0 ) + wait 0.05; } -decide_hide_show_hint( endon_notify, second_endon_notify, onlyplayer ) //checked changed to match cerberus output +decide_hide_show_hint( endon_notify, second_endon_notify, onlyplayer ) { - 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++; - } + 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++; + } } -get_left_hand_weapon_model_name( name ) //checked matches cerberus output +get_left_hand_weapon_model_name( name ) { - 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() //checked matches cerberus output +clean_up_hacked_box() { - 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 ) //checked changed to match cerberus output +treasure_chest_weapon_spawn( chest, player, respin ) { - 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(); - /* + 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(); /# - assert( isDefined( player ) ); + assert( isdefined( player ) ); #/ - */ - 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++ ) - { + self.weapon_string = undefined; + modelname = undefined; + rand = undefined; + number_cycles = 40; - 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" ); + 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" ); } -chest_get_min_usage() //checked matches cerberus output +chest_get_min_usage() { - min_usage = 4; - return min_usage; + min_usage = 4; + return min_usage; } -chest_get_max_usage() //checked matches cerberus output +chest_get_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; + 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 ) //checked matches cerberus output +timer_til_despawn( v_float ) { - 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() //checked matches cerberus output +treasure_chest_glowfx() { - 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 ) //checked matches cerberus output +treasure_chest_give_weapon( weapon_string ) { - 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() //checked matches cerberus output +magic_box_teddy_twitches() { - 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" ); - } + 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" ); + } } -magic_box_initial() //checked matches cerberus output +magic_box_initial() { - 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() //checked matches cerberus output +magic_box_leaves() { - 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() //checked matches cerberus output +magic_box_opens() { - 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() //checked matches cerberus output +magic_box_closes() { - 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() //checked matches cerberus output +magic_box_do_weapon_rise() { - 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() //checked matches cerberus output +magic_box_do_teddy_flyaway() { - self showzbarrierpiece( 3 ); - self setzbarrierpiecestate( 3, "closing" ); + self showzbarrierpiece( 3 ); + self setzbarrierpiecestate( 3, "closing" ); } -is_chest_active() //checked matches cerberus output +is_chest_active() { - 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; + 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; } -get_magic_box_zbarrier_state() //checked matches cerberus output +get_magic_box_zbarrier_state() { - return self.state; + return self.state; } -set_magic_box_zbarrier_state( state ) //checked changed to match cerberus output +set_magic_box_zbarrier_state( state ) { - 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 ) //checked matches cerberus output +process_magic_box_zbarrier_state( state ) { - 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() //checked changed to match cerberus output +magicbox_host_migration() { - 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(); - } - } + 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(); + } + } } - - - - - 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 3e8dacd..c4101f7 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,99 +1,106 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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" ); + 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" ); } -watch_for_lock() //checked matches cerberus output +watch_for_lock() { - 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() //checked matches cerberus output +clean_up_locked_box() { - 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() //checked matches cerberus output +magic_box_locks() { - 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() //checked matches cerberus output +magic_box_unlocks() { - 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 ) //checked matches cerberus output +set_locked_magicbox_state( state ) { - 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 d3aee82..c44750a 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_mgturret.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_mgturret.gsc @@ -1,339 +1,291 @@ -#include common_scripts/utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include common_scripts\utility; main() { - if ( getDvar( #"7C9A91DF" ) == "" ) - { - setdvar( "mgTurret", "off" ); - } - level.magic_distance = 24; - turretinfos = getentarray( "turretInfo", "targetname" ); - index = 0; - while ( index < turretinfos.size ) - { - turretinfos[ index ] delete(); - index++; - } + 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(); } set_difficulty( 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(); + 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() { - 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; + 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; } 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 ( 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 ) ); - } + 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 ) ); + } } 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; - } - else - { - 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; + } + + 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; - } - level._zm_mgturret_firing++; - wait time; - level._zm_mgturret_firing--; + if ( !isdefined( level._zm_mgturret_firing ) ) + level._zm_mgturret_firing = 0; + 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 ( 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; - } + 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; + } } 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 32f06cb..bdb71bc 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_net.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_net.gsc @@ -1,105 +1,95 @@ -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; -network_choke_init( id, max ) //checked matches cerberus output +network_choke_init( id, max ) { - 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 ) //checked matches cerberus output +network_choke_thread( id ) { - while ( 1 ) - { - wait_network_frame(); - wait_network_frame(); - level.zombie_network_choke_ids_count[ id ] = 0; - } + while ( true ) + { + wait_network_frame(); + wait_network_frame(); + level.zombie_network_choke_ids_count[id] = 0; + } } -network_choke_safe( id ) //checked matches cerberus output +network_choke_safe( id ) { - 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 ) //checked matches cerberus output +network_choke_action( id, choke_action, arg1, arg2, arg3 ) { -/* /# - 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 ) //checked matches cerberus output +network_entity_valid( entity ) { - if ( !isDefined( entity ) ) - { - return 0; - } - return 1; + if ( !isdefined( entity ) ) + return false; + + return true; } -network_safe_init( id, max ) //checked matches cerberus output +network_safe_init( id, max ) { - 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 ) //checked matches cerberus output +_network_safe_spawn( classname, origin ) { - return spawn( classname, origin ); + return spawn( classname, origin ); } -network_safe_spawn( id, max, classname, origin ) //checked matches cerberus output +network_safe_spawn( id, max, classname, origin ) { - 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 ) //checked matches cerberus output +_network_safe_play_fx_on_tag( fx, entity, tag ) { - 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 ) //checked matches cerberus output +network_safe_play_fx_on_tag( id, max, fx, entity, tag ) { - 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 ab7409c..082bf48 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,381 +1,395 @@ -#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; +// 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; -enable_electric_cherry_perk_for_level() //checked matches cerberus output +enable_electric_cherry_perk_for_level() { - 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 ]](); - } + 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 ]](); } -init_electric_cherry() //checked matches cerberus output +init_electric_cherry() { - 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() //checked matches cerberus output +electic_cherry_precache() { - 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() //checked matches cerberus output +electric_cherry_register_clientfield() { - registerclientfield( "toplayer", "perk_electric_cherry", 9000, 1, "int" ); + registerclientfield( "toplayer", "perk_electric_cherry", 9000, 1, "int" ); } -electric_cherry_set_clientfield( state ) //checked matches cerberus output +electric_cherry_set_clientfield( state ) { - self setclientfieldtoplayer( "perk_electric_cherry", state ); + self setclientfieldtoplayer( "perk_electric_cherry", state ); } -electric_cherry_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision ) //checked matches cerberus output +electric_cherry_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision ) { - 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() //checked changed to match cerberus output +electric_cherry_perk_machine_think() { - 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 ); - } + 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 ); + } } -electric_cherry_host_migration_func() //checked changed to match cerberus output +electric_cherry_host_migration_func() { - 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() //checked changed to match cerberus output +electric_cherry_laststand() { - 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() //checked matches cerberus output +electric_cherry_death_fx() { - 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() //checked matches cerberus output +electric_cherry_shock_fx() { - 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() //checked changed to match cerberus output +electric_cherry_stun() { - 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() //checked changed to match cerberus output +electric_cherry_reload_attack() { - 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" ); - } - } + 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" ); + } + } } -electric_cherry_cooldown_timer( str_current_weapon ) //checked matches cerberus output +electric_cherry_cooldown_timer( str_current_weapon ) { - 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 ) //checked changed to match cerberus output +check_for_reload_complete( weapon ) { - 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; - } - } + 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; + } + } } -weapon_replaced_monitor( weapon ) //checked changed to match cerberus output +weapon_replaced_monitor( weapon ) { - 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; - } - } + 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; + } + } } -electric_cherry_reload_fx( n_fraction ) //checked matches cerberus output +electric_cherry_reload_fx( n_fraction ) { - 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 ); + 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 ); } -electric_cherry_perk_lost() //checked matches cerberus output +electric_cherry_perk_lost() { - 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 fc9c614..50a3eef 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_perks.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_perks.gsc @@ -1,3931 +1,3811 @@ -#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; +// 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; -init() //checked partially changed to match cerberus output +init() { - 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 ); + level.additionalprimaryweapon_limit = 3; + level.perk_purchase_limit = 4; - 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.createfx_enabled ) + perks_register_clientfield(); + 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() //checked changed to match cerberus output +default_vending_precaching() { - 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 ]](); - } - } - } + 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 ]](); + } + } } -pap_weapon_move_in( trigger, origin_offset, angles_offset ) //checked matches cerberus output +pap_weapon_move_in( trigger, origin_offset, angles_offset ) { - 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 ); - } + 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 ); } -pap_weapon_move_out( trigger, origin_offset, interact_offset ) //checked matches cerberus output +pap_weapon_move_out( trigger, origin_offset, interact_offset ) { - 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 ); - } + 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 ); } -fx_ent_failsafe() //checked matches cerberus output +fx_ent_failsafe() { - wait 25; - self delete(); + wait 25; + self delete(); } -third_person_weapon_upgrade( current_weapon, upgrade_weapon, packa_rollers, perk_machine, trigger ) //checked matches cerberus output +third_person_weapon_upgrade( current_weapon, upgrade_weapon, packa_rollers, perk_machine, trigger ) { - 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; + 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; } -can_pack_weapon( weaponname ) //checked did not match cebrerus output changed at own discretion +can_pack_weapon( weaponname ) { - 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; + 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; } -player_use_can_pack_now() //checked changed to match cerberus output +player_use_can_pack_now() { - 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; + 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; } -vending_machine_trigger_think() //changed 3/30/20 4:17 pm //checked matches cerberus output +vending_machine_trigger_think() { - 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; - } + 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; + } } -vending_weapon_upgrade() //checked matches cerberus output +vending_weapon_upgrade() { - 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" ); - } + 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" ); + } } -shutoffpapsounds( ent1, ent2, ent3 ) //checked matches cerberus output +shutoffpapsounds( ent1, ent2, ent3 ) { - while ( 1 ) - { - level waittill( "Pack_A_Punch_off" ); - level thread turnonpapsounds( ent1 ); - ent1 stoploopsound( 0.1 ); - ent2 stoploopsound( 0.1 ); - ent3 stoploopsound( 0.1 ); - } + while ( true ) + { + level waittill( "Pack_A_Punch_off" ); + + level thread turnonpapsounds( ent1 ); + ent1 stoploopsound( 0.1 ); + ent2 stoploopsound( 0.1 ); + ent3 stoploopsound( 0.1 ); + } } -turnonpapsounds( ent ) //checked 3/30/20 4:18 pm //checked matches cerberus output +turnonpapsounds( ent ) { - 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() //checked 3/30/20 4:19 pm //checked matches cerberus output +vending_weapon_upgrade_cost() { - 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" ); - } + 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" ); + } } -wait_for_player_to_take( player, weapon, packa_timer, upgrade_as_attachment ) //changed 3/30/20 4:22 pm //checked matches cerberus output +wait_for_player_to_take( player, weapon, packa_timer, upgrade_as_attachment ) { - 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" ); - 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; - } + upgrade_weapon = upgrade_name; + self endon( "pap_timeout" ); + level endon( "Pack_A_Punch_off" ); - 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(); - /* + 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(); /# - if ( current_weapon == "none" ) - { - iprintlnbold( "WEAPON IS NONE, PACKAPUNCH RETRIEVAL DENIED" ); + if ( "none" == current_weapon ) + iprintlnbold( "WEAPON IS NONE, PACKAPUNCH RETRIEVAL DENIED" ); #/ - } - */ - 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; - } + 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; + } } -wait_for_timeout( weapon, packa_timer, player ) //checked //checked matches cerberus output +wait_for_timeout( weapon, packa_timer, player ) { - 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 ) //checked //checked matches cerberus output +wait_for_disconnect( player ) { - self endon( "pap_taken" ); - self endon( "pap_timeout" ); - name = player.name; - while ( isDefined( player ) ) - { - wait 0.1; - } - self notify( "pap_player_disconnected" ); -} + self endon( "pap_taken" ); + self endon( "pap_timeout" ); -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 -{ -/* + while ( isdefined( player ) ) + wait 0.1; /# - assert( !is_zombie_perk_bottle( gun ) ); + 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( 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() || 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(); - } + 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(); } -turn_packapunch_on() //checked changed to match cerberus output +turn_packapunch_on() { - 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() //checked matches cerberus output +activate_packapunch() { - 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; + 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; } -deactivate_packapunch() //checked matches cerberus output +deactivate_packapunch() { - self setmodel( level.machine_assets[ "packapunch" ].off_model ); + self setmodel( level.machine_assets["packapunch"].off_model ); } -do_initial_power_off_callback( machine_array, perkname ) //checked matches cerberus output +do_initial_power_off_callback( machine_array, perkname ) { - 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() //checked changed to match cerberus output +turn_sleight_on() { - 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 ); - } - } + 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 ); + } } -use_solo_revive() //checked matches cerberus output +use_solo_revive() { - 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; + 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; } -turn_revive_on() //checked partially changed to match cerberus output +turn_revive_on() { - 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 ); - } - } - } + 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 ); + } + } } -revive_solo_fx( machine_clip, blocker_model ) //checked matches cerberus output +revive_solo_fx( machine_clip, blocker_model ) { - 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" ); + 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" ); } -turn_jugger_on() //checked changed to match cerberus output +turn_jugger_on() { - 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 ); - } + 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 ); + } } -turn_doubletap_on() //checked changed to match cerberus output +turn_doubletap_on() { - 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 ); - } + 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 ); + } } -turn_marathon_on() //checked changed to match cerberus output +turn_marathon_on() { - 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 ); - } + 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 ); + } } -turn_deadshot_on() //checked changed to match cerberus output +turn_deadshot_on() { - 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 ); - } + 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 ); + } } -turn_tombstone_on() //checked changed to match cerberus output +turn_tombstone_on() { - 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; - } - } + 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; + } } -turn_additionalprimaryweapon_on() //checked changed to match cerberus output +turn_additionalprimaryweapon_on() { - 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 ); - } + 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 ); + } } -turn_chugabud_on() //checked changed to match cerberus output +turn_chugabud_on() { - 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; - } - } + 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; + } } -set_power_on( state ) //checked matches cerberus output +set_power_on( state ) { - self.power_on = state; + self.power_on = state; } -turn_perk_off( ishidden ) //checked matches cerberus output +turn_perk_off( ishidden ) { - 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() //checked matches cerberus output +play_loop_on_machine() { - 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 ) //checked matches cerberus output +perk_fx( fx, turnofffx ) { - 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() //checked partially changed to match cerberus output +electric_perks_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" ); - /* + 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" ); /# - iprintlnbold( "warning_given" ); + iprintlnbold( "warning_given" ); #/ - */ - } - i++; - } - } + } + } + } } -reset_vending_hint_string() //checked matches cerberus output +reset_vending_hint_string() { - 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 ); - } - } + 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 ); + } } -vending_trigger_think() //checked changed to match cerberus output +vending_trigger_think() { - 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; - /* + 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; /# - if ( getDvarInt( "zombie_cheat" ) >= 5 ) - { - cheat = 1; + if ( getdvarint( _hash_FA81816F ) >= 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 ) //checked matches cerberus output +vending_trigger_post_think( player, 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" ); + 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" ); } -solo_revive_buy_trigger_move( revive_trigger_noteworthy ) //checked changed to match cerberus output +solo_revive_buy_trigger_move( revive_trigger_noteworthy ) { - 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 ) //checked matches cerberus output +solo_revive_buy_trigger_move_trigger( revive_perk_trigger ) { - 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 ) //checked matches cerberus output +wait_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 ); + 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() //checked changed to match cerberus output +return_retained_perks() { - 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 ); - } - } - } + 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 ); + } + } } -give_perk( perk, bought ) //checked changed to match cerberus output +give_perk( perk, bought ) { - 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 ); + 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 ); } -perk_set_max_health_if_jugg( perk, set_premaxhealth, clamp_health_to_max_health ) //checked matches cerberus output +perk_set_max_health_if_jugg( perk, set_premaxhealth, clamp_health_to_max_health ) { - 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 ) //checked partially changed to match cerberus output +check_player_has_perk( perk ) { - self endon( "death" ); - /* + self endon( "death" ); /# - if ( getDvarInt( "zombie_cheat" ) >= 5 ) - { - return; + if ( getdvarint( _hash_FA81816F ) >= 5 ) + return; #/ - } - */ - 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; - } + 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; + } } -vending_set_hintstring( perk ) //checked matches cerberus output +vending_set_hintstring( perk ) { - switch( perk ) - { - case "specialty_armorvest": - case "specialty_armorvest_upgrade": - break; - } + switch ( perk ) + { + case "specialty_armorvest_upgrade": + case "specialty_armorvest": + break; + } } -perk_think( perk ) //checked changed to match cerberus output +perk_think( perk ) { -/* /# - if ( getDvarInt( "zombie_cheat" ) >= 5 ) - { - if ( isDefined( self.perk_hud[ perk ] ) ) - { - return; + if ( getdvarint( _hash_FA81816F ) >= 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; - 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--; + perk_str = perk + "_stop"; + result = self waittill_any_return( "fake_death", "death", "player_downed", perk_str ); + do_retain = 1; - 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" ); + 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" ); } -set_perk_clientfield( perk, state ) //checked matches cerberus output +set_perk_clientfield( perk, 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 ); - } - } + 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 ); } -perk_hud_destroy( perk ) //checked changed to match cerberus output +perk_hud_destroy( perk ) { - 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 ) //checked matches cerberus output +perk_hud_grey( perk, grey_on_off ) { - if ( grey_on_off ) - { - self.perk_hud[ perk ].alpha = 0.3; - } - else - { - self.perk_hud[ perk ].alpha = 1; - } + if ( grey_on_off ) + self.perk_hud[perk].alpha = 0.3; + else + self.perk_hud[perk].alpha = 1.0; } -perk_hud_flash() //checked matches cerberus output +perk_hud_flash() { - 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 ) //checked matches cerberus output +perk_flash_audio( perk ) { - 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 ) //checked does not match cerberus output did not change +perk_hud_start_flash( 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 ); - } - } - } + 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 ); + } + } + } } -perk_hud_stop_flash( perk, taken ) //checked matches cerberus output +perk_hud_stop_flash( perk, taken ) { - 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 ) //checked matches cerberus output +perk_give_bottle_begin( perk ) { - 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; + 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; } -perk_give_bottle_end( gun, perk ) //checked matches cerberus output +perk_give_bottle_end( gun, perk ) { - 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 = ""; - 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(); - } + self enable_player_move_states(); + weapon = ""; + 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 ) //checked matches cerberus output +perk_abort_drinking( 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; - } - } + 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() //checked partially changed to match cerberus output +give_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; + 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; } -lose_random_perk() //checked partially changed to match cerberus output +lose_random_perk() { - 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--; + 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 ( 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 ) //checked changed to match cerberus output +quantum_bomb_give_nearest_perk_validation( position ) { - 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; + 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; } -quantum_bomb_give_nearest_perk_result( position ) //checked partially changed to match cerberus output +quantum_bomb_give_nearest_perk_result( position ) { - [[ 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++; - } + [[ 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 ]](); + } + } } -perk_pause( perk ) //checked changed to match cerberus output +perk_pause( perk ) { - 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 ]](); - } - /* + 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 ]](); /# - println( " ZM PERKS " + player.name + " paused perk " + perk + "\n" ); + println( " ZM PERKS " + player.name + " paused perk " + perk + "\n" ); #/ - */ - } - } + } + } } -perk_unpause( perk ) //checked changed to match cerberus output +perk_unpause( 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 ); - /* + 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 ); /# - 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() //checked changed to match cerberus output +perk_pause_all_perks() { - 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() //checked changed to match cerberus output +perk_unpause_all_perks() { - 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 ) //checked matches cerberus output +has_perk_paused( perk ) { - if ( isDefined( self.disabled_perks ) && is_true( self.disabled_perks[ perk ] ) ) - { - return 1; - } - return 0; + if ( isdefined( self.disabled_perks ) && isdefined( self.disabled_perks[perk] ) && self.disabled_perks[perk] ) + return true; + + return false; } -getvendingmachinenotify() //checked matches cerberus output +getvendingmachinenotify() { - 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; + 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; } -perk_machine_removal( machine, replacement_model ) //checked changed to match cerberus output +perk_machine_removal( machine, replacement_model ) { - 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(); - } + 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(); + } } perk_machine_spawn_init() { + match_string = ""; + location = level.scr_zm_map_start_location; - match_string = ""; + if ( ( location == "default" || location == "" ) && isdefined( level.default_start_location ) ) + location = level.default_start_location; - 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 + "_perks_" + location; + pos = []; - 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; - } - } - } -} + if ( isdefined( level.override_perk_targetname ) ) + structs = getstructarray( level.override_perk_targetname, "targetname" ); + else + structs = getstructarray( "zm_perk_machine", "targetname" ); -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; + 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 ); + } + } } -perks_register_clientfield() //checked matches cerberus output +get_perk_machine_start_state( perk ) { - 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 ( isdefined( level.vending_machines_powered_on_at_start ) && level.vending_machines_powered_on_at_start ) + return 1; -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 -{ -/* + if ( perk == "specialty_quickrevive" || perk == "specialty_quickrevive_upgrade" ) + { /# - assert( isDefined( str_perk ), "str_perk is a required argument for register_perk_basic_info!" ); + 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_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 ) //checked matches cerberus output +register_perk_machine( str_perk, func_perk_machine_setup, func_perk_machine_thread ) { -/* /# - 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 ) //checked matches cerberus output +register_perk_precache_func( str_perk, func_precache ) { -/* /# - 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 ) //checked matches cerberus output +register_perk_threads( str_perk, func_give_player_perk, func_take_player_perk ) { -/* /# - 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 ) //checked matches cerberus output +register_perk_clientfields( str_perk, func_clientfield_register, func_clientfield_set ) { -/* /# - 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 ) //checked matches cerberus output +register_perk_host_migration_func( str_perk, func_host_migration ) { -/* /# - 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 ) //checked matches cerberus output +_register_undefined_perk( str_perk ) { - 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 dd27be7..29557ea 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,665 +1,684 @@ -#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; +// 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; -pers_upgrade_init() //checked matches cerberus output +pers_upgrade_init() { - 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() //checked matches cerberus output +pers_abilities_init_globals() { - 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(); - } + 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(); } -is_pers_system_active() //checked matches cerberus output +is_pers_system_active() { - if ( !is_classic() ) - { - return 0; - } - if ( is_pers_system_disabled() ) - { - return 0; - } - return 1; + if ( !is_classic() ) + return false; + + if ( is_pers_system_disabled() ) + return false; + + return true; } -is_pers_system_disabled() //checked matches cerberus output +is_pers_system_disabled() { - if ( level flag_exists( "sq_minigame_active" ) && flag( "sq_minigame_active" ) ) - { - return 1; - } - return 0; + if ( level flag_exists( "sq_minigame_active" ) && flag( "sq_minigame_active" ) ) + return true; + + return false; } -setup_pers_upgrade_boards() //checked matches cerberus output +setup_pers_upgrade_boards() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_revive() //checked matches cerberus output +setup_pers_upgrade_revive() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_multi_kill_headshots() //checked matches cerberus output +setup_pers_upgrade_multi_kill_headshots() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_cash_back() //checked matches cerberus output +setup_pers_upgrade_cash_back() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_insta_kill() //checked matches cerberus output +setup_pers_upgrade_insta_kill() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_jugg() //checked matches cerberus output +setup_pers_upgrade_jugg() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_carpenter() //checked matches cerberus output +setup_pers_upgrade_carpenter() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_flopper() //checked matches cerberus output +setup_pers_upgrade_flopper() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_perk_lose() //checked matches cerberus output +setup_pers_upgrade_perk_lose() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_pistol_points() //checked matches cerberus output +setup_pers_upgrade_pistol_points() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_double_points() //checked matches cerberus output +setup_pers_upgrade_double_points() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_sniper() //checked matches cerberus output +setup_pers_upgrade_sniper() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_box_weapon() //checked matches cerberus output +setup_pers_upgrade_box_weapon() { - 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 ); - } + 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 ); + } } -setup_pers_upgrade_nube() //checked matches cerberus output +setup_pers_upgrade_nube() { - 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 ); - } + 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 ); + } } -pers_upgrade_boards_active() //checked matches cerberus output +pers_upgrade_boards_active() { - 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; - } + 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; + } + } + } + } } -pers_upgrade_revive_active() //checked matches cerberus output +pers_upgrade_revive_active() { - 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; - } - } - } + 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; + } + } + } } -pers_upgrade_headshot_active() //checked matches cerberus output +pers_upgrade_headshot_active() { - 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; - } - } - } + 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; + } + } + } } -pers_upgrade_cash_back_active() //checked matches cerberus output +pers_upgrade_cash_back_active() { - 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; - /* + 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" ); - /* + wait 0.5; + + while ( true ) + { + self waittill( "cash_back_failed_prone" ); + + wait 0.1; /# - 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; + +#/ + 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_perk_lose_active() //checked matches cerberus output +pers_upgrade_insta_kill_active() { - self endon( "disconnect" ); - wait 0.5; - /* + self endon( "disconnect" ); + wait 0.2; /# - 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" ); - /* + 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; /# - 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() //checked changed to match cerberus output +is_insta_kill_upgraded_and_active() { - 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 ); + 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; } -pers_upgrade_double_points_active() //checked matches cerberus output +pers_upgrade_jugg_active() { - self endon( "disconnect" ); - wait 0.5; - /* + self endon( "disconnect" ); + wait 0.5; /# - iprintlnbold( "*** WE'VE GOT DOUBLE POINTS UPGRADED ***" ); + #/ - */ - wait 0.5; - self waittill( "double_points_lost" ); - /* + 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 ) + { /# - iprintlnbold( "*** OH NO: Lost DOUBLE POINTS Upgrade ***" ); + #/ - */ - self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_double_points_counter", 0 ); + 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_sniper_active() //checked matches cerberus output +pers_upgrade_carpenter_active() { - self endon( "disconnect" ); - wait 0.5; - /* + self endon( "disconnect" ); + wait 0.2; /# - iprintlnbold( "*** WE'VE GOT SNIPER UPGRADED ***" ); + #/ - */ - wait 0.5; - self waittill( "pers_sniper_lost" ); - /* + 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; /# - iprintlnbold( "*** OH NO: Lost SNIPER Upgrade ***" ); + +#/ + } + } + + self maps\mp\zombies\_zm_stats::zero_client_stat( "pers_carpenter", 0 ); + wait 0.4; +/# + #/ - */ - self maps/mp/zombies/_zm_stats::zero_client_stat( "pers_sniper_counter", 0 ); } -pers_upgrade_box_weapon_active() //checked changed to match cerberus output +persistent_carpenter_ability_check() { - self endon( "disconnect" ); - wait 0.5; - /* + if ( isdefined( level.pers_upgrade_carpenter ) && level.pers_upgrade_carpenter ) + { + self endon( "disconnect" ); /# - 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 ( 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 ); + 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; + } } -pers_upgrade_nube_active() //checked changed to match cerberus output +pers_zombie_death_location_check( attacker, v_pos ) { - 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 ); + 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() +{ + 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 77b7977..9267274 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,1354 +1,1298 @@ -#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; +// 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; -pers_boards_updated( zbarrier ) //checked matches cerberus output +pers_boards_updated( zbarrier ) { - 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; - } - } - } - } - } - } + 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; + } + } + } + } + } } -pers_revive_active() //checked matches cerberus output +pers_revive_active() { - if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) - { - if ( is_true( self.pers_upgrades_awarded[ "revive" ] ) ) - { - return 1; - } - } - return 0; + 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; } -pers_increment_revive_stat( reviver ) //checked matches cerberus output +pers_increment_revive_stat( reviver ) { - 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() //checked matches cerberus output +pers_mulit_kill_headshot_active() { - if ( maps/mp/zombies/_zm_pers_upgrades::is_pers_system_active() ) - { - if ( is_true( self.pers_upgrades_awarded[ "multikill_headshots" ] ) ) - { - return 1; - } - } - return 0; + 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; } -pers_check_for_pers_headshot( time_of_death, zombie ) //checked matches cerberus output +pers_check_for_pers_headshot( time_of_death, zombie ) { - 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() //checked matches cerberus output +cash_back_player_drinks_perk() { - 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 ); - } - } - } + 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 ); + } + } } -cash_back_money_reward() //checked matches cerberus output +cash_back_money_reward() { - 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 ) //checked changed to match cerberus output +cash_back_player_prone_check( got_ability ) { - 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" ); - } + 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" ); } -pers_upgrade_insta_kill_upgrade_check() //checked changed to match cerberus output +pers_upgrade_insta_kill_upgrade_check() { - 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 ); - } - } - } + 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 ); + } + } } -insta_kill_upgraded_player_kill_func( active_time ) //checked changed to match cerberus output +insta_kill_upgraded_player_kill_func( active_time ) { - 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; - } + 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; + } } -pers_insta_kill_melee_swipe( smeansofdeath, eattacker ) //checked matches cerberus output +pers_insta_kill_melee_swipe( smeansofdeath, 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; - } - } - } + 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() //checked matches cerberus output +pers_upgrade_jugg_player_death_stat() { - 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 ); - /* + 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 ); /# - 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; + } + } + } + } } -divetonuke_precache_override_func() //checked matches cerberus output +pers_jugg_active() { - 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 ( isdefined( self.pers_upgrades_awarded["jugg"] ) && self.pers_upgrades_awarded["jugg"] ) + return true; + } + + return false; } -pers_upgrade_flopper_watcher() //checked changed to match cerberus output +pers_upgrade_flopper_damage_check( smeansofdeath, idamage ) { - 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 ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) + 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( smeansofdeath ) || smeansofdeath != "MOD_FALLING" ) + 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_upgrades_awarded["flopper"] ) && self.pers_upgrades_awarded["flopper"] ) ) + { + if ( idamage < level.pers_flopper_min_fall_damage_activate ) + return false; -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++; - } - } -} + if ( !isdefined( self.pers_num_flopper_damages ) ) + self.pers_num_flopper_damages = 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 ); - /* + 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( "PISTOL POINTS STAT: INCREMENTED" ); + iprintlnbold( "FLOPPER STAT: INCREMENTED" ); #/ - */ - } - } - } - else - { - self notify( "pers_pistol_points_kill" ); - } + } + } + 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; } -pers_upgrade_pistol_points_set_score( score, event, mod, damage_weapon ) //checked matches cerberus output +divetonuke_precache_override_func() { - 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; + precacheshader( "specialty_divetonuke_zombies" ); + level._effect["divetonuke_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" ); } -pers_upgrade_double_points_pickup_start() //checked changed to match cerberus output +pers_upgrade_flopper_watcher() { - 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 ); - /* + 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 ); /# - iprintlnbold( "PISTOL POINTS STAT: INCREMENTED" ); + iprintlnbold( "PISTOL POINTS STAT: INCREMENTED" ); #/ - */ - } - } - self.double_points_ability_check_active = undefined; + } + } + } + else + self notify( "pers_pistol_points_kill" ); } -pers_upgrade_double_points_set_score( score ) //checked matches cerberus output +pers_upgrade_pistol_points_set_score( score, event, mod, damage_weapon ) { - 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; + 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; } -pers_upgrade_double_points_cost( current_cost ) //checked matches cerberus output +pers_upgrade_double_points_pickup_start() { - 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; -} + self endon( "death" ); + self endon( "disconnect" ); -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 ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) + return; -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 ); - /* + 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 ); /# - iprintlnbold( "PERK LOSE STAT: INCREMENTED" ); + iprintlnbold( "PISTOL POINTS 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" ); - } - } + } + } + + self.double_points_ability_check_active = undefined; } -pers_upgrade_perk_lose_save() //checked changed to match cerberus output +pers_upgrade_double_points_set_score( score ) { - 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++; - /* + 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 ) + { /# - iprintlnbold( "Pers: Long range Sniper Kill" ); + #/ - */ - if ( self.pers_sniper_kills >= level.pers_sniper_round_kills_counter ) - { - self maps/mp/zombies/_zm_stats::increment_client_stat( "pers_sniper_counter", 0 ); - /* + 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 ); /# - iprintlnbold( "SNIPER STAT: INCREMENTED" ); + iprintlnbold( "PERK LOSE 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_sniper_score_reward() //checked changed to match cerberus output +pers_upgrade_perk_lose_save() { - 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; - } - } + 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++; + } + } } -pers_sniper_player_fires( weapon, hit ) //checked changed to match cerberus output +pers_upgrade_perk_lose_restore() { - 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; - } - } - } - } - } + 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; + } } -pers_get_player_accuracy() //checked matches cerberus output +pers_upgrade_sniper_kill_check( zombie, attacker ) { - 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 ( !maps\mp\zombies\_zm_pers_upgrades::is_pers_system_active() ) + 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 ) || !isdefined( attacker ) || !isdefined( zombie.damageweapon ) ) + 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 ); - } -} + if ( isdefined( zombie.marked_for_insta_upgraded_death ) && zombie.marked_for_insta_upgraded_death ) + return; -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(); -} + weapon = zombie.damageweapon; -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 ( !is_sniper_weapon( weapon ) ) + return; -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 ); - /* + 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++; /# - forced_weapon = getDvar( "scr_force_weapon" ); - if ( forced_weapon != "" && isDefined( level.zombie_weapons[ forced_weapon ] ) ) - { - arrayinsert( keys, forced_weapon, 0 ); + iprintlnbold( "Pers: Long range Sniper Kill" ); #/ - } - */ - 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 ( 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" ); +#/ + } + } } -pers_treasure_chest_get_weapons_array() //checked matches cerberus output +pers_sniper_score_reward() { - 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"; - } + 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; + } + } } -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 +pers_sniper_player_fires( weapon, hit ) { - 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; - } + 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; + } + } + } + } + } } -box_firesale_teddy_bear( box, box_index ) //checked changed to match cerberus output +pers_get_player_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(); + 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; } -pers_nube_unlock_watcher() //checked changed to match cerberus output +is_sniper_weapon( weapon ) { - 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" ]; - } - } + 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; } -pers_nube_player_ranked_as_nube( player ) //checked matches cerberus output +pers_upgrade_box_weapon_used( e_user, e_grabber ) { - if ( player.pers_num_nube_kills >= level.pers_numb_num_kills_unlock ) - { - return 1; - } - return 0; + 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 ); +/# + +#/ + } } -pers_nube_weapon_upgrade_check( player, str_weapon ) //checked matches cerberus output +pers_magic_box_teddy_bear() { - 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; + 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(); } -pers_nube_weapon_ammo_check( player, str_weapon ) //checked matches cerberus output +pers_magic_box_set_teddy_location( box_index ) { - 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; + 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; } -pers_nube_should_we_give_raygun( player_has_weapon, player, weapon_buy ) //checked partially changed to match cerberus output //changed at own discretion +pers_treasure_chest_choosespecialweapon( player ) { - 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; + 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; + } } -pers_nube_ammo_hint_string( player, weapon ) //checked matches cerberus output +pers_treasure_chest_get_weapons_array() { - 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; + 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_nube_ammo_cost( player, ammo_cost ) //checked matches cerberus output +pers_magic_box_firesale() { - if ( player hasweapon( "ray_gun_zm" ) ) - { - ammo_cost = 250; - } - if ( player hasweapon( "ray_gun_upgraded_zm" ) ) - { - ammo_cost = 4500; - } - return ammo_cost; + 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; + } } -pers_nube_override_ammo_cost( player, weapon, ammo_cost ) //checked matches cerberus output +box_firesale_teddy_bear( box, box_index ) { - 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; + 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(); } +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 bcf91f5..87a7d90 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,255 +1,243 @@ -#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; +// 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; -pers_register_upgrade( name, upgrade_active_func, stat_name, stat_desired_value, game_end_reset_if_not_achieved ) //checked matches cerberus output +pers_register_upgrade( name, upgrade_active_func, stat_name, stat_desired_value, game_end_reset_if_not_achieved ) { - 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 ) //checked matches cerberus output +add_pers_upgrade_stat( name, stat_name, stat_desired_value ) { - 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() //checked partially changed to match cerberus output //did not change while loops to for loops because continues are broken in for loops +pers_upgrades_monitor() { - 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 ); - } - /* + 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 ); + } /# - player iprintlnbold( "Upgraded!" ); + player iprintlnbold( "Upgraded!" ); #/ - */ - 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 ); - } - /* + 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 ); /# - player iprintlnbold( "Downgraded!" ); + player iprintlnbold( "Downgraded!" ); #/ - */ - } - 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; - } + } + + 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; + } } -wait_for_game_end() //checked changed to match cerberus output +wait_for_game_end() { - 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 ); - } - } - } - } - } + 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 ); + } + } + } + } } -check_pers_upgrade( pers_upgrade ) //checked changed to match cerberus output +check_pers_upgrade( pers_upgrade ) { - 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 ) //checked changed to match cerberus output +is_any_pers_upgrade_stat_updated( pers_upgrade ) { - 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; + 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; } -check_pers_upgrade_stat( stat_name, stat_desired_value ) //checked matches cerberus output +check_pers_upgrade_stat( stat_name, stat_desired_value ) { - 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() //checked matches cerberus output +round_end() { - 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 4a15427..6cc9b15 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_playerhealth.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_playerhealth.gsc @@ -1,582 +1,573 @@ -#include maps/mp/zombies/_zm_perks; -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; -init() //checked matches cerberus output +init() { - 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() //checked matches cerberus output +onplayerconnect() { - self thread onplayerspawned(); + self thread onplayerspawned(); } -onplayerspawned() //checked changed to match cerberus output +onplayerspawned() { - 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() //checked changed to match cerberus output +playerhurtcheck() { - 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() //checked changed to match cerberus output +playerhealthregen() { - 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 ) - { - /* + 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 ) + { /# - 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 ) - { - newhealth = 1; - } - 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.0 ) + newhealth = 1.0; + + 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( "player_deathInvulnerableTime" ); + if ( !isdefined( level.player_deathinvulnerabletimeout ) ) + level.player_deathinvulnerabletimeout = 0; + + if ( level.player_deathinvulnerabletimeout < gettime() ) + level.player_deathinvulnerabletimeout = gettime() + getdvarint( _hash_4E44E32D ); #/ - } - */ - } - oldratio = self.health / self.maxhealth; - level notify( "hit_again" ); - health_add = 0; - hurttime = getTime(); - self startfadingblur( 3, 0.8 ); - if ( !invulworthyhealthdrop || playerinvultimescale <= 0 ) - { - /* + } + + oldratio = self.health / self.maxhealth; + level notify( "hit_again" ); + health_add = 0; + hurttime = gettime(); + self startfadingblur( 3, 0.8 ); + + if ( !invulworthyhealthdrop || playerinvultimescale <= 0.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 ) //checked matches cerberus output +playerinvul( timer ) { - 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" ); -} - -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; - 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 ) //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; - /* -/# - assert( remainingtime >= -0.001 ); + level.playerinvultimeend = gettime() + timer * 1000; #/ - */ - 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; + wait( timer ); + } + + self player_flag_clear( "player_is_invulnerable" ); } -watchhideredflashingoverlay( overlay ) //checked matches cerberus output +healthoverlay() { - 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( "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 ); + } } -redflashingoverlay( overlay ) //checked matches cerberus output +fadefunc( overlay, severity, mult, hud_scaleonly ) { - 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 ) //checked matches cerberus output -{ - self endon( "disconnect" ); - self waittill_any( "noHealthOverlay", "death" ); - overlay fadeovertime( 3.5 ); - overlay.alpha = 0; -} - -empty_kill_func( type, loc, point, attacker, amount ) //checked matches cerberus output -{ -} - -loghit( newhealth, invultime ) //checked 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; /# + 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 ); } -logregen( newhealth ) //checked matches cerberus output +watchhideredflashingoverlay( overlay ) { - /* -/# -#/ - */ + 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" ); + } } -showhitlog() //checked matches cerberus output +redflashingoverlay( overlay ) { - /* -/# -#/ - */ + 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" ); } -playerhealthdebug() //checked changed to match cerberus output +healthoverlay_remove( overlay ) { - /* -/# - 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(); -#/ - } - */ + self endon( "disconnect" ); + self waittill_any( "noHealthOverlay", "death" ); + overlay fadeovertime( 3.5 ); + overlay.alpha = 0; } -printhealthdebug() //checked changed to match cerberus output +empty_kill_func( type, loc, point, attacker, amount ) { - /* -/# - 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() //checked changed to match cerberus output +loghit( newhealth, invultime ) { - /* /# - 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(); + #/ - } - */ } +logregen( newhealth ) +{ +/# + +#/ +} + +showhitlog() +{ +/# + +#/ +} + +playerhealthdebug() +{ +/# + 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(); + } +#/ +} + +printhealthdebug() +{ +/# + 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 ); + } + } + } +#/ +} + +destroyhealthdebug() +{ +/# + 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(); + } +#/ +} 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 b40f5f2..ad8387b 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_power.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_power.gsc @@ -1,716 +1,679 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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() //checked changed to match cerberus output +debug_powered_items() { -/* /# - 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; + 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; + } #/ - } - */ } -watch_global_power() //checked matches cerberus output +watch_global_power() { - while ( 1 ) - { - flag_wait( "power_on" ); - level thread set_global_power( 1 ); - flag_waitopen( "power_on" ); - level thread set_global_power( 0 ); - } + while ( true ) + { + flag_wait( "power_on" ); + level thread set_global_power( 1 ); + flag_waitopen( "power_on" ); + level thread set_global_power( 0 ); + } } -standard_powered_items() //checked partially changed to match cerberus output //did not use foreach with continue to prevent infinite loop bug +standard_powered_items() { - flag_wait( "start_zombie_round_logic" ); - vending_triggers = getentarray( "zombie_vending", "targetname" ); - i = 0; - while ( i < vending_triggers.size) - { - if ( vending_triggers[ i ].script_noteworthy == "specialty_weapupgrade" ) - { - i++; - continue; - } - powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( vending_triggers[ i ].script_noteworthy ); - add_powered_item( ::perk_power_on, ::perk_power_off, ::perk_range, ::cost_low_if_local, 0, powered_on, vending_triggers[ i ] ); - i++; - } - pack_a_punch = getentarray( "specialty_weapupgrade", "script_noteworthy" ); - foreach ( trigger in pack_a_punch ) - { - powered_on = maps/mp/zombies/_zm_perks::get_perk_machine_start_state( trigger.script_noteworthy ); - trigger.powered = add_powered_item( ::pap_power_on, ::pap_power_off, ::pap_range, ::cost_low_if_local, 0, powered_on, trigger ); - } - zombie_doors = getentarray( "zombie_door", "targetname" ); - foreach ( door in zombie_doors ) - { - if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "electric_door" ) - { - add_powered_item( ::door_power_on, ::door_power_off, ::door_range, ::cost_door, 0, 0, door ); - } - if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" ) - { - power_sources = 0; - if ( !is_true( level.power_local_doors_globally ) ) - { - power_sources = 1; - } - add_powered_item( ::door_local_power_on, ::door_local_power_off, ::door_range, ::cost_door, power_sources, 0, door ); - } - } - thread watch_global_power(); + 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(); } -add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target ) //checked matches cerberus output +add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target ) { - powered = spawnstruct(); - powered.power_on_func = power_on_func; - powered.power_off_func = power_off_func; - powered.range_func = range_func; - powered.power_sources = power_sources; - powered.self_powered = self_powered; - powered.target = target; - powered.cost_func = cost_func; - powered.power = self_powered; - powered.powered_count = self_powered; - powered.depowered_count = 0; - if ( !isDefined( level.powered_items ) ) - { - level.powered_items = []; - } - level.powered_items[ level.powered_items.size ] = powered; - return powered; + 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 ) //checked matches cerberus output +remove_powered_item( powered ) { - 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 ) //checked changed to match cerberus output +add_temp_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target ) { - powered = add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, self_powered, target ); - if ( isDefined( level.local_power ) ) - { - foreach ( localpower in level.local_power ) - { - if ( powered [[ powered.range_func ]]( 1, localpower.origin, localpower.radius ) ) - { - powered change_power( 1, localpower.origin, localpower.radius ); - if ( !isDefined( localpower.added_list ) ) - { - localpower.added_list = []; - } - localpower.added_list[ localpower.added_list.size ] = powered; - } - } - } - thread watch_temp_powered_item( powered ); - return powered; + 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 ) //checked changed to match cerberus output +watch_temp_powered_item( powered ) { - powered.target waittill( "death" ); - remove_powered_item( powered ); - if ( isDefined( level.local_power ) ) - { - foreach ( localpower in level.local_power ) - { - if ( isDefined( localpower.added_list ) ) - { - arrayremovevalue( localpower.added_list, powered, 0 ); - } - if ( isDefined( localpower.enabled_list ) ) - { - arrayremovevalue( localpower.enabled_list, powered, 0 ); - } - } - } + 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 ) //checked changed to match cerberus output +change_power_in_radius( delta, origin, radius ) { - changed_list = []; - for ( i = 0; i < level.powered_items.size; i++ ) - { - powered = level.powered_items[ i ]; - if ( powered.power_sources != 2 ) - { - if ( powered [[ powered.range_func ]]( delta, origin, radius ) ) - { - powered change_power( delta, origin, radius ); - changed_list[ changed_list.size ] = powered; - } - } - } - return changed_list; + 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 ) //checked changed to match cerberus output +change_power( delta, origin, radius ) { - if ( delta > 0 ) - { - if ( !self.power ) - { - self.power = 1; - self [[ self.power_on_func ]]( origin, radius ); - } - self.powered_count++; - } - else if ( delta < 0 ) - { - if ( self.power ) - { - self.power = 0; - self [[ self.power_off_func ]]( origin, radius ); - } - self.depowered_count++; - } + 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 ) //checked changed to match cerberus output +revert_power_to_list( delta, origin, radius, powered_list ) { - for ( i = 0; i < powered_list.size; i++ ) - { - powered = powered_list[ i ]; - powered revert_power( delta, origin, radius ); - } + 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 ) //checked changed to match cerberus output +revert_power( delta, origin, radius, powered_list ) { - 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 ); - } - } - 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 ); + } + } + else 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 ) //checked matches cerberus output +add_local_power( origin, radius ) { - 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 ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite continue loop bug +move_local_power( localpower, origin ) { - changed_list = []; - i = 0; - while ( i < level.powered_items.size ) - { - powered = level.powered_items[ i ]; - if ( powered.power_sources == 2 ) - { - i++; - continue; - } - waspowered = isinarray( localpower.enabled_list, powered ); - ispowered = powered [[ powered.range_func ]]( 1, origin, localpower.radius ); - if ( ispowered && !waspowered ) - { - powered change_power( 1, origin, localpower.radius ); - localpower.enabled_list[ localpower.enabled_list.size ] = powered; - i++; - continue; - } - if ( !ispowered && waspowered ) - { - powered revert_power( -1, localpower.origin, localpower.radius, localpower.enabled_list ); - arrayremovevalue( localpower.enabled_list, powered, 0 ); - } - i++; - } - localpower.origin = origin; - return localpower; + 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; } -end_local_power( localpower ) //checked matches cerberus output +end_local_power( localpower ) { - /* /# - 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 ) //checked changed to match cerberus output +has_local_power( origin ) { - if ( isDefined( level.local_power ) ) - { - foreach ( localpower in level.local_power ) - { - if ( distancesquared( localpower.origin, origin ) < ( localpower.radius * localpower.radius ) ) - { - return 1; - } - } - } - return 0; + if ( isdefined( level.local_power ) ) + { + foreach ( localpower in level.local_power ) + { + if ( distancesquared( localpower.origin, origin ) < localpower.radius * localpower.radius ) + return true; + } + } + + return false; } -get_powered_item_cost() //checked matches cerberus output +get_powered_item_cost() { - if ( !is_true( self.power ) ) - { - return 0; - } - if ( is_true( level._power_global ) && self.power_sources != 1 ) - { - return 0; - } - cost = [[ self.cost_func ]](); - power_sources = self.powered_count; - if ( power_sources < 1 ) - { - power_sources = 1; - } - return cost / power_sources; + 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; } -get_local_power_cost( localpower ) //checked changed to match cerberus output +get_local_power_cost( localpower ) { - cost = 0; - if ( isDefined( localpower ) && isDefined( localpower.enabled_list ) ) - { - foreach ( powered in localpower.enabled_list ) - { - cost += powered get_powered_item_cost(); - } - } - else if ( isDefined( localpower ) && isDefined( localpower.added_list ) ) - { - foreach ( powered in localpower.added_list ) - { - cost += powered get_powered_item_cost(); - } - } - return cost; + 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; } -set_global_power( on_off ) //checked changed to match cerberus output +set_global_power( on_off ) { - maps/mp/_demo::bookmark( "zm_power", getTime(), undefined, undefined, 1 ); - level._power_global = on_off; - for ( i = 0; i < level.powered_items.size; i++ ) - { - powered = level.powered_items[ i ]; - if ( isDefined( powered.target ) && powered.power_sources != 1 ) - { - powered global_power( on_off ); - wait_network_frame(); - } - } + 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 ) //checked matches cerberus output +global_power( on_off ) { - 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 ) //checked matches cerberus output +never_power_on( origin, radius ) { + } -never_power_off( origin, radius ) //checked matches cerberus output +never_power_off( origin, radius ) { + } -cost_negligible() //checked matches cerberus output +cost_negligible() { - 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() //checked matches cerberus output +cost_low_if_local() { - if ( isDefined( self.one_time_cost ) ) - { - cost = self.one_time_cost; - self.one_time_cost = undefined; - return cost; - } - if ( is_true( level._power_global ) ) - { - return 0; - } - if ( is_true( self.self_powered ) ) - { - return 0; - } - return 1; + 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; } -cost_high() //checked matches cerberus output +cost_high() { - 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 ) //checked matches cerberus output +door_range( delta, origin, radius ) { - if ( delta < 0 ) - { - return 0; - } - if ( distancesquared( self.target.origin, origin ) < radius * radius ) - { - return 1; - } - return 0; + if ( delta < 0 ) + return false; + + if ( distancesquared( self.target.origin, origin ) < radius * radius ) + return true; + + return false; } -door_power_on( origin, radius ) //checked matches cerberus output +door_power_on( origin, radius ) { - /* /# - println( "^1ZM POWER: door on\n" ); -#/ - */ - self.target.power_on = 1; - self.target notify( "power_on" ); -} - -door_power_off( origin, radius ) //checked matches cerberus output -{ - /* -/# - println( "^1ZM POWER: door off\n" ); + println( "^1ZM POWER: door on\n" ); #/ - */ - self.target notify( "power_off" ); - self.target.power_on = 0; + self.target.power_on = 1; + self.target notify( "power_on" ); } -door_local_power_on( origin, radius ) //checked matches cerberus output +door_power_off( origin, radius ) { - /* /# - println( "^1ZM POWER: door on (local)\n" ); + println( "^1ZM POWER: door off\n" ); #/ - */ - self.target.local_power_on = 1; - self.target notify( "local_power_on" ); + self.target notify( "power_off" ); + self.target.power_on = 0; } -door_local_power_off( origin, radius ) //checked matches cerberus output +door_local_power_on( origin, radius ) { - /* /# - println( "^1ZM POWER: door off (local)\n" ); + println( "^1ZM POWER: door on (local)\n" ); #/ - */ - self.target notify( "local_power_off" ); - self.target.local_power_on = 0; + self.target.local_power_on = 1; + self.target notify( "local_power_on" ); } -cost_door() //checked matches cerberus output +door_local_power_off( origin, radius ) { - 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 ) //checked matches cerberus output -{ - 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 ) //checked changed to match cerberus output -{ - /* /# - println( "^1ZM POWER: zombies off\n" ); + println( "^1ZM POWER: door off (local)\n" ); #/ - */ - for ( i = 0; i < self.zombies.size; i++ ) - { - self.zombies[ i ] thread stun_zombie(); - wait 0.05; - } + self.target notify( "local_power_off" ); + self.target.local_power_on = 0; } -stun_zombie() //checked matches cerberus output +cost_door() +{ + if ( isdefined( self.target.power_cost ) ) + { + if ( !isdefined( self.one_time_cost ) ) + self.one_time_cost = 0; + + self.one_time_cost += self.target.power_cost; + self.target.power_cost = 0; + } + + if ( isdefined( self.one_time_cost ) ) + { + cost = self.one_time_cost; + self.one_time_cost = undefined; + return cost; + } + + return 0; +} + +zombie_range( delta, origin, radius ) +{ + if ( delta > 0 ) + return 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; +} + +zombie_power_off( origin, radius ) { - self endon( "death" ); - self notify( "stun_zombie" ); - self endon( "stun_zombie" ); - if ( self.health <= 0 ) - { - /* /# - iprintln( "trying to stun a dead zombie" ); + println( "^1ZM POWER: zombies off\n" ); #/ - */ - 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(); + for ( i = 0; i < self.zombies.size; i++ ) + { + self.zombies[i] thread stun_zombie(); + wait 0.05; + } } -perk_range( delta, origin, radius ) //checked changed to match cerberus output +stun_zombie() { - 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; -} + self endon( "death" ); + self notify( "stun_zombie" ); + self endon( "stun_zombie" ); -perk_power_on( origin, radius ) //checked matches cerberus output -{ - /* + if ( self.health <= 0 ) + { /# - println( "^1ZM POWER: perk " + self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + " on\n" ); + iprintln( "trying to stun a dead zombie" ); #/ - */ - level notify( self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify() + "_on" ); - maps/mp/zombies/_zm_perks::perk_unpause( self.target.script_noteworthy ); + 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(); } -perk_power_off( origin, radius ) //checked matches cerberus output +perk_range( delta, origin, radius ) +{ + 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; +} + +perk_power_on( origin, radius ) { - notify_name = self.target maps/mp/zombies/_zm_perks::getvendingmachinenotify(); - if ( isDefined( notify_name ) && notify_name == "revive" ) - { - if ( level flag_exists( "solo_game" ) && flag( "solo_game" ) ) - { - return; - } - } - /* /# - println( "^1ZM POWER: perk " + self.target.script_noteworthy + " off\n" ); + println( "^1ZM POWER: perk " + self.target maps\mp\zombies\_zm_perks::getvendingmachinenotify() + " on\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" ); + level notify( self.target maps\mp\zombies\_zm_perks::getvendingmachinenotify() + "_on" ); + maps\mp\zombies\_zm_perks::perk_unpause( self.target.script_noteworthy ); } -pap_range( delta, origin, radius ) //checked changed to match cerberus output +perk_power_off( origin, radius ) { - if ( isDefined( self.target ) ) - { - paporigin = self.target.origin; - if ( is_true( self.target.trigger_off ) ) - { - paporigin = self.target.realorigin; - } - else if ( is_true( self.target.disabled ) ) - { - paporigin += vectorScale( ( 0, 0, 1 ), 10000 ); - } - if ( distancesquared( paporigin, origin ) < ( radius * radius ) ) - { - return 1; - } - } - return 0; -} + notify_name = self.target maps\mp\zombies\_zm_perks::getvendingmachinenotify(); -pap_power_on( origin, radius ) //checked matches cerberus output -{ - /* + if ( isdefined( notify_name ) && notify_name == "revive" ) + { + if ( level flag_exists( "solo_game" ) && flag( "solo_game" ) ) + return; + } /# - println( "^1ZM POWER: PaP on\n" ); + println( "^1ZM POWER: perk " + self.target.script_noteworthy + " off\n" ); #/ - */ - level notify( "Pack_A_Punch_on" ); + 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_power_off( origin, radius ) //checked matches cerberus output +pap_range( delta, origin, radius ) +{ + 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; +} + +pap_power_on( origin, radius ) { - /* /# - println( "^1ZM POWER: PaP off\n" ); + println( "^1ZM POWER: PaP on\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_on" ); } -pap_is_on() //checked matches cerberus output +pap_power_off( origin, radius ) { - if ( isDefined( self.powered ) ) - { - return self.powered.power; - } - return 0; +/# + 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(); } +pap_is_on() +{ + 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 ba88958..922eaa4 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_powerups.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_powerups.gsc @@ -1,2862 +1,2772 @@ -#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" ); - } - } +// 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; + } } -get_powerups( origin, radius ) //checked changed to match cerberus output +minigun_no_drop() { - 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; + 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(); } -should_award_stat( powerup_name ) //checked changed to matched cerberus output +check_for_rare_drop_override( pos ) { - 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; + 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; + } } -teller_withdrawl( powerup, player ) //checked matches cerberus output +powerup_emp() { - player maps/mp/zombies/_zm_score::add_to_player_score( powerup.value ); + 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" ); + } + } } +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 91101e7..ff6c46a 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_score.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_score.gsc @@ -1,393 +1,375 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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 ) //checked matches cerberus output +score_cf_register_info( name, version, max_count ) { - 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 ) //checked matches cerberus output +score_cf_increment_info( name ) { - 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() //checked changed to match cerberus output +score_cf_monitor() { - 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 ); - } - } - } + 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 ); + } + } + } } -player_add_points( event, mod, hit_location, is_dog, zombie_team, damage_weapon ) //checked changed to match cerberus output +player_add_points( event, mod, hit_location, is_dog, zombie_team, damage_weapon ) { - 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: - /* + 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: /# - 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" || 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 ); - } + 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 ); } -get_points_multiplier( player ) //checked matches cerberus output +get_points_multiplier( player ) { - 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() //checked matches cerberus output +get_zombie_death_player_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; + 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() //checked matches cerberus output +get_zombie_death_team_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; + 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 ) //checked matches cerberus output +player_add_points_kill_bonus( mod, hit_location ) { - 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; + 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; } -player_reduce_points( event, mod, hit_location ) //checked matches cerberus output +player_reduce_points( event, mod, hit_location ) { - 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 ) //checked matches cerberus output +add_to_player_score( points, add_to_total ) { - 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 ) //checked matches cerberus output +minus_to_player_score( points, ignore_double_points_upgrade ) { - 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" ); + 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 ); } -add_to_team_score( points ) //checked matches cerberus output +add_to_team_score( points ) { + } -minus_to_team_score( points ) //checked matches cerberus output +minus_to_team_score( points ) { + } -player_died_penalty() //checked changed to match cerberus output +player_died_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" ); - } - } + 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() //checked matches cerberus output +player_downed_penalty() { -/* /# - 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 a00508d..3ca4222 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,100 +1,92 @@ -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; +// T6 GSC SOURCE +// Decompiled by https://github.com/xensik/gsc-tool +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_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 ( 1 ) - { - wait 0.05; - level.zombie_server_choke_ids_count[ id ] = 0; - } + while ( true ) + { + 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 0; - } - return 1; + if ( !isdefined( entity ) ) + return false; + + return true; } 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 6283a0e..7431f68 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_sidequests.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_sidequests.gsc @@ -1,1120 +1,1076 @@ -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; -init_sidequests() //checked matches cerberus output +init_sidequests() { - 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 ) //checked changed to match cerberus output +is_sidequest_allowed( a_gametypes ) { - 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() //checked matches cerberus output +sidequest_debug() { - /* /# - //dvar name is unknown - if ( getDvar( #"A7AC338D" ) != "1" ) - { - return; - } - while ( 1 ) - { - wait 1; + if ( getdvar( _hash_A7AC338D ) != "1" ) + return; + + while ( true ) + wait 1; #/ - } - */ } -damager_trigger_thread( dam_types, trigger_func ) //checked changed to match cerberus output +damager_trigger_thread( dam_types, trigger_func ) { - 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" ); + 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" ); } -damage_trigger_thread() //checked matches cerberus output +damage_trigger_thread() { - self endon( "death" ); - while ( 1 ) - { - self waittill( "damage" ); - self.owner_ent notify( "triggered" ); - } + self endon( "death" ); + + while ( true ) + { + self waittill( "damage" ); + + self.owner_ent notify( "triggered" ); + } } -sidequest_uses_teleportation( name ) //checked matches cerberus output +sidequest_uses_teleportation( name ) { - level._zombie_sidequests[ name ].uses_teleportation = 1; + level._zombie_sidequests[name].uses_teleportation = 1; } -declare_sidequest_icon( sidequest_name, icon_name, shader_name ) //checked matches cerberus output +declare_sidequest_icon( sidequest_name, icon_name, shader_name ) { - 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 ) //checked matches cerberus output +create_icon( shader_name, x ) { - 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 ) //checked matches cerberus output +add_sidequest_icon( sidequest_name, icon_name ) { - 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 ) //checked changed to match cerberus output +remove_sidequest_icon( sidequest_name, icon_name ) { - 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 ) //checked matches cerberus output +declare_sidequest( name, init_func, logic_func, complete_func, generic_stage_start_func, generic_stage_end_func ) { - 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 ) //checked matches cerberus output +declare_sidequest_stage( sidequest_name, stage_name, init_func, logic_func, exit_func ) { - /* /# - 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 ) //checked matches cerberus output +set_stage_time_limit( sidequest_name, stage_name, time_limit, timer_func ) { - /* /# - 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 ) //checked changed to match cerberus output +declare_stage_asset_from_struct( sidequest_name, stage_name, target_name, thread_func, trigger_thread_func ) { - 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 ) //checked matches cerberus output +declare_stage_title( sidequest_name, stage_name, title ) { - /* /# - 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 ) //checked changed to match cerberus output +declare_stage_asset( sidequest_name, stage_name, target_name, thread_func, trigger_thread_func ) { - 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 ) //checked changed to match cerberus output +declare_sidequest_asset( sidequest_name, target_name, thread_func, trigger_thread_func ) { - 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 ) //checked changed to match cerberus output +declare_sidequest_asset_from_struct( sidequest_name, target_name, thread_func, trigger_thread_func ) { - 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 ) //checked matches cerberus output +build_asset_from_struct( asset, parent_struct ) { - 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() //checked changed to match cerberus output +delete_stage_assets() { - 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(); - break; - case "entity": - if ( isDefined( asset.trigger ) ) - { - /* + asset.trigger delete(); + asset.trigger = undefined; + } + + asset delete(); + continue; + 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; - } - 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; + 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; } -build_assets() //checked changed to match cerberus output +build_assets() { - 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; - } - 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; + 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( 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(); + } } -radius_trigger_thread() //checked matches cerberus output +radius_trigger_thread() { - 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" ); - } + 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" ); + } } -thread_on_assets( target_name, thread_func ) //checked changed to match cerberus output +thread_on_assets( target_name, 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 ]](); - } - } + 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 ) //checked matches cerberus output +stage_logic_func_wrapper( sidequest, stage ) { - 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 ) //checked matches cerberus output +sidequest_start( sidequest_name ) { - /* /# - 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 ) //checked matches cerberus output +stage_start( sidequest, stage ) { - 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 ) //checked changed to match cerberus output +display_stage_title( wait_for_teleport_done_notify ) { - 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(); + 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(); } -time_limited_stage( sidequest ) //checked matches cerberus output +time_limited_stage( sidequest ) { - /* /# - 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 ) //checked matches cerberus output +sidequest_println( str ) { - /* /# - if ( getDvar( #"A7AC338D" ) != "1" ) - { - return; - } - println( str ); + if ( getdvar( _hash_A7AC338D ) != "1" ) + return; + + println( str ); #/ - */ } -precache_sidequest_assets() //checked changed to match cerberus output +precache_sidequest_assets() { - 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 ) //checked matches cerberus output +sidequest_complete( sidequest_name ) { - /* /# - 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 ) //checked matches cerberus output +stage_completed( sidequest_name, stage_name ) { - /* /# - 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 ) //checked changed to match cerberus output +stage_completed_internal( sidequest, stage ) { - 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 ) //checked matches cerberus output +stage_failed_internal( sidequest, stage ) { - 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 ) //checked matches cerberus output +stage_failed( sidequest, stage ) { - /* /# - 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 ) //checked changed to match cerberus output +get_sidequest_stage( sidequest, stage_number ) { - 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 ) //checked matches cerberus output +get_damage_trigger( radius, origin, damage_types ) { - 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 ) //checked changed to match cerberus output +dam_trigger_thread( damage_types ) { - 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" ); - } - } - } + 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" ); + } + } } -use_trigger_thread() //checked matches cerberus output +use_trigger_thread() { - self endon( "death" ); - while ( 1 ) - { - self waittill( "trigger", player ); - self.owner_ent notify( "triggered" ); - wait 0.1; - } + self endon( "death" ); + + while ( true ) + { + self waittill( "trigger", player ); + + self.owner_ent notify( "triggered", player ); + wait 0.1; + } } -sidequest_stage_active( sidequest_name, stage_name ) //checked matches cerberus output +sidequest_stage_active( sidequest_name, stage_name ) { - sidequest = level._zombie_sidequests[ sidequest_name ]; - stage = sidequest.stages[ stage_name ]; - if ( sidequest.active_stage == stage.stage_number ) - { - return 1; - } - else - { - return 0; - } + sidequest = level._zombie_sidequests[sidequest_name]; + stage = sidequest.stages[stage_name]; + + if ( sidequest.active_stage == stage.stage_number ) + return true; + else + return false; } -sidequest_start_next_stage( sidequest_name ) //checked matches cerberus output +sidequest_start_next_stage( sidequest_name ) { - /* /# - 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() //checked matches cerberus output +main() { + } -is_facing( facee ) //checked matches cerberus output +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 ); - 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 ) //checked changed to match cerberus output +fake_use( notify_string, qualifier_func ) { - waittillframeend; - while ( 1 ) - { - if ( !isDefined( self ) ) - { - return; - } - /* + waittillframeend; + + while ( true ) + { + if ( !isdefined( self ) ) + return; /# - print3d( self.origin, "+", vectorScale( ( 0, 1, 0 ), 255 ), 1 ); + print3d( self.origin, "+", vectorscale( ( 0, 1, 0 ), 255.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; - } -} + 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 34889df..8f1437e 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_spawner.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_spawner.gsc @@ -1,3290 +1,3101 @@ -#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; +// 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; -init() //checked changed to match cerberus output +init() { - 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" ); + 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" ); } -add_cusom_zombie_spawn_logic( func ) //checked matches cerberus output +add_cusom_zombie_spawn_logic( 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; + 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 ) //checked matches cerberus output +player_attacks_enemy( player, amount, type, point ) { - 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; + 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; } -player_attacker( attacker ) //checked matches cerberus output +player_attacker( attacker ) { - if ( isplayer( attacker ) ) - { - return 1; - } - return 0; + if ( isplayer( attacker ) ) + return true; + + return false; } -enemy_death_detection() //checked changed to match cerberus output +enemy_death_detection() { - 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 ) //checked changed to match cerberus output +is_spawner_targeted_by_blocker( ent ) { - 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; + 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; } -add_custom_zombie_spawn_logic( func ) //checked matches cerberus output +add_custom_zombie_spawn_logic( 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; + 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 ) //checked partially changed to match cerberus output +zombie_spawn_init( animname_set ) { - 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" ); + 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" ); } -delayed_zombie_eye_glow() //checked changed to match cerberus output +delayed_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(); + 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(); } -zombie_damage_failsafe() //checked changed to match cerberus output +zombie_damage_failsafe() { - 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; - } - } + 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; + } } -should_skip_teardown( find_flesh_struct_string ) //checked matches cerberus output +should_skip_teardown( find_flesh_struct_string ) { - 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; + 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; } -zombie_think() //checked changed to match cerberus output +zombie_think() { - 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 ( 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(); - /* + 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(); /# - 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 ( 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 ) ) - { - /* + 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 ) ) + { /# - 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() //checked changed to match cerberus output +zombie_entered_playable() { - 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; - } + 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; + } } -get_desired_origin() //checked matches cerberus output +get_desired_origin() { - 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 ) //checked matches cerberus output +zombie_goto_entrance( node, endon_bad_path ) { -/* /# - 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 ( 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; + 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; } -zombie_assure_node() //checked changed to match cerberus output //changed for loops to while loops to prevent infinite loops with continues +zombie_assure_node() { - 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 ); - } - 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 ); - /* + 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 ); /# - 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 ); - } - 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++; + 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++; } -zombie_bad_path() //checked matches cerberus output +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; + 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() //checked matches cerberus output +zombie_bad_path_notify() { - 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() //checked matches cerberus output +zombie_bad_path_timeout() { - 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() //checked changed to match cerberus output +tear_into_building() { - 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 ]--; + self endon( "death" ); + self endon( "teleporting" ); + self zombie_history( "tear_into_building -> start" ); - } - 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(); - } + 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(); + } } -do_a_taunt() //checked matches cerberus output +do_a_taunt() { - 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" ); - } + 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" ); + } } -taunt_notetracks( msg ) //see info.md No 8. +taunt_notetracks( msg ) { - self endon( "death" ); - while ( 1 ) - { - self waittill( "taunt_anim", notetrack ); - if ( notetrack == "end" ) - { - self forceteleport( self.old_origin ); - return; - } - } + self endon( "death" ); + + while ( true ) + { + self waittill( msg, notetrack ); + + if ( notetrack == "end" ) + { + self forceteleport( self.old_origin ); + return; + } + } } -should_attack_player_thru_boards() //checked changed to match cerberus output +should_attack_player_thru_boards() { - 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; + 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; } -window_notetracks( msg ) //see info.md No 8. +window_notetracks( msg ) { - 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(); - } - } - } + 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(); + } + } } -reset_attack_spot() //checked matches cerberus output +reset_attack_spot() { - 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 ) //checked matches cerberus output +get_attack_spot( node ) { - 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; + 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; } -get_attack_spot_index( node ) //checked changed to match cerberus output +get_attack_spot_index( node ) { - 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 ) //checked again see info.md No 8. +zombie_tear_notetracks( msg, chunk, node ) { - 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" ); - } - } + 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" ); + } + } } -zombie_boardtear_offset_fx_horizontle( chunk, node ) //checked changed to match cerberus output +zombie_boardtear_offset_fx_horizontle( chunk, node ) { - 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 ) ); - } + 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 ) ); + } } -zombie_boardtear_offset_fx_verticle( chunk, node ) //checked changed to match cerberus output +zombie_boardtear_offset_fx_verticle( chunk, node ) { - 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 ) ); - } + 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 ) ); + } } -zombie_bartear_offset_fx_verticle( chunk ) //checked changed to match cerberus output +zombie_bartear_offset_fx_verticle( chunk ) { - 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; - } - } + 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; + } + } } -zombie_bartear_offset_fx_horizontle( chunk ) //checked changed to match cerberus output +zombie_bartear_offset_fx_horizontle( chunk ) { - 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; - } - } + 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; + } + } } -check_zbarrier_piece_for_zombie_inert( chunk_index, zbarrier, zombie ) //checked matches cerberus output +check_zbarrier_piece_for_zombie_inert( chunk_index, zbarrier, zombie ) { - 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 ) //checked matches cerberus output +check_zbarrier_piece_for_zombie_death( chunk_index, zbarrier, zombie ) { - 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; - } + 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; + } } -check_for_zombie_death( zombie ) //checked matches cerberus output +check_for_zombie_death( zombie ) { - 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 ) //checked matches cerberus output +zombie_hat_gib( attacker, means_of_death ) { - 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 ); - } + 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 ); } -zombie_head_gib( attacker, means_of_death ) //checked changed to match cerberus output +zombie_head_gib( 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 ); + 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 ); } -damage_over_time( dmg, delay, attacker, means_of_death ) //checked matches cerberus output +damage_over_time( dmg, delay, attacker, means_of_death ) { - 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 ); - } - } + 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 ); + } } -head_should_gib( attacker, type, point ) //checked changed to match cerberus output +head_should_gib( attacker, type, point ) { - 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; + 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; } -headshot_blood_fx() //checked matches cerberus output +headshot_blood_fx() { - 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() //checked changed to match cerberus output +zombie_gib_on_damage() { + while ( true ) + { + self waittill( "damage", amount, attacker, direction_vec, point, type, tagname, modelname, partname, weaponname ); - 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 ]](); - } - } - } + 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 ]](); + } + } + } } -zombie_should_gib( amount, attacker, type ) //checked changed to match cerberus output +zombie_should_gib( amount, attacker, type ) { - 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; + 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; } -derive_damage_refs( point ) //checked changed to match cerberus output +derive_damage_refs( point ) { - 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"; - } - /* + 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"; + } /# - 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() //checked matches cerberus output +init_gib_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; + 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 ) //checked matches cerberus output +zombie_can_drop_powerups( zombie ) { - if ( is_tactical_grenade( zombie.damageweapon ) || !flag( "zombie_drop_powerups" ) ) - { - return 0; - } - if ( is_true( zombie.no_powerups ) ) - { - return 0; - } - return 1; + if ( is_tactical_grenade( zombie.damageweapon ) || !flag( "zombie_drop_powerups" ) ) + return false; + + if ( isdefined( zombie.no_powerups ) && zombie.no_powerups ) + return false; + + return true; } -zombie_delay_powerup_drop( origin ) //checked matches cerberus output +zombie_delay_powerup_drop( origin ) { - 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 ) //checked matches cerberus output +zombie_death_points( origin, mod, hit_location, attacker, zombie, team ) { - 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 ); + 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 ); } -get_number_variants( aliasprefix ) //checked matches cerberus output +get_number_variants( aliasprefix ) { - 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() //checked matches cerberus output +dragons_breath_flame_death_fx() { - 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 ) //checked changed to match cerberus output +zombie_ragdoll_then_explode( launchvector, attacker ) { - 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() //checked changed to match cerberus output +zombie_death_animscript() { - 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; + 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; } -check_zombie_death_animscript_callbacks() //checked changed to match cerberus output +check_zombie_death_animscript_callbacks() { - 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; + 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; } -register_zombie_death_animscript_callback( func ) //checked matches cerberus output +register_zombie_death_animscript_callback( 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; + 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 ) //checked matches cerberus output +damage_on_fire( player ) { - 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 ); - } + 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 ) ); + } } -player_using_hi_score_weapon( player ) //checked matches cerberus output +player_using_hi_score_weapon( player ) { - weapon = player getcurrentweapon(); - if ( weapon == "none" || weaponissemiauto( weapon ) ) - { - return 1; - } - return 0; + weapon = player getcurrentweapon(); + + if ( weapon == "none" || weaponissemiauto( weapon ) ) + return true; + + return false; } -zombie_damage( mod, hit_location, hit_origin, player, amount, team ) //checked changed to match cerberus output +zombie_damage( mod, hit_location, hit_origin, player, amount, team ) { - 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 ); + 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 ); } -zombie_damage_ads( mod, hit_location, hit_origin, player, amount, team ) //checked changed to match cerberus output +zombie_damage_ads( mod, hit_location, hit_origin, player, amount, team ) { - 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 ); + 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 ); } -check_zombie_damage_callbacks( mod, hit_location, hit_origin, player, amount ) //checked changed to match cerberus output +check_zombie_damage_callbacks( mod, hit_location, hit_origin, player, amount ) { - 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; + 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; } -register_zombie_damage_callback( func ) //checked matches cerberus output +register_zombie_damage_callback( func ) { - 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() //checked matches cerberus output +zombie_give_flame_damage_points() { - if ( getTime() > self.flame_damage_time ) - { - self.flame_damage_time = getTime() + level.zombie_vars[ "zombie_flame_dmg_point_delay" ]; - return 1; - } - return 0; + if ( gettime() > self.flame_damage_time ) + { + self.flame_damage_time = gettime() + level.zombie_vars["zombie_flame_dmg_point_delay"]; + return true; + } + + return false; } -zombie_flame_damage( mod, player ) //checked changed to match cerberus output +zombie_flame_damage( mod, player ) { - 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; + 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; } -is_weapon_shotgun( sweapon ) //checked matches cerberus output +is_weapon_shotgun( sweapon ) { - if ( isDefined( sweapon ) && weaponclass( sweapon ) == "spread" ) - { - return 1; - } - return 0; + if ( isdefined( sweapon ) && weaponclass( sweapon ) == "spread" ) + return true; + + return false; } -zombie_death_event( zombie ) //checked changed to match cerberus output +zombie_death_event( zombie ) { - 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.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_gut_explosion() //checked matches cerberus output +zombie_gut_explosion() { - 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(); - } + 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(); } -zombie_death_achievement_sliquifier_check( e_player, e_zombie ) //checked matches cerberus output +zombie_death_achievement_sliquifier_check( e_player, e_zombie ) { - 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() //checked changed to match cerberus output +check_zombie_death_event_callbacks() { - 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 ) //checked matches cerberus output +register_zombie_death_event_callback( 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; + 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 ) //checked matches cerberus output +deregister_zombie_death_event_callback( func ) { - 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() //checked matches cerberus output +zombie_setup_attack_properties() { - 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() //checked matches cerberus output +attractors_generated_listener() { - 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() //checked changed to match cerberus output +zombie_pathing() { - self endon( "death" ); - self endon( "zombie_acquire_enemy" ); - level endon( "intermission" ); - /* + self endon( "death" ); + self endon( "zombie_acquire_enemy" ); + level endon( "intermission" ); /# - if ( !isDefined( self.favoriteenemy ) ) - { - assert( isDefined( self.enemyoverride ) ); - } + assert( isdefined( self.favoriteenemy ) || 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 ( 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; - } - } - } + 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; + } + } + } } -zombie_pathing_get_breadcrumb( origin, breadcrumbs, bad_crumbs, pick_random ) //checked changed to match cerberus output +zombie_pathing_get_breadcrumb( origin, breadcrumbs, bad_crumbs, pick_random ) { -/* /# - 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" ); #/ - } -*/ - 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; + 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; } -crumb_is_bad( crumb, bad_crumbs ) //checked changed to match cerberus output +crumb_is_bad( crumb, bad_crumbs ) { - for ( i = 0; i < bad_crumbs.size; i++ ) - { - if ( bad_crumbs[ i ] == crumb ) - { - return 1; - } - } - return 0; + for ( i = 0; i < bad_crumbs.size; i++ ) + { + if ( bad_crumbs[i] == crumb ) + return true; + } + + return false; } -jitter_enemies_bad_breadcrumbs( start_crumb ) //checked changed to match cerberus output +jitter_enemies_bad_breadcrumbs( start_crumb ) { - 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++; - } + 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++; + } } -zombie_repath_notifier() //checked changed to match cerberus output +zombie_repath_notifier() { - 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; - } + 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; + } } -zombie_follow_enemy() //checked changed to match cerberus output +zombie_follow_enemy() { - 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 ]](); - } - } + 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 ]](); + } } -zombie_eye_glow() //checked matches cerberus output +zombie_eye_glow() { - if ( !isDefined( self ) ) - { - return; - } - if ( !is_true( self.no_eye_glow ) ) - { - self setclientfield( "zombie_has_eyes", 1 ); - } + if ( !isdefined( self ) ) + return; + + if ( !isdefined( self.no_eye_glow ) || !self.no_eye_glow ) + self setclientfield( "zombie_has_eyes", 1 ); } -zombie_eye_glow_stop() //checked matches cerberus output +zombie_eye_glow_stop() { - if ( !isDefined( self ) ) - { - return; - } - if ( !is_true( self.no_eye_glow ) ) - { - self setclientfield( "zombie_has_eyes", 0 ); - } + if ( !isdefined( self ) ) + return; + + if ( !isdefined( self.no_eye_glow ) || !self.no_eye_glow ) + self setclientfield( "zombie_has_eyes", 0 ); } -zombie_history( msg ) //dev call did not check +zombie_history( msg ) { -/* /# - if ( !isDefined( self.zombie_history ) || self.zombie_history.size > 32 ) - { - self.zombie_history = []; - } - self.zombie_history[ self.zombie_history.size ] = msg; + if ( !isdefined( self.zombie_history ) || 32 <= self.zombie_history.size ) + self.zombie_history = []; + + self.zombie_history[self.zombie_history.size] = msg; #/ -*/ } -do_zombie_spawn() //checked changed to match cerberus output +do_zombie_spawn() { - 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++; - } - } - /* + 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]; + } + } /# - 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" ); + 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" ); + } + } + } #/ - } - } - } - */ - /* /# - 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 ( 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( 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 ( 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++; - } + 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 ); + } } -do_zombie_rise( spot ) //checked changed to match cerberus output +do_zombie_rise( spot ) { - 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() //checked matches cerberus output +hide_pop() { - 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 ) //checked matches cerberus output +handle_rise_notetracks( note, spot ) { - 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 ) //checked matches cerberus output +zombie_rise_death( zombie, spot ) { - 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 ) //checked matches cerberus output +zombie_rise_fx( zombie ) { - 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; - } + 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; } -zombie_rise_burst_fx( zombie ) //checked changed to match cerberus output +zombie_rise_burst_fx( zombie ) { - 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 ); - } + 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 ); } -zombie_rise_dust_fx( zombie ) //checked does not match cerberus output did not change +zombie_rise_dust_fx( zombie ) { - 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; - } + 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 ); + } + } } -stop_zombie_rise_dust_fx( zombie ) //checked matches cerberus output +stop_zombie_rise_dust_fx( zombie ) { - zombie waittill( "death" ); - self notify( "stop_zombie_rise_dust_fx" ); + zombie waittill( "death" ); + + self notify( "stop_zombie_rise_dust_fx" ); } -get_rise_death_anim() //checked matches cerberus output +get_rise_death_anim() { - 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() //checked matches cerberus output +zombie_tesla_head_gib() { - 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" ); - } + 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" ); } -play_ambient_zombie_vocals() //checked changed to match cerberus output +play_ambient_zombie_vocals() { - 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 ); - } + 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 ) ); + } } -zombie_complete_emerging_into_playable_area() //checked matches cerberus output +zombie_complete_emerging_into_playable_area() { - 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() //checked matches cerberus output +zombie_free_cam_allowed() { - 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 6459e15..98c8494 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_stats.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_stats.gsc @@ -1,1059 +1,1011 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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() //checked matches cerberus output +player_stats_init() { - 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 ) //checked partially matches cerberus output //did not change while loop to for loop to prevent infinite loop continue bug +update_players_stats_at_match_end( players ) { - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - game_mode = getDvar( "ui_gametype" ); - game_mode_group = level.scr_zm_ui_gametype_group; - map_location_name = level.scr_zm_map_start_location; - if ( map_location_name == "" ) - { - map_location_name = "default"; - } - if ( isDefined( level.gamemodulewinningteam ) ) - { - if ( level.gamemodulewinningteam == "B" ) - { - matchrecorderincrementheaderstat( "winningTeam", 1 ); - } - else if ( level.gamemodulewinningteam == "A" ) - { - matchrecorderincrementheaderstat( "winningTeam", 2 ); - } - } - recordmatchsummaryzombieendgamedata( game_mode, game_mode_group, map_location_name, level.round_number ); - newtime = getTime(); - i = 0; - while ( i < players.size ) - { - player = players[ i ]; - if ( player is_bot() ) - { - i++; - continue; - } - distance = player get_stat_distance_traveled(); - player addplayerstatwithgametype( "distance_traveled", distance ); - player add_location_gametype_stat( level.scr_zm_map_start_location, level.scr_zm_ui_gametype, "time_played_total", player.pers[ "time_played_total" ] ); - recordplayermatchend( player ); - recordplayerstats( player, "presentAtEnd", 1 ); - player maps/mp/zombies/_zm_weapons::updateweapontimingszm( newtime ); - if ( isDefined( level._game_module_stat_update_func ) ) - { - player [[ level._game_module_stat_update_func ]](); - } - old_high_score = player get_game_mode_stat( game_mode, "score" ); - if ( player.score_total > old_high_score ) - { - player set_game_mode_stat( game_mode, "score", player.score_total ); - } - if ( gamemodeismode( level.gamemode_public_match ) ) - { - player gamehistoryfinishmatch( 4, 0, 0, 0, 0, 0 ); - if ( isDefined( player.pers[ "matchesPlayedStatsTracked" ] ) ) - { - gamemode = maps/mp/gametypes_zm/_globallogic::getcurrentgamemode(); - player maps/mp/gametypes_zm/_globallogic::incrementmatchcompletionstat( gamemode, "played", "completed" ); - if ( isDefined( player.pers[ "matchesHostedStatsTracked" ] ) ) - { - player maps/mp/gametypes_zm/_globallogic::incrementmatchcompletionstat( gamemode, "hosted", "completed" ); - } - } - } - if ( !isDefined( player.pers[ "previous_distance_traveled" ] ) ) - { - player.pers[ "previous_distance_traveled" ] = 0; - } - distancethisround = int( player.pers[ "distance_traveled" ] - player.pers[ "previous_distance_traveled" ] ); - player.pers[ "previous_distance_traveled" ] = player.pers[ "distance_traveled" ]; - player incrementplayerstat( "distance_traveled", distancethisround ); - i++; - } + 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 ); + } } -update_playing_utc_time( matchendutctime ) //checked changed to match cerberus output //order of operations may need to be reviewed +update_playing_utc_time( matchendutctime ) { - current_days = int( matchendutctime / 86400 ); - last_days = self get_global_stat( "TIMESTAMPLASTDAY1" ); - last_days = int( last_days / 86400 ); - diff_days = current_days - last_days; - timestamp_name = ""; - if ( diff_days > 0 ) - { - for ( i = 5; i > diff_days; i-- ) - { - timestamp_name = "TIMESTAMPLASTDAY" + ( i - diff_days ); - timestamp_name_to = "TIMESTAMPLASTDAY" + i; - timestamp_value = self get_global_stat( timestamp_name ); - self set_global_stat( timestamp_name_to, timestamp_value ); + 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 = ""; - } - 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 ); - } + if ( diff_days > 0 ) + { + for ( i = 5; i > diff_days; i-- ) + { + timestamp_name = "TIMESTAMPLASTDAY" + i - diff_days; + timestamp_name_to = "TIMESTAMPLASTDAY" + i; + timestamp_value = self get_global_stat( timestamp_name ); + self set_global_stat( timestamp_name_to, timestamp_value ); + } + + for ( i = 2; i <= diff_days && i < 6; i++ ) + { + timestamp_name = "TIMESTAMPLASTDAY" + i; + self set_global_stat( timestamp_name, 0 ); + } + + self set_global_stat( "TIMESTAMPLASTDAY1", matchendutctime ); + } } -survival_classic_custom_stat_update() //checked matches cerberus output +survival_classic_custom_stat_update() { + } -grief_custom_stat_update() //checked matches cerberus output -{ +grief_custom_stat_update() +{ + } -add_game_mode_group_stat( game_mode, stat_name, value ) //checked matches cerberus output +add_game_mode_group_stat( game_mode, stat_name, value ) { - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self adddstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue", value ); + 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 ) //checked matches cerberus output +set_game_mode_group_stat( game_mode, stat_name, value ) { - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self setdstat( "PlayerStatsByGameTypeGroup", game_mode, stat_name, "statValue", value ); + 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 ) //checked matches cerberus output +get_game_mode_group_stat( game_mode, stat_name ) { - 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 ) //checked matches cerberus output +add_game_mode_stat( game_mode, stat_name, value ) { - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self adddstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue", value ); + 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 ) //checked matches cerberus output +set_game_mode_stat( game_mode, stat_name, value ) { - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self setdstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue", value ); + 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 ) //checked matches cerberus output +get_game_mode_stat( game_mode, stat_name ) { - return self getdstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue" ); + return self getdstat( "PlayerStatsByGameType", game_mode, stat_name, "statValue" ); } -get_global_stat( stat_name ) //checked matches cerberus output +get_global_stat( stat_name ) { - return self getdstat( "PlayerStatsList", stat_name, "StatValue" ); + return self getdstat( "PlayerStatsList", stat_name, "StatValue" ); } -set_global_stat( stat_name, value ) //checked matches cerberus output +set_global_stat( stat_name, value ) { - 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 ) //checked matches cerberus output +add_global_stat( stat_name, value ) { - 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 ) //checked matches cerberus output +get_map_stat( stat_name, map ) { - 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 ) //checked matches cerberus output +set_map_stat( stat_name, value, map ) { - if ( !isDefined( map ) ) - { - map = level.script; - } - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self setdstat( "PlayerStatsByMap", map, stat_name, value ); + 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 ) //checked matches cerberus output +add_map_stat( stat_name, value, map ) { - if ( !isDefined( map ) ) - { - map = level.script; - } - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self adddstat( "PlayerStatsByMap", map, stat_name, value ); + 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 ) //checked matches cerberus output +get_location_gametype_stat( start_location, game_type, stat_name ) { - 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 ) //checked matches cerberus output +set_location_gametype_stat( start_location, game_type, stat_name, value ) { - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self setdstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue", value ); + 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 ) //checked matches cerberus output +add_location_gametype_stat( start_location, game_type, stat_name, value ) { - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self adddstat( "PlayerStatsByStartLocation", start_location, "startLocationGameTypeStats", game_type, "stats", stat_name, "StatValue", value ); + 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 ) //checked matches cerberus output +get_map_weaponlocker_stat( stat_name, map ) { - 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 ) //checked matches cerberus output +set_map_weaponlocker_stat( stat_name, value, map ) { - if ( !isDefined( map ) ) - { - map = level.script; - } - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - if ( isDefined( value ) ) - { - self setdstat( "PlayerStatsByMap", map, "weaponLocker", stat_name, value ); - } - else - { - self setdstat( "PlayerStatsByMap", map, "weaponLocker", stat_name, 0 ); - } + 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 ) //checked matches cerberus output +add_map_weaponlocker_stat( stat_name, value, map ) { - if ( !isDefined( map ) ) - { - map = level.script; - } - if ( is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self adddstat( "PlayerStatsByMap", map, "weaponLocker", stat_name, value ); + 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 ) //checked changed to match cerberus output +has_stored_weapondata( map ) { - if ( !isDefined( map ) ) - { - map = level.script; - } - storedweapon = self get_map_weaponlocker_stat( "name", map ); - if ( isDefined( storedweapon ) || isstring( storedweapon ) && storedweapon == "" || isint( storedweapon ) && storedweapon == 0 ) - { - return 0; - } - return 1; + 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; } -get_stored_weapondata( map ) //checked matches cerberus output +get_stored_weapondata( map ) { - if ( !isDefined( map ) ) - { - map = level.script; - } - if ( self has_stored_weapondata( map ) ) - { - weapondata = []; - weapondata[ "name" ] = self get_map_weaponlocker_stat( "name", map ); - weapondata[ "lh_clip" ] = self get_map_weaponlocker_stat( "lh_clip", map ); - weapondata[ "clip" ] = self get_map_weaponlocker_stat( "clip", map ); - weapondata[ "stock" ] = self get_map_weaponlocker_stat( "stock", map ); - weapondata[ "alt_clip" ] = self get_map_weaponlocker_stat( "alt_clip", map ); - weapondata[ "alt_stock" ] = self get_map_weaponlocker_stat( "alt_stock", map ); - return weapondata; - } - return undefined; + if ( !isdefined( map ) ) + map = level.script; + + if ( self has_stored_weapondata( map ) ) + { + weapondata = []; + weapondata["name"] = self get_map_weaponlocker_stat( "name", map ); + weapondata["lh_clip"] = self get_map_weaponlocker_stat( "lh_clip", map ); + weapondata["clip"] = self get_map_weaponlocker_stat( "clip", map ); + weapondata["stock"] = self get_map_weaponlocker_stat( "stock", map ); + weapondata["alt_clip"] = self get_map_weaponlocker_stat( "alt_clip", map ); + weapondata["alt_stock"] = self get_map_weaponlocker_stat( "alt_stock", map ); + return weapondata; + } + + return undefined; } -clear_stored_weapondata( map ) //checked matches cerberus output +clear_stored_weapondata( 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 ); + 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 ) //checked matches cerberus output +set_stored_weapondata( weapondata, map ) { - if ( !isDefined( map ) ) - { - map = level.script; - } - self set_map_weaponlocker_stat( "name", weapondata[ "name" ], map ); - self set_map_weaponlocker_stat( "lh_clip", weapondata[ "lh_clip" ], map ); - self set_map_weaponlocker_stat( "clip", weapondata[ "clip" ], map ); - self set_map_weaponlocker_stat( "stock", weapondata[ "stock" ], map ); - self set_map_weaponlocker_stat( "alt_clip", weapondata[ "alt_clip" ], map ); - self set_map_weaponlocker_stat( "alt_stock", weapondata[ "alt_stock" ], map ); + 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 ) //checked matches cerberus output +add_client_stat( stat_name, stat_value, include_gametype ) { - 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; + 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; } -increment_player_stat( stat_name ) //checked matches cerberus output +increment_player_stat( stat_name ) { - if ( getDvar( "ui_zm_mapstartlocation" ) == "" || is_true( level.zm_disable_recording_stats ) ) - { - return; - } - self incrementplayerstat( stat_name, 1 ); + if ( getdvar( _hash_C955B4CD ) == "" || is_true( level.zm_disable_recording_stats ) ) + return; + + self incrementplayerstat( stat_name, 1 ); } -increment_root_stat( stat_name, stat_value ) //checked matches cerberus output +increment_root_stat( stat_name, stat_value ) { - 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 ) //checked matches cerberus output +increment_client_stat( stat_name, include_gametype ) { - 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 ) //checked matches cerberus output +set_client_stat( stat_name, stat_value, include_gametype ) { - 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 ) //checked matches cerberus output +zero_client_stat( stat_name, include_gametype ) { - 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 ) //checked matches cerberus output +increment_map_cheat_stat( stat_name ) { - 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() //checked changed to match cerberu output +get_stat_distance_traveled() { - miles = int( self.pers[ "distance_traveled" ] / 63360 ); - remainder = ( self.pers[ "distance_traveled" ] / 63360 ) - miles; - if ( miles < 1 && remainder < 0.5 ) - { - miles = 1; - } - else if ( remainder >= 0.5 ) - { - miles++; - } - return miles; + 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() //checked matches cerberus output +get_stat_round_number() { - return level.round_number; + return level.round_number; } -get_stat_combined_rank_value_survival_classic() //checked matches cerberus output +get_stat_combined_rank_value_survival_classic() { - 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() //checked matches cerberus output +get_stat_combined_rank_value_grief() { - 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() //checked changed to match cerberus output +update_global_counters_on_match_end() { - 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 ); + 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 ); } -get_specific_stat( stat_category, stat_name ) //checked matches cerberus output +get_specific_stat( stat_category, stat_name ) { - return self getdstat( stat_category, stat_name, "StatValue" ); + return self getdstat( stat_category, stat_name, "StatValue" ); } -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 +do_stats_for_gibs( zombie, limb_tags_array ) { - if ( isDefined( zombie ) && isDefined( zombie.attacker ) && isplayer( zombie.attacker ) ) - { - i = 0; - while ( i < limb_tags_array.size ) - { - stat_name = undefined; - if ( limb_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++; - } - } + 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" ); + } + } } -initializematchstats() //checked matches cerberus output +initializematchstats() { - 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() //checked matches cerberus output +adjustrecentstats() { - /* /# - if ( getDvarInt( "scr_writeConfigStrings" ) == 1 || getDvarInt( "scr_hostmigrationtest" ) == 1 ) - { - return; + if ( getdvarint( "scr_writeConfigStrings" ) == 1 || getdvarint( "scr_hostmigrationtest" ) == 1 ) + return; #/ - } - */ - initializematchstats(); + initializematchstats(); } -uploadstatssoon() //checked matches cerberus output +uploadstatssoon() { - 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 dba9537..09a6d97 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_timer.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_timer.gsc @@ -1,80 +1,84 @@ -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; -init() //checked matches cerberus output +init() { - 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 ) //checked matches cerberus output +start_timer( time, stop_notify ) { - 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 ) //checked matches cerberus output +wait_for_stop_notify( stop_notify ) { - 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() //checked matches cerberus output +update_hud_position() { - 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; - } -} + 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; + } +} 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 f48f055..215fa3f 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_tombstone.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_tombstone.gsc @@ -1,502 +1,477 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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 ); - } + 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 ); } -tombstone_player_init() //checked matches cerberus output +tombstone_player_init() { - 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() //checked matches cerberus output +tombstone_spawn() { - 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(); + 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(); } -tombstone_clear() //checked matches cerberus output +tombstone_clear() { - 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 ) //checked changed to match cerberus output +tombstone_revived( player ) { - 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; - } + 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; + } } -tombstone_laststand() //checked changed to match cerberus output +tombstone_laststand() { - 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" ); - } + 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" ); } -tombstone_save_perks( ent ) //checked matches cerberus output +tombstone_save_perks( ent ) { - 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() //checked partially changed to match cerberus output +tombstone_grab() { - 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(); - } + 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(); + } } -tombstone_give() //checked partially changed to match cerberus output +tombstone_give() { - 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 ); - } - } + 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 ); + } + } } -tombstone_wobble() //checked matches cerberus output +tombstone_wobble() { - 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() //checked partially changed to match cerberus output +tombstone_timeout() { - 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(); + 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(); } -playtombstonetimeraudio() //checked matches cerberus output +playtombstonetimeraudio() { - 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; - } + 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; + } } -playtombstonetimerout( player ) //checked matches cerberus output +playtombstonetimerout( player ) { - 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 ) //checked changed to match cerberus output +save_weapons_for_tombstone( player ) { - 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 ) //checked matches cerberus output +save_weapon_for_tombstone( player, weapon_name ) { - 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 ) //checked changed to match cerberus output +restore_weapon_for_tombstone( player, weapon_name ) { - 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; - } + 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; + } } -tombstone_hostmigration() //checked changed to match cerberus output +tombstone_hostmigration() { - 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" ); - } - } + 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" ); + } } -is_weapon_available_in_tombstone( weapon, player_to_check ) //checked partially changed to match cerberus output +is_weapon_available_in_tombstone( weapon, player_to_check ) { - 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; + 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; } - - - 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 2596f3c..dc3cb77 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_traps.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_traps.gsc @@ -1,866 +1,877 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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() //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 +trap_init() { - 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 ); - } + 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 ); } -trap_use_think( trap ) //checked changed to match cerberus output +trap_use_think( trap ) { - 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 ); - } - } + 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 ); + } + } } -trap_lights_red() //checked changed to match cerberus output +trap_lights_red() { - 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() //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug +trap_lights_green() { - 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++; - } + 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" ); + } } -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 +trap_set_string( 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++; - } + 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 ); + } } -trap_move_switches() //checked checked changed to match cerberus output +trap_move_switches() { - 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() //checked changed to match cerberus output +trap_activate_electric() { - 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() //checked changed to match cerberus output +trap_activate_fire() { - 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() //checked partially changed to match cerberus output +trap_activate_rotating() { - 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" ); + 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" ); } -trap_activate_flipper() //checked matches cerberus output +trap_activate_flipper() { + } -trap_audio_fx( trap ) //checked matches cerberus output +trap_audio_fx( trap ) { - 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 ) //checked matches cerberus output +play_electrical_sound( trap ) { - trap endon( "trap_done" ); - while ( 1 ) - { - wait randomfloatrange( 0.1, 0.5 ); - playsoundatposition( "zmb_elec_arc", self.origin ); - } + trap endon( "trap_done" ); + + while ( true ) + { + wait( randomfloatrange( 0.1, 0.5 ) ); + playsoundatposition( "zmb_elec_arc", self.origin ); + } } -trap_damage() //checked partially changed to match cerberus output +trap_damage() { - 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; - } - } - } + 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; + } + } + } } -trig_update( parent ) //checked matches cerberus output +trig_update( parent ) { - self endon( "trap_done" ); - start_angles = self.angles; - while ( 1 ) - { - self.angles = parent.angles; - wait 0.05; - } + self endon( "trap_done" ); + start_angles = self.angles; + + while ( true ) + { + self.angles = parent.angles; + wait 0.05; + } } -player_elec_damage() //checked changed to match cerberus output +player_elec_damage() { - 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() //checked changed to match cerberus output +player_fire_damage() { - 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 ) //checked matches cerberus output +zombie_trap_death( trap, param ) { - 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; - } + 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; + } } -zombie_flame_watch() //checked matches cerberus output +zombie_flame_watch() { - self waittill( "death" ); - self stoploopsound(); - arrayremovevalue( level.burning_zombies, self ); + self waittill( "death" ); + + self stoploopsound(); + arrayremovevalue( level.burning_zombies, self ); } -play_elec_vocals() //checked matches cerberus output +play_elec_vocals() { - 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() //checked matches cerberus output +electroctute_death_fx() { - 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 ] ); - } + 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] ); + } } -electrocute_timeout() //checked matches cerberus output +electrocute_timeout() { - 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() //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 +trap_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++; - } - } + 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" ); + } + } + } } -get_trap_array( trap_type ) //checked changed to match cerberus output +get_trap_array( trap_type ) { - 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() //checked matches cerberus output +trap_disable() { - 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() //checked matches cerberus output +trap_enable() { - 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() //checked matches cerberus output +trap_model_type_init() { - 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 ) //checked changed to match cerberus output +register_visionsets( a_traps ) { - 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; - } - } + 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; + } + } } -is_trap_registered( a_registered_traps ) //checked matches cerberus output +is_trap_registered( a_registered_traps ) { - 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 cd5ea5b..cef6681 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_turned.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_turned.gsc @@ -1,431 +1,423 @@ -#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; +// 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; -init() //checked matches cerberus output +init() { - 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(); + 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(); } -setup_zombie_exerts() //checked matches cerberus output +setup_zombie_exerts() { - 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() //checked matches cerberus output +delay_turning_on_eyes() { - 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() //checked changed to match cerberus output +turn_to_zombie() { - 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; + 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; } -turn_to_human() //checked changed to match cerberus output +turn_to_human() { - 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; + 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; } -deletezombiesinradius( origin ) //checked changed to match cerberus output +deletezombiesinradius( origin ) { - 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; - } - } + 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; + } + } } -turned_give_melee_weapon() //checked matches cerberus output +turned_give_melee_weapon() { - /* /# - 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 ( 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 ); + 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 ); } -turned_player_buttons() //checked changed to match cerberus output +turned_player_buttons() { - 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; - } + 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; + } } -turned_disable_player_weapons() //checked matches cerberus output +turned_disable_player_weapons() { - 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(); + 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(); } -turned_enable_player_weapons() //checked changed to match cerberus output +turned_enable_player_weapons() { - 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 ); + 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 ); } -get_farthest_available_zombie( player ) //checked changed to match cerberus output +get_farthest_available_zombie( player ) { - 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; - } + 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; + } } -get_available_human() //checked changed to match cerberus output +get_available_human() { - players = get_players(); - foreach ( player in players ) - { - if ( !is_true( player.is_zombie ) ) - { - return player; - } - } + players = get_players(); + + foreach ( player in players ) + { + if ( !( isdefined( player.is_zombie ) && player.is_zombie ) ) + return player; + } } -silentlyremovezombie() //checked matches cerberus output +silentlyremovezombie() { - 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() //checked matches cerberus output +getspawnpoint() { - 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 b3e19e7..a4a35cf 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_unitrigger.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_unitrigger.gsc @@ -1,758 +1,717 @@ -#include maps/mp/zombies/_zm_zonemgr; -#include maps/mp/zombies/_zm_utility; -#include maps/mp/_utility; -#include common_scripts/utility; +// 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; -init() //checked changed to match cerberus output +init() { - 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 ) //checked matches cerberus output +register_unitrigger_system_func( system, trigger_func ) { - 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 ) //checked matches cerberus output +unitrigger_force_per_player_triggers( unitrigger_stub, opt_on_off ) { - 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 ) //checked matches cerberus output +unitrigger_trigger( player ) { - 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() //checked matches cerberus output +unitrigger_origin() { - 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 ) //checked changed to match cerberus output +register_unitrigger_internal( unitrigger_stub, trigger_func ) { - 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": - 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: - /* + 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: /# - 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, 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.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; } -register_unitrigger( unitrigger_stub, trigger_func ) //checked matches cerberus output +register_unitrigger( unitrigger_stub, trigger_func ) { - 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 ) //checked matches cerberus output +unregister_unitrigger( unitrigger_stub ) { - thread unregister_unitrigger_internal( unitrigger_stub ); + thread unregister_unitrigger_internal( unitrigger_stub ); } -unregister_unitrigger_internal( unitrigger_stub ) //checked changed to match cerberus output +unregister_unitrigger_internal( 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 ); + 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 ); } -delay_delete_contact_ent() //checked matches cerberus output +delay_delete_contact_ent() { - self.last_used_time = 0; - while ( 1 ) - { - wait 1; - if ( getTime() - self.last_used_time > 1000 ) - { - self delete(); - level._unitriggers.contact_ent = undefined; - return; - } - } + self.last_used_time = 0; + + while ( true ) + { + 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 ) //checked changed to match cerberus output +register_static_unitrigger( unitrigger_stub, trigger_func, recalculate_zone ) { - 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 ) //checked matches cerberus output +reregister_unitrigger_as_dynamic( unitrigger_stub ) { - 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() //checked changed to match cerberus output dvar taken from beta dump +debug_unitriggers() { - /* /# - 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; + 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; + } #/ - } - */ } -cleanup_trigger( trigger, player ) //checked changed to match cerberus output +cleanup_trigger( trigger, player ) { - 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; + 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; } -assess_and_apply_visibility( trigger, stub, player, default_keep ) //checked changed to match cerberus output +assess_and_apply_visibility( trigger, stub, player, default_keep ) { - 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; + 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; } -main() //checked against bo3 _zm_unitrigger.gsc and cerberus output changed at own discretion +main() { - 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; - } - } -} + 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(); -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++ ) - { - 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 ] ); - } + { + 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; + } } -build_trigger_from_unitrigger_stub( stub, player ) //checked matches cerberus output +run_visibility_function_for_all_triggers() { - 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; + 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] ); } -copy_zombie_keys_onto_trigger( trig, stub ) //checked matches cerberus output +build_trigger_from_unitrigger_stub( stub, player ) { - 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; + 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; } -trigger_thread( trigger_func ) //checked matches cerberus output +copy_zombie_keys_onto_trigger( trig, stub ) { - self endon( "kill_trigger" ); - if ( isDefined( trigger_func ) ) - { - self [[ trigger_func ]](); - } + 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; } -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 +trigger_thread( 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; + self endon( "kill_trigger" ); + + if ( isdefined( trigger_func ) ) + self [[ trigger_func ]](); } -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 +get_closest_unitrigger_index( org, array, dist ) { - 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; + 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; } +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 cee60a8..ada9cc4 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_utility.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_utility.gsc @@ -1,5667 +1,5191 @@ -#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; +// 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; -init_utility() //checked matches cerberus output +init_utility() { + } -is_classic() //checked matches cerberus output +is_classic() { - var = getDvar( "ui_zm_gamemodegroup" ); - if ( var == "zclassic" ) - { - return 1; - } - return 0; + var = getdvar( _hash_6B64B9B4 ); + + if ( var == "zclassic" ) + return true; + + return false; } -is_standard() //checked matches cerberus output +is_standard() { - var = getDvar( "ui_gametype" ); - if ( var == "zstandard" ) - { - return 1; - } - return 0; + var = getdvar( "ui_gametype" ); + + if ( var == "zstandard" ) + return true; + + return false; } -convertsecondstomilliseconds( seconds ) //checked matches cerberus output +convertsecondstomilliseconds( seconds ) { - return seconds * 1000; + return seconds * 1000; } -is_player() //checked does not match cerberus output changed at own discretion +is_player() { - if ( !isplayer( self ) ) - { - return 0; - } - if ( isDefined( self.pers ) && is_true( self.pers[ "isBot" ] ) ) - { - return 0; - } - return 1; + return isplayer( self ) || isdefined( self.pers ) && ( isdefined( self.pers["isBot"] ) && self.pers["isBot"] ); } -lerp( chunk ) //checked matches cerberus output +lerp( chunk ) { - 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; + 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(); } -clear_mature_blood() //checked changed to match cerberus output +clear_mature_blood() { - 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() //checked matches cerberus output +recalc_zombie_array() { + } -clear_all_corpses() //checked changed to match cerberus output +clear_all_corpses() { - 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() //checked matches cerberus output +get_current_corpse_count() { - 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() //checked matches cerberus output +get_current_actor_count() { - 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() //checked matches cerberus output +get_current_zombie_count() { - enemies = get_round_enemy_array(); - return enemies.size; + enemies = get_round_enemy_array(); + return enemies.size; } -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 +get_round_enemy_array() { - 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; + 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; } -init_zombie_run_cycle() //checked matches cerberus output +init_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(); + 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() //checked matches cerberus output +change_zombie_run_cycle() { - 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() //checked matches cerberus output +speed_change_watcher() { - 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 ) //checked matches cerberus output +set_zombie_run_cycle( new_move_speed ) { - 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() //checked matches cerberus output +set_run_speed() { - 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() //checked matches cerberus output +set_run_speed_easy() { - 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 ) //checked matches cerberus output +spawn_zombie( spawner, target_name, spawn_point, round_number ) { - 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 ( 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; + 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; } -run_spawn_functions() //checked changed to match cerberus output +run_spawn_functions() { - 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 ) //checked matches cerberus output +create_simple_hud( client, team ) { - 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() //checked matches cerberus output +destroy_hud() { - level.hudelem_count--; - - self destroy(); + level.hudelem_count--; + self destroy(); } -all_chunks_intact( barrier, barrier_chunks ) //checked changed to match cerberus output +all_chunks_intact( barrier, barrier_chunks ) { - 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; + 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; } -no_valid_repairable_boards( barrier, barrier_chunks ) //checked changed to match cerberus output +no_valid_repairable_boards( barrier, barrier_chunks ) { - 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; + 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; } -is_survival() //checked matches cerberus output +is_survival() { - var = getDvar( "ui_zm_gamemodegroup" ); - if ( var == "zsurvival" ) - { - return 1; - } - return 0; + var = getdvar( _hash_6B64B9B4 ); + + if ( var == "zsurvival" ) + return true; + + return false; } -is_encounter() //checked matches cerberus output +is_encounter() { - if ( is_true( level._is_encounter ) ) - { - return 1; - } - var = getDvar( "ui_zm_gamemodegroup" ); - if ( var == "zencounter" ) - { - level._is_encounter = 1; - return 1; - } - return 0; + 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; } -all_chunks_destroyed( barrier, barrier_chunks ) //checked changed to match cerberus output +all_chunks_destroyed( barrier, 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 ) ) - { - /* + 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 ) ) + { /# - 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 0; - } - } - } - return 1; + for ( i = 0; i < barrier_chunks.size; i++ ) + { + if ( barrier_chunks[i] get_chunk_state() != "destroyed" ) + return false; + } + } + + return true; } -check_point_in_playable_area( origin ) //checked changed to match cerberus output +check_point_in_playable_area( origin ) { - 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; + 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; } -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 +check_point_in_enabled_zone( origin, zone_is_active, player_zones ) { - 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; + 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; } -round_up_to_ten( score ) //checked matches cerberus output +round_up_to_ten( score ) { - 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 ) //checked matches cerberus output +round_up_score( score, value ) { - 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() //checked matches cerberus output +random_tan() { - 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 ) //checked matches cerberus output +places_before_decimal( num ) { - abs_num = abs( num ); - count = 0; - while ( 1 ) - { - abs_num *= 0.1; - count += 1; - if ( abs_num < 1 ) - { - return count; - } - } + abs_num = abs( num ); + count = 0; + + while ( true ) + { + 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 ) //checked matches cerberus output +create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, initial_attract_func, arrival_attract_func, poi_team ) { - 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 ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug with continue +create_zombie_point_of_interest_attractor_positions( num_attract_dists, diff_per_dist, attractor_width ) { - 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" ); + 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" ); } -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 +generated_radius_attract_positions( forward, offset, num_positions, attract_radius ) { - 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; + 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; } -debug_draw_attractor_positions() //checked changed to match cerberus output +debug_draw_attractor_positions() { - /* /# - 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; - } + 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; + } #/ - } - */ } -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 +get_zombie_point_of_interest( origin, poi_array ) { - 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; + 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; } -activate_zombie_point_of_interest() //checked matches cerberus output +activate_zombie_point_of_interest() { - 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() //checked changed to match cerberus output +deactivate_zombie_point_of_interest() { - 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 ) //checked matches cerberus output +assign_zombie_point_of_interest( origin, poi ) { - 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 ) //checked changed to match cerberus output +remove_poi_attractor( zombie_poi ) { - 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 ) //checked changed to match cerberus output +array_check_for_dupes_using_compare( array, single, is_equal_fn ) { - for ( i = 0; i < array.size; i++ ) - { - if ( [[ is_equal_fn ]]( array[ i ], single ) ) - { - return 0; - } - } - return 1; + for ( i = 0; i < array.size; i++ ) + { + if ( [[ is_equal_fn ]]( array[i], single ) ) + return false; + } + + return true; } -poi_locations_equal( loc1, loc2 ) //checked matches cerberus output +poi_locations_equal( loc1, loc2 ) { - return loc1[ 0 ] == loc2[ 0 ]; + return loc1[0] == loc2[0]; } -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 +add_poi_attractor( zombie_poi ) { - 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; + 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; } -can_attract( attractor ) //checked matches cerberus output +can_attract( attractor ) { - 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; + 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; } -update_poi_on_death( zombie_poi ) //checked matches cerberus output +update_poi_on_death( zombie_poi ) { - 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 ) //checked changed to match cerberus output +update_on_poi_removal( zombie_poi ) { - 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 ) //checked changed to match cerberus output +invalidate_attractor_pos( attractor_pos, zombie ) { - 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 ) //checked changed to match cerberus output +remove_poi_from_ignore_list( poi ) { - 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 ) //checked changed to match cerberus output +add_poi_to_ignore_list( 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; - } + 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; } -default_validate_enemy_path_length( player ) //checked matches cerberus output +default_validate_enemy_path_length( player ) { - max_dist = 1296; - d = distancesquared( self.origin, player.origin ); - if ( d <= max_dist ) - { - return 1; - } - return 0; + max_dist = 1296; + d = distancesquared( self.origin, player.origin ); + + if ( d <= max_dist ) + return true; + + return false; } -get_path_length_to_enemy( enemy ) //checked matches cerberus output +get_path_length_to_enemy( enemy ) { - 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 ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite +get_closest_player_using_paths( origin, players ) { - 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; + 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; } -get_closest_valid_player( origin, ignore_player ) //checked changed to match cerberus output +get_closest_valid_player( origin, ignore_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; - } + 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; + } } -is_player_valid( player, checkignoremeflag, ignore_laststand_players ) //checked matches cerberus output +is_player_valid( player, checkignoremeflag, ignore_laststand_players ) { - 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; + 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; } -get_number_of_valid_players() //checked changed to match cerberus output +get_number_of_valid_players() { - 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() //checked changed to match cerberus output +in_revive_trigger() { - 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 ) //checked matches cerberus output +get_closest_node( org, nodes ) { - return getclosest( org, nodes ); + return getclosest( org, nodes ); } -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 +non_destroyed_bar_board_order( 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 ); - } - } - } - } + 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 ); + } + } + } } -non_destroyed_grate_order( origin, chunks_grate ) //checked partially changed to match cerberus output //did not include continues because they would be redundant +non_destroyed_grate_order( origin, chunks_grate ) { - 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 ]; - } - if ( grate_order3[ i ].state == "repaired" ) - { - /* + grate_order3[i] thread show_grate_pull(); + return grate_order2[i]; + continue; + } + + if ( grate_order3[i].state == "repaired" ) + { /# - iprintlnbold( " pull bar3 " ); + iprintlnbold( " pull bar3 " ); #/ - */ - grate_order4[ i ] thread show_grate_pull(); - return grate_order3[ i ]; - } - if ( grate_order4[ i ].state == "repaired" ) - { - /* + grate_order4[i] thread show_grate_pull(); + return grate_order3[i]; + continue; + } + + if ( grate_order4[i].state == "repaired" ) + { /# - iprintlnbold( " pull bar4 " ); + iprintlnbold( " pull bar4 " ); #/ - */ - grate_order5[ i ] thread show_grate_pull(); - return grate_order4[ i ]; - } - if ( grate_order5[ i ].state == "repaired" ) - { - /* + grate_order5[i] thread show_grate_pull(); + return grate_order4[i]; + continue; + } + + if ( grate_order5[i].state == "repaired" ) + { /# - iprintlnbold( " pull bar5 " ); + iprintlnbold( " pull bar5 " ); #/ - */ - grate_order6[ i ] thread show_grate_pull(); - return grate_order5[ i ]; - } - if ( grate_order6[ i ].state == "repaired" ) - { - return grate_order6[ i ]; - } - } - } - } - } + grate_order6[i] thread show_grate_pull(); + return grate_order5[i]; + continue; + } + + if ( grate_order6[i].state == "repaired" ) + return grate_order6[i]; + } + } + } + } } -non_destroyed_variant1_order( origin, chunks_variant1 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant +non_destroyed_variant1_order( origin, chunks_variant1 ) { - 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 ]; - } - } - } - } - } + 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]; + } + } + } + } } -non_destroyed_variant2_order( origin, chunks_variant2 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant +non_destroyed_variant2_order( origin, chunks_variant2 ) { - 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 ]; - } - } - } - } - } + 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]; + } + } + } + } } -non_destroyed_variant4_order( origin, chunks_variant4 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant +non_destroyed_variant4_order( origin, chunks_variant4 ) { - 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 ]; - } - } - } - } - } + 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]; + } + } + } + } } -non_destroyed_variant5_order( origin, chunks_variant5 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant +non_destroyed_variant5_order( origin, chunks_variant5 ) { - 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 ]; - } - } - } - } - } + 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]; + } + } + } + } } -show_grate_pull() //checked changed to match cerberus output +show_grate_pull() { - wait 0.53; - self show(); - self vibrate( vectorScale( ( 0, 1, 0 ), 270 ), 0.2, 0.4, 0.4 ); + wait 0.53; + self show(); + self vibrate( vectorscale( ( 0, 1, 0 ), 270.0 ), 0.2, 0.4, 0.4 ); } -get_closest_2d( origin, ents ) //checked changed to match cerberus output +get_closest_2d( origin, ents ) { - 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() //checked matches cerberus output +disable_trigger() { - if ( !is_true( self.disabled ) ) - { - self.disabled = 1; - self.origin -= vectorScale( ( 0, 0, 1 ), 10000 ); - } + if ( !isdefined( self.disabled ) || !self.disabled ) + { + self.disabled = 1; + self.origin -= vectorscale( ( 0, 0, 1 ), 10000.0 ); + } } -enable_trigger() //checked matches cerberus output +enable_trigger() { - if ( !is_true( self.disabled ) ) - { - return; - } - self.disabled = 0; - self.origin += vectorScale( ( 0, 0, 1 ), 10000 ); + if ( !isdefined( self.disabled ) || !self.disabled ) + return; + + self.disabled = 0; + self.origin += vectorscale( ( 0, 0, 1 ), 10000.0 ); } -in_playable_area() //checked changed to match cerberus output +in_playable_area() { - 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 1; - } - for ( i = 0; i < playable_area.size; i++ ) - { - if ( self istouching( playable_area[ i ] ) ) - { - return 1; - } - } - return 0; + return true; + } + + for ( i = 0; i < playable_area.size; i++ ) + { + if ( self istouching( playable_area[i] ) ) + return true; + } + + return false; } -get_closest_non_destroyed_chunk( origin, barrier, barrier_chunks ) //checked changed to match cerberus output +get_closest_non_destroyed_chunk( origin, barrier, barrier_chunks ) { - 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 ) //checked changed to match cerberus output +get_random_destroyed_chunk( barrier, barrier_chunks ) { - 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 ) //checked changed to match cerberus output +get_destroyed_repair_grates( barrier_chunks ) { - 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 ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite +get_non_destroyed_chunks( barrier, barrier_chunks ) { - 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; - } + 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; + } } -get_non_destroyed_chunks_grate( barrier, barrier_chunks ) //checked changed to match cerberus output +get_non_destroyed_chunks_grate( barrier, barrier_chunks ) { - 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 ) //checked changed to match cerberus output +get_non_destroyed_variant1( barrier_chunks ) { - 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 ) //checked changed to match cerberus output +get_non_destroyed_variant2( barrier_chunks ) { - 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 ) //checked changed to match cerberus output +get_non_destroyed_variant4( barrier_chunks ) { - 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 ) //checked changed to match cerberus output +get_non_destroyed_variant5( barrier_chunks ) { - 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 ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite +get_destroyed_chunks( barrier_chunks ) { - 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; + 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; } -grate_order_destroyed( chunks_repair_grate ) //checked changed to match cerberus output +grate_order_destroyed( chunks_repair_grate ) { - 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 ]; - } - if ( grate_repair_order4[ i ].state == "destroyed" ) - { - /* + grate_repair_order6[i] thread show_grate_repair(); + return grate_repair_order5[i]; + continue; + } + + 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 ]; - } - if ( grate_repair_order3[ i ].state == "destroyed" ) - { - /* + grate_repair_order5[i] thread show_grate_repair(); + return grate_repair_order4[i]; + continue; + } + + 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 ]; - } - if ( grate_repair_order2[ i ].state == "destroyed" ) - { - /* + grate_repair_order4[i] thread show_grate_repair(); + return grate_repair_order3[i]; + continue; + } + + 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 ]; - } - if ( grate_repair_order1[ i ].state == "destroyed" ) - { - /* + grate_repair_order3[i] thread show_grate_repair(); + return grate_repair_order2[i]; + continue; + } + + 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() //checked matches cerberus output +show_grate_repair() { - wait 0.34; - self hide(); + wait 0.34; + self hide(); } -get_chunk_state() //checked matches cerberus output +get_chunk_state() { - /* /# - assert( isDefined( self.state ) ); + assert( isdefined( self.state ) ); #/ - */ - return self.state; + return self.state; } -is_float( num ) //checked matches cerberus output +is_float( num ) { - val = num - int( num ); - if ( val != 0 ) - { - return 1; - } - else - { - return 0; - } + val = num - int( num ); + + if ( val != 0 ) + return true; + else + return false; } -array_limiter( array, total ) //checked changed to match cerberus output +array_limiter( array, total ) { - 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 ) //checked matches cerberus output +array_validate( array ) { - if ( isDefined( array ) && array.size > 0 ) - { - return 1; - } - else - { - return 0; - } + if ( isdefined( array ) && array.size > 0 ) + return true; + else + return false; } -add_spawner( spawner ) //checked matches cerberus output +add_spawner( 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; + 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; } -fake_physicslaunch( target_pos, power ) //checked matches cerberus output +fake_physicslaunch( target_pos, power ) { - 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 ) //checked matches cerberus output +add_zombie_hint( ref, text ) { - 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 ) //checked matches cerberus output +get_zombie_hint( ref ) { - 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 ) //checked matches cerberus output +set_hint_string( ent, default_ref, cost ) { - 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 ); - } - } + 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 ); + } } -get_hint_string( ent, default_ref, cost ) //checked matches cerberus output +get_hint_string( ent, default_ref, cost ) { - 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 ); + 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 ); } -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 +unitrigger_set_hint_string( ent, default_ref, cost ) { - 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++; - } + 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 ); + } } -add_sound( ref, alias ) //checked matches cerberus output +add_sound( ref, alias ) { - 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 ) //checked matches cerberus output +play_sound_at_pos( ref, pos, ent ) { - 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 ) //checked matches cerberus output +play_sound_on_ent( 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 ] ) ) - { - /* + 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 ) //checked matches cerberus output +play_loopsound_on_ent( ref ) { - 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 ) //checked changed to match cerberus output +string_to_float( string ) { - 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 ) //checked matches cerberus output +onplayerconnect_callback( func ) { - addcallback( "on_player_connect", func ); + addcallback( "on_player_connect", func ); } -onplayerdisconnect_callback( func ) //checked matches cerberus output +onplayerdisconnect_callback( func ) { - addcallback( "on_player_disconnect", func ); + addcallback( "on_player_disconnect", func ); } -set_zombie_var( var, value, is_float, column, is_team_based ) //checked changed to match cerberus output +set_zombie_var( var, value, is_float, column, is_team_based ) { - 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; + 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; } -get_table_var( table, var_name, value, is_float, column ) //checked matches cerberus output +get_table_var( table, var_name, value, is_float, column ) { - 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() //checked matches cerberus output +hudelem_count() { - /* /# - 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; + 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; + } #/ - } - */ } -debug_round_advancer() //checked changed to match cerberus output +debug_round_advancer() { - /* /# - 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++; - } + 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; + } + } #/ - } - */ } -print_run_speed( speed ) //checked changed to match cerberus output +print_run_speed( speed ) { - /* /# - self endon( "death" ); - while ( 1 ) - { - print3d( self.origin + vectorScale( ( 0, 0, 1 ), 64 ), speed, ( 1, 1, 1 ) ); - wait 0.05; + self endon( "death" ); + + while ( true ) + { + print3d( self.origin + vectorscale( ( 0, 0, 1 ), 64.0 ), speed, ( 1, 1, 1 ) ); + wait 0.05; + } #/ - } - */ } -draw_line_ent_to_ent( ent1, ent2 ) //checked matches cerberus output +draw_line_ent_to_ent( ent1, ent2 ) { - /* /# - if ( getDvarInt( "zombie_debug" ) != 1 ) - { - return; - } - ent1 endon( "death" ); - ent2 endon( "death" ); - while ( 1 ) - { - line( ent1.origin, ent2.origin ); - wait 0.05; + if ( getdvarint( _hash_FA91EA91 ) != 1 ) + return; + + ent1 endon( "death" ); + ent2 endon( "death" ); + + while ( true ) + { + line( ent1.origin, ent2.origin ); + wait 0.05; + } #/ - } - */ } -draw_line_ent_to_pos( ent, pos, end_on ) //checked changed to match cerberus output +draw_line_ent_to_pos( ent, pos, end_on ) { - /* /# - 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; + 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; + } #/ - } - */ } -debug_print( msg ) //checked matches cerberus output +debug_print( msg ) { - /* /# - if ( getDvarInt( "zombie_debug" ) > 0 ) - { - println( "######### ZOMBIE: " + msg ); + if ( getdvarint( _hash_FA91EA91 ) > 0 ) + println( "######### ZOMBIE: " + msg ); #/ - } - */ } -debug_blocker( pos, rad, height ) //checked matches cerberus output +debug_blocker( 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 ); + self notify( "stop_debug_blocker" ); + self endon( "stop_debug_blocker" ); + + for (;;) + { + if ( getdvarint( _hash_FA91EA91 ) != 1 ) + return; + + wait 0.05; + drawcylinder( pos, rad, height ); + } #/ - } - */ } -drawcylinder( pos, rad, height ) //checked changed to match cerberus output +drawcylinder( pos, rad, height ) { - /* /# - 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 ) //checked changed to match cerberus output +print3d_at_pos( msg, pos, thread_endon, offset ) { - /* /# - 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; + 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; + } #/ - } - */ } -debug_breadcrumbs() //checked changed to match cerberus output +debug_breadcrumbs() { - /* /# - 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; + 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; + } #/ - } - */ } -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 +debug_attack_spots_taken() { - /* /# - 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 ); + 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 ); + } #/ - } - */ } -float_print3d( msg, time ) //checked changed to match cerberus output +float_print3d( msg, time ) { - /* /# - 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; + 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; + } #/ - } - */ } -do_player_vo( snd, variation_count ) //checked matches cerberus output +do_player_vo( snd, variation_count ) { - 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() //checked matches cerberus output +stop_magic_bullet_shield() { - 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() //checked matches cerberus output +magic_bullet_shield() { - if ( !is_true( self.magic_bullet_shield ) ) - { - if ( isai( self ) || isplayer( self ) ) - { - self.magic_bullet_shield = 1; - /* + if ( !( isdefined( self.magic_bullet_shield ) && 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; - return; - } - else - { - /* + self._mbs.last_pain_time = 0; + self._mbs.ignore_time = 2; + self._mbs.turret_ignore_time = 5; + } + + self.attackeraccuracy = 0.1; + } + 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 ) //checked matches cerberus output +debug_magic_bullet_shield_death( guy ) { - 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 ) //checked changed at own discretion +is_magic_bullet_shield_enabled( ent ) { - if ( !isDefined( ent ) ) - { - return 0; - } - if ( isDefined( ent.magic_bullet_shield ) && ent.magic_bullet_shield == 1 ) - { - return 1; - } - return 0; + if ( !isdefined( ent ) ) + return 0; + + return isdefined( ent.magic_bullet_shield ) && ent.magic_bullet_shield == 1; } -really_play_2d_sound( sound ) //checked changed to match cerberus output +really_play_2d_sound( sound ) { - 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 ) //checked matches cerberus output +play_sound_2d( sound ) { - level thread really_play_2d_sound( sound ); + level thread really_play_2d_sound( sound ); } -include_weapon( weapon_name, in_box, collector, weighting_func ) //checked matches cerberus output +include_weapon( weapon_name, in_box, collector, weighting_func ) { - /* /# - 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 ) //checked matches cerberus output +include_buildable( buildable_struct ) { - /* /# - 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 ) //checked matches cerberus output +is_buildable_included( name ) { - if ( isDefined( level.zombie_include_buildables[ name ] ) ) - { - return 1; - } - return 0; + if ( isdefined( level.zombie_include_buildables[name] ) ) + return true; + + return false; } -create_zombie_buildable_piece( modelname, radius, height, hud_icon ) //checked matches cerberus output +create_zombie_buildable_piece( modelname, radius, height, hud_icon ) { - /* /# - 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() //checked matches cerberus output +is_buildable() { - return self maps/mp/zombies/_zm_buildables::is_buildable(); + return self maps\mp\zombies\_zm_buildables::is_buildable(); } -wait_for_buildable( buildable_name ) //checked matches cerberus output +wait_for_buildable( buildable_name ) { - 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 ) //checked matches cerberus output +include_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 ); + 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 ) //checked matches cerberus output +include_powerup( powerup_name ) { - maps/mp/zombies/_zm_powerups::include_zombie_powerup( powerup_name ); + maps\mp\zombies\_zm_powerups::include_zombie_powerup( powerup_name ); } -include_equipment( equipment_name ) //checked matches cerberus output +include_equipment( equipment_name ) { - 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 ) //checked matches cerberus output +limit_equipment( equipment_name, limited ) { - 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 ) //checked changed to match cerberus output +trigger_invisible( enable ) { - 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 ) //checked changed to match cerberus output +print3d_ent( text, color, scale, offset, end_msg, overwrite ) { - 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; - /* + 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; /# - while ( 1 ) - { - print3d( self.origin + offset, self._debug_print3d_msg, color, scale ); - wait 0,05; + while ( true ) + { + print3d( self.origin + offset, self._debug_print3d_msg, color, scale ); + wait 0.05; + } #/ - } - */ } -isexplosivedamage( meansofdeath ) //checked matches cerberus output +isexplosivedamage( meansofdeath ) { - explosivedamage = "MOD_GRENADE MOD_GRENADE_SPLASH MOD_PROJECTILE_SPLASH MOD_EXPLOSIVE"; - if ( issubstr( explosivedamage, meansofdeath ) ) - { - return 1; - } - return 0; + explosivedamage = "MOD_GRENADE MOD_GRENADE_SPLASH MOD_PROJECTILE_SPLASH MOD_EXPLOSIVE"; + + if ( issubstr( explosivedamage, meansofdeath ) ) + return true; + + return false; } -isprimarydamage( meansofdeath ) //checked matches cerberus output +isprimarydamage( meansofdeath ) { - if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) - { - return 1; - } - return 0; + if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) + return true; + + return false; } -isfiredamage( weapon, meansofdeath ) //checked changed to match cerberus output +isfiredamage( weapon, meansofdeath ) { - 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; + if ( ( issubstr( weapon, "flame" ) || issubstr( weapon, "molotov_" ) || issubstr( weapon, "napalmblob_" ) ) && ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" || meansofdeath == "MOD_GRENADE_SPLASH" ) ) + return true; + + return false; } -isplayerexplosiveweapon( weapon, meansofdeath ) //checked matches cerberus output +isplayerexplosiveweapon( weapon, meansofdeath ) { - if ( !isexplosivedamage( meansofdeath ) ) - { - return 0; - } - if ( weapon == "artillery_mp" ) - { - return 0; - } - if ( issubstr( weapon, "turret" ) ) - { - return 0; - } - return 1; + if ( !isexplosivedamage( meansofdeath ) ) + return false; + + if ( weapon == "artillery_mp" ) + return false; + + if ( issubstr( weapon, "turret" ) ) + return false; + + return true; } -create_counter_hud( x ) //checked changed to match cerberus output +create_counter_hud( x ) { - 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 ) //checked changed to match cerberus output +get_current_zone( return_zone ) { - 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; + 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; } -remove_mod_from_methodofdeath( mod ) //checked matches cerberus output +remove_mod_from_methodofdeath( mod ) { - return mod; + return mod; } -clear_fog_threads() //checked changed to match cerberus output +clear_fog_threads() { - 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 ) //checked changed to match cerberus output +display_message( titletext, notifytext, duration ) { - 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() //checked matches cerberus output +is_quad() { - return self.animname == "quad_zombie"; + return self.animname == "quad_zombie"; } -is_leaper() //checked matches cerberus output +is_leaper() { - return self.animname == "leaper_zombie"; + return self.animname == "leaper_zombie"; } -shock_onpain() //checked changed to match cerberus output +shock_onpain() { - 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 ); - } - } + 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 ); + } } -shock_onexplosion( damage, shocktype, shocklight ) //checked changed to match cerberus output +shock_onexplosion( damage, shocktype, shocklight ) { - 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() //checked matches cerberus output +increment_is_drinking() { - /* /# - 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() //checked matches cerberus output +is_multiple_drinking() { - return self.is_drinking > 1; + return self.is_drinking > 1; } -decrement_is_drinking() //checked matches cerberus output +decrement_is_drinking() { - 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() //checked matches cerberus output +clear_is_drinking() { - self.is_drinking = 0; - self enableoffhandweapons(); - self enableweaponcycling(); + self.is_drinking = 0; + self enableoffhandweapons(); + self enableweaponcycling(); } -getweaponclasszm( weapon ) //checked matches cerberus output +getweaponclasszm( 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( "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( 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( weaponname ) || !isDefined( level.zombie_lethal_grenade_list ) ) - { - return 0; - } - if ( isDefined( level.zombie_lethal_grenade_list[ weaponname ] ) ) - { - return 1; - } - return 0; + 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_player_lethal_grenade( weaponname ) //checked matches cerberus output //changed at own discretion +is_limited_weapon( weapname ) { - if ( !isDefined( weaponname ) || !isDefined( self.current_lethal_grenade ) ) - { - return 0; - } - if ( self.current_lethal_grenade == weaponname ) - { - return 1; - } - return 0; + if ( isdefined( level.limited_weapons ) ) + { + if ( isdefined( level.limited_weapons[weapname] ) ) + return true; + } + + return false; } -get_player_lethal_grenade() //checked matches cerberus output +is_alt_weapon( weapname ) { - grenade = ""; - if ( isDefined( self.current_lethal_grenade ) ) - { - grenade = self.current_lethal_grenade; - } - return grenade; + 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; } -set_player_lethal_grenade( weaponname ) //checked matches cerberus output +is_grenade_launcher( weapname ) { - self.current_lethal_grenade = weaponname; + return weapname == "m32_zm" || weapname == "m32_upgraded_zm"; } -init_player_lethal_grenade() //checked matches cerberus output +register_lethal_grenade_for_level( weaponname ) { - self set_player_lethal_grenade( level.zombie_lethal_grenade_player_init ); + 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; } -register_tactical_grenade_for_level( weaponname ) //checked changed at own discretion +is_lethal_grenade( 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; + if ( !isdefined( weaponname ) || !isdefined( level.zombie_lethal_grenade_list ) ) + return 0; + + return isdefined( level.zombie_lethal_grenade_list[weaponname] ); } -is_tactical_grenade( weaponname ) //checked matches cerberus output //checked changed at own discretion +is_player_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; + if ( !isdefined( weaponname ) || !isdefined( self.current_lethal_grenade ) ) + return 0; + + return self.current_lethal_grenade == weaponname; } -is_player_tactical_grenade( weaponname ) //checked matches cerberus output //checked changed at own discretion +get_player_lethal_grenade() { - if ( !isDefined( weaponname ) || !isDefined( self.current_tactical_grenade ) ) - { - return 0; - } - if ( self.current_tactical_grenade == weaponname ) - { - return 1; - } - return 0; + grenade = ""; + + if ( isdefined( self.current_lethal_grenade ) ) + grenade = self.current_lethal_grenade; + + return grenade; } -get_player_tactical_grenade() //checked matches cerberus output +set_player_lethal_grenade( weaponname ) { - tactical = ""; - if ( isDefined( self.current_tactical_grenade ) ) - { - tactical = self.current_tactical_grenade; - } - return tactical; + self.current_lethal_grenade = weaponname; } -set_player_tactical_grenade( weaponname ) //checked changed to match cerberus output +init_player_lethal_grenade() { - self notify( "new_tactical_grenade", weaponname ); - self.current_tactical_grenade = weaponname; + self set_player_lethal_grenade( level.zombie_lethal_grenade_player_init ); } -init_player_tactical_grenade() //checked matches cerberus output +register_tactical_grenade_for_level( weaponname ) { - self set_player_tactical_grenade( level.zombie_tactical_grenade_player_init ); + 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; } -register_placeable_mine_for_level( weaponname ) //checked changed at own discretion +is_tactical_grenade( 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; + if ( !isdefined( weaponname ) || !isdefined( level.zombie_tactical_grenade_list ) ) + return 0; + + return isdefined( level.zombie_tactical_grenade_list[weaponname] ); } -is_placeable_mine( weaponname ) //checked matches cerberus output //changed at own discretion +is_player_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; + if ( !isdefined( weaponname ) || !isdefined( self.current_tactical_grenade ) ) + return 0; + + return self.current_tactical_grenade == weaponname; } -is_player_placeable_mine( weaponname ) //checked matches cerberus output //changed at own discretion +get_player_tactical_grenade() { - if ( !isDefined( weaponname ) || !isDefined( self.current_placeable_mine ) ) - { - return 0; - } - if ( self.current_placeable_mine == weaponname ) - { - return 1; - } - return 0; + tactical = ""; + + if ( isdefined( self.current_tactical_grenade ) ) + tactical = self.current_tactical_grenade; + + return tactical; } -get_player_placeable_mine() //checked matches cerberus output +set_player_tactical_grenade( weaponname ) { - return self.current_placeable_mine; + self notify( "new_tactical_grenade", weaponname ); + self.current_tactical_grenade = weaponname; } -set_player_placeable_mine( weaponname ) //checked matches cerberus output +init_player_tactical_grenade() { - self.current_placeable_mine = weaponname; + self set_player_tactical_grenade( level.zombie_tactical_grenade_player_init ); } -init_player_placeable_mine() //checked matches cerberus output +register_placeable_mine_for_level( weaponname ) { - self set_player_placeable_mine( level.zombie_placeable_mine_player_init ); + 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; } -register_melee_weapon_for_level( weaponname ) //checked matches cerberus output +is_placeable_mine( 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; + if ( !isdefined( weaponname ) || !isdefined( level.zombie_placeable_mine_list ) ) + return 0; + + return isdefined( level.zombie_placeable_mine_list[weaponname] ); } -is_melee_weapon( weaponname ) //checked matches cerberus output //changed at own discretion +is_player_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; + if ( !isdefined( weaponname ) || !isdefined( self.current_placeable_mine ) ) + return 0; + + return self.current_placeable_mine == weaponname; } -is_player_melee_weapon( weaponname ) //checked matches cerberus output //changed at own discretion +get_player_placeable_mine() { - if ( !isDefined( weaponname ) || !isDefined( self.current_melee_weapon ) ) - { - return 0; - } - if ( self.current_melee_weapon == weaponname ) - { - return 1; - } - return 0; + return self.current_placeable_mine; } -get_player_melee_weapon() //checked matches cerberus output +set_player_placeable_mine( weaponname ) { - return self.current_melee_weapon; + self.current_placeable_mine = weaponname; } -set_player_melee_weapon( weaponname ) //checked matches cerberus output +init_player_placeable_mine() { - self.current_melee_weapon = weaponname; + self set_player_placeable_mine( level.zombie_placeable_mine_player_init ); } -init_player_melee_weapon() //checked matches cerberus output +register_melee_weapon_for_level( weaponname ) { - self set_player_melee_weapon( level.zombie_melee_weapon_player_init ); + 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; } -should_watch_for_emp() //checked matches cerberus output +is_melee_weapon( weaponname ) { - return isDefined( level.zombie_weapons[ "emp_grenade_zm" ] ); + 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; } -register_equipment_for_level( weaponname ) //checked matches cerberus output +get_player_melee_weapon() { - if ( is_equipment( weaponname ) ) - { - return; - } - if ( !isDefined( level.zombie_equipment_list ) ) - { - level.zombie_equipment_list = []; - } - level.zombie_equipment_list[ weaponname ] = weaponname; + return self.current_melee_weapon; } -is_equipment( weaponname ) //checked matches cerberus output //changed at own discretion +set_player_melee_weapon( weaponname ) { - if ( !isDefined( weaponname ) || !isDefined( level.zombie_equipment_list ) ) - { - return 0; - } - if ( isDefined( level.zombie_equipment_list[ weaponname ] ) ) - { - return 1; - } - return 0; + self.current_melee_weapon = weaponname; } -is_equipment_that_blocks_purchase( weaponname ) //checked matches cerberus output //changed at own discretion +init_player_melee_weapon() { - if ( is_equipment( weaponname ) ) - { - return 1; - } - return 0; + self set_player_melee_weapon( level.zombie_melee_weapon_player_init ); } -is_player_equipment( weaponname ) //checked matches cerberus output //changed at own discretion +should_watch_for_emp() { - if ( !isDefined( weaponname ) || !isDefined( self.current_equipment ) ) - { - return 0; - } - if ( self.current_equipment == weaponname ) - { - return 1; - } - return 0; + return isdefined( level.zombie_weapons["emp_grenade_zm"] ); } -has_deployed_equipment( weaponname ) //checked changed to match cerberus output +register_equipment_for_level( 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; + if ( is_equipment( weaponname ) ) + return; + + if ( !isdefined( level.zombie_equipment_list ) ) + level.zombie_equipment_list = []; + + level.zombie_equipment_list[weaponname] = weaponname; } -has_player_equipment( weaponname ) //checked changed at own discretion +is_equipment( weaponname ) { - if ( self is_player_equipment( weaponname ) || self has_deployed_equipment( weaponname ) ) - { - return 1; - } - return 0; + if ( !isdefined( weaponname ) || !isdefined( level.zombie_equipment_list ) ) + return 0; + + return isdefined( level.zombie_equipment_list[weaponname] ); } -get_player_equipment() //checked matches cerberus output +is_equipment_that_blocks_purchase( weaponname ) { - return self.current_equipment; + return is_equipment( weaponname ); } -hacker_active() //checked matches cerberus output //changed at own discretion +is_player_equipment( weaponname ) { - if ( self maps/mp/zombies/_zm_equipment::is_equipment_active( "equip_hacker_zm" ) ) - { - return 1; - } - return 0; + if ( !isdefined( weaponname ) || !isdefined( self.current_equipment ) ) + return 0; + + return self.current_equipment == weaponname; } -set_player_equipment( weaponname ) //checked matches cerberus output +has_deployed_equipment( weaponname ) { - 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 ( !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; } -init_player_equipment() //checked matches cerberus output +has_player_equipment( weaponname ) { - self set_player_equipment( level.zombie_equipment_player_init ); + return self is_player_equipment( weaponname ) || self has_deployed_equipment( weaponname ); } -register_offhand_weapons_for_level_defaults() //checked matches cerberus output +get_player_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; + return self.current_equipment; } -init_player_offhand_weapons() //checked matches cerberus output +hacker_active() { - init_player_lethal_grenade(); - init_player_tactical_grenade(); - init_player_placeable_mine(); - init_player_melee_weapon(); - init_player_equipment(); + return self maps\mp\zombies\_zm_equipment::is_equipment_active( "equip_hacker_zm" ); } -is_offhand_weapon( weaponname ) //checked changed at own discretion +set_player_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; + 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; } -is_player_offhand_weapon( weaponname ) //checked changed at own discretion +init_player_equipment() { - 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; + self set_player_equipment( level.zombie_equipment_player_init ); } -has_powerup_weapon() //checked changed at own discretion +register_offhand_weapons_for_level_defaults() { - if ( is_true( self.has_powerup_weapon ) ) - { - return 1; - } - return 0; + 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; } -give_start_weapon( switch_to_weapon ) //checked matches cerberus output +init_player_offhand_weapons() { - self giveweapon( level.start_weapon ); - self givestartammo( level.start_weapon ); - if ( is_true( switch_to_weapon ) ) - { - self switchtoweapon( level.start_weapon ); - } + init_player_lethal_grenade(); + init_player_tactical_grenade(); + init_player_placeable_mine(); + init_player_melee_weapon(); + init_player_equipment(); } -array_flag_wait_any( flag_array ) //checked changed to match cerberus output +is_offhand_weapon( 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 ); + return is_lethal_grenade( weaponname ) || is_tactical_grenade( weaponname ) || is_placeable_mine( weaponname ) || is_melee_weapon( weaponname ) || is_equipment( weaponname ); } -array_flag_wait_any_thread( flag_name, condition ) //checked matches cerberus output +is_player_offhand_weapon( weaponname ) { - level endon( condition ); - flag_wait( flag_name ); - level notify( condition ); + 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 ); } -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 +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; + return isdefined( self.has_powerup_weapon ) && self.has_powerup_weapon; } -groundpos( origin ) //checked matches cerberus output +give_start_weapon( switch_to_weapon ) { - return bullettrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self )[ "position" ]; + self giveweapon( level.start_weapon ); + self givestartammo( level.start_weapon ); + + if ( isdefined( switch_to_weapon ) && switch_to_weapon ) + self switchtoweapon( level.start_weapon ); } -groundpos_ignore_water( origin ) //checked matches cerberus output +array_flag_wait_any( flag_array ) { - return bullettrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self, 1 )[ "position" ]; + 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 ); } -groundpos_ignore_water_new( origin ) //checked matches cerberus output +array_flag_wait_any_thread( flag_name, condition ) { - return groundtrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self, 1 )[ "position" ]; + level endon( condition ); + flag_wait( flag_name ); + level notify( condition ); } -waittill_notify_or_timeout( msg, timer ) //checked matches cerberus output +array_removedead( array ) { - self endon( msg ); - wait timer; - return timer; + 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_delete() //checked matches cerberus output +groundpos( origin ) { - if ( isDefined( self ) ) - { - self delete(); - } + return bullettrace( origin, origin + vectorscale( ( 0, 0, -1 ), 100000.0 ), 0, self )["position"]; } -script_delay() //checked changed to match cerberus output +groundpos_ignore_water( origin ) { - 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; + return bullettrace( origin, origin + vectorscale( ( 0, 0, -1 ), 100000.0 ), 0, self, 1 )["position"]; } -button_held_think( which_button ) //checked changed to match cerberus output +groundpos_ignore_water_new( origin ) { - 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; - } + return groundtrace( origin, origin + vectorscale( ( 0, 0, -1 ), 100000.0 ), 0, self, 1 )["position"]; } -use_button_held() //checked matches cerberus output +waittill_notify_or_timeout( msg, 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 endon( msg ); + wait( timer ); + return timer; } -ads_button_held() //checked matches cerberus output +self_delete() { - 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 ) ) - { - /* + 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 ) ) + { /# - 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 ( !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 ); - } + 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 ); } -spawn_failed( spawn ) //checked matches cerberus output +spawn_failed( spawn ) { - if ( isDefined( spawn ) && isalive( spawn ) ) - { - if ( isalive( spawn ) ) - { - return 0; - } - } - return 1; + if ( isdefined( spawn ) && isalive( spawn ) ) + { + if ( isalive( spawn ) ) + return false; + } + + return true; } -getyaw( org ) //checked matches cerberus output +getyaw( org ) { - angles = vectorToAngles( org - self.origin ); - return angles[ 1 ]; + angles = vectortoangles( org - self.origin ); + return angles[1]; } -getyawtospot( spot ) //checked matches cerberus output +getyawtospot( spot ) { - pos = spot; - yaw = self.angles[ 1 ] - getyaw( pos ); - yaw = AbsAngleClamp180( yaw ); - return yaw; + pos = spot; + yaw = self.angles[1] - getyaw( pos ); + yaw = angleclamp180( yaw ); + return yaw; } -add_spawn_function( function, param1, param2, param3, param4 ) //checked matches cerberus output +add_spawn_function( function, param1, param2, param3, param4 ) { - /* /# - if ( isDefined( level._loadstarted ) ) - { - assert( !isalive( self ), "Tried to add_spawn_function to a living guy." ); - } + assert( !isdefined( level._loadstarted ) || !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() //checked matches cerberus output +disable_react() { - /* /# - 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() //checked matches cerberus output +enable_react() { - /* /# - 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 ) //not sure what to do here +flag_wait_or_timeout( 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 ); - } - } + start_time = gettime(); + + for (;;) + { + if ( level.flag[flagname] ) + break; + + if ( gettime() >= start_time + timer * 1000 ) + break; + + wait_for_flag_or_time_elapses( flagname, timer ); + } } -wait_for_flag_or_time_elapses( flagname, timer ) //checked matches cerberus output +wait_for_flag_or_time_elapses( flagname, timer ) { - level endon( flagname ); - wait timer; + level endon( flagname ); + wait( timer ); } -isads( player ) //checked matches cerberus output +isads( player ) { - return player playerads() > 0.5; + return player playerads() > 0.5; } -bullet_attack( type ) //checked matches cerberus output +bullet_attack( type ) { - 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() //checked matches cerberus output +pick_up() { - 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() //checked matches cerberus output +destroy_ent() { - self delete(); + self delete(); } -waittill_not_moving() //checked changed to match cerberus output +waittill_not_moving() { - 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; - } + 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; + } + } } -get_closest_player( org ) //checked matches cerberus output +get_closest_player( org ) { - players = []; - players = get_players(); - return getclosest( org, players ); + players = []; + players = get_players(); + return getclosest( org, players ); } -ent_flag_wait( msg ) //checked matches cerberus output +ent_flag_wait( msg ) { - 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 ) //no idea what to do here +ent_flag_wait_either( flag1, flag2 ) { - 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 ) //checked matches cerberus output +ent_wait_for_flag_or_time_elapses( flagname, timer ) { - self endon( flagname ); - wait timer; + self endon( flagname ); + wait( timer ); } -ent_flag_wait_or_timeout( flagname, timer ) //no idea what to do here +ent_flag_wait_or_timeout( 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 ); - } - } + 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 ); + } } -ent_flag_waitopen( msg ) //checked matches cerberus output +ent_flag_waitopen( msg ) { - 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 ) //checked matches cerberus output +ent_flag_init( message, val ) { - 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 ( is_true( val ) ) - { - self.ent_flag[ message ] = 1; - /* + } + + if ( isdefined( val ) && 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 ) //checked matches cerberus output +ent_flag_exist( message ) { - if ( isDefined( self.ent_flag ) && isDefined( self.ent_flag[ message ] ) ) - { - return 1; - } - return 0; + if ( isdefined( self.ent_flag ) && isdefined( self.ent_flag[message] ) ) + return true; + + return false; } -ent_flag_set_delayed( message, delay ) //checked matches cerberus output +ent_flag_set_delayed( message, delay ) { - wait delay; - self ent_flag_set( message ); + wait( delay ); + self ent_flag_set( message ); } -ent_flag_set( message ) //checked matches cerberus output +ent_flag_set( message ) { - /* /# - 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 ) //checked matches cerberus output +ent_flag_toggle( message ) { - 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 ) //checked matches cerberus output +ent_flag_clear( message ) { - /* /# - 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 ) //checked matches cerberus output +ent_flag_clear_delayed( message, delay ) { - wait delay; - self ent_flag_clear( message ); + wait( delay ); + self ent_flag_clear( message ); } -ent_flag( message ) //checked matches cerberus output +ent_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." ); #/ /# - 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 0; - } - return 1; + if ( !self.ent_flag[message] ) + return false; + + return true; } -ent_flag_init_ai_standards() //checked changed to match cerberus output +ent_flag_init_ai_standards() { - 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 ) //checked matches cerberus output +ent_flag_wait_ai_standards( message ) { - 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 ) //checked matches cerberus output +flat_angle( angle ) { - rangle = ( 0, angle[ 1 ], 0 ); - return rangle; + rangle = ( 0, angle[1], 0 ); + return rangle; } -waittill_any_or_timeout( timer, string1, string2, string3, string4, string5 ) //checked matches cerberus output +waittill_any_or_timeout( timer, string1, string2, string3, string4, string5 ) { - /* /# - 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() //checked matches cerberus output +clear_run_anim() { - 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() //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite +track_players_intersection_tracker() { - 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; - } - /* + 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; /# - iprintlnbold( "PLAYERS ARE TOO FRIENDLY!!!!!" ); + iprintlnbold( "PLAYERS ARE TOO FRIENDLY!!!!!" ); #/ - */ - 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; - } + 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; + } } -get_eye() //checked matches cerberus output +get_eye() { - 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; + 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; } -is_player_looking_at( origin, dot, do_trace, ignore_ent ) //checked matches cerberus output +is_player_looking_at( origin, dot, do_trace, ignore_ent ) { - /* /# - 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 ) //checked matches cerberus output +add_gametype( gt, dummy1, name, dummy2 ) { + } -add_gameloc( gl, dummy1, name, dummy2 ) //checked matches cerberus output +add_gameloc( gl, dummy1, name, dummy2 ) { + } -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 +get_closest_index( org, array, dist ) { - 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; + 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; } -is_valid_zombie_spawn_point( point ) //checked matches cerberus output +is_valid_zombie_spawn_point( point ) { - 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; + 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; } -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 +get_closest_index_to_entity( entity, array, dist, extra_check ) { - 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; + 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; } -set_gamemode_var( var, val ) //checked matches cerberus output +set_gamemode_var( var, val ) { - 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 ) //checked matches cerberus output +set_gamemode_var_once( var, val ) { - 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 ) //checked matches cerberus output +set_game_var( var, val ) { - game[ var ] = val; + game[var] = val; } -set_game_var_once( var, val ) //checked matches cerberus output +set_game_var_once( var, val ) { - if ( !isDefined( game[ var ] ) ) - { - game[ var ] = val; - } + if ( !isdefined( game[var] ) ) + game[var] = val; } -get_game_var( var ) //checked matches cerberus output +get_game_var( var ) { - if ( isDefined( game[ var ] ) ) - { - return game[ var ]; - } - return undefined; + if ( isdefined( game[var] ) ) + return game[var]; + + return undefined; } -get_gamemode_var( var ) //checked matches cerberus output +get_gamemode_var( var ) { - 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 ) //checked matches cerberus output +waittill_subset( min_num, string1, string2, string3, string4, string5 ) { - 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--; + self endon( "death" ); + ent = spawnstruct(); + ent.threads = 0; + returned_threads = 0; - returned_threads++; - if ( returned_threads >= min_num ) - { - break; - } - } - ent notify( "die" ); + 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" ); } -is_headshot( sweapon, shitloc, smeansofdeath ) //checked changed at own diecretion +is_headshot( sweapon, shitloc, smeansofdeath ) { - 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; - } + 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"; } -is_jumping() //checked matches cerberus output +is_jumping() { - ground_ent = self getgroundent(); - return !isDefined( ground_ent ); + ground_ent = self getgroundent(); + return !isdefined( ground_ent ); } -is_explosive_damage( mod ) //checked changed to match cerberus output +is_explosive_damage( mod ) { - 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; + 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; } -sndswitchannouncervox( who ) //checked matches cerberus output +sndswitchannouncervox( who ) { - 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 ) //checked matches cerberus output +do_player_general_vox( category, type, timer, chance ) { - 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 ) //checked matches cerberus output +general_vox_timer( timer, type ) { - 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 ) //checked matches cerberus output +create_vox_timer( type ) { - level.votimer[ type ] = 0; + level.votimer[type] = 0; } -play_vox_to_player( category, type, force_variant ) //checked matches cerberus output +play_vox_to_player( category, type, force_variant ) { - 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 0; - } - foreach ( weapon in self.favorite_wall_weapons_list ) - { - if ( weapon_to_check == weapon ) - { - return 1; - } - } - return 0; + 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; } add_vox_response_chance( event, chance ) { - level.response_chances[ event ] = chance; + level.response_chances[event] = chance; } -set_demo_intermission_point() //checked changed to match cerberus output +set_demo_intermission_point() { - 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 ) //checked matches cerberus output +register_map_navcard( navcard_on_map, navcard_needed_for_computer ) { - 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 ) //checked matches cerberus output +does_player_have_map_navcard( player ) { - 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 ) //checked matches cerberus output +does_player_have_correct_navcard( player ) { - 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 ) //checked changed to match cerberus output +place_navcard( str_model, str_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 ); - } + 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 ); } -sq_refresh_player_navcard_hud() //checked changed to match cerberus output +sq_refresh_player_navcard_hud() { - 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() //checked changed to match cerberus output +sq_refresh_player_navcard_hud_internal() { - 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 ); - } + 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 ); + } } -set_player_is_female( onoff ) //checked matches cerberus output +set_player_is_female( onoff ) { - if ( is_true( level.use_female_animations ) ) - { - female_perk = "specialty_gpsjammer"; - if ( onoff ) - { - self setperk( female_perk ); - return; - } - else - { - self unsetperk( female_perk ); - } - } + 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 ); + } } -disable_player_move_states( forcestancechange ) //checked matches cerberus output +disable_player_move_states( forcestancechange ) { - 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() //checked matches cerberus output +enable_player_move_states() { - 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() //checked matches cerberus output +check_and_create_node_lists() { - 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 ) //checked changed to match cerberus output +link_nodes( a, b, bdontunlinkonmigrate ) { - 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 ) //checked changed to match cerberus output +unlink_nodes( a, b, bdontlinkonmigrate ) { - 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 ) //checked matches cerberus output +spawn_path_node( origin, angles, k1, v1, k2, v2 ) { - 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 ) //checked matches cerberus output +spawn_path_node_internal( origin, angles, k1, v1, k2, v2 ) { - 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() //checked matches cerberus output +delete_spawned_path_nodes() { + } -respawn_path_nodes() //checked changed to match cerberus output +respawn_path_nodes() { - 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 ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite +link_changes_internal_internal( list, func ) { - 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 ] ] ) - { - /* + 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]] ) + { /# - println( "Node at " + keys[ i ] + " to node at " + node_keys[ j ] + " - IGNORED" ); + println( "Node at " + keys[i] + " to node at " + node_keys[j] + " - IGNORED" ); #/ - */ - j++; - continue; - } - /* + 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 ] ] ); - } - j++; - } - } + [[ func ]]( node, list[keys[i]].links[node_keys[j]] ); + } + } + } } -link_changes_internal( func_for_link_list, func_for_unlink_list ) //checked matches cerberus output +link_changes_internal( func_for_link_list, func_for_unlink_list ) { - 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 ) //checked matches cerberus output +link_nodes_wrapper( a, b ) { - if ( !nodesarelinked( a, b ) ) - { - linknodes( a, b ); - } + if ( !nodesarelinked( a, b ) ) + linknodes( a, b ); } -unlink_nodes_wrapper( a, b ) //checked matches cerberus output +unlink_nodes_wrapper( a, b ) { - if ( nodesarelinked( a, b ) ) - { - unlinknodes( a, b ); - } + if ( nodesarelinked( a, b ) ) + unlinknodes( a, b ); } -undo_link_changes() //checked matches cerberus output +undo_link_changes() { - /* /# - 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() //checked matches cerberus output +redo_link_changes() { - /* /# - 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() //checked matches cerberus output +set_player_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++; - } + 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 ) //checked matches cerberus output +hotjoin_setup_player( viewmodel ) { - if ( is_true( level.passed_introscreen ) && !isDefined( self.first_spawn ) && !isDefined( self.characterindex ) ) - { - self.first_spawn = 1; - self setviewmodel( viewmodel ); - return 1; - } - return 0; + if ( is_true( level.passed_introscreen ) && !isdefined( self.first_spawn ) && !isdefined( self.characterindex ) ) + { + self.first_spawn = 1; + self setviewmodel( viewmodel ); + return true; + } + + return false; } -is_temporary_zombie_weapon( str_weapon ) //checked changed at own discretion +is_temporary_zombie_weapon( str_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; + 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; } -is_gametype_active( a_gametypes ) //checked changed to match cerberus output +is_gametype_active( a_gametypes ) { - 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() //checked changed at own discretion +is_createfx_active() { - 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 ) //checked matches cerberus output +is_zombie_perk_bottle( str_weapon ) { - 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; + 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; } -register_custom_spawner_entry( spot_noteworthy, func ) //checked matches cerberus output +register_custom_spawner_entry( spot_noteworthy, func ) { - 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 ) //checked matches cerberus output +get_player_weapon_limit( player ) { - 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() //checked matches cerberus output +get_player_perk_purchase_limit() { - 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 10ad76c..9cbde27 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,568 +1,559 @@ -#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; +// 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; -//#using_animtree( "zombie_cymbal_monkey" ); - -init() //checked matches cerberus output +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; #/ - */ - 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 ); + 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 ); } -player_give_cymbal_monkey() //checked matches cerberus output +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() //checked matches cerberus output +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 ( 1 ) - { - 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 ( true ) + { + 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 ) //checked matches cerberus output +watch_for_dud( model, actor ) { - 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(); } -watch_for_emp( model, actor ) //checked changed to match cerberus output +#using_animtree("zombie_cymbal_monkey"); + +watch_for_emp( model, actor ) { - 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(); - } + 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(); } -clone_player_angles( owner ) //checked matches cerberus output +clone_player_angles( owner ) { - 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 ) //checked matches cerberus output +show_briefly( showtime ) { - 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 ) //checked matches cerberus output +show_owner_on_attack( owner ) { - 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 ) //checked matches cerberus output +hide_owner( owner ) { - 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 ) //checked changed to match cerberus output +proximity_detonate( owner ) { - 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(); - } + 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(); } -player_throw_cymbal_monkey( grenade, num_attractors, max_attract_dist, attract_dist_diff ) //checked matches cerberus output +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() ) - { - 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 ); - } - } + 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 ); + } + } } -grenade_stolen_by_sam( ent_grenade, ent_model, ent_actor ) //checked changed to match cerberus output +grenade_stolen_by_sam( ent_grenade, ent_model, ent_actor ) { - 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(); - } + 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(); + } } -wait_for_attractor_positions_complete() //checked matches cerberus output +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 ) //checked matches cerberus output +monkey_cleanup( parent ) { - 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; - } + 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; + } } -do_monkey_sound( model, info ) //checked changed to match cerberus output +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 ) - { - 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" ); - } - } + 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" ); + } } -play_delayed_explode_vox() //checked matches cerberus output +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() //checked matches cerberus output +get_thrown_monkey() { - 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; - } + 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; + } } -monitor_zombie_groans( info ) //checked changed to match cerberus output +monitor_zombie_groans( info ) { - 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; - } + 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; + } } -play_zombie_groans() //checked changed to match cerberus output +play_zombie_groans() { - 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; - } - } + 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; + } } -cymbal_monkey_exists() //checked matches cerberus output +cymbal_monkey_exists() { - 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 a4476cf..437c810 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_weapons.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_weapons.gsc @@ -1,2799 +1,2746 @@ -#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; +// 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; - -init() //checked matches cerberus output +init() { - 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(); - +/# + 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(); } -setupretrievablehintstrings() //checked matches cerberus output +setupretrievablehintstrings() { - maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "claymore", &"ZOMBIE_CLAYMORE_PICKUP" ); + maps\mp\gametypes_zm\_weaponobjects::createretrievablehint( "claymore", &"ZOMBIE_CLAYMORE_PICKUP" ); } -onplayerconnect() //checked matches cerberus output +onplayerconnect() { - for ( ;; ) - { - level waittill( "connecting", player ); - player thread onplayerspawned(); - } + for (;;) + { + level waittill( "connecting", player ); + + player thread onplayerspawned(); + } } -onplayerspawned() //checked matches cerberus output +onplayerspawned() { - 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() //checked matches cerberus output +watchforgrenadeduds() { - 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 ); - } - } + 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 ); + } + } } -watchforgrenadelauncherduds() //checked matches cerberus output +watchforgrenadelauncherduds() { - 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 ); - } + 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 ); + } } -grenade_safe_to_throw( player, weapname ) //checked matches cerberus output +grenade_safe_to_throw( player, weapname ) { - 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 ) //checked matches cerberus output +grenade_safe_to_bounce( player, weapname ) { - 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() //checked matches cerberus output +makegrenadedudanddestroy() { - 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 ) //checked matches cerberus output +checkgrenadefordud( weapname, isthrowngrenade, player ) { - 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() //checked matches cerberus output +wait_explode() { - 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 ) //checked matches cerberus output +wait_timeout( time ) { - 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 ) //checked changed to match cerberus output +wait_for_explosion( time ) { - 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 ) //checked changed to match cerberus output +watchforscriptexplosion( weapname, isthrowngrenade, player ) { - 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 ) //checked changed to match cerberus output +get_nonalternate_weapon( 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; + 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 ) //checked changed to match cerberus output +switch_from_alt_weapon( 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; + 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() //checked matches cerberus output +give_fallback_weapon() { - self giveweapon( "zombie_fists_zm" ); - self switchtoweapon( "zombie_fists_zm" ); + self giveweapon( "zombie_fists_zm" ); + self switchtoweapon( "zombie_fists_zm" ); } -take_fallback_weapon() //checked matches cerberus output +take_fallback_weapon() { - 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 ) //checked changed to match cerberus output +switch_back_primary_weapon( oldprimary ) { - 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 ] ); - } + 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] ); } -add_retrievable_knife_init_name( name ) //checked matches cerberus output +add_retrievable_knife_init_name( 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; + 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() //checked changed to match cerberus output +watchweaponusagezm() { - 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: - - } - } - } + 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; + } + } } -trackweaponzm() //checked changed to match cerberus output +trackweaponzm() { - 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 - } + 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; + } + } } -updatelastheldweapontimingszm( newtime ) //checked matches cerberus output +updatelastheldweapontimingszm( newtime ) { - 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 ) //checked matches cerberus output +updateweapontimingszm( 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; + 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() //checked matches cerberus output +watchweaponchangezm() { - 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 ); - } - } - } + 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 ); + } + } } -weaponobjects_on_player_connect_override_internal() //checked changed to match cerberus output +weaponobjects_on_player_connect_override_internal() { - 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() //checked matches cerberus output +weaponobjects_on_player_connect_override() { - 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() //checked changed to match cerberus output +createclaymorewatcher_zm() { - 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 ) //checked changed to match cerberus output +createballisticknifewatcher_zm( name, weapon ) { - 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 ) //checked changed at own discretion +isempweapon( weaponname ) { - if ( isDefined( weaponname ) && weaponname == "emp_grenade_zm" ) - { - return 1; - } - return 0; + if ( isdefined( weaponname ) && ( weaponname == "emp_mp" || weaponname == "emp_grenade_mp" || weaponname == "emp_grenade_zm" ) ) + return true; + + return false; } -claymoredetonate( attacker, weaponname ) //checked matches cerberus output +claymoredetonate( attacker, weaponname ) { - 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() //checked matches cerberus output +default_check_firesale_loc_valid_func() { - return 1; + return 1; } -add_zombie_weapon( weapon_name, upgrade_name, hint, cost, weaponvo, weaponvoresp, ammo_cost, create_vox ) //checked matches cerberus output +add_zombie_weapon( weapon_name, upgrade_name, hint, cost, weaponvo, weaponvoresp, ammo_cost, create_vox ) { - 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; - } + if ( isdefined( level.zombie_include_weapons ) && !isdefined( level.zombie_include_weapons[weapon_name] ) ) + return; - 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 ); - } + 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 ); +#/ } -add_attachments( weapon_name, upgrade_name ) //checked does not match cerberus output did not change +add_attachments( weapon_name, upgrade_name ) { - 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 ); + table = "zm/pap_attach.csv"; - 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 ); - } - } + 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++; + } + } } -default_weighting_func() //checked matches cerberus output +default_weighting_func() { - return 1; + return 1; } -default_tesla_weighting_func() //checked changed to match cerberus output +default_tesla_weighting_func() { - 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() //checked matches cerberus output +default_1st_move_weighting_func() { - 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() //checked matches cerberus output +default_upgrade_weapon_weighting_func() { - if ( level.chest_moves > 1 ) - { - return 1; - } - else - { - return 0; - } + if ( level.chest_moves > 1 ) + return true; + else + return false; } -default_cymbal_monkey_weighting_func() //checked changed to match cerberus output +default_cymbal_monkey_weighting_func() { - 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 ) //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 ); + { + 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; } -unacquire_weapon_toggle_on_death_or_disconnect_thread( player ) //checked matches cerberus output +include_zombie_weapon( weapon_name, in_box, collector, 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; - } + 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; } +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 9066293..105d628 100644 --- a/Zombie Core/patch_zm/maps/mp/zombies/_zm_zonemgr.gsc +++ b/Zombie Core/patch_zm/maps/mp/zombies/_zm_zonemgr.gsc @@ -1,1105 +1,1187 @@ -//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; +// 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; -init() //checked matches cerberus output +init() { - flag_init( "zones_initialized" ); - level.zones = []; - level.zone_flags = []; - level.zone_scanning_active = 0; - if ( !isDefined( level.create_spawner_list_func ) ) - { - level.create_spawner_list_func = ::create_spawner_list; - } +/# + 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; } -zone_is_enabled( zone_name ) //checked matches cerberus output +zone_is_enabled( zone_name ) { - if ( !isDefined( level.zones ) || !isDefined( level.zones[ zone_name ] ) || !level.zones[ zone_name ].is_enabled ) - { - return 0; - } - return 1; + if ( !isdefined( level.zones ) || !isdefined( level.zones[zone_name] ) || !level.zones[zone_name].is_enabled ) + return false; + + return true; } -get_player_zone() //checked changed to match cerberus output +get_player_zone() { - player_zone = undefined; - keys = getarraykeys( level.zones ); - for ( i = 0; i < keys.size; i++ ) - { - if ( self entity_in_zone( keys[ i ] ) ) - { - player_zone = keys[ i ]; - break; - } - } - return player_zone; + 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 ) //checked changed to match cerberus output +get_zone_from_position( v_pos, ignore_enabled_check ) { - zone = undefined; - scr_org = spawn( "script_origin", v_pos ); - keys = getarraykeys(level.zones); - for ( i = 0; i < keys.size; i++ ) - { - if ( scr_org entity_in_zone( keys[ i ], ignore_enabled_check ) ) - { - zone = keys [i ]; - break; - } - } - scr_org delete(); - return zone; + 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 ) //checked matches cerberus output +get_zone_magic_boxes( zone_name ) { - if ( isDefined( zone_name ) && !zone_is_enabled( zone_name ) ) - { - return undefined; - } - zone = level.zones[ zone_name ]; - return zone.magic_boxes; + if ( isdefined( zone_name ) && !zone_is_enabled( zone_name ) ) + return undefined; + + zone = level.zones[zone_name]; +/# + assert( isdefined( zone_name ) ); +#/ + return zone.magic_boxes; } -get_zone_zbarriers( zone_name ) //checked matches cerberus output +get_zone_zbarriers( zone_name ) { - if ( isDefined( zone_name ) && !zone_is_enabled( zone_name ) ) - { - return undefined; - } - zone = level.zones[ zone_name ]; - return zone.zbarriers; + if ( isdefined( zone_name ) && !zone_is_enabled( zone_name ) ) + return undefined; + + zone = level.zones[zone_name]; +/# + assert( isdefined( zone_name ) ); +#/ + return zone.zbarriers; } -get_players_in_zone( zone_name, return_players ) //checked changed to match cerberus output +get_players_in_zone( zone_name, return_players ) { - if ( !zone_is_enabled( zone_name ) ) - { - return 0; - } - zone = level.zones[zone_name]; - num_in_zone = 0; - players_in_zone = []; - players = get_players(); - for ( i = 0; i < zone.volumes.size; i++ ) - { - for ( j = 0; j < players.size; j++ ) - { - if ( players[ j ] istouching( zone.volumes[ i ] ) ) - { - num_in_zone++; - players_in_zone[ players_in_zone.size ] = players[ j ]; - } - } - } - if ( isdefined( return_players ) ) - { - return players_in_zone; - } - return num_in_zone; + 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 ) //checked changed to match cerberus output +player_in_zone( zone_name ) { - if ( !zone_is_enabled( zone_name ) ) - { - return 0; - } - zone = level.zones[ zone_name ]; - for ( i = 0; i < zone.volumes.size; i++ ) - { - players = get_players(); - for ( j = 0; j < players.size; j++ ) - { - if ( players[ j ] istouching( zone.volumes[ i ] ) && !players[ j ] .sessionstate == "spectator" ) - { - return 1; - } - } - } - return 0; + 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; } -entity_in_zone( zone_name, ignore_enabled_check ) //checked changed to match cerberus output +entity_in_zone( zone_name, ignore_enabled_check ) { - if ( !zone_is_enabled( zone_name ) && !is_true( ignore_enabled_check ) ) - { - return 0; - } - zone = level.zones[ zone_name ]; - for ( i = 0; i < zone.volumes.size; i++ ) - { - if ( self istouching( zone.volumes[ i ] ) ) - { - return 1; - } - } - return 0; + 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; } -deactivate_initial_barrier_goals() //checked changed to match cerberus output +deactivate_initial_barrier_goals() { - special_goals = getstructarray( "exterior_goal", "targetname" ); - for ( i = 0; i < special_goals.size; i++ ) - { - if ( isdefined( special_goals[ i ].script_noteworthy ) ) - { - special_goals[ i ].is_active = 0; - special_goals[ i ] trigger_off(); - } - } + 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 ) //checked changed to match cerberus output +zone_init( zone_name ) { - - if ( isDefined( level.zones[ zone_name ] ) ) - { - return; - } - - level.zones[ zone_name ] = spawnstruct(); - zone = level.zones[ zone_name ]; - zone.is_enabled = 0; - zone.is_occupied = 0; - zone.is_active = 0; - zone.adjacent_zones = []; - zone.is_spawning_allowed = 0; - - spawn_points = maps/mp/gametypes_zm/_zm_gametype::get_player_spawns_for_gametype(); - for( i = 0; i < spawn_points.size; i++ ) - { - if ( spawn_points[ i ].script_noteworthy == zone_name ) - { - spawn_points[ i ].locked = 0; - } - } - - - zone.volumes = []; - volumes = getentarray( zone_name, "targetname" ); - i = 0; - for ( i = 0; i < volumes.size; i++ ) - { - if ( volumes[ i ].classname == "info_volume" ) - { - zone.volumes[ zone.volumes.size ] = volumes[ i ]; - } - } - if ( isdefined( zone.volumes[ 0 ].target ) ) - { - spots = getstructarray( zone.volumes[ 0 ].target, "targetname" ); - zone.spawn_locations = []; - zone.dog_locations = []; - zone.screecher_locations = []; - zone.avogadro_locations = []; - zone.inert_locations = []; - zone.quad_locations = []; - zone.leaper_locations = []; - zone.brutus_locations = []; - zone.mechz_locations = []; - zone.astro_locations = []; - zone.napalm_locations = []; - zone.zbarriers = []; - zone.magic_boxes = []; - barricades = getstructarray( "exterior_goal", "targetname" ); - box_locs = getstructarray( "treasure_chest_use", "targetname" ); - for (i = 0; i < spots.size; i++) - { - spots[ i ].zone_name = zone_name; - if ( !is_true( spots[ i ].is_blocked ) ) - { - spots[ i ].is_enabled = 1; - } - else - { - spots[ i ].is_enabled = 0; - } - tokens = strtok( spots[ i ].script_noteworthy, " " ); - foreach ( token in tokens ) - { - if ( token == "dog_location" ) - { - zone.dog_locations[ zone.dog_locations.size ] = spots[ i ]; - } - else if ( token == "screecher_location" ) - { - zone.screecher_locations[ zone.screecher_locations.size ] = spots[ i ]; - } - else if ( token == "avogadro_location" ) - { - zone.avogadro_locations[ zone.avogadro_locations.size ] = spots[ i] ; - } - else if ( token == "inert_location" ) - { - zone.inert_locations[ zone.inert_locations.size ] = spots[ i ]; - } - else if ( token == "quad_location" ) - { - zone.quad_locations[ zone.quad_locations.size ] = spots[ i ]; - } - else if ( token == "leaper_location" ) - { - zone.leaper_locations[ zone.leaper_locations.size ] = spots[ i ]; - } - else if ( token == "brutus_location" ) - { - zone.brutus_locations[ zone.brutus_locations.size ] = spots[ i ]; - } - else if ( token == "mechz_location" ) - { - zone.mechz_locations[ zone.mechz_locations.size ] = spots[ i ]; - } - else if ( token == "astro_location" ) - { - zone.astro_locations[ zone.astro_locations.size ] = spots[ i ]; - } - else if ( token == "napalm_location" ) - { - zone.napalm_locations[ zone.napalm_locations.size ] = spots[ i ]; - } - else - { - zone.spawn_locations[ zone.spawn_locations.size ] = spots[ i ]; - } - } - if ( isdefined( spots[ i ].script_string ) ) - { - barricade_id = spots[ i ].script_string; - for ( k = 0; k < barricades.size; k++ ) - { - if ( isdefined( barricades[ k ].script_string ) && barricades[ k ].script_string == barricade_id ) - { - nodes = getnodearray( barricades[ k ].target, "targetname" ); - for ( j = 0; j < nodes.size; j++ ) - { - if ( isdefined( nodes[ j ].type ) && nodes[ j ].type == "Begin" ) - { - spots[ i ].target = nodes[ j ].targetname; - } - } - } - } - } - } - for ( i = 0; i < barricades.size; i++ ) - { - targets = getentarray( barricades[ i ].target, "targetname" ); - for ( j = 0; j < targets.size; j++ ) - { - if ( targets[ j ] iszbarrier() && isdefined( targets[ j ].script_string ) && targets[ j ].script_string == zone_name ) - { - zone.zbarriers[ zone.zbarriers.size ] = targets[ j ]; - } - } - } - for ( i = 0; i < box_locs.size; i++ ) - { - chest_ent = getent( box_locs[ i ].script_noteworthy + "_zbarrier", "script_noteworthy" ); - if ( chest_ent entity_in_zone( zone_name, 1 ) ) - { - zone.magic_boxes[zone.magic_boxes.size] = box_locs[ i ]; - } - } - } + 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]; + } + } } -//unused code -/* -reinit_zone_spawners() //checked changed to match cerberus output +reinit_zone_spawners() { - 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 ]; - } - } - } - } - } -} -*/ + zkeys = getarraykeys( level.zones ); -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(); - } + 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]; + } + } + } + } } -make_zone_adjacent( main_zone_name, adj_zone_name, flag_name ) //checked matches cerberus output +enable_zone( zone_name ) { - main_zone = level.zones[ main_zone_name ]; - if ( !isDefined( main_zone.adjacent_zones[ adj_zone_name ] ) ) - { - main_zone.adjacent_zones[ adj_zone_name ] = spawnstruct(); - adj_zone = main_zone.adjacent_zones[ adj_zone_name ]; - adj_zone.is_connected = 0; - adj_zone.flags_do_or_check = 0; - if ( isarray( flag_name ) ) - { - adj_zone.flags = flag_name; - } - else - { - adj_zone.flags[ 0 ] = flag_name; - } - } - else - { - adj_zone = main_zone.adjacent_zones[ adj_zone_name ]; - size = adj_zone.flags.size; - adj_zone.flags_do_or_check = 1; - adj_zone.flags[ size ] = flag_name; - } +/# + 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(); + } } -add_zone_flags( wait_flag, add_flags ) //checked changed to match cerberus output +make_zone_adjacent( main_zone_name, adj_zone_name, 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; + 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; + } } -add_adjacent_zone( zone_name_a, zone_name_b, flag_name, one_way ) //checked matches cerberus output +add_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 ); - } + 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; } -setup_zone_flag_waits() //checked changed to match cerberus output +add_adjacent_zone( zone_name_a, zone_name_b, flag_name, one_way ) { - 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 ] ); - } + if ( !isdefined( one_way ) ) + one_way = 0; + + if ( !isdefined( level.flag[flag_name] ) ) + flag_init( flag_name ); + + zone_init( zone_name_a ); + zone_init( zone_name_b ); + make_zone_adjacent( zone_name_a, zone_name_b, flag_name ); + + if ( !one_way ) + make_zone_adjacent( zone_name_b, zone_name_a, flag_name ); +} + +setup_zone_flag_waits() +{ + flags = []; + zkeys = getarraykeys( level.zones ); + + for ( z = 0; z < level.zones.size; z++ ) + { + zone = level.zones[zkeys[z]]; + azkeys = getarraykeys( zone.adjacent_zones ); + + for ( az = 0; az < zone.adjacent_zones.size; az++ ) + { + azone = zone.adjacent_zones[azkeys[az]]; + + for ( f = 0; f < azone.flags.size; f++ ) + flags = add_to_array( flags, azone.flags[f], 0 ); + } + } + + for ( i = 0; i < flags.size; i++ ) + level thread zone_flag_wait( flags[i] ); } zone_flag_wait( flag_name ) { - if ( !isdefined( level.flag[ flag_name ] ) ) - { - flag_init( flag_name ); - } - flag_wait( flag_name ); - flags_set = 0; - for ( z = 0; z < level.zones.size; z++ ) - { - zkeys = getarraykeys( level.zones ); - zone = level.zones[ zkeys[ z ] ]; - for ( az = 0; az < zone.adjacent_zones.size; az++ ) - { - azkeys = getarraykeys( zone.adjacent_zones ); - azone = zone.adjacent_zones[ azkeys[ az ] ]; - if ( !azone.is_connected ) - { - if ( azone.flags_do_or_check ) - { - flags_set = 0; - for ( f = 0; f < azone.flags.size; f++ ) - { - if ( flag( azone.flags[ f ] ) ) - { - flags_set = 1; - break; - } - } - } - else - { - flags_set = 1; - for ( f = 0; f < azone.flags.size; f++ ) - { - if ( !flag(azone.flags[ f ] ) ) - { - flags_set = 0; - } - } - } - if ( flags_set ) - { - enable_zone( zkeys[ z ] ); //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; - } - } + if ( !isdefined( level.flag[flag_name] ) ) + flag_init( flag_name ); + + flag_wait( flag_name ); + flags_set = 0; + + for ( z = 0; z < level.zones.size; z++ ) + { + zkeys = getarraykeys( level.zones ); + zone = level.zones[zkeys[z]]; + + for ( az = 0; az < zone.adjacent_zones.size; az++ ) + { + azkeys = getarraykeys( zone.adjacent_zones ); + azone = zone.adjacent_zones[azkeys[az]]; + + if ( !azone.is_connected ) + { + if ( azone.flags_do_or_check ) + { + flags_set = 0; + + for ( f = 0; f < azone.flags.size; f++ ) + { + if ( flag( azone.flags[f] ) ) + { + flags_set = 1; + break; + } + } + } + else + { + flags_set = 1; + + for ( f = 0; f < azone.flags.size; f++ ) + { + if ( !flag( azone.flags[f] ) ) + flags_set = 0; + } + } + + if ( flags_set ) + { + enable_zone( zkeys[z] ); + azone.is_connected = 1; + + if ( !level.zones[azkeys[az]].is_enabled ) + enable_zone( azkeys[az] ); + + if ( flag( "door_can_close" ) ) + azone thread door_close_disconnect( flag_name ); + } + } + } + } + + keys = getarraykeys( level.zone_flags ); + + for ( i = 0; i < keys.size; i++ ) + { + if ( keys[i] == flag_name ) + { + check_flag = level.zone_flags[keys[i]]; + + for ( k = 0; k < check_flag.size; k++ ) + flag_set( check_flag[k] ); + + break; + } + } } -door_close_disconnect( flag_name ) //checked matches cerberus output +door_close_disconnect( flag_name ) { - while ( flag( flag_name ) ) - { - wait 1; - } - self.is_connected = 0; - level thread zone_flag_wait( flag_name ); + while ( flag( flag_name ) ) + wait 1.0; + + self.is_connected = 0; + level thread zone_flag_wait( flag_name ); } -connect_zones( zone_name_a, zone_name_b, one_way ) //checked matches cerberus output +connect_zones( zone_name_a, zone_name_b, one_way ) { - if ( !isDefined( one_way ) ) - { - one_way = 0; - } - zone_init( zone_name_a ); - zone_init( zone_name_b ); - enable_zone( zone_name_a ); - enable_zone( zone_name_b ); - if ( !isDefined( level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] ) ) - { - level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] = spawnstruct(); - level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].is_connected = 1; - } - if ( !one_way ) - { - if ( !isDefined( level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] ) ) - { - level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] = spawnstruct(); - level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].is_connected = 1; - } - } + 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 ) //checked changed to match cerberus output +manage_zones( initial_zone ) { +/# + 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(); - 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 ]](); - } + 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 ( 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; - } + 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; + } } -debug_show_spawn_locations() //checked dev call deleted +debug_show_spawn_locations() { +/# + 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 ); + } + } +#/ } -//unused code -/* -old_manage_zones( initial_zone ) //checked changed to match cerberus output +old_manage_zones( initial_zone ) { +/# + 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(); - 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; - } + 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; + } } -*/ -create_spawner_list( zkeys ) //checked changed to match cerberus output + +create_spawner_list( zkeys ) { - level.zombie_spawn_locations = []; - level.inert_locations = []; - level.enemy_dog_locations = []; - level.zombie_screecher_locations = []; - level.zombie_avogadro_locations = []; - level.quad_locations = []; - level.zombie_leaper_locations = []; - level.zombie_astro_locations = []; - level.zombie_brutus_locations = []; - level.zombie_mechz_locations = []; - level.zombie_napalm_locations = []; - for ( z = 0; z < zkeys.size; z++ ) - { - zone = level.zones[ zkeys[ z ] ]; - if ( zone.is_enabled && zone.is_active && zone.is_spawning_allowed ) - { - for ( i = 0; i < zone.spawn_locations.size; i++ ) - { - if(zone.spawn_locations[ i ].is_enabled) - { - level.zombie_spawn_locations[level.zombie_spawn_locations.size] = zone.spawn_locations[i]; - } - } - for(x = 0; x < zone.inert_locations.size; x++) - { - if(zone.inert_locations[x].is_enabled) - { - level.inert_locations[level.inert_locations.size] = zone.inert_locations[x]; - } - } - for(x = 0; x < zone.dog_locations.size; x++) - { - if(zone.dog_locations[x].is_enabled) - { - level.enemy_dog_locations[level.enemy_dog_locations.size] = zone.dog_locations[x]; - } - } - for(x = 0; x < zone.screecher_locations.size; x++) - { - if(zone.screecher_locations[x].is_enabled) - { - level.zombie_screecher_locations[level.zombie_screecher_locations.size] = zone.screecher_locations[x]; - } - } - for(x = 0; x < zone.avogadro_locations.size; x++) - { - if(zone.avogadro_locations[x].is_enabled) - { - level.zombie_avogadro_locations[level.zombie_avogadro_locations.size] = zone.avogadro_locations[x]; - } - } - for(x = 0; x < zone.quad_locations.size; x++) - { - if(zone.quad_locations[x].is_enabled) - { - level.quad_locations[level.quad_locations.size] = zone.quad_locations[x]; - } - } - for(x = 0; x < zone.leaper_locations.size; x++) - { - if(zone.leaper_locations[x].is_enabled) - { - level.zombie_leaper_locations[level.zombie_leaper_locations.size] = zone.leaper_locations[x]; - } - } - for(x = 0; x < zone.astro_locations.size; x++) - { - if(zone.astro_locations[x].is_enabled) - { - level.zombie_astro_locations[level.zombie_astro_locations.size] = zone.astro_locations[x]; - } - } - for(x = 0; x < zone.napalm_locations.size; x++) - { - if(zone.napalm_locations[x].is_enabled) - { - level.zombie_napalm_locations[level.zombie_napalm_locations.size] = zone.napalm_locations[x]; - } - } - for(x = 0; x < zone.brutus_locations.size; x++) - { - if(zone.brutus_locations[x].is_enabled) - { - level.zombie_brutus_locations[level.zombie_brutus_locations.size] = zone.brutus_locations[x]; - } - } - for(x = 0; x < zone.mechz_locations.size; x++) - { - if(zone.mechz_locations[x].is_enabled) - { - level.zombie_mechz_locations[level.zombie_mechz_locations.size] = zone.mechz_locations[x]; - } - } - } - } + 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() //checked changed to match cerberus output +get_active_zone_names() { - ret_list = []; - if ( !isDefined( level.zone_keys ) ) - { - return ret_list; - } - while ( level.zone_scanning_active ) - { - wait 0.05; - } - for ( i = 0; i < level.zone_keys.size; i++ ) - { - if ( level.zones[ level.zone_keys[ i ] ].is_active ) - { - ret_list[ ret_list.size ] = level.zone_keys[ i ]; - } - } - return ret_list; + 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; } -//commented out -/* -_init_debug_zones() //checked changed to match cerberus output +_init_debug_zones() { - 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); - } + 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 ); + } } -_destroy_debug_zones() //checked changed to match cerberus output +_destroy_debug_zones() { - 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() //checked changed to match cerberus output +_debug_zones() { - 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); - } -} -*/ + enabled = 0; -is_player_in_zone( zone_name ) //checked changed to match cerberus output -{ - zone = level.zones[ zone_name ]; - for ( i = 0; i < zone.volumes.size; i++ ) - { - if ( self istouching( level.zones[zone_name].volumes[ i ] ) && !self.sessionstate == "spectator" ) - { - return 1; - } - } - return 0; + 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; + } +} + +is_player_in_zone( zone_name ) +{ + 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; }