From 234014e6405913b04e20a87ca0cb21fce7b1740d Mon Sep 17 00:00:00 2001 From: JezuzLizard Date: Sat, 17 Feb 2024 21:30:16 -0800 Subject: [PATCH] Allow ai to do any traversal. Fix nuketown perk explosion script error on custom ais. --- zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc | 7 +- zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc | 15 +- .../maps/mp/zombies/_zm_ai_mechz_ft.gsc | 4 + .../scripts/zm/zm_ai_pack_mod_debug_main.gsc | 16 +- zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc | 165 ++++++++++++++++++ 5 files changed, 202 insertions(+), 5 deletions(-) diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc index 5187e18..aafb2e7 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc @@ -385,7 +385,12 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon self.custom_item_dmg = 1000; self.brutus_lockdown_state = 0; recalc_zombie_array(); - self setphysparams( 20, 0, 60 ); + width = 15; + if ( level.script == "zm_prison" ) + { + width = 20; + } + self setphysparams( width, 0, 60 ); self.zombie_init_done = 1; self notify( "zombie_init_done" ); self.allowpain = 0; diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc index 11ed9e3..0c0b651 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc @@ -151,6 +151,12 @@ init() level.mechz_powerplant_stun_time = 4; flag_init( "mechz_launching_claw" ); flag_init( "mechz_claw_move_complete" ); + if ( level.script == "zm_tomb" ) + { + registerclientfield( "actor", "mechz_fx", 14000, 12, "int" ); + registerclientfield( "toplayer", "mechz_grab", 14000, 1, "int" ); + } + level thread init_flamethrower_triggers(); if ( isdefined( level.mechz_spawning_logic_override_func ) ) @@ -571,7 +577,12 @@ mechz_spawn() self.meleedamage = 75; self.custom_item_dmg = 2000; recalc_zombie_array(); - self setphysparams( 20, 0, 80 ); + width = 15; + if ( level.script == "zm_tomb" ) + { + width = 20; + } + self setphysparams( width, 0, 80 ); self setcandamage( 0 ); self.zombie_init_done = 1; self notify( "zombie_init_done" ); @@ -1681,7 +1692,7 @@ mechz_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, mechz_non_attacker_damage_override( damage, weapon, attacker ) { - if ( attacker == level.vh_tank ) + if ( isDefined( level.vh_tank ) && attacker == level.vh_tank ) self thread mechz_tank_hit_callback(); return false; diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_ft.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_ft.gsc index 73eff69..f864470 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_ft.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_ft.gsc @@ -55,6 +55,10 @@ mechz_flamethrower_initial_setup() get_flamethrower_trigger() { + if ( getDvar( "mapname" ) != "zm_tomb" ) + { + return undefined; + } for ( i = 0; i < level.flamethrower_trigger_array.size; i++ ) { if ( !( isdefined( level.flamethrower_trigger_array[i].in_use ) && level.flamethrower_trigger_array[i].in_use ) ) diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_debug_main.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_debug_main.gsc index 99f7647..ebc7ab4 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_debug_main.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_debug_main.gsc @@ -112,7 +112,11 @@ zone_hud() } zone = self get_current_zone(); - + if ( !isDefined( zone ) ) + { + wait 1; + continue; + } if ( prev_zone != zone ) { prev_zone = zone; @@ -203,7 +207,7 @@ draw_zome_spawn_location_info_text( origin, color, zone_name, location_type_name draw_specific_zombie_spawn_locations( loc_array, zone_name, color, type ) { draw_type = getDvar( "zm_ai_pack_debug_spawn_loc_draw_type" ); - if ( draw_type == "" || draw_type != type ) + if ( draw_type == "" || ( draw_type != "all" && draw_type != type ) ) { return; } @@ -222,6 +226,8 @@ draw_zombie_spawn_locations() wait 1; } + flag_wait( "initial_blackscreen_passed" ); + for (;;) { while ( getDvarInt( "zm_ai_pack_debug" ) <= 0 ) @@ -272,6 +278,10 @@ draw_node( origin, color, type ) draw_node_info( node, type ) { + if ( !level.players[ 0 ] is_player_looking_at( node.origin, 0.9, false ) ) + { + return; + } offset = ( 0, 0, 0 ); origin = node.origin; print3d( origin + ( 0, 0, 49 ), "ORIGIN:" + origin ); @@ -328,6 +338,8 @@ draw_node_data( node, color, type ) draw_nodes() { + flag_wait( "initial_blackscreen_passed" ); + for (;;) { while ( getDvarInt( "zm_ai_pack_debug" ) <= 0 ) diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc index ec7b20c..843bc85 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc @@ -12,6 +12,14 @@ main() { replaceFunc( maps\mp\_visionset_mgr::init, ::visionset_mgr_init_override ); + replaceFunc( maps\mp\animscripts\traverse\zm_shared::dotraverse, ::dotraverse_override ); + perk_machine_knockdown_zombie_func = getFunction( "maps/mp/zm_nuked_perks", "perk_machine_knockdown_zombie" ); + + if ( isDefined( perk_machine_knockdown_zombie_func ) ) + { + replaceFunc( perk_machine_knockdown_zombie_func, ::perk_machine_knockdown_zombie_override ); + } + level.script = toLower( getDvar( "mapname" ) ); level.gametype = toLower( getDvar( "g_gametype" ) ); @@ -100,4 +108,161 @@ visionset_mgr_init_override() level thread maps\mp\_visionset_mgr::monitor(); level thread maps\mp\_visionset_mgr::onplayerconnect(); run_visionset_callbacks(); +} + +stop_basic_find_flesh() +{ + if ( isdefined( self.ai_state ) && self.ai_state == "find_flesh" ) + { + self.ai_state = undefined; + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + } +} + +dotraverse_teleport( no_powerups ) +{ + if ( isDefined( self.is_traversing ) && self.is_traversing ) + { + return; + } + + self endon( "death" ); + + endnode = self getnegotiationendnode(); + startnode = self getnegotiationstartnode(); + if ( !isdefined( endnode ) || !isdefined( startnode ) ) + { + print( "dotraverse_teleport() missing endnode or startnode" ); + return; + } + + units_per_frame = 2.5; + original_origin = self.origin; + steps = int( distance( original_origin, endnode.origin ) / units_per_frame ); + + forward = vectorNormalize( endnode.origin - original_origin ); + forward *= units_per_frame; + for ( i = 1; i < steps; i++ ) + { + self.is_traversing = true; + self stop_basic_find_flesh(); + self.ai_state = "idle"; + //self setanimstatefromasd( "zm_idle" ); + self animmode( "noclip" ); + self orientmode( "face angle", startnode.angles[1] ); + self.origin = original_origin + ( forward * i ); + self setGoalPos( self.origin ); + wait 0.05; + if ( distanceSquared( self.origin, endnode.origin ) <= units_per_frame * units_per_frame ) + { + break; + } + } + + self.origin = endnode.origin; + + print( "Ending custom traverse" ); + self animmode( "none" ); + self.is_traversing = false; +} + +dotraverse_override( traversestate, traversealias, no_powerups ) +{ + if ( !self HasAnimStateFromASD( traversestate ) || self getanimsubstatefromasd( traversestate, traversealias ) == -1 ) + { + self thread dotraverse_teleport( no_powerups ); + return; + } + 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 ) ); + 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; +} + +perk_machine_knockdown_zombie_override( origin ) +{ + damage = int( self.health * 0.25 ); + if ( isDefined( self.animname ) && self.animname == "zombie" ) + { + self.a.gib_ref = random( array( "guts", "right_arm", "left_arm" ) ); + self thread maps\mp\animscripts\zm_death::do_gib(); + level.zombie_total++; + level.zombie_total_subtract++; + damage = self.health + 100; + } + + self dodamage( damage, origin ); +} + +get_idle_anim() +{ + idle_anim = ""; + if ( isDefined( self.animname ) ) + { + switch ( self.animname ) + { + case "zombie_dog": + idle_anim = "zm_stop_idle"; + break; + case "mechz_zombie": + case "brutus_zombie": + case "ghost_zombie": + case "zombie": + if ( isDefined( self.has_legs ) && !self.has_legs ) + { + idle_anim = "zm_idle_crawl"; + } + else + { + idle_anim = "zm_idle"; + } + break; + case "screecher": + case "leaper_zombie": + break; + + } + } + else if ( isDefined( self.is_avogadro ) && self.is_avogadro ) + { + idle_anim = "zm_chamber_idle"; + } + + return idle_anim; } \ No newline at end of file