This commit is contained in:
ineed bots 2023-07-17 23:18:52 -06:00
parent 8a9aa8fdb4
commit 91d1728e41
9 changed files with 258 additions and 193 deletions

View File

@ -78,6 +78,9 @@ init()
if ( getDvar( "bots_t8_mode" ) == "" ) if ( getDvar( "bots_t8_mode" ) == "" )
setDvar( "bots_t8_mode", false ); setDvar( "bots_t8_mode", false );
if ( getDvar( "bots_play_opendoors" ) == "" )
setDvar( "bots_play_opendoors", true );
if ( !isDefined( game["botWarfare"] ) ) if ( !isDefined( game["botWarfare"] ) )
game["botWarfare"] = true; game["botWarfare"] = true;

View File

@ -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 ); 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. Returns if the bot has a script goal.
(like t5 gsc bot) (like t5 gsc bot)
@ -312,6 +320,7 @@ SetPriorityObjective()
ClearPriorityObjective() ClearPriorityObjective()
{ {
self.bot.prio_objective = false; self.bot.prio_objective = false;
self notify( "kill_goal" );
} }
/* /*
@ -648,6 +657,9 @@ DistanceSquared2D( to, from )
return DistanceSquared( to, from ); return DistanceSquared( to, from );
} }
/*
Distance from box
*/
RectDistanceSquared( origin ) RectDistanceSquared( origin )
{ {
dx = 0; dx = 0;
@ -1071,6 +1083,9 @@ inLastStand()
return self [[func]](); return self [[func]]();
} }
/*
Is reviving player
*/
isReviving( revivee ) isReviving( revivee )
{ {
func = GetFunction( "maps/_laststand", "is_reviving" ); func = GetFunction( "maps/_laststand", "is_reviving" );
@ -1122,3 +1137,204 @@ isWeaponPrimary( weap )
return false; 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;
}

View File

@ -139,14 +139,14 @@ bot_objective_think()
} }
// already on a better obj // 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; continue;
} }
// DO THE OBJ // DO THE OBJ
// cancel the old obj // cancel the old obj
if ( self HasBotObjective() ) if ( isDefined( self.bot_current_objective ) )
{ {
// cancel it // cancel it
self CancelObjective( "new obj: " + best_prio.sName ); self CancelObjective( "new obj: " + best_prio.sName );

View File

@ -104,7 +104,7 @@ Finder( eObj )
continue; 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; return answer;
@ -174,7 +174,7 @@ Priority( eObj, eEnt )
base_priority = 2; base_priority = 2;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1600, 3, 0 ); 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; base_priority -= 1;
} }

View File

@ -34,7 +34,7 @@ Finder( eObj )
continue; 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; return answer;
@ -46,7 +46,7 @@ Priority( eObj, eEnt )
base_priority = 0; base_priority = 0;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 300, 700, 2, -2 ); 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; base_priority -= 1;
} }

View File

@ -47,7 +47,7 @@ Finder( eObj )
continue; 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; return Answer;
@ -58,7 +58,7 @@ Priority( eObj, eEnt )
base_priority = 3; base_priority = 3;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 500, 1200, 2, 0 ); 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; base_priority -= 1;
} }

View File

@ -81,7 +81,7 @@ Finder( eObj )
continue; 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; return answer;
@ -99,7 +99,7 @@ Priority( eObj, eEnt )
base_priority = 1; base_priority = 1;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 600, 1800, 2, 0 ); 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; base_priority -= 1;
} }

View File

@ -17,6 +17,11 @@ CreateObjectiveForManger( sName, fpFinder, fpPriorty, fpExecuter, iProcessRate )
return Answer; return Answer;
} }
CreateFinderObjectiveEZ( eObj, eEnt )
{
return self CreateFinderObjective( eObj, eObj.sName + "_" + eEnt GetEntityNumber(), eEnt, self [[eObj.fpPriorty]]( eObj, eEnt ) );
}
CreateFinderObjective( eObj, sName, eEnt, fPriority ) CreateFinderObjective( eObj, sName, eEnt, fPriority )
{ {
Answer = SpawnStruct(); Answer = SpawnStruct();
@ -33,71 +38,6 @@ CreateFinderObjective( eObj, sName, eEnt, fPriority )
return Answer; 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 ) GetBotsAmountForEntity( eEnt )
{ {
if ( !isDefined( eEnt.bots ) ) if ( !isDefined( eEnt.bots ) )
@ -147,122 +87,28 @@ CompletedObjective( successful, reason )
self notify( "completed_bot_objective", 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() HasBotObjective()
{ {
return isDefined( self.bot_current_objective ); return isDefined( self GetBotObjective() );
}
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;
} }

View File

@ -80,7 +80,7 @@ Finder( eObj )
continue; 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; return answer;
@ -107,7 +107,7 @@ Priority( eObj, eEnt )
base_priority = 0; base_priority = 0;
base_priority += ClampLerp( get_path_dist( self.origin, eEnt.origin ), 0, 800, 1, -2 ); 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; base_priority -= 1;
} }