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

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

View File

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

View File

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

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