From 541b0832e3af5bfac71296e3e46b281b26af641c Mon Sep 17 00:00:00 2001 From: ineed bots Date: Thu, 4 Jan 2024 16:05:38 -0600 Subject: [PATCH] fmt --- .astylerc | 14 +- .editorconfig | 2 +- maps/mp/bots/_bot.gsc | 398 +++--- maps/mp/bots/_bot_chat.gsc | 846 ++++++------- maps/mp/bots/_bot_internal.gsc | 886 ++++++------- maps/mp/bots/_bot_script.gsc | 1760 +++++++++++++------------- maps/mp/bots/_bot_utility.gsc | 910 ++++++------- maps/mp/bots/_menu.gsc | 430 +++---- maps/mp/bots/_wp_editor.gsc | 244 ++-- maps/mp/gametypes/_callbacksetup.gsx | 120 +- 10 files changed, 2808 insertions(+), 2802 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 32b87ea..05c5d0c 100644 --- a/maps/mp/bots/_bot.gsc +++ b/maps/mp/bots/_bot.gsc @@ -9,210 +9,210 @@ 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(); cac_init_patch(); thread hook_callbacks(); - + if ( getdvar( "bots_main_GUIDs" ) == "" ) { - setdvar( "bots_main_GUIDs", "" ); // guids of players who will be given host powers, comma seperated + setdvar( "bots_main_GUIDs", "" ); // guids of players who will be given host powers, comma seperated } - + if ( getdvar( "bots_main_firstIsHost" ) == "" ) { - setdvar( "bots_main_firstIsHost", true ); // first player to connect is a host + setdvar( "bots_main_firstIsHost", true ); // first player to connect is a host } - + if ( getdvar( "bots_main_waitForHostTime" ) == "" ) { - setdvar( "bots_main_waitForHostTime", 10.0 ); // how long to wait to wait for the host player + setdvar( "bots_main_waitForHostTime", 10.0 ); // how long to wait to wait for the host player } - + if ( getdvar( "bots_main_kickBotsAtEnd" ) == "" ) { - setdvar( "bots_main_kickBotsAtEnd", false ); // kicks the bots at game end + setdvar( "bots_main_kickBotsAtEnd", false ); // kicks the bots at game end } - + if ( getdvar( "bots_manage_add" ) == "" ) { - setdvar( "bots_manage_add", 0 ); // amount of bots to add to the game + setdvar( "bots_manage_add", 0 ); // amount of bots to add to the game } - + if ( getdvar( "bots_manage_fill" ) == "" ) { - setdvar( "bots_manage_fill", 0 ); // amount of bots to maintain + setdvar( "bots_manage_fill", 0 ); // amount of bots to maintain } - + if ( getdvar( "bots_manage_fill_spec" ) == "" ) { - setdvar( "bots_manage_fill_spec", true ); // to count for fill if player is on spec team + 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 + setdvar( "bots_manage_fill_mode", 0 ); // fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 } - + if ( getdvar( "bots_manage_fill_kick" ) == "" ) { - setdvar( "bots_manage_fill_kick", false ); // kick bots if too many + setdvar( "bots_manage_fill_kick", false ); // kick bots if too many } - + if ( getdvar( "bots_team" ) == "" ) { - setdvar( "bots_team", "autoassign" ); // which team for bots to join + 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 + 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 + setdvar( "bots_team_force", false ); // force bots on team } - + if ( getdvar( "bots_team_mode" ) == "" ) { - setdvar( "bots_team_mode", 0 ); // counts just bots when 1 + 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 + 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 + 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_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.tbl_perkdata[ 0 ][ "reference_full" ] = true; - + for ( h = 1; h < 6; h++ ) { for ( i = 0; i < 3; i++ ) @@ -220,7 +220,7 @@ init() level.default_perk[ "CLASS_CUSTOM" + h ][ i ] = "specialty_null"; } } - + level.bots_minsprintdistance = 315; level.bots_minsprintdistance *= level.bots_minsprintdistance; level.bots_mingrenadedistance = 256; @@ -236,11 +236,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[ "rpd" ] = true; level.bots_fullautoguns[ "m60e4" ] = true; @@ -254,12 +254,12 @@ init() level.bots_fullautoguns[ "m4" ] = true; level.bots_fullautoguns[ "ak47" ] = true; level.bots_fullautoguns[ "mp44" ] = true; - + level thread fixGamemodes(); level thread onUAVAlliesUpdate(); level thread onUAVAxisUpdate(); level thread chopperWatch(); - + level thread onPlayerConnect(); level thread handleBots(); } @@ -272,21 +272,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() ); @@ -303,7 +303,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 ); } @@ -317,15 +317,15 @@ 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.lastattacker = eAttacker; - + if ( isdefined( eAttacker ) ) { eAttacker.lastkilledplayer = self; eAttacker notify( "killed_enemy" ); } - + self [[ level.prevcallbackplayerkilled ]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); } @@ -337,7 +337,7 @@ hook_callbacks() wait 0.05; level.prevcallbackplayerdamage = level.callbackplayerdamage; level.callbackplayerdamage = ::onPlayerDamage; - + level.prevcallbackplayerkilled = level.callbackplayerkilled; level.callbackplayerkilled = ::onPlayerKilled; } @@ -348,27 +348,27 @@ hook_callbacks() 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; @@ -389,17 +389,17 @@ fixGamemodes() { level.bombzones[ i ].onuse = ::onUsePlantObjectFix; } - + break; } - + if ( isdefined( level.radios ) && level.gametype == "koth" ) { level thread fixKoth(); - + break; } - + wait 0.05; } } @@ -412,11 +412,11 @@ onPlayerConnect() for ( ;; ) { level waittill( "connected", player ); - + player thread onGrenadeFire(); player thread onWeaponFired(); player thread doPlayerModelFix(); - + player thread connected(); } } @@ -427,16 +427,16 @@ onPlayerConnect() fixPerksAndScriptKick() { self endon( "disconnect" ); - + self waittill( "spawned" ); - + self.pers[ "isBot" ] = undefined; - + if ( !level.gameended ) { level waittill ( "game_ended" ); } - + self.pers[ "isBot" ] = true; } @@ -446,7 +446,7 @@ fixPerksAndScriptKick() onDisconnect() { self waittill( "disconnect" ); - + level.bots = array_remove( level.bots, self ); } @@ -456,39 +456,39 @@ 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... self.pers[ "isBot" ] = true; } - + if ( !isdefined( self.pers[ "isBotWarfare" ] ) ) { self.pers[ "isBotWarfare" ] = true; self thread added(); } - + self thread fixPerksAndScriptKick(); - + 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(); } @@ -498,50 +498,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" ) ) @@ -557,7 +557,7 @@ watchBotDebugEvent() added() { self endon( "disconnect" ); - + self thread maps\mp\bots\_bot_internal::added(); self thread maps\mp\bots\_bot_script::added(); } @@ -569,9 +569,9 @@ add_bot() { // cod4x specific name = getABotName(); - + bot = undefined; - + if ( isdefined( name ) && name.size >= 3 ) { bot = addtestclient( name ); @@ -580,7 +580,7 @@ add_bot() { bot = addtestclient(); } - + if ( isdefined( bot ) ) { bot.pers[ "isBot" ] = true; @@ -599,30 +599,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 ) @@ -662,33 +662,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 ) ); } } @@ -701,7 +701,7 @@ diffBots() for ( ;; ) { wait 1.5; - + diffBots_loop(); } } @@ -713,23 +713,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" ) @@ -753,16 +753,16 @@ teamBots_loop() } } } - + allies = alliesbots; axis = axisbots; - + if ( !getdvarint( "bots_team_mode" ) ) { allies += alliesplayers; axis += axisplayers; } - + if ( toTeam != "custom" ) { if ( getdvarint( "bots_team_force" ) ) @@ -772,37 +772,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 ]](); @@ -815,7 +815,7 @@ teamBots_loop() { player thread [[ level.spectator ]](); } - + break; } } @@ -824,21 +824,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 ) @@ -872,7 +872,7 @@ teamBots() for ( ;; ) { wait 1.5; - + teamBots_loop(); } } @@ -883,42 +883,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++; @@ -932,7 +932,7 @@ addBots_loop() players++; } } - + if ( !randomint( 999 ) ) { setdvar( "testclients_doreload", true ); @@ -940,28 +940,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++; @@ -971,9 +971,9 @@ addBots_loop() alliesplayers++; } } - + result = fillAmount - abs( axisplayers - alliesplayers ) + bots; - + if ( players == 0 ) { if ( bots < fillAmount ) @@ -989,22 +989,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 ); @@ -1012,7 +1012,7 @@ addBots_loop() else if ( amount > fillAmount && getdvarint( "bots_manage_fill_kick" ) ) { tempBot = getBotToKick(); - + if ( isdefined( tempBot ) ) { kick( tempBot getentitynumber() ); @@ -1026,13 +1026,13 @@ addBots_loop() addBots() { level endon( "game_ended" ); - + bot_wait_for_host(); - + for ( ;; ) { wait 1.5; - + addBots_loop(); } } @@ -1043,18 +1043,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(); @@ -1071,9 +1071,9 @@ AddToSmokeList() grenade.origin = self getorigin(); grenade.state = "moving"; grenade.grenade = self; - + grenade thread thinkSmoke(); - + level.bots_smokelist ListAdd( grenade ); } @@ -1088,10 +1088,10 @@ thinkSmoke() self.state = "moving"; wait 0.05; } - + self.state = "smoking"; wait 11.5; - + level.bots_smokelist ListRemove( self ); } @@ -1106,23 +1106,23 @@ chopperWatch() { wait 0.05; } - + chopper = level.chopper; - + if ( level.teambased && getdvarint( "doubleHeli" ) ) { chopper = level.chopper[ "allies" ]; - + if ( !isdefined( chopper ) ) { chopper = level.chopper[ "axis" ]; } } - + level.bot_chopper = true; chopper watchChopper(); level.bot_chopper = false; - + while ( isdefined( level.chopper ) ) { wait 0.05; @@ -1138,7 +1138,7 @@ watchChopper() self endon( "death" ); self endon( "leaving" ); self endon( "crashing" ); - + level waittill( "helicopter gone" ); } @@ -1172,37 +1172,37 @@ onUAVAlliesUpdate() doUAVUpdate( team ) { level endon( "radar_timer_kill_" + team ); - + playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !isdefined( player.team ) ) { continue; } - + if ( player.team == team ) { player.bot_radar = true; } } - + wait level.radarviewtime; - + playercount = level.players.size; - + for ( i = 0; i < playercount; i++ ) { player = level.players[ i ]; - + if ( !isdefined( player.team ) ) { continue; } - + if ( player.team == team ) { player.bot_radar = false; @@ -1228,7 +1228,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 a997a07..3926363 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,13 +67,13 @@ BotDoChat( chance, string, isTeam ) start_chat_threads() { self endon( "disconnect" ); - + 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(); } @@ -83,13 +83,13 @@ start_chat_threads() 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; } } @@ -100,9 +100,9 @@ start_death_watch() start_endgame_watch() { self endon( "disconnect" ); - + level waittill ( "game_ended" ); - + self thread endgame_chat(); } @@ -112,11 +112,11 @@ start_endgame_watch() start_random_chat() { self endon( "disconnect" ); - + for ( ;; ) { wait 1; - + if ( randomint( 100 ) < 1 ) { if ( randomint( 100 ) < 1 && isalive( self ) ) @@ -133,14 +133,14 @@ start_random_chat() start_killed_watch() { self endon( "disconnect" ); - + self.bots_lastks = 0; - + for ( ;; ) { self waittill( "killed_enemy" ); wait 0.05; - + if ( self.bots_lastks < self.cur_kill_streak ) { for ( i = self.bots_lastks + 1; i <= self.cur_kill_streak; i++ ) @@ -148,9 +148,9 @@ start_killed_watch() self thread bot_chat_streak( i ); } } - + self.bots_lastks = self.cur_kill_streak; - + self thread bot_chat_killed_watch( self.lastkilledplayer ); } } @@ -162,93 +162,93 @@ 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 "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 "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 "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 "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; @@ -262,9 +262,9 @@ start_chat_watch() start_startgame_watch() { self endon( "disconnect" ); - + wait( randomint( 5 ) + randomint( 5 ) ); - + switch ( level.gametype ) { case "war": @@ -273,90 +273,90 @@ 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 "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 "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; @@ -370,7 +370,7 @@ doQuickMessage() { self endon( "disconnect" ); self endon( "death" ); - + if ( !isdefined( self.talking ) || !self.talking ) { self.talking = true; @@ -378,35 +378,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(); @@ -421,7 +421,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; @@ -434,34 +434,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 = getWinningTeam(); - + if ( self.pers[ "team" ] == winningteam ) { switch ( randomint( 21 ) ) @@ -469,71 +469,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 ) { @@ -551,9 +551,9 @@ endgame_chat() { self BotDoChat( 20, "wow " + winner.name + " did very well!" ); } - + break; - + case 18: if ( self == winner ) { @@ -571,13 +571,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; @@ -592,59 +592,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 ) { @@ -662,9 +662,9 @@ endgame_chat() { self BotDoChat( 20, "kwtf " + winner.name + " is a hacker" ); } - + break; - + case 15: if ( self == winner ) { @@ -682,25 +682,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; @@ -713,31 +713,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; @@ -766,9 +766,9 @@ endgame_chat() { self BotDoChat( 20, "This game sucked, " + winner.name + " is such a hacker!!" ); } - + break; - + case 1: if ( self == winner ) { @@ -786,9 +786,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 ) { @@ -806,73 +806,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; @@ -886,7 +886,7 @@ endgame_chat() bot_chat_streak( streakCount ) { self endon( "disconnect" ); - + if ( streakCount == 7 ) { if ( isdefined( self.pers[ "hardPointItem" ] ) && self.pers[ "hardPointItem" ] == "helicopter_mp" ) @@ -911,186 +911,186 @@ 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.cur_kill_streak + " streak." ); break; - + case 31: message = ( "lol " + victim.name + " is at a " + victim.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: message = ( "Man, I sure love my " + getBaseWeaponName( self getcurrentweapon() ) + "!" ); - + break; - + case 41: message = ( "lol u got killed " + victim.name + ", kek" ); break; } - + wait ( randomint( 3 ) + 1 ); self BotDoChat( 5, message ); } @@ -1101,32 +1101,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 ) { @@ -1136,263 +1136,263 @@ bot_chat_death_watch( killer, last_ks ) { message = ( "man im getting spawn killed, i have a " + self.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.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: message = "Wow! Nice " + getBaseWeaponName( killer getcurrentweapon() ) + " 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 ); } @@ -1403,7 +1403,7 @@ bot_chat_death_watch( killer, last_ks ) bot_chat_killcam_watch( state, b, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -1412,26 +1412,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; } } @@ -1442,10 +1442,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 ) ) @@ -1453,41 +1453,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 ); } @@ -1497,7 +1497,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": @@ -1507,9 +1507,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 ) ) { @@ -1517,7 +1517,7 @@ bot_chat_tube_watch( state, tubeWp, tubeWeap, d, e, f, g ) self BotDoChat( 10, "i tubed" ); break; } - + break; } } @@ -1528,7 +1528,7 @@ bot_chat_tube_watch( state, tubeWp, tubeWeap, d, e, f, g ) bot_chat_killstreak_watch( state, location, directionYaw, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "call": @@ -1536,7 +1536,7 @@ bot_chat_killstreak_watch( state, location, directionYaw, d, e, f, g ) { self BotDoChat( 20, "wewt! i got the choppa!!" ); } - + break; } } @@ -1547,7 +1547,7 @@ bot_chat_killstreak_watch( state, location, directionYaw, d, e, f, g ) bot_chat_attack_vehicle_watch( state, vehicle, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -1556,69 +1556,69 @@ bot_chat_attack_vehicle_watch( state, vehicle, c, 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 = "rpg_mp"; - + if ( !self getammocount( "weap" ) ) { weap = self getcurrentweapon(); } - + self BotDoChat( 10, "Im going to takedown your ks with my " + getBaseWeaponName( weap ) ); break; } - + break; - + case "stop": break; } @@ -1630,12 +1630,12 @@ bot_chat_attack_vehicle_watch( state, vehicle, c, 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; } @@ -1647,7 +1647,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": @@ -1656,52 +1656,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; } } @@ -1712,12 +1712,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": @@ -1726,30 +1726,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; } } @@ -1760,7 +1760,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": @@ -1770,9 +1770,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 ) ) { @@ -1780,7 +1780,7 @@ bot_chat_equ_watch( state, wp, weap, d, e, f, g ) self BotDoChat( 10, "placed a " + getBaseWeaponName( weap ) ); break; } - + break; } } @@ -1791,7 +1791,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": @@ -1801,9 +1801,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 ) ) { @@ -1811,7 +1811,7 @@ bot_chat_nade_watch( state, wp, weap, d, e, f, g ) self BotDoChat( 10, "threw a " + getBaseWeaponName( weap ) ); break; } - + break; } } @@ -1822,7 +1822,7 @@ bot_chat_nade_watch( state, wp, weap, d, e, f, g ) bot_chat_throwback_watch( state, nade, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": @@ -1832,9 +1832,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 ) ) { @@ -1842,7 +1842,7 @@ bot_chat_throwback_watch( state, nade, c, d, e, f, g ) self BotDoChat( 10, "i threw back the grenade!" ); break; } - + break; } } @@ -1853,7 +1853,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": @@ -1863,9 +1863,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 ) ) { @@ -1873,9 +1873,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 ) ) { @@ -1883,7 +1883,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; } } @@ -1894,7 +1894,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": @@ -1903,24 +1903,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; } } @@ -1931,7 +1931,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": @@ -1941,9 +1941,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 ) ) { @@ -1951,7 +1951,7 @@ bot_chat_revenge_watch( state, loc, killer, d, e, f, g ) self BotDoChat( 10, "i checked out my deathlocation..." ); break; } - + break; } } @@ -1962,7 +1962,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": @@ -1972,9 +1972,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 ) ) { @@ -1982,7 +1982,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; } } @@ -1993,12 +1993,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; } @@ -2010,12 +2010,12 @@ bot_chat_uav_target_watch( state, heard, c, d, e, f, g ) bot_chat_attack_equ_watch( state, equ, c, d, e, f, g ) { self endon( "disconnect" ); - + switch ( state ) { case "start": break; - + case "stop": break; } @@ -2027,7 +2027,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": @@ -2035,38 +2035,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; } } @@ -2077,7 +2077,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": @@ -2085,26 +2085,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; } } @@ -2115,7 +2115,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": @@ -2123,65 +2123,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; } } @@ -2192,7 +2192,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": @@ -2200,69 +2200,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; } } diff --git a/maps/mp/bots/_bot_internal.gsc b/maps/mp/bots/_bot_internal.gsc index 3aec4a4..65f6260 100644 --- a/maps/mp/bots/_bot_internal.gsc +++ b/maps/mp/bots/_bot_internal.gsc @@ -10,9 +10,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 @@ -34,7 +34,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 @@ -45,7 +45,7 @@ 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 } @@ -57,11 +57,11 @@ added() connected() { self endon( "disconnect" ); - + self.bot = spawnstruct(); self.bot_radar = false; self resetBotVars(); - + self thread onPlayerSpawned(); self thread bot_skip_killcam(); self thread onUAVUpdate(); @@ -73,7 +73,7 @@ connected() onUAVUpdate() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "radar_timer_kill" ); @@ -88,11 +88,11 @@ doUAVUpdate() { self endon( "disconnect" ); self endon( "radar_timer_kill" ); - + self.bot_radar = true; // wtf happened to hasRadar? its bugging out, something other than script is touching it - + wait level.radarviewtime; - + self.bot_radar = false; } @@ -123,12 +123,12 @@ resetBotVars() self.bot.after_target = undefined; self.bot.after_target_pos = undefined; self.bot.moveto = self.origin; - + 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; @@ -139,7 +139,7 @@ resetBotVars() self.bot.climbing = 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; @@ -151,19 +151,19 @@ 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.prio_objective = false; - + self.bot.rand = randomint( 100 ); - + self BotBuiltinBotStop(); } @@ -174,11 +174,11 @@ bot_skip_killcam() { level endon( "game_ended" ); self endon( "disconnect" ); - + for ( ;; ) { wait 1; - + if ( isdefined( self.killcam ) ) { self notify( "end_killcam" ); @@ -192,18 +192,18 @@ bot_skip_killcam() 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 spawned(); } } @@ -215,9 +215,9 @@ spawned() { self endon( "disconnect" ); self endon( "death" ); - + wait self.pers[ "bots" ][ "skill" ][ "spawn_time" ]; - + self thread grenade_danger(); self thread check_reload(); self thread stance(); @@ -230,7 +230,7 @@ spawned() self thread doBotMovement(); self thread watchGrenadeFire(); self thread watchPickupGun(); - + self notify( "bot_spawned" ); } @@ -241,23 +241,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 ); } } @@ -269,16 +269,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 ); @@ -293,48 +293,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" || !isalive( 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" ); @@ -353,27 +353,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() ) { @@ -385,16 +385,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; @@ -418,13 +418,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 ] ) ); self BotBuiltinBotMoveTo( move_To ); // cod4x } @@ -436,14 +436,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 ); } @@ -458,18 +458,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; } @@ -484,12 +484,12 @@ IsWeapSniper( weap ) { return false; } - + if ( maps\mp\gametypes\_missions::getweaponclass( weap ) != "weapon_sniper" ) { return false; } - + return true; } @@ -500,16 +500,16 @@ watchHoldBreath() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 1; - + if ( self.bot.isfrozen ) { continue; } - + self holdbreath( self playerads() > 0 ); } } @@ -521,16 +521,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; @@ -545,13 +545,13 @@ onWeaponChange() { self endon( "disconnect" ); self endon( "death" ); - + first = true; - + for ( ;; ) { newWeapon = undefined; - + if ( first ) { first = false; @@ -561,7 +561,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 ); @@ -575,7 +575,7 @@ sprint_watch() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill( "sprint_begin" ); @@ -592,29 +592,29 @@ sprint_watch() 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; } @@ -625,11 +625,11 @@ reload_watch() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill( "reload_start" ); - + self reload_watch_loop(); } } @@ -640,40 +640,40 @@ reload_watch() stance_loop() { self.bot.climbing = false; - + if ( self.bot.isfrozen ) { return; } - + toStance = "stand"; - + if ( self.bot.next_wp != -1 ) { toStance = level.waypoints[ self.bot.next_wp ].type; } - + if ( !isdefined( toStance ) ) { toStance = "crouch"; } - + if ( toStance == "stand" && randomint( 100 ) <= self.pers[ "bots" ][ "behavior" ][ "crouch" ] ) { 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(); @@ -686,46 +686,46 @@ stance_loop() { self prone(); } - + curweap = self getcurrentweapon(); time = gettime(); chance = self.pers[ "bots" ][ "behavior" ][ "sprint" ]; - + if ( time - self.lastspawntime < 5000 ) { chance *= 2; } - + if ( isdefined( self.bot.script_goal ) && distancesquared( self.origin, self.bot.script_goal ) > 256 * 256 ) { chance *= 2; } - + if ( toStance != "stand" || self.bot.isreloading || self.bot.issprinting || self.bot.isfraggingafter || self.bot.issmokingafter ) { return; } - + if ( randomint( 100 ) > chance ) { return; } - + if ( isdefined( self.bot.target ) && self canFire( curweap ) && self isInRange( self.bot.target.dist, curweap ) ) { return; } - + if ( self.bot.sprintendtime != -1 && time - self.bot.sprintendtime < 2000 ) { return; } - + if ( !isdefined( self.bot.towards_goal ) || distancesquared( self.origin, physicstrace( self getEyePos(), self getEyePos() + 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(); } @@ -737,14 +737,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; } @@ -755,11 +755,11 @@ stance() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill_either( "finished_static_waypoints", "new_static_waypoint" ); - + self stance_loop(); } } @@ -771,31 +771,31 @@ grenade_danger() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill( "grenade danger", grenade, attacker, weapname ); - + if ( !isdefined( grenade ) ) { continue; } - + if ( !getdvarint( "bots_play_nade" ) ) { continue; } - + if ( weapname != "frag_grenade_mp" ) { continue; } - + if ( isdefined( attacker ) && level.teambased && attacker.team == self.team ) { continue; } - + self thread watch_grenade( grenade ); } } @@ -808,36 +808,36 @@ watch_grenade( grenade ) self endon( "disconnect" ); self endon( "death" ); grenade endon( "death" ); - + while ( 1 ) { wait 1; - + if ( !isdefined( grenade ) ) { return; } - + if ( self.bot.isfrozen ) { continue; } - + if ( !bullettracepassed( self getEyePos(), grenade.origin, false, grenade ) ) { continue; } - + if ( distancesquared( self.origin, grenade.origin ) > 20000 ) { continue; } - + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) { continue; } - + self BotNotifyBotEvent( "throwback", "stop", grenade ); self thread frag(); } @@ -850,7 +850,7 @@ check_reload() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self waittill_notify_or_timeout( "weapon_fired", 5 ); @@ -866,29 +866,29 @@ reload_thread() self endon( "disconnect" ); self endon( "death" ); self endon( "weapon_fired" ); - + wait 2.5; - + if ( isdefined( self.bot.target ) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.issmokingafter || self.bot.isfrozen ) { return; } - + cur = self getcurrentweapon(); - + if ( cur == "" || cur == "none" ) { return; } - + if ( isweaponcliponly( cur ) || !self getweaponammostock( cur ) ) { return; } - + maxsize = weaponclipsize( cur ); cursize = self getweaponammoclip( cur ); - + if ( cursize / maxsize < 0.5 ) { self thread reload(); @@ -902,19 +902,19 @@ updateBones() { self endon( "disconnect" ); self endon( "death" ); - + bones = strtok( self.pers[ "bots" ][ "skill" ][ "bones" ], "," ); waittime = self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ]; - + for ( ;; ) { self waittill_notify_or_timeout( "new_enemy", waittime ); - + if ( !isdefined( self.bot.target ) ) { continue; } - + self.bot.target.bone = random( bones ); } } @@ -938,7 +938,7 @@ createTargetObj( ent, theTime ) obj.bone = undefined; obj.aim_offset = undefined; obj.aim_offset_base = undefined; - + return obj; } @@ -950,22 +950,22 @@ updateAimOffset( obj ) if ( !isdefined( obj.aim_offset_base ) ) { diffAimAmount = self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ]; - + if ( diffAimAmount > 0 ) { obj.aim_offset_base = ( randomfloatrange( 0 - diffAimAmount, diffAimAmount ), - randomfloatrange( 0 - diffAimAmount, diffAimAmount ), - randomfloatrange( 0 - diffAimAmount, diffAimAmount ) ); + randomfloatrange( 0 - diffAimAmount, diffAimAmount ), + randomfloatrange( 0 - diffAimAmount, diffAimAmount ) ); } else { obj.aim_offset_base = ( 0, 0, 0 ); } } - + aimDiffTime = self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] * 1000; objCreatedFor = obj.trace_time; - + if ( objCreatedFor >= aimDiffTime ) { offsetScalar = 0; @@ -974,7 +974,7 @@ updateAimOffset( obj ) { offsetScalar = 1 - objCreatedFor / aimDiffTime; } - + obj.aim_offset = obj.aim_offset_base * offsetScalar; } @@ -986,13 +986,13 @@ targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj ) 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 ( !isScriptObj ) { if ( daDist > distMax ) @@ -1004,13 +1004,13 @@ targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj ) 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 ); } @@ -1040,54 +1040,54 @@ target_loop() hasTarget = isdefined( self.bot.target ); adsAmount = self playerads(); adsFovFact = self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ]; - + // 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 ( 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 ); } else @@ -1096,9 +1096,9 @@ target_loop() { continue; } - + self targetObjUpdateNoTrace( obj ); - + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[ key ] = undefined; @@ -1109,70 +1109,70 @@ target_loop() else { player = level.players[ i ]; - + if ( !player IsPlayerModelOK() ) { continue; } - + if ( player == self ) { continue; } - + key = player getentitynumber() + ""; obj = self.bot.targets[ key ]; daDist = distancesquared( self.origin, player.origin ); isObjDef = isdefined( obj ); - + if ( ( level.teambased && self.team == player.team ) || player.sessionstate != "playing" || !isalive( player ) ) { if ( isObjDef ) { self.bot.targets[ key ] = undefined; } - + continue; } - + 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" ) ) - - && ( 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" ) ) + + && ( 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 ); } else @@ -1181,9 +1181,9 @@ target_loop() { continue; } - + self targetObjUpdateNoTrace( obj ); - + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[ key ] = undefined; @@ -1191,67 +1191,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; @@ -1266,16 +1266,16 @@ target() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 0.05; - + if ( self maps\mp\_flashgrenades::isflashbanged() ) { continue; } - + self target_loop(); } } @@ -1287,26 +1287,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(); } } @@ -1319,78 +1319,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 jump(); } @@ -1400,7 +1400,7 @@ watchToLook() { continue; } - + self.bot.jump_time = gettime(); self prone(); self notify( "kill_goal" ); @@ -1417,15 +1417,15 @@ start_bot_after_target( who ) { self endon( "disconnect" ); self endon( "death" ); - + 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; } @@ -1444,29 +1444,29 @@ clear_bot_after_target() aim_loop() { aimspeed = self.pers[ "bots" ][ "skill" ][ "aim_time" ]; - + if ( self IsStunned() || self isArtShocked() ) { aimspeed = 1; } - + eyePos = self getEyePos(); curweap = self getcurrentweapon(); 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.target ) && isdefined( self.bot.target.entity ) && !( self.bot.prio_objective && isdefined( self.bot.script_aimpos ) ) ) { no_trace_time = self.bot.target.no_trace_time; no_trace_look_time = self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ]; - + if ( no_trace_time <= no_trace_look_time ) { trace_time = self.bot.target.trace_time; @@ -1474,39 +1474,39 @@ 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; } - else if ( curweap != "none" && weaponclass( curweap ) == "grenade" ) + else if ( curweap != "none" && weaponclass( curweap ) == "grenade" ) { if ( maps\mp\gametypes\_missions::getweaponclass( curweap ) == "weapon_projectile" ) { @@ -1517,7 +1517,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 ) @@ -1528,7 +1528,7 @@ aim_loop() if ( !self.bot.isfraggingafter && !self.bot.issmokingafter ) { 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 && getdvarint( "bots_play_nade" ) ) { if ( nade == "frag_grenade_mp" ) @@ -1539,7 +1539,7 @@ aim_loop() { self thread smoke( 0.5 ); } - + self notify( "kill_goal" ); } } @@ -1555,11 +1555,11 @@ aim_loop() } } } - + self thread bot_lookat( last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ), aimspeed ); return; } - + if ( trace_time ) { if ( isplay ) @@ -1568,20 +1568,20 @@ aim_loop() { return; } - + aimpos = target gettagorigin( bone ); - + if ( !isdefined( aimpos ) ) { return; } - + 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 ); @@ -1601,9 +1601,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 ); @@ -1613,25 +1613,25 @@ aim_loop() self thread bot_lookat( aimpos, aimspeed ); } } - + if ( isplay && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxknifedistance && trace_time > reaction_time && 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 ) @@ -1643,42 +1643,42 @@ aim_loop() self notify( "kill_goal" ); } } - + if ( !stopAdsOverride ) { self thread pressADS(); } } - + if ( trace_time > reaction_time ) { if ( ( !canADS || adsAmount >= 1.0 || self inLastStand() || self getstance() == "prone" ) && ( conedot > 0.99 || dist < level.bots_maxknifedistance ) && getdvarint( "bots_play_fire" ) ) { self botFire(); } - + if ( 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; } - else if ( curweap != "none" && weaponclass( curweap ) == "grenade" ) + else if ( curweap != "none" && weaponclass( curweap ) == "grenade" ) { if ( maps\mp\gametypes\_missions::getweaponclass( curweap ) == "weapon_projectile" ) { @@ -1689,23 +1689,23 @@ aim_loop() nadeAimOffset = dist / 3000; } } - + aimpos = last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ); 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 ) @@ -1717,25 +1717,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(); } - + 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 ) ) @@ -1745,7 +1745,7 @@ aim_loop() else { lookat = undefined; - + if ( self.bot.second_next_wp != -1 && !self.bot.issprinting && !self.bot.climbing ) { lookat = level.waypoints[ self.bot.second_next_wp ].origin; @@ -1754,7 +1754,7 @@ aim_loop() { lookat = self.bot.towards_goal; } - + if ( isdefined( lookat ) ) { self thread bot_lookat( lookat + ( 0, 0, self getEyeHeight() ), aimspeed ); @@ -1769,16 +1769,16 @@ aim() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 0.05; - + if ( level.inprematchperiod || level.gameended || self.bot.isfrozen || self maps\mp\_flashgrenades::isflashbanged() ) { continue; } - + self aim_loop(); } } @@ -1789,18 +1789,18 @@ aim() botFire() { self.bot.last_fire_time = gettime(); - + if ( self.bot.is_cur_full_auto ) { self thread pressFire(); return; } - + if ( self.bot.semi_time ) { return; } - + self thread pressFire(); self thread doSemiTime(); } @@ -1814,7 +1814,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; @@ -1829,7 +1829,7 @@ canFire( curweap ) { return false; } - + return self getweaponammoclip( curweap ); } @@ -1842,36 +1842,36 @@ canAds( dist, curweap ) { 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; } - + return true; } @@ -1884,14 +1884,14 @@ isInRange( dist, curweap ) { return false; } - + weapclass = weaponclass( curweap ); - + if ( weapclass == "spread" && dist > level.bots_maxshotgundistance ) { return false; } - + return true; } @@ -1914,9 +1914,9 @@ killWalkCauseNoWaypoints() self endon( "disconnect" ); self endon( "death" ); self endon( "kill_goal" ); - + wait 2; - + self notify( "kill_goal" ); } @@ -1926,34 +1926,34 @@ killWalkCauseNoWaypoints() walk_loop() { hasTarget = isdefined( self.bot.target ) && isdefined( self.bot.target.entity ) && !self.bot.prio_objective; - + if ( hasTarget ) { curweap = self getcurrentweapon(); - + if ( self.bot.target.entity.classname == "script_vehicle" || 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; @@ -1965,15 +1965,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 @@ -1987,22 +1987,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 @@ -2011,10 +2011,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; @@ -2028,23 +2028,23 @@ walk() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { wait 0.05; - + self botSetMoveTo( self.origin ); - + if ( !getdvarint( "bots_play_move" ) ) { continue; } - + if ( level.inprematchperiod || level.gameended || self.bot.isfrozen || self.bot.stop_move ) { continue; } - + if ( self maps\mp\_flashgrenades::isflashbanged() ) { self.bot.last_next_wp = -1; @@ -2052,7 +2052,7 @@ walk() self botSetMoveTo( self.origin + self getvelocity() * 500 ); continue; } - + self walk_loop(); } } @@ -2064,25 +2064,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 ); @@ -2098,12 +2098,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" ); } @@ -2113,7 +2113,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 ); @@ -2126,19 +2126,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; } @@ -2148,14 +2148,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; } @@ -2167,11 +2167,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" ); } @@ -2183,7 +2183,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" ); @@ -2202,25 +2202,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 @@ -2230,38 +2230,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" ); @@ -2277,14 +2277,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; @@ -2293,34 +2293,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 ) @@ -2345,10 +2345,10 @@ movetowards( goal ) } } } - + wait 0.05; time += 50; - + if ( lengthsquared( self getvelocity() ) < 1000 ) { timeslow += 50; @@ -2357,7 +2357,7 @@ movetowards( goal ) { timeslow = 0; } - + if ( self.bot.issprinting ) { tempGoalDist = level.bots_goaldistance * 2; @@ -2366,13 +2366,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" ); } @@ -2385,11 +2385,11 @@ doMantle() self endon( "disconnect" ); self endon( "death" ); self endon( "kill_goal" ); - + self jump(); - + wait 0.35; - + self jump(); } @@ -2401,7 +2401,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 ) ); @@ -2410,19 +2410,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" ]; } @@ -2450,7 +2450,7 @@ sprint() self endon( "disconnect" ); self notify( "bot_sprint" ); self endon( "bot_sprint" ); - + self BotBuiltinBotAction( "+sprint" ); wait 0.05; self BotBuiltinBotAction( "-sprint" ); @@ -2464,48 +2464,48 @@ do_knife_target( target ) self endon( "death" ); self endon( "disconnect" ); self endon( "bot_knife" ); - + // dedi doesnt have this registered if ( getdvar( "aim_automelee_enabled" ) == "" ) { setdvar( "aim_automelee_enabled", 1 ); } - + if ( getdvar( "aim_automelee_range" ) == "" ) { setdvar( "aim_automelee_range", 128 ); } - + 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 ( 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 ); } @@ -2519,20 +2519,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; } @@ -2545,7 +2545,7 @@ reload() self endon( "disconnect" ); self notify( "bot_reload" ); self endon( "bot_reload" ); - + self BotBuiltinBotAction( "+reload" ); wait 0.05; self BotBuiltinBotAction( "-reload" ); @@ -2560,24 +2560,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; } @@ -2591,24 +2591,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; } @@ -2622,19 +2622,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" ); } @@ -2644,7 +2644,7 @@ use( time ) fire( what ) { self notify( "bot_fire" ); - + if ( what ) { self BotBuiltinBotAction( "+fire" ); @@ -2664,19 +2664,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" ); } @@ -2686,7 +2686,7 @@ pressFire( time ) ads( what ) { self notify( "bot_ads" ); - + if ( what ) { self BotBuiltinBotAction( "+ads" ); @@ -2706,19 +2706,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" ); } @@ -2731,13 +2731,13 @@ jump() self endon( "disconnect" ); self notify( "bot_jump" ); self endon( "bot_jump" ); - + if ( self getstance() != "stand" ) { self stand(); wait 1; } - + self BotBuiltinBotAction( "+gostand" ); wait 0.05; self BotBuiltinBotAction( "-gostand" ); @@ -2789,57 +2789,57 @@ bot_lookat( pos, time, vel, doAimPredict ) self endon( "death" ); self endon( "spawned_player" ); level endon ( "game_ended" ); - + if ( level.gameended || level.inprematchperiod || self.bot.isfrozen || !getdvarint( "bots_play_aim" ) ) { return; } - + if ( !isdefined( pos ) ) { return; } - + if ( !isdefined( doAimPredict ) ) { doAimPredict = false; } - + if ( !isdefined( time ) ) { time = 0.05; } - + if ( !isdefined( vel ) ) { vel = ( 0, 0, 0 ); } - + steps = int( time * 20 ); - + if ( steps < 1 ) { steps = 1; } - + myEye = self getEyePos(); // get our eye pos - + if ( doAimPredict ) { myEye += ( self getvelocity() * 0.05 ) * ( steps - 1 ); // account for our velocity - + pos += ( vel * 0.05 ) * ( steps - 1 ); // add the velocity vector } - + myAngle = self getplayerangles(); 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 4c60079..f1d6246 100644 --- a/maps/mp/bots/_bot_script.gsc +++ b/maps/mp/bots/_bot_script.gsc @@ -9,14 +9,14 @@ added() { self endon( "disconnect" ); - + rankxp = self bot_get_rank(); self setstat( int( tablelookup( "mp/playerStatsTable.csv", 1, "rankxp", 0 ) ), rankxp ); - + self setstat( int( tablelookup( "mp/playerStatsTable.csv", 1, "plevel", 0 ) ), self bot_get_prestige() ); - + self set_diff(); - + self set_class( rankxp ); } @@ -26,11 +26,11 @@ 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(); @@ -38,7 +38,7 @@ connected() self thread onSpawned(); self thread onDeath(); self thread onKillcam(); - + wait 0.1; self.challengedata = []; } @@ -50,11 +50,11 @@ onKillcam() { level endon( "game_ended" ); self endon( "disconnect" ); - + for ( ;; ) { self waittill( "begin_killcam" ); - + self thread doKillcamStuff(); } } @@ -66,15 +66,15 @@ doKillcamStuff() { self endon( "disconnect" ); self endon( "spawned_player" ); - + self BotNotifyBotEvent( "killcam", "start" ); - + wait 0.5 + randomint( 3 ); - + wait 0.1; - + self thread BotPressUse( 0.6 ); - + self BotNotifyBotEvent( "killcam", "stop" ); } @@ -85,47 +85,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; } @@ -139,52 +139,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 ); } @@ -197,62 +197,62 @@ 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 ( !player IsPlayerModelOK() ) { 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; @@ -268,11 +268,11 @@ bot_cry_for_help( attacker ) onDeath() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "death" ); - + self.wantsafespawn = true; } } @@ -284,7 +284,7 @@ chooseRandomClass() { class = ""; rank = self maps\mp\gametypes\_rank::getrankforxp( self getstat( int( tablelookup( "mp/playerStatsTable.csv", 1, "rankxp", 0 ) ) ) ) + 1; - + if ( rank < 4 || randomint( 100 ) < 2 ) { while ( class == "" ) @@ -294,29 +294,29 @@ chooseRandomClass() case 0: class = "assault_mp"; break; - + case 1: class = "specops_mp"; break; - + case 2: class = "heavygunner_mp"; break; - + case 3: if ( rank >= 2 ) { class = "demolitions_mp"; } - + break; - + case 4: if ( rank >= 3 ) { class = "sniper_mp"; } - + break; } } @@ -325,7 +325,7 @@ chooseRandomClass() { class = "custom" + ( randomint( 5 ) + 1 ); } - + return class; } @@ -335,23 +335,23 @@ chooseRandomClass() classWatch() { self endon( "disconnect" ); - + for ( ;; ) { while ( !isdefined( self.pers[ "team" ] ) || !allowClassChoice() ) { wait .05; } - + wait 0.5; - + if ( !maps\mp\gametypes\_globallogic::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" ] ) && maps\mp\gametypes\_globallogic::isvalidclass( self.class ) && isdefined( self.bot_change_class ) ) { wait .05; @@ -365,21 +365,21 @@ classWatch() teamWatch() { self endon( "disconnect" ); - + for ( ;; ) { while ( !isdefined( self.pers[ "team" ] ) || !allowTeamChoice() ) { wait .05; } - + wait 0.1; - + if ( self.team != "axis" && self.team != "allies" ) { self notify( "menuresponse", game[ "menu_team" ], getdvar( "bots_team" ) ); } - + while ( isdefined( self.pers[ "team" ] ) ) { wait .05; @@ -393,7 +393,7 @@ teamWatch() difficulty() { self endon( "disconnect" ); - + for ( ;; ) { if ( getdvarint( "bots_skill" ) != 9 ) @@ -420,7 +420,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; @@ -431,7 +431,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; @@ -452,7 +452,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; @@ -463,7 +463,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; @@ -484,7 +484,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; @@ -495,7 +495,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; @@ -516,7 +516,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; @@ -527,7 +527,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; @@ -548,7 +548,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; @@ -559,7 +559,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; @@ -580,7 +580,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; @@ -591,7 +591,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; @@ -612,7 +612,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; @@ -625,7 +625,7 @@ difficulty() break; } } - + wait 5; } } @@ -636,16 +636,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 ); @@ -655,11 +655,11 @@ set_diff() self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "remember_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 ); @@ -668,7 +668,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_ri,j_ankle_le"; - + self.pers[ "bots" ][ "behavior" ][ "strafe" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "nade" ] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "sprint" ] = randomint( 100 ); @@ -679,7 +679,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; @@ -699,21 +699,21 @@ set_class( rankxp ) primaryGroups[ 4 ] = "weapon_assault"; secondaryGroups = []; secondaryGroups[ 0 ] = "weapon_pistol"; - + rank = self maps\mp\gametypes\_rank::getrankforxp( rankxp ) + 1; - + if ( randomfloatrange( 0, 1 ) < ( ( rank / level.maxrank ) + 0.1 ) ) { self.pers[ "bots" ][ "behavior" ][ "quickscope" ] = true; } - + for ( i = 0; i < 5; i++ ) { primary = get_random_weapon( primaryGroups, rank ); att1 = get_random_attachment( primary, rank ); - + perk2 = get_random_perk( "perk2", rank ); - + if ( perk2 != "specialty_twoprimaries" ) { secondary = get_random_weapon( secondaryGroups, rank ); @@ -721,25 +721,25 @@ set_class( rankxp ) else { secondary = ""; - + while ( secondary == "" ) { secondary = get_random_weapon( primaryGroups, rank ); - + if ( primary == secondary ) { secondary = ""; } } } - + att2 = get_random_attachment( secondary, rank ); perk1 = get_random_perk( "perk1", rank, att1, att2 ); - + perk3 = get_random_perk( "perk3", rank ); gren = get_random_grenade( perk1 ); camo = randomint( 8 ); - + self setstat ( 200 + ( i * 10 ) + 1, level.weaponreferencetoindex[ primary ] ); self setstat ( 200 + ( i * 10 ) + 2, level.weaponattachmentreferencetoindex[ att1 ] ); self setstat ( 200 + ( i * 10 ) + 3, level.weaponreferencetoindex[ secondary ] ); @@ -761,19 +761,19 @@ get_random_attachment( weapon, rank ) { return "none"; } - + reasonable = getdvarint( "bots_loadout_reasonable" ); op = getdvarint( "bots_loadout_allow_op" ); - + id = level.tbl_weaponids[ level.weaponreferencetoindex[ weapon ] ]; atts = strtok( id[ "attachment" ], " " ); atts[ atts.size ] = "none"; - - + + for ( ;; ) { att = atts[ randomint( atts.size ) ]; - + if ( reasonable ) { switch ( att ) @@ -783,11 +783,11 @@ get_random_attachment( weapon, rank ) { continue; } - + break; } } - + if ( !op ) { if ( att == "gl" ) @@ -795,7 +795,7 @@ get_random_attachment( weapon, rank ) continue; } } - + return att; } } @@ -809,33 +809,33 @@ get_random_perk( perkslot, rank, att1, att2 ) { return "specialty_null"; } - + reasonable = getdvarint( "bots_loadout_reasonable" ); op = getdvarint( "bots_loadout_allow_op" ); - + keys = getarraykeys( level.tbl_perkdata ); - + for ( ;; ) { id = level.tbl_perkdata[ keys[ randomint( keys.size ) ] ]; - + if ( !isdefined( id ) || !isdefined( id[ "perk_num" ] ) ) { continue; } - + if ( perkslot != id[ "perk_num" ] ) { continue; } - + ref = id[ "reference_full" ]; - + if ( ref == "specialty_null" && randomint( 100 ) < 95 ) { continue; } - + if ( reasonable ) { switch ( ref ) @@ -847,7 +847,7 @@ get_random_perk( perkslot, rank, att1, att2 ) continue; } } - + if ( !op ) { switch ( ref ) @@ -859,12 +859,12 @@ get_random_perk( perkslot, rank, att1, att2 ) continue; } } - + if ( !isItemUnlocked( ref, rank ) ) { continue; } - + return ref; } } @@ -878,13 +878,13 @@ get_random_grenade( perk1 ) possibles[ 0 ] = "flash_grenade"; possibles[ 1 ] = "smoke_grenade"; possibles[ 2 ] = "concussion_grenade"; - + reasonable = getdvarint( "bots_loadout_reasonable" ); - + for ( ;; ) { possible = possibles[ randomint( possibles.size ) ]; - + if ( reasonable ) { switch ( possible ) @@ -893,12 +893,12 @@ get_random_grenade( perk1 ) continue; } } - + if ( perk1 == "specialty_specialgrenade" && possible == "smoke_grenade" ) { continue; } - + return possible; } } @@ -910,21 +910,21 @@ get_random_weapon( groups, rank ) { reasonable = getdvarint( "bots_loadout_reasonable" ); op = getdvarint( "bots_loadout_allow_op" ); - + keys = getarraykeys( level.tbl_weaponids ); - + for ( ;; ) { id = level.tbl_weaponids[ keys[ randomint( keys.size ) ] ]; - + if ( !isdefined( id ) ) { continue; } - + group = id[ "group" ]; inGroup = false; - + for ( i = groups.size - 1; i >= 0; i-- ) { if ( groups[ i ] == group ) @@ -932,14 +932,14 @@ get_random_weapon( groups, rank ) inGroup = true; } } - + if ( !inGroup ) { continue; } - + ref = id[ "reference" ]; - + if ( reasonable ) { switch ( ref ) @@ -956,7 +956,7 @@ get_random_weapon( groups, rank ) continue; } } - + if ( !op ) { if ( ref == "rpg" ) @@ -964,12 +964,12 @@ get_random_weapon( groups, rank ) continue; } } - + if ( !isItemUnlocked( ref, rank ) ) { continue; } - + return ref; } } @@ -981,23 +981,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 getstat( int( tablelookup( "mp/playerStatsTable.csv", 1, "plevel", 0 ) ) ); break; } @@ -1010,7 +1010,7 @@ bot_get_prestige() { p = p_dvar; } - + return p; } @@ -1021,27 +1021,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" ]; @@ -1051,26 +1051,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( 35, 15, 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 ) @@ -1081,7 +1081,7 @@ bot_get_rank() { rank = Round( random_normal_distribution( rank_dvar, 5, 0, level.maxrank ) ); } - + return maps\mp\gametypes\_rank::getrankinfominxp( rank ); } @@ -1091,20 +1091,20 @@ bot_get_rank() onSpawned() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); - + if ( randomint( 100 ) <= self.pers[ "bots" ][ "behavior" ][ "class" ] ) { self.bot_change_class = undefined; } - + self.bot_lock_goal = false; self.help_time = undefined; self.bot_was_follow_script_update = undefined; - + if ( getdvarint( "bots_play_obj" ) ) { self thread bot_dom_cap_think(); @@ -1119,11 +1119,11 @@ onBotSpawned() { self endon( "disconnect" ); level endon( "game_ended" ); - + for ( ;; ) { self waittill( "bot_spawned" ); - + self thread start_bot_threads(); } } @@ -1136,41 +1136,41 @@ start_bot_threads() self endon( "disconnect" ); level endon( "game_ended" ); self endon( "death" ); - + while ( level.inprematchperiod ) { wait 0.05; } - + // inventory usage if ( getdvarint( "bots_play_killstreak" ) ) { self thread bot_killstreak_think(); } - + self thread bot_weapon_think(); self thread doReloadCancel(); - + // script targeting if ( getdvarint( "bots_play_target_other" ) ) { self thread bot_target_vehicle(); self thread bot_equipment_kill_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" ) ) { @@ -1179,17 +1179,17 @@ start_bot_threads() self thread bot_use_equipment_think(); self thread bot_watch_think_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_sab(); - + self thread bot_sd_defenders(); self thread bot_sd_attackers(); } @@ -1203,21 +1203,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--; @@ -1234,17 +1234,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" ); @@ -1263,22 +1263,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" ); } @@ -1292,22 +1292,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" ); } @@ -1322,17 +1322,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" ); } @@ -1347,22 +1347,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" ); @@ -1384,22 +1384,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" ); @@ -1430,7 +1430,7 @@ fire_current_weapon() self endon( "disconnect" ); self endon( "weapon_change" ); self endon( "stop_firing_weapon" ); - + for ( ;; ) { self thread BotPressAttack( 0.05 ); @@ -1447,7 +1447,7 @@ fire_c4() self endon( "disconnect" ); self endon( "weapon_change" ); self endon( "stop_firing_weapon" ); - + for ( ;; ) { self thread BotPressADS( 0.05 ); @@ -1463,21 +1463,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 ); } @@ -1489,12 +1489,12 @@ botThrowGrenade( nade, time ) self endon( "disconnect" ); self endon( "death" ); level endon( "game_ended" ); - + if ( !self getammocount( nade ) ) { return false; } - + if ( nade != "frag_grenade_mp" ) { self thread BotPressSmoke( time ); @@ -1503,9 +1503,9 @@ botThrowGrenade( nade, time ) { self thread BotPressFrag( time ); } - + ret = self waittill_any_timeout( 5, "grenade_fire" ); - + return ( ret == "grenade_fire" ); } @@ -1515,7 +1515,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 ) ) @@ -1523,7 +1523,7 @@ bot_array_nearest_curorigin( array ) result = array[ i ]; } } - + return result; } @@ -1537,9 +1537,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(); } @@ -1549,35 +1549,35 @@ stop_go_target_on_death( tar ) bot_think_camp_loop() { campSpot = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "camp" ), 1024 ) ) ); - + if ( !isdefined( campSpot ) ) { return; } - + self SetScriptGoal( campSpot.origin, 16 ); - + time = randomintrange( 10, 20 ); - + self BotNotifyBotEvent( "camp", "go", campSpot, time ); - + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - + if ( ret != "new_goal" ) { self ClearScriptGoal(); } - + if ( ret != "goal" ) { return; } - + self BotNotifyBotEvent( "camp", "start", campSpot, time ); - + self thread killCampAfterTime( time ); self CampAtSpot( campSpot.origin, campSpot.origin + anglestoforward( campSpot.angles ) * 2048 ); - + self BotNotifyBotEvent( "camp", "stop", campSpot, time ); } @@ -1588,21 +1588,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(); } } @@ -1615,11 +1615,11 @@ killCampAfterTime( time ) self endon( "death" ); self endon( "disconnect" ); self endon( "kill_camp_bot" ); - + wait time + 0.05; self ClearScriptGoal(); self ClearScriptAimPos(); - + self notify( "kill_camp_bot" ); } @@ -1631,20 +1631,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" ); } @@ -1654,17 +1654,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" ); } @@ -1675,53 +1675,53 @@ 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 IsPlayerModelOK() ) { continue; } - + if ( player == self ) { continue; } - + if ( !isalive( 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 ); } @@ -1732,26 +1732,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(); } } @@ -1764,17 +1764,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" ); } @@ -1787,9 +1787,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" ); @@ -1801,37 +1801,37 @@ killFollowAfterTime( time ) followPlayer( who ) { self endon( "kill_follow_bot" ); - + self thread watchForFollowNewGoal(); - + for ( ;; ) { wait 0.05; - + if ( !isdefined( who ) || !isalive( 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" ); } @@ -1847,102 +1847,102 @@ 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 HasScriptAimPos() ) { return; } - + if ( self BotIsFrozen() ) { return; } - + if ( self IsBotFragging() || self IsBotSmoking() ) { return; } - + if ( self isDefusing() || self isPlanting() ) { return; } - + if ( self inLastStand() ) { 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; } @@ -1952,25 +1952,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 ); } @@ -1983,10 +1983,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 ); @@ -2005,80 +2005,80 @@ 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( "c4_mp" ) ) { nade = "c4_mp"; } - + if ( !isdefined( nade ) ) { return; } - + if ( self HasThreat() || self HasScriptAimPos() ) { return; } - + if ( self BotIsFrozen() ) { return; } - + if ( self IsBotFragging() || self IsBotSmoking() ) { return; } - + if ( self isDefusing() || self isPlanting() ) { return; } - + if ( self inLastStand() ) { return; } - + curWeap = self getcurrentweapon(); - + if ( curWeap == "none" || !isWeaponDroppable( curWeap ) ) { curWeap = self.lastdroppableweapon; } - + 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; @@ -2087,21 +2087,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; } @@ -2111,18 +2111,18 @@ 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; - + if ( self changeToWeapon( nade ) ) { if ( nade != "c4_mp" ) @@ -2133,11 +2133,11 @@ bot_use_equipment_think_loop( data ) { self thread fire_c4(); } - + self waittill_any_timeout( 5, "grenade_fire", "weapon_change" ); self notify( "stop_firing_weapon" ); } - + self thread changeToWeapon( curWeap ); self ClearScriptAimPos(); self BotStopMoving( false ); @@ -2151,10 +2151,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 ); @@ -2173,102 +2173,102 @@ 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 HasScriptAimPos() ) { return; } - + if ( self BotIsFrozen() ) { return; } - + if ( self IsBotFragging() || self IsBotSmoking() ) { return; } - + if ( self isDefusing() || self isPlanting() ) { return; } - + if ( self inLastStand() ) { 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; } @@ -2278,27 +2278,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 ); } @@ -2311,10 +2311,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 ); @@ -2327,27 +2327,27 @@ bot_use_grenade_think() 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 ); } @@ -2358,21 +2358,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(); } } @@ -2383,89 +2383,89 @@ follow_target() bot_listen_to_steps_loop() { dist = level.bots_listendist; - + if ( self hasperk( "specialty_parabolic" ) ) { dist *= 1.4; } - + dist *= dist; - + heard = undefined; - + for ( i = level.players.size - 1 ; i >= 0; i-- ) { player = level.players[ i ]; - + if ( !player IsPlayerModelOK() ) { continue; } - + if ( player == self ) { continue; } - + if ( level.teambased && self.team == player.team ) { continue; } - + if ( player.sessionstate != "playing" ) { continue; } - + if ( !isalive( player ) ) { continue; } - + if ( player hasperk( "specialty_quieter" ) ) { continue; } - + if ( lengthsquared( player getvelocity() ) < 20000 ) { continue; } - + if ( distancesquared( player.origin, self.origin ) > dist ) { continue; } - + heard = player; break; } - + if ( !isdefined( heard ) ) { return; } - + self BotNotifyBotEvent( "heard_target", "start", heard ); - + if ( bullettracepassed( self getEyePos(), 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 ); } @@ -2476,16 +2476,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(); } } @@ -2497,12 +2497,12 @@ bot_revenge_think() { self endon( "death" ); self endon( "disconnect" ); - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) { return; } - + if ( isdefined( self.lastkiller ) && isalive( self.lastkiller ) ) { if ( bullettracepassed( self getEyePos(), self.lastkiller gettagorigin( "j_spineupper" ), false, self.lastkiller ) ) @@ -2510,37 +2510,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 ); } } @@ -2551,29 +2551,29 @@ bot_revenge_think() doReloadCancel_loop() { ret = self waittill_any_return( "reload", "weapon_change" ); - + if ( self BotIsFrozen() ) { return; } - + if ( self isDefusing() || self isPlanting() ) { return; } - + if ( self inLastStand() ) { return; } - + curWeap = self getcurrentweapon(); - + if ( !maps\mp\gametypes\_weapons::issidearm( curWeap ) && !maps\mp\gametypes\_weapons::isprimaryweapon( curWeap ) ) { return; } - + if ( ret == "reload" ) { // check single reloads @@ -2582,41 +2582,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::issidearm( weapon ) && !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 ); @@ -2632,7 +2632,7 @@ doReloadCancel() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { self doReloadCancel_loop(); @@ -2645,41 +2645,41 @@ 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() || self inLastStand() ) { return; } - + hasTarget = self HasThreat(); curWeap = self getcurrentweapon(); - + if ( hasTarget ) { threat = self getThreat(); - + if ( threat.classname == "script_vehicle" && self getammocount( "rpg_mp" ) ) { if ( curWeap != "rpg_mp" ) { self thread changeToWeapon( "rpg_mp" ); } - + return; } } - + force = ( ret == "bot_force_check_switch" ); - + if ( data.first ) { data.first = false; - + if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "initswitch" ] ) { return; @@ -2693,7 +2693,7 @@ bot_weapon_think_loop( data ) { return; } - + if ( hasTarget ) { return; @@ -2704,44 +2704,44 @@ bot_weapon_think_loop( data ) force = true; } } - + weaponslist = self getweaponslist(); weap = ""; - + while ( weaponslist.size ) { weapon = weaponslist[ randomint( weaponslist.size ) ]; weaponslist = array_remove( weaponslist, weapon ); - + if ( !self getammocount( weapon ) && !force ) { continue; } - + if ( maps\mp\gametypes\_weapons::ishackweapon( weapon ) ) { continue; } - + if ( maps\mp\gametypes\_weapons::isgrenade( weapon ) ) { continue; } - + if ( curWeap == weapon || weapon == "c4_mp" || weapon == "none" || weapon == "claymore_mp" || weapon == "" ) { continue; } - + weap = weapon; break; } - + if ( weap == "" ) { return; } - + self thread changeToWeapon( weap ); } @@ -2753,10 +2753,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 ); @@ -2769,7 +2769,7 @@ bot_weapon_think() bot_watch_think_mw2_loop() { tube = self getValidTube(); - + if ( !isdefined( tube ) ) { if ( self getammocount( "rpg_mp" ) ) @@ -2781,19 +2781,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 ); } @@ -2805,31 +2805,31 @@ 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 inLastStand() ) { continue; } - + if ( self HasThreat() ) { continue; } - + self bot_watch_think_mw2_loop(); } } @@ -2840,14 +2840,14 @@ bot_watch_think_mw2() bot_killstreak_think_loop() { curWeap = self getcurrentweapon(); - + if ( curWeap == "none" || !isWeaponDroppable( curWeap ) ) { curWeap = self.lastdroppableweapon; } - + targetPos = undefined; - + switch ( self.pers[ "hardPointItem" ] ) { case "radar_mp": @@ -2855,86 +2855,86 @@ bot_killstreak_think_loop() { return; } - + break; - + case "helicopter_mp": chopper = level.chopper; - + if ( isdefined( chopper ) && level.teambased && getdvarint( "doubleHeli" ) ) { chopper = level.chopper[ self.team ]; } - + if ( isdefined( chopper ) ) { return; } - + if ( isdefined( level.mannedchopper ) ) { return; } - + break; - + case "airstrike_mp": if ( isdefined( level.airstrikeinprogress ) ) { return; } - + players = []; - + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[ i ]; - + if ( !player IsPlayerModelOK() ) { continue; } - + if ( player == self ) { continue; } - + if ( !isdefined( player.team ) ) { continue; } - + if ( level.teambased && self.team == player.team ) { continue; } - + if ( player.sessionstate != "playing" ) { continue; } - + if ( !isalive( player ) ) { continue; } - + if ( player hasperk( "specialty_gpsjammer" ) ) { continue; } - + if ( !bullettracepassed( player.origin, player.origin + ( 0, 0, 512 ), false, player ) && self.pers[ "bots" ][ "skill" ][ "base" ] > 3 ) { continue; } - + players[ players.size ] = player; } - + target = random( players ); - + if ( isdefined( target ) ) { targetPos = 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 ); @@ -2943,39 +2943,39 @@ bot_killstreak_think_loop() { targetPos = self.origin + ( randomintrange( -512, 512 ), randomintrange( -512, 512 ), 0 ); } - + break; - + default: return; } - + isAirstrikePos = isdefined( targetPos ); - + if ( self.pers[ "hardPointItem" ] == "airstrike_mp" && !isAirstrikePos ) { return; } - + self BotNotifyBotEvent( "killstreak", "call", targetPos ); - + self BotStopMoving( true ); - + if ( self changeToWeapon( self.pers[ "hardPointItem" ] ) ) { wait 1; - + if ( isAirstrikePos && !isdefined( level.airstrikeinprogress ) ) { self BotFreezeControls( true ); - + self notify( "confirm_location", targetPos ); wait 1; - + self BotFreezeControls( false ); } } - + self BotStopMoving( false ); } @@ -2987,31 +2987,31 @@ bot_killstreak_think() self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); - + for ( ;; ) { wait randomintrange( 1, 3 ); - + if ( self BotIsFrozen() ) { continue; } - + if ( !isdefined( self.pers[ "hardPointItem" ] ) ) { continue; } - + if ( self HasThreat() ) { continue; } - + if ( self isDefusing() || self isPlanting() || self inLastStand() ) { continue; } - + self bot_killstreak_think_loop(); } } @@ -3023,72 +3023,72 @@ bot_uav_think_loop() { 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 IsPlayerModelOK() ) { continue; } - + if ( player == self ) { continue; } - + if ( !isdefined( player.team ) ) { continue; } - + if ( player.sessionstate != "playing" ) { continue; } - + if ( level.teambased && player.team == self.team ) { continue; } - + if ( !isalive( player ) ) { continue; } - + distFromPlayer = distancesquared( self.origin, player.origin ); - + if ( distFromPlayer > dist ) { continue; } - + if ( ( !issubstr( player getcurrentweapon(), "_silencer_" ) && player.bots_firing ) || ( self.bot_radar && !player hasperk( "specialty_gpsjammer" ) ) ) { self BotNotifyBotEvent( "uav_target", "start", player ); - + distSq = self.pers[ "bots" ][ "skill" ][ "help_dist" ] * self.pers[ "bots" ][ "skill" ][ "help_dist" ]; - + if ( distFromPlayer < distSq && bullettracepassed( self getEyePos(), 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; } } @@ -3101,21 +3101,21 @@ bot_uav_think() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { wait 0.75; - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) { continue; } - + if ( level.hardcoremode && !self.bot_radar ) { continue; } - + self bot_uav_think_loop(); } } @@ -3126,44 +3126,44 @@ bot_uav_think() bot_target_vehicle_loop() { chopper = level.chopper; - + if ( isdefined( chopper ) && level.teambased && getdvarint( "doubleHeli" ) ) { chopper = level.chopper[ level.otherteam[ self.team ] ]; } - + if ( !isdefined( chopper ) ) { return; } - + if ( !isdefined( level.bot_chopper ) || !level.bot_chopper ) // must be crashing or leaving { return; } - + if ( isdefined( chopper.owner ) && chopper.owner == self ) { return; } - + if ( chopper.team == self.team && level.teambased ) { return; } - + if ( !bullettracepassed( self getEyePos(), chopper.origin + ( 0, 0, -5 ), false, chopper ) ) { return; } - + self BotNotifyBotEvent( "attack_vehicle", "start", chopper ); - + self SetScriptEnemy( chopper, ( 0, 0, -5 ) ); self bot_attack_vehicle( chopper ); self ClearScriptEnemy(); self notify( "bot_force_check_switch" ); - + self BotNotifyBotEvent( "attack_vehicle", "stop", chopper ); } @@ -3174,26 +3174,26 @@ bot_target_vehicle() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { wait( randomintrange( 2, 4 ) ); - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) { continue; } - + if ( self HasScriptEnemy() ) { continue; } - + if ( !self getammocount( "rpg_mp" ) && self BotGetRandom() < 90 ) { continue; } - + self bot_target_vehicle_loop(); } } @@ -3206,14 +3206,14 @@ bot_attack_vehicle( chopper ) chopper endon( "death" ); chopper endon( "crashing" ); chopper endon( "leaving" ); - + wait_time = randomintrange( 7, 10 ); - + for ( i = 0; i < wait_time; i++ ) { self notify( "bot_force_check_switch" ); wait( 1 ); - + if ( !isdefined( chopper ) ) { return; @@ -3231,56 +3231,56 @@ bot_equipment_kill_think_loop() myAngles = self getplayerangles(); target = undefined; hasDetectExp = self hasperk( "specialty_detectexplosive" ); - + for ( i = grenades.size - 1; i >= 0; 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 ( !hasDetectExp && !bullettracepassed( myEye, item.origin + ( 0, 0, 0 ), false, item ) ) { continue; } - + if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) { continue; } - + if ( distancesquared( item.origin, self.origin ) < 512 * 512 ) { target = item; break; } } - + if ( isdefined( target ) ) { self BotNotifyBotEvent( "attack_equ", "start", target ); - + self SetScriptEnemy( target, ( 0, 0, 0 ) ); self bot_equipment_attack( target ); self ClearScriptEnemy(); - + self BotNotifyBotEvent( "attack_equ", "stop", target ); } } @@ -3292,21 +3292,21 @@ bot_equipment_kill_think() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { wait( randomintrange( 1, 3 ) ); - + if ( self HasScriptEnemy() ) { continue; } - + if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 ) { continue; } - + self bot_equipment_kill_think_loop(); } } @@ -3317,13 +3317,13 @@ bot_equipment_kill_think() bot_equipment_attack( equ ) { equ endon( "death" ); - + wait_time = randomintrange( 7, 10 ); - + for ( i = 0; i < wait_time; i++ ) { wait( 1 ); - + if ( !isdefined( equ ) ) { return; @@ -3357,26 +3357,26 @@ BotUseRandomEquipment() { self endon( "death" ); self endon( "disconnect" ); - + equ = undefined; - + if ( self getammocount( "claymore_mp" ) ) { equ = "claymore_mp"; } - + if ( self getammocount( "c4_mp" ) ) { equ = "c4_mp"; } - + if ( !isdefined( equ ) ) { return; } - + curWeap = self getcurrentweapon(); - + if ( self changeToWeapon( equ ) ) { if ( equ != "c4_mp" ) @@ -3387,11 +3387,11 @@ BotUseRandomEquipment() { self thread fire_c4(); } - + self waittill_any_timeout( 5, "grenade_fire", "weapon_change" ); self notify( "stop_firing_weapon" ); } - + self thread changeToWeapon( curWeap ); } @@ -3402,43 +3402,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 getEyeHeight() ); - + if ( isdefined( nearestEnemy ) && distancesquared( self.origin, nearestEnemy.origin ) < 1024 * 1024 && rand < 40 ) { origin += ( nearestEnemy.origin[ 0 ], nearestEnemy.origin[ 1 ], self.origin[ 2 ] ); @@ -3455,7 +3455,7 @@ BotLookAtRandomThing( obj_target ) { origin += self.origin + anglestoforward( ( 0, randomint( 360 ), 0 ) ) * 1024; } - + self SetScriptAimPos( origin ); wait 2; self ClearScriptAimPos(); @@ -3470,16 +3470,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 ); @@ -3496,7 +3496,7 @@ bot_do_random_action_for_objective( obj_target ) self thread BotLookAtRandomThing( obj_target ); } } - + wait 2; self.bot_random_obj_action = undefined; } @@ -3509,52 +3509,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 ); } @@ -3565,26 +3565,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(); } } @@ -3599,17 +3599,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" ); } @@ -3620,42 +3620,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 ); } @@ -3666,26 +3666,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(); } } @@ -3700,22 +3700,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" ); } @@ -3726,16 +3726,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 ) @@ -3760,20 +3760,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++ ) @@ -3788,53 +3788,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 + 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; } @@ -3845,26 +3845,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(); } } @@ -3879,27 +3879,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" ); @@ -3917,11 +3917,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 ) { @@ -3931,69 +3931,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 + 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 @@ -4001,34 +4001,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(); @@ -4043,31 +4043,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(); } } @@ -4082,27 +4082,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" ); @@ -4123,29 +4123,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" ); } @@ -4156,18 +4156,18 @@ bot_sab_loop() { myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + bomb = level.sabbomb; bombteam = bomb.ownerteam; carrier = bomb.carrier; timeleft = maps\mp\gametypes\_globallogic::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 ) { @@ -4175,41 +4175,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() ) { @@ -4218,76 +4218,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 = maps\mp\gametypes\_globallogic::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 ) { @@ -4298,51 +4298,51 @@ bot_sab_loop() { return; } - + if ( carrier hasperk( "specialty_gpsjammer" ) ) { 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 ) { @@ -4351,23 +4351,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 ) { @@ -4375,78 +4375,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; } @@ -4460,36 +4460,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.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(); } } @@ -4501,69 +4501,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\_globallogic::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 ); @@ -4572,67 +4572,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 ) { @@ -4640,57 +4640,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" ); } @@ -4702,34 +4702,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.bot_lock_goal ) { continue; } - + if ( self isPlanting() || self isDefusing() ) { continue; } - + self bot_sd_defenders_loop( data ); } } @@ -4747,15 +4747,15 @@ bot_sd_attackers_loop( data ) { wait( randomintrange( 3, 5 ) ); } - + if ( self.bot_lock_goal ) { return; } - + myTeam = self.pers[ "team" ]; otherTeam = getotherteam( myTeam ); - + // bomb planted if ( level.bombplanted ) { @@ -4763,53 +4763,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\_globallogic::gettimeremaining() / 1000; timepassed = maps\mp\gametypes\_globallogic::gettimepassed() / 1000; - + // dont have a bomb if ( !self isBombCarrier() && !level.multibomb ) { @@ -4817,10 +4817,10 @@ bot_sd_attackers_loop( data ) { return; } - + bomb = level.sdbomb; carrier = level.sdbomb.carrier; - + // bomb is picked up if ( isdefined( carrier ) ) { @@ -4829,32 +4829,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 ) { @@ -4862,66 +4862,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 ); @@ -4930,46 +4930,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 ); } @@ -4981,21 +4981,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 ); diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index dee69c4..48e69ae 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -13,7 +13,7 @@ wait_for_builtins() { return true; } - + if ( i < 18 ) { waittillframeend; @@ -23,7 +23,7 @@ wait_for_builtins() wait 0.05; } } - + return false; } @@ -58,7 +58,7 @@ BotBuiltinFileRead( file ) { return [[ level.bot_builtins[ "fileread" ] ]]( file ); } - + return undefined; } @@ -71,7 +71,7 @@ BotBuiltinFileExists( file ) { return [[ level.bot_builtins[ "fileexists" ] ]]( file ); } - + return false; } @@ -142,7 +142,7 @@ BotBuiltinIsBot() { return self [[ level.bot_builtins[ "isbot" ] ]](); } - + return false; } @@ -155,7 +155,7 @@ BotBuiltinFileOpen( file, mode ) { return [[ level.bot_builtins[ "fs_fopen" ] ]]( file, mode ); } - + return 0; } @@ -179,7 +179,7 @@ BotBuiltinReadLine( fh ) { return [[ level.bot_builtins[ "fs_readline" ] ]]( fh ); } - + return undefined; } @@ -208,35 +208,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 ] ) @@ -245,12 +245,12 @@ doHostCheck() } } } - + if ( !result ) { return; } - + self.pers[ "bot_host" ] = true; } @@ -272,11 +272,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; @@ -340,7 +340,7 @@ BotGetTargetRandom() { return undefined; } - + return self.bot.target.rand; } @@ -398,7 +398,7 @@ IsPlayerModelOK() BotFreezeControls( what ) { self.bot.isfrozen = what; - + if ( what ) { self notify( "kill_goal" ); @@ -419,7 +419,7 @@ BotIsFrozen() BotStopMoving( what ) { self.bot.stop_move = what; - + if ( what ) { self notify( "kill_goal" ); @@ -460,7 +460,7 @@ SetScriptGoal( goal, dist ) { dist = 16; } - + self.bot.script_goal = goal; self.bot.script_goal_dist = dist; waittillframeend; @@ -568,7 +568,7 @@ getThreat() { return undefined; } - + return self.bot.target.entity; } @@ -650,22 +650,22 @@ isArtShocked() getValidTube() { weaps = self getweaponslist(); - + for ( i = 0; i < weaps.size; i++ ) { weap = weaps[ i ]; - + if ( !self getammocount( weap ) ) { continue; } - + if ( issubstr( weap, "gl_" ) && !issubstr( weap, "_gl_" ) ) { return weap; } } - + return undefined; } @@ -679,24 +679,24 @@ getValidGrenade() grenadeTypes[ grenadeTypes.size ] = "smoke_grenade_mp"; grenadeTypes[ grenadeTypes.size ] = "flash_grenade_mp"; grenadeTypes[ grenadeTypes.size ] = "concussion_grenade_mp"; - + possibles = []; - + for ( i = 0; i < grenadeTypes.size; i++ ) { if ( !self hasweapon( grenadeTypes[ i ] ) ) { continue; } - + if ( !self getammocount( grenadeTypes[ i ] ) ) { continue; } - + possibles[ possibles.size ] = grenadeTypes[ i ]; } - + return random( possibles ); } @@ -717,7 +717,7 @@ getWinningTeam() { winner = "axis"; } - + return winner; } @@ -735,7 +735,7 @@ getBaseWeaponName( weap ) WeaponIsFullAuto( weap ) { weaptoks = strtok( weap, "_" ); - + return isdefined( weaptoks[ 0 ] ) && isstring( weaptoks[ 0 ] ) && isdefined( level.bots_fullautoguns[ weaptoks[ 0 ] ] ); } @@ -745,17 +745,17 @@ WeaponIsFullAuto( weap ) getEyeHeight() { stance = self getstance(); - + if ( self inLastStand() || stance == "prone" ) { return 11; } - + if ( stance == "crouch" ) { return 40; } - + return 60; } @@ -786,7 +786,7 @@ waittill_either_return( str1, str2 ) { return str1; } - + return str2; } @@ -824,36 +824,36 @@ waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) { self endon( "death" ); } - + ent = spawnstruct(); - + if ( isdefined( string1 ) ) { self thread waittill_string( string1, ent ); } - + if ( isdefined( string2 ) ) { self thread waittill_string( string2, ent ); } - + if ( isdefined( string3 ) ) { self thread waittill_string( string3, ent ); } - + if ( isdefined( string4 ) ) { self thread waittill_string( string4, ent ); } - + if ( isdefined( string5 ) ) { self thread waittill_string( string5, ent ); } - + ent thread _timeout( timeOut ); - + ent waittill( "returned", msg ); ent notify( "die" ); return msg; @@ -865,7 +865,7 @@ waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) _timeout( delay ) { self endon( "die" ); - + wait( delay ); self notify( "returned", "timeout" ); } @@ -879,151 +879,151 @@ isItemUnlocked( what, lvl ) { case "ak47": return true; - + case "ak74u": return ( lvl >= 28 ); - + case "barrett": return ( lvl >= 49 ); - + case "dragunov": return ( lvl >= 22 ); - + case "g3": return ( lvl >= 25 ); - + case "g36c": return ( lvl >= 37 ); - + case "m1014": return ( lvl >= 31 ); - + case "m14": return ( lvl >= 46 ); - + case "m16": return true; - + case "m21": return ( lvl >= 7 ); - + case "m4": return ( lvl >= 10 ); - + case "m40a3": return true; - + case "m60e4": return ( lvl >= 19 ); - + case "mp44": return ( lvl >= 52 ); - + case "mp5": return true; - + case "p90": return ( lvl >= 40 ); - + case "rpd": return true; - + case "saw": return true; - + case "skorpion": return true; - + case "uzi": return ( lvl >= 13 ); - + case "winchester1200": return true; - + case "remington700": return ( lvl >= 34 ); - + case "beretta": return true; - + case "colt45": return ( lvl >= 16 ); - + case "deserteagle": return ( lvl >= 43 ); - + case "deserteaglegold": return ( lvl >= 55 ); - + case "usp": return true; - + case "specialty_bulletdamage": return true; - + case "specialty_armorvest": return true; - + case "specialty_fastreload": return ( lvl >= 20 ); - + case "specialty_rof": return ( lvl >= 29 ); - + case "specialty_twoprimaries": return ( lvl >= 38 ); - + case "specialty_gpsjammer": return ( lvl >= 11 ); - + case "specialty_explosivedamage": return true; - + case "specialty_longersprint": return true; - + case "specialty_bulletaccuracy": return true; - + case "specialty_pistoldeath": return ( lvl >= 8 ); - + case "specialty_grenadepulldeath": return ( lvl >= 17 ); - + case "specialty_bulletpenetration": return true; - + case "specialty_holdbreath": return ( lvl >= 26 ); - + case "specialty_quieter": return ( lvl >= 44 ); - + case "specialty_parabolic": return ( lvl >= 35 ); - + case "specialty_specialgrenade": return true; - + case "specialty_weapon_rpg": return true; - + case "specialty_weapon_claymore": return ( lvl >= 23 ); - + case "specialty_fraggrenade": return ( lvl >= 41 ); - + case "specialty_extraammo": return ( lvl >= 32 ); - + case "specialty_detectexplosive": return ( lvl >= 14 ); - + case "specialty_weapon_c4": return true; - + default: return true; } @@ -1043,12 +1043,12 @@ isWeaponDroppable( weap ) random( arr ) { size = arr.size; - + if ( !size ) { return undefined; } - + return arr[ randomint( size ) ]; } @@ -1058,17 +1058,17 @@ random( arr ) array_remove( ents, remover ) { newents = []; - + for ( i = 0; i < ents.size; i++ ) { index = ents[ i ]; - + if ( index != remover ) { newents[ newents.size ] = index; } } - + return newents; } @@ -1089,15 +1089,15 @@ GetHostPlayer() for ( i = 0; i < level.players.size; i++ ) { player = level.players[ i ]; - + if ( !player is_host() ) { continue; } - + return player; } - + return undefined; } @@ -1107,51 +1107,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; } } @@ -1164,17 +1164,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 ]; @@ -1184,35 +1184,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; } @@ -1224,20 +1224,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; } @@ -1258,7 +1258,7 @@ distancesquared2D( to, from ) { to = ( to[ 0 ], to[ 1 ], 0 ); from = ( from[ 0 ], from[ 1 ], 0 ); - + return distancesquared( to, from ); } @@ -1268,7 +1268,7 @@ distancesquared2D( to, from ) float_old( num ) { setdvar( "temp_dvar_bot_util", num ); - + return getdvarfloat( "temp_dvar_bot_util" ); } @@ -1278,7 +1278,7 @@ float_old( num ) Round( x ) { y = int( x ); - + if ( abs( x ) - abs( y ) > 0.5 ) { if ( x < 0 ) @@ -1303,12 +1303,12 @@ angleclamp180( angle ) { angleFrac = angle / 360.0; angle = ( angleFrac - floor( angleFrac ) ) * 360.0; - + if ( angle > 180.0 ) { return angle - 360.0; } - + return angle; } @@ -1326,122 +1326,122 @@ clamp( a, minv, maxv ) 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; } @@ -1454,11 +1454,11 @@ cac_init_patch() if ( !isdefined( level.tbl_weaponids ) ) { level.tbl_weaponids = []; - + for ( i = 0; i < 150; i++ ) { reference_s = tablelookup( "mp/statsTable.csv", 0, i, 4 ); - + if ( reference_s != "" ) { level.tbl_weaponids[ i ][ "reference" ] = reference_s; @@ -1472,27 +1472,27 @@ cac_init_patch() } } } - + if ( !isdefined( level.tbl_weaponattachment ) ) { level.tbl_weaponattachment = []; - + for ( i = 0; i < 8; i++ ) { level.tbl_weaponattachment[ i ][ "bitmask" ] = int( tablelookup( "mp/attachmentTable.csv", 9, i, 10 ) ); level.tbl_weaponattachment[ i ][ "reference" ] = tablelookup( "mp/attachmentTable.csv", 9, i, 4 ); } } - + if ( !isdefined( level.tbl_perkdata ) ) { level.tbl_perkdata = []; - + // generating perk data vars collected form statsTable.csv for ( i = 150; i < 194; i++ ) { reference_s = tablelookup( "mp/statsTable.csv", 0, i, 4 ); - + if ( reference_s != "" ) { level.tbl_perkdata[ i ][ "reference" ] = reference_s; @@ -1508,38 +1508,38 @@ cac_init_patch() } } } - + level.perkreferencetoindex = []; level.weaponreferencetoindex = []; level.weaponattachmentreferencetoindex = []; - + for ( i = 0; i < 150; i++ ) { if ( !isdefined( level.tbl_weaponids[ i ] ) || !isdefined( level.tbl_weaponids[ i ][ "reference" ] ) ) { continue; } - + level.weaponreferencetoindex[ level.tbl_weaponids[ i ][ "reference" ] ] = i; } - + for ( i = 0; i < 8; i++ ) { if ( !isdefined( level.tbl_weaponattachment[ i ] ) || !isdefined( level.tbl_weaponattachment[ i ][ "reference" ] ) ) { continue; } - + level.weaponattachmentreferencetoindex[ level.tbl_weaponattachment[ i ][ "reference" ] ] = i; } - + for ( i = 150; i < 194; i++ ) { if ( !isdefined( level.tbl_perkdata[ i ] ) || !isdefined( level.tbl_perkdata[ i ][ "reference_full" ] ) ) { continue; } - + level.perkreferencetoindex[ level.tbl_perkdata[ i ][ "reference_full" ] ] = i; } } @@ -1550,38 +1550,38 @@ cac_init_patch() FrontLinesWaypoints() { waypoints = []; - + for ( i = 0;; i++ ) { dvar_answer = getdvar( "flwp_" + i ); - + if ( dvar_answer == "" || dvar_answer == "eof" ) { break; } - + toks = strtok( dvar_answer, "," ); - + waypoint = spawnstruct(); wp_num = int( toks[ 0 ] ); x = float_old( toks[ 1 ] ); y = float_old( toks[ 2 ] ); z = float_old( toks[ 3 ] ); waypoint.origin = ( x, y, z ); - + waypoint.type = toks[ 4 ]; waypoint.children = []; - + num_children = int( toks[ 5 ] ); - + for ( h = 0; h < num_children; h++ ) { waypoint.children[ waypoint.children.size ] = int( toks[ 6 + h ] ); } - + waypoints[ wp_num ] = waypoint; } - + return waypoints; } @@ -1591,35 +1591,35 @@ FrontLinesWaypoints() 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 ] ) ); } } - + return waypoint; } @@ -1631,39 +1631,39 @@ getABotName() if ( !isdefined( level.bot_names ) ) { level.bot_names = []; - + if ( getdvar( "temp_dvar_bot_name_cursor" ) == "" ) { setdvar( "temp_dvar_bot_name_cursor", 0 ); } - + filename = "botnames.txt"; - + if ( BotBuiltinFileExists( filename ) ) { f = BotBuiltinFileOpen( filename, "read" ); - + if ( f > 0 ) { for ( line = BotBuiltinReadLine( f ); isdefined( line ); line = BotBuiltinReadLine( f ) ) { level.bot_names[ level.bot_names.size ] = line; } - + BotBuiltinFileClose( f ); } } } - + if ( !level.bot_names.size ) { return undefined; } - + cur = getdvarint( "temp_dvar_bot_name_cursor" ); name = level.bot_names[ cur % level.bot_names.size ]; setdvar( "temp_dvar_bot_name_cursor", cur + 1 ); - + return name; } @@ -1674,46 +1674,46 @@ readWpsFromFile( mapname ) { waypoints = []; filename = "waypoints/" + mapname + "_wp.csv"; - + if ( !BotBuiltinFileExists( filename ) ) { return waypoints; } - + f = BotBuiltinFileOpen( filename, "read" ); - + if ( f < 1 ) { return waypoints; } - + BotBuiltinPrintConsole( "Attempting to read waypoints from " + filename ); - + line = BotBuiltinReadLine( f ); - + if ( isdefined( line ) ) { waypointCount = int( line ); - + for ( i = 1; i <= waypointCount; i++ ) { line = BotBuiltinReadLine( f ); - + if ( !isdefined( line ) ) { break; } - + tokens = strtok( line, "," ); - + waypoint = parseTokensIntoWaypoint( tokens ); - + waypoints[ i - 1 ] = waypoint; } } - + BotBuiltinFileClose( f ); - + return waypoints; } @@ -1723,19 +1723,19 @@ readWpsFromFile( mapname ) load_waypoints() { mapname = getdvar( "mapname" ); - + level.waypointcount = 0; level.waypointusage = []; level.waypointusage[ "allies" ] = []; level.waypointusage[ "axis" ] = []; - + if ( !isdefined( level.waypoints ) ) { level.waypoints = []; } - + wps = readWpsFromFile( mapname ); - + if ( wps.size ) { level.waypoints = wps; @@ -1749,47 +1749,47 @@ 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 ) { level.waypoints = FrontLinesWaypoints(); - + if ( level.waypoints.size ) { BotBuiltinPrintConsole( "Loaded " + level.waypoints.size + " waypoints from frontlines." ); } } - + 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; } } @@ -1800,19 +1800,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; } @@ -1822,21 +1822,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; } @@ -1847,21 +1847,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; } @@ -1871,18 +1871,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; @@ -1892,10 +1892,10 @@ getWaypointsOfType( type ) { continue; } - + answer[ answer.size ] = i; } - + return answer; } @@ -1908,7 +1908,7 @@ getWaypointForIndex( i ) { return undefined; } - + return level.waypoints[ i ]; } @@ -1942,7 +1942,7 @@ getGoodMapAmount() { return 9; } - + case "mp_vacant": case "mp_showdown": case "mp_citystreets": @@ -1955,7 +1955,7 @@ getGoodMapAmount() { return 8; } - + case "mp_killhouse": case "mp_shipment": if ( level.teambased ) @@ -1967,7 +1967,7 @@ getGoodMapAmount() return 4; } } - + return 2; } @@ -1980,68 +1980,68 @@ getMapName( map ) { case "mp_convoy": return "Ambush"; - + case "mp_backlot": return "Backlot"; - + case "mp_bloc": return "Bloc"; - + case "mp_bog": return "Bog"; - + case "mp_countdown": return "Countdown"; - + case "mp_crash": return "Crash"; - + case "mp_crash_snow": return "Winter Crash"; - + case "mp_crossfire": return "Crossfire"; - + case "mp_citystreets": return "District"; - + case "mp_farm": return "Downpour"; - + case "mp_overgrown": return "Overgrown"; - + case "mp_pipeline": return "Pipeline"; - + case "mp_shipment": return "Shipment"; - + case "mp_showdown": return "Showdown"; - + case "mp_strike": return "Strike"; - + case "mp_vacant": return "Vacant"; - + case "mp_cargoship": return "Wetwork"; - + case "mp_broadcast": return "Broadcast"; - + case "mp_creek": return "Creek"; - + case "mp_carentan": return "Chinatown"; - + case "mp_killhouse": return "Killhouse"; } - + return map; } @@ -2059,27 +2059,27 @@ doExtraCheck() 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++; @@ -2088,12 +2088,12 @@ getBotToKick() { axis++; } - else // choose bots that are not on a team first + else // choose bots that are not on a team first { return bot; } } - + // search for a bot on the other team if ( team == "custom" || team == "axis" ) { @@ -2103,7 +2103,7 @@ getBotToKick() { // get the team with the most bots team = "allies"; - + if ( axis > allies ) { team = "axis"; @@ -2113,63 +2113,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; } @@ -2180,19 +2180,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; } @@ -2202,9 +2202,9 @@ getBotArray() WaypointsToKDTree() { kdTree = KDTree(); - + kdTree _WaypointsToKDTree( level.waypoints, 0 ); - + return kdTree; } @@ -2217,44 +2217,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 ) @@ -2266,11 +2266,11 @@ _WaypointsToKDTree( waypoints, dem ) left[ left.size ] = sorted[ i ]; } } - + self KDTreeInsert( sorted[ median ] ); - + _WaypointsToKDTree( left, ( dem + 1 ) % 3 ); - + _WaypointsToKDTree( right, ( dem + 1 ) % 3 ); } @@ -2282,7 +2282,7 @@ List() list = spawnstruct(); list.count = 0; list.data = []; - + return list; } @@ -2292,7 +2292,7 @@ List() ListAdd( thing ) { self.data[ self.count ] = thing; - + self.count++; } @@ -2305,7 +2305,7 @@ ListAddFirst( thing ) { self.data[ i + 1 ] = self.data[ i ]; } - + self.data[ 0 ] = thing; self.count++; } @@ -2324,7 +2324,7 @@ ListRemove( thing ) self.data[ i ] = self.data[ i + 1 ]; i++; } - + self.data[ i ] = undefined; self.count--; break; @@ -2340,7 +2340,7 @@ KDTree() kdTree = spawnstruct(); kdTree.root = undefined; kdTree.count = 0; - + return kdTree; } @@ -2369,12 +2369,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: @@ -2386,9 +2386,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 ] ) { @@ -2398,9 +2398,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 ] ) { @@ -2410,10 +2410,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; } @@ -2426,7 +2426,7 @@ KDTreeNearest( origin ) { return undefined; } - + return self _KDTreeNearest( self.root, origin, self.root.data, distancesquared( self.root.data.origin, origin ), 0 ); } @@ -2439,31 +2439,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; } @@ -2475,7 +2475,7 @@ Rectdistancesquared( origin ) dx = 0; dy = 0; dz = 0; - + if ( origin[ 0 ] < self.x0 ) { dx = origin[ 0 ] - self.x0; @@ -2484,7 +2484,7 @@ Rectdistancesquared( origin ) { dx = origin[ 0 ] - self.x1; } - + if ( origin[ 1 ] < self.y0 ) { dy = origin[ 1 ] - self.y0; @@ -2493,7 +2493,7 @@ Rectdistancesquared( origin ) { dy = origin[ 1 ] - self.y1; } - + if ( origin[ 2 ] < self.z0 ) { dz = origin[ 2 ] - self.z0; @@ -2502,7 +2502,7 @@ Rectdistancesquared( origin ) { dz = origin[ 2 ] - self.z1; } - + return dx * dx + dy * dy + dz * dz; } @@ -2562,7 +2562,7 @@ NewHeap( compare ) heap_node = spawnstruct(); heap_node.data = []; heap_node.compare = compare; - + return heap_node; } @@ -2573,19 +2573,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; } @@ -2598,17 +2598,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; @@ -2625,39 +2625,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; } @@ -2678,14 +2678,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; @@ -2699,25 +2699,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; } @@ -2728,20 +2728,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; } @@ -2755,59 +2755,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 ) { @@ -2816,12 +2816,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 ) ) @@ -2830,68 +2830,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 + 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 + "" ]; @@ -2904,19 +2904,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 ) { @@ -2924,11 +2924,11 @@ AStarSearch( start, goal, team, greedy_path ) openset[ child + "" ] = node; } } - + // done with children, push onto closed closed[ bestNode.index + "" ] = bestNode; } - + return []; } @@ -2944,7 +2944,7 @@ Log( x ) denom = 1.0; frac = xmlxpl; sum = frac; - + while ( sum != old_sum ) { old_sum = sum; @@ -2952,7 +2952,7 @@ Log( x ) frac *= xmlxpl_2; sum += frac / denom; } - + answer = 2.0 * sum; return answer; } @@ -2966,24 +2966,24 @@ array_combine( array1, array2 ) { return array2; } - + array3 = []; keys = getarraykeys( array1 ); - + for ( i = 0; i < keys.size; i++ ) { key = keys[ i ]; array3[ array3.size ] = array1[ key ]; } - + keys = getarraykeys( array2 ); - + for ( i = 0; i < keys.size; i++ ) { key = keys[ i ]; array3[ array3.size ] = array2[ key ]; } - + return array3; } @@ -2995,12 +2995,12 @@ array_average( array ) { assert( array.size > 0 ); total = 0; - + for ( i = 0; i < array.size; i++ ) { total += array[ i ]; } - + return ( total / array.size ); } @@ -3012,19 +3012,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 ); } @@ -3038,28 +3038,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 ); } @@ -3073,7 +3073,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++ ) { @@ -3081,20 +3081,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 ); } - + maps\mp\gametypes\_globallogic::leaderdialog( "bomb_planted" ); - + maps\mp\gametypes\_globallogic::giveplayerscore( "plant", player ); player thread [[ level.onxpevent ]]( "plant" ); } @@ -3107,14 +3107,14 @@ bombPlantedFix( destroyedObj, player ) { maps\mp\gametypes\_globallogic::pausetimer(); level.bombplanted = true; - + destroyedObj.visuals[ 0 ] thread maps\mp\gametypes\_globallogic::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" ); @@ -3131,19 +3131,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_scale( 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" ); /* @@ -3153,7 +3153,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; @@ -3173,24 +3173,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\_globallogic::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 ); @@ -3199,28 +3199,28 @@ 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 ); - + thread maps\mp\gametypes\sd::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" ] ); } diff --git a/maps/mp/bots/_menu.gsc b/maps/mp/bots/_menu.gsc index bb06c7a..2f2e232 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(); } } @@ -58,20 +58,20 @@ watchPlayers() 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 watchDisconnect(); - + self thread doGreetings(); } @@ -84,7 +84,7 @@ kill_menu() watchDisconnect() { self waittill_either( "disconnect", "bots_kill_menu" ); - + if ( self.menuopen ) { if ( isdefined( self.menutexty ) ) @@ -97,7 +97,7 @@ watchDisconnect() } } } - + if ( isdefined( self.menutext ) ) { for ( i = 0; i < self.menutext.size; i++ ) @@ -108,20 +108,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(); @@ -143,14 +143,14 @@ watchPlayerOpenMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + for ( ;; ) { while ( !self fragbuttonpressed() || !self secondaryoffhandbuttonpressed() ) { wait 0.05; } - + if ( !self.menuopen ) { self playlocalsound( "mouse_click" ); @@ -159,7 +159,7 @@ watchPlayerOpenMenu() else { self playlocalsound( "mouse_click" ); - + if ( self.submenu != "Main" ) { self ExitSub(); @@ -167,7 +167,7 @@ watchPlayerOpenMenu() else { self ExitMenu(); - + if ( level.inprematchperiod || level.gameended ) { self freezecontrols( true ); @@ -178,7 +178,7 @@ watchPlayerOpenMenu() } } } - + while ( self fragbuttonpressed() && self secondaryoffhandbuttonpressed() ) { wait 0.05; @@ -190,18 +190,18 @@ MenuSelect() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + for ( ;; ) { while ( !self meleebuttonpressed() ) { wait 0.05; } - + 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" ] ] ); @@ -211,7 +211,7 @@ MenuSelect() self thread [[ self.option[ "Function" ][ self.submenu ][ self.curs[ self.submenu ][ "Y" ] ] ]]( self.option[ "Arg1" ][ self.submenu ][ self.curs[ self.submenu ][ "Y" ] ], self.option[ "Arg2" ][ self.submenu ][ self.curs[ self.submenu ][ "Y" ] ] ); } } - + while ( self meleebuttonpressed() ) { wait 0.05; @@ -223,42 +223,42 @@ LeftMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + for ( ;; ) { while ( !self attackbuttonpressed() ) { wait 0.05; } - + if ( self.menuopen ) { self playlocalsound( "mouse_over" ); - + if ( self.submenu == "Main" ) { self.curs[ "Main" ][ "X" ]--; - + if ( self.curs[ "Main" ][ "X" ] < 0 ) { self.curs[ "Main" ][ "X" ] = self.option[ "Name" ][ self.submenu ].size - 1; } - + self CursMove( "X" ); } else { 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" ); } } - + while ( self attackbuttonpressed() ) { wait 0.05; @@ -270,42 +270,42 @@ RightMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + for ( ;; ) { while ( !self adsbuttonpressed() ) { wait 0.05; } - + if ( self.menuopen ) { self playlocalsound( "mouse_over" ); - + if ( self.submenu == "Main" ) { self.curs[ "Main" ][ "X" ]++; - + if ( self.curs[ "Main" ][ "X" ] > self.option[ "Name" ][ self.submenu ].size - 1 ) { self.curs[ "Main" ][ "X" ] = 0; } - + self CursMove( "X" ); } else { 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" ); } } - + while ( self adsbuttonpressed() ) { wait 0.05; @@ -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 ) && !level.inprematchperiod && !level.gameended ) @@ -493,11 +493,11 @@ ShowOptionOn( variable ) { self freezecontrols( true ); } - + self setclientdvar( "r_blur", "5" ); self setclientdvar( "sc_blur", "4" ); 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_obj" ); - + if ( _tempDvar ) { _temp = "true"; @@ -950,11 +950,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 6, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_camp" ); - + if ( _tempDvar ) { _temp = "true"; @@ -963,11 +963,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 7, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_jumpdrop" ); - + if ( _tempDvar ) { _temp = "true"; @@ -976,11 +976,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 8, "Bots can jump and dropshot: " + _temp, ::bot_func, "jump", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_target_other" ); - + if ( _tempDvar ) { _temp = "true"; @@ -989,11 +989,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 9, "Bots can target other script objects: " + _temp, ::bot_func, "targetother", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_killstreak" ); - + if ( _tempDvar ) { _temp = "true"; @@ -1002,11 +1002,11 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 10, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar ); - + _tempDvar = getdvarint( "bots_play_ads" ); - + if ( _tempDvar ) { _temp = "true"; @@ -1015,7 +1015,7 @@ addOptions() { _temp = "false"; } - + self AddMenu( "set1", 11, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar ); } @@ -1027,57 +1027,57 @@ 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 "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 ); @@ -1096,45 +1096,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 ) { @@ -1142,90 +1142,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." ); @@ -1239,7 +1239,7 @@ man_bots( a, b ) { case "add": setdvar( "bots_manage_add", b ); - + if ( b == 1 ) { self iprintln( "Adding " + b + " bot." ); @@ -1248,29 +1248,29 @@ man_bots( a, b ) { self iprintln( "Adding " + b + " bots." ); } - + break; - + case "kick": for ( i = 0; i < b; i++ ) { tempBot = getBotToKick(); - + if ( isdefined( tempBot ) ) { kick( tempBot getentitynumber() ); } - + wait 0.25; } - + break; - + case "autokick": setdvar( "bots_manage_fill_kick", !b ); self iprintln( "Kicking bots when bots_fill is exceeded: " + !b ); break; - + case "fillmode": switch ( b ) { @@ -1278,40 +1278,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 2847678..3463035 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,66 +38,66 @@ init() setdvar( "bots_manage_add", 0 ); setdvar( "bots_manage_fill_kick", 1 ); setdvar( "bots_manage_fill_spec", 1 ); - + if ( getdvar( "bots_main_debug_distance" ) == "" ) { setdvar( "bots_main_debug_distance", 512.0 ); } - + if ( getdvar( "bots_main_debug_cone" ) == "" ) { setdvar( "bots_main_debug_cone", 0.65 ); } - + if ( getdvar( "bots_main_debug_minDist" ) == "" ) { setdvar( "bots_main_debug_minDist", 32.0 ); } - + if ( getdvar( "bots_main_debug_drawThrough" ) == "" ) { setdvar( "bots_main_debug_drawThrough", false ); } - + if ( getdvar( "bots_main_debug_commandWait" ) == "" ) { setdvar( "bots_main_debug_commandWait", 0.5 ); } - + if ( getdvar( "bots_main_debug_framerate" ) == "" ) { setdvar( "bots_main_debug_framerate", 58 ); } - + if ( getdvar( "bots_main_debug_lineDuration" ) == "" ) { setdvar( "bots_main_debug_lineDuration", 3 ); } - + if ( getdvar( "bots_main_debug_printDuration" ) == "" ) { setdvar( "bots_main_debug_printDuration", 3 ); } - + if ( getdvar( "bots_main_debug_debugRate" ) == "" ) { setdvar( "bots_main_debug_debugRate", 0.5 ); } - + setdvar( "player_sustainAmmo", 1 ); - + level.waypoints = []; level.waypointcount = 0; - + level waittill( "connected", player ); - + player thread onPlayerSpawned(); } onPlayerSpawned() { self endon( "disconnect" ); - + for ( ;; ) { self waittill( "spawned_player" ); @@ -109,12 +109,12 @@ beginDebug() { self endon( "disconnect" ); self endon( "death" ); - + level.wptolink = -1; level.autolink = false; self.closest = -1; self.command = undefined; - + self clearperks(); self takeallweapons(); self.specialty = []; @@ -122,14 +122,14 @@ beginDebug() self setactionslot( 3, "altMode" ); self giveweapon( "frag_grenade_mp" ); self freezecontrols( false ); - + self thread debug(); self thread addWaypoints(); self thread linkWaypoints(); self thread deleteWaypoints(); self thread watchSaveWaypointsCommand(); self thread sayExtras(); - + self thread textScroll( "^1SecondaryOffhand - ^2Add Waypoint; ^3MeleeButton - ^4Link Waypoint; ^5FragButton - ^6delete Waypoint; ^7UseButton + AttackButton - ^8Save" ); } @@ -145,56 +145,56 @@ debug() { self endon( "disconnect" ); self endon( "death" ); - + self setclientdvar( "com_maxfps", getdvarint( "bots_main_debug_framerate" ) ); - + for ( ;; ) { wait getdvarfloat( "bots_main_debug_debugRate" ); - + if ( isdefined( self.command ) ) { continue; } - + closest = -1; myEye = self gettagorigin( "j_head" ); 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 ), 1, 1, getdvarint( "bots_main_debug_lineDuration" ) ); } - + if ( getConeDot( wpOrg, myEye, myAngles ) > getdvarfloat( "bots_main_debug_cone" ) ) { print3d( wpOrg, i, ( 1, 0, 0 ), 2, 1, 6 ); } - + if ( isdefined( level.waypoints[ i ].angles ) && level.waypoints[ i ].type != "stand" ) { line( wpOrg, wpOrg + anglestoforward( level.waypoints[ i ].angles ) * 64, ( 1, 1, 1 ), 1, 1, getdvarint( "bots_main_debug_lineDuration" ) ); } } } - + self.closest = closest; - + if ( closest != -1 ) { stringChildren = ""; - + for ( i = 0; i < level.waypoints[ closest ].children.size; i++ ) { if ( i != 0 ) @@ -206,9 +206,9 @@ debug() stringChildren = stringChildren + level.waypoints[ closest ].children[ i ]; } } - + print3d( level.waypoints[ closest ].origin + ( 0, 0, 35 ), stringChildren, ( 0, 1, 0 ), 2, 1, getdvarint( "bots_main_debug_printDuration" ) ); - + print3d( level.waypoints[ closest ].origin + ( 0, 0, 15 ), level.waypoints[ closest ].type, ( 0, 1, 0 ), 2, 1, getdvarint( "bots_main_debug_printDuration" ) ); } } @@ -218,28 +218,28 @@ addWaypoints() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { while ( !self secondaryoffhandbuttonpressed() || isdefined( self.command ) ) { wait 0.05; } - + pos = self getorigin(); self.command = true; - + self iprintln( "Adding a waypoint..." ); self iprintln( "ADS - climb; Attack + Use - tube" ); self iprintln( "Attack - grenade; Use - claymore" ); self iprintln( "Else(wait) - your stance" ); - + wait getdvarfloat( "bots_main_debug_commandWait" ); - + self addWaypoint( pos ); - + self.command = undefined; - + while ( self secondaryoffhandbuttonpressed() ) { wait 0.05; @@ -251,20 +251,20 @@ linkWaypoints() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { while ( !self meleebuttonpressed() || isdefined( self.command ) ) { wait 0.05; } - + self.command = true; - + self iprintln( "ADS - unlink; Else(wait) - Link" ); - + wait getdvarfloat( "bots_main_debug_commandWait" ); - + if ( !self adsbuttonpressed() ) { self LinkWaypoint( self.closest ); @@ -273,9 +273,9 @@ linkWaypoints() { self UnLinkWaypoint( self.closest ); } - + self.command = undefined; - + while ( self meleebuttonpressed() ) { wait 0.05; @@ -287,21 +287,21 @@ deleteWaypoints() { self endon( "disconnect" ); self endon( "death" ); - + for ( ;; ) { while ( !self fragbuttonpressed() || isdefined( self.command ) ) { wait 0.05; } - + self.command = true; - + self iprintln( "Attack - deleteAll; ADS - Load" ); self iprintln( "Else(wait) - delete" ); - + wait getdvarfloat( "bots_main_debug_commandWait" ); - + if ( self attackbuttonpressed() ) { self deleteAllWaypoints(); @@ -314,9 +314,9 @@ deleteWaypoints() { self deleteWaypoint( self.closest ); } - + self.command = undefined; - + while ( self fragbuttonpressed() ) { wait 0.05; @@ -328,81 +328,81 @@ watchSaveWaypointsCommand() { self endon( "death" ); self endon( "disconnect" ); - + for ( ;; ) { while ( !self usebuttonpressed() || !self attackbuttonpressed() || isdefined( self.command ) ) { wait 0.05; } - + self.command = true; - + self iprintln( "ADS - Autolink; Else(wait) - Save" ); - + wait getdvarfloat( "bots_main_debug_commandWait" ); - + if ( !self adsbuttonpressed() ) { 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/*" ); } } - + logprint( "*/return waypoints;\n}\n\n\n\n" ); - + filename = "waypoints/" + getdvar( "mapname" ) + "_wp.csv"; - + println( "********* Start Bot Warfare WPDump *********" ); println( level.waypointcount ); - + f = BotBuiltinFileOpen( filename, "write" ); - + if ( f > 0 ) { BotBuiltinWriteLine( f, level.waypointcount ); } - + 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 ] + ","; @@ -411,24 +411,24 @@ watchSaveWaypointsCommand() { str += ","; } - + str += ","; - + println( str ); - + if ( f > 0 ) { BotBuiltinWriteLine( f, str ); } } - + if ( f > 0 ) { BotBuiltinFileClose( f ); } - + println( "\n\n\n\n\n\n" ); - + self iprintln( "Saved!!! to " + filename ); } else @@ -446,9 +446,9 @@ watchSaveWaypointsCommand() level.wptolink = self.closest; } } - + self.command = undefined; - + while ( self usebuttonpressed() && self attackbuttonpressed() ) { wait 0.05; @@ -461,9 +461,9 @@ LoadWaypoints() self deleteAllWaypoints(); self iprintlnbold( "Loading WPS..." ); load_waypoints(); - + wait 1; - + self checkForWarnings(); } @@ -473,12 +473,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 ] ) ) @@ -486,7 +486,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 ); @@ -502,7 +502,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" ); @@ -514,13 +514,13 @@ checkForWarnings() } } } - + if ( !isdefined( level.waypoints[ i ].type ) ) { self iprintln( "WARNING: waypoint " + i + " type is undefined" ); continue; } - + 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" ); @@ -532,7 +532,7 @@ deleteAllWaypoints() { level.waypoints = []; level.waypointcount = 0; - + self iprintln( "DelAllWps" ); } @@ -543,16 +543,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-- ) @@ -563,7 +563,7 @@ deleteWaypoint( nwp ) } } } - + for ( entry = 0; entry < level.waypointcount; entry++ ) { if ( entry == nwp ) @@ -573,23 +573,23 @@ deleteWaypoint( nwp ) level.waypoints[ entry ] = level.waypoints[ entry + 1 ]; entry++; } - + level.waypoints[ entry ] = undefined; break; } } - + level.waypointcount--; - + self iprintln( "DelWp " + nwp ); } addWaypoint( pos ) { level.waypoints[ level.waypointcount ] = spawnstruct(); - + level.waypoints[ level.waypointcount ].origin = pos; - + if ( self adsbuttonpressed() ) { level.waypoints[ level.waypointcount ].type = "climb"; @@ -610,20 +610,20 @@ addWaypoint( pos ) { level.waypoints[ level.waypointcount ].type = self getstance(); } - + level.waypoints[ level.waypointcount ].angles = self getplayerangles(); - + level.waypoints[ level.waypointcount ].children = []; - + 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 ); } @@ -641,17 +641,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; } @@ -664,16 +664,16 @@ 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-- ) { if ( level.waypoints[ level.wptolink ].children[ i ] == nwp ) @@ -682,7 +682,7 @@ LinkWaypoint( nwp ) break; } } - + if ( weGood ) { for ( i = level.waypoints[ nwp ].children.size - 1; i >= 0; i-- ) @@ -694,17 +694,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; } @@ -721,15 +721,15 @@ textScroll( string ) self endon( "death" ); self endon( "disconnect" ); // thanks ActionScript - + back = createbar( ( 0, 0, 0 ), 1000, 30 ); back setpoint( "CENTER", undefined, 0, 220 ); self thread destroyOnDeath( back ); - + text = createfontstring( "default", 1.5 ); text settext( string ); self thread destroyOnDeath( text ); - + for ( ;; ) { text setpoint( "CENTER", undefined, 1200, 220 ); diff --git a/maps/mp/gametypes/_callbacksetup.gsx b/maps/mp/gametypes/_callbacksetup.gsx index f3d0ae3..55d9da0 100644 --- a/maps/mp/gametypes/_callbacksetup.gsx +++ b/maps/mp/gametypes/_callbacksetup.gsx @@ -6,17 +6,17 @@ // Code Callback functions /*================ -Called by code after the level's main script function has run. -================*/ + Called by code after the level's main script function has run. + ================*/ CodeCallback_StartGameType() { // If the gametype has not beed started, run the startup - if(!isDefined(level.gametypestarted) || !level.gametypestarted) + if ( !isDefined( level.gametypestarted ) || !level.gametypestarted ) { [[level.callbackStartGameType]](); - + level.gametypestarted = true; // so we know that the gametype has been started up - + level thread scripts\bots_adapter_cod4x::init(); level thread scripts\bots_chat::init(); level thread scripts\bots_menu::init(); @@ -26,89 +26,89 @@ CodeCallback_StartGameType() } /*================ -Called when a player begins connecting to the server. -Called again for every map change or tournement restart. + Called when a player begins connecting to the server. + Called again for every map change or tournement restart. -Return undefined if the client should be allowed, otherwise return -a string with the reason for denial. + Return undefined if the client should be allowed, otherwise return + a string with the reason for denial. -Otherwise, the client will be sent the current gamestate -and will eventually get to ClientBegin. + Otherwise, the client will be sent the current gamestate + and will eventually get to ClientBegin. -firstTime will be qtrue the very first time a client connects -to the server machine, but qfalse on map changes and tournement -restarts. -================*/ + firstTime will be qtrue the very first time a client connects + to the server machine, but qfalse on map changes and tournement + restarts. + ================*/ CodeCallback_PlayerConnect() { - self endon("disconnect"); + self endon( "disconnect" ); [[level.callbackPlayerConnect]](); } /*================ -Called when a player drops from the server. -Will not be called between levels. -self is the player that is disconnecting. -================*/ + Called when a player drops from the server. + Will not be called between levels. + self is the player that is disconnecting. + ================*/ CodeCallback_PlayerDisconnect() { - self notify("disconnect"); + self notify( "disconnect" ); [[level.callbackPlayerDisconnect]](); } /*================ -Called when a player has taken damage. -self is the player that took damage. -================*/ -CodeCallback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) + Called when a player has taken damage. + self is the player that took damage. + ================*/ +CodeCallback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ) { - self endon("disconnect"); - [[level.callbackPlayerDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); + self endon( "disconnect" ); + [[level.callbackPlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ); } /*================ -Called when a player has been killed. -self is the player that was killed. -================*/ -CodeCallback_PlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) + Called when a player has been killed. + self is the player that was killed. + ================*/ +CodeCallback_PlayerKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ) { - self endon("disconnect"); - [[level.callbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); + self endon( "disconnect" ); + [[level.callbackPlayerKilled]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); } /*================ -Called when a player has been killed, but has last stand perk. -self is the player that was killed. -================*/ -CodeCallback_PlayerLastStand(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ) + Called when a player has been killed, but has last stand perk. + self is the player that was killed. + ================*/ +CodeCallback_PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ) { - self endon("disconnect"); - [[level.callbackPlayerLastStand]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); + self endon( "disconnect" ); + [[level.callbackPlayerLastStand]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); } //============================================================================= /*================ -Setup any misc callbacks stuff like defines and default callbacks -================*/ + Setup any misc callbacks stuff like defines and default callbacks + ================*/ SetupCallbacks() { SetDefaultCallbacks(); - + // Set defined for damage flags used in the playerDamage callback - level.iDFLAGS_RADIUS = 1; - level.iDFLAGS_NO_ARMOR = 2; - level.iDFLAGS_NO_KNOCKBACK = 4; - level.iDFLAGS_PENETRATION = 8; + level.iDFLAGS_RADIUS = 1; + level.iDFLAGS_NO_ARMOR = 2; + level.iDFLAGS_NO_KNOCKBACK = 4; + level.iDFLAGS_PENETRATION = 8; level.iDFLAGS_NO_TEAM_PROTECTION = 16; - level.iDFLAGS_NO_PROTECTION = 32; - level.iDFLAGS_PASSTHRU = 64; + level.iDFLAGS_NO_PROTECTION = 32; + level.iDFLAGS_PASSTHRU = 64; } /*================ -Called from the gametype script to store off the default callback functions. -This allows the callbacks to be overridden by level script, but not lost. -================*/ + Called from the gametype script to store off the default callback functions. + This allows the callbacks to be overridden by level script, but not lost. + ================*/ SetDefaultCallbacks() { level.callbackStartGameType = maps\mp\gametypes\_globallogic::Callback_StartGameType; @@ -120,26 +120,26 @@ SetDefaultCallbacks() } /*================ -Called when a gametype is not supported. -================*/ + Called when a gametype is not supported. + ================*/ AbortLevel() { - println("Aborting level - gametype is not supported"); - + println( "Aborting level - gametype is not supported" ); + level.callbackStartGameType = ::callbackVoid; level.callbackPlayerConnect = ::callbackVoid; level.callbackPlayerDisconnect = ::callbackVoid; level.callbackPlayerDamage = ::callbackVoid; level.callbackPlayerKilled = ::callbackVoid; level.callbackPlayerLastStand = ::callbackVoid; - - setdvar("g_gametype", "dm"); - - exitLevel(false); + + setdvar( "g_gametype", "dm" ); + + exitLevel( false ); } /*================ -================*/ + ================*/ callbackVoid() { }