From 4aba1289f234335e071a282768dc84d550ba32f7 Mon Sep 17 00:00:00 2001 From: ineed bots Date: Tue, 19 Dec 2023 19:24:07 -0600 Subject: [PATCH] always use curly braces --- maps/bots/_bot.gsc | 114 ++++++++++++-- maps/bots/_bot_debug.gsc | 22 +++ maps/bots/_bot_internal.gsc | 296 ++++++++++++++++++++++++++++++++++++ maps/bots/_bot_script.gsc | 36 +++++ maps/bots/_bot_utility.gsc | 114 ++++++++++++++ 5 files changed, 572 insertions(+), 10 deletions(-) diff --git a/maps/bots/_bot.gsc b/maps/bots/_bot.gsc index 2f139fe..8b1e945 100644 --- a/maps/bots/_bot.gsc +++ b/maps/bots/_bot.gsc @@ -10,82 +10,132 @@ init() level.bw_version = "z0.1"; if ( getdvar( "bots_main" ) == "" ) + { setdvar( "bots_main", true ); + } if ( !getdvarint( "bots_main" ) ) + { return; + } if ( !wait_for_builtins() ) + { println( "FATAL: NO BUILT-INS FOR BOTS" ); + } thread load_waypoints(); thread hook_callbacks(); if ( getdvar( "bots_main_GUIDs" ) == "" ) - setdvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated + { + setdvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated + } if ( getdvar( "bots_main_firstIsHost" ) == "" ) - setdvar( "bots_main_firstIsHost", false ); //first player to connect is a host + { + setdvar( "bots_main_firstIsHost", false ); //first player to connect is a host + } if ( getdvar( "bots_main_waitForHostTime" ) == "" ) - setdvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player + { + setdvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player + } if ( getdvar( "bots_main_kickBotsAtEnd" ) == "" ) - setdvar( "bots_main_kickBotsAtEnd", false ); //kicks the bots at game end + { + setdvar( "bots_main_kickBotsAtEnd", false ); //kicks the bots at game end + } if ( getdvar( "bots_manage_add" ) == "" ) - setdvar( "bots_manage_add", 0 ); //amount of bots to add to the game + { + setdvar( "bots_manage_add", 0 ); //amount of bots to add to the game + } if ( getdvar( "bots_manage_fill" ) == "" ) - setdvar( "bots_manage_fill", 0 ); //amount of bots to maintain + { + setdvar( "bots_manage_fill", 0 ); //amount of bots to maintain + } if ( getdvar( "bots_manage_fill_mode" ) == "" ) - setdvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 + { + setdvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 + } if ( getdvar( "bots_manage_fill_kick" ) == "" ) - setdvar( "bots_manage_fill_kick", false ); //kick bots if too many + { + setdvar( "bots_manage_fill_kick", false ); //kick bots if too many + } if ( getdvar( "bots_skill" ) == "" ) - setdvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random + { + setdvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random + } if ( getdvar( "bots_skill_hard" ) == "" ) - setdvar( "bots_skill_hard", 0 ); //amount of hard bots on axis team + { + setdvar( "bots_skill_hard", 0 ); //amount of hard bots on axis team + } if ( getdvar( "bots_skill_med" ) == "" ) + { setdvar( "bots_skill_med", 0 ); + } if ( getdvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random + { setdvar( "bots_loadout_rank", -1 ); + } if ( getdvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random + { setdvar( "bots_loadout_prestige", -1 ); + } if ( getdvar( "bots_play_move" ) == "" ) //bots move + { setdvar( "bots_play_move", true ); + } if ( getdvar( "bots_play_knife" ) == "" ) //bots knife + { setdvar( "bots_play_knife", true ); + } if ( getdvar( "bots_play_fire" ) == "" ) //bots fire + { setdvar( "bots_play_fire", true ); + } if ( getdvar( "bots_play_nade" ) == "" ) //bots grenade + { setdvar( "bots_play_nade", true ); + } if ( getdvar( "bots_play_ads" ) == "" ) //bot ads + { setdvar( "bots_play_ads", true ); + } if ( getdvar( "bots_play_aim" ) == "" ) + { setdvar( "bots_play_aim", true ); + } 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; + } level.bots_minsprintdistance = 315; level.bots_minsprintdistance *= level.bots_minsprintdistance; @@ -133,12 +183,16 @@ handleBots() level addBots(); while ( !isdefined( level.intermission ) || !level.intermission ) + { wait 0.05; + } setdvar( "bots_manage_add", getBotArray().size ); if ( !getdvarint( "bots_main_kickBotsAtEnd" ) ) + { return; + } bots = getBotArray(); @@ -258,7 +312,9 @@ connected() self endon( "disconnect" ); if ( !isdefined( self.pers[ "bot_host" ] ) ) + { self thread doHostCheck(); + } level.players[ level.players.size ] = self; self thread onDisconnectAll(); @@ -266,7 +322,9 @@ connected() self thread onSpawnedAll(); if ( !self is_bot() ) + { return; + } if ( !isdefined( self.pers[ "isBot" ] ) ) { @@ -307,25 +365,39 @@ watchBotDebugEvent() big_str = "Bot Warfare debug: " + self.playername + ": " + msg; if ( isdefined( str ) && isstring( str ) ) + { big_str += ", " + str; + } if ( isdefined( b ) && isstring( b ) ) + { big_str += ", " + b; + } if ( isdefined( c ) && isstring( c ) ) + { big_str += ", " + c; + } if ( isdefined( d ) && isstring( d ) ) + { big_str += ", " + d; + } if ( isdefined( e ) && isstring( e ) ) + { big_str += ", " + e; + } if ( isdefined( f ) && isstring( f ) ) + { big_str += ", " + f; + } if ( isdefined( g ) && isstring( g ) ) + { big_str += ", " + g; + } BotBuiltinPrintConsole( big_str ); } @@ -383,10 +455,14 @@ diffBots_loop() player = level.players[ i ]; if ( !isdefined( player.pers[ "team" ] ) ) + { continue; + } if ( !player is_bot() ) + { continue; + } if ( hard < var_hard ) { @@ -399,7 +475,9 @@ diffBots_loop() player.pers[ "bots" ][ "skill" ][ "base" ] = 4; } else + { player.pers[ "bots" ][ "skill" ][ "base" ] = 1; + } } } else if ( var_skill != 0 && var_skill != 9 ) @@ -411,7 +489,9 @@ diffBots_loop() player = level.players[ i ]; if ( !player is_bot() ) + { continue; + } player.pers[ "bots" ][ "skill" ][ "base" ] = var_skill; } @@ -443,7 +523,9 @@ addBots_loop() setdvar( "bots_manage_add", 0 ); if ( botsToAdd > 4 ) + { botsToAdd = 4; + } for ( ; botsToAdd > 0; botsToAdd-- ) { @@ -455,7 +537,9 @@ addBots_loop() fillMode = getdvarint( "bots_manage_fill_mode" ); if ( fillMode == 2 || fillMode == 3 ) + { setdvar( "bots_manage_fill", getGoodMapAmount() ); + } fillAmount = getdvarint( "bots_manage_fill" ); @@ -469,24 +553,34 @@ addBots_loop() player = level.players[ i ]; if ( player is_bot() ) + { bots++; + } else + { players++; + } } amount = bots; if ( fillMode == 0 || fillMode == 2 ) + { amount += players; + } if ( amount < fillAmount ) + { setdvar( "bots_manage_add", 1 ); + } else if ( amount > fillAmount && getdvarint( "bots_manage_fill_kick" ) ) { tempBot = getBotToKick(); if ( isdefined( tempBot ) ) + { BotBuiltinCmdExec( "clientkick " + tempBot getentitynumber() ); + } } } diff --git a/maps/bots/_bot_debug.gsc b/maps/bots/_bot_debug.gsc index d2f3d4c..91e470d 100644 --- a/maps/bots/_bot_debug.gsc +++ b/maps/bots/_bot_debug.gsc @@ -13,10 +13,14 @@ init() { if ( getdvar( "bots_main_debug" ) == "" ) + { setdvar( "bots_main_debug", 0 ); + } if ( !getdvarint( "bots_main_debug" ) || !getdvarint( "bots_main_debug_wp_vis" ) ) + { return; + } if ( !getdvarint( "developer" ) ) { @@ -37,16 +41,24 @@ init() setdvar( "bots_manage_fill_spec", true ); if ( getdvar( "bots_main_debug_distance" ) == "" ) + { setdvar( "bots_main_debug_distance", 512.0 ); + } if ( getdvar( "bots_main_debug_cone" ) == "" ) + { setdvar( "bots_main_debug_cone", 0.65 ); + } if ( getdvar( "bots_main_debug_minDist" ) == "" ) + { setdvar( "bots_main_debug_minDist", 32.0 ); + } if ( getdvar( "bots_main_debug_drawThrough" ) == "" ) + { setdvar( "bots_main_debug_drawThrough", false ); + } thread load_waypoints(); @@ -113,7 +125,9 @@ array_contains( arr, it ) for ( i = 0; i < arr.size; i++ ) { if ( arr[ i ] == it ) + { return true; + } } return false; @@ -202,7 +216,9 @@ debug() for ( i = 0; i < level.waypointcount; i++ ) { if ( closest == -1 || closer( self.origin, level.waypoints[ i ].origin, level.waypoints[ closest ].origin ) ) + { closest = i; + } wpOrg = level.waypoints[ i ].origin + ( 0, 0, 25 ); @@ -228,7 +244,9 @@ debug() } if ( found ) + { continue; + } } line( wpOrg, linked[ h ].origin + ( 0, 0, 25 ), ( 1, 0, 1 ) ); @@ -245,9 +263,13 @@ debug() } if ( distance( self.origin, level.waypoints[ closest ].origin ) < 64 ) + { self.closest = closest; + } else + { self.closest = -1; + } } } diff --git a/maps/bots/_bot_internal.gsc b/maps/bots/_bot_internal.gsc index 8671f08..2ab0e87 100644 --- a/maps/bots/_bot_internal.gsc +++ b/maps/bots/_bot_internal.gsc @@ -152,10 +152,14 @@ onPlayerSpawned() IsWeapSniper( weap ) { if ( weap == "none" ) + { return false; + } if ( false /*maps\mp\gametypes\_missions::getWeaponClass( weap ) != "weapon_sniper"*/ ) + { return false; + } return true; } @@ -180,7 +184,9 @@ onWeaponChange() newWeapon = self getcurrentweapon(); } else + { self waittill( "weapon_change", newWeapon ); + } self.bot.is_cur_full_auto = WeaponIsFullAuto( newWeapon ); self.bot.cur_weap_dist_multi = SetWeaponDistMulti( newWeapon ); @@ -194,7 +200,9 @@ onWeaponChange() SetWeaponDistMulti( weap ) { if ( weap == "none" ) + { return 1; + } switch ( weaponclass( weap ) ) { @@ -240,15 +248,21 @@ reload_watch_loop() ret = self waittill_any_timeout( 7.5, "reload" ); if ( ret == "timeout" ) + { break; + } weap = self getcurrentweapon(); if ( weap == "none" ) + { break; + } if ( self getweaponammoclip( weap ) >= weaponclipsize( weap ) ) + { break; + } } self.bot.isreloading = false; @@ -309,13 +323,19 @@ onNewEnemy() self waittill( "new_enemy" ); if ( !isdefined( self.bot.target ) ) + { continue; + } if ( !isdefined( self.bot.target.entity ) || !isai( self.bot.target.entity ) ) + { continue; + } if ( self.bot.target.didlook ) + { continue; + } self thread watchToLook(); } @@ -333,47 +353,73 @@ watchToLook() for ( ;; ) { while ( isdefined( self.bot.target ) && self.bot.target.didlook ) + { wait 0.05; + } while ( isdefined( self.bot.target ) && self.bot.target.no_trace_time ) + { wait 0.05; + } if ( !isdefined( self.bot.target ) ) + { break; + } self.bot.target.didlook = true; if ( self.bot.isfrozen ) + { continue; + } if ( self.bot.target.dist > level.bots_maxshotgundistance * 2 ) + { continue; + } if ( self.bot.target.dist <= level.bots_maxknifedistance ) + { continue; + } if ( !self canFire( self getcurrentweapon() ) ) + { continue; + } if ( !self isInRange( self.bot.target.dist, self getcurrentweapon() ) ) + { continue; + } if ( self.bot.is_cur_sniper ) + { continue; + } if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "jump" ] ) + { continue; + } if ( !getdvarint( "bots_play_jumpdrop" ) ) + { continue; + } if ( isdefined( self.bot.jump_time ) && gettime() - self.bot.jump_time <= 5000 ) + { continue; + } if ( self.bot.target.rand <= self.pers[ "bots" ][ "behavior" ][ "strafe" ] ) { if ( self getstance() != "stand" ) + { continue; + } self.bot.jump_time = gettime(); self jump(); @@ -381,7 +427,9 @@ watchToLook() else { if ( getConeDot( self.bot.target.last_seen_pos, self.origin, self getplayerangles() ) < 0.8 || self.bot.target.dist <= level.bots_noadsdistance ) + { continue; + } self.bot.jump_time = gettime(); self prone(); @@ -400,18 +448,26 @@ stance_loop() self.bot.climbing = false; if ( self.bot.isfrozen ) + { return; + } toStance = "stand"; if ( self.bot.next_wp != -1 ) + { toStance = level.waypoints[ self.bot.next_wp ].type; + } if ( !isdefined( toStance ) ) + { toStance = "stand"; + } if ( toStance == "stand" && randomint( 100 ) <= self.pers[ "bots" ][ "behavior" ][ "crouch" ] ) + { toStance = "crouch"; + } if ( toStance == "climb" ) { @@ -420,41 +476,63 @@ stance_loop() } if ( toStance != "stand" && toStance != "crouch" && toStance != "prone" ) + { toStance = "crouch"; + } toStance = "stand"; //Hack to make the bots never crouch if ( toStance == "stand" ) + { self stand(); + } else if ( toStance == "crouch" ) + { self crouch(); + } else + { self prone(); + } curweap = self getcurrentweapon(); time = gettime(); chance = self.pers[ "bots" ][ "behavior" ][ "sprint" ]; if ( time - self.lastspawntime < 5000 ) + { chance *= 2; + } if ( isdefined( self.bot.script_goal ) && distancesquared( self.origin, self.bot.script_goal ) > 256 * 256 ) + { chance *= 2; + } if ( toStance != "stand" || self.bot.isreloading || self.bot.issprinting || self.bot.isfraggingafter || self.bot.issmokingafter ) + { return; + } if ( randomint( 100 ) > chance ) + { return; + } if ( isdefined( self.bot.target ) && self canFire( curweap ) && self isInRange( self.bot.target.dist, curweap ) ) + { return; + } if ( self.bot.sprintendtime != -1 && time - self.bot.sprintendtime < 2000 ) + { return; + } if ( !isdefined( self.bot.towards_goal ) || distancesquared( self.origin, physicstrace( self geteye(), self geteye() + anglestoforward( self getplayerangles() ) * 1024, false, undefined ) ) < level.bots_minsprintdistance || getConeDot( self.bot.towards_goal, self.origin, self getplayerangles() ) < 0.75 ) + { return; + } self thread sprint(); self thread setBotWantSprint(); @@ -521,21 +599,29 @@ reload_thread() wait 2.5; if ( isdefined( self.bot.target ) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.issmokingafter || self.bot.isfrozen ) + { return; + } cur = self getcurrentweapon(); if ( cur == "" || cur == "none" ) + { return; + } if ( isweaponcliponly( cur ) || !self getweaponammostock( cur ) ) + { return; + } maxsize = weaponclipsize( cur ); cursize = self getweaponammoclip( cur ); if ( cursize / maxsize < 0.5 ) + { self thread reload(); + } } target_cleanup() @@ -574,7 +660,9 @@ watchHoldBreath() wait 1; if ( self.bot.isfrozen ) + { continue; + } self holdbreath( self playerads() > 0 ); } @@ -657,12 +745,16 @@ doBotMovement_loop( data ) { // check if need to crouch if ( bullettracepassed( startPos - ( 0, 0, 25 ), startPosForward - ( 0, 0, 25 ), false, self ) && !self.bot.climbing ) + { self crouch(); + } } // move! if ( ( self.bot.wantsprint && self.bot.issprinting ) || isdefined( self.bot.knifing_target ) ) + { dir = ( 127, dir[ 1 ], 0 ); + } self BotBuiltinBotMovement( int( dir[ 0 ] ), int( dir[ 1 ] ) ); } @@ -680,24 +772,36 @@ bot_lookat( pos, time, vel, doAimPredict ) level endon ( "intermission" ); if ( ( isdefined( level.intermission ) && level.intermission ) || self.bot.isfrozen || !getdvarint( "bots_play_aim" ) ) + { return; + } if ( !isdefined( pos ) ) + { return; + } if ( !isdefined( doAimPredict ) ) + { doAimPredict = false; + } if ( !isdefined( time ) ) + { time = 0.05; + } if ( !isdefined( vel ) ) + { vel = ( 0, 0, 0 ); + } steps = int( time * 20 ); if ( steps < 1 ) + { steps = 1; + } myEye = self geteye(); // get our eye pos @@ -731,7 +835,9 @@ bot_lookat( pos, time, vel, doAimPredict ) canFire( curweap ) { if ( curweap == "none" ) + { return false; + } return self getweaponammoclip( curweap ); } @@ -742,15 +848,21 @@ canFire( curweap ) isInRange( dist, curweap ) { if ( curweap == "none" ) + { return false; + } weapclass = weaponclass( curweap ); if ( weapclass == "spread" && dist > level.bots_maxshotgundistance ) + { return false; + } if ( curweap == "m2_flamethrower_mp" && dist > level.bots_maxshotgundistance ) + { return false; + } return true; } @@ -761,23 +873,33 @@ isInRange( dist, curweap ) canAds( dist, curweap ) { if ( curweap == "none" ) + { return false; + } if ( !getdvarint( "bots_play_ads" ) ) + { return false; + } far = level.bots_noadsdistance; if ( self hasperk( "specialty_bulletaccuracy" ) ) + { far *= 1.4; + } if ( dist < far ) + { return false; + } weapclass = ( weaponclass( curweap ) ); if ( weapclass == "spread" || weapclass == "grenade" ) + { return false; + } return true; } @@ -822,7 +944,9 @@ target_loop() if ( i == -1 ) { if ( !isdefined( self.bot.script_target ) ) + { continue; + } ent = self.bot.script_target; key = ent getentitynumber() + ""; @@ -832,7 +956,9 @@ target_loop() entOrigin = ent.origin; if ( isdefined( self.bot.script_target_offset ) ) + { entOrigin += self.bot.script_target_offset; + } if ( bullettracepassed( myEye, entOrigin, false, ent ) ) { @@ -849,7 +975,9 @@ target_loop() else { if ( !isObjDef ) + { continue; + } self targetObjUpdateNoTrace( obj ); @@ -930,7 +1058,9 @@ target_loop() else { if ( !isObjDef ) + { continue; + } self targetObjUpdateNoTrace( obj ); @@ -943,10 +1073,14 @@ target_loop() } if ( !isdefined( obj ) ) + { continue; + } if ( theTime - obj.time < initReactTime ) + { continue; + } timeDiff = theTime - obj.trace_time_time; @@ -957,11 +1091,15 @@ target_loop() } if ( timeDiff == bestTime ) + { bestTargets[ key ] = obj; + } } if ( hasTarget && isdefined( bestTargets[ self.bot.target.entity getentitynumber() + "" ] ) ) + { return; + } closest = 2147483647; toBeTarget = undefined; @@ -973,7 +1111,9 @@ target_loop() theDist = bestTargets[ bestKeys[ i ] ].dist; if ( theDist > closest ) + { continue; + } closest = theDist; toBeTarget = bestTargets[ bestKeys[ i ] ]; @@ -983,10 +1123,14 @@ target_loop() newTargetID = -1; if ( hasTarget && isdefined( self.bot.target.entity ) ) + { beforeTargetID = self.bot.target.entity getentitynumber(); + } if ( isdefined( toBeTarget ) && isdefined( toBeTarget.entity ) ) + { newTargetID = toBeTarget.entity getentitynumber(); + } if ( beforeTargetID != newTargetID ) { @@ -1047,7 +1191,9 @@ updateBones() self waittill_notify_or_timeout( "new_enemy", waittime ); if ( !isdefined( self.bot.target ) || !isdefined( self.bot.target.entity ) ) + { continue; + } self.bot.target.bone = selectBoneForTarget( self.bot.target.entity, bones ); } @@ -1086,20 +1232,28 @@ updateAimOffset( obj ) diffAimAmount = self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ]; if ( diffAimAmount > 0 ) + { obj.aim_offset_base = ( randomfloatrange( 0 - diffAimAmount, diffAimAmount ), randomfloatrange( 0 - diffAimAmount, diffAimAmount ), randomfloatrange( 0 - diffAimAmount, diffAimAmount ) ); + } else + { obj.aim_offset_base = ( 0, 0, 0 ); + } } aimDiffTime = self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] * 1000; objCreatedFor = obj.trace_time; if ( objCreatedFor >= aimDiffTime ) + { offsetScalar = 0; + } else + { offsetScalar = 1 - objCreatedFor / aimDiffTime; + } obj.aim_offset = obj.aim_offset_base * offsetScalar; } @@ -1122,9 +1276,13 @@ targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj ) if ( !isScriptObj ) { if ( daDist > distMax ) + { timeMulti = 0; + } else if ( daDist > distClose ) + { timeMulti = 1 - ( ( daDist - distClose ) / ( distMax - distClose ) ); + } } obj.no_trace_time = 0; @@ -1209,12 +1367,16 @@ aim_loop() offset = self.bot.target.offset; if ( !isdefined( offset ) ) + { offset = ( 0, 0, 0 ); + } aimoffset = self.bot.target.aim_offset; if ( !isdefined( aimoffset ) ) + { aimoffset = ( 0, 0, 0 ); + } dist = self.bot.target.dist; rand = self.bot.target.rand; @@ -1225,16 +1387,24 @@ aim_loop() bone = self.bot.target.bone; if ( !isdefined( bone ) ) + { bone = "j_spineupper"; + } if ( self.bot.isfraggingafter || self.bot.issmokingafter ) + { nadeAimOffset = dist / 3000; + } else if ( curweap != "none" && weaponclass( curweap ) == "grenade" ) { if ( true /*maps\mp\gametypes\_missions::getWeaponClass( curweap ) == "weapon_projectile"*/ ) + { nadeAimOffset = dist / 16000; + } else + { nadeAimOffset = dist / 3000; + } } if ( no_trace_time && ( !isdefined( self.bot.after_target ) || self.bot.after_target != target ) ) @@ -1253,12 +1423,18 @@ aim_loop() time = 0.5; if ( nade == "stielhandgranate" ) + { time = 2; + } if ( !isSecondaryGrenade( nade ) ) + { self thread frag( time ); + } else + { self thread smoke( time ); + } self notify( "kill_goal" ); } @@ -1270,7 +1446,9 @@ aim_loop() if ( self canFire( curweap ) && self isInRange( dist, curweap ) && self canAds( dist, curweap ) ) { if ( !self.bot.is_cur_sniper || !self.pers[ "bots" ][ "behavior" ][ "quickscope" ] ) + { self thread pressADS(); + } } } @@ -1285,7 +1463,9 @@ aim_loop() aimpos = target gettagorigin( bone ); if ( !isdefined( aimpos ) ) + { return; + } aimpos += offset; aimpos += aimoffset; @@ -1294,11 +1474,17 @@ aim_loop() conedot = getConeDot( aimpos, eyePos, angles ); if ( isdefined( self.bot.knifing_target ) ) + { self thread bot_lookat( target gettagorigin( "j_spine4" ), 0.05 ); + } else if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) + { self thread bot_lookat( aimpos, 0.05 ); + } else + { self thread bot_lookat( aimpos, aimspeed, target getaivelocity(), true ); + } } else { @@ -1310,9 +1496,13 @@ aim_loop() conedot = getConeDot( aimpos, eyePos, angles ); if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) + { self thread bot_lookat( aimpos, 0.05 ); + } else + { self thread bot_lookat( aimpos, aimspeed ); + } } if ( isact && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxknifedistance && trace_time > reaction_time && !self.bot.isreloading && getdvarint( "bots_play_knife" ) ) @@ -1323,7 +1513,9 @@ aim_loop() } if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) + { return; + } canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); @@ -1334,22 +1526,32 @@ aim_loop() if ( self.bot.is_cur_sniper ) { if ( self.pers[ "bots" ][ "behavior" ][ "quickscope" ] && self.bot.last_fire_time != -1 && gettime() - self.bot.last_fire_time < 1000 ) + { stopAdsOverride = true; + } else + { self notify( "kill_goal" ); + } } if ( !stopAdsOverride ) + { self thread pressADS(); + } } if ( trace_time > reaction_time ) { if ( ( !canADS || adsAmount >= 1.0 || self inLastStand() || self getstance() == "prone" ) && ( conedot > 0.99 || dist < level.bots_maxknifedistance ) && getdvarint( "bots_play_fire" ) ) + { self botFire(); + } if ( isact ) + { self thread start_bot_after_target( target ); + } } return; @@ -1364,13 +1566,19 @@ aim_loop() dist = distancesquared( self.origin, last_pos ); if ( self.bot.isfraggingafter || self.bot.issmokingafter ) + { nadeAimOffset = dist / 3000; + } else if ( curweap != "none" && weaponclass( curweap ) == "grenade" ) { if ( true /*maps\mp\gametypes\_missions::getWeaponClass( curweap ) == "weapon_projectile"*/ ) + { nadeAimOffset = dist / 16000; + } else + { nadeAimOffset = dist / 3000; + } } aimpos = last_pos + ( 0, 0, self getplayerviewheight() + nadeAimOffset ); @@ -1379,7 +1587,9 @@ aim_loop() self thread bot_lookat( aimpos, aimspeed ); if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) + { return; + } canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); @@ -1390,17 +1600,25 @@ aim_loop() if ( self.bot.is_cur_sniper ) { if ( self.pers[ "bots" ][ "behavior" ][ "quickscope" ] && self.bot.last_fire_time != -1 && gettime() - self.bot.last_fire_time < 1000 ) + { stopAdsOverride = true; + } else + { self notify( "kill_goal" ); + } } if ( !stopAdsOverride ) + { self thread pressADS(); + } } if ( ( !canADS || adsAmount >= 1.0 || self inLastStand() || self getstance() == "prone" ) && ( conedot > 0.95 || dist < level.bots_maxknifedistance ) && getdvarint( "bots_play_fire" ) ) + { self botFire(); + } return; } @@ -1420,12 +1638,18 @@ aim_loop() lookat = undefined; if ( self.bot.second_next_wp != -1 && !self.bot.issprinting && !self.bot.climbing ) + { lookat = level.waypoints[ self.bot.second_next_wp ].origin; + } else if ( isdefined( self.bot.towards_goal ) ) + { lookat = self.bot.towards_goal; + } if ( isdefined( lookat ) ) + { self thread bot_lookat( lookat + ( 0, 0, self getplayerviewheight() ), aimspeed ); + } } } @@ -1442,7 +1666,9 @@ aim() wait 0.05; if ( ( isdefined( level.intermission ) && level.intermission ) || self.bot.isfrozen ) + { continue; + } self aim_loop(); } @@ -1463,10 +1689,14 @@ walk() self botSetMoveTo( self.origin ); if ( !getdvarint( "bots_play_move" ) ) + { continue; + } if ( ( isdefined( level.intermission ) && level.intermission ) || self.bot.isfrozen || self.bot.stop_move ) + { continue; + } self walk_loop(); } @@ -1491,10 +1721,14 @@ walk_loop() if ( isai( self.bot.target.entity ) && self.bot.target.trace_time && self canFire( curweap ) && self isInRange( self.bot.target.dist, curweap ) ) { if ( self inLastStand() || self getstance() == "prone" || ( self.bot.is_cur_sniper && self playerads() > 0 ) ) + { return; + } if ( self.bot.target.rand <= self.pers[ "bots" ][ "behavior" ][ "strafe" ] ) + { self strafe( self.bot.target.entity ); + } return; } @@ -1516,7 +1750,9 @@ walk_loop() else { if ( shouldTarget ) + { goal = self.bot.target.last_seen_pos; + } self notify( "new_goal_internal" ); } @@ -1539,7 +1775,9 @@ doWalk( goal, dist, isScriptGoal ) dist *= dist; if ( isScriptGoal ) + { self thread doWalkScriptNotify(); + } self thread killWalkOnEvents(); self thread watchOnGoal( goal, dist ); @@ -1556,7 +1794,9 @@ doWalk( goal, dist, isScriptGoal ) // skip waypoints we already completed to prevent rubber banding if ( current > 0 && self.bot.astar[ current ] == self.bot.last_next_wp && self.bot.astar[ current - 1 ] == self.bot.last_second_next_wp ) + { current = self removeAStar(); + } if ( current >= 0 ) { @@ -1569,7 +1809,9 @@ doWalk( goal, dist, isScriptGoal ) self.bot.second_next_wp = -1; if ( current > 0 ) + { self.bot.second_next_wp = self.bot.astar[ current - 1 ]; + } self notify( "new_static_waypoint" ); @@ -1604,7 +1846,9 @@ doWalk( goal, dist, isScriptGoal ) wait 1; if ( distancesquared( self.origin, goal ) > dist ) + { self notify( "bad_path_internal" ); + } } /* @@ -1613,7 +1857,9 @@ doWalk( goal, dist, isScriptGoal ) movetowards( goal ) { if ( !isdefined( goal ) ) + { return; + } self.bot.towards_goal = goal; @@ -1623,9 +1869,13 @@ movetowards( goal ) time = 0; if ( self.bot.issprinting ) + { tempGoalDist = level.bots_goaldistance * 2; + } else + { tempGoalDist = level.bots_goaldistance; + } while ( distancesquared( self.origin, goal ) > tempGoalDist ) { @@ -1663,7 +1913,9 @@ movetowards( goal ) else if ( time == 2000 ) { if ( distancesquared( self.origin, lastOri ) < 32 * 32 ) + { self crouch(); + } } else if ( time == 1750 ) { @@ -1681,17 +1933,27 @@ movetowards( goal ) time += 50; if ( lengthsquared( self getvelocity() ) < 1000 ) + { timeslow += 50; + } else + { timeslow = 0; + } if ( self.bot.issprinting ) + { tempGoalDist = level.bots_goaldistance * 2; + } else + { tempGoalDist = level.bots_goaldistance; + } if ( stucks >= 2 ) + { self notify( "bad_path_internal" ); + } } self.bot.towards_goal = undefined; @@ -1720,7 +1982,9 @@ strafe( target ) strafe = traceLeft[ "position" ]; if ( traceRight[ "fraction" ] > traceLeft[ "fraction" ] ) + { strafe = traceRight[ "position" ]; + } self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; @@ -1815,9 +2079,13 @@ doWalkScriptNotify() self endon( "kill_goal" ); if ( self waittill_either_return( "goal_internal", "bad_path_internal" ) == "goal_internal" ) + { self notify( "goal" ); + } else + { self notify( "bad_path" ); + } } /* @@ -1846,7 +2114,9 @@ watchOnGoal( goal, dis ) self endon( "kill_goal" ); while ( distancesquared( self.origin, goal ) > dis ) + { wait 0.05; + } self notify( "goal_internal" ); } @@ -1870,12 +2140,16 @@ pressADS( time ) self endon( "bot_ads" ); if ( !isdefined( time ) ) + { time = 0.05; + } self BotBuiltinBotAction( "+ads" ); if ( time ) + { wait time; + } self BotBuiltinBotAction( "-ads" ); } @@ -1891,14 +2165,18 @@ frag( time ) self endon( "bot_frag" ); if ( !isdefined( time ) ) + { time = 0.05; + } self BotBuiltinBotAction( "+frag" ); self.bot.isfragging = true; self.bot.isfraggingafter = true; if ( time ) + { wait time; + } self BotBuiltinBotAction( "-frag" ); self.bot.isfragging = false; @@ -1913,9 +2191,13 @@ frag( time ) holdbreath( what ) { if ( what ) + { self BotBuiltinBotAction( "+holdbreath" ); + } else + { self BotBuiltinBotAction( "-holdbreath" ); + } } /* @@ -1929,14 +2211,18 @@ smoke( time ) self endon( "bot_smoke" ); if ( !isdefined( time ) ) + { time = 0.05; + } self BotBuiltinBotAction( "+smoke" ); self.bot.issmoking = true; self.bot.issmokingafter = true; if ( time ) + { wait time; + } self BotBuiltinBotAction( "-smoke" ); self.bot.issmoking = false; @@ -1974,7 +2260,9 @@ botFire() } if ( self.bot.semi_time ) + { return; + } self thread pressFire(); self thread doSemiTime(); @@ -2007,12 +2295,16 @@ pressFire( time ) self endon( "bot_fire" ); if ( !isdefined( time ) ) + { time = 0.05; + } self BotBuiltinBotAction( "+fire" ); if ( time ) + { wait time; + } self BotBuiltinBotAction( "-fire" ); } @@ -2112,12 +2404,16 @@ use( time ) self endon( "bot_use" ); if ( !isdefined( time ) ) + { time = 0.05; + } self BotBuiltinBotAction( "+activate" ); if ( time ) + { wait time; + } self BotBuiltinBotAction( "-activate" ); } diff --git a/maps/bots/_bot_script.gsc b/maps/bots/_bot_script.gsc index 51509cf..7852271 100644 --- a/maps/bots/_bot_script.gsc +++ b/maps/bots/_bot_script.gsc @@ -40,25 +40,39 @@ connected() onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) { if ( !isdefined( self ) || !isdefined( self.team ) ) + { return; + } if ( !isalive( self ) ) + { return; + } if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) + { return; + } if ( iDamage <= 0 ) + { return; + } if ( !isdefined( eAttacker ) || !isdefined( eAttacker.team ) ) + { return; + } if ( eAttacker == self ) + { return; + } if ( !isalive( eAttacker ) ) + { return; + } self SetAttacker( eAttacker ); } @@ -409,12 +423,16 @@ changeToWeapon( weap ) level endon( "game_ended" ); if ( !self hasweapon( weap ) ) + { return false; + } self switchtoweapon( weap ); if ( self getcurrentweapon() == weap ) + { return true; + } self waittill_any_timeout( 5, "weapon_change" ); @@ -429,29 +447,41 @@ doReloadCancel_loop() ret = self waittill_any_return( "reload", "weapon_change" ); if ( self BotIsFrozen() ) + { return; + } if ( self usebuttonpressed() ) + { return; + } if ( self inLastStand() ) + { return; + } curWeap = self getcurrentweapon(); if ( !self isWeaponPrimary( curWeap ) ) + { return; + } if ( ret == "reload" ) { // check single reloads if ( self getweaponammoclip( curWeap ) < weaponclipsize( curWeap ) ) + { return; + } } // check difficulty if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 3 ) + { return; + } // check if got another weapon weaponslist = self getweaponslistprimaries(); @@ -463,17 +493,23 @@ doReloadCancel_loop() weaponslist = array_remove( weaponslist, weapon ); if ( !self isWeaponPrimary( weapon ) ) + { continue; + } if ( curWeap == weapon || weapon == "none" || weapon == "" ) + { continue; + } weap = weapon; break; } if ( weap == "" ) + { return; + } // do the cancel wait 0.1; diff --git a/maps/bots/_bot_utility.gsc b/maps/bots/_bot_utility.gsc index 725fd45..013d29c 100644 --- a/maps/bots/_bot_utility.gsc +++ b/maps/bots/_bot_utility.gsc @@ -9,12 +9,18 @@ wait_for_builtins() for ( i = 0; i < 20; i++ ) { if ( isdefined( level.bot_builtins ) ) + { return true; + } if ( i < 18 ) + { waittillframeend; + } else + { wait 0.05; + } } return false; @@ -262,7 +268,9 @@ doHostCheck() self.pers[ "bot_host" ] = false; if ( self is_bot() ) + { return; + } result = false; @@ -276,7 +284,9 @@ doHostCheck() } if ( getdvar( "bots_main_firstIsHost" ) == self BotBuiltinGetGuid() + "" ) + { result = true; + } } DvarGUID = getdvar( "bots_main_GUIDs" ); @@ -288,12 +298,16 @@ doHostCheck() for ( i = 0; i < guids.size; i++ ) { if ( self BotBuiltinGetGuid() + "" == guids[ i ] ) + { result = true; + } } } if ( !self BotBuiltinIsHost() && !result ) + { return; + } self.pers[ "bot_host" ] = true; } @@ -389,7 +403,9 @@ BotGetRandom() BotGetTargetRandom() { if ( !isdefined( self.bot.target ) ) + { return undefined; + } return self.bot.target.rand; } @@ -442,7 +458,9 @@ BotFreezeControls( what ) self.bot.isfrozen = what; if ( what ) + { self notify( "kill_goal" ); + } } /* @@ -461,7 +479,9 @@ BotStopMoving( what ) self.bot.stop_move = what; if ( what ) + { self notify( "kill_goal" ); + } } /* @@ -503,7 +523,9 @@ GetScriptGoal() SetScriptGoal( goal, dist ) { if ( !isdefined( dist ) ) + { dist = 16; + } self.bot.script_goal = goal; self.bot.script_goal_dist = dist; @@ -609,7 +631,9 @@ ClearScriptEnemy() GetThreat() { if ( !isdefined( self.bot.target ) ) + { return undefined; + } return self.bot.target.entity; } @@ -642,10 +666,14 @@ getValidTube() weap = weaps[ i ]; if ( !self getammocount( weap ) ) + { continue; + } if ( issubstr( weap, "gl_" ) && !issubstr( weap, "_gl_" ) ) + { return weap; + } } return undefined; @@ -664,10 +692,14 @@ getValidGrenade() for ( i = 0; i < grenadeTypes.size; i++ ) { if ( !self hasweapon( grenadeTypes[ i ] ) ) + { continue; + } if ( !self getammocount( grenadeTypes[ i ] ) ) + { continue; + } possibles[ possibles.size ] = grenadeTypes[ i ]; } @@ -681,7 +713,9 @@ getValidGrenade() PickRandom( arr ) { if ( !arr.size ) + { return undefined; + } return arr[ randomint( arr.size ) ]; } @@ -728,7 +762,9 @@ waittill_either_return_( str1, str2 ) waittill_either_return( str1, str2 ) { if ( !isdefined( self waittill_either_return_( str1, str2 ) ) ) + { return str1; + } return str2; } @@ -743,24 +779,36 @@ waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) ( !isdefined( string3 ) || string3 != "death" ) && ( !isdefined( string4 ) || string4 != "death" ) && ( !isdefined( string5 ) || string5 != "death" ) ) + { self endon( "death" ); + } ent = spawnstruct(); if ( isdefined( string1 ) ) + { self thread waittill_string( string1, ent ); + } if ( isdefined( string2 ) ) + { self thread waittill_string( string2, ent ); + } if ( isdefined( string3 ) ) + { self thread waittill_string( string3, ent ); + } if ( isdefined( string4 ) ) + { self thread waittill_string( string4, ent ); + } if ( isdefined( string5 ) ) + { self thread waittill_string( string5, ent ); + } ent thread _timeout( timeOut ); @@ -790,7 +838,9 @@ GetHostPlayer() player = level.players[ i ]; if ( !player is_host() ) + { continue; + } return player; } @@ -806,36 +856,48 @@ bot_wait_for_host() host = undefined; while ( !isdefined( level ) || !isdefined( level.players ) ) + { wait 0.05; + } for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { host = GetHostPlayer(); if ( isdefined( host ) ) + { break; + } wait 0.05; } if ( !isdefined( host ) ) + { return; + } for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { if ( isdefined( host.pers[ "team" ] ) ) + { break; + } wait 0.05; } if ( !isdefined( host.pers[ "team" ] ) ) + { return; + } for ( i = getdvarfloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { if ( host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis" ) + { break; + } wait 0.05; } @@ -872,20 +934,32 @@ Rectdistancesquared( origin ) dz = 0; if ( origin[ 0 ] < self.x0 ) + { dx = origin[ 0 ] - self.x0; + } else if ( origin[ 0 ] > self.x1 ) + { dx = origin[ 0 ] - self.x1; + } if ( origin[ 1 ] < self.y0 ) + { dy = origin[ 1 ] - self.y0; + } else if ( origin[ 1 ] > self.y1 ) + { dy = origin[ 1 ] - self.y1; + } if ( origin[ 2 ] < self.z0 ) + { dz = origin[ 2 ] - self.z0; + } else if ( origin[ 2 ] > self.z1 ) + { dz = origin[ 2 ] - self.z1; + } return dx * dx + dy * dy + dz * dz; } @@ -900,12 +974,18 @@ Round( x ) if ( abs( x ) - abs( y ) > 0.5 ) { if ( x < 0 ) + { return y - 1; + } else + { return y + 1; + } } else + { return y; + } } /* @@ -916,9 +996,13 @@ RoundUp( floatVal ) i = int( floatVal ); if ( i != floatVal ) + { return i + 1; + } else + { return i; + } } /* @@ -1176,7 +1260,9 @@ getBotToKick() bots = getBotArray(); if ( !isdefined( bots ) || !isdefined( bots.size ) || bots.size <= 0 || !isdefined( bots[ 0 ] ) ) + { return undefined; + } tokick = undefined; @@ -1186,13 +1272,19 @@ getBotToKick() bot = bots[ i ]; if ( !isdefined( bot ) ) + { continue; + } if ( !isdefined( bot.pers ) || !isdefined( bot.pers[ "bots" ] ) || !isdefined( bot.pers[ "bots" ][ "skill" ] ) || !isdefined( bot.pers[ "bots" ][ "skill" ][ "base" ] ) ) + { continue; + } if ( isdefined( tokick ) && bot.pers[ "bots" ][ "skill" ][ "base" ] > tokick.pers[ "bots" ][ "skill" ][ "base" ] ) + { continue; + } tokick = bot; } @@ -1213,7 +1305,9 @@ getBotArray() player = level.players[ i ]; if ( !player is_bot() ) + { continue; + } result[ result.size ] = player; } @@ -1278,7 +1372,9 @@ HeapInsert( item ) current = int( current / 2 ); if ( ![[ self.compare ]]( item, self.data[ current - 1 ] ) ) + { break; + } self.data[ last - 1 ] = self.data[ current - 1 ]; self.data[ current - 1 ] = item; @@ -1294,15 +1390,23 @@ _HeapNextChild( node, hsize ) right = left + 1; if ( left > hsize ) + { return -1; + } if ( right > hsize ) + { return left; + } if ( [[ self.compare ]]( self.data[ left - 1 ], self.data[ right - 1 ] ) ) + { return left; + } else + { return right; + } } /* @@ -1313,7 +1417,9 @@ HeapRemove() remove = self.data.size; if ( !remove ) + { return remove; + } move = self.data[ remove - 1 ]; self.data[ 0 ] = move; @@ -1321,7 +1427,9 @@ HeapRemove() remove--; if ( !remove ) + { return remove; + } last = 1; next = self _HeapNextChild( 1, remove ); @@ -1329,7 +1437,9 @@ HeapRemove() while ( next != -1 ) { if ( [[ self.compare ]]( move, self.data[ next - 1 ] ) ) + { break; + } self.data[ last - 1 ] = self.data[ next - 1 ]; self.data[ next - 1 ] = move; @@ -1500,7 +1610,9 @@ isWeaponPrimary( weap ) for ( i = 0; i < weaps.size; i++ ) { if ( weap == weaps[ i ] ) + { return true; + } } return false; @@ -1662,7 +1774,9 @@ debug_bounding_box_for_ent( color ) self endon( "debug_bounding_box_for_ent" ); if ( !isdefined( color ) ) + { color = ( randomfloatrange( 0, 1 ), randomfloatrange( 0, 1 ), randomfloatrange( 0, 1 ) ); + } while ( isdefined( self ) ) {