From 91d1728e41d0263b83fb4e5bc0dab7046a7994c9 Mon Sep 17 00:00:00 2001 From: ineed bots Date: Mon, 17 Jul 2023 23:18:52 -0600 Subject: [PATCH] cleanup --- maps/bots/_bot.gsc | 3 + maps/bots/_bot_utility.gsc | 216 ++++++++++++++++++++++++ maps/bots/objectives/_manager.gsc | 4 +- maps/bots/objectives/_perkmachine.gsc | 4 +- maps/bots/objectives/_powerup.gsc | 4 +- maps/bots/objectives/_revive.gsc | 4 +- maps/bots/objectives/_treasurechest.gsc | 4 +- maps/bots/objectives/_utility.gsc | 208 +++-------------------- maps/bots/objectives/_wallweapon.gsc | 4 +- 9 files changed, 258 insertions(+), 193 deletions(-) diff --git a/maps/bots/_bot.gsc b/maps/bots/_bot.gsc index 36fbe50..d97cc9d 100644 --- a/maps/bots/_bot.gsc +++ b/maps/bots/_bot.gsc @@ -78,6 +78,9 @@ init() if ( getDvar( "bots_t8_mode" ) == "" ) setDvar( "bots_t8_mode", false ); + if ( getDvar( "bots_play_opendoors" ) == "" ) + setDvar( "bots_play_opendoors", true ); + if ( !isDefined( game["botWarfare"] ) ) game["botWarfare"] = true; diff --git a/maps/bots/_bot_utility.gsc b/maps/bots/_bot_utility.gsc index f81ae2f..4c1706f 100644 --- a/maps/bots/_bot_utility.gsc +++ b/maps/bots/_bot_utility.gsc @@ -236,6 +236,14 @@ BotNotifyBotEvent( msg, a, b, c, d, e, f, g ) self notify( "bot_event", msg, a, b, c, d, e, f, g ); } +/* + Does the bot have an objective? +*/ +BotHasObjective() +{ + return self maps\bots\objectives\_utility::HasBotObjective(); +} + /* Returns if the bot has a script goal. (like t5 gsc bot) @@ -312,6 +320,7 @@ SetPriorityObjective() ClearPriorityObjective() { self.bot.prio_objective = false; + self notify( "kill_goal" ); } /* @@ -648,6 +657,9 @@ DistanceSquared2D( to, from ) return DistanceSquared( to, from ); } +/* + Distance from box +*/ RectDistanceSquared( origin ) { dx = 0; @@ -1071,6 +1083,9 @@ inLastStand() return self [[func]](); } +/* + Is reviving player +*/ isReviving( revivee ) { func = GetFunction( "maps/_laststand", "is_reviving" ); @@ -1122,3 +1137,204 @@ isWeaponPrimary( weap ) return false; } + +/* + Checks whether the path generated by the ASTAR path finding is inaccessible +*/ +GetPathIsInaccessible( from, to, team, best_effort ) +{ + if ( isDefined( best_effort ) ) + { + path = generatePath( from, to, team, level.bot_allowed_negotiation_links, best_effort ); + } + else + { + path = generatePath( from, to, team, level.bot_allowed_negotiation_links ); + } + + return ( !isDefined( path ) || ( path.size <= 0 ) ); +} + +/* + Returns how long the path is +*/ +get_path_dist( start, end, team ) +{ + path = generatePath( start, end, team, level.bot_allowed_negotiation_links, 192.0 ); + + if ( !isDefined( path ) || path.size <= 0 ) + { + return 999999999; + } + + dist = 0; + prev_node = undefined; + + for ( i = 0; i < path.size; i++ ) + { + if ( i == 0 ) + { + prev_node = path[ i ]; + continue; + } + + dist += distance( prev_node.origin, path[ i ].origin ); + prev_node = path[ i ]; + } + + return dist; +} + +/* + Clamp lerp, +*/ +ClampLerp( dist, min_dist, max_dist, max_bonus, min_bonus ) +{ + answer = 0; + + if ( dist <= min_dist ) + { + answer += max_bonus; + } + else if ( dist >= max_dist ) + { + answer += min_bonus; + } + else + { + dist_multi = 1 - ( ( dist - min_dist ) / ( max_dist - min_dist ) ); + answer += min_bonus + ( ( max_bonus - min_bonus ) * dist_multi ); + } + + return answer; +} + +/* + Base an origin offset from an ent +*/ +get_angle_offset_node( forward_size, angle_offset, offset ) +{ + if ( !isDefined( forward_size ) ) + { + forward_size = 40; + } + + if ( !isDefined( angle_offset ) ) + { + angle_offset = ( 0, 0, 0 ); + } + + if ( !isDefined( offset ) ) + { + offset = ( 0, 0, 0 ); + } + + angles = ( 0, self.angles[ 1 ], 0 ); + angles += angle_offset; + node = self.origin + ( AnglesToForward( angles ) * forward_size ) + offset; + node = clamp_to_ground( node ); + + if ( getDvarInt( "bots_main_debug" ) ) + { + self thread debug_offset_line( node ); + } + + return node; +} + +/* + Draw the offset +*/ +debug_offset_line( node ) +{ + self endon( "death" ); + self notify( "debug_offset_line" ); + self endon( "debug_offset_line" ); + + while ( isDefined( self ) ) + { + line( self.origin, node ); + wait 0.05; + } +} + +/* + Is the point inside this use trigger? +*/ +PointInsideUseTrigger( point ) +{ + if ( getDvarInt( "bots_main_debug" ) ) + { + self thread debug_bounding_box_for_ent(); + } + + mins = self getmins(); + maxs = self getmaxs(); + + box = spawnstruct(); + box.x0 = self.origin[0] + mins[0]; + box.x1 = self.origin[0] + maxs[0]; + box.y0 = self.origin[1] + mins[1]; + box.y1 = self.origin[1] + maxs[1]; + box.z0 = self.origin[2] + mins[2]; + box.z1 = self.origin[2] + maxs[2]; + + if ( box RectDistanceSquared( self.origin ) > 72 * 72 ) + { + return false; + } + + if ( !sightTracePassed( point, self.origin, false, undefined ) ) + { + return false; + } + + return true; +} + +/* + Draw the aabb of the ent +*/ +debug_bounding_box_for_ent( color ) +{ + self endon( "death" ); + self notify( "debug_bounding_box_for_ent" ); + self endon( "debug_bounding_box_for_ent" ); + + if ( !isDefined( color ) ) + color = ( randomFloatRange( 0, 1 ), randomFloatRange( 0, 1 ), randomFloatRange( 0, 1 ) ); + + while ( isDefined( self ) ) + { + mins = self getmins(); + maxs = self getmaxs(); + + line( self.origin + ( mins[0], mins[1], mins[2] ), self.origin + ( mins[0], mins[1], maxs[2] ), color ); + line( self.origin + ( mins[0], mins[1], mins[2] ), self.origin + ( mins[0], maxs[1], mins[2] ), color ); + line( self.origin + ( mins[0], mins[1], mins[2] ), self.origin + ( maxs[0], mins[1], mins[2] ), color ); + + line( self.origin + ( maxs[0], maxs[1], maxs[2] ), self.origin + ( maxs[0], maxs[1], mins[2] ), color ); + line( self.origin + ( maxs[0], maxs[1], maxs[2] ), self.origin + ( maxs[0], mins[1], maxs[2] ), color ); + line( self.origin + ( maxs[0], maxs[1], maxs[2] ), self.origin + ( mins[0], maxs[1], maxs[2] ), color ); + + line( self.origin + ( maxs[0], mins[1], mins[2] ), self.origin + ( maxs[0], maxs[1], mins[2] ), color ); + line( self.origin + ( maxs[0], mins[1], mins[2] ), self.origin + ( maxs[0], mins[1], maxs[2] ), color ); + + line( self.origin + ( mins[0], mins[1], maxs[2] ), self.origin + ( maxs[0], mins[1], maxs[2] ), color ); + line( self.origin + ( mins[0], mins[1], maxs[2] ), self.origin + ( mins[0], maxs[1], maxs[2] ), color ); + + line( self.origin + ( mins[0], maxs[1], mins[2] ), self.origin + ( maxs[0], maxs[1], mins[2] ), color ); + line( self.origin + ( mins[0], maxs[1], mins[2] ), self.origin + ( mins[0], maxs[1], maxs[2] ), color ); + + wait 0.05; + } +} + +/* + Clamp the origin to the ground +*/ +clamp_to_ground( org ) +{ + trace = playerPhysicsTrace( org + ( 0, 0, 20 ), org - ( 0, 0, 2000 ) ); + return trace; +} diff --git a/maps/bots/objectives/_manager.gsc b/maps/bots/objectives/_manager.gsc index c30ec7b..59902c0 100644 --- a/maps/bots/objectives/_manager.gsc +++ b/maps/bots/objectives/_manager.gsc @@ -139,14 +139,14 @@ bot_objective_think() } // already on a better obj - if ( self HasBotObjective() && ( best_prio.GUID == self.bot_current_objective.GUID || best_prio.fPriority < self [[self.bot_current_objective.eParentObj.fpPriorty]]( self.bot_current_objective.eParentObj, self.bot_current_objective.eEnt ) ) ) + if ( isDefined( self.bot_current_objective ) && ( best_prio.GUID == self.bot_current_objective.GUID || best_prio.fPriority < self [[self.bot_current_objective.eParentObj.fpPriorty]]( self.bot_current_objective.eParentObj, self.bot_current_objective.eEnt ) ) ) { continue; } // DO THE OBJ // cancel the old obj - if ( self HasBotObjective() ) + if ( isDefined( self.bot_current_objective ) ) { // cancel it self CancelObjective( "new obj: " + best_prio.sName ); diff --git a/maps/bots/objectives/_perkmachine.gsc b/maps/bots/objectives/_perkmachine.gsc index 43e47ea..6492641 100644 --- a/maps/bots/objectives/_perkmachine.gsc +++ b/maps/bots/objectives/_perkmachine.gsc @@ -104,7 +104,7 @@ Finder( eObj ) continue; } - answer[answer.size] = self CreateFinderObjective( eObj, eObj.sName + "_" + vending GetEntityNumber(), vending, self [[eObj.fpPriorty]]( eObj, vending ) ); + answer[answer.size] = self CreateFinderObjectiveEZ( eObj, vending ); } return answer; @@ -174,7 +174,7 @@ Priority( eObj, eEnt ) base_priority = 2; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1600, 3, 0 ); - if ( self HasBotObjective() && self.bot_current_objective.eEnt != eEnt ) + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } diff --git a/maps/bots/objectives/_powerup.gsc b/maps/bots/objectives/_powerup.gsc index b03ecd2..1b94dca 100644 --- a/maps/bots/objectives/_powerup.gsc +++ b/maps/bots/objectives/_powerup.gsc @@ -34,7 +34,7 @@ Finder( eObj ) continue; } - answer[answer.size] = self CreateFinderObjective( eObj, eObj.sName + "_" + ents[i] GetEntityNumber(), ents[i], self [[eObj.fpPriorty]]( eObj, ents[i] ) ); + answer[answer.size] = self CreateFinderObjectiveEZ( eObj, ents[i] ); } return answer; @@ -46,7 +46,7 @@ Priority( eObj, eEnt ) base_priority = 0; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 300, 700, 2, -2 ); - if ( self HasBotObjective() && self.bot_current_objective.eEnt != eEnt ) + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } diff --git a/maps/bots/objectives/_revive.gsc b/maps/bots/objectives/_revive.gsc index 9f377df..a75854c 100644 --- a/maps/bots/objectives/_revive.gsc +++ b/maps/bots/objectives/_revive.gsc @@ -47,7 +47,7 @@ Finder( eObj ) continue; } - Answer[Answer.size] = self CreateFinderObjective( eObj, eObj.sName + "_" + Player GetEntityNumber(), Player, self [[eObj.fpPriorty]]( eObj, Player ) ); + Answer[Answer.size] = self CreateFinderObjectiveEZ( eObj, Player ); } return Answer; @@ -58,7 +58,7 @@ Priority( eObj, eEnt ) base_priority = 3; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1200, 2, 0 ); - if ( self HasBotObjective() && self.bot_current_objective.eEnt != eEnt ) + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } diff --git a/maps/bots/objectives/_treasurechest.gsc b/maps/bots/objectives/_treasurechest.gsc index 0864d74..d4405e8 100644 --- a/maps/bots/objectives/_treasurechest.gsc +++ b/maps/bots/objectives/_treasurechest.gsc @@ -81,7 +81,7 @@ Finder( eObj ) continue; } - answer[answer.size] = self CreateFinderObjective( eObj, eObj.sName + "_" + chest GetEntityNumber(), chest, self [[eObj.fpPriorty]]( eObj, chest ) ); + answer[answer.size] = self CreateFinderObjectiveEZ( eObj, chest ); } return answer; @@ -99,7 +99,7 @@ Priority( eObj, eEnt ) base_priority = 1; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 600, 1800, 2, 0 ); - if ( self HasBotObjective() && self.bot_current_objective.eEnt != eEnt ) + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; } diff --git a/maps/bots/objectives/_utility.gsc b/maps/bots/objectives/_utility.gsc index a7a229b..2643c61 100644 --- a/maps/bots/objectives/_utility.gsc +++ b/maps/bots/objectives/_utility.gsc @@ -17,6 +17,11 @@ CreateObjectiveForManger( sName, fpFinder, fpPriorty, fpExecuter, iProcessRate ) return Answer; } +CreateFinderObjectiveEZ( eObj, eEnt ) +{ + return self CreateFinderObjective( eObj, eObj.sName + "_" + eEnt GetEntityNumber(), eEnt, self [[eObj.fpPriorty]]( eObj, eEnt ) ); +} + CreateFinderObjective( eObj, sName, eEnt, fPriority ) { Answer = SpawnStruct(); @@ -33,71 +38,6 @@ CreateFinderObjective( eObj, sName, eEnt, fPriority ) return Answer; } -/* - Checks whether the path generated by the ASTAR path finding is inaccessible -*/ -GetPathIsInaccessible( from, to, team, best_effort ) -{ - if ( isDefined( best_effort ) ) - { - path = generatePath( from, to, team, level.bot_allowed_negotiation_links, best_effort ); - } - else - { - path = generatePath( from, to, team, level.bot_allowed_negotiation_links ); - } - - return ( !isDefined( path ) || ( path.size <= 0 ) ); -} - -get_path_dist( start, end, team ) -{ - path = generatePath( start, end, team, level.bot_allowed_negotiation_links, 192.0 ); - - if ( !isDefined( path ) || path.size <= 0 ) - { - return 999999999; - } - - dist = 0; - prev_node = undefined; - - for ( i = 0; i < path.size; i++ ) - { - if ( i == 0 ) - { - prev_node = path[ i ]; - continue; - } - - dist += distance( prev_node.origin, path[ i ].origin ); - prev_node = path[ i ]; - } - - return dist; -} - -ClampLerp( dist, min_dist, max_dist, max_bonus, min_bonus ) -{ - answer = 0; - - if ( dist <= min_dist ) - { - answer += max_bonus; - } - else if ( dist >= max_dist ) - { - answer += min_bonus; - } - else - { - dist_multi = 1 - ( ( dist - min_dist ) / ( max_dist - min_dist ) ); - answer += min_bonus + ( ( max_bonus - min_bonus ) * dist_multi ); - } - - return answer; -} - GetBotsAmountForEntity( eEnt ) { if ( !isDefined( eEnt.bots ) ) @@ -147,122 +87,28 @@ CompletedObjective( successful, reason ) self notify( "completed_bot_objective", successful, reason ); } +GetBotObjectiveEnt() +{ + if ( !self HasBotObjective() ) + { + return undefined; + } + + return self GetBotObjective().eEnt; +} + +/* + Gets bot objective +*/ +GetBotObjective() +{ + return self.bot_current_objective; +} + +/* + Does the bot have an objective? +*/ HasBotObjective() { - return isDefined( self.bot_current_objective ); -} - -get_angle_offset_node( forward_size, angle_offset, offset ) -{ - if ( !isDefined( forward_size ) ) - { - forward_size = 40; - } - - if ( !isDefined( angle_offset ) ) - { - angle_offset = ( 0, 0, 0 ); - } - - if ( !isDefined( offset ) ) - { - offset = ( 0, 0, 0 ); - } - - angles = ( 0, self.angles[ 1 ], 0 ); - angles += angle_offset; - node = self.origin + ( AnglesToForward( angles ) * forward_size ) + offset; - node = clamp_to_ground( node ); - - if ( getDvarInt( "bots_main_debug" ) ) - { - self thread debug_offset_line( node ); - } - - return node; -} - -debug_offset_line( node ) -{ - self endon( "death" ); - self notify( "debug_offset_line" ); - self endon( "debug_offset_line" ); - - while ( isDefined( self ) ) - { - line( self.origin, node ); - wait 0.05; - } -} - -PointInsideUseTrigger( point ) -{ - if ( getDvarInt( "bots_main_debug" ) ) - { - self thread debug_bounding_box_for_ent(); - } - - mins = self getmins(); - maxs = self getmaxs(); - - box = spawnstruct(); - box.x0 = self.origin[0] + mins[0]; - box.x1 = self.origin[0] + maxs[0]; - box.y0 = self.origin[1] + mins[1]; - box.y1 = self.origin[1] + maxs[1]; - box.z0 = self.origin[2] + mins[2]; - box.z1 = self.origin[2] + maxs[2]; - - if ( box RectDistanceSquared( self.origin ) > 72 * 72 ) - { - return false; - } - - if ( !sightTracePassed( point, self.origin, false, undefined ) ) - { - return false; - } - - return true; -} - -debug_bounding_box_for_ent( color ) -{ - self endon( "death" ); - self notify( "debug_bounding_box_for_ent" ); - self endon( "debug_bounding_box_for_ent" ); - - if ( !isDefined( color ) ) - color = ( randomFloatRange( 0, 1 ), randomFloatRange( 0, 1 ), randomFloatRange( 0, 1 ) ); - - while ( isDefined( self ) ) - { - mins = self getmins(); - maxs = self getmaxs(); - - line( self.origin + ( mins[0], mins[1], mins[2] ), self.origin + ( mins[0], mins[1], maxs[2] ), color ); - line( self.origin + ( mins[0], mins[1], mins[2] ), self.origin + ( mins[0], maxs[1], mins[2] ), color ); - line( self.origin + ( mins[0], mins[1], mins[2] ), self.origin + ( maxs[0], mins[1], mins[2] ), color ); - - line( self.origin + ( maxs[0], maxs[1], maxs[2] ), self.origin + ( maxs[0], maxs[1], mins[2] ), color ); - line( self.origin + ( maxs[0], maxs[1], maxs[2] ), self.origin + ( maxs[0], mins[1], maxs[2] ), color ); - line( self.origin + ( maxs[0], maxs[1], maxs[2] ), self.origin + ( mins[0], maxs[1], maxs[2] ), color ); - - line( self.origin + ( maxs[0], mins[1], mins[2] ), self.origin + ( maxs[0], maxs[1], mins[2] ), color ); - line( self.origin + ( maxs[0], mins[1], mins[2] ), self.origin + ( maxs[0], mins[1], maxs[2] ), color ); - - line( self.origin + ( mins[0], mins[1], maxs[2] ), self.origin + ( maxs[0], mins[1], maxs[2] ), color ); - line( self.origin + ( mins[0], mins[1], maxs[2] ), self.origin + ( mins[0], maxs[1], maxs[2] ), color ); - - line( self.origin + ( mins[0], maxs[1], mins[2] ), self.origin + ( maxs[0], maxs[1], mins[2] ), color ); - line( self.origin + ( mins[0], maxs[1], mins[2] ), self.origin + ( mins[0], maxs[1], maxs[2] ), color ); - - wait 0.05; - } -} - -clamp_to_ground( org ) -{ - trace = playerPhysicsTrace( org + ( 0, 0, 20 ), org - ( 0, 0, 2000 ) ); - return trace; + return isDefined( self GetBotObjective() ); } diff --git a/maps/bots/objectives/_wallweapon.gsc b/maps/bots/objectives/_wallweapon.gsc index 215df6e..54530ed 100644 --- a/maps/bots/objectives/_wallweapon.gsc +++ b/maps/bots/objectives/_wallweapon.gsc @@ -80,7 +80,7 @@ Finder( eObj ) continue; } - answer[answer.size] = self CreateFinderObjective( eObj, eObj.sName + "_" + weapon_spawns[i] GetEntityNumber(), weapon_spawns[i], self [[eObj.fpPriorty]]( eObj, weapon_spawns[i] ) ); + answer[answer.size] = self CreateFinderObjectiveEZ( eObj, weapon_spawns[i] ); } return answer; @@ -107,7 +107,7 @@ Priority( eObj, eEnt ) base_priority = 0; base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 0, 800, 1, -2 ); - if ( self HasBotObjective() && self.bot_current_objective.eEnt != eEnt ) + if ( self HasBotObjective() && self GetBotObjectiveEnt() != eEnt ) { base_priority -= 1; }