#include maps\mp\zombies\_zm_ai_screecher; #include common_scripts\utility; #include maps\mp\_utility; #include maps\mp\zombies\_zm_utility; #include maps\mp\_visionset_mgr; #include maps\mp\animscripts\zm_shared; #include maps\mp\zombies\_zm_spawner; #include maps\mp\gametypes_zm\_hud_util; #include maps\mp\zombies\_zm_laststand; #include maps\mp\zombies\_zm_audio; #include maps\mp\zombies\_zm_stats; screecher_spawning_logic() { level endon( "intermission" ); if ( level.intermission ) return; if ( level.screecher_spawners.size < 1 ) { return; } while ( true ) { while ( !isdefined( level.zombie_screecher_locations ) || level.zombie_screecher_locations.size <= 0 ) wait 0.1; // while ( getdvarint( _hash_B0C0D38F ) ) // wait 0.1; if ( !flag( "spawn_zombies" ) ) flag_wait( "spawn_zombies" ); valid_players_in_screecher_zone = 0; valid_players = []; while ( valid_players_in_screecher_zone <= level.zombie_screecher_count ) { players = getplayers(); valid_players_in_screecher_zone = 0; for ( p = 0; p < players.size; p++ ) { if ( is_player_valid( players[p] ) && player_in_screecher_zone( players[p] ) && !isdefined( players[p].screecher ) ) { valid_players_in_screecher_zone++; valid_players[valid_players.size] = players[p]; } } wait 0.1; } if ( !isdefined( level.zombie_screecher_locations ) || level.zombie_screecher_locations.size <= 0 ) continue; valid_players = array_randomize( valid_players ); spawn_points = get_array_of_closest( valid_players[0].origin, level.zombie_screecher_locations ); spawn_point = undefined; if ( !isdefined( spawn_points ) || spawn_points.size == 0 ) { wait 0.1; continue; } if ( !isdefined( level.last_spawn ) ) { level.last_spawn_index = 0; level.last_spawn = []; level.last_spawn[level.last_spawn_index] = spawn_points[0]; level.last_spawn_index = 1; spawn_point = spawn_points[0]; } else { foreach ( point in spawn_points ) { if ( point == level.last_spawn[0] ) continue; if ( isdefined( level.last_spawn[1] ) && point == level.last_spawn[1] ) continue; spawn_point = point; level.last_spawn[level.last_spawn_index] = spawn_point; level.last_spawn_index++; if ( level.last_spawn_index > 1 ) level.last_spawn_index = 0; break; } } if ( !isdefined( spawn_point ) ) spawn_point = spawn_points[0]; if ( isdefined( level.screecher_spawners ) ) { spawner = random( level.screecher_spawners ); ai = spawn_zombie( spawner, spawner.targetname, spawn_point ); } if ( isdefined( ai ) ) { ai.spawn_point = spawn_point; level.zombie_screecher_count++; } wait 5; } } screecher_melee_damage( player ) { melee_score = 0; if ( player hasweapon( "tazer_knuckles_zm" ) ) { melee_score = 30; } else if ( player hasweapon( "bowie_knife_zm" ) ) { melee_score = 15; } else { melee_score = 10; } if ( self.screecher_score > 0 ) { if ( melee_score > self.screecher_score ) { self.screecher_score = 0; } else { self.screecher_score -= melee_score; } } if ( self.screecher_score <= 0 ) { self.player_score += melee_score; } self playsound( "zmb_vocals_screecher_pain" ); if ( level.zombie_vars[player.team]["zombie_insta_kill"] ) self.player_score = 30; else player thread do_player_general_vox( "general", "screecher_cut" ); self screecher_check_score(); } screecher_detach( player ) { self endon( "death" ); self.state = "detached"; if ( !isdefined( self.linked_ent ) ) return; if ( isdefined( player ) ) { player clientnotify( "scrEnd" ); player allowprone( 1 ); player takeweapon( "screecher_arms_zm" ); // if ( !getdvarint( _hash_E7EF8EB7 ) ) player stoppoisoning(); if ( !player maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( isdefined( player.intermission ) && player.intermission ) ) player decrement_is_drinking(); if ( isdefined( player.screecher_weapon ) && player.screecher_weapon != "none" && is_player_valid( player ) && !is_equipment_that_blocks_purchase( player.screecher_weapon ) ) player switchtoweapon( player.screecher_weapon ); else if ( !player maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { primaryweapons = player getweaponslistprimaries(); if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) player switchtoweapon( primaryweapons[0] ); } player.screecher_weapon = undefined; } self unlink(); self setclientfield( "render_third_person", 0 ); if ( isdefined( self.linked_ent ) ) { self.linked_ent.screecher = undefined; self.linked_ent setmovespeedscale( 1 ); self.linked_ent = undefined; } self.green_light = player.green_light; self animcustom( ::screecher_jump_down ); self waittill( "jump_down_done" ); maps\mp\_visionset_mgr::vsmgr_deactivate( "overlay", "zm_ai_screecher_blur", player ); self animmode( "normal" ); self.ignoreall = 1; self setplayercollision( 1 ); if ( isdefined( level.screecher_should_burrow ) ) { if ( self [[ level.screecher_should_burrow ]]() ) { return; } } self thread screecher_runaway(); } screecher_cleanup() { self waittill( "death", attacker ); if ( isdefined( attacker ) && isplayer( attacker ) ) { if ( isdefined( self.damagelocation ) && isdefined( self.damagemod ) ) level thread maps\mp\zombies\_zm_audio::player_zombie_kill_vox( self.damagelocation, attacker, self.damagemod, self ); } if ( isdefined( self.loopsoundent ) ) { self.loopsoundent delete(); self.loopsoundent = undefined; } player = self.linked_ent; if ( isdefined( player ) ) { player playsound( "zmb_vocals_screecher_death" ); player setmovespeedscale( 1 ); maps\mp\_visionset_mgr::vsmgr_deactivate( "overlay", "zm_ai_screecher_blur", player ); if ( isdefined( player.screecher_weapon ) ) { player clientnotify( "scrEnd" ); player allowprone( 1 ); player takeweapon( "screecher_arms_zm" ); // if ( !getdvarint( _hash_E7EF8EB7 ) ) player stoppoisoning(); if ( !player maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !( isdefined( player.intermission ) && player.intermission ) ) player decrement_is_drinking(); if ( player.screecher_weapon != "none" && is_player_valid( player ) ) player switchtoweapon( player.screecher_weapon ); else { primaryweapons = player getweaponslistprimaries(); if ( isdefined( primaryweapons ) && primaryweapons.size > 0 ) player switchtoweapon( primaryweapons[0] ); } player.screecher_weapon = undefined; } } if ( isdefined( self.claw_fx ) ) self.claw_fx destroy(); if ( isdefined( self.anchor ) ) self.anchor delete(); if ( isdefined( level.screecher_cleanup ) ) self [[ level.screecher_cleanup ]](); if ( level.zombie_screecher_count > 0 ) { level.zombie_screecher_count--; } }