From 3ca2e035b67241b27e55e0ce6f630832432896c7 Mon Sep 17 00:00:00 2001 From: ineedbots Date: Fri, 3 Sep 2021 22:41:22 -0600 Subject: [PATCH] Fix sd --- raw/scripts/mp/botwarfare-compiled.gsc | Bin 12168 -> 19062 bytes raw/scripts/mp/botwarfare.gsc | 503 ++++++++++++++++++++++++- 2 files changed, 502 insertions(+), 1 deletion(-) diff --git a/raw/scripts/mp/botwarfare-compiled.gsc b/raw/scripts/mp/botwarfare-compiled.gsc index 68e243e42f002fc0c3c8cb1f8a3ee664ef86f064..99199037397b119c2b1c9be5b376bee8fcb5e915 100644 GIT binary patch literal 19062 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
tyfI`b?Z{vggN>y{J%| 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 F{x4*aldu2) diff --git a/raw/scripts/mp/botwarfare.gsc b/raw/scripts/mp/botwarfare.gsc index 2ad1596..cf0bfb1 100644 --- a/raw/scripts/mp/botwarfare.gsc +++ b/raw/scripts/mp/botwarfare.gsc @@ -5,6 +5,13 @@ 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 */ @@ -87,7 +94,7 @@ fixGamemodes() wait 0.25; 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; } + + + + +// _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; + } + } +}