I have a problem with my spawns... They die after a couple of seconds after you spawn.
But if I put on the map a normal zombie (window) zombies do not die. And if I put only zombies risers it is when they die within a few seconds.
The problem is I do not want to put zombies window on the map... there is a way to solve this.
#include maps\_utility; #include common_scripts\utility; #include maps\_zombiemode_utility; #include animscripts\Utility; #using_animtree( "generic_human" ); init() { level.quad_in_round = false; level.quad_count = 0; level.quad_limit = 0; // level.quad_max = 15; init_quad_zombie_anims(); thread maps\_zombiemode_ai_quad::main(); } main() { flag_wait("all_players_connected"); level thread wait_for_spawn(); level thread spawn_quad(); } wait_for_spawn() { flag_wait( "electricity_on" ); // level.quad_max = level.zombie_total / 5; thread round_reset(); while( 1 ) { if( flag("dog_round" ) ) { level.quad_active_on = undefined; wait(7); while( level.dog_intermission ) { wait(0.5); } level.quad_active_on = undefined; } else level.quad_active_on = true; wait(0.5); } } round_reset() { while(1) { level waittill("between_round_over"); // level.quad_max = level.zombie_total / 5; level.quad_count = 0; level.quad_limit = 0; wait(0.5); } } spawn_quad() { quad_points = GetEntArray( "quad_spawn", "targetname" ); chosen_spot = undefined; if( !IsDefined( quad_points ) || quad_points.size == 0 ) return; while( 1 ) { if( isDefined( level.quad_active_on ) && level.quad_active_on == true ) { num_zombies = getaiarray( "axis" ); if( level.quad_count < level.quad_max && level.quad_in_round && num_zombies > 10 ) { wait( level.zombie_vars["zombie_spawn_delay"] ); quad_points = array_randomize( quad_points ); for( i = 0; i < quad_points.size; i++ ) { _quad = spawn( "script_model", quad_points[i].origin ); _quad SetModel( "tag_origin" ); _quad linkTo( quad_points[i] ); _quad.angles = quad_points[i].angles; _quad.origin = quad_points[i].origin; if( zone_active( _quad ) ) { chosen_spot = quad_points[i]; break; } wait 0.01; _quad delete(); } level.quad_count++; level.quad_limit++; iPrintLnBold("Quad Spawn " + level.quad_count + " -- Limite " + level.quad_limit ); quad = spawn_zombie( chosen_spot ); quad thread maps\_zombiemode::round_spawn_failsafe(); quad thread quad_prespawn(); while( quad_limit( level.quad_limit ) ) { wait(0.5); } } } wait(0.5); } } quad_limit( limit ) { players = get_players(); if( ( players.size == 1 || players.size == 2 ) && limit == 5 ) return true; else if( ( players.size == 3 || players.size == 4 ) && limit == 10 ) return true; return false; } zone_active( np ) { quad = Getentarray( "player_zone", "script_noteworthy" ); zone = undefined; poi = false; for( i=0; i < quad.size; i++ ) { if( np istouching( quad[i]) ) { zone = quad[i].targetname; if( level.zones[ quad[i].targetname ].is_enabled ) { poi = true; } } } return poi; } wait_for_leap() { while ( 1 ) { wait( 5 ); self.custom_attack = true; wait( .5 ); self.custom_attack = false; } } quad_prespawn() { PlayFx(level._effect["quad_explo_gas"], self getTagOrigin("J_MainRoot")); self.animname = "quad_zombie"; self.custom_idle_setup = maps\_zombiemode_ai_quad::quad_zombie_idle_setup; self.a.idleAnimOverrideArray = []; self.a.idleAnimOverrideArray["stand"] = []; self.a.idleAnimOverrideArray["stand"] = []; self.a.idleAnimOverrideArray["stand"][0][0] = %ai_zombie_quad_idle; self.a.idleAnimOverrideWeights["stand"][0][0] = 10; self.a.idleAnimOverrideArray["stand"][0][1] = %ai_zombie_quad_idle_2; self.a.idleAnimOverrideWeights["stand"][0][1] = 10; self.no_eye_glow = true; self maps\_zombiemode_spawner::zombie_spawn_init( true ); self thread maps\_zombiemode_spawner::find_flesh(); self maps\_zombiemode_spawner::zombie_setup_attack_properties(); self.maxhealth = int( self.maxhealth * 0.75 ); self.health = self.maxhealth; self.meleeDamage = 45; sound_spawn = "quad_spawn_0" + randomint(4); self playsound( sound_spawn ); //C. Ayers: This is the TEMP version of the Quad Gas Explosion Mechanic self.death_explo_radius_zomb = 100; //Radius around the Quad the explosion will affect Zombies self.death_explo_radius_plr = 100; //Radius around the Quad the explosion will affect Players self.death_explo_damage_zomb = 1.05; //Damage done to Zombies with explosion, percentage of maxhealth self.death_gas_radius = 125; //Radius around the Quad the gas will affect Players and Zombies self.death_gas_time = 7; //Length of time Gas Cloud lasts on a specific quad if ( isdefined( level.quad_explode ) && level.quad_explode == true ) { self.deathanimscript = ::quad_post_death; self.actor_killed_override = ::quad_killed_override; } self set_default_attack_properties(); self.pre_teleport_func = ::quad_pre_teleport; self.post_teleport_func = ::quad_post_teleport; self.can_explode = false; self.exploded = false; self.damagemod_wonder = false; self thread quad_trail(); self thread quad_vox(); self thread quad_close(); self thread quad_post_death_NEW(); self thread maps\_zombiemode_ai_quad::quad_zombie_think(); if ( isdefined( level.quad_traverse_death_fx ) ) { self thread [[ level.quad_traverse_death_fx ]](); } if ( isdefined( level.quad_prespawn ) ) { self thread [[ level.quad_prespawn ]](); } } quad_zombie_idle_setup() { self.a.array["turn_left_45"] = %exposed_tracking_turn45L; self.a.array["turn_left_90"] = %exposed_tracking_turn90L; self.a.array["turn_left_135"] = %exposed_tracking_turn135L; self.a.array["turn_left_180"] = %exposed_tracking_turn180L; self.a.array["turn_right_45"] = %exposed_tracking_turn45R; self.a.array["turn_right_90"] = %exposed_tracking_turn90R; self.a.array["turn_right_135"] = %exposed_tracking_turn135R; self.a.array["turn_right_180"] = %exposed_tracking_turn180L; self.a.array["exposed_idle"] = array( %ai_zombie_quad_idle, %ai_zombie_quad_idle_2 ); self.a.array["straight_level"] = %ai_zombie_quad_idle; self.a.array["stand_2_crouch"] = %ai_zombie_shot_leg_right_2_crawl; } init_quad_zombie_anims() { // deaths level.scr_anim["quad_zombie"]["death1"] = %ai_zombie_quad_death; level.scr_anim["quad_zombie"]["death2"] = %ai_zombie_quad_death_2; level.scr_anim["quad_zombie"]["death3"] = %ai_zombie_quad_death_3; level.scr_anim["quad_zombie"]["death4"] = %ai_zombie_quad_death_4; // run cycles level.scr_anim["quad_zombie"]["walk1"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["walk2"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["walk3"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["walk4"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["walk5"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["walk6"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["walk7"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["walk8"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["run1"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["run2"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["run3"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["run4"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["run5"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["run6"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["sprint1"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["sprint2"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["sprint3"] = %ai_zombie_quad_supersprint; level.scr_anim["quad_zombie"]["sprint4"] = %ai_zombie_quad_supersprint; // run cycles in prone level.scr_anim["quad_zombie"]["crawl1"] = %ai_zombie_quad_crawl_1; level.scr_anim["quad_zombie"]["crawl2"] = %ai_zombie_quad_crawl_1; level.scr_anim["quad_zombie"]["crawl3"] = %ai_zombie_quad_crawl_2; level.scr_anim["quad_zombie"]["crawl4"] = %ai_zombie_quad_crawl_2; level.scr_anim["quad_zombie"]["crawl5"] = %ai_zombie_quad_crawl_3; level.scr_anim["quad_zombie"]["crawl6"] = %ai_zombie_quad_crawl_3; level.scr_anim["quad_zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; level.scr_anim["quad_zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; level.scr_anim["quad_zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint; level.scr_anim["quad_zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1; level.scr_anim["quad_zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2; if( !isDefined( level._zombie_melee ) ) { level._zombie_melee = []; } if( !isDefined( level._zombie_walk_melee ) ) { level._zombie_walk_melee = []; } if( !isDefined( level._zombie_run_melee ) ) { level._zombie_run_melee = []; } level._zombie_melee["quad_zombie"] = []; level._zombie_walk_melee["quad_zombie"] = []; level._zombie_run_melee["quad_zombie"] = []; level._zombie_melee["quad_zombie"][0] = %ai_zombie_leaper_attack_v1; level._zombie_melee["quad_zombie"][1] = %ai_zombie_leaper_attack_v2; level._zombie_melee["quad_zombie"][2] = %ai_zombie_leaper_attack_v1; level._zombie_melee["quad_zombie"][3] = %ai_zombie_leaper_attack_v2; level._zombie_melee["quad_zombie"][4] = %ai_zombie_leaper_attack_v1; level._zombie_melee["quad_zombie"][5] = %ai_zombie_leaper_attack_v2; level._zombie_melee["quad_zombie"][6] = %ai_zombie_leaper_attack_v1; level._zombie_melee["quad_zombie"][7] = %ai_zombie_leaper_attack_v2; level._zombie_melee["quad_zombie"][8] = %ai_zombie_leaper_attack_v1; level._zombie_melee["quad_zombie"][9] = %ai_zombie_leaper_attack_v2; level._zombie_melee["quad_zombie"][10] = %ai_zombie_leaper_attack_v1; level._zombie_melee["quad_zombie"][11] = %ai_zombie_leaper_attack_v2; /* level._zombie_run_melee["quad_zombie"][0] = %ai_zombie_quad_attack; level._zombie_run_melee["quad_zombie"][1] = %ai_zombie_quad_attack; level._zombie_run_melee["quad_zombie"][2] = %ai_zombie_quad_attack; level._zombie_walk_melee["quad_zombie"][0] = %ai_zombie_quad_attack; level._zombie_walk_melee["quad_zombie"][1] = %ai_zombie_quad_attack; level._zombie_walk_melee["quad_zombie"][2] = %ai_zombie_quad_attack; level._zombie_walk_melee["quad_zombie"][3] = %ai_zombie_quad_attack; */ if( isDefined( level.quad_zombie_anim_override ) ) { [[ level.quad_zombie_anim_override ]](); } // melee in crawl if( !isDefined( level._zombie_melee_crawl ) ) { level._zombie_melee_crawl = []; } level._zombie_melee_crawl["quad_zombie"] = []; level._zombie_melee_crawl["quad_zombie"][0] = %ai_zombie_attack_crawl; level._zombie_melee_crawl["quad_zombie"][1] = %ai_zombie_attack_crawl_lunge; if( !isDefined( level._zombie_stumpy_melee ) ) { level._zombie_stumpy_melee = []; } level._zombie_stumpy_melee["quad_zombie"] = []; level._zombie_stumpy_melee["quad_zombie"][0] = %ai_zombie_walk_on_hands_shot_a; level._zombie_stumpy_melee["quad_zombie"][1] = %ai_zombie_walk_on_hands_shot_b; // tesla deaths if( !isDefined( level._zombie_tesla_death ) ) { level._zombie_tesla_death = []; } level._zombie_tesla_death["quad_zombie"] = []; level._zombie_tesla_death["quad_zombie"][0] = %ai_zombie_quad_death_tesla; level._zombie_tesla_death["quad_zombie"][1] = %ai_zombie_quad_death_tesla_2; level._zombie_tesla_death["quad_zombie"][2] = %ai_zombie_quad_death_tesla_3; level._zombie_tesla_death["quad_zombie"][3] = %ai_zombie_quad_death_tesla_4; if( !isDefined( level._zombie_tesla_crawl_death ) ) { level._zombie_tesla_crawl_death = []; } level._zombie_tesla_crawl_death["quad_zombie"] = []; level._zombie_tesla_crawl_death["quad_zombie"][0] = %ai_zombie_tesla_crawl_death_a; level._zombie_tesla_crawl_death["quad_zombie"][1] = %ai_zombie_tesla_crawl_death_b; // deaths if( !isDefined( level._zombie_deaths ) ) { level._zombie_deaths = []; } level._zombie_deaths["quad_zombie"] = []; level._zombie_deaths["quad_zombie"][0] = %ai_zombie_quad_death; level._zombie_deaths["quad_zombie"][1] = %ai_zombie_quad_death_2; level._zombie_deaths["quad_zombie"][2] = %ai_zombie_quad_death_3; level._zombie_deaths["quad_zombie"][3] = %ai_zombie_quad_death_4; level._zombie_deaths["quad_zombie"][4] = %ai_zombie_quad_death_5; level._zombie_deaths["quad_zombie"][5] = %ai_zombie_quad_death_6; /* ground crawl */ if( !isDefined( level._zombie_rise_anims ) ) { level._zombie_rise_anims = []; } // set up the arrays level._zombie_rise_anims["quad_zombie"] = []; level._zombie_rise_anims["quad_zombie"][1]["walk"][0] = %ai_zombie_quad_traverse_ground_crawlfast; level._zombie_rise_anims["quad_zombie"][1]["run"][0] = %ai_zombie_quad_traverse_ground_crawlfast; level._zombie_rise_anims["quad_zombie"][1]["sprint"][0] = %ai_zombie_quad_traverse_ground_crawlfast; level._zombie_rise_anims["quad_zombie"][2]["walk"][0] = %ai_zombie_quad_traverse_ground_crawlfast; // ground crawl death if( !isDefined( level._zombie_rise_death_anims ) ) { level._zombie_rise_death_anims = []; } level._zombie_rise_death_anims["quad_zombie"] = []; level._zombie_rise_death_anims["quad_zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside; level._zombie_rise_death_anims["quad_zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt; level._zombie_rise_death_anims["quad_zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside; level._zombie_rise_death_anims["quad_zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt; level._zombie_rise_death_anims["quad_zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low; level._zombie_rise_death_anims["quad_zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt; level._zombie_rise_death_anims["quad_zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high; level._zombie_rise_death_anims["quad_zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt; //taunts if( !isDefined( level._zombie_run_taunt ) ) { level._zombie_run_taunt = []; } if( !isDefined( level._zombie_board_taunt ) ) { level._zombie_board_taunt = []; } level._zombie_run_taunt["quad_zombie"] = []; level._zombie_board_taunt["quad_zombie"] = []; level._zombie_board_taunt["quad_zombie"][0] = %ai_zombie_quad_taunt; level._zombie_board_taunt["quad_zombie"][1] = %ai_zombie_quad_taunt_2; level._zombie_board_taunt["quad_zombie"][2] = %ai_zombie_quad_taunt_3; level._zombie_board_taunt["quad_zombie"][3] = %ai_zombie_quad_taunt_4; level._zombie_board_taunt["quad_zombie"][4] = %ai_zombie_quad_taunt_5; level._zombie_board_taunt["quad_zombie"][5] = %ai_zombie_quad_taunt_6; level._effect[ "quad_trail" ] = LoadFX( "quad/fx_zombie_quad_trail_waw" ); level._effect[ "quad_explo_gas" ] = LoadFX( "quad/fx_zombie_quad_gas_nova6_waw" ); } quad_vox() { self endon( "death" ); wait( 5 ); quad_wait = 5; while(1) { players = getplayers(); for(i=0;i<players.size;i++) { if(DistanceSquared(self.origin, players[i].origin) > 1200 * 1200) { sound_amb = "quad_ambient_0" + randomint(12); self playsound( sound_amb ); quad_wait = 7; } else if(DistanceSquared(self.origin, players[i].origin) > 200 * 200) { sound_attack = "quad_attack_0" + randomint(10); self playsound( sound_attack ); quad_wait = 5; } else if(DistanceSquared(self.origin, players[i].origin) < 150 * 150) { wait(.05); } } wait randomfloatrange( 1, quad_wait ); } } quad_close() { self endon( "death" ); while(1) { players = getplayers(); for(i=0;i<players.size;i++) { if ( is_player_valid( players[i], true ) ) { if(DistanceSquared(self.origin, players[i].origin) < 150 * 150) { sound_amb = "quad_ambient_0" + randomint(12); self playsound( sound_amb ); wait randomfloatrange( 1, 2 ); } } } wait_network_frame(); } } set_leap_attack_properties() { self.pathEnemyFightDist = 320; // self.meleeAttackDist = 350; self.goalradius = 320; self.maxsightdistsqrd = 256 * 256; self.can_leap = true; } set_default_attack_properties() { self.pathEnemyFightDist = 64; self.meleeAttackDist = 64; self.goalradius = 16; self.maxsightdistsqrd = 128 * 128; self.can_leap = false; } check_wait() { min_dist = 96; max_dist = 144; height_tolerance = 32; if ( isdefined( self.enemy ) ) { delta = self.enemy.origin - self.origin; dist = length( delta ); z_check = true; z_diff = abs( self.enemy.origin[2] - self.origin[2] ); if ( z_diff > height_tolerance ) { z_check = false; } if ( dist > min_dist && dist < max_dist && self.nextSpecial < GetTime() && z_check ) // ideal range for leap attack { cansee = SightTracePassed( self.origin, self.enemy.origin, false, undefined ); if( cansee ) self set_leap_attack_properties(); else self set_default_attack_properties(); } else { self set_default_attack_properties(); } } } quad_zombie_think() { self endon( "death" ); // /# // self animscripts\debug::debugPushState( "quad_zombie_think" ); // #/ self.specialAttack = maps\_zombiemode_ai_quad::TryLeap; self.state = "waiting"; self.isAttacking = false; self.nextSpecial = GetTime(); for (;;) { switch ( self.state ) { case "waiting": check_wait(); break; case "leaping": break; } wait_network_frame(); } // /# // self animscripts\debug::debugPopState(); // #/ } trackCollision() { self endon( "death" ); self endon( "stop_coll" ); while ( 1 ) { check = self GetHitEntType(); if ( check != "none" ) { /# self animscripts\debug::debugPushState( check ); #/ self thread quad_stop_leap(); self notify( "stop_leap" ); self notify( "stop_coll" ); } wait_network_frame(); } } quad_finish_leap() { self endon( "death" ); /# self animscripts\debug::debugPushState( "quad_finish_leap" ); #/ self.state = "waiting"; self.isAttacking = false; self.nextSpecial = GetTime() + 3000; self animMode("none"); self.syncedMeleeTarget = undefined; self OrientMode("face enemy"); self thread animscripts\combat::main(); /# self animscripts\debug::debugPopState(); #/ } quad_stop_leap() { self endon( "death" ); self SetFlaggedAnimKnobAllRestart("attack",%ai_zombie_quad_attack_leap_loop_out, %body, 1, .1, 1); self animscripts\shared::DoNoteTracks( "attack" ); self quad_finish_leap(); } quad_leap_attack() { self endon( "death" ); self endon( "stop_leap" ); /# self animscripts\debug::debugPushState( "quad_leap_attack" ); #/ self.state = "leaping"; self.isAttacking = true; // self ClearAnim(%stand_and_crouch, 0.1); if( IsDefined( self.enemy ) ) { self.syncedMeleeTarget = self.enemy; angles = VectorToAngles( self.enemy.origin - self.origin ); self OrientMode( "face angle", angles[1] ); } // restore attack properties to prevent code trying to control animmode self set_default_attack_properties(); self.goalradius = 4; self animMode("nogravity"); leap_in = %ai_zombie_quad_attack_leap_loop_in; delta = GetMoveDelta( leap_in, 0, 1 ); self SetFlaggedAnimKnobAllRestart("attack",%ai_zombie_quad_attack_leap_loop_in, %body, 1, .1, 1); // animscripts\traverse\shared::wait_anim_length(leap_in, .02); wait( getanimlength(leap_in) ); // self animscripts\shared::DoNoteTracks( "attack" ); use_loop = false; if ( use_loop ) { leap_loop = %ai_zombie_quad_attack_leap_loop; self thread trackCollision(); self SetFlaggedAnimKnobAllRestart("attack",leap_loop, %body, 1, .1, 1); delta = GetMoveDelta( leap_loop, 0, 1 ); anim_dist = length( delta ); anim_time = getanimlength( leap_loop ); rate = anim_dist / getanimlength( leap_loop ); goal_dist = length( self.enemy.origin - self.origin ); goal_dist -= 16; // give some room for player radius //time = goal_dist / rate; //if ( time > 0 ) //{ // self animscripts\shared::DoNoteTracksForTime( time, "attack" ); //} // animscripts\traverse\shared::wait_anim_length(leap_loop, .02); wait( getanimlength(leap_loop) ); // self animscripts\shared::DoNoteTracksForTime( anim_time, "attack" ); } self notify( "stop_coll" ); leap_out = %ai_zombie_quad_attack_leap_attack; if ( isdefined(self.enemy) ) { delta = self.enemy.origin - self.origin; deltaF = ( delta[0], delta[1], 0 ); attack_dist = length( deltaF ); /# self animscripts\debug::debugPushState( "attack dist = " + attack_dist ); #/ if ( attack_dist <= 64 ) { leap_out = %ai_zombie_quad_attack_leap_attack; } } delta = GetMoveDelta( leap_out, 0, 1 ); self SetFlaggedAnimKnobAllRestart("attack",leap_out, %body, 1, .1, 1); while ( 1 ) { self waittill("attack", note); if ( note == "end" ) { break; } else if ( note == "fire" ) { if ( !IsDefined( self.enemy ) ) { break; } oldhealth = self.enemy.health; self melee(); } else if ( note == "gravity on" ) { self animMode("none"); } } /# self animscripts\debug::debugPopState(); #/ quad_finish_leap(); /# self animscripts\debug::debugPopState(); #/ } TryLeap() { // prevent other combat until leap is done if ( self.state == "leaping" ) { return true; } if ( !IsDefined( self.enemy ) ) { return false; } // early out if ( DistanceSquared( self.origin, self.enemy.origin ) > 512*512 ) { // animscripts\melee::debug_melee( "Not doing melee - Distance to enemy is more than 512 units." ); return false; } if ( self.a.pose == "prone" ) { return false; } if ( !self.can_leap ) { return false; } self thread maps\_zombiemode_ai_quad::quad_leap_attack(); self notify( "special_attack" ); return true; } quad_gas_explo_death() { death_vars = []; death_vars["explo_radius_zomb"] = self.death_explo_radius_zomb; death_vars["explo_radius_plr"] = self.death_explo_radius_plr; death_vars["explo_damage_zomb"] = self.death_explo_damage_zomb; death_vars["gas_radius"] = self.death_gas_radius; death_vars["gas_time"] = self.death_gas_time; self thread quad_death_explo( self.origin, death_vars ); level thread quad_gas_area_of_effect( self.origin, death_vars ); self Delete(); } quad_death_explo( origin, death_vars ) { sound_explo = "explo_0" + randomint(4); playsoundatposition( sound_explo, origin ); PlayFx( level._effect["dog_gib"], origin ); players = get_players(); zombies = GetAIArray( "axis" ); for(i = 0; i < players.size; i++) { if( Distance( origin, players[i].origin ) <= death_vars["explo_radius_plr"] ) { players[i] ShellShock( "explosion", 2.5 ); } } self.exploded = true; self RadiusDamage( origin, death_vars["explo_radius_zomb"], 30, 20, self, "MOD_EXPLOSIVE" ); } quad_gas_area_of_effect( origin, death_vars ) { effectArea = spawn( "trigger_radius", origin, 0, death_vars["gas_radius"], 100 ); PlayFX( level._effect[ "quad_explo_gas" ], origin ); gas_time = 0; while( gas_time <= death_vars["gas_time"] ) { players = get_players(); for(i = 0; i < players.size; i++) { if( players[i] IsTouching( effectArea )) { players[i] setblur( 4, .1 ); } else { players[i] setblur( 0, .5 ); } } wait(1); gas_time = gas_time + 1; } players = get_players(); for ( i = 0; i < players.size; i++ ) { players[i] setblur( 0, .5 ); } effectArea Delete(); } quad_trail() { self endon( "death" ); // self waittill( "quad_end_traverse_anim" ); //Add in the smoke effect from the dogs self.fx_quad_trail = Spawn( "script_model", self GetTagOrigin( "tag_origin" ) ); self.fx_quad_trail.angles = self GetTagAngles( "tag_origin" ); self.fx_quad_trail SetModel( "tag_origin" ); self.fx_quad_trail LinkTo( self, "tag_origin" ); maps\_zombiemode_net::network_safe_play_fx_on_tag( "quad_fx", 2, level._effect[ "quad_trail" ], self.fx_quad_trail, "tag_origin" ); } quad_post_death_NEW() { self waittill( "death" ); level.quad_limit--; if( self.damagemod != "MOD_MELEE" && !self.damagemod_wonder ) { wait( getanimlength( self.deathanim ) ); self.can_explode = true; } self thread quad_post_death(); } quad_post_death() { if ( isdefined( self.fx_quad_trail ) ) { self.fx_quad_trail unlink(); self.fx_quad_trail delete(); } if ( self.can_explode ) { self thread quad_gas_explo_death(); } } quad_killed_override( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime ) { if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" ) { self.can_explode = true; } else { self.can_explode = false; if ( isdefined( self.fx_quad_trail ) ) { self.fx_quad_trail unlink(); self.fx_quad_trail delete(); } } if(isDefined(level._override_quad_explosion)) { [[level._override_quad_explosion]](self); } } quad_pre_teleport() { if ( isDefined( self.fx_quad_trail ) ) { self.fx_quad_trail unlink(); self.fx_quad_trail delete(); wait( .1 ); } } quad_post_teleport() { if ( isDefined( self.fx_quad_trail ) ) { self.fx_quad_trail unlink(); self.fx_quad_trail delete(); } if ( self.health > 0 ) { self.fx_quad_trail = Spawn( "script_model", self GetTagOrigin( "tag_origin" ) ); self.fx_quad_trail.angles = self GetTagAngles( "tag_origin" ); self.fx_quad_trail SetModel( "tag_origin" ); self.fx_quad_trail LinkTo( self, "tag_origin" ); maps\_zombiemode_net::network_safe_play_fx_on_tag( "quad_fx", 2, level._effect[ "quad_trail" ], self.fx_quad_trail, "tag_origin" ); } }