#include maps\mp\zombies\_zm_zonemgr; #include common_scripts\utility; #include maps\mp\_utility; #include maps\mp\zombies\_zm_net; #include maps\mp\zombies\_zm_utility; #include maps\mp\animscripts\zm_utility; #include maps\mp\zm_tomb_tank; #include maps\mp\zombies\_zm_ai_mechz_dev; #include maps\mp\zombies\_zm_ai_mechz_claw; #include maps\mp\zombies\_zm_ai_mechz_ft; #include maps\mp\zombies\_zm_ai_mechz_booster; #include maps\mp\zombies\_zm_ai_mechz_ffotd; #include maps\mp\zombies\_zm_ai_mechz; #include maps\mp\zombies\_zm_spawner; #include maps\mp\animscripts\zm_shared; #include maps\mp\zombies\_zm_audio; #include maps\mp\zombies\_zm_score; #include maps\mp\zombies\_zm_stats; #include maps\mp\zombies\_zm_powerups; #include maps\mp\zm_tomb_chamber; #include maps\mp\zombies\_zm_ai_basic; mechz_set_starting_health() { self.maxhealth = level.mechz_health; self.helmet_dmg = 0; self.helmet_dmg_for_removal = self.maxhealth * level.mechz_helmet_health_percentage; self.powerplant_cover_dmg = 0; self.powerplant_cover_dmg_for_removal = self.maxhealth * level.mechz_powerplant_expose_health_percentage; self.powerplant_dmg = 0; self.powerplant_dmg_for_destroy = self.maxhealth * level.mechz_powerplant_destroyed_health_percentage; level.mechz_explosive_dmg_to_cancel_claw = self.maxhealth * level.mechz_explosive_dmg_to_cancel_claw_percentage; self.health = level.mechz_health; self.non_attacker_func = ::mechz_non_attacker_damage_override; self.non_attack_func_takes_attacker = 1; self.actor_damage_func = ::mechz_damage_override; self.instakill_func = ::mechz_instakill_override; self.nuke_damage_func = ::mechz_nuke_override; } mechz_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, shitloc, poffsettime, boneindex ) { num_tiers = level.mechz_armor_info.size + 1; old_health_tier = int( num_tiers * self.health / self.maxhealth ); bonename = getpartname( "c_zom_mech_body", boneindex ); if ( isdefined( attacker ) && isalive( attacker ) && isplayer( attacker ) && ( level.zombie_vars[attacker.team]["zombie_insta_kill"] || isdefined( attacker.personal_instakill ) && attacker.personal_instakill ) ) { n_mechz_damage_percent = 1.0; n_mechz_headshot_modifier = 2.0; } else { n_mechz_damage_percent = level.mechz_damage_percent; n_mechz_headshot_modifier = 1.0; } if ( isdefined( weapon ) && is_weapon_shotgun( weapon ) ) { n_mechz_damage_percent *= level.mechz_shotgun_damage_mod; n_mechz_headshot_modifier *= level.mechz_shotgun_damage_mod; } if ( damage <= 10 ) n_mechz_damage_percent = 1.0; if ( ( is_explosive_damage( meansofdeath ) && weapon != "c96_upgraded_zm" && weapon != "raygun_mark2_zm" && weapon != "raygun_mark2_upgraded_zm" ) || issubstr( weapon, "staff" ) ) { if ( n_mechz_damage_percent < 0.5 ) n_mechz_damage_percent = 0.5; if ( !( isdefined( self.has_helmet ) && self.has_helmet ) && issubstr( weapon, "staff" ) && n_mechz_damage_percent < 1.0 ) n_mechz_damage_percent = 1.0; final_damage = damage * n_mechz_damage_percent; if ( !isdefined( self.explosive_dmg_taken ) ) self.explosive_dmg_taken = 0; self.explosive_dmg_taken += final_damage; self.helmet_dmg += final_damage; if ( isdefined( self.explosive_dmg_taken_on_grab_start ) ) { if ( isdefined( self.e_grabbed ) && self.explosive_dmg_taken - self.explosive_dmg_taken_on_grab_start > level.mechz_explosive_dmg_to_cancel_claw ) { if ( isdefined( self.has_helmet ) && self.has_helmet && self.helmet_dmg < self.helmet_dmg_for_removal || !( isdefined( self.has_helmet ) && self.has_helmet ) ) self thread mechz_claw_shot_pain_reaction(); self thread ent_released_from_claw_grab_achievement( attacker, self.e_grabbed ); self thread mechz_claw_release(); } } } else if ( shitloc != "head" && shitloc != "helmet" ) { if ( bonename == "tag_powersupply" ) { final_damage = damage * n_mechz_damage_percent; if ( !( isdefined( self.powerplant_covered ) && self.powerplant_covered ) ) self.powerplant_dmg += final_damage; else self.powerplant_cover_dmg += final_damage; } if ( isdefined( self.e_grabbed ) && ( shitloc == "left_hand" || shitloc == "left_arm_lower" || shitloc == "left_arm_upper" ) ) { if ( isdefined( self.e_grabbed ) ) self thread mechz_claw_shot_pain_reaction(); self thread ent_released_from_claw_grab_achievement( attacker, self.e_grabbed ); self thread mechz_claw_release( 1 ); } final_damage = damage * n_mechz_damage_percent; } else if ( !( isdefined( self.has_helmet ) && self.has_helmet ) ) final_damage = damage * n_mechz_headshot_modifier; else { final_damage = damage * n_mechz_damage_percent; self.helmet_dmg += final_damage; } if ( !isdefined( weapon ) || weapon == "none" ) { if ( !isplayer( attacker ) ) final_damage = 0; } new_health_tier = int( num_tiers * ( self.health - final_damage ) / self.maxhealth ); if ( old_health_tier > new_health_tier ) { while ( old_health_tier > new_health_tier ) { if ( old_health_tier < num_tiers ) self mechz_launch_armor_piece(); old_health_tier--; } } if ( isdefined( self.has_helmet ) && self.has_helmet && self.helmet_dmg >= self.helmet_dmg_for_removal ) { self.has_helmet = 0; self detach( "c_zom_mech_faceplate", "J_Helmet" ); if ( sndmechzisnetworksafe( "destruction" ) ) self playsound( "zmb_ai_mechz_destruction" ); if ( sndmechzisnetworksafe( "angry" ) ) self playsound( "zmb_ai_mechz_vox_angry" ); self.fx_field |= 1024; self.fx_field &= ~2048; self setclientfield( "mechz_fx", self.fx_field ); if ( !( isdefined( self.not_interruptable ) && self.not_interruptable ) && !( isdefined( self.is_traversing ) && self.is_traversing ) ) { self mechz_interrupt(); self animscripted( self.origin, self.angles, "zm_pain_faceplate" ); self maps\mp\animscripts\zm_shared::donotetracks( "pain_anim_faceplate" ); } self thread shoot_mechz_head_vo(); } if ( isdefined( self.powerplant_covered ) && self.powerplant_covered && self.powerplant_cover_dmg >= self.powerplant_cover_dmg_for_removal ) { self.powerplant_covered = 0; self detach( "c_zom_mech_powersupply_cap", "tag_powersupply" ); cap_model = spawn( "script_model", self gettagorigin( "tag_powersupply" ) ); cap_model.angles = self gettagangles( "tag_powersupply" ); cap_model setmodel( "c_zom_mech_powersupply_cap" ); cap_model physicslaunch( cap_model.origin, anglestoforward( cap_model.angles ) ); cap_model thread mechz_delayed_item_delete(); if ( sndmechzisnetworksafe( "destruction" ) ) self playsound( "zmb_ai_mechz_destruction" ); if ( !( isdefined( self.not_interruptable ) && self.not_interruptable ) && !( isdefined( self.is_traversing ) && self.is_traversing ) ) { self mechz_interrupt(); self animscripted( self.origin, self.angles, "zm_pain_powercore" ); self maps\mp\animscripts\zm_shared::donotetracks( "pain_anim_powercore" ); } } else if ( !( isdefined( self.powerplant_covered ) && self.powerplant_covered ) && ( isdefined( self.has_powerplant ) && self.has_powerplant ) && self.powerplant_dmg >= self.powerplant_dmg_for_destroy ) { self.has_powerplant = 0; self thread mechz_stun( level.mechz_powerplant_stun_time ); if ( sndmechzisnetworksafe( "destruction" ) ) self playsound( "zmb_ai_mechz_destruction" ); } return final_damage; } mechz_round_tracker() { maps\mp\zombies\_zm_ai_mechz_ffotd::mechz_round_tracker_start(); level.num_mechz_spawned = 0; old_spawn_func = level.round_spawn_func; old_wait_func = level.round_wait_func; while ( !isdefined( level.zombie_mechz_locations ) ) wait 0.05; flag_wait( "activate_zone_nml" ); mech_start_round_num = 8; if ( isdefined( level.is_forever_solo_game ) && level.is_forever_solo_game ) mech_start_round_num = 8; while ( level.round_number < mech_start_round_num ) level waittill( "between_round_over" ); level.next_mechz_round = level.round_number; level thread debug_print_mechz_round(); while ( true ) { maps\mp\zombies\_zm_ai_mechz_ffotd::mechz_round_tracker_loop_start(); if ( level.num_mechz_spawned > 0 ) level.mechz_should_drop_powerup = 1; if ( level.next_mechz_round <= level.round_number ) { a_zombies = getaispeciesarray( level.zombie_team, "all" ); foreach ( zombie in a_zombies ) { if ( isdefined( zombie.is_mechz ) && zombie.is_mechz && isalive( zombie ) ) { level.next_mechz_round++; break; } } } if ( level.mechz_left_to_spawn == 0 && level.next_mechz_round <= level.round_number ) { mechz_health_increases(); if ( get_players().size == 1 ) level.mechz_zombie_per_round = 1; else if ( level.mechz_round_count < 2 ) level.mechz_zombie_per_round = 1; else if ( level.mechz_round_count < 5 ) level.mechz_zombie_per_round = 2; else level.mechz_zombie_per_round = 3; level.mechz_left_to_spawn = level.mechz_zombie_per_round; mechz_spawning = level.mechz_left_to_spawn; wait( randomfloatrange( 10.0, 15.0 ) ); level notify( "spawn_mechz" ); if ( isdefined( level.is_forever_solo_game ) && level.is_forever_solo_game ) n_round_gap = randomintrange( level.mechz_min_round_fq_solo, level.mechz_max_round_fq_solo ); else n_round_gap = randomintrange( level.mechz_min_round_fq, level.mechz_max_round_fq ); level.next_mechz_round = level.round_number + n_round_gap; level.mechz_round_count++; level thread debug_print_mechz_round(); level.num_mechz_spawned += mechz_spawning; } maps\mp\zombies\_zm_ai_mechz_ffotd::mechz_round_tracker_loop_end(); level waittill( "between_round_over" ); mechz_clear_spawns(); } }