Allow ai to do any traversal. Fix nuketown perk explosion script error on custom ais.

This commit is contained in:
JezuzLizard
2024-02-17 21:30:16 -08:00
parent adfdb35216
commit 234014e640
5 changed files with 202 additions and 5 deletions

View File

@ -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 )

View File

@ -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;
}