mirror of
https://github.com/ineedbots/t6_bot_warfare.git
synced 2025-04-22 01:35:42 +00:00
Fix sd
This commit is contained in:
parent
a102bd7622
commit
3ca2e035b6
Binary file not shown.
@ -5,6 +5,13 @@
|
|||||||
The entry point and manager of the bots.
|
The entry point and manager of the bots.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include maps/mp/gametypes/_globallogic_utils;
|
||||||
|
#include maps/mp/bots/_bot_combat;
|
||||||
|
#include maps/mp/bots/_bot;
|
||||||
|
#include maps/mp/gametypes/_gameobjects;
|
||||||
|
#include maps/mp/_utility;
|
||||||
|
#include common_scripts/utility;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Entry point to the bots
|
Entry point to the bots
|
||||||
*/
|
*/
|
||||||
@ -87,7 +94,7 @@ fixGamemodes()
|
|||||||
wait 0.25;
|
wait 0.25;
|
||||||
|
|
||||||
if ( level.gametype == "sd" )
|
if ( level.gametype == "sd" )
|
||||||
level.bot_gametype = maps\mp\bots\_bot_sd::bot_sd_think;
|
level.bot_gametype = ::bot_sd_think;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -930,3 +937,497 @@ is_bot()
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// _bot_sd
|
||||||
|
// fix crash
|
||||||
|
|
||||||
|
bot_sd_think() //checked changed to match cerberus output
|
||||||
|
{
|
||||||
|
foreach ( zone in level.bombzones )
|
||||||
|
{
|
||||||
|
if ( !isDefined( zone.nearest_node ) )
|
||||||
|
{
|
||||||
|
nodes = getnodesinradiussorted( zone.trigger.origin, 256, 0 );
|
||||||
|
/*
|
||||||
|
/#
|
||||||
|
assert( nodes.size );
|
||||||
|
#/
|
||||||
|
*/
|
||||||
|
zone.nearest_node = nodes[ 0 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zone = sd_get_planted_zone();
|
||||||
|
|
||||||
|
if ( isDefined( zone ) )
|
||||||
|
{
|
||||||
|
self bot_sd_defender( zone, 1 );
|
||||||
|
}
|
||||||
|
else if ( self.team == game[ "attackers" ] )
|
||||||
|
{
|
||||||
|
if ( level.multibomb )
|
||||||
|
{
|
||||||
|
self.isbombcarrier = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
self bot_sd_attacker();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
zone = random( level.bombzones );
|
||||||
|
self bot_sd_defender( zone );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bot_sd_attacker() //checked changed to match cerberus output
|
||||||
|
{
|
||||||
|
level endon( "game_ended" );
|
||||||
|
|
||||||
|
if ( !level.multibomb && !isDefined( level.sdbomb.carrier ) && !level.bombplanted )
|
||||||
|
{
|
||||||
|
self cancelgoal( "sd_protect_carrier" );
|
||||||
|
|
||||||
|
if ( !level.sdbomb maps\mp\gametypes\_gameobjects::isobjectawayfromhome() )
|
||||||
|
{
|
||||||
|
if ( !self maps\mp\bots\_bot::bot_friend_goal_in_radius( "sd_pickup", level.sdbomb.curorigin, 64 ) )
|
||||||
|
{
|
||||||
|
self addgoal( level.sdbomb.curorigin, 16, 4, "sd_pickup" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self addgoal( level.sdbomb.curorigin, 16, 4, "sd_pickup" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self cancelgoal( "sd_pickup" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( is_true( self.isbombcarrier ) )
|
||||||
|
{
|
||||||
|
goal = self getgoal( "sd_plant" );
|
||||||
|
|
||||||
|
if ( isDefined( goal ) )
|
||||||
|
{
|
||||||
|
if ( distancesquared( self.origin, goal ) < 2304 )
|
||||||
|
{
|
||||||
|
self setstance( "prone" );
|
||||||
|
wait 0.5;
|
||||||
|
self pressusebutton( level.planttime + 1 );
|
||||||
|
wait 0.5;
|
||||||
|
|
||||||
|
if ( is_true( self.isplanting ) )
|
||||||
|
{
|
||||||
|
wait ( level.planttime + 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
self pressusebutton( 0 );
|
||||||
|
self setstance( "crouch" );
|
||||||
|
wait 0.25;
|
||||||
|
self cancelgoal( "sd_plant" );
|
||||||
|
self setstance( "stand" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ( getTime() > self.bot[ "patrol_update" ] )
|
||||||
|
{
|
||||||
|
frac = sd_get_time_frac();
|
||||||
|
|
||||||
|
if ( ( randomint( 100 ) < ( frac * 100 ) ) || ( frac > 0.85 ) )
|
||||||
|
{
|
||||||
|
zone = sd_get_closest_bomb();
|
||||||
|
goal = sd_get_bomb_goal( zone.visuals[ 0 ] );
|
||||||
|
|
||||||
|
if ( isDefined( goal ) )
|
||||||
|
{
|
||||||
|
if ( frac > 0.85 )
|
||||||
|
{
|
||||||
|
self addgoal( goal, 24, 4, "sd_plant" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self addgoal( goal, 24, 3, "sd_plant" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.bot[ "patrol_update" ] = getTime() + randomintrange( 2500, 5000 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( isDefined( level.sdbomb.carrier ) && !isplayer( level.sdbomb.carrier ) )
|
||||||
|
{
|
||||||
|
if ( !isDefined( self.protectcarrier ) )
|
||||||
|
{
|
||||||
|
if ( randomint( 100 ) > 70 )
|
||||||
|
{
|
||||||
|
self.protectcarrier = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.protectcarrier = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self.protectcarrier )
|
||||||
|
{
|
||||||
|
goal = level.sdbomb.carrier getgoal( "sd_plant" );
|
||||||
|
|
||||||
|
if ( isDefined( goal ) )
|
||||||
|
{
|
||||||
|
nodes = getnodesinradiussorted( goal, 256, 0 );
|
||||||
|
|
||||||
|
if ( isDefined( nodes ) && ( nodes.size > 0 ) && !isDefined( self getgoal( "sd_protect_carrier" ) ) )
|
||||||
|
{
|
||||||
|
self addgoal( nodes[ randomint( nodes.size ) ], 24, 3, "sd_protect_carrier" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bot_sd_defender( zone, isplanted ) //checked partially changed to match cerberus output did not use foreach see github for more info
|
||||||
|
{
|
||||||
|
bot_sd_grenade();
|
||||||
|
|
||||||
|
if ( isDefined( isplanted ) && isplanted && self hasgoal( "sd_defend" ) )
|
||||||
|
{
|
||||||
|
goal = self getgoal( "sd_defend" );
|
||||||
|
planted = sd_get_planted_zone();
|
||||||
|
|
||||||
|
foreach ( zone in level.bombzones )
|
||||||
|
{
|
||||||
|
if ( planted != zone && ( distance2d( goal, zone.nearest_node.origin ) < distance2d( goal, planted.nearest_node.origin ) ) )
|
||||||
|
{
|
||||||
|
self cancelgoal( "sd_defend" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( self atgoal( "sd_defend" ) || self bot_need_to_defuse() )
|
||||||
|
{
|
||||||
|
bot_sd_defender_think( zone );
|
||||||
|
|
||||||
|
if ( self hasgoal( "sd_defend" ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self hasgoal( "enemy_patrol" ) )
|
||||||
|
{
|
||||||
|
goal = self getgoal( "enemy_patrol" );
|
||||||
|
closezone = sd_get_closest_bomb();
|
||||||
|
|
||||||
|
if ( distancesquared( goal, closezone.nearest_node.origin ) < 262144 )
|
||||||
|
{
|
||||||
|
self clearlookat();
|
||||||
|
self cancelgoal( "sd_defend" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self hasgoal( "sd_defend" ) )
|
||||||
|
{
|
||||||
|
self.bot[ "patrol_update" ] = getTime() + randomintrange( 2500, 5000 );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self hasgoal( "enemy_patrol" ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nodes = getvisiblenodes( zone.nearest_node );
|
||||||
|
best = undefined;
|
||||||
|
highest = -100;
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
while ( i < nodes.size )
|
||||||
|
{
|
||||||
|
if ( nodes[ i ].type == "BAD NODE" || !canclaimnode( nodes[ i ], self.team ) || ( distancesquared( nodes[ i ].origin, self.origin ) < 65536 ) || ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "sd_defend", nodes[ i ].origin, 256 ) > 0 ) )
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
height = nodes[ i ].origin[ 2 ] - zone.nearest_node.origin[ 2 ];
|
||||||
|
|
||||||
|
if ( is_true( isplanted ) )
|
||||||
|
{
|
||||||
|
dist = distance2d( nodes[ i ].origin, zone.nearest_node.origin );
|
||||||
|
score = ( 10000 - dist ) + height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
score = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( score > highest )
|
||||||
|
{
|
||||||
|
highest = score;
|
||||||
|
best = nodes[ i ];
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isDefined( best ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self addgoal( best, 24, 3, "sd_defend" );
|
||||||
|
}
|
||||||
|
|
||||||
|
bot_get_look_at() //checked matches cebrerus output
|
||||||
|
{
|
||||||
|
enemy = self maps\mp\bots\_bot::bot_get_closest_enemy( self.origin, 1 );
|
||||||
|
|
||||||
|
if ( isDefined( enemy ) )
|
||||||
|
{
|
||||||
|
node = getvisiblenode( self.origin, enemy.origin );
|
||||||
|
|
||||||
|
if ( isDefined( node ) && ( distancesquared( self.origin, node.origin ) > 16384 ) )
|
||||||
|
{
|
||||||
|
return node.origin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enemies = self maps\mp\bots\_bot::bot_get_enemies( 0 );
|
||||||
|
|
||||||
|
if ( enemies.size )
|
||||||
|
{
|
||||||
|
enemy = random( enemies );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isDefined( enemy ) )
|
||||||
|
{
|
||||||
|
node = getvisiblenode( self.origin, enemy.origin );
|
||||||
|
|
||||||
|
if ( isDefined( node ) && ( distancesquared( self.origin, node.origin ) > 16384 ) )
|
||||||
|
{
|
||||||
|
return node.origin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zone = sd_get_closest_bomb();
|
||||||
|
node = getvisiblenode( self.origin, zone.nearest_node.origin );
|
||||||
|
|
||||||
|
if ( isDefined( node ) && ( distancesquared( self.origin, node.origin ) > 16384 ) )
|
||||||
|
{
|
||||||
|
return node.origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
forward = anglesToForward( self getplayerangles() );
|
||||||
|
origin = self geteye() + ( forward * 1024 );
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
bot_sd_defender_think( zone ) //checked matches cerberus output
|
||||||
|
{
|
||||||
|
if ( self bot_need_to_defuse() )
|
||||||
|
{
|
||||||
|
if ( self maps\mp\bots\_bot::bot_friend_goal_in_radius( "sd_defuse", level.sdbombmodel.origin, 16 ) > 0 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self clearlookat();
|
||||||
|
goal = self getgoal( "sd_defuse" );
|
||||||
|
|
||||||
|
if ( isDefined( goal ) && ( distancesquared( self.origin, goal ) < 2304 ) )
|
||||||
|
{
|
||||||
|
self setstance( "prone" );
|
||||||
|
wait 0.5;
|
||||||
|
self pressusebutton( level.defusetime + 1 );
|
||||||
|
wait 0.5;
|
||||||
|
|
||||||
|
if ( is_true( self.isdefusing ) )
|
||||||
|
{
|
||||||
|
wait ( level.defusetime + 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
self pressusebutton( 0 );
|
||||||
|
self setstance( "crouch" );
|
||||||
|
wait 0.25;
|
||||||
|
self cancelgoal( "sd_defuse" );
|
||||||
|
self setstance( "stand" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isDefined( goal ) && ( distance2dsquared( self.origin, level.sdbombmodel.origin ) < 1000000 ) )
|
||||||
|
{
|
||||||
|
self addgoal( level.sdbombmodel.origin, 24, 4, "sd_defuse" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( getTime() > self.bot[ "patrol_update" ] )
|
||||||
|
{
|
||||||
|
if ( cointoss() )
|
||||||
|
{
|
||||||
|
self clearlookat();
|
||||||
|
self cancelgoal( "sd_defend" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.bot[ "patrol_update" ] = getTime() + randomintrange( 2500, 5000 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self hasgoal( "enemy_patrol" ) )
|
||||||
|
{
|
||||||
|
goal = self getgoal( "enemy_patrol" );
|
||||||
|
zone = sd_get_closest_bomb();
|
||||||
|
|
||||||
|
if ( distancesquared( goal, zone.nearest_node.origin ) < 262144 )
|
||||||
|
{
|
||||||
|
self clearlookat();
|
||||||
|
self cancelgoal( "sd_defend" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( getTime() > self.bot[ "lookat_update" ] )
|
||||||
|
{
|
||||||
|
origin = self bot_get_look_at();
|
||||||
|
z = 20;
|
||||||
|
|
||||||
|
if ( distancesquared( origin, self.origin ) > 262144 )
|
||||||
|
{
|
||||||
|
z = randomintrange( 16, 60 );
|
||||||
|
}
|
||||||
|
|
||||||
|
self lookat( origin + ( 0, 0, z ) );
|
||||||
|
self.bot[ "lookat_update" ] = getTime() + randomintrange( 1500, 3000 );
|
||||||
|
|
||||||
|
if ( distancesquared( origin, self.origin ) > 65536 )
|
||||||
|
{
|
||||||
|
dir = vectornormalize( self.origin - origin );
|
||||||
|
dir = vectorScale( dir, 256 );
|
||||||
|
origin += dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
self maps\mp\bots\_bot_combat::bot_combat_throw_proximity( origin );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bot_need_to_defuse() //checked changed at own discretion
|
||||||
|
{
|
||||||
|
if ( level.bombplanted && self.team == game[ "defenders" ] )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sd_get_bomb_goal( ent ) //checked changed to match cerberus output
|
||||||
|
{
|
||||||
|
goals = [];
|
||||||
|
dir = anglesToForward( ent.angles );
|
||||||
|
dir = vectorScale( dir, 32 );
|
||||||
|
goals[ 0 ] = ent.origin + dir;
|
||||||
|
goals[ 1 ] = ent.origin - dir;
|
||||||
|
dir = anglesToRight( ent.angles );
|
||||||
|
dir = vectorScale( dir, 48 );
|
||||||
|
goals[ 2 ] = ent.origin + dir;
|
||||||
|
goals[ 3 ] = ent.origin - dir;
|
||||||
|
goals = array_randomize( goals );
|
||||||
|
|
||||||
|
foreach ( goal in goals )
|
||||||
|
{
|
||||||
|
if ( findpath( self.origin, goal, 0 ) )
|
||||||
|
{
|
||||||
|
return goal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
sd_get_time_frac() //checked matches cerberus output
|
||||||
|
{
|
||||||
|
remaining = maps\mp\gametypes\_globallogic_utils::gettimeremaining();
|
||||||
|
end = ( level.timelimit * 60 ) * 1000;
|
||||||
|
|
||||||
|
if ( end == 0 )
|
||||||
|
{
|
||||||
|
end = self.spawntime + 120000;
|
||||||
|
remaining = end - getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1 - ( remaining / end );
|
||||||
|
}
|
||||||
|
|
||||||
|
sd_get_closest_bomb() //checked partially changed to match cerberus output did not use continue see github for more info
|
||||||
|
{
|
||||||
|
best = undefined;
|
||||||
|
distsq = 9999999;
|
||||||
|
|
||||||
|
foreach ( zone in level.bombzones )
|
||||||
|
{
|
||||||
|
d = distancesquared( self.origin, zone.curorigin );
|
||||||
|
|
||||||
|
if ( !isDefined( best ) )
|
||||||
|
{
|
||||||
|
best = zone;
|
||||||
|
distsq = d;
|
||||||
|
}
|
||||||
|
else if ( d < distsq )
|
||||||
|
{
|
||||||
|
best = zone;
|
||||||
|
distsq = d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return best;
|
||||||
|
}
|
||||||
|
|
||||||
|
sd_get_planted_zone() //checked changed to match cerberus output
|
||||||
|
{
|
||||||
|
if ( level.bombplanted )
|
||||||
|
{
|
||||||
|
foreach ( zone in level.bombzones )
|
||||||
|
{
|
||||||
|
if ( zone.interactteam == "none" )
|
||||||
|
{
|
||||||
|
return zone;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
bot_sd_grenade() //checked changed to match cerberus output
|
||||||
|
{
|
||||||
|
enemies = bot_get_enemies();
|
||||||
|
|
||||||
|
if ( !enemies.size )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
zone = sd_get_closest_bomb();
|
||||||
|
|
||||||
|
foreach ( enemy in enemies )
|
||||||
|
{
|
||||||
|
if ( distancesquared( enemy.origin, zone.nearest_node.origin ) < 147456 )
|
||||||
|
{
|
||||||
|
if ( !self maps\mp\bots\_bot_combat::bot_combat_throw_lethal( enemy.origin ) )
|
||||||
|
{
|
||||||
|
self maps\mp\bots\_bot_combat::bot_combat_throw_tactical( enemy.origin );
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user