From 2ab4d4360244e0ba323f46291479f59138f42783 Mon Sep 17 00:00:00 2001 From: ineed bots Date: Thu, 4 Jan 2024 16:07:04 -0600 Subject: [PATCH] fmt --- .astylerc | 14 +- .editorconfig | 2 +- maps/mp/bots/_bot.gsc | 378 ++-- maps/mp/bots/_bot_chat.gsc | 1170 ++++++------ maps/mp/bots/_bot_internal.gsc | 992 +++++----- maps/mp/bots/_bot_script.gsc | 3236 ++++++++++++++++---------------- maps/mp/bots/_bot_utility.gsc | 954 +++++----- maps/mp/bots/_menu.gsc | 450 ++--- maps/mp/bots/_wp_editor.gsc | 292 +-- 9 files changed, 3747 insertions(+), 3741 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 6228d09..6e66018 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[ "aa12" ] = true; level.bots_fullautoguns[ "ak47" ] = true; @@ -265,20 +265,20 @@ init() level.bots_fullautoguns[ "tmp" ] = true; level.bots_fullautoguns[ "ump45" ] = true; level.bots_fullautoguns[ "uzi" ] = true; - + level.bots_fullautoguns[ "ac130" ] = true; level.bots_fullautoguns[ "heli" ] = true; - + level.bots_fullautoguns[ "ak47classic" ] = true; level.bots_fullautoguns[ "ak74u" ] = true; level.bots_fullautoguns[ "peacekeeper" ] = true; - + level thread fixGamemodes(); - + level thread onPlayerConnect(); level thread addNotifyOnAirdrops(); level thread watchScrabler(); - + level thread handleBots(); } @@ -290,21 +290,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(), "EXE_PLAYERKICKED" ); @@ -321,7 +321,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 ); } @@ -335,7 +335,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 ); } @@ -348,7 +348,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; } @@ -366,24 +366,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; } } @@ -397,11 +397,11 @@ fixDem() { level.bombaplanted = level.aplanted; level.bombbplanted = level.bplanted; - + for ( i = 0; i < level.bombzones.size; i++ ) { bombzone = level.bombzones[ i ]; - + if ( isdefined( bombzone.trigger.trigger_off ) ) { bombzone.bombexploded = true; @@ -411,7 +411,7 @@ fixDem() bombzone.bombexploded = undefined; } } - + wait 0.05; } } @@ -422,27 +422,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; @@ -456,16 +456,16 @@ fixKoth() 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(); } @@ -490,14 +490,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(); } @@ -507,9 +507,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 ); @@ -524,12 +524,12 @@ onPlayerConnect() for ( ;; ) { level waittill( "connected", player ); - + player.bot_isscrambled = false; - + player thread onGrenadeFire(); player thread onWeaponFired(); - + player thread connected(); } } @@ -544,40 +544,40 @@ watchScrabler_loop() player = level.players[ i ]; player.bot_isscrambled = false; } - + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[ i ]; - + if ( !player _hasperk( "specialty_localjammer" ) || !isreallyalive( player ) ) { continue; } - + if ( player isemped() ) { continue; } - + for ( h = level.players.size - 1; h >= 0; h-- ) { player2 = level.players[ h ]; - + if ( player2 == player ) { continue; } - + if ( level.teambased && player2.team == player.team ) { continue; } - + if ( distancesquared( player2.origin, player.origin ) > 256 * 256 ) { continue; } - + player2.bot_isscrambled = true; } } @@ -591,7 +591,7 @@ watchScrabler() for ( ;; ) { wait 1; - + watchScrabler_loop(); } } @@ -602,7 +602,7 @@ watchScrabler() onDisconnect() { self waittill( "disconnect" ); - + level.bots = array_remove( level.bots, self ); } @@ -612,37 +612,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(); } @@ -652,50 +652,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" ) ) @@ -711,7 +711,7 @@ watchBotDebugEvent() added() { self endon( "disconnect" ); - + self thread maps\mp\bots\_bot_internal::added(); self thread maps\mp\bots\_bot_script::added(); } @@ -722,7 +722,7 @@ added() add_bot() { bot = addtestclient(); - + if ( isdefined( bot ) ) { bot.pers[ "isBot" ] = true; @@ -741,30 +741,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 ) @@ -804,33 +804,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 ) ); } } @@ -843,7 +843,7 @@ diffBots() for ( ;; ) { wait 1.5; - + diffBots_loop(); } } @@ -855,23 +855,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" ) @@ -895,16 +895,16 @@ teamBots_loop() } } } - + allies = alliesbots; axis = axisbots; - + if ( !getdvarint( "bots_team_mode" ) ) { allies += alliesplayers; axis += axisplayers; } - + if ( toTeam != "custom" ) { if ( getdvarint( "bots_team_force" ) ) @@ -914,37 +914,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 ]](); @@ -957,7 +957,7 @@ teamBots_loop() { player thread [[ level.spectator ]](); } - + break; } } @@ -966,21 +966,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 ) @@ -1024,42 +1024,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++; @@ -1073,7 +1073,7 @@ addBots_loop() players++; } } - + if ( !randomint( 999 ) ) { setdvar( "testclients_doreload", true ); @@ -1081,28 +1081,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++; @@ -1112,9 +1112,9 @@ addBots_loop() alliesplayers++; } } - + result = fillAmount - abs( axisplayers - alliesplayers ) + bots; - + if ( players == 0 ) { if ( bots < fillAmount ) @@ -1130,22 +1130,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 ); @@ -1153,7 +1153,7 @@ addBots_loop() else if ( amount > fillAmount && getdvarint( "bots_manage_fill_kick" ) ) { tempBot = getBotToKick(); - + if ( isdefined( tempBot ) ) { kick( tempBot getentitynumber(), "EXE_PLAYERKICKED" ); @@ -1167,13 +1167,13 @@ addBots_loop() addBots() { level endon( "game_ended" ); - + bot_wait_for_host(); - + for ( ;; ) { wait 1.5; - + addBots_loop(); } } @@ -1184,18 +1184,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(); @@ -1219,9 +1219,9 @@ AddToFragList( who ) grenade.owner = who; grenade.team = who.team; grenade.throwback = undefined; - + grenade thread thinkFrag(); - + level.bots_fraglist ListAdd( grenade ); } @@ -1235,10 +1235,10 @@ thinkFrag() nowOrigin = self.grenade getorigin(); self.velocity = ( nowOrigin - self.origin ) * 20; self.origin = nowOrigin; - + wait 0.05; } - + level.bots_fraglist ListRemove( self ); } @@ -1251,9 +1251,9 @@ AddToSmokeList() grenade.origin = self getorigin(); grenade.state = "moving"; grenade.grenade = self; - + grenade thread thinkSmoke(); - + level.bots_smokelist ListAdd( grenade ); } @@ -1268,10 +1268,10 @@ thinkSmoke() self.state = "moving"; wait 0.05; } - + self.state = "smoking"; wait 11.5; - + level.bots_smokelist ListRemove( self ); } @@ -1282,7 +1282,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 651956d..13c375b 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,133 +182,133 @@ 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; @@ -322,9 +322,9 @@ start_chat_watch() start_startgame_watch() { self endon( "disconnect" ); - + wait( randomint( 5 ) + randomint( 5 ) ); - + switch ( level.gametype ) { case "war": @@ -333,137 +333,137 @@ 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; } - + wait 2; - + if ( self hasKillstreak( "nuke" ) ) { switch ( randomint( 1 ) ) @@ -483,12 +483,12 @@ hasKillstreak( streakname ) loadoutKillstreak1 = self getplayerdata( "killstreaks", 0 ); loadoutKillstreak2 = self getplayerdata( "killstreaks", 1 ); loadoutKillstreak3 = self getplayerdata( "killstreaks", 2 ); - + if ( loadoutKillstreak1 == streakname || loadoutKillstreak2 == streakname || loadoutKillstreak3 == streakname ) { return true; } - + return false; } @@ -499,7 +499,7 @@ doQuickMessage() { self endon( "disconnect" ); self endon( "death" ); - + if ( !isdefined( self.talking ) || !self.talking ) { self.talking = true; @@ -507,35 +507,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(); @@ -550,7 +550,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; @@ -563,34 +563,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 ) ) @@ -598,71 +598,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 ) { @@ -680,9 +680,9 @@ endgame_chat() { self BotDoChat( 20, "wow " + winner.name + " did very well!" ); } - + break; - + case 18: if ( self == winner ) { @@ -700,13 +700,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; @@ -721,59 +721,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 ) { @@ -791,9 +791,9 @@ endgame_chat() { self BotDoChat( 20, "kwtf " + winner.name + " is a hacker" ); } - + break; - + case 15: if ( self == winner ) { @@ -811,25 +811,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; @@ -842,31 +842,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; @@ -895,9 +895,9 @@ endgame_chat() { self BotDoChat( 20, "This game sucked, " + winner.name + " is such a hacker!!" ); } - + break; - + case 1: if ( self == winner ) { @@ -915,9 +915,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 ) { @@ -935,73 +935,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; @@ -1015,7 +1015,7 @@ endgame_chat() bot_onnukecall_watch() { self endon( "disconnect" ); - + switch ( randomint( 4 ) ) { case 0: @@ -1027,9 +1027,9 @@ bot_onnukecall_watch() { self BotDoChat( 30, "NUUUUUUKKKKKKEEEEEE!!!! :D" ); } - + break; - + case 1: if ( level.nukeinfo.player != self ) { @@ -1039,13 +1039,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 ) { @@ -1055,7 +1055,7 @@ bot_onnukecall_watch() { self BotDoChat( 30, "man my team is good lol" ); } - + break; } } @@ -1066,7 +1066,7 @@ bot_onnukecall_watch() bot_chat_streak( streakCount ) { self endon( "disconnect" ); - + if ( streakCount == 25 ) { if ( self.pers[ "lastEarnedStreak" ] == "nuke" ) @@ -1076,19 +1076,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; @@ -1114,189 +1114,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 ); } @@ -1307,32 +1307,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 ) { @@ -1342,266 +1342,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 ); } @@ -1612,7 +1612,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": @@ -1622,9 +1622,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 ) ) { @@ -1632,9 +1632,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 ) ) { @@ -1642,7 +1642,7 @@ bot_chat_revive_watch( state, revive, c, d, e, f, g ) self BotDoChat( 10, "i revived " + revive.name ); break; } - + break; } } @@ -1653,7 +1653,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": @@ -1662,26 +1662,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; } } @@ -1692,10 +1692,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 ) ) @@ -1703,41 +1703,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 ); } @@ -1747,7 +1747,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": @@ -1757,9 +1757,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 ) ) { @@ -1767,7 +1767,7 @@ bot_chat_tube_watch( state, tubeWp, tubeWeap, d, e, f, g ) self BotDoChat( 10, "i tubed" ); break; } - + break; } } @@ -1778,12 +1778,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": @@ -1793,124 +1793,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; @@ -1923,12 +1923,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": @@ -1943,16 +1943,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 ) ) { @@ -1965,16 +1965,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 ) { @@ -1983,23 +1983,23 @@ 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: self BotDoChat( 10, ":3 i got my " + aircare.cratetype ); break; @@ -2012,53 +2012,53 @@ 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: 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: self BotDoChat( 10, "Wow! there goes my " + aircare.cratetype + "!" ); break; } - + break; - + case "unreachable": switch ( randomint( 1 ) ) { @@ -2066,7 +2066,7 @@ bot_chat_crate_cap_watch( state, aircare, player, d, e, f, g ) self BotDoChat( 25, "i cant reach that carepackage!" ); break; } - + break; } } @@ -2077,7 +2077,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": @@ -2086,69 +2086,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; } @@ -2160,12 +2160,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; } @@ -2177,7 +2177,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": @@ -2186,52 +2186,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; } } @@ -2242,12 +2242,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": @@ -2256,30 +2256,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; } } @@ -2290,7 +2290,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": @@ -2300,9 +2300,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 ) ) { @@ -2310,7 +2310,7 @@ bot_chat_equ_watch( state, wp, weap, d, e, f, g ) self BotDoChat( 10, "placed a " + getbaseweaponname( weap ) ); break; } - + break; } } @@ -2321,7 +2321,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": @@ -2331,9 +2331,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 ) ) { @@ -2341,7 +2341,7 @@ bot_chat_nade_watch( state, wp, weap, d, e, f, g ) self BotDoChat( 10, "threw a " + getbaseweaponname( weap ) ); break; } - + break; } } @@ -2352,12 +2352,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; } @@ -2369,7 +2369,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": @@ -2379,9 +2379,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 ) ) { @@ -2389,7 +2389,7 @@ bot_chat_throwback_watch( state, nade, c, d, e, f, g ) self BotDoChat( 10, "i threw back the grenade!" ); break; } - + break; } } @@ -2400,7 +2400,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": @@ -2410,9 +2410,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 ) ) { @@ -2420,9 +2420,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 ) ) { @@ -2430,7 +2430,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; } } @@ -2441,7 +2441,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": @@ -2450,24 +2450,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; } } @@ -2478,7 +2478,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": @@ -2488,9 +2488,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 ) ) { @@ -2498,7 +2498,7 @@ bot_chat_revenge_watch( state, loc, killer, d, e, f, g ) self BotDoChat( 10, "i checked out my deathlocation..." ); break; } - + break; } } @@ -2509,7 +2509,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": @@ -2519,9 +2519,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 ) ) { @@ -2529,7 +2529,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; } } @@ -2540,12 +2540,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; } @@ -2557,7 +2557,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": @@ -2567,9 +2567,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 ) ) { @@ -2577,9 +2577,9 @@ bot_chat_turret_attack_watch( state, turret, c, d, e, f, g ) self BotDoChat( 5, "attacking this sentry..." ); break; } - + break; - + case "stop": break; } @@ -2591,7 +2591,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": @@ -2601,9 +2601,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 ) ) { @@ -2611,9 +2611,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 ) ) { @@ -2621,12 +2621,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; } @@ -2638,7 +2638,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": @@ -2646,38 +2646,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; } } @@ -2688,7 +2688,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": @@ -2696,26 +2696,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; } } @@ -2726,7 +2726,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": @@ -2734,65 +2734,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; } } @@ -2803,7 +2803,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": @@ -2811,69 +2811,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; } } @@ -2884,47 +2884,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; } } @@ -2935,69 +2935,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; } } @@ -3008,7 +3008,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": @@ -3016,14 +3016,14 @@ bot_chat_gtnw_watch( state, sub_state, c, d, e, f, g ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; } } @@ -3034,7 +3034,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": @@ -3042,35 +3042,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; } } @@ -3081,7 +3081,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": @@ -3089,14 +3089,14 @@ bot_chat_arena_watch( state, sub_state, c, d, e, f, g ) { case "go": break; - + case "start": break; - + case "stop": break; } - + break; } } @@ -3107,7 +3107,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": @@ -3115,11 +3115,11 @@ bot_chat_vip_watch( state, sub_state, c, d, e, f, g ) { case "start": break; - + case "stop": break; } - + break; } } diff --git a/maps/mp/bots/_bot_internal.gsc b/maps/mp/bots/_bot_internal.gsc index 85d2695..9bd4b09 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; @@ -119,7 +119,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; @@ -131,20 +131,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(); } @@ -154,20 +154,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(); } } @@ -181,18 +181,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; } @@ -207,12 +207,12 @@ IsWeapSniper( weap ) { return false; } - + if ( weaponclass( weap ) != "sniper" ) { return false; } - + return true; } @@ -223,13 +223,13 @@ onWeaponChange() { self endon( "disconnect" ); self endon( "death" ); - + first = true; - + for ( ;; ) { newWeapon = undefined; - + if ( first ) { first = false; @@ -239,7 +239,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 ); @@ -253,29 +253,29 @@ onWeaponChange() reload_watch_loop() { self.bot.isreloading = true; - + while ( true ) { ret = self waittill_any_timeout( 7.5, "reload" ); - + if ( ret == "timeout" ) { break; } - + weap = self getcurrentweapon(); - + if ( weap == "none" ) { break; } - + if ( self getweaponammoclip( weap ) >= weaponclipsize( weap ) ) { break; } } - + self.bot.isreloading = false; } @@ -286,7 +286,7 @@ reload_watch() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill( "reload_start" ); @@ -301,7 +301,7 @@ sprint_watch() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill( "sprint_begin" ); @@ -319,16 +319,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; @@ -343,32 +343,32 @@ 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(); } - + self.bot.targets = []; self notify( "kill_goal" ); } @@ -380,19 +380,19 @@ watchUsingRemote() 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; } } @@ -405,21 +405,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; } } @@ -430,7 +430,7 @@ watchAc130Weapon() watchUsingAc130() { self endon( "ac130player_removed" ); - + while ( isdefined( level.ac130player ) && level.ac130player == self ) { self switchtoweapon( "ac130_105mm_mp" ); @@ -449,11 +449,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(); @@ -465,7 +465,7 @@ spawned() self thread watchHoldBreath(); self thread watchGrenadeFire(); self thread watchPickupGun(); - + self notify( "bot_spawned" ); } @@ -476,23 +476,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 ); } } @@ -504,16 +504,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 ); @@ -528,48 +528,48 @@ 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; } } - + if ( self getcurrentweapon() != "c4_mp" ) { self notify( "alt_detonate" ); @@ -588,27 +588,27 @@ doBotMovement_loop( data ) move_To = self.bot.moveto; angles = self getplayerangles(); dir = ( 0, 0, 0 ); - + if ( distancesquared( self.origin, move_To ) >= 49 ) { cosa = cos( 0 - angles[ 1 ] ); sina = sin( 0 - angles[ 1 ] ); - + // get the direction dir = move_To - self.origin; - + // 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() ) { @@ -620,16 +620,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; @@ -653,13 +653,13 @@ 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 ] ) ); } @@ -670,14 +670,14 @@ doBotMovement() { self endon( "disconnect" ); self endon( "death" ); - + data = spawnstruct(); data.wasmantling = false; - + for ( data.i = 0; true; data.i += 0.05 ) { wait 0.05; - + waittillframeend; self doBotMovement_loop( data ); } @@ -690,16 +690,16 @@ watchHoldBreath() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 1; - + if ( self.bot.isfrozen ) { continue; } - + self holdbreath( self playerads() > 0 ); } } @@ -710,31 +710,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; @@ -748,36 +748,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(); } } @@ -788,38 +788,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(); @@ -832,44 +832,44 @@ stance_loop() { self prone(); } - + chance = self.pers[ "bots" ][ "behavior" ][ "sprint" ]; - + if ( gettime() - 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( self getcurrentweapon() ) && self isInRange( self.bot.target.dist, self getcurrentweapon() ) ) { return; } - + if ( self.bot.sprintendtime != -1 && gettime() - 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(); } @@ -881,14 +881,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; } @@ -899,18 +899,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(); } } @@ -922,7 +922,7 @@ check_reload() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill_notify_or_timeout( "weapon_fired", 5 ); @@ -938,34 +938,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(); @@ -979,24 +979,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 ); } } @@ -1020,7 +1020,7 @@ createTargetObj( ent, theTime ) obj.bone = undefined; obj.aim_offset = undefined; obj.aim_offset_base = undefined; - + return obj; } @@ -1032,22 +1032,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; @@ -1056,7 +1056,7 @@ updateAimOffset( obj, theTime ) { offsetScalar = 1 - objCreatedFor / aimDiffTime; } - + obj.aim_offset = obj.aim_offset_base * offsetScalar; } @@ -1068,13 +1068,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 ) @@ -1086,13 +1086,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 ); } @@ -1125,67 +1125,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 @@ -1194,9 +1194,9 @@ target_loop() { continue; } - + self targetObjUpdateNoTrace( obj ); - + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[ key ] = undefined; @@ -1207,83 +1207,83 @@ 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_coldblooded" ) ); + && !player _hasperk( "specialty_coldblooded" ) ); } 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 ( canTargetPlayer ) { if ( !isObjDef ) { obj = self createTargetObj( player, theTime ); - + self.bot.targets[ key ] = obj; } - + self targetObjUpdateTraced( obj, daDist, player, theTime, false, usingRemote ); } else @@ -1292,9 +1292,9 @@ target_loop() { continue; } - + self targetObjUpdateNoTrace( obj ); - + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[ key ] = undefined; @@ -1302,67 +1302,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; @@ -1377,21 +1377,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(); } } @@ -1403,26 +1403,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(); } } @@ -1435,78 +1435,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(); } @@ -1516,7 +1516,7 @@ watchToLook() { continue; } - + self.bot.jump_time = gettime(); self prone(); self notify( "kill_goal" ); @@ -1533,15 +1533,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; } @@ -1560,45 +1560,45 @@ 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(); 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; @@ -1606,34 +1606,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; @@ -1649,7 +1649,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 ) @@ -1660,16 +1660,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 ); @@ -1678,7 +1678,7 @@ aim_loop() { self thread frag( time ); } - + self notify( "kill_goal" ); } } @@ -1694,7 +1694,7 @@ aim_loop() } } } - + if ( !usingRemote ) { self thread bot_lookat( last_pos + ( 0, 0, self getplayerviewheight() + nadeAimOffset ), aimspeed ); @@ -1703,10 +1703,10 @@ aim_loop() { self thread bot_lookat( last_pos, aimspeed ); } - + return; } - + if ( trace_time ) { if ( isplay ) @@ -1715,9 +1715,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 ); @@ -1737,9 +1737,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 ); @@ -1749,32 +1749,32 @@ aim_loop() self thread bot_lookat( aimpos, aimspeed ); } } - + knifeDist = level.bots_maxknifedistance; - + if ( self _hasperk( "specialty_extendedmelee" ) ) { knifeDist *= 1.995; } - + 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 ) @@ -1786,42 +1786,42 @@ aim_loop() self notify( "kill_goal" ); } } - + if ( !stopAdsOverride ) { self thread pressADS(); } } - + if ( curweap == "at4_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; @@ -1837,29 +1837,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 ) @@ -1871,25 +1871,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 ) ) @@ -1899,7 +1899,7 @@ aim_loop() else if ( !usingRemote ) { lookat = undefined; - + if ( self.bot.second_next_wp != -1 && !self.bot.issprinting && !self.bot.climbing ) { lookat = level.waypoints[ self.bot.second_next_wp ].origin; @@ -1908,7 +1908,7 @@ aim_loop() { lookat = self.bot.towards_goal; } - + if ( isdefined( lookat ) ) { self thread bot_lookat( lookat + ( 0, 0, self getplayerviewheight() ), aimspeed ); @@ -1923,21 +1923,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(); } } @@ -1948,31 +1948,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(); } @@ -1985,7 +1985,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; @@ -2000,17 +2000,17 @@ canFire( curweap ) { return false; } - + if ( curweap == "riotshield_mp" || curweap == "onemanarmy_mp" ) { return false; } - + if ( self isusingremote() ) { return true; } - + return self getweaponammoclip( curweap ); } @@ -2023,51 +2023,51 @@ canAds( dist, curweap ) { return false; } - + if ( curweap == "none" ) { 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" || curweap == "onemanarmy_mp" ) { return false; } - + if ( self.bot.is_cur_akimbo ) { return false; } - + return true; } @@ -2080,24 +2080,24 @@ isInRange( dist, curweap ) { return false; } - + weapclass = weaponclass( curweap ); - + if ( self isusingremote() ) { return true; } - + if ( ( weapclass == "spread" || self.bot.is_cur_akimbo ) && dist > level.bots_maxshotgundistance ) { return false; } - + if ( curweap == "riotshield_mp" && dist > level.bots_maxknifedistance ) { return false; } - + return true; } @@ -2111,7 +2111,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_(); @@ -2129,9 +2129,9 @@ killWalkCauseNoWaypoints() self endon( "disconnect" ); self endon( "death" ); self endon( "kill_goal" ); - + wait 2; - + self notify( "kill_goal" ); } @@ -2141,34 +2141,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; @@ -2180,15 +2180,15 @@ walk_loop() forward = anglestoforward( self getplayerangles() ) * stepDist; forward = ( forward[ 0 ], forward[ 1 ], 0 ); myOrg = self.origin + ( 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 @@ -2202,22 +2202,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 @@ -2226,10 +2226,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; @@ -2243,28 +2243,28 @@ walk() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 0.05; - + self botSetMoveTo( self.origin ); - + if ( !getdvarint( "bots_play_move" ) ) { continue; } - + if ( level.gameended || !gameflag( "prematch_done" ) || self.bot.isfrozen || self.bot.stop_move ) { continue; } - + if ( self isusingremote() ) { continue; } - + if ( self maps\mp\_flashgrenades::isflashbanged() ) { self.bot.last_next_wp = -1; @@ -2272,7 +2272,7 @@ walk() self botSetMoveTo( self.origin + self getvelocity() * 500 ); continue; } - + self walk_loop(); } } @@ -2284,25 +2284,25 @@ strafe( target ) { self endon( "kill_goal" ); self thread killWalkOnEvents(); - + angles = vectortoangles( vectornormalize( target.origin - self.origin ) ); anglesLeft = ( 0, angles[ 1 ] + 90, 0 ); anglesRight = ( 0, angles[ 1 ] - 90, 0 ); - + myOrg = self.origin + ( 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 ); @@ -2318,12 +2318,12 @@ watchOnGoal( goal, dis ) self endon( "disconnect" ); self endon( "death" ); self endon( "kill_goal" ); - + while ( distancesquared( self.origin, goal ) > dis ) { wait 0.05; } - + self notify( "goal_internal" ); } @@ -2333,7 +2333,7 @@ watchOnGoal( goal, dis ) cleanUpAStar( team ) { self waittill_any( "death", "disconnect", "kill_goal" ); - + for ( i = self.bot.astar.size - 1; i >= 0; i-- ) { RemoveWaypointUsage( self.bot.astar[ i ], team ); @@ -2346,19 +2346,19 @@ cleanUpAStar( team ) initAStar( goal ) { team = undefined; - + if ( level.teambased ) { team = self.team; } - + self.bot.astar = AStarSearch( self.origin, goal, team, self.bot.greedy_path ); - + if ( isdefined( team ) ) { self thread cleanUpAStar( team ); } - + return self.bot.astar.size - 1; } @@ -2368,14 +2368,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; } @@ -2387,11 +2387,11 @@ killWalkOnEvents() self endon( "kill_goal" ); self endon( "disconnect" ); self endon( "death" ); - + self waittill_any( "flash_rumble_loop", "new_enemy", "new_goal_internal", "goal_internal", "bad_path_internal" ); - + waittillframeend; - + self notify( "kill_goal" ); } @@ -2403,7 +2403,7 @@ doWalkScriptNotify() self endon( "disconnect" ); self endon( "death" ); self endon( "kill_goal" ); - + if ( self waittill_either_return( "goal_internal", "bad_path_internal" ) == "goal_internal" ) { self notify( "goal" ); @@ -2422,25 +2422,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 @@ -2450,38 +2450,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.origin, 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.origin, goal ) > dist ) { self notify( "bad_path_internal" ); @@ -2497,14 +2497,14 @@ movetowards( goal ) { return; } - + self.bot.towards_goal = goal; - + lastOri = self.origin; stucks = 0; timeslow = 0; time = 0; - + if ( self.bot.issprinting ) { tempGoalDist = level.bots_goaldistance * 2; @@ -2513,34 +2513,34 @@ movetowards( goal ) { tempGoalDist = level.bots_goaldistance; } - + while ( distancesquared( self.origin, goal ) > tempGoalDist ) { self botSetMoveTo( goal ); - + if ( time > 3000 ) { time = 0; - + if ( distancesquared( self.origin, 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.origin; } else if ( timeslow > 0 && ( timeslow % 1000 ) == 0 ) @@ -2565,10 +2565,10 @@ movetowards( goal ) } } } - + wait 0.05; time += 50; - + if ( lengthsquared( self getvelocity() ) < 1000 ) { timeslow += 50; @@ -2577,7 +2577,7 @@ movetowards( goal ) { timeslow = 0; } - + if ( self.bot.issprinting ) { tempGoalDist = level.bots_goaldistance * 2; @@ -2586,13 +2586,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" ); } @@ -2605,11 +2605,11 @@ doMantle() self endon( "disconnect" ); self endon( "death" ); self endon( "kill_goal" ); - + self jump(); - + wait 0.35; - + self jump(); } @@ -2621,7 +2621,7 @@ getRandomLargestStafe( dist ) // find a better algo? traces = NewHeap( ::HeapTraceFraction ); myOrg = self.origin + ( 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 ) ); @@ -2630,19 +2630,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" ]; } @@ -2670,7 +2670,7 @@ sprint() self endon( "disconnect" ); self notify( "bot_sprint" ); self endon( "bot_sprint" ); - + self BotBuiltinBotAction( "+sprint" ); wait 0.05; self BotBuiltinBotAction( "-sprint" ); @@ -2684,37 +2684,37 @@ do_knife_target( target ) self endon( "death" ); self endon( "disconnect" ); self endon( "bot_knife" ); - + if ( !getdvarint( "aim_automelee_enabled" ) || !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 ( !self _hasperk( "specialty_extendedmelee" ) && dist > getdvarfloat( "aim_automelee_range" ) ) { self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); return; } - + self.bot.knifing_target = target; - + angles = vectortoangles( target.origin - self.origin ); self BotBuiltinBotMeleeParams( angles[ 1 ], dist ); - + wait 1; - + self.bot.knifing_target = undefined; self BotBuiltinBotMeleeParams( 0, 0 ); } @@ -2728,20 +2728,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; } @@ -2754,7 +2754,7 @@ reload() self endon( "disconnect" ); self notify( "bot_reload" ); self endon( "bot_reload" ); - + self BotBuiltinBotAction( "+reload" ); wait 0.05; self BotBuiltinBotAction( "-reload" ); @@ -2769,24 +2769,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; } @@ -2800,24 +2800,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; } @@ -2831,19 +2831,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" ); } @@ -2853,7 +2853,7 @@ use( time ) fire( what ) { self notify( "bot_fire" ); - + if ( what ) { self BotBuiltinBotAction( "+fire" ); @@ -2873,19 +2873,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" ); } @@ -2895,7 +2895,7 @@ pressFire( time ) ads( what ) { self notify( "bot_ads" ); - + if ( what ) { self BotBuiltinBotAction( "+ads" ); @@ -2915,19 +2915,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" ); } @@ -2940,18 +2940,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" ); @@ -2966,7 +2966,7 @@ stand() { return; } - + self BotBuiltinBotAction( "-gocrouch" ); self BotBuiltinBotAction( "-goprone" ); } @@ -2980,7 +2980,7 @@ crouch() { return; } - + self BotBuiltinBotAction( "+gocrouch" ); self BotBuiltinBotAction( "-goprone" ); } @@ -2994,7 +2994,7 @@ prone() { return; } - + self BotBuiltinBotAction( "-gocrouch" ); self BotBuiltinBotAction( "+goprone" ); } @@ -3013,15 +3013,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 ); @@ -3031,17 +3031,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; } @@ -3056,59 +3056,59 @@ 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 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 230dc1c..125da8f 100644 --- a/maps/mp/bots/_bot_script.gsc +++ b/maps/mp/bots/_bot_script.gsc @@ -17,19 +17,19 @@ added() { self endon( "disconnect" ); - + if ( !getdvarint( "developer_script" ) ) { 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 setKillstreaks(); - + self set_diff(); } @@ -39,23 +39,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 0.1; self.challengedata = []; } @@ -67,23 +67,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; } @@ -96,7 +96,7 @@ bot_get_prestige() { p = p_dvar; } - + return p; } @@ -107,27 +107,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" ]; @@ -137,26 +137,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 ) @@ -167,7 +167,7 @@ bot_get_rank() { rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxrank ) ); } - + return maps\mp\gametypes\_rank::getrankinfominxp( rank ); } @@ -177,24 +177,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 ] = card_name; } - + return cards; } @@ -204,24 +204,24 @@ getCardTitles() getCardIcons() { cards = []; - + for ( i = 0; i < 300; i++ ) { card_name = tablelookupbyrow( "mp/cardIconTable.csv", i, 0 ); - + if ( card_name == "" ) { continue; } - + if ( !issubstr( card_name, "cardicon_" ) ) { continue; } - + cards[ cards.size ] = card_name; } - + return cards; } @@ -231,12 +231,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; } @@ -246,22 +246,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; } @@ -271,21 +271,21 @@ 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" ) { continue; } - + weapon_name = tablelookupbyrow( "mp/statstable.csv", i, 4 ); - + primaries[ primaries.size ] = weapon_name; } - + return primaries; } @@ -295,26 +295,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" && weapon_type != "weapon_shotgun" ) { continue; } - + weapon_name = tablelookupbyrow( "mp/statstable.csv", i, 4 ); - + if ( weapon_name == "gl" ) { continue; } - + secondaries[ secondaries.size ] = weapon_name; } - + return secondaries; } @@ -324,19 +324,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; } @@ -346,31 +346,31 @@ getCamos() getPerks( perktype ) { perks = []; - + for ( i = 0; i < 50; 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_c4death" ) { continue; } - + if ( perk_name == "_specialty_blastshield" ) { continue; } - + perks[ perks.size ] = perk_name; } - + return perks; } @@ -388,34 +388,34 @@ getKillsNeededForStreak( streak ) getKillstreaks() { killstreaks = []; - + for ( i = 0; i < 40; 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" ) // theres an airdrop version { continue; } - + if ( issubstr( streak_name, "KILLSTREAKS_" ) ) { continue; } - + killstreaks[ killstreaks.size ] = streak_name; } - + return killstreaks; } @@ -428,66 +428,66 @@ chooseRandomPerk( perkkind, primary, primaryAtts ) 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_pistoldeath" ) { continue; } - + if ( perk == "specialty_coldblooded" ) { continue; } - + if ( perk == "specialty_localjammer" ) { continue; } } - + if ( reasonable ) { if ( perk == "specialty_bling" ) { continue; } - + if ( perk == "specialty_localjammer" ) { continue; } - + if ( perk == "throwingknife_mp" ) { continue; } - + if ( perk == "specialty_blastshield" ) { continue; } - + if ( perk == "frag_grenade_mp" ) { continue; } - + if ( perk == "specialty_copycat" ) { continue; } - + if ( perkkind == "perk1" ) { if ( perk == "specialty_onemanarmy" ) @@ -498,7 +498,7 @@ chooseRandomPerk( perkkind, primary, primaryAtts ) } } } - + if ( perkkind == "perk2" ) { if ( perk != "specialty_bulletdamage" ) @@ -516,62 +516,62 @@ chooseRandomPerk( perkkind, primary, primaryAtts ) { continue; } - + if ( primary == "cheytac" ) { continue; } - + if ( primary == "rpd" ) { continue; } - + if ( primary == "ak47" && randomint( 100 ) < 80 ) { continue; } - + if ( primary == "aug" ) { continue; } - + if ( primary == "barrett" && randomint( 100 ) < 80 ) { continue; } - + if ( primary == "tavor" && randomint( 100 ) < 80 ) { continue; } - + if ( primary == "scar" ) { continue; } - + if ( primary == "masada" && randomint( 100 ) < 60 ) { continue; } - + if ( primary == "m4" && randomint( 100 ) < 80 ) { continue; } - + if ( primary == "m16" ) { continue; } - + if ( primary == "fal" ) { continue; } - + if ( primary == "famas" ) { continue; @@ -580,22 +580,22 @@ chooseRandomPerk( perkkind, primary, primaryAtts ) } } } - + if ( perk == "specialty_null" ) { continue; } - + if ( !self isitemunlocked( perk ) ) { continue; } - + if ( randomfloatrange( 0, 1 ) < ( ( rank / level.maxrank ) + 0.1 ) ) { self.pers[ "bots" ][ "unlocks" ][ "upgraded_" + perk ] = true; } - + return perk; } } @@ -606,16 +606,16 @@ chooseRandomPerk( perkkind, primary, primaryAtts ) chooseRandomCamo() { camos = getCamos(); - + while ( true ) { camo = random( camos ); - + if ( camo == "gold" || camo == "prestige" ) { continue; } - + return camo; } } @@ -628,11 +628,11 @@ chooseRandomPrimary() primaries = getPrimaries(); allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); - + while ( true ) { primary = random( primaries ); - + if ( !allowOp ) { if ( primary == "riotshield" ) @@ -640,50 +640,50 @@ chooseRandomPrimary() continue; } } - + if ( reasonable ) { if ( primary == "riotshield" ) { continue; } - + if ( primary == "wa2000" ) { continue; } - + if ( primary == "uzi" ) { continue; } - + if ( primary == "sa80" ) { continue; } - + if ( primary == "fn2000" ) { continue; } - + if ( primary == "m240" ) { continue; } - + if ( primary == "mg4" ) { continue; } } - + if ( !self isitemunlocked( primary ) ) { continue; } - + return primary; } } @@ -697,15 +697,15 @@ chooseRandomSecondary( perk1 ) { return "onemanarmy"; } - + secondaries = getSecondaries(); allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); reasonable = getdvarint( "bots_loadout_reasonable" ); - + while ( true ) { secondary = random( secondaries ); - + if ( !allowOp ) { if ( secondary == "at4" || secondary == "rpg" || secondary == "m79" ) @@ -713,30 +713,30 @@ chooseRandomSecondary( perk1 ) continue; } } - + if ( reasonable ) { if ( secondary == "ranger" ) { continue; } - + if ( secondary == "model1887" ) { continue; } } - + if ( !self isitemunlocked( secondary ) ) { continue; } - + if ( secondary == "onemanarmy" ) { continue; } - + return secondary; } } @@ -750,26 +750,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" ) @@ -777,14 +777,14 @@ chooseRandomAttachmentComboForGun( gun ) continue; } } - + if ( reasonable ) { if ( att1 == "shotgun" || att2 == "shotgun" ) { continue; } - + if ( att1 == "akimbo" || att2 == "akimbo" ) { if ( gun != "ranger" && gun != "model1887" && gun != "glock" ) @@ -792,22 +792,22 @@ chooseRandomAttachmentComboForGun( gun ) continue; } } - + if ( att1 == "acog" || att2 == "acog" ) { continue; } - + if ( att1 == "thermal" || att2 == "thermal" ) { continue; } - + if ( att1 == "rof" || att2 == "rof" ) { continue; } - + if ( att1 == "silencer" || att2 == "silencer" ) { if ( gun == "spas12" || gun == "aa12" || gun == "striker" || gun == "rpd" || gun == "m1014" || gun == "cheytac" || gun == "barrett" || gun == "aug" || gun == "m240" || gun == "mg4" || gun == "sa80" || gun == "wa2000" ) @@ -816,11 +816,11 @@ chooseRandomAttachmentComboForGun( gun ) } } } - + retAtts = []; retAtts[ 0 ] = att1; retAtts[ 1 ] = att2; - + return retAtts; } } @@ -832,11 +832,11 @@ chooseRandomTactical() { tacts = strtok( "flash_grenade,smoke_grenade,concussion_grenade", "," ); reasonable = getdvarint( "bots_loadout_reasonable" ); - + while ( true ) { tact = random( tacts ); - + if ( reasonable ) { if ( tact == "smoke_grenade" ) @@ -844,7 +844,7 @@ chooseRandomTactical() continue; } } - + return tact; } } @@ -855,20 +855,20 @@ chooseRandomTactical() 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; } - + for ( i = 0; i < n; i++ ) { equipment = chooseRandomPerk( "equipment" ); @@ -878,33 +878,33 @@ setClasses() primary = chooseRandomPrimary(); primaryAtts = chooseRandomAttachmentComboForGun( primary ); perk1 = chooseRandomPerk( "perk1", primary, primaryAtts ); - + if ( perk1 != "specialty_bling" ) { primaryAtts[ 1 ] = "none"; } - + perk2 = chooseRandomPerk( "perk2", primary, primaryAtts ); primaryCamo = chooseRandomCamo(); secondary = chooseRandomSecondary( perk1 ); secondaryAtts = chooseRandomAttachmentComboForGun( secondary ); - + if ( perk1 != "specialty_bling" || !isdefined( self.pers[ "bots" ][ "unlocks" ][ "upgraded_specialty_bling" ] ) ) { secondaryAtts[ 1 ] = "none"; } - + if ( !getdvarint( "developer_script" ) ) { self setplayerdata( "customClasses", i, "weaponSetups", 0, "weapon", primary ); self setplayerdata( "customClasses", i, "weaponSetups", 0, "attachment", 0, primaryAtts[ 0 ] ); self setplayerdata( "customClasses", i, "weaponSetups", 0, "attachment", 1, primaryAtts[ 1 ] ); self setplayerdata( "customClasses", i, "weaponSetups", 0, "camo", primaryCamo ); - + self setplayerdata( "customClasses", i, "weaponSetups", 1, "weapon", secondary ); self setplayerdata( "customClasses", i, "weaponSetups", 1, "attachment", 0, secondaryAtts[ 0 ] ); self setplayerdata( "customClasses", i, "weaponSetups", 1, "attachment", 1, secondaryAtts[ 1 ] ); - + self setplayerdata( "customClasses", i, "perks", 0, equipment ); self setplayerdata( "customClasses", i, "perks", 1, perk1 ); self setplayerdata( "customClasses", i, "perks", 2, perk2 ); @@ -921,36 +921,36 @@ setClasses() 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; } @@ -960,90 +960,90 @@ isColidingKillstreak( killstreaks, killstreak ) setKillstreaks() { rankId = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ) + 1; - + allStreaks = getKillstreaks(); - + killstreaks = []; killstreaks[ 0 ] = ""; killstreaks[ 1 ] = ""; killstreaks[ 2 ] = ""; - + chooseableStreaks = 0; - + if ( rankId >= 10 ) { chooseableStreaks++; } - + if ( rankId >= 15 ) { chooseableStreaks++; } - + if ( rankId >= 22 ) { chooseableStreaks++; } - + reasonable = getdvarint( "bots_loadout_reasonable" ); op = getdvarint( "bots_loadout_allow_op" ); - + i = 0; - + while ( i < chooseableStreaks ) { slot = randomint( 3 ); - + if ( killstreaks[ slot ] != "" ) { continue; } - + streak = random( allStreaks ); - + if ( isColidingKillstreak( killstreaks, streak ) ) { continue; } - + if ( reasonable ) { if ( streak == "stealth_airstrike" ) { continue; } - + if ( streak == "airdrop_mega" ) { continue; } - + if ( streak == "emp" ) { continue; } - + if ( streak == "airdrop_sentry_minigun" ) { continue; } - + if ( streak == "airdrop" ) { continue; } - + if ( streak == "precision_airstrike" ) { continue; } - + if ( streak == "helicopter" ) { continue; } } - + if ( op ) { if ( streak == "nuke" ) @@ -1051,26 +1051,26 @@ setKillstreaks() continue; } } - + killstreaks[ slot ] = streak; i++; } - + if ( killstreaks[ 0 ] == "" ) { killstreaks[ 0 ] = "uav"; } - + if ( killstreaks[ 1 ] == "" ) { killstreaks[ 1 ] = "airdrop"; } - + if ( killstreaks[ 2 ] == "" ) { killstreaks[ 2 ] = "predator_missile"; } - + if ( !getdvarint( "developer_script" ) ) { self setplayerdata( "killstreaks", 0, killstreaks[ 0 ] ); @@ -1086,47 +1086,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; } @@ -1140,52 +1140,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 ); } @@ -1198,57 +1198,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; @@ -1264,11 +1264,11 @@ onKillcam() { level endon( "game_ended" ); self endon( "disconnect" ); - + for ( ;; ) { self waittill( "begin_killcam" ); - + self thread doKillcamStuff(); } } @@ -1280,20 +1280,20 @@ doKillcamStuff() { self endon( "disconnect" ); self endon( "killcam_ended" ); - + self BotNotifyBotEvent( "killcam", "start" ); - + wait 0.5 + randomint( 3 ); - + if ( randomint( 100 ) > 25 ) { self notify( "use_copycat" ); } - + wait 0.1; - + self notify( "abort_killcam" ); - + self BotNotifyBotEvent( "killcam", "stop" ); } @@ -1303,23 +1303,23 @@ doKillcamStuff() classWatch() { self endon( "disconnect" ); - + for ( ;; ) { while ( !isdefined( self.pers[ "team" ] ) || !allowClassChoiceUtil() ) { 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; @@ -1335,7 +1335,7 @@ chooseRandomClass() reasonable = getdvarint( "bots_loadout_reasonable" ); class = ""; rank = self maps\mp\gametypes\_rank::getrankforxp( self getplayerdata( "experience" ) ) + 1; - + if ( rank < 4 || ( randomint( 100 ) < 2 && !reasonable ) ) { while ( class == "" ) @@ -1345,29 +1345,29 @@ chooseRandomClass() case 0: class = "class0"; break; - + case 1: class = "class1"; break; - + case 2: class = "class2"; break; - + case 3: if ( rank >= 2 ) { class = "class3"; } - + break; - + case 4: if ( rank >= 3 ) { class = "class4"; } - + break; } } @@ -1376,7 +1376,7 @@ chooseRandomClass() { class = "custom" + ( randomint( 5 ) + 1 ); } - + return class; } @@ -1386,21 +1386,21 @@ chooseRandomClass() teamWatch() { self endon( "disconnect" ); - + for ( ;; ) { while ( !isdefined( self.pers[ "team" ] ) || !allowTeamChoiceUtil() ) { 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; @@ -1414,7 +1414,7 @@ teamWatch() difficulty() { self endon( "disconnect" ); - + for ( ;; ) { if ( getdvarint( "bots_skill" ) != 9 ) @@ -1441,7 +1441,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; @@ -1452,7 +1452,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; @@ -1473,7 +1473,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; @@ -1484,7 +1484,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; @@ -1505,7 +1505,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; @@ -1516,7 +1516,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; @@ -1537,7 +1537,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; @@ -1548,7 +1548,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; @@ -1569,7 +1569,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; @@ -1580,7 +1580,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; @@ -1601,7 +1601,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; @@ -1612,7 +1612,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; @@ -1633,7 +1633,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; @@ -1646,7 +1646,7 @@ difficulty() break; } } - + wait 5; } } @@ -1657,16 +1657,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 ); @@ -1676,11 +1676,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 ); @@ -1689,7 +1689,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 ); @@ -1700,7 +1700,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; @@ -1714,11 +1714,11 @@ set_diff() onDeath() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "death" ); - + self.wantsafespawn = true; } } @@ -1729,17 +1729,17 @@ onDeath() onGiveLoadout_loop() { class = self.class; - + if ( isdefined( self.bot_oma_class ) ) { class = self.bot_oma_class; } - + if ( allowClassChoiceUtil() ) { self botGiveLoadout( self.team, class, !isdefined( self.bot_oma_class ) ); } - + self.bot_oma_class = undefined; } @@ -1749,11 +1749,11 @@ onGiveLoadout_loop() onGiveLoadout() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "giveLoadout" ); - + self onGiveLoadout_loop(); } } @@ -1764,22 +1764,22 @@ 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.bot_oma_class = undefined; 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(); @@ -1794,11 +1794,11 @@ onBotSpawned() { self endon( "disconnect" ); level endon( "game_ended" ); - + for ( ;; ) { self waittill( "bot_spawned" ); - + self thread start_bot_threads(); } } @@ -1811,19 +1811,19 @@ start_bot_threads() self endon( "disconnect" ); level endon( "game_ended" ); self endon( "death" ); - + gameflagwait( "prematch_done" ); - + // inventory usage if ( getdvarint( "bots_play_killstreak" ) ) { self thread bot_killstreak_think(); } - + self thread bot_weapon_think(); self thread doReloadCancel(); self thread bot_perk_think(); - + // script targeting if ( getdvarint( "bots_play_target_other" ) ) { @@ -1831,27 +1831,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" ) ) { @@ -1862,31 +1862,31 @@ 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_gtnw(); self thread bot_oneflag(); self thread bot_arena(); self thread bot_vip(); } - + self thread bot_think_revive(); } @@ -1898,21 +1898,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--; @@ -1929,17 +1929,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" ); @@ -1958,22 +1958,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" ); } @@ -1987,22 +1987,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" ); } @@ -2017,17 +2017,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" ); } @@ -2042,22 +2042,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" ); @@ -2079,22 +2079,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" ); @@ -2125,7 +2125,7 @@ fire_current_weapon() self endon( "disconnect" ); self endon( "weapon_change" ); self endon( "stop_firing_weapon" ); - + for ( ;; ) { self thread BotPressAttack( 0.05 ); @@ -2141,21 +2141,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 ); } @@ -2167,12 +2167,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 ); @@ -2181,9 +2181,9 @@ botThrowGrenade( nade, time ) { self thread BotPressFrag( time ); } - + ret = self waittill_any_timeout( 5, "grenade_fire" ); - + return ( ret == "grenade_fire" ); } @@ -2193,7 +2193,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 ) ) @@ -2201,7 +2201,7 @@ bot_array_nearest_curorigin( array ) result = array[ i ]; } } - + return result; } @@ -2211,17 +2211,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; } @@ -2231,22 +2231,22 @@ getRocketAmmo() getLockonAmmo() { answer = undefined; - + if ( self getammocount( "at4_mp" ) ) { answer = "at4_mp"; } - + if ( self getammocount( "stinger_mp" ) ) { answer = "stinger_mp"; } - + if ( self getammocount( "javelin_mp" ) ) { answer = "javelin_mp"; } - + return answer; } @@ -2260,9 +2260,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(); } @@ -2272,27 +2272,27 @@ stop_go_target_on_death( tar ) follow_target_loop() { threat = self getThreat(); - + if ( !isplayer( threat ) ) { return; } - + if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "follow" ] * 5 ) { return; } - + 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 ); } @@ -2303,21 +2303,21 @@ follow_target() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { wait 1; - + if ( self HasScriptGoal() || self.bot_lock_goal ) { continue; } - + if ( !self hasThreat() ) { continue; } - + self follow_target_loop(); } } @@ -2328,35 +2328,35 @@ follow_target() bot_think_camp_loop() { campSpot = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "camp" ), 1024 ) ) ); - + if ( !isdefined( campSpot ) ) { return; } - + time = randomintrange( 30, 90 ); - + self BotNotifyBotEvent( "camp", "go", campSpot, time ); - + self SetScriptGoal( campSpot.origin, 16 ); - + 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 ); } @@ -2367,21 +2367,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(); } } @@ -2394,21 +2394,21 @@ killCampAfterTime( time ) self endon( "death" ); self endon( "disconnect" ); self endon( "kill_camp_bot" ); - + timeleft = maps\mp\gametypes\_gamelogic::gettimeremaining() / 1000; - + while ( time > 0 && timeleft >= 60 ) { wait 1; timeleft = maps\mp\gametypes\_gamelogic::gettimeremaining() / 1000; time--; } - + wait 0.05; - + self ClearScriptGoal(); self ClearScriptAimPos(); - + self notify( "kill_camp_bot" ); } @@ -2420,20 +2420,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" ); } @@ -2443,17 +2443,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" ); } @@ -2464,48 +2464,48 @@ 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 ); - + 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 ); } @@ -2516,26 +2516,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(); } } @@ -2548,17 +2548,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" ); } @@ -2571,9 +2571,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" ); @@ -2585,37 +2585,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" ); } @@ -2632,7 +2632,7 @@ bot_perk_think_loop() { break; } - + self _setperk( "_specialty_blastshield" ); } else @@ -2641,61 +2641,61 @@ bot_perk_think_loop() { break; } - + self _unsetperk( "_specialty_blastshield" ); } - + break; } - + for ( ; self _hasperk( "specialty_onemanarmy" ) && self hasweapon( "onemanarmy_mp" ); ) { if ( self hasThreat() || self HasBotJavelinLocation() ) { break; } - + if ( self inLastStand() && !self inFinalStand() ) { break; } - + anyWeapout = false; weaponsList = self getweaponslistall(); - + for ( i = 0; i < weaponsList.size; i++ ) { weap = weaponsList[ i ]; - + if ( self getammocount( weap ) || weap == "onemanarmy_mp" ) { continue; } - + anyWeapout = true; } - + if ( ( !anyWeapout && randomint( 100 ) < 90 ) || randomint( 100 ) < 10 ) { break; } - + class = self chooseRandomClass(); - + self.bot_oma_class = class; - + if ( !self changeToWeapon( "onemanarmy_mp" ) ) { self.bot_oma_class = undefined; break; } - + self BotFreezeControls( true ); wait 1; self BotFreezeControls( false ); - + self notify ( "menuresponse", game[ "menu_onemanarmy" ], self.bot_oma_class ); - + self waittill_any_timeout ( 10, "changed_kit" ); break; } @@ -2709,26 +2709,26 @@ bot_perk_think() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + for ( ;; ) { wait randomintrange( 5, 7 ); - + if ( self isusingremote() ) { continue; } - + if ( self BotIsFrozen() ) { continue; } - + if ( self isDefusing() || self isPlanting() ) { continue; } - + self bot_perk_think_loop(); } } @@ -2745,107 +2745,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; } @@ -2855,25 +2855,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 ); } @@ -2886,10 +2886,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 ); @@ -2908,83 +2908,83 @@ 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 ( !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; @@ -2993,21 +2993,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; } @@ -3017,20 +3017,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 ); } @@ -3043,10 +3043,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 ); @@ -3065,107 +3065,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; } @@ -3175,27 +3175,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 ); } @@ -3208,10 +3208,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 ); @@ -3224,7 +3224,7 @@ bot_use_grenade_think() bot_watch_think_mw2_loop() { tube = self getValidTube(); - + if ( !isdefined( tube ) ) { if ( self getammocount( "at4_mp" ) ) @@ -3240,19 +3240,19 @@ bot_watch_think_mw2_loop() return; } } - + if ( self getcurrentweapon() == tube ) { return; } - + chance = self.pers[ "bots" ][ "behavior" ][ "nade" ]; - + if ( randomint( 100 ) > chance ) { return; } - + self thread changeToWeapon( tube ); } @@ -3264,36 +3264,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(); } } @@ -3306,26 +3306,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 @@ -3334,39 +3334,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" || weapon == "onemanarmy_mp" ) { continue; } - + weap = weapon; break; } - + if ( weap == "" ) { return; } - + self thread changeToWeapon( weap ); } } @@ -3379,41 +3379,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(); } } @@ -3430,82 +3430,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; @@ -3514,21 +3514,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; } @@ -3538,21 +3538,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(); } @@ -3564,10 +3564,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 ); @@ -3586,98 +3586,98 @@ bot_equipment_kill_think_loop() myAngles = self getplayerangles(); dist = 512 * 512; target = undefined; - + for ( i = 0; i < grenades.size; i++ ) { item = grenades[ i ]; - + if ( !isdefined( item ) ) { continue; } - + if ( !isdefined( item.name ) ) { continue; } - + if ( isdefined( item.owner ) && ( ( level.teambased && item.owner.team == self.team ) || item.owner == self ) ) { continue; } - + if ( item.name != "c4_mp" && item.name != "claymore_mp" ) { 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; - + 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; } - + ti = player.setspawnpoint; - + if ( !isdefined( ti ) ) { continue; } - + if ( !isdefined( ti.bots ) ) { ti.bots = 0; } - + if ( ti.bots >= 2 ) { continue; } - + if ( !hasSitrep && !bullettracepassed( myEye, ti.origin, false, ti ) ) { continue; } - + if ( getConeDot( ti.origin, self.origin, myAngles ) < 0.6 ) { continue; } - + if ( distancesquared( ti.origin, self.origin ) < dist ) { target = ti; @@ -3685,56 +3685,56 @@ bot_equipment_kill_think_loop() } } } - + if ( !isdefined( target ) ) { return; } - + 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 ); } @@ -3746,21 +3746,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(); } } @@ -3771,11 +3771,11 @@ 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; @@ -3789,133 +3789,133 @@ 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() ); 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 ) ) { 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 ); } @@ -3926,16 +3926,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(); } } @@ -3946,75 +3946,75 @@ bot_listen_to_steps() bot_uav_think_loop() { 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" ) ) ) { 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; } } @@ -4027,31 +4027,31 @@ bot_uav_think() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { wait 0.75; - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 || self isusingremote() ) { continue; } - + if ( self isemped() || self.bot_isscrambled ) { continue; } - + if ( self _hasperk( "_specialty_blastshield" ) ) { continue; } - + if ( ( level.teambased && level.activecounteruavs[ level.otherteam[ self.team ] ] ) || ( !level.teambased && self.isradarblocked ) ) { continue; } - + self bot_uav_think_loop(); } } @@ -4063,12 +4063,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 ) ) @@ -4076,37 +4076,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 ); } } @@ -4121,27 +4121,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.health <= 20000 ) { break; } - + if ( isdefined( turret.carriedby ) ) { break; } } - + self notify( "bad_path" ); } @@ -4151,26 +4151,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.health <= 20000 ) { return; } - + if ( isdefined( enemy.carriedby ) ) { return; } - + // if ( !bullettracepassed( self geteye(), enemy.origin + ( 0, 0, 15 ), false, enemy ) ) // return; } @@ -4183,136 +4183,136 @@ 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.health <= 20000 ) { 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_coldblooded" ) ) { 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 ); } @@ -4324,11 +4324,11 @@ bot_turret_think() self endon( "death" ); self endon( "disconnect" ); level endon ( "game_ended" ); - + for ( ;; ) { wait( 1 ); - + self bot_turret_think_loop(); } } @@ -4339,48 +4339,48 @@ bot_turret_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.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" ); } @@ -4393,16 +4393,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(); } } @@ -4413,7 +4413,7 @@ bot_watch_stuck_on_crate() bot_crate_think_loop( data ) { ret = "crate_physics_done"; - + if ( data.first ) { data.first = false; @@ -4422,73 +4422,73 @@ bot_crate_think_loop( data ) { ret = self waittill_any_timeout( randomintrange( 3, 5 ), "crate_physics_done" ); } - + myTeam = self.pers[ "team" ]; 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.doingphysics ) || tempCrate.doingphysics ) { continue; } - + if ( !isdefined( tempCrate.bots ) ) { tempCrate.bots = 0; } - + if ( tempCrate.bots >= 3 ) { continue; } - + if ( isdefined( crate ) ) { if ( wantsClosest ) @@ -4506,65 +4506,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 ); } @@ -4577,10 +4577,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 ); @@ -4593,34 +4593,34 @@ bot_crate_think() doReloadCancel_loop() { ret = self waittill_any_return( "reload", "weapon_change" ); - + if ( self BotIsFrozen() ) { return; } - + if ( self isDefusing() || self isPlanting() ) { return; } - + if ( self isusingremote() ) { return; } - + if ( self inLastStand() && !self inFinalStand() ) { return; } - + curWeap = self getcurrentweapon(); - + if ( !maps\mp\gametypes\_weapons::isprimaryweapon( curWeap ) ) { return; } - + if ( ret == "reload" ) { // check single reloads @@ -4629,41 +4629,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 ); @@ -4679,7 +4679,7 @@ doReloadCancel() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self doReloadCancel_loop(); @@ -4692,72 +4692,72 @@ 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; } - + if ( isdefined( self.bot_oma_class ) ) { if ( curWeap != "onemanarmy_mp" ) { self thread changeToWeapon( "onemanarmy_mp" ); } - + return; } - + force = ( ret == "bot_force_check_switch" ); - + if ( data.first ) { data.first = false; - + if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "initswitch" ] ) { return; @@ -4771,7 +4771,7 @@ bot_weapon_think_loop( data ) { return; } - + if ( hasTarget ) { return; @@ -4782,39 +4782,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" || weapon == "onemanarmy_mp" ) { continue; } - + weap = weapon; break; } - + if ( weap == "" ) { return; } - + self thread changeToWeapon( weap ); } @@ -4826,10 +4826,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 ); @@ -4842,69 +4842,69 @@ bot_weapon_think() bot_target_vehicle_loop() { rocketAmmo = self getRocketAmmo(); - + if ( !isdefined( rocketAmmo ) && self BotGetRandom() < 90 ) { return; } - + 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 ( isdefined( tempTarget.owner ) && tempTarget.owner == self ) { continue; } - + if ( !bullettracepassed( myEye, tempTarget.origin, false, tempTarget ) ) { continue; } - + if ( tempTarget.health <= 0 ) { continue; } - + if ( tempTarget.classname != "script_vehicle" && !isdefined( lockOnAmmo ) ) { continue; } - + target = tempTarget; } - + targets = undefined; - + if ( !isdefined( target ) ) { 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 ); } @@ -4915,26 +4915,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() ) { continue; } - + self bot_target_vehicle_loop(); } } @@ -4945,14 +4945,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; @@ -4967,51 +4967,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_coldblooded" ) ) { 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 ); @@ -5020,7 +5020,7 @@ getKillstreakTargetLocation() { location = self.origin + ( randomintrange( -512, 512 ), randomintrange( -512, 512 ), 0 ); } - + return location; } @@ -5031,14 +5031,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(); @@ -5054,29 +5054,29 @@ isAnyEnemyPlanes() { return false; } - + for ( i = 0; i < level.harriers.size; i++ ) { plane = level.harriers[ i ]; - + if ( !isdefined( plane ) ) { continue; } - + if ( level.teambased && plane.team == self.team ) { continue; } - + if ( isdefined( plane.owner ) && plane.owner == self ) { continue; } - + return true; } - + return false; } @@ -5093,163 +5093,163 @@ bot_killstreak_think_loop( data ) { wait randomintrange( 1, 3 ); } - + if ( !isdefined( self.pers[ "killstreaks" ][ 0 ] ) ) { return; } - + if ( self BotIsFrozen() ) { return; } - + if ( self hasThreat() || self HasBotJavelinLocation() ) { return; } - + if ( self isDefusing() || self isPlanting() ) { return; } - + if ( self isemped() ) { return; } - + if ( self isusingremote() ) { return; } - + if ( self inLastStand() && !self inFinalStand() ) { return; } - - + + if ( isdefined( self.iscarrying ) && self.iscarrying ) { self notify( "place_sentry" ); } - + curWeap = self getcurrentweapon(); - + if ( issubstr( curWeap, "airdrop_" ) ) { self thread BotPressAttack( 0.05 ); } - - + + streakName = self.pers[ "killstreaks" ][ 0 ].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 ( isStrStart( streakName, "helicopter_" ) && self isAnyEnemyPlanes() && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 ) { return; } - + if ( maps\mp\killstreaks\_killstreaks::isridekillstreak( streakName ) || maps\mp\killstreaks\_killstreaks::iscarrykillstreak( streakName ) ) { if ( self inLastStand() ) { return; } - + if ( lifeId == self.deaths && !self HasScriptGoal() && !self.bot_lock_goal && streakName != "sentry" && !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 = true; return; } } - + if ( streakName == "sentry" ) { if ( self HasScriptAimPos() ) { return; } - + myEye = self geteye(); angles = self getplayerangles(); - + forwardTrace = bullettrace( myEye, myEye + anglestoforward( angles ) * 1024, false, self ); - + if ( distancesquared( self.origin, forwardTrace[ "position" ] ) < 1000 * 1000 && 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; } - + wait 1; self notify( "place_sentry" ); wait 0.05; self notify( "cancel_sentry" ); 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(); @@ -5257,37 +5257,37 @@ 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 clearusingremote(); self thread changeToWeapon( curWeap ); return; } - + self BotFreezeControls( true ); - + self maps\mp\killstreaks\_killstreaks::usedkillstreak( "predator_missile", true ); self maps\mp\killstreaks\_killstreaks::shufflekillstreaksfilo( "predator_missile" ); self maps\mp\killstreaks\_killstreaks::giveownedkillstreakitem(); - + 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 ); } @@ -5297,13 +5297,13 @@ bot_killstreak_think_loop( data ) { return; } - + self BotNotifyBotEvent( "killstreak", "call", streakName ); - + self BotRandomStance(); self BotStopMoving( true ); self changeToWeapon( ksWeap ); - + wait 3; self BotStopMoving( false ); } @@ -5313,13 +5313,13 @@ bot_killstreak_think_loop( data ) { return; } - + self BotNotifyBotEvent( "killstreak", "call", streakName ); - + self BotRandomStance(); self BotStopMoving( true ); self changeToWeapon( ksWeap ); - + wait 3; self BotStopMoving( false ); } @@ -5332,62 +5332,62 @@ bot_killstreak_think_loop( data ) { return; } - + if ( streakName != "airdrop_mega" && level.littlebirds > 2 ) { 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(); } @@ -5397,30 +5397,30 @@ bot_killstreak_think_loop( data ) { return; } - + if ( streakName == "nuke" && isdefined( level.nukeincoming ) ) { return; } - + if ( streakName == "counter_uav" && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 && ( ( level.teambased && level.activecounteruavs[ self.team ] ) || ( !level.teambased && level.activecounteruavs[ self.guid ] ) ) ) { return; } - + if ( streakName == "uav" && 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; } - + location = undefined; directionYaw = undefined; - + switch ( streakName ) { case "harrier_airstrike": @@ -5428,12 +5428,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 "uav": @@ -5441,24 +5441,24 @@ bot_killstreak_think_loop( data ) case "counter_uav": 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; } @@ -5474,10 +5474,10 @@ bot_killstreak_think() self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + data = spawnstruct(); data.dofastcontinue = false; - + for ( ;; ) { self bot_killstreak_think_loop( data ); @@ -5510,30 +5510,30 @@ BotUseRandomEquipment() { self endon( "death" ); self endon( "disconnect" ); - + nade = undefined; - + // in mw2, can only one of these... 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 ( !isdefined( nade ) ) { return; } - + self botThrowGrenade( nade, 0.05 ); } @@ -5544,43 +5544,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 ] ); @@ -5597,7 +5597,7 @@ BotLookAtRandomThing( obj_target ) { origin += self.origin + anglestoforward( ( 0, randomint( 360 ), 0 ) ) * 1024; } - + self SetScriptAimPos( origin ); wait 2; self ClearScriptAimPos(); @@ -5612,16 +5612,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 ); @@ -5638,7 +5638,7 @@ bot_do_random_action_for_objective( obj_target ) self thread BotLookAtRandomThing( obj_target ); } } - + wait 2; self.bot_random_obj_action = undefined; } @@ -5651,52 +5651,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 ); } @@ -5707,26 +5707,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(); } } @@ -5741,17 +5741,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" ); } @@ -5762,42 +5762,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 ); } @@ -5808,26 +5808,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(); } } @@ -5842,22 +5842,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" ); } @@ -5868,16 +5868,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 ) @@ -5902,20 +5902,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++ ) @@ -5930,53 +5930,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; } @@ -5987,26 +5987,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(); } } @@ -6021,27 +6021,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" ); @@ -6059,11 +6059,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 ) { @@ -6073,69 +6073,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 @@ -6143,34 +6143,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(); @@ -6185,31 +6185,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(); } } @@ -6224,27 +6224,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" ); @@ -6265,29 +6265,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" ); } @@ -6298,18 +6298,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 ) { @@ -6317,41 +6317,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() ) { @@ -6360,76 +6360,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 ) { @@ -6440,51 +6440,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 ) { @@ -6493,23 +6493,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 ) { @@ -6517,78 +6517,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; } @@ -6602,36 +6602,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(); } } @@ -6643,69 +6643,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 ); @@ -6714,67 +6714,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 ) { @@ -6782,57 +6782,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" ); } @@ -6844,34 +6844,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 ); } } @@ -6889,15 +6889,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 ) { @@ -6905,53 +6905,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 ) { @@ -6959,10 +6959,10 @@ bot_sd_attackers_loop( data ) { return; } - + bomb = level.sdbomb; carrier = level.sdbomb.carrier; - + // bomb is picked up if ( isdefined( carrier ) ) { @@ -6971,32 +6971,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 ) { @@ -7004,66 +7004,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 ); @@ -7072,46 +7072,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 ); } @@ -7123,21 +7123,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 ); @@ -7151,36 +7151,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 @@ -7189,9 +7189,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 @@ -7200,14 +7200,14 @@ bot_cap_loop() { return; } - + if ( !isdefined( theirzone.bots ) ) { theirzone.bots = 0; } - + origin = theirzone.curorigin; - + if ( theirzone.bots > 2 || randomint( 100 ) < 45 ) { // kill carrier @@ -7215,22 +7215,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 ) { @@ -7239,11 +7239,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(); @@ -7257,57 +7257,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(); @@ -7323,31 +7323,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(); } } @@ -7358,12 +7358,12 @@ bot_cap() getCarrierEntNum() { carrierNum = -1; - + if ( isdefined( self.carrier ) ) { carrierNum = self.carrier getentitynumber(); } - + return carrierNum; } @@ -7373,43 +7373,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; } @@ -7424,22 +7424,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" ); @@ -7461,20 +7461,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" ); } @@ -7485,21 +7485,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 ) @@ -7510,10 +7510,10 @@ bot_dem_attackers_loop() { sites[ sites.size ] = bomb; } - + continue; } - + if ( bomb.label == "_b" ) { if ( level.bombbplanted ) @@ -7524,15 +7524,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 @@ -7542,129 +7542,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 ) { @@ -7672,58 +7672,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 ); } @@ -7735,31 +7735,31 @@ bot_dem_attackers() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "dd" ) { return; } - + if ( self.team != game[ "attackers" ] ) { 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(); } } @@ -7771,21 +7771,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 ) @@ -7796,10 +7796,10 @@ bot_dem_defenders_loop() { sites[ sites.size ] = bomb; } - + continue; } - + if ( bomb.label == "_b" ) { if ( level.bombbplanted ) @@ -7810,15 +7810,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 @@ -7828,131 +7828,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 ) { @@ -7960,59 +7960,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 ); } @@ -8024,31 +8024,31 @@ bot_dem_defenders() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + if ( level.gametype != "dd" ) { return; } - + if ( self.team == game[ "attackers" ] ) { 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(); } } @@ -8064,22 +8064,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" ); @@ -8101,17 +8101,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" ); } @@ -8121,65 +8121,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 ); } @@ -8191,36 +8191,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(); } } @@ -8234,88 +8234,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; } @@ -8327,26 +8327,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(); } } @@ -8358,39 +8358,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" ); @@ -8398,24 +8398,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(); @@ -8425,11 +8425,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" ); @@ -8437,19 +8437,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 @@ -8457,22 +8457,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 ) { @@ -8481,11 +8481,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(); @@ -8498,17 +8498,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(); @@ -8525,26 +8525,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(); } } @@ -8556,45 +8556,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" ); } @@ -8606,26 +8606,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(); } } @@ -8642,22 +8642,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 ) @@ -8666,21 +8666,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" ); } } @@ -8691,9 +8691,9 @@ bot_vip_loop() { return; } - + self SetScriptGoal( vip.origin, 256 ); - + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) { self ClearScriptGoal(); @@ -8709,9 +8709,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(); @@ -8721,7 +8721,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(); @@ -8738,21 +8738,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(); } } diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index 04551fb..338f78b 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -25,7 +25,7 @@ wait_for_builtins() { return true; } - + if ( i < 18 ) { waittillframeend; @@ -35,7 +35,7 @@ wait_for_builtins() wait 0.05; } } - + return false; } @@ -70,7 +70,7 @@ BotBuiltinFileRead( file ) { return [[ level.bot_builtins[ "fileread" ] ]]( file ); } - + return undefined; } @@ -83,7 +83,7 @@ BotBuiltinFileExists( file ) { return [[ level.bot_builtins[ "fileexists" ] ]]( file ); } - + return false; } @@ -148,35 +148,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 ] ) @@ -185,12 +185,12 @@ doHostCheck() } } } - + if ( !self ishost() && !result ) { return; } - + self.pers[ "bot_host" ] = true; } @@ -201,7 +201,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" ) ); } @@ -215,11 +215,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; @@ -275,7 +275,7 @@ BotGetTargetRandom() { return undefined; } - + return self.bot.target.rand; } @@ -333,7 +333,7 @@ IsBotKnifing() BotFreezeControls( what ) { self.bot.isfrozen = what; - + if ( what ) { self notify( "kill_goal" ); @@ -354,7 +354,7 @@ BotIsFrozen() BotStopMoving( what ) { self.bot.stop_move = what; - + if ( what ) { self notify( "kill_goal" ); @@ -387,7 +387,7 @@ SetScriptGoal( goal, dist ) { dist = 16; } - + self.bot.script_goal = goal; self.bot.script_goal_dist = dist; waittillframeend; @@ -528,7 +528,7 @@ getThreat() { return undefined; } - + return self.bot.target.entity; } @@ -634,22 +634,22 @@ isArtShocked() getValidTube() { weaps = self getweaponslistall(); - + for ( i = 0; i < weaps.size; i++ ) { weap = weaps[ i ]; - + if ( !self getammocount( weap ) ) { continue; } - + if ( ( issubstr( weap, "gl_" ) && !issubstr( weap, "_gl_" ) ) || weap == "m79_mp" ) { return weap; } } - + return undefined; } @@ -659,12 +659,12 @@ getValidTube() allowClassChoiceUtil() { entry = tablelookup( "mp/gametypesTable.csv", 0, level.gametype, 4 ); - + if ( !isdefined( entry ) || entry == "" ) { return true; } - + return int( entry ); } @@ -674,12 +674,12 @@ allowClassChoiceUtil() allowTeamChoiceUtil() { entry = tablelookup( "mp/gametypesTable.csv", 0, level.gametype, 5 ); - + if ( !isdefined( entry ) || entry == "" ) { return true; } - + return int( entry ); } @@ -702,7 +702,7 @@ waittill_either_return( str1, str2 ) { return str1; } - + return str2; } @@ -718,24 +718,24 @@ getValidGrenade() grenadeTypes[ grenadeTypes.size ] = "concussion_grenade_mp"; grenadeTypes[ grenadeTypes.size ] = "semtex_mp"; grenadeTypes[ grenadeTypes.size ] = "throwingknife_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 ); } @@ -761,10 +761,10 @@ entIsVehicle( ent ) WeaponIsFullAuto( weap ) { weaptoks = strtok( weap, "_" ); - + assert( isdefined( weaptoks[ 0 ] ) ); assert( isstring( weaptoks[ 0 ] ) ); - + return isdefined( level.bots_fullautoguns[ weaptoks[ 0 ] ] ); } @@ -799,27 +799,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++; @@ -833,7 +833,7 @@ getBotToKick() return bot; } } - + // search for a bot on the other team if ( team == "custom" || team == "axis" ) { @@ -843,7 +843,7 @@ getBotToKick() { // get the team with the most bots team = "allies"; - + if ( axis > allies ) { team = "axis"; @@ -853,63 +853,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; } @@ -921,15 +921,15 @@ GetHostPlayer() for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( !player is_host() ) { continue; } - + return player; } - + return undefined; } @@ -939,51 +939,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; } } @@ -996,17 +996,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 ]; @@ -1016,35 +1016,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; } @@ -1056,20 +1056,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; } @@ -1090,7 +1090,7 @@ distancesquared2D( to, from ) { to = ( to[ 0 ], to[ 1 ], 0 ); from = ( from[ 0 ], from[ 1 ], 0 ); - + return distancesquared( to, from ); } @@ -1100,7 +1100,7 @@ distancesquared2D( to, from ) Round( x ) { y = int( x ); - + if ( abs( x ) - abs( y ) > 0.5 ) { if ( x < 0 ) @@ -1124,7 +1124,7 @@ Round( x ) float_old( num ) { setdvar( "temp_dvar_bot_util", num ); - + return getdvarfloat( "temp_dvar_bot_util" ); } @@ -1142,47 +1142,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; } @@ -1194,21 +1194,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++ ) { @@ -1217,26 +1217,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; } @@ -1248,32 +1248,32 @@ 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; } @@ -1286,16 +1286,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; @@ -1309,37 +1309,37 @@ 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"; } - + level.waypoints[ i ].childcount = undefined; } } @@ -1350,19 +1350,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; } @@ -1372,21 +1372,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; } @@ -1397,21 +1397,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; } @@ -1421,18 +1421,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; @@ -1442,10 +1442,10 @@ getWaypointsOfType( type ) { continue; } - + answer[ answer.size ] = i; } - + return answer; } @@ -1458,7 +1458,7 @@ getWaypointForIndex( i ) { return undefined; } - + return level.waypoints[ i ]; } @@ -1471,204 +1471,204 @@ getMapName( mapname ) { case "mp_abandon": return "Carnival"; - + case "mp_rundown": return "Rundown"; - + case "mp_afghan": return "Afghan"; - + case "mp_boneyard": return "Scrapyard"; - + case "mp_brecourt": return "Wasteland"; - + case "mp_cargoship": return "Wetwork"; - + case "mp_checkpoint": return "Karachi"; - + case "mp_compact": return "Salvage"; - + case "mp_complex": return "Bailout"; - + case "mp_crash": return "Crash"; - + case "mp_cross_fire": return "Crossfire"; - + case "mp_derail": return "Derail"; - + case "mp_estate": return "Estate"; - + case "mp_favela": return "Favela"; - + case "mp_fuel2": return "Fuel"; - + case "mp_highrise": return "Highrise"; - + case "mp_invasion": return "Invasion"; - + case "mp_killhouse": return "Killhouse"; - + case "mp_nightshift": return "Skidrow"; - + case "mp_nuked": return "Nuketown"; - + case "oilrig": return "Oilrig"; - + case "mp_quarry": return "Quarry"; - + case "mp_rust": return "Rust"; - + case "mp_storm": return "Storm"; - + case "mp_strike": return "Strike"; - + case "mp_subbase": return "Subbase"; - + case "mp_terminal": return "Terminal"; - + case "mp_trailerpark": return "Trailer Park"; - + case "mp_overgrown": return "Overgrown"; - + case "mp_underpass": return "Underpass"; - + case "mp_vacant": return "Vacant"; - + case "iw4_credits": return "IW4 Test Map"; - + case "airport": return "Airport"; - + case "co_hunted": return "Hunted"; - + case "invasion": return "Burgertown"; - + case "mp_bloc": return "Bloc"; - + case "mp_bog_sh": return "Bog"; - + case "contingency": return "Contingency"; - + case "gulag": return "Gulag"; - + case "so_ghillies": return "Pripyat"; - + case "ending": return "Museum"; - + case "af_chase": return "Afghan Chase"; - + case "af_caves": return "Afghan Caves"; - + case "arcadia": return "Arcadia"; - + case "boneyard": return "Boneyard"; - + case "cliffhanger": return "Cliffhanger"; - + case "dcburning": return "DCBurning"; - + case "dcemp": return "DCEMP"; - + case "downtown": return "Downtown"; - + case "estate": return "EstateSP"; - + case "favela": return "FavelaSP"; - + case "favela_escape": return "Favela Escape"; - + case "roadkill": return "Roadkill"; - + case "trainer": return "TH3 PIT"; - + case "so_bridge": return "Bridge"; - + case "dc_whitehouse": return "Whitehouse"; - + case "mp_shipment_long": return "ShipmentLong"; - + case "mp_shipment": return "Shipment"; - + case "mp_firingrange": return "Firing Range"; - + case "mp_rust_long": return "RustLong"; - + case "mp_cargoship_sh": return "Freighter"; - + case "mp_storm_spring": return "Chemical Plant"; - + case "mp_crash_trop": case "mp_crash_tropical": return "Crash Tropical"; - + case "mp_fav_tropical": return "Favela Tropical"; - + case "mp_estate_trop": case "mp_estate_tropical": return "Estate Tropical"; - + case "mp_bloc_sh": return "Forgotten City"; - + default: return mapname; } @@ -1717,7 +1717,7 @@ getGoodMapAmount() { return 4; } - + case "mp_vacant": case "mp_terminal": case "mp_nightshift": @@ -1737,7 +1737,7 @@ getGoodMapAmount() { return 8; } - + case "mp_afghan": case "mp_crash": case "mp_brecourt": @@ -1772,7 +1772,7 @@ getGoodMapAmount() { return 9; } - + case "mp_fuel2": case "mp_invasion": case "mp_derail": @@ -1784,7 +1784,7 @@ getGoodMapAmount() { return 10; } - + default: return 2; } @@ -1796,122 +1796,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; } @@ -1922,19 +1922,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; } @@ -1944,9 +1944,9 @@ getBotArray() WaypointsToKDTree() { kdTree = KDTree(); - + kdTree _WaypointsToKDTree( level.waypoints, 0 ); - + return kdTree; } @@ -1959,44 +1959,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 ) @@ -2008,11 +2008,11 @@ _WaypointsToKDTree( waypoints, dem ) left[ left.size ] = sorted[ i ]; } } - + self KDTreeInsert( sorted[ median ] ); - + _WaypointsToKDTree( left, ( dem + 1 ) % 3 ); - + _WaypointsToKDTree( right, ( dem + 1 ) % 3 ); } @@ -2024,7 +2024,7 @@ List() list = spawnstruct(); list.count = 0; list.data = []; - + return list; } @@ -2034,7 +2034,7 @@ List() ListAdd( thing ) { self.data[ self.count ] = thing; - + self.count++; } @@ -2047,7 +2047,7 @@ ListAddFirst( thing ) { self.data[ i + 1 ] = self.data[ i ]; } - + self.data[ 0 ] = thing; self.count++; } @@ -2066,7 +2066,7 @@ ListRemove( thing ) self.data[ i ] = self.data[ i + 1 ]; i++; } - + self.data[ i ] = undefined; self.count--; break; @@ -2082,7 +2082,7 @@ KDTree() kdTree = spawnstruct(); kdTree.root = undefined; kdTree.count = 0; - + return kdTree; } @@ -2111,12 +2111,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: @@ -2128,9 +2128,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 ] ) { @@ -2140,9 +2140,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 ] ) { @@ -2152,10 +2152,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; } @@ -2168,7 +2168,7 @@ KDTreeNearest( origin ) { return undefined; } - + return self _KDTreeNearest( self.root, origin, self.root.data, distancesquared( self.root.data.origin, origin ), 0 ); } @@ -2181,31 +2181,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; } @@ -2217,7 +2217,7 @@ Rectdistancesquared( origin ) dx = 0; dy = 0; dz = 0; - + if ( origin[ 0 ] < self.x0 ) { dx = origin[ 0 ] - self.x0; @@ -2226,7 +2226,7 @@ Rectdistancesquared( origin ) { dx = origin[ 0 ] - self.x1; } - + if ( origin[ 1 ] < self.y0 ) { dy = origin[ 1 ] - self.y0; @@ -2235,8 +2235,8 @@ Rectdistancesquared( origin ) { dy = origin[ 1 ] - self.y1; } - - + + if ( origin[ 2 ] < self.z0 ) { dz = origin[ 2 ] - self.z0; @@ -2245,7 +2245,7 @@ Rectdistancesquared( origin ) { dz = origin[ 2 ] - self.z1; } - + return dx * dx + dy * dy + dz * dz; } @@ -2313,7 +2313,7 @@ NewHeap( compare ) heap_node = spawnstruct(); heap_node.data = []; heap_node.compare = compare; - + return heap_node; } @@ -2324,19 +2324,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; } @@ -2349,17 +2349,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; @@ -2376,39 +2376,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; } @@ -2429,14 +2429,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; @@ -2450,25 +2450,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; } @@ -2479,20 +2479,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; } @@ -2506,59 +2506,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 ) { @@ -2567,12 +2567,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 ) ) @@ -2581,68 +2581,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 + "" ]; @@ -2655,19 +2655,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 ) { @@ -2675,11 +2675,11 @@ AStarSearch( start, goal, team, greedy_path ) openset[ child + "" ] = node; } } - + // done with children, push onto closed closed[ bestNode.index + "" ] = bestNode; } - + return []; } @@ -2691,12 +2691,12 @@ array_average( array ) { assert( array.size > 0 ); total = 0; - + for ( i = 0; i < array.size; i++ ) { total += array[ i ]; } - + return ( total / array.size ); } @@ -2708,19 +2708,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 ); } @@ -2734,28 +2734,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 ); } @@ -2769,7 +2769,7 @@ onUsePlantObjectFix( player ) { level thread bombPlantedFix( self, player ); // player logstring( "bomb planted: " + self.label ); - + // disable all bomb zones except this one for ( index = 0; index < level.bombzones.size; index++ ) { @@ -2777,20 +2777,20 @@ onUsePlantObjectFix( player ) { continue; } - + level.bombzones[ index ] maps\mp\gametypes\_gameobjects::disableobject(); } - + player playsound( "mp_bomb_plant" ); player notify ( "bomb_planted" ); - + // if ( !level.hardcoremode ) // iprintln( &"MP_EXPLOSIVES_PLANTED_BY", player ); - + leaderdialog( "bomb_planted" ); - + level thread teamplayercardsplash( "callout_bombplanted", player ); - + level.bombowner = player; player thread maps\mp\gametypes\_hud_message::splashnotify( "plant", maps\mp\gametypes\_rank::getscoreinfovalue( "plant" ) ); player thread maps\mp\gametypes\_rank::giverankxp( "plant" ); @@ -2808,14 +2808,14 @@ bombPlantedFix( destroyedObj, player ) { maps\mp\gametypes\_gamelogic::pausetimer(); level.bombplanted = true; - + destroyedObj.visuals[ 0 ] thread maps\mp\gametypes\_gamelogic::playtickingsound(); level.tickingobject = destroyedObj.visuals[ 0 ]; - + level.timelimitoverride = true; setgameendtime( int( gettime() + ( level.bombtimer * 1000 ) ) ); setdvar( "ui_bomb_timer", 1 ); - + if ( !level.multibomb ) { level.sdbomb maps\mp\gametypes\_gameobjects::allowcarry( "none" ); @@ -2832,19 +2832,19 @@ bombPlantedFix( destroyedObj, player ) level.players[ index ].carryicon destroyelem(); } } - + trace = bullettrace( player.origin + ( 0, 0, 20 ), player.origin - ( 0, 0, 2000 ), false, player ); - + tempAngle = randomfloat( 360 ); forward = ( cos( tempAngle ), sin( tempAngle ), 0 ); forward = vectornormalize( forward - vector_multiply( trace[ "normal" ], vectordot( forward, trace[ "normal" ] ) ) ); dropAngles = vectortoangles( forward ); - + level.sdbombmodel = spawn( "script_model", trace[ "position" ] ); level.sdbombmodel.angles = dropAngles; level.sdbombmodel setmodel( "prop_suitcase_bomb" ); } - + destroyedObj maps\mp\gametypes\_gameobjects::allowuse( "none" ); destroyedObj maps\mp\gametypes\_gameobjects::setvisibleteam( "none" ); /* @@ -2854,7 +2854,7 @@ bombPlantedFix( destroyedObj, player ) destroyedObj maps\mp\gametypes\_gameobjects::set3dicon( "enemy", undefined ); */ label = destroyedObj maps\mp\gametypes\_gameobjects::getlabel(); - + // create a new object to defuse with. trigger = destroyedObj.bombdefusetrig; trigger.origin = level.sdbombmodel.origin; @@ -2874,24 +2874,24 @@ bombPlantedFix( destroyedObj, player ) 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 ); - + destroyedObj.visuals[ 0 ] maps\mp\gametypes\_gamelogic::stoptickingsound(); - + if ( level.gameended || level.bombdefused ) { return; } - + level.bombexploded = true; - + explosionOrigin = level.sdbombmodel.origin; level.sdbombmodel hide(); - + if ( isdefined( player ) ) { destroyedObj.visuals[ 0 ] radiusdamage( explosionOrigin, 512, 200, 20, player ); @@ -2901,32 +2901,32 @@ bombPlantedFix( destroyedObj, player ) { destroyedObj.visuals[ 0 ] radiusdamage( explosionOrigin, 512, 200, 20 ); } - + rot = randomfloat( 360 ); explosionEffect = spawnfx( level._effect[ "bombexplosion" ], explosionOrigin + ( 0, 0, 50 ), ( 0, 0, 1 ), ( cos( rot ), sin( rot ), 0 ) ); triggerfx( explosionEffect ); - + playrumbleonposition( "grenade_rumble", explosionOrigin ); earthquake( 0.75, 2.0, explosionOrigin, 2000 ); - + thread playsoundinspace( "exp_suitcase_bomb_main", explosionOrigin ); - + if ( isdefined( destroyedObj.exploderindex ) ) { exploder( destroyedObj.exploderindex ); } - + for ( index = 0; index < level.bombzones.size; index++ ) { level.bombzones[ index ] maps\mp\gametypes\_gameobjects::disableobject(); } - + defuseObject maps\mp\gametypes\_gameobjects::disableobject(); - + setgameendtime( 0 ); - + wait 3; - + maps\mp\gametypes\sd::sd_endgame( game[ "attackers" ], game[ "strings" ][ "target_destroyed" ] ); } @@ -2937,28 +2937,28 @@ bombPlantedFix( destroyedObj, player ) botGiveLoadout( team, class, allowCopycat ) { self endon( "death" ); - + self takeallweapons(); - + primaryIndex = 0; - + // initialize specialty array self.specialty = []; - + if ( !isdefined( allowCopycat ) ) { allowCopycat = true; } - + primaryWeapon = undefined; - + if ( isdefined( self.pers[ "copyCatLoadout" ] ) && self.pers[ "copyCatLoadout" ][ "inUse" ] && allowCopycat ) { self maps\mp\gametypes\_class::setclass( "copycat" ); self.class_num = maps\mp\gametypes\_class::getclassindex( "copycat" ); - + clonedLoadout = self.pers[ "copyCatLoadout" ]; - + loadoutPrimary = clonedLoadout[ "loadoutPrimary" ]; loadoutPrimaryAttachment = clonedLoadout[ "loadoutPrimaryAttachment" ]; loadoutPrimaryAttachment2 = clonedLoadout[ "loadoutPrimaryAttachment2" ] ; @@ -2978,7 +2978,7 @@ botGiveLoadout( team, class, allowCopycat ) { class_num = maps\mp\gametypes\_class::getclassindex( class ); self.class_num = class_num; - + loadoutPrimary = maps\mp\gametypes\_class::cac_getweapon( class_num, 0 ); loadoutPrimaryAttachment = maps\mp\gametypes\_class::cac_getweaponattachment( class_num, 0 ); loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::cac_getweaponattachmenttwo( class_num, 0 ); @@ -2999,7 +2999,7 @@ botGiveLoadout( team, class, allowCopycat ) { class_num = maps\mp\gametypes\_class::getclassindex( class ); self.class_num = class_num; - + loadoutPrimary = maps\mp\gametypes\_class::table_getweapon( level.classtablename, class_num, 0 ); loadoutPrimaryAttachment = maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, class_num, 0, 0 ); loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::table_getweaponattachment( level.classtablename, class_num, 0, 1 ); @@ -3016,54 +3016,54 @@ botGiveLoadout( team, class, allowCopycat ) loadoutOffhand = maps\mp\gametypes\_class::table_getoffhand( level.classtablename, class_num ); loadoutDeathStreak = maps\mp\gametypes\_class::table_getdeathstreak( level.classtablename, class_num ); } - + if ( loadoutPerk1 != "specialty_bling" ) { loadoutPrimaryAttachment2 = "none"; loadoutSecondaryAttachment2 = "none"; } - + if ( loadoutPerk1 != "specialty_onemanarmy" && loadoutSecondary == "onemanarmy" ) { loadoutSecondary = maps\mp\gametypes\_class::table_getweapon( level.classtablename, 10, 1 ); } - + // loadoutSecondaryCamo = "none"; - + // stop default class op'ness allowOp = ( getdvarint( "bots_loadout_allow_op" ) >= 1 ); - + if ( !allowOp ) { loadoutDeathStreak = "specialty_null"; - + if ( loadoutPrimary == "riotshield" ) { loadoutPrimary = "m4"; } - + if ( loadoutSecondary == "at4" ) { loadoutSecondary = "usp"; } - + if ( loadoutPrimaryAttachment == "gl" ) { loadoutPrimaryAttachment = "none"; } - + if ( loadoutPerk2 == "specialty_coldblooded" ) { loadoutPerk2 = "specialty_null"; } - + if ( loadoutPerk3 == "specialty_localjammer" ) { loadoutPerk3 = "specialty_null"; } } - - + + if ( level.killstreakrewards ) { if ( getdvarint( "scr_classic" ) == 1 ) @@ -3085,44 +3085,44 @@ botGiveLoadout( team, class, allowCopycat ) loadoutKillstreak2 = "none"; loadoutKillstreak3 = "none"; } - + secondaryName = maps\mp\gametypes\_class::buildweaponname( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2 ); self _giveweapon( secondaryName, int( tablelookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ) ); - + self.loadoutprimarycamo = int( tablelookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 ) ); self.loadoutprimary = loadoutPrimary; self.loadoutsecondary = loadoutSecondary; self.loadoutsecondarycamo = int( tablelookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ); - + self setoffhandprimaryclass( "other" ); - + // Action Slots // self _setactionslot( 1, "" ); self _setactionslot( 1, "nightvision" ); self _setactionslot( 3, "altMode" ); self _setactionslot( 4, "" ); - + // Perks self _clearperks(); self maps\mp\gametypes\_class::_detachall(); - + // these special case giving pistol death have to come before // perk loadout to ensure player perk icons arent overwritten if ( level.diehardmode ) { self maps\mp\perks\_perks::giveperk( "specialty_pistoldeath" ); } - + // only give the deathstreak for the initial spawn for this life. if ( loadoutDeathStreak != "specialty_null" && ( gettime() - self.spawntime ) < 0.1 ) { deathVal = int( tablelookup( "mp/perkTable.csv", 1, loadoutDeathStreak, 6 ) ); - + if ( self botGetPerkUpgrade( loadoutPerk1 ) == "specialty_rollover" || self botGetPerkUpgrade( loadoutPerk2 ) == "specialty_rollover" || self botGetPerkUpgrade( loadoutPerk3 ) == "specialty_rollover" ) { deathVal -= 1; } - + if ( self.pers[ "cur_death_streak" ] == deathVal ) { self thread maps\mp\perks\_perks::giveperk( loadoutDeathStreak ); @@ -3133,41 +3133,41 @@ botGiveLoadout( team, class, allowCopycat ) self thread maps\mp\perks\_perks::giveperk( loadoutDeathStreak ); } } - + self botLoadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 ); - + self maps\mp\gametypes\_class::setkillstreaks( loadoutKillstreak1, loadoutKillstreak2, loadoutKillstreak3 ); - + if ( self hasperk( "specialty_extraammo", true ) && getweaponclass( secondaryName ) != "weapon_projectile" ) { self givemaxammo( secondaryName ); } - + // Primary Weapon primaryName = maps\mp\gametypes\_class::buildweaponname( loadoutPrimary, loadoutPrimaryAttachment, loadoutPrimaryAttachment2 ); self _giveweapon( primaryName, self.loadoutprimarycamo ); - + // fix changing from a riotshield class to a riotshield class during grace period not giving a shield if ( primaryName == "riotshield_mp" && level.ingraceperiod ) { self notify ( "weapon_change", "riotshield_mp" ); } - + if ( self hasperk( "specialty_extraammo", true ) ) { self givemaxammo( primaryName ); } - + self setspawnweapon( primaryName ); - + primaryTokens = strtok( primaryName, "_" ); self.pers[ "primaryWeapon" ] = primaryTokens[ 0 ]; - + // Primary Offhand was given by giveperk (it's your perk1) - + // Secondary Offhand offhandSecondaryWeapon = loadoutOffhand + "_mp"; - + if ( loadoutOffhand == "flash_grenade" ) { self setoffhandsecondaryclass( "flash" ); @@ -3176,9 +3176,9 @@ botGiveLoadout( team, class, allowCopycat ) { self setoffhandsecondaryclass( "smoke" ); } - + self giveweapon( offhandSecondaryWeapon ); - + if ( loadoutOffhand == "smoke_grenade" ) { self setweaponammoclip( offhandSecondaryWeapon, 1 ); @@ -3195,20 +3195,20 @@ botGiveLoadout( team, class, allowCopycat ) { self setweaponammoclip( offhandSecondaryWeapon, 1 ); } - + primaryWeapon = primaryName; self.primaryweapon = primaryWeapon; self.secondaryweapon = secondaryName; - + self botPlayerModelForWeapon( self.pers[ "primaryWeapon" ], getbaseweaponname( secondaryName ) ); - + self.issniper = ( weaponclass( self.primaryweapon ) == "sniper" ); - + self maps\mp\gametypes\_weapons::updatemovespeedscale( "primary" ); - + // cac specialties that require loop threads self maps\mp\perks\_perks::cac_selector(); - + self notify ( "changed_kit" ); self notify( "bot_giveLoadout", allowCopycat ); } @@ -3219,17 +3219,17 @@ botGiveLoadout( team, class, allowCopycat ) botGetPerkUpgrade( 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 ); } @@ -3242,36 +3242,36 @@ botLoadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 ) loadoutPerk1 = maps\mp\perks\_perks::validateperk( 1, loadoutPerk1 ); loadoutPerk2 = maps\mp\perks\_perks::validateperk( 2, loadoutPerk2 ); loadoutPerk3 = maps\mp\perks\_perks::validateperk( 3, loadoutPerk3 ); - + self maps\mp\perks\_perks::giveperk( loadoutEquipment ); self maps\mp\perks\_perks::giveperk( loadoutPerk1 ); self maps\mp\perks\_perks::giveperk( loadoutPerk2 ); self maps\mp\perks\_perks::giveperk( loadoutPerk3 ); - + perks[ 0 ] = loadoutPerk1; perks[ 1 ] = loadoutPerk2; perks[ 2 ] = loadoutPerk3; - + 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 ); - + 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 maps\mp\perks\_perks::giveperk( upgrade ); } } - + } /* @@ -3280,26 +3280,26 @@ botLoadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 ) botPlayerModelForWeapon( 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": weaponclass = tablelookup( "mp/statstable.csv", 4, secondary, 2 ); - + if ( weaponclass == "weapon_shotgun" ) { [[ game[ team + "_model" ][ "SHOTGUN" ] ]](); @@ -3308,9 +3308,9 @@ botPlayerModelForWeapon( weapon, secondary ) { [[ game[ team + "_model" ][ "ASSAULT" ] ]](); } - + break; - + case "weapon_sniper": if ( level.environment != "" && isdefined( self.pers[ "bots" ][ "unlocks" ][ "ghillie" ] ) && self.pers[ "bots" ][ "unlocks" ][ "ghillie" ] ) { @@ -3320,17 +3320,17 @@ botPlayerModelForWeapon( weapon, secondary ) { [[ game[ team + "_model" ][ "SNIPER" ] ]](); } - + break; - + case "weapon_lmg": [[ game[ team + "_model" ][ "LMG" ] ]](); break; - + case "weapon_riot": [[ game[ team + "_model" ][ "RIOT" ] ]](); break; - + default: [[ game[ team + "_model" ][ "ASSAULT" ] ]](); break; diff --git a/maps/mp/bots/_menu.gsc b/maps/mp/bots/_menu.gsc index c56caa2..9da4b8b 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 2" ); - + 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 928819d..69f4c6e 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,32 +38,32 @@ 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 ); } - + setdvar( "player_sustainAmmo", 1 ); - + level.waypoints = []; level.waypointcount = 0; - + level waittill( "connected", player ); player thread onPlayerSpawned(); } @@ -71,7 +71,7 @@ init() onPlayerSpawned() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); @@ -83,11 +83,11 @@ startDev() { self endon( "disconnect" ); self endon( "death" ); - + level.wptolink = -1; level.autolink = false; self.nearest = -1; - + self takeallweapons(); self giveweapon( "m16_gl_mp" ); // to knife windows self giveweapon( "javelin_mp" ); // to mark jav spots @@ -100,7 +100,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(); @@ -111,7 +111,7 @@ startDev() self thread watchAutoLinkCommand(); self thread updateWaypointsStats(); self thread watchAstarCommand(); - + self thread sayExtras(); } @@ -135,30 +135,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; } } @@ -167,7 +167,7 @@ updateWaypointsStats() { self endon( "disconnect" ); self endon( "death" ); - + self initHudElem( "TotalWps:", 102, 5 ); totalWpsHud = self initHudElem( "", 180, 5 ); self initHudElem( "NearestWP:", 102, 15 ); @@ -178,93 +178,93 @@ updateWaypointsStats() type = self initHudElem( "", 160, 35 ); self initHudElem( "ToLink:", 102, 45 ); wpToLink = self initHudElem( "", 160, 45 ); - + infotext = self initHudElem2(); self initHudElem3(); self initHudElem4(); - + for ( time = 0;; time += 0.05 ) { wait 0.05; - + totalWpsHud settext( level.waypointcount ); - + closest = -1; myEye = self geteye(); myAngles = self getplayerangles(); - + 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" ) ) ) { 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 settext( self.nearest ); - + children settext( buildChildCountString( self.nearest ) ); - + type settext( buildTypeString( self.nearest ) ); - + wpToLink settext( level.wptolink ); - + infotext.x = infotext.x - 2; - + if ( infotext.x <= -800 ) { infotext.x = 800; } - + if ( self usebuttonpressed() && time > 2 ) { 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 ); print3d( self.astar.goal + ( 0, 0, 35 ), "goal", ( 0, 0, 1 ), 2 ); - + 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 ) ); - + prev = level.waypoints[ node ].origin + ( 0, 0, 35 ); } - + line( prev, self.astar.goal + ( 0, 0, 35 ), ( 0, 1, 1 ) ); } } @@ -274,9 +274,9 @@ watchLoadWaypointsCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+actionslot 2}]", "+actionslot 2" ); - + for ( ;; ) { self waittill( "[{+actionslot 2}]" ); @@ -288,9 +288,9 @@ watchAddWaypointCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+smoke}]", "+smoke" ); - + for ( ;; ) { self waittill( "[{+smoke}]" ); @@ -302,13 +302,13 @@ watchAutoLinkCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+frag}]", "+frag" ); - + for ( ;; ) { self waittill( "[{+frag}]" ); - + if ( level.autolink ) { self iprintlnbold( "Auto link disabled" ); @@ -328,9 +328,9 @@ watchLinkWaypointCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+melee}]", "+melee" ); - + for ( ;; ) { self waittill( "[{+melee}]" ); @@ -342,9 +342,9 @@ watchunlinkWaypointCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+reload}]", "+reload" ); - + for ( ;; ) { self waittill( "[{+reload}]" ); @@ -356,9 +356,9 @@ watchDeleteWaypointCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+actionslot 3}]", "+actionslot 3" ); - + for ( ;; ) { self waittill( "[{+actionslot 3}]" ); @@ -370,9 +370,9 @@ watchDeleteAllWaypointsCommand() { self endon( "disconnect" ); self endon( "death" ); - + self notifyonplayercommand( "[{+actionslot 4}]", "+actionslot 4" ); - + for ( ;; ) { self waittill( "[{+actionslot 4}]" ); @@ -384,72 +384,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 ] + ","; @@ -458,7 +458,7 @@ watchSaveWaypointsCommand() { str += ","; } - + if ( isdefined( wp.jav_point ) ) { str += wp.jav_point[ 0 ] + " " + wp.jav_point[ 1 ] + " " + wp.jav_point[ 2 ] + ","; @@ -467,13 +467,13 @@ watchSaveWaypointsCommand() { str += ","; } - + println( str ); BotBuiltinFileWrite( filename, str + "\n", "append" ); } - + println( "\n\n\n\n\n\n" ); - + self iprintln( "Saved!!! to " + filename ); } } @@ -483,9 +483,9 @@ LoadWaypoints() self DeleteAllWaypoints(); self iprintlnbold( "Loading WPS..." ); load_waypoints(); - + wait 1; - + self checkForWarnings(); } @@ -495,12 +495,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 ] ) ) @@ -508,7 +508,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 ); @@ -524,7 +524,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" ); @@ -536,43 +536,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." ); } @@ -584,17 +584,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; } @@ -607,33 +607,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; @@ -641,17 +641,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; } @@ -663,16 +663,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-- ) @@ -683,7 +683,7 @@ DeleteWaypoint( nwp ) } } } - + for ( entry = 0; entry < level.waypointcount; entry++ ) { if ( entry == nwp ) @@ -693,24 +693,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"; @@ -735,25 +735,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 ); } @@ -767,7 +767,7 @@ DeleteAllWaypoints() { level.waypoints = []; level.waypointcount = 0; - + self iprintln( "DelAllWps" ); } @@ -777,9 +777,9 @@ buildChildCountString ( wp ) { return ""; } - + wpstr = level.waypoints[ wp ].children.size + ""; - + return wpstr; } @@ -789,9 +789,9 @@ buildChildString( wp ) { return ""; } - + wpstr = ""; - + for ( i = 0; i < level.waypoints[ wp ].children.size; i++ ) { if ( i != 0 ) @@ -803,7 +803,7 @@ buildChildString( wp ) wpstr = wpstr + level.waypoints[ wp ].children[ i ]; } } - + return wpstr; } @@ -813,7 +813,7 @@ buildTypeString( wp ) { return ""; } - + return level.waypoints[ wp ].type; } @@ -829,9 +829,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; @@ -842,9 +842,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; } @@ -866,9 +866,9 @@ initHudElem2() infotext.glowcolor = ( 0, 0, 0 ); infotext.glowalpha = 1; infotext.color = ( 1.0, 1.0, 1.0 ); - + self thread destroyOnDeath( infotext ); - + return infotext; } @@ -881,9 +881,9 @@ initHudElem3() bar.vertalign = "bottom"; bar.y = 30; bar.foreground = true; - + self thread destroyOnDeath( bar ); - + return bar; } @@ -898,8 +898,8 @@ initHudElem4() OptionsBG.vertalign = "top"; OptionsBG setshader( "black", 200, 60 ); OptionsBG.alpha = 0.4; - + self thread destroyOnDeath( OptionsBG ); - + return OptionsBG; }