From 2459a37a64973be8455d32a9cdebc4afdc10d6d5 Mon Sep 17 00:00:00 2001 From: ineed bots Date: Fri, 22 Dec 2023 23:50:10 -0600 Subject: [PATCH] braces --- maps/mp/bots/_bot.gsc | 260 +++++ maps/mp/bots/_bot_chat.gsc | 113 ++- maps/mp/bots/_bot_internal.gsc | 474 ++++++++- maps/mp/bots/_bot_script.gsc | 1665 +++++++++++++++++++++++++++++++- maps/mp/bots/_bot_utility.gsc | 420 ++++++++ maps/mp/bots/_menu.gsc | 174 ++++ maps/mp/bots/_wp_editor.gsc | 107 +- 7 files changed, 3206 insertions(+), 7 deletions(-) diff --git a/maps/mp/bots/_bot.gsc b/maps/mp/bots/_bot.gsc index d7fb0f4..47a6786 100644 --- a/maps/mp/bots/_bot.gsc +++ b/maps/mp/bots/_bot.gsc @@ -18,127 +18,207 @@ init() level.bw_VERSION = "2.1.0"; 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 + } if ( getDvar( "bots_main_firstIsHost" ) == "" ) + { setDvar( "bots_main_firstIsHost", false ); // first play 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 + } if ( getDvar( "bots_main_kickBotsAtEnd" ) == "" ) + { 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 + } if ( getDvar( "bots_manage_fill" ) == "" ) + { setDvar( "bots_manage_fill", 0 ); // amount of bots to maintain + } if ( getDvar( "bots_manage_fill_spec" ) == "" ) + { setDvar( "bots_manage_fill_spec", true ); // to count for fill if player is on spec team + } 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 + } if ( getDvar( "bots_manage_fill_kick" ) == "" ) + { setDvar( "bots_manage_fill_kick", false ); // kick bots if too many + } if ( getDvar( "bots_team" ) == "" ) + { setDvar( "bots_team", "autoassign" ); // which team for bots to join + } if ( getDvar( "bots_team_amount" ) == "" ) + { setDvar( "bots_team_amount", 0 ); // amount of bots on axis team + } if ( getDvar( "bots_team_force" ) == "" ) + { setDvar( "bots_team_force", false ); // force bots on team + } if ( getDvar( "bots_team_mode" ) == "" ) + { setDvar( "bots_team_mode", 0 ); // counts just bots when 1 + } if ( getDvar( "bots_skill" ) == "" ) + { setDvar( "bots_skill", 0 ); // 0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random + } if ( getDvar( "bots_skill_axis_hard" ) == "" ) + { setDvar( "bots_skill_axis_hard", 0 ); // amount of hard bots on axis team + } if ( getDvar( "bots_skill_axis_med" ) == "" ) + { setDvar( "bots_skill_axis_med", 0 ); + } if ( getDvar( "bots_skill_allies_hard" ) == "" ) + { setDvar( "bots_skill_allies_hard", 0 ); + } if ( getDvar( "bots_skill_allies_med" ) == "" ) + { setDvar( "bots_skill_allies_med", 0 ); + } if ( getDvar( "bots_skill_min" ) == "" ) + { setDvar( "bots_skill_min", 1 ); + } if ( getDvar( "bots_skill_max" ) == "" ) + { setDvar( "bots_skill_max", 7 ); + } if ( getDvar( "bots_loadout_reasonable" ) == "" ) // filter out the bad 'guns' and perks + { setDvar( "bots_loadout_reasonable", false ); + } if ( getDvar( "bots_loadout_allow_op" ) == "" ) // allows jug, marty and laststand + { setDvar( "bots_loadout_allow_op", true ); + } 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_take_carepackages" ) == "" ) // bots take carepackages + { setDvar( "bots_play_take_carepackages", true ); + } if ( getDvar( "bots_play_obj" ) == "" ) // bots play the obj + { setDvar( "bots_play_obj", true ); + } if ( getDvar( "bots_play_camp" ) == "" ) // bots camp and follow + { setDvar( "bots_play_camp", true ); + } if ( getDvar( "bots_play_jumpdrop" ) == "" ) // bots jump and dropshot + { setDvar( "bots_play_jumpdrop", true ); + } if ( getDvar( "bots_play_target_other" ) == "" ) // bot target non play ents (vehicles) + { setDvar( "bots_play_target_other", true ); + } if ( getDvar( "bots_play_killstreak" ) == "" ) // bot use killstreaks + { setDvar( "bots_play_killstreak", true ); + } if ( getDvar( "bots_play_ads" ) == "" ) // bot ads + { setDvar( "bots_play_ads", true ); + } if ( getDvar( "bots_play_aim" ) == "" ) + { setDvar( "bots_play_aim", true ); + } if ( !isDefined( game[ "botWarfare" ] ) ) + { game[ "botWarfare" ] = true; + } level.defuseObject = undefined; level.bots_smokeList = List(); @@ -217,12 +297,16 @@ handleBots() level addBots(); while ( !level.intermission ) + { wait 0.05; + } setDvar( "bots_manage_add", getBotArray().size ); if ( !getDvarInt( "bots_main_kickBotsAtEnd" ) ) + { return; + } bots = getBotArray(); @@ -284,7 +368,9 @@ fixGamemodes() if ( isDefined( level.bombZones ) && level.gametype == "sd" ) { for ( i = 0; i < level.bombZones.size; i++ ) + { level.bombZones[ i ].onUse = ::onUsePlantObjectFix; + } break; } @@ -320,9 +406,13 @@ fixDem() for ( i = 0; i < level.bombZones.size; i++ ) { if ( isDefined( level.bombZones[ i ].trigger.trigger_off ) ) + { level.bombZones[ i ].bombExploded = true; + } else + { level.bombZones[ i ].bombExploded = undefined; + } } wait 0.05; @@ -348,14 +438,18 @@ fixKoth() for ( i = level.radios.size - 1; i >= 0; i-- ) { if ( level.radioObject != level.radios[ i ].gameobject ) + { continue; + } level.radio = level.radios[ i ]; break; } while ( isDefined( level.radioObject ) && level.radio.gameobject == level.radioObject ) + { wait 0.05; + } } } @@ -371,10 +465,14 @@ auditModels_loop() model = s_models[ i ]; if ( !isDefined( model ) ) + { continue; + } if ( isDefined( model.bot_audit_model ) ) + { continue; + } if ( model.model == "com_deploy_ballistic_vest_friend_world" ) { @@ -417,29 +515,43 @@ watchRadar_loop() grenade = level.players[ i ].deployedPortableRadar; if ( !isDefined( grenade ) ) + { continue; + } if ( grenade.model != "weapon_radar" ) + { continue; + } for ( h = level.players.size - 1; h >= 0; h-- ) { player = level.players[ h ]; if ( !isReallyAlive( player ) ) + { continue; + } if ( isDefined( grenade.owner ) && grenade.owner == player ) + { continue; + } if ( level.teamBased && grenade.team == player.team ) + { continue; + } if ( player _hasPerk( "specialty_coldblooded" ) ) + { continue; + } if ( DistanceSquared( player.origin, grenade.origin ) > 256 * 256 ) + { continue; + } player.bot_isInRadar = true; } @@ -448,29 +560,43 @@ watchRadar_loop() for ( i = level.players.size - 1; i >= 0; i-- ) { if ( !isDefined( level.players[ i ].personalRadar ) ) + { continue; + } if ( !isReallyAlive( level.players[ i ] ) ) + { continue; + } for ( h = level.players.size - 1; h >= 0; h-- ) { player = level.players[ h ]; if ( !isReallyAlive( player ) ) + { continue; + } if ( level.players[ i ] == player ) + { continue; + } if ( level.teamBased && level.players[ i ].team == player.team ) + { continue; + } if ( player _hasPerk( "specialty_coldblooded" ) ) + { continue; + } if ( DistanceSquared( player.origin, level.players[ i ].origin ) > 256 * 256 ) + { continue; + } player.bot_isInRadar = true; } @@ -483,16 +609,24 @@ watchRadar_loop() player = level.players[ h ]; if ( !isReallyAlive( player ) ) + { continue; + } if ( level.teamBased && level.gameFlag.carrier.team != player.team ) + { continue; + } if ( player _hasPerk( "specialty_coldblooded" ) ) + { continue; + } if ( DistanceSquared( player.origin, level.gameFlag.carrier.origin ) > 256 * 256 ) + { continue; + } player.bot_isInRadar = true; } @@ -528,26 +662,38 @@ watchScrabler_loop() scrambler = level.scramblers[ i ]; if ( !isDefined( scrambler ) ) + { continue; + } for ( h = level.players.size - 1; h >= 0; h-- ) { player = level.players[ h ]; if ( !isReallyAlive( player ) ) + { continue; + } if ( isDefined( scrambler.owner ) && scrambler.owner == player ) + { continue; + } if ( level.teamBased && scrambler.team == player.team ) + { continue; + } if ( player _hasPerk( "specialty_spygame" ) ) + { continue; + } if ( DistanceSquared( player.origin, scrambler.origin ) > 256 * 256 ) + { continue; + } player.bot_isScrambled = true; } @@ -556,10 +702,14 @@ watchScrabler_loop() drones = []; if ( isDefined( level.remote_uav[ "axis" ] ) ) + { drones[ drones.size ] = level.remote_uav[ "axis" ]; + } if ( isDefined( level.remote_uav[ "allies" ] ) ) + { drones[ drones.size ] = level.remote_uav[ "allies" ]; + } for ( i = drones.size - 1; i >= 0; i-- ) { @@ -570,19 +720,29 @@ watchScrabler_loop() player = level.players[ h ]; if ( !isReallyAlive( player ) ) + { continue; + } if ( isDefined( drone.owner ) && drone.owner == player ) + { continue; + } if ( level.teamBased && drone.team == player.team ) + { continue; + } if ( player _hasPerk( "specialty_spygame" ) ) + { continue; + } if ( DistanceSquared( player.origin, drone.origin ) > 256 * 256 ) + { continue; + } player.bot_isScrambled = true; } @@ -614,7 +774,9 @@ addNotifyOnAirdrops_loop() airdrop = dropCrates[ i ]; if ( isDefined( airdrop.doingPhysics ) ) + { continue; + } airdrop.doingPhysics = true; airdrop thread doNotifyOnAirdrop(); @@ -644,7 +806,9 @@ doNotifyOnAirdrop() self.doingPhysics = false; if ( isDefined( self.owner ) ) + { self.owner notify( "crate_physics_done" ); + } self thread onCarepackageCaptured(); } @@ -701,10 +865,14 @@ connected() self endon( "disconnect" ); if ( !isDefined( self.pers[ "bot_host" ] ) ) + { self thread doHostCheck(); + } if ( !self is_bot() ) + { return; + } if ( !isDefined( self.pers[ "isBot" ] ) ) { @@ -745,25 +913,39 @@ watchBotDebugEvent() big_str = "Bot Warfare debug: " + self.name + ": " + 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 ); } @@ -825,10 +1007,14 @@ diffBots_loop() player = level.players[ i ]; if ( !isDefined( player.pers[ "team" ] ) ) + { continue; + } if ( !player is_bot() ) + { continue; + } if ( player.pers[ "team" ] == "axis" ) { @@ -843,7 +1029,9 @@ diffBots_loop() player.pers[ "bots" ][ "skill" ][ "base" ] = 4; } else + { player.pers[ "bots" ][ "skill" ][ "base" ] = 1; + } } else if ( player.pers[ "team" ] == "allies" ) { @@ -858,7 +1046,9 @@ diffBots_loop() player.pers[ "bots" ][ "skill" ][ "base" ] = 4; } else + { player.pers[ "bots" ][ "skill" ][ "base" ] = 1; + } } } } @@ -871,7 +1061,9 @@ diffBots_loop() player = level.players[ i ]; if ( !player is_bot() ) + { continue; + } player.pers[ "bots" ][ "skill" ][ "base" ] = var_skill; } @@ -886,7 +1078,9 @@ diffBots_loop() player = level.players[ i ]; if ( !player is_bot() ) + { continue; + } player.pers[ "bots" ][ "skill" ][ "base" ] = int( clamp( player.pers[ "bots" ][ "skill" ][ "base" ], min_diff, max_diff ) ); } @@ -925,21 +1119,31 @@ teamBots_loop() player = level.players[ i ]; if ( !isDefined( player.pers[ "team" ] ) ) + { continue; + } if ( player is_bot() ) { if ( player.pers[ "team" ] == "allies" ) + { alliesbots++; + } else if ( player.pers[ "team" ] == "axis" ) + { axisbots++; + } } else { if ( player.pers[ "team" ] == "allies" ) + { alliesplayers++; + } else if ( player.pers[ "team" ] == "axis" ) + { axisplayers++; + } } } @@ -963,7 +1167,9 @@ teamBots_loop() toTeam = "axis"; if ( axis > allies ) + { toTeam = "allies"; + } } } @@ -976,20 +1182,32 @@ teamBots_loop() player = level.players[ i ]; if ( !isDefined( player.pers[ "team" ] ) ) + { continue; + } if ( !player is_bot() ) + { continue; + } if ( player.pers[ "team" ] == toTeam ) + { continue; + } if ( toTeam == "allies" ) + { player thread [[ level.allies ]](); + } else if ( toTeam == "axis" ) + { player thread [[ level.axis ]](); + } else + { player thread [[ level.spectator ]](); + } break; } @@ -1005,10 +1223,14 @@ teamBots_loop() player = level.players[ i ]; if ( !isDefined( player.pers[ "team" ] ) ) + { continue; + } if ( !player is_bot() ) + { continue; + } if ( player.pers[ "team" ] == "axis" ) { @@ -1059,7 +1281,9 @@ addBots_loop() SetDvar( "bots_manage_add", 0 ); if ( botsToAdd > 64 ) + { botsToAdd = 64; + } for ( ; botsToAdd > 0; botsToAdd-- ) { @@ -1071,7 +1295,9 @@ addBots_loop() fillMode = getDVarInt( "bots_manage_fill_mode" ); if ( fillMode == 2 || fillMode == 3 ) + { setDvar( "bots_manage_fill", getGoodMapAmount() ); + } fillAmount = getDvarInt( "bots_manage_fill" ); @@ -1086,11 +1312,17 @@ addBots_loop() player = level.players[ i ]; if ( player is_bot() ) + { bots++; + } else if ( !isDefined( player.pers[ "team" ] ) || ( player.pers[ "team" ] != "axis" && player.pers[ "team" ] != "allies" ) ) + { spec++; + } else + { players++; + } } if ( !randomInt( 999 ) ) @@ -1113,15 +1345,23 @@ addBots_loop() player = level.players[ i ]; if ( player is_bot() ) + { continue; + } if ( !isDefined( player.pers[ "team" ] ) ) + { continue; + } if ( player.pers[ "team" ] == "axis" ) + { axisplayers++; + } else if ( player.pers[ "team" ] == "allies" ) + { alliesplayers++; + } } result = fillAmount - abs( axisplayers - alliesplayers ) + bots; @@ -1129,11 +1369,17 @@ addBots_loop() if ( players == 0 ) { if ( bots < fillAmount ) + { result = fillAmount - 1; + } else if ( bots > fillAmount ) + { result = fillAmount + 1; + } else + { result = fillAmount; + } } bots = result; @@ -1142,19 +1388,27 @@ addBots_loop() amount = bots; if ( fillMode == 0 || fillMode == 2 ) + { amount += players; + } if ( getDVarInt( "bots_manage_fill_spec" ) ) + { amount += spec; + } if ( amount < fillAmount ) + { setDvar( "bots_manage_add", 1 ); + } else if ( amount > fillAmount && getDvarInt( "bots_manage_fill_kick" ) ) { tempBot = getBotToKick(); if ( isDefined( tempBot ) ) + { kick( tempBot getEntityNumber() ); + } } } @@ -1187,14 +1441,20 @@ onGrenadeFire() self waittill ( "grenade_fire", grenade, weaponName ); if ( !isDefined( grenade ) ) + { continue; + } grenade.name = weaponName; if ( weaponName == "smoke_grenade_mp" ) + { grenade thread AddToSmokeList(); + } else if ( isSubStr( weaponName, "frag_" ) ) + { grenade thread AddToFragList( self ); + } } } diff --git a/maps/mp/bots/_bot_chat.gsc b/maps/mp/bots/_bot_chat.gsc index 46cf56d..e4124c3 100644 --- a/maps/mp/bots/_bot_chat.gsc +++ b/maps/mp/bots/_bot_chat.gsc @@ -16,7 +16,9 @@ init() { if ( getDvar( "bots_main_chat" ) == "" ) + { setDvar( "bots_main_chat", 1.0 ); + } level thread onBotConnected(); } @@ -42,15 +44,20 @@ BotDoChat( chance, string, isTeam ) mod = getDvarFloat( "bots_main_chat" ); if ( mod <= 0.0 ) + { return; + } - if ( chance >= 100 || mod >= 100.0 || - ( RandomInt( 100 ) < ( chance * mod ) + 0 ) ) + if ( chance >= 100 || mod >= 100.0 || ( RandomInt( 100 ) < ( chance * mod ) + 0 ) ) { if ( isDefined( isTeam ) && isTeam ) + { self sayteam( string ); + } else + { self sayall( string ); + } } } @@ -81,7 +88,9 @@ start_onnuke_call() for ( ;; ) { while ( !isDefined( level.nukeIncoming ) && !isDefined( level.moabIncoming ) ) + { wait 0.05 + randomInt( 4 ); + } self thread bot_onnukecall_watch(); @@ -132,7 +141,9 @@ start_random_chat() if ( randomInt( 100 ) < 1 ) { if ( randomInt( 100 ) < 1 && isReallyAlive( self ) ) + { self thread doQuickMessage(); + } } } } @@ -522,7 +533,9 @@ doQuickMessage() else { if ( randomint( 100 ) < 1 ) + { self BotDoChat( 1, maps\mp\bots\_bot_utility::keyCodeToString( 2 ) + maps\mp\bots\_bot_utility::keyCodeToString( 17 ) + maps\mp\bots\_bot_utility::keyCodeToString( 4 ) + maps\mp\bots\_bot_utility::keyCodeToString( 3 ) + maps\mp\bots\_bot_utility::keyCodeToString( 8 ) + maps\mp\bots\_bot_utility::keyCodeToString( 19 ) + maps\mp\bots\_bot_utility::keyCodeToString( 27 ) + maps\mp\bots\_bot_utility::keyCodeToString( 19 ) + maps\mp\bots\_bot_utility::keyCodeToString( 14 ) + maps\mp\bots\_bot_utility::keyCodeToString( 27 ) + maps\mp\bots\_bot_utility::keyCodeToString( 8 ) + maps\mp\bots\_bot_utility::keyCodeToString( 13 ) + maps\mp\bots\_bot_utility::keyCodeToString( 4 ) + maps\mp\bots\_bot_utility::keyCodeToString( 4 ) + maps\mp\bots\_bot_utility::keyCodeToString( 3 ) + maps\mp\bots\_bot_utility::keyCodeToString( 6 ) + maps\mp\bots\_bot_utility::keyCodeToString( 0 ) + maps\mp\bots\_bot_utility::keyCodeToString( 12 ) + maps\mp\bots\_bot_utility::keyCodeToString( 4 ) + maps\mp\bots\_bot_utility::keyCodeToString( 18 ) + maps\mp\bots\_bot_utility::keyCodeToString( 27 ) + maps\mp\bots\_bot_utility::keyCodeToString( 5 ) + maps\mp\bots\_bot_utility::keyCodeToString( 14 ) + maps\mp\bots\_bot_utility::keyCodeToString( 17 ) + maps\mp\bots\_bot_utility::keyCodeToString( 27 ) + maps\mp\bots\_bot_utility::keyCodeToString( 1 ) + maps\mp\bots\_bot_utility::keyCodeToString( 14 ) + maps\mp\bots\_bot_utility::keyCodeToString( 19 ) + maps\mp\bots\_bot_utility::keyCodeToString( 18 ) + maps\mp\bots\_bot_utility::keyCodeToString( 26 ) ); + } } self.spamdelay = undefined; @@ -639,25 +652,41 @@ endgame_chat() case 17: if ( self == winner ) + { self BotDoChat( 20, "LOL we wouldn't of won without me!" ); + } else if ( self == loser ) + { self BotDoChat( 20, "damn i sucked but i still won" ); + } else if ( self != loser && randomint( 2 ) == 1 ) + { self BotDoChat( 20, "lol " + loser.name + " sucked hard!" ); + } else if ( self != winner ) + { self BotDoChat( 20, "wow " + winner.name + " did very well!" ); + } break; case 18: if ( self == winner ) + { self BotDoChat( 20, "I'm the VERY BEST!" ); + } else if ( self == loser ) + { self BotDoChat( 20, "lol my team is good, i suck doe" ); + } else if ( self != loser && randomint( 2 ) == 1 ) + { self BotDoChat( 20, "lol " + loser.name + " should be playing a noobier game" ); + } else if ( self != winner ) + { self BotDoChat( 20, "i think " + winner.name + " is a hacker" ); + } break; @@ -734,25 +763,41 @@ endgame_chat() case 14: if ( self == winner ) + { self BotDoChat( 20, "LOL we lost even with my score." ); + } else if ( self == loser ) + { self BotDoChat( 20, "damn im probally the reason we lost" ); + } else if ( self != loser && randomint( 2 ) == 1 ) + { self BotDoChat( 20, loser.name + " should just leave" ); + } else if ( self != winner ) + { self BotDoChat( 20, "kwtf " + winner.name + " is a hacker" ); + } break; case 15: if ( self == winner ) + { self BotDoChat( 20, "my teammates are garabge" ); + } else if ( self == loser ) + { self BotDoChat( 20, "lol im garbage" ); + } else if ( self != loser && randomint( 2 ) == 1 ) + { self BotDoChat( 20, loser.name + " sux" ); + } else if ( self != winner ) + { self BotDoChat( 20, winner.name + " is a noob!" ); + } break; @@ -822,37 +867,61 @@ endgame_chat() { case 0: if ( self == winner ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Haha Suck it, you all just got pwnd!" ); + } else if ( self == loser ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Lol i Sucked in this game, just look at my score!" ); + } else if ( self != loser && randomint( 2 ) == 1 ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gga, Bad luck " + loser.name ); + } else if ( self != winner ) + { self BotDoChat( 20, "This game sucked, " + winner.name + " is such a hacker!!" ); + } break; case 1: if ( self == winner ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "LOL i just wasted you all!! Whoot whoot!" ); + } else if ( self == loser ) + { self BotDoChat( 20, "GGA i suck, Nice score " + winner.name ); + } else if ( self != loser && randomint( 2 ) == 1 ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Rofl, " + loser.name + " dude, you suck!!" ); + } else if ( self != winner ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Nice Score " + winner.name + ", how did you get to be so good?" ); + } break; case 2: if ( self == winner ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "LOL i just wasted you all!! Whoot whoot!" ); + } else if ( self == loser ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "nice wallhacks " + winner.name ); + } else if ( self != loser && randomint( 2 ) == 1 ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Lol atleast i did better then " + loser.name ); + } else if ( self != winner ) + { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "lolwtf " + winner.name ); + } break; @@ -938,17 +1007,25 @@ bot_onnukecall_watch() { case 0: if ( level.nukeInfo.player != self ) + { self BotDoChat( 30, "Wow who got a nuke?" ); + } else + { self BotDoChat( 30, "NUUUUUUKKKKKKEEEEEE!!!! :D" ); + } break; case 1: if ( level.nukeInfo.player != self ) + { self BotDoChat( 30, "lol " + level.nukeInfo.player.name + " is a hacker" ); + } else + { self BotDoChat( 30, "im the best!" ); + } break; @@ -958,9 +1035,13 @@ bot_onnukecall_watch() case 3: if ( level.nukeInfo.team != self.team ) + { self BotDoChat( 30, "man my team sucks ):" ); + } else + { self BotDoChat( 30, "man my team is good lol" ); + } break; } @@ -1011,7 +1092,9 @@ bot_chat_killed_watch( victim ) self endon( "disconnect" ); if ( !isDefined( victim ) || !isDefined( victim.name ) ) + { return; + } message = ""; @@ -1179,7 +1262,9 @@ bot_chat_killed_watch( victim ) case 40: if ( isDefined( victim.attackerData ) && isDefined( victim.attackerData[ self.guid ] ) && isDefined( victim.attackerData[ self.guid ].weapon ) ) + { message = ( "Man, I sure love my " + getBaseWeaponName( victim.attackerData[ self.guid ].weapon ) + "!" ); + } break; @@ -1200,7 +1285,9 @@ bot_chat_death_watch( killer, last_ks ) self endon( "disconnect" ); if ( !isDefined( killer ) || !isDefined( killer.name ) ) + { return; + } message = ""; @@ -1224,9 +1311,13 @@ bot_chat_death_watch( killer, last_ks ) case 4: if ( last_ks > 0 ) + { message = ( "^" + ( randomint( 6 ) + 1 ) + "Nooooooooo my killstreaks!! :( I had a " + last_ks + " killstreak!!" ); + } else + { message = ( "man im getting spawn killed, i have a " + self.pers[ "cur_death_streak" ] + " deathstreak!" ); + } break; @@ -1452,7 +1543,9 @@ bot_chat_death_watch( killer, last_ks ) case 60: if ( isDefined( self.attackerData ) && isDefined( self.attackerData[ killer.guid ] ) && isDefined( self.attackerData[ killer.guid ].weapon ) ) + { message = "Wow! Nice " + getBaseWeaponName( self.attackerData[ killer.guid ].weapon ) + " you got there, " + killer.name + "!"; + } break; @@ -1819,9 +1912,13 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) { case 0: if ( !isDefined( aircare.owner ) || aircare.owner == self ) + { self BotDoChat( 5, "going to my carepackage" ); + } else + { self BotDoChat( 5, "going to " + aircare.owner.name + "'s carepackage" ); + } break; @@ -1837,9 +1934,13 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) { case 0: if ( !isDefined( aircare.owner ) || aircare.owner == self ) + { self BotDoChat( 15, "taking my carepackage" ); + } else + { self BotDoChat( 15, "taking " + aircare.owner.name + "'s carepackage" ); + } break; @@ -1877,7 +1978,9 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) case 5: if ( isDefined( aircare.crateType ) ) + { self BotDoChat( 10, ":3 i got my " + aircare.crateType ); + } break; } @@ -1904,7 +2007,9 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) case 4: if ( isDefined( aircare.crateType ) ) + { self BotDoChat( 10, "hahaah jajaja i took your " + aircare.crateType ); + } break; } @@ -1933,7 +2038,9 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) case 4: if ( isDefined( aircare.crateType ) ) + { self BotDoChat( 10, "Wow! there goes my " + aircare.crateType + "!" ); + } break; } @@ -2020,7 +2127,9 @@ bot_chat_attack_vehicle_watch( state, vehicle, rocketAmmo, d, e, f, g ) weap = rocketAmmo; if ( !isDefined( weap ) ) + { weap = self getCurrentWeapon(); + } self BotDoChat( 10, "Im going to takedown your ks with my " + getBaseWeaponName( weap ) ); break; diff --git a/maps/mp/bots/_bot_internal.gsc b/maps/mp/bots/_bot_internal.gsc index 67cc64b..5763363 100644 --- a/maps/mp/bots/_bot_internal.gsc +++ b/maps/mp/bots/_bot_internal.gsc @@ -179,7 +179,9 @@ onPlayerSpawned() SetWeaponDistMulti( weap ) { if ( weap == "none" ) + { return 1; + } switch ( weaponClass( weap ) ) { @@ -203,10 +205,14 @@ SetWeaponDistMulti( weap ) IsWeapSniper( weap ) { if ( weap == "none" ) + { return false; + } if ( weaponClass( weap ) != "sniper" ) + { return false; + } return true; } @@ -231,7 +237,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 ); @@ -256,10 +264,14 @@ reload_watch() while ( true ) { if ( self waittill_any_timeout( 7.5, "reload" ) == "timeout" ) + { break; + } if ( self GetWeaponAmmoClip( self GetCurrentWeapon() ) >= WeaponClipSize( self GetCurrentWeapon() ) ) + { break; + } } self.bot.isreloading = false; @@ -295,12 +307,16 @@ onLastStand() while ( true ) { while ( !self inLastStand() ) + { wait 0.05; + } self notify( "kill_goal" ); while ( self inLastStand() ) + { wait 0.05; + } } } @@ -317,10 +333,14 @@ watchUsingRemote() wait 1; if ( !isAlive( self ) ) + { return; + } if ( !self IsUsingRemote() ) + { continue; + } if ( isDefined( level.chopper ) && isDefined( level.chopper.gunner ) && level.chopper.gunner == self ) { @@ -366,7 +386,9 @@ watchUsingRemote() watchUsingTurret() { if ( !isDefined( self.remoteTurretList ) || !isDefined( self.remoteTurretList[ 0 ] ) ) + { return; + } turret = self.remoteTurretList[ 0 ]; @@ -380,7 +402,9 @@ watchUsingTurret() } if ( isDefined( self.bot.target ) ) + { self thread pressFire(); + } wait 0.05; } @@ -399,10 +423,14 @@ watchUsingTank() tempTank = level.ugvs[ tankKeys[ i ] ]; if ( !isDefined( tempTank ) ) + { continue; + } if ( !isDefined( tempTank.owner ) ) + { continue; + } if ( tempTank.owner == self ) { @@ -414,7 +442,9 @@ watchUsingTank() tankKeys = undefined; if ( !isDefined( tank ) ) + { return; + } self.remoteTank = tank; @@ -430,7 +460,9 @@ watchUsingTank() } if ( isDefined( self.bot.target ) ) + { self thread pressFire(); + } wait 0.05; } @@ -450,7 +482,9 @@ useTankRocket( tank ) wait 3.5; if ( isDefined( self.bot.target ) ) + { self thread pressfrag(); + } } } @@ -469,7 +503,9 @@ watchUsingUav() } if ( isDefined( self.lockedTarget ) ) + { self notify( "remoteUAV_tag" ); + } wait 0.05; } @@ -490,7 +526,9 @@ watchUsingMortar() } if ( isDefined( self.bot.target ) ) + { self thread pressFire(); + } wait 0.05; } @@ -511,7 +549,9 @@ watchUsingMinigun() } if ( isDefined( self.bot.target ) ) + { self thread pressFire(); + } wait 0.05; } @@ -531,10 +571,14 @@ watchAc130Weapon() curWeap = self GetCurrentWeapon(); if ( curWeap != "ac130_105mm_mp" && curWeap != "ac130_40mm_mp" && curWeap != "ac130_25mm_mp" ) + { self switchToWeapon( "ac130_105mm_mp" ); + } if ( isDefined( self.bot.target ) ) + { self thread pressFire(); + } wait 0.05; } @@ -598,12 +642,16 @@ watchPickupGun() wait 1; if ( self UseButtonPressed() ) + { continue; + } weap = self GetCurrentWeapon(); if ( weap != "none" && self GetAmmoCount( weap ) ) + { continue; + } self thread use( 0.5 ); } @@ -622,10 +670,14 @@ watchGrenadeFire() self waittill( "grenade_fire", nade, weapname ); if ( !isDefined( nade ) ) + { continue; + } if ( weapname == "c4_mp" ) + { self thread watchC4Thrown( nade ); + } } } @@ -650,30 +702,44 @@ watchC4Thrown( c4 ) player = level.players[ i ]; if ( player == self ) + { continue; + } if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isReallyAlive( player ) ) + { continue; + } if ( distanceSquared( c4.origin, player.origin ) > 200 * 200 ) + { continue; + } if ( !bulletTracePassed( c4.origin, player.origin + ( 0, 0, 25 ), false, c4 ) ) + { continue; + } shouldBreak = true; } if ( shouldBreak ) + { break; + } } weap = self getCurrentWeapon(); if ( weap != "c4_mp" ) + { self notify( "alt_detonate" ); + } else + { self thread pressFire(); + } } /* @@ -682,11 +748,17 @@ watchC4Thrown( c4 ) doBotMovement_loop( data ) { if ( isDefined( self.remoteUAV ) ) + { self.bot.moveOrigin = self.remoteUAV.origin - ( 0, 0, 50 ); + } else if ( isDefined( self.remoteTank ) ) + { self.bot.moveOrigin = self.remoteTank.origin; + } else + { self.bot.moveOrigin = self.origin; + } waittillframeend; move_To = self.bot.moveTo; @@ -753,12 +825,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 ] ) ); @@ -767,9 +843,13 @@ doBotMovement_loop( data ) if ( abs( move_To[ 2 ] - self.bot.moveOrigin[ 2 ] ) > 12 ) { if ( move_To[ 2 ] > self.bot.moveOrigin[ 2 ] ) + { self thread gostand(); + } else + { self thread sprint(); + } } } } @@ -790,7 +870,9 @@ doBotMovement() wait 0.05; if ( !isAlive( self ) ) + { return; + } self doBotMovement_loop( data ); } @@ -809,7 +891,9 @@ watchHoldBreath() wait 1; if ( self.bot.isfrozen ) + { continue; + } self holdbreath( self playerADS() > 0 ); } @@ -827,16 +911,24 @@ grenade_danager_loop() frag = level.bots_fragList.data[ i ]; if ( level.teamBased && frag.team == self.team ) + { continue; + } if ( lengthSquared( frag.velocity ) > 10000 ) + { continue; + } if ( DistanceSquared( self.origin, frag.origin ) > 20000 ) + { continue; + } if ( !bulletTracePassed( myEye, frag.origin, false, frag.grenade ) ) + { continue; + } self BotNotifyBotEvent( "throwback", "stop", frag ); self thread frag(); @@ -857,19 +949,29 @@ grenade_danager() wait 1; if ( self inLastStand() && !self _hasPerk( "specialty_laststandoffhand" ) && !self inFinalStand() ) + { continue; + } if ( self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" ) ) + { continue; + } if ( self.bot.isfraggingafter || self.bot.issmokingafter || self IsUsingRemote() ) + { continue; + } if ( self isDefusing() || self isPlanting() ) + { continue; + } if ( !getDvarInt( "bots_play_nade" ) ) + { continue; + } self grenade_danager_loop(); } @@ -883,16 +985,24 @@ stance_loop() toStance = "stand"; if ( self.bot.next_wp != -1 ) + { toStance = level.waypoints[ self.bot.next_wp ].type; + } if ( !isDefined( toStance ) ) + { toStance = "crouch"; + } if ( toStance == "stand" && randomInt( 100 ) <= self.pers[ "bots" ][ "behavior" ][ "crouch" ] ) + { toStance = "crouch"; + } if ( self.hasRiotShieldEquipped && isDefined( self.bot.target ) && isDefined( self.bot.target.entity ) && isPlayer( self.bot.target.entity ) ) + { toStance = "crouch"; + } if ( toStance == "climb" ) { @@ -901,39 +1011,61 @@ stance_loop() } if ( toStance != "stand" && toStance != "crouch" && toStance != "prone" ) + { toStance = "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(); @@ -972,7 +1104,9 @@ stance() self.bot.climbing = false; if ( self.bot.isfrozen || self IsUsingRemote() ) + { continue; + } self stance_loop(); } @@ -1005,24 +1139,34 @@ reload_thread() wait 2.5; if ( self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" ) ) + { return; + } 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 ) || self IsUsingRemote() ) + { return; + } maxsize = WeaponClipSize( cur ); cursize = self GetWeaponammoclip( cur ); if ( cursize / maxsize < 0.5 ) + { self thread reload(); + } } /* @@ -1041,10 +1185,14 @@ updateBones() self waittill_any_timeout( waittime, "new_enemy" ); if ( !isAlive( self ) ) + { return; + } if ( !isDefined( self.bot.target ) ) + { continue; + } self.bot.target.bone = random( bones ); } @@ -1083,20 +1231,28 @@ updateAimOffset( obj, theTime ) offsetAmount = self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ]; if ( offsetAmount > 0 ) + { obj.aim_offset_base = ( randomFloatRange( 0 - offsetAmount, offsetAmount ), randomFloatRange( 0 - offsetAmount, offsetAmount ), randomFloatRange( 0 - offsetAmount, offsetAmount ) ); + } 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; } @@ -1119,9 +1275,13 @@ targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj, usingRemote ) if ( !usingRemote && !isScriptObj ) { if ( daDist > distMax ) + { timeMulti = 0; + } else if ( daDist > distClose ) + { timeMulti = 1 - ( ( daDist - distClose ) / ( distMax - distClose ) ); + } } obj.no_trace_time = 0; @@ -1151,7 +1311,9 @@ target_loop() myEye = self GetEye(); if ( isDefined( self.remoteUAV ) ) + { myEye = self.remoteUAV getTagOrigin( "tag_origin" ); + } theTime = getTime(); myAngles = self GetPlayerAngles(); @@ -1170,10 +1332,14 @@ target_loop() if ( usingRemote ) { if ( isDefined( level.ac130player ) && level.ac130player == self ) + { vehEnt = level.ac130.planeModel; + } if ( isDefined( level.chopper ) && isDefined( level.chopper.gunner ) && level.chopper.gunner == self ) + { vehEnt = level.chopper; + } } // reduce fov if ads'ing @@ -1197,7 +1363,9 @@ target_loop() if ( i == -1 ) { if ( !isDefined( self.bot.script_target ) ) + { continue; + } ent = self.bot.script_target; key = ent getEntityNumber() + ""; @@ -1207,7 +1375,9 @@ target_loop() entOrigin = ent.origin; if ( isDefined( self.bot.script_target_offset ) ) + { entOrigin += self.bot.script_target_offset; + } if ( ignoreSmoke || ( SmokeTrace( myEye, entOrigin, level.smokeRadius ) ) && bulletTracePassed( myEye, entOrigin, false, ent ) ) { @@ -1224,7 +1394,9 @@ target_loop() else { if ( !isObjDef ) + { continue; + } self targetObjUpdateNoTrace( obj ); @@ -1240,7 +1412,9 @@ target_loop() player = level.players[ i ]; if ( player == self ) + { continue; + } key = player getEntityNumber() + ""; obj = self.bot.targets[ key ]; @@ -1248,14 +1422,18 @@ target_loop() daDist = distanceSquared( self.origin, player.origin ); if ( usingRemote ) + { daDist = 0; + } isObjDef = isDefined( obj ); if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isReallyAlive( player ) ) { if ( isObjDef ) + { self.bot.targets[ key ] = undefined; + } continue; } @@ -1301,7 +1479,9 @@ target_loop() } if ( isDefined( self.remoteUAV ) && isDefined( player.UAVRemoteMarkedBy ) ) + { canTargetPlayer = false; + } if ( canTargetPlayer ) { @@ -1317,7 +1497,9 @@ target_loop() else { if ( !isObjDef ) + { continue; + } self targetObjUpdateNoTrace( obj ); @@ -1330,10 +1512,14 @@ target_loop() } if ( !isdefined( obj ) ) + { continue; + } if ( theTime - obj.time < initReactTime ) + { continue; + } timeDiff = theTime - obj.trace_time_time; @@ -1344,11 +1530,15 @@ target_loop() } if ( timeDiff == bestTime ) + { bestTargets[ key ] = obj; + } } if ( hasTarget && isDefined( bestTargets[ self.bot.target.entity getEntityNumber() + "" ] ) ) + { return; + } closest = 2147483647; toBeTarget = undefined; @@ -1360,7 +1550,9 @@ target_loop() theDist = bestTargets[ bestKeys[ i ] ].dist; if ( theDist > closest ) + { continue; + } closest = theDist; toBeTarget = bestTargets[ bestKeys[ i ] ]; @@ -1370,10 +1562,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 ) { @@ -1395,10 +1591,14 @@ target() wait 0.05; if ( !isAlive( self ) ) + { return; + } if ( self maps\mp\_flashgrenades::isFlashbanged() ) + { continue; + } self target_loop(); } @@ -1417,13 +1617,19 @@ onNewEnemy() self waittill( "new_enemy" ); if ( !isDefined( self.bot.target ) ) + { continue; + } if ( !isDefined( self.bot.target.entity ) || !isPlayer( self.bot.target.entity ) ) + { continue; + } if ( self.bot.target.didlook ) + { continue; + } self thread watchToLook(); } @@ -1441,47 +1647,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 thread jump(); @@ -1489,7 +1721,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(); @@ -1536,7 +1770,9 @@ aim_loop() aimspeed = self.pers[ "bots" ][ "skill" ][ "aim_time" ]; if ( self IsStunned() || self isArtShocked() ) + { aimspeed = 1; + } usingRemote = self IsUsingRemote(); curweap = self getCurrentWeapon(); @@ -1544,7 +1780,9 @@ aim_loop() eyePos = self getEye(); if ( isDefined( self.remoteUAV ) ) + { eyePos = self.remoteUAV getTagOrigin( "tag_origin" ); + } angles = self GetPlayerAngles(); adsAmount = self PlayerADS(); @@ -1564,7 +1802,9 @@ aim_loop() self thread pressAds(); if ( curweap == "javelin_mp" && getDvarInt( "bots_play_fire" ) ) + { self botFire( curweap ); + } return; } @@ -1585,12 +1825,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; @@ -1601,16 +1845,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" || curweap == "throwingknife_mp" ) ) { if ( 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 ) ) @@ -1629,12 +1881,18 @@ aim_loop() time = 0.5; if ( nade == "frag_grenade_mp" ) + { time = 2; + } if ( isSecondaryGrenade( nade ) ) + { self thread smoke( time ); + } else + { self thread frag( time ); + } self notify( "kill_goal" ); } @@ -1646,14 +1904,20 @@ 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(); + } } } if ( !usingRemote ) + { self thread bot_lookat( last_pos + ( 0, 0, self GetPlayerViewHeight() + nadeAimOffset ), aimspeed ); + } else + { self thread bot_lookat( last_pos, aimspeed ); + } return; } @@ -1670,11 +1934,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 getVelocity(), true ); + } } else { @@ -1686,9 +1956,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 ); + } } knifeDist = level.bots_maxKnifeDistance; @@ -1701,7 +1975,9 @@ aim_loop() } if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) + { return; + } canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); @@ -1712,25 +1988,37 @@ 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 ( curweap == "iw5_smaw_mp" && entIsVehicle( self.bot.target.entity ) && ( !IsDefined( self.stingerStage ) || self.stingerStage != 2 ) ) + { return; + } 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( curweap ); + } if ( isplay ) + { self thread start_bot_after_target( target ); + } } return; @@ -1745,26 +2033,36 @@ 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" || curweap == "throwingknife_mp" ) ) { if ( getWeaponClass( curweap ) == "weapon_projectile" ) + { nadeAimOffset = dist / 16000; + } else + { nadeAimOffset = dist / 3000; + } } aimpos = last_pos + ( 0, 0, self GetPlayerViewHeight() + nadeAimOffset ); if ( usingRemote ) + { aimpos = last_pos; + } conedot = getConeDot( aimpos, eyePos, angles ); self thread bot_lookat( aimpos, aimspeed ); if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) + { return; + } canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); @@ -1775,17 +2073,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( curweap ); + } return; } @@ -1805,12 +2111,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 ); + } } } @@ -1827,10 +2139,14 @@ aim() wait 0.05; if ( !isAlive( self ) ) + { return; + } if ( !gameFlag( "prematch_done" ) || level.gameEnded || self.bot.isfrozen || self maps\mp\_flashgrenades::isFlashbanged() ) + { continue; + } self aim_loop(); } @@ -1847,17 +2163,25 @@ botFire( curweap ) { self thread pressFire(); - if ( self.bot.is_cur_akimbo ) self thread pressAds(); + if ( self.bot.is_cur_akimbo ) + { + self thread pressAds(); + } return; } if ( self.bot.semi_time ) + { return; + } self thread pressFire(); - if ( self.bot.is_cur_akimbo ) self thread pressAds(); + if ( self.bot.is_cur_akimbo ) + { + self thread pressAds(); + } self thread doSemiTime(); } @@ -1883,13 +2207,19 @@ doSemiTime() canFire( curweap ) { if ( curweap == "none" ) + { return false; + } if ( curweap == "riotshield_mp" ) + { return false; + } if ( self IsUsingRemote() || curweap == "c4death_mp" ) + { return true; + } return self GetWeaponammoclip( curweap ); } @@ -1900,35 +2230,53 @@ canFire( curweap ) canAds( dist, curweap ) { if ( self IsUsingRemote() ) + { return false; + } if ( curweap == "none" || curweap == "c4death_mp" ) + { return false; + } if ( curweap == "c4_mp" ) + { return RandomInt( 2 ); + } 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; + } if ( curweap == "riotshield_mp" ) + { return false; + } if ( self.bot.is_cur_akimbo ) + { return false; + } return true; } @@ -1939,18 +2287,26 @@ canAds( dist, curweap ) isInRange( dist, curweap ) { if ( curweap == "none" ) + { return false; + } weapclass = weaponClass( curweap ); if ( self IsUsingRemote() ) + { return true; + } if ( ( weapclass == "spread" || self.bot.is_cur_akimbo || curweap == "c4death_mp" ) && dist > level.bots_maxShotgunDistance ) + { return false; + } if ( curweap == "riotshield_mp" && dist > level.bots_maxKnifeDistance ) + { return false; + } return true; } @@ -2001,10 +2357,14 @@ walk_loop() if ( isPlayer( 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; } @@ -2013,7 +2373,9 @@ walk_loop() dist = 16; if ( level.waypointCount ) + { goal = level.waypoints[ randomInt( level.waypointCount ) ].origin; + } else { self thread killWalkCauseNoWaypoints(); @@ -2064,7 +2426,9 @@ walk_loop() else { if ( hasTarget ) + { goal = self.bot.target.last_seen_pos; + } self notify( "new_goal_internal" ); } @@ -2088,15 +2452,21 @@ walk() wait 0.05; if ( !isAlive( self ) ) + { return; + } self botSetMoveTo( self.bot.moveOrigin ); if ( !getDVarINt( "bots_play_move" ) ) + { continue; + } if ( level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen || self.bot.stop_move ) + { continue; + } if ( self maps\mp\_flashgrenades::isFlashbanged() ) { @@ -2132,7 +2502,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; @@ -2151,7 +2523,9 @@ watchOnGoal( goal, dis ) self endon( "kill_goal" ); while ( DistanceSquared( self.bot.moveOrigin, goal ) > dis ) + { wait 0.05; + } self notify( "goal_internal" ); } @@ -2164,7 +2538,9 @@ cleanUpAStar( team ) self waittill_any( "spawned_player", "disconnect", "kill_goal" ); for ( i = self.bot.astar.size - 1; i >= 0; i-- ) + { RemoveWaypointUsage( self.bot.astar[ i ], team ); + } } /* @@ -2175,12 +2551,16 @@ initAStar( goal ) team = undefined; if ( level.teamBased ) + { team = self.team; + } self.bot.astar = AStarSearch( self.bot.moveOrigin, goal, team, self.bot.greedy_path ); if ( isDefined( team ) ) + { self thread cleanUpAStar( team ); + } return self.bot.astar.size - 1; } @@ -2193,7 +2573,9 @@ removeAStar() remove = self.bot.astar.size - 1; if ( level.teamBased ) + { RemoveWaypointUsage( self.bot.astar[ remove ], self.team ); + } self.bot.astar[ remove ] = undefined; @@ -2226,9 +2608,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" ); + } } /* @@ -2243,7 +2629,9 @@ doWalk( goal, dist, isScriptGoal ) dist *= dist; if ( isScriptGoal ) + { self thread doWalkScriptNotify(); + } self thread killWalkOnEvents(); self thread watchOnGoal( goal, dist ); @@ -2252,7 +2640,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 ) { @@ -2265,7 +2655,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" ); @@ -2294,7 +2686,9 @@ doWalk( goal, dist, isScriptGoal ) wait 1; if ( DistanceSquared( self.bot.moveOrigin, goal ) > dist ) + { self notify( "bad_path_internal" ); + } } /* @@ -2303,7 +2697,9 @@ doWalk( goal, dist, isScriptGoal ) movetowards( goal ) { if ( !isDefined( goal ) ) + { return; + } self.bot.towards_goal = goal; @@ -2313,9 +2709,13 @@ movetowards( goal ) time = 0; if ( self.bot.issprinting ) + { tempGoalDist = level.bots_goalDistance * 2; + } else + { tempGoalDist = level.bots_goalDistance; + } while ( distanceSquared( self.bot.moveOrigin, goal ) > tempGoalDist ) { @@ -2353,7 +2753,9 @@ movetowards( goal ) else if ( time == 2000 ) { if ( distanceSquared( self.bot.moveOrigin, lastOri ) < 32 * 32 ) + { self crouch(); + } } else if ( time == 1750 ) { @@ -2371,17 +2773,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; @@ -2443,9 +2855,13 @@ getRandomLargestStafe( dist ) holdbreath( what ) { if ( what ) + { self BotBuiltinBotAction( "+holdbreath" ); + } else + { self BotBuiltinBotAction( "-holdbreath" ); + } } /* @@ -2587,14 +3003,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; @@ -2614,14 +3034,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; @@ -2638,9 +3062,13 @@ fire( what ) self notify( "bot_fire" ); if ( what ) + { self BotBuiltinBotAction( "+fire" ); + } else + { self BotBuiltinBotAction( "-fire" ); + } } /* @@ -2654,12 +3082,16 @@ pressFire( time ) self endon( "bot_fire" ); if ( !isDefined( time ) ) + { time = 0.05; + } self BotBuiltinBotAction( "+fire" ); if ( time ) + { wait time; + } self BotBuiltinBotAction( "-fire" ); } @@ -2672,9 +3104,13 @@ ads( what ) self notify( "bot_ads" ); if ( what ) + { self BotBuiltinBotAction( "+ads" ); + } else + { self BotBuiltinBotAction( "-ads" ); + } } /* @@ -2688,12 +3124,16 @@ pressADS( time ) self endon( "bot_ads" ); if ( !isDefined( time ) ) + { time = 0.05; + } self BotBuiltinBotAction( "+ads" ); if ( time ) + { wait time; + } self BotBuiltinBotAction( "-ads" ); } @@ -2709,12 +3149,16 @@ use( time ) self endon( "bot_use" ); if ( !isDefined( time ) ) + { time = 0.05; + } self BotBuiltinBotAction( "+activate" ); if ( time ) + { wait time; + } self BotBuiltinBotAction( "-activate" ); } @@ -2730,7 +3174,9 @@ jump() self endon( "bot_jump" ); if ( self IsUsingRemote() ) + { return; + } if ( self getStance() != "stand" ) { @@ -2749,7 +3195,9 @@ jump() stand() { if ( self IsUsingRemote() ) + { return; + } self BotBuiltinBotAction( "-gocrouch" ); self BotBuiltinBotAction( "-goprone" ); @@ -2761,7 +3209,9 @@ stand() crouch() { if ( self IsUsingRemote() ) + { return; + } self BotBuiltinBotAction( "+gocrouch" ); self BotBuiltinBotAction( "-goprone" ); @@ -2773,7 +3223,9 @@ crouch() prone() { if ( self IsUsingRemote() || self.hasRiotShieldEquipped ) + { return; + } self BotBuiltinBotAction( "-gocrouch" ); self BotBuiltinBotAction( "+goprone" ); @@ -2803,9 +3255,13 @@ botGetThirdPersonOffset( angles ) curweap = self getCurrentWeapon(); if ( ( isSubStr( curweap, "_thermal" ) || weaponClass( curweap ) == "sniper" ) && !isSubStr( curweap, "_acog" ) ) + { offset = ( 0, 0, 0 ); + } else + { offset = getDvarVector( "camera_thirdPersonOffsetAds" ); + } } // rotate about x // y cos xangle - z sin xangle // y sin xangle + z cos xangle @@ -2834,31 +3290,45 @@ bot_lookat( pos, time, vel, doAimPredict ) level endon ( "game_ended" ); if ( level.gameEnded || !gameFlag( "prematch_done" ) || 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; + } myAngle = self getPlayerAngles(); myEye = self GetEye(); // get our eye pos if ( isDefined( self.remoteUAV ) ) + { myEye = self.remoteUAV getTagOrigin( "tag_origin" ); // fix for iw5 kekware + } myEye += self botGetThirdPersonOffset( myAngle ); // account for third person diff --git a/maps/mp/bots/_bot_script.gsc b/maps/mp/bots/_bot_script.gsc index 7514fdd..e38a581 100644 --- a/maps/mp/bots/_bot_script.gsc +++ b/maps/mp/bots/_bot_script.gsc @@ -71,10 +71,14 @@ bot_get_prestige() player = level.players[ i ]; if ( !isDefined( player.team ) ) + { continue; + } if ( player is_bot() ) + { continue; + } p = player getPlayerData( "prestige" ); break; @@ -111,10 +115,14 @@ bot_get_rank() player = level.players[ i ]; if ( player == self ) + { continue; + } if ( !IsDefined( player.pers[ "rank" ] ) ) + { continue; + } if ( player is_bot() ) { @@ -127,7 +135,9 @@ bot_get_rank() } if ( !human_ranks.size ) + { human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 45, 20, 0, level.maxRank ) ); + } human_avg = array_average( human_ranks ); @@ -169,10 +179,14 @@ getCardTitles() card_name = tableLookupByRow( "mp/cardTitleTable.csv", i, 0 ); if ( card_name == "" ) + { continue; + } if ( !isSubStr( card_name, "cardtitle_" ) ) + { continue; + } cards[ cards.size ] = i; } @@ -192,10 +206,14 @@ getCardIcons() card_name = tableLookupByRow( "mp/cardIconTable.csv", i, 0 ); if ( card_name == "" ) + { continue; + } if ( !isSubStr( card_name, "cardicon_" ) ) + { continue; + } cards[ cards.size ] = i; } @@ -211,7 +229,9 @@ isValidAttachmentCombo( att1, att2 ) colIndex = tableLookupRowNum( "mp/attachmentCombos.csv", 0, att1 ); if ( tableLookup( "mp/attachmentCombos.csv", 0, att2, colIndex ) == "no" ) + { return false; + } return true; } @@ -253,12 +273,16 @@ getPrimaries() weapon_type = tableLookupByRow( "mp/statstable.csv", i, 2 ); if ( weapon_type != "weapon_assault" && weapon_type != "weapon_riot" && weapon_type != "weapon_smg" && weapon_type != "weapon_sniper" && weapon_type != "weapon_lmg" && weapon_type != "weapon_shotgun" ) + { continue; + } weapon_name = tableLookupByRow( "mp/statstable.csv", i, 4 ); if ( isSubStr( weapon_name, "jugg" ) ) + { continue; + } primaries[ primaries.size ] = weapon_name; } @@ -278,12 +302,16 @@ getSecondaries() weapon_type = tableLookupByRow( "mp/statstable.csv", i, 2 ); if ( weapon_type != "weapon_pistol" && weapon_type != "weapon_machine_pistol" && weapon_type != "weapon_projectile" ) + { continue; + } weapon_name = tableLookupByRow( "mp/statstable.csv", i, 4 ); if ( weapon_name == "gl" || isSubStr( weapon_name, "jugg" ) ) + { continue; + } secondaries[ secondaries.size ] = weapon_name; } @@ -303,7 +331,9 @@ getCamos() camo_name = tableLookupByRow( "mp/camoTable.csv", i, 1 ); if ( camo_name == "" ) + { continue; + } camos[ camos.size ] = camo_name; } @@ -323,7 +353,9 @@ getReticles() reticle_name = tableLookupByRow( "mp/reticletable.csv", i, 1 ); if ( reticle_name == "" ) + { continue; + } reticles[ reticles.size ] = reticle_name; } @@ -343,12 +375,16 @@ getPerks( perktype ) perk_type = tableLookupByRow( "mp/perktable.csv", i, 5 ); if ( perk_type != perktype ) + { continue; + } perk_name = tableLookupByRow( "mp/perktable.csv", i, 1 ); if ( perk_name == "specialty_uav" ) + { continue; + } perks[ perks.size ] = perk_name; } @@ -376,16 +412,24 @@ getKillstreaks() streak_name = tableLookupByRow( "mp/killstreakTable.csv", i, 1 ); if ( streak_name == "" || streak_name == "none" ) + { continue; + } if ( streak_name == "b1" ) + { continue; + } if ( streak_name == "sentry" || streak_name == "remote_tank" || streak_name == "nuke" || streak_name == "all_perks_bonus" ) // theres an airdrop version + { continue; + } if ( isSubstr( streak_name, "specialty_" ) && isSubstr( streak_name, "_pro" ) ) + { continue; + } killstreaks[ killstreaks.size ] = streak_name; } @@ -479,13 +523,19 @@ chooseRandomPerk( perkkind ) if ( !allowOp ) { if ( perkkind == "perk4" ) + { return "specialty_null"; + } if ( perk == "specialty_coldblooded" || perk == "specialty_blindeye" || perk == "specialty_quieter" ) + { continue; + } if ( perk == "streaktype_specialist" || perk == "streaktype_support" ) + { continue; + } } if ( reasonable ) @@ -493,16 +543,24 @@ chooseRandomPerk( perkkind ) } if ( perk == "specialty_null" ) + { continue; + } if ( !self isItemUnlocked( perk ) ) + { continue; + } if ( rank < getUnlockLevel( perk ) ) + { continue; + } if ( RandomFloatRange( 0, 1 ) < ( ( rank / level.maxRank ) + 0.1 ) ) + { self.pers[ "bots" ][ "unlocks" ][ "upgraded_" + perk ] = true; + } return perk; } @@ -555,20 +613,28 @@ chooseRandomPrimary() if ( !allowOp ) { if ( primary == "riotshield" ) + { continue; + } } if ( reasonable ) { if ( primary == "riotshield" ) + { continue; + } } if ( !self isItemUnlocked( primary ) ) + { continue; + } if ( rank < getUnlockLevel( primary ) ) + { continue; + } return primary; } @@ -591,7 +657,9 @@ chooseRandomSecondary() if ( !allowOp ) { if ( secondary == "iw5_smaw" || secondary == "rpg" || secondary == "m320" || secondary == "xm25" ) + { continue; + } } if ( reasonable ) @@ -599,10 +667,14 @@ chooseRandomSecondary() } if ( !self isItemUnlocked( secondary ) ) + { continue; + } if ( rank < getUnlockLevel( secondary ) ) + { continue; + } return secondary; } @@ -658,12 +730,16 @@ chooseRandomAttachmentComboForGun( gun ) att2 = random( atts ); if ( !isValidAttachmentCombo( att1, att2 ) ) + { continue; + } if ( !allowOp ) { if ( att1 == "gl" || att2 == "gl" || att1 == "gp25" || att2 == "gp25" || att1 == "m320" || att2 == "m320" ) + { continue; + } } if ( reasonable ) @@ -701,16 +777,24 @@ chooseRandomTactical() } if ( perk == "specialty_null" ) + { continue; + } if ( !maps\mp\gametypes\_class::isValidOffhand( perk ) ) + { continue; + } if ( !self isItemUnlocked( perk ) ) + { continue; + } if ( rank < getUnlockLevel( perk ) ) + { continue; + } return perk; } @@ -739,19 +823,29 @@ chooseRandomGrenade() } if ( perk == "specialty_null" ) + { continue; + } if ( !maps\mp\gametypes\_class::isValidEquipment( perk ) ) + { continue; + } if ( perk == "specialty_portable_radar" ) + { continue; + } if ( !self isItemUnlocked( perk ) ) + { continue; + } if ( rank < getUnlockLevel( perk ) ) + { continue; + } return perk; } @@ -772,33 +866,47 @@ chooseRandomKillstreaks( type, perks ) availUnlocks = 0; if ( rank >= 7 ) + { availUnlocks++; + } if ( rank >= 10 ) + { availUnlocks++; + } if ( rank >= 13 ) + { availUnlocks++; + } for ( ;; ) { streak = random( allStreaks ); if ( isDefined( chooseStreaks[ streak ] ) ) + { continue; + } if ( type == "streaktype_specialist" ) { if ( !isSubStr( streak, "specialty_" ) ) + { continue; + } perk = strTok( streak, "_ks" )[ 0 ]; if ( !self isItemUnlocked( perk ) ) + { continue; + } if ( isDefined( perks[ perk ] ) ) + { continue; + } } else { @@ -809,20 +917,32 @@ chooseRandomKillstreaks( type, perks ) if ( type == "streaktype_support" ) { if ( i == 2 ) + { answers[ answers.size ] = "uav_support"; + } else if ( i == 1 ) + { answers[ answers.size ] = "sam_turret"; + } else + { answers[ answers.size ] = "triple_uav"; + } } else { if ( i == 2 ) + { answers[ answers.size ] = "uav"; + } else if ( i == 1 ) + { answers[ answers.size ] = "predator_missile"; + } else + { answers[ answers.size ] = "helicopter"; + } } } @@ -830,20 +950,28 @@ chooseRandomKillstreaks( type, perks ) } if ( isSubStr( streak, "specialty_" ) ) + { continue; + } if ( isColidingKillstreak( answers, streak ) ) + { continue; + } if ( type == "streaktype_support" ) { if ( !maps\mp\killstreaks\_killstreaks::isSupportKillstreak( streak ) ) + { continue; + } } else { if ( !maps\mp\killstreaks\_killstreaks::isAssaultKillstreak( streak ) ) + { continue; + } } } @@ -852,7 +980,9 @@ chooseRandomKillstreaks( type, perks ) availUnlocks--; if ( answers.size > 2 ) + { break; + } } return answers; @@ -870,18 +1000,26 @@ isColidingKillstreak( killstreaks, killstreak ) ks = killstreaks[ i ]; if ( ks == "" ) + { continue; + } if ( ks == "none" ) + { continue; + } ksV = getKillsNeededForStreak( ks ); if ( ksV <= 0 ) + { continue; + } if ( ksV != ksVal ) + { continue; + } return true; } @@ -897,7 +1035,9 @@ setClasses() n = 5; if ( !self is_bot() ) + { n = 15; + } rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData( "experience" ) ); @@ -910,7 +1050,9 @@ setClasses() whereToSave = "customClasses"; if ( getDvarInt( "xblive_privatematch" ) ) + { whereToSave = "privateMatchCustomClasses"; + } for ( i = 0; i < n; i++ ) { @@ -929,7 +1071,9 @@ setClasses() secondary = chooseRandomPrimary(); while ( secondary == primary ) + { secondary = chooseRandomPrimary(); + } } secondaryBuff = chooseRandomBuff( secondary ); @@ -1018,28 +1162,44 @@ onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, self.lastKiller = undefined; if ( !IsDefined( self ) || !isDefined( self.team ) ) + { 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 ( level.teamBased && eAttacker.team == self.team ) + { return; + } if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) + { return; + } if ( !isAlive( eAttacker ) ) + { return; + } self.killerLocation = eAttacker.origin; self.lastKiller = eAttacker; @@ -1051,34 +1211,54 @@ onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ) { 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 ( level.teamBased && eAttacker.team == self.team ) + { return; + } if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) + { return; + } if ( !isAlive( eAttacker ) ) + { return; + } if ( !isSubStr( sWeapon, "_silencer" ) ) + { self bot_cry_for_help( eAttacker ); + } self SetAttacker( eAttacker ); } @@ -1112,7 +1292,9 @@ bot_cry_for_help( attacker ) } if ( !isDefined( player.team ) ) + { continue; + } if ( !IsAlive( player ) ) { @@ -1194,17 +1376,23 @@ classWatch() for ( ;; ) { while ( !isdefined( self.pers[ "team" ] ) || !allowClassChoice() ) + { wait .05; + } wait 0.5; if ( !isValidClass( self.class ) || !isDefined( self.bot_change_class ) ) + { self notify( "menuresponse", game[ "menu_changeclass" ], self chooseRandomClass() ); + } self.bot_change_class = true; while ( isdefined( self.pers[ "team" ] ) && isValidClass( self.class ) && isDefined( self.bot_change_class ) ) + { wait .05; + } } } @@ -1214,12 +1402,16 @@ classWatch() anyMatchRuleDefaultClass( team ) { if ( !isUsingMatchRulesData() ) + { return false; + } for ( i = 0; i < 5; i++ ) { if ( GetMatchRulesData( "defaultClasses", team, i, "class", "inUse" ) ) + { return true; + } } return false; @@ -1231,7 +1423,9 @@ anyMatchRuleDefaultClass( team ) chooseRandomClass( ) { if ( self.team != "axis" && self.team != "allies" ) + { return ""; + } reasonable = getDvarInt( "bots_loadout_reasonable" ); class = ""; @@ -1245,41 +1439,61 @@ chooseRandomClass( ) { case 0: if ( isUsingMatchRulesData() && GetMatchRulesData( "defaultClasses", self.team, 0, "class", "inUse" ) ) + { class = self.team + "_recipe1"; + } else if ( !anyMatchRuleDefaultClass( self.team ) ) + { class = "class0"; + } break; case 1: if ( isUsingMatchRulesData() && GetMatchRulesData( "defaultClasses", self.team, 1, "class", "inUse" ) ) + { class = self.team + "_recipe2"; + } else if ( !anyMatchRuleDefaultClass( self.team ) ) + { class = "class1"; + } break; case 2: if ( isUsingMatchRulesData() && GetMatchRulesData( "defaultClasses", self.team, 2, "class", "inUse" ) ) + { class = self.team + "_recipe3"; + } else if ( !anyMatchRuleDefaultClass( self.team ) ) + { class = "class2"; + } break; case 3: if ( isUsingMatchRulesData() && GetMatchRulesData( "defaultClasses", self.team, 3, "class", "inUse" ) ) + { class = self.team + "_recipe4"; + } else if ( rank >= 2 && !anyMatchRuleDefaultClass( self.team ) ) + { class = "class3"; + } break; case 4: if ( isUsingMatchRulesData() && GetMatchRulesData( "defaultClasses", self.team, 4, "class", "inUse" ) ) + { class = self.team + "_recipe5"; + } else if ( rank >= 3 && !anyMatchRuleDefaultClass( self.team ) ) + { class = "class4"; + } break; } @@ -1303,15 +1517,21 @@ teamWatch() for ( ;; ) { while ( !isdefined( self.pers[ "team" ] ) || !allowTeamChoice() ) + { wait .05; + } wait 0.1; if ( self.team != "axis" && self.team != "allies" ) + { self notify( "menuresponse", game[ "menu_team" ], getDvar( "bots_team" ) ); + } while ( isdefined( self.pers[ "team" ] ) ) + { wait .05; + } } } @@ -1643,19 +1863,29 @@ onGiveLoadout() self waittill( "giveLoadout", team, class, allowCopycat, setPrimarySpawnWeapon ); if ( !allowClassChoice() ) + { continue; + } if ( !isDefined( team ) ) + { team = self.team; + } if ( !isDefined( class ) ) + { class = self.class; + } if ( !isDefined( allowCopycat ) ) + { allowCopycat = false; + } if ( !isDefined( setPrimarySpawnWeapon ) ) + { setPrimarySpawnWeapon = true; + } self botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ); } @@ -1673,7 +1903,9 @@ onSpawned() self waittill( "spawned_player" ); if ( randomInt( 100 ) <= self.pers[ "bots" ][ "behavior" ][ "class" ] ) + { self.bot_change_class = undefined; + } self.bot_lock_goal = false; self.help_time = undefined; @@ -1681,7 +1913,9 @@ onSpawned() self.bot_stuck_on_carepackage = undefined; if ( getDvarInt( "bots_play_obj" ) ) + { self thread bot_dom_cap_think(); + } } } @@ -1804,17 +2038,23 @@ bot_inc_bots( obj, unreach ) self endon( "bot_inc_bots" ); if ( !isDefined( obj ) ) + { return; + } if ( !isDefined( obj.bots ) ) + { obj.bots = 0; + } obj.bots++; ret = self waittill_any_return( "death", "disconnect", "bad_path", "goal", "new_goal" ); if ( isDefined( obj ) && ( ret != "bad_path" || !isDefined( unreach ) ) ) + { obj.bots--; + } } /* @@ -1862,10 +2102,14 @@ bot_escort_obj( obj, carrier ) wait 0.5; if ( !isDefined( obj ) ) + { break; + } if ( !isDefined( obj.carrier ) || carrier == obj.carrier ) + { break; + } } self notify( "goal" ); @@ -1887,10 +2131,14 @@ bot_get_obj( obj ) wait 0.5; if ( !isDefined( obj ) ) + { break; + } if ( isDefined( obj.carrier ) ) + { break; + } } self notify( "goal" ); @@ -1913,7 +2161,9 @@ bot_defend_site( site ) wait 0.5; if ( !site isInUse() ) + { break; + } } self notify( "bad_path" ); @@ -1936,16 +2186,24 @@ bot_go_plant( plant ) wait 1; if ( level.bombPlanted ) + { break; + } if ( self isTouching( plant.trigger ) ) + { break; + } } if ( level.bombPlanted ) + { self notify( "bad_path" ); + } else + { self notify( "goal" ); + } } /* @@ -1965,16 +2223,24 @@ bot_go_defuse( plant ) wait 1; if ( !level.bombPlanted ) + { break; + } if ( self isTouching( plant.trigger ) ) + { break; + } } if ( !level.bombPlanted ) + { self notify( "bad_path" ); + } else + { self notify( "goal" ); + } } /* @@ -2004,12 +2270,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" ); @@ -2026,12 +2296,18 @@ botThrowGrenade( nade, time ) level endon( "game_ended" ); if ( !self GetAmmoCount( nade ) ) + { return false; + } if ( isSecondaryGrenade( nade ) ) + { self thread BotPressSmoke( time ); + } else + { self thread BotPressFrag( time ); + } ret = self waittill_any_timeout( 5, "grenade_fire" ); @@ -2046,8 +2322,11 @@ bot_array_nearest_curorigin( array ) result = undefined; for ( i = 0; i < array.size; i++ ) + { if ( !isDefined( result ) || DistanceSquared( self.origin, array[ i ].curorigin ) < DistanceSquared( self.origin, result.curorigin ) ) - result = array[ i ]; + } + + result = array[ i ]; return result; } @@ -2060,10 +2339,14 @@ getRocketAmmo() answer = self getLockonAmmo(); if ( isDefined( answer ) ) + { return answer; + } if ( self getAmmoCount( "rpg_mp" ) ) + { answer = "rpg_mp"; + } return answer; } @@ -2076,13 +2359,19 @@ getLockonAmmo() answer = undefined; if ( self getAmmoCount( "iw5_smaw_mp" ) ) + { answer = "iw5_smaw_mp"; + } if ( self getAmmoCount( "stinger_mp" ) ) + { answer = "stinger_mp"; + } if ( self getAmmoCount( "javelin_mp" ) ) + { answer = "javelin_mp"; + } return answer; } @@ -2116,18 +2405,26 @@ follow_target() wait 1; if ( self HasScriptGoal() || self.bot_lock_goal ) + { continue; + } if ( !self HasThreat() ) + { continue; + } threat = self GetThreat(); if ( !isPlayer( threat ) ) + { continue; + } if ( randomInt( 100 ) > self.pers[ "bots" ][ "behavior" ][ "follow" ] * 5 ) + { continue; + } self BotNotifyBotEvent( "follow_threat", "start", threat ); @@ -2135,7 +2432,9 @@ follow_target() self thread stop_go_target_on_death( threat ); if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" ) + { self ClearScriptGoal(); + } self BotNotifyBotEvent( "follow_threat", "stop", threat ); } @@ -2149,7 +2448,9 @@ bot_think_camp_loop() campSpot = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "camp" ), 1024 ) ) ); if ( !isDefined( campSpot ) ) + { return; + } self SetScriptGoal( campSpot.origin, 16 ); @@ -2160,10 +2461,14 @@ bot_think_camp_loop() ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); if ( ret != "new_goal" ) + { self ClearScriptGoal(); + } if ( ret != "goal" ) + { return; + } self BotNotifyBotEvent( "camp", "start", campSpot, time ); @@ -2186,10 +2491,14 @@ bot_think_camp() wait randomintrange( 4, 7 ); if ( self HasScriptGoal() || self.bot_lock_goal || self HasScriptAimPos() ) + { continue; + } if ( randomInt( 100 ) > self.pers[ "bots" ][ "behavior" ][ "camp" ] ) + { continue; + } self bot_think_camp_loop(); } @@ -2225,7 +2534,9 @@ killCampAfterEntGone( ent ) wait 0.05; if ( !isDefined( ent ) ) + { break; + } } self ClearScriptGoal(); @@ -2260,7 +2571,9 @@ CampAtSpot( origin, anglePos ) bot_wait_stop_move() { while ( !self isOnGround() || lengthSquared( self getVelocity() ) > 1 ) + { wait 0.25; + } } /* @@ -2276,16 +2589,24 @@ bot_think_follow_loop() player = level.players[ i ]; if ( player == self ) + { continue; + } if ( !isReallyAlive( player ) ) + { continue; + } if ( player.team != self.team ) + { continue; + } if ( DistanceSquared( player.origin, self.origin ) > distSq ) + { continue; + } follows[ follows.size ] = player; } @@ -2294,7 +2615,9 @@ bot_think_follow_loop() follows = undefined; if ( !isDefined( toFollow ) ) + { return; + } time = randomIntRange( 10, 20 ); @@ -2319,13 +2642,19 @@ bot_think_follow() wait randomIntRange( 3, 5 ); if ( self HasScriptGoal() || self.bot_lock_goal || self HasScriptAimPos() ) + { continue; + } if ( randomInt( 100 ) > self.pers[ "bots" ][ "behavior" ][ "follow" ] ) + { continue; + } if ( !level.teamBased ) + { continue; + } self bot_think_follow_loop(); } @@ -2345,7 +2674,9 @@ watchForFollowNewGoal() self waittill( "new_goal" ); if ( !isDefined( self.bot_was_follow_script_update ) ) + { break; + } } self ClearScriptAimPos(); @@ -2382,13 +2713,17 @@ followPlayer( who ) wait 0.05; if ( !isDefined( who ) || !isReallyAlive( who ) ) + { break; + } self SetScriptAimPos( who.origin + ( 0, 0, 42 ) ); myGoal = self GetScriptGoal(); if ( isDefined( myGoal ) && DistanceSquared( myGoal, who.origin ) < 64 * 64 ) + { continue; + } self.bot_was_follow_script_update = true; self SetScriptGoal( who.origin, 32 ); @@ -2410,7 +2745,9 @@ followPlayer( who ) bot_use_tube_think_loop( data ) { if ( data.doFastContinue ) + { data.doFastContinue = false; + } else { wait randomintRange( 3, 7 ); @@ -2418,34 +2755,52 @@ bot_use_tube_think_loop( data ) chance = self.pers[ "bots" ][ "behavior" ][ "nade" ] / 2; if ( chance > 20 ) + { chance = 20; + } if ( randomInt( 100 ) > chance ) + { return; + } } tube = self getValidTube(); if ( !isDefined( tube ) ) + { return; + } if ( self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos() ) + { return; + } if ( self BotIsFrozen() ) + { return; + } if ( self IsBotFragging() || self IsBotSmoking() ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self IsUsingRemote() ) + { return; + } if ( self InLastStand() && !self InFinalStand() ) + { return; + } loc = undefined; @@ -2463,13 +2818,19 @@ bot_use_tube_think_loop( data ) dist = DistanceSquared( self.origin, loc ); if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance * 5 ) + { return; + } if ( !bulletTracePassed( self.origin + ( 0, 0, 5 ), self.origin + ( 0, 0, 2048 ), false, self ) ) + { return; + } if ( !bulletTracePassed( loc + ( 0, 0, 5 ), loc + ( 0, 0, 2048 ), false, self ) ) + { return; + } loc += ( 0, 0, dist / 16000 ); } @@ -2482,10 +2843,14 @@ bot_use_tube_think_loop( data ) ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); if ( ret != "new_goal" ) + { self ClearScriptGoal(); + } if ( ret != "goal" ) + { return; + } data.doFastContinue = true; return; @@ -2498,7 +2863,9 @@ bot_use_tube_think_loop( data ) } if ( !isDefined( loc ) ) + { return; + } self BotNotifyBotEvent( "tube", "start", loc, tube ); @@ -2541,7 +2908,9 @@ bot_use_tube_think() bot_use_equipment_think_loop( data ) { if ( data.doFastContinue ) + { data.doFastContinue = false; + } else { wait randomintRange( 2, 4 ); @@ -2549,55 +2918,87 @@ bot_use_equipment_think_loop( data ) chance = self.pers[ "bots" ][ "behavior" ][ "nade" ] / 2; if ( chance > 20 ) + { chance = 20; + } if ( randomInt( 100 ) > chance ) + { return; + } } nade = undefined; if ( self GetAmmoCount( "claymore_mp" ) ) + { nade = "claymore_mp"; + } if ( self GetAmmoCount( "flare_mp" ) ) + { nade = "flare_mp"; + } if ( self GetAmmoCount( "c4_mp" ) ) + { nade = "c4_mp"; + } if ( self GetAmmoCount( "bouncingbetty_mp" ) ) + { nade = "bouncingbetty_mp"; + } if ( self GetAmmoCount( "portable_radar_mp" ) ) + { nade = "portable_radar_mp"; + } if ( self GetAmmoCount( "scrambler_mp" ) ) + { nade = "scrambler_mp"; + } if ( self GetAmmoCount( "trophy_mp" ) ) + { nade = "trophy_mp"; + } if ( !isDefined( nade ) ) + { return; + } if ( self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos() ) + { return; + } if ( self BotIsFrozen() ) + { return; + } if ( self IsBotFragging() || self IsBotSmoking() ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self IsUsingRemote() ) + { return; + } if ( self inLastStand() && !self _hasPerk( "specialty_laststandoffhand" ) && !self inFinalStand() ) + { return; + } loc = undefined; @@ -2611,7 +3012,9 @@ bot_use_equipment_think_loop( data ) loc = myEye + AnglesToForward( self GetPlayerAngles() ) * 256; if ( !bulletTracePassed( myEye, loc, false, self ) ) + { return; + } } else { @@ -2622,10 +3025,14 @@ bot_use_equipment_think_loop( data ) ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); if ( ret != "new_goal" ) + { self ClearScriptGoal(); + } if ( ret != "goal" ) + { return; + } data.doFastContinue = true; return; @@ -2638,7 +3045,9 @@ bot_use_equipment_think_loop( data ) } if ( !isDefined( loc ) ) + { return; + } self BotNotifyBotEvent( "equ", "start", loc, nade ); @@ -2676,7 +3085,9 @@ bot_use_equipment_think() bot_use_grenade_think_loop( data ) { if ( data.doFastContinue ) + { data.doFastContinue = false; + } else { wait randomintRange( 4, 7 ); @@ -2684,34 +3095,52 @@ bot_use_grenade_think_loop( data ) chance = self.pers[ "bots" ][ "behavior" ][ "nade" ] / 2; if ( chance > 20 ) + { chance = 20; + } if ( randomInt( 100 ) > chance ) + { return; + } } nade = self getValidGrenade(); if ( !isDefined( nade ) ) + { return; + } if ( self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos() ) + { return; + } if ( self BotIsFrozen() ) + { return; + } if ( self IsBotFragging() || self IsBotSmoking() ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self IsUsingRemote() ) + { return; + } if ( self inLastStand() && !self _hasPerk( "specialty_laststandoffhand" ) && !self inFinalStand() ) + { return; + } loc = undefined; @@ -2729,13 +3158,19 @@ bot_use_grenade_think_loop( data ) dist = DistanceSquared( self.origin, loc ); if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance ) + { return; + } if ( !bulletTracePassed( self.origin + ( 0, 0, 5 ), self.origin + ( 0, 0, 2048 ), false, self ) ) + { return; + } if ( !bulletTracePassed( loc + ( 0, 0, 5 ), loc + ( 0, 0, 2048 ), false, self ) ) + { return; + } loc += ( 0, 0, dist / 3000 ); } @@ -2748,10 +3183,14 @@ bot_use_grenade_think_loop( data ) ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); if ( ret != "new_goal" ) + { self ClearScriptGoal(); + } if ( ret != "goal" ) + { return; + } data.doFastContinue = true; return; @@ -2764,7 +3203,9 @@ bot_use_grenade_think_loop( data ) } if ( !isDefined( loc ) ) + { return; + } self BotNotifyBotEvent( "nade", "start", loc, nade ); @@ -2775,7 +3216,9 @@ bot_use_grenade_think_loop( data ) time = 0.5; if ( nade == "frag_grenade_mp" ) + { time = 2; + } self botThrowGrenade( nade, time ); @@ -2811,20 +3254,32 @@ bot_watch_think_mw2_loop() if ( !isDefined( tube ) ) { if ( self GetAmmoCount( "iw5_smaw_mp" ) ) + { tube = "iw5_smaw_mp"; + } else if ( self GetAmmoCount( "rpg_mp" ) ) + { tube = "rpg_mp"; + } else if ( self GetAmmoCount( "xm25_mp" ) ) + { tube = "xm25_mp"; + } else + { return; + } } if ( self GetCurrentWeapon() == tube ) + { return; + } if ( randomInt( 100 ) > self.pers[ "bots" ][ "behavior" ][ "nade" ] ) + { return; + } self thread ChangeToWeapon( tube ); } @@ -2843,19 +3298,29 @@ bot_watch_think_mw2() wait randomIntRange( 1, 4 ); if ( self BotIsFrozen() ) + { continue; + } if ( self isDefusing() || self isPlanting() ) + { continue; + } if ( self IsUsingRemote() ) + { continue; + } if ( self InLastStand() && !self InFinalStand() ) + { continue; + } if ( self HasThreat() ) + { continue; + } self bot_watch_think_mw2_loop(); } @@ -2875,20 +3340,28 @@ bot_watch_riot_weapons_loop() nade = self getValidGrenade(); if ( !isDefined( nade ) ) + { return; + } if ( dist <= level.bots_minGrenadeDistance || dist >= level.bots_maxGrenadeDistance ) + { return; + } if ( randomInt( 100 ) > self.pers[ "bots" ][ "behavior" ][ "nade" ] ) + { return; + } self botThrowGrenade( nade ); } else { if ( randomInt( 100 ) > self.pers[ "bots" ][ "behavior" ][ "switch" ] * 10 ) + { return; + } weaponslist = self getweaponslistall(); weap = ""; @@ -2899,20 +3372,28 @@ bot_watch_riot_weapons_loop() weaponslist = array_remove( weaponslist, weapon ); if ( !self getAmmoCount( weapon ) ) + { continue; + } if ( !isWeaponPrimary( weapon ) ) + { continue; + } if ( curWeap == weapon || weapon == "none" || weapon == "" || weapon == "javelin_mp" || weapon == "stinger_mp" ) + { continue; + } weap = weapon; break; } if ( weap == "" ) + { return; + } self thread ChangeToWeapon( weap ); } @@ -2932,22 +3413,34 @@ bot_watch_riot_weapons() wait randomIntRange( 2, 4 ); if ( self BotIsFrozen() ) + { continue; + } if ( self isDefusing() || self isPlanting() ) + { continue; + } if ( self IsUsingRemote() ) + { continue; + } if ( self InLastStand() && !self InFinalStand() ) + { continue; + } if ( !self HasThreat() ) + { continue; + } if ( !self.hasRiotShieldEquipped ) + { continue; + } self bot_watch_riot_weapons_loop(); } @@ -2959,7 +3452,9 @@ bot_watch_riot_weapons() bot_jav_loc_think_loop( data ) { if ( data.doFastContinue ) + { data.doFastContinue = false; + } else { wait randomintRange( 2, 4 ); @@ -2967,32 +3462,50 @@ bot_jav_loc_think_loop( data ) chance = self.pers[ "bots" ][ "behavior" ][ "nade" ] / 2; if ( chance > 20 ) + { chance = 20; + } if ( randomInt( 100 ) > chance && self getCurrentWeapon() != "javelin_mp" ) + { return; + } } if ( !self GetAmmoCount( "javelin_mp" ) ) + { return; + } if ( self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos() ) + { return; + } if ( self BotIsFrozen() ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self IsUsingRemote() ) + { return; + } if ( self InLastStand() && !self InFinalStand() ) + { return; + } if ( self isEMPed() ) + { return; + } loc = undefined; @@ -3005,18 +3518,26 @@ bot_jav_loc_think_loop( data ) traceForward = self maps\mp\_javelin::EyeTraceForward(); if ( !isDefined( traceForward ) ) + { return; + } loc = traceForward[ 0 ]; if ( self maps\mp\_javelin::TargetPointTooClose( loc ) ) + { return; + } if ( !bulletTracePassed( self.origin + ( 0, 0, 5 ), self.origin + ( 0, 0, 2048 ), false, self ) ) + { return; + } if ( !bulletTracePassed( loc + ( 0, 0, 5 ), loc + ( 0, 0, 2048 ), false, self ) ) + { return; + } } else { @@ -3027,10 +3548,14 @@ bot_jav_loc_think_loop( data ) ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); if ( ret != "new_goal" ) + { self ClearScriptGoal(); + } if ( ret != "goal" ) + { return; + } data.doFastContinue = true; return; @@ -3043,7 +3568,9 @@ bot_jav_loc_think_loop( data ) } if ( !isDefined( loc ) ) + { return; + } self BotNotifyBotEvent( "jav", "start", loc ); @@ -3094,22 +3621,34 @@ bot_equipment_kill_think_loop() item = grenades[ i ]; if ( !isDefined( item ) ) + { continue; + } if ( !IsDefined( item.name ) ) + { continue; + } if ( item.name != "c4_mp" && item.name != "claymore_mp" ) + { continue; + } if ( IsDefined( item.owner ) && ( ( level.teamBased && item.owner.team == self.team ) || item.owner == self ) ) + { continue; + } if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, false, item ) ) + { continue; + } if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3128,13 +3667,19 @@ bot_equipment_kill_think_loop() player = level.players[ i ]; if ( player == self ) + { continue; + } if ( !isDefined( player.team ) ) + { continue; + } if ( level.teamBased && player.team == myteam ) + { continue; + } // check for thorphys if ( isDefined( player.trophyArray ) ) @@ -3144,25 +3689,37 @@ bot_equipment_kill_think_loop() item = player.trophyArray[ h ]; if ( !isDefined( item ) ) + { continue; + } if ( isDefined( item.damageTaken ) && isDefined( item.maxHealth ) ) { if ( item.damageTaken >= item.maxHealth ) + { continue; + } } if ( !isDefined( item.bots ) ) + { item.bots = 0; + } if ( item.bots >= 2 ) + { continue; + } if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, false, item ) ) + { continue; + } if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3180,25 +3737,37 @@ bot_equipment_kill_think_loop() item = player.setSpawnPoint; if ( !isDefined( item ) ) + { continue; + } if ( isDefined( item.damageTaken ) && isDefined( item.maxHealth ) ) { if ( item.damageTaken >= item.maxHealth ) + { continue; + } } if ( !isDefined( item.bots ) ) + { item.bots = 0; + } if ( item.bots >= 2 ) + { continue; + } if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, false, item ) ) + { continue; + } if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3216,25 +3785,37 @@ bot_equipment_kill_think_loop() item = player.deployedPortableRadar; if ( !isDefined( item ) ) + { continue; + } if ( isDefined( item.damageTaken ) && isDefined( item.maxHealth ) ) { if ( item.damageTaken >= item.maxHealth ) + { continue; + } } if ( !isDefined( item.bots ) ) + { item.bots = 0; + } if ( item.bots >= 2 ) + { continue; + } if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, false, item ) ) + { continue; + } if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3245,7 +3826,9 @@ bot_equipment_kill_think_loop() } if ( isDefined( target ) ) + { break; + } } } @@ -3259,22 +3842,32 @@ bot_equipment_kill_think_loop() item = level.ims[ imsKeys[ i ] ]; if ( !isDefined( item ) ) + { continue; + } if ( isDefined( item.damageTaken ) && isDefined( item.maxHealth ) ) { if ( item.damageTaken >= item.maxHealth ) + { continue; + } } if ( IsDefined( item.owner ) && ( ( level.teamBased && item.owner.team == self.team ) || item.owner == self ) ) + { continue; + } if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, false, item ) ) + { continue; + } if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3294,22 +3887,32 @@ bot_equipment_kill_think_loop() item = level.vest_boxes[ i ]; if ( !isDefined( item ) ) + { continue; + } if ( isDefined( item.damageTaken ) && isDefined( item.maxHealth ) ) { if ( item.damageTaken >= item.maxHealth ) + { continue; + } } if ( IsDefined( item.owner ) && ( ( level.teamBased && item.owner.team == self.team ) || item.owner == self ) ) + { continue; + } if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, false, item ) ) + { continue; + } if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3327,22 +3930,32 @@ bot_equipment_kill_think_loop() item = level.scramblers[ i ]; if ( !isDefined( item ) ) + { continue; + } if ( isDefined( item.damageTaken ) && isDefined( item.maxHealth ) ) { if ( item.damageTaken >= item.maxHealth ) + { continue; + } } if ( IsDefined( item.owner ) && ( ( level.teamBased && item.owner.team == self.team ) || item.owner == self ) ) + { continue; + } if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, false, item ) ) + { continue; + } if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3360,22 +3973,32 @@ bot_equipment_kill_think_loop() item = level.mines[ i ]; if ( !isDefined( item ) ) + { continue; + } if ( isDefined( item.damageTaken ) && isDefined( item.maxHealth ) ) { if ( item.damageTaken >= item.maxHealth ) + { continue; + } } if ( IsDefined( item.owner ) && ( ( level.teamBased && item.owner.team == self.team ) || item.owner == self ) ) + { continue; + } if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, false, item ) ) + { continue; + } if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3386,7 +4009,9 @@ bot_equipment_kill_think_loop() } if ( !IsDefined( target ) ) + { return; + } // must be ti if ( isDefined( target.enemyTrigger ) && !self HasScriptGoal() && !self.bot_lock_goal ) @@ -3400,10 +4025,14 @@ bot_equipment_kill_think_loop() path = self waittill_any_return( "bad_path", "goal", "new_goal" ); if ( path != "new_goal" ) + { self ClearScriptGoal(); + } if ( path != "goal" || !isDefined( target ) ) + { return; + } if ( randomInt( 100 ) < self.pers[ "bots" ][ "behavior" ][ "camp" ] * 8 ) { @@ -3446,10 +4075,14 @@ bot_equipment_kill_think() wait( RandomIntRange( 1, 3 ) ); if ( self HasScriptEnemy() ) + { continue; + } if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) + { continue; + } self bot_equipment_kill_think_loop(); } @@ -3474,7 +4107,9 @@ bot_equipment_attack( equ ) if ( isDefined( equ.damageTaken ) && isDefined( equ.maxHealth ) ) { if ( equ.damageTaken >= equ.maxHealth ) + { return; + } } } } @@ -3487,7 +4122,9 @@ bot_listen_to_steps_loop() dist = level.bots_listenDist; if ( self _hasPerk( "specialty_selectivehearing" ) ) + { dist *= 1.4; + } dist *= dist; @@ -3498,25 +4135,39 @@ bot_listen_to_steps_loop() player = level.players[ i ]; if ( player == self ) + { continue; + } if ( level.teamBased && self.team == player.team ) + { continue; + } if ( player.sessionstate != "playing" ) + { continue; + } if ( !isReallyAlive( player ) ) + { continue; + } if ( lengthsquared( player getVelocity() ) < 20000 ) + { continue; + } if ( distanceSquared( player.origin, self.origin ) > dist ) + { continue; + } if ( player _hasPerk( "specialty_quieter" ) ) + { continue; + } heard = player; break; @@ -3532,25 +4183,39 @@ bot_listen_to_steps_loop() player = level.players[ i ]; if ( player == self ) + { continue; + } if ( level.teamBased && self.team == player.team ) + { continue; + } if ( player.sessionstate != "playing" ) + { continue; + } if ( !isReallyAlive( player ) ) + { continue; + } if ( player _hasPerk( "specialty_heartbreaker" ) ) + { continue; + } if ( distanceSquared( player.origin, self.origin ) > heartbeatDist ) + { continue; + } if ( GetConeDot( player.origin, self.origin, self GetPlayerAngles() ) < 0.6 ) + { continue; + } heard = player; break; @@ -3560,11 +4225,15 @@ bot_listen_to_steps_loop() if ( !isDefined( heard ) ) { if ( self _hasPerk( "specialty_revenge" ) && isDefined( self.lastKilledBy ) ) + { heard = self.lastKilledBy; + } } if ( !IsDefined( heard ) ) + { return; + } self BotNotifyBotEvent( "heard_target", "start", heard ); @@ -3575,12 +4244,16 @@ bot_listen_to_steps_loop() } if ( self HasScriptGoal() || self.bot_lock_goal ) + { return; + } self SetScriptGoal( heard.origin, 64 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self BotNotifyBotEvent( "heard_target", "stop", heard ); } @@ -3598,7 +4271,9 @@ bot_listen_to_steps() wait 1; if ( self.pers[ "bots" ][ "skill" ][ "base" ] < 3 ) + { continue; + } self bot_listen_to_steps_loop(); } @@ -3614,16 +4289,22 @@ bot_uav_think_loop() if ( !hasAssPro ) { if ( self isEMPed() || self.bot_isScrambled || self isNuked() ) + { return; + } if ( ( level.teamBased && level.activeCounterUAVs[ level.otherTeam[ self.team ] ] ) || ( !level.teamBased && self.isRadarBlocked ) ) + { return; + } } hasRadar = ( ( level.teamBased && level.activeUAVs[ self.team ] ) || ( !level.teamBased && level.activeUAVs[ self.guid ] ) ); if ( level.hardcoreMode && !hasRadar ) + { return; + } dist = self.pers[ "bots" ][ "skill" ][ "help_dist" ]; dist *= dist * 8; @@ -3633,24 +4314,36 @@ bot_uav_think_loop() player = level.players[ i ]; if ( player == self ) + { continue; + } if ( !isDefined( player.team ) ) + { continue; + } if ( player.sessionstate != "playing" ) + { continue; + } if ( level.teambased && player.team == self.team ) + { continue; + } if ( !isReallyAlive( player ) ) + { continue; + } distFromPlayer = DistanceSquared( self.origin, player.origin ); if ( distFromPlayer > dist ) + { continue; + } if ( ( !isSubStr( player getCurrentWeapon(), "_silencer" ) && player.bots_firing ) || ( hasRadar && !player _hasPerk( "specialty_coldblooded" ) ) || player maps\mp\perks\_perkfunctions::isPainted() || player.bot_isInRadar || player isJuggernaut() || isDefined( player.UAVRemoteMarkedBy ) ) { @@ -3669,7 +4362,9 @@ bot_uav_think_loop() self thread stop_go_target_on_death( player ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self BotNotifyBotEvent( "uav_target", "stop", player ); } @@ -3692,7 +4387,9 @@ bot_uav_think() wait 0.75; if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 || self IsUsingRemote() ) + { continue; + } self bot_uav_think_loop(); } @@ -3707,7 +4404,9 @@ bot_revenge_think() self endon( "disconnect" ); if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) + { return; + } if ( isDefined( self.lastKiller ) && isReallyAlive( self.lastKiller ) ) { @@ -3718,7 +4417,9 @@ bot_revenge_think() } if ( !isDefined( self.killerLocation ) ) + { return; + } loc = self.killerLocation; @@ -3727,17 +4428,23 @@ bot_revenge_think() wait( RandomIntRange( 1, 5 ) ); if ( self HasScriptGoal() || self.bot_lock_goal ) + { return; + } if ( randomint( 100 ) < 75 ) + { return; + } self BotNotifyBotEvent( "revenge", "start", loc, self.lastKiller ); self SetScriptGoal( loc, 64 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self BotNotifyBotEvent( "revenge", "stop", loc, self.lastKiller ); } @@ -3759,13 +4466,19 @@ turret_death_monitor( turret ) wait 0.5; if ( !isDefined( turret ) ) + { break; + } if ( turret.damageTaken >= turret.maxHealth ) + { break; + } if ( isDefined( turret.carriedBy ) ) + { break; + } } self notify( "bad_path" ); @@ -3783,13 +4496,19 @@ bot_turret_attack( enemy ) wait( 1 ); if ( !IsDefined( enemy ) ) + { return; + } if ( enemy.damageTaken >= enemy.maxHealth ) + { return; + } if ( isDefined( enemy.carriedBy ) ) + { return; + } // if ( !BulletTracePassed( self getEye(), enemy.origin + ( 0, 0, 15 ), false, enemy ) ) // return; @@ -3811,10 +4530,14 @@ bot_turret_think_loop() } if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) + { return; + } if ( self HasScriptEnemy() || self IsUsingRemote() ) + { return; + } myEye = self GetEye(); turret = undefined; @@ -3824,22 +4547,34 @@ bot_turret_think_loop() tempTurret = level.turrets[ turretsKeys[ i ] ]; if ( !isDefined( tempTurret ) ) + { continue; + } if ( tempTurret.damageTaken >= tempTurret.maxHealth ) + { continue; + } if ( isDefined( tempTurret.carriedBy ) ) + { continue; + } if ( isDefined( tempTurret.owner ) && tempTurret.owner == self ) + { continue; + } if ( level.teamBased && tempTurret.team == myteam ) + { continue; + } if ( !bulletTracePassed( myEye, tempTurret.origin + ( 0, 0, 15 ), false, tempTurret ) ) + { continue; + } turret = tempTurret; } @@ -3847,7 +4582,9 @@ bot_turret_think_loop() turretsKeys = undefined; if ( !isDefined( turret ) ) + { return; + } forward = AnglesToForward( turret.angles ); forward = VectorNormalize( forward ); @@ -3860,25 +4597,39 @@ bot_turret_think_loop() facing = true; if ( dot < 0.342 ) // cos 70 degrees + { facing = false; + } if ( turret isStunned() ) + { facing = false; + } if ( self _hasPerk( "specialty_blindeye" ) ) + { facing = false; + } if ( !isDefined( turret.sentryType ) || turret.sentryType == "sam_turret" ) + { facing = false; + } if ( facing && !BulletTracePassed( myEye, turret.origin + ( 0, 0, 15 ), false, turret ) ) + { return; + } if ( !IsDefined( turret.bots ) ) + { turret.bots = 0; + } if ( turret.bots >= 2 ) + { return; + } if ( !facing && !self HasScriptGoal() && !self.bot_lock_goal ) { @@ -3890,11 +4641,15 @@ bot_turret_think_loop() self thread bots_watch_touch_obj( turret ); if ( self waittill_any_return( "bad_path", "goal", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } if ( !isDefined( turret ) ) + { return; + } self BotNotifyBotEvent( "turret_attack", "start", turret ); @@ -3930,33 +4685,53 @@ bot_box_think_loop( data ) ret = "bot_check_box_think"; if ( data.first ) + { data.first = false; + } else + { ret = self waittill_any_timeout( randomintrange( 3, 5 ), "bot_check_box_think" ); + } if ( RandomInt( 100 ) < 20 && ret != "bot_check_box_think" ) + { return; + } if ( self HasScriptGoal() || self.bot_lock_goal ) + { return; + } if ( self HasThreat() ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self IsUsingRemote() || self BotIsFrozen() ) + { return; + } if ( self inLastStand() ) + { return; + } if ( isDefined( self.hasLightArmor ) && self.hasLightArmor ) + { return; + } if ( self isJuggernaut() ) + { return; + } box = undefined; myteam = self.pers[ "team" ]; @@ -3968,16 +4743,22 @@ bot_box_think_loop( data ) item = level.vest_boxes[ i ]; if ( !isDefined( item ) ) + { continue; + } if ( isDefined( item.damageTaken ) && isDefined( item.maxHealth ) ) { if ( item.damageTaken >= item.maxHealth ) + { continue; + } } if ( !IsDefined( item.owner ) || ( level.teamBased && item.owner.team != myteam ) || ( !level.teamBased && item.owner != self ) ) + { continue; + } if ( DistanceSquared( item.origin, self.origin ) < dist ) { @@ -3987,7 +4768,9 @@ bot_box_think_loop( data ) } if ( !isDefined( box ) ) + { return; + } self BotNotifyBotEvent( "box_cap", "go", box ); @@ -4003,10 +4786,14 @@ bot_box_think_loop( data ) self.bot_lock_goal = false; if ( path != "new_goal" ) + { self ClearScriptGoal(); + } if ( path != "goal" || !isDefined( box ) || DistanceSquared( self.origin, box.origin ) > radius * radius ) + { return; + } self BotNotifyBotEvent( "box_cap", "start", box ); @@ -4048,7 +4835,9 @@ bot_watch_stuck_on_crate_loop() crates = getEntArray( "care_package", "targetname" ); if ( crates.size == 0 ) + { return; + } crate = undefined; @@ -4057,36 +4846,52 @@ bot_watch_stuck_on_crate_loop() tempCrate = crates[ i ]; if ( !isDefined( tempCrate ) ) + { continue; + } if ( isDefined( tempCrate.owner ) && isDefined( tempCrate.bomb ) ) { if ( tempCrate.owner == self ) + { continue; + } if ( level.teamBased && tempCrate.owner.team == self.team ) + { continue; + } if ( self _hasPerk( "specialty_detectexplosive" ) ) + { continue; + } } if ( !isDefined( tempCrate.doingPhysics ) || tempCrate.doingPhysics ) + { continue; + } if ( isDefined( crate ) && DistanceSquared( crate.origin, self.origin ) < DistanceSquared( tempCrate.origin, self.origin ) ) + { continue; + } crate = tempCrate; } if ( !isDefined( crate ) ) + { return; + } radius = GetDvarFloat( "player_useRadius" ); if ( DistanceSquared( crate.origin, self.origin ) > radius * radius ) + { return; + } self.bot_stuck_on_carepackage = crate; self notify( "crate_physics_done" ); @@ -4106,7 +4911,9 @@ bot_watch_stuck_on_crate() wait 3; if ( self HasThreat() ) + { continue; + } self bot_watch_stuck_on_crate_loop(); } @@ -4121,9 +4928,13 @@ bot_crate_think_loop( data ) ret = "crate_physics_done"; if ( data.first ) + { data.first = false; + } else + { ret = self waittill_any_timeout( randomintrange( 3, 5 ), "crate_physics_done" ); + } crate = self.bot_stuck_on_carepackage; self.bot_stuck_on_carepackage = undefined; @@ -4131,24 +4942,36 @@ bot_crate_think_loop( data ) if ( !isDefined( crate ) ) { if ( RandomInt( 100 ) < 20 && ret != "crate_physics_done" ) + { return; + } if ( self HasScriptGoal() || self.bot_lock_goal ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self IsUsingRemote() || self BotIsFrozen() ) + { return; + } if ( self inLastStand() ) + { return; + } crates = getEntArray( "care_package", "targetname" ); if ( crates.size == 0 ) + { return; + } wantsClosest = randomint( 2 ); @@ -4159,40 +4982,58 @@ bot_crate_think_loop( data ) tempCrate = crates[ i ]; if ( !isDefined( tempCrate ) ) + { continue; + } if ( isDefined( tempCrate.owner ) && isDefined( tempCrate.bomb ) ) { if ( tempCrate.owner == self ) + { continue; + } if ( level.teamBased && tempCrate.owner.team == self.team ) + { continue; + } if ( self _hasPerk( "specialty_detectexplosive" ) ) + { continue; + } } if ( !isDefined( tempCrate.doingPhysics ) || tempCrate.doingPhysics ) + { continue; + } if ( !IsDefined( tempCrate.bots ) ) + { tempCrate.bots = 0; + } if ( tempCrate.bots >= 3 ) + { continue; + } if ( isDefined( crate ) ) { if ( wantsClosest ) { if ( DistanceSquared( crate.origin, self.origin ) < DistanceSquared( tempCrate.origin, self.origin ) ) + { continue; + } } else { if ( maps\mp\killstreaks\_killstreaks::getStreakCost( crate.crateType ) > maps\mp\killstreaks\_killstreaks::getStreakCost( tempCrate.crateType ) ) + { continue; + } } } @@ -4202,7 +5043,9 @@ bot_crate_think_loop( data ) crates = undefined; if ( !isDefined( crate ) ) + { return; + } self BotNotifyBotEvent( "crate_cap", "go", crate ); @@ -4218,12 +5061,16 @@ bot_crate_think_loop( data ) self.bot_lock_goal = false; if ( path != "new_goal" ) + { self ClearScriptGoal(); + } if ( path != "goal" || !isDefined( crate ) || DistanceSquared( self.origin, crate.origin ) > radius * radius ) { if ( isDefined( crate ) && path == "bad_path" ) + { self BotNotifyBotEvent( "crate_cap", "unreachable", crate ); + } return; } @@ -4239,7 +5086,9 @@ bot_crate_think_loop( data ) waitTime = 3.25; if ( !isDefined( crate.owner ) || crate.owner == self ) + { waitTime = 0.75; + } self thread BotPressUse( waitTime ); wait waitTime; @@ -4277,42 +5126,60 @@ doReloadCancel_loop() ret = self waittill_either_return( "reload", "weapon_change" ); if ( self BotIsFrozen() ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self IsUsingRemote() ) + { return; + } if ( self InLastStand() && !self InFinalStand() ) + { return; + } if ( !getDvarInt( "sv_enableDoubleTaps" ) ) + { return; + } // wait for an actual change if ( ret == "weapon_change" ) { for ( i = 0; i < 10 && curWeap == self GetCurrentWeapon(); i++ ) + { wait 0.05; + } } curWeap = self GetCurrentWeapon(); if ( !maps\mp\gametypes\_weapons::isPrimaryWeapon( 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(); @@ -4324,17 +5191,23 @@ doReloadCancel_loop() weaponslist = array_remove( weaponslist, weapon ); if ( !maps\mp\gametypes\_weapons::isPrimaryWeapon( weapon ) ) + { continue; + } if ( curWeap == weapon || weapon == "none" || weapon == "" ) + { continue; + } weap = weapon; break; } if ( weap == "" ) + { return; + } // do the cancel wait 0.1; @@ -4366,16 +5239,24 @@ bot_weapon_think_loop( data ) ret = self waittill_any_timeout( randomIntRange( 2, 4 ), "bot_force_check_switch" ); if ( self BotIsFrozen() ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self IsUsingRemote() ) + { return; + } if ( self InLastStand() && !self InFinalStand() ) + { return; + } curWeap = self GetCurrentWeapon(); hasTarget = self hasThreat(); @@ -4388,7 +5269,9 @@ bot_weapon_think_loop( data ) if ( entIsVehicle( threat ) && isDefined( rocketAmmo ) ) { if ( curWeap != rocketAmmo ) + { self thread ChangeToWeapon( rocketAmmo ); + } return; } @@ -4397,7 +5280,9 @@ bot_weapon_think_loop( data ) if ( self HasBotJavelinLocation() && self GetAmmoCount( "javelin_mp" ) ) { if ( curWeap != "javelin_mp" ) + { self thread ChangeToWeapon( "javelin_mp" ); + } return; } @@ -4409,20 +5294,28 @@ bot_weapon_think_loop( data ) data.first = false; if ( randomInt( 100 ) > self.pers[ "bots" ][ "behavior" ][ "initswitch" ] ) + { return; + } } else { if ( curWeap != "none" && self getAmmoCount( curWeap ) && curWeap != "stinger_mp" && curWeap != "javelin_mp" ) { if ( randomInt( 100 ) > self.pers[ "bots" ][ "behavior" ][ "switch" ] ) + { return; + } if ( hasTarget ) + { return; + } } else + { force = true; + } } weaponslist = self getweaponslistall(); @@ -4434,20 +5327,28 @@ bot_weapon_think_loop( data ) weaponslist = array_remove( weaponslist, weapon ); if ( !self getAmmoCount( weapon ) && !force ) + { continue; + } if ( !isWeaponPrimary( weapon ) ) + { continue; + } if ( curWeap == weapon || weapon == "none" || weapon == "" || weapon == "javelin_mp" || weapon == "stinger_mp" ) + { continue; + } weap = weapon; break; } if ( weap == "" ) + { return; + } self thread ChangeToWeapon( weap ); } @@ -4478,12 +5379,16 @@ bot_target_vehicle_loop() rocketAmmo = self getRocketAmmo(); if ( isDefined( rocketAmmo ) && rocketAmmo == "javelin_mp" && self isEMPed() ) + { return; + } targets = maps\mp\_stinger::GetTargetList(); if ( !targets.size ) + { return; + } lockOnAmmo = self getLockonAmmo(); myEye = self GetEye(); @@ -4494,25 +5399,37 @@ bot_target_vehicle_loop() tempTarget = targets[ i ]; if ( isPlayer( tempTarget ) ) + { continue; + } if ( isDefined( tempTarget.owner ) && tempTarget.owner == self ) + { continue; + } if ( !bulletTracePassed( myEye, tempTarget.origin, false, tempTarget ) ) + { continue; + } if ( tempTarget.health <= 0 ) + { continue; + } if ( isDefined( tempTarget.damageTaken ) && isDefined( tempTarget.maxHealth ) ) { if ( tempTarget.damageTaken >= tempTarget.maxHealth ) + { continue; + } } if ( tempTarget.classname != "script_vehicle" && !isDefined( lockOnAmmo ) ) + { continue; + } target = tempTarget; } @@ -4520,15 +5437,21 @@ bot_target_vehicle_loop() targets = undefined; if ( !isDefined( target ) ) + { return; + } if ( target.model != "vehicle_ugv_talon_mp" && target.model != "vehicle_remote_uav" ) { if ( isDefined( self.remoteTank ) ) + { return; + } if ( !isDefined( rocketAmmo ) && self BotGetRandom() < 90 ) + { return; + } } self BotNotifyBotEvent( "attack_vehicle", "start", target, rocketAmmo ); @@ -4554,13 +5477,19 @@ bot_target_vehicle() wait randomIntRange( 2, 4 ); if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) + { continue; + } if ( self HasScriptEnemy() ) + { continue; + } if ( self IsUsingRemote() && !isDefined( self.remoteTank ) ) + { continue; + } self bot_target_vehicle_loop(); } @@ -4600,22 +5529,34 @@ bot_watch_use_remote_turret() wait 5; if ( self BotIsFrozen() ) + { continue; + } if ( self HasThreat() || self HasBotJavelinLocation() ) + { continue; + } if ( self isDefusing() || self isPlanting() ) + { continue; + } if ( self IsUsingRemote() ) + { continue; + } if ( self InLastStand() && !self InFinalStand() ) + { continue; + } if ( !isDefined( self.remoteTurretList ) || !isDefined( self.remoteTurretList[ 0 ] ) ) + { continue; + } self thread BotPressUse( 3 ); wait 3; @@ -4635,25 +5576,39 @@ getKillstreakTargetLocation() player = level.players[ i ]; if ( player == self ) + { continue; + } if ( !isDefined( player.team ) ) + { continue; + } if ( level.teamBased && self.team == player.team ) + { continue; + } if ( player.sessionstate != "playing" ) + { continue; + } if ( !isReallyAlive( player ) ) + { continue; + } if ( player _hasPerk( "specialty_blindeye" ) ) + { continue; + } if ( !bulletTracePassed( player.origin, player.origin + ( 0, 0, 2048 ), false, player ) && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 ) + { continue; + } players[ players.size ] = player; } @@ -4661,9 +5616,13 @@ getKillstreakTargetLocation() target = random( players ); if ( isDefined( target ) ) + { location = target.origin + ( randomIntRange( ( 8 - self.pers[ "bots" ][ "skill" ][ "base" ] ) * -75, ( 8 - self.pers[ "bots" ][ "skill" ][ "base" ] ) * 75 ), randomIntRange( ( 8 - self.pers[ "bots" ][ "skill" ][ "base" ] ) * -75, ( 8 - self.pers[ "bots" ][ "skill" ][ "base" ] ) * 75 ), 0 ); + } else if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 3 ) + { location = self.origin + ( randomIntRange( -512, 512 ), randomIntRange( -512, 512 ), 0 ); + } return location; } @@ -4679,10 +5638,14 @@ clear_remote_on_death( isac130 ) self waittill_either( "death", "disconnect" ); if ( isDefined( isac130 ) && isac130 ) + { level.ac130InUse = false; + } if ( isDefined( self ) ) + { self ClearUsingRemote(); + } } /* @@ -4696,22 +5659,34 @@ bot_killstreak_think_loop( data ) } if ( self BotIsFrozen() ) + { return; + } if ( self HasThreat() || self HasBotJavelinLocation() ) + { return; + } if ( self isDefusing() || self isPlanting() ) + { return; + } if ( self isEMPed() || self isNuked() ) + { return; + } if ( self IsUsingRemote() ) + { return; + } if ( self InLastStand() && !self InFinalStand() ) + { return; + } if ( isDefined( self.isCarrying ) && self.isCarrying ) @@ -4726,7 +5701,9 @@ bot_killstreak_think_loop( data ) curWeap = self GetCurrentWeapon(); if ( isSubStr( curWeap, "airdrop_" ) || isSubStr( curWeap, "deployable_" ) ) + { self thread BotPressAttack( 0.05 ); + } useableStreaks = []; @@ -4734,16 +5711,24 @@ bot_killstreak_think_loop( data ) if ( !isDefined( data.doFastContinue ) ) { if ( self.pers[ "killstreaks" ][ 0 ].available ) + { useableStreaks[ useableStreaks.size ] = 0; + } if ( self.pers[ "killstreaks" ][ 1 ].available && self.streakType != "specialist" ) + { useableStreaks[ useableStreaks.size ] = 1; + } if ( self.pers[ "killstreaks" ][ 2 ].available && self.streakType != "specialist" ) + { useableStreaks[ useableStreaks.size ] = 2; + } if ( self.pers[ "killstreaks" ][ 3 ].available && self.streakType != "specialist" ) + { useableStreaks[ useableStreaks.size ] = 3; + } } else { @@ -4752,28 +5737,38 @@ bot_killstreak_think_loop( data ) } if ( !useableStreaks.size ) + { return; + } self.killstreakIndexWeapon = random( useableStreaks ); streakName = self.pers[ "killstreaks" ][ self.killstreakIndexWeapon ].streakName; if ( level.inGracePeriod && maps\mp\killstreaks\_killstreaks::deadlyKillstreak( streakName ) ) + { return; + } ksWeap = maps\mp\killstreaks\_killstreaks::getKillstreakWeapon( streakName ); if ( curWeap == "none" || !isWeaponPrimary( curWeap ) ) + { curWeap = self GetLastWeapon(); + } lifeId = self.pers[ "killstreaks" ][ 0 ].lifeId; if ( !isDefined( lifeId ) ) + { lifeId = -1; + } if ( maps\mp\killstreaks\_killstreaks::isRideKillstreak( streakName ) || maps\mp\killstreaks\_killstreaks::isCarryKillstreak( streakName ) || streakName == "sam_turret" || streakName == "remote_mg_turret" ) { if ( self inLastStand() ) + { return; + } if ( lifeId == self.deaths && !self HasScriptGoal() && !self.bot_lock_goal && maps\mp\killstreaks\_killstreaks::isRideKillstreak( streakName ) && !self nearAnyOfWaypoints( 128, getWaypointsOfType( "camp" ) ) ) { @@ -4786,7 +5781,9 @@ bot_killstreak_think_loop( data ) self SetScriptGoal( campSpot.origin, 16 ); if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" ) + { self ClearScriptGoal(); + } data.doFastContinue = self.killstreakIndexWeapon; return; @@ -4796,15 +5793,21 @@ bot_killstreak_think_loop( data ) if ( streakName == "sentry" || streakName == "sam_turret" || streakName == "remote_mg_turret" || streakName == "ims" || streakName == "remote_uav" || streakName == "remote_tank" ) { if ( self HasScriptAimPos() ) + { return; + } if ( streakName == "remote_uav" || streakName == "remote_tank" ) { if ( ( isDefined( level.remote_uav[ self.team ] ) || level.littleBirds.size >= 4 ) && streakName == "remote_uav" ) + { return; + } if ( currentActiveVehicleCount() >= maxVehiclesAllowed() || level.fauxVehicleCount + 1 >= maxVehiclesAllowed() ) + { return; + } } myEye = self GetEye(); @@ -4852,12 +5855,16 @@ bot_killstreak_think_loop( data ) } if ( DistanceSquared( self.origin, forwardTrace[ "position" ] ) < distCheck && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 ) + { return; + } self BotNotifyBotEvent( "killstreak", "call", streakName ); if ( doRandomStance ) + { self BotRandomStance(); + } self BotStopMoving( true ); self SetScriptAimPos( forwardTrace[ "position" ] ); @@ -4883,7 +5890,9 @@ bot_killstreak_think_loop( data ) location = self getKillstreakTargetLocation(); if ( !isDefined( location ) ) + { return; + } self BotNotifyBotEvent( "killstreak", "call", streakName, location ); @@ -4937,13 +5946,17 @@ bot_killstreak_think_loop( data ) if ( streakName == "ac130" ) { if ( isDefined( level.ac130player ) || level.ac130InUse ) + { return; + } } if ( streakName == "remote_mortar" ) { if ( isDefined( level.remote_mortar ) ) + { return; + } } location = undefined; @@ -4952,16 +5965,22 @@ bot_killstreak_think_loop( data ) if ( streakName == "osprey_gunner" ) { if ( isDefined( level.chopper ) ) + { return; + } if ( currentActiveVehicleCount() >= maxVehiclesAllowed() || level.fauxVehicleCount + 1 >= maxVehiclesAllowed() ) + { return; + } location = self getKillstreakTargetLocation(); directionYaw = randomInt( 360 ); if ( !isDefined( location ) ) + { return; + } } self BotNotifyBotEvent( "killstreak", "call", streakName, location, directionYaw ); @@ -4990,7 +6009,9 @@ bot_killstreak_think_loop( data ) forwardTrace = bulletTrace( myEye, myEye + AnglesToForward( angles ) * 128, false, self ); if ( DistanceSquared( self.origin, forwardTrace[ "position" ] ) < 96 * 96 && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 ) + { return; + } self BotNotifyBotEvent( "killstreak", "call", streakName ); @@ -5022,19 +6043,29 @@ bot_killstreak_think_loop( data ) if ( streakName == "escort_airdrop" || streakName == "airdrop_juggernaut_recon" || streakName == "airdrop_trap" || streakName == "airdrop_juggernaut" || streakName == "airdrop_remote_tank" || streakName == "airdrop_sentry_minigun" || streakName == "airdrop_assault" ) { if ( self HasScriptAimPos() ) + { return; + } if ( ( level.littleBirds.size >= 4 || level.fauxVehicleCount >= 4 ) && !isSubStr( toLower( streakName ), "juggernaut" ) ) + { return; + } if ( currentActiveVehicleCount() >= maxVehiclesAllowed() || level.fauxVehicleCount + 1 >= maxVehiclesAllowed() ) + { return; + } if ( IsSubStr( toLower( streakName ), "escort_airdrop" ) && isDefined( level.chopper ) ) + { return; + } if ( !bulletTracePassed( self.origin, self.origin + ( 0, 0, 2048 ), false, self ) && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 ) + { return; + } myEye = self GetEye(); angles = self GetPlayerAngles(); @@ -5042,10 +6073,14 @@ bot_killstreak_think_loop( data ) forwardTrace = bulletTrace( myEye, myEye + AnglesToForward( angles ) * 256, false, self ); if ( DistanceSquared( self.origin, forwardTrace[ "position" ] ) < 96 * 96 && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 ) + { return; + } if ( !bulletTracePassed( forwardTrace[ "position" ], forwardTrace[ "position" ] + ( 0, 0, 2048 ), false, self ) && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 ) + { return; + } self BotNotifyBotEvent( "killstreak", "call", streakName ); @@ -5073,7 +6108,9 @@ bot_killstreak_think_loop( data ) } if ( randomInt( 100 ) < 80 && !self HasScriptGoal() && !self.bot_lock_goal ) + { self waittill_any_timeout( 15, "crate_physics_done", "new_goal" ); + } self BotStopMoving( false ); self ClearScriptAimPos(); @@ -5081,32 +6118,48 @@ bot_killstreak_think_loop( data ) else { if ( streakName == "nuke" && isDefined( level.nukeIncoming ) ) + { return; + } if ( streakName == "counter_uav" && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 && ( ( level.teamBased && level.activeCounterUAVs[ self.team ] ) || ( !level.teamBased && level.activeCounterUAVs[ self.guid ] ) ) ) + { return; + } if ( ( streakName == "uav" || streakName == "uav_support" || streakName == "triple_uav" ) && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 && ( ( level.teamBased && ( level.activeUAVs[ self.team ] || level.activeCounterUAVs[ level.otherTeam[ self.team ] ] ) ) || ( !level.teamBased && ( level.activeUAVs[ self.guid ] || self.isRadarBlocked ) ) ) ) + { return; + } if ( streakName == "emp" && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 && ( ( level.teamBased && level.teamEMPed[ level.otherTeam[ self.team ] ] ) || ( !level.teamBased && isDefined( level.empPlayer ) ) ) ) + { return; + } if ( streakName == "littlebird_flock" || streakName == "helicopter" || streakName == "helicopter_flares" || streakName == "littlebird_support" ) { numIncomingVehicles = 1; if ( streakName == "littlebird_flock" ) + { numIncomingVehicles = 5; + } if ( currentActiveVehicleCount() >= maxVehiclesAllowed() || level.fauxVehicleCount + numIncomingVehicles >= maxVehiclesAllowed() ) + { return; + } if ( streakName == "helicopter" && isDefined( level.chopper ) ) + { return; + } if ( streakName == "littlebird_support" && ( isDefined( level.littlebirdGuard ) || maps\mp\killstreaks\_helicopter::exceededMaxLittlebirds( "littlebird_support" ) ) ) + { return; + } } location = undefined; @@ -5121,7 +6174,9 @@ bot_killstreak_think_loop( data ) directionYaw = randomInt( 360 ); if ( !isDefined( location ) ) + { return; + } case "helicopter": case "helicopter_flares": @@ -5182,11 +6237,17 @@ bot_killstreak_think() BotRandomStance() { if ( randomInt( 100 ) < 80 ) + { self BotSetStance( "prone" ); + } else if ( randomInt( 100 ) < 60 ) + { self BotSetStance( "crouch" ); + } else + { self BotSetStance( "stand" ); + } } /* @@ -5200,28 +6261,44 @@ BotUseRandomEquipment() nade = undefined; if ( self GetAmmoCount( "claymore_mp" ) ) + { nade = "claymore_mp"; + } if ( self GetAmmoCount( "flare_mp" ) ) + { nade = "flare_mp"; + } if ( self GetAmmoCount( "c4_mp" ) ) + { nade = "c4_mp"; + } if ( self GetAmmoCount( "bouncingbetty_mp" ) ) + { nade = "bouncingbetty_mp"; + } if ( self GetAmmoCount( "portable_radar_mp" ) ) + { nade = "portable_radar_mp"; + } if ( self GetAmmoCount( "scrambler_mp" ) ) + { nade = "scrambler_mp"; + } if ( self GetAmmoCount( "trophy_mp" ) ) + { nade = "trophy_mp"; + } if ( !isDefined( nade ) ) + { return; + } self botThrowGrenade( nade, 0.05 ); } @@ -5235,7 +6312,9 @@ BotLookAtRandomThing( obj_target ) self endon( "disconnect" ); if ( self HasScriptAimPos() ) + { return; + } rand = RandomInt( 100 ); @@ -5246,13 +6325,19 @@ BotLookAtRandomThing( obj_target ) player = level.players[ i ]; if ( !isDefined( player ) || !isDefined( player.team ) ) + { continue; + } if ( !isAlive( player ) ) + { continue; + } if ( level.teamBased && self.team == player.team ) + { continue; + } if ( !isDefined( nearestEnemy ) || DistanceSquared( self.origin, player.origin ) < DistanceSquared( self.origin, nearestEnemy.origin ) ) { @@ -5263,13 +6348,21 @@ BotLookAtRandomThing( obj_target ) origin = ( 0, 0, self GetPlayerViewHeight() ); if ( isDefined( nearestEnemy ) && DistanceSquared( self.origin, nearestEnemy.origin ) < 1024 * 1024 && rand < 40 ) + { origin += ( nearestEnemy.origin[ 0 ], nearestEnemy.origin[ 1 ], self.origin[ 2 ] ); + } else if ( isDefined( obj_target ) && rand < 50 ) + { origin += ( obj_target.origin[ 0 ], obj_target.origin[ 1 ], self.origin[ 2 ] ); + } else if ( rand < 85 ) + { origin += self.origin + AnglesToForward( ( 0, self.angles[ 1 ] - 180, 0 ) ) * 1024; + } else + { origin += self.origin + AnglesToForward( ( 0, RandomInt( 360 ), 0 ) ) * 1024; + } self SetScriptAimPos( origin ); wait 2; @@ -5291,17 +6384,25 @@ bot_do_random_action_for_objective( obj_target ) self.bot_random_obj_action = true; if ( randomInt( 100 ) < 80 ) + { self thread BotUseRandomEquipment(); + } if ( randomInt( 100 ) < 75 ) + { self thread BotLookAtRandomThing( obj_target ); + } } else { if ( self GetStance() != "prone" && randomInt( 100 ) < 15 ) + { self BotSetStance( "prone" ); + } else if ( randomInt( 100 ) < 5 ) + { self thread BotLookAtRandomThing( obj_target ); + } } wait 2; @@ -5318,28 +6419,38 @@ bot_dom_spawn_kill_think_loop() myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); if ( myFlagCount == level.flags.size ) + { return; + } otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); if ( myFlagCount <= otherFlagCount || otherFlagCount != 1 ) + { return; + } flag = undefined; for ( i = 0; i < level.flags.size; i++ ) { if ( level.flags[ i ] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) + { continue; + } flag = level.flags[ i ]; } if ( !isDefined( flag ) ) + { return; + } if ( DistanceSquared( self.origin, flag.origin ) < 2048 * 2048 ) + { return; + } self BotNotifyBotEvent( "dom", "start", "spawnkill", flag ); @@ -5348,7 +6459,9 @@ bot_dom_spawn_kill_think_loop() self thread bot_dom_watch_flags( myFlagCount, myTeam ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self BotNotifyBotEvent( "dom", "stop", "spawnkill", flag ); } @@ -5362,17 +6475,23 @@ bot_dom_spawn_kill_think() self endon( "disconnect" ); if ( level.gametype != "dom" ) + { return; + } for ( ;; ) { wait( randomintrange( 10, 20 ) ); if ( randomint( 100 ) < 20 ) + { continue; + } if ( self HasScriptGoal() || self.bot_lock_goal ) + { continue; + } self bot_dom_spawn_kill_think_loop(); } @@ -5394,7 +6513,9 @@ bot_dom_watch_flags( count, myTeam ) wait 0.5; if ( maps\mp\gametypes\dom::getTeamFlagCount( myTeam ) != count ) + { break; + } } self notify( "bad_path" ); @@ -5411,17 +6532,25 @@ bot_dom_def_think_loop() for ( i = 0; i < level.flags.size; i++ ) { if ( level.flags[ i ] maps\mp\gametypes\dom::getFlagTeam() != myTeam ) + { continue; + } if ( !level.flags[ i ].useObj.objPoints[ myTeam ].isFlashing ) + { continue; + } if ( !isDefined( flag ) || DistanceSquared( self.origin, level.flags[ i ].origin ) < DistanceSquared( self.origin, flag.origin ) ) + { flag = level.flags[ i ]; + } } if ( !isDefined( flag ) ) + { return; + } self BotNotifyBotEvent( "dom", "start", "defend", flag ); @@ -5431,7 +6560,9 @@ bot_dom_def_think_loop() self thread bots_watch_touch_obj( flag ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self BotNotifyBotEvent( "dom", "stop", "defend", flag ); } @@ -5445,17 +6576,23 @@ bot_dom_def_think() self endon( "disconnect" ); if ( level.gametype != "dom" ) + { return; + } for ( ;; ) { wait( randomintrange( 1, 3 ) ); if ( randomint( 100 ) < 35 ) + { continue; + } if ( self HasScriptGoal() || self.bot_lock_goal ) + { continue; + } self bot_dom_def_think_loop(); } @@ -5477,10 +6614,14 @@ bot_dom_watch_for_flashing( flag, myTeam ) wait 0.5; if ( !isDefined( flag ) ) + { break; + } if ( flag maps\mp\gametypes\dom::getFlagTeam() != myTeam || !flag.useObj.objPoints[ myTeam ].isFlashing ) + { break; + } } self notify( "bad_path" ); @@ -5497,7 +6638,9 @@ bot_dom_cap_think_loop() myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); if ( myFlagCount == level.flags.size ) + { return; + } otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); @@ -5506,17 +6649,23 @@ bot_dom_cap_think_loop() if ( myFlagCount < otherFlagCount ) { if ( randomint( 100 ) < 15 ) + { return; + } } else if ( myFlagCount == otherFlagCount ) { if ( randomint( 100 ) < 35 ) + { return; + } } else if ( myFlagCount > otherFlagCount ) { if ( randomint( 100 ) < 95 ) + { return; + } } } @@ -5526,7 +6675,9 @@ bot_dom_cap_think_loop() for ( i = 0; i < level.flags.size; i++ ) { if ( level.flags[ i ] maps\mp\gametypes\dom::getFlagTeam() == myTeam ) + { continue; + } flags[ flags.size ] = level.flags[ i ]; } @@ -5536,7 +6687,9 @@ bot_dom_cap_think_loop() for ( i = 0; i < flags.size; i++ ) { if ( !isDefined( flag ) || DistanceSquared( self.origin, level.flags[ i ].origin ) < DistanceSquared( self.origin, flag.origin ) ) + { flag = level.flags[ i ]; + } } } else if ( flags.size ) @@ -5545,7 +6698,9 @@ bot_dom_cap_think_loop() } if ( !isDefined( flag ) ) + { return; + } self BotNotifyBotEvent( "dom", "go", "cap", flag ); @@ -5557,7 +6712,9 @@ bot_dom_cap_think_loop() event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" ) { @@ -5575,7 +6732,9 @@ bot_dom_cap_think_loop() wait 0.5; if ( flag.useObj.curProgress == cur ) + { break; // some enemy is near us, kill him + } self thread bot_do_random_action_for_objective( flag ); } @@ -5596,7 +6755,9 @@ bot_dom_cap_think() self endon( "disconnect" ); if ( level.gametype != "dom" ) + { return; + } for ( ;; ) { @@ -5608,7 +6769,9 @@ bot_dom_cap_think() } if ( !isDefined( level.flags ) || level.flags.size == 0 ) + { continue; + } self bot_dom_cap_think_loop(); } @@ -5630,19 +6793,29 @@ bot_dom_go_cap_flag( flag, myteam ) wait randomintrange( 2, 4 ); if ( !isDefined( flag ) ) + { break; + } if ( flag maps\mp\gametypes\dom::getFlagTeam() == myTeam ) + { break; + } if ( self isTouching( flag ) ) + { break; + } } if ( flag maps\mp\gametypes\dom::getFlagTeam() == myTeam ) + { self notify( "bad_path" ); + } else + { self notify( "goal" ); + } } /* @@ -5663,15 +6836,21 @@ bot_hq_loop() if ( gameobj.interactTeam == "none" ) // wait for it to become active { if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -5687,7 +6866,9 @@ bot_hq_loop() event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" ) { @@ -5711,7 +6892,9 @@ bot_hq_loop() wait 0.5; if ( cur == gameobj.curProgress ) + { break; // no prog made, enemy must be capping + } self thread bot_do_random_action_for_objective( gameobj.trigger ); } @@ -5732,7 +6915,9 @@ bot_hq_loop() self thread bot_hq_watch_flashing( gameobj, radio ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -5741,15 +6926,21 @@ bot_hq_loop() } if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } } @@ -5762,7 +6953,9 @@ bot_hq() self endon( "disconnect" ); if ( level.gametype != "koth" ) + { return; + } for ( ;; ) { @@ -5774,10 +6967,14 @@ bot_hq() } if ( !isDefined( level.radio ) ) + { continue; + } if ( !isDefined( level.radio.gameobject ) ) + { continue; + } self bot_hq_loop(); } @@ -5799,19 +6996,29 @@ bot_hq_go_cap( obj, radio ) wait randomintrange( 2, 4 ); if ( !isDefined( obj ) ) + { break; + } if ( self isTouching( obj.trigger ) ) + { break; + } if ( level.radio != radio ) + { break; + } } if ( level.radio != radio ) + { self notify( "bad_path" ); + } else + { self notify( "goal" ); + } } /* @@ -5832,13 +7039,19 @@ bot_hq_watch_flashing( obj, radio ) wait 0.5; if ( !isDefined( obj ) ) + { break; + } if ( !obj.objPoints[ myteam ].isFlashing ) + { break; + } if ( level.radio != radio ) + { break; + } } self notify( "bad_path" ); @@ -5877,7 +7090,9 @@ bot_sab_loop() self thread bot_defend_site( site ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -5887,13 +7102,17 @@ bot_sab_loop() // else hang around the site if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self.bot_lock_goal = true; self SetScriptGoal( origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -5904,18 +7123,24 @@ bot_sab_loop() { // lets escort the bomb carrier if ( self HasScriptGoal() ) + { return; + } origin = carrier.origin; if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_escort_obj( bomb, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -5924,7 +7149,9 @@ bot_sab_loop() timepassed = getTimePassed() / 1000; if ( timepassed < 120 && timeleft >= 90 && randomInt( 100 ) < 98 ) + { return; + } self BotNotifyBotEvent( "sab", "go", "plant" ); @@ -5935,7 +7162,9 @@ bot_sab_loop() event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" || level.bombPlanted || !self isTouching( site.trigger ) || site IsInUse() || self inLastStand() || self HasThreat() ) { @@ -5963,7 +7192,9 @@ bot_sab_loop() site = level.bombZones[ myteam ]; if ( !isDefined( site.bots ) ) + { site.bots = 0; + } // protect our site from planters if ( !level.bombPlanted ) @@ -5972,10 +7203,14 @@ bot_sab_loop() if ( site.bots > 2 || randomInt( 100 ) < 45 ) { if ( self HasScriptGoal() ) + { return; + } if ( carrier _hasPerk( "specialty_coldblooded" ) ) + { return; + } origin = carrier.origin; @@ -5983,7 +7218,9 @@ bot_sab_loop() self thread bot_escort_obj( bomb, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -6004,7 +7241,9 @@ bot_sab_loop() self thread bot_defend_site( site ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -6026,7 +7265,9 @@ bot_sab_loop() self thread bot_inc_bots( site ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -6039,16 +7280,22 @@ bot_sab_loop() if ( site.bots > 1 ) { if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_go_defuse( site ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -6065,7 +7312,9 @@ bot_sab_loop() event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" || !level.bombPlanted || site IsInUse() || !self isTouching( site.trigger ) || self InLastStand() || self HasThreat() ) { @@ -6100,7 +7349,9 @@ bot_sab_loop() self thread bot_get_obj( bomb ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -6119,7 +7370,9 @@ bot_sab() level endon( "game_ended" ); if ( level.gametype != "sab" ) + { return; + } for ( ;; ) { @@ -6131,13 +7384,19 @@ bot_sab() } if ( !isDefined( level.sabBomb ) ) + { continue; + } if ( !isDefined( level.bombZones ) || !level.bombZones.size ) + { continue; + } if ( self IsPlanting() || self isDefusing() ) + { continue; + } self bot_sab_loop(); } @@ -6157,7 +7416,9 @@ bot_sd_defenders_loop( data ) timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000; if ( timeleft >= 90 ) + { return; + } // check for a bomb carrier, and camp the bomb if ( !level.multiBomb && isDefined( level.sdBomb ) ) @@ -6171,17 +7432,23 @@ bot_sd_defenders_loop( data ) // hang around the bomb if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_get_obj( bomb ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -6189,7 +7456,9 @@ bot_sd_defenders_loop( data ) // pick a site to protect if ( !isDefined( level.bombZones ) || !level.bombZones.size ) + { return; + } sites = []; @@ -6199,15 +7468,23 @@ bot_sd_defenders_loop( data ) } if ( !sites.size ) + { return; + } if ( data.rand > 50 ) + { site = self bot_array_nearest_curorigin( sites ); + } else + { site = random( sites ); + } if ( !isDefined( site ) ) + { return; + } origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 5 ); @@ -6221,7 +7498,9 @@ bot_sd_defenders_loop( data ) self thread bot_defend_site( site ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -6231,13 +7510,17 @@ bot_sd_defenders_loop( data ) // else hang around the site if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self.bot_lock_goal = true; self SetScriptGoal( origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -6245,12 +7528,16 @@ bot_sd_defenders_loop( data ) // bomb is planted, we need to defuse if ( !isDefined( level.defuseObject ) ) + { return; + } defuse = level.defuseObject; if ( !isDefined( defuse.bots ) ) + { defuse.bots = 0; + } origin = ( defuse.curorigin[ 0 ], defuse.curorigin[ 1 ], defuse.curorigin[ 2 ] + 5 ); @@ -6258,16 +7545,22 @@ bot_sd_defenders_loop( data ) if ( defuse.bots > 1 ) { if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_go_defuse( defuse ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -6283,7 +7576,9 @@ bot_sd_defenders_loop( data ) event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" || !level.bombPlanted || defuse isInUse() || !self isTouching( defuse.trigger ) || self InLastStand() || self HasThreat() ) { @@ -6317,10 +7612,14 @@ bot_sd_defenders() level endon( "game_ended" ); if ( level.gametype != "sd" ) + { return; + } if ( self.team == game[ "attackers" ] ) + { return; + } data = spawnStruct(); data.rand = self BotGetRandom(); @@ -6335,7 +7634,9 @@ bot_sd_defenders() } if ( self IsPlanting() || self isDefusing() ) + { continue; + } self bot_sd_defenders_loop( data ); } @@ -6347,9 +7648,13 @@ bot_sd_defenders() bot_sd_attackers_loop( data ) { if ( data.first ) + { data.first = false; + } else + { wait( randomintrange( 3, 5 ) ); + } if ( self IsUsingRemote() || self.bot_lock_goal ) { @@ -6363,7 +7668,9 @@ bot_sd_attackers_loop( data ) if ( level.bombPlanted ) { if ( !isDefined( level.defuseObject ) ) + { return; + } site = level.defuseObject; @@ -6380,7 +7687,9 @@ bot_sd_attackers_loop( data ) self thread bot_defend_site( site ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -6390,13 +7699,17 @@ bot_sd_attackers_loop( data ) // else hang around the site if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self.bot_lock_goal = true; self SetScriptGoal( origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -6409,7 +7722,9 @@ bot_sd_attackers_loop( data ) if ( !self IsBombCarrier() && !level.multiBomb ) { if ( !isDefined( level.sdBomb ) ) + { return; + } bomb = level.sdBomb; carrier = level.sdBomb.carrier; @@ -6419,24 +7734,32 @@ bot_sd_attackers_loop( data ) { // escort the bomb carrier if ( self HasScriptGoal() ) + { return; + } origin = carrier.origin; if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_escort_obj( bomb, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } if ( !isDefined( bomb.bots ) ) + { bomb.bots = 0; + } origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 5 ); @@ -6444,17 +7767,23 @@ bot_sd_attackers_loop( data ) if ( bomb.bots > 1 ) { if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_get_obj( bomb ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -6468,7 +7797,9 @@ bot_sd_attackers_loop( data ) self thread bot_get_obj( bomb ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -6478,10 +7809,14 @@ bot_sd_attackers_loop( data ) // check if to plant if ( timepassed < 120 && timeleft >= 90 && randomInt( 100 ) < 98 ) + { return; + } if ( !isDefined( level.bombZones ) || !level.bombZones.size ) + { return; + } sites = []; @@ -6491,15 +7826,23 @@ bot_sd_attackers_loop( data ) } if ( !sites.size ) + { return; + } if ( data.rand > 50 ) + { plant = self bot_array_nearest_curorigin( sites ); + } else + { plant = random( sites ); + } if ( !isDefined( plant ) ) + { return; + } origin = ( plant.curorigin[ 0 ] + 50, plant.curorigin[ 1 ] + 50, plant.curorigin[ 2 ] + 5 ); @@ -6512,7 +7855,9 @@ bot_sd_attackers_loop( data ) event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" || level.bombPlanted || plant.visibleTeam == "none" || !self isTouching( plant.trigger ) || self InLastStand() || self HasThreat() || plant IsInUse() ) { @@ -6546,10 +7891,14 @@ bot_sd_attackers() level endon( "game_ended" ); if ( level.gametype != "sd" ) + { return; + } if ( self.team != game[ "attackers" ] ) + { return; + } data = spawnStruct(); data.rand = self BotGetRandom(); @@ -6614,10 +7963,14 @@ bot_cap_loop() else { if ( self HasScriptGoal() ) + { return; + } if ( !isDefined( theirzone.bots ) ) + { theirzone.bots = 0; + } origin = theirzone.curorigin; @@ -6625,7 +7978,9 @@ bot_cap_loop() { // kill carrier if ( carrier _hasPerk( "specialty_coldblooded" ) ) + { return; + } origin = carrier.origin; @@ -6633,7 +7988,9 @@ bot_cap_loop() self thread bot_escort_obj( myflag, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -6654,7 +8011,9 @@ bot_cap_loop() self thread bot_escort_obj( myflag, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } } } @@ -6676,7 +8035,9 @@ bot_cap_loop() wait 1; if ( evt != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -6699,18 +8060,24 @@ bot_cap_loop() // escort them if ( self HasScriptGoal() ) + { return; + } origin = carrier.origin; if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_escort_obj( theirflag, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } } @@ -6724,7 +8091,9 @@ bot_cap() level endon( "game_ended" ); if ( level.gametype != "ctf" ) + { return; + } for ( ;; ) { @@ -6736,10 +8105,14 @@ bot_cap() } if ( !isDefined( level.capZones ) ) + { continue; + } if ( !isDefined( level.teamFlags ) ) + { continue; + } self bot_cap_loop(); } @@ -6753,7 +8126,9 @@ getCarrierEntNum() carrierNum = -1; if ( isDefined( self.carrier ) ) + { carrierNum = self.carrier getEntityNumber(); + } return carrierNum; } @@ -6775,7 +8150,9 @@ bot_cap_get_flag( flag ) evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( evt != "new_goal" ) + { self ClearScriptGoal(); + } if ( evt != "goal" ) { @@ -6792,7 +8169,9 @@ bot_cap_get_flag( flag ) wait 0.5; if ( flag.curProgress == cur ) + { break; // some enemy is near us, kill him + } } self ClearScriptGoal(); @@ -6817,16 +8196,24 @@ bot_dem_go_plant( plant ) wait 0.5; if ( ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) ) + { break; + } if ( self isTouching( plant.trigger ) ) + { break; + } } if ( ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) ) + { self notify( "bad_path" ); + } else + { self notify( "goal" ); + } } /* @@ -6849,7 +8236,9 @@ bot_dem_attack_spawnkill() wait 0.5; if ( l1 != level.bombAPlanted || l2 != level.bombBPlanted ) + { break; + } } self notify( "bad_path" ); @@ -6880,9 +8269,13 @@ bot_dem_attackers_loop() if ( bomb.label == "_a" ) { if ( level.bombAPlanted ) + { bombs[ bombs.size ] = bomb; + } else + { sites[ sites.size ] = bomb; + } continue; } @@ -6890,9 +8283,13 @@ bot_dem_attackers_loop() if ( bomb.label == "_b" ) { if ( level.bombBPlanted ) + { bombs[ bombs.size ] = bomb; + } else + { sites[ sites.size ] = bomb; + } continue; } @@ -6908,24 +8305,32 @@ bot_dem_attackers_loop() if ( ( ( bombed + bombs.size == 1 && timeleft >= 90 ) || ( shouldLet && !bombs.size ) ) && randomInt( 100 ) < 95 ) { if ( self HasScriptGoal() ) + { return; + } spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_defender_start" ); if ( !spawnPoints.size ) + { return; + } spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 2048 * 2048 ) + { return; + } self SetScriptGoal( spawnpoint.origin, 1024 ); self thread bot_dem_attack_spawnkill(); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -6938,18 +8343,24 @@ bot_dem_attackers_loop() spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_attacker_start" ); if ( !spawnPoints.size ) + { return; + } spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 1024 * 1024 ) + { return; + } self.bot_lock_goal = true; self SetScriptGoal( spawnpoint.origin, 512 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -6972,7 +8383,9 @@ bot_dem_attackers_loop() self thread bot_defend_site( site ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -6982,13 +8395,17 @@ bot_dem_attackers_loop() // else hang around the site if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self.bot_lock_goal = true; self SetScriptGoal( origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -6996,15 +8413,21 @@ bot_dem_attackers_loop() // else go plant if ( !sites.size ) + { return; + } plant = self bot_array_nearest_curorigin( sites ); if ( !isDefined( plant ) ) + { return; + } if ( !isDefined( plant.bots ) ) + { plant.bots = 0; + } origin = ( plant.curorigin[ 0 ] + 50, plant.curorigin[ 1 ] + 50, plant.curorigin[ 2 ] + 5 ); @@ -7012,16 +8435,22 @@ bot_dem_attackers_loop() if ( plant.bots > 1 && timeleft >= 60 ) { if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_dem_go_plant( plant ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -7037,7 +8466,9 @@ bot_dem_attackers_loop() event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" || ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) || plant IsInUse() || !self isTouching( plant.trigger ) || self InLastStand() || self HasThreat() ) { @@ -7072,13 +8503,19 @@ bot_dem_attackers() level endon( "game_ended" ); if ( level.gametype != "dd" ) + { return; + } if ( self.team != game[ "attackers" ] ) + { return; + } if ( inOvertime() ) + { return; + } for ( ;; ) { @@ -7090,7 +8527,9 @@ bot_dem_attackers() } if ( !isDefined( level.bombZones ) || !level.bombZones.size ) + { continue; + } self bot_dem_attackers_loop(); } @@ -7121,9 +8560,13 @@ bot_dem_defenders_loop() if ( bomb.label == "_a" ) { if ( level.bombAPlanted ) + { bombs[ bombs.size ] = bomb; + } else + { sites[ sites.size ] = bomb; + } continue; } @@ -7131,9 +8574,13 @@ bot_dem_defenders_loop() if ( bomb.label == "_b" ) { if ( level.bombBPlanted ) + { bombs[ bombs.size ] = bomb; + } else + { sites[ sites.size ] = bomb; + } continue; } @@ -7149,24 +8596,32 @@ bot_dem_defenders_loop() if ( ( !bombs.size && timeleft >= 60 && randomInt( 100 ) < 95 ) || ( shouldLet && bombs.size == 1 ) ) { if ( self HasScriptGoal() ) + { return; + } spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_attacker_start" ); if ( !spawnPoints.size ) + { return; + } spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 2048 * 2048 ) + { return; + } self SetScriptGoal( spawnpoint.origin, 1024 ); self thread bot_dem_defend_spawnkill(); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -7179,18 +8634,24 @@ bot_dem_defenders_loop() spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_defender_start" ); if ( !spawnPoints.size ) + { return; + } spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 1024 * 1024 ) + { return; + } self.bot_lock_goal = true; self SetScriptGoal( spawnpoint.origin, 512 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -7213,7 +8674,9 @@ bot_dem_defenders_loop() self thread bot_defend_site( site ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -7224,13 +8687,17 @@ bot_dem_defenders_loop() // else hang around the site if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self.bot_lock_goal = true; self SetScriptGoal( origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -7239,15 +8706,21 @@ bot_dem_defenders_loop() // else go defuse if ( !bombs.size ) + { return; + } defuse = self bot_array_nearest_curorigin( bombs ); if ( !isDefined( defuse ) ) + { return; + } if ( !isDefined( defuse.bots ) ) + { defuse.bots = 0; + } origin = ( defuse.curorigin[ 0 ] + 50, defuse.curorigin[ 1 ] + 50, defuse.curorigin[ 2 ] + 5 ); @@ -7255,17 +8728,23 @@ bot_dem_defenders_loop() if ( defuse.bots > 1 && bombed + bombs.size != 2 ) { if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_dem_go_defuse( defuse ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -7281,7 +8760,9 @@ bot_dem_defenders_loop() event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" || ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) || defuse IsInUse() || !self isTouching( defuse.trigger ) || self InLastStand() || self HasThreat() ) { @@ -7316,13 +8797,19 @@ bot_dem_defenders() level endon( "game_ended" ); if ( level.gametype != "dd" ) + { return; + } if ( self.team == game[ "attackers" ] ) + { return; + } if ( inOvertime() ) + { return; + } for ( ;; ) { @@ -7334,7 +8821,9 @@ bot_dem_defenders() } if ( !isDefined( level.bombZones ) || !level.bombZones.size ) + { continue; + } self bot_dem_defenders_loop(); } @@ -7350,10 +8839,14 @@ bot_dem_overtime() level endon( "game_ended" ); if ( level.gametype != "dd" ) + { return; + } if ( !inOvertime() ) + { return; + } for ( ;; ) { @@ -7365,7 +8858,9 @@ bot_dem_overtime() } if ( !isDefined( level.bombZones ) || !level.bombZones.size ) + { continue; + } if ( !level.bombZones[ 0 ].bombPlanted || !level.bombZones[ 0 ] maps\mp\gametypes\_gameobjects::isFriendlyTeam( self.team ) ) { @@ -7394,16 +8889,24 @@ bot_dem_go_defuse( defuse ) wait 0.5; if ( self isTouching( defuse.trigger ) ) + { break; + } if ( ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) ) + { break; + } } if ( ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) ) + { self notify( "bad_path" ); + } else + { self notify( "goal" ); + } } /* @@ -7423,7 +8926,9 @@ bot_dem_defend_spawnkill() wait 0.5; if ( level.bombBPlanted || level.bombAPlanted ) + { break; + } } self notify( "bad_path" ); @@ -7441,17 +8946,25 @@ bot_think_revive_loop() player = level.players[ i ]; if ( player.team != self.team ) + { continue; + } if ( distanceSquared( self.origin, player.origin ) >= 2048 * 2048 ) + { continue; + } if ( player inLastStand() ) + { needsRevives[ needsRevives.size ] = player; + } } if ( !needsRevives.size ) + { return; + } revive = random( needsRevives ); @@ -7464,12 +8977,16 @@ bot_think_revive_loop() ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); if ( ret != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; if ( ret != "goal" || !isDefined( revive ) || distanceSquared( self.origin, revive.origin ) >= 100 * 100 || !revive inLastStand() || revive isBeingRevived() || !isAlive( revive ) ) + { return; + } self BotNotifyBotEvent( "revive", "start", revive ); @@ -7495,23 +9012,33 @@ bot_think_revive() level endon( "game_ended" ); if ( !level.dieHardMode || !level.teamBased ) + { return; + } for ( ;; ) { wait( randomintrange( 1, 3 ) ); if ( self HasScriptGoal() || self.bot_lock_goal ) + { continue; + } if ( self isDefusing() || self isPlanting() ) + { continue; + } if ( self IsUsingRemote() || self BotIsFrozen() ) + { continue; + } if ( self inLastStand() ) + { continue; + } self bot_think_revive_loop(); } @@ -7543,7 +9070,9 @@ bot_gtnw_loop() ret = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( ret != "new_goal" ) + { self ClearScriptGoal(); + } if ( ret != "goal" || !self isTouching( trigger ) ) { @@ -7561,7 +9090,9 @@ bot_gtnw_loop() wait 0.5; if ( cur == level.nukeSite.curProgress ) + { break; // no prog made, enemy must be capping + } self thread bot_do_random_action_for_objective( trigger ); } @@ -7582,7 +9113,9 @@ bot_gtnw_loop() self thread bots_watch_touch_obj( trigger ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; return; @@ -7590,13 +9123,17 @@ bot_gtnw_loop() // else hang around the site if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self.bot_lock_goal = true; self SetScriptGoal( origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; } @@ -7611,7 +9148,9 @@ bot_gtnw() level endon( "game_ended" ); if ( level.gametype != "gtnw" ) + { return; + } for ( ;; ) { @@ -7623,7 +9162,9 @@ bot_gtnw() } if ( !isDefined( level.nukeSite ) || !isDefined( level.nukeSite.trigger ) ) + { continue; + } self bot_gtnw_loop(); } @@ -7657,7 +9198,9 @@ bot_oneflag_loop() wait 1; if ( evt != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -7678,18 +9221,24 @@ bot_oneflag_loop() // escort them if ( self HasScriptGoal() ) + { return; + } origin = carrier.origin; if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_escort_obj( theirflag, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } else { @@ -7709,10 +9258,14 @@ bot_oneflag_loop() } if ( self HasScriptGoal() ) + { return; + } if ( !isDefined( theirzone.bots ) ) + { theirzone.bots = 0; + } origin = theirzone.curorigin; @@ -7720,7 +9273,9 @@ bot_oneflag_loop() { // kill carrier if ( carrier _hasPerk( "specialty_coldblooded" ) ) + { return; + } origin = carrier.origin; @@ -7728,7 +9283,9 @@ bot_oneflag_loop() self thread bot_escort_obj( myflag, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } return; } @@ -7749,24 +9306,32 @@ bot_oneflag_loop() self thread bot_escort_obj( myflag, carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } else { // is home, lets hang around and protect if ( self HasScriptGoal() ) + { return; + } origin = myflag.curorigin; if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( origin, 256 ); self thread bot_get_obj( myflag ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } } } @@ -7781,7 +9346,9 @@ bot_oneflag() level endon( "game_ended" ); if ( level.gametype != "oneflag" ) + { return; + } for ( ;; ) { @@ -7793,7 +9360,9 @@ bot_oneflag() } if ( !isDefined( level.capZones ) || !isDefined( level.teamFlags ) ) + { continue; + } self bot_oneflag_loop(); } @@ -7815,7 +9384,9 @@ bot_arena_loop() event = self waittill_any_return( "goal", "bad_path", "new_goal" ); if ( event != "new_goal" ) + { self ClearScriptGoal(); + } if ( event != "goal" || !self isTouching( flag.trigger ) ) { @@ -7833,7 +9404,9 @@ bot_arena_loop() wait 0.5; if ( cur == flag.curProgress ) + { break; // no prog made, enemy must be capping + } self thread bot_do_random_action_for_objective( flag.trigger ); } @@ -7854,7 +9427,9 @@ bot_arena() level endon( "game_ended" ); if ( level.gametype != "arena" ) + { return; + } for ( ;; ) { @@ -7866,7 +9441,9 @@ bot_arena() } if ( !isDefined( level.arenaFlag ) ) + { continue; + } self bot_arena_loop(); } @@ -7890,10 +9467,14 @@ bot_vip_loop() player = level.players[ i ]; if ( !isReallyAlive( player ) ) + { continue; + } if ( isDefined( player.isVip ) && player.isVip ) + { vip = player; + } } if ( self.team == game[ "defenders" ] ) @@ -7913,7 +9494,9 @@ bot_vip_loop() wait 1; if ( evt != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -7924,12 +9507,16 @@ bot_vip_loop() { // protect the vip if ( DistanceSquared( vip.origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( vip.origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } } else @@ -7938,12 +9525,16 @@ bot_vip_loop() { // camp the extraction zone if ( DistanceSquared( level.extractionZone.trigger.origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( level.extractionZone.trigger.origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } else if ( isDefined( vip ) ) { @@ -7951,7 +9542,9 @@ bot_vip_loop() self SetScriptGoal( vip.origin, 32 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } } } @@ -7966,7 +9559,9 @@ bot_vip() level endon( "game_ended" ); if ( level.gametype != "vip" ) + { return; + } for ( ;; ) { @@ -7995,16 +9590,24 @@ bot_conf_loop() temp_tag = level.dogtags[ dog_tag_keys[ i ] ]; if ( !isDefined( temp_tag ) ) + { continue; + } if ( DistanceSquared( self.origin, temp_tag.trigger.origin ) > 1024 * 1024 ) + { continue; + } if ( !isDefined( temp_tag.bots ) ) + { temp_tag.bots = 0; + } if ( temp_tag.bots >= 2 ) + { continue; + } tags[ tags.size ] = temp_tag; } @@ -8027,7 +9630,9 @@ bot_conf_loop() } if ( !isdefined( tag ) ) + { return; + } self BotNotifyBotEvent( "conf", "start", "cap", tag ); @@ -8037,7 +9642,9 @@ bot_conf_loop() self thread bots_watch_touch_obj( tag.trigger ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -8054,7 +9661,9 @@ bot_conf() level endon( "game_ended" ); if ( level.gametype != "conf" ) + { return; + } for ( ;; ) { @@ -8092,16 +9701,24 @@ bots_watch_grnd() wait 1 + randomInt( 5 ) * 0.5; if ( grnd_origin != level.grnd_zone.origin ) + { break; + } if ( self maps\mp\gametypes\grnd::isingrindzone() ) + { break; + } } if ( grnd_origin != level.grnd_zone.origin ) + { self notify( "bad_path" ); + } else + { self notify( "goal" ); + } } /* @@ -8127,7 +9744,9 @@ bot_grnd_loop() target = player; if ( cointoss() ) + { break; + } } } @@ -8139,7 +9758,9 @@ bot_grnd_loop() self thread stop_go_target_on_death( target ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self BotNotifyBotEvent( "grnd", "stop", "kill", target ); } @@ -8155,7 +9776,9 @@ bot_grnd_loop() while ( self HasScriptGoal() && self GetScriptGoal() == goal && self maps\mp\gametypes\grnd::isingrindzone() ) { if ( level.grnd_numplayers[ level.otherTeam[ self.team ] ] ) + { break; + } wait 0.5; @@ -8163,7 +9786,9 @@ bot_grnd_loop() } if ( self HasScriptGoal() && self GetScriptGoal() == goal ) + { self ClearScriptGoal(); + } self BotNotifyBotEvent( "grnd", "stop", "cap" ); } @@ -8181,7 +9806,9 @@ bot_grnd_loop() self thread bots_watch_grnd(); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; @@ -8199,7 +9826,9 @@ bot_grnd() level endon( "game_ended" ); if ( level.gametype != "grnd" ) + { return; + } for ( ;; ) { @@ -8229,29 +9858,39 @@ bot_tdef_loop() if ( level.gameFlag maps\mp\gametypes\_gameobjects::getOwnerTeam() == level.otherTeam[ self.team ] ) { if ( self HasScriptGoal() ) + { return; + } // go kill self SetScriptGoal( level.gameFlag.carrier.origin, 64 ); self thread bot_escort_obj( level.gameFlag, level.gameFlag.carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } else if ( level.gameFlag.carrier != self ) { // go protect if ( self HasScriptGoal() ) + { return; + } if ( DistanceSquared( level.gameFlag.carrier.origin, self.origin ) <= 1024 * 1024 ) + { return; + } self SetScriptGoal( level.gameFlag.carrier.origin, 256 ); self thread bot_escort_obj( level.gameFlag, level.gameFlag.carrier ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } else if ( self BotGetRandom() < 70 ) { @@ -8264,13 +9903,19 @@ bot_tdef_loop() player = level.players[ i ]; if ( !isDefined( player.team ) ) + { continue; + } if ( !isReallyAlive( player ) ) + { continue; + } if ( player.team == self.team ) + { continue; + } count++; avg_org += player.origin; @@ -8286,7 +9931,9 @@ bot_tdef_loop() wp = level.waypoints[ i ]; if ( DistanceSquared( wp.origin, avg_org ) < 1024 * 1024 ) + { continue; + } wps[ wps.size ] = wp; } @@ -8299,7 +9946,9 @@ bot_tdef_loop() self SetScriptGoal( wp.origin, 256 ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } self.bot_lock_goal = false; } @@ -8327,7 +9976,9 @@ bot_tdef() level endon( "game_ended" ); if ( level.gametype != "tdef" ) + { return; + } for ( ;; ) { @@ -8353,7 +10004,9 @@ bot_tdef() bot_infect_loop() { if ( self HasScriptGoal() ) + { return; + } if ( self.team == "axis" ) { @@ -8364,13 +10017,19 @@ bot_infect_loop() player = level.players[ i ]; if ( player == self ) + { continue; + } if ( !isReallyAlive( player ) ) + { continue; + } if ( level.teambased && self.team == player.team ) + { continue; + } if ( !isdefined( target ) || DistanceSquared( self.origin, player.origin ) < DistanceSquared( self.origin, target.origin ) ) { @@ -8384,7 +10043,9 @@ bot_infect_loop() self thread stop_go_target_on_death( target ); if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) + { self ClearScriptGoal(); + } } } } @@ -8399,7 +10060,9 @@ bot_infect() level endon( "game_ended" ); if ( level.gametype != "infect" ) + { return; + } for ( ;; ) { diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index 8b709f1..877e89d 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -17,12 +17,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; @@ -139,7 +145,9 @@ doHostCheck() self.pers[ "bot_host" ] = false; if ( self is_bot() ) + { return; + } result = false; @@ -153,7 +161,9 @@ doHostCheck() } if ( getDvar( "bots_main_firstIsHost" ) == self getguid() + "" ) + { result = true; + } } DvarGUID = getDvar( "bots_main_GUIDs" ); @@ -165,12 +175,16 @@ doHostCheck() for ( i = 0; i < guids.size; i++ ) { if ( self getguid() + "" == guids[ i ] ) + { result = true; + } } } if ( !self isHost() && !result ) + { return; + } self.pers[ "bot_host" ] = true; } @@ -253,7 +267,9 @@ BotPressAttack( time ) BotGetTargetRandom() { if ( !isDefined( self.bot.target ) ) + { return undefined; + } return self.bot.target.rand; } @@ -314,7 +330,9 @@ BotFreezeControls( what ) self.bot.isfrozen = what; if ( what ) + { self notify( "kill_goal" ); + } } /* @@ -333,7 +351,9 @@ BotStopMoving( what ) self.bot.stop_move = what; if ( what ) + { self notify( "kill_goal" ); + } } /* @@ -359,7 +379,9 @@ HasScriptGoal() SetScriptGoal( goal, dist ) { if ( !isDefined( dist ) ) + { dist = 16; + } self.bot.script_goal = goal; self.bot.script_goal_dist = dist; @@ -498,7 +520,9 @@ ClearScriptEnemy() GetThreat() { if ( !isdefined( self.bot.target ) ) + { return undefined; + } return self.bot.target.entity; } @@ -611,10 +635,14 @@ getValidTube() weap = weaps[ i ]; if ( !self getAmmoCount( weap ) ) + { continue; + } if ( ( isSubStr( weap, "alt_" ) && ( isSubStr( weap, "_m320" ) || isSubStr( weap, "_gl" ) || isSubStr( weap, "_gp25" ) ) ) || weap == "m320_mp" ) + { return weap; + } } return undefined; @@ -636,7 +664,9 @@ waittill_either_return_( str1, str2 ) waittill_either_return( str1, str2 ) { if ( !isDefined( self waittill_either_return_( str1, str2 ) ) ) + { return str1; + } return str2; } @@ -660,10 +690,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 ]; } @@ -695,7 +729,9 @@ WeaponIsFullAuto( weap ) weaptoks = strtok( weap, "_" ); if ( weaptoks.size < 2 ) + { return false; + } return isDefined( level.bots_fullautoguns[ weaptoks[ 1 ] ] ); } @@ -733,7 +769,9 @@ getBotToKick() bots = getBotArray(); if ( !isDefined( bots ) || !isDefined( bots.size ) || bots.size <= 0 || !isDefined( bots[ 0 ] ) ) + { return undefined; + } tokick = undefined; axis = 0; @@ -746,14 +784,22 @@ getBotToKick() bot = bots[ i ]; if ( !isDefined( bot ) || !isDefined( bot.team ) ) + { continue; + } if ( bot.team == "allies" ) + { allies++; + } else if ( bot.team == "axis" ) + { axis++; + } else // choose bots that are not on a team first + { return bot; + } } // search for a bot on the other team @@ -767,7 +813,9 @@ getBotToKick() team = "allies"; if ( axis > allies ) + { team = "axis"; + } } else { @@ -780,22 +828,32 @@ getBotToKick() bot = bots[ i ]; if ( !isDefined( bot ) || !isDefined( bot.team ) ) + { continue; + } if ( bot.team != team ) + { 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; } if ( isDefined( tokick ) ) + { return tokick; + } // just kick lowest skill for ( i = 0; i < bots.size; i++ ) @@ -803,13 +861,19 @@ getBotToKick() bot = bots[ i ]; if ( !isDefined( bot ) || !isDefined( bot.team ) ) + { 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; } @@ -827,7 +891,9 @@ GetHostPlayer() player = level.players[ i ]; if ( !player is_host() ) + { continue; + } return player; } @@ -843,36 +909,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; } @@ -888,10 +966,14 @@ RaySphereIntersect( start, end, spherePos, radius ) r2 = radius * radius; if ( DistanceSquared( start, spherePos ) < r2 ) + { return true; + } if ( DistanceSquared( end, spherePos ) < r2 ) + { return true; + } // check if the line made by start and end intersect the sphere dp = end - start; @@ -904,7 +986,9 @@ RaySphereIntersect( start, end, spherePos, radius ) bb4ac = b * b - 4.0 * a * c; if ( abs( a ) < 0.0001 || bb4ac < 0 ) + { return false; + } mu1 = ( 0 - b + sqrt( bb4ac ) ) / ( 2 * a ); // mu2 = (0-b - sqrt(bb4ac)) / (2 * a); @@ -917,13 +1001,17 @@ RaySphereIntersect( start, end, spherePos, radius ) // check if both intersection points far if ( DistanceSquared( start, ip1 ) > myDist/* && DistanceSquared(start, ip2) > myDist*/ ) + { return false; + } dpAngles = VectorToAngles( dp ); // check if the point is behind us if ( getConeDot( ip1, start, dpAngles ) < 0/* || getConeDot(ip2, start, dpAngles) < 0*/ ) + { return false; + } return true; } @@ -938,10 +1026,14 @@ SmokeTrace( start, end, rad ) nade = level.bots_smokeList.data[ i ]; if ( nade.state != "smoking" ) + { continue; + } if ( !RaySphereIntersect( start, end, nade.origin, rad ) ) + { continue; + } return false; } @@ -980,12 +1072,18 @@ Round( x ) if ( abs( x ) - abs( y ) > 0.5 ) { if ( x < 0 ) + { return y - 1; + } else + { return y + 1; + } } else + { return y; + } } /* @@ -1022,7 +1120,9 @@ parseTokensIntoWaypoint( tokens ) waypoint.children = []; for ( j = 0; j < childToks.size; j++ ) + { waypoint.children[ j ] = int( childToks[ j ] ); + } type = tokens[ 2 ]; waypoint.type = type; @@ -1034,7 +1134,9 @@ parseTokensIntoWaypoint( tokens ) anglesToks = strtok( anglesStr, " " ); if ( anglesToks.size >= 3 ) + { waypoint.angles = ( float_old( anglesToks[ 0 ] ), float_old( anglesToks[ 1 ] ), float_old( anglesToks[ 2 ] ) ); + } } javStr = tokens[ 4 ]; @@ -1044,7 +1146,9 @@ parseTokensIntoWaypoint( tokens ) javToks = strtok( javStr, " " ); if ( javToks.size >= 3 ) + { waypoint.jav_point = ( float_old( javToks[ 0 ] ), float_old( javToks[ 1 ] ), float_old( javToks[ 2 ] ) ); + } } return waypoint; @@ -1065,7 +1169,9 @@ getWaypointLinesFromFile( filename ) // If the file is empty or not defined, return the empty result structure. if ( !isDefined( waypointStr ) ) + { return result; + } // Variables to track the current line's character count and starting position. linecount = 0; @@ -1082,7 +1188,9 @@ getWaypointLinesFromFile( filename ) // If the newline is '\r\n', skip the next character. if ( waypointStr[ i ] == "\r" && i < waypointStr.size - 1 && waypointStr[ i + 1 ] == "\n" ) + { i++; + } // Reset linecount and update linestart for the next line. linecount = 0; @@ -1110,12 +1218,16 @@ readWpsFromFile( mapname ) filename = "waypoints/" + mapname + "_wp.csv"; if ( !BotBuiltinFileExists( filename ) ) + { return waypoints; + } res = getWaypointLinesFromFile( filename ); if ( !res.lines.size ) + { return waypoints; + } BotBuiltinPrintConsole( "Attempting to read waypoints from " + filename ); @@ -1146,7 +1258,9 @@ load_waypoints() level.waypointUsage[ "axis" ] = []; if ( !isDefined( level.waypoints ) ) + { level.waypoints = []; + } mapname = getDvar( "mapname" ); @@ -1167,7 +1281,9 @@ load_waypoints() } if ( level.waypoints.size ) + { BotBuiltinPrintConsole( "Loaded " + level.waypoints.size + " waypoints from script." ); + } } if ( !level.waypoints.size ) @@ -1180,13 +1296,19 @@ load_waypoints() for ( i = 0; i < level.waypointCount; i++ ) { if ( !isDefined( level.waypoints[ i ].children ) || !isDefined( level.waypoints[ i ].children.size ) ) + { level.waypoints[ i ].children = []; + } if ( !isDefined( level.waypoints[ i ].origin ) ) + { level.waypoints[ i ].origin = ( 0, 0, 0 ); + } if ( !isDefined( level.waypoints[ i ].type ) ) + { level.waypoints[ i ].type = "crouch"; + } } } @@ -1202,7 +1324,9 @@ nearAnyOfWaypoints( dist, waypoints ) waypoint = level.waypoints[ waypoints[ i ] ]; if ( DistanceSquared( waypoint.origin, self.origin ) > dist ) + { continue; + } return true; } @@ -1224,7 +1348,9 @@ waypointsNear( waypoints, dist ) wp = level.waypoints[ waypoints[ i ] ]; if ( DistanceSquared( wp.origin, self.origin ) > dist ) + { continue; + } answer[ answer.size ] = waypoints[ i ]; } @@ -1246,7 +1372,9 @@ getNearestWaypointOfWaypoints( waypoints ) thisDist = DistanceSquared( self.origin, waypoint.origin ); if ( isDefined( answer ) && thisDist > closestDist ) + { continue; + } answer = waypoints[ i ]; closestDist = thisDist; @@ -1269,13 +1397,19 @@ getWaypointsOfType( type ) if ( type == "camp" ) { if ( wp.type != "crouch" ) + { continue; + } if ( wp.children.size != 1 ) + { continue; + } } else if ( type != wp.type ) + { continue; + } answer[ answer.size ] = i; } @@ -1289,7 +1423,9 @@ getWaypointsOfType( type ) getWaypointForIndex( i ) { if ( !isDefined( i ) ) + { return undefined; + } return level.waypoints[ i ]; } @@ -1318,9 +1454,13 @@ getGoodMapAmount() { case "mp_dome": if ( level.teambased ) + { return 8; + } else + { return 5; + } default: return 2; @@ -1465,7 +1605,9 @@ getBotArray() player = level.players[ i ]; if ( !player is_bot() ) + { continue; + } result[ result.size ] = player; } @@ -1491,7 +1633,9 @@ WaypointsToKDTree() _WaypointsToKDTree( waypoints, dem ) { if ( !waypoints.size ) + { return; + } callbacksort = undefined; @@ -1531,10 +1675,16 @@ _WaypointsToKDTree( waypoints, dem ) right = []; for ( i = 0; i < sorted.size; i++ ) + { if ( i < median ) + { right[ right.size ] = sorted[ i ]; + } else if ( i > median ) + { left[ left.size ] = sorted[ i ]; + } + } self KDTreeInsert( sorted[ median ] ); @@ -1648,25 +1798,37 @@ _KDTreeInsert( node, data, dem, x0, y0, z0, x1, y1, z1 ) { case 0: if ( data.origin[ 0 ] < node.data.origin[ 0 ] ) + { node.left = self _KDTreeInsert( node.left, data, 1, x0, y0, z0, node.data.origin[ 0 ], y1, z1 ); + } else + { node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[ 0 ], y0, z0, x1, y1, z1 ); + } break; case 1: if ( data.origin[ 1 ] < node.data.origin[ 1 ] ) + { node.left = self _KDTreeInsert( node.left, data, 2, x0, y0, z0, x1, node.data.origin[ 1 ], z1 ); + } else + { node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[ 1 ], z0, x1, y1, z1 ); + } break; case 2: if ( data.origin[ 2 ] < node.data.origin[ 2 ] ) + { node.left = self _KDTreeInsert( node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[ 2 ] ); + } else + { node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[ 2 ], x1, y1, z1 ); + } break; } @@ -1680,7 +1842,9 @@ _KDTreeInsert( node, data, dem, x0, y0, z0, x1, y1, z1 ) KDTreeNearest( origin ) { if ( !isDefined( self.root ) ) + { return undefined; + } return self _KDTreeNearest( self.root, origin, self.root.data, DistanceSquared( self.root.data.origin, origin ), 0 ); } @@ -1732,20 +1896,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; } @@ -1834,7 +2010,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; @@ -1850,15 +2028,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; + } } /* @@ -1869,7 +2055,9 @@ HeapRemove() remove = self.data.size; if ( !remove ) + { return remove; + } move = self.data[ remove - 1 ]; self.data[ 0 ] = move; @@ -1877,7 +2065,9 @@ HeapRemove() remove--; if ( !remove ) + { return remove; + } last = 1; next = self _HeapNextChild( 1, remove ); @@ -1885,7 +2075,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; @@ -1911,15 +2103,21 @@ ReverseHeapAStar( item, item2 ) RemoveWaypointUsage( wp, team ) { if ( !isDefined( level.waypointUsage ) ) + { return; + } if ( !isDefined( level.waypointUsage[ team ][ wp + "" ] ) ) + { return; + } level.waypointUsage[ team ][ wp + "" ]--; if ( level.waypointUsage[ team ][ wp + "" ] <= 0 ) + { level.waypointUsage[ team ][ wp + "" ] = undefined; + } } /* @@ -1933,12 +2131,16 @@ GetNearestWaypointWithSight( pos ) for ( i = 0; i < level.waypointCount; i++ ) { if ( !bulletTracePassed( pos + ( 0, 0, 15 ), level.waypoints[ i ].origin + ( 0, 0, 15 ), false, undefined ) ) + { continue; + } curdis = DistanceSquared( level.waypoints[ i ].origin, pos ); if ( curdis > dist ) + { continue; + } dist = curdis; candidate = i; @@ -1960,7 +2162,9 @@ GetNearestWaypoint( pos ) curdis = DistanceSquared( level.waypoints[ i ].origin, pos ); if ( curdis > dist ) + { continue; + } dist = curdis; candidate = i; @@ -1984,29 +2188,41 @@ AStarSearch( start, goal, team, greedy_path ) startWp = getNearestWaypoint( start ); if ( !isDefined( startWp ) ) + { return []; + } _startwp = undefined; if ( !bulletTracePassed( start + ( 0, 0, 15 ), level.waypoints[ startWp ].origin + ( 0, 0, 15 ), false, undefined ) ) + { _startwp = GetNearestWaypointWithSight( start ); + } if ( isDefined( _startwp ) ) + { startWp = _startwp; + } goalWp = getNearestWaypoint( goal ); if ( !isDefined( goalWp ) ) + { return []; + } _goalWp = undefined; if ( !bulletTracePassed( goal + ( 0, 0, 15 ), level.waypoints[ goalWp ].origin + ( 0, 0, 15 ), false, undefined ) ) + { _goalwp = GetNearestWaypointWithSight( goal ); + } if ( isDefined( _goalwp ) ) + { goalWp = _goalwp; + } node = spawnStruct(); @@ -2039,7 +2255,9 @@ AStarSearch( start, goal, team, greedy_path ) if ( isdefined( team ) && isDefined( level.waypointUsage ) ) { if ( !isDefined( level.waypointUsage[ team ][ bestNode.index + "" ] ) ) + { level.waypointUsage[ team ][ bestNode.index + "" ] = 0; + } level.waypointUsage[ team ][ bestNode.index + "" ]++; } @@ -2066,15 +2284,21 @@ AStarSearch( start, goal, team, greedy_path ) temppen = 1; if ( isDefined( level.waypointUsage[ team ][ child + "" ] ) ) + { temppen = level.waypointUsage[ team ][ child + "" ]; // consider how many bots are taking this path + } if ( temppen > 1 ) + { penalty = temppen; + } } // have certain types of nodes more expensive if ( childWp.type == "climb" || childWp.type == "prone" ) + { penalty += 4; + } // calc the total path we have took newg = bestNode.g + DistanceSquared( wp.origin, childWp.origin ) * penalty; // bots on same team's path are more expensive @@ -2083,21 +2307,31 @@ AStarSearch( start, goal, team, greedy_path ) inopen = isDefined( openset[ child + "" ] ); if ( inopen && openset[ child + "" ].g <= newg ) + { continue; + } inclosed = isDefined( closed[ child + "" ] ); if ( inclosed && closed[ child + "" ].g <= newg ) + { continue; + } node = undefined; if ( inopen ) + { node = openset[ child + "" ]; + } else if ( inclosed ) + { node = closed[ child + "" ]; + } else + { node = spawnStruct(); + } node.parent = bestNode; node.g = newg; @@ -2107,7 +2341,9 @@ AStarSearch( start, goal, team, greedy_path ) // check if in closed, remove it if ( inclosed ) + { closed[ child + "" ] = undefined; + } // check if not in open, add it if ( !inopen ) @@ -2212,7 +2448,9 @@ onUsePlantObjectFix( player ) for ( i = 0; i < level.bombZones.size; i++ ) { if ( level.bombZones[ i ] == self ) + { continue; + } level.bombZones[ i ] maps\mp\gametypes\_gameobjects::disableObject(); } @@ -2224,7 +2462,9 @@ onUsePlantObjectFix( player ) player maps\mp\gametypes\_persistence::statSetChild( "round", "plants", player.pers[ "plants" ] ); if ( isdefined( level.sd_loadout ) && isdefined( level.sd_loadout[ player.team ] ) ) + { player thread maps\mp\gametypes\sd::removeBombCarrierClass(); + } maps\mp\_utility::leaderDialog( "bomb_planted" ); level thread maps\mp\_utility::teamPlayerCardSplash( "callout_bombplanted", player ); @@ -2262,7 +2502,9 @@ bombPlantedFix( var_0, var_1 ) for ( var_2 = 0; var_2 < level.players.size; var_2++ ) { if ( isdefined( level.players[ var_2 ].carryIcon ) ) + { level.players[ var_2 ].carryIcon maps\mp\gametypes\_hud_util::destroyElem(); + } } var_3 = bullettrace( var_1.origin + ( 0, 0, 20 ), var_1.origin - ( 0, 0, 2000 ), 0, var_1 ); @@ -2304,7 +2546,9 @@ bombPlantedFix( var_0, var_1 ) var_0.visuals[ 0 ] maps\mp\gametypes\_gamelogic::stopTickingSound(); if ( level.gameEnded || level.bombDefused ) + { return; + } level.bombexploded = 1; var_11 = level.sdBombModel.origin; @@ -2317,7 +2561,9 @@ bombPlantedFix( var_0, var_1 ) var_1 maps\mp\gametypes\_persistence::statSetChild( "round", "destructions", var_1.pers[ "destructions" ] ); } else + { var_0.visuals[ 0 ] radiusdamage( var_11, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "bomb_site_mp" ); + } var_12 = randomfloat( 360 ); var_13 = spawnfx( level._effect[ "bombexplosion" ], var_11 + ( 0, 0, 50 ), ( 0, 0, 1 ), ( cos( var_12 ), sin( var_12 ), 0 ) ); @@ -2327,10 +2573,14 @@ bombPlantedFix( var_0, var_1 ) thread maps\mp\_utility::playSoundinSpace( "exp_suitcase_bomb_main", var_11 ); if ( isdefined( var_0.exploderIndex ) ) + { common_scripts\utility::exploder( var_0.exploderIndex ); + } for ( var_2 = 0; var_2 < level.bombZones.size; var_2++ ) + { level.bombZones[ var_2 ] maps\mp\gametypes\_gameobjects::disableObject(); + } defuseObject maps\mp\gametypes\_gameobjects::disableObject(); setgameendtime( 0 ); @@ -2350,7 +2600,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary teamName = "none"; if ( !isdefined( setPrimarySpawnWeapon ) ) + { setPrimarySpawnWeapon = true; + } primaryIndex = 0; @@ -2358,7 +2610,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary self.specialty = []; if ( !isdefined( allowCopycat ) ) + { allowCopycat = true; + } primaryWeapon = undefined; var_7 = 0; @@ -2369,9 +2623,13 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutKillstreak3 = undefined; if ( issubstr( class, "axis" ) ) + { teamName = "axis"; + } else if ( issubstr( class, "allies" ) ) + { teamName = "allies"; + } clonedLoadout = []; @@ -2474,7 +2732,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutOffhand = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 6 ); if ( loadoutOffhand == "specialty_null" ) + { loadoutOffhand = "none"; + } loadoutDeathStreak = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "deathstreak" ); @@ -2557,7 +2817,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutOffhand = gamemodeLoadout[ "loadoutOffhand" ]; if ( loadoutOffhand == "specialty_null" ) + { loadoutOffhand = "none"; + } loadoutPerk1 = gamemodeLoadout[ "loadoutPerk1" ]; loadoutPerk2 = gamemodeLoadout[ "loadoutPerk2" ]; @@ -2581,7 +2843,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutKillstreak3 = gamemodeLoadout[ "loadoutKillstreak3" ]; } else if ( level.killstreakRewards && isdefined( self.streakType ) ) + { loadoutStreakType = maps\mp\gametypes\_class::getLoadoutStreakTypeFromStreakType( self.streakType ); + } else { loadoutStreakType = "streaktype_assault"; @@ -2683,25 +2947,39 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutDeathstreak = "specialty_null"; if ( loadoutSecondary == "iw5_smaw" ) + { loadoutSecondary = "iw5_usp"; + } if ( loadoutPrimaryAttachment == "m320" ) + { loadoutPrimaryAttachment = "none"; + } if ( loadoutPerk2 == "specialty_coldblooded" ) + { loadoutPerk2 = "specialty_null"; + } if ( loadoutPerk1 == "specialty_blindeye" ) + { loadoutPerk1 = "specialty_null"; + } if ( loadoutStreakType == "streaktype_support" ) + { loadoutStreakType = "streaktype_assault"; + } if ( loadoutPrimary == "riotshield" ) + { loadoutPrimary = "iw5_m4"; + } if ( loadoutSecondary == "riotshield" ) + { loadoutSecondary = "iw5_m4"; + } } self maps\mp\gametypes\_class::loadoutFakePerks( loadoutStreakType ); @@ -2712,22 +2990,34 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary if ( !isGameModeClass && !isRecipeClass && !( isdefined( self.pers[ "copyCatLoadout" ] ) && self.pers[ "copyCatLoadout" ][ "inUse" ] && allowCopycat ) ) { if ( !maps\mp\gametypes\_class::isValidPrimary( loadoutPrimary ) ) + { loadoutPrimary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 0 ); + } if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutPrimaryAttachment ) ) + { loadoutPrimaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 0, 0 ); + } if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutPrimaryAttachment2 ) ) + { loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 0, 1 ); + } if ( !maps\mp\gametypes\_class::isValidWeaponBuff( loadoutPrimaryBuff, loadoutPrimary ) ) + { loadoutPrimaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, 10, 0 ); + } if ( !maps\mp\gametypes\_class::isValidCamo( loadoutPrimaryCamo ) ) + { loadoutPrimaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, 10, 0 ); + } if ( !maps\mp\gametypes\_class::isValidReticle( loadoutPrimaryReticle ) ) + { loadoutPrimaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableNum, 10, 0 ); + } if ( !maps\mp\gametypes\_class::isValidSecondary( loadoutSecondary, loadoutPerk2 ) ) { @@ -2740,46 +3030,74 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary } if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutSecondaryAttachment ) ) + { loadoutSecondaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 1, 0 ); + } if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutSecondaryAttachment2 ) ) + { loadoutSecondaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 1, 1 ); + } if ( loadoutPerk2 == "specialty_twoprimaries" && !maps\mp\gametypes\_class::isValidWeaponBuff( loadoutSecondaryBuff, loadoutSecondary ) ) + { loadoutSecondaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, 10, 1 ); + } if ( !maps\mp\gametypes\_class::isValidCamo( loadoutSecondaryCamo ) ) + { loadoutSecondaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, 10, 1 ); + } if ( !maps\mp\gametypes\_class::isValidReticle( loadoutSecondaryReticle ) ) + { loadoutSecondaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableName, 10, 1 ); + } if ( !maps\mp\gametypes\_class::isValidEquipment( loadoutEquipment ) ) + { loadoutEquipment = maps\mp\gametypes\_class::table_getEquipment( level.classTableName, 10, 0 ); + } if ( !maps\mp\gametypes\_class::isValidPerk1( loadoutPerk1 ) ) + { loadoutPerk1 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 1 ); + } if ( !maps\mp\gametypes\_class::isValidPerk2( loadoutPerk2 ) ) + { loadoutPerk2 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 2 ); + } if ( !maps\mp\gametypes\_class::isValidPerk3( loadoutPerk3 ) ) + { loadoutPerk3 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 3 ); + } if ( !maps\mp\gametypes\_class::isValidDeathStreak( loadoutDeathStreak ) ) + { loadoutDeathStreak = maps\mp\gametypes\_class::table_getDeathstreak( level.classTableName, 10 ); + } if ( !maps\mp\gametypes\_class::isValidOffhand( loadoutOffhand ) ) + { loadoutOffhand = maps\mp\gametypes\_class::table_getOffhand( level.classTableName, 10 ); + } if ( loadoutPrimaryAttachment2 != "none" && loadoutPrimaryBuff != "specialty_bling" ) + { loadoutPrimaryAttachment2 = "none"; + } if ( loadoutSecondaryBuff != "specialty_null" && loadoutPerk2 != "specialty_twoprimaries" ) + { loadoutSecondaryBuff = "specialty_null"; + } if ( loadoutSecondaryAttachment2 != "none" && ( loadoutSecondaryBuff != "specialty_bling" || loadoutPerk2 != "specialty_twoprimaries" ) ) + { loadoutSecondaryAttachment2 = "none"; + } } self.loadoutPrimary = loadoutPrimary; @@ -2788,22 +3106,32 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary self.loadoutSecondaryCamo = int( tablelookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ); if ( !issubstr( loadoutPrimary, "iw5" ) ) + { self.loadoutPrimaryCamo = 0; + } if ( !issubstr( loadoutSecondary, "iw5" ) ) + { self.loadoutSecondaryCamo = 0; + } self.loadoutPrimaryReticle = int( tablelookup( "mp/reticleTable.csv", 1, loadoutPrimaryReticle, 0 ) ); self.loadoutSecondaryReticle = int( tablelookup( "mp/reticleTable.csv", 1, loadoutSecondaryReticle, 0 ) ); if ( !issubstr( loadoutPrimary, "iw5" ) ) + { self.loadoutPrimaryReticle = 0; + } if ( !issubstr( loadoutSecondary, "iw5" ) ) + { self.loadoutSecondaryReticle = 0; + } if ( loadoutSecondary == "none" ) + { secondaryName = "none"; + } else { secondaryName = maps\mp\gametypes\_class::buildWeaponName( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2, self.loadoutSecondaryCamo, self.loadoutSecondaryReticle ); @@ -2811,16 +3139,22 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary weaponTokens = strtok( secondaryName, "_" ); if ( weaponTokens[ 0 ] == "iw5" ) + { weaponTokens[ 0 ] = weaponTokens[ 0 ] + "_" + weaponTokens[ 1 ]; + } else if ( weaponTokens[ 0 ] == "alt" ) + { weaponTokens[ 0 ] = weaponTokens[ 1 ] + "_" + weaponTokens[ 2 ]; + } weaponName = weaponTokens[ 0 ]; curWeaponRank = self maps\mp\gametypes\_rank::getWeaponRank( weaponName ); curWeaponStatRank = self getplayerdata( "weaponRank", weaponName ); if ( curWeaponRank != curWeaponStatRank ) + { self setplayerdata( "weaponRank", weaponName, curWeaponRank ); + } } self setoffhandprimaryclass( "other" ); @@ -2839,24 +3173,32 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary self maps\mp\gametypes\_class::_detachAll(); if ( level.dieHardMode ) + { self givePerk( "specialty_pistoldeath", false ); + } self loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loadoutPrimaryBuff, loadoutSecondaryBuff ); if ( self _hasPerk( "specialty_extraammo" ) && secondaryName != "none" && getWeaponClass( secondaryName ) != "weapon_projectile" ) + { self givemaxammo( secondaryName ); + } self.spawnperk = false; if ( !self _hasPerk( "specialty_blindeye" ) && self.avoidKillstreakOnSpawnTimer > 0 ) + { self thread maps\mp\perks\_perks::giveBlindEyeAfterSpawn(); + } if ( self.pers[ "cur_death_streak" ] > 0 ) { deathStreaks = []; if ( loadoutDeathStreak != "specialty_null" ) + { deathStreaks[ loadoutDeathStreak ] = int( tablelookup( "mp/perkTable.csv", 1, loadoutDeathStreak, 6 ) ); + } if ( self getPerkUpgrade( loadoutPerk1 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk2 ) == "specialty_rollover" || getPerkUpgrade( loadoutPerk3 ) == "specialty_rollover" ) { @@ -2869,10 +3211,14 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary if ( self.pers[ "cur_death_streak" ] >= value ) { if ( key == "specialty_carepackage" && self.pers[ "cur_death_streak" ] > value ) + { continue; + } if ( key == "specialty_uav" && self.pers[ "cur_death_streak" ] > value ) + { continue; + } self thread givePerk( key, true ); self thread maps\mp\gametypes\_hud_message::splashNotify( key ); @@ -2948,7 +3294,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary } if ( !isdefined( loadoutKillstreak3 ) ) + { loadoutKillstreak3 = killstreak; + } } if ( isGameModeClass && self.streakType == "specialist" ) @@ -2967,24 +3315,36 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary } if ( !isdefined( loadoutKillstreak1 ) ) + { loadoutKillstreak1 = "none"; + } if ( !isdefined( loadoutKillstreak2 ) ) + { loadoutKillstreak2 = "none"; + } if ( !isdefined( loadoutKillstreak3 ) ) + { loadoutKillstreak3 = "none"; + } var_56 = 0; if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak1 ) ) + { var_56 = 1; + } if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak2 ) ) + { var_56 = 1; + } if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak3 ) ) + { var_56 = 1; + } if ( var_56 ) { @@ -3036,14 +3396,18 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary self maps\mp\killstreaks\_killstreaks::clearKillstreaks(); for ( i = 0; i < streakNames.size; i++ ) + { self maps\mp\killstreaks\_killstreaks::giveKillstreak( streakNames[ i ] ); + } } } if ( !issubstr( class, "juggernaut" ) ) { if ( isdefined( self.lastClass ) && self.lastClass != "" && self.lastClass != self.class ) + { self incPlayerStat( "mostclasseschanged", 1 ); + } self.pers[ "lastClass" ] = self.class; self.lastClass = self.class; @@ -3064,39 +3428,61 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary weaponTokens = strtok( primaryName, "_" ); if ( weaponTokens[ 0 ] == "iw5" ) + { weaponName = weaponTokens[ 0 ] + "_" + weaponTokens[ 1 ]; + } else if ( weaponTokens[ 0 ] == "alt" ) + { weaponName = weaponTokens[ 1 ] + "_" + weaponTokens[ 2 ]; + } else + { weaponName = weaponTokens[ 0 ]; + } curWeaponRank = self maps\mp\gametypes\_rank::getWeaponRank( weaponName ); curWeaponStatRank = self getplayerdata( "weaponRank", weaponName ); if ( curWeaponRank != curWeaponStatRank ) + { self setplayerdata( "weaponRank", weaponName, curWeaponRank ); + } if ( primaryName == "riotshield_mp" && level.inGracePeriod ) + { self notify( "weapon_change", "riotshield_mp" ); + } if ( self _hasPerk( "specialty_extraammo" ) ) + { self givemaxammo( primaryName ); + } if ( setPrimarySpawnWeapon ) + { self setspawnweapon( primaryName ); + } self.pers[ "primaryWeapon" ] = weaponName; primaryTokens = strtok( primaryName, "_" ); offhandSecondaryWeapon = loadoutOffhand; if ( loadoutOffhand == "none" ) + { self setoffhandsecondaryclass( "none" ); + } else if ( loadoutOffhand == "flash_grenade_mp" ) + { self setoffhandsecondaryclass( "flash" ); + } else if ( loadoutOffhand == "smoke_grenade_mp" || loadoutOffhand == "concussion_grenade_mp" ) + { self setoffhandsecondaryclass( "smoke" ); + } else + { self setoffhandsecondaryclass( "flash" ); + } switch ( offhandSecondaryWeapon ) { @@ -3114,11 +3500,17 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary self giveweapon( offhandSecondaryWeapon ); if ( loadoutOffhand == "flash_grenade_mp" ) + { self setweaponammoclip( offhandSecondaryWeapon, 2 ); + } else if ( loadoutOffhand == "concussion_grenade_mp" ) + { self setweaponammoclip( offhandSecondaryWeapon, 2 ); + } else + { self setweaponammoclip( offhandSecondaryWeapon, 1 ); + } break; } @@ -3149,10 +3541,14 @@ getPerkUpgrade( perkName ) perkUpgrade = tablelookup( "mp/perktable.csv", 1, perkName, 8 ); if ( perkUpgrade == "" || perkUpgrade == "specialty_null" ) + { return "specialty_null"; + } if ( !isDefined( self.pers[ "bots" ][ "unlocks" ][ "upgraded_" + perkName ] ) || !self.pers[ "bots" ][ "unlocks" ][ "upgraded_" + perkName ] ) + { return "specialty_null"; + } return ( perkUpgrade ); } @@ -3170,7 +3566,9 @@ loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loa loadoutPrimaryBuff = maps\mp\perks\_perks::validatePerk( undefined, loadoutPrimaryBuff ); if ( loadoutPerk2 == "specialty_twoprimaries" ) + { loadoutSecondaryBuff = maps\mp\perks\_perks::validatePerk( undefined, loadoutSecondaryBuff ); + } self.loadoutPerk1 = loadoutPerk1; self.loadoutPerk2 = loadoutPerk2; @@ -3179,22 +3577,34 @@ loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loa self.loadoutPrimaryBuff = loadoutPrimaryBuff; if ( loadoutPerk2 == "specialty_twoprimaries" ) + { self.loadoutSecondaryBuff = loadoutSecondaryBuff; + } if ( loadoutEquipment != "specialty_null" ) + { self givePerk( loadoutEquipment, true ); + } if ( loadoutPerk1 != "specialty_null" ) + { self givePerk( loadoutPerk1, true ); + } if ( loadoutPerk2 != "specialty_null" ) + { self givePerk( loadoutPerk2, true ); + } if ( loadoutPerk3 != "specialty_null" ) + { self givePerk( loadoutPerk3, true ); + } if ( loadoutPrimaryBuff != "specialty_null" ) + { self givePerk( loadoutPrimaryBuff, true ); + } perkUpgrd[ 0 ] = tablelookup( "mp/perktable.csv", 1, loadoutPerk1, 8 ); perkUpgrd[ 1 ] = tablelookup( "mp/perktable.csv", 1, loadoutPerk2, 8 ); @@ -3210,7 +3620,9 @@ loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loa perk = perks[ i ]; if ( upgrade == "" || upgrade == "specialty_null" ) + { continue; + } if ( isDefined( self.pers[ "bots" ][ "unlocks" ][ "upgraded_" + perk ] ) && self.pers[ "bots" ][ "unlocks" ][ "upgraded_" + perk ] ) { @@ -3219,7 +3631,9 @@ loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loa } if ( !self _hasPerk( "specialty_assists" ) ) + { self.pers[ "assistsToKill" ] = 0; + } } /* @@ -3249,9 +3663,13 @@ playerModelForWeapon( weapon, secondary ) case "weapon_sniper": if ( level.environment != "" && game[ team ] != "opforce_africa" && isDefined( self.pers[ "bots" ][ "unlocks" ][ "ghillie" ] ) && self.pers[ "bots" ][ "unlocks" ][ "ghillie" ] ) + { [[ game[ team + "_model" ][ "GHILLIE" ] ]](); + } else + { [[ game[ team + "_model" ][ "SNIPER" ] ]](); + } break; @@ -3273,5 +3691,7 @@ playerModelForWeapon( weapon, secondary ) } if ( isJuggernaut() ) + { [[ game[ team + "_model" ][ "JUGGERNAUT" ] ]](); + } } diff --git a/maps/mp/bots/_menu.gsc b/maps/mp/bots/_menu.gsc index df28947..f16e7a7 100644 --- a/maps/mp/bots/_menu.gsc +++ b/maps/mp/bots/_menu.gsc @@ -13,10 +13,14 @@ init() { if ( getDvar( "bots_main_menu" ) == "" ) + { setDvar( "bots_main_menu", true ); + } if ( !getDvarInt( "bots_main_menu" ) ) + { return; + } thread watchPlayers(); } @@ -28,17 +32,23 @@ watchPlayers() wait 1; if ( !getDvarInt( "bots_main_menu" ) ) + { return; + } for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[ i ]; if ( !player is_host() ) + { continue; + } if ( isDefined( player.menuInit ) && player.menuInit ) + { continue; + } player thread init_menu(); } @@ -80,26 +90,44 @@ watchDisconnect() if ( self.menuOpen ) { if ( isDefined( self.MenuTextY ) ) + { for ( i = 0; i < self.MenuTextY.size; i++ ) + { if ( isDefined( self.MenuTextY[ i ] ) ) + { self.MenuTextY[ i ] destroy(); + } + } + } if ( isDefined( self.MenuText ) ) + { for ( i = 0; i < self.MenuText.size; i++ ) + { if ( isDefined( self.MenuText[ i ] ) ) + { self.MenuText[ i ] destroy(); + } + } + } if ( isDefined( self.Menu ) && isDefined( self.Menu[ "X" ] ) ) { if ( isDefined( self.Menu[ "X" ][ "Shader" ] ) ) + { self.Menu[ "X" ][ "Shader" ] destroy(); + } if ( isDefined( self.Menu[ "X" ][ "Scroller" ] ) ) + { self.Menu[ "X" ][ "Scroller" ] destroy(); + } } if ( isDefined( self.menuVersionHud ) ) + { self.menuVersionHud destroy(); + } } } @@ -134,15 +162,21 @@ watchPlayerOpenMenu() self playLocalSound( "mouse_click" ); if ( self.SubMenu != "Main" ) + { self ExitSub(); + } else { self ExitMenu(); if ( !gameFlag( "prematch_done" ) || level.gameEnded ) + { self freezeControls( true ); + } else + { self freezecontrols( false ); + } } } } @@ -164,9 +198,13 @@ MenuSelect() self playLocalSound( "mouse_click" ); if ( self.SubMenu == "Main" ) + { self thread [[ self.Option[ "Function" ][ self.SubMenu ][ self.Curs[ "Main" ][ "X" ] ] ]]( self.Option[ "Arg1" ][ self.SubMenu ][ self.Curs[ "Main" ][ "X" ] ], self.Option[ "Arg2" ][ self.SubMenu ][ self.Curs[ "Main" ][ "X" ] ] ); + } else + { self thread [[ self.Option[ "Function" ][ self.SubMenu ][ self.Curs[ self.SubMenu ][ "Y" ] ] ]]( self.Option[ "Arg1" ][ self.SubMenu ][ self.Curs[ self.SubMenu ][ "Y" ] ], self.Option[ "Arg2" ][ self.SubMenu ][ self.Curs[ self.SubMenu ][ "Y" ] ] ); + } } } } @@ -188,7 +226,9 @@ LeftMenu() self.Curs[ "Main" ][ "X" ]--; if ( self.Curs[ "Main" ][ "X" ] < 0 ) + { self.Curs[ "Main" ][ "X" ] = self.Option[ "Name" ][ self.SubMenu ].size - 1; + } self CursMove( "X" ); } @@ -212,7 +252,9 @@ RightMenu() self.Curs[ "Main" ][ "X" ]++; if ( self.Curs[ "Main" ][ "X" ] > self.Option[ "Name" ][ self.SubMenu ].size - 1 ) + { self.Curs[ "Main" ][ "X" ] = 0; + } self CursMove( "X" ); } @@ -236,7 +278,9 @@ UpMenu() self.Curs[ self.SubMenu ][ "Y" ]--; if ( self.Curs[ self.SubMenu ][ "Y" ] < 0 ) + { self.Curs[ self.SubMenu ][ "Y" ] = self.Option[ "Name" ][ self.SubMenu ].size - 1; + } self CursMove( "Y" ); } @@ -260,7 +304,9 @@ DownMenu() self.Curs[ self.SubMenu ][ "Y" ]++; if ( self.Curs[ self.SubMenu ][ "Y" ] > self.Option[ "Name" ][ self.SubMenu ].size - 1 ) + { self.Curs[ self.SubMenu ][ "Y" ] = 0; + } self CursMove( "Y" ); } @@ -281,21 +327,33 @@ OpenSub( menu, menu2 ) if ( self.SubMenu == "Main" ) { if ( isDefined( self.MenuText ) ) + { for ( i = 0; i < self.MenuText.size; i++ ) + { if ( isDefined( self.MenuText[ i ] ) ) + { self.MenuText[ i ] destroy(); + } + } + } if ( isDefined( self.Menu ) && isDefined( self.Menu[ "X" ] ) ) { if ( isDefined( self.Menu[ "X" ][ "Shader" ] ) ) + { self.Menu[ "X" ][ "Shader" ] destroy(); + } if ( isDefined( self.Menu[ "X" ][ "Scroller" ] ) ) + { self.Menu[ "X" ][ "Scroller" ] destroy(); + } } if ( isDefined( self.menuVersionHud ) ) + { self.menuVersionHud destroy(); + } for ( i = 0 ; i < self.Option[ "Name" ][ self.SubMenu ].size ; i++ ) { @@ -304,7 +362,9 @@ OpenSub( menu, menu2 ) self.MenuText[ i ] settext( self.Option[ "Name" ][ self.SubMenu ][ i ] ); if ( logOldi ) + { self.oldi = i; + } if ( self.MenuText[ i ].x > 300 ) { @@ -318,9 +378,13 @@ OpenSub( menu, menu2 ) } if ( !logOldi ) + { self.Menu[ "X" ][ "Shader" ] = self createRectangle( "CENTER", "CENTER", 0, -225, 1000, 90, ( 0, 0, 0 ), -2, 1, "white" ); + } else + { self.Menu[ "X" ][ "Shader" ] = self createRectangle( "CENTER", "CENTER", 0, -225, 1000, 30, ( 0, 0, 0 ), -2, 1, "white" ); + } self.Menu[ "X" ][ "Scroller" ] = self createRectangle( "CENTER", "CENTER", self.MenuText[ self.Curs[ "Main" ][ "X" ] ].x, -225, 105, 22, ( 1, 0, 0 ), -1, 1, "white" ); @@ -333,9 +397,15 @@ OpenSub( menu, menu2 ) else { if ( isDefined( self.MenuTextY ) ) + { for ( i = 0 ; i < self.MenuTextY.size ; i++ ) + { if ( isDefined( self.MenuTextY[ i ] ) ) + { self.MenuTextY[ i ] destroy(); + } + } + } for ( i = 0 ; i < self.Option[ "Name" ][ self.SubMenu ].size ; i++ ) { @@ -416,9 +486,13 @@ ShowOptionOn( variable ) for ( time = 0;; time += 0.05 ) { if ( !self isOnGround() && isAlive( self ) && gameFlag( "prematch_done" ) && !level.gameEnded ) + { self freezecontrols( false ); + } else + { self freezecontrols( true ); + } self setClientDvar( "r_blur", "5" ); self setClientDvar( "sc_blur", "15" ); @@ -433,7 +507,9 @@ ShowOptionOn( variable ) color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 ); if ( int( time * 4 ) % 2 ) + { color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 ); + } self.MenuText[ self.Curs[ self.SubMenu ][ variable ] ].color = color; } @@ -443,7 +519,9 @@ ShowOptionOn( variable ) for ( i = 0; i < self.Option[ "Name" ][ self.SubMenu ].size; i++ ) { if ( isDefined( self.MenuText[ i ] ) ) + { self.MenuText[ i ] settext( self.Option[ "Name" ][ self.SubMenu ][ i ] ); + } } } } @@ -456,7 +534,9 @@ ShowOptionOn( variable ) color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 ); if ( int( time * 4 ) % 2 ) + { color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 ); + } self.MenuTextY[ self.Curs[ self.SubMenu ][ variable ] ].color = color; } @@ -466,7 +546,9 @@ ShowOptionOn( variable ) for ( i = 0; i < self.Option[ "Name" ][ self.SubMenu ].size; i++ ) { if ( isDefined( self.MenuTextY[ i ] ) ) + { self.MenuTextY[ i ] settext( self.Option[ "Name" ][ self.SubMenu ][ i ] ); + } } } } @@ -491,36 +573,58 @@ AddBack( menu, back ) ExitSub() { if ( isDefined( self.MenuTextY ) ) + { for ( i = 0; i < self.MenuTextY.size; i++ ) + { if ( isDefined( self.MenuTextY[ i ] ) ) + { self.MenuTextY[ i ] destroy(); + } + } + } self.SubMenu = self.Menu[ "Back" ][ self.Submenu ]; if ( self.SubMenu == "Main" ) + { self CursMove( "X" ); + } else + { self CursMove( "Y" ); + } } ExitMenu() { if ( isDefined( self.MenuText ) ) + { for ( i = 0; i < self.MenuText.size; i++ ) + { if ( isDefined( self.MenuText[ i ] ) ) + { self.MenuText[ i ] destroy(); + } + } + } if ( isDefined( self.Menu ) && isDefined( self.Menu[ "X" ] ) ) { if ( isDefined( self.Menu[ "X" ][ "Shader" ] ) ) + { self.Menu[ "X" ][ "Shader" ] destroy(); + } if ( isDefined( self.Menu[ "X" ][ "Scroller" ] ) ) + { self.Menu[ "X" ][ "Scroller" ] destroy(); + } } if ( isDefined( self.menuVersionHud ) ) + { self.menuVersionHud destroy(); + } self.MenuOpen = false; self notify( "exit" ); @@ -590,9 +694,13 @@ AddOptions() _tempDvar = getDvarInt( "bots_manage_fill_kick" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar ); @@ -634,9 +742,13 @@ AddOptions() _tempDvar = getDvarInt( "bots_manage_fill_spec" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar ); @@ -655,18 +767,26 @@ AddOptions() _tempDvar = getDvarInt( "bots_team_force" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar ); _tempDvar = getDvarInt( "bots_team_mode" ); if ( _tempDvar ) + { _temp = "only bots"; + } else + { _temp = "everyone"; + } self AddMenu( "man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar ); @@ -745,117 +865,169 @@ AddOptions() _tempDvar = getDvarInt( "bots_loadout_reasonable" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 0, "Bots use only good class setups: " + _temp, ::bot_func, "reasonable", _tempDvar ); _tempDvar = getDvarInt( "bots_loadout_allow_op" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 1, "Bots can use op and annoying class setups: " + _temp, ::bot_func, "op", _tempDvar ); _tempDvar = getDvarInt( "bots_play_move" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar ); _tempDvar = getDvarInt( "bots_play_knife" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar ); _tempDvar = getDvarInt( "bots_play_fire" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar ); _tempDvar = getDvarInt( "bots_play_nade" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar ); _tempDvar = getDvarInt( "bots_play_take_carepackages" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 6, "Bots can take carepackages: " + _temp, ::bot_func, "care", _tempDvar ); _tempDvar = getDvarInt( "bots_play_obj" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 7, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar ); _tempDvar = getDvarInt( "bots_play_camp" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 8, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar ); _tempDvar = getDvarInt( "bots_play_jumpdrop" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 9, "Bots can jump and dropshot: " + _temp, ::bot_func, "jump", _tempDvar ); _tempDvar = getDvarInt( "bots_play_target_other" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 10, "Bots can target other script objects: " + _temp, ::bot_func, "targetother", _tempDvar ); _tempDvar = getDvarInt( "bots_play_killstreak" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 11, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar ); _tempDvar = getDvarInt( "bots_play_ads" ); if ( _tempDvar ) + { _temp = "true"; + } else + { _temp = "false"; + } self AddMenu( "set1", 12, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar ); } @@ -1114,7 +1286,9 @@ man_bots( a, b ) } if ( !result ) + { self iPrintln( "No bots to kick" ); + } break; diff --git a/maps/mp/bots/_wp_editor.gsc b/maps/mp/bots/_wp_editor.gsc index 7681c36..08ae5a1 100644 --- a/maps/mp/bots/_wp_editor.gsc +++ b/maps/mp/bots/_wp_editor.gsc @@ -13,10 +13,14 @@ init() { if ( getDvar( "bots_main_debug" ) == "" ) + { setDvar( "bots_main_debug", 0 ); + } if ( !getDVarint( "bots_main_debug" ) ) + { return; + } /* if(!getDVarint("developer")) { @@ -36,28 +40,42 @@ init() setDvar( "bots_manage_fill_spec", 1 ); 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 ); + } if ( getDvar( "bots_main_debug_updateRate" ) == "" ) + { setDvar( "bots_main_debug_updateRate", 500 ); + } if ( getDvar( "bots_main_debug_dashAmount" ) == "" ) + { setDvar( "bots_main_debug_dashAmount", 35.0 ); + } setDvar( "player_sustainAmmo", 1 ); if ( !isDefined( level.waypoints ) ) + { level.waypoints = []; + } level.waypointCount = 0; @@ -141,7 +159,9 @@ watchAstarCommand() self waittill( "astar" ); if ( 1 ) + { continue; + } self iprintln( "Start AStar" ); self.astar = undefined; @@ -162,7 +182,9 @@ watchAstarCommand() drawWaypoint( i ) { if ( !isDefined( level.drawn_wps ) ) + { level.drawn_wps = []; + } newdeathicon = newHudElem(); newdeathicon.x = level.waypoints[ i ].origin[ 0 ]; @@ -179,7 +201,9 @@ drawWaypoint( i ) drawPath( where ) { if ( !isDefined( level.drawn_wps ) ) + { level.drawn_wps = []; + } newdeathicon = newHudElem(); newdeathicon.x = where[ 0 ]; @@ -196,7 +220,9 @@ drawPath( where ) clearWaypoints() { if ( !isDefined( level.drawn_wps ) ) + { return; + } for ( i = 0; i < level.drawn_wps.size; i++ ) { @@ -209,7 +235,9 @@ clearWaypoints() clearWpLinks() { if ( !isDefined( level.drawn_links ) ) + { return; + } for ( i = 0; i < level.waypointCount; i++ ) { @@ -218,7 +246,7 @@ clearWpLinks() for ( i = 0; i < level.drawn_links.size; i++ ) { - level.drawn_links[ i ] delete(); + level.drawn_links[ i ] delete (); } level.drawn_links = []; @@ -227,16 +255,24 @@ clearWpLinks() showWpLink( i, h ) { if ( !isDefined( level.drawn_links ) ) + { level.drawn_links = []; + } if ( !isDefined( level.waypoints[ i ].drawn_links ) ) + { level.waypoints[ i ].drawn_links = []; + } if ( !isDefined( level.waypoints[ h ].drawn_links ) ) + { level.waypoints[ h ].drawn_links = []; + } if ( isDefined( level.waypoints[ h ].drawn_links[ "" + i ] ) || isDefined( level.waypoints[ i ].drawn_links[ "" + h ] ) ) + { return; + } level.waypoints[ h ].drawn_links[ "" + i ] = true; level.waypoints[ i ].drawn_links[ "" + h ] = true; @@ -308,7 +344,9 @@ updateWaypointsStats() 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 ); @@ -321,7 +359,9 @@ updateWaypointsStats() drawWaypoint( i ); for ( h = level.waypoints[ i ].children.size - 1; h >= 0; h-- ) + { showWpLink( i, level.waypoints[ i ].children[ h ] ); + } } } @@ -353,7 +393,9 @@ updateWaypointsStats() infotext.x = infotext.x - 2; if ( infotext.x <= -800 ) + { infotext.x = 800; + } if ( time > 2 && self UseButtonPressed() ) { @@ -378,7 +420,10 @@ updateWaypointsStats() node = self.astar.nodes[ i ]; // line(prev, level.waypoints[ node ].origin + (0, 0, 35), (0,1,1)); - if ( timeToUpdate ) drawPath( level.waypoints[ node ].origin ); + if ( timeToUpdate ) + { + drawPath( level.waypoints[ node ].origin ); + } prev = level.waypoints[ node ].origin + ( 0, 0, 35 ); } @@ -530,10 +575,14 @@ watchSaveWaypointsCommand() } if ( isDefined( level.waypoints[ i ].angles ) && ( level.waypoints[ i ].type == "claymore" || level.waypoints[ i ].type == "tube" || ( level.waypoints[ i ].type == "crouch" && level.waypoints[ i ].children.size == 1 ) || level.waypoints[ i ].type == "climb" || level.waypoints[ i ].type == "grenade" ) ) + { logprint( "*/waypoints[ " + i + " ].angles = " + level.waypoints[ i ].angles + ";\n/*" ); + } if ( isDefined( level.waypoints[ i ].jav_point ) && level.waypoints[ i ].type == "javelin" ) + { logprint( "*/waypoints[ " + i + " ].jav_point = " + level.waypoints[ i ].jav_point + ";\n/*" ); + } } logprint( "*/return waypoints;\n}\n\n\n\n" ); @@ -557,20 +606,30 @@ watchSaveWaypointsCommand() str += wp.children[ h ]; if ( h < wp.children.size - 1 ) + { str += " "; + } } str += "," + wp.type + ","; if ( isDefined( wp.angles ) ) + { str += wp.angles[ 0 ] + " " + wp.angles[ 1 ] + " " + wp.angles[ 2 ] + ","; + } else + { str += ","; + } if ( isDefined( wp.jav_point ) ) + { str += wp.jav_point[ 0 ] + " " + wp.jav_point[ 1 ] + " " + wp.jav_point[ 2 ] + ","; + } else + { str += ","; + } PrintLn( str ); BotBuiltinFileWrite( filename, str + "\n", "append" ); @@ -596,10 +655,14 @@ LoadWaypoints() checkForWarnings() { if ( level.waypointCount <= 0 ) + { self iprintln( "WARNING: waypointCount is " + level.waypointCount ); + } if ( level.waypointCount != level.waypoints.size ) + { self iprintln( "WARNING: waypointCount is not " + level.waypoints.size ); + } for ( i = 0; i < level.waypointCount; i++ ) { @@ -610,7 +673,9 @@ checkForWarnings() } if ( level.waypoints[ i ].children.size <= 0 ) + { self iprintln( "WARNING: waypoint " + i + " childCount is " + level.waypoints[ i ].children.size ); + } else { if ( !isDefined( level.waypoints[ i ].children ) || !isDefined( level.waypoints[ i ].children.size ) ) @@ -624,9 +689,13 @@ checkForWarnings() child = level.waypoints[ i ].children[ h ]; if ( !isDefined( level.waypoints[ child ] ) ) + { self iprintln( "WARNING: waypoint " + i + " child " + child + " is undefined" ); + } else if ( child == i ) + { self iprintln( "WARNING: waypoint " + i + " child " + child + " is itself" ); + } } } } @@ -638,10 +707,14 @@ checkForWarnings() } if ( level.waypoints[ i ].type == "javelin" && !isDefined( level.waypoints[ i ].jav_point ) ) + { self iprintln( "WARNING: waypoint " + i + " jav_point is undefined" ); + } if ( !isDefined( level.waypoints[ i ].angles ) && ( level.waypoints[ i ].type == "claymore" || level.waypoints[ i ].type == "tube" || ( level.waypoints[ i ].type == "crouch" && level.waypoints[ i ].children.size == 1 ) || level.waypoints[ i ].type == "climb" || level.waypoints[ i ].type == "grenade" ) ) + { self iprintln( "WARNING: waypoint " + i + " angles is undefined" ); + } } // check reachability, assume bidirectional graph @@ -651,12 +724,16 @@ checkForWarnings() for ( i = 0; i < level.waypointCount; i++ ) { if ( i % 5 == 0 ) + { wait 0.05; + } astar = AStarSearch( level.waypoints[ wpIdx ].origin, level.waypoints[ i ].origin, undefined, true ); if ( astar.size <= 0 ) + { self iprintln( "WARNING: waypoint " + wpIdx + " has no path to waypoint " + i ); + } } self iprintln( "Waypoint warnings check completed." ); @@ -764,7 +841,9 @@ DeleteWaypoint( nwp ) for ( h = level.waypoints[ i ].children.size - 1; h >= 0; h-- ) { if ( level.waypoints[ i ].children[ h ] > nwp ) + { level.waypoints[ i ].children[ h ]--; + } } } @@ -796,17 +875,29 @@ AddWaypoint() level.waypoints[ level.waypointCount ].origin = pos; if ( isDefined( self.javelinTargetPoint ) ) + { level.waypoints[ level.waypointCount ].type = "javelin"; + } else if ( self AdsButtonPressed() ) + { level.waypoints[ level.waypointCount ].type = "climb"; + } else if ( self AttackButtonPressed() && self UseButtonPressed() ) + { level.waypoints[ level.waypointCount ].type = "tube"; + } else if ( self AttackButtonPressed() ) + { level.waypoints[ level.waypointCount ].type = "grenade"; + } else if ( self UseButtonPressed() ) + { level.waypoints[ level.waypointCount ].type = "claymore"; + } else + { level.waypoints[ level.waypointCount ].type = self getStance(); + } level.waypoints[ level.waypointCount ].angles = self getPlayerAngles(); @@ -822,7 +913,9 @@ AddWaypoint() if ( level.autoLink ) { if ( level.wpToLink == -1 ) + { level.wpToLink = level.waypointCount - 1; + } level.waypointCount++; self LinkWaypoint( level.waypointCount - 1 ); @@ -844,7 +937,9 @@ DeleteAllWaypoints() buildChildCountString ( wp ) { if ( wp == -1 ) + { return -1; + } wpstr = level.waypoints[ wp ].children.size; @@ -854,16 +949,22 @@ buildChildCountString ( wp ) buildChildString( wp ) { if ( wp == -1 ) + { return ""; + } wpstr = ""; for ( i = 0; i < level.waypoints[ wp ].children.size; i++ ) { if ( i != 0 ) + { wpstr = wpstr + "," + level.waypoints[ wp ].children[ i ]; + } else + { wpstr = wpstr + level.waypoints[ wp ].children[ i ]; + } } return wpstr; @@ -872,7 +973,9 @@ buildChildString( wp ) buildTypeString( wp ) { if ( wp == -1 ) + { return ""; + } return level.waypoints[ wp ].type; }