#include common_scripts\utility; #include maps\_utility; #include maps\bots\_bot_utility; CreateObjectiveForManger( sName, fpFinder, fpExecuter, iProcessRate ) { Answer = SpawnStruct(); Answer.sName = sName; Answer.fpFinder = fpFinder; Answer.fpExecuter = fpExecuter; Answer.aBotProcessTimes = []; Answer.iProcessRate = iProcessRate; return Answer; } CreateFinderObjective( eObj, sName, eEnt, fPriority ) { Answer = SpawnStruct(); Answer.eParentObj = eObj; Answer.sName = sName; Answer.eEnt = eEnt; Answer.fPriority = fPriority; Answer.GUID = eEnt GetEntityNumber(); Answer.bWasSuccessful = false; Answer.sReason = "canceled"; 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 ) ) { eEnt.bots = 0; } return eEnt.bots; } IncrementBotsForEntity( eEnt ) { self endon( "bots_for_entity_cleanup" ); eEnt.bots++; self waittill_either( "disconnect", "zombified" ); if ( isDefined( eEnt ) ) { eEnt.bots--; } } DecrementBotsForEntity( eEnt ) { self notify( "bots_for_entity_cleanup" ); if ( isDefined( eEnt ) ) { eEnt.bots--; } } CleanupBotsForEntity( eEnt ) { self notify( "bots_for_entity_cleanup" ); } CancelObjective( reason ) { self notify( "cancel_bot_objective", reason ); } CompletedObjective( successful, reason ) { self notify( "completed_bot_objective", successful, reason ); } 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 ); self thread debug_offset_line( node ); return node; } debug_offset_line( node ) { self notify( "debug_offset_line" ); self endon( "debug_offset_line" ); for ( ;; ) { line( self.origin, node ); wait 0.05; } } clamp_to_ground( org ) { trace = playerPhysicsTrace( org + ( 0, 0, 20 ), org - ( 0, 0, 2000 ) ); return trace; }