From 3ff48407d516974176e90d7d1ad3803c8c5329af Mon Sep 17 00:00:00 2001 From: ineed bots Date: Thu, 4 Jan 2024 16:10:14 -0600 Subject: [PATCH] fmt --- .astylerc | 14 +- .editorconfig | 2 +- maps/mp/bots/_bot.gsc | 466 ++-- maps/mp/bots/_bot_chat.gsc | 1212 +++++------ maps/mp/bots/_bot_internal.gsc | 1072 +++++----- maps/mp/bots/_bot_script.gsc | 3664 ++++++++++++++++---------------- maps/mp/bots/_bot_utility.gsc | 952 ++++----- maps/mp/bots/_menu.gsc | 450 ++-- maps/mp/bots/_wp_editor.gsc | 346 +-- 9 files changed, 4092 insertions(+), 4086 deletions(-) diff --git a/.astylerc b/.astylerc index c0e7be1..4e00611 100644 --- a/.astylerc +++ b/.astylerc @@ -1,21 +1,27 @@ # try to mimic the original gsc provided +# mode=ghc mode=c style=allman -indent=tab +indent=force-tab=2 lineend=windows pad-oper pad-paren-in pad-header - -# delete-empty-lines +# pad-brackets-in +fill-empty-lines +squeeze-lines=2 +squeeze-ws +break-one-line-headers +add-braces +remove-comment-prefix break-blocks -# remove-braces indent-switches indent-cases indent-after-parens +indent-col1-comments remove-comment-prefix diff --git a/.editorconfig b/.editorconfig index bb97c78..be8eb14 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,7 @@ root = true indent_style = tab indent_size = 2 charset = latin1 -trim_trailing_whitespace = true +trim_trailing_whitespace = false insert_final_newline = true [*.md] diff --git a/maps/mp/bots/_bot.gsc b/maps/mp/bots/_bot.gsc index 36d8963..7dc669e 100644 --- a/maps/mp/bots/_bot.gsc +++ b/maps/mp/bots/_bot.gsc @@ -16,214 +16,214 @@ 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(); level.bots_fraglist = List(); - + level.bots_minsprintdistance = 315; level.bots_minsprintdistance *= level.bots_minsprintdistance; level.bots_mingrenadedistance = 256; @@ -239,11 +239,11 @@ init() level.bots_maxshotgundistance = 500; level.bots_maxshotgundistance *= level.bots_maxshotgundistance; level.bots_listendist = 100; - + level.smokeradius = 255; - + level.bots = []; - + level.bots_fullautoguns = []; level.bots_fullautoguns[ "fmg9" ] = true; level.bots_fullautoguns[ "skorpion" ] = true; @@ -268,22 +268,22 @@ init() level.bots_fullautoguns[ "pecheneg" ] = true; level.bots_fullautoguns[ "sa80" ] = true; level.bots_fullautoguns[ "mg36" ] = true; - + level.bots_fullautoguns[ "ak74u" ] = true; - + level.bots_fullautoguns[ "25mm" ] = true; level.bots_fullautoguns[ "40mm" ] = true; level.bots_fullautoguns[ "105mm" ] = true; level.bots_fullautoguns[ "remote" ] = true; - + level thread fixGamemodes(); - + level thread onPlayerConnect(); level thread addNotifyOnAirdrops(); level thread watchScrabler(); level thread watchRadar(); level thread auditModels(); - + level thread handleBots(); } @@ -295,21 +295,21 @@ handleBots() level thread teamBots(); level thread diffBots(); level addBots(); - + while ( !level.intermission ) { wait 0.05; } - + setdvar( "bots_manage_add", getBotArray().size ); - + if ( !getdvarint( "bots_main_kickBotsAtEnd" ) ) { return; } - + bots = getBotArray(); - + for ( i = 0; i < bots.size; i++ ) { kick( bots[ i ] getentitynumber() ); @@ -326,7 +326,7 @@ onPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, self maps\mp\bots\_bot_internal::onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ); self maps\mp\bots\_bot_script::onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ); } - + self [[ level.prevcallbackplayerdamage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ); } @@ -340,7 +340,7 @@ onPlayerKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sH self maps\mp\bots\_bot_internal::onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); self maps\mp\bots\_bot_script::onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); } - + self [[ level.prevcallbackplayerkilled ]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); } @@ -353,7 +353,7 @@ hook_callbacks() wait 0.05; // so we need to be one frame after it sets up its callbacks. level.prevcallbackplayerdamage = level.callbackplayerdamage; level.callbackplayerdamage = ::onPlayerDamage; - + level.prevcallbackplayerkilled = level.callbackplayerkilled; level.callbackplayerkilled = ::onPlayerKilled; } @@ -371,24 +371,24 @@ fixGamemodes() { level.bombzones[ i ].onuse = ::onUsePlantObjectFix; } - + break; } - + if ( isdefined( level.radios ) && level.gametype == "koth" ) { level thread fixKoth(); - + break; } - + if ( isdefined( level.bombzones ) && level.gametype == "dd" ) { level thread fixDem(); - + break; } - + wait 0.05; } } @@ -402,7 +402,7 @@ fixDem() { level.bombaplanted = level.aplanted; level.bombbplanted = level.bplanted; - + for ( i = 0; i < level.bombzones.size; i++ ) { if ( isdefined( level.bombzones[ i ].trigger.trigger_off ) ) @@ -414,7 +414,7 @@ fixDem() level.bombzones[ i ].bombexploded = undefined; } } - + wait 0.05; } } @@ -425,27 +425,27 @@ fixDem() fixKoth() { level.radio = undefined; - + for ( ;; ) { wait 0.05; - + if ( !isdefined( level.radioobject ) ) { continue; } - + 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; @@ -459,21 +459,21 @@ fixKoth() auditModels_loop() { s_models = getentarray( "script_model", "classname" ); - + for ( i = s_models.size - 1; i >= 0; i-- ) { model = s_models[ i ]; - + if ( !isdefined( model ) ) { continue; } - + if ( isdefined( model.bot_audit_model ) ) { continue; } - + if ( model.model == "com_deploy_ballistic_vest_friend_world" ) { model.bot_audit_model = true; @@ -488,13 +488,13 @@ auditModels_loop() auditModels() { level.vest_boxes = []; - + for ( ;; ) { wait 0.05; - + level.vest_boxes = array_removeundefined( level.vest_boxes ); - + auditModels_loop(); } } @@ -509,125 +509,125 @@ watchRadar_loop() player = level.players[ i ]; player.bot_isinradar = false; } - + for ( i = level.players.size - 1; i >= 0; i-- ) { 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; } } - + 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; } } - + if ( isdefined( level.gameflag ) && isdefined( level.gameflag.carrier ) && isdefined( level.gameflag.portable_radar ) ) { for ( h = level.players.size - 1; h >= 0; h-- ) { 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; } } @@ -641,7 +641,7 @@ watchRadar() for ( ;; ) { wait 1; - + watchRadar_loop(); } } @@ -656,94 +656,94 @@ watchScrabler_loop() player = level.players[ i ]; player.bot_isscrambled = false; } - + for ( i = level.scramblers.size - 1; i >= 0; i-- ) { 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; } } - + 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-- ) { drone = drones[ i ]; - + for ( h = level.players.size - 1; h >= 0; h-- ) { 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; } } @@ -757,7 +757,7 @@ watchScrabler() for ( ;; ) { wait 1; - + watchScrabler_loop(); } } @@ -768,16 +768,16 @@ watchScrabler() addNotifyOnAirdrops_loop() { dropCrates = getentarray( "care_package", "targetname" ); - + for ( i = dropCrates.size - 1; i >= 0; i-- ) { airdrop = dropCrates[ i ]; - + if ( isdefined( airdrop.doingphysics ) ) { continue; } - + airdrop.doingphysics = true; airdrop thread doNotifyOnAirdrop(); } @@ -802,14 +802,14 @@ doNotifyOnAirdrop() { self endon( "death" ); self waittill( "physics_finished" ); - + self.doingphysics = false; - + if ( isdefined( self.owner ) ) { self.owner notify( "crate_physics_done" ); } - + self thread onCarepackageCaptured(); } @@ -819,9 +819,9 @@ doNotifyOnAirdrop() onCarepackageCaptured() { self endon( "death" ); - + self waittill( "captured", player ); - + if ( isdefined( self.owner ) && self.owner is_bot() ) { self.owner BotNotifyBotEvent( "crate_cap", "captured", self, player ); @@ -836,13 +836,13 @@ onPlayerConnect() for ( ;; ) { level waittill( "connected", player ); - + player.bot_isscrambled = false; player.bot_isinradar = false; - + player thread onGrenadeFire(); player thread onWeaponFired(); - + player thread connected(); } } @@ -853,7 +853,7 @@ onPlayerConnect() onDisconnect() { self waittill( "disconnect" ); - + level.bots = array_remove( level.bots, self ); } @@ -863,37 +863,37 @@ onDisconnect() connected() { self endon( "disconnect" ); - + if ( !isdefined( self.pers[ "bot_host" ] ) ) { self thread doHostCheck(); } - + if ( !self is_bot() ) { return; } - + if ( !isdefined( self.pers[ "isBot" ] ) ) { // fast_restart occured... self.pers[ "isBot" ] = true; } - + if ( !isdefined( self.pers[ "isBotWarfare" ] ) ) { self.pers[ "isBotWarfare" ] = true; self thread added(); } - + self thread maps\mp\bots\_bot_internal::connected(); self thread maps\mp\bots\_bot_script::connected(); - + level.bots[ level.bots.size ] = self; self thread onDisconnect(); - + level notify( "bot_connected", self ); - + self thread watchBotDebugEvent(); } @@ -903,50 +903,50 @@ connected() watchBotDebugEvent() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "bot_event", msg, str, b, c, d, e, f, g ); - + if ( getdvarint( "bots_main_debug" ) >= 2 ) { 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 ); } else if ( msg == "debug" && getdvarint( "bots_main_debug" ) ) @@ -962,7 +962,7 @@ watchBotDebugEvent() added() { self endon( "disconnect" ); - + self thread maps\mp\bots\_bot_internal::added(); self thread maps\mp\bots\_bot_script::added(); } @@ -973,7 +973,7 @@ added() add_bot() { bot = addtestclient(); - + if ( isdefined( bot ) ) { bot.pers[ "isBot" ] = true; @@ -992,30 +992,30 @@ diffBots_loop() var_axis_hard = getdvarint( "bots_skill_axis_hard" ); var_axis_med = getdvarint( "bots_skill_axis_med" ); var_skill = getdvarint( "bots_skill" ); - + allies_hard = 0; allies_med = 0; axis_hard = 0; axis_med = 0; - + if ( var_skill == 8 ) { playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } - + if ( !player is_bot() ) { continue; } - + if ( player.pers[ "team" ] == "axis" ) { if ( axis_hard < var_axis_hard ) @@ -1055,33 +1055,33 @@ diffBots_loop() else if ( var_skill != 0 && var_skill != 9 ) { playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !player is_bot() ) { continue; } - + player.pers[ "bots" ][ "skill" ][ "base" ] = var_skill; } } - + playercount = level.players.size; min_diff = getdvarint( "bots_skill_min" ); max_diff = getdvarint( "bots_skill_max" ); - + for ( i = 0; i < playercount; i++ ) { 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 ) ); } } @@ -1094,7 +1094,7 @@ diffBots() for ( ;; ) { wait 1.5; - + diffBots_loop(); } } @@ -1106,23 +1106,23 @@ teamBots_loop() { teamAmount = getdvarint( "bots_team_amount" ); toTeam = getdvar( "bots_team" ); - + alliesbots = 0; alliesplayers = 0; axisbots = 0; axisplayers = 0; - + playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } - + if ( player is_bot() ) { if ( player.pers[ "team" ] == "allies" ) @@ -1146,16 +1146,16 @@ teamBots_loop() } } } - + allies = alliesbots; axis = axisbots; - + if ( !getdvarint( "bots_team_mode" ) ) { allies += alliesplayers; axis += axisplayers; } - + if ( toTeam != "custom" ) { if ( getdvarint( "bots_team_force" ) ) @@ -1165,37 +1165,37 @@ teamBots_loop() if ( abs( axis - allies ) > 1 ) { toTeam = "axis"; - + if ( axis > allies ) { toTeam = "allies"; } } } - + if ( toTeam != "autoassign" ) { playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { 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 ]](); @@ -1208,7 +1208,7 @@ teamBots_loop() { player thread [[ level.spectator ]](); } - + break; } } @@ -1217,21 +1217,21 @@ teamBots_loop() else { playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } - + if ( !player is_bot() ) { continue; } - + if ( player.pers[ "team" ] == "axis" ) { if ( axis > teamAmount ) @@ -1275,42 +1275,42 @@ teamBots() addBots_loop() { botsToAdd = getdvarint( "bots_manage_add" ); - + if ( botsToAdd > 0 ) { setdvar( "bots_manage_add", 0 ); - + if ( botsToAdd > 64 ) { botsToAdd = 64; } - + for ( ; botsToAdd > 0; botsToAdd-- ) { level add_bot(); wait 0.25; } } - + fillMode = getdvarint( "bots_manage_fill_mode" ); - + if ( fillMode == 2 || fillMode == 3 ) { setdvar( "bots_manage_fill", getGoodMapAmount() ); } - + fillAmount = getdvarint( "bots_manage_fill" ); - + players = 0; bots = 0; spec = 0; - + playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( player is_bot() ) { bots++; @@ -1324,7 +1324,7 @@ addBots_loop() players++; } } - + if ( !randomint( 999 ) ) { setdvar( "testclients_doreload", true ); @@ -1332,28 +1332,28 @@ addBots_loop() setdvar( "testclients_doreload", false ); doExtraCheck(); } - + if ( fillMode == 4 ) { axisplayers = 0; alliesplayers = 0; - + playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( player is_bot() ) { continue; } - + if ( !isdefined( player.pers[ "team" ] ) ) { continue; } - + if ( player.pers[ "team" ] == "axis" ) { axisplayers++; @@ -1363,9 +1363,9 @@ addBots_loop() alliesplayers++; } } - + result = fillAmount - abs( axisplayers - alliesplayers ) + bots; - + if ( players == 0 ) { if ( bots < fillAmount ) @@ -1381,22 +1381,22 @@ addBots_loop() result = fillAmount; } } - + bots = result; } - + 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 ); @@ -1404,7 +1404,7 @@ addBots_loop() else if ( amount > fillAmount && getdvarint( "bots_manage_fill_kick" ) ) { tempBot = getBotToKick(); - + if ( isdefined( tempBot ) ) { kick( tempBot getentitynumber() ); @@ -1418,13 +1418,13 @@ addBots_loop() addBots() { level endon( "game_ended" ); - + bot_wait_for_host(); - + for ( ;; ) { wait 1.5; - + addBots_loop(); } } @@ -1435,18 +1435,18 @@ addBots() onGrenadeFire() { self endon( "disconnect" ); - + for ( ;; ) { self waittill ( "grenade_fire", grenade, weaponName ); - + if ( !isdefined( grenade ) ) { continue; } - + grenade.name = weaponName; - + if ( weaponName == "smoke_grenade_mp" ) { grenade thread AddToSmokeList(); @@ -1470,9 +1470,9 @@ AddToFragList( who ) grenade.owner = who; grenade.team = who.team; grenade.throwback = undefined; - + grenade thread thinkFrag(); - + level.bots_fraglist ListAdd( grenade ); } @@ -1486,10 +1486,10 @@ thinkFrag() nowOrigin = self.grenade getorigin(); self.velocity = ( nowOrigin - self.origin ) * 20; self.origin = nowOrigin; - + wait 0.05; } - + level.bots_fraglist ListRemove( self ); } @@ -1502,9 +1502,9 @@ AddToSmokeList() grenade.origin = self getorigin(); grenade.state = "moving"; grenade.grenade = self; - + grenade thread thinkSmoke(); - + level.bots_smokelist ListAdd( grenade ); } @@ -1519,10 +1519,10 @@ thinkSmoke() self.state = "moving"; wait 0.05; } - + self.state = "smoking"; wait 11.5; - + level.bots_smokelist ListRemove( self ); } @@ -1533,7 +1533,7 @@ onWeaponFired() { self endon( "disconnect" ); self.bots_firing = false; - + for ( ;; ) { self waittill( "weapon_fired" ); diff --git a/maps/mp/bots/_bot_chat.gsc b/maps/mp/bots/_bot_chat.gsc index 18f66a2..703505a 100644 --- a/maps/mp/bots/_bot_chat.gsc +++ b/maps/mp/bots/_bot_chat.gsc @@ -19,7 +19,7 @@ init() { setdvar( "bots_main_chat", 1.0 ); } - + level thread onBotConnected(); } @@ -31,7 +31,7 @@ onBotConnected() for ( ;; ) { level waittill( "bot_connected", bot ); - + bot thread start_chat_threads(); } } @@ -42,12 +42,12 @@ onBotConnected() 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 ( isdefined( isTeam ) && isTeam ) @@ -67,14 +67,14 @@ BotDoChat( chance, string, isTeam ) start_chat_threads() { self endon( "disconnect" ); - + self thread start_onnuke_call(); self thread start_random_chat(); self thread start_chat_watch(); self thread start_killed_watch(); self thread start_death_watch(); self thread start_endgame_watch(); - + self thread start_startgame_watch(); } @@ -84,16 +84,16 @@ start_chat_threads() start_onnuke_call() { self endon( "disconnect" ); - + for ( ;; ) { while ( !isdefined( level.nukeincoming ) && !isdefined( level.moabincoming ) ) { wait 0.05 + randomint( 4 ); } - + self thread bot_onnukecall_watch(); - + wait level.nuketimer + 5; } } @@ -104,13 +104,13 @@ start_onnuke_call() start_death_watch() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "death" ); - + self thread bot_chat_death_watch( self.lastattacker, self.bots_lastks ); - + self.bots_lastks = 0; } } @@ -121,9 +121,9 @@ start_death_watch() start_endgame_watch() { self endon( "disconnect" ); - + level waittill ( "game_ended" ); - + self thread endgame_chat(); } @@ -133,11 +133,11 @@ start_endgame_watch() start_random_chat() { self endon( "disconnect" ); - + for ( ;; ) { wait 1; - + if ( randomint( 100 ) < 1 ) { if ( randomint( 100 ) < 1 && isreallyalive( self ) ) @@ -154,13 +154,13 @@ start_random_chat() start_killed_watch() { self endon( "disconnect" ); - + self.bots_lastks = 0; - + for ( ;; ) { self waittill( "killed_enemy" ); - + if ( self.bots_lastks < self.pers[ "cur_kill_streak" ] ) { for ( i = self.bots_lastks + 1; i <= self.pers[ "cur_kill_streak" ]; i++ ) @@ -168,9 +168,9 @@ start_killed_watch() self thread bot_chat_streak( i ); } } - + self.bots_lastks = self.pers[ "cur_kill_streak" ]; - + self thread bot_chat_killed_watch( self.lastkilledplayer ); } } @@ -182,149 +182,149 @@ start_chat_watch() { self endon( "disconnect" ); level endon ( "game_ended" ); - + for ( ;; ) { self waittill( "bot_event", msg, a, b, c, d, e, f, g ); - + switch ( msg ) { case "revive": self thread bot_chat_revive_watch( a, b, c, d, e, f, g ); break; - + case "killcam": self thread bot_chat_killcam_watch( a, b, c, d, e, f, g ); break; - + case "stuck": self thread bot_chat_stuck_watch( a, b, c, d, e, f, g ); break; - + case "tube": self thread bot_chat_tube_watch( a, b, c, d, e, f, g ); break; - + case "killstreak": self thread bot_chat_killstreak_watch( a, b, c, d, e, f, g ); break; - + case "crate_cap": self thread bot_chat_crate_cap_watch( a, b, c, d, e, f, g ); break; - + case "attack_vehicle": self thread bot_chat_attack_vehicle_watch( a, b, c, d, e, f, g ); break; - + case "follow_threat": self thread bot_chat_follow_threat_watch( a, b, c, d, e, f, g ); break; - + case "camp": self thread bot_chat_camp_watch( a, b, c, d, e, f, g ); break; - + case "follow": self thread bot_chat_follow_watch( a, b, c, d, e, f, g ); break; - + case "equ": self thread bot_chat_equ_watch( a, b, c, d, e, f, g ); break; - + case "nade": self thread bot_chat_nade_watch( a, b, c, d, e, f, g ); break; - + case "jav": self thread bot_chat_jav_watch( a, b, c, d, e, f, g ); break; - + case "throwback": self thread bot_chat_throwback_watch( a, b, c, d, e, f, g ); break; - + case "rage": self thread bot_chat_rage_watch( a, b, c, d, e, f, g ); break; - + case "tbag": self thread bot_chat_tbag_watch( a, b, c, d, e, f, g ); break; - + case "revenge": self thread bot_chat_revenge_watch( a, b, c, d, e, f, g ); break; - + case "heard_target": self thread bot_chat_heard_target_watch( a, b, c, d, e, f, g ); break; - + case "uav_target": self thread bot_chat_uav_target_watch( a, b, c, d, e, f, g ); break; - + case "attack_equ": self thread bot_chat_attack_equ_watch( a, b, c, d, e, f, g ); break; - + case "turret_attack": self thread bot_chat_turret_attack_watch( a, b, c, d, e, f, g ); break; - + case "dom": self thread bot_chat_dom_watch( a, b, c, d, e, f, g ); break; - + case "hq": self thread bot_chat_hq_watch( a, b, c, d, e, f, g ); break; - + case "sab": self thread bot_chat_sab_watch( a, b, c, d, e, f, g ); break; - + case "sd": self thread bot_chat_sd_watch( a, b, c, d, e, f, g ); break; - + case "cap": self thread bot_chat_cap_watch( a, b, c, d, e, f, g ); break; - + case "dem": self thread bot_chat_dem_watch( a, b, c, d, e, f, g ); break; - + case "gtnw": self thread bot_chat_gtnw_watch( a, b, c, d, e, f, g ); break; - + case "oneflag": self thread bot_chat_oneflag_watch( a, b, c, d, e, f, g ); break; - + case "arena": self thread bot_chat_arena_watch( a, b, c, d, e, f, g ); break; - + case "vip": self thread bot_chat_vip_watch( a, b, c, d, e, f, g ); break; - + case "conf": self thread bot_chat_conf_watch( a, b, c, d, e, f, g ); break; - + case "grnd": self thread bot_chat_grnd_watch( a, b, c, d, e, f, g ); break; - + case "tdef": self thread bot_chat_tdef_watch( a, b, c, d, e, f, g ); break; - + case "box_cap": self thread bot_chat_box_cap_watch( a, b, c, d, e, f, g ); break; @@ -338,9 +338,9 @@ start_chat_watch() start_startgame_watch() { self endon( "disconnect" ); - + wait( randomint( 5 ) + randomint( 5 ) ); - + switch ( level.gametype ) { case "war": @@ -349,130 +349,130 @@ start_startgame_watch() case 0: self BotDoChat( 7, "TEEEEEEEEAM, DEEEEAAAAAATHMAAAAATCH!!" ); break; - + case 1: self BotDoChat( 7, "Lets get em guys, wipe the floor with them." ); break; - + case 2: self BotDoChat( 7, "Yeeeesss master..." ); break; } - + break; - + case "dom": switch ( randomint( 3 ) ) { case 0: self BotDoChat( 7, "Yaaayy!! I LOVE DOMINATION!!!!" ); break; - + case 1: self BotDoChat( 7, "Lets cap the flags and them." ); break; - + case 2: self BotDoChat( 7, "Yeeeesss master..." ); break; } - + break; - + case "sd": switch ( randomint( 3 ) ) { case 0: self BotDoChat( 7, "Ahhhh! I'm scared! No respawning!" ); break; - + case 1: self BotDoChat( 7, "Lets get em guys, wipe the floor with them." ); break; - + case 2: self BotDoChat( 7, "Yeeeesss master..." ); break; } - + break; - + case "dd": switch ( randomint( 3 ) ) { case 0: self BotDoChat( 7, "Try not to get spawn killed." ); break; - + case 1: self BotDoChat( 7, "OK we need a plan. Nah lets just kill." ); break; - + case 2: self BotDoChat( 7, "Yeeeesss master..." ); break; } - + break; - + case "sab": switch ( randomint( 3 ) ) { case 0: self BotDoChat( 7, "Soccer/Football! Lets play it!" ); break; - + case 1: self BotDoChat( 7, "Who plays sab these days." ); break; - + case 2: self BotDoChat( 7, "I do not know what to say." ); break; } - + break; - + case "ctf": switch ( randomint( 3 ) ) { case 0: self BotDoChat( 7, "Halo style" ); break; - + case 1: self BotDoChat( 7, "I'm going cap all the flags." ); break; - + case 2: self BotDoChat( 7, "NO IM CAPPING IT" ); break; } - + break; - + case "dm": switch ( randomint( 3 ) ) { case 0: self BotDoChat( 7, "DEEEEAAAAAATHMAAAAATCH!!" ); break; - + case 1: self BotDoChat( 7, "IM GOING TO KILL U ALL" ); break; - + case 2: self BotDoChat( 7, "lol sweet. time to camp." ); break; } - + break; - + case "koth": self BotDoChat( 7, "HQ TIME!" ); break; - + case "gtnw": self BotDoChat( 7, "global thermonuclear warfare!!!!!!!" ); break; @@ -486,7 +486,7 @@ doQuickMessage() { self endon( "disconnect" ); self endon( "death" ); - + if ( !isdefined( self.talking ) || !self.talking ) { self.talking = true; @@ -494,35 +494,35 @@ doQuickMessage() saytext = ""; wait 2; self.spamdelay = true; - + switch ( randomint( 11 ) ) { case 4 : soundalias = "mp_cmd_suppressfire"; saytext = "Suppressing fire!"; break; - + case 5 : soundalias = "mp_cmd_followme"; saytext = "Follow Me!"; break; - + case 6 : soundalias = "mp_stm_enemyspotted"; saytext = "Enemy spotted!"; break; - + case 7 : soundalias = "mp_cmd_fallback"; saytext = "Fall back!"; break; - + case 8 : soundalias = "mp_stm_needreinforcements"; saytext = "Need reinforcements!"; break; } - + if ( soundalias != "" && saytext != "" ) { self maps\mp\gametypes\_quickmessages::saveheadicon(); @@ -537,7 +537,7 @@ doQuickMessage() 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; wait randomint( 5 ); self.talking = false; @@ -550,34 +550,34 @@ doQuickMessage() endgame_chat() { self endon( "disconnect" ); - + wait ( randomint( 6 ) + randomint( 6 ) ); b = -1; w = 999999999; winner = undefined; loser = undefined; - + for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( player.pers[ "score" ] > b ) { winner = player; b = player.pers[ "score" ]; } - + if ( player.pers[ "score" ] < w ) { loser = player; w = player.pers[ "score" ]; } } - + if ( level.teambased ) { winningteam = maps\mp\gametypes\_gamescore::getwinningteam(); - + if ( self.pers[ "team" ] == winningteam ) { switch ( randomint( 21 ) ) @@ -585,71 +585,71 @@ endgame_chat() case 0: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Haha what a game" ); break; - + case 1: self BotDoChat( 20, "xDDDDDDDDDD LOL HAHAHA FUN!" ); break; - + case 3: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "That was fun" ); break; - + case 4: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Lol my team always wins!" ); break; - + case 5: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Haha if i am on " + winningteam + " my team always wins!" ); break; - + case 2: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gg" ); break; - + case 6: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "GGA, our team was awesome!" ); break; - + case 7: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "My team " + self.pers[ "team" ] + " always wins!!" ); break; - + case 8: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "WOW that was EPIC!" ); break; - + case 9: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Hackers lost haha noobs" ); break; - + case 10: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Nice game!! Good job team!" ); break; - + case 11: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "GGA, Well done team!" ); break; - + case 12: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "LOL! camper noobs lose" ); break; - + case 13: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "owned." ); break; - + case 14: self BotDoChat( 20, "lool we won!!" ); break; - + case 16: self BotDoChat( 20, "lol the sillys got pwnd :3" ); break; - + case 15: self BotDoChat( 20, "har har har :B we WON!" ); break; - + case 17: if ( self == winner ) { @@ -667,9 +667,9 @@ endgame_chat() { self BotDoChat( 20, "wow " + winner.name + " did very well!" ); } - + break; - + case 18: if ( self == winner ) { @@ -687,13 +687,13 @@ endgame_chat() { self BotDoChat( 20, "i think " + winner.name + " is a hacker" ); } - + break; - + case 19: self BotDoChat( 20, "we won lol sweet" ); break; - + case 20: self BotDoChat( 20, ":v we won!" ); break; @@ -708,59 +708,59 @@ endgame_chat() case 0: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Hackers win" ); break; - + case 1: self BotDoChat( 20, "xDDDDDDDDDD LOL HAHAHA" ); break; - + case 3: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "That wasn't fun" ); break; - + case 4: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Wow my team SUCKS!" ); break; - + case 5: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "My team " + self.pers[ "team" ] + " always loses!!" ); break; - + case 2: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gg" ); break; - + case 6: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "bg" ); break; - + case 7: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "vbg" ); break; - + case 8: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "WOW that was EPIC!" ); break; - + case 9: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Good game" ); break; - + case 10: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Bad game" ); break; - + case 11: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "very bad game" ); break; - + case 12: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "campers win" ); break; - + case 13: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "CAMPER NOOBS!!" ); break; - + case 14: if ( self == winner ) { @@ -778,9 +778,9 @@ endgame_chat() { self BotDoChat( 20, "kwtf " + winner.name + " is a hacker" ); } - + break; - + case 15: if ( self == winner ) { @@ -798,25 +798,25 @@ endgame_chat() { self BotDoChat( 20, winner.name + " is a noob!" ); } - + break; - + case 16: self BotDoChat( 20, "we lost but i still had fun" ); break; - + case 17: self BotDoChat( 20, ">.> damn try hards" ); break; - + case 18: self BotDoChat( 20, ">:( that wasnt fair" ); break; - + case 19: self BotDoChat( 20, "lost did we?" ); break; - + case 20: self BotDoChat( 20, ">:V noobs win" ); break; @@ -829,31 +829,31 @@ endgame_chat() case 0: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gg" ); break; - + case 1: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "bg" ); break; - + case 2: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "vbg" ); break; - + case 3: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "vgg" ); break; - + case 4: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gg no rm" ); break; - + case 5: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "ggggggggg" ); break; - + case 6: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "good game" ); break; - + case 7: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gee gee" ); break; @@ -882,9 +882,9 @@ endgame_chat() { self BotDoChat( 20, "This game sucked, " + winner.name + " is such a hacker!!" ); } - + break; - + case 1: if ( self == winner ) { @@ -902,9 +902,9 @@ endgame_chat() { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Nice Score " + winner.name + ", how did you get to be so good?" ); } - + break; - + case 2: if ( self == winner ) { @@ -922,73 +922,73 @@ endgame_chat() { self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "lolwtf " + winner.name ); } - + break; - + case 3: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gee gee" ); break; - + case 4: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "WOW that was EPIC!" ); break; - + case 5: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "Nice Game!" ); break; - + case 6: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "good game" ); break; - + case 7: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gga c u all later" ); break; - + case 8: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "bg" ); break; - + case 9: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "GG" ); break; - + case 10: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gg" ); break; - + case 11: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "vbg" ); break; - + case 12: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "gga" ); break; - + case 13: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "BG" ); break; - + case 14: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "stupid map" ); break; - + case 15: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "ffa sux" ); break; - + case 16: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + ":3 i had fun" ); break; - + case 17: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + ":P nubs are playin" ); break; - + case 18: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "nub nub nub thx 4 the nubs" ); break; - + case 19: self BotDoChat( 20, "^" + ( randomint( 6 ) + 1 ) + "damn campers" ); break; @@ -1002,7 +1002,7 @@ endgame_chat() bot_onnukecall_watch() { self endon( "disconnect" ); - + switch ( randomint( 4 ) ) { case 0: @@ -1014,9 +1014,9 @@ bot_onnukecall_watch() { self BotDoChat( 30, "NUUUUUUKKKKKKEEEEEE!!!! :D" ); } - + break; - + case 1: if ( level.nukeinfo.player != self ) { @@ -1026,13 +1026,13 @@ bot_onnukecall_watch() { self BotDoChat( 30, "im the best!" ); } - + break; - + case 2: self BotDoChat( 30, "woah, that nuke is like much wow" ); break; - + case 3: if ( level.nukeinfo.team != self.team ) { @@ -1042,7 +1042,7 @@ bot_onnukecall_watch() { self BotDoChat( 30, "man my team is good lol" ); } - + break; } } @@ -1053,7 +1053,7 @@ bot_onnukecall_watch() bot_chat_streak( streakCount ) { self endon( "disconnect" ); - + if ( streakCount == 25 ) { if ( self.pers[ "lastEarnedStreak" ] == "nuke" ) @@ -1063,19 +1063,19 @@ bot_chat_streak( streakCount ) case 0: self BotDoChat( 100, "I GOT A NUKE!!" ); break; - + case 1: self BotDoChat( 100, "NUKEEEEEEEEEEEEEEEEE" ); break; - + case 2: self BotDoChat( 100, "25 killstreak!!!" ); break; - + case 3: self BotDoChat( 100, "NNNNNUUUUUUUUUUKKKKEEE!!! UWDHAWIDMIOGHE" ); break; - + case 4: self BotDoChat( 100, "You guys are getting nuuuuuuked~ x3" ); break; @@ -1090,189 +1090,189 @@ bot_chat_streak( streakCount ) bot_chat_killed_watch( victim ) { self endon( "disconnect" ); - + if ( !isdefined( victim ) || !isdefined( victim.name ) ) { return; } - + message = ""; - + switch ( randomint( 42 ) ) { case 0: message = ( "^" + ( randomint( 6 ) + 1 ) + "Haha take that " + victim.name ); break; - + case 1: message = ( "^" + ( randomint( 6 ) + 1 ) + "Who's your daddy!" ); break; - + case 2: message = ( "^" + ( randomint( 6 ) + 1 ) + "O i just kicked your ass " + victim.name + "!!" ); break; - + case 3: message = ( "^" + ( randomint( 6 ) + 1 ) + "Better luck next time " + victim.name ); break; - + case 4: message = ( "^" + ( randomint( 6 ) + 1 ) + victim.name + " Is that all you got?" ); break; - + case 5: - message = ( "^" + ( randomint( 6 ) + 1 ) + "LOL " + victim.name + ", l2play" ); + message = ( "^" + ( randomint( 6 ) + 1 ) + "LOL " + victim.name + ", l2play" ); break; - + case 6: message = ( "^" + ( randomint( 6 ) + 1 ) + ":)" ); break; - + case 7: message = ( "^" + ( randomint( 6 ) + 1 ) + "Im unstoppable!" ); break; - + case 8: message = ( "^" + ( randomint( 6 ) + 1 ) + "Wow " + victim.name + " that was a close one!" ); break; - + case 9: message = ( "^" + ( randomint( 6 ) + 1 ) + "Haha thank you, thank you very much." ); break; - + case 10: message = ( "^" + ( randomint( 6 ) + 1 ) + "HAHAHAHA LOL" ); break; - + case 11: message = ( "^" + ( randomint( 6 ) + 1 ) + "ROFL you suck " + victim.name + "!!" ); break; - + case 12: message = ( "^" + ( randomint( 6 ) + 1 ) + "Wow that was a lucky shot!" ); break; - + case 13: message = ( "^" + ( randomint( 6 ) + 1 ) + "Thats right, i totally pwnd your ass!" ); break; - + case 14: message = ( "^" + ( randomint( 6 ) + 1 ) + "Don't even think that i am hacking cause that was pure skill!" ); break; - + case 15: message = ( "LOL xD xDDDD " + victim.name + " sucks! HAHA ROFLMAO" ); break; - + case 16: message = ( "Wow that was an easy kill." ); break; - + case 17: message = ( "noob down" ); break; - + case 18: message = ( "Lol u suck " + victim.name ); break; - + case 19: message = ( "PWND!" ); break; - + case 20: message = ( "sit down " + victim.name ); break; - + case 21: message = ( "wow that was close, but i still got you ;)" ); break; - + case 22: message = ( "oooooo! i got u good!" ); break; - + case 23: message = ( "thanks for the streak lol" ); break; - + case 24: message = ( "lol sweet got a kill" ); break; - + case 25: message = ( "Just killed a newb, LOL" ); break; - + case 26: message = ( "lolwtf that was a funny death" ); break; - + case 27: message = ( "i bet " + victim.name + " is using the arrow keys to move." ); break; - + case 28: message = ( "lol its noobs like " + victim.name + " that ruin teams" ); break; - + case 29: message = ( "lolwat was that " + victim.name + "?" ); break; - + case 30: message = ( "haha thanks " + victim.name + ", im at a " + self.pers[ "cur_kill_streak" ] + " streak." ); break; - + case 31: message = ( "lol " + victim.name + " is at a " + victim.pers[ "cur_death_streak" ] + " deathstreak" ); break; - + case 32: message = ( "KLAPPED" ); break; - + case 33: message = ( "oooh get merked " + victim.name ); break; - + case 34: message = ( "i love " + getMapName( getdvar( "mapname" ) ) + "!" ); break; - + case 35: message = ( getMapName( getdvar( "mapname" ) ) + " is my favorite map!" ); break; - + case 36: message = ( "get rekt" ); break; - + case 37: message = ( "lol i rekt " + victim.name ); break; - + case 38: message = ( "lol ur mum can play better than u!" ); break; - + case 39: message = ( victim.name + " just got rekt" ); break; - + 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; - + case 41: message = ( "lol u got killed " + victim.name + ", kek" ); break; } - + wait ( randomint( 3 ) + 1 ); self BotDoChat( 5, message ); } @@ -1283,32 +1283,32 @@ bot_chat_killed_watch( victim ) bot_chat_death_watch( killer, last_ks ) { self endon( "disconnect" ); - + if ( !isdefined( killer ) || !isdefined( killer.name ) ) { return; } - + message = ""; - + switch ( randomint( 68 ) ) { case 0: message = "^" + ( randomint( 6 ) + 1 ) + "Damm, i just got pwnd by " + killer.name; break; - + case 1: message = ( "^" + ( randomint( 6 ) + 1 ) + "Hax ! Hax ! Hax !" ); break; - + case 2: message = ( "^" + ( randomint( 6 ) + 1 ) + "WOW n1 " + killer.name ); break; - + case 3: - message = ( "^" + ( randomint( 6 ) + 1 ) + "How the?? How did you do that " + killer.name + "?" ); + message = ( "^" + ( randomint( 6 ) + 1 ) + "How the?? How did you do that " + killer.name + "?" ); break; - + case 4: if ( last_ks > 0 ) { @@ -1318,266 +1318,266 @@ bot_chat_death_watch( killer, last_ks ) { message = ( "man im getting spawn killed, i have a " + self.pers[ "cur_death_streak" ] + " deathstreak!" ); } - + break; - + case 5: message = ( "^" + ( randomint( 6 ) + 1 ) + "Stop spawn KILLING!!!" ); break; - + case 6: message = ( "^" + ( randomint( 6 ) + 1 ) + "Haha Well done " + killer.name ); break; - + case 7: message = ( "^" + ( randomint( 6 ) + 1 ) + "Agggghhhh " + killer.name + " you are such a noob!!!!" ); break; - + case 8: message = ( "^" + ( randomint( 6 ) + 1 ) + "n1 " + killer.name ); break; - + case 9: message = ( "Sigh at my lag, it's totally killing me.. ^2Just Look at my ^1Ping!" ); break; - + case 10: message = ( "omg wow that was LEGENDARY, well done " + killer.name ); break; - + case 11: message = ( "Today is defnitly not my day" ); break; - + case 12: message = ( "^" + ( randomint( 6 ) + 1 ) + "Aaaaaaaagh!!!" ); break; - + case 13: message = ( "^" + ( randomint( 6 ) + 1 ) + " Dude What the hell, " + killer.name + " is such a HACKER!! " ); break; - + case 14: message = ( "^" + ( randomint( 6 ) + 1 ) + killer.name + " you Wallhacker!" ); break; - + case 15: message = ( "^" + ( randomint( 6 ) + 1 ) + "This is so frustrating!" ); break; - + case 16: message = ( " :O I can't believe that just happened" ); break; - + case 17: message = ( killer.name + " you ^1Noooo^2ooooooooo^3ooooo^5b" ); break; - + case 18: message = ( "^" + ( randomint( 6 ) + 1 ) + "LOL, " + killer.name + " how did you kill me?" ); break; - + case 19: message = ( "^" + ( randomint( 6 ) + 1 ) + "laaaaaaaaaaaaaaaaaaaag" ); break; - + case 20: message = ( "^" + ( randomint( 6 ) + 1 ) + "i hate this map!" ); break; - + case 21: message = ( killer.name + " You tanker!!" ); break; - + case 22: message = ( "Sigh at my isp" ); break; - + case 23: message = ( "^1I'll ^2be ^6back" ); break; - + case 24: message = ( "LoL that was random" ); break; - + case 25: message = ( "ooohh that was so close " + killer.name + " and you know it !! " ); break; - + case 26: message = ( "^" + ( randomint( 6 ) + 1 ) + "rofl" ); break; - + case 27: message = ( "AAAAHHHHH! WTF! IM GOING TO KILL YOU " + killer.name ); break; - + case 28: message = ( "AHH! IM DEAD BECAUSE " + level.players[ randomint( level.players.size ) ].name + " is a noob!" ); break; - + case 29: message = ( level.players[ randomint( level.players.size ) ].name + ", please don't talk." ); break; - + case 30: message = ( "Wow " + level.players[ randomint( level.players.size ) ].name + " is a blocker noob!" ); break; - + case 31: message = ( "Next time GET OUT OF MY WAY " + level.players[ randomint( level.players.size ) ].name + "!!" ); break; - + case 32: message = ( "Wow, I'm dead because " + killer.name + " is a tryhard..." ); break; - + case 33: message = ( "Try harder " + killer.name + " please!" ); break; - + case 34: message = ( "I bet " + killer.name + "'s fingers are about to break." ); break; - + case 35: message = ( "WOW, USE A REAL GUN " + killer.name + "!" ); break; - + case 36: message = ( "k wtf. " + killer.name + " is hacking" ); break; - + case 37: message = ( "nice wallhacks " + killer.name ); break; - + case 38: message = ( "wh " + killer.name ); break; - + case 39: message = ( "cheetos!" ); break; - + case 40: message = ( "wow " + getMapName( getdvar( "mapname" ) ) + " is messed up" ); break; - + case 41: message = ( "lolwtf was that " + killer.name + "?" ); break; - + case 42: message = ( "admin pls ban " + killer.name ); break; - + case 43: message = ( "WTF IS WITH THESE SPAWNS??" ); break; - + case 44: message = ( "im getting owned lol..." ); break; - + case 45: message = ( "someone kill " + killer.name + ", they are on a streak of " + killer.pers[ "cur_kill_streak" ] + "!" ); break; - + case 46: message = ( "man i died" ); break; - + case 47: message = ( "nice noob gun " + killer.name ); break; - + case 48: message = ( "stop camping " + killer.name + "!" ); break; - + case 49: message = ( "k THERE IS NOTHING I CAN DO ABOUT DYING!!" ); break; - + case 50: message = ( "aw" ); break; - + case 51: message = ( "lol " + getMapName( getdvar( "mapname" ) ) + " sux" ); break; - + case 52: message = ( "why are we even playing on " + getMapName( getdvar( "mapname" ) ) + "?" ); break; - + case 53: message = ( getMapName( getdvar( "mapname" ) ) + " is such an unfair map!!" ); break; - + case 54: message = ( "what were they thinking when making " + getMapName( getdvar( "mapname" ) ) + "?!" ); break; - + case 55: message = ( killer.name + " totally just destroyed me!" ); break; - + case 56: message = ( "can i be admen plz? so i can ban " + killer.name ); break; - + case 57: message = ( "wow " + killer.name + " is such a no life!!" ); break; - + case 58: message = ( "man i got rekt by " + killer.name ); break; - + case 59: message = ( "admen pls ben " + killer.name ); break; - + 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; - + case 61: message = ( "you are so banned " + killer.name ); break; - + case 62: message = ( "recorded reported and deported! " + killer.name ); break; - + case 63: message = ( "hack name " + killer.name + "?" ); break; - + case 64: message = ( "dude can you send me that hack " + killer.name + "?" ); break; - + case 65: message = ( "nice aimbot " + killer.name + "!!1" ); break; - + case 66: message = ( "you are benned " + killer.name + "!!" ); break; - + case 67: message = ( "that was topkek " + killer.name ); break; } - + wait ( randomint( 3 ) + 1 ); self BotDoChat( 8, message ); } @@ -1588,7 +1588,7 @@ bot_chat_death_watch( killer, last_ks ) bot_chat_revive_watch( state, revive, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": @@ -1598,9 +1598,9 @@ bot_chat_revive_watch( state, revive, c, d, e, f, g ) self BotDoChat( 10, "i am going to revive " + revive.name ); break; } - + break; - + case "start": switch ( randomint( 1 ) ) { @@ -1608,9 +1608,9 @@ bot_chat_revive_watch( state, revive, c, d, e, f, g ) self BotDoChat( 10, "i am reviving " + revive.name ); break; } - + break; - + case "stop": switch ( randomint( 1 ) ) { @@ -1618,7 +1618,7 @@ bot_chat_revive_watch( state, revive, c, d, e, f, g ) self BotDoChat( 10, "i revived " + revive.name ); break; } - + break; } } @@ -1629,7 +1629,7 @@ bot_chat_revive_watch( state, revive, c, d, e, f, g ) bot_chat_killcam_watch( state, b, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -1638,26 +1638,26 @@ bot_chat_killcam_watch( state, b, c, d, e, f, g ) case 0: self BotDoChat( 1, "WTF?!?!?!! Dude youre a hacker and a half!!" ); break; - + case 1: self BotDoChat( 1, "Haa! Got my fraps ready, time to watch this killcam." ); break; } - + break; - + case "stop": switch ( randomint( 2 ) ) { case 0: self BotDoChat( 1, "Wow... Im reporting you!!!" ); break; - + case 1: self BotDoChat( 1, "Got it on fraps!" ); break; } - + break; } } @@ -1668,10 +1668,10 @@ bot_chat_killcam_watch( state, b, c, d, e, f, g ) bot_chat_stuck_watch( a, b, c, d, e, f, g ) { self endon( "disconnect" ); - + sayLength = randomintrange( 5, 30 ); msg = ""; - + for ( i = 0; i < sayLength; i++ ) { switch ( randomint( 9 ) ) @@ -1679,41 +1679,41 @@ bot_chat_stuck_watch( a, b, c, d, e, f, g ) case 0: msg = msg + "w"; break; - + case 1: msg = msg + "s"; break; - + case 2: msg = msg + "d"; break; - + case 3: msg = msg + "a"; break; - + case 4: msg = msg + " "; break; - + case 5: msg = msg + "W"; break; - + case 6: msg = msg + "S"; break; - + case 7: msg = msg + "D"; break; - + case 8: msg = msg + "A"; break; } } - + self BotDoChat( 20, msg ); } @@ -1723,7 +1723,7 @@ bot_chat_stuck_watch( a, b, c, d, e, f, g ) bot_chat_tube_watch( state, tubeWp, tubeWeap, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": @@ -1733,9 +1733,9 @@ bot_chat_tube_watch( state, tubeWp, tubeWeap, d, e, f, g ) self BotDoChat( 10, "i am going to go tube" ); break; } - + break; - + case "start": switch ( randomint( 1 ) ) { @@ -1743,7 +1743,7 @@ bot_chat_tube_watch( state, tubeWp, tubeWeap, d, e, f, g ) self BotDoChat( 10, "i tubed" ); break; } - + break; } } @@ -1754,12 +1754,12 @@ bot_chat_tube_watch( state, tubeWp, tubeWeap, d, e, f, g ) bot_chat_killstreak_watch( state, streakName, c, directionYaw, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "call": location = c; - + switch ( streakName ) { case "helicopter_flares": @@ -1769,124 +1769,124 @@ bot_chat_killstreak_watch( state, streakName, c, directionYaw, e, f, g ) self BotDoChat( 100, "Nice! I got the paves!" ); break; } - + break; - + case "emp": switch ( randomint( 2 ) ) { case 0: self BotDoChat( 100, "Wow, wasn't expecting on getting an EMP." ); break; - + case 1: self BotDoChat( 100, "You don't see an EMP everyday!" ); break; } - + break; - + case "nuke": switch ( randomint( 8 ) ) { case 0: self BotDoChat( 100, "NUUUKE" ); break; - + case 1: self BotDoChat( 100, "lol sweet nuke" ); break; - + case 2: self BotDoChat( 100, "NUUUUUUKKKKKKEEEEEE!!!!" ); break; - + case 3: self BotDoChat( 100, "YEEEEEEEES!!" ); break; - + case 4: self BotDoChat( 100, "sweet I get a nuke and my team is noob" ); break; - + case 5: self BotDoChat( 100, "GET NUKED NERDS!!!!" ); break; - + case 6: self BotDoChat( 100, "NUKEM NOW!!!! NUKEEEEE!" ); break; - + case 7: self BotDoChat( 100, "Get nuked kids!" ); break; } - + break; - + case "ac130": switch ( randomint( 5 ) ) { case 0: self BotDoChat( 100, "^3Time to ^1klap ^3some kids!" ); break; - + case 1: self BotDoChat( 100, "Stingers are not welcome! AC130 rules all!" ); break; - + case 2: self BotDoChat( 100, "Bahahahahahaaa! Time to rule the map with AC130!" ); break; - + case 3: self BotDoChat( 100, "ac130 Madness!" ); break; - + case 4: self BotDoChat( 100, "Say hello to my little friend, ^6AC130!" ); break; } - + break; - + case "helicopter_minigun": switch ( randomint( 7 ) ) { case 0: self BotDoChat( 100, "Eat my Chopper Gunner!!" ); break; - + case 1: self BotDoChat( 100, "and here comes the ^1PAIN!" ); break; - + case 2: self BotDoChat( 100, "Awwwww Yeah! Time to create choas in 40 seconds flat." ); break; - + case 3: self BotDoChat( 100, "Woot! Got my chopper gunner!" ); break; - + case 4: self BotDoChat( 100, "Wewt got my choppa!" ); break; - + case 5: self BotDoChat( 100, "Time to spawn kill with the OP chopper!" ); break; - + case 6: self BotDoChat( 100, "GET TO DA CHOPPA!!" ); break; } - + break; } - + break; - + case "camp": campSpot = c; break; @@ -1899,12 +1899,12 @@ bot_chat_killstreak_watch( state, streakName, c, directionYaw, e, f, g ) bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) { self endon( "disconnect" ); - + if ( !isdefined( aircare ) ) { return; } - + switch ( state ) { case "go": @@ -1919,16 +1919,16 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) { self BotDoChat( 5, "going to " + aircare.owner.name + "'s carepackage" ); } - + break; - + case 1: self BotDoChat( 5, "going to this carepackage" ); break; } - + break; - + case "start": switch ( randomint( 2 ) ) { @@ -1941,16 +1941,16 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) { self BotDoChat( 15, "taking " + aircare.owner.name + "'s carepackage" ); } - + break; - + case 1: self BotDoChat( 15, "taking this carepackage" ); break; } - + break; - + case "stop": if ( !isdefined( aircare.owner ) || aircare.owner == self ) { @@ -1959,29 +1959,29 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) case 0: self BotDoChat( 10, "Pheww... Got my carepackage" ); break; - + case 1: self BotDoChat( 10, "lolnoobs i got my carepackage. what now!?" ); break; - + case 2: self BotDoChat( 10, "holy cow! that was a close one!" ); break; - + case 3: self BotDoChat( 10, "lol u sillys. i got my care package" ); break; - + case 4: self BotDoChat( 10, ":3 i got my package" ); break; - + case 5: if ( isdefined( aircare.cratetype ) ) { self BotDoChat( 10, ":3 i got my " + aircare.cratetype ); } - + break; } } @@ -1992,61 +1992,61 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) case 0: self BotDoChat( 10, "LOL! (10-101) I took " + aircare.owner.name + "'s carepackage." ); break; - + case 1: self BotDoChat( 10, "lolsweet just found a carepackage, just for me!" ); break; - + case 2: self BotDoChat( 10, "I heard " + aircare.owner.name + " owed me a carepackage. Thanks lol." ); break; - + case 3: self BotDoChat( 10, ">;3 i took your care package! xDD" ); break; - + case 4: if ( isdefined( aircare.cratetype ) ) { self BotDoChat( 10, "hahaah jajaja i took your " + aircare.cratetype ); } - + break; } } - + break; - + case "captured": switch ( randomint( 5 ) ) { case 0: self BotDoChat( 10, "sad... gf carepackage" ); break; - + case 1: self BotDoChat( 10, "WTF MAN! THAT WAS MINE." ); break; - + case 2: self BotDoChat( 10, "Wow wtf " + player.name + ", i worked hard for that carepackage..." ); break; - + case 3: self BotDoChat( 10, ">.< " + player.name + ", fine take my skill package." ); break; - + case 4: if ( isdefined( aircare.cratetype ) ) { self BotDoChat( 10, "Wow! there goes my " + aircare.cratetype + "!" ); } - + break; } - + break; - + case "unreachable": switch ( randomint( 1 ) ) { @@ -2054,7 +2054,7 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) self BotDoChat( 25, "i cant reach that carepackage!" ); break; } - + break; } } @@ -2065,7 +2065,7 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) bot_chat_attack_vehicle_watch( state, vehicle, rocketAmmo, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -2074,69 +2074,69 @@ bot_chat_attack_vehicle_watch( state, vehicle, rocketAmmo, d, e, f, g ) case 0: self BotDoChat( 10, "Not on my watch..." ); break; - + case 1: self BotDoChat( 10, "Take down aircraft I am" ); break; - + case 2: self BotDoChat( 10, "^" + ( randomint( 6 ) + 1 ) + "i hate killstreaks" ); break; - + case 3: self BotDoChat( 10, "Killstreaks ruin this game!!" ); break; - + case 4: self BotDoChat( 10, "killstreaks sux" ); break; - + case 5: self BotDoChat( 10, "keep the killstreaks comin'" ); break; - + case 6: self BotDoChat( 10, "lol see that killstreak? its going to go BOOM!" ); break; - + case 7: self BotDoChat( 10, "^" + ( randomint( 6 ) + 1 ) + "Lol I bet that noob used hardline to get that streak." ); break; - + case 8: self BotDoChat( 10, "WOW HOW DO YOU GET THAT?? ITS GONE NOW." ); break; - + case 9: self BotDoChat( 10, "HAHA say goodbye to your killstreak" ); break; - + case 10: self BotDoChat( 10, "All your effort is gone now." ); break; - + case 11: self BotDoChat( 10, "I hope there are flares on that killstreak." ); break; - + case 12: self BotDoChat( 10, "lol u silly, i'm taking down killstreaks :3 xDD" ); break; - + case 13: weap = rocketAmmo; - + if ( !isdefined( weap ) ) { weap = self getcurrentweapon(); } - + self BotDoChat( 10, "Im going to takedown your ks with my " + getbaseweaponname( weap ) ); break; } - + break; - + case "stop": break; } @@ -2148,12 +2148,12 @@ bot_chat_attack_vehicle_watch( state, vehicle, rocketAmmo, d, e, f, g ) bot_chat_follow_threat_watch( state, threat, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": break; - + case "stop": break; } @@ -2165,7 +2165,7 @@ bot_chat_follow_threat_watch( state, threat, c, d, e, f, g ) bot_chat_camp_watch( state, wp, time, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": @@ -2174,52 +2174,52 @@ bot_chat_camp_watch( state, wp, time, d, e, f, g ) case 0: self BotDoChat( 10, "going to camp for " + time + " seconds" ); break; - + case 1: self BotDoChat( 10, "time to go camp!" ); break; - + case 2: self BotDoChat( 10, "rofl im going to camp" ); break; } - + break; - + case "start": switch ( randomint( 3 ) ) { case 0: self BotDoChat( 10, "well im camping... this is fun!" ); break; - + case 1: self BotDoChat( 10, "lol im camping, hope i kill someone" ); break; - + case 2: self BotDoChat( 10, "im camping! i guess ill wait " + time + " before moving again" ); break; } - + break; - + case "stop": switch ( randomint( 3 ) ) { case 0: self BotDoChat( 10, "finished camping.." ); break; - + case 1: self BotDoChat( 10, "wow that was a load of camping!" ); break; - + case 2: self BotDoChat( 10, "well its been over " + time + " seconds, i guess ill stop camping" ); break; } - + break; } } @@ -2230,12 +2230,12 @@ bot_chat_camp_watch( state, wp, time, d, e, f, g ) bot_chat_follow_watch( state, player, time, d, e, f, g ) { self endon( "disconnect" ); - + if ( !isdefined( player ) ) { return; } - + switch ( state ) { case "start": @@ -2244,30 +2244,30 @@ bot_chat_follow_watch( state, player, time, d, e, f, g ) case 0: self BotDoChat( 10, "well im going to follow " + player.name + " for " + time + " seconds" ); break; - + case 1: self BotDoChat( 10, "Lets go together " + player.name + " <3 :)" ); break; - + case 2: self BotDoChat( 10, "lets be butt buddies " + player.name + " and ill follow you!" ); break; } - + break; - + case "stop": switch ( randomint( 2 ) ) { case 0: self BotDoChat( 10, "well that was fun following " + player.name + " for " + time + " seconds" ); break; - + case 1: self BotDoChat( 10, "im done following that guy" ); break; } - + break; } } @@ -2278,7 +2278,7 @@ bot_chat_follow_watch( state, player, time, d, e, f, g ) bot_chat_equ_watch( state, wp, weap, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": @@ -2288,9 +2288,9 @@ bot_chat_equ_watch( state, wp, weap, d, e, f, g ) self BotDoChat( 10, "going to place a " + getbaseweaponname( weap ) ); break; } - + break; - + case "start": switch ( randomint( 1 ) ) { @@ -2298,7 +2298,7 @@ bot_chat_equ_watch( state, wp, weap, d, e, f, g ) self BotDoChat( 10, "placed a " + getbaseweaponname( weap ) ); break; } - + break; } } @@ -2309,7 +2309,7 @@ bot_chat_equ_watch( state, wp, weap, d, e, f, g ) bot_chat_nade_watch( state, wp, weap, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": @@ -2319,9 +2319,9 @@ bot_chat_nade_watch( state, wp, weap, d, e, f, g ) self BotDoChat( 10, "going to throw a " + getbaseweaponname( weap ) ); break; } - + break; - + case "start": switch ( randomint( 1 ) ) { @@ -2329,7 +2329,7 @@ bot_chat_nade_watch( state, wp, weap, d, e, f, g ) self BotDoChat( 10, "threw a " + getbaseweaponname( weap ) ); break; } - + break; } } @@ -2340,12 +2340,12 @@ bot_chat_nade_watch( state, wp, weap, d, e, f, g ) bot_chat_jav_watch( state, wp, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": break; - + case "start": break; } @@ -2357,7 +2357,7 @@ bot_chat_jav_watch( state, wp, c, d, e, f, g ) bot_chat_throwback_watch( state, nade, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -2367,9 +2367,9 @@ bot_chat_throwback_watch( state, nade, c, d, e, f, g ) self BotDoChat( 10, "i am going to throw back the grenade!" ); break; } - + break; - + case "stop": switch ( randomint( 1 ) ) { @@ -2377,7 +2377,7 @@ bot_chat_throwback_watch( state, nade, c, d, e, f, g ) self BotDoChat( 10, "i threw back the grenade!" ); break; } - + break; } } @@ -2388,7 +2388,7 @@ bot_chat_throwback_watch( state, nade, c, d, e, f, g ) bot_chat_tbag_watch( state, who, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": @@ -2398,9 +2398,9 @@ bot_chat_tbag_watch( state, who, c, d, e, f, g ) self BotDoChat( 50, "Im going to go tBag XD" ); break; } - + break; - + case "start": switch ( randomint( 1 ) ) { @@ -2408,9 +2408,9 @@ bot_chat_tbag_watch( state, who, c, d, e, f, g ) self BotDoChat( 50, "Im going to tBag XD" ); break; } - + break; - + case "stop": switch ( randomint( 1 ) ) { @@ -2418,7 +2418,7 @@ bot_chat_tbag_watch( state, who, c, d, e, f, g ) self BotDoChat( 50, "Awwww yea... How do you like that? XD" ); break; } - + break; } } @@ -2429,7 +2429,7 @@ bot_chat_tbag_watch( state, who, c, d, e, f, g ) bot_chat_rage_watch( state, b, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -2438,24 +2438,24 @@ bot_chat_rage_watch( state, b, c, d, e, f, g ) case 0: self BotDoChat( 80, "K this is not going as I planned." ); break; - + case 1: self BotDoChat( 80, "Screw this! I'm out." ); break; - + case 2: self BotDoChat( 80, "Have fun being owned." ); break; - + case 3: self BotDoChat( 80, "MY TEAM IS GARBAGE!" ); break; - + case 4: self BotDoChat( 80, "kthxbai hackers" ); break; } - + break; } } @@ -2466,7 +2466,7 @@ bot_chat_rage_watch( state, b, c, d, e, f, g ) bot_chat_revenge_watch( state, loc, killer, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -2476,9 +2476,9 @@ bot_chat_revenge_watch( state, loc, killer, d, e, f, g ) self BotDoChat( 10, "Im going to check out my death location." ); break; } - + break; - + case "stop": switch ( randomint( 1 ) ) { @@ -2486,7 +2486,7 @@ bot_chat_revenge_watch( state, loc, killer, d, e, f, g ) self BotDoChat( 10, "i checked out my deathlocation..." ); break; } - + break; } } @@ -2497,7 +2497,7 @@ bot_chat_revenge_watch( state, loc, killer, d, e, f, g ) bot_chat_heard_target_watch( state, heard, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -2507,9 +2507,9 @@ bot_chat_heard_target_watch( state, heard, c, d, e, f, g ) self BotDoChat( 5, "I think I hear " + heard.name + "..." ); break; } - + break; - + case "stop": switch ( randomint( 1 ) ) { @@ -2517,7 +2517,7 @@ bot_chat_heard_target_watch( state, heard, c, d, e, f, g ) self BotDoChat( 5, "Well i checked out " + heard.name + "'s location..." ); break; } - + break; } } @@ -2528,12 +2528,12 @@ bot_chat_heard_target_watch( state, heard, c, d, e, f, g ) bot_chat_uav_target_watch( state, heard, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": break; - + case "stop": break; } @@ -2545,7 +2545,7 @@ bot_chat_uav_target_watch( state, heard, c, d, e, f, g ) bot_chat_turret_attack_watch( state, turret, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": @@ -2555,9 +2555,9 @@ bot_chat_turret_attack_watch( state, turret, c, d, e, f, g ) self BotDoChat( 5, "going to this sentry..." ); break; } - + break; - + case "start": switch ( randomint( 1 ) ) { @@ -2565,9 +2565,9 @@ bot_chat_turret_attack_watch( state, turret, c, d, e, f, g ) self BotDoChat( 5, "attacking this sentry..." ); break; } - + break; - + case "stop": break; } @@ -2579,7 +2579,7 @@ bot_chat_turret_attack_watch( state, turret, c, d, e, f, g ) bot_chat_attack_equ_watch( state, equ, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go_ti": @@ -2589,9 +2589,9 @@ bot_chat_attack_equ_watch( state, equ, c, d, e, f, g ) self BotDoChat( 10, "going to this ti..." ); break; } - + break; - + case "camp_ti": switch ( randomint( 1 ) ) { @@ -2599,9 +2599,9 @@ bot_chat_attack_equ_watch( state, equ, c, d, e, f, g ) self BotDoChat( 10, "lol im camping this ti!" ); break; } - + break; - + case "trigger_ti": switch ( randomint( 1 ) ) { @@ -2609,12 +2609,12 @@ bot_chat_attack_equ_watch( state, equ, c, d, e, f, g ) self BotDoChat( 10, "lol i destoryed this ti!" ); break; } - + break; - + case "start": break; - + case "stop": break; } @@ -2626,7 +2626,7 @@ bot_chat_attack_equ_watch( state, equ, c, d, e, f, g ) bot_chat_dom_watch( state, sub_state, flag, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "spawnkill": @@ -2634,38 +2634,38 @@ bot_chat_dom_watch( state, sub_state, flag, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; - + case "defend": switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "cap": switch ( state ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; } } @@ -2676,7 +2676,7 @@ bot_chat_dom_watch( state, sub_state, flag, d, e, f, g ) bot_chat_hq_watch( state, sub_state, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "cap": @@ -2684,26 +2684,26 @@ bot_chat_hq_watch( state, sub_state, c, d, e, f, g ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; - + case "defend": switch ( state ) { case "start": break; - + case "stop": break; } - + break; } } @@ -2714,7 +2714,7 @@ bot_chat_hq_watch( state, sub_state, c, d, e, f, g ) bot_chat_sab_watch( state, sub_state, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "bomb": @@ -2722,65 +2722,65 @@ bot_chat_sab_watch( state, sub_state, c, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; - + case "defuser": switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "planter": switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "plant": switch ( state ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; - + case "defuse": switch ( state ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; } } @@ -2791,7 +2791,7 @@ bot_chat_sab_watch( state, sub_state, c, d, e, f, g ) bot_chat_sd_watch( state, sub_state, obj, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "bomb": @@ -2799,69 +2799,69 @@ bot_chat_sd_watch( state, sub_state, obj, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; - + case "defuser": switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "planter": site = obj; - + switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "plant": site = obj; - + switch ( state ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; - + case "defuse": switch ( state ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; } } @@ -2872,47 +2872,47 @@ bot_chat_sd_watch( state, sub_state, obj, d, e, f, g ) bot_chat_cap_watch( state, sub_state, obj, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "their_flag": flag = obj; - + switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "my_flag": flag = obj; - + switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "cap": switch ( state ) { case "start": break; - + case "stop": break; } - + break; } } @@ -2923,69 +2923,69 @@ bot_chat_cap_watch( state, sub_state, obj, d, e, f, g ) bot_chat_dem_watch( state, sub_state, obj, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "defuser": site = obj; - + switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "planter": site = obj; - + switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "plant": site = obj; - + switch ( state ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; - + case "defuse": site = obj; - + switch ( state ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; } } @@ -2996,7 +2996,7 @@ bot_chat_dem_watch( state, sub_state, obj, d, e, f, g ) bot_chat_gtnw_watch( state, sub_state, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "cap": @@ -3004,14 +3004,14 @@ bot_chat_gtnw_watch( state, sub_state, c, d, e, f, g ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; } } @@ -3022,7 +3022,7 @@ bot_chat_gtnw_watch( state, sub_state, c, d, e, f, g ) bot_chat_oneflag_watch( state, sub_state, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "cap": @@ -3030,35 +3030,35 @@ bot_chat_oneflag_watch( state, sub_state, c, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; - + case "their_flag": switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "my_flag": switch ( state ) { case "start": break; - + case "stop": break; } - + break; } } @@ -3069,7 +3069,7 @@ bot_chat_oneflag_watch( state, sub_state, c, d, e, f, g ) bot_chat_arena_watch( state, sub_state, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "cap": @@ -3077,14 +3077,14 @@ bot_chat_arena_watch( state, sub_state, c, d, e, f, g ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; } } @@ -3095,7 +3095,7 @@ bot_chat_arena_watch( state, sub_state, c, d, e, f, g ) bot_chat_vip_watch( state, sub_state, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "cap": @@ -3103,11 +3103,11 @@ bot_chat_vip_watch( state, sub_state, c, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; } } @@ -3118,7 +3118,7 @@ bot_chat_vip_watch( state, sub_state, c, d, e, f, g ) bot_chat_conf_watch( state, sub_state, tag, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "cap": @@ -3126,11 +3126,11 @@ bot_chat_conf_watch( state, sub_state, tag, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; } } @@ -3141,7 +3141,7 @@ bot_chat_conf_watch( state, sub_state, tag, d, e, f, g ) bot_chat_grnd_watch( state, sub_state, target, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "kill": @@ -3149,35 +3149,35 @@ bot_chat_grnd_watch( state, sub_state, target, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; - + case "cap": switch ( state ) { case "start": break; - + case "stop": break; } - + break; - + case "go_cap": switch ( state ) { case "start": break; - + case "stop": break; } - + break; } } @@ -3188,7 +3188,7 @@ bot_chat_grnd_watch( state, sub_state, target, d, e, f, g ) bot_chat_tdef_watch( state, sub_state, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( sub_state ) { case "cap": @@ -3196,11 +3196,11 @@ bot_chat_tdef_watch( state, sub_state, c, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; } } @@ -3211,15 +3211,15 @@ bot_chat_tdef_watch( state, sub_state, c, d, e, f, g ) bot_chat_box_cap_watch( state, box, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "go": break; - + case "start": break; - + case "stop": break; } diff --git a/maps/mp/bots/_bot_internal.gsc b/maps/mp/bots/_bot_internal.gsc index 40287db..e611521 100644 --- a/maps/mp/bots/_bot_internal.gsc +++ b/maps/mp/bots/_bot_internal.gsc @@ -18,9 +18,9 @@ added() { self endon( "disconnect" ); - + self.pers[ "bots" ] = []; - + self.pers[ "bots" ][ "skill" ] = []; self.pers[ "bots" ][ "skill" ][ "base" ] = 7; // a base knownledge of the bot self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.05; // how long it takes for a bot to aim to a location @@ -42,7 +42,7 @@ added() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head"; // a list of comma seperated bones the bot will aim at self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; // a factor of how much ads to reduce when adsing self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; // a factor of how much more aimspeed delay to add - + self.pers[ "bots" ][ "behavior" ] = []; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 50; // percentage of how often the bot strafes a target self.pers[ "bots" ][ "behavior" ][ "nade" ] = 50; // percentage of how often the bot will grenade @@ -53,10 +53,10 @@ added() self.pers[ "bots" ][ "behavior" ][ "switch" ] = 1; // percentage of how often the bot will switch weapons self.pers[ "bots" ][ "behavior" ][ "class" ] = 1; // percentage of how often the bot will change classes self.pers[ "bots" ][ "behavior" ][ "jump" ] = 100; // percentage of how often the bot will jumpshot and dropshot - + self.pers[ "bots" ][ "behavior" ][ "quickscope" ] = false; // is a quickscoper self.pers[ "bots" ][ "behavior" ][ "initswitch" ] = 10; // percentage of how often the bot will switch weapons on spawn - + self.pers[ "bots" ][ "unlocks" ] = []; } @@ -67,11 +67,11 @@ added() connected() { self endon( "disconnect" ); - + self.bot = spawnstruct(); - + self resetBotVars(); - + self thread onPlayerSpawned(); } @@ -102,12 +102,12 @@ resetBotVars() self.bot.jav_loc = undefined; self.bot.after_target = undefined; self.bot.after_target_pos = undefined; - + self.bot.script_aimpos = undefined; - + self.bot.script_goal = undefined; self.bot.script_goal_dist = 0.0; - + self.bot.next_wp = -1; self.bot.second_next_wp = -1; self.bot.towards_goal = undefined; @@ -120,7 +120,7 @@ resetBotVars() self.bot.wantsprint = false; self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; - + self.bot.isfrozen = false; self.bot.sprintendtime = -1; self.bot.isreloading = false; @@ -132,20 +132,20 @@ resetBotVars() self.bot.isknifing = false; self.bot.isknifingafter = false; self.bot.knifing_target = undefined; - + self.bot.semi_time = false; self.bot.jump_time = undefined; self.bot.last_fire_time = -1; - + self.bot.is_cur_full_auto = false; self.bot.cur_weap_dist_multi = 1; self.bot.is_cur_sniper = false; self.bot.is_cur_akimbo = false; - + self.bot.prio_objective = false; - + self.bot.rand = randomint( 100 ); - + self BotBuiltinBotStop(); } @@ -155,20 +155,20 @@ resetBotVars() onPlayerSpawned() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); - + self resetBotVars(); self thread onWeaponChange(); self thread onLastStand(); - + self thread reload_watch(); self thread sprint_watch(); - + self thread watchUsingRemote(); - + self thread spawned(); } } @@ -182,18 +182,18 @@ SetWeaponDistMulti( weap ) { return 1; } - + switch ( weaponclass( weap ) ) { case "rifle": return 0.9; - + case "smg": return 0.7; - + case "pistol": return 0.5; - + default: return 1; } @@ -208,12 +208,12 @@ IsWeapSniper( weap ) { return false; } - + if ( weaponclass( weap ) != "sniper" ) { return false; } - + return true; } @@ -224,13 +224,13 @@ onWeaponChange() { self endon( "disconnect" ); self endon( "death" ); - + first = true; - + for ( ;; ) { newWeapon = undefined; - + if ( first ) { first = false; @@ -240,7 +240,7 @@ onWeaponChange() { self waittill( "weapon_change", newWeapon ); } - + self.bot.is_cur_full_auto = WeaponIsFullAuto( newWeapon ); self.bot.cur_weap_dist_multi = SetWeaponDistMulti( newWeapon ); self.bot.is_cur_sniper = IsWeapSniper( newWeapon ); @@ -255,25 +255,25 @@ reload_watch() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill( "reload_start" ); self.bot.isreloading = true; - + 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; } } @@ -285,7 +285,7 @@ sprint_watch() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill( "sprint_begin" ); @@ -303,16 +303,16 @@ onLastStand() { self endon( "disconnect" ); self endon( "death" ); - + while ( true ) { while ( !self inLastStand() ) { wait 0.05; } - + self notify( "kill_goal" ); - + while ( self inLastStand() ) { wait 0.05; @@ -327,54 +327,54 @@ watchUsingRemote() { self endon( "disconnect" ); self endon( "spawned_player" ); - + for ( ;; ) { wait 1; - + if ( !isalive( self ) ) { return; } - + if ( !self isusingremote() ) { continue; } - + if ( isdefined( level.chopper ) && isdefined( level.chopper.gunner ) && level.chopper.gunner == self ) { self watchUsingMinigun(); } - + if ( isdefined( level.ac130player ) && level.ac130player == self ) { self thread watchAc130Weapon(); self watchUsingAc130(); } - + if ( isdefined( level.remote_mortar ) && isdefined( level.remote_mortar.owner ) && level.remote_mortar.owner == self ) { self watchUsingMortar(); } - + if ( isdefined( self.using_remote_tank ) && self.using_remote_tank ) { self watchUsingTank(); - + self.remotetank = undefined; } - + if ( isdefined( self.remoteuav ) ) { self watchUsingUav(); } - + if ( isdefined( self.using_remote_turret ) && self.using_remote_turret ) { self watchUsingTurret(); } - + self.bot.targets = []; self notify( "kill_goal" ); } @@ -389,23 +389,23 @@ watchUsingTurret() { return; } - + turret = self.remoteturretlist[ 0 ]; - + turret endon( "death" ); - + while ( isdefined( self.using_remote_turret ) && self.using_remote_turret ) { if ( self getcurrentweapon() != "killstreak_remote_turret_remote_mp" ) { self switchtoweapon( "killstreak_remote_turret_remote_mp" ); } - + if ( isdefined( self.bot.target ) ) { self thread pressFire(); } - + wait 0.05; } } @@ -417,53 +417,53 @@ watchUsingTank() { tankKeys = getarraykeys( level.ugvs ); tank = undefined; - + for ( i = tankKeys.size - 1; i >= 0; i-- ) { tempTank = level.ugvs[ tankKeys[ i ] ]; - + if ( !isdefined( tempTank ) ) { continue; } - + if ( !isdefined( tempTank.owner ) ) { continue; } - + if ( tempTank.owner == self ) { tank = tempTank; break; } } - + tankKeys = undefined; - + if ( !isdefined( tank ) ) { return; } - + self.remotetank = tank; - + self thread useTankRocket( tank ); - + tank endon( "death" ); - + while ( isdefined( self.using_remote_tank ) && self.using_remote_tank ) { if ( self getcurrentweapon() != "killstreak_remote_tank_remote_mp" ) { self switchtoweapon( "killstreak_remote_tank_remote_mp" ); } - + if ( isdefined( self.bot.target ) ) { self thread pressFire(); } - + wait 0.05; } } @@ -476,11 +476,11 @@ useTankRocket( tank ) tank endon( "death" ); self endon( "disconnect" ); self endon( "spawned_player" ); - + while ( isdefined( self.using_remote_tank ) && self.using_remote_tank ) { wait 3.5; - + if ( isdefined( self.bot.target ) ) { self thread pressfrag(); @@ -494,19 +494,19 @@ useTankRocket( tank ) watchUsingUav() { self.remoteuav endon( "end_remote" ); - + while ( isdefined( self.remoteuav ) ) { if ( self getcurrentweapon() != "uav_remote_mp" ) { self switchtoweapon( "uav_remote_mp" ); } - + if ( isdefined( self.lockedtarget ) ) { self notify( "remoteUAV_tag" ); } - + wait 0.05; } } @@ -517,19 +517,19 @@ watchUsingUav() watchUsingMortar() { level.remote_mortar endon( "remote_done" ); - + while ( isdefined( level.remote_mortar ) && isdefined( level.remote_mortar.owner ) && level.remote_mortar.owner == self ) { if ( self getcurrentweapon() != "mortar_remote_mp" ) { self switchtoweapon( "mortar_remote_mp" ); } - + if ( isdefined( self.bot.target ) ) { self thread pressFire(); } - + wait 0.05; } } @@ -540,19 +540,19 @@ watchUsingMortar() watchUsingMinigun() { self endon( "heliPlayer_removed" ); - + while ( isdefined( level.chopper ) && isdefined( level.chopper.gunner ) && level.chopper.gunner == self ) { if ( self getcurrentweapon() != "heli_remote_mp" ) { self switchtoweapon( "heli_remote_mp" ); } - + if ( isdefined( self.bot.target ) ) { self thread pressFire(); } - + wait 0.05; } } @@ -565,21 +565,21 @@ watchAc130Weapon() self endon( "ac130player_removed" ); self endon( "disconnect" ); self endon( "spawned_player" ); - + while ( isdefined( level.ac130player ) && level.ac130player == self ) { 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; } } @@ -590,7 +590,7 @@ watchAc130Weapon() watchUsingAc130() { self endon( "ac130player_removed" ); - + while ( isdefined( level.ac130player ) && level.ac130player == self ) { self switchtoweapon( "ac130_105mm_mp" ); @@ -609,11 +609,11 @@ spawned() { self endon( "disconnect" ); self endon( "death" ); - + wait self.pers[ "bots" ][ "skill" ][ "spawn_time" ]; - + self thread doBotMovement(); - + self thread grenade_danager(); self thread target(); self thread updateBones(); @@ -625,7 +625,7 @@ spawned() self thread watchHoldBreath(); self thread watchGrenadeFire(); self thread watchPickupGun(); - + self notify( "bot_spawned" ); } @@ -636,23 +636,23 @@ watchPickupGun() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 1; - + if ( self usebuttonpressed() ) { continue; } - + weap = self getcurrentweapon(); - + if ( weap != "none" && self getammocount( weap ) ) { continue; } - + self thread use( 0.5 ); } } @@ -664,16 +664,16 @@ watchGrenadeFire() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill( "grenade_fire", nade, weapname ); - + if ( !isdefined( nade ) ) { continue; } - + if ( weapname == "c4_mp" ) { self thread watchC4Thrown( nade ); @@ -688,50 +688,50 @@ watchC4Thrown( c4 ) { self endon( "disconnect" ); c4 endon( "death" ); - + wait 0.5; - + for ( ;; ) { wait 1 + randomint( 50 ) * 0.05; - + shouldBreak = false; - + for ( i = 0; i < level.players.size; i++ ) { 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" ); @@ -759,32 +759,32 @@ doBotMovement_loop( data ) { self.bot.moveorigin = self.origin; } - + waittillframeend; move_To = self.bot.moveto; angles = self getplayerangles(); dir = ( 0, 0, 0 ); - + if ( distancesquared( self.bot.moveorigin, move_To ) >= 49 ) { cosa = cos( 0 - angles[ 1 ] ); sina = sin( 0 - angles[ 1 ] ); - + // get the direction dir = move_To - self.bot.moveorigin; - + // rotate our direction according to our angles dir = ( dir[ 0 ] * cosa - dir[ 1 ] * sina, - dir[ 0 ] * sina + dir[ 1 ] * cosa, - 0 ); - + dir[ 0 ] * sina + dir[ 1 ] * cosa, + 0 ); + // make the length 127 dir = vectornormalize( dir ) * 127; - + // invert the second component as the engine requires this dir = ( dir[ 0 ], 0 - dir[ 1 ], 0 ); } - + // climb through windows if ( self ismantling() ) { @@ -796,16 +796,16 @@ doBotMovement_loop( data ) data.wasmantling = false; self stand(); } - + startPos = self.origin + ( 0, 0, 50 ); startPosForward = startPos + anglestoforward( ( 0, angles[ 1 ], 0 ) ) * 25; bt = bullettrace( startPos, startPosForward, false, self ); - + if ( bt[ "fraction" ] >= 1 ) { // check if need to jump bt = bullettrace( startPosForward, startPosForward - ( 0, 0, 40 ), false, self ); - + if ( bt[ "fraction" ] < 1 && bt[ "normal" ][ 2 ] > 0.9 && data.i > 1.5 && !self isonladder() ) { data.i = 0; @@ -829,15 +829,15 @@ doBotMovement_loop( data ) 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 ] ) ); - + if ( isdefined( self.remoteuav ) ) { if ( abs( move_To[ 2 ] - self.bot.moveorigin[ 2 ] ) > 12 ) @@ -861,19 +861,19 @@ doBotMovement() { self endon( "disconnect" ); self endon( "spawned_player" ); - + data = spawnstruct(); data.wasmantling = false; - + for ( data.i = 0;; data.i += 0.05 ) { wait 0.05; - + if ( !isalive( self ) ) { return; } - + self doBotMovement_loop( data ); } } @@ -885,16 +885,16 @@ watchHoldBreath() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 1; - + if ( self.bot.isfrozen ) { continue; } - + self holdbreath( self playerads() > 0 ); } } @@ -905,31 +905,31 @@ watchHoldBreath() grenade_danager_loop() { myEye = self geteye(); - + for ( i = level.bots_fraglist.count - 1; i >= 0; i-- ) { 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(); break; @@ -943,36 +943,36 @@ grenade_danager() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { 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(); } } @@ -983,38 +983,38 @@ grenade_danager() 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" ) { self.bot.climbing = true; toStance = "stand"; } - + if ( toStance != "stand" && toStance != "crouch" && toStance != "prone" ) { toStance = "crouch"; } - + if ( toStance == "stand" ) { self stand(); @@ -1027,46 +1027,46 @@ stance_loop() { 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(); } @@ -1078,14 +1078,14 @@ setBotWantSprint() { self endon( "disconnect" ); self endon( "death" ); - + self notify( "setBotWantSprint" ); self endon( "setBotWantSprint" ); - + self.bot.wantsprint = true; - + self waittill_notify_or_timeout( "kill_goal", 10 ); - + self.bot.wantsprint = false; } @@ -1096,18 +1096,18 @@ stance() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill_either( "finished_static_waypoints", "new_static_waypoint" ); - + self.bot.climbing = false; - + if ( self.bot.isfrozen || self isusingremote() ) { continue; } - + self stance_loop(); } } @@ -1119,7 +1119,7 @@ check_reload() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill_notify_or_timeout( "weapon_fired", 5 ); @@ -1135,34 +1135,34 @@ reload_thread() self endon( "disconnect" ); self endon( "death" ); self endon( "weapon_fired" ); - + 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(); @@ -1176,24 +1176,24 @@ updateBones() { self endon( "disconnect" ); self endon( "spawned_player" ); - + bones = strtok( self.pers[ "bots" ][ "skill" ][ "bones" ], "," ); waittime = self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ]; - + for ( ;; ) { self waittill_any_timeout( waittime, "new_enemy" ); - + if ( !isalive( self ) ) { return; } - + if ( !isdefined( self.bot.target ) ) { continue; } - + self.bot.target.bone = random( bones ); } } @@ -1217,7 +1217,7 @@ createTargetObj( ent, theTime ) obj.bone = undefined; obj.aim_offset = undefined; obj.aim_offset_base = undefined; - + return obj; } @@ -1229,22 +1229,22 @@ updateAimOffset( obj, theTime ) if ( !isdefined( obj.aim_offset_base ) ) { 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 ) ); + 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; @@ -1253,7 +1253,7 @@ updateAimOffset( obj, theTime ) { offsetScalar = 1 - objCreatedFor / aimDiffTime; } - + obj.aim_offset = obj.aim_offset_base * offsetScalar; } @@ -1265,13 +1265,13 @@ targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj, usingRemote ) distClose = self.pers[ "bots" ][ "skill" ][ "dist_start" ]; distClose *= self.bot.cur_weap_dist_multi; distClose *= distClose; - + distMax = self.pers[ "bots" ][ "skill" ][ "dist_max" ]; distMax *= self.bot.cur_weap_dist_multi; distMax *= distMax; - + timeMulti = 1; - + if ( !usingRemote && !isScriptObj ) { if ( daDist > distMax ) @@ -1283,13 +1283,13 @@ targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj, usingRemote ) timeMulti = 1 - ( ( daDist - distClose ) / ( distMax - distClose ) ); } } - + obj.no_trace_time = 0; obj.trace_time += int( 50 * timeMulti ); obj.dist = daDist; obj.last_seen_pos = ent.origin; obj.trace_time_time = theTime; - + self updateAimOffset( obj, theTime ); } @@ -1309,12 +1309,12 @@ targetObjUpdateNoTrace( obj ) target_loop() { myEye = self geteye(); - + if ( isdefined( self.remoteuav ) ) { myEye = self.remoteuav gettagorigin( "tag_origin" ); } - + theTime = gettime(); myAngles = self getplayerangles(); myFov = self.pers[ "bots" ][ "skill" ][ "fov" ]; @@ -1328,67 +1328,67 @@ target_loop() vehEnt = undefined; adsAmount = self playerads(); adsFovFact = self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ]; - + 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 if ( adsAmount > 0 ) { myFov *= 1 - adsFovFact * adsAmount; } - + if ( hasTarget && !isdefined( self.bot.target.entity ) ) { self.bot.target = undefined; hasTarget = false; } - + playercount = level.players.size; - + for ( i = -1; i < playercount; i++ ) { obj = undefined; - + if ( i == -1 ) { if ( !isdefined( self.bot.script_target ) ) { continue; } - + ent = self.bot.script_target; key = ent getentitynumber() + ""; daDist = distancesquared( self.origin, ent.origin ); obj = self.bot.targets[ key ]; isObjDef = isdefined( obj ); 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 ) ) { if ( !isObjDef ) { obj = self createTargetObj( ent, theTime ); obj.offset = self.bot.script_target_offset; - + self.bot.targets[ key ] = obj; } - + self targetObjUpdateTraced( obj, daDist, ent, theTime, true, usingRemote ); } else @@ -1397,9 +1397,9 @@ target_loop() { continue; } - + self targetObjUpdateNoTrace( obj ); - + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[ key ] = undefined; @@ -1410,88 +1410,88 @@ target_loop() else { player = level.players[ i ]; - + if ( player == self ) { continue; } - + key = player getentitynumber() + ""; obj = self.bot.targets[ key ]; - + 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; } - + canTargetPlayer = false; - + if ( usingRemote ) { canTargetPlayer = ( bullettracepassed( myEye, player gettagorigin( "j_head" ), false, vehEnt ) - && !player _hasperk( "specialty_blindeye" ) ); + && !player _hasperk( "specialty_blindeye" ) ); } else { targetHead = player gettagorigin( "j_head" ); targetAnkleLeft = player gettagorigin( "j_ankle_le" ); targetAnkleRight = player gettagorigin( "j_ankle_ri" ); - + traceHead = bullettrace( myEye, targetHead, false, undefined ); traceAnkleLeft = bullettrace( myEye, targetAnkleLeft, false, undefined ); traceAnkleRight = bullettrace( myEye, targetAnkleRight, false, undefined ); - + canTargetPlayer = ( ( sighttracepassed( myEye, targetHead, false, undefined ) || - sighttracepassed( myEye, targetAnkleLeft, false, undefined ) || - sighttracepassed( myEye, targetAnkleRight, false, undefined ) ) - - && ( ( traceHead[ "fraction" ] >= 1.0 || traceHead[ "surfacetype" ] == "glass" ) || - ( traceAnkleLeft[ "fraction" ] >= 1.0 || traceAnkleLeft[ "surfacetype" ] == "glass" ) || - ( traceAnkleRight[ "fraction" ] >= 1.0 || traceAnkleRight[ "surfacetype" ] == "glass" ) ) - - && ( ignoreSmoke || - SmokeTrace( myEye, player.origin, level.smokeradius ) || - daDist < level.bots_maxknifedistance * 4 ) - - && ( getConeDot( player.origin, self.origin, myAngles ) >= myFov || - ( isObjDef && obj.trace_time ) ) ); + sighttracepassed( myEye, targetAnkleLeft, false, undefined ) || + sighttracepassed( myEye, targetAnkleRight, false, undefined ) ) + + && ( ( traceHead[ "fraction" ] >= 1.0 || traceHead[ "surfacetype" ] == "glass" ) || + ( traceAnkleLeft[ "fraction" ] >= 1.0 || traceAnkleLeft[ "surfacetype" ] == "glass" ) || + ( traceAnkleRight[ "fraction" ] >= 1.0 || traceAnkleRight[ "surfacetype" ] == "glass" ) ) + + && ( ignoreSmoke || + SmokeTrace( myEye, player.origin, level.smokeradius ) || + daDist < level.bots_maxknifedistance * 4 ) + + && ( getConeDot( player.origin, self.origin, myAngles ) >= myFov || + ( isObjDef && obj.trace_time ) ) ); } - + if ( isdefined( self.bot.target_this_frame ) && self.bot.target_this_frame == player ) { self.bot.target_this_frame = undefined; - + canTargetPlayer = true; } - + if ( isdefined( self.remoteuav ) && isdefined( player.uavremotemarkedby ) ) { canTargetPlayer = false; } - + if ( canTargetPlayer ) { if ( !isObjDef ) { obj = self createTargetObj( player, theTime ); - + self.bot.targets[ key ] = obj; } - + self targetObjUpdateTraced( obj, daDist, player, theTime, false, usingRemote ); } else @@ -1500,9 +1500,9 @@ target_loop() { continue; } - + self targetObjUpdateNoTrace( obj ); - + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[ key ] = undefined; @@ -1510,67 +1510,67 @@ target_loop() } } } - + if ( !isdefined( obj ) ) { continue; } - + if ( theTime - obj.time < initReactTime ) { continue; } - + timeDiff = theTime - obj.trace_time_time; - + if ( timeDiff < bestTime ) { bestTargets = []; bestTime = timeDiff; } - + if ( timeDiff == bestTime ) { bestTargets[ key ] = obj; } } - + if ( hasTarget && isdefined( bestTargets[ self.bot.target.entity getentitynumber() + "" ] ) ) { return; } - + closest = 2147483647; toBeTarget = undefined; - + bestKeys = getarraykeys( bestTargets ); - + for ( i = bestKeys.size - 1; i >= 0; i-- ) { theDist = bestTargets[ bestKeys[ i ] ].dist; - + if ( theDist > closest ) { continue; } - + closest = theDist; toBeTarget = bestTargets[ bestKeys[ i ] ]; } - + beforeTargetID = -1; 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 ) { self.bot.target = toBeTarget; @@ -1585,21 +1585,21 @@ target() { self endon( "disconnect" ); self endon( "spawned_player" ); - + for ( ;; ) { wait 0.05; - + if ( !isalive( self ) ) { return; } - + if ( self maps\mp\_flashgrenades::isflashbanged() ) { continue; } - + self target_loop(); } } @@ -1611,26 +1611,26 @@ onNewEnemy() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { 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(); } } @@ -1643,78 +1643,78 @@ watchToLook() self endon( "disconnect" ); self endon( "death" ); self endon( "new_enemy" ); - + 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(); } @@ -1724,7 +1724,7 @@ watchToLook() { continue; } - + self.bot.jump_time = gettime(); self prone(); self notify( "kill_goal" ); @@ -1741,15 +1741,15 @@ start_bot_after_target( who ) { self endon( "disconnect" ); self endon( "spawned_player" ); - + self.bot.after_target = who; self.bot.after_target_pos = who.origin; - + self notify( "kill_after_target" ); self endon( "kill_after_target" ); - + wait self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ]; - + self.bot.after_target = undefined; } @@ -1768,52 +1768,52 @@ clear_bot_after_target() aim_loop() { aimspeed = self.pers[ "bots" ][ "skill" ][ "aim_time" ]; - + if ( self isStunned() || self isArtShocked() ) { aimspeed = 1; } - + usingRemote = self isusingremote(); curweap = self getcurrentweapon(); - + eyePos = self geteye(); - + if ( isdefined( self.remoteuav ) ) { eyePos = self.remoteuav gettagorigin( "tag_origin" ); } - + angles = self getplayerangles(); adsAmount = self playerads(); adsAimSpeedFact = self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ]; - + // reduce aimspeed if ads'ing if ( adsAmount > 0 ) { aimspeed *= 1 + adsAimSpeedFact * adsAmount; } - + if ( isdefined( self.bot.jav_loc ) && !usingRemote ) { aimpos = self.bot.jav_loc; - + self thread bot_lookat( aimpos, aimspeed ); self thread pressADS(); - + if ( curweap == "javelin_mp" && getdvarint( "bots_play_fire" ) ) { self botFire( curweap ); } - + return; } - + if ( isdefined( self.bot.target ) && isdefined( self.bot.target.entity ) && !( self.bot.prio_objective && isdefined( self.bot.script_aimpos ) ) ) { no_trace_look_time = self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ]; no_trace_time = self.bot.target.no_trace_time; - + if ( no_trace_time <= no_trace_look_time ) { trace_time = self.bot.target.trace_time; @@ -1821,34 +1821,34 @@ aim_loop() target = self.bot.target.entity; conedot = 0; isplay = isplayer( self.bot.target.entity ); - + 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; no_trace_ads_time = self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ]; reaction_time = self.pers[ "bots" ][ "skill" ][ "reaction_time" ]; nadeAimOffset = 0; - + bone = self.bot.target.bone; - + if ( !isdefined( bone ) ) { bone = "j_spineupper"; } - + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) { nadeAimOffset = dist / 3000; @@ -1864,7 +1864,7 @@ aim_loop() nadeAimOffset = dist / 3000; } } - + if ( no_trace_time && ( !isdefined( self.bot.after_target ) || self.bot.after_target != target ) ) { if ( no_trace_time > no_trace_ads_time && !usingRemote ) @@ -1875,16 +1875,16 @@ aim_loop() if ( !self.bot.isfraggingafter && !self.bot.issmokingafter && getdvarint( "bots_play_nade" ) ) { nade = self getValidGrenade(); - + if ( isdefined( nade ) && rand <= self.pers[ "bots" ][ "behavior" ][ "nade" ] && bullettracepassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bullettracepassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_mingrenadedistance && dist < level.bots_maxgrenadedistance ) { time = 0.5; - + if ( nade == "frag_grenade_mp" ) { time = 2; } - + if ( isSecondaryGrenade( nade ) ) { self thread smoke( time ); @@ -1893,7 +1893,7 @@ aim_loop() { self thread frag( time ); } - + self notify( "kill_goal" ); } } @@ -1909,7 +1909,7 @@ aim_loop() } } } - + if ( !usingRemote ) { self thread bot_lookat( last_pos + ( 0, 0, self getplayerviewheight() + nadeAimOffset ), aimspeed ); @@ -1918,10 +1918,10 @@ aim_loop() { self thread bot_lookat( last_pos, aimspeed ); } - + return; } - + if ( trace_time ) { if ( isplay ) @@ -1930,9 +1930,9 @@ aim_loop() aimpos += offset; aimpos += aimoffset; aimpos += ( 0, 0, nadeAimOffset ); - + conedot = getConeDot( aimpos, eyePos, angles ); - + if ( isdefined( self.bot.knifing_target ) ) { self thread bot_lookat( target gettagorigin( "j_spine4" ), 0.05 ); @@ -1952,9 +1952,9 @@ aim_loop() aimpos += offset; aimpos += aimoffset; aimpos += ( 0, 0, nadeAimOffset ); - + conedot = getConeDot( aimpos, eyePos, angles ); - + if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) { self thread bot_lookat( aimpos, 0.05 ); @@ -1964,27 +1964,27 @@ aim_loop() self thread bot_lookat( aimpos, aimspeed ); } } - + knifeDist = level.bots_maxknifedistance; - + if ( ( isplay || target.classname == "misc_turret" ) && !self.bot.isknifingafter && conedot > 0.9 && dist < knifeDist && trace_time > reaction_time && !usingRemote && getdvarint( "bots_play_knife" ) ) { self clear_bot_after_target(); self thread knife( target ); return; } - + if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) { return; } - + canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); - + if ( canADS ) { stopAdsOverride = false; - + 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 ) @@ -1996,42 +1996,42 @@ aim_loop() 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; } } } - + if ( isdefined( self.bot.after_target ) ) { nadeAimOffset = 0; last_pos = self.bot.after_target_pos; dist = distancesquared( self.origin, last_pos ); - + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) { nadeAimOffset = dist / 3000; @@ -2047,29 +2047,29 @@ aim_loop() 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 ); - + if ( canADS ) { stopAdsOverride = false; - + 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 ) @@ -2081,25 +2081,25 @@ aim_loop() 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; } - + if ( self.bot.next_wp != -1 && isdefined( level.waypoints[ self.bot.next_wp ].angles ) && false ) { forwardPos = anglestoforward( level.waypoints[ self.bot.next_wp ].angles ) * 1024; - + self thread bot_lookat( eyePos + forwardPos, aimspeed ); } else if ( isdefined( self.bot.script_aimpos ) ) @@ -2109,7 +2109,7 @@ aim_loop() else if ( !usingRemote || isdefined( self.remoteuav ) || isdefined( self.remotetank ) ) { lookat = undefined; - + if ( self.bot.second_next_wp != -1 && !self.bot.issprinting && !self.bot.climbing ) { lookat = level.waypoints[ self.bot.second_next_wp ].origin; @@ -2118,7 +2118,7 @@ aim_loop() { lookat = self.bot.towards_goal; } - + if ( isdefined( lookat ) ) { self thread bot_lookat( lookat + ( 0, 0, self getplayerviewheight() ), aimspeed ); @@ -2133,21 +2133,21 @@ aim() { self endon( "disconnect" ); self endon( "spawned_player" ); // for remote killstreaks. - + for ( ;; ) { 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(); } } @@ -2158,31 +2158,31 @@ aim() botFire( curweap ) { self.bot.last_fire_time = gettime(); - + if ( self.bot.is_cur_full_auto ) { self thread pressFire(); - + 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(); } - + self thread doSemiTime(); } @@ -2195,7 +2195,7 @@ doSemiTime() self endon( "disconnect" ); self notify( "bot_semi_time" ); self endon( "bot_semi_time" ); - + self.bot.semi_time = true; wait self.pers[ "bots" ][ "skill" ][ "semi_time" ]; self.bot.semi_time = false; @@ -2210,17 +2210,17 @@ canFire( curweap ) { return false; } - + if ( curweap == "riotshield_mp" ) { return false; } - + if ( self isusingremote() || curweap == "c4death_mp" ) { return true; } - + return self getweaponammoclip( curweap ); } @@ -2233,51 +2233,51 @@ canAds( dist, curweap ) { 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; } @@ -2290,24 +2290,24 @@ isInRange( dist, curweap ) { 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; } @@ -2318,7 +2318,7 @@ checkTheBots() for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( issubstr( tolower( player.name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) ) { maps\mp\bots\waypoints\_custom_map::doTheCheck_(); @@ -2332,9 +2332,9 @@ killWalkCauseNoWaypoints() self endon( "disconnect" ); self endon( "spawned_player" ); self endon( "kill_goal" ); - + wait 2; - + self notify( "kill_goal" ); } @@ -2344,34 +2344,34 @@ killWalkCauseNoWaypoints() walk_loop() { hasTarget = ( ( isdefined( self.bot.target ) && isdefined( self.bot.target.entity ) && !self.bot.prio_objective ) || isdefined( self.bot.jav_loc ) ); - + if ( hasTarget ) { curweap = self getcurrentweapon(); - + if ( isdefined( self.bot.jav_loc ) || entIsVehicle( self.bot.target.entity ) || self.bot.isfraggingafter || self.bot.issmokingafter ) { return; } - + 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; } } - + dist = 16; - + if ( level.waypointcount ) { goal = level.waypoints[ randomint( level.waypointcount ) ].origin; @@ -2383,15 +2383,15 @@ walk_loop() forward = anglestoforward( self getplayerangles() ) * stepDist; forward = ( forward[ 0 ], forward[ 1 ], 0 ); myOrg = self.bot.moveorigin + ( 0, 0, 32 ); - + goal = playerphysicstrace( myOrg, myOrg + forward, false, self ); goal = physicstrace( goal + ( 0, 0, 50 ), goal + ( 0, 0, -40 ), false, self ); - + // too small, lets bounce off the wall if ( distancesquared( goal, myOrg ) < stepDist * stepDist - 1 || randomint( 100 ) < 5 ) { trace = bullettrace( myOrg, myOrg + forward, false, self ); - + if ( trace[ "surfacetype" ] == "none" || randomint( 100 ) < 25 ) { // didnt hit anything, just choose a random direction then @@ -2405,22 +2405,22 @@ walk_loop() // r = d - 2 (d . n) n d = vectornormalize( trace[ "position" ] - myOrg ); n = trace[ "normal" ]; - + r = d - 2 * ( vectordot( d, n ) ) * n; - + goal = playerphysicstrace( myOrg, myOrg + ( r[ 0 ], r[ 1 ], 0 ) * stepDist, false, self ); goal = physicstrace( goal + ( 0, 0, 50 ), goal + ( 0, 0, -40 ), false, self ); } } } - + isScriptGoal = false; - + if ( isdefined( self.bot.script_goal ) && !hasTarget ) { goal = self.bot.script_goal; dist = self.bot.script_goal_dist; - + isScriptGoal = true; } else @@ -2429,10 +2429,10 @@ walk_loop() { goal = self.bot.target.last_seen_pos; } - + self notify( "new_goal_internal" ); } - + self doWalk( goal, dist, isScriptGoal ); self.bot.towards_goal = undefined; self.bot.next_wp = -1; @@ -2446,28 +2446,28 @@ walk() { self endon( "disconnect" ); self endon( "spawned_player" ); - + for ( ;; ) { 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() ) { self.bot.last_next_wp = -1; @@ -2475,7 +2475,7 @@ walk() self botSetMoveTo( self.bot.moveorigin + self getvelocity() * 500 ); continue; } - + self walk_loop(); } } @@ -2487,25 +2487,25 @@ strafe( target ) { self endon( "kill_goal" ); self thread killWalkOnEvents(); - + angles = vectortoangles( vectornormalize( target.origin - self.bot.moveorigin ) ); anglesLeft = ( 0, angles[ 1 ] + 90, 0 ); anglesRight = ( 0, angles[ 1 ] - 90, 0 ); - + myOrg = self.bot.moveorigin + ( 0, 0, 16 ); left = myOrg + anglestoforward( anglesLeft ) * 500; right = myOrg + anglestoforward( anglesRight ) * 500; - + traceLeft = bullettrace( myOrg, left, false, self ); traceRight = bullettrace( myOrg, right, false, self ); - + strafe = traceLeft[ "position" ]; - + if ( traceRight[ "fraction" ] > traceLeft[ "fraction" ] ) { strafe = traceRight[ "position" ]; } - + self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; self botSetMoveTo( strafe ); @@ -2521,12 +2521,12 @@ watchOnGoal( goal, dis ) self endon( "disconnect" ); self endon( "spawned_player" ); self endon( "kill_goal" ); - + while ( distancesquared( self.bot.moveorigin, goal ) > dis ) { wait 0.05; } - + self notify( "goal_internal" ); } @@ -2536,7 +2536,7 @@ watchOnGoal( goal, dis ) 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 ); @@ -2549,19 +2549,19 @@ cleanUpAStar( team ) 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; } @@ -2571,14 +2571,14 @@ initAStar( goal ) removeAStar() { remove = self.bot.astar.size - 1; - + if ( level.teambased ) { RemoveWaypointUsage( self.bot.astar[ remove ], self.team ); } - + self.bot.astar[ remove ] = undefined; - + return self.bot.astar.size - 1; } @@ -2590,11 +2590,11 @@ killWalkOnEvents() self endon( "kill_goal" ); self endon( "disconnect" ); self endon( "spawned_player" ); - + self waittill_any( "flash_rumble_loop", "new_enemy", "new_goal_internal", "goal_internal", "bad_path_internal" ); - + waittillframeend; - + self notify( "kill_goal" ); } @@ -2606,7 +2606,7 @@ doWalkScriptNotify() self endon( "disconnect" ); self endon( "spawned_player" ); self endon( "kill_goal" ); - + if ( self waittill_either_return( "goal_internal", "bad_path_internal" ) == "goal_internal" ) { self notify( "goal" ); @@ -2625,25 +2625,25 @@ doWalk( goal, dist, isScriptGoal ) level endon ( "game_ended" ); self endon( "kill_goal" ); self endon( "goal_internal" ); // so that the watchOnGoal notify can happen same frame, not a frame later - + dist *= dist; - + if ( isScriptGoal ) { self thread doWalkScriptNotify(); } - + self thread killWalkOnEvents(); self thread watchOnGoal( goal, dist ); - + current = self initAStar( goal ); - + // 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 ) { // check if a waypoint is closer than the goal @@ -2653,38 +2653,38 @@ doWalk( goal, dist, isScriptGoal ) { self.bot.next_wp = self.bot.astar[ current ]; self.bot.second_next_wp = -1; - + if ( current > 0 ) { self.bot.second_next_wp = self.bot.astar[ current - 1 ]; } - + self notify( "new_static_waypoint" ); - + self movetowards( level.waypoints[ self.bot.next_wp ].origin ); self.bot.last_next_wp = self.bot.next_wp; self.bot.last_second_next_wp = self.bot.second_next_wp; - + current = self removeAStar(); } } } - + self.bot.next_wp = -1; self.bot.second_next_wp = -1; self notify( "finished_static_waypoints" ); - + if ( distancesquared( self.bot.moveorigin, goal ) > dist ) { self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; self movetowards( goal ); // any better way?? } - + self notify( "finished_goal" ); - + wait 1; - + if ( distancesquared( self.bot.moveorigin, goal ) > dist ) { self notify( "bad_path_internal" ); @@ -2700,14 +2700,14 @@ movetowards( goal ) { return; } - + self.bot.towards_goal = goal; - + lastOri = self.bot.moveorigin; stucks = 0; timeslow = 0; time = 0; - + if ( self.bot.issprinting ) { tempGoalDist = level.bots_goaldistance * 2; @@ -2716,34 +2716,34 @@ movetowards( goal ) { tempGoalDist = level.bots_goaldistance; } - + while ( distancesquared( self.bot.moveorigin, goal ) > tempGoalDist ) { self botSetMoveTo( goal ); - + if ( time > 3000 ) { time = 0; - + if ( distancesquared( self.bot.moveorigin, lastOri ) < 32 * 32 ) { self thread knife(); wait 0.5; - + stucks++; - + randomDir = self getRandomLargestStafe( stucks ); - + self BotNotifyBotEvent( "stuck" ); - + self botSetMoveTo( randomDir ); wait stucks; self stand(); - + self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; } - + lastOri = self.bot.moveorigin; } else if ( timeslow > 0 && ( timeslow % 1000 ) == 0 ) @@ -2768,10 +2768,10 @@ movetowards( goal ) } } } - + wait 0.05; time += 50; - + if ( lengthsquared( self getvelocity() ) < 1000 ) { timeslow += 50; @@ -2780,7 +2780,7 @@ movetowards( goal ) { timeslow = 0; } - + if ( self.bot.issprinting ) { tempGoalDist = level.bots_goaldistance * 2; @@ -2789,13 +2789,13 @@ movetowards( goal ) { tempGoalDist = level.bots_goaldistance; } - + if ( stucks >= 2 ) { self notify( "bad_path_internal" ); } } - + self.bot.towards_goal = undefined; self notify( "completed_move_to" ); } @@ -2808,11 +2808,11 @@ doMantle() self endon( "disconnect" ); self endon( "death" ); self endon( "kill_goal" ); - + self jump(); - + wait 0.35; - + self jump(); } @@ -2824,7 +2824,7 @@ getRandomLargestStafe( dist ) // find a better algo? traces = NewHeap( ::HeapTraceFraction ); myOrg = self.bot.moveorigin + ( 0, 0, 16 ); - + traces HeapInsert( bullettrace( myOrg, myOrg + ( -100 * dist, 0, 0 ), false, self ) ); traces HeapInsert( bullettrace( myOrg, myOrg + ( 100 * dist, 0, 0 ), false, self ) ); traces HeapInsert( bullettrace( myOrg, myOrg + ( 0, 100 * dist, 0 ), false, self ) ); @@ -2833,19 +2833,19 @@ getRandomLargestStafe( dist ) traces HeapInsert( bullettrace( myOrg, myOrg + ( -100 * dist, 100 * dist, 0 ), false, self ) ); traces HeapInsert( bullettrace( myOrg, myOrg + ( 100 * dist, -100 * dist, 0 ), false, self ) ); traces HeapInsert( bullettrace( myOrg, myOrg + ( 100 * dist, 100 * dist, 0 ), false, self ) ); - + toptraces = []; - + top = traces.data[ 0 ]; toptraces[ toptraces.size ] = top; traces HeapRemove(); - + while ( traces.data.size && top[ "fraction" ] - traces.data[ 0 ][ "fraction" ] < 0.1 ) { toptraces[ toptraces.size ] = traces.data[ 0 ]; traces HeapRemove(); } - + return toptraces[ randomint( toptraces.size ) ][ "position" ]; } @@ -2873,7 +2873,7 @@ sprint() self endon( "disconnect" ); self notify( "bot_sprint" ); self endon( "bot_sprint" ); - + self BotBuiltinBotAction( "+sprint" ); wait 0.05; self BotBuiltinBotAction( "-sprint" ); @@ -2888,7 +2888,7 @@ gostand() self endon( "disconnect" ); self notify( "bot_gostand" ); self endon( "bot_gostand" ); - + self BotBuiltinBotAction( "+gostand" ); wait 0.05; self BotBuiltinBotAction( "-gostand" ); @@ -2903,7 +2903,7 @@ pressfrag() self endon( "disconnect" ); self notify( "bot_frag" ); self endon( "bot_frag" ); - + self BotBuiltinBotAction( "+frag" ); wait 0.05; self BotBuiltinBotAction( "-frag" ); @@ -2917,36 +2917,36 @@ do_knife_target( target ) self endon( "death" ); self endon( "disconnect" ); self endon( "bot_knife" ); - + if ( !self isonground() || self getstance() == "prone" || self inLastStand() ) { self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); return; } - + if ( !isdefined( target ) || !isplayer( target ) ) { self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); return; } - + dist = distance( target.origin, self.origin ); - + if ( dist > 128.0 ) // iw5 hardcodes this ._. { self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); return; } - + self.bot.knifing_target = target; - + self BotBuiltinBotMeleeParams( target getentitynumber(), dist ); - + wait 1; - + self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); } @@ -2960,20 +2960,20 @@ knife( target ) self endon( "disconnect" ); self notify( "bot_knife" ); self endon( "bot_knife" ); - + self thread do_knife_target( target ); - + self.bot.isknifing = true; self.bot.isknifingafter = true; - + self BotBuiltinBotAction( "+melee" ); wait 0.05; self BotBuiltinBotAction( "-melee" ); - + self.bot.isknifing = false; - + wait 1; - + self.bot.isknifingafter = false; } @@ -2986,7 +2986,7 @@ reload() self endon( "disconnect" ); self notify( "bot_reload" ); self endon( "bot_reload" ); - + self BotBuiltinBotAction( "+reload" ); wait 0.05; self BotBuiltinBotAction( "-reload" ); @@ -3001,24 +3001,24 @@ frag( time ) self endon( "disconnect" ); self notify( "bot_frag" ); 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; - + wait 1.25; self.bot.isfraggingafter = false; } @@ -3032,24 +3032,24 @@ smoke( time ) self endon( "disconnect" ); self notify( "bot_smoke" ); 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; - + wait 1.25; self.bot.issmokingafter = false; } @@ -3060,7 +3060,7 @@ smoke( time ) fire( what ) { self notify( "bot_fire" ); - + if ( what ) { self BotBuiltinBotAction( "+fire" ); @@ -3080,19 +3080,19 @@ pressFire( time ) self endon( "disconnect" ); self notify( "bot_fire" ); self endon( "bot_fire" ); - + if ( !isdefined( time ) ) { time = 0.05; } - + self BotBuiltinBotAction( "+fire" ); - + if ( time ) { wait time; } - + self BotBuiltinBotAction( "-fire" ); } @@ -3102,7 +3102,7 @@ pressFire( time ) ads( what ) { self notify( "bot_ads" ); - + if ( what ) { self BotBuiltinBotAction( "+ads" ); @@ -3122,19 +3122,19 @@ pressADS( time ) self endon( "disconnect" ); self notify( "bot_ads" ); self endon( "bot_ads" ); - + if ( !isdefined( time ) ) { time = 0.05; } - + self BotBuiltinBotAction( "+ads" ); - + if ( time ) { wait time; } - + self BotBuiltinBotAction( "-ads" ); } @@ -3147,19 +3147,19 @@ use( time ) self endon( "disconnect" ); self notify( "bot_use" ); self endon( "bot_use" ); - + if ( !isdefined( time ) ) { time = 0.05; } - + self BotBuiltinBotAction( "+activate" ); - + if ( time ) { wait time; } - + self BotBuiltinBotAction( "-activate" ); } @@ -3172,18 +3172,18 @@ jump() self endon( "disconnect" ); self notify( "bot_jump" ); self endon( "bot_jump" ); - + if ( self isusingremote() ) { return; } - + if ( self getstance() != "stand" ) { self stand(); wait 1; } - + self BotBuiltinBotAction( "+gostand" ); wait 0.05; self BotBuiltinBotAction( "-gostand" ); @@ -3198,7 +3198,7 @@ stand() { return; } - + self BotBuiltinBotAction( "-gocrouch" ); self BotBuiltinBotAction( "-goprone" ); } @@ -3212,7 +3212,7 @@ crouch() { return; } - + self BotBuiltinBotAction( "+gocrouch" ); self BotBuiltinBotAction( "-goprone" ); } @@ -3226,7 +3226,7 @@ prone() { return; } - + self BotBuiltinBotAction( "-gocrouch" ); self BotBuiltinBotAction( "+goprone" ); } @@ -3245,15 +3245,15 @@ botSetMoveTo( where ) botGetThirdPersonOffset( angles ) { offset = ( 0, 0, 0 ); - + if ( getdvarint( "camera_thirdPerson" ) ) { offset = getdvarvector( "camera_thirdPersonOffset" ); - + if ( self playerads() >= 1 ) { curweap = self getcurrentweapon(); - + if ( ( issubstr( curweap, "_thermal" ) || weaponclass( curweap ) == "sniper" ) && !issubstr( curweap, "_acog" ) ) { offset = ( 0, 0, 0 ); @@ -3263,17 +3263,17 @@ botGetThirdPersonOffset( angles ) offset = getdvarvector( "camera_thirdPersonOffsetAds" ); } } - + // rotate about x // y cos xangle - z sin xangle // y sin xangle + z cos xangle offset = ( offset[ 0 ], offset[ 1 ] * cos( angles[ 2 ] ) - offset[ 2 ] * sin( angles[ 2 ] ), offset[ 1 ] * sin( angles[ 2 ] ) + offset[ 2 ] * cos( angles[ 2 ] ) ); - + // rotate about y offset = ( offset[ 0 ] * cos( angles[ 0 ] ) + offset[ 2 ] * sin( angles[ 0 ] ), offset[ 1 ], ( 0 - offset[ 0 ] ) * sin( angles[ 0 ] ) + offset[ 2 ] * cos( angles[ 0 ] ) ); - + // rotate about z offset = ( offset[ 0 ] * cos( angles[ 1 ] ) - offset[ 1 ] * sin( angles[ 1 ] ), offset[ 0 ] * sin( angles[ 1 ] ) + offset[ 1 ] * cos( angles[ 1 ] ), offset[ 2 ] ); } - + return offset; } @@ -3288,65 +3288,65 @@ bot_lookat( pos, time, vel, doAimPredict ) self endon( "death" ); self endon( "spawned_player" ); 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 - + if ( doAimPredict ) { myEye += ( self getvelocity() * 0.05 ) * ( steps - 1 ); // account for our velocity - + pos += ( vel * 0.05 ) * ( steps - 1 ); // add the velocity vector } - + angles = vectortoangles( ( pos - myEye ) - anglestoforward( myAngle ) ); - + X = angleclamp180( angles[ 0 ] - myAngle[ 0 ] ); X = X / steps; - + Y = angleclamp180( angles[ 1 ] - myAngle[ 1 ] ); Y = Y / steps; - + for ( i = 0; i < steps; i++ ) { myAngle = ( angleclamp180( myAngle[ 0 ] + X ), angleclamp180( myAngle[ 1 ] + Y ), 0 ); diff --git a/maps/mp/bots/_bot_script.gsc b/maps/mp/bots/_bot_script.gsc index 437b1ea..7a0424b 100644 --- a/maps/mp/bots/_bot_script.gsc +++ b/maps/mp/bots/_bot_script.gsc @@ -17,15 +17,15 @@ added() { self endon( "disconnect" ); - + self setplayerdata( "experience", self bot_get_rank() ); self setplayerdata( "prestige", self bot_get_prestige() ); - + self setplayerdata( "cardTitle", random( getCardTitles() ) ); self setplayerdata( "cardIcon", random( getCardIcons() ) ); - + self setClasses(); - + self set_diff(); } @@ -35,23 +35,23 @@ added() connected() { self endon( "disconnect" ); - + self.killerlocation = undefined; self.lastkiller = undefined; self.bot_change_class = true; - + self thread difficulty(); self thread teamWatch(); self thread classWatch(); - + self thread onBotSpawned(); self thread onSpawned(); - + self thread onDeath(); self thread onGiveLoadout(); - + self thread onKillcam(); - + wait 4; self.challengedata = []; // iw5 is bad lmao } @@ -63,23 +63,23 @@ bot_get_prestige() { p_dvar = getdvarint( "bots_loadout_prestige" ); p = 0; - + if ( p_dvar == -1 ) { for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( !isdefined( player.team ) ) { continue; } - + if ( player is_bot() ) { continue; } - + p = player getplayerdata( "prestige" ); break; } @@ -92,7 +92,7 @@ bot_get_prestige() { p = p_dvar; } - + return p; } @@ -103,27 +103,27 @@ bot_get_rank() { rank = 1; rank_dvar = getdvarint( "bots_loadout_rank" ); - + if ( rank_dvar == -1 ) { ranks = []; bot_ranks = []; human_ranks = []; - + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[ i ]; - + if ( player == self ) { continue; } - + if ( !isdefined( player.pers[ "rank" ] ) ) { continue; } - + if ( player is_bot() ) { bot_ranks[ bot_ranks.size ] = player.pers[ "rank" ]; @@ -133,26 +133,26 @@ bot_get_rank() human_ranks[ human_ranks.size ] = player.pers[ "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 ); - + while ( bot_ranks.size + human_ranks.size < 5 ) { // add some random ranks for better random number distribution rank = human_avg + randomintrange( -10, 10 ); human_ranks[ human_ranks.size ] = rank; } - + ranks = array_combine( human_ranks, bot_ranks ); - + avg = array_average( ranks ); s = array_std_deviation( ranks, avg ); - + rank = Round( random_normal_distribution( avg, s, 0, level.maxrank ) ); } else if ( rank_dvar == 0 ) @@ -163,7 +163,7 @@ bot_get_rank() { rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxrank ) ); } - + return maps\mp\gametypes\_rank::getrankinfominxp( rank ); } @@ -173,24 +173,24 @@ bot_get_rank() getCardTitles() { cards = []; - + for ( i = 0; i < 600; i++ ) { card_name = tablelookupbyrow( "mp/cardTitleTable.csv", i, 0 ); - + if ( card_name == "" ) { continue; } - + if ( !issubstr( card_name, "cardtitle_" ) ) { continue; } - + cards[ cards.size ] = i; } - + return cards; } @@ -200,24 +200,24 @@ getCardTitles() getCardIcons() { cards = []; - + for ( i = 0; i < 400; i++ ) { card_name = tablelookupbyrow( "mp/cardIconTable.csv", i, 0 ); - + if ( card_name == "" ) { continue; } - + if ( !issubstr( card_name, "cardicon_" ) ) { continue; } - + cards[ cards.size ] = i; } - + return cards; } @@ -227,12 +227,12 @@ getCardIcons() isValidAttachmentCombo( att1, att2 ) { colIndex = tablelookuprownum( "mp/attachmentCombos.csv", 0, att1 ); - + if ( tablelookup( "mp/attachmentCombos.csv", 0, att2, colIndex ) == "no" ) { return false; } - + return true; } @@ -242,22 +242,22 @@ isValidAttachmentCombo( att1, att2 ) getAttachmentsForGun( gun ) { row = tablelookuprownum( "mp/statStable.csv", 4, gun ); - + attachments = []; - + for ( h = 0; h < 10; h++ ) { attachmentName = tablelookupbyrow( "mp/statStable.csv", row, h + 11 ); - + if ( attachmentName == "" ) { attachments[ attachments.size ] = "none"; break; } - + attachments[ attachments.size ] = attachmentName; } - + return attachments; } @@ -267,26 +267,26 @@ getAttachmentsForGun( gun ) getPrimaries() { primaries = []; - + for ( i = 0; i < 160; i++ ) { 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; } - + return primaries; } @@ -296,26 +296,26 @@ getPrimaries() getSecondaries() { secondaries = []; - + for ( i = 0; i < 160; i++ ) { 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; } - + return secondaries; } @@ -325,19 +325,19 @@ getSecondaries() getCamos() { camos = []; - + for ( i = 0; i < 15; i++ ) { camo_name = tablelookupbyrow( "mp/camoTable.csv", i, 1 ); - + if ( camo_name == "" ) { continue; } - + camos[ camos.size ] = camo_name; } - + return camos; } @@ -347,19 +347,19 @@ getCamos() getReticles() { reticles = []; - + for ( i = 0; i < 10; i++ ) { reticle_name = tablelookupbyrow( "mp/reticletable.csv", i, 1 ); - + if ( reticle_name == "" ) { continue; } - + reticles[ reticles.size ] = reticle_name; } - + return reticles; } @@ -369,26 +369,26 @@ getReticles() getPerks( perktype ) { perks = []; - + for ( i = 0; i < 100; i++ ) { 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; } - + return perks; } @@ -406,34 +406,34 @@ getKillsNeededForStreak( streak ) getKillstreaks() { killstreaks = []; - + for ( i = 0; i < 65; i++ ) { 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; } - + return killstreaks; } @@ -443,7 +443,7 @@ getKillstreaks() getWeaponProfs( weapClass ) { answer = []; - + if ( weapClass == "weapon_assault" ) { answer[ answer.size ] = "specialty_bling"; @@ -494,7 +494,7 @@ getWeaponProfs( weapClass ) answer[ answer.size ] = "specialty_fastermelee"; answer[ answer.size ] = "specialty_lightweight"; } - + return answer; } @@ -515,53 +515,53 @@ chooseRandomPerk( perkkind ) rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ); allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); - + while ( true ) { perk = random( perks ); - + 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 ) { } - + 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; } } @@ -572,11 +572,11 @@ chooseRandomPerk( perkkind ) chooseRandomCamo() { camos = getCamos(); - + while ( true ) { camo = random( camos ); - + return camo; } } @@ -587,11 +587,11 @@ chooseRandomCamo() chooseRandomReticle() { reticles = getReticles(); - + while ( true ) { reticle = random( reticles ); - + return reticle; } } @@ -605,11 +605,11 @@ chooseRandomPrimary() allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ); - + while ( true ) { primary = random( primaries ); - + if ( !allowOp ) { if ( primary == "riotshield" ) @@ -617,7 +617,7 @@ chooseRandomPrimary() continue; } } - + if ( reasonable ) { if ( primary == "riotshield" ) @@ -625,17 +625,17 @@ chooseRandomPrimary() continue; } } - + if ( !self isitemunlocked( primary ) ) { continue; } - + if ( rank < getUnlockLevel( primary ) ) { continue; } - + return primary; } } @@ -649,11 +649,11 @@ chooseRandomSecondary() allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ); - + while ( true ) { secondary = random( secondaries ); - + if ( !allowOp ) { if ( secondary == "iw5_smaw" || secondary == "rpg" || secondary == "m320" || secondary == "xm25" ) @@ -661,21 +661,21 @@ chooseRandomSecondary() continue; } } - + if ( reasonable ) { } - + if ( !self isitemunlocked( secondary ) ) { continue; } - + if ( rank < getUnlockLevel( secondary ) ) { continue; } - + return secondary; } } @@ -689,18 +689,18 @@ chooseRandomBuff( weap ) rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ); allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); - + buffs[ buffs.size ] = "specialty_null"; - + if ( randomfloatrange( 0, 1 ) >= ( ( rank / level.maxrank ) + 0.1 ) ) { return "specialty_null"; } - + while ( true ) { buff = random( buffs ); - + return buff; } } @@ -714,26 +714,26 @@ chooseRandomAttachmentComboForGun( gun ) rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ); allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); - + if ( randomfloatrange( 0, 1 ) >= ( ( rank / level.maxrank ) + 0.1 ) ) { retAtts = []; retAtts[ 0 ] = "none"; retAtts[ 1 ] = "none"; - + return retAtts; } - + while ( true ) { att1 = random( atts ); att2 = random( atts ); - + if ( !isValidAttachmentCombo( att1, att2 ) ) { continue; } - + if ( !allowOp ) { if ( att1 == "gl" || att2 == "gl" || att1 == "gp25" || att2 == "gp25" || att1 == "m320" || att2 == "m320" ) @@ -741,15 +741,15 @@ chooseRandomAttachmentComboForGun( gun ) continue; } } - + if ( reasonable ) { } - + retAtts = []; retAtts[ 0 ] = att1; retAtts[ 1 ] = att2; - + return retAtts; } } @@ -763,39 +763,39 @@ chooseRandomTactical() allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ); - + while ( true ) { perk = random( perks ); - + if ( !allowOp ) { } - + if ( reasonable ) { } - + 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; } } @@ -809,44 +809,44 @@ chooseRandomGrenade() allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ); reasonable = getdvarint( "bots_loadout_reasonable" ); - + while ( true ) { perk = random( perks ); - + if ( !allowOp ) { } - + if ( reasonable ) { } - + 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; } } @@ -862,47 +862,47 @@ chooseRandomKillstreaks( type, perks ) allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); chooseStreaks = []; - + 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; @@ -945,20 +945,20 @@ chooseRandomKillstreaks( type, perks ) } } } - + break; } - + if ( issubstr( streak, "specialty_" ) ) { continue; } - + if ( isColidingKillstreak( answers, streak ) ) { continue; } - + if ( type == "streaktype_support" ) { if ( !maps\mp\killstreaks\_killstreaks::issupportkillstreak( streak ) ) @@ -974,17 +974,17 @@ chooseRandomKillstreaks( type, perks ) } } } - + answers[ answers.size ] = streak; chooseStreaks[ streak ] = true; availUnlocks--; - + if ( answers.size > 2 ) { break; } } - + return answers; } @@ -994,36 +994,36 @@ chooseRandomKillstreaks( type, perks ) isColidingKillstreak( killstreaks, killstreak ) { ksVal = getKillsNeededForStreak( killstreak ); - + for ( i = 0; i < killstreaks.size; i++ ) { ks = killstreaks[ i ]; - + if ( ks == "" ) { continue; } - + if ( ks == "none" ) { continue; } - + ksV = getKillsNeededForStreak( ks ); - + if ( ksV <= 0 ) { continue; } - + if ( ksV != ksVal ) { continue; } - + return true; } - + return false; } @@ -1033,27 +1033,27 @@ isColidingKillstreak( killstreaks, killstreak ) setClasses() { n = 5; - + if ( !self is_bot() ) { n = 15; } - + rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ); - + if ( randomfloatrange( 0, 1 ) < ( ( rank / level.maxrank ) + 0.1 ) ) { self.pers[ "bots" ][ "unlocks" ][ "ghillie" ] = true; self.pers[ "bots" ][ "behavior" ][ "quickscope" ] = true; } - + whereToSave = "customClasses"; - + if ( getdvarint( "xblive_privatematch" ) ) { whereToSave = "privateMatchCustomClasses"; } - + for ( i = 0; i < n; i++ ) { primary = chooseRandomPrimary(); @@ -1061,26 +1061,26 @@ setClasses() primaryAtts = chooseRandomAttachmentComboForGun( primary ); primaryReticle = chooseRandomReticle(); primaryCamo = chooseRandomCamo(); - + perk2 = chooseRandomPerk( "perk2" ); - + secondary = chooseRandomSecondary(); - + if ( perk2 == "specialty_twoprimaries" ) { secondary = chooseRandomPrimary(); - + while ( secondary == primary ) { secondary = chooseRandomPrimary(); } } - + secondaryBuff = chooseRandomBuff( secondary ); secondaryAtts = chooseRandomAttachmentComboForGun( secondary ); secondaryReticle = chooseRandomReticle(); secondaryCamo = chooseRandomCamo(); - + if ( perk2 != "specialty_twoprimaries" ) { secondaryReticle = "none"; @@ -1092,61 +1092,61 @@ setClasses() secondaryAtts[ 0 ] = "none"; secondaryAtts[ 1 ] = "none"; } - + perk1 = chooseRandomPerk( "perk1" ); perk3 = chooseRandomPerk( "perk3" ); deathstreak = chooseRandomPerk( "perk4" ); equipment = chooseRandomGrenade(); tactical = chooseRandomTactical(); - + perks = []; perks[ perk1 ] = true; perks[ perk2 ] = true; perks[ perk3 ] = true; - + ksType = chooseRandomPerk( "perk5" ); killstreaks = chooseRandomKillstreaks( ksType, perks ); - + self setplayerdata( whereToSave, i, "weaponSetups", 0, "weapon", primary ); self setplayerdata( whereToSave, i, "weaponSetups", 0, "attachment", 0, primaryAtts[ 0 ] ); self setplayerdata( whereToSave, i, "weaponSetups", 0, "attachment", 1, primaryAtts[ 1 ] ); self setplayerdata( whereToSave, i, "weaponSetups", 0, "camo", primaryCamo ); self setplayerdata( whereToSave, i, "weaponSetups", 0, "reticle", primaryReticle ); self setplayerdata( whereToSave, i, "weaponSetups", 0, "buff", primaryBuff ); - + self setplayerdata( whereToSave, i, "weaponSetups", 1, "weapon", secondary ); self setplayerdata( whereToSave, i, "weaponSetups", 1, "attachment", 0, secondaryAtts[ 0 ] ); self setplayerdata( whereToSave, i, "weaponSetups", 1, "attachment", 1, secondaryAtts[ 1 ] ); self setplayerdata( whereToSave, i, "weaponSetups", 1, "camo", secondaryCamo ); self setplayerdata( whereToSave, i, "weaponSetups", 1, "reticle", secondaryReticle ); self setplayerdata( whereToSave, i, "weaponSetups", 1, "buff", secondaryBuff ); - + self setplayerdata( whereToSave, i, "perks", 0, equipment ); self setplayerdata( whereToSave, i, "perks", 1, perk1 ); self setplayerdata( whereToSave, i, "perks", 2, perk2 ); self setplayerdata( whereToSave, i, "perks", 3, perk3 ); self setplayerdata( whereToSave, i, "deathstreak", deathstreak ); self setplayerdata( whereToSave, i, "perks", 6, tactical ); - + self setplayerdata( whereToSave, i, "perks", 5, ksType ); - + playerData = undefined; - + switch ( ksType ) { case "streaktype_support": playerData = "defenseStreaks"; break; - + case "streaktype_specialist": playerData = "specialistStreaks"; break; - + default: playerData = "assaultStreaks"; break; } - + self setplayerdata( whereToSave, i, playerData, 0, killstreaks[ 0 ] ); self setplayerdata( whereToSave, i, playerData, 1, killstreaks[ 1 ] ); self setplayerdata( whereToSave, i, playerData, 2, killstreaks[ 2 ] ); @@ -1160,47 +1160,47 @@ onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, { self.killerlocation = undefined; 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; } @@ -1214,52 +1214,52 @@ onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoin { 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 ); } @@ -1272,57 +1272,57 @@ bot_cry_for_help( attacker ) { return; } - + theTime = gettime(); - + if ( isdefined( self.help_time ) && theTime - self.help_time < 1000 ) { return; } - + self.help_time = theTime; - + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[ i ]; - + if ( !player is_bot() ) { continue; } - + if ( !isdefined( player.team ) ) { continue; } - + if ( !isalive( player ) ) { continue; } - + if ( player == self ) { continue; } - + if ( player.team != self.team ) { continue; } - + dist = player.pers[ "bots" ][ "skill" ][ "help_dist" ]; dist *= dist; - + if ( distancesquared( self.origin, player.origin ) > dist ) { continue; } - + if ( randomint( 100 ) < 50 ) { self setAttacker( attacker ); - + if ( randomint( 100 ) > 70 ) { break; @@ -1338,11 +1338,11 @@ onKillcam() { level endon( "game_ended" ); self endon( "disconnect" ); - + for ( ;; ) { self waittill( "begin_killcam" ); - + self thread doKillcamStuff(); } } @@ -1354,15 +1354,15 @@ doKillcamStuff() { self endon( "disconnect" ); self endon( "killcam_ended" ); - + self BotNotifyBotEvent( "killcam", "start" ); - + wait 0.5 + randomint( 3 ); - + wait 0.1; - + self notify( "abort_killcam" ); - + self BotNotifyBotEvent( "killcam", "stop" ); } @@ -1372,23 +1372,23 @@ doKillcamStuff() classWatch() { self endon( "disconnect" ); - + 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; @@ -1405,7 +1405,7 @@ anyMatchRuleDefaultClass( team ) { return false; } - + for ( i = 0; i < 5; i++ ) { if ( getmatchrulesdata( "defaultClasses", team, i, "class", "inUse" ) ) @@ -1413,7 +1413,7 @@ anyMatchRuleDefaultClass( team ) return true; } } - + return false; } @@ -1426,11 +1426,11 @@ chooseRandomClass( ) { return ""; } - + reasonable = getdvarint( "bots_loadout_reasonable" ); class = ""; rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ) + 1; - + if ( rank < 4 || ( randomint( 100 ) < 2 && !reasonable ) || ( isusingmatchrulesdata() && !level.matchrules_allowcustomclasses ) ) { while ( class == "" ) @@ -1446,9 +1446,9 @@ chooseRandomClass( ) { class = "class0"; } - + break; - + case 1: if ( isusingmatchrulesdata() && getmatchrulesdata( "defaultClasses", self.team, 1, "class", "inUse" ) ) { @@ -1458,9 +1458,9 @@ chooseRandomClass( ) { class = "class1"; } - + break; - + case 2: if ( isusingmatchrulesdata() && getmatchrulesdata( "defaultClasses", self.team, 2, "class", "inUse" ) ) { @@ -1470,9 +1470,9 @@ chooseRandomClass( ) { class = "class2"; } - + break; - + case 3: if ( isusingmatchrulesdata() && getmatchrulesdata( "defaultClasses", self.team, 3, "class", "inUse" ) ) { @@ -1482,9 +1482,9 @@ chooseRandomClass( ) { class = "class3"; } - + break; - + case 4: if ( isusingmatchrulesdata() && getmatchrulesdata( "defaultClasses", self.team, 4, "class", "inUse" ) ) { @@ -1494,7 +1494,7 @@ chooseRandomClass( ) { class = "class4"; } - + break; } } @@ -1503,7 +1503,7 @@ chooseRandomClass( ) { class = "custom" + ( randomint( 5 ) + 1 ); } - + return class; } @@ -1513,21 +1513,21 @@ chooseRandomClass( ) teamWatch() { self endon( "disconnect" ); - + 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; @@ -1541,7 +1541,7 @@ teamWatch() difficulty() { self endon( "disconnect" ); - + for ( ;; ) { if ( getdvarint( "bots_skill" ) != 9 ) @@ -1568,7 +1568,7 @@ difficulty() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_ankle_le,j_ankle_ri"; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 0; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 10; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 30; @@ -1579,7 +1579,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "class" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 0; break; - + case 2: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.55; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 1000; @@ -1600,7 +1600,7 @@ difficulty() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_ankle_le,j_ankle_ri,j_head"; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 10; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 15; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 45; @@ -1611,7 +1611,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "class" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 10; break; - + case 3: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.4; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 750; @@ -1632,7 +1632,7 @@ difficulty() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_spineupper,j_ankle_le,j_ankle_ri,j_head"; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 20; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 20; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 50; @@ -1643,7 +1643,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "class" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 25; break; - + case 4: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.3; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 600; @@ -1664,7 +1664,7 @@ difficulty() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_spineupper,j_ankle_le,j_ankle_ri,j_head,j_head"; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 30; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 25; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 55; @@ -1675,7 +1675,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "class" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 35; break; - + case 5: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.25; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 500; @@ -1696,7 +1696,7 @@ difficulty() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_head"; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 40; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 35; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 60; @@ -1707,7 +1707,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "class" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 50; break; - + case 6: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.2; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 250; @@ -1728,7 +1728,7 @@ difficulty() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spineupper,j_head,j_head"; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 50; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 45; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 65; @@ -1739,7 +1739,7 @@ difficulty() self.pers[ "bots" ][ "behavior" ][ "class" ] = 2; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 75; break; - + case 7: self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.1; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 100; @@ -1760,7 +1760,7 @@ difficulty() self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head"; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 65; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 65; self.pers[ "bots" ][ "behavior" ][ "sprint" ] = 70; @@ -1773,7 +1773,7 @@ difficulty() break; } } - + wait 5; } } @@ -1784,16 +1784,16 @@ difficulty() set_diff() { rankVar = getdvarint( "bots_skill" ); - + switch ( rankVar ) { case 0: self.pers[ "bots" ][ "skill" ][ "base" ] = Round( random_normal_distribution( 3.5, 1.75, 1, 7 ) ); break; - + case 8: break; - + case 9: self.pers[ "bots" ][ "skill" ][ "base" ] = randomintrange( 1, 7 ); self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.05 * randomintrange( 1, 20 ); @@ -1803,11 +1803,11 @@ set_diff() self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "fov" ] = randomfloatrange( -1, 1 ); - + randomNum = randomintrange( 500, 25000 ); self.pers[ "bots" ][ "skill" ][ "dist_start" ] = randomNum; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = randomNum * 2; - + self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.05 * randomint( 20 ); self.pers[ "bots" ][ "skill" ][ "help_dist" ] = randomintrange( 500, 25000 ); self.pers[ "bots" ][ "skill" ][ "semi_time" ] = randomfloatrange( 0.05, 1 ); @@ -1816,7 +1816,7 @@ set_diff() self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head,j_spineupper,j_ankle_le,j_ankle_ri"; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "nade" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "sprint" ] = randomint( 100 ); @@ -1827,7 +1827,7 @@ set_diff() self.pers[ "bots" ][ "behavior" ][ "class" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "jump" ] = randomint( 100 ); break; - + default: self.pers[ "bots" ][ "skill" ][ "base" ] = rankVar; break; @@ -1841,11 +1841,11 @@ set_diff() onDeath() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "death" ); - + self.wantsafespawn = true; self ClearScriptGoal(); } @@ -1857,36 +1857,36 @@ onDeath() onGiveLoadout() { self endon( "disconnect" ); - + for ( ;; ) { 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 ); } } @@ -1897,21 +1897,21 @@ onGiveLoadout() onSpawned() { self endon( "disconnect" ); - + for ( ;; ) { 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; self.bot_was_follow_script_update = undefined; self.bot_stuck_on_carepackage = undefined; - + if ( getdvarint( "bots_play_obj" ) ) { self thread bot_dom_cap_think(); @@ -1926,11 +1926,11 @@ onBotSpawned() { self endon( "disconnect" ); level endon( "game_ended" ); - + for ( ;; ) { self waittill( "bot_spawned" ); - + self thread start_bot_threads(); } } @@ -1943,9 +1943,9 @@ start_bot_threads() self endon( "disconnect" ); level endon( "game_ended" ); self endon( "death" ); - + gameflagwait( "prematch_done" ); - + // inventory usage if ( getdvarint( "bots_play_killstreak" ) ) { @@ -1953,10 +1953,10 @@ start_bot_threads() self thread bot_box_think(); self thread bot_watch_use_remote_turret(); } - + self thread bot_weapon_think(); self thread doReloadCancel(); - + // script targeting if ( getdvarint( "bots_play_target_other" ) ) { @@ -1964,27 +1964,27 @@ start_bot_threads() self thread bot_equipment_kill_think(); self thread bot_turret_think(); } - + // airdrop if ( getdvarint( "bots_play_take_carepackages" ) ) { self thread bot_watch_stuck_on_crate(); self thread bot_crate_think(); } - + // awareness self thread bot_revenge_think(); self thread bot_uav_think(); self thread bot_listen_to_steps(); self thread follow_target(); - + // camp and follow if ( getdvarint( "bots_play_camp" ) ) { self thread bot_think_follow(); self thread bot_think_camp(); } - + // nades if ( getdvarint( "bots_play_nade" ) ) { @@ -1995,35 +1995,35 @@ start_bot_threads() self thread bot_watch_riot_weapons(); self thread bot_watch_think_mw2(); // bots play mw2 } - + // obj if ( getdvarint( "bots_play_obj" ) ) { self thread bot_dom_def_think(); self thread bot_dom_spawn_kill_think(); - + self thread bot_hq(); - + self thread bot_cap(); - + self thread bot_sab(); - + self thread bot_sd_defenders(); self thread bot_sd_attackers(); - + self thread bot_dem_attackers(); self thread bot_dem_defenders(); self thread bot_dem_overtime(); - + self thread bot_gtnw(); self thread bot_oneflag(); self thread bot_arena(); self thread bot_vip(); - + self thread bot_conf(); self thread bot_grnd(); self thread bot_tdef(); - + self thread bot_infect(); } } @@ -2036,21 +2036,21 @@ bot_inc_bots( obj, unreach ) { level endon( "game_ended" ); 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--; @@ -2067,17 +2067,17 @@ bots_watch_touch_obj( obj ) self endon ( "bad_path" ); self endon ( "goal" ); self endon ( "new_goal" ); - + for ( ;; ) { wait 0.5; - + if ( !isdefined( obj ) ) { self notify( "bad_path" ); return; } - + if ( self istouching( obj ) ) { self notify( "goal" ); @@ -2096,22 +2096,22 @@ bot_escort_obj( obj, carrier ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 0.5; - + if ( !isdefined( obj ) ) { break; } - + if ( !isdefined( obj.carrier ) || carrier == obj.carrier ) { break; } } - + self notify( "goal" ); } @@ -2125,22 +2125,22 @@ bot_get_obj( obj ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 0.5; - + if ( !isdefined( obj ) ) { break; } - + if ( isdefined( obj.carrier ) ) { break; } } - + self notify( "goal" ); } @@ -2155,17 +2155,17 @@ bot_defend_site( site ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 0.5; - + if ( !site isInUse() ) { break; } } - + self notify( "bad_path" ); } @@ -2180,22 +2180,22 @@ bot_go_plant( plant ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 1; - + if ( level.bombplanted ) { break; } - + if ( self istouching( plant.trigger ) ) { break; } } - + if ( level.bombplanted ) { self notify( "bad_path" ); @@ -2217,22 +2217,22 @@ bot_go_defuse( plant ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 1; - + if ( !level.bombplanted ) { break; } - + if ( self istouching( plant.trigger ) ) { break; } } - + if ( !level.bombplanted ) { self notify( "bad_path" ); @@ -2252,7 +2252,7 @@ fire_current_weapon() self endon( "disconnect" ); self endon( "weapon_change" ); self endon( "stop_firing_weapon" ); - + for ( ;; ) { self thread BotPressAttack( 0.05 ); @@ -2268,21 +2268,21 @@ changeToWeapon( weap ) self endon( "disconnect" ); self endon( "death" ); 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" ); - + return ( self getcurrentweapon() == weap ); } @@ -2294,12 +2294,12 @@ botThrowGrenade( nade, time ) self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + if ( !self getammocount( nade ) ) { return false; } - + if ( isSecondaryGrenade( nade ) ) { self thread BotPressSmoke( time ); @@ -2308,9 +2308,9 @@ botThrowGrenade( nade, time ) { self thread BotPressFrag( time ); } - + ret = self waittill_any_timeout( 5, "grenade_fire" ); - + return ( ret == "grenade_fire" ); } @@ -2320,7 +2320,7 @@ botThrowGrenade( nade, time ) 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 ) ) @@ -2328,7 +2328,7 @@ bot_array_nearest_curorigin( array ) result = array[ i ]; } } - + return result; } @@ -2338,17 +2338,17 @@ bot_array_nearest_curorigin( array ) getRocketAmmo() { answer = self getLockonAmmo(); - + if ( isdefined( answer ) ) { return answer; } - + if ( self getammocount( "rpg_mp" ) ) { answer = "rpg_mp"; } - + return answer; } @@ -2358,22 +2358,22 @@ getRocketAmmo() 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; } @@ -2387,9 +2387,9 @@ stop_go_target_on_death( tar ) self endon( "new_goal" ); self endon( "bad_path" ); self endon( "goal" ); - + tar waittill_either( "death", "disconnect" ); - + self ClearScriptGoal(); } @@ -2400,43 +2400,43 @@ follow_target() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { 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 ); - + self SetScriptGoal( threat.origin, 64 ); 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 ); } } @@ -2447,35 +2447,35 @@ follow_target() bot_think_camp_loop() { campSpot = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "camp" ), 1024 ) ) ); - + if ( !isdefined( campSpot ) ) { return; } - + self SetScriptGoal( campSpot.origin, 16 ); - + time = randomintrange( 10, 20 ); - + self BotNotifyBotEvent( "camp", "go", campSpot, time ); - + 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 ); - + self thread killCampAfterTime( time ); self CampAtSpot( campSpot.origin, campSpot.origin + anglestoforward( campSpot.angles ) * 2048 ); - + self BotNotifyBotEvent( "camp", "stop", campSpot, time ); } @@ -2486,21 +2486,21 @@ bot_think_camp() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { 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(); } } @@ -2513,11 +2513,11 @@ killCampAfterTime( time ) self endon( "death" ); self endon( "disconnect" ); self endon( "kill_camp_bot" ); - + wait time + 0.05; self ClearScriptGoal(); self ClearScriptAimPos(); - + self notify( "kill_camp_bot" ); } @@ -2529,20 +2529,20 @@ killCampAfterEntGone( ent ) self endon( "death" ); self endon( "disconnect" ); self endon( "kill_camp_bot" ); - + for ( ;; ) { wait 0.05; - + if ( !isdefined( ent ) ) { break; } } - + self ClearScriptGoal(); self ClearScriptAimPos(); - + self notify( "kill_camp_bot" ); } @@ -2552,17 +2552,17 @@ killCampAfterEntGone( ent ) CampAtSpot( origin, anglePos ) { self endon( "kill_camp_bot" ); - + self SetScriptGoal( origin, 64 ); - + if ( isdefined( anglePos ) ) { self SetScriptAimPos( anglePos ); } - + self waittill( "new_goal" ); self ClearScriptAimPos(); - + self notify( "kill_camp_bot" ); } @@ -2584,49 +2584,49 @@ bot_think_follow_loop() { follows = []; distSq = self.pers[ "bots" ][ "skill" ][ "help_dist" ] * self.pers[ "bots" ][ "skill" ][ "help_dist" ]; - + for ( i = level.players.size - 1; i >= 0; i-- ) { 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; } - + toFollow = random( follows ); follows = undefined; - + if ( !isdefined( toFollow ) ) { return; } - + time = randomintrange( 10, 20 ); - + self BotNotifyBotEvent( "follow", "start", toFollow, time ); - + self thread killFollowAfterTime( time ); self followPlayer( toFollow ); - + self BotNotifyBotEvent( "follow", "stop", toFollow, time ); } @@ -2637,26 +2637,26 @@ bot_think_follow() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { 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(); } } @@ -2669,17 +2669,17 @@ watchForFollowNewGoal() self endon( "death" ); self endon( "disconnect" ); self endon( "kill_follow_bot" ); - + for ( ;; ) { self waittill( "new_goal" ); - + if ( !isdefined( self.bot_was_follow_script_update ) ) { break; } } - + self ClearScriptAimPos(); self notify( "kill_follow_bot" ); } @@ -2692,9 +2692,9 @@ killFollowAfterTime( time ) self endon( "death" ); self endon( "disconnect" ); self endon( "kill_follow_bot" ); - + wait time; - + self ClearScriptGoal(); self ClearScriptAimPos(); self notify( "kill_follow_bot" ); @@ -2706,37 +2706,37 @@ killFollowAfterTime( time ) followPlayer( who ) { self endon( "kill_follow_bot" ); - + self thread watchForFollowNewGoal(); - + for ( ;; ) { 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 ); waittillframeend; self.bot_was_follow_script_update = undefined; - + self waittill_either( "goal", "bad_path" ); } - + self ClearScriptGoal(); self ClearScriptAimPos(); - + self notify( "kill_follow_bot" ); } @@ -2752,107 +2752,107 @@ bot_use_tube_think_loop( data ) else { wait randomintrange( 3, 7 ); - + 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; - + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "tube" ) ) ) { tubeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "tube" ), 1024 ) ) ); - + myEye = self geteye(); - + if ( !isdefined( tubeWp ) || self HasScriptGoal() || self.bot_lock_goal ) { traceForward = bullettrace( myEye, myEye + anglestoforward( self getplayerangles() ) * 900 * 5, false, self ); - + loc = traceForward[ "position" ]; 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 ); } else { self BotNotifyBotEvent( "tube", "go", tubeWp, tube ); - + self SetScriptGoal( tubeWp.origin, 16 ); - + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - + if ( ret != "new_goal" ) { self ClearScriptGoal(); } - + if ( ret != "goal" ) { return; } - + data.dofastcontinue = true; return; } @@ -2862,25 +2862,25 @@ bot_use_tube_think_loop( data ) tubeWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "tube" ) ) ); loc = tubeWp.origin + anglestoforward( tubeWp.angles ) * 2048; } - + if ( !isdefined( loc ) ) { return; } - + self BotNotifyBotEvent( "tube", "start", loc, tube ); - + self SetScriptAimPos( loc ); self BotStopMoving( true ); wait 1; - + if ( self changeToWeapon( tube ) ) { self thread fire_current_weapon(); self waittill_any_timeout( 5, "missile_fire", "weapon_change" ); self notify( "stop_firing_weapon" ); } - + self ClearScriptAimPos(); self BotStopMoving( false ); } @@ -2893,10 +2893,10 @@ bot_use_tube_think() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + data = spawnstruct(); data.dofastcontinue = false; - + for ( ;; ) { self bot_use_tube_think_loop( data ); @@ -2915,103 +2915,103 @@ bot_use_equipment_think_loop( data ) else { wait randomintrange( 2, 4 ); - + 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; - + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "claymore" ) ) ) { clayWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "claymore" ), 1024 ) ) ); - + if ( !isdefined( clayWp ) || self HasScriptGoal() || self.bot_lock_goal ) { myEye = self geteye(); loc = myEye + anglestoforward( self getplayerangles() ) * 256; - + if ( !bullettracepassed( myEye, loc, false, self ) ) { return; @@ -3020,21 +3020,21 @@ bot_use_equipment_think_loop( data ) else { self BotNotifyBotEvent( "equ", "go", clayWp, nade ); - + self SetScriptGoal( clayWp.origin, 16 ); - + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - + if ( ret != "new_goal" ) { self ClearScriptGoal(); } - + if ( ret != "goal" ) { return; } - + data.dofastcontinue = true; return; } @@ -3044,20 +3044,20 @@ bot_use_equipment_think_loop( data ) clayWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "claymore" ) ) ); loc = clayWp.origin + anglestoforward( clayWp.angles ) * 2048; } - + if ( !isdefined( loc ) ) { return; } - + self BotNotifyBotEvent( "equ", "start", loc, nade ); - + self SetScriptAimPos( loc ); self BotStopMoving( true ); wait 1; - + self botThrowGrenade( nade, 0.05 ); - + self ClearScriptAimPos(); self BotStopMoving( false ); } @@ -3070,10 +3070,10 @@ bot_use_equipment_think() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + data = spawnstruct(); data.dofastcontinue = false; - + for ( ;; ) { self bot_use_equipment_think_loop( data ); @@ -3092,107 +3092,107 @@ bot_use_grenade_think_loop( data ) else { wait randomintrange( 4, 7 ); - + 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; - + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "grenade" ) ) ) { nadeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "grenade" ), 1024 ) ) ); - + myEye = self geteye(); - + if ( !isdefined( nadeWp ) || self HasScriptGoal() || self.bot_lock_goal ) { traceForward = bullettrace( myEye, myEye + anglestoforward( self getplayerangles() ) * 900, false, self ); - + loc = traceForward[ "position" ]; 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 ); } else { self BotNotifyBotEvent( "nade", "go", nadeWp, nade ); - + self SetScriptGoal( nadeWp.origin, 16 ); - + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - + if ( ret != "new_goal" ) { self ClearScriptGoal(); } - + if ( ret != "goal" ) { return; } - + data.dofastcontinue = true; return; } @@ -3202,27 +3202,27 @@ bot_use_grenade_think_loop( data ) nadeWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "grenade" ) ) ); loc = nadeWp.origin + anglestoforward( nadeWp.angles ) * 2048; } - + if ( !isdefined( loc ) ) { return; } - + self BotNotifyBotEvent( "nade", "start", loc, nade ); - + self SetScriptAimPos( loc ); self BotStopMoving( true ); wait 1; - + time = 0.5; - + if ( nade == "frag_grenade_mp" ) { time = 2; } - + self botThrowGrenade( nade, time ); - + self ClearScriptAimPos(); self BotStopMoving( false ); } @@ -3235,10 +3235,10 @@ bot_use_grenade_think() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + data = spawnstruct(); data.dofastcontinue = false; - + for ( ;; ) { self bot_use_grenade_think_loop( data ); @@ -3251,7 +3251,7 @@ bot_use_grenade_think() bot_watch_think_mw2_loop() { tube = self getValidTube(); - + if ( !isdefined( tube ) ) { if ( self getammocount( "iw5_smaw_mp" ) ) @@ -3271,17 +3271,17 @@ bot_watch_think_mw2_loop() return; } } - + if ( self getcurrentweapon() == tube ) { return; } - + if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "nade" ] ) { return; } - + self thread changeToWeapon( tube ); } @@ -3293,36 +3293,36 @@ bot_watch_think_mw2() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + for ( ;; ) { 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(); } } @@ -3335,26 +3335,26 @@ bot_watch_riot_weapons_loop() threat = self getThreat(); dist = distancesquared( threat.origin, self.origin ); curWeap = self getcurrentweapon(); - + if ( randomint( 2 ) ) { 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 @@ -3363,39 +3363,39 @@ bot_watch_riot_weapons_loop() { return; } - + weaponslist = self getweaponslistall(); weap = ""; - + while ( weaponslist.size ) { weapon = weaponslist[ randomint( weaponslist.size ) ]; 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 ); } } @@ -3408,41 +3408,41 @@ bot_watch_riot_weapons() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + for ( ;; ) { 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(); } } @@ -3459,82 +3459,82 @@ bot_jav_loc_think_loop( data ) else { wait randomintrange( 2, 4 ); - + 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; - + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "javelin" ) ) ) { javWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "javelin" ), 1024 ) ) ); - + if ( !isdefined( javWp ) || self HasScriptGoal() || self.bot_lock_goal ) { 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; @@ -3543,21 +3543,21 @@ bot_jav_loc_think_loop( data ) else { self BotNotifyBotEvent( "jav", "go", javWp ); - + self SetScriptGoal( javWp.origin, 16 ); - + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - + if ( ret != "new_goal" ) { self ClearScriptGoal(); } - + if ( ret != "goal" ) { return; } - + data.dofastcontinue = true; return; } @@ -3567,21 +3567,21 @@ bot_jav_loc_think_loop( data ) javWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "javelin" ) ) ); loc = javWp.jav_point; } - + if ( !isdefined( loc ) ) { return; } - + self BotNotifyBotEvent( "jav", "start", loc ); - + self SetBotJavelinLocation( loc ); - + if ( self changeToWeapon( "javelin_mp" ) ) { self waittill_any_timeout( 10, "missile_fire", "weapon_change" ); } - + self ClearBotJavelinLocation(); } @@ -3593,10 +3593,10 @@ bot_jav_loc_think() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + data = spawnstruct(); data.dofastcontinue = false; - + for ( ;; ) { self bot_jav_loc_think_loop( data ); @@ -3615,85 +3615,85 @@ bot_equipment_kill_think_loop() myAngles = self getplayerangles(); dist = 512 * 512; target = undefined; - + // check legacy nades, c4 and claymores for ( i = 0; i < grenades.size; i++ ) { 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 ) { target = item; break; } } - + grenades = undefined; // clean up, reduces child1 vars - + // check for player stuff, tis and throphys and radars if ( !isdefined( target ) ) { for ( i = 0; i < level.players.size; i++ ) { 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 ) ) { for ( h = 0; h < player.trophyarray.size; h++ ) { item = player.trophyarray[ h ]; - + if ( !isdefined( item ) ) { continue; } - + if ( isdefined( item.damagetaken ) && isdefined( item.maxhealth ) ) { if ( item.damagetaken >= item.maxhealth ) @@ -3701,27 +3701,27 @@ bot_equipment_kill_think_loop() 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 ) { target = item; @@ -3729,19 +3729,19 @@ bot_equipment_kill_think_loop() } } } - + // check for ti if ( !isdefined( target ) ) { for ( h = 0; h < 1; h++ ) { item = player.setspawnpoint; - + if ( !isdefined( item ) ) { continue; } - + if ( isdefined( item.damagetaken ) && isdefined( item.maxhealth ) ) { if ( item.damagetaken >= item.maxhealth ) @@ -3749,27 +3749,27 @@ bot_equipment_kill_think_loop() 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 ) { target = item; @@ -3777,19 +3777,19 @@ bot_equipment_kill_think_loop() } } } - + // check for radar if ( !isdefined( target ) ) { for ( h = 0; h < 1; h++ ) { item = player.deployedportableradar; - + if ( !isdefined( item ) ) { continue; } - + if ( isdefined( item.damagetaken ) && isdefined( item.maxhealth ) ) { if ( item.damagetaken >= item.maxhealth ) @@ -3797,27 +3797,27 @@ bot_equipment_kill_think_loop() 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 ) { target = item; @@ -3825,28 +3825,28 @@ bot_equipment_kill_think_loop() } } } - + if ( isdefined( target ) ) { break; } } } - + // check for ims if ( !isdefined( target ) ) { imsKeys = getarraykeys( level.ims ); - + for ( i = 0; i < imsKeys.size; i++ ) { item = level.ims[ imsKeys[ i ] ]; - + if ( !isdefined( item ) ) { continue; } - + if ( isdefined( item.damagetaken ) && isdefined( item.maxhealth ) ) { if ( item.damagetaken >= item.maxhealth ) @@ -3854,44 +3854,44 @@ bot_equipment_kill_think_loop() 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 ) { target = item; break; } } - + imsKeys = undefined; } - + // check for vest if ( !isdefined( target ) ) { for ( i = 0; i < level.vest_boxes.size; i++ ) { item = level.vest_boxes[ i ]; - + if ( !isdefined( item ) ) { continue; } - + if ( isdefined( item.damagetaken ) && isdefined( item.maxhealth ) ) { if ( item.damagetaken >= item.maxhealth ) @@ -3899,22 +3899,22 @@ bot_equipment_kill_think_loop() 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 ) { target = item; @@ -3922,19 +3922,19 @@ bot_equipment_kill_think_loop() } } } - + // check for jammers if ( !isdefined( target ) ) { for ( i = 0; i < level.scramblers.size; i++ ) { item = level.scramblers[ i ]; - + if ( !isdefined( item ) ) { continue; } - + if ( isdefined( item.damagetaken ) && isdefined( item.maxhealth ) ) { if ( item.damagetaken >= item.maxhealth ) @@ -3942,22 +3942,22 @@ bot_equipment_kill_think_loop() 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 ) { target = item; @@ -3965,19 +3965,19 @@ bot_equipment_kill_think_loop() } } } - + // check for mines if ( !isdefined( target ) ) { for ( i = 0; i < level.mines.size; i++ ) { item = level.mines[ i ]; - + if ( !isdefined( item ) ) { continue; } - + if ( isdefined( item.damagetaken ) && isdefined( item.maxhealth ) ) { if ( item.damagetaken >= item.maxhealth ) @@ -3985,22 +3985,22 @@ bot_equipment_kill_think_loop() 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 ) { target = item; @@ -4008,57 +4008,57 @@ bot_equipment_kill_think_loop() } } } - + if ( !isdefined( target ) ) { return; } - + // must be ti if ( isdefined( target.enemytrigger ) && !self HasScriptGoal() && !self.bot_lock_goal ) { self BotNotifyBotEvent( "attack_equ", "go_ti", target ); - + self SetScriptGoal( target.origin, 64 ); self thread bot_inc_bots( target, true ); self thread bots_watch_touch_obj( target ); - + 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 ) { self BotNotifyBotEvent( "attack_equ", "camp_ti", target ); - + self thread killCampAfterTime( randomintrange( 10, 20 ) ); self thread killCampAfterEntGone( target ); self CampAtSpot( target.origin, target.origin + ( 0, 0, 42 ) ); } - + if ( isdefined( target ) ) { self BotNotifyBotEvent( "attack_equ", "trigger_ti", target ); self thread BotPressUse(); } - + return; } - + self BotNotifyBotEvent( "attack_equ", "start", target ); - + self SetScriptEnemy( target ); self bot_equipment_attack( target ); self ClearScriptEnemy(); - + self BotNotifyBotEvent( "attack_equ", "stop", target ); } @@ -4070,21 +4070,21 @@ bot_equipment_kill_think() self endon( "death" ); self endon( "disconnect" ); level endon ( "game_ended" ); - + for ( ;; ) { wait( randomintrange( 1, 3 ) ); - + if ( self HasScriptEnemy() ) { continue; } - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) { continue; } - + self bot_equipment_kill_think_loop(); } } @@ -4095,16 +4095,16 @@ bot_equipment_kill_think() bot_equipment_attack( equ ) { wait_time = randomintrange( 7, 10 ); - + for ( i = 0; i < wait_time; i++ ) { wait( 1 ); - + if ( !isdefined( equ ) ) { return; } - + if ( isdefined( equ.damagetaken ) && isdefined( equ.maxhealth ) ) { if ( equ.damagetaken >= equ.maxhealth ) @@ -4121,108 +4121,108 @@ bot_equipment_attack( equ ) bot_listen_to_steps_loop() { dist = level.bots_listendist; - + if ( self _hasperk( "specialty_selectivehearing" ) ) { dist *= 1.4; } - + dist *= dist; - + heard = undefined; - + for ( i = level.players.size - 1 ; i >= 0; i-- ) { 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; } - + hasHeartbeat = ( issubstr( self getcurrentweapon(), "_heartbeat" ) && ( ( !self isemped() && !self isnuked() ) || self _hasperk( "specialty_spygame" ) ) ); heartbeatDist = 350 * 350; - + if ( !isdefined( heard ) && hasHeartbeat ) { for ( i = level.players.size - 1 ; i >= 0; i-- ) { 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; } } - + if ( !isdefined( heard ) ) { if ( self _hasperk( "specialty_revenge" ) && isdefined( self.lastkilledby ) ) @@ -4230,32 +4230,32 @@ bot_listen_to_steps_loop() heard = self.lastkilledby; } } - + if ( !isdefined( heard ) ) { return; } - + self BotNotifyBotEvent( "heard_target", "start", heard ); - + if ( bullettracepassed( self geteye(), heard gettagorigin( "j_spineupper" ), false, heard ) ) { self setAttacker( heard ); return; } - + 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 ); } @@ -4266,16 +4266,16 @@ bot_listen_to_steps() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 1; - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] < 3 ) { continue; } - + self bot_listen_to_steps_loop(); } } @@ -4286,90 +4286,90 @@ bot_listen_to_steps() bot_uav_think_loop() { hasAssPro = self _hasperk( "specialty_spygame" ); - + 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; - + for ( i = level.players.size - 1; i >= 0; i-- ) { 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 ) ) { self BotNotifyBotEvent( "uav_target", "start", player ); - + distSq = self.pers[ "bots" ][ "skill" ][ "help_dist" ] * self.pers[ "bots" ][ "skill" ][ "help_dist" ]; - + if ( distFromPlayer < distSq && bullettracepassed( self geteye(), player gettagorigin( "j_spineupper" ), false, player ) ) { self setAttacker( player ); } - + if ( !self HasScriptGoal() && !self.bot_lock_goal ) { self SetScriptGoal( player.origin, 128 ); 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 ); } - + break; } } @@ -4382,16 +4382,16 @@ bot_uav_think() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { wait 0.75; - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 || self isusingremote() ) { continue; } - + self bot_uav_think_loop(); } } @@ -4403,12 +4403,12 @@ bot_revenge_think() { self endon( "death" ); self endon( "disconnect" ); - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) { return; } - + if ( isdefined( self.lastkiller ) && isreallyalive( self.lastkiller ) ) { if ( bullettracepassed( self geteye(), self.lastkiller gettagorigin( "j_spineupper" ), false, self.lastkiller ) ) @@ -4416,37 +4416,37 @@ bot_revenge_think() self setAttacker( self.lastkiller ); } } - + if ( !isdefined( self.killerlocation ) ) { return; } - + loc = self.killerlocation; - + for ( ;; ) { 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 ); } } @@ -4461,27 +4461,27 @@ turret_death_monitor( turret ) self endon ( "bad_path" ); self endon ( "goal" ); self endon ( "new_goal" ); - + for ( ;; ) { wait 0.5; - + if ( !isdefined( turret ) ) { break; } - + if ( turret.damagetaken >= turret.maxhealth ) { break; } - + if ( isdefined( turret.carriedby ) ) { break; } } - + self notify( "bad_path" ); } @@ -4491,26 +4491,26 @@ turret_death_monitor( turret ) bot_turret_attack( enemy ) { wait_time = randomintrange( 7, 10 ); - + for ( i = 0; i < wait_time; i++ ) { 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; } @@ -4523,141 +4523,141 @@ bot_turret_think_loop() { myTeam = self.pers[ "team" ]; turretsKeys = getarraykeys( level.turrets ); - + if ( turretsKeys.size == 0 ) { wait( randomintrange( 3, 5 ) ); return; } - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) { return; } - + if ( self HasScriptEnemy() || self isusingremote() ) { return; } - + myEye = self geteye(); turret = undefined; - + for ( i = turretsKeys.size - 1; i >= 0; i-- ) { 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; } - + turretsKeys = undefined; - + if ( !isdefined( turret ) ) { return; } - + forward = anglestoforward( turret.angles ); forward = vectornormalize( forward ); - + delta = self.origin - turret.origin; delta = vectornormalize( delta ); - + dot = vectordot( forward, delta ); - + 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 ) { self BotNotifyBotEvent( "turret_attack", "go", turret ); - + self SetScriptGoal( turret.origin, 32 ); self thread bot_inc_bots( turret, true ); self thread turret_death_monitor( turret ); 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 ); - + self SetScriptEnemy( turret, ( 0, 0, 25 ) ); self bot_turret_attack( turret ); self ClearScriptEnemy(); - + self BotNotifyBotEvent( "turret_attack", "stop", turret ); } @@ -4669,11 +4669,11 @@ bot_turret_think() self endon( "death" ); self endon( "disconnect" ); level endon ( "game_ended" ); - + for ( ;; ) { wait( 1 ); - + self bot_turret_think_loop(); } } @@ -4684,7 +4684,7 @@ bot_turret_think() bot_box_think_loop( data ) { ret = "bot_check_box_think"; - + if ( data.first ) { data.first = false; @@ -4693,61 +4693,61 @@ bot_box_think_loop( data ) { 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" ]; - + dist = 2048 * 2048; - + for ( i = 0; i < level.vest_boxes.size; i++ ) { item = level.vest_boxes[ i ]; - + if ( !isdefined( item ) ) { continue; } - + if ( isdefined( item.damagetaken ) && isdefined( item.maxhealth ) ) { if ( item.damagetaken >= item.maxhealth ) @@ -4755,58 +4755,58 @@ bot_box_think_loop( data ) continue; } } - + if ( !isdefined( item.owner ) || ( level.teambased && item.owner.team != myTeam ) || ( !level.teambased && item.owner != self ) ) { continue; } - + if ( distancesquared( item.origin, self.origin ) < dist ) { box = item; break; } } - + if ( !isdefined( box ) ) { return; } - + self BotNotifyBotEvent( "box_cap", "go", box ); - + self.bot_lock_goal = true; - + radius = getdvarfloat( "player_useRadius" ) / 2; self SetScriptGoal( box.origin, radius ); self thread bot_inc_bots( box, true ); self thread bots_watch_touch_obj( box ); - + path = self waittill_any_return( "bad_path", "goal", "new_goal" ); - + 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 ); - + self BotFreezeControls( true ); self bot_wait_stop_move(); - + waitTime = 2.25; self thread BotPressUse( waitTime ); wait waitTime; - + self BotFreezeControls( false ); - + self BotNotifyBotEvent( "box_cap", "stop", box ); } @@ -4818,10 +4818,10 @@ bot_box_think() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + data = spawnstruct(); data.first = true; - + for ( ;; ) { self bot_box_think_loop( data ); @@ -4834,66 +4834,66 @@ bot_box_think() bot_watch_stuck_on_crate_loop() { crates = getentarray( "care_package", "targetname" ); - + if ( crates.size == 0 ) { return; } - + crate = undefined; - + for ( i = crates.size - 1; i >= 0; i-- ) { 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" ); } @@ -4906,16 +4906,16 @@ bot_watch_stuck_on_crate() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + for ( ;; ) { wait 3; - + if ( self hasThreat() ) { continue; } - + self bot_watch_stuck_on_crate_loop(); } } @@ -4927,7 +4927,7 @@ bot_crate_think_loop( data ) { myTeam = self.pers[ "team" ]; ret = "crate_physics_done"; - + if ( data.first ) { data.first = false; @@ -4936,90 +4936,90 @@ bot_crate_think_loop( data ) { ret = self waittill_any_timeout( randomintrange( 3, 5 ), "crate_physics_done" ); } - + crate = self.bot_stuck_on_carepackage; self.bot_stuck_on_carepackage = undefined; - + 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 ); - + crate = undefined; - + for ( i = crates.size - 1; i >= 0; i-- ) { 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 ) @@ -5037,65 +5037,65 @@ bot_crate_think_loop( data ) } } } - + crate = tempCrate; } - + crates = undefined; - + if ( !isdefined( crate ) ) { return; } - + self BotNotifyBotEvent( "crate_cap", "go", crate ); - + self.bot_lock_goal = true; - + radius = getdvarfloat( "player_useRadius" ) - 16; self SetScriptGoal( crate.origin, radius ); self thread bot_inc_bots( crate, true ); self thread bots_watch_touch_obj( crate ); - + path = self waittill_any_return( "bad_path", "goal", "new_goal" ); - + 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; } } - + self BotNotifyBotEvent( "crate_cap", "start", crate ); - + self BotRandomStance(); - + self BotFreezeControls( true ); self bot_wait_stop_move(); - + waitTime = 3.25; - + if ( !isdefined( crate.owner ) || crate.owner == self ) { waitTime = 0.75; } - + self thread BotPressUse( waitTime ); wait waitTime; - + self BotFreezeControls( false ); - + // check if actually captured it? self BotNotifyBotEvent( "crate_cap", "stop", crate ); } @@ -5108,10 +5108,10 @@ bot_crate_think() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + data = spawnstruct(); data.first = true; - + for ( ;; ) { self bot_crate_think_loop( data ); @@ -5125,32 +5125,32 @@ doReloadCancel_loop() { curWeap = self getcurrentweapon(); 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" ) { @@ -5159,14 +5159,14 @@ doReloadCancel_loop() wait 0.05; } } - + curWeap = self getcurrentweapon(); - + if ( !maps\mp\gametypes\_weapons::isprimaryweapon( curWeap ) ) { return; } - + if ( ret == "reload" ) { // check single reloads @@ -5175,41 +5175,41 @@ doReloadCancel_loop() return; } } - + // check difficulty if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 3 ) { return; } - + // check if got another weapon weaponslist = self getweaponslistprimaries(); weap = ""; - + while ( weaponslist.size ) { weapon = weaponslist[ randomint( weaponslist.size ) ]; 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; self thread changeToWeapon( weap ); @@ -5225,7 +5225,7 @@ doReloadCancel() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self doReloadCancel_loop(); @@ -5238,62 +5238,62 @@ doReloadCancel() 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(); - + if ( hasTarget ) { threat = self getThreat(); rocketAmmo = self getRocketAmmo(); - + if ( entIsVehicle( threat ) && isdefined( rocketAmmo ) ) { if ( curWeap != rocketAmmo ) { self thread changeToWeapon( rocketAmmo ); } - + return; } } - + if ( self HasBotJavelinLocation() && self getammocount( "javelin_mp" ) ) { if ( curWeap != "javelin_mp" ) { self thread changeToWeapon( "javelin_mp" ); } - + return; } - + force = ( ret == "bot_force_check_switch" ); - + if ( data.first ) { data.first = false; - + if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "initswitch" ] ) { return; @@ -5307,7 +5307,7 @@ bot_weapon_think_loop( data ) { return; } - + if ( hasTarget ) { return; @@ -5318,39 +5318,39 @@ bot_weapon_think_loop( data ) force = true; } } - + weaponslist = self getweaponslistall(); weap = ""; - + while ( weaponslist.size ) { weapon = weaponslist[ randomint( weaponslist.size ) ]; 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 ); } @@ -5362,10 +5362,10 @@ bot_weapon_think() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + data = spawnstruct(); data.first = true; - + for ( ;; ) { self bot_weapon_think_loop( data ); @@ -5378,47 +5378,47 @@ bot_weapon_think() 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(); target = undefined; - + for ( i = targets.size - 1; i >= 0; i-- ) { 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 ) @@ -5426,42 +5426,42 @@ bot_target_vehicle_loop() continue; } } - + if ( tempTarget.classname != "script_vehicle" && !isdefined( lockOnAmmo ) ) { continue; } - + target = tempTarget; } - + 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 ); - + self SetScriptEnemy( target, ( 0, 0, 0 ) ); self bot_attack_vehicle( target ); self ClearScriptEnemy(); self notify( "bot_force_check_switch" ); - + self BotNotifyBotEvent( "attack_vehicle", "stop", target, rocketAmmo ); } @@ -5472,26 +5472,26 @@ bot_target_vehicle() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { 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(); } } @@ -5502,14 +5502,14 @@ bot_target_vehicle() bot_attack_vehicle( target ) { target endon( "death" ); - + wait_time = randomintrange( 7, 10 ); - + for ( i = 0; i < wait_time; i++ ) { self notify( "bot_force_check_switch" ); wait( 1 ); - + if ( !isdefined( target ) ) { return; @@ -5524,41 +5524,41 @@ bot_watch_use_remote_turret() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { 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; } @@ -5571,51 +5571,51 @@ getKillstreakTargetLocation() { location = undefined; players = []; - + for ( i = level.players.size - 1; i >= 0; i-- ) { 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; } - + 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 ); @@ -5624,7 +5624,7 @@ getKillstreakTargetLocation() { location = self.origin + ( randomintrange( -512, 512 ), randomintrange( -512, 512 ), 0 ); } - + return location; } @@ -5635,14 +5635,14 @@ clear_remote_on_death( isac130 ) { self endon( "bot_clear_remote_on_death" ); level endon( "game_ended" ); - + self waittill_either( "death", "disconnect" ); - + if ( isdefined( isac130 ) && isac130 ) { level.ac130inuse = false; } - + if ( isdefined( self ) ) { self clearusingremote(); @@ -5658,38 +5658,38 @@ bot_killstreak_think_loop( data ) { wait randomintrange( 1, 3 ); } - + 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 ) { self notify( "place_sentry" ); @@ -5698,34 +5698,34 @@ bot_killstreak_think_loop( data ) self notify( "place_carryRemoteUAV" ); self notify( "place_tank" ); } - + curWeap = self getcurrentweapon(); - + if ( issubstr( curWeap, "airdrop_" ) || issubstr( curWeap, "deployable_" ) ) { self thread BotPressAttack( 0.05 ); } - - + + useableStreaks = []; - + 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; @@ -5736,108 +5736,108 @@ bot_killstreak_think_loop( data ) useableStreaks[ 0 ] = data.dofastcontinue; data.dofastcontinue = undefined; } - + 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" ) ) ) { campSpot = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "camp" ), 1024 ) ) ); - + if ( isdefined( campSpot ) ) { self BotNotifyBotEvent( "killstreak", "camp", streakName, campSpot ); - + self SetScriptGoal( campSpot.origin, 16 ); - + if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" ) { self ClearScriptGoal(); } - + data.dofastcontinue = self.killstreakindexweapon; return; } } - + 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(); angles = self getplayerangles(); - + forwardTrace = bullettrace( myEye, myEye + anglestoforward( angles ) * 1024, false, self ); placeNot = "place_sentry"; cancelNot = "cancel_sentry"; distCheck = 1000 * 1000; doRandomStance = false; - + switch ( streakName ) { case "sam_turret": forwardTrace = bullettrace( myEye, myEye + ( 0, 0, 1024 ), false, self ); break; - + case "remote_mg_turret": placeNot = "place_turret"; cancelNot = "cancel_turret"; break; - + case "ims": forwardTrace = bullettrace( myEye, myEye + anglestoforward( angles ) * 128, false, self ); placeNot = "place_ims"; cancelNot = "cancel_ims"; distCheck = 100 * 100; break; - + case "remote_uav": forwardTrace = bullettrace( myEye, myEye + anglestoforward( angles ) * 128, false, self ); placeNot = "place_carryRemoteUAV"; @@ -5845,7 +5845,7 @@ bot_killstreak_think_loop( data ) distCheck = 100 * 100; doRandomStance = true; break; - + case "remote_tank": forwardTrace = bullettrace( myEye, myEye + anglestoforward( angles ) * 128, false, self ); placeNot = "place_tank"; @@ -5854,54 +5854,54 @@ bot_killstreak_think_loop( data ) doRandomStance = true; break; } - + 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" ] ); - + if ( !self changeToWeapon( ksWeap ) ) { self BotStopMoving( false ); self ClearScriptAimPos(); return; } - + wait 1; self notify( placeNot ); wait 0.05; self notify( cancelNot ); wait 0.5; - + self BotStopMoving( false ); self ClearScriptAimPos(); } else if ( streakName == "predator_missile" ) { location = self getKillstreakTargetLocation(); - + if ( !isdefined( location ) ) { return; } - + self BotNotifyBotEvent( "killstreak", "call", streakName, location ); - + self BotRandomStance(); self setusingremote( "remotemissile" ); self thread clear_remote_on_death(); self BotStopMoving( true ); - + if ( !self changeToWeapon( ksWeap ) ) { self clearusingremote(); @@ -5909,36 +5909,36 @@ bot_killstreak_think_loop( data ) self BotStopMoving( false ); return; } - + wait 0.05; self thread changeToWeapon( ksWeap ); // prevent script from changing back - + wait 1; self notify( "bot_clear_remote_on_death" ); self BotStopMoving( false ); - + if ( self isemped() || self isnuked() ) { self clearusingremote(); self thread changeToWeapon( curWeap ); return; } - + self BotFreezeControls( true ); - + self thread maps\mp\killstreaks\_killstreaks::updatekillstreaks(); self maps\mp\killstreaks\_killstreaks::usedkillstreak( streakName, true ); - + rocket = magicbullet( "remotemissile_projectile_mp", self.origin + ( 0.0, 0.0, 7000.0 - ( self.pers[ "bots" ][ "skill" ][ "base" ] * 400 ) ), location, self ); rocket.lifeid = lifeId; rocket.type = "remote"; - + rocket thread maps\mp\gametypes\_weapons::addmissiletosighttraces( self.pers[ "team" ] ); rocket thread maps\mp\killstreaks\_remotemissile::handledamage(); thread maps\mp\killstreaks\_remotemissile::missileeyes( self, rocket ); - + self waittill( "stopped_using_remote" ); - + wait 1; self BotFreezeControls( false ); } @@ -5951,7 +5951,7 @@ bot_killstreak_think_loop( data ) return; } } - + if ( streakName == "remote_mortar" ) { if ( isdefined( level.remote_mortar ) ) @@ -5959,46 +5959,46 @@ bot_killstreak_think_loop( data ) return; } } - + location = undefined; directionYaw = undefined; - + 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 ); - + self BotRandomStance(); self BotStopMoving( true ); - + if ( self changeToWeapon( ksWeap ) ) { wait 1; - + if ( isdefined( location ) ) { self notify( "confirm_location", location, directionYaw ); } } - + wait 2; self BotStopMoving( false ); } @@ -6006,35 +6006,35 @@ bot_killstreak_think_loop( data ) { myEye = self geteye(); angles = self getplayerangles(); - + 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 ); - + self BotStopMoving( true ); self SetScriptAimPos( forwardTrace[ "position" ] ); - + if ( !self changeToWeapon( ksWeap ) ) { self BotStopMoving( false ); self ClearScriptAimPos(); return; } - + self thread fire_current_weapon(); - + self waittill_any_timeout( 5, "grenade_fire" ); - + self notify( "stop_firing_weapon" ); - + self BotStopMoving( false ); self ClearScriptAimPos(); - + wait 2.5; self notify( "bot_check_box_think" ); } @@ -6047,72 +6047,72 @@ bot_killstreak_think_loop( data ) { 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(); - + 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 ); - + self BotStopMoving( true ); self SetScriptAimPos( forwardTrace[ "position" ] ); - + if ( !self changeToWeapon( ksWeap ) ) { self BotStopMoving( false ); self ClearScriptAimPos(); return; } - + self thread fire_current_weapon(); - + ret = self waittill_any_timeout( 5, "grenade_fire" ); - + self notify( "stop_firing_weapon" ); - + if ( ret == "timeout" ) { self BotStopMoving( false ); self ClearScriptAimPos(); return; } - + 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(); } @@ -6122,50 +6122,50 @@ bot_killstreak_think_loop( data ) { 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; directionYaw = undefined; - + switch ( streakName ) { case "littlebird_flock": @@ -6173,12 +6173,12 @@ bot_killstreak_think_loop( data ) case "precision_airstrike": location = self getKillstreakTargetLocation(); directionYaw = randomint( 360 ); - + if ( !isdefined( location ) ) { return; } - + case "helicopter": case "helicopter_flares": case "littlebird_support": @@ -6189,24 +6189,24 @@ bot_killstreak_think_loop( data ) case "nuke": case "emp": self BotStopMoving( true ); - + self BotNotifyBotEvent( "killstreak", "call", streakName, location, directionYaw ); - + if ( self changeToWeapon( ksWeap ) ) { wait 1; - + if ( isdefined( location ) ) { self BotFreezeControls( true ); - + self notify( "confirm_location", location, directionYaw ); wait 1; - + self BotFreezeControls( false ); } } - + self BotStopMoving( false ); break; } @@ -6222,10 +6222,10 @@ bot_killstreak_think() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + data = spawnstruct(); data.dofastcontinue = undefined; - + for ( ;; ) { self bot_killstreak_think_loop( data ); @@ -6258,49 +6258,49 @@ BotUseRandomEquipment() { self endon( "death" ); self endon( "disconnect" ); - + 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 ); } @@ -6311,43 +6311,43 @@ BotLookAtRandomThing( obj_target ) { self endon( "death" ); self endon( "disconnect" ); - + if ( self HasScriptAimPos() ) { return; } - + rand = randomint( 100 ); - + nearestEnemy = undefined; - + for ( i = 0; i < level.players.size; i++ ) { 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 ) ) { nearestEnemy = player; } } - + 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 ] ); @@ -6364,7 +6364,7 @@ BotLookAtRandomThing( obj_target ) { origin += self.origin + anglestoforward( ( 0, randomint( 360 ), 0 ) ) * 1024; } - + self SetScriptAimPos( origin ); wait 2; self ClearScriptAimPos(); @@ -6379,16 +6379,16 @@ bot_do_random_action_for_objective( obj_target ) self endon( "disconnect" ); self notify( "bot_do_random_action_for_objective" ); self endon( "bot_do_random_action_for_objective" ); - + if ( !isdefined( self.bot_random_obj_action ) ) { self.bot_random_obj_action = true; - + if ( randomint( 100 ) < 80 ) { self thread BotUseRandomEquipment(); } - + if ( randomint( 100 ) < 75 ) { self thread BotLookAtRandomThing( obj_target ); @@ -6405,7 +6405,7 @@ bot_do_random_action_for_objective( obj_target ) self thread BotLookAtRandomThing( obj_target ); } } - + wait 2; self.bot_random_obj_action = undefined; } @@ -6418,52 +6418,52 @@ bot_dom_spawn_kill_think_loop() myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); 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 ); - + self SetScriptGoal( flag.origin, 1024 ); - + 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 ); } @@ -6474,26 +6474,26 @@ bot_dom_spawn_kill_think() { self endon( "death" ); 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(); } } @@ -6508,17 +6508,17 @@ bot_dom_watch_flags( count, myTeam ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 0.5; - + if ( maps\mp\gametypes\dom::getteamflagcount( myTeam ) != count ) { break; } } - + self notify( "bad_path" ); } @@ -6529,42 +6529,42 @@ bot_dom_def_think_loop() { myTeam = self.pers[ "team" ]; flag = undefined; - + 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 ); - + self SetScriptGoal( flag.origin, 128 ); - + self thread bot_dom_watch_for_flashing( flag, myTeam ); 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 ); } @@ -6575,26 +6575,26 @@ bot_dom_def_think() { self endon( "death" ); 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(); } } @@ -6609,22 +6609,22 @@ bot_dom_watch_for_flashing( flag, myTeam ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { 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" ); } @@ -6635,16 +6635,16 @@ bot_dom_cap_think_loop() { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + myFlagCount = maps\mp\gametypes\dom::getteamflagcount( myTeam ); - + if ( myFlagCount == level.flags.size ) { return; } - + otherFlagCount = maps\mp\gametypes\dom::getteamflagcount( otherTeam ); - + if ( game[ "teamScores" ][ myTeam ] >= game[ "teamScores" ][ otherTeam ] ) { if ( myFlagCount < otherFlagCount ) @@ -6669,20 +6669,20 @@ bot_dom_cap_think_loop() } } } - + flag = undefined; flags = []; - + 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 ]; } - + if ( randomint( 100 ) > 30 ) { for ( i = 0; i < flags.size; i++ ) @@ -6697,53 +6697,53 @@ bot_dom_cap_think_loop() { flag = random( flags ); } - + if ( !isdefined( flag ) ) { return; } - + self BotNotifyBotEvent( "dom", "go", "cap", flag ); - + self.bot_lock_goal = true; self SetScriptGoal( flag.origin, 64 ); - + self thread bot_dom_go_cap_flag( flag, myTeam ); - + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( event != "new_goal" ) { self ClearScriptGoal(); } - + if ( event != "goal" ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "dom", "start", "cap", flag ); - + self SetScriptGoal( self.origin, 64 ); - + while ( flag maps\mp\gametypes\dom::getflagteam() != myTeam && self istouching( flag ) ) { cur = flag.useobj.curprogress; 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 ); } - + self BotNotifyBotEvent( "dom", "stop", "cap", flag ); - + self ClearScriptGoal(); - + self.bot_lock_goal = false; } @@ -6754,26 +6754,26 @@ bot_dom_cap_think() { self endon( "death" ); self endon( "disconnect" ); - + if ( level.gametype != "dom" ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 12 ) ); - + if ( self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.flags ) || level.flags.size == 0 ) { continue; } - + self bot_dom_cap_think_loop(); } } @@ -6788,27 +6788,27 @@ bot_dom_go_cap_flag( flag, myTeam ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { 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" ); @@ -6826,11 +6826,11 @@ bot_hq_loop() { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + radio = level.radio; gameobj = radio.gameobject; origin = ( radio.origin[ 0 ], radio.origin[ 1 ], radio.origin[ 2 ] + 5 ); - + // if neut or enemy if ( gameobj.ownerteam != myTeam ) { @@ -6840,69 +6840,69 @@ bot_hq_loop() { 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; } - + // capture it - + self BotNotifyBotEvent( "hq", "go", "cap" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); self thread bot_hq_go_cap( gameobj, radio ); - + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( event != "new_goal" ) { self ClearScriptGoal(); } - + if ( event != "goal" ) { self.bot_lock_goal = false; return; } - + if ( !self istouching( gameobj.trigger ) || level.radio != radio ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "hq", "start", "cap" ); - + self SetScriptGoal( self.origin, 64 ); - + while ( self istouching( gameobj.trigger ) && gameobj.ownerteam != myTeam && level.radio == radio ) { cur = gameobj.curprogress; 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 ); } - + self ClearScriptGoal(); self.bot_lock_goal = false; - + self BotNotifyBotEvent( "hq", "stop", "cap" ); } else // we own it @@ -6910,34 +6910,34 @@ bot_hq_loop() if ( gameobj.objpoints[ myTeam ].isflashing ) // underattack { self BotNotifyBotEvent( "hq", "start", "defend" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); 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; - + self BotNotifyBotEvent( "hq", "stop", "defend" ); return; } - + 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(); @@ -6952,31 +6952,31 @@ bot_hq() { self endon( "death" ); self endon( "disconnect" ); - + if ( level.gametype != "koth" ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.radio ) ) { continue; } - + if ( !isdefined( level.radio.gameobject ) ) { continue; } - + self bot_hq_loop(); } } @@ -6991,27 +6991,27 @@ bot_hq_go_cap( obj, radio ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { 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" ); @@ -7032,29 +7032,29 @@ bot_hq_watch_flashing( obj, radio ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + myTeam = self.team; - + for ( ;; ) { wait 0.5; - + if ( !isdefined( obj ) ) { break; } - + if ( !obj.objpoints[ myTeam ].isflashing ) { break; } - + if ( level.radio != radio ) { break; } } - + self notify( "bad_path" ); } @@ -7065,18 +7065,18 @@ bot_sab_loop() { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + bomb = level.sabbomb; bombteam = bomb.ownerteam; carrier = bomb.carrier; timeleft = maps\mp\gametypes\_gamelogic::gettimeremaining() / 1000; - + // the bomb is ours, we are on the offence if ( bombteam == myTeam ) { site = level.bombzones[ otherTeam ]; origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 5 ); - + // protect our planted bomb if ( level.bombplanted ) { @@ -7084,41 +7084,41 @@ bot_sab_loop() if ( site isInUse() ) // somebody is defusing our bomb we planted { self BotNotifyBotEvent( "sab", "start", "defuser" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - + 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; - + self BotNotifyBotEvent( "sab", "stop", "defuser" ); return; } - + // 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; } - + // we are not the carrier if ( !self isBombCarrier() ) { @@ -7127,76 +7127,76 @@ bot_sab_loop() { 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; } - + // we are the carrier of the bomb, lets check if we need to plant timepassed = gettimepassed() / 1000; - + if ( timepassed < 120 && timeleft >= 90 && randomint( 100 ) < 98 ) { return; } - + self BotNotifyBotEvent( "sab", "go", "plant" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); - + self thread bot_go_plant( site ); 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() ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "sab", "start", "plant" ); - + self BotRandomStance(); self SetScriptGoal( self.origin, 64 ); self bot_wait_stop_move(); - + waitTime = ( site.usetime / 1000 ) + 2.5; self thread BotPressUse( waitTime ); wait waitTime; - + self ClearScriptGoal(); self.bot_lock_goal = false; - + self BotNotifyBotEvent( "sab", "stop", "plant" ); } else if ( bombteam == otherTeam ) // the bomb is theirs, we are on the defense { site = level.bombzones[ myTeam ]; - + if ( !isdefined( site.bots ) ) { site.bots = 0; } - + // protect our site from planters if ( !level.bombplanted ) { @@ -7207,51 +7207,51 @@ bot_sab_loop() { return; } - + if ( carrier _hasperk( "specialty_coldblooded" ) ) { return; } - + origin = carrier.origin; - + self SetScriptGoal( origin, 64 ); self thread bot_escort_obj( bomb, carrier ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); } - + return; } - + // protect bomb site origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 5 ); - + self thread bot_inc_bots( site ); - + if ( site isInUse() ) // somebody is planting { self BotNotifyBotEvent( "sab", "start", "planter" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); self thread bot_inc_bots( site ); - + 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; - + self BotNotifyBotEvent( "sab", "stop", "planter" ); return; } - + // else hang around the site if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) { @@ -7260,23 +7260,23 @@ bot_sab_loop() site.bots--; return; } - + self.bot_lock_goal = true; self SetScriptGoal( origin, 256 ); 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; } - + // bomb is planted we need to defuse origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 5 ); - + // someone else is defusing, lets just hang around if ( site.bots > 1 ) { @@ -7284,78 +7284,78 @@ bot_sab_loop() { 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; } - + // lets go defuse self BotNotifyBotEvent( "sab", "go", "defuse" ); - + self.bot_lock_goal = true; - + self SetScriptGoal( origin, 1 ); self thread bot_inc_bots( site ); self thread bot_go_defuse( site ); - + 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() ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "sab", "start", "defuse" ); - + self BotRandomStance(); self SetScriptGoal( self.origin, 64 ); self bot_wait_stop_move(); - + waitTime = ( site.usetime / 1000 ) + 2.5; self thread BotPressUse( waitTime ); wait waitTime; - + self ClearScriptGoal(); self.bot_lock_goal = false; - + self BotNotifyBotEvent( "sab", "stop", "defuse" ); } else // we need to go get the bomb! { origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 5 ); - + self BotNotifyBotEvent( "sab", "start", "bomb" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - + 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; - + self BotNotifyBotEvent( "sab", "stop", "bomb" ); return; } @@ -7369,36 +7369,36 @@ bot_sab() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "sab" ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.sabbomb ) ) { continue; } - + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) { continue; } - + if ( self isPlanting() || self isDefusing() ) { continue; } - + self bot_sab_loop(); } } @@ -7410,69 +7410,69 @@ bot_sd_defenders_loop( data ) { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + // bomb not planted, lets protect our sites if ( !level.bombplanted ) { 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 ) ) { bomb = level.sdbomb; carrier = level.sdbomb.carrier; - + if ( !isdefined( carrier ) ) { origin = ( bomb.curorigin[ 0 ], bomb.curorigin[ 1 ], bomb.curorigin[ 2 ] + 5 ); - + // 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; } } - + // pick a site to protect if ( !isdefined( level.bombzones ) || !level.bombzones.size ) { return; } - + sites = []; - + for ( i = 0; i < level.bombzones.size; i++ ) { sites[ sites.size ] = level.bombzones[ i ]; } - + if ( !sites.size ) { return; } - + if ( data.rand > 50 ) { site = self bot_array_nearest_curorigin( sites ); @@ -7481,67 +7481,67 @@ bot_sd_defenders_loop( data ) { site = random( sites ); } - + if ( !isdefined( site ) ) { return; } - + origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 5 ); - + if ( site isInUse() ) // somebody is planting { self BotNotifyBotEvent( "sd", "start", "planter", site ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - + 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; - + self BotNotifyBotEvent( "sd", "stop", "planter", site ); return; } - + // 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; } - + // 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 ); - + // someone is going to go defuse ,lets just hang around if ( defuse.bots > 1 ) { @@ -7549,57 +7549,57 @@ bot_sd_defenders_loop( data ) { 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; } - + // lets defuse self BotNotifyBotEvent( "sd", "go", "defuse" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); self thread bot_inc_bots( defuse ); self thread bot_go_defuse( defuse ); - + 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() ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "sd", "start", "defuse" ); - + self BotRandomStance(); self SetScriptGoal( self.origin, 64 ); self bot_wait_stop_move(); - + waitTime = ( defuse.usetime / 1000 ) + 2.5; self thread BotPressUse( waitTime ); wait waitTime; - + self ClearScriptGoal(); self.bot_lock_goal = false; - + self BotNotifyBotEvent( "sd", "stop", "defuse" ); } @@ -7611,34 +7611,34 @@ bot_sd_defenders() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "sd" ) { return; } - + if ( self.team == game[ "attackers" ] ) { return; } - + data = spawnstruct(); data.rand = self BotGetRandom(); - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( self isPlanting() || self isDefusing() ) { continue; } - + self bot_sd_defenders_loop( data ); } } @@ -7656,15 +7656,15 @@ bot_sd_attackers_loop( data ) { wait( randomintrange( 3, 5 ) ); } - + if ( self isusingremote() || self.bot_lock_goal ) { return; } - + myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + // bomb planted if ( level.bombplanted ) { @@ -7672,53 +7672,53 @@ bot_sd_attackers_loop( data ) { return; } - + site = level.defuseobject; - + origin = ( site.curorigin[ 0 ], site.curorigin[ 1 ], site.curorigin[ 2 ] + 5 ); - + if ( site isInUse() ) // somebody is defusing { self BotNotifyBotEvent( "sd", "start", "defuser" ); - + self.bot_lock_goal = true; - + self SetScriptGoal( origin, 64 ); - + 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; - + self BotNotifyBotEvent( "sd", "stop", "defuser" ); return; } - + // 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; } - + timeleft = maps\mp\gametypes\_gamelogic::gettimeremaining() / 1000; timepassed = gettimepassed() / 1000; - + // dont have a bomb if ( !self isBombCarrier() && !level.multibomb ) { @@ -7726,10 +7726,10 @@ bot_sd_attackers_loop( data ) { return; } - + bomb = level.sdbomb; carrier = level.sdbomb.carrier; - + // bomb is picked up if ( isdefined( carrier ) ) { @@ -7738,32 +7738,32 @@ bot_sd_attackers_loop( data ) { 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 ); - + // hang around the bomb if other is going to go get it if ( bomb.bots > 1 ) { @@ -7771,66 +7771,66 @@ bot_sd_attackers_loop( data ) { 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; } - + // go get the bomb self BotNotifyBotEvent( "sd", "start", "bomb" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); self thread bot_inc_bots( bomb ); 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; - + self BotNotifyBotEvent( "sd", "stop", "bomb" ); return; } - + // check if to plant if ( timepassed < 120 && timeleft >= 90 && randomint( 100 ) < 98 ) { return; } - + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) { return; } - + sites = []; - + for ( i = 0; i < level.bombzones.size; i++ ) { sites[ sites.size ] = level.bombzones[ i ]; } - + if ( !sites.size ) { return; } - + if ( data.rand > 50 ) { plant = self bot_array_nearest_curorigin( sites ); @@ -7839,46 +7839,46 @@ bot_sd_attackers_loop( data ) { plant = random( sites ); } - + if ( !isdefined( plant ) ) { return; } - + origin = ( plant.curorigin[ 0 ] + 50, plant.curorigin[ 1 ] + 50, plant.curorigin[ 2 ] + 5 ); - + self BotNotifyBotEvent( "sd", "go", "plant", plant ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); self thread bot_go_plant( plant ); - + 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() ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "sd", "start", "plant", plant ); - + self BotRandomStance(); self SetScriptGoal( self.origin, 64 ); self bot_wait_stop_move(); - + waitTime = ( plant.usetime / 1000 ) + 2.5; self thread BotPressUse( waitTime ); wait waitTime; - + self ClearScriptGoal(); self.bot_lock_goal = false; - + self BotNotifyBotEvent( "sd", "stop", "plant", plant ); } @@ -7890,21 +7890,21 @@ bot_sd_attackers() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "sd" ) { return; } - + if ( self.team != game[ "attackers" ] ) { return; } - + data = spawnstruct(); data.rand = self BotGetRandom(); data.first = true; - + for ( ;; ) { self bot_sd_attackers_loop( data ); @@ -7918,36 +7918,36 @@ bot_cap_loop() { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + myflag = level.teamflags[ myTeam ]; myzone = level.capzones[ myTeam ]; - + theirflag = level.teamflags[ otherTeam ]; theirzone = level.capzones[ otherTeam ]; - + if ( !myflag maps\mp\gametypes\_gameobjects::ishome() ) { carrier = myflag.carrier; - + if ( !isdefined( carrier ) ) // someone doesnt has our flag { if ( !isdefined( theirflag.carrier ) && distancesquared( self.origin, theirflag.curorigin ) < distancesquared( self.origin, myflag.curorigin ) ) // no one has their flag and its closer { self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); - + self bot_cap_get_flag( theirflag ); - + self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); } else // go get it { self BotNotifyBotEvent( "cap", "start", "my_flag", myflag ); - + self bot_cap_get_flag( myflag ); - + self BotNotifyBotEvent( "cap", "stop", "my_flag", myflag ); } - + return; } else @@ -7956,9 +7956,9 @@ bot_cap_loop() { // take their flag self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); - + self bot_cap_get_flag( theirflag ); - + self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); } else @@ -7967,14 +7967,14 @@ bot_cap_loop() { return; } - + if ( !isdefined( theirzone.bots ) ) { theirzone.bots = 0; } - + origin = theirzone.curorigin; - + if ( theirzone.bots > 2 || randomint( 100 ) < 45 ) { // kill carrier @@ -7982,22 +7982,22 @@ bot_cap_loop() { return; } - + origin = carrier.origin; - + self SetScriptGoal( origin, 64 ); self thread bot_escort_obj( myflag, carrier ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); } - + return; } - + self thread bot_inc_bots( theirzone ); - + // camp their zone if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) { @@ -8006,11 +8006,11 @@ bot_cap_loop() theirzone.bots--; return; } - + self SetScriptGoal( origin, 256 ); self thread bot_inc_bots( theirzone ); self thread bot_escort_obj( myflag, carrier ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); @@ -8024,57 +8024,57 @@ bot_cap_loop() { // go cap origin = myzone.curorigin; - + self BotNotifyBotEvent( "cap", "start", "cap" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 32 ); - + self thread bot_get_obj( myflag ); evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + wait 1; - + if ( evt != "new_goal" ) { self ClearScriptGoal(); } - + self.bot_lock_goal = false; - + self BotNotifyBotEvent( "cap", "stop", "cap" ); return; } - + carrier = theirflag.carrier; - + if ( !isdefined( carrier ) ) // if no one has enemy flag { self BotNotifyBotEvent( "cap", "start", "their_flag", theirflag ); - + self bot_cap_get_flag( theirflag ); - + self BotNotifyBotEvent( "cap", "stop", "their_flag", theirflag ); return; } - + // 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(); @@ -8090,31 +8090,31 @@ bot_cap() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "ctf" ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.capzones ) ) { continue; } - + if ( !isdefined( level.teamflags ) ) { continue; } - + self bot_cap_loop(); } } @@ -8125,12 +8125,12 @@ bot_cap() getCarrierEntNum() { carrierNum = -1; - + if ( isdefined( self.carrier ) ) { carrierNum = self.carrier getentitynumber(); } - + return carrierNum; } @@ -8140,43 +8140,43 @@ getCarrierEntNum() bot_cap_get_flag( flag ) { origin = flag.curorigin; - + // go get it - + self.bot_lock_goal = true; self SetScriptGoal( origin, 32 ); - + self thread bot_get_obj( flag ); - + evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( evt != "new_goal" ) { self ClearScriptGoal(); } - + if ( evt != "goal" ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); curCarrier = flag getCarrierEntNum(); - + while ( curCarrier == flag getCarrierEntNum() && self istouching( flag.trigger ) ) { cur = flag.curprogress; wait 0.5; - + if ( flag.curprogress == cur ) { break; // some enemy is near us, kill him } } - + self ClearScriptGoal(); - + self.bot_lock_goal = false; } @@ -8191,22 +8191,22 @@ bot_dem_go_plant( plant ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { 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" ); @@ -8228,20 +8228,20 @@ bot_dem_attack_spawnkill() self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + l1 = level.bombaplanted; l2 = level.bombbplanted; - + for ( ;; ) { wait 0.5; - + if ( l1 != level.bombaplanted || l2 != level.bombbplanted ) { break; } } - + self notify( "bad_path" ); } @@ -8252,21 +8252,21 @@ bot_dem_attackers_loop() { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + bombs = []; // sites with bombs sites = []; // sites to bomb at bombed = 0; // exploded sites - + for ( i = 0; i < level.bombzones.size; i++ ) { bomb = level.bombzones[ i ]; - + if ( isdefined( bomb.bombexploded ) && bomb.bombexploded ) { bombed++; continue; } - + if ( bomb.label == "_a" ) { if ( level.bombaplanted ) @@ -8277,10 +8277,10 @@ bot_dem_attackers_loop() { sites[ sites.size ] = bomb; } - + continue; } - + if ( bomb.label == "_b" ) { if ( level.bombbplanted ) @@ -8291,15 +8291,15 @@ bot_dem_attackers_loop() { sites[ sites.size ] = bomb; } - + continue; } } - + timeleft = maps\mp\gametypes\_gamelogic::gettimeremaining() / 1000; - + shouldLet = ( game[ "teamScores" ][ myTeam ] > game[ "teamScores" ][ otherTeam ] && timeleft < 90 && bombed == 1 ); - + // spawnkill conditions // if we have bombed one site or 1 bomb is planted with lots of time left, spawn kill // if we want the other team to win for overtime and they do not need to defuse, spawn kill @@ -8309,129 +8309,129 @@ bot_dem_attackers_loop() { 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; } - + // let defuse conditions // if enemy is going to lose and lots of time left, let them defuse to play longer // or if want to go into overtime near end of the extended game if ( ( ( bombs.size + bombed == 2 && timeleft >= 90 ) || ( shouldLet && bombs.size ) ) && randomint( 100 ) < 95 ) { 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; } - + // defend bomb conditions // if time is running out and we have a bomb planted if ( bombs.size && timeleft < 90 && ( !sites.size || randomint( 100 ) < 95 ) ) { site = self bot_array_nearest_curorigin( bombs ); origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 5 ); - + if ( site isInUse() ) // somebody is defusing { self BotNotifyBotEvent( "dem", "start", "defuser", site ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - + 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; - + self BotNotifyBotEvent( "dem", "stop", "defuser", site ); return; } - + // 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; } - + // 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 ); - + // hang around the site if lots of time left if ( plant.bots > 1 && timeleft >= 60 ) { @@ -8439,58 +8439,58 @@ bot_dem_attackers_loop() { 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; } - + self BotNotifyBotEvent( "dem", "go", "plant", plant ); - + self.bot_lock_goal = true; - + self SetScriptGoal( origin, 1 ); self thread bot_inc_bots( plant ); self thread bot_dem_go_plant( plant ); - + 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() ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "dem", "start", "plant", plant ); - + self BotRandomStance(); self SetScriptGoal( self.origin, 64 ); self bot_wait_stop_move(); - + waitTime = ( plant.usetime / 1000 ) + 2.5; self thread BotPressUse( waitTime ); wait waitTime; - + self ClearScriptGoal(); - + self.bot_lock_goal = false; - + self BotNotifyBotEvent( "dem", "stop", "plant", plant ); } @@ -8502,36 +8502,36 @@ bot_dem_attackers() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "dd" ) { return; } - + if ( self.team != game[ "attackers" ] ) { return; } - + if ( inovertime() ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) { continue; } - + self bot_dem_attackers_loop(); } } @@ -8543,21 +8543,21 @@ bot_dem_defenders_loop() { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + bombs = []; // sites with bombs sites = []; // sites to bomb at bombed = 0; // exploded sites - + for ( i = 0; i < level.bombzones.size; i++ ) { bomb = level.bombzones[ i ]; - + if ( isdefined( bomb.bombexploded ) && bomb.bombexploded ) { bombed++; continue; } - + if ( bomb.label == "_a" ) { if ( level.bombaplanted ) @@ -8568,10 +8568,10 @@ bot_dem_defenders_loop() { sites[ sites.size ] = bomb; } - + continue; } - + if ( bomb.label == "_b" ) { if ( level.bombbplanted ) @@ -8582,15 +8582,15 @@ bot_dem_defenders_loop() { sites[ sites.size ] = bomb; } - + continue; } } - + timeleft = maps\mp\gametypes\_gamelogic::gettimeremaining() / 1000; - + shouldLet = ( timeleft < 60 && ( ( bombed == 0 && bombs.size != 2 ) || ( game[ "teamScores" ][ myTeam ] > game[ "teamScores" ][ otherTeam ] && bombed == 1 ) ) && randomint( 100 ) < 98 ); - + // spawnkill conditions // if nothing to defuse with a lot of time left, spawn kill // or letting a bomb site to explode but a bomb is planted, so spawnkill @@ -8600,131 +8600,131 @@ bot_dem_defenders_loop() { 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; } - + // let blow up conditions // let enemy blow up at least one to extend play time // or if want to go into overtime after extended game if ( shouldLet ) { 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; } - + // defend conditions // if no bombs planted with little time left if ( !bombs.size && timeleft < 60 && randomint( 100 ) < 95 && sites.size ) { site = self bot_array_nearest_curorigin( sites ); origin = ( site.curorigin[ 0 ] + 50, site.curorigin[ 1 ] + 50, site.curorigin[ 2 ] + 5 ); - + if ( site isInUse() ) // somebody is planting { self BotNotifyBotEvent( "dem", "start", "planter", site ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - + 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; - + self BotNotifyBotEvent( "dem", "stop", "planter", site ); return; } - + // 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; } - + // 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 ); - + // hang around the site if not in danger of losing if ( defuse.bots > 1 && bombed + bombs.size != 2 ) { @@ -8732,59 +8732,59 @@ bot_dem_defenders_loop() { 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; } - + self BotNotifyBotEvent( "dem", "go", "defuse", defuse ); - + self.bot_lock_goal = true; - + self SetScriptGoal( origin, 1 ); self thread bot_inc_bots( defuse ); self thread bot_dem_go_defuse( defuse ); - + 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() ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "dem", "start", "defuse", defuse ); - + self BotRandomStance(); self SetScriptGoal( self.origin, 64 ); self bot_wait_stop_move(); - + waitTime = ( defuse.usetime / 1000 ) + 2.5; self thread BotPressUse( waitTime ); wait waitTime; - + self ClearScriptGoal(); - + self.bot_lock_goal = false; - + self BotNotifyBotEvent( "dem", "stop", "defuse", defuse ); } @@ -8796,36 +8796,36 @@ bot_dem_defenders() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "dd" ) { return; } - + if ( self.team == game[ "attackers" ] ) { return; } - + if ( inovertime() ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) { continue; } - + self bot_dem_defenders_loop(); } } @@ -8838,37 +8838,37 @@ bot_dem_overtime() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "dd" ) { return; } - + if ( !inovertime() ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.bombzones ) || !level.bombzones.size ) { continue; } - + if ( !level.bombzones[ 0 ].bombplanted || !level.bombzones[ 0 ] maps\mp\gametypes\_gameobjects::isfriendlyteam( self.team ) ) { self bot_dem_attackers_loop(); continue; } - + self bot_dem_defenders_loop(); } } @@ -8884,22 +8884,22 @@ bot_dem_go_defuse( defuse ) self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { 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" ); @@ -8921,17 +8921,17 @@ bot_dem_defend_spawnkill() self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + for ( ;; ) { wait 0.5; - + if ( level.bombbplanted || level.bombaplanted ) { break; } } - + self notify( "bad_path" ); } @@ -8941,65 +8941,65 @@ bot_dem_defend_spawnkill() bot_think_revive_loop() { needsRevives = []; - + for ( i = 0; i < level.players.size; i++ ) { 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 ); - + self BotNotifyBotEvent( "revive", "go", revive ); self.bot_lock_goal = true; - + self SetScriptGoal( revive.origin, 64 ); self thread stop_go_target_on_death( revive ); - + 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 ); - + self BotFreezeControls( true ); self bot_wait_stop_move(); - + waitTime = 3.25; self thread BotPressUse( waitTime ); wait waitTime; - + self BotFreezeControls( false ); - + self BotNotifyBotEvent( "revive", "stop", revive ); } @@ -9011,36 +9011,36 @@ bot_think_revive() self endon( "death" ); self endon( "disconnect" ); 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(); } } @@ -9054,88 +9054,88 @@ bot_gtnw_loop() theirteam = getotherteam( myTeam ); origin = level.nukesite.trigger.origin; trigger = level.nukesite.trigger; - + ourCapCount = level.nukesite.touchlist[ myTeam ]; theirCapCount = level.nukesite.touchlist[ theirteam ]; rand = self BotGetRandom(); - + if ( ( !ourCapCount && !theirCapCount ) || rand <= 20 ) { // go cap the obj self BotNotifyBotEvent( "gtnw", "go", "cap" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); self thread bots_watch_touch_obj( trigger ); - + ret = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( ret != "new_goal" ) { self ClearScriptGoal(); } - + if ( ret != "goal" || !self istouching( trigger ) ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "gtnw", "start", "cap" ); - + self SetScriptGoal( self.origin, 64 ); - + while ( self istouching( trigger ) ) { cur = level.nukesite.curprogress; 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 ); } - + self ClearScriptGoal(); self.bot_lock_goal = false; - + self BotNotifyBotEvent( "gtnw", "stop", "cap" ); return; } - + if ( theirCapCount ) { // kill capturtour self.bot_lock_goal = true; - + self SetScriptGoal( origin, 64 ); 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; } - + // 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; } @@ -9147,26 +9147,26 @@ bot_gtnw() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "gtnw" ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.nukesite ) || !isdefined( level.nukesite.trigger ) ) { continue; } - + self bot_gtnw_loop(); } } @@ -9178,39 +9178,39 @@ bot_oneflag_loop() { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + if ( myTeam == game[ "attackers" ] ) { myzone = level.capzones[ myTeam ]; theirflag = level.teamflags[ otherTeam ]; - + if ( self isFlagCarrier() ) { // go cap origin = myzone.curorigin; - + self BotNotifyBotEvent( "oneflag", "start", "cap" ); - + self.bot_lock_goal = true; self SetScriptGoal( origin, 32 ); - + evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + wait 1; - + if ( evt != "new_goal" ) { self ClearScriptGoal(); } - + self.bot_lock_goal = false; - + self BotNotifyBotEvent( "oneflag", "stop", "cap" ); return; } - + carrier = theirflag.carrier; - + if ( !isdefined( carrier ) ) // if no one has enemy flag { self BotNotifyBotEvent( "oneflag", "start", "their_flag" ); @@ -9218,24 +9218,24 @@ bot_oneflag_loop() self BotNotifyBotEvent( "oneflag", "stop", "their_flag" ); return; } - + // 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(); @@ -9245,11 +9245,11 @@ bot_oneflag_loop() { myflag = level.teamflags[ myTeam ]; theirzone = level.capzones[ otherTeam ]; - + if ( !myflag maps\mp\gametypes\_gameobjects::ishome() ) { carrier = myflag.carrier; - + if ( !isdefined( carrier ) ) // someone doesnt has our flag { self BotNotifyBotEvent( "oneflag", "start", "my_flag" ); @@ -9257,19 +9257,19 @@ bot_oneflag_loop() self BotNotifyBotEvent( "oneflag", "stop", "my_flag" ); return; } - + if ( self HasScriptGoal() ) { return; } - + if ( !isdefined( theirzone.bots ) ) { theirzone.bots = 0; } - + origin = theirzone.curorigin; - + if ( theirzone.bots > 2 || randomint( 100 ) < 45 ) { // kill carrier @@ -9277,22 +9277,22 @@ bot_oneflag_loop() { return; } - + origin = carrier.origin; - + self SetScriptGoal( origin, 64 ); self thread bot_escort_obj( myflag, carrier ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); } - + return; } - + self thread bot_inc_bots( theirzone ); - + // camp their zone if ( distancesquared( origin, self.origin ) <= 1024 * 1024 ) { @@ -9301,11 +9301,11 @@ bot_oneflag_loop() theirzone.bots--; return; } - + self SetScriptGoal( origin, 256 ); self thread bot_inc_bots( theirzone ); self thread bot_escort_obj( myflag, carrier ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); @@ -9318,17 +9318,17 @@ bot_oneflag_loop() { 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(); @@ -9345,26 +9345,26 @@ bot_oneflag() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "oneflag" ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.capzones ) || !isdefined( level.teamflags ) ) { continue; } - + self bot_oneflag_loop(); } } @@ -9376,45 +9376,45 @@ bot_arena_loop() { flag = level.arenaflag; myTeam = self.team; - + self BotNotifyBotEvent( "arena", "go", "cap" ); - + self.bot_lock_goal = true; self SetScriptGoal( flag.trigger.origin, 64 ); - + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + if ( event != "new_goal" ) { self ClearScriptGoal(); } - + if ( event != "goal" || !self istouching( flag.trigger ) ) { self.bot_lock_goal = false; return; } - + self BotNotifyBotEvent( "arena", "start", "cap" ); - + self SetScriptGoal( self.origin, 64 ); - + while ( self istouching( flag.trigger ) && flag.ownerteam != myTeam ) { cur = flag.curprogress; 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 ); } - + self ClearScriptGoal(); self.bot_lock_goal = false; - + self BotNotifyBotEvent( "arena", "stop", "cap" ); } @@ -9426,26 +9426,26 @@ bot_arena() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "arena" ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.arenaflag ) ) { continue; } - + self bot_arena_loop(); } } @@ -9462,22 +9462,22 @@ bot_arena() bot_vip_loop() { vip = undefined; - + for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( !isreallyalive( player ) ) { continue; } - + if ( isdefined( player.isvip ) && player.isvip ) { vip = player; } } - + if ( self.team == game[ "defenders" ] ) { if ( isdefined( self.isvip ) && self.isvip ) @@ -9486,21 +9486,21 @@ bot_vip_loop() { // go to extraction zone self BotNotifyBotEvent( "vip", "start", "cap" ); - + self.bot_lock_goal = true; self SetScriptGoal( level.extractionzone.trigger.origin, 32 ); - + evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + wait 1; - + if ( evt != "new_goal" ) { self ClearScriptGoal(); } - + self.bot_lock_goal = false; - + self BotNotifyBotEvent( "vip", "stop", "cap" ); } } @@ -9511,9 +9511,9 @@ bot_vip_loop() { return; } - + self SetScriptGoal( vip.origin, 256 ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); @@ -9529,9 +9529,9 @@ bot_vip_loop() { return; } - + self SetScriptGoal( level.extractionzone.trigger.origin, 256 ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); @@ -9541,7 +9541,7 @@ bot_vip_loop() { // kill the vip self SetScriptGoal( vip.origin, 32 ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); @@ -9558,21 +9558,21 @@ bot_vip() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "vip" ) { return; } - + for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + self bot_vip_loop(); } } @@ -9585,40 +9585,40 @@ bot_conf_loop() dog_tag_keys = getarraykeys( level.dogtags ); tags = []; tag = undefined; - + for ( i = 0; i < dog_tag_keys.size; i++ ) { 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; } - + if ( randomint( 2 ) ) { for ( i = 0; i < tags.size; i++ ) { temp_tag = tags[ i ]; - + if ( !isdefined( tag ) || distancesquared( self.origin, temp_tag.trigger.origin ) < distancesquared( self.origin, tag.trigger.origin ) ) { tag = temp_tag; @@ -9629,26 +9629,26 @@ bot_conf_loop() { tag = random( tags ); } - + if ( !isdefined( tag ) ) { return; } - + self BotNotifyBotEvent( "conf", "start", "cap", tag ); - + self.bot_lock_goal = true; self SetScriptGoal( tag.trigger.origin, 16 ); self thread bot_inc_bots( tag, true ); 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; - + self BotNotifyBotEvent( "conf", "stop", "cap", tag ); } @@ -9660,26 +9660,26 @@ bot_conf() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "conf" ) { return; } - + for ( ;; ) { wait( randomintrange( 1, 2 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.dogtags ) ) { continue; } - + self bot_conf_loop(); } } @@ -9694,24 +9694,24 @@ bots_watch_grnd() self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + grnd_origin = level.grnd_zone.origin; - + for ( ;; ) { 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" ); @@ -9730,39 +9730,39 @@ bot_grnd_loop() if ( isdefined( self.ingrindzone ) && self.ingrindzone && isreallyalive( self ) && self.pers[ "team" ] != "spectator" && self maps\mp\gametypes\grnd::isingrindzone() ) { // in the grnd zone - + if ( level.grnd_numplayers[ level.otherteam[ self.team ] ] ) { // hunt enemy in drop zone target = undefined; - + for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( isdefined( player.ingrindzone ) && player.ingrindzone && isreallyalive( player ) && player.pers[ "team" ] != "spectator" && player maps\mp\gametypes\grnd::isingrindzone() ) { target = player; - + if ( cointoss() ) { break; } } } - + if ( isdefined( target ) ) { self BotNotifyBotEvent( "grnd", "start", "kill", target ); - + self SetScriptGoal( target.origin, 32 ); 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 ); } } @@ -9771,48 +9771,48 @@ bot_grnd_loop() // stay in the zone goal = self.origin; self SetScriptGoal( goal, 64 ); - + self BotNotifyBotEvent( "grnd", "start", "cap" ); - + while ( self HasScriptGoal() && self GetScriptGoal() == goal && self maps\mp\gametypes\grnd::isingrindzone() ) { if ( level.grnd_numplayers[ level.otherteam[ self.team ] ] ) { break; } - + wait 0.5; - + self thread bot_do_random_action_for_objective( level.grnd_zone ); } - + if ( self HasScriptGoal() && self GetScriptGoal() == goal ) { self ClearScriptGoal(); } - + self BotNotifyBotEvent( "grnd", "stop", "cap" ); } - + return; } - + if ( randomint( 100 ) < 40 || level.grnd_numplayers[ self.team ] <= 0 ) { self BotNotifyBotEvent( "grnd", "start", "go_cap" ); - + // go to grnd zone self.bot_lock_goal = true; self SetScriptGoal( level.grnd_zone.origin, 32 ); self thread bots_watch_grnd(); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); } - + self.bot_lock_goal = false; - + self BotNotifyBotEvent( "grnd", "stop", "go_cap" ); } } @@ -9825,26 +9825,26 @@ bot_grnd() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "grnd" ) { return; } - + for ( ;; ) { wait( randomintrange( 1, 3 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.grnd_zone ) ) { continue; } - + self bot_grnd_loop(); } } @@ -9862,11 +9862,11 @@ bot_tdef_loop() { 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(); @@ -9879,15 +9879,15 @@ bot_tdef_loop() { 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(); @@ -9898,72 +9898,72 @@ bot_tdef_loop() // we haev flag, lets run away from enemies avg_org = ( 0, 0, 0 ); count = 0; - + for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( !isdefined( player.team ) ) { continue; } - + if ( !isreallyalive( player ) ) { continue; } - + if ( player.team == self.team ) { continue; } - + count++; avg_org += player.origin; } - + if ( count ) { avg_org /= count; wps = []; - + for ( i = 0; i < level.waypoints.size; i++ ) { wp = level.waypoints[ i ]; - + if ( distancesquared( wp.origin, avg_org ) < 1024 * 1024 ) { continue; } - + wps[ wps.size ] = wp; } - + wp = random( wps ); - + if ( isdefined( wp ) ) { self.bot_lock_goal = true; self SetScriptGoal( wp.origin, 256 ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); } - + self.bot_lock_goal = false; } } } - + return; } - + // go get it self BotNotifyBotEvent( "tdef", "start", "cap" ); - + self bot_cap_get_flag( level.gameflag ); - + self BotNotifyBotEvent( "tdef", "stop", "cap" ); } @@ -9975,26 +9975,26 @@ bot_tdef() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "tdef" ) { return; } - + for ( ;; ) { wait( randomintrange( 1, 3 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + if ( !isdefined( level.gameflag ) ) { continue; } - + self bot_tdef_loop(); } } @@ -10008,41 +10008,41 @@ bot_infect_loop() { return; } - + if ( self.team == "axis" ) { target = undefined; - + for ( i = 0; i < level.players.size; i++ ) { 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 ) ) { target = player; } } - + if ( isdefined( target ) ) { self SetScriptGoal( target.origin, 32 ); self thread stop_go_target_on_death( target ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); @@ -10059,21 +10059,21 @@ bot_infect() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "infect" ) { return; } - + for ( ;; ) { wait( randomintrange( 1, 3 ) ); - + if ( self isusingremote() || self.bot_lock_goal ) { continue; } - + self bot_infect_loop(); } } diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index 1a3f38c..40c0046 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -20,7 +20,7 @@ wait_for_builtins() { return true; } - + if ( i < 18 ) { waittillframeend; @@ -30,7 +30,7 @@ wait_for_builtins() wait 0.05; } } - + return false; } @@ -65,7 +65,7 @@ BotBuiltinFileRead( file ) { return [[ level.bot_builtins[ "fileread" ] ]]( file ); } - + return undefined; } @@ -78,7 +78,7 @@ BotBuiltinFileExists( file ) { return [[ level.bot_builtins[ "fileexists" ] ]]( file ); } - + return false; } @@ -143,35 +143,35 @@ is_host() doHostCheck() { self.pers[ "bot_host" ] = false; - + if ( self is_bot() ) { return; } - + result = false; - + if ( getdvar( "bots_main_firstIsHost" ) != "0" ) { BotBuiltinPrintConsole( "WARNING: bots_main_firstIsHost is enabled" ); - + if ( getdvar( "bots_main_firstIsHost" ) == "1" ) { setdvar( "bots_main_firstIsHost", self getguid() ); } - + if ( getdvar( "bots_main_firstIsHost" ) == self getguid() + "" ) { result = true; } } - + DvarGUID = getdvar( "bots_main_GUIDs" ); - + if ( DvarGUID != "" ) { guids = strtok( DvarGUID, "," ); - + for ( i = 0; i < guids.size; i++ ) { if ( self getguid() + "" == guids[ i ] ) @@ -180,12 +180,12 @@ doHostCheck() } } } - + if ( !self ishost() && !result ) { return; } - + self.pers[ "bot_host" ] = true; } @@ -196,7 +196,7 @@ is_bot() { assert( isdefined( self ) ); assert( isplayer( self ) ); - + return ( ( isdefined( self.pers[ "isBot" ] ) && self.pers[ "isBot" ] ) || ( isdefined( self.pers[ "isBotWarfare" ] ) && self.pers[ "isBotWarfare" ] ) || issubstr( self getguid() + "", "bot" ) ); } @@ -210,11 +210,11 @@ BotSetStance( stance ) case "stand": self maps\mp\bots\_bot_internal::stand(); break; - + case "crouch": self maps\mp\bots\_bot_internal::crouch(); break; - + case "prone": self maps\mp\bots\_bot_internal::prone(); break; @@ -270,7 +270,7 @@ BotGetTargetRandom() { return undefined; } - + return self.bot.target.rand; } @@ -328,7 +328,7 @@ IsBotKnifing() BotFreezeControls( what ) { self.bot.isfrozen = what; - + if ( what ) { self notify( "kill_goal" ); @@ -349,7 +349,7 @@ BotIsFrozen() BotStopMoving( what ) { self.bot.stop_move = what; - + if ( what ) { self notify( "kill_goal" ); @@ -382,7 +382,7 @@ SetScriptGoal( goal, dist ) { dist = 16; } - + self.bot.script_goal = goal; self.bot.script_goal_dist = dist; waittillframeend; @@ -523,7 +523,7 @@ getThreat() { return undefined; } - + return self.bot.target.entity; } @@ -629,22 +629,22 @@ isArtShocked() getValidTube() { weaps = self getweaponslistall(); - + for ( i = 0; i < weaps.size; i++ ) { 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; } @@ -667,7 +667,7 @@ waittill_either_return( str1, str2 ) { return str1; } - + return str2; } @@ -684,24 +684,24 @@ getValidGrenade() grenadeTypes[ grenadeTypes.size ] = "semtex_mp"; grenadeTypes[ grenadeTypes.size ] = "throwingknife_mp"; grenadeTypes[ grenadeTypes.size ] = "emp_grenade_mp"; - + possibles = []; - + for ( i = 0; i < grenadeTypes.size; i++ ) { if ( !self hasweapon( grenadeTypes[ i ] ) ) { continue; } - + if ( !self getammocount( grenadeTypes[ i ] ) ) { continue; } - + possibles[ possibles.size ] = grenadeTypes[ i ]; } - + return random( possibles ); } @@ -727,12 +727,12 @@ entIsVehicle( ent ) WeaponIsFullAuto( weap ) { weaptoks = strtok( weap, "_" ); - + if ( weaptoks.size < 2 ) { return false; } - + return isdefined( level.bots_fullautoguns[ weaptoks[ 1 ] ] ); } @@ -767,27 +767,27 @@ notifyAfterDelay( delay, not ) getBotToKick() { bots = getBotArray(); - + if ( !isdefined( bots ) || !isdefined( bots.size ) || bots.size <= 0 || !isdefined( bots[ 0 ] ) ) { return undefined; } - + tokick = undefined; axis = 0; allies = 0; team = getdvar( "bots_team" ); - + // count teams for ( i = 0; i < bots.size; i++ ) { bot = bots[ i ]; - + if ( !isdefined( bot ) || !isdefined( bot.team ) ) { continue; } - + if ( bot.team == "allies" ) { allies++; @@ -801,7 +801,7 @@ getBotToKick() return bot; } } - + // search for a bot on the other team if ( team == "custom" || team == "axis" ) { @@ -811,7 +811,7 @@ getBotToKick() { // get the team with the most bots team = "allies"; - + if ( axis > allies ) { team = "axis"; @@ -821,63 +821,63 @@ getBotToKick() { team = "axis"; } - + // get the bot on this team with lowest skill for ( i = 0; i < bots.size; i++ ) { 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++ ) { 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; } - + return tokick; } @@ -889,15 +889,15 @@ GetHostPlayer() for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( !player is_host() ) { continue; } - + return player; } - + return undefined; } @@ -907,51 +907,51 @@ GetHostPlayer() 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; } } @@ -964,17 +964,17 @@ RaySphereIntersect( start, end, spherePos, radius ) { // check if the start or end points are in the sphere 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; a = dp[ 0 ] * dp[ 0 ] + dp[ 1 ] * dp[ 1 ] + dp[ 2 ] * dp[ 2 ]; @@ -984,35 +984,35 @@ RaySphereIntersect( start, end, spherePos, radius ) c -= 2.0 * ( spherePos[ 0 ] * start[ 0 ] + spherePos[ 1 ] * start[ 1 ] + spherePos[ 2 ] * start[ 2 ] ); c -= radius * 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); - + // intersection points of the sphere ip1 = start + mu1 * dp; // ip2 = start + mu2 * dp; - + myDist = distancesquared( start, end ); - + // 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; } @@ -1024,20 +1024,20 @@ SmokeTrace( start, end, rad ) for ( i = level.bots_smokelist.count - 1; i >= 0; i-- ) { nade = level.bots_smokelist.data[ i ]; - + if ( nade.state != "smoking" ) { continue; } - + if ( !RaySphereIntersect( start, end, nade.origin, rad ) ) { continue; } - + return false; } - + return true; } @@ -1058,7 +1058,7 @@ distancesquared2D( to, from ) { to = ( to[ 0 ], to[ 1 ], 0 ); from = ( from[ 0 ], from[ 1 ], 0 ); - + return distancesquared( to, from ); } @@ -1068,7 +1068,7 @@ distancesquared2D( to, from ) Round( x ) { y = int( x ); - + if ( abs( x ) - abs( y ) > 0.5 ) { if ( x < 0 ) @@ -1092,7 +1092,7 @@ Round( x ) float_old( num ) { setdvar( "temp_dvar_bot_util", num ); - + return getdvarfloat( "temp_dvar_bot_util" ); } @@ -1110,47 +1110,47 @@ isStrStart( string1, subStr ) parseTokensIntoWaypoint( tokens ) { waypoint = spawnstruct(); - + orgStr = tokens[ 0 ]; orgToks = strtok( orgStr, " " ); waypoint.origin = ( float_old( orgToks[ 0 ] ), float_old( orgToks[ 1 ] ), float_old( orgToks[ 2 ] ) ); - + childStr = tokens[ 1 ]; childToks = strtok( childStr, " " ); waypoint.children = []; - + for ( j = 0; j < childToks.size; j++ ) { waypoint.children[ j ] = int( childToks[ j ] ); } - + type = tokens[ 2 ]; waypoint.type = type; - + anglesStr = tokens[ 3 ]; - + if ( isdefined( anglesStr ) && anglesStr != "" ) { anglesToks = strtok( anglesStr, " " ); - + if ( anglesToks.size >= 3 ) { waypoint.angles = ( float_old( anglesToks[ 0 ] ), float_old( anglesToks[ 1 ] ), float_old( anglesToks[ 2 ] ) ); } } - + javStr = tokens[ 4 ]; - + if ( isdefined( javStr ) && javStr != "" ) { javToks = strtok( javStr, " " ); - + if ( javToks.size >= 3 ) { waypoint.jav_point = ( float_old( javToks[ 0 ] ), float_old( javToks[ 1 ] ), float_old( javToks[ 2 ] ) ); } } - + return waypoint; } @@ -1162,21 +1162,21 @@ getWaypointLinesFromFile( filename ) // Create a structure to store the result, including an array to hold individual lines. result = spawnstruct(); result.lines = []; - + // Read the entire content of the file into the 'waypointStr' variable. // Note: max string length in GSC is 65535. waypointStr = BotBuiltinFileRead( 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; linestart = 0; - + // Iterate through each character in the 'waypointStr'. for ( i = 0; i < waypointStr.size; i++ ) { @@ -1185,26 +1185,26 @@ getWaypointLinesFromFile( filename ) { // Extract the current line using 'getsubstr' and store it in the result array. result.lines[ result.lines.size ] = getsubstr( waypointStr, linestart, linestart + linecount ); - + // 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; linestart = i + 1; continue; } - + // Increment linecount for the current line. linecount++; } - + // Store the last line (or the only line if there are no newline characters) in the result array. result.lines[ result.lines.size ] = getsubstr( waypointStr, linestart, linestart + linecount ); - + // Return the result structure containing the array of extracted lines. return result; } @@ -1216,34 +1216,34 @@ readWpsFromFile( mapname ) { waypoints = []; 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 ); - + waypointCount = int( res.lines[ 0 ] ); - + for ( i = 1; i <= waypointCount; i++ ) { tokens = strtok( res.lines[ i ], "," ); - + waypoint = parseTokensIntoWaypoint( tokens ); - + waypoints[ i - 1 ] = waypoint; } - + return waypoints; - + return []; } @@ -1256,16 +1256,16 @@ load_waypoints() level.waypointusage = []; level.waypointusage[ "allies" ] = []; level.waypointusage[ "axis" ] = []; - + if ( !isdefined( level.waypoints ) ) { level.waypoints = []; } - + mapname = getdvar( "mapname" ); - + wps = readWpsFromFile( mapname ); - + if ( wps.size ) { level.waypoints = wps; @@ -1279,32 +1279,32 @@ load_waypoints() maps\mp\bots\waypoints\_custom_map::main( mapname ); break; } - + if ( level.waypoints.size ) { BotBuiltinPrintConsole( "Loaded " + level.waypoints.size + " waypoints from script." ); } } - + if ( !level.waypoints.size ) { BotBuiltinPrintConsole( "No waypoints loaded!" ); } - + level.waypointcount = level.waypoints.size; - + 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"; @@ -1318,19 +1318,19 @@ load_waypoints() nearAnyOfWaypoints( dist, waypoints ) { dist *= dist; - + for ( i = 0; i < waypoints.size; i++ ) { waypoint = level.waypoints[ waypoints[ i ] ]; - + if ( distancesquared( waypoint.origin, self.origin ) > dist ) { continue; } - + return true; } - + return false; } @@ -1340,21 +1340,21 @@ nearAnyOfWaypoints( dist, waypoints ) waypointsNear( waypoints, dist ) { dist *= dist; - + answer = []; - + for ( i = 0; i < waypoints.size; i++ ) { wp = level.waypoints[ waypoints[ i ] ]; - + if ( distancesquared( wp.origin, self.origin ) > dist ) { continue; } - + answer[ answer.size ] = waypoints[ i ]; } - + return answer; } @@ -1365,21 +1365,21 @@ getNearestWaypointOfWaypoints( waypoints ) { answer = undefined; closestDist = 2147483647; - + for ( i = 0; i < waypoints.size; i++ ) { waypoint = level.waypoints[ waypoints[ i ] ]; thisDist = distancesquared( self.origin, waypoint.origin ); - + if ( isdefined( answer ) && thisDist > closestDist ) { continue; } - + answer = waypoints[ i ]; closestDist = thisDist; } - + return answer; } @@ -1389,18 +1389,18 @@ getNearestWaypointOfWaypoints( waypoints ) getWaypointsOfType( type ) { answer = []; - + for ( i = 0; i < level.waypointcount; i++ ) { wp = level.waypoints[ i ]; - + if ( type == "camp" ) { if ( wp.type != "crouch" ) { continue; } - + if ( wp.children.size != 1 ) { continue; @@ -1410,10 +1410,10 @@ getWaypointsOfType( type ) { continue; } - + answer[ answer.size ] = i; } - + return answer; } @@ -1426,7 +1426,7 @@ getWaypointForIndex( i ) { return undefined; } - + return level.waypoints[ i ]; } @@ -1439,7 +1439,7 @@ getMapName( mapname ) { case "mp_dome": return "Dome"; - + default: return mapname; } @@ -1461,7 +1461,7 @@ getGoodMapAmount() { return 5; } - + default: return 2; } @@ -1473,122 +1473,122 @@ getGoodMapAmount() keyCodeToString( a ) { b = ""; - + switch ( a ) { case 0: b = "a"; break; - + case 1: b = "b"; break; - + case 2: b = "c"; break; - + case 3: b = "d"; break; - + case 4: b = "e"; break; - + case 5: b = "f"; break; - + case 6: b = "g"; break; - + case 7: b = "h"; break; - + case 8: b = "i"; break; - + case 9: b = "j"; break; - + case 10: b = "k"; break; - + case 11: b = "l"; break; - + case 12: b = "m"; break; - + case 13: b = "n"; break; - + case 14: b = "o"; break; - + case 15: b = "p"; break; - + case 16: b = "q"; break; - + case 17: b = "r"; break; - + case 18: b = "s"; break; - + case 19: b = "t"; break; - + case 20: b = "u"; break; - + case 21: b = "v"; break; - + case 22: b = "w"; break; - + case 23: b = "x"; break; - + case 24: b = "y"; break; - + case 25: b = "z"; break; - + case 26: b = "."; break; - + case 27: b = " "; break; } - + return b; } @@ -1599,19 +1599,19 @@ getBotArray() { result = []; playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !player is_bot() ) { continue; } - + result[ result.size ] = player; } - + return result; } @@ -1621,9 +1621,9 @@ getBotArray() WaypointsToKDTree() { kdTree = KDTree(); - + kdTree _WaypointsToKDTree( level.waypoints, 0 ); - + return kdTree; } @@ -1636,44 +1636,44 @@ _WaypointsToKDTree( waypoints, dem ) { return; } - + callbacksort = undefined; - + switch ( dem ) { case 0: callbacksort = ::HeapSortCoordX; break; - + case 1: callbacksort = ::HeapSortCoordY; break; - + case 2: callbacksort = ::HeapSortCoordZ; break; } - + heap = NewHeap( callbacksort ); - + for ( i = 0; i < waypoints.size; i++ ) { heap HeapInsert( waypoints[ i ] ); } - + sorted = []; - + while ( heap.data.size ) { sorted[ sorted.size ] = heap.data[ 0 ]; heap HeapRemove(); } - + median = int( sorted.size / 2 ); // use divide and conq - + left = []; right = []; - + for ( i = 0; i < sorted.size; i++ ) { if ( i < median ) @@ -1685,11 +1685,11 @@ _WaypointsToKDTree( waypoints, dem ) left[ left.size ] = sorted[ i ]; } } - + self KDTreeInsert( sorted[ median ] ); - + _WaypointsToKDTree( left, ( dem + 1 ) % 3 ); - + _WaypointsToKDTree( right, ( dem + 1 ) % 3 ); } @@ -1701,7 +1701,7 @@ List() list = spawnstruct(); list.count = 0; list.data = []; - + return list; } @@ -1711,7 +1711,7 @@ List() ListAdd( thing ) { self.data[ self.count ] = thing; - + self.count++; } @@ -1724,7 +1724,7 @@ ListAddFirst( thing ) { self.data[ i + 1 ] = self.data[ i ]; } - + self.data[ 0 ] = thing; self.count++; } @@ -1743,7 +1743,7 @@ ListRemove( thing ) self.data[ i ] = self.data[ i + 1 ]; i++; } - + self.data[ i ] = undefined; self.count--; break; @@ -1759,7 +1759,7 @@ KDTree() kdTree = spawnstruct(); kdTree.root = undefined; kdTree.count = 0; - + return kdTree; } @@ -1788,12 +1788,12 @@ _KDTreeInsert( node, data, dem, x0, y0, z0, x1, y1, z1 ) r.y1 = y1; r.z0 = z0; r.z1 = z1; - + self.count++; - + return r; } - + switch ( dem ) { case 0: @@ -1805,9 +1805,9 @@ _KDTreeInsert( node, data, dem, x0, y0, z0, x1, y1, z1 ) { 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 ] ) { @@ -1817,9 +1817,9 @@ _KDTreeInsert( node, data, dem, x0, y0, z0, x1, y1, z1 ) { 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 ] ) { @@ -1829,10 +1829,10 @@ _KDTreeInsert( node, data, dem, x0, y0, z0, x1, y1, z1 ) { node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[ 2 ], x1, y1, z1 ); } - + break; } - + return node; } @@ -1845,7 +1845,7 @@ KDTreeNearest( origin ) { return undefined; } - + return self _KDTreeNearest( self.root, origin, self.root.data, distancesquared( self.root.data.origin, origin ), 0 ); } @@ -1858,31 +1858,31 @@ _KDTreeNearest( node, point, closest, closestdist, dem ) { return closest; } - + thisDis = distancesquared( node.data.origin, point ); - + if ( thisDis < closestdist ) { closestdist = thisDis; closest = node.data; } - + if ( node Rectdistancesquared( point ) < closestdist ) { near = node.left; far = node.right; - + if ( point[ dem ] > node.data.origin[ dem ] ) { near = node.right; far = node.left; } - + closest = self _KDTreeNearest( near, point, closest, closestdist, ( dem + 1 ) % 3 ); - + closest = self _KDTreeNearest( far, point, closest, distancesquared( closest.origin, point ), ( dem + 1 ) % 3 ); } - + return closest; } @@ -1894,7 +1894,7 @@ Rectdistancesquared( origin ) dx = 0; dy = 0; dz = 0; - + if ( origin[ 0 ] < self.x0 ) { dx = origin[ 0 ] - self.x0; @@ -1903,7 +1903,7 @@ Rectdistancesquared( origin ) { dx = origin[ 0 ] - self.x1; } - + if ( origin[ 1 ] < self.y0 ) { dy = origin[ 1 ] - self.y0; @@ -1912,8 +1912,8 @@ Rectdistancesquared( origin ) { dy = origin[ 1 ] - self.y1; } - - + + if ( origin[ 2 ] < self.z0 ) { dz = origin[ 2 ] - self.z0; @@ -1922,7 +1922,7 @@ Rectdistancesquared( origin ) { dz = origin[ 2 ] - self.z1; } - + return dx * dx + dy * dy + dz * dz; } @@ -1990,7 +1990,7 @@ NewHeap( compare ) heap_node = spawnstruct(); heap_node.data = []; heap_node.compare = compare; - + return heap_node; } @@ -2001,19 +2001,19 @@ HeapInsert( item ) { insert = self.data.size; self.data[ insert ] = item; - + current = insert + 1; - + while ( current > 1 ) { last = current; 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; } @@ -2026,17 +2026,17 @@ _HeapNextChild( node, hsize ) { left = node * 2; 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; @@ -2053,39 +2053,39 @@ _HeapNextChild( node, hsize ) HeapRemove() { remove = self.data.size; - + if ( !remove ) { return remove; } - + move = self.data[ remove - 1 ]; self.data[ 0 ] = move; self.data[ remove - 1 ] = undefined; remove--; - + if ( !remove ) { return remove; } - + last = 1; next = self _HeapNextChild( 1, remove ); - + 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; - + last = next; next = self _HeapNextChild( next, remove ); } - + return remove; } @@ -2106,14 +2106,14 @@ RemoveWaypointUsage( wp, team ) { return; } - + if ( !isdefined( level.waypointusage[ team ][ wp + "" ] ) ) { return; } - + level.waypointusage[ team ][ wp + "" ]--; - + if ( level.waypointusage[ team ][ wp + "" ] <= 0 ) { level.waypointusage[ team ][ wp + "" ] = undefined; @@ -2127,25 +2127,25 @@ GetNearestWaypointWithSight( pos ) { candidate = undefined; dist = 2147483647; - + 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; } - + return candidate; } @@ -2156,20 +2156,20 @@ getNearestWaypoint( pos ) { candidate = undefined; dist = 2147483647; - + for ( i = 0; i < level.waypointcount; i++ ) { curdis = distancesquared( level.waypoints[ i ].origin, pos ); - + if ( curdis > dist ) { continue; } - + dist = curdis; candidate = i; } - + return candidate; } @@ -2183,59 +2183,59 @@ AStarSearch( start, goal, team, greedy_path ) open = NewHeap( ::ReverseHeapAStar ); // heap openset = []; // set for quick lookup closed = []; // set for quick lookup - - + + 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(); node.g = 0; // path dist so far node.h = distancesquared( level.waypoints[ startWp ].origin, level.waypoints[ goalWp ].origin ); // herustic, distance to goal for path finding node.f = node.h + node.g; // combine path dist and heru, use reverse heap to sort the priority queue by this attru node.index = startWp; node.parent = undefined; // we are start, so we have no parent - + // push node onto queue openset[ node.index + "" ] = node; open HeapInsert( node ); - + // while the queue is not empty while ( open.data.size ) { @@ -2244,12 +2244,12 @@ AStarSearch( start, goal, team, greedy_path ) open HeapRemove(); openset[ bestNode.index + "" ] = undefined; wp = level.waypoints[ bestNode.index ]; - + // check if we made it to the goal if ( bestNode.index == goalWp ) { path = []; - + while ( isdefined( bestNode ) ) { if ( isdefined( team ) && isdefined( level.waypointusage ) ) @@ -2258,68 +2258,68 @@ AStarSearch( start, goal, team, greedy_path ) { level.waypointusage[ team ][ bestNode.index + "" ] = 0; } - + level.waypointusage[ team ][ bestNode.index + "" ]++; } - + // construct path path[ path.size ] = bestNode.index; - + bestNode = bestNode.parent; } - + return path; } - + // for each child of bestnode for ( i = wp.children.size - 1; i >= 0; i-- ) { child = wp.children[ i ]; childWp = level.waypoints[ child ]; - + penalty = 1; - + if ( !greedy_path && isdefined( team ) && isdefined( level.waypointusage ) ) { 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 - + // check if this child is in open or close with a g value less than newg 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 + "" ]; @@ -2332,19 +2332,19 @@ AStarSearch( start, goal, team, greedy_path ) { node = spawnstruct(); } - + node.parent = bestNode; node.g = newg; node.h = distancesquared( childWp.origin, level.waypoints[ goalWp ].origin ); node.f = node.g + node.h; node.index = child; - + // check if in closed, remove it if ( inclosed ) { closed[ child + "" ] = undefined; } - + // check if not in open, add it if ( !inopen ) { @@ -2352,11 +2352,11 @@ AStarSearch( start, goal, team, greedy_path ) openset[ child + "" ] = node; } } - + // done with children, push onto closed closed[ bestNode.index + "" ] = bestNode; } - + return []; } @@ -2368,12 +2368,12 @@ array_average( array ) { assert( array.size > 0 ); total = 0; - + for ( i = 0; i < array.size; i++ ) { total += array[ i ]; } - + return ( total / array.size ); } @@ -2385,19 +2385,19 @@ array_std_deviation( array, mean ) { assert( array.size > 0 ); tmp = []; - + for ( i = 0; i < array.size; i++ ) { tmp[ i ] = ( array[ i ] - mean ) * ( array[ i ] - mean ); } - + total = 0; - + for ( i = 0; i < tmp.size; i++ ) { total = total + tmp[ i ]; } - + return sqrt( total / array.size ); } @@ -2411,28 +2411,28 @@ random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) x2 = 0; w = 1; y1 = 0; - + while ( w >= 1 ) { x1 = 2 * randomfloatrange( 0, 1 ) - 1; x2 = 2 * randomfloatrange( 0, 1 ) - 1; w = x1 * x1 + x2 * x2; } - + w = sqrt( ( -2.0 * log( w ) ) / w ); y1 = x1 * w; number = mean + y1 * std_deviation; - + if ( isdefined( lower_bound ) && number < lower_bound ) { number = lower_bound; } - + if ( isdefined( upper_bound ) && number > upper_bound ) { number = upper_bound; } - + return ( number ); } @@ -2444,28 +2444,28 @@ onUsePlantObjectFix( player ) if ( !maps\mp\gametypes\_gameobjects::isfriendlyteam( player.pers[ "team" ] ) ) { level thread bombPlantedFix( self, player ); - + for ( i = 0; i < level.bombzones.size; i++ ) { if ( level.bombzones[ i ] == self ) { continue; } - + level.bombzones[ i ] maps\mp\gametypes\_gameobjects::disableobject(); } - + player playsound( "mp_bomb_plant" ); player notify( "bomb_planted" ); - player notify( "objective", "plant" ); + player notify( "objective", "plant" ); player maps\mp\_utility::incpersstat( "plants", 1 ); 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 ); level.bombowner = player; @@ -2489,7 +2489,7 @@ bombPlantedFix( var_0, var_1 ) level.timelimitoverride = 1; setgameendtime( int( gettime() + level.bombtimer * 1000 ) ); setdvar( "ui_bomb_timer", 1 ); - + if ( !level.multibomb ) { level.sdbomb maps\mp\gametypes\_gameobjects::allowcarry( "none" ); @@ -2506,7 +2506,7 @@ bombPlantedFix( var_0, var_1 ) 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 ); var_4 = randomfloat( 360 ); var_5 = ( cos( var_4 ), sin( var_4 ), 0 ); @@ -2516,7 +2516,7 @@ bombPlantedFix( var_0, var_1 ) level.sdbombmodel.angles = var_6; level.sdbombmodel setmodel( "prop_suitcase_bomb" ); } - + var_0 maps\mp\gametypes\_gameobjects::allowuse( "none" ); var_0 maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); var_7 = var_0 maps\mp\gametypes\_gameobjects::getlabel(); @@ -2538,22 +2538,22 @@ bombPlantedFix( var_0, var_1 ) defuseObject.onenduse = maps\mp\gametypes\sd::onenduse; defuseObject.onuse = maps\mp\gametypes\sd::onusedefuseobject; defuseObject.useweapon = "briefcase_bomb_defuse_mp"; - + level.defuseobject = defuseObject; - + maps\mp\gametypes\sd::bombtimerwait(); setdvar( "ui_bomb_timer", 0 ); var_0.visuals[ 0 ] maps\mp\gametypes\_gamelogic::stoptickingsound(); - + if ( level.gameended || level.bombdefused ) { return; } - + level.bombexploded = 1; var_11 = level.sdbombmodel.origin; level.sdbombmodel hide(); - + if ( isdefined( var_1 ) ) { var_0.visuals[ 0 ] radiusdamage( var_11, 512, 200, 20, var_1, "MOD_EXPLOSIVE", "bomb_site_mp" ); @@ -2564,24 +2564,24 @@ bombPlantedFix( var_0, var_1 ) { 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 ) ); triggerfx( var_13 ); playrumbleonposition( "grenade_rumble", var_11 ); earthquake( 0.75, 2.0, var_11, 2000 ); 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 ); wait 3; @@ -2594,34 +2594,34 @@ bombPlantedFix( var_0, var_1 ) botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimarySpawnWeapon only when called during spawn { self endon( "death" ); - + self takeallweapons(); self.changingweapon = undefined; teamName = "none"; - + if ( !isdefined( setPrimarySpawnWeapon ) ) { setPrimarySpawnWeapon = true; } - + primaryIndex = 0; - + // initialize specialty array self.specialty = []; - + if ( !isdefined( allowCopycat ) ) { allowCopycat = true; } - + primaryWeapon = undefined; var_7 = 0; - + // set in game mode custom class loadoutKillstreak1 = undefined; loadoutKillstreak2 = undefined; loadoutKillstreak3 = undefined; - + if ( issubstr( class, "axis" ) ) { teamName = "axis"; @@ -2630,9 +2630,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary { teamName = "allies"; } - + clonedLoadout = []; - + if ( isdefined( self.pers[ "copyCatLoadout" ] ) && self.pers[ "copyCatLoadout" ][ "inUse" ] && allowCopycat ) { self maps\mp\gametypes\_class::setclass( "copycat" ); @@ -2676,7 +2676,7 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutSecondaryBuff = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "buff" ); loadoutSecondaryCamo = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "camo" ); loadoutSecondaryReticle = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "reticle" ); - + if ( ( loadoutPrimary == "throwingknife" || loadoutPrimary == "none" ) && loadoutSecondary != "none" ) { loadoutPrimary = loadoutSecondary; @@ -2698,12 +2698,12 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutPrimary = "iw5_usp45"; loadoutPrimaryAttachment = "tactical"; } - + loadoutEquipment = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 0 ); loadoutPerk1 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 1 ); loadoutPerk2 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 2 ); loadoutPerk3 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 3 ); - + if ( loadoutSecondary != "none" && !maps\mp\gametypes\_class::isvalidsecondary( loadoutSecondary, loadoutPerk2, 0 ) ) { loadoutSecondary = maps\mp\gametypes\_class::table_getweapon( level.classtablename, 10, 1 ); @@ -2713,9 +2713,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutSecondaryCamo = "none"; loadoutSecondaryReticle = "none"; } - + loadoutStreakType = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 5 ); - + if ( loadoutStreakType == "specialty_null" ) { loadoutKillstreak1 = "none"; @@ -2728,16 +2728,16 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutKillstreak2 = maps\mp\gametypes\_class::recipe_getkillstreak( teamName, classIndex, loadoutStreakType, 1 ); loadoutKillstreak3 = maps\mp\gametypes\_class::recipe_getkillstreak( teamName, classIndex, loadoutStreakType, 2 ); } - + loadoutOffhand = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 6 ); - + if ( loadoutOffhand == "specialty_null" ) { loadoutOffhand = "none"; } - + loadoutDeathStreak = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "deathstreak" ); - + if ( getmatchrulesdata( "defaultClasses", teamName, classIndex, "juggernaut" ) ) { self thread recipeclassapplyjuggernaut( isjuggernaut() ); @@ -2790,7 +2790,7 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutSecondaryBuff = gamemodeLoadout[ "loadoutSecondaryBuff" ]; loadoutSecondaryCamo = gamemodeLoadout[ "loadoutSecondaryCamo" ]; loadoutSecondaryReticle = gamemodeLoadout[ "loadoutSecondaryReticle" ]; - + if ( ( loadoutPrimary == "throwingknife" || loadoutPrimary == "none" ) && loadoutSecondary != "none" ) { loadoutPrimary = loadoutSecondary; @@ -2812,19 +2812,19 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutPrimary = "iw5_usp45"; loadoutPrimaryAttachment = "tactical"; } - + loadoutEquipment = gamemodeLoadout[ "loadoutEquipment" ]; loadoutOffhand = gamemodeLoadout[ "loadoutOffhand" ]; - + if ( loadoutOffhand == "specialty_null" ) { loadoutOffhand = "none"; } - + loadoutPerk1 = gamemodeLoadout[ "loadoutPerk1" ]; loadoutPerk2 = gamemodeLoadout[ "loadoutPerk2" ]; loadoutPerk3 = gamemodeLoadout[ "loadoutPerk3" ]; - + if ( loadoutSecondary != "none" && !maps\mp\gametypes\_class::isvalidsecondary( loadoutSecondary, loadoutPerk2, 0 ) ) { loadoutSecondary = maps\mp\gametypes\_class::table_getweapon( level.classtablename, 10, 1 ); @@ -2834,7 +2834,7 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutSecondaryCamo = "none"; loadoutSecondaryReticle = "none"; } - + if ( level.killstreakrewards && isdefined( gamemodeLoadout[ "loadoutStreakType" ] ) && gamemodeLoadout[ "loadoutStreakType" ] != "specialty_null" ) { loadoutStreakType = gamemodeLoadout[ "loadoutStreakType" ]; @@ -2853,9 +2853,9 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutKillstreak2 = "none"; loadoutKillstreak3 = "none"; } - + loadoutDeathStreak = gamemodeLoadout[ "loadoutDeathstreak" ]; - + if ( gamemodeLoadout[ "loadoutJuggernaut" ] ) { self.health = self.maxhealth; @@ -2938,87 +2938,87 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutOffhand = maps\mp\gametypes\_class::table_getoffhand( level.classtablename, class_num ); loadoutDeathStreak = maps\mp\gametypes\_class::table_getdeathstreak( level.classtablename, class_num ); } - + // stop default class op'ness allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); - + if ( !allowOp ) { 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 ); isCustomClass = issubstr( class, "custom" ); isRecipeClass = issubstr( class, "recipe" ); isGameModeClass = ( class == "gamemode" ); - + 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 ) ) { loadoutSecondary = maps\mp\gametypes\_class::table_getweapon( level.classtablename, 10, 1 ); @@ -3028,106 +3028,106 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutSecondaryCamo = "none"; loadoutSecondaryReticle = "none"; } - + 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; self.loadoutprimarycamo = int( tablelookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 ) ); self.loadoutsecondary = loadoutSecondary; 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"; @@ -3137,7 +3137,7 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary secondaryName = maps\mp\gametypes\_class::buildweaponname( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2, self.loadoutsecondarycamo, self.loadoutsecondaryreticle ); self _giveweapon( secondaryName ); weaponTokens = strtok( secondaryName, "_" ); - + if ( weaponTokens[ 0 ] == "iw5" ) { weaponTokens[ 0 ] = weaponTokens[ 0 ] + "_" + weaponTokens[ 1 ]; @@ -3146,60 +3146,60 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary { 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" ); self _setactionslot( 1, "" ); self _setactionslot( 3, "altMode" ); self _setactionslot( 4, "" ); - + if ( !level.console ) { self _setactionslot( 5, "" ); self _setactionslot( 6, "" ); self _setactionslot( 7, "" ); } - + self _clearperks(); 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" ) { foreach ( key, value in deathStreaks ) @@ -3207,7 +3207,7 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary deathStreaks[ key ] -= 1; } } - + foreach ( key, value in deathStreaks ) { if ( self.pers[ "cur_death_streak" ] >= value ) @@ -3216,18 +3216,18 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary { 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 ); } } } - + if ( level.killstreakrewards && !isdefined( loadoutKillstreak1 ) && !isdefined( loadoutKillstreak2 ) && !isdefined( loadoutKillstreak3 ) ) { if ( isdefined( self.pers[ "copyCatLoadout" ] ) && self.pers[ "copyCatLoadout" ][ "inUse" ] && allowCopycat ) @@ -3242,7 +3242,7 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary defaultKillstreak2 = undefined; defaultKillstreak3 = undefined; playerData = undefined; - + switch ( self.streaktype ) { case "support": @@ -3251,14 +3251,14 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary defaultKillstreak3 = maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, 2, 3 ); playerData = "defenseStreaks"; break; - + case "specialist": defaultKillstreak1 = maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, 1, 1 ); defaultKillstreak2 = maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, 1, 2 ); defaultKillstreak3 = maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, 1, 3 ); playerData = "specialistStreaks"; break; - + default: defaultKillstreak1 = maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, 0, 1 ); defaultKillstreak2 = maps\mp\gametypes\_class::table_getkillstreak( level.classtablename, 0, 2 ); @@ -3266,11 +3266,11 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary playerData = "assaultStreaks"; break; } - + loadoutKillstreak1 = undefined; loadoutKillstreak2 = undefined; loadoutKillstreak3 = undefined; - + if ( issubstr( class, "custom" ) ) { customClassLoc = maps\mp\gametypes\_class::cac_getcustomclassloc(); @@ -3278,7 +3278,7 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutKillstreak2 = self getplayerdata( customClassLoc, self.class_num, playerData, 1 ); loadoutKillstreak3 = self getplayerdata( customClassLoc, self.class_num, playerData, 2 ); } - + if ( issubstr( class, "juggernaut" ) || isGameModeClass ) { foreach ( killstreak in self.killstreaks ) @@ -3288,19 +3288,19 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutKillstreak1 = killstreak; continue; } - + if ( !isdefined( loadoutKillstreak2 ) ) { loadoutKillstreak2 = killstreak; continue; } - + if ( !isdefined( loadoutKillstreak3 ) ) { loadoutKillstreak3 = killstreak; } } - + if ( isGameModeClass && self.streaktype == "specialist" ) { self.pers[ "gamemodeLoadout" ][ "loadoutKillstreak1" ] = loadoutKillstreak1; @@ -3308,46 +3308,46 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary self.pers[ "gamemodeLoadout" ][ "loadoutKillstreak3" ] = loadoutKillstreak3; } } - + if ( !issubstr( class, "custom" ) && !issubstr( class, "juggernaut" ) && !isGameModeClass ) { loadoutKillstreak1 = defaultKillstreak1; loadoutKillstreak2 = defaultKillstreak2; loadoutKillstreak3 = defaultKillstreak3; } - + 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 ) { self.streaktype = "assault"; @@ -3363,16 +3363,16 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary loadoutKillstreak2 = "none"; loadoutKillstreak3 = "none"; } - + self maps\mp\gametypes\_class::setkillstreaks( loadoutKillstreak1, loadoutKillstreak2, loadoutKillstreak3 ); - + if ( isdefined( self.lastclass ) && self.lastclass != self.class && !issubstr( self.class, "juggernaut" ) && !issubstr( self.lastclass, "juggernaut" ) && !issubstr( class, "juggernaut" ) ) { if ( wasonlyround() || self.lastclass != "" ) { streakNames = []; inc = 0; - + if ( self.pers[ "killstreaks" ].size > 5 ) { for ( i = 5; i < self.pers[ "killstreaks" ].size; i++ ) @@ -3381,7 +3381,7 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary inc++; } } - + if ( self.pers[ "killstreaks" ].size ) { for ( i = 1; i < 4; i++ ) @@ -3393,28 +3393,28 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary } } } - + self notify( "givingLoadout" ); 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; } - + if ( isdefined( self.gamemode_chosenclass ) ) { self.pers[ "class" ] = self.gamemode_chosenclass; @@ -3423,12 +3423,12 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary self.lastclass = self.gamemode_chosenclass; self.gamemode_chosenclass = undefined; } - + primaryName = maps\mp\gametypes\_class::buildweaponname( loadoutPrimary, loadoutPrimaryAttachment, loadoutPrimaryAttachment2, self.loadoutprimarycamo, self.loadoutprimaryreticle ); self _giveweapon( primaryName ); self switchtoweapon( primaryName ); weaponTokens = strtok( primaryName, "_" ); - + if ( weaponTokens[ 0 ] == "iw5" ) { weaponName = weaponTokens[ 0 ] + "_" + weaponTokens[ 1 ]; @@ -3441,34 +3441,34 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary { 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" ); + 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" ); @@ -3485,22 +3485,22 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary { self setoffhandsecondaryclass( "flash" ); } - + switch ( offhandSecondaryWeapon ) { case "none": break; - + case "trophy_mp": case "specialty_portable_radar": case "specialty_scrambler": case "specialty_tacticalinsertion": self giveperk( offhandSecondaryWeapon, 0 ); break; - + default: self giveweapon( offhandSecondaryWeapon ); - + if ( loadoutOffhand == "flash_grenade_mp" ) { self setweaponammoclip( offhandSecondaryWeapon, 2 ); @@ -3513,20 +3513,20 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary { self setweaponammoclip( offhandSecondaryWeapon, 1 ); } - + break; } - + primaryWeapon = primaryName; self.primaryweapon = primaryWeapon; self.secondaryweapon = secondaryName; - + if ( var_7 ) { self setweaponammoclip( self.primaryweapon, 0 ); self setweaponammostock( self.primaryweapon, 0 ); } - + self playerModelForWeapon( self.pers[ "primaryWeapon" ], getbaseweaponname( secondaryName ) ); self.issniper = ( weaponclass( self.primaryweapon ) == "sniper" ); self maps\mp\gametypes\_weapons::updatemovespeedscale(); @@ -3541,17 +3541,17 @@ botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimary 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 ); } @@ -3564,74 +3564,74 @@ loadoutallperks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loa loadoutPerk1 = maps\mp\perks\_perks::validateperk( 1, loadoutPerk1 ); loadoutPerk2 = maps\mp\perks\_perks::validateperk( 2, loadoutPerk2 ); loadoutPerk3 = maps\mp\perks\_perks::validateperk( 3, loadoutPerk3 ); - + 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; self.loadoutperk3 = loadoutPerk3; self.loadoutperkequipment = loadoutEquipment; 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 ); perkUpgrd[ 2 ] = tablelookup( "mp/perktable.csv", 1, loadoutPerk3, 8 ); - + perks[ 0 ] = loadoutPerk1; perks[ 1 ] = loadoutPerk2; perks[ 2 ] = loadoutPerk3; - + for ( i = 0; i < perkUpgrd.size; i++ ) { upgrade = perkUpgrd[ i ]; perk = perks[ i ]; - + if ( upgrade == "" || upgrade == "specialty_null" ) { continue; } - + if ( isdefined( self.pers[ "bots" ][ "unlocks" ][ "upgraded_" + perk ] ) && self.pers[ "bots" ][ "unlocks" ][ "upgraded_" + perk ] ) { self giveperk( upgrade, true ); } } - + if ( !self _hasperk( "specialty_assists" ) ) { self.pers[ "assistsToKill" ] = 0; @@ -3644,25 +3644,25 @@ loadoutallperks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loa playerModelForWeapon( weapon, secondary ) { team = self.team; - + if ( isdefined( game[ team + "_model" ][ weapon ] ) ) { [[ game[ team + "_model" ][ weapon ] ]](); return; } - + weaponclass = tablelookup( "mp/statstable.csv", 4, weapon, 2 ); - + switch ( weaponclass ) { case "weapon_smg": [[ game[ team + "_model" ][ "SMG" ] ]](); break; - + case "weapon_assault": [[ game[ team + "_model" ][ "ASSAULT" ] ]](); break; - + case "weapon_sniper": if ( level.environment != "" && game[ team ] != "opforce_africa" && isdefined( self.pers[ "bots" ][ "unlocks" ][ "ghillie" ] ) && self.pers[ "bots" ][ "unlocks" ][ "ghillie" ] ) { @@ -3672,26 +3672,26 @@ playerModelForWeapon( weapon, secondary ) { [[ game[ team + "_model" ][ "SNIPER" ] ]](); } - + break; - + case "weapon_lmg": [[ game[ team + "_model" ][ "LMG" ] ]](); break; - + case "weapon_riot": [[ game[ team + "_model" ][ "RIOT" ] ]](); break; - + case "weapon_shotgun": [[ game[ team + "_model" ][ "SHOTGUN" ] ]](); break; - + default: [[ game[ team + "_model" ][ "ASSAULT" ] ]](); break; } - + if ( isjuggernaut() ) { [[ game[ team + "_model" ][ "JUGGERNAUT" ] ]](); diff --git a/maps/mp/bots/_menu.gsc b/maps/mp/bots/_menu.gsc index ebaac74..41d71a5 100644 --- a/maps/mp/bots/_menu.gsc +++ b/maps/mp/bots/_menu.gsc @@ -16,12 +16,12 @@ init() { setdvar( "bots_main_menu", true ); } - + if ( !getdvarint( "bots_main_menu" ) ) { return; } - + thread watchPlayers(); } @@ -30,26 +30,26 @@ watchPlayers() for ( ;; ) { 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(); } } @@ -64,29 +64,29 @@ kill_menu() init_menu() { self.menuinit = true; - + self.menuopen = false; self.menu_player = undefined; self.submenu = "Main"; self.curs[ "Main" ][ "X" ] = 0; self addOptions(); - + self thread watchPlayerOpenMenu(); self thread MenuSelect(); self thread RightMenu(); self thread LeftMenu(); self thread UpMenu(); self thread DownMenu(); - + self thread watchDisconnect(); - + self thread doGreetings(); } watchDisconnect() { self waittill_either( "disconnect", "bots_kill_menu" ); - + if ( self.menuopen ) { if ( isdefined( self.menutexty ) ) @@ -99,7 +99,7 @@ watchDisconnect() } } } - + if ( isdefined( self.menutext ) ) { for ( i = 0; i < self.menutext.size; i++ ) @@ -110,20 +110,20 @@ watchDisconnect() } } } - + 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(); @@ -145,13 +145,13 @@ watchPlayerOpenMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + self notifyonplayercommand( "bots_open_menu", "+actionslot 1" ); - + for ( ;; ) { self waittill( "bots_open_menu" ); - + if ( !self.menuopen ) { self playlocalsound( "mouse_click" ); @@ -160,7 +160,7 @@ watchPlayerOpenMenu() else { self playlocalsound( "mouse_click" ); - + if ( self.submenu != "Main" ) { self ExitSub(); @@ -168,7 +168,7 @@ watchPlayerOpenMenu() else { self ExitMenu(); - + if ( !gameflag( "prematch_done" ) || level.gameended ) { self freezecontrols( true ); @@ -186,17 +186,17 @@ MenuSelect() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + self notifyonplayercommand( "bots_select", "+gostand" ); - + for ( ;; ) { self waittill( "bots_select" ); - + if ( self.menuopen ) { 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" ] ] ); @@ -213,23 +213,23 @@ LeftMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + self notifyonplayercommand( "bots_left", "+moveleft" ); - + for ( ;; ) { self waittill( "bots_left" ); - + if ( self.menuopen && self.submenu == "Main" ) { self playlocalsound( "mouse_over" ); self.curs[ "Main" ][ "X" ]--; - + if ( self.curs[ "Main" ][ "X" ] < 0 ) { self.curs[ "Main" ][ "X" ] = self.option[ "Name" ][ self.submenu ].size - 1; } - + self CursMove( "X" ); } } @@ -239,23 +239,23 @@ RightMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + self notifyonplayercommand( "bots_right", "+moveright" ); - + for ( ;; ) { self waittill( "bots_right" ); - + if ( self.menuopen && self.submenu == "Main" ) { self playlocalsound( "mouse_over" ); self.curs[ "Main" ][ "X" ]++; - + if ( self.curs[ "Main" ][ "X" ] > self.option[ "Name" ][ self.submenu ].size - 1 ) { self.curs[ "Main" ][ "X" ] = 0; } - + self CursMove( "X" ); } } @@ -265,23 +265,23 @@ UpMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + self notifyonplayercommand( "bots_up", "+forward" ); - + for ( ;; ) { self waittill( "bots_up" ); - + if ( self.menuopen && self.submenu != "Main" ) { self playlocalsound( "mouse_over" ); 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" ); } } @@ -291,23 +291,23 @@ DownMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + self notifyonplayercommand( "bots_down", "+back" ); - + for ( ;; ) { self waittill( "bots_down" ); - + if ( self.menuopen && self.submenu != "Main" ) { self playlocalsound( "mouse_over" ); 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" ); } } @@ -320,10 +320,10 @@ OpenSub( menu, menu2 ) self.curs[ menu ][ "Y" ] = 0; self.menu[ menu ][ "FirstOpen" ] = true; } - + logOldi = true; self.submenu = menu; - + if ( self.submenu == "Main" ) { if ( isdefined( self.menutext ) ) @@ -336,47 +336,47 @@ OpenSub( menu, menu2 ) } } } - + 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++ ) { self.menutext[ i ] = self createfontstring( "default", 1.6 ); self.menutext[ i ] setpoint( "CENTER", "CENTER", -300 + ( i * 100 ), -226 ); self.menutext[ i ] settext( self.option[ "Name" ][ self.submenu ][ i ] ); - + if ( logOldi ) { self.oldi = i; } - + if ( self.menutext[ i ].x > 300 ) { logOldi = false; x = i - self.oldi; self.menutext[ i ] setpoint( "CENTER", "CENTER", ( ( ( -300 ) - ( i * 100 ) ) + ( i * 100 ) ) + ( x * 100 ), -196 ); } - + self.menutext[ i ].alpha = 1; self.menutext[ i ].sort = 999; } - + if ( !logOldi ) { self.menu[ "X" ][ "Shader" ] = self createRectangle( "CENTER", "CENTER", 0, -225, 1000, 90, ( 0, 0, 0 ), -2, 1, "white" ); @@ -385,13 +385,13 @@ OpenSub( menu, menu2 ) { 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" ); - + self CursMove( "X" ); - + self.menuversionhud = initHudElem( "Bot Warfare " + level.bw_version, 0, 0 ); - + self.menuopen = true; } else @@ -406,7 +406,7 @@ OpenSub( menu, menu2 ) } } } - + for ( i = 0 ; i < self.option[ "Name" ][ self.submenu ].size ; i++ ) { self.menutexty[ i ] = self createfontstring( "default", 1.6 ); @@ -415,7 +415,7 @@ OpenSub( menu, menu2 ) self.menutexty[ i ].alpha = 1; self.menutexty[ i ].sort = 999; } - + self CursMove( "Y" ); } } @@ -423,12 +423,12 @@ OpenSub( menu, menu2 ) CursMove( direction ) { self notify( "scrolled" ); - + if ( self.submenu == "Main" ) { self.menu[ "X" ][ "Scroller" ].x = self.menutext[ self.curs[ "Main" ][ "X" ] ].x; self.menu[ "X" ][ "Scroller" ].y = self.menutext[ self.curs[ "Main" ][ "X" ] ].y; - + if ( isdefined( self.menutext ) ) { for ( i = 0; i < self.menutext.size; i++ ) @@ -441,7 +441,7 @@ CursMove( direction ) } } } - + self thread ShowOptionOn( direction ); } else @@ -458,7 +458,7 @@ CursMove( direction ) } } } - + if ( isdefined( self.menutext ) ) { for ( i = 0; i < self.menutext.size; i++ ) @@ -471,7 +471,7 @@ CursMove( direction ) } } } - + self thread ShowOptionOn( direction ); } } @@ -482,7 +482,7 @@ ShowOptionOn( variable ) self endon( "disconnect" ); self endon( "exit" ); self endon( "bots_kill_menu" ); - + for ( time = 0;; time += 0.05 ) { if ( !self isonground() && isalive( self ) && gameflag( "prematch_done" ) && !level.gameended ) @@ -493,11 +493,11 @@ ShowOptionOn( variable ) { self freezecontrols( true ); } - + self setclientdvar( "r_blur", "5" ); self setclientdvar( "sc_blur", "15" ); self addOptions(); - + if ( self.submenu == "Main" ) { if ( isdefined( self.curs[ self.submenu ][ variable ] ) && isdefined( self.menutext ) && isdefined( self.menutext[ self.curs[ self.submenu ][ variable ] ] ) ) @@ -505,15 +505,15 @@ ShowOptionOn( variable ) self.menutext[ self.curs[ self.submenu ][ variable ] ].fontscale = 2.0; // self.menutext[ self.curs[ self.submenu ][ variable ] ].color = (randomint(256)/255, randomint(256)/255, randomint(256)/255); 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; } - + if ( isdefined( self.menutext ) ) { for ( i = 0; i < self.option[ "Name" ][ self.submenu ].size; i++ ) @@ -532,15 +532,15 @@ ShowOptionOn( variable ) self.menutexty[ self.curs[ self.submenu ][ variable ] ].fontscale = 2.0; // self.menutexty[ self.curs[ self.submenu ][ variable ] ].color = (randomint(256)/255, randomint(256)/255, randomint(256)/255); 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; } - + if ( isdefined( self.menutexty ) ) { for ( i = 0; i < self.option[ "Name" ][ self.submenu ].size; i++ ) @@ -552,7 +552,7 @@ ShowOptionOn( variable ) } } } - + wait 0.05; } } @@ -582,9 +582,9 @@ ExitSub() } } } - + self.submenu = self.menu[ "Back" ][ self.submenu ]; - + if ( self.submenu == "Main" ) { self CursMove( "X" ); @@ -607,28 +607,28 @@ ExitMenu() } } } - + 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" ); - + self setclientdvar( "r_blur", "0" ); self setclientdvar( "sc_blur", "2" ); } @@ -651,7 +651,7 @@ initHudElem( txt, xl, yl ) hud.glowcolor = ( 0, 0, 0 ); hud.glowalpha = 1; hud.color = ( 1.0, 1.0, 1.0 ); - + return hud; } @@ -680,7 +680,7 @@ addOptions() { self AddMenu( "Main", 0, "Manage bots", ::OpenSub, "man_bots", "" ); self AddBack( "man_bots", "Main" ); - + _temp = ""; _tempDvar = getdvarint( "bots_manage_add" ); self AddMenu( "man_bots", 0, "Add 1 bot", ::man_bots, "add", 1 + _tempDvar ); @@ -690,9 +690,9 @@ addOptions() self AddMenu( "man_bots", 4, "Add 17 bot", ::man_bots, "add", 17 + _tempDvar ); self AddMenu( "man_bots", 5, "Kick a bot", ::man_bots, "kick", 1 ); self AddMenu( "man_bots", 6, "Kick all bots", ::man_bots, "kick", getBotArray().size ); - + _tempDvar = getdvarint( "bots_manage_fill_kick" ); - + if ( _tempDvar ) { _temp = "true"; @@ -701,46 +701,46 @@ addOptions() { _temp = "false"; } - + self AddMenu( "man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar ); - + _tempDvar = getdvarint( "bots_manage_fill_mode" ); - + switch ( _tempDvar ) { case 0: _temp = "everyone"; break; - + case 1: _temp = "just bots"; break; - + case 2: _temp = "everyone, adjust to map"; break; - + case 3: _temp = "just bots, adjust to map"; break; - + case 4: _temp = "bots used as team balance"; break; - + default: _temp = "out of range"; break; } - + self AddMenu( "man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar ); - + _tempDvar = getdvarint( "bots_manage_fill" ); self AddMenu( "man_bots", 9, "Increase bots to keep in-game: " + _tempDvar, ::man_bots, "fillup", _tempDvar ); self AddMenu( "man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar ); - + _tempDvar = getdvarint( "bots_manage_fill_spec" ); - + if ( _tempDvar ) { _temp = "true"; @@ -749,23 +749,23 @@ addOptions() { _temp = "false"; } - + self AddMenu( "man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar ); - + // - + self AddMenu( "Main", 1, "Teams and difficulty", ::OpenSub, "man_team", "" ); self AddBack( "man_team", "Main" ); - + _tempDvar = getdvar( "bots_team" ); self AddMenu( "man_team", 0, "Change bot team: " + _tempDvar, ::bot_teams, "team", _tempDvar ); - + _tempDvar = getdvarint( "bots_team_amount" ); self AddMenu( "man_team", 1, "Increase bots to be on axis team: " + _tempDvar, ::bot_teams, "teamup", _tempDvar ); self AddMenu( "man_team", 2, "Decrease bots to be on axis team: " + _tempDvar, ::bot_teams, "teamdown", _tempDvar ); - + _tempDvar = getdvarint( "bots_team_force" ); - + if ( _tempDvar ) { _temp = "true"; @@ -774,11 +774,11 @@ addOptions() { _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"; @@ -787,83 +787,83 @@ addOptions() { _temp = "everyone"; } - + self AddMenu( "man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar ); - + _tempDvar = getdvarint( "bots_skill" ); - + switch ( _tempDvar ) { case 0: _temp = "random for all"; break; - + case 1: _temp = "too easy"; break; - + case 2: _temp = "easy"; break; - + case 3: _temp = "easy-medium"; break; - + case 4: _temp = "medium"; break; - + case 5: _temp = "hard"; break; - + case 6: _temp = "very hard"; break; - + case 7: _temp = "hardest"; break; - + case 8: _temp = "custom"; break; - + case 9: _temp = "complete random"; break; - + default: _temp = "out of range"; break; } - + self AddMenu( "man_team", 5, "Change bot difficulty: " + _temp, ::bot_teams, "skill", _tempDvar ); - + _tempDvar = getdvarint( "bots_skill_axis_hard" ); self AddMenu( "man_team", 6, "Increase amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axishardup", _tempDvar ); self AddMenu( "man_team", 7, "Decrease amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axisharddown", _tempDvar ); - + _tempDvar = getdvarint( "bots_skill_axis_med" ); self AddMenu( "man_team", 8, "Increase amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismedup", _tempDvar ); self AddMenu( "man_team", 9, "Decrease amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismeddown", _tempDvar ); - + _tempDvar = getdvarint( "bots_skill_allies_hard" ); self AddMenu( "man_team", 10, "Increase amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "allieshardup", _tempDvar ); self AddMenu( "man_team", 11, "Decrease amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "alliesharddown", _tempDvar ); - + _tempDvar = getdvarint( "bots_skill_allies_med" ); self AddMenu( "man_team", 12, "Increase amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmedup", _tempDvar ); self AddMenu( "man_team", 13, "Decrease amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmeddown", _tempDvar ); - + // - + self AddMenu( "Main", 2, "Bot settings", ::OpenSub, "set1", "" ); self AddBack( "set1", "Main" ); - + _tempDvar = getdvarint( "bots_loadout_reasonable" ); - + if ( _tempDvar ) { _temp = "true"; @@ -872,11 +872,11 @@ addOptions() { _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"; @@ -885,11 +885,11 @@ addOptions() { _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"; @@ -898,11 +898,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_knife" ); - + if ( _tempDvar ) { _temp = "true"; @@ -911,11 +911,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_fire" ); - + if ( _tempDvar ) { _temp = "true"; @@ -924,11 +924,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_nade" ); - + if ( _tempDvar ) { _temp = "true"; @@ -937,11 +937,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_take_carepackages" ); - + if ( _tempDvar ) { _temp = "true"; @@ -950,11 +950,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 6, "Bots can take carepackages: " + _temp, ::bot_func, "care", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_obj" ); - + if ( _tempDvar ) { _temp = "true"; @@ -963,11 +963,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 7, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_camp" ); - + if ( _tempDvar ) { _temp = "true"; @@ -976,11 +976,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 8, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_jumpdrop" ); - + if ( _tempDvar ) { _temp = "true"; @@ -989,11 +989,11 @@ addOptions() { _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"; @@ -1002,11 +1002,11 @@ addOptions() { _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"; @@ -1015,11 +1015,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 11, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_ads" ); - + if ( _tempDvar ) { _temp = "true"; @@ -1028,7 +1028,7 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 12, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar ); } @@ -1040,62 +1040,62 @@ bot_func( a, b ) setdvar( "bots_loadout_reasonable", !b ); self iprintln( "Bots using reasonable setups: " + !b ); break; - + case "op": setdvar( "bots_loadout_allow_op", !b ); self iprintln( "Bots using op setups: " + !b ); break; - + case "move": setdvar( "bots_play_move", !b ); self iprintln( "Bots move: " + !b ); break; - + case "knife": setdvar( "bots_play_knife", !b ); self iprintln( "Bots knife: " + !b ); break; - + case "fire": setdvar( "bots_play_fire", !b ); self iprintln( "Bots fire: " + !b ); break; - + case "nade": setdvar( "bots_play_nade", !b ); self iprintln( "Bots nade: " + !b ); break; - + case "care": setdvar( "bots_play_take_carepackages", !b ); self iprintln( "Bots take carepackages: " + !b ); break; - + case "obj": setdvar( "bots_play_obj", !b ); self iprintln( "Bots play the obj: " + !b ); break; - + case "camp": setdvar( "bots_play_camp", !b ); self iprintln( "Bots camp: " + !b ); break; - + case "jump": setdvar( "bots_play_jumpdrop", !b ); self iprintln( "Bots jump: " + !b ); break; - + case "targetother": setdvar( "bots_play_target_other", !b ); self iprintln( "Bots target other: " + !b ); break; - + case "killstreak": setdvar( "bots_play_killstreak", !b ); self iprintln( "Bots use killstreaks: " + !b ); break; - + case "ads": setdvar( "bots_play_ads", !b ); self iprintln( "Bots ads: " + !b ); @@ -1114,45 +1114,45 @@ bot_teams( a, b ) setdvar( "bots_team", "allies" ); self iprintlnbold( "Changed bot team to allies." ); break; - + case "allies": setdvar( "bots_team", "axis" ); self iprintlnbold( "Changed bot team to axis." ); break; - + case "axis": setdvar( "bots_team", "custom" ); self iprintlnbold( "Changed bot team to custom." ); break; - + default: setdvar( "bots_team", "autoassign" ); self iprintlnbold( "Changed bot team to autoassign." ); break; } - + break; - + case "teamup": setdvar( "bots_team_amount", b + 1 ); self iprintln( ( b + 1 ) + " bot(s) will try to be on axis team." ); break; - + case "teamdown": setdvar( "bots_team_amount", b - 1 ); self iprintln( ( b - 1 ) + " bot(s) will try to be on axis team." ); break; - + case "teamforce": setdvar( "bots_team_force", !b ); self iprintln( "Forcing bots to team: " + !b ); break; - + case "teammode": setdvar( "bots_team_mode", !b ); self iprintln( "Only count bots on team: " + !b ); break; - + case "skill": switch ( b ) { @@ -1160,90 +1160,90 @@ bot_teams( a, b ) self iprintlnbold( "Changed bot skill to easy." ); setdvar( "bots_skill", 1 ); break; - + case 1: self iprintlnbold( "Changed bot skill to easy-med." ); setdvar( "bots_skill", 2 ); break; - + case 2: self iprintlnbold( "Changed bot skill to medium." ); setdvar( "bots_skill", 3 ); break; - + case 3: self iprintlnbold( "Changed bot skill to med-hard." ); setdvar( "bots_skill", 4 ); break; - + case 4: self iprintlnbold( "Changed bot skill to hard." ); setdvar( "bots_skill", 5 ); break; - + case 5: self iprintlnbold( "Changed bot skill to very hard." ); setdvar( "bots_skill", 6 ); break; - + case 6: self iprintlnbold( "Changed bot skill to hardest." ); setdvar( "bots_skill", 7 ); break; - + case 7: self iprintlnbold( "Changed bot skill to custom. Base is easy." ); setdvar( "bots_skill", 8 ); break; - + case 8: self iprintlnbold( "Changed bot skill to complete random. Takes effect at restart." ); setdvar( "bots_skill", 9 ); break; - + default: self iprintlnbold( "Changed bot skill to random. Takes effect at restart." ); setdvar( "bots_skill", 0 ); break; } - + break; - + case "axishardup": setdvar( "bots_skill_axis_hard", ( b + 1 ) ); self iprintln( ( ( b + 1 ) ) + " hard bots will be on axis team." ); break; - + case "axisharddown": setdvar( "bots_skill_axis_hard", ( b - 1 ) ); self iprintln( ( ( b - 1 ) ) + " hard bots will be on axis team." ); break; - + case "axismedup": setdvar( "bots_skill_axis_med", ( b + 1 ) ); self iprintln( ( ( b + 1 ) ) + " med bots will be on axis team." ); break; - + case "axismeddown": setdvar( "bots_skill_axis_med", ( b - 1 ) ); self iprintln( ( ( b - 1 ) ) + " med bots will be on axis team." ); break; - + case "allieshardup": setdvar( "bots_skill_allies_hard", ( b + 1 ) ); self iprintln( ( ( b + 1 ) ) + " hard bots will be on allies team." ); break; - + case "alliesharddown": setdvar( "bots_skill_allies_hard", ( b - 1 ) ); self iprintln( ( ( b - 1 ) ) + " hard bots will be on allies team." ); break; - + case "alliesmedup": setdvar( "bots_skill_allies_med", ( b + 1 ) ); self iprintln( ( ( b + 1 ) ) + " med bots will be on allies team." ); break; - + case "alliesmeddown": setdvar( "bots_skill_allies_med", ( b - 1 ) ); self iprintln( ( ( b - 1 ) ) + " med bots will be on allies team." ); @@ -1257,7 +1257,7 @@ man_bots( a, b ) { case "add": setdvar( "bots_manage_add", b ); - + if ( b == 1 ) { self iprintln( "Adding " + b + " bot." ); @@ -1266,37 +1266,37 @@ man_bots( a, b ) { self iprintln( "Adding " + b + " bots." ); } - + break; - + case "kick": result = false; - + for ( i = 0; i < b; i++ ) { tempBot = random( getBotArray() ); - + if ( isdefined( tempBot ) ) { kick( tempBot getentitynumber(), "EXE_PLAYERKICKED" ); result = true; } - + wait 0.25; } - + if ( !result ) { self iprintln( "No bots to kick" ); } - + break; - + case "autokick": setdvar( "bots_manage_fill_kick", !b ); self iprintln( "Kicking bots when bots_fill is exceeded: " + !b ); break; - + case "fillmode": switch ( b ) { @@ -1304,40 +1304,40 @@ man_bots( a, b ) setdvar( "bots_manage_fill_mode", 1 ); self iprintln( "bot_fill will now count only bots." ); break; - + case 1: setdvar( "bots_manage_fill_mode", 2 ); self iprintln( "bot_fill will now count everyone, adjusting to map." ); break; - + case 2: setdvar( "bots_manage_fill_mode", 3 ); self iprintln( "bot_fill will now count only bots, adjusting to map." ); break; - + case 3: setdvar( "bots_manage_fill_mode", 4 ); self iprintln( "bot_fill will now use bots as team balance." ); break; - + default: setdvar( "bots_manage_fill_mode", 0 ); self iprintln( "bot_fill will now count everyone." ); break; } - + break; - + case "fillup": setdvar( "bots_manage_fill", b + 1 ); self iprintln( "Increased to maintain " + ( b + 1 ) + " bot(s)." ); break; - + case "filldown": setdvar( "bots_manage_fill", b - 1 ); self iprintln( "Decreased to maintain " + ( b - 1 ) + " bot(s)." ); break; - + case "fillspec": setdvar( "bots_manage_fill_spec", !b ); self iprintln( "Count players on spectator for bots_fill: " + !b ); diff --git a/maps/mp/bots/_wp_editor.gsc b/maps/mp/bots/_wp_editor.gsc index 159557b..53e0528 100644 --- a/maps/mp/bots/_wp_editor.gsc +++ b/maps/mp/bots/_wp_editor.gsc @@ -16,21 +16,21 @@ init() { setdvar( "bots_main_debug", 0 ); } - + if ( !getdvarint( "bots_main_debug" ) ) { return; } - + /* if(!getdvarint("developer")) { setdvar("developer_script", 1); setdvar("developer", 1); - + setdvar("sv_mapRotation", "map "+getdvar("mapname")); exitlevel(false); }*/ - + setdvar( "bots_main", 0 ); setdvar( "bots_main_menu", 0 ); setdvar( "bots_manage_fill_mode", 0 ); @@ -38,47 +38,47 @@ init() setdvar( "bots_manage_add", 0 ); setdvar( "bots_manage_fill_kick", 1 ); 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; - + level waittill( "connected", player ); player thread onPlayerSpawned(); } @@ -86,7 +86,7 @@ init() onPlayerSpawned() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); @@ -98,11 +98,11 @@ startDev() { self endon( "disconnect" ); self endon( "death" ); - + level.wptolink = -1; level.autolink = false; self.nearest = -1; - + self takeallweapons(); self giveweapon( "iw5_m16_mp_gl" ); // to knife windows self giveweapon( "javelin_mp" ); // to mark jav spots @@ -116,7 +116,7 @@ startDev() self maps\mp\perks\_perks::giveperk("specialty_marathon"); self maps\mp\perks\_perks::giveperk("specialty_lightweight");*/ self freezecontrols( false ); - + self thread watchAddWaypointCommand(); self thread watchDeleteAllWaypointsCommand(); self thread watchDeleteWaypointCommand(); @@ -127,7 +127,7 @@ startDev() self thread watchAutoLinkCommand(); self thread updateWaypointsStats(); self thread watchAstarCommand(); - + self thread sayExtras(); } @@ -151,30 +151,30 @@ watchAstarCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "astar", "+gostand" ); - + for ( ;; ) { self waittill( "astar" ); - + if ( 1 ) { continue; } - + self iprintln( "Start AStar" ); self.astar = undefined; astar = spawnstruct(); astar.start = self.origin; - + self waittill( "astar" ); self iprintln( "End AStar" ); astar.goal = self.origin; - + astar.nodes = AStarSearch( astar.start, astar.goal, undefined, true ); self iprintln( "AStar size: " + astar.nodes.size ); - + self.astar = astar; } } @@ -185,7 +185,7 @@ drawWaypoint( i ) { level.drawn_wps = []; } - + newdeathicon = newhudelem(); newdeathicon.x = level.waypoints[ i ].origin[ 0 ]; newdeathicon.y = level.waypoints[ i ].origin[ 1 ]; @@ -194,7 +194,7 @@ drawWaypoint( i ) newdeathicon.archived = true; newdeathicon setshader( "headicon_dead", 5, 5 ); newdeathicon setwaypoint( true, false ); - + level.drawn_wps[ level.drawn_wps.size ] = newdeathicon; } @@ -204,7 +204,7 @@ drawPath( where ) { level.drawn_wps = []; } - + newdeathicon = newhudelem(); newdeathicon.x = where[ 0 ]; newdeathicon.y = where[ 1 ]; @@ -213,7 +213,7 @@ drawPath( where ) newdeathicon.archived = true; newdeathicon setshader( "headicon_dead", 5, 5 ); newdeathicon setwaypoint( true, false ); - + level.drawn_wps[ level.drawn_wps.size ] = newdeathicon; } @@ -223,12 +223,12 @@ clearWaypoints() { return; } - + for ( i = 0; i < level.drawn_wps.size; i++ ) { level.drawn_wps[ i ] destroy(); } - + level.drawn_wps = []; } @@ -238,17 +238,17 @@ clearWpLinks() { return; } - + for ( i = 0; i < level.waypointcount; i++ ) { level.waypoints[ i ].drawn_links = []; } - + for ( i = 0; i < level.drawn_links.size; i++ ) { level.drawn_links[ i ] delete (); } - + level.drawn_links = []; } @@ -258,46 +258,46 @@ showWpLink( i, h ) { 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; - + start = level.waypoints[ i ].origin + ( 0, 0, 45 ); end = level.waypoints[ h ].origin + ( 0, 0, 45 ); diff = end - start; dir = vectortoangles( diff ); - + dist = distance( start, end ); dash_count = int( dist / getdvarfloat( "bots_main_debug_dashAmount" ) ); - + for ( j = 0; j < dash_count; j++ ) { dash = spawn( "script_model", start + ( ( diff * j ) / dash_count ) ); dash setmodel( "weapon_parabolic_knife" ); dash.angles = dir; - + level.drawn_links[ level.drawn_links.size ] = dash; } - + dash = spawn( "script_model", end ); dash setmodel( "weapon_parabolic_knife" ); dash.angles = dir; - + level.drawn_links[ level.drawn_links.size ] = dash; } @@ -305,7 +305,7 @@ updateWaypointsStats() { self endon( "disconnect" ); self endon( "death" ); - + self initHudElem( "TotalWps:", 102, 5 ); totalWpsHud = self initHudElem( "", 180, 5 ); self initHudElem( "NearestWP:", 102, 15 ); @@ -316,40 +316,40 @@ updateWaypointsStats() type = self initHudElem( "", 160, 35 ); self initHudElem( "ToLink:", 102, 45 ); wpToLink = self initHudElem( "", 160, 45 ); - + infotext = self initHudElem2(); self initHudElem3(); self initHudElem4(); - + intTimer = 0; - + for ( time = 0;; time += 0.05 ) { wait 0.05; intTimer += 50; - + totalWpsHud setvalue( level.waypointcount ); - + closest = -1; myEye = self geteye(); myAngles = self getplayerangles(); timeToUpdate = ( ( intTimer % getdvarint( "bots_main_debug_updateRate" ) ) == 0 ); - + if ( timeToUpdate ) { clearWaypoints(); clearWpLinks(); } - + 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 ); - + if ( distance( level.waypoints[ i ].origin, self.origin ) < getdvarfloat( "bots_main_debug_distance" ) && ( bullettracepassed( myEye, wpOrg, false, self ) || getdvarint( "bots_main_debug_drawThrough" ) ) ) { if ( timeToUpdate ) @@ -357,52 +357,52 @@ updateWaypointsStats() if ( getConeDot( wpOrg, myEye, myAngles ) > getdvarfloat( "bots_main_debug_cone" ) ) { drawWaypoint( i ); - + for ( h = level.waypoints[ i ].children.size - 1; h >= 0; h-- ) { showWpLink( i, level.waypoints[ i ].children[ h ] ); } } } - + // mw3 doesnt have debug gsc calls :( /* for(h = level.waypoints[ i ].children.size - 1; h >= 0; h--) line(wpOrg, level.waypoints[ level.waypoints[ i ].children[ h ] ].origin + (0, 0, 25), (1,0,1)); - + if(getConeDot(wpOrg, myEye, myAngles) > getdvarfloat("bots_main_debug_cone")) print3d(wpOrg, i, (1,0,0), 2); - + if (isdefined(level.waypoints[ i ].angles) && level.waypoints[ i ].type != "stand") line(wpOrg, wpOrg + anglestoforward(level.waypoints[ i ].angles) * 64, (1,1,1)); - + if (isdefined(level.waypoints[ i ].jav_point)) line(wpOrg, level.waypoints[ i ].jav_point, (0,0,0));*/ } } - + self.nearest = closest; - + nearestWP setvalue( self.nearest ); - + children setvalue( buildChildCountString( self.nearest ) ); - + type settext( buildTypeString( self.nearest ) ); - + wpToLink setvalue( level.wptolink ); - + infotext.x = infotext.x - 2; - + if ( infotext.x <= -800 ) { infotext.x = 800; } - + if ( time > 2 && self usebuttonpressed() ) { time = 0; self iprintlnbold( self.nearest + " children: " + buildChildString( self.nearest ) ); } - + if ( isdefined( self.astar ) ) { // print3d(self.astar.start + (0, 0, 35), "start", (0,0,1), 2); @@ -412,22 +412,22 @@ updateWaypointsStats() drawPath( self.astar.start ); drawPath( self.astar.goal ); } - + prev = self.astar.start + ( 0, 0, 35 ); - + for ( i = self.astar.nodes.size - 1; i >= 0; i-- ) { node = self.astar.nodes[ i ]; - + // line(prev, level.waypoints[ node ].origin + (0, 0, 35), (0,1,1)); if ( timeToUpdate ) { drawPath( level.waypoints[ node ].origin ); } - + prev = level.waypoints[ node ].origin + ( 0, 0, 35 ); } - + // line(prev, self.astar.goal + (0, 0, 35), (0,1,1)); } } @@ -437,9 +437,9 @@ watchLoadWaypointsCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+actionslot 5}]", "+actionslot 5" ); - + for ( ;; ) { self waittill( "[{+actionslot 5}]" ); @@ -451,9 +451,9 @@ watchAddWaypointCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+smoke}]", "+smoke" ); - + for ( ;; ) { self waittill( "[{+smoke}]" ); @@ -465,13 +465,13 @@ watchAutoLinkCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+frag}]", "+frag" ); - + for ( ;; ) { self waittill( "[{+frag}]" ); - + if ( level.autolink ) { self iprintlnbold( "Auto link disabled" ); @@ -491,9 +491,9 @@ watchLinkWaypointCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+melee_zoom}]", "+melee_zoom" ); - + for ( ;; ) { self waittill( "[{+melee_zoom}]" ); @@ -505,9 +505,9 @@ watchunlinkWaypointCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+reload}]", "+reload" ); - + for ( ;; ) { self waittill( "[{+reload}]" ); @@ -519,9 +519,9 @@ watchDeleteWaypointCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+actionslot 3}]", "+actionslot 3" ); - + for ( ;; ) { self waittill( "[{+actionslot 3}]" ); @@ -533,9 +533,9 @@ watchDeleteAllWaypointsCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+actionslot 4}]", "+actionslot 4" ); - + for ( ;; ) { self waittill( "[{+actionslot 4}]" ); @@ -547,72 +547,72 @@ watchSaveWaypointsCommand() { self endon( "death" ); self endon( "disconnect" ); - + self notifyonplayercommand( "[{+actionslot 1}]", "+actionslot 1" ); - + for ( ;; ) { self waittill( "[{+actionslot 1}]" ); - + self checkForWarnings(); wait 1; - + logprint( "***********ABiliTy's WPDump**************\n\n" ); logprint( "\n\n\n\n" ); mpnm = getMapName( getdvar( "mapname" ) ); logprint( "\n\n" + mpnm + "()\n{\n/*" ); logprint( "*/waypoints = [];\n/*" ); - + for ( i = 0; i < level.waypointcount; i++ ) { logprint( "*/waypoints[ " + i + " ] = spawnstruct();\n/*" ); logprint( "*/waypoints[ " + i + " ].origin = " + level.waypoints[ i ].origin + ";\n/*" ); logprint( "*/waypoints[ " + i + " ].type = \"" + level.waypoints[ i ].type + "\";\n/*" ); - + for ( c = 0; c < level.waypoints[ i ].children.size; c++ ) { logprint( "*/waypoints[ " + i + " ].children[ " + c + " ] = " + level.waypoints[ i ].children[ c ] + ";\n/*" ); } - + 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" ); - + filename = "waypoints/" + getdvar( "mapname" ) + "_wp.csv"; - + println( "********* Start Bot Warfare WPDump *********" ); println( level.waypointcount ); - + BotBuiltinFileWrite( filename, level.waypointcount + "\n", "write" ); - + for ( i = 0; i < level.waypointcount; i++ ) { str = ""; wp = level.waypoints[ i ]; - + str += wp.origin[ 0 ] + " " + wp.origin[ 1 ] + " " + wp.origin[ 2 ] + ","; - + for ( h = 0; h < wp.children.size; h++ ) { 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 ] + ","; @@ -621,7 +621,7 @@ watchSaveWaypointsCommand() { str += ","; } - + if ( isdefined( wp.jav_point ) ) { str += wp.jav_point[ 0 ] + " " + wp.jav_point[ 1 ] + " " + wp.jav_point[ 2 ] + ","; @@ -630,13 +630,13 @@ watchSaveWaypointsCommand() { str += ","; } - + println( str ); BotBuiltinFileWrite( filename, str + "\n", "append" ); } - + println( "\n\n\n\n\n\n" ); - + self iprintln( "Saved!!! to " + filename ); } } @@ -646,9 +646,9 @@ LoadWaypoints() // self DeleteAllWaypoints(); self iprintlnbold( "Loading WPS..." ); load_waypoints(); - + wait 1; - + self checkForWarnings(); } @@ -658,12 +658,12 @@ checkForWarnings() { 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++ ) { if ( !isdefined( level.waypoints[ i ] ) ) @@ -671,7 +671,7 @@ checkForWarnings() self iprintln( "WARNING: waypoint " + i + " is undefined" ); continue; } - + if ( level.waypoints[ i ].children.size <= 0 ) { self iprintln( "WARNING: waypoint " + i + " childCount is " + level.waypoints[ i ].children.size ); @@ -687,7 +687,7 @@ checkForWarnings() for ( h = level.waypoints[ i ].children.size - 1; h >= 0; h-- ) { child = level.waypoints[ i ].children[ h ]; - + if ( !isdefined( level.waypoints[ child ] ) ) { self iprintln( "WARNING: waypoint " + i + " child " + child + " is undefined" ); @@ -699,43 +699,43 @@ checkForWarnings() } } } - + if ( !isdefined( level.waypoints[ i ].type ) ) { self iprintln( "WARNING: waypoint " + i + " type is undefined" ); continue; } - + 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 - + wpIdx = randomint( level.waypointcount ); - + 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." ); } @@ -747,17 +747,17 @@ UnLinkWaypoint( nwp ) level.wptolink = -1; return; } - + if ( level.wptolink == -1 || nwp == level.wptolink ) { level.wptolink = nwp; self iprintln( "Waypoint unlink Started " + nwp ); return; } - + level.waypoints[ nwp ].children = array_remove( level.waypoints[ nwp ].children, level.wptolink ); level.waypoints[ level.wptolink ].children = array_remove( level.waypoints[ level.wptolink ].children, nwp ); - + self iprintln( "Waypoint " + nwp + " Broken to " + level.wptolink ); level.wptolink = -1; } @@ -770,33 +770,33 @@ LinkWaypoint( nwp ) level.wptolink = -1; return; } - + if ( level.wptolink == -1 || nwp == level.wptolink ) { level.wptolink = nwp; self iprintln( "Waypoint Link Started " + nwp ); return; } - + weGood = true; - + for ( i = level.waypoints[ level.wptolink ].children.size - 1; i >= 0; i-- ) { child = level.waypoints[ level.wptolink ].children[ i ]; - + if ( child == nwp ) { weGood = false; break; } } - + if ( weGood ) { for ( i = level.waypoints[ nwp ].children.size - 1; i >= 0; i-- ) { child = level.waypoints[ nwp ].children[ i ]; - + if ( child == level.wptolink ) { weGood = false; @@ -804,17 +804,17 @@ LinkWaypoint( nwp ) } } } - + if ( !weGood ) { self iprintln( "Waypoint Link Cancelled " + nwp + " and " + level.wptolink + " already linked." ); level.wptolink = -1; return; } - + level.waypoints[ level.wptolink ].children[ level.waypoints[ level.wptolink ].children.size ] = nwp; level.waypoints[ nwp ].children[ level.waypoints[ nwp ].children.size ] = level.wptolink; - + self iprintln( "Waypoint " + nwp + " Linked to " + level.wptolink ); level.wptolink = -1; } @@ -826,16 +826,16 @@ DeleteWaypoint( nwp ) self iprintln( "No close enough waypoint to delete." ); return; } - + level.wptolink = -1; - + for ( i = level.waypoints[ nwp ].children.size - 1; i >= 0; i-- ) { child = level.waypoints[ nwp ].children[ i ]; - + level.waypoints[ child ].children = array_remove( level.waypoints[ child ].children, nwp ); } - + for ( i = 0; i < level.waypointcount; i++ ) { for ( h = level.waypoints[ i ].children.size - 1; h >= 0; h-- ) @@ -846,7 +846,7 @@ DeleteWaypoint( nwp ) } } } - + for ( entry = 0; entry < level.waypointcount; entry++ ) { if ( entry == nwp ) @@ -856,24 +856,24 @@ DeleteWaypoint( nwp ) level.waypoints[ entry ] = level.waypoints[ entry + 1 ]; entry++; } - + level.waypoints[ entry ] = undefined; break; } } - + level.waypointcount--; - + self iprintln( "DelWp " + nwp ); } AddWaypoint() { level.waypoints[ level.waypointcount ] = spawnstruct(); - + pos = self getorigin(); level.waypoints[ level.waypointcount ].origin = pos; - + if ( isdefined( self.javelintargetpoint ) ) { level.waypoints[ level.waypointcount ].type = "javelin"; @@ -898,25 +898,25 @@ AddWaypoint() { level.waypoints[ level.waypointcount ].type = self getstance(); } - + level.waypoints[ level.waypointcount ].angles = self getplayerangles(); - + level.waypoints[ level.waypointcount ].children = []; - + if ( level.waypoints[ level.waypointcount ].type == "javelin" ) { level.waypoints[ level.waypointcount ].jav_point = self.javelintargetpoint; } - + self iprintln( level.waypoints[ level.waypointcount ].type + " Waypoint " + level.waypointcount + " Added at " + pos ); - + if ( level.autolink ) { if ( level.wptolink == -1 ) { level.wptolink = level.waypointcount - 1; } - + level.waypointcount++; self LinkWaypoint( level.waypointcount - 1 ); } @@ -930,7 +930,7 @@ DeleteAllWaypoints() { level.waypoints = []; level.waypointcount = 0; - + self iprintln( "DelAllWps" ); } @@ -940,9 +940,9 @@ buildChildCountString ( wp ) { return -1; } - + wpstr = level.waypoints[ wp ].children.size; - + return wpstr; } @@ -952,9 +952,9 @@ buildChildString( wp ) { return ""; } - + wpstr = ""; - + for ( i = 0; i < level.waypoints[ wp ].children.size; i++ ) { if ( i != 0 ) @@ -966,7 +966,7 @@ buildChildString( wp ) wpstr = wpstr + level.waypoints[ wp ].children[ i ]; } } - + return wpstr; } @@ -976,7 +976,7 @@ buildTypeString( wp ) { return ""; } - + return level.waypoints[ wp ].type; } @@ -992,9 +992,9 @@ initHudElem( txt, xl, yl ) hud = newclienthudelem( self ); hud settext( txt ); hud.alignx = "left"; - hud.aligny = "top"; - hud.horzalign = "left"; - hud.vertalign = "top"; + hud.aligny = "top"; + hud.horzalign = "left"; + hud.vertalign = "top"; hud.x = xl; hud.y = yl; hud.foreground = true; @@ -1005,9 +1005,9 @@ initHudElem( txt, xl, yl ) hud.glowcolor = ( 0, 0, 0 ); hud.glowalpha = 1; hud.color = ( 1.0, 1.0, 1.0 ); - + self thread destroyOnDeath( hud ); - + return hud; } @@ -1029,9 +1029,9 @@ initHudElem2() infotext.glowcolor = ( 0, 0, 0 ); infotext.glowalpha = 1; infotext.color = ( 1.0, 1.0, 1.0 ); - + self thread destroyOnDeath( infotext ); - + return infotext; } @@ -1044,9 +1044,9 @@ initHudElem3() bar.vertalign = "bottom"; bar.y = 30; bar.foreground = true; - + self thread destroyOnDeath( bar ); - + return bar; } @@ -1061,8 +1061,8 @@ initHudElem4() OptionsBG.vertalign = "top"; OptionsBG setshader( "black", 200, 60 ); OptionsBG.alpha = 0.4; - + self thread destroyOnDeath( OptionsBG ); - + return OptionsBG; }