diff --git a/main_shared/maps/mp/bots/_bot.gsc b/main_shared/maps/mp/bots/_bot.gsc index 4088c7e..b8cd9ee 100644 --- a/main_shared/maps/mp/bots/_bot.gsc +++ b/main_shared/maps/mp/bots/_bot.gsc @@ -10,94 +10,120 @@ init() { level.bw_VERSION = "2.0.1"; - if(getDvar("bots_main") == "") - setDvar("bots_main", true); + if ( getDvar( "bots_main" ) == "" ) + setDvar( "bots_main", true ); - if (!getDvarInt("bots_main")) + if ( !getDvarInt( "bots_main" ) ) return; 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 - if(getDvar("bots_main_firstIsHost") == "") - 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 - - if(getDvar("bots_manage_add") == "") - setDvar("bots_manage_add", 0);//amount of bots to add to the game - if(getDvar("bots_manage_fill") == "") - setDvar("bots_manage_fill", 0);//amount of bots to maintain - if(getDvar("bots_manage_fill_spec") == "") - setDvar("bots_manage_fill_spec", true);//to count for fill if player is on spec team - if(getDvar("bots_manage_fill_mode") == "") - setDvar("bots_manage_fill_mode", 0);//fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 - if(getDvar("bots_manage_fill_kick") == "") - setDvar("bots_manage_fill_kick", false);//kick bots if too many - - if(getDvar("bots_team") == "") - setDvar("bots_team", "autoassign");//which team for bots to join - if(getDvar("bots_team_amount") == "") - setDvar("bots_team_amount", 0);//amount of bots on axis team - if(getDvar("bots_team_force") == "") - setDvar("bots_team_force", false);//force bots on team - if(getDvar("bots_team_mode") == "") - setDvar("bots_team_mode", 0);//counts just bots when 1 - - if(getDvar("bots_skill") == "") - setDvar("bots_skill", 0);//0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random - if(getDvar("bots_skill_axis_hard") == "") - setDvar("bots_skill_axis_hard", 0);//amount of hard bots on axis team - if(getDvar("bots_skill_axis_med") == "") - setDvar("bots_skill_axis_med", 0); - if(getDvar("bots_skill_allies_hard") == "") - setDvar("bots_skill_allies_hard", 0); - if(getDvar("bots_skill_allies_med") == "") - setDvar("bots_skill_allies_med", 0); - - if(getDvar("bots_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_main_GUIDs" ) == "" ) + setDvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated - 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_main_firstIsHost" ) == "" ) + setDvar( "bots_main_firstIsHost", true ); //first player to connect is a host - if(!isDefined(game["botWarfare"])) + if ( getDvar( "bots_main_waitForHostTime" ) == "" ) + setDvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player + + if ( getDvar( "bots_manage_add" ) == "" ) + setDvar( "bots_manage_add", 0 ); //amount of bots to add to the game + + if ( getDvar( "bots_manage_fill" ) == "" ) + setDvar( "bots_manage_fill", 0 ); //amount of bots to maintain + + if ( getDvar( "bots_manage_fill_spec" ) == "" ) + setDvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team + + if ( getDvar( "bots_manage_fill_mode" ) == "" ) + setDvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 + + if ( getDvar( "bots_manage_fill_kick" ) == "" ) + setDvar( "bots_manage_fill_kick", false ); //kick bots if too many + + if ( getDvar( "bots_team" ) == "" ) + setDvar( "bots_team", "autoassign" ); //which team for bots to join + + if ( getDvar( "bots_team_amount" ) == "" ) + setDvar( "bots_team_amount", 0 ); //amount of bots on axis team + + if ( getDvar( "bots_team_force" ) == "" ) + setDvar( "bots_team_force", false ); //force bots on team + + if ( getDvar( "bots_team_mode" ) == "" ) + setDvar( "bots_team_mode", 0 ); //counts just bots when 1 + + if ( getDvar( "bots_skill" ) == "" ) + setDvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random + + if ( getDvar( "bots_skill_axis_hard" ) == "" ) + setDvar( "bots_skill_axis_hard", 0 ); //amount of hard bots on axis team + + if ( getDvar( "bots_skill_axis_med" ) == "" ) + setDvar( "bots_skill_axis_med", 0 ); + + if ( getDvar( "bots_skill_allies_hard" ) == "" ) + setDvar( "bots_skill_allies_hard", 0 ); + + if ( getDvar( "bots_skill_allies_med" ) == "" ) + setDvar( "bots_skill_allies_med", 0 ); + + if ( getDvar( "bots_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 ( !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++) - level.default_perk["CLASS_CUSTOM"+h][i] = "specialty_null"; - + + for ( h = 1; h < 6; h++ ) + for ( i = 0; i < 3; i++ ) + level.default_perk["CLASS_CUSTOM" + h][i] = "specialty_null"; + level.bots_minSprintDistance = 315; level.bots_minSprintDistance *= level.bots_minSprintDistance; level.bots_minGrenadeDistance = 256; @@ -113,11 +139,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; @@ -131,12 +157,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(); @@ -151,39 +177,39 @@ handleBots() level thread teamBots(); level thread diffBots(); level addBots(); - - while(!level.intermission) + + while ( !level.intermission ) wait 0.05; - - setDvar("bots_manage_add", getBotArray().size); + + setDvar( "bots_manage_add", getBotArray().size ); } /* The hook callback for when any player becomes damaged. */ -onPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) +onPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ) { - if(self is_bot()) + if ( self is_bot() ) { - 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 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); + + self [[level.prevCallbackPlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ); } /* The hook callback when any player gets killed. */ -onPlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) +onPlayerKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ) { - if(self is_bot()) + if ( self is_bot() ) { - 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 maps\mp\bots\_bot_internal::onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); + self maps\mp\bots\_bot_script::onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); } - - self [[level.prevCallbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); + + self [[level.prevCallbackPlayerKilled]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); } /* @@ -194,7 +220,7 @@ hook_callbacks() wait 0.05; level.prevCallbackPlayerDamage = level.callbackPlayerDamage; level.callbackPlayerDamage = ::onPlayerDamage; - + level.prevCallbackPlayerKilled = level.callbackPlayerKilled; level.callbackPlayerKilled = ::onPlayerKilled; } @@ -205,26 +231,26 @@ hook_callbacks() fixKoth() { level.radio = undefined; - - for(;;) + + for ( ;; ) { wait 0.05; - - if(!isDefined(level.radioObject)) + + if ( !isDefined( level.radioObject ) ) { continue; } - - for(i = level.radios.size - 1; i >= 0; i--) + + for ( i = level.radios.size - 1; i >= 0; i-- ) { - if(level.radioObject != level.radios[i].gameobject) + if ( level.radioObject != level.radios[i].gameobject ) continue; - + level.radio = level.radios[i]; break; } - - while(isDefined(level.radioObject) && level.radio.gameobject == level.radioObject) + + while ( isDefined( level.radioObject ) && level.radio.gameobject == level.radioObject ) wait 0.05; } } @@ -234,22 +260,23 @@ fixKoth() */ fixGamemodes() { - for(i=0;i<19;i++) + for ( i = 0; i < 19; i++ ) { - if(isDefined(level.bombZones) && level.gametype == "sd") + if ( isDefined( level.bombZones ) && level.gametype == "sd" ) { - for(i = 0; i < level.bombZones.size; i++) + for ( i = 0; i < level.bombZones.size; i++ ) level.bombZones[i].onUse = ::onUsePlantObjectFix; + break; } - - if(isDefined(level.radios) && level.gametype == "koth") + + if ( isDefined( level.radios ) && level.gametype == "koth" ) { level thread fixKoth(); - + break; } - + wait 0.05; } } @@ -259,14 +286,14 @@ fixGamemodes() */ onPlayerConnect() { - for(;;) + for ( ;; ) { - level waittill("connected", player); - + level waittill( "connected", player ); + player thread onGrenadeFire(); player thread onWeaponFired(); player thread doPlayerModelFix(); - + player thread connected(); } } @@ -276,15 +303,15 @@ onPlayerConnect() */ fixPerksAndScriptKick() { - self endon("disconnect"); - - self waittill("spawned"); - + self endon( "disconnect" ); + + self waittill( "spawned" ); + self.pers["isBot"] = undefined; - - if(!level.gameEnded) + + if ( !level.gameEnded ) level waittill ( "game_ended" ); - + self.pers["isBot"] = true; } @@ -293,9 +320,9 @@ fixPerksAndScriptKick() */ onDisconnect() { - self waittill("disconnect"); - - level.bots = array_remove(level.bots, self); + self waittill( "disconnect" ); + + level.bots = array_remove( level.bots, self ); } /* @@ -303,35 +330,35 @@ onDisconnect() */ connected() { - self endon("disconnect"); + self endon( "disconnect" ); - if (!isDefined(self.pers["bot_host"])) + if ( !isDefined( self.pers["bot_host"] ) ) self thread doHostCheck(); - if(!self is_bot()) + if ( !self is_bot() ) return; - if (!isDefined(self.pers["isBot"])) + if ( !isDefined( self.pers["isBot"] ) ) { // fast restart... self.pers["isBot"] = true; } - - if (!isDefined(self.pers["isBotWarfare"])) + + 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); + level notify( "bot_connected", self ); } /* @@ -339,8 +366,8 @@ connected() */ added() { - self endon("disconnect"); - + self endon( "disconnect" ); + self thread maps\mp\bots\_bot_internal::added(); self thread maps\mp\bots\_bot_script::added(); } @@ -351,15 +378,15 @@ added() add_bot() { name = getABotName(); - + bot = undefined; - if (isDefined(name) && name.size >= 3) - bot = addtestclient(name); + if ( isDefined( name ) && name.size >= 3 ) + bot = addtestclient( name ); else bot = addtestclient(); - if (isdefined(bot)) + if ( isdefined( bot ) ) { bot.pers["isBot"] = true; bot.pers["isBotWarfare"] = true; @@ -372,38 +399,39 @@ add_bot() */ diffBots_loop() { - var_allies_hard = getDVarInt("bots_skill_allies_hard"); - var_allies_med = getDVarInt("bots_skill_allies_med"); - var_axis_hard = getDVarInt("bots_skill_axis_hard"); - var_axis_med = getDVarInt("bots_skill_axis_med"); - var_skill = getDvarInt("bots_skill"); - + var_allies_hard = getDVarInt( "bots_skill_allies_hard" ); + var_allies_med = getDVarInt( "bots_skill_allies_med" ); + 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) + + if ( var_skill == 8 ) { playercount = level.players.size; - for(i = 0; i < playercount; i++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(!isDefined(player.pers["team"])) + + if ( !isDefined( player.pers["team"] ) ) continue; - - if(!player is_bot()) + + if ( !player is_bot() ) continue; - - if(player.pers["team"] == "axis") + + if ( player.pers["team"] == "axis" ) { - if(axis_hard < var_axis_hard) + if ( axis_hard < var_axis_hard ) { axis_hard++; player.pers["bots"]["skill"]["base"] = 7; } - else if(axis_med < var_axis_med) + else if ( axis_med < var_axis_med ) { axis_med++; player.pers["bots"]["skill"]["base"] = 4; @@ -411,14 +439,14 @@ diffBots_loop() else player.pers["bots"]["skill"]["base"] = 1; } - else if(player.pers["team"] == "allies") + else if ( player.pers["team"] == "allies" ) { - if(allies_hard < var_allies_hard) + if ( allies_hard < var_allies_hard ) { allies_hard++; player.pers["bots"]["skill"]["base"] = 7; } - else if(allies_med < var_allies_med) + else if ( allies_med < var_allies_med ) { allies_med++; player.pers["bots"]["skill"]["base"] = 4; @@ -428,16 +456,17 @@ diffBots_loop() } } } - else if (var_skill != 0 && var_skill != 9) + else if ( var_skill != 0 && var_skill != 9 ) { playercount = level.players.size; - for(i = 0; i < playercount; i++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(!player is_bot()) + + if ( !player is_bot() ) continue; - + player.pers["bots"]["skill"]["base"] = var_skill; } } @@ -448,7 +477,7 @@ diffBots_loop() */ diffBots() { - for(;;) + for ( ;; ) { wait 1.5; @@ -461,83 +490,87 @@ diffBots() */ teamBots_loop() { - teamAmount = getDvarInt("bots_team_amount"); - toTeam = getDvar("bots_team"); - + 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++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(!isDefined(player.pers["team"])) + + if ( !isDefined( player.pers["team"] ) ) continue; - - if(player is_bot()) + + if ( player is_bot() ) { - if(player.pers["team"] == "allies") + if ( player.pers["team"] == "allies" ) alliesbots++; - else if(player.pers["team"] == "axis") + else if ( player.pers["team"] == "axis" ) axisbots++; } else { - if(player.pers["team"] == "allies") + if ( player.pers["team"] == "allies" ) alliesplayers++; - else if(player.pers["team"] == "axis") + else if ( player.pers["team"] == "axis" ) axisplayers++; } } - + allies = alliesbots; axis = axisbots; - - if(!getDvarInt("bots_team_mode")) + + if ( !getDvarInt( "bots_team_mode" ) ) { allies += alliesplayers; axis += axisplayers; } - - if(toTeam != "custom") + + if ( toTeam != "custom" ) { - if(getDvarInt("bots_team_force")) + if ( getDvarInt( "bots_team_force" ) ) { - if(toTeam == "autoassign") + if ( toTeam == "autoassign" ) { - if(abs(axis - allies) > 1) + if ( abs( axis - allies ) > 1 ) { toTeam = "axis"; - if(axis > allies) + + if ( axis > allies ) toTeam = "allies"; } } - - if(toTeam != "autoassign") + + if ( toTeam != "autoassign" ) { playercount = level.players.size; - for(i = 0; i < playercount; i++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(!isDefined(player.pers["team"])) + + if ( !isDefined( player.pers["team"] ) ) continue; - - if(!player is_bot()) + + if ( !player is_bot() ) continue; - - if(player.pers["team"] == toTeam) + + if ( player.pers["team"] == toTeam ) continue; - - if (toTeam == "allies") + + if ( toTeam == "allies" ) player thread [[level.allies]](); - else if (toTeam == "axis") + else if ( toTeam == "axis" ) player thread [[level.axis]](); else player thread [[level.spectator]](); + break; } } @@ -546,19 +579,20 @@ teamBots_loop() else { playercount = level.players.size; - for(i = 0; i < playercount; i++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(!isDefined(player.pers["team"])) + + if ( !isDefined( player.pers["team"] ) ) continue; - - if(!player is_bot()) + + if ( !player is_bot() ) continue; - - if(player.pers["team"] == "axis") + + if ( player.pers["team"] == "axis" ) { - if(axis > teamAmount) + if ( axis > teamAmount ) { player thread [[level.allies]](); break; @@ -566,12 +600,12 @@ teamBots_loop() } else { - if(axis < teamAmount) + if ( axis < teamAmount ) { player thread [[level.axis]](); break; } - else if(player.pers["team"] != "allies") + else if ( player.pers["team"] != "allies" ) { player thread [[level.allies]](); break; @@ -586,7 +620,7 @@ teamBots_loop() */ teamBots() { - for(;;) + for ( ;; ) { wait 1.5; @@ -599,100 +633,104 @@ teamBots() */ addBots_loop() { - botsToAdd = GetDvarInt("bots_manage_add"); - - if(botsToAdd > 0) + botsToAdd = GetDvarInt( "bots_manage_add" ); + + if ( botsToAdd > 0 ) { - SetDvar("bots_manage_add", 0); - - if(botsToAdd > 64) + SetDvar( "bots_manage_add", 0 ); + + if ( botsToAdd > 64 ) botsToAdd = 64; - - for(; botsToAdd > 0; botsToAdd--) + + 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"); - + + 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++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(player is_bot()) + + if ( player is_bot() ) bots++; - else if(!isDefined(player.pers["team"]) || (player.pers["team"] != "axis" && player.pers["team"] != "allies")) + else if ( !isDefined( player.pers["team"] ) || ( player.pers["team"] != "axis" && player.pers["team"] != "allies" ) ) spec++; else players++; } - if (!randomInt(999)) + if ( !randomInt( 999 ) ) { - setDvar("testclients_doreload", true); + setDvar( "testclients_doreload", true ); wait 0.1; - setDvar("testclients_doreload", false); + setDvar( "testclients_doreload", false ); doExtraCheck(); } - - if(fillMode == 4) + + if ( fillMode == 4 ) { axisplayers = 0; alliesplayers = 0; - + playercount = level.players.size; - for(i = 0; i < playercount; i++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(player is_bot()) + + if ( player is_bot() ) continue; - - if(!isDefined(player.pers["team"])) + + if ( !isDefined( player.pers["team"] ) ) continue; - - if(player.pers["team"] == "axis") + + if ( player.pers["team"] == "axis" ) axisplayers++; - else if(player.pers["team"] == "allies") + else if ( player.pers["team"] == "allies" ) alliesplayers++; } - - result = fillAmount - abs(axisplayers - alliesplayers) + bots; - - if (players == 0) + + result = fillAmount - abs( axisplayers - alliesplayers ) + bots; + + if ( players == 0 ) { - if(bots < fillAmount) - result = fillAmount-1; - else if (bots > fillAmount) - result = fillAmount+1; + if ( bots < fillAmount ) + result = fillAmount - 1; + else if ( bots > fillAmount ) + result = fillAmount + 1; else result = fillAmount; } - + bots = result; } - + amount = bots; - if(fillMode == 0 || fillMode == 2) + + if ( fillMode == 0 || fillMode == 2 ) amount += players; - if(getDVarInt("bots_manage_fill_spec")) + + if ( getDVarInt( "bots_manage_fill_spec" ) ) amount += spec; - - if(amount < fillAmount) - setDvar("bots_manage_add", 1); - else if(amount > fillAmount && getDvarInt("bots_manage_fill_kick")) + + if ( amount < fillAmount ) + setDvar( "bots_manage_add", 1 ); + else if ( amount > fillAmount && getDvarInt( "bots_manage_fill_kick" ) ) { RemoveTestClient(); //cod4x } @@ -703,14 +741,14 @@ addBots_loop() */ addBots() { - level endon("game_ended"); + level endon( "game_ended" ); bot_wait_for_host(); - - for(;;) + + for ( ;; ) { wait 1.5; - + addBots_loop(); } } @@ -720,16 +758,18 @@ addBots() */ onGrenadeFire() { - self endon("disconnect"); - for(;;) + self endon( "disconnect" ); + + for ( ;; ) { self waittill ( "grenade_fire", grenade, weaponName ); - if (!isDefined(grenade)) + if ( !isDefined( grenade ) ) continue; grenade.name = weaponName; - if(weaponName == "smoke_grenade_mp") + + if ( weaponName == "smoke_grenade_mp" ) grenade thread AddToSmokeList(); } } @@ -743,10 +783,10 @@ AddToSmokeList() grenade.origin = self getOrigin(); grenade.state = "moving"; grenade.grenade = self; - + grenade thread thinkSmoke(); - - level.bots_smokeList ListAdd(grenade); + + level.bots_smokeList ListAdd( grenade ); } /* @@ -754,16 +794,17 @@ AddToSmokeList() */ thinkSmoke() { - while(isDefined(self.grenade)) + while ( isDefined( self.grenade ) ) { self.origin = self.grenade getOrigin(); self.state = "moving"; wait 0.05; } + self.state = "smoking"; wait 11.5; - - level.bots_smokeList ListRemove(self); + + level.bots_smokeList ListRemove( self ); } /* @@ -771,25 +812,26 @@ thinkSmoke() */ chopperWatch() { - for(;;) + for ( ;; ) { - while(!isDefined(level.chopper)) + while ( !isDefined( level.chopper ) ) wait 0.05; chopper = level.chopper; - if (level.teamBased && getDvarInt("doubleHeli")) + if ( level.teamBased && getDvarInt( "doubleHeli" ) ) { chopper = level.chopper["allies"]; - if (!isDefined(chopper)) + + if ( !isDefined( chopper ) ) chopper = level.chopper["axis"]; } level.bot_chopper = true; chopper watchChopper(); level.bot_chopper = false; - - while(isDefined(level.chopper)) + + while ( isDefined( level.chopper ) ) wait 0.05; } } @@ -799,11 +841,11 @@ chopperWatch() */ watchChopper() { - self endon("death"); - self endon("leaving"); - self endon("crashing"); - - level waittill("helicopter gone"); + self endon( "death" ); + self endon( "leaving" ); + self endon( "crashing" ); + + level waittill( "helicopter gone" ); } /* @@ -811,10 +853,10 @@ watchChopper() */ onUAVAxisUpdate() { - for(;;) + for ( ;; ) { level waittill( "radar_timer_kill_axis" ); - level thread doUAVUpdate("axis"); + level thread doUAVUpdate( "axis" ); } } @@ -823,46 +865,47 @@ onUAVAxisUpdate() */ onUAVAlliesUpdate() { - for(;;) + for ( ;; ) { level waittill( "radar_timer_kill_allies" ); - level thread doUAVUpdate("allies"); + level thread doUAVUpdate( "allies" ); } } /* Updates the player's radar so bots can know when they have a uav up, because iw3 script is old. */ -doUAVUpdate(team) +doUAVUpdate( team ) { - level endon("radar_timer_kill_" + team); - + level endon( "radar_timer_kill_" + team ); + playercount = level.players.size; - - for(i = 0; i < playercount; i++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(!isDefined(player.team)) + + if ( !isDefined( player.team ) ) continue; - - if(player.team == team) + + if ( player.team == team ) { player.bot_radar = true; } } - + wait level.radarViewTime; - + playercount = level.players.size; - for(i = 0; i < playercount; i++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(!isDefined(player.team)) + + if ( !isDefined( player.team ) ) continue; - - if(player.team == team) + + if ( player.team == team ) { player.bot_radar = false; } @@ -874,8 +917,8 @@ doUAVUpdate(team) */ doPlayerModelFix() { - self endon("disconnect"); - self waittill("spawned_player"); + self endon( "disconnect" ); + self waittill( "spawned_player" ); wait 0.05; self.bot_model_fix = true; } @@ -885,9 +928,10 @@ doPlayerModelFix() */ onWeaponFired() { - self endon("disconnect"); + self endon( "disconnect" ); self.bots_firing = false; - for(;;) + + for ( ;; ) { self waittill( "weapon_fired" ); self thread doFiringThread(); @@ -899,8 +943,8 @@ onWeaponFired() */ doFiringThread() { - self endon("disconnect"); - self endon("weapon_fired"); + self endon( "disconnect" ); + self endon( "weapon_fired" ); self.bots_firing = true; wait 1; self.bots_firing = false; diff --git a/main_shared/maps/mp/bots/_bot_http.gsc b/main_shared/maps/mp/bots/_bot_http.gsc index 1d9f1a6..2bb3c40 100644 --- a/main_shared/maps/mp/bots/_bot_http.gsc +++ b/main_shared/maps/mp/bots/_bot_http.gsc @@ -10,35 +10,35 @@ /* Will attempt to retreive waypoints from the internet */ -getRemoteWaypoints(mapname) +getRemoteWaypoints( mapname ) { url = "https://raw.githubusercontent.com/ineedbots/cod4x_waypoints/master/" + mapname + "_wp.csv"; filename = "waypoints/" + mapname + "_wp.csv"; - printToConsole("Attempting to get remote waypoints from " + url); - res = getLinesFromUrl(url, filename); + printToConsole( "Attempting to get remote waypoints from " + url ); + res = getLinesFromUrl( url, filename ); - if (!res.lines.size) + if ( !res.lines.size ) return; - waypointCount = int(res.lines[0]); + waypointCount = int( res.lines[0] ); waypoints = []; - printToConsole("Loading remote waypoints..."); + printToConsole( "Loading remote waypoints..." ); - for (i = 1; i <= waypointCount; i++) + for ( i = 1; i <= waypointCount; i++ ) { - tokens = tokenizeLine(res.lines[i], ","); - - waypoint = parseTokensIntoWaypoint(tokens); + tokens = tokenizeLine( res.lines[i], "," ); - waypoints[i-1] = waypoint; + waypoint = parseTokensIntoWaypoint( tokens ); + + waypoints[i - 1] = waypoint; } - if (waypoints.size) + if ( waypoints.size ) { level.waypoints = waypoints; - printToConsole("Loaded " + waypoints.size + " waypoints from remote."); + printToConsole( "Loaded " + waypoints.size + " waypoints from remote." ); } } @@ -49,20 +49,20 @@ doVersionCheck() { remoteVersion = getRemoteVersion(); - if (!isDefined(remoteVersion)) + if ( !isDefined( remoteVersion ) ) { - printToConsole("Error getting remote version of Bot Warfare."); + printToConsole( "Error getting remote version of Bot Warfare." ); return false; } - if (level.bw_VERSION != remoteVersion) + if ( level.bw_VERSION != remoteVersion ) { - printToConsole("There is a new version of Bot Warfare!"); - printToConsole("You are on version " + level.bw_VERSION + " but " + remoteVersion + " is available!"); + printToConsole( "There is a new version of Bot Warfare!" ); + printToConsole( "You are on version " + level.bw_VERSION + " but " + remoteVersion + " is available!" ); return false; } - printToConsole("You are on the latest version of Bot Warfare!"); + printToConsole( "You are on the latest version of Bot Warfare!" ); return true; } @@ -77,16 +77,16 @@ getRemoteVersion() data = undefined; #endif - if (!isDefined(data)) + if ( !isDefined( data ) ) return undefined; - return strtok(data, "\n")[0]; + return strtok( data, "\n" )[0]; } /* Returns an array of each line from the response of the http url request */ -getLinesFromUrl(url, filename) +getLinesFromUrl( url, filename ) { result = spawnStruct(); result.lines = []; @@ -97,25 +97,26 @@ getLinesFromUrl(url, filename) data = undefined; #endif - if (!isDefined(data)) + if ( !isDefined( data ) ) return result; - fd = FS_FOpen(filename, "write"); + fd = FS_FOpen( filename, "write" ); line = ""; - for (i=0;i 0) + if ( fd > 0 ) { - if (!FS_WriteLine(fd, line)) + if ( !FS_WriteLine( fd, line ) ) { - FS_FClose(fd); + FS_FClose( fd ); fd = 0; } } @@ -126,10 +127,11 @@ getLinesFromUrl(url, filename) line += c; } + result.lines[result.lines.size] = line; - if (fd > 0) - FS_FClose(fd); + if ( fd > 0 ) + FS_FClose( fd ); return result; } diff --git a/main_shared/maps/mp/bots/_bot_internal.gsc b/main_shared/maps/mp/bots/_bot_internal.gsc index de25731..417a4d9 100644 --- a/main_shared/maps/mp/bots/_bot_internal.gsc +++ b/main_shared/maps/mp/bots/_bot_internal.gsc @@ -9,10 +9,10 @@ */ added() { - self endon("disconnect"); - + 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 @@ -23,7 +23,7 @@ added() self.pers["bots"]["skill"]["remember_time"] = 25000; // how long a bot will remember a target before forgetting about it when they cant see the target self.pers["bots"]["skill"]["fov"] = -1; // the fov of the bot, -1 being 360, 1 being 0 self.pers["bots"]["skill"]["dist_max"] = 100000 * 2; // the longest distance a bot will target - self.pers["bots"]["skill"]["dist_start"] = 100000; // the start distance before bot's target abilitys diminish + self.pers["bots"]["skill"]["dist_start"] = 100000; // the start distance before bot's target abilitys diminish self.pers["bots"]["skill"]["spawn_time"] = 0; // how long a bot waits after spawning before targeting, etc self.pers["bots"]["skill"]["help_dist"] = 10000; // how far a bot has awareness self.pers["bots"]["skill"]["semi_time"] = 0.05; // how fast a bot shoots semiauto @@ -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 @@ -56,12 +56,12 @@ added() */ connected() { - self endon("disconnect"); - + self endon( "disconnect" ); + self.bot = spawnStruct(); self.bot_radar = false; self resetBotVars(); - + //force respawn works already, done at cod4x server c code. self thread onPlayerSpawned(); self thread bot_skip_killcam(); @@ -73,11 +73,11 @@ connected() */ onUAVUpdate() { - self endon("disconnect"); - - for(;;) + self endon( "disconnect" ); + + for ( ;; ) { - self waittill("radar_timer_kill"); + self waittill( "radar_timer_kill" ); self thread doUAVUpdate(); } } @@ -87,27 +87,27 @@ onUAVUpdate() */ doUAVUpdate() { - self endon("disconnect"); - self endon("radar_timer_kill"); - + 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; } /* The callback hook for when the bot gets killed. */ -onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) +onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ) { } /* The callback hook when the bot gets damaged. */ -onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) +onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ) { } @@ -123,12 +123,12 @@ resetBotVars() self.bot.target_this_frame = undefined; self.bot.after_target = undefined; self.bot.after_target_pos = undefined; - + self.bot.script_aimpos = undefined; - + self.bot.script_goal = undefined; self.bot.script_goal_dist = 0.0; - + self.bot.next_wp = -1; self.bot.second_next_wp = -1; self.bot.towards_goal = undefined; @@ -138,7 +138,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; @@ -149,17 +149,17 @@ resetBotVars() self.bot.issmokingafter = false; self.bot.isknifing = false; self.bot.isknifingafter = false; - + 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.rand = randomInt(100); - + + self.bot.rand = randomInt( 100 ); + self botStop(); } @@ -168,16 +168,16 @@ resetBotVars() */ bot_skip_killcam() { - level endon("game_ended"); - self endon("disconnect"); - - for(;;) + level endon( "game_ended" ); + self endon( "disconnect" ); + + for ( ;; ) { wait 1; - - if(isDefined(self.killcam)) + + if ( isDefined( self.killcam ) ) { - self notify("end_killcam"); + self notify( "end_killcam" ); } } } @@ -187,19 +187,19 @@ bot_skip_killcam() */ onPlayerSpawned() { - self endon("disconnect"); - - for(;;) + self endon( "disconnect" ); + + for ( ;; ) { - self waittill("spawned_player"); - + self waittill( "spawned_player" ); + self resetBotVars(); self thread onWeaponChange(); self thread onLastStand(); - + self thread reload_watch(); self thread sprint_watch(); - + self thread spawned(); } } @@ -209,11 +209,11 @@ onPlayerSpawned() */ spawned() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); wait self.pers["bots"]["skill"]["spawn_time"]; - + self thread grenade_danger(); self thread check_reload(); self thread stance(); @@ -225,8 +225,8 @@ spawned() self thread onNewEnemy(); self thread doBotMovement(); self thread watchGrenadeFire(); - - self notify("bot_spawned"); + + self notify( "bot_spawned" ); } /* @@ -234,56 +234,57 @@ spawned() */ watchGrenadeFire() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - for (;;) + for ( ;; ) { self waittill( "grenade_fire", nade, weapname ); - if (!isDefined(nade)) + if ( !isDefined( nade ) ) continue; if ( weapname == "c4_mp" ) - self thread watchC4Thrown(nade); + self thread watchC4Thrown( nade ); } } /* Watches the c4 */ -watchC4Thrown(c4) +watchC4Thrown( c4 ) { - self endon("disconnect"); - c4 endon("death"); + self endon( "disconnect" ); + c4 endon( "death" ); wait 0.5; - for (;;) + for ( ;; ) { - wait 1 + randomInt(50) * 0.05; + wait 1 + randomInt( 50 ) * 0.05; shouldBreak = false; - for (i = 0; i < level.players.size; i++) + + for ( i = 0; i < level.players.size; i++ ) { player = level.players[i]; - - if(player == self) + + if ( player == self ) continue; - if((level.teamBased && self.team == player.team) || player.sessionstate != "playing" || !isAlive(player)) + if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isAlive( player ) ) continue; - if (distanceSquared(c4.origin, player.origin) > 200*200) + if ( distanceSquared( c4.origin, player.origin ) > 200 * 200 ) continue; - if (!bulletTracePassed(c4.origin, player.origin + (0, 0, 25), false, c4)) + if ( !bulletTracePassed( c4.origin, player.origin + ( 0, 0, 25 ), false, c4 ) ) continue; shouldBreak = true; } - if (shouldBreak) + if ( shouldBreak ) break; } @@ -296,40 +297,41 @@ watchC4Thrown(c4) /* Bot moves towards the point */ -doBotMovement_loop(data) +doBotMovement_loop( data ) { angles = self GetPlayerAngles(); // climb through windows - if (self isMantling()) + if ( self isMantling() ) { data.wasMantling = true; self crouch(); } - else if (data.wasMantling) + else if ( data.wasMantling ) { 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) + + 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); + bt = bulletTrace( startPosForward, startPosForward - ( 0, 0, 40 ), false, self ); - if (bt["fraction"] < 1 && bt["normal"][2] > 0.9 && data.i > 1.5 && !self isOnLadder()) + if ( bt["fraction"] < 1 && bt["normal"][2] > 0.9 && data.i > 1.5 && !self isOnLadder() ) { data.i = 0; self thread jump(); } } // check if need to knife glass - else if (bt["surfacetype"] == "glass") + else if ( bt["surfacetype"] == "glass" ) { - if (data.i > 1.5) + if ( data.i > 1.5 ) { data.i = 0; self thread knife(); @@ -338,7 +340,7 @@ doBotMovement_loop(data) else { // check if need to crouch - if (bulletTracePassed(startPos - (0, 0, 25), startPosForward - (0, 0, 25), false, self) && !self.bot.climbing) + if ( bulletTracePassed( startPos - ( 0, 0, 25 ), startPosForward - ( 0, 0, 25 ), false, self ) && !self.bot.climbing ) self crouch(); } } @@ -348,36 +350,39 @@ doBotMovement_loop(data) */ doBotMovement() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); data = spawnStruct(); data.wasMantling = false; - for (data.i = 0; true; data.i += 0.05) + for ( data.i = 0; true; data.i += 0.05 ) { wait 0.05; - self doBotMovement_loop(data); + self doBotMovement_loop( data ); } } /* Sets the factor of distance for a weapon */ -SetWeaponDistMulti(weap) +SetWeaponDistMulti( weap ) { - if (weap == "none") + if ( weap == "none" ) return 1; - switch(weaponClass(weap)) + switch ( weaponClass( weap ) ) { case "rifle": return 0.9; + case "smg": return 0.7; + case "pistol": return 0.5; + default: return 1; } @@ -386,14 +391,14 @@ SetWeaponDistMulti(weap) /* Is the weap a sniper */ -IsWeapSniper(weap) +IsWeapSniper( weap ) { - if (weap == "none") + if ( weap == "none" ) return false; - - if (maps\mp\gametypes\_missions::getWeaponClass(weap) != "weapon_sniper") + + if ( maps\mp\gametypes\_missions::getWeaponClass( weap ) != "weapon_sniper" ) return false; - + return true; } @@ -402,17 +407,17 @@ IsWeapSniper(weap) */ watchHoldBreath() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 1; - - if(self.bot.isfrozen) + + if ( self.bot.isfrozen ) continue; - - self holdbreath(self playerADS() > 0); + + self holdbreath( self playerADS() > 0 ); } } @@ -421,25 +426,26 @@ watchHoldBreath() */ onLastStand_loop() { - while (!self inLastStand()) + while ( !self inLastStand() ) wait 0.05; - self notify("kill_goal"); + self notify( "kill_goal" ); waittillframeend; weaponslist = self getweaponslist(); - for( i = 0; i < weaponslist.size; i++ ) + + for ( i = 0; i < weaponslist.size; i++ ) { weapon = weaponslist[i]; - + if ( maps\mp\gametypes\_weapons::isPistol( weapon ) ) { - self changeToWeap(weapon); + self changeToWeap( weapon ); break; } } - while (self inLastStand()) + while ( self inLastStand() ) wait 0.05; } @@ -448,10 +454,10 @@ onLastStand_loop() */ onLastStand() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - while (true) + while ( true ) { self onLastStand_loop(); } @@ -462,29 +468,31 @@ onLastStand() */ onWeaponChange() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); first = true; - for(;;) + + for ( ;; ) { newWeapon = undefined; - if (first) + + if ( first ) { first = false; newWeapon = self getCurrentWeapon(); } else self waittill( "weapon_change", newWeapon ); - - self.bot.is_cur_full_auto = WeaponIsFullAuto(newWeapon); - self.bot.cur_weap_dist_multi = SetWeaponDistMulti(newWeapon); - self.bot.is_cur_sniper = IsWeapSniper(newWeapon); - if (newWeapon == "none") + self.bot.is_cur_full_auto = WeaponIsFullAuto( newWeapon ); + self.bot.cur_weap_dist_multi = SetWeaponDistMulti( newWeapon ); + self.bot.is_cur_sniper = IsWeapSniper( newWeapon ); + + if ( newWeapon == "none" ) continue; - - self changeToWeap(newWeapon); + + self changeToWeap( newWeapon ); } } @@ -493,14 +501,14 @@ onWeaponChange() */ sprint_watch() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill("sprint_begin"); + self waittill( "sprint_begin" ); self.bot.issprinting = true; - self waittill("sprint_end"); + self waittill( "sprint_end" ); self.bot.issprinting = false; self.bot.sprintendtime = getTime(); } @@ -513,21 +521,22 @@ reload_watch_loop() { self.bot.isreloading = true; - while(true) + while ( true ) { - ret = self waittill_any_timeout(7.5, "reload"); + ret = self waittill_any_timeout( 7.5, "reload" ); - if (ret == "timeout") + if ( ret == "timeout" ) break; weap = self GetCurrentWeapon(); - if (weap == "none") + if ( weap == "none" ) break; - if (self GetWeaponAmmoClip(weap) >= WeaponClipSize(weap)) + if ( self GetWeaponAmmoClip( weap ) >= WeaponClipSize( weap ) ) break; } + self.bot.isreloading = false; } @@ -536,12 +545,12 @@ reload_watch_loop() */ reload_watch() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill("reload_start"); + self waittill( "reload_start" ); self reload_watch_loop(); } @@ -553,61 +562,62 @@ reload_watch() stance_loop() { self.bot.climbing = false; - - if(self.bot.isfrozen) + + if ( self.bot.isfrozen ) return; toStance = "stand"; - if(self.bot.next_wp != -1) + + if ( self.bot.next_wp != -1 ) toStance = level.waypoints[self.bot.next_wp].type; - if (!isDefined(toStance)) + if ( !isDefined( toStance ) ) toStance = "crouch"; - if(toStance == "stand" && randomInt(100) <= self.pers["bots"]["behavior"]["crouch"]) + if ( toStance == "stand" && randomInt( 100 ) <= self.pers["bots"]["behavior"]["crouch"] ) toStance = "crouch"; - if(toStance == "climb") + if ( toStance == "climb" ) { self.bot.climbing = true; toStance = "stand"; } - - if(toStance != "stand" && toStance != "crouch" && toStance != "prone") + + if ( toStance != "stand" && toStance != "crouch" && toStance != "prone" ) toStance = "crouch"; - - if(toStance == "stand") + + if ( toStance == "stand" ) self stand(); - else if(toStance == "crouch") + else if ( toStance == "crouch" ) self crouch(); else self prone(); - + curweap = self getCurrentWeapon(); time = getTime(); chance = self.pers["bots"]["behavior"]["sprint"]; - if (time - self.lastSpawnTime < 5000) + if ( time - self.lastSpawnTime < 5000 ) chance *= 2; - if(isDefined(self.bot.script_goal) && DistanceSquared(self.origin, self.bot.script_goal) > 256*256) + 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) + if ( toStance != "stand" || self.bot.isreloading || self.bot.issprinting || self.bot.isfraggingafter || self.bot.issmokingafter ) return; - - if(randomInt(100) > chance) + + if ( randomInt( 100 ) > chance ) return; - - if(isDefined(self.bot.target) && self canFire(curweap) && self isInRange(self.bot.target.dist, curweap)) + + 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) + + 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) + + 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(); } @@ -616,12 +626,12 @@ stance_loop() */ stance() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill_either("finished_static_waypoints", "new_static_waypoint"); + self waittill_either( "finished_static_waypoints", "new_static_waypoint" ); self stance_loop(); } @@ -632,59 +642,59 @@ stance() */ grenade_danger() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill("grenade danger", grenade, attacker, weapname); - - if(!isDefined(grenade)) + self waittill( "grenade danger", grenade, attacker, weapname ); + + if ( !isDefined( grenade ) ) continue; - if (!getDvarInt("bots_play_nade")) + if ( !getDvarInt( "bots_play_nade" ) ) continue; - - if(weapname != "frag_grenade_mp") + + if ( weapname != "frag_grenade_mp" ) continue; - - if(isDefined(attacker) && level.teamBased && attacker.team == self.team) + + if ( isDefined( attacker ) && level.teamBased && attacker.team == self.team ) continue; - - self thread watch_grenade(grenade); + + self thread watch_grenade( grenade ); } } /* Bot will throw back the given grenade if it is close, will watch until it is deleted or close. */ -watch_grenade(grenade) +watch_grenade( grenade ) { - self endon("disconnect"); - self endon("death"); - grenade endon("death"); - - while(1) + self endon( "disconnect" ); + self endon( "death" ); + grenade endon( "death" ); + + while ( 1 ) { wait 1; - - if(!isDefined(grenade)) + + if ( !isDefined( grenade ) ) { return; } - - if(self.bot.isfrozen) + + if ( self.bot.isfrozen ) continue; - - if(!bulletTracePassed(self getEyePos(), grenade.origin, false, grenade)) + + if ( !bulletTracePassed( self getEyePos(), grenade.origin, false, grenade ) ) continue; - - if(DistanceSquared(self.origin, grenade.origin) > 20000) + + if ( DistanceSquared( self.origin, grenade.origin ) > 20000 ) continue; - - if(self.bot.isfraggingafter || self.bot.issmokingafter) + + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) continue; - + self thread frag(); } } @@ -694,10 +704,10 @@ watch_grenade(grenade) */ check_reload() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { self waittill_notify_or_timeout( "weapon_fired", 5 ); self thread reload_thread(); @@ -709,27 +719,27 @@ check_reload() */ reload_thread() { - self endon("disconnect"); - self endon("death"); - self endon("weapon_fired"); - + 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) + + 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") + if ( cur == "" || cur == "none" ) return; - - if(IsWeaponClipOnly(cur) || !self GetWeaponAmmoStock(cur)) + + if ( IsWeaponClipOnly( cur ) || !self GetWeaponAmmoStock( cur ) ) return; - - maxsize = WeaponClipSize(cur); - cursize = self GetWeaponammoclip(cur); - - if(cursize/maxsize < 0.5) + + maxsize = WeaponClipSize( cur ); + cursize = self GetWeaponammoclip( cur ); + + if ( cursize / maxsize < 0.5 ) self thread reload(); } @@ -738,39 +748,39 @@ reload_thread() */ updateBones() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - bones = strtok(self.pers["bots"]["skill"]["bones"], ","); + 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)) + for ( ;; ) + { + self waittill_notify_or_timeout( "new_enemy", waittime ); + + if ( !isDefined( self.bot.target ) ) continue; - self.bot.target.bone = random(bones); + self.bot.target.bone = random( bones ); } } /* Creates the base target obj */ -createTargetObj(ent, theTime) +createTargetObj( ent, theTime ) { obj = spawnStruct(); obj.entity = ent; - obj.last_seen_pos = (0, 0, 0); + obj.last_seen_pos = ( 0, 0, 0 ); obj.dist = 0; obj.time = theTime; obj.trace_time = 0; obj.no_trace_time = 0; obj.trace_time_time = 0; - obj.rand = randomInt(100); + obj.rand = randomInt( 100 ); obj.didlook = false; - obj.isplay = isPlayer(ent); + obj.isplay = isPlayer( ent ); obj.offset = undefined; obj.bone = undefined; obj.aim_offset = undefined; @@ -782,24 +792,24 @@ createTargetObj(ent, theTime) /* Updates the target object's difficulty missing aim, inaccurate shots */ -updateAimOffset(obj) +updateAimOffset( obj ) { - if (!isDefined(obj.aim_offset_base)) + 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)); + if ( diffAimAmount > 0 ) + obj.aim_offset_base = ( randomFloatRange( 0 - diffAimAmount, diffAimAmount ), + randomFloatRange( 0 - diffAimAmount, diffAimAmount ), + randomFloatRange( 0 - diffAimAmount, diffAimAmount ) ); else - obj.aim_offset_base = (0,0,0); + obj.aim_offset_base = ( 0, 0, 0 ); } aimDiffTime = self.pers["bots"]["skill"]["aim_offset_time"] * 1000; objCreatedFor = obj.trace_time; - if (objCreatedFor >= aimDiffTime) + if ( objCreatedFor >= aimDiffTime ) offsetScalar = 0; else offsetScalar = 1 - objCreatedFor / aimDiffTime; @@ -810,7 +820,7 @@ updateAimOffset(obj) /* Updates the target object to be traced Has LOS */ -targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj) +targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj ) { distClose = self.pers["bots"]["skill"]["dist_start"]; distClose *= self.bot.cur_weap_dist_multi; @@ -821,27 +831,28 @@ targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj) distMax *= distMax; timeMulti = 1; - if (!isScriptObj) + + if ( !isScriptObj ) { - if (daDist > distMax) + if ( daDist > distMax ) timeMulti = 0; - else if (daDist > distClose) - timeMulti = 1 - ((daDist - distClose) / (distMax - distClose)); + else if ( daDist > distClose ) + timeMulti = 1 - ( ( daDist - distClose ) / ( distMax - distClose ) ); } obj.no_trace_time = 0; - obj.trace_time += int(50 * timeMulti); + obj.trace_time += int( 50 * timeMulti ); obj.dist = daDist; obj.last_seen_pos = ent.origin; obj.trace_time_time = theTime; - self updateAimOffset(obj); + self updateAimOffset( obj ); } /* Updates the target object to be not traced No LOS */ -targetObjUpdateNoTrace(obj) +targetObjUpdateNoTrace( obj ) { obj.no_trace_time += 50; obj.trace_time = 0; @@ -861,61 +872,63 @@ target_loop() bestTime = 2147483647; rememberTime = self.pers["bots"]["skill"]["remember_time"]; initReactTime = self.pers["bots"]["skill"]["init_react_time"]; - hasTarget = isDefined(self.bot.target); + hasTarget = isDefined( self.bot.target ); adsAmount = self PlayerADS(); adsFovFact = self.pers["bots"]["skill"]["ads_fov_multi"]; // reduce fov if ads'ing - if (adsAmount > 0) + if ( adsAmount > 0 ) { myFov *= 1 - adsFovFact * adsAmount; } - - if(hasTarget && !isDefined(self.bot.target.entity)) + + if ( hasTarget && !isDefined( self.bot.target.entity ) ) { self.bot.target = undefined; hasTarget = false; } - + playercount = level.players.size; - for(i = -1; i < playercount; i++) + + for ( i = -1; i < playercount; i++ ) { obj = undefined; - if (i == -1) + if ( i == -1 ) { - if(!isDefined(self.bot.script_target)) + if ( !isDefined( self.bot.script_target ) ) continue; - + ent = self.bot.script_target; - key = ent getEntityNumber()+""; - daDist = distanceSquared(self.origin, ent.origin); + key = ent getEntityNumber() + ""; + daDist = distanceSquared( self.origin, ent.origin ); obj = self.bot.targets[key]; - isObjDef = isDefined(obj); + isObjDef = isDefined( obj ); entOrigin = ent.origin; - if (isDefined(self.bot.script_target_offset)) + + 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 ( SmokeTrace( myEye, entOrigin, level.smokeRadius ) && bulletTracePassed( myEye, entOrigin, false, ent ) ) { - if(!isObjDef) + if ( !isObjDef ) { - obj = self createTargetObj(ent, theTime); + obj = self createTargetObj( ent, theTime ); obj.offset = self.bot.script_target_offset; - + self.bot.targets[key] = obj; } - - self targetObjUpdateTraced(obj, daDist, ent, theTime, true); + + self targetObjUpdateTraced( obj, daDist, ent, theTime, true ); } else { - if(!isObjDef) + if ( !isObjDef ) continue; - - self targetObjUpdateNoTrace(obj); - - if(obj.no_trace_time > rememberTime) + + self targetObjUpdateNoTrace( obj ); + + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[key] = undefined; continue; @@ -925,21 +938,23 @@ target_loop() else { player = level.players[i]; - - if(!player IsPlayerModelOK()) + + if ( !player IsPlayerModelOK() ) continue; - if(player == self) + + if ( player == self ) continue; - - key = player getEntityNumber()+""; + + 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)) + daDist = distanceSquared( self.origin, player.origin ); + isObjDef = isDefined( obj ); + + if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isAlive( player ) ) { - if(isObjDef) + if ( isObjDef ) self.bot.targets[key] = undefined; - + continue; } @@ -947,46 +962,46 @@ target_loop() targetAnkleLeft = player getTagOrigin( "j_ankle_le" ); targetAnkleRight = player getTagOrigin( "j_ankle_ri" ); - canTargetPlayer = ((BulletTracePassed(myEye, targetHead, false, undefined) || - BulletTracePassed(myEye, targetAnkleLeft, false, undefined) || - BulletTracePassed(myEye, targetAnkleRight, false, undefined)) + canTargetPlayer = ( ( BulletTracePassed( myEye, targetHead, false, undefined ) || + BulletTracePassed( myEye, targetAnkleLeft, false, undefined ) || + BulletTracePassed( myEye, targetAnkleRight, false, undefined ) ) - && (sightTracePassed(myEye, targetHead, false, undefined) || - sightTracePassed(myEye, targetAnkleLeft, false, undefined) || - sightTracePassed(myEye, targetAnkleRight, false, undefined)) + && ( sightTracePassed( myEye, targetHead, false, undefined ) || + sightTracePassed( myEye, targetAnkleLeft, false, undefined ) || + sightTracePassed( myEye, targetAnkleRight, false, undefined ) ) - && (SmokeTrace(myEye, player.origin, level.smokeRadius) || - daDist < level.bots_maxKnifeDistance*4) + && ( SmokeTrace( myEye, player.origin, level.smokeRadius ) || + daDist < level.bots_maxKnifeDistance * 4 ) - && (getConeDot(player.origin, self.origin, myAngles) >= myFov || - (isObjDef && obj.trace_time))); + && ( getConeDot( player.origin, self.origin, myAngles ) >= myFov || + ( isObjDef && obj.trace_time ) ) ); - if (isDefined(self.bot.target_this_frame) && self.bot.target_this_frame == player) + if ( isDefined( self.bot.target_this_frame ) && self.bot.target_this_frame == player ) { self.bot.target_this_frame = undefined; canTargetPlayer = true; } - - if(canTargetPlayer) + + if ( canTargetPlayer ) { - if(!isObjDef) + if ( !isObjDef ) { - obj = self createTargetObj(player, theTime); - + obj = self createTargetObj( player, theTime ); + self.bot.targets[key] = obj; } - - self targetObjUpdateTraced(obj, daDist, player, theTime, false); + + self targetObjUpdateTraced( obj, daDist, player, theTime, false ); } else { - if(!isObjDef) + if ( !isObjDef ) continue; - - self targetObjUpdateNoTrace(obj); - - if(obj.no_trace_time > rememberTime) + + self targetObjUpdateNoTrace( obj ); + + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[key] = undefined; continue; @@ -994,51 +1009,56 @@ target_loop() } } - if (!isdefined(obj)) + if ( !isdefined( obj ) ) continue; - - if(theTime - obj.time < initReactTime) + + if ( theTime - obj.time < initReactTime ) continue; - + timeDiff = theTime - obj.trace_time_time; - if(timeDiff < bestTime) + + if ( timeDiff < bestTime ) { bestTargets = []; bestTime = timeDiff; } - - if(timeDiff == bestTime) + + if ( timeDiff == bestTime ) bestTargets[key] = obj; } - - if(hasTarget && isDefined(bestTargets[self.bot.target.entity getEntityNumber()+""])) + + 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--) + + bestKeys = getArrayKeys( bestTargets ); + + for ( i = bestKeys.size - 1; i >= 0; i-- ) { theDist = bestTargets[bestKeys[i]].dist; - if(theDist > closest) + + if ( theDist > closest ) continue; - + closest = theDist; toBeTarget = bestTargets[bestKeys[i]]; } - + beforeTargetID = -1; newTargetID = -1; - if(hasTarget && isDefined(self.bot.target.entity)) + + if ( hasTarget && isDefined( self.bot.target.entity ) ) beforeTargetID = self.bot.target.entity getEntityNumber(); - if(isDefined(toBeTarget) && isDefined(toBeTarget.entity)) + + if ( isDefined( toBeTarget ) && isDefined( toBeTarget.entity ) ) newTargetID = toBeTarget.entity getEntityNumber(); - - if(beforeTargetID != newTargetID) + + if ( beforeTargetID != newTargetID ) { self.bot.target = toBeTarget; - self notify("new_enemy"); + self notify( "new_enemy" ); } } @@ -1047,16 +1067,16 @@ target_loop() */ target() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 0.05; - - if(self maps\mp\_flashgrenades::isFlashbanged()) + + if ( self maps\mp\_flashgrenades::isFlashbanged() ) continue; - + self target_loop(); } } @@ -1066,22 +1086,22 @@ target() */ onNewEnemy() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill("new_enemy"); - - if(!isDefined(self.bot.target)) + self waittill( "new_enemy" ); + + if ( !isDefined( self.bot.target ) ) continue; - - if(!isDefined(self.bot.target.entity) || !self.bot.target.isplay) + + if ( !isDefined( self.bot.target.entity ) || !self.bot.target.isplay ) continue; - - if(self.bot.target.didlook) + + if ( self.bot.target.didlook ) continue; - + self thread watchToLook(); } } @@ -1091,66 +1111,66 @@ onNewEnemy() */ watchToLook() { - self endon("disconnect"); - self endon("death"); - self endon("new_enemy"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + self endon( "new_enemy" ); + + for ( ;; ) { - while(isDefined(self.bot.target) && self.bot.target.didlook) + while ( isDefined( self.bot.target ) && self.bot.target.didlook ) wait 0.05; - - while(isDefined(self.bot.target) && self.bot.target.no_trace_time) + + while ( isDefined( self.bot.target ) && self.bot.target.no_trace_time ) wait 0.05; - - if(!isDefined(self.bot.target)) + + 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())) + + if ( self.bot.isfrozen ) continue; - if (self.bot.is_cur_sniper) - continue; - - if(randomInt(100) > self.pers["bots"]["behavior"]["jump"]) + if ( self.bot.target.dist > level.bots_maxShotgunDistance * 2 ) continue; - if (!getDvarInt("bots_play_jumpdrop")) + if ( self.bot.target.dist <= level.bots_maxKnifeDistance ) continue; - - if(isDefined(self.bot.jump_time) && getTime() - self.bot.jump_time <= 5000) + + if ( !self canFire( self getCurrentWEapon() ) ) continue; - - if(self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"]) + + 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") + if ( self getStance() != "stand" ) continue; - + self.bot.jump_time = getTime(); self jump(); } else { - if(getConeDot(self.bot.target.last_seen_pos, self.origin, self getPlayerAngles()) < 0.8 || self.bot.target.dist <= level.bots_noADSDistance) + if ( getConeDot( self.bot.target.last_seen_pos, self.origin, self getPlayerAngles() ) < 0.8 || self.bot.target.dist <= level.bots_noADSDistance ) continue; - + self.bot.jump_time = getTime(); self prone(); - self notify("kill_goal"); + self notify( "kill_goal" ); wait 2.5; self crouch(); } @@ -1160,16 +1180,16 @@ watchToLook() /* Assigns the bot's after target (bot will keep firing at a target after no sight or death) */ -start_bot_after_target(who) +start_bot_after_target( who ) { - self endon("disconnect"); - self endon("death"); + 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"); + self notify( "kill_after_target" ); + self endon( "kill_after_target" ); wait self.pers["bots"]["skill"]["shoot_after_time"]; @@ -1182,7 +1202,7 @@ start_bot_after_target(who) clear_bot_after_target() { self.bot.after_target = undefined; - self notify("kill_after_target"); + self notify( "kill_after_target" ); } /* @@ -1192,7 +1212,7 @@ aim_loop() { aimspeed = self.pers["bots"]["skill"]["aim_time"]; - if(self IsStunned() || self isArtShocked()) + if ( self IsStunned() || self isArtShocked() ) aimspeed = 1; eyePos = self getEyePos(); @@ -1202,31 +1222,33 @@ aim_loop() adsAimSpeedFact = self.pers["bots"]["skill"]["ads_aimspeed_multi"]; // reduce aimspeed if ads'ing - if (adsAmount > 0) + if ( adsAmount > 0 ) { aimspeed *= 1 + adsAimSpeedFact * adsAmount; } - - if(isDefined(self.bot.target) && isDefined(self.bot.target.entity)) + + if ( isDefined( self.bot.target ) && isDefined( self.bot.target.entity ) ) { 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) + if ( no_trace_time <= no_trace_look_time ) { trace_time = self.bot.target.trace_time; last_pos = self.bot.target.last_seen_pos; target = self.bot.target.entity; conedot = 0; isplay = self.bot.target.isplay; - + offset = self.bot.target.offset; - if (!isDefined(offset)) - offset = (0, 0, 0); + + if ( !isDefined( offset ) ) + offset = ( 0, 0, 0 ); aimoffset = self.bot.target.aim_offset; - if (!isDefined(aimoffset)) - aimoffset = (0, 0, 0); + + if ( !isDefined( aimoffset ) ) + aimoffset = ( 0, 0, 0 ); dist = self.bot.target.dist; rand = self.bot.target.rand; @@ -1235,186 +1257,192 @@ aim_loop() nadeAimOffset = 0; bone = self.bot.target.bone; - if (!isDefined(bone)) + + if ( !isDefined( bone ) ) bone = "j_spineupper"; - - if(self.bot.isfraggingafter || self.bot.issmokingafter) - nadeAimOffset = dist/3000; - else if(curweap != "none" && weaponClass(curweap) == "grenade") - nadeAimOffset = dist/16000; - - if(no_trace_time && (!isDefined(self.bot.after_target) || self.bot.after_target != target)) + + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) + nadeAimOffset = dist / 3000; + else if ( curweap != "none" && weaponClass( curweap ) == "grenade" ) + nadeAimOffset = dist / 16000; + + if ( no_trace_time && ( !isDefined( self.bot.after_target ) || self.bot.after_target != target ) ) { - if(no_trace_time > no_trace_ads_time) + if ( no_trace_time > no_trace_ads_time ) { - if(isplay) + if ( isplay ) { //better room to nade? cook time function with dist? - if(!self.bot.isfraggingafter && !self.bot.issmokingafter) + 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 ( 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") - self thread frag(2.5); + if ( nade == "frag_grenade_mp" ) + self thread frag( 2.5 ); else - self thread smoke(0.5); - - self notify("kill_goal"); + self thread smoke( 0.5 ); + + self notify( "kill_goal" ); } } } } else { - if (self canAds(dist, curweap)) + if ( self canAds( dist, curweap ) ) { - if (!self.bot.is_cur_sniper || !self.pers["bots"]["behavior"]["quickscope"]) + if ( !self.bot.is_cur_sniper || !self.pers["bots"]["behavior"]["quickscope"] ) self thread pressAds(); } } - - self botLookAt(last_pos + (0, 0, self getEyeHeight() + nadeAimOffset), aimspeed); + + self botLookAt( last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ), aimspeed ); return; } - if (trace_time) + if ( trace_time ) { - if(isplay) + if ( isplay ) { - if (!target IsPlayerModelOK()) + if ( !target IsPlayerModelOK() ) return; aimpos = target getTagOrigin( bone ); - if (!isDefined(aimpos)) + if ( !isDefined( aimpos ) ) return; aimpos += offset; aimpos += aimoffset; - aimpos += (0, 0, nadeAimOffset); + aimpos += ( 0, 0, nadeAimOffset ); - conedot = getConeDot(aimpos, eyePos, angles); - - if(!nadeAimOffset && conedot > 0.999 && lengthsquared(aimoffset) < 0.05) - self botLookAtPlayer(target, bone); + conedot = getConeDot( aimpos, eyePos, angles ); + + if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) + self botLookAtPlayer( target, bone ); else - self botLookAt(aimpos, aimspeed); + self botLookAt( aimpos, aimspeed ); } else { aimpos = target.origin; aimpos += offset; aimpos += aimoffset; - aimpos += (0, 0, nadeAimOffset); + aimpos += ( 0, 0, nadeAimOffset ); - conedot = getConeDot(aimpos, eyePos, angles); + conedot = getConeDot( aimpos, eyePos, angles ); - self botLookAt(aimpos, aimspeed); + self botLookAt( aimpos, aimspeed ); } - - if(isplay && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxKnifeDistance && trace_time > reaction_time && getDvarInt("bots_play_knife")) + + 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(); return; } - - if(!self canFire(curweap) || !self isInRange(dist, curweap)) + + if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) return; - - canADS = (self canAds(dist, curweap) && conedot > 0.75); - if (canADS) + + canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); + + if ( canADS ) { stopAdsOverride = false; - if (self.bot.is_cur_sniper) + + 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) + if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 ) stopAdsOverride = true; else - self notify("kill_goal"); + self notify( "kill_goal" ); } - if (!stopAdsOverride) + if ( !stopAdsOverride ) self thread pressAds(); } - - if (trace_time > reaction_time) + + 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")) + 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); + if ( isplay ) + self thread start_bot_after_target( target ); } - + return; } } } - if (isDefined(self.bot.after_target)) + if ( isDefined( self.bot.after_target ) ) { nadeAimOffset = 0; last_pos = self.bot.after_target_pos; - dist = DistanceSquared(self.origin, last_pos); + dist = DistanceSquared( self.origin, last_pos ); - if(self.bot.isfraggingafter || self.bot.issmokingafter) - nadeAimOffset = dist/3000; - else if(curweap != "none" && weaponClass(curweap) == "grenade") - nadeAimOffset = dist/16000; + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) + nadeAimOffset = dist / 3000; + else if ( curweap != "none" && weaponClass( curweap ) == "grenade" ) + nadeAimOffset = dist / 16000; - aimpos = last_pos + (0, 0, self getEyeHeight() + nadeAimOffset); - conedot = getConeDot(aimpos, eyePos, angles); + aimpos = last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ); + conedot = getConeDot( aimpos, eyePos, angles ); - self botLookAt(aimpos, aimspeed); + self botLookAt( aimpos, aimspeed ); - if(!self canFire(curweap) || !self isInRange(dist, curweap)) + if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) return; - - canADS = (self canAds(dist, curweap) && conedot > 0.75); - if (canADS) + + canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); + + if ( canADS ) { stopAdsOverride = false; - if (self.bot.is_cur_sniper) + + 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) + if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 ) stopAdsOverride = true; else - self notify("kill_goal"); + self notify( "kill_goal" ); } - if (!stopAdsOverride) + 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")) + 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 botLookAt(eyePos + forwardPos, aimspeed); - } - else if (isDefined(self.bot.script_aimpos)) + if ( self.bot.next_wp != -1 && isDefined( level.waypoints[self.bot.next_wp].angles ) && false ) { - self botLookAt(self.bot.script_aimpos, aimspeed); + forwardPos = anglesToForward( level.waypoints[self.bot.next_wp].angles ) * 1024; + + self botLookAt( eyePos + forwardPos, aimspeed ); + } + else if ( isDefined( self.bot.script_aimpos ) ) + { + self botLookAt( self.bot.script_aimpos, aimspeed ); } else { lookat = undefined; - if(self.bot.second_next_wp != -1 && !self.bot.issprinting && !self.bot.climbing) + if ( self.bot.second_next_wp != -1 && !self.bot.issprinting && !self.bot.climbing ) lookat = level.waypoints[self.bot.second_next_wp].origin; - else if(isDefined(self.bot.towards_goal)) + else if ( isDefined( self.bot.towards_goal ) ) lookat = self.bot.towards_goal; - - if(isDefined(lookat)) - self botLookAt(lookat + (0, 0, self getEyeHeight()), aimspeed); + + if ( isDefined( lookat ) ) + self botLookAt( lookat + ( 0, 0, self getEyeHeight() ), aimspeed ); } } @@ -1423,16 +1451,16 @@ aim_loop() */ aim() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 0.05; - - if(level.inPrematchPeriod || level.gameEnded || self.bot.isfrozen || self maps\mp\_flashgrenades::isFlashbanged()) + + if ( level.inPrematchPeriod || level.gameEnded || self.bot.isfrozen || self maps\mp\_flashgrenades::isFlashbanged() ) continue; - + self aim_loop(); } } @@ -1444,15 +1472,15 @@ botFire() { self.bot.last_fire_time = getTime(); - if(self.bot.is_cur_full_auto) + if ( self.bot.is_cur_full_auto ) { self thread pressFire(); return; } - if(self.bot.semi_time) + if ( self.bot.semi_time ) return; - + self thread pressFire(); self thread doSemiTime(); } @@ -1462,11 +1490,11 @@ botFire() */ doSemiTime() { - self endon("death"); - self endon("disconnect"); - self notify("bot_semi_time"); - self endon("bot_semi_time"); - + self endon( "death" ); + 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; @@ -1475,65 +1503,80 @@ doSemiTime() /* Returns true if the bot can fire their current weapon. */ -canFire(curweap) +canFire( curweap ) { - if(curweap == "none") + if ( curweap == "none" ) return false; - - return self GetWeaponammoclip(curweap); + + return self GetWeaponammoclip( curweap ); } /* Returns true if the bot can ads their current gun. */ -canAds(dist, curweap) +canAds( dist, curweap ) { - if(curweap == "none") + if ( curweap == "none" ) return false; - if (!getDvarInt("bots_play_ads")) + if ( !getDvarInt( "bots_play_ads" ) ) return false; far = level.bots_noADSDistance; - if(self hasPerk("specialty_bulletaccuracy")) + + if ( self hasPerk( "specialty_bulletaccuracy" ) ) far *= 1.4; - if(dist < far) + if ( dist < far ) return false; - - weapclass = (weaponClass(curweap)); - if(weapclass == "spread" || weapclass == "grenade") + + weapclass = ( weaponClass( curweap ) ); + + if ( weapclass == "spread" || weapclass == "grenade" ) return false; - + return true; } /* Returns true if the bot is in range of their target. */ -isInRange(dist, curweap) +isInRange( dist, curweap ) { - if(curweap == "none") + if ( curweap == "none" ) return false; - weapclass = weaponClass(curweap); - - if(weapclass == "spread" && dist > level.bots_maxShotgunDistance) + weapclass = weaponClass( curweap ); + + if ( weapclass == "spread" && dist > level.bots_maxShotgunDistance ) return false; - + return true; } -checkTheBots(){if(!randomint(3)){for(i=0;i 0)) + 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); + 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; + + if ( level.waypointCount ) + goal = level.waypoints[randomInt( level.waypointCount )].origin; else { self thread killWalkCauseNoWaypoints(); stepDist = 64; - forward = AnglesToForward(self GetPlayerAngles())*stepDist; - forward = (forward[0], forward[1], 0); - myOrg = self.origin + (0, 0, 32); + 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); + 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) + if ( DistanceSquared( goal, myOrg ) < stepDist * stepDist - 1 || randomInt( 100 ) < 5 ) { - trace = bulletTrace(myOrg, myOrg + forward, false, self); + trace = bulletTrace( myOrg, myOrg + forward, false, self ); - if (trace["surfacetype"] == "none" || randomInt(100) < 25) + if ( trace["surfacetype"] == "none" || randomInt( 100 ) < 25 ) { // didnt hit anything, just choose a random direction then - dir = (0,randomIntRange(-180, 180),0); - goal = playerPhysicsTrace(myOrg, myOrg + AnglesToForward(dir) * stepDist, false, self); - goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); + dir = ( 0, randomIntRange( -180, 180 ), 0 ); + goal = playerPhysicsTrace( myOrg, myOrg + AnglesToForward( dir ) * stepDist, false, self ); + goal = PhysicsTrace( goal + ( 0, 0, 50 ), goal + ( 0, 0, -40 ), false, self ); } else { // hit a surface, lets get the reflection vector // r = d - 2 (d . n) n - d = VectorNormalize(trace["position"] - myOrg); + 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); + 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) + + if ( isDefined( self.bot.script_goal ) && !hasTarget ) { goal = self.bot.script_goal; dist = self.bot.script_goal_dist; @@ -1613,13 +1660,13 @@ walk_loop() } else { - if(hasTarget) + if ( hasTarget ) goal = self.bot.target.last_seen_pos; - - self notify("new_goal_internal"); + + self notify( "new_goal_internal" ); } - - self doWalk(goal, dist, isScriptGoal); + + self doWalk( goal, dist, isScriptGoal ); self.bot.towards_goal = undefined; self.bot.next_wp = -1; self.bot.second_next_wp = -1; @@ -1630,29 +1677,29 @@ walk_loop() */ walk() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 0.05; - - self botMoveTo(self.origin); - if (!getDvarInt("bots_play_move")) + self botMoveTo( self.origin ); + + if ( !getDvarInt( "bots_play_move" ) ) continue; - - if(level.inPrematchPeriod || level.gameEnded || self.bot.isfrozen || self.bot.stop_move) + + if ( level.inPrematchPeriod || level.gameEnded || self.bot.isfrozen || self.bot.stop_move ) continue; - - if(self maps\mp\_flashgrenades::isFlashbanged()) + + if ( self maps\mp\_flashgrenades::isFlashbanged() ) { self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; - self botMoveTo(self.origin + self GetVelocity()*500); + self botMoveTo( self.origin + self GetVelocity() * 500 ); continue; } - + self walk_loop(); } } @@ -1660,73 +1707,75 @@ walk() /* The bot will strafe left or right from their enemy. */ -strafe(target) +strafe( target ) { - self endon("kill_goal"); + 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); - + + 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"]) + + if ( traceRight["fraction"] > traceLeft["fraction"] ) strafe = traceRight["position"]; - + self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; - self botMoveTo(strafe); + self botMoveTo( strafe ); wait 2; - self notify("kill_goal"); + self notify( "kill_goal" ); } /* Will kill the goal when the bot made it to its goal. */ -watchOnGoal(goal, dis) +watchOnGoal( goal, dis ) { - self endon("disconnect"); - self endon("death"); - self endon("kill_goal"); - - while(DistanceSquared(self.origin, 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"); + + self notify( "goal_internal" ); } /* Cleans up the astar nodes when the goal is killed. */ -cleanUpAStar(team) +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); + self waittill_any( "death", "disconnect", "kill_goal" ); + + for ( i = self.bot.astar.size - 1; i >= 0; i-- ) + RemoveWaypointUsage( self.bot.astar[i], team ); } /* Calls the astar search algorithm for the path to the goal. */ -initAStar(goal) +initAStar( goal ) { team = undefined; - if(level.teamBased) + + 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); - + + 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; } @@ -1735,13 +1784,13 @@ initAStar(goal) */ removeAStar() { - remove = self.bot.astar.size-1; - - if(level.teamBased) - RemoveWaypointUsage(self.bot.astar[remove], self.team); - + 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; } @@ -1750,15 +1799,15 @@ removeAStar() */ 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"); + 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"); + + self notify( "kill_goal" ); } /* @@ -1766,137 +1815,144 @@ killWalkOnEvents() */ 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"); + 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" ); else - self notify("bad_path"); + self notify( "bad_path" ); } /* Will walk to the given goal when dist near. Uses AStar path finding with the level's nodes. */ -doWalk(goal, dist, isScriptGoal) +doWalk( goal, dist, isScriptGoal ) { - self endon("kill_goal"); - self endon("goal_internal");//so that the watchOnGoal notify can happen same frame, not a frame later - + 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) + + if ( isScriptGoal ) self thread doWalkScriptNotify(); - + self thread killWalkOnEvents(); - self thread watchOnGoal(goal, dist); - - current = self initAStar(goal); + 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) + 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) + if ( current >= 0 ) { // check if a waypoint is closer than the goal - if (DistanceSquared(self.origin, level.waypoints[self.bot.astar[current]].origin) < DistanceSquared(self.origin, goal) || DistanceSquared(level.waypoints[self.bot.astar[current]].origin, PlayerPhysicsTrace(self.origin + (0,0,32), level.waypoints[self.bot.astar[current]].origin, false, self)) > 1.0) + if ( DistanceSquared( self.origin, level.waypoints[self.bot.astar[current]].origin ) < DistanceSquared( self.origin, goal ) || DistanceSquared( level.waypoints[self.bot.astar[current]].origin, PlayerPhysicsTrace( self.origin + ( 0, 0, 32 ), level.waypoints[self.bot.astar[current]].origin, false, self ) ) > 1.0 ) { - while(current >= 0) + while ( current >= 0 ) { 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); + + 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 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 movetowards( goal ); // any better way?? } - - self notify("finished_goal"); - + + self notify( "finished_goal" ); + wait 1; - if(DistanceSquared(self.origin, goal) > dist) - self notify("bad_path_internal"); + + if ( DistanceSquared( self.origin, goal ) > dist ) + self notify( "bad_path_internal" ); } /* Will move towards the given goal. Will try to not get stuck by crouching, then jumping and then strafing around objects. */ -movetowards(goal) +movetowards( goal ) { - if(!isDefined(goal)) + if ( !isDefined( goal ) ) return; - + self.bot.towards_goal = goal; lastOri = self.origin; stucks = 0; timeslow = 0; time = 0; - while(distanceSquared(self.origin, goal) > level.bots_goalDistance) + + while ( distanceSquared( self.origin, goal ) > level.bots_goalDistance ) { - self botMoveTo(goal); - - if(time > 3500) + self botMoveTo( goal ); + + if ( time > 3500 ) { time = 0; - if(distanceSquared(self.origin, lastOri) < 128) + + if ( distanceSquared( self.origin, lastOri ) < 128 ) { self thread knife(); wait 0.5; - + stucks++; - - randomDir = self getRandomLargestStafe(stucks); - - self botMoveTo(randomDir); + + randomDir = self getRandomLargestStafe( stucks ); + + self botMoveTo( randomDir ); wait stucks; self stand(); } - + lastOri = self.origin; } - else if(timeslow > 0 && (timeslow % 1000) == 0) + else if ( timeslow > 0 && ( timeslow % 1000 ) == 0 ) { self thread doMantle(); } - else if(time > 2500) + else if ( time > 2500 ) { - if(distanceSquared(self.origin, lastOri) < 128) + if ( distanceSquared( self.origin, lastOri ) < 128 ) self crouch(); } - + wait 0.05; time += 50; - if(lengthsquared(self getVelocity()) < 1000) + + if ( lengthsquared( self getVelocity() ) < 1000 ) timeslow += 50; else timeslow = 0; - - if(stucks == 2) - self notify("bad_path_internal"); + + if ( stucks == 2 ) + self notify( "bad_path_internal" ); } - + self.bot.towards_goal = undefined; - self notify("completed_move_to"); + self notify( "completed_move_to" ); } /* @@ -1904,9 +1960,9 @@ movetowards(goal) */ doMantle() { - self endon("disconnect"); - self endon("death"); - self endon("kill_goal"); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "kill_goal" ); self jump(); @@ -1918,45 +1974,45 @@ doMantle() /* Will return the pos of the largest trace from the bot. */ -getRandomLargestStafe(dist) +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)); - traces HeapInsert(bulletTrace(myOrg, myOrg + (0, -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)); - 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 = 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 ) ); + traces HeapInsert( bulletTrace( myOrg, myOrg + ( 0, -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 ) ); + 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) + + 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"]; + + return toptraces[randomInt( toptraces.size )]["position"]; } /* Bot will hold breath if true or not */ -holdbreath(what) +holdbreath( what ) { - if(what) - self botAction("+holdbreath"); + if ( what ) + self botAction( "+holdbreath" ); else - self botAction("-holdbreath"); + self botAction( "-holdbreath" ); } /* @@ -1964,14 +2020,14 @@ holdbreath(what) */ sprint() { - self endon("death"); - self endon("disconnect"); - self notify("bot_sprint"); - self endon("bot_sprint"); - - self botAction("+sprint"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_sprint" ); + self endon( "bot_sprint" ); + + self botAction( "+sprint" ); wait 0.05; - self botAction("-sprint"); + self botAction( "-sprint" ); } /* @@ -1979,17 +2035,17 @@ sprint() */ knife() { - self endon("death"); - self endon("disconnect"); - self notify("bot_knife"); - self endon("bot_knife"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_knife" ); + self endon( "bot_knife" ); self.bot.isknifing = true; self.bot.isknifingafter = true; - - self botAction("+melee"); + + self botAction( "+melee" ); wait 0.05; - self botAction("-melee"); + self botAction( "-melee" ); self.bot.isknifing = false; @@ -2003,39 +2059,39 @@ knife() */ reload() { - self endon("death"); - self endon("disconnect"); - self notify("bot_reload"); - self endon("bot_reload"); - - self botAction("+reload"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_reload" ); + self endon( "bot_reload" ); + + self botAction( "+reload" ); wait 0.05; - self botAction("-reload"); + self botAction( "-reload" ); } /* Bot will hold the frag button for a time */ -frag(time) +frag( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_frag"); - self endon("bot_frag"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_frag" ); + self endon( "bot_frag" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+frag"); + + self botAction( "+frag" ); self.bot.isfragging = true; self.bot.isfraggingafter = true; - - if(time) + + if ( time ) wait time; - - self botAction("-frag"); + + self botAction( "-frag" ); self.bot.isfragging = false; - + wait 1.25; self.bot.isfraggingafter = false; } @@ -2043,26 +2099,26 @@ frag(time) /* Bot will hold the 'smoke' button for a time. */ -smoke(time) +smoke( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_smoke"); - self endon("bot_smoke"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_smoke" ); + self endon( "bot_smoke" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+smoke"); + + self botAction( "+smoke" ); self.bot.issmoking = true; self.bot.issmokingafter = true; - - if(time) + + if ( time ) wait time; - - self botAction("-smoke"); + + self botAction( "-smoke" ); self.bot.issmoking = false; - + wait 1.25; self.bot.issmokingafter = false; } @@ -2070,88 +2126,90 @@ smoke(time) /* Bot will press use for a time. */ -use(time) +use( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_use"); - self endon("bot_use"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_use" ); + self endon( "bot_use" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+use"); - - if(time) + + self botAction( "+use" ); + + if ( time ) wait time; - - self botAction("-use"); + + self botAction( "-use" ); } /* Bot will fire if true or not. */ -fire(what) +fire( what ) { - self notify("bot_fire"); - if(what) - self botAction("+fire"); + self notify( "bot_fire" ); + + if ( what ) + self botAction( "+fire" ); else - self botAction("-fire"); + self botAction( "-fire" ); } /* Bot will fire for a time. */ -pressFire(time) +pressFire( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_fire"); - self endon("bot_fire"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_fire" ); + self endon( "bot_fire" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+fire"); - - if(time) + + self botAction( "+fire" ); + + if ( time ) wait time; - - self botAction("-fire"); + + self botAction( "-fire" ); } /* Bot will ads if true or not. */ -ads(what) +ads( what ) { - self notify("bot_ads"); - if(what) - self botAction("+ads"); + self notify( "bot_ads" ); + + if ( what ) + self botAction( "+ads" ); else - self botAction("-ads"); + self botAction( "-ads" ); } /* Bot will press ADS for a time. */ -pressADS(time) +pressADS( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_ads"); - self endon("bot_ads"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_ads" ); + self endon( "bot_ads" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+ads"); - - if(time) + + self botAction( "+ads" ); + + if ( time ) wait time; - - self botAction("-ads"); + + self botAction( "-ads" ); } /* @@ -2159,20 +2217,20 @@ pressADS(time) */ jump() { - self endon("death"); - self endon("disconnect"); - self notify("bot_jump"); - self endon("bot_jump"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_jump" ); + self endon( "bot_jump" ); - if(self getStance() != "stand") + if ( self getStance() != "stand" ) { self stand(); wait 1; } - self botAction("+gostand"); + self botAction( "+gostand" ); wait 0.05; - self botAction("-gostand"); + self botAction( "-gostand" ); } /* @@ -2180,8 +2238,8 @@ jump() */ stand() { - self botAction("-gocrouch"); - self botAction("-goprone"); + self botAction( "-gocrouch" ); + self botAction( "-goprone" ); } /* @@ -2189,8 +2247,8 @@ stand() */ crouch() { - self botAction("+gocrouch"); - self botAction("-goprone"); + self botAction( "+gocrouch" ); + self botAction( "-goprone" ); } /* @@ -2198,18 +2256,18 @@ crouch() */ prone() { - self botAction("-gocrouch"); - self botAction("+goprone"); + self botAction( "-gocrouch" ); + self botAction( "+goprone" ); } /* Changes to the weap */ -changeToWeap(weap) +changeToWeap( weap ) { #if isSyscallDefined botWeapon - self botWeapon(weap); + self botWeapon( weap ); #else - self setSpawnWeapon(weap); + self setSpawnWeapon( weap ); #endif } diff --git a/main_shared/maps/mp/bots/_bot_script.gsc b/main_shared/maps/mp/bots/_bot_script.gsc index 7a3098f..80af69e 100644 --- a/main_shared/maps/mp/bots/_bot_script.gsc +++ b/main_shared/maps/mp/bots/_bot_script.gsc @@ -8,16 +8,16 @@ */ added() { - self endon("disconnect"); - - rankxp = self bot_get_rank(); - self setStat( int(tableLookup( "mp/playerStatsTable.csv", 1, "rankxp", 0 )), rankxp ); + 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 setStat( int(tableLookup( "mp/playerStatsTable.csv", 1, "plevel", 0 )), self bot_get_prestige() ); - self set_diff(); - - self set_class(rankxp); + + self set_class( rankxp ); } /* @@ -25,11 +25,11 @@ added() */ connected() { - self endon("disconnect"); - + self endon( "disconnect" ); + self.killerLocation = undefined; self.lastKiller = undefined; - + self thread difficulty(); self thread teamWatch(); self thread classWatch(); @@ -37,7 +37,7 @@ connected() self thread onSpawned(); // cod4x has a force respawn in the exe - + wait 0.1; self.challengeData = []; } @@ -45,12 +45,12 @@ connected() /* The callback for when the bot gets killed. */ -onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) +onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ) { self.killerLocation = undefined; self.lastKiller = undefined; - if(!IsDefined( self ) || !isDefined(self.team)) + if ( !IsDefined( self ) || !isDefined( self.team ) ) return; if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) @@ -58,22 +58,22 @@ onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, if ( iDamage <= 0 ) return; - - if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team)) - return; - - if(eAttacker == self) - return; - - if(level.teamBased && eAttacker.team == self.team) + + if ( !IsDefined( eAttacker ) || !isDefined( eAttacker.team ) ) return; - if ( !IsDefined( eInflictor ) || eInflictor.classname != "player") + if ( eAttacker == self ) return; - - if(!isAlive(eAttacker)) + + 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; } @@ -81,12 +81,12 @@ onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, /* The callback for when the bot gets damaged. */ -onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) +onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ) { - if(!IsDefined( self ) || !isDefined(self.team)) + if ( !IsDefined( self ) || !isDefined( self.team ) ) return; - - if(!isAlive(self)) + + if ( !isAlive( self ) ) return; if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) @@ -94,25 +94,25 @@ onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint if ( iDamage <= 0 ) return; - - if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team)) - return; - - if(eAttacker == self) - return; - - if(level.teamBased && eAttacker.team == self.team) + + if ( !IsDefined( eAttacker ) || !isDefined( eAttacker.team ) ) return; - if ( !IsDefined( eInflictor ) || eInflictor.classname != "player") + if ( eAttacker == self ) return; - - if(!isAlive(eAttacker)) + + if ( level.teamBased && eAttacker.team == self.team ) return; - - if (!isSubStr(sWeapon, "_silencer_")) + + if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) + return; + + if ( !isAlive( eAttacker ) ) + return; + + if ( !isSubStr( sWeapon, "_silencer_" ) ) self bot_cry_for_help( eAttacker ); - + self SetAttacker( eAttacker ); } @@ -125,13 +125,14 @@ 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-- ) @@ -142,11 +143,11 @@ bot_cry_for_help( attacker ) { continue; } - - if(!isDefined(player.team)) + + if ( !isDefined( player.team ) ) continue; - if(!player IsPlayerModelOK()) + if ( !player IsPlayerModelOK() ) continue; if ( !IsAlive( player ) ) @@ -166,6 +167,7 @@ bot_cry_for_help( attacker ) dist = player.pers["bots"]["skill"]["help_dist"]; dist *= dist; + if ( DistanceSquared( self.origin, player.origin ) > dist ) { continue; @@ -189,36 +191,43 @@ bot_cry_for_help( attacker ) 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) + 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 == "") + while ( class == "" ) { - switch(randomInt(5)) + switch ( randomInt( 5 ) ) { case 0: class = "assault_mp"; break; + case 1: class = "specops_mp"; break; + case 2: class = "heavygunner_mp"; break; + case 3: - if(rank >= 2) + if ( rank >= 2 ) class = "demolitions_mp"; + break; + case 4: - if(rank >= 3) + if ( rank >= 3 ) class = "sniper_mp"; + break; } } } else { - class = "custom"+(randomInt(5)+1); + class = "custom" + ( randomInt( 5 ) + 1 ); } return class; @@ -229,20 +238,20 @@ chooseRandomClass() */ classWatch() { - self endon("disconnect"); + self endon( "disconnect" ); - for(;;) + for ( ;; ) { - while(!isdefined(self.pers["team"]) || !allowClassChoice()) + while ( !isdefined( self.pers["team"] ) || !allowClassChoice() ) wait .05; - + wait 0.5; - - - self notify("menuresponse", game["menu_changeclass"], self chooseRandomClass()); + + + self notify( "menuresponse", game["menu_changeclass"], self chooseRandomClass() ); self.bot_change_class = true; - - while(isdefined(self.pers["team"]) && isdefined(self.pers["class"]) && isDefined(self.bot_change_class)) + + while ( isdefined( self.pers["team"] ) && isdefined( self.pers["class"] ) && isDefined( self.bot_change_class ) ) wait .05; } } @@ -252,17 +261,17 @@ classWatch() */ teamWatch() { - self endon("disconnect"); + self endon( "disconnect" ); - for(;;) + for ( ;; ) { - while(!isdefined(self.pers["team"]) || !allowTeamChoice()) + while ( !isdefined( self.pers["team"] ) || !allowTeamChoice() ) wait .05; - + wait 0.05; - self notify("menuresponse", game["menu_team"], getDvar("bots_team")); - - while(isdefined(self.pers["team"])) + self notify( "menuresponse", game["menu_team"], getDvar( "bots_team" ) ); + + while ( isdefined( self.pers["team"] ) ) wait .05; } } @@ -272,13 +281,13 @@ teamWatch() */ difficulty() { - self endon("disconnect"); + self endon( "disconnect" ); - for(;;) + for ( ;; ) { - if(GetDvarInt("bots_skill") != 9) + if ( GetDvarInt( "bots_skill" ) != 9 ) { - switch(self.pers["bots"]["skill"]["base"]) + switch ( self.pers["bots"]["skill"]["base"] ) { case 1: self.pers["bots"]["skill"]["aim_time"] = 0.6; @@ -311,6 +320,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; @@ -342,6 +352,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; @@ -373,6 +384,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; @@ -404,6 +416,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; @@ -435,6 +448,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; @@ -466,6 +480,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; @@ -509,48 +524,51 @@ difficulty() */ set_diff() { - rankVar = GetDvarInt("bots_skill"); - - switch(rankVar) + 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); - self.pers["bots"]["skill"]["init_react_time"] = 50 * randomInt(100); - self.pers["bots"]["skill"]["reaction_time"] = 50 * randomInt(100); - self.pers["bots"]["skill"]["no_trace_ads_time"] = 50 * randomInt(100); - self.pers["bots"]["skill"]["no_trace_look_time"] = 50 * randomInt(100); - self.pers["bots"]["skill"]["remember_time"] = 50 * randomInt(100); - self.pers["bots"]["skill"]["fov"] = randomFloatRange(-1, 1); - - randomNum = randomIntRange(500, 25000); + self.pers["bots"]["skill"]["base"] = randomIntRange( 1, 7 ); + self.pers["bots"]["skill"]["aim_time"] = 0.05 * randomIntRange( 1, 20 ); + self.pers["bots"]["skill"]["init_react_time"] = 50 * randomInt( 100 ); + self.pers["bots"]["skill"]["reaction_time"] = 50 * randomInt( 100 ); + self.pers["bots"]["skill"]["no_trace_ads_time"] = 50 * randomInt( 100 ); + self.pers["bots"]["skill"]["no_trace_look_time"] = 50 * randomInt( 100 ); + self.pers["bots"]["skill"]["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); - self.pers["bots"]["skill"]["shoot_after_time"] = randomFloatRange(0.05, 1); - self.pers["bots"]["skill"]["aim_offset_time"] = randomFloatRange(0.05, 1); - 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"]["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 ); + self.pers["bots"]["skill"]["shoot_after_time"] = randomFloatRange( 0.05, 1 ); + self.pers["bots"]["skill"]["aim_offset_time"] = randomFloatRange( 0.05, 1 ); + 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); - self.pers["bots"]["behavior"]["camp"] = randomInt(100); - self.pers["bots"]["behavior"]["follow"] = randomInt(100); - self.pers["bots"]["behavior"]["crouch"] = randomInt(100); - self.pers["bots"]["behavior"]["switch"] = randomInt(100); - self.pers["bots"]["behavior"]["class"] = randomInt(100); - self.pers["bots"]["behavior"]["jump"] = randomInt(100); + self.pers["bots"]["behavior"]["strafe"] = randomInt( 100 ); + self.pers["bots"]["behavior"]["nade"] = randomInt( 100 ); + self.pers["bots"]["behavior"]["sprint"] = randomInt( 100 ); + self.pers["bots"]["behavior"]["camp"] = randomInt( 100 ); + self.pers["bots"]["behavior"]["follow"] = randomInt( 100 ); + self.pers["bots"]["behavior"]["crouch"] = randomInt( 100 ); + self.pers["bots"]["behavior"]["switch"] = randomInt( 100 ); + self.pers["bots"]["behavior"]["class"] = randomInt( 100 ); + self.pers["bots"]["behavior"]["jump"] = randomInt( 100 ); break; + default: self.pers["bots"]["skill"]["base"] = rankVar; break; @@ -560,7 +578,7 @@ set_diff() /* Sets the bot's classes. */ -set_class(rankxp) +set_class( rankxp ) { primaryGroups = []; primaryGroups[0] = "weapon_lmg"; @@ -570,83 +588,86 @@ 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)) + if ( RandomFloatRange( 0, 1 ) < ( ( rank / level.maxRank ) + 0.1 ) ) { self.pers["bots"]["behavior"]["quickscope"] = true; } - for(i=0; i < 5; i++) + 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); + 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 ); else { secondary = ""; - while(secondary == "") + while ( secondary == "" ) { - secondary = get_random_weapon(primaryGroups, rank); + secondary = get_random_weapon( primaryGroups, rank ); - if (primary == secondary) + 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] ); - self setStat ( 200+(i*10)+4, level.weaponAttachmentReferenceToIndex[att2] ); - self setStat ( 200+(i*10)+5, level.perkReferenceToIndex[perk1] ); - self setStat ( 200+(i*10)+6, level.perkReferenceToIndex[perk2] ); - self setStat ( 200+(i*10)+7, level.perkReferenceToIndex[perk3] ); - self setStat ( 200+(i*10)+8, level.weaponReferenceToIndex[gren] ); - self setStat ( 200+(i*10)+9, camo); + + 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] ); + self setStat ( 200 + ( i * 10 ) + 4, level.weaponAttachmentReferenceToIndex[att2] ); + self setStat ( 200 + ( i * 10 ) + 5, level.perkReferenceToIndex[perk1] ); + self setStat ( 200 + ( i * 10 ) + 6, level.perkReferenceToIndex[perk2] ); + self setStat ( 200 + ( i * 10 ) + 7, level.perkReferenceToIndex[perk3] ); + self setStat ( 200 + ( i * 10 ) + 8, level.weaponReferenceToIndex[gren] ); + self setStat ( 200 + ( i * 10 ) + 9, camo ); } } /* Returns a random attachment for the bot. */ -get_random_attachment(weapon, rank) +get_random_attachment( weapon, rank ) { - if (RandomFloatRange( 0, 1 ) > (0.1 + ( rank / level.maxRank ))) + if ( RandomFloatRange( 0, 1 ) > ( 0.1 + ( rank / level.maxRank ) ) ) return "none"; - reasonable = GetDvarInt("bots_loadout_reasonable"); - + reasonable = GetDvarInt( "bots_loadout_reasonable" ); + id = level.tbl_weaponIDs[level.weaponReferenceToIndex[weapon]]; - atts = strtok(id["attachment"], " "); + atts = strtok( id["attachment"], " " ); atts[atts.size] = "none"; - - for(;;) + + for ( ;; ) { - att = atts[randomInt(atts.size)]; - - if(reasonable) + att = atts[randomInt( atts.size )]; + + if ( reasonable ) { - switch(att) + switch ( att ) { case "acog": - if(weapon != "m40a3") + if ( weapon != "m40a3" ) continue; + break; } } - + return att; } } @@ -654,33 +675,34 @@ get_random_attachment(weapon, rank) /* Returns a random perk for the bot. */ -get_random_perk(perkslot, rank, att1, att2) +get_random_perk( perkslot, rank, att1, att2 ) { - if(isDefined(att1) && isDefined(att2) && (att1 == "grip" || att1 == "gl" || att2 == "grip" || att2 == "gl")) + if ( isDefined( att1 ) && isDefined( att2 ) && ( att1 == "grip" || att1 == "gl" || att2 == "grip" || att2 == "gl" ) ) return "specialty_null"; - - reasonable = GetDvarInt("bots_loadout_reasonable"); - op = GetDvarInt("bots_loadout_allow_op"); - - keys = getArrayKeys(level.tbl_PerkData); - for(;;) + + 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"])) + id = level.tbl_PerkData[keys[randomInt( keys.size )]]; + + if ( !isDefined( id ) || !isDefined( id["perk_num"] ) ) continue; - - if(perkslot != id["perk_num"]) + + if ( perkslot != id["perk_num"] ) continue; - + ref = id["reference_full"]; - - if(ref == "specialty_null" && randomInt(100) < 95) + + if ( ref == "specialty_null" && randomInt( 100 ) < 95 ) continue; - - if(reasonable) + + if ( reasonable ) { - switch(ref) + switch ( ref ) { case "specialty_parabolic": case "specialty_holdbreath": @@ -689,10 +711,10 @@ get_random_perk(perkslot, rank, att1, att2) continue; } } - - if(!op) + + if ( !op ) { - switch(ref) + switch ( ref ) { case "specialty_armorvest": case "specialty_pistoldeath": @@ -700,10 +722,10 @@ get_random_perk(perkslot, rank, att1, att2) continue; } } - - if(!isItemUnlocked(ref, rank)) + + if ( !isItemUnlocked( ref, rank ) ) continue; - + return ref; } } @@ -711,31 +733,31 @@ get_random_perk(perkslot, rank, att1, att2) /* Returns a random grenade for the bot. */ -get_random_grenade(perk1) +get_random_grenade( perk1 ) { possibles = []; possibles[0] = "flash_grenade"; possibles[1] = "smoke_grenade"; possibles[2] = "concussion_grenade"; - - reasonable = GetDvarInt("bots_loadout_reasonable"); - - for(;;) + + reasonable = GetDvarInt( "bots_loadout_reasonable" ); + + for ( ;; ) { - possible = possibles[randomInt(possibles.size)]; - - if(reasonable) + possible = possibles[randomInt( possibles.size )]; + + if ( reasonable ) { - switch(possible) + switch ( possible ) { case "smoke_grenade": continue; } } - - if(perk1 == "specialty_specialgrenade" && possible == "smoke_grenade") + + if ( perk1 == "specialty_specialgrenade" && possible == "smoke_grenade" ) continue; - + return possible; } } @@ -743,34 +765,36 @@ get_random_grenade(perk1) /* Returns a random weapon for the bot. */ -get_random_weapon(groups, rank) +get_random_weapon( groups, rank ) { - reasonable = GetDvarInt("bots_loadout_reasonable"); - - keys = getArrayKeys(level.tbl_weaponIDs); - for(;;) + reasonable = GetDvarInt( "bots_loadout_reasonable" ); + + keys = getArrayKeys( level.tbl_weaponIDs ); + + for ( ;; ) { - id = level.tbl_weaponIDs[keys[randomInt(keys.size)]]; - - if(!isDefined(id)) + 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--) + + for ( i = groups.size - 1; i >= 0; i-- ) { - if(groups[i] == group) + if ( groups[i] == group ) inGroup = true; } - - if(!inGroup) + + if ( !inGroup ) continue; - + ref = id["reference"]; - - if(reasonable) + + if ( reasonable ) { - switch(ref) + switch ( ref ) { case "skorpion": case "uzi": @@ -784,10 +808,10 @@ get_random_weapon(groups, rank) continue; } } - - if(!isItemUnlocked(ref, rank)) + + if ( !isItemUnlocked( ref, rank ) ) continue; - + return ref; } } @@ -797,28 +821,28 @@ get_random_weapon(groups, rank) */ bot_get_prestige() { - p_dvar = getDvarInt("bots_loadout_prestige"); + p_dvar = getDvarInt( "bots_loadout_prestige" ); p = 0; - if (p_dvar == -1) + if ( p_dvar == -1 ) { - for (i = 0; i < level.players.size; i++) + for ( i = 0; i < level.players.size; i++ ) { player = level.players[i]; - if (!isDefined(player.team)) + if ( !isDefined( player.team ) ) continue; - if (player is_bot()) + if ( player is_bot() ) continue; - p = player getStat( int(tableLookup( "mp/playerStatsTable.csv", 1, "plevel", 0 )) ); + p = player getStat( int( tableLookup( "mp/playerStatsTable.csv", 1, "plevel", 0 ) ) ); break; } } - else if (p_dvar == -2) + else if ( p_dvar == -2 ) { - p = randomInt(12); + p = randomInt( 12 ); } else { @@ -834,24 +858,24 @@ bot_get_prestige() bot_get_rank() { rank = 1; - rank_dvar = getDvarInt("bots_loadout_rank"); + rank_dvar = getDvarInt( "bots_loadout_rank" ); - if (rank_dvar == -1) + 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" ]; @@ -862,7 +886,7 @@ bot_get_rank() } } - if( !human_ranks.size ) + if ( !human_ranks.size ) human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 35, 15, 0, level.maxRank ) ); human_avg = array_average( human_ranks ); @@ -878,10 +902,10 @@ bot_get_rank() 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) + else if ( rank_dvar == 0 ) { rank = Round( random_normal_distribution( 35, 15, 0, level.maxRank ) ); } @@ -898,20 +922,20 @@ bot_get_rank() */ onSpawned() { - self endon("disconnect"); - - for(;;) + self endon( "disconnect" ); + + for ( ;; ) { - self waittill("spawned_player"); - - if(randomInt(100) <= self.pers["bots"]["behavior"]["class"]) + 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")) + if ( getDvarInt( "bots_play_obj" ) ) self thread bot_dom_cap_think(); } } @@ -921,13 +945,13 @@ onSpawned() */ onBotSpawned() { - self endon("disconnect"); - level endon("game_ended"); - - for(;;) + self endon( "disconnect" ); + level endon( "game_ended" ); + + for ( ;; ) { - self waittill("bot_spawned"); - + self waittill( "bot_spawned" ); + self thread start_bot_threads(); } } @@ -937,22 +961,22 @@ onBotSpawned() */ start_bot_threads() { - self endon("disconnect"); - level endon("game_ended"); - self endon("death"); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "death" ); - while(level.inPrematchPeriod) + while ( level.inPrematchPeriod ) wait 0.05; // inventory usage - if (getDvarInt("bots_play_killstreak")) + 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")) + if ( getDvarInt( "bots_play_target_other" ) ) { self thread bot_target_vehicle(); self thread bot_equipment_kill_think(); @@ -965,14 +989,14 @@ start_bot_threads() self thread follow_target(); // camp and follow - if (getDvarInt("bots_play_camp")) + if ( getDvarInt( "bots_play_camp" ) ) { self thread bot_think_follow(); self thread bot_think_camp(); } // nades - if (getDvarInt("bots_play_nade")) + if ( getDvarInt( "bots_play_nade" ) ) { self thread bot_use_tube_think(); self thread bot_use_grenade_think(); @@ -981,7 +1005,7 @@ start_bot_threads() } // obj - if (getDvarInt("bots_play_obj")) + if ( getDvarInt( "bots_play_obj" ) ) { self thread bot_dom_def_think(); self thread bot_dom_spawn_kill_think(); @@ -999,49 +1023,49 @@ start_bot_threads() Increments the number of bots approching the obj, decrements when needed Used for preventing too many bots going to one obj, or unreachable objs */ -bot_inc_bots(obj, unreach) +bot_inc_bots( obj, unreach ) { - level endon("game_ended"); - self endon("bot_inc_bots"); + level endon( "game_ended" ); + self endon( "bot_inc_bots" ); - if (!isDefined(obj)) + if ( !isDefined( obj ) ) return; - - if (!isDefined(obj.bots)) + + 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))) + + ret = self waittill_any_return( "death", "disconnect", "bad_path", "goal", "new_goal" ); + + if ( isDefined( obj ) && ( ret != "bad_path" || !isDefined( unreach ) ) ) obj.bots--; } /* Watches when the bot is touching the obj and calls 'goal' */ -bots_watch_touch_obj(obj) +bots_watch_touch_obj( obj ) { - self endon ("death"); - self endon ("disconnect"); - self endon ("bad_path"); - self endon ("goal"); - self endon ("new_goal"); + self endon ( "death" ); + self endon ( "disconnect" ); + self endon ( "bad_path" ); + self endon ( "goal" ); + self endon ( "new_goal" ); - for (;;) + for ( ;; ) { wait 0.5; - if (!isDefined(obj)) + if ( !isDefined( obj ) ) { - self notify("bad_path"); + self notify( "bad_path" ); return; } - if (self IsTouching(obj)) + if ( self IsTouching( obj ) ) { - self notify("goal"); + self notify( "goal" ); return; } } @@ -1050,7 +1074,7 @@ bots_watch_touch_obj(obj) /* Watches while the obj is being carried, calls 'goal' when complete */ -bot_escort_obj(obj, carrier) +bot_escort_obj( obj, carrier ) { self endon( "death" ); self endon( "disconnect" ); @@ -1058,183 +1082,184 @@ bot_escort_obj(obj, carrier) self endon( "bad_path" ); self endon( "new_goal" ); - for (;;) + for ( ;; ) { wait 0.5; - if (!isDefined(obj)) + if ( !isDefined( obj ) ) break; - if (!isDefined(obj.carrier) || carrier == obj.carrier) + if ( !isDefined( obj.carrier ) || carrier == obj.carrier ) break; } - - self notify("goal"); + + self notify( "goal" ); } /* Watches while the obj is not being carried, calls 'goal' when complete */ -bot_get_obj(obj) +bot_get_obj( obj ) { self endon( "death" ); self endon( "disconnect" ); self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - - for (;;) + + for ( ;; ) { wait 0.5; - if (!isDefined(obj)) + if ( !isDefined( obj ) ) break; - if (isDefined(obj.carrier)) + if ( isDefined( obj.carrier ) ) break; } - - self notify("goal"); + + self notify( "goal" ); } /* bots will defend their site from a planter/defuser */ -bot_defend_site(site) +bot_defend_site( site ) { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - - for (;;) + + for ( ;; ) { wait 0.5; - if (!site isInUse()) + if ( !site isInUse() ) break; } - self notify("bad_path"); + self notify( "bad_path" ); } /* Bots will go plant the bomb */ -bot_go_plant(plant) +bot_go_plant( plant ) { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - for (;;) + for ( ;; ) { wait 1; - if (level.bombPlanted) + if ( level.bombPlanted ) break; - if (self isTouching(plant.trigger)) + if ( self isTouching( plant.trigger ) ) break; } - if(level.bombPlanted) - self notify("bad_path"); + if ( level.bombPlanted ) + self notify( "bad_path" ); else - self notify("goal"); + self notify( "goal" ); } /* Bots will go defuse the bomb */ -bot_go_defuse(plant) +bot_go_defuse( plant ) { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - for (;;) + for ( ;; ) { wait 1; - if (!level.bombPlanted) + if ( !level.bombPlanted ) break; - if (self isTouching(plant.trigger)) + if ( self isTouching( plant.trigger ) ) break; } - if(!level.bombPlanted) - self notify("bad_path"); + if ( !level.bombPlanted ) + self notify( "bad_path" ); else - self notify("goal"); + self notify( "goal" ); } /* Creates a bomb use thread and waits for an output */ -bot_use_bomb_thread(bomb) +bot_use_bomb_thread( bomb ) { - self thread bot_use_bomb(bomb); - self waittill_any("bot_try_use_fail", "bot_try_use_success"); + self thread bot_use_bomb( bomb ); + self waittill_any( "bot_try_use_fail", "bot_try_use_success" ); } /* Waits for the time to call bot_try_use_success or fail */ -bot_bomb_use_time(wait_time) +bot_bomb_use_time( wait_time ) { - level endon("game_ended"); - self endon("death"); - self endon("disconnect"); - self endon("bot_try_use_fail"); - self endon("bot_try_use_success"); - - self waittill("bot_try_use_weapon"); - + level endon( "game_ended" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "bot_try_use_fail" ); + self endon( "bot_try_use_success" ); + + self waittill( "bot_try_use_weapon" ); + wait 0.05; elapsed = 0; - while(wait_time > elapsed) + + while ( wait_time > elapsed ) { wait 0.05;//wait first so waittill can setup elapsed += 0.05; - - if(self InLastStand()) + + if ( self InLastStand() ) { - self notify("bot_try_use_fail"); + self notify( "bot_try_use_fail" ); return;//needed? } } - - self notify("bot_try_use_success"); + + self notify( "bot_try_use_success" ); } /* Bot switches to the bomb weapon */ -bot_use_bomb_weapon(weap) +bot_use_bomb_weapon( weap ) { - level endon("game_ended"); - self endon("death"); - self endon("disconnect"); - + level endon( "game_ended" ); + self endon( "death" ); + self endon( "disconnect" ); + lastWeap = self getCurrentWeapon(); - - if(self getCurrentWeapon() != weap) + + if ( self getCurrentWeapon() != weap ) { self GiveWeapon( weap ); - if (!self ChangeToWeapon(weap)) + if ( !self ChangeToWeapon( weap ) ) { - self notify("bot_try_use_fail"); + self notify( "bot_try_use_fail" ); return; } } @@ -1242,50 +1267,50 @@ bot_use_bomb_weapon(weap) { wait 0.05;//allow a waittill to setup as the notify may happen on the same frame } - - self notify("bot_try_use_weapon"); - ret = self waittill_any_return("bot_try_use_fail", "bot_try_use_success"); - - if(lastWeap != "none") - self thread ChangeToWeapon(lastWeap); + + self notify( "bot_try_use_weapon" ); + ret = self waittill_any_return( "bot_try_use_fail", "bot_try_use_success" ); + + if ( lastWeap != "none" ) + self thread ChangeToWeapon( lastWeap ); else - self takeWeapon(weap); + self takeWeapon( weap ); } /* Bot tries to use the bomb site */ -bot_use_bomb(bomb) +bot_use_bomb( bomb ) { - level endon("game_ended"); + level endon( "game_ended" ); bomb.inUse = true; - + myteam = self.team; - - self BotFreezeControls(true); - - bomb [[bomb.onBeginUse]](self); - + + self BotFreezeControls( true ); + + bomb [[bomb.onBeginUse]]( self ); + self clientClaimTrigger( bomb.trigger ); self.claimTrigger = bomb.trigger; - - self thread bot_bomb_use_time(bomb.useTime / 1000); - self thread bot_use_bomb_weapon(bomb.useWeapon); - - result = self waittill_any_return("death", "disconnect", "bot_try_use_fail", "bot_try_use_success"); - - if (isDefined(self)) + + self thread bot_bomb_use_time( bomb.useTime / 1000 ); + self thread bot_use_bomb_weapon( bomb.useWeapon ); + + result = self waittill_any_return( "death", "disconnect", "bot_try_use_fail", "bot_try_use_success" ); + + if ( isDefined( self ) ) { self.claimTrigger = undefined; - self BotFreezeControls(false); + self BotFreezeControls( false ); } - bomb [[bomb.onEndUse]](myteam, self, (result == "bot_try_use_success")); + bomb [[bomb.onEndUse]]( myteam, self, ( result == "bot_try_use_success" ) ); bomb.trigger releaseClaimedTrigger(); - - if(result == "bot_try_use_success") - bomb [[bomb.onUse]](self); + + if ( result == "bot_try_use_success" ) + bomb [[bomb.onUse]]( self ); bomb.inUse = false; } @@ -1295,14 +1320,14 @@ bot_use_bomb(bomb) */ fire_current_weapon() { - self endon("death"); - self endon("disconnect"); - self endon("weapon_change"); - self endon("stop_firing_weapon"); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "stop_firing_weapon" ); - for (;;) + for ( ;; ) { - self thread BotPressAttack(0.05); + self thread BotPressAttack( 0.05 ); wait 0.1; } } @@ -1312,14 +1337,14 @@ fire_current_weapon() */ fire_c4() { - self endon("death"); - self endon("disconnect"); - self endon("weapon_change"); - self endon("stop_firing_weapon"); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "weapon_change" ); + self endon( "stop_firing_weapon" ); - for (;;) + for ( ;; ) { - self thread BotPressAds(0.05); + self thread BotPressAds( 0.05 ); wait 0.1; } } @@ -1327,65 +1352,65 @@ fire_c4() /* Changes to the weap */ -changeToWeapon(weap) +changeToWeapon( weap ) { - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); - if (!self HasWeapon(weap)) + if ( !self HasWeapon( weap ) ) return false; - self BotChangeToWeapon(weap); + self BotChangeToWeapon( weap ); - if (self GetCurrentWeapon() == weap) + if ( self GetCurrentWeapon() == weap ) return true; - self waittill_any_timeout(5, "weapon_change"); + self waittill_any_timeout( 5, "weapon_change" ); - return (self GetCurrentWeapon() == weap); + return ( self GetCurrentWeapon() == weap ); } /* Bots throw the grenade */ -botThrowGrenade(nade, time) +botThrowGrenade( nade, time ) { - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); - if (!self GetAmmoCount(nade)) + if ( !self GetAmmoCount( nade ) ) return false; - if (nade != "frag_grenade_mp") - self thread BotPressSmoke(time); + if ( nade != "frag_grenade_mp" ) + self thread BotPressSmoke( time ); else - self thread BotPressFrag(time); + self thread BotPressFrag( time ); - ret = self waittill_any_timeout(5, "grenade_fire"); + ret = self waittill_any_timeout( 5, "grenade_fire" ); - return (ret == "grenade_fire"); + return ( ret == "grenade_fire" ); } /* Gets the object thats the closest in the array */ -bot_array_nearest_curorigin(array) +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)) + + for ( i = 0; i < array.size; i++ ) + if ( !isDefined( result ) || DistanceSquared( self.origin, array[i].curorigin ) < DistanceSquared( self.origin, result.curorigin ) ) result = array[i]; - + return result; } /* Clears goal when events death */ -stop_go_target_on_death(tar) +stop_go_target_on_death( tar ) { self endon( "death" ); self endon( "disconnect" ); @@ -1393,7 +1418,7 @@ stop_go_target_on_death(tar) self endon( "bad_path" ); self endon( "goal" ); - tar waittill_either("death", "disconnect"); + tar waittill_either( "death", "disconnect" ); self ClearScriptGoal(); } @@ -1403,23 +1428,23 @@ stop_go_target_on_death(tar) */ bot_think_camp_loop() { - campSpot = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("camp"), 1024))); + campSpot = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "camp" ), 1024 ) ) ); - if (!isDefined(campSpot)) + if ( !isDefined( campSpot ) ) return; - self SetScriptGoal(campSpot.origin, 16); + self SetScriptGoal( campSpot.origin, 16 ); - ret = self waittill_any_return("new_goal", "goal", "bad_path"); + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - if (ret != "new_goal") + if ( ret != "new_goal" ) self ClearScriptGoal(); - if (ret != "goal") + if ( ret != "goal" ) return; - self thread killCampAfterTime(randomIntRange(10,20)); - self CampAtSpot(campSpot.origin, campSpot.origin + AnglesToForward(campSpot.angles) * 2048); + self thread killCampAfterTime( randomIntRange( 10, 20 ) ); + self CampAtSpot( campSpot.origin, campSpot.origin + AnglesToForward( campSpot.angles ) * 2048 ); } /* @@ -1429,15 +1454,15 @@ bot_think_camp() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { - wait randomintrange(4,7); - + wait randomintrange( 4, 7 ); + if ( self HasScriptGoal() || self.bot_lock_goal || self HasScriptAimPos() ) continue; - - if(randomInt(100) > self.pers["bots"]["behavior"]["camp"]) + + if ( randomInt( 100 ) > self.pers["bots"]["behavior"]["camp"] ) continue; self bot_think_camp_loop(); @@ -1447,59 +1472,60 @@ bot_think_camp() /* Kills the camping thread when time */ -killCampAfterTime(time) +killCampAfterTime( time ) { - self endon("death"); - self endon("disconnect"); - self endon("kill_camp_bot"); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "kill_camp_bot" ); wait time + 0.05; self ClearScriptGoal(); self ClearScriptAimPos(); - self notify("kill_camp_bot"); + self notify( "kill_camp_bot" ); } /* Kills the camping thread when ent gone */ -killCampAfterEntGone(ent) +killCampAfterEntGone( ent ) { - self endon("death"); - self endon("disconnect"); - self endon("kill_camp_bot"); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "kill_camp_bot" ); - for (;;) + for ( ;; ) { wait 0.05; - if (!isDefined(ent)) + if ( !isDefined( ent ) ) break; } self ClearScriptGoal(); self ClearScriptAimPos(); - self notify("kill_camp_bot"); + self notify( "kill_camp_bot" ); } /* Camps at the spot */ -CampAtSpot(origin, anglePos) +CampAtSpot( origin, anglePos ) { - self endon("kill_camp_bot"); + self endon( "kill_camp_bot" ); - self SetScriptGoal(origin, 64); - if (isDefined(anglePos)) + self SetScriptGoal( origin, 64 ); + + if ( isDefined( anglePos ) ) { - self SetScriptAimPos(anglePos); + self SetScriptAimPos( anglePos ); } - self waittill("new_goal"); + self waittill( "new_goal" ); self ClearScriptAimPos(); - self notify("kill_camp_bot"); + self notify( "kill_camp_bot" ); } /* @@ -1509,34 +1535,36 @@ 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--) + + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[i]; - if(!player IsPlayerModelOK()) + if ( !player IsPlayerModelOK() ) continue; - if (player == self) + if ( player == self ) continue; - if(!isAlive(player)) + if ( !isAlive( player ) ) continue; - if (player.team != self.team) + if ( player.team != self.team ) continue; - if (DistanceSquared(player.origin, self.origin) > distSq) + if ( DistanceSquared( player.origin, self.origin ) > distSq ) continue; follows[follows.size] = player; } - toFollow = random(follows); - if (!isDefined(toFollow)) + toFollow = random( follows ); + + if ( !isDefined( toFollow ) ) return; - self thread killFollowAfterTime(randomIntRange(10,20)); - self followPlayer(toFollow); + self thread killFollowAfterTime( randomIntRange( 10, 20 ) ); + self followPlayer( toFollow ); } /* @@ -1546,18 +1574,18 @@ bot_think_follow() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { - wait randomIntRange(3,5); - + wait randomIntRange( 3, 5 ); + if ( self HasScriptGoal() || self.bot_lock_goal || self HasScriptAimPos() ) continue; - - if(randomInt(100) > self.pers["bots"]["behavior"]["follow"]) + + if ( randomInt( 100 ) > self.pers["bots"]["behavior"]["follow"] ) continue; - - if (!level.teamBased) + + if ( !level.teamBased ) continue; self bot_think_follow_loop(); @@ -1569,146 +1597,150 @@ bot_think_follow() */ watchForFollowNewGoal() { - self endon("death"); - self endon("disconnect"); - self endon("kill_follow_bot"); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "kill_follow_bot" ); - for (;;) + for ( ;; ) { - self waittill("new_goal"); + self waittill( "new_goal" ); - if (!isDefined(self.bot_was_follow_script_update)) + if ( !isDefined( self.bot_was_follow_script_update ) ) break; } self ClearScriptAimPos(); - self notify("kill_follow_bot"); + self notify( "kill_follow_bot" ); } /* Kills follow when time */ -killFollowAfterTime(time) +killFollowAfterTime( time ) { - self endon("death"); - self endon("disconnect"); - self endon("kill_follow_bot"); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "kill_follow_bot" ); wait time; self ClearScriptGoal(); self ClearScriptAimPos(); - self notify("kill_follow_bot"); + self notify( "kill_follow_bot" ); } /* Determine bot to follow a player */ -followPlayer(who) +followPlayer( who ) { - self endon("kill_follow_bot"); + self endon( "kill_follow_bot" ); self thread watchForFollowNewGoal(); - for (;;) + for ( ;; ) { wait 0.05; - if (!isDefined(who) || !isAlive(who)) + if ( !isDefined( who ) || !isAlive( who ) ) break; - self SetScriptAimPos(who.origin + (0, 0, 42)); + self SetScriptAimPos( who.origin + ( 0, 0, 42 ) ); myGoal = self GetScriptGoal(); - if (isDefined(myGoal) && DistanceSquared(myGoal, who.origin) < 64*64) + if ( isDefined( myGoal ) && DistanceSquared( myGoal, who.origin ) < 64 * 64 ) continue; - + self.bot_was_follow_script_update = true; - self SetScriptGoal(who.origin, 32); + self SetScriptGoal( who.origin, 32 ); waittillframeend; self.bot_was_follow_script_update = undefined; - self waittill_either("goal", "bad_path"); + self waittill_either( "goal", "bad_path" ); } self ClearScriptGoal(); self ClearScriptAimPos(); - self notify("kill_follow_bot"); + self notify( "kill_follow_bot" ); } /* Bots thinking of using a noobtube */ -bot_use_tube_think_loop(data) +bot_use_tube_think_loop( data ) { - if (data.doFastContinue) + if ( data.doFastContinue ) data.doFastContinue = false; else { - wait randomintRange(3, 7); + wait randomintRange( 3, 7 ); chance = self.pers["bots"]["behavior"]["nade"] / 2; - if (chance > 20) + + if ( chance > 20 ) chance = 20; - if (randomInt(100) > chance) + if ( randomInt( 100 ) > chance ) return; } tube = self getValidTube(); - if (!isDefined(tube)) + + if ( !isDefined( tube ) ) return; - if (self HasThreat() || self HasScriptAimPos()) + if ( self HasThreat() || self HasScriptAimPos() ) return; - if(self BotIsFrozen()) + if ( self BotIsFrozen() ) return; - if (self IsBotFragging() || self IsBotSmoking()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self IsBotFragging() || self IsBotSmoking() ) return; - if (self InLastStand()) + if ( self isDefusing() || self isPlanting() ) + return; + + if ( self InLastStand() ) return; loc = undefined; - if (!self nearAnyOfWaypoints(128, getWaypointsOfType("tube"))) + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "tube" ) ) ) { - tubeWp = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("tube"), 1024))); - + tubeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "tube" ), 1024 ) ) ); + myEye = self GetEye(); - if (!isDefined(tubeWp) || self HasScriptGoal() || self.bot_lock_goal) + + if ( !isDefined( tubeWp ) || self HasScriptGoal() || self.bot_lock_goal ) { - traceForward = BulletTrace(myEye, myEye + AnglesToForward(self GetPlayerAngles()) * 900 * 5, false, self); + 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) + 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)) + 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)) + if ( !bulletTracePassed( loc + ( 0, 0, 5 ), loc + ( 0, 0, 2048 ), false, self ) ) return; - loc += (0, 0, dist/16000); + loc += ( 0, 0, dist / 16000 ); } else { - self SetScriptGoal(tubeWp.origin, 16); + self SetScriptGoal( tubeWp.origin, 16 ); - ret = self waittill_any_return("new_goal", "goal", "bad_path"); + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - if (ret != "new_goal") + if ( ret != "new_goal" ) self ClearScriptGoal(); - if (ret != "goal") + if ( ret != "goal" ) return; data.doFastContinue = true; @@ -1717,26 +1749,26 @@ bot_use_tube_think_loop(data) } else { - tubeWp = getWaypointForIndex(self getNearestWaypointOfWaypoints(getWaypointsOfType("tube"))); - loc = tubeWp.origin + AnglesToForward(tubeWp.angles) * 2048; + tubeWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "tube" ) ) ); + loc = tubeWp.origin + AnglesToForward( tubeWp.angles ) * 2048; } - if (!isDefined(loc)) + if ( !isDefined( loc ) ) return; - self SetScriptAimPos(loc); - self BotStopMoving(true); + self SetScriptAimPos( loc ); + self BotStopMoving( true ); wait 1; - if (self changeToWeapon(tube)) + if ( self changeToWeapon( tube ) ) { self thread fire_current_weapon(); - self waittill_any_timeout(5, "missile_fire", "weapon_change"); - self notify("stop_firing_weapon"); + self waittill_any_timeout( 5, "missile_fire", "weapon_change" ); + self notify( "stop_firing_weapon" ); } self ClearScriptAimPos(); - self BotStopMoving(false); + self BotStopMoving( false ); } /* @@ -1744,122 +1776,127 @@ bot_use_tube_think_loop(data) */ bot_use_tube_think() { - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); data = spawnStruct(); data.doFastContinue = false; - for (;;) + for ( ;; ) { - self bot_use_tube_think_loop(data); + self bot_use_tube_think_loop( data ); } } /* Bots thinking of using claymores */ -bot_use_equipment_think_loop(data) +bot_use_equipment_think_loop( data ) { - if (data.doFastContinue) + if ( data.doFastContinue ) data.doFastContinue = false; else { - wait randomintRange(2, 4); + wait randomintRange( 2, 4 ); chance = self.pers["bots"]["behavior"]["nade"] / 2; - if (chance > 20) + + if ( chance > 20 ) chance = 20; - if (randomInt(100) > chance) + if ( randomInt( 100 ) > chance ) return; } nade = undefined; - if (self GetAmmoCount("claymore_mp")) + + if ( self GetAmmoCount( "claymore_mp" ) ) nade = "claymore_mp"; - if (self GetAmmoCount("c4_mp")) + + if ( self GetAmmoCount( "c4_mp" ) ) nade = "c4_mp"; - - if (!isDefined(nade)) + + if ( !isDefined( nade ) ) return; - if (self HasThreat() || self HasScriptAimPos()) + if ( self HasThreat() || self HasScriptAimPos() ) return; - if(self BotIsFrozen()) - return; - - if(self IsBotFragging() || self IsBotSmoking()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) return; - if (self inLastStand()) + if ( self IsBotFragging() || self IsBotSmoking() ) + return; + + if ( self isDefusing() || self isPlanting() ) + return; + + if ( self inLastStand() ) return; curWeap = self GetCurrentWeapon(); - if (curWeap == "none" || !isWeaponDroppable(curWeap)) + + if ( curWeap == "none" || !isWeaponDroppable( curWeap ) ) curWeap = self.lastDroppableWeapon; loc = undefined; - if (!self nearAnyOfWaypoints(128, getWaypointsOfType("claymore"))) + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "claymore" ) ) ) { - clayWp = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("claymore"), 1024))); - - if (!isDefined(clayWp) || self HasScriptGoal() || self.bot_lock_goal) + 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; + loc = myEye + AnglesToForward( self GetPlayerAngles() ) * 256; - if (!bulletTracePassed(myEye, loc, false, self)) + if ( !bulletTracePassed( myEye, loc, false, self ) ) return; } else { - self SetScriptGoal(clayWp.origin, 16); + self SetScriptGoal( clayWp.origin, 16 ); - ret = self waittill_any_return("new_goal", "goal", "bad_path"); + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - if (ret != "new_goal") + if ( ret != "new_goal" ) self ClearScriptGoal(); - if (ret != "goal") + if ( ret != "goal" ) return; - + data.doFastContinue = true; return; } } else { - clayWp = getWaypointForIndex(self getNearestWaypointOfWaypoints(getWaypointsOfType("claymore"))); - loc = clayWp.origin + AnglesToForward(clayWp.angles) * 2048; + clayWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "claymore" ) ) ); + loc = clayWp.origin + AnglesToForward( clayWp.angles ) * 2048; } - if (!isDefined(loc)) + if ( !isDefined( loc ) ) return; - self SetScriptAimPos(loc); - self BotStopMoving(true); + self SetScriptAimPos( loc ); + self BotStopMoving( true ); wait 1; - if (self changeToWeapon(nade)) + if ( self changeToWeapon( nade ) ) { - if (nade != "c4_mp") + if ( nade != "c4_mp" ) self thread fire_current_weapon(); else self thread fire_c4(); - self waittill_any_timeout(5, "grenade_fire", "weapon_change"); - self notify("stop_firing_weapon"); + + self waittill_any_timeout( 5, "grenade_fire", "weapon_change" ); + self notify( "stop_firing_weapon" ); } - self thread changeToWeapon(curWeap); + self thread changeToWeapon( curWeap ); self ClearScriptAimPos(); - self BotStopMoving(false); + self BotStopMoving( false ); } /* @@ -1867,91 +1904,95 @@ bot_use_equipment_think_loop(data) */ bot_use_equipment_think() { - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); data = spawnStruct(); data.doFastContinue = false; - for (;;) + for ( ;; ) { - self bot_use_equipment_think_loop(data); + self bot_use_equipment_think_loop( data ); } } /* Bots thinking of using grenades */ -bot_use_grenade_think_loop(data) +bot_use_grenade_think_loop( data ) { - if (data.doFastContinue) + if ( data.doFastContinue ) data.doFastContinue = false; else { - wait randomintRange(4, 7); + wait randomintRange( 4, 7 ); chance = self.pers["bots"]["behavior"]["nade"] / 2; - if (chance > 20) + + if ( chance > 20 ) chance = 20; - if (randomInt(100) > chance) + if ( randomInt( 100 ) > chance ) return; } nade = self getValidGrenade(); - if (!isDefined(nade)) + + if ( !isDefined( nade ) ) return; - if (self HasThreat() || self HasScriptAimPos()) + if ( self HasThreat() || self HasScriptAimPos() ) return; - if(self BotIsFrozen()) - return; - - if(self IsBotFragging() || self IsBotSmoking()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) return; - if (self inLastStand()) + if ( self IsBotFragging() || self IsBotSmoking() ) + return; + + if ( self isDefusing() || self isPlanting() ) + return; + + if ( self inLastStand() ) return; loc = undefined; - if (!self nearAnyOfWaypoints(128, getWaypointsOfType("grenade"))) + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "grenade" ) ) ) { - nadeWp = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("grenade"), 1024))); + nadeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "grenade" ), 1024 ) ) ); myEye = self GetEye(); - if (!isDefined(nadeWp) || self HasScriptGoal() || self.bot_lock_goal) + + if ( !isDefined( nadeWp ) || self HasScriptGoal() || self.bot_lock_goal ) { - traceForward = BulletTrace(myEye, myEye + AnglesToForward(self GetPlayerAngles()) * 900, false, self); + 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) + 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)) + 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)) + if ( !bulletTracePassed( loc + ( 0, 0, 5 ), loc + ( 0, 0, 2048 ), false, self ) ) return; - loc += (0, 0, dist/3000); + loc += ( 0, 0, dist / 3000 ); } else { - self SetScriptGoal(nadeWp.origin, 16); + self SetScriptGoal( nadeWp.origin, 16 ); - ret = self waittill_any_return("new_goal", "goal", "bad_path"); + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - if (ret != "new_goal") + if ( ret != "new_goal" ) self ClearScriptGoal(); - if (ret != "goal") + if ( ret != "goal" ) return; data.doFastContinue = true; @@ -1960,24 +2001,26 @@ bot_use_grenade_think_loop(data) } else { - nadeWp = getWaypointForIndex(self getNearestWaypointOfWaypoints(getWaypointsOfType("grenade"))); - loc = nadeWp.origin + AnglesToForward(nadeWp.angles) * 2048; + nadeWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "grenade" ) ) ); + loc = nadeWp.origin + AnglesToForward( nadeWp.angles ) * 2048; } - if (!isDefined(loc)) + if ( !isDefined( loc ) ) return; - self SetScriptAimPos(loc); - self BotStopMoving(true); + self SetScriptAimPos( loc ); + self BotStopMoving( true ); wait 1; time = 0.5; - if (nade == "frag_grenade_mp") + + if ( nade == "frag_grenade_mp" ) time = 2; - self botThrowGrenade(nade, time); + + self botThrowGrenade( nade, time ); self ClearScriptAimPos(); - self BotStopMoving(false); + self BotStopMoving( false ); } /* @@ -1985,16 +2028,16 @@ bot_use_grenade_think_loop(data) */ bot_use_grenade_think() { - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); data = spawnStruct(); data.doFastContinue = false; - for (;;) + for ( ;; ) { - self bot_use_grenade_think_loop(data); + self bot_use_grenade_think_loop( data ); } } @@ -2005,16 +2048,17 @@ follow_target_loop() { threat = self GetThreat(); - if (!isPlayer(threat)) + if ( !isPlayer( threat ) ) return; - if(randomInt(100) > self.pers["bots"]["behavior"]["follow"]*5) + if ( randomInt( 100 ) > self.pers["bots"]["behavior"]["follow"] * 5 ) return; - self thread stop_go_target_on_death(threat); + self thread stop_go_target_on_death( threat ); - self SetScriptGoal(threat.origin, 64); - if (self waittill_any_return("new_goal", "goal", "bad_path") != "new_goal") + self SetScriptGoal( threat.origin, 64 ); + + if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" ) self ClearScriptGoal(); } @@ -2025,14 +2069,14 @@ follow_target() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { wait 1; - + if ( self HasScriptGoal() || self.bot_lock_goal ) continue; - + if ( !self HasThreat() ) continue; @@ -2046,55 +2090,61 @@ follow_target() bot_listen_to_steps_loop() { dist = level.bots_listenDist; - if(self hasPerk("specialty_parabolic")) + + if ( self hasPerk( "specialty_parabolic" ) ) dist *= 1.4; - + dist *= dist; - + heard = undefined; - for(i = level.players.size-1 ; i >= 0; i--) + + for ( i = level.players.size - 1 ; i >= 0; i-- ) { player = level.players[i]; - - if(!player IsPlayerModelOK()) + + if ( !player IsPlayerModelOK() ) continue; - - if(player == self) + + if ( player == self ) continue; - if(level.teamBased && self.team == player.team) + + if ( level.teamBased && self.team == player.team ) continue; - if(player.sessionstate != "playing") + + if ( player.sessionstate != "playing" ) continue; - if(!isAlive(player)) + + if ( !isAlive( player ) ) continue; - if(player hasPerk("specialty_quieter")) + + if ( player hasPerk( "specialty_quieter" ) ) continue; - - if(lengthsquared( player getVelocity() ) < 20000) + + if ( lengthsquared( player getVelocity() ) < 20000 ) continue; - - if(distanceSquared(player.origin, self.origin) > dist) + + if ( distanceSquared( player.origin, self.origin ) > dist ) continue; - + heard = player; break; } - - if(!IsDefined(heard)) + + if ( !IsDefined( heard ) ) return; - - if(bulletTracePassed(self getEyePos(), heard getTagOrigin( "j_spineupper" ), false, heard)) + + if ( bulletTracePassed( self getEyePos(), heard getTagOrigin( "j_spineupper" ), false, heard ) ) { - self setAttacker(heard); + self setAttacker( heard ); return; } - if(self HasScriptGoal() || self.bot_lock_goal) + 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") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); } @@ -2103,16 +2153,16 @@ bot_listen_to_steps_loop() */ bot_listen_to_steps() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 1; - - if(self.pers["bots"]["skill"]["base"] < 3) + + if ( self.pers["bots"]["skill"]["base"] < 3 ) continue; - + self bot_listen_to_steps_loop(); } } @@ -2124,36 +2174,36 @@ bot_revenge_think() { self endon( "death" ); self endon( "disconnect" ); - - if(self.pers["bots"]["skill"]["base"] <= 1) + + if ( self.pers["bots"]["skill"]["base"] <= 1 ) return; - if (isDefined(self.lastKiller) && isAlive(self.lastKiller)) + if ( isDefined( self.lastKiller ) && isAlive( self.lastKiller ) ) { - if(bulletTracePassed(self getEyePos(), self.lastKiller getTagOrigin( "j_spineupper" ), false, self.lastKiller)) + if ( bulletTracePassed( self getEyePos(), self.lastKiller getTagOrigin( "j_spineupper" ), false, self.lastKiller ) ) { - self setAttacker(self.lastKiller); + self setAttacker( self.lastKiller ); } } - - if(!isDefined(self.killerLocation)) + + if ( !isDefined( self.killerLocation ) ) return; loc = self.killerLocation; - - for(;;) + + for ( ;; ) { wait( RandomIntRange( 1, 5 ) ); - - if(self HasScriptGoal() || self.bot_lock_goal) + + if ( self HasScriptGoal() || self.bot_lock_goal ) return; - + if ( randomint( 100 ) < 75 ) return; - + self SetScriptGoal( loc, 64 ); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); } } @@ -2163,59 +2213,60 @@ bot_revenge_think() */ doReloadCancel_loop() { - ret = self waittill_any_return("reload", "weapon_change"); + ret = self waittill_any_return( "reload", "weapon_change" ); - if(self BotIsFrozen()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) return; - if (self InLastStand()) + 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 )) + if ( !maps\mp\gametypes\_weapons::isSideArm( curWeap ) && !maps\mp\gametypes\_weapons::isPrimaryWeapon( curWeap ) ) return; - if (ret == "reload") + if ( ret == "reload" ) { // check single reloads - if (self GetWeaponAmmoClip(curWeap) < WeaponClipSize(curWeap)) + if ( self GetWeaponAmmoClip( curWeap ) < WeaponClipSize( curWeap ) ) return; } // check difficulty - if (self.pers["bots"]["skill"]["base"] <= 3) + if ( self.pers["bots"]["skill"]["base"] <= 3 ) return; // check if got another weapon weaponslist = self GetWeaponsListPrimaries(); weap = ""; - while(weaponslist.size) + + 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 )) + 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 == "") + + if ( curWeap == weapon || weapon == "none" || weapon == "" ) continue; - + weap = weapon; break; } - - if(weap == "") + + if ( weap == "" ) return; // do the cancel wait 0.1; - self thread ChangeToWeapon(weap); + self thread ChangeToWeapon( weap ); wait 0.25; - self thread ChangeToWeapon(curWeap); + self thread ChangeToWeapon( curWeap ); wait 2; } @@ -2224,10 +2275,10 @@ doReloadCancel_loop() */ doReloadCancel() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - for (;;) + for ( ;; ) { self doReloadCancel_loop(); } @@ -2236,77 +2287,79 @@ doReloadCancel() /* Bot logic for switching weapons. */ -bot_weapon_think_loop(data) +bot_weapon_think_loop( data ) { - self waittill_any_timeout(randomIntRange(2, 4), "bot_force_check_switch"); + self waittill_any_timeout( randomIntRange( 2, 4 ), "bot_force_check_switch" ); - if(self BotIsFrozen()) + if ( self BotIsFrozen() ) return; - - if(self isDefusing() || self isPlanting() || self InLastStand()) + + if ( self isDefusing() || self isPlanting() || self InLastStand() ) return; - + hasTarget = self hasThreat(); curWeap = self GetCurrentWeapon(); - - if(hasTarget) + + if ( hasTarget ) { threat = self getThreat(); - - if(threat.classname == "script_vehicle" && self getAmmoCount("rpg_mp")) + + if ( threat.classname == "script_vehicle" && self getAmmoCount( "rpg_mp" ) ) { - if (curWeap != "rpg_mp") - self thread ChangeToWeapon("rpg_mp"); + if ( curWeap != "rpg_mp" ) + self thread ChangeToWeapon( "rpg_mp" ); + return; } } - - if (data.first) + + if ( data.first ) { data.first = false; - if(randomInt(100) > self.pers["bots"]["behavior"]["initswitch"]) + if ( randomInt( 100 ) > self.pers["bots"]["behavior"]["initswitch"] ) return; } else { - if(curWeap != "none" && self getAmmoCount(curWeap)) + if ( curWeap != "none" && self getAmmoCount( curWeap ) ) { - if(randomInt(100) > self.pers["bots"]["behavior"]["switch"]) + if ( randomInt( 100 ) > self.pers["bots"]["behavior"]["switch"] ) return; - - if(hasTarget) + + if ( hasTarget ) return; } } - + weaponslist = self getweaponslist(); weap = ""; - while(weaponslist.size) + + while ( weaponslist.size ) { - weapon = weaponslist[randomInt(weaponslist.size)]; - weaponslist = array_remove(weaponslist, weapon); - - if(!self getAmmoCount(weapon)) + weapon = weaponslist[randomInt( weaponslist.size )]; + weaponslist = array_remove( weaponslist, weapon ); + + if ( !self getAmmoCount( weapon ) ) continue; - - if (maps\mp\gametypes\_weapons::isHackWeapon( weapon )) + + if ( maps\mp\gametypes\_weapons::isHackWeapon( weapon ) ) continue; - - if (maps\mp\gametypes\_weapons::isGrenade( weapon )) + + if ( maps\mp\gametypes\_weapons::isGrenade( weapon ) ) continue; - - if(curWeap == weapon || weapon == "c4_mp" || weapon == "none" || weapon == "claymore_mp" || weapon == "") + + if ( curWeap == weapon || weapon == "c4_mp" || weapon == "none" || weapon == "claymore_mp" || weapon == "" ) continue; - + weap = weapon; break; } - - if(weap == "") + + if ( weap == "" ) return; - - self thread ChangeToWeapon(weap); + + self thread ChangeToWeapon( weap ); } /* @@ -2314,16 +2367,16 @@ bot_weapon_think_loop(data) */ bot_weapon_think() { - self endon("death"); - self endon("disconnect"); - level endon("game_ended"); + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); data = spawnStruct(); data.first = true; - - for(;;) + + for ( ;; ) { - self bot_weapon_think_loop(data); + self bot_weapon_think_loop( data ); } } @@ -2333,23 +2386,24 @@ bot_weapon_think() bot_watch_think_mw2_loop() { tube = self getValidTube(); - if (!isDefined(tube)) + + if ( !isDefined( tube ) ) { - if (self GetAmmoCount("rpg_mp")) + if ( self GetAmmoCount( "rpg_mp" ) ) tube = "rpg_mp"; else return; } - if (self GetCurrentWeapon() == tube) + if ( self GetCurrentWeapon() == tube ) return; chance = self.pers["bots"]["behavior"]["nade"]; - if (randomInt(100) > chance) + if ( randomInt( 100 ) > chance ) return; - self thread ChangeToWeapon(tube); + self thread ChangeToWeapon( tube ); } /* @@ -2357,24 +2411,24 @@ bot_watch_think_mw2_loop() */ bot_watch_think_mw2() { - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); - for (;;) + for ( ;; ) { - wait randomIntRange(1, 4); + wait randomIntRange( 1, 4 ); - if(self BotIsFrozen()) - continue; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) continue; - if (self InLastStand()) + if ( self isDefusing() || self isPlanting() ) continue; - if (self HasThreat()) + if ( self InLastStand() ) + continue; + + if ( self HasThreat() ) continue; self bot_watch_think_mw2_loop(); @@ -2387,97 +2441,109 @@ bot_watch_think_mw2() bot_killstreak_think_loop() { curWeap = self GetCurrentWeapon(); - if (curWeap == "none" || !isWeaponDroppable(curWeap)) + + if ( curWeap == "none" || !isWeaponDroppable( curWeap ) ) curWeap = self.lastDroppableWeapon; - + targetPos = undefined; - switch(self.pers["hardPointItem"]) + + switch ( self.pers["hardPointItem"] ) { case "radar_mp": - if(self.bot_radar && self.pers["bots"]["skill"]["base"] > 3) + if ( self.bot_radar && self.pers["bots"]["skill"]["base"] > 3 ) return; + break; - + case "helicopter_mp": chopper = level.chopper; - if (isDefined(chopper) && level.teamBased && getDvarInt("doubleHeli")) + if ( isDefined( chopper ) && level.teamBased && getDvarInt( "doubleHeli" ) ) chopper = level.chopper[self.team]; - if (isDefined(chopper)) + if ( isDefined( chopper ) ) return; - if (isDefined( level.mannedchopper )) + if ( isDefined( level.mannedchopper ) ) return; break; - + case "airstrike_mp": - if(isDefined( level.airstrikeInProgress )) + if ( isDefined( level.airstrikeInProgress ) ) return; - + players = []; - for(i = level.players.size - 1; i >= 0; i--) + + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[i]; - if(!player IsPlayerModelOK()) + if ( !player IsPlayerModelOK() ) continue; - - if(player == self) + + if ( player == self ) continue; - if(!isDefined(player.team)) + + if ( !isDefined( player.team ) ) continue; - if(level.teamBased && self.team == player.team) + + if ( level.teamBased && self.team == player.team ) continue; - if(player.sessionstate != "playing") + + if ( player.sessionstate != "playing" ) continue; - if(!isAlive(player)) + + if ( !isAlive( player ) ) continue; - if(player hasPerk("specialty_gpsjammer")) + + if ( player hasPerk( "specialty_gpsjammer" ) ) continue; - if(!bulletTracePassed(player.origin, player.origin+(0,0,512), false, player) && self.pers["bots"]["skill"]["base"] > 3) + + 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); - else if(self.pers["bots"]["skill"]["base"] <= 3) - targetPos = self.origin + (randomIntRange(-512, 512), randomIntRange(-512, 512), 0); + + 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 ); + else if ( self.pers["bots"]["skill"]["base"] <= 3 ) + targetPos = self.origin + ( randomIntRange( -512, 512 ), randomIntRange( -512, 512 ), 0 ); + break; default: return; } - - isAirstrikePos = isDefined(targetPos); - if(self.pers["hardPointItem"] == "airstrike_mp" && !isAirstrikePos) + + isAirstrikePos = isDefined( targetPos ); + + if ( self.pers["hardPointItem"] == "airstrike_mp" && !isAirstrikePos ) return; - self BotStopMoving(true); - - if (self changeToWeapon(self.pers["hardPointItem"])) + self BotStopMoving( true ); + + if ( self changeToWeapon( self.pers["hardPointItem"] ) ) { wait 1; - if (isAirstrikePos && !isDefined( level.airstrikeInProgress )) + if ( isAirstrikePos && !isDefined( level.airstrikeInProgress ) ) { - self BotFreezeControls(true); + self BotFreezeControls( true ); self notify( "confirm_location", targetPos ); wait 1; - self BotFreezeControls(false); + self BotFreezeControls( false ); } - self thread changeToWeapon(curWeap); + self thread changeToWeapon( curWeap ); } - self BotStopMoving(false); + self BotStopMoving( false ); } /* @@ -2485,24 +2551,24 @@ bot_killstreak_think_loop() */ bot_killstreak_think() { - self endon("death"); - self endon("disconnect"); - level endon("game_ended"); - - for(;;) + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + + for ( ;; ) { - wait randomIntRange(1, 3); - - if(self BotIsFrozen()) + wait randomIntRange( 1, 3 ); + + if ( self BotIsFrozen() ) continue; - - if(!isDefined(self.pers["hardPointItem"])) + + if ( !isDefined( self.pers["hardPointItem"] ) ) continue; - - if(self HasThreat()) + + if ( self HasThreat() ) continue; - - if(self isDefusing() || self isPlanting() || self InLastStand()) + + if ( self isDefusing() || self isPlanting() || self InLastStand() ) continue; self bot_killstreak_think_loop(); @@ -2516,49 +2582,52 @@ 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()) + if ( !player IsPlayerModelOK() ) continue; - - if(player == self) + + if ( player == self ) continue; - - if(!isDefined(player.team)) + + if ( !isDefined( player.team ) ) continue; - - if(player.sessionstate != "playing") + + if ( player.sessionstate != "playing" ) continue; - - if(level.teambased && player.team == self.team) + + if ( level.teambased && player.team == self.team ) continue; - - if(!isAlive(player)) + + if ( !isAlive( player ) ) continue; - - distFromPlayer = DistanceSquared(self.origin, player.origin); - if(distFromPlayer > dist) + + 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"))) + + if ( ( !isSubStr( player getCurrentWeapon(), "_silencer_" ) && player.bots_firing ) || ( self.bot_radar && !player hasPerk( "specialty_gpsjammer" ) ) ) { 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)) + + if ( distFromPlayer < distSq && bulletTracePassed( self getEyePos(), player getTagOrigin( "j_spineupper" ), false, player ) ) { - self SetAttacker(player); + self SetAttacker( player ); } - if (!self HasScriptGoal() && !self.bot_lock_goal) + if ( !self HasScriptGoal() && !self.bot_lock_goal ) { - self thread stop_go_target_on_death(player); + self thread stop_go_target_on_death( player ); self SetScriptGoal( player.origin, 128 ); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); } + break; } } @@ -2571,17 +2640,17 @@ bot_uav_think() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { wait 0.75; - - if(self.pers["bots"]["skill"]["base"] <= 1) + + if ( self.pers["bots"]["skill"]["base"] <= 1 ) continue; - - if( level.hardcoreMode && !self.bot_radar ) + + if ( level.hardcoreMode && !self.bot_radar ) continue; - + self bot_uav_think_loop(); } } @@ -2593,30 +2662,30 @@ bot_target_vehicle_loop() { chopper = level.chopper; - if(isDefined(chopper) && level.teamBased && getDvarInt("doubleHeli")) + if ( isDefined( chopper ) && level.teamBased && getDvarInt( "doubleHeli" ) ) { chopper = level.chopper[ level.otherTeam[self.team] ]; } - if (!isdefined(chopper)) + if ( !isdefined( chopper ) ) return; - - if(!isDefined(level.bot_chopper) || !level.bot_chopper)//must be crashing or leaving + + if ( !isDefined( level.bot_chopper ) || !level.bot_chopper ) //must be crashing or leaving return; - - if(isDefined(chopper.owner) && chopper.owner == self) + + if ( isDefined( chopper.owner ) && chopper.owner == self ) return; - - if(chopper.team == self.team && level.teamBased) + + if ( chopper.team == self.team && level.teamBased ) return; - - if(!bulletTracePassed( self getEyePos(), chopper.origin + (0, 0, -5), false, chopper )) + + if ( !bulletTracePassed( self getEyePos(), chopper.origin + ( 0, 0, -5 ), false, chopper ) ) return; - - self SetScriptEnemy( chopper, (0, 0, -5) ); - self bot_attack_vehicle(chopper); + + self SetScriptEnemy( chopper, ( 0, 0, -5 ) ); + self bot_attack_vehicle( chopper ); self ClearScriptEnemy(); - self notify("bot_force_check_switch"); + self notify( "bot_force_check_switch" ); } /* @@ -2626,18 +2695,18 @@ bot_target_vehicle() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { wait( RandomIntRange( 2, 4 ) ); - if(self.pers["bots"]["skill"]["base"] <= 1) + if ( self.pers["bots"]["skill"]["base"] <= 1 ) continue; - - if(self HasScriptEnemy()) + + if ( self HasScriptEnemy() ) continue; - - if(!self getAmmoCount("rpg_mp") && self BotGetRandom() < 90) + + if ( !self getAmmoCount( "rpg_mp" ) && self BotGetRandom() < 90 ) continue; self bot_target_vehicle_loop(); @@ -2647,17 +2716,17 @@ bot_target_vehicle() /* Bot logic for how long to keep targeting chopper. */ -bot_attack_vehicle(chopper) +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"); + self notify( "bot_force_check_switch" ); wait( 1 ); if ( !IsDefined( chopper ) ) @@ -2676,13 +2745,13 @@ bot_equipment_kill_think_loop() myEye = self getEyePos(); myAngles = self getPlayerAngles(); target = undefined; - hasDetectExp = self hasPerk("specialty_detectexplosive"); + hasDetectExp = self hasPerk( "specialty_detectexplosive" ); for ( i = grenades.size - 1; i >= 0; i-- ) { item = grenades[i]; - if (!isDefined(item)) + if ( !isDefined( item ) ) continue; if ( !IsDefined( item.name ) ) @@ -2690,31 +2759,31 @@ bot_equipment_kill_think_loop() continue; } - if ( IsDefined( item.owner ) && ((level.teamBased && item.owner.team == self.team) || item.owner == self) ) + if ( IsDefined( item.owner ) && ( ( level.teamBased && item.owner.team == self.team ) || item.owner == self ) ) { continue; } - - if (item.name != "c4_mp" && item.name != "claymore_mp") + + if ( item.name != "c4_mp" && item.name != "claymore_mp" ) continue; - - if(!hasDetectExp && !bulletTracePassed(myEye, item.origin+(0, 0, 0), false, item)) + + if ( !hasDetectExp && !bulletTracePassed( myEye, item.origin + ( 0, 0, 0 ), false, item ) ) continue; - - if(getConeDot(item.origin, self.origin, myAngles) < 0.6) + + if ( getConeDot( item.origin, self.origin, myAngles ) < 0.6 ) continue; - + if ( DistanceSquared( item.origin, self.origin ) < 512 * 512 ) { target = item; break; } } - - if(isDefined(target)) + + if ( isDefined( target ) ) { - self SetScriptEnemy( target, (0, 0, 0) ); - self bot_equipment_attack(target); + self SetScriptEnemy( target, ( 0, 0, 0 ) ); + self bot_equipment_attack( target ); self ClearScriptEnemy(); } } @@ -2726,17 +2795,17 @@ bot_equipment_kill_think() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { wait( RandomIntRange( 1, 3 ) ); - - if(self HasScriptEnemy()) + + if ( self HasScriptEnemy() ) continue; - if(self.pers["bots"]["skill"]["base"] <= 1) + if ( self.pers["bots"]["skill"]["base"] <= 1 ) continue; - + self bot_equipment_kill_think_loop(); } } @@ -2744,10 +2813,10 @@ bot_equipment_kill_think() /* How long to keep targeting the equipment. */ -bot_equipment_attack(equ) +bot_equipment_attack( equ ) { - equ endon("death"); - + equ endon( "death" ); + wait_time = RandomIntRange( 7, 10 ); for ( i = 0; i < wait_time; i++ ) @@ -2766,7 +2835,7 @@ bot_equipment_attack(equ) */ bot_dom_spawn_kill_think_loop() { - myTeam = self.pers[ "team" ]; + myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); @@ -2774,11 +2843,12 @@ bot_dom_spawn_kill_think_loop() return; otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); - - if (myFlagCount <= otherFlagCount || otherFlagCount != 1) + + 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 ) @@ -2786,18 +2856,18 @@ bot_dom_spawn_kill_think_loop() flag = level.flags[i]; } - - if(!isDefined(flag)) + + if ( !isDefined( flag ) ) return; - - if(DistanceSquared(self.origin, flag.origin) < 2048*2048) + + if ( DistanceSquared( self.origin, flag.origin ) < 2048 * 2048 ) return; 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 thread bot_dom_watch_flags( myFlagCount, myTeam ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); } @@ -2815,13 +2885,13 @@ bot_dom_spawn_kill_think() for ( ;; ) { wait( randomintrange( 10, 20 ) ); - + if ( randomint( 100 ) < 20 ) continue; - - if ( self HasScriptGoal() || self.bot_lock_goal) + + if ( self HasScriptGoal() || self.bot_lock_goal ) continue; - + self bot_dom_spawn_kill_think_loop(); } } @@ -2829,7 +2899,7 @@ bot_dom_spawn_kill_think() /* Calls 'bad_path' when the flag count changes */ -bot_dom_watch_flags(count, myTeam) +bot_dom_watch_flags( count, myTeam ) { self endon( "death" ); self endon( "disconnect" ); @@ -2837,15 +2907,15 @@ bot_dom_watch_flags(count, myTeam) self endon( "bad_path" ); self endon( "new_goal" ); - for (;;) + for ( ;; ) { wait 0.5; - if (maps\mp\gametypes\dom::getTeamFlagCount( myTeam ) != count) + if ( maps\mp\gametypes\dom::getTeamFlagCount( myTeam ) != count ) break; } - - self notify("bad_path"); + + self notify( "bad_path" ); } /* @@ -2855,27 +2925,28 @@ 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) ) + + if ( !isDefined( flag ) || DistanceSquared( self.origin, level.flags[i].origin ) < DistanceSquared( self.origin, flag.origin ) ) flag = level.flags[i]; } - - if ( !isDefined(flag) ) + + if ( !isDefined( flag ) ) return; 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 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(); } @@ -2893,10 +2964,10 @@ bot_dom_def_think() for ( ;; ) { wait( randomintrange( 1, 3 ) ); - + if ( randomint( 100 ) < 35 ) continue; - + if ( self HasScriptGoal() || self.bot_lock_goal ) continue; @@ -2907,26 +2978,26 @@ bot_dom_def_think() /* Watches while the flag is under capture */ -bot_dom_watch_for_flashing(flag, myTeam) +bot_dom_watch_for_flashing( flag, myTeam ) { self endon( "death" ); self endon( "disconnect" ); self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - - for (;;) + + for ( ;; ) { wait 0.5; - if (!isDefined(flag)) + if ( !isDefined( flag ) ) break; - if (flag maps\mp\gametypes\dom::getFlagTeam() != myTeam || !flag.useObj.objPoints[myTeam].isFlashing) + if ( flag maps\mp\gametypes\dom::getFlagTeam() != myTeam || !flag.useObj.objPoints[myTeam].isFlashing ) break; } - - self notify("bad_path"); + + self notify( "bad_path" ); } /* @@ -2934,7 +3005,7 @@ bot_dom_watch_for_flashing(flag, myTeam) */ bot_dom_cap_think_loop() { - myTeam = self.pers[ "team" ]; + myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); @@ -2944,7 +3015,7 @@ bot_dom_cap_think_loop() otherFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( otherTeam ); - if (game["teamScores"][myteam] >= game["teamScores"][otherTeam]) + if ( game["teamScores"][myteam] >= game["teamScores"][otherTeam] ) { if ( myFlagCount < otherFlagCount ) { @@ -2954,7 +3025,7 @@ bot_dom_cap_think_loop() else if ( myFlagCount == otherFlagCount ) { if ( randomint( 100 ) < 35 ) - return; + return; } else if ( myFlagCount > otherFlagCount ) { @@ -2965,6 +3036,7 @@ 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 ) @@ -2973,51 +3045,51 @@ bot_dom_cap_think_loop() flags[flags.size] = level.flags[i]; } - if (randomInt(100) > 30) + if ( randomInt( 100 ) > 30 ) { for ( i = 0; i < flags.size; i++ ) { - if ( !isDefined(flag) || DistanceSquared(self.origin,level.flags[i].origin) < DistanceSquared(self.origin,flag.origin) ) + if ( !isDefined( flag ) || DistanceSquared( self.origin, level.flags[i].origin ) < DistanceSquared( self.origin, flag.origin ) ) flag = level.flags[i]; } } - else if (flags.size) + else if ( flags.size ) { - flag = random(flags); + flag = random( flags ); } - if ( !isDefined(flag) ) + if ( !isDefined( flag ) ) return; - + self.bot_lock_goal = true; self SetScriptGoal( flag.origin, 64 ); - - self thread bot_dom_go_cap_flag(flag, myteam); + + self thread bot_dom_go_cap_flag( flag, myteam ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") + + if ( event != "new_goal" ) self ClearScriptGoal(); - if (event != "goal") + if ( event != "goal" ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - while ( flag maps\mp\gametypes\dom::getFlagTeam() != myTeam && self isTouching(flag) ) + while ( flag maps\mp\gametypes\dom::getFlagTeam() != myTeam && self isTouching( flag ) ) { cur = flag.useObj.curProgress; wait 0.5; - - if(flag.useObj.curProgress == cur) + + if ( flag.useObj.curProgress == cur ) break;//some enemy is near us, kill him } self ClearScriptGoal(); - + self.bot_lock_goal = false; } @@ -3028,20 +3100,20 @@ 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 ) + if ( !isDefined( level.flags ) || level.flags.size == 0 ) continue; self bot_dom_cap_think_loop(); @@ -3051,32 +3123,32 @@ bot_dom_cap_think() /* Bot goes to the flag, watching while they don't have the flag */ -bot_dom_go_cap_flag(flag, myteam) +bot_dom_go_cap_flag( flag, myteam ) { self endon( "death" ); self endon( "disconnect" ); self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - - for (;;) + + for ( ;; ) { - wait randomintrange(2,4); + wait randomintrange( 2, 4 ); - if (!isDefined(flag)) + if ( !isDefined( flag ) ) break; - if (flag maps\mp\gametypes\dom::getFlagTeam() == myTeam) + if ( flag maps\mp\gametypes\dom::getFlagTeam() == myTeam ) break; - if (self isTouching(flag)) + if ( self isTouching( flag ) ) break; } - - if (flag maps\mp\gametypes\dom::getFlagTeam() == myTeam) - self notify("bad_path"); + + if ( flag maps\mp\gametypes\dom::getFlagTeam() == myTeam ) + self notify( "bad_path" ); else - self notify("goal"); + self notify( "goal" ); } /* @@ -3086,90 +3158,91 @@ 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 ); - + origin = ( radio.origin[0], radio.origin[1], radio.origin[2] + 5 ); + //if neut or enemy - if(gameobj.ownerTeam != myTeam) + if ( gameobj.ownerTeam != myTeam ) { - if(gameobj.interactTeam == "none")//wait for it to become active + if ( gameobj.interactTeam == "none" ) //wait for it to become active { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) return; - + self SetScriptGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } - + //capture it - + self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - self thread bot_hq_go_cap(gameobj, radio); + self thread bot_hq_go_cap( gameobj, radio ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - if (event != "new_goal") + if ( event != "new_goal" ) self ClearScriptGoal(); - - if (event != "goal") + + if ( event != "goal" ) { self.bot_lock_goal = false; return; } - - if(!self isTouching(gameobj.trigger) || level.radio != radio) + + if ( !self isTouching( gameobj.trigger ) || level.radio != radio ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - - while(self isTouching(gameobj.trigger) && gameobj.ownerTeam != myTeam && level.radio == radio) + + while ( self isTouching( gameobj.trigger ) && gameobj.ownerTeam != myTeam && level.radio == radio ) { cur = gameobj.curProgress; wait 0.5; - - if(cur == gameobj.curProgress) + + if ( cur == gameobj.curProgress ) break;//no prog made, enemy must be capping } - + self ClearScriptGoal(); self.bot_lock_goal = false; } else//we own it { - if(gameobj.objPoints[myteam].isFlashing)//underattack + if ( gameobj.objPoints[myteam].isFlashing ) //underattack { 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 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; return; } - - if(self HasScriptGoal()) + + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) return; - + self SetScriptGoal( origin, 256 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); } } @@ -3188,16 +3261,16 @@ bot_hq() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self.bot_lock_goal ) { continue; } - - if(!isDefined(level.radio)) + + if ( !isDefined( level.radio ) ) continue; - - if(!isDefined(level.radio.gameobject)) + + if ( !isDefined( level.radio.gameobject ) ) continue; self bot_hq_loop(); @@ -3207,7 +3280,7 @@ bot_hq() /* Waits until not touching the trigger and it is the current radio. */ -bot_hq_go_cap(obj, radio) +bot_hq_go_cap( obj, radio ) { self endon( "death" ); self endon( "disconnect" ); @@ -3215,54 +3288,54 @@ bot_hq_go_cap(obj, radio) self endon( "bad_path" ); self endon( "new_goal" ); - for (;;) + for ( ;; ) { - wait randomintrange(2,4); + wait randomintrange( 2, 4 ); - if (!isDefined(obj)) + if ( !isDefined( obj ) ) break; - if (self isTouching(obj.trigger)) + if ( self isTouching( obj.trigger ) ) break; - if (level.radio != radio) + if ( level.radio != radio ) break; } - - if(level.radio != radio) - self notify("bad_path"); + + if ( level.radio != radio ) + self notify( "bad_path" ); else - self notify("goal"); + self notify( "goal" ); } /* Waits while the radio is under attack. */ -bot_hq_watch_flashing(obj, radio) +bot_hq_watch_flashing( obj, radio ) { self endon( "death" ); self endon( "disconnect" ); self endon( "goal" ); self endon( "bad_path" ); self endon( "new_goal" ); - + myteam = self.team; - for (;;) + for ( ;; ) { wait 0.5; - if (!isDefined(obj)) + if ( !isDefined( obj ) ) break; - if (!obj.objPoints[myteam].isFlashing) + if ( !obj.objPoints[myteam].isFlashing ) break; - if (level.radio != radio) + if ( level.radio != radio ) break; } - - self notify("bad_path"); + + self notify( "bad_path" ); } /* @@ -3272,181 +3345,188 @@ 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; - + timeleft = maps\mp\gametypes\_globallogic::getTimeRemaining() / 1000; + // the bomb is ours, we are on the offence - if(bombteam == myTeam) + if ( bombteam == myTeam ) { site = level.bombZones[otherTeam]; - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+5 ); - + origin = ( site.curorigin[0] + 50, site.curorigin[1] + 50, site.curorigin[2] + 5 ); + // protect our planted bomb - if(level.bombPlanted) + if ( level.bombPlanted ) { // kill defuser - if(site isInUse()) //somebody is defusing our bomb we planted + if ( site isInUse() ) //somebody is defusing our bomb we planted { 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 thread bot_defend_site( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + self.bot_lock_goal = false; return; } - + //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) + 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") + + 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()) + if ( !self isBombCarrier() ) { // lets escort the bomb carrier - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - + origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + 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 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) + timepassed = maps\mp\gametypes\_globallogic::getTimePassed() / 1000; + + if ( timepassed < 120 && timeleft >= 90 && randomInt( 100 ) < 98 ) return; - + self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); - self thread bot_go_plant(site); + self thread bot_go_plant( site ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - if (event != "new_goal") + if ( event != "new_goal" ) self ClearScriptGoal(); - if(event != "goal" || level.bombPlanted || !self isTouching(site.trigger) || site IsInUse() || self inLastStand() || self HasThreat()) + if ( event != "goal" || level.bombPlanted || !self isTouching( site.trigger ) || site IsInUse() || self inLastStand() || self HasThreat() ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - - self bot_use_bomb_thread(site); + + self bot_use_bomb_thread( site ); wait 1; - + self ClearScriptGoal(); self.bot_lock_goal = false; } - else if(bombteam == otherTeam) // the bomb is theirs, we are on the defense + else if ( bombteam == otherTeam ) // the bomb is theirs, we are on the defense { site = level.bombZones[myteam]; - - if(!isDefined(site.bots)) + + if ( !isDefined( site.bots ) ) site.bots = 0; - + // protect our site from planters - if(!level.bombPlanted) + if ( !level.bombPlanted ) { //kill bomb carrier - if(site.bots > 2 || randomInt(100) < 45) + if ( site.bots > 2 || randomInt( 100 ) < 45 ) { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(carrier hasPerk( "specialty_gpsjammer" )) + + 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 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 + 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.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 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; return; } - + //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) { wait 4; - self notify("bot_inc_bots"); site.bots--; + self notify( "bot_inc_bots" ); + 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 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 ); - + 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) + if ( site.bots > 1 ) { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + 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 thread bot_go_defuse( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } @@ -3454,40 +3534,40 @@ bot_sab_loop() self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); - self thread bot_inc_bots(site); - self thread bot_go_defuse(site); + 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") + if ( event != "new_goal" ) self ClearScriptGoal(); - if(event != "goal" || !level.bombPlanted || site IsInUse() || !self isTouching(site.trigger) || self InLastStand() || self HasThreat()) + if ( event != "goal" || !level.bombPlanted || site IsInUse() || !self isTouching( site.trigger ) || self InLastStand() || self HasThreat() ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - - self bot_use_bomb_thread(site); + + self bot_use_bomb_thread( site ); wait 1; self ClearScriptGoal(); - + self.bot_lock_goal = false; } else // we need to go get the bomb! { - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+5 ); - + origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2] + 5 ); + 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 thread bot_get_obj( bomb ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); - + self.bot_lock_goal = false; return; } @@ -3500,7 +3580,7 @@ bot_sab() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "sab" ) return; @@ -3508,19 +3588,19 @@ bot_sab() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self.bot_lock_goal ) { continue; } - - if(!isDefined(level.sabBomb)) - continue; - - if(!isDefined(level.bombZones) || !level.bombZones.size) + + if ( !isDefined( level.sabBomb ) ) continue; - if (self IsPlanting() || self isDefusing()) + if ( !isDefined( level.bombZones ) || !level.bombZones.size ) + continue; + + if ( self IsPlanting() || self isDefusing() ) continue; self bot_sab_loop(); @@ -3530,145 +3610,148 @@ bot_sab() /* Bots play sd defenders */ -bot_sd_defenders_loop(data) +bot_sd_defenders_loop( data ) { myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); - + // bomb not planted, lets protect our sites - if(!level.bombPlanted) + if ( !level.bombPlanted ) { - timeleft = maps\mp\gametypes\_globallogic::getTimeRemaining()/1000; - - if(timeleft >= 90) + 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)) + if ( !level.multiBomb && isDefined( level.sdBomb ) ) { bomb = level.sdBomb; carrier = level.sdBomb.carrier; - - if(!isDefined(carrier)) + + if ( !isDefined( carrier ) ) { - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+5 ); - + origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2] + 5 ); + //hang around the bomb - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + 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 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) + if ( !isDefined( level.bombZones ) || !level.bombZones.size ) return; - + sites = []; - for(i = 0; i < level.bombZones.size; i++) + + for ( i = 0; i < level.bombZones.size; i++ ) { sites[sites.size] = level.bombZones[i]; } - - if(!sites.size) + + if ( !sites.size ) return; - - if (data.rand > 50) - site = self bot_array_nearest_curorigin(sites); + + if ( data.rand > 50 ) + site = self bot_array_nearest_curorigin( sites ); else - site = random(sites); - - if(!isDefined(site)) + 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 + + origin = ( site.curorigin[0] + 50, site.curorigin[1] + 50, site.curorigin[2] + 5 ); + + if ( site isInUse() ) //somebody is planting { self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - self thread bot_defend_site(site); + self thread bot_defend_site( site ); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); - + self.bot_lock_goal = false; return; } - + //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) + 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") + 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)) + if ( !isDefined( level.defuseObject ) ) return; - + defuse = level.defuseObject; - - if(!isDefined(defuse.bots)) + + if ( !isDefined( defuse.bots ) ) defuse.bots = 0; - - origin = ( defuse.curorigin[0], defuse.curorigin[1], defuse.curorigin[2]+5 ); - + + 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) + if ( defuse.bots > 1 ) { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + 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 thread bot_go_defuse( defuse ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } // lets defuse self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); - self thread bot_inc_bots(defuse); - self thread bot_go_defuse(defuse); + 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") + if ( event != "new_goal" ) self ClearScriptGoal(); - - if(event != "goal" || !level.bombPlanted || defuse isInUse() || !self isTouching(defuse.trigger) || self InLastStand() || self HasThreat()) + + if ( event != "goal" || !level.bombPlanted || defuse isInUse() || !self isTouching( defuse.trigger ) || self InLastStand() || self HasThreat() ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - - self bot_use_bomb_thread(defuse); + + self bot_use_bomb_thread( defuse ); wait 1; self ClearScriptGoal(); self.bot_lock_goal = false; @@ -3681,12 +3764,12 @@ bot_sd_defenders() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "sd" ) return; - - if(self.team == game["attackers"]) + + if ( self.team == game["attackers"] ) return; data = spawnStruct(); @@ -3695,29 +3778,29 @@ bot_sd_defenders() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self.bot_lock_goal ) { continue; } - if (self IsPlanting() || self isDefusing()) + if ( self IsPlanting() || self isDefusing() ) continue; - self bot_sd_defenders_loop(data); + self bot_sd_defenders_loop( data ); } } /* Bots play sd attackers */ -bot_sd_attackers_loop(data) +bot_sd_attackers_loop( data ) { - if(data.first) + if ( data.first ) data.first = false; else wait( randomintrange( 3, 5 ) ); - + if ( self.bot_lock_goal ) { return; @@ -3725,160 +3808,163 @@ bot_sd_attackers_loop(data) myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); - + //bomb planted - if(level.bombPlanted) + if ( level.bombPlanted ) { - if(!isDefined(level.defuseObject)) + if ( !isDefined( level.defuseObject ) ) return; - + site = level.defuseObject; - - origin = ( site.curorigin[0], site.curorigin[1], site.curorigin[2]+5 ); - - if(site IsInUse())//somebody is defusing + + origin = ( site.curorigin[0], site.curorigin[1], site.curorigin[2] + 5 ); + + if ( site IsInUse() ) //somebody is defusing { 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 thread bot_defend_site( site ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); - + self.bot_lock_goal = false; return; } - + //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) + 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") + + 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; - + + timeleft = maps\mp\gametypes\_globallogic::getTimeRemaining() / 1000; + timepassed = maps\mp\gametypes\_globallogic::getTimePassed() / 1000; + //dont have a bomb - if(!self IsBombCarrier() && !level.multiBomb) + if ( !self IsBombCarrier() && !level.multiBomb ) { - if(!isDefined(level.sdBomb)) + if ( !isDefined( level.sdBomb ) ) return; - + bomb = level.sdBomb; carrier = level.sdBomb.carrier; - + //bomb is picked up - if(isDefined(carrier)) + if ( isDefined( carrier ) ) { //escort the bomb carrier - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - + origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + 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 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)) + + if ( !isDefined( bomb.bots ) ) bomb.bots = 0; - - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+5 ); - + + 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) + if ( bomb.bots > 1 ) { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + 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 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.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - self thread bot_inc_bots(bomb); - self thread bot_get_obj(bomb); + self thread bot_inc_bots( bomb ); + self thread bot_get_obj( bomb ); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); self.bot_lock_goal = false; return; } - + // check if to plant - if(timepassed < 120 && timeleft >= 90 && randomInt(100) < 98) + if ( timepassed < 120 && timeleft >= 90 && randomInt( 100 ) < 98 ) return; - - if(!isDefined(level.bombZones) || !level.bombZones.size) + + if ( !isDefined( level.bombZones ) || !level.bombZones.size ) return; - + sites = []; - for(i = 0; i < level.bombZones.size; i++) + + for ( i = 0; i < level.bombZones.size; i++ ) { sites[sites.size] = level.bombZones[i]; } - - if(!sites.size) + + if ( !sites.size ) return; - - if(data.rand > 50) - plant = self bot_array_nearest_curorigin(sites); + + if ( data.rand > 50 ) + plant = self bot_array_nearest_curorigin( sites ); else - plant = random(sites); - - if(!isDefined(plant)) + plant = random( sites ); + + if ( !isDefined( plant ) ) return; - - origin = ( plant.curorigin[0]+50, plant.curorigin[1]+50, plant.curorigin[2]+5 ); - + + origin = ( plant.curorigin[0] + 50, plant.curorigin[1] + 50, plant.curorigin[2] + 5 ); + self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); - self thread bot_go_plant(plant); + self thread bot_go_plant( plant ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - if (event != "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()) + + 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 SetScriptGoal( self.origin, 64 ); - - self bot_use_bomb_thread(plant); + + self bot_use_bomb_thread( plant ); wait 1; - + self ClearScriptGoal(); self.bot_lock_goal = false; } @@ -3890,12 +3976,12 @@ bot_sd_attackers() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "sd" ) return; - - if(self.team != game["attackers"]) + + if ( self.team != game["attackers"] ) return; data = spawnStruct(); @@ -3904,6 +3990,6 @@ bot_sd_attackers() for ( ;; ) { - self bot_sd_attackers_loop(data); + self bot_sd_attackers_loop( data ); } } diff --git a/main_shared/maps/mp/bots/_bot_utility.gsc b/main_shared/maps/mp/bots/_bot_utility.gsc index a4b8c1e..e9f3262 100644 --- a/main_shared/maps/mp/bots/_bot_utility.gsc +++ b/main_shared/maps/mp/bots/_bot_utility.gsc @@ -7,7 +7,7 @@ */ is_host() { - return (isDefined(self.pers["bot_host"]) && self.pers["bot_host"]); + return ( isDefined( self.pers["bot_host"] ) && self.pers["bot_host"] ); } /* @@ -17,36 +17,38 @@ doHostCheck() { self.pers["bot_host"] = false; - if (self is_bot()) + if ( self is_bot() ) return; result = false; - if (getDvar("bots_main_firstIsHost") != "0") + + if ( getDvar( "bots_main_firstIsHost" ) != "0" ) { - printToConsole("WARNING: bots_main_firstIsHost is enabled"); - - if (getDvar("bots_main_firstIsHost") == "1") + printToConsole( "WARNING: bots_main_firstIsHost is enabled" ); + + if ( getDvar( "bots_main_firstIsHost" ) == "1" ) { - setDvar("bots_main_firstIsHost", self getguid()); + setDvar( "bots_main_firstIsHost", self getguid() ); } - if (getDvar("bots_main_firstIsHost") == self getguid()+"") + if ( getDvar( "bots_main_firstIsHost" ) == self getguid() + "" ) result = true; } - DvarGUID = getDvar("bots_main_GUIDs"); - if (DvarGUID != "") - { - guids = strtok(DvarGUID, ","); + DvarGUID = getDvar( "bots_main_GUIDs" ); - for (i = 0; i < guids.size; i++) + if ( DvarGUID != "" ) + { + guids = strtok( DvarGUID, "," ); + + for ( i = 0; i < guids.size; i++ ) { - if(self getguid()+"" == guids[i]) + if ( self getguid() + "" == guids[i] ) result = true; } } - - if (!result) + + if ( !result ) return; self.pers["bot_host"] = true; @@ -63,49 +65,49 @@ is_bot() /* Bot changes to the weap */ -BotChangeToWeapon(weap) +BotChangeToWeapon( weap ) { - self maps\mp\bots\_bot_internal::changeToWeap(weap); + self maps\mp\bots\_bot_internal::changeToWeap( weap ); } /* Bot presses the button for time. */ -BotPressAttack(time) +BotPressAttack( time ) { - self maps\mp\bots\_bot_internal::pressFire(time); + self maps\mp\bots\_bot_internal::pressFire( time ); } /* Bot presses the ads button for time. */ -BotPressADS(time) +BotPressADS( time ) { - self maps\mp\bots\_bot_internal::pressADS(time); + self maps\mp\bots\_bot_internal::pressADS( time ); } /* Bot presses the use button for time. */ -BotPressUse(time) +BotPressUse( time ) { - self maps\mp\bots\_bot_internal::use(time); + self maps\mp\bots\_bot_internal::use( time ); } /* Bot presses the frag button for time. */ -BotPressFrag(time) +BotPressFrag( time ) { - self maps\mp\bots\_bot_internal::frag(time); + self maps\mp\bots\_bot_internal::frag( time ); } /* Bot presses the smoke button for time. */ -BotPressSmoke(time) +BotPressSmoke( time ) { - self maps\mp\bots\_bot_internal::smoke(time); + self maps\mp\bots\_bot_internal::smoke( time ); } /* @@ -121,7 +123,7 @@ BotGetRandom() */ BotGetTargetRandom() { - if (!isDefined(self.bot.target)) + if ( !isDefined( self.bot.target ) ) return undefined; return self.bot.target.rand; @@ -172,17 +174,18 @@ IsBotKnifing() */ IsPlayerModelOK() { - return (isDefined(self.bot_model_fix)); + return ( isDefined( self.bot_model_fix ) ); } /* Freezes the bot's controls. */ -BotFreezeControls(what) +BotFreezeControls( what ) { self.bot.isfrozen = what; - if(what) - self notify("kill_goal"); + + if ( what ) + self notify( "kill_goal" ); } /* @@ -196,12 +199,12 @@ BotIsFrozen() /* Bot will stop moving */ -BotStopMoving(what) +BotStopMoving( what ) { self.bot.stop_move = what; - if(what) - self notify("kill_goal"); + if ( what ) + self notify( "kill_goal" ); } /* @@ -210,7 +213,7 @@ BotStopMoving(what) */ HasScriptGoal() { - return (isDefined(self GetScriptGoal())); + return ( isDefined( self GetScriptGoal() ) ); } /* @@ -224,15 +227,16 @@ GetScriptGoal() /* Sets the bot's goal, will acheive it when dist away from it. */ -SetScriptGoal(goal, dist) +SetScriptGoal( goal, dist ) { - if (!isDefined(dist)) + if ( !isDefined( dist ) ) dist = 16; + self.bot.script_goal = goal; self.bot.script_goal_dist = dist; waittillframeend; - self notify("new_goal_internal"); - self notify("new_goal"); + self notify( "new_goal_internal" ); + self notify( "new_goal" ); } /* @@ -240,13 +244,13 @@ SetScriptGoal(goal, dist) */ ClearScriptGoal() { - self SetScriptGoal(undefined, 0); + self SetScriptGoal( undefined, 0 ); } /* Sets the aim position of the bot */ -SetScriptAimPos(pos) +SetScriptAimPos( pos ) { self.bot.script_aimpos = pos; } @@ -256,7 +260,7 @@ SetScriptAimPos(pos) */ ClearScriptAimPos() { - self SetScriptAimPos(undefined); + self SetScriptAimPos( undefined ); } /* @@ -272,13 +276,13 @@ GetScriptAimPos() */ HasScriptAimPos() { - return isDefined(self GetScriptAimPos()); + return isDefined( self GetScriptAimPos() ); } /* Sets the bot's target to be this ent. */ -SetAttacker(att) +SetAttacker( att ) { self.bot.target_this_frame = att; } @@ -286,7 +290,7 @@ SetAttacker(att) /* Sets the script enemy for a bot. */ -SetScriptEnemy(enemy, offset) +SetScriptEnemy( enemy, offset ) { self.bot.script_target = enemy; self.bot.script_target_offset = offset; @@ -297,7 +301,7 @@ SetScriptEnemy(enemy, offset) */ ClearScriptEnemy() { - self SetScriptEnemy(undefined, undefined); + self SetScriptEnemy( undefined, undefined ); } /* @@ -305,9 +309,9 @@ ClearScriptEnemy() */ GetThreat() { - if(!isdefined(self.bot.target)) + if ( !isdefined( self.bot.target ) ) return undefined; - + return self.bot.target.entity; } @@ -316,7 +320,7 @@ GetThreat() */ HasScriptEnemy() { - return (isDefined(self.bot.script_target)); + return ( isDefined( self.bot.script_target ) ); } /* @@ -324,7 +328,7 @@ HasScriptEnemy() */ HasThreat() { - return (isDefined(self GetThreat())); + return ( isDefined( self GetThreat() ) ); } /* @@ -332,7 +336,7 @@ HasThreat() */ IsDefusing() { - return (isDefined(self.isDefusing) && self.isDefusing); + return ( isDefined( self.isDefusing ) && self.isDefusing ); } /* @@ -340,7 +344,7 @@ IsDefusing() */ isPlanting() { - return (isDefined(self.isPlanting) && self.isPlanting); + return ( isDefined( self.isPlanting ) && self.isPlanting ); } /* @@ -348,7 +352,7 @@ isPlanting() */ inLastStand() { - return (isDefined(self.lastStand) && self.lastStand); + return ( isDefined( self.lastStand ) && self.lastStand ); } /* @@ -356,7 +360,7 @@ inLastStand() */ isBombCarrier() { - return (isDefined(self.isBombCarrier) && self.isBombCarrier); + return ( isDefined( self.isBombCarrier ) && self.isBombCarrier ); } /* @@ -364,7 +368,7 @@ isBombCarrier() */ isInUse() { - return (isDefined(self.inUse) && self.inUse); + return ( isDefined( self.inUse ) && self.inUse ); } /* @@ -372,15 +376,15 @@ isInUse() */ IsStunned() { - return (isdefined(self.concussionEndTime) && self.concussionEndTime > gettime()); + return ( isdefined( self.concussionEndTime ) && self.concussionEndTime > gettime() ); } /* - Returns if we are beingArtilleryShellshocked + Returns if we are beingArtilleryShellshocked */ isArtShocked() { - return (isDefined(self.beingArtilleryShellshocked) && self.beingArtilleryShellshocked); + return ( isDefined( self.beingArtilleryShellshocked ) && self.beingArtilleryShellshocked ); } /* @@ -390,14 +394,14 @@ getValidTube() { weaps = self getweaponslist(); - for (i = 0; i < weaps.size; i++) + for ( i = 0; i < weaps.size; i++ ) { weap = weaps[i]; - if(!self getAmmoCount(weap)) + if ( !self getAmmoCount( weap ) ) continue; - if (isSubStr(weap, "gl_") && !isSubStr(weap, "_gl_")) + if ( isSubStr( weap, "gl_" ) && !isSubStr( weap, "_gl_" ) ) return weap; } @@ -414,31 +418,31 @@ 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++) + + 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); + + return random( possibles ); } /* Returns if the given weapon is full auto. */ -WeaponIsFullAuto(weap) +WeaponIsFullAuto( weap ) { - weaptoks = strtok(weap, "_"); - - return isDefined(weaptoks[0]) && isString(weaptoks[0]) && isdefined(level.bots_fullautoguns[weaptoks[0]]); + weaptoks = strtok( weap, "_" ); + + return isDefined( weaptoks[0] ) && isString( weaptoks[0] ) && isdefined( level.bots_fullautoguns[weaptoks[0]] ); } /* @@ -447,7 +451,7 @@ WeaponIsFullAuto(weap) GetEyeHeight() { myEye = self GetEyePos(); - + return myEye[2] - self.origin[2]; } @@ -456,25 +460,25 @@ GetEyeHeight() */ GetEyePos() { - return self getTagOrigin("tag_eye"); + return self getTagOrigin( "tag_eye" ); } /* helper */ -waittill_either_return_(str1, str2) +waittill_either_return_( str1, str2 ) { - self endon(str1); - self waittill(str2); + self endon( str1 ); + self waittill( str2 ); return true; } /* Returns which string gets notified first */ -waittill_either_return(str1, str2) +waittill_either_return( str1, str2 ) { - if (!isDefined(self waittill_either_return_(str1, str2))) + if ( !isDefined( self waittill_either_return_( str1, str2 ) ) ) return str1; return str2; @@ -483,10 +487,10 @@ waittill_either_return(str1, str2) /* Waits until either of the nots. */ -waittill_either(not, not1) +waittill_either( not, not1 ) { - self endon(not); - self waittill(not1); + self endon( not ); + self waittill( not1 ); } /* @@ -511,10 +515,10 @@ allowTeamChoice() waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) { if ( ( !isdefined( string1 ) || string1 != "death" ) && - ( !isdefined( string2 ) || string2 != "death" ) && - ( !isdefined( string3 ) || string3 != "death" ) && - ( !isdefined( string4 ) || string4 != "death" ) && - ( !isdefined( string5 ) || string5 != "death" ) ) + ( !isdefined( string2 ) || string2 != "death" ) && + ( !isdefined( string3 ) || string3 != "death" ) && + ( !isdefined( string4 ) || string4 != "death" ) && + ( !isdefined( string5 ) || string5 != "death" ) ) self endon( "death" ); ent = spawnstruct(); @@ -555,108 +559,157 @@ _timeout( delay ) /* Returns if we have the create a class object unlocked. */ -isItemUnlocked(what, lvl) +isItemUnlocked( what, lvl ) { - switch(what) + switch ( what ) { case "ak47": return true; + case "ak74u": - return (lvl >= 28); + return ( lvl >= 28 ); + case "barrett": - return (lvl >= 49); + return ( lvl >= 49 ); + case "dragunov": - return (lvl >= 22); + return ( lvl >= 22 ); + case "g3": - return (lvl >= 25); + return ( lvl >= 25 ); + case "g36c": - return (lvl >= 37); + return ( lvl >= 37 ); + case "m1014": - return (lvl >= 31); + return ( lvl >= 31 ); + case "m14": - return (lvl >= 46); + return ( lvl >= 46 ); + case "m16": return true; + case "m21": - return (lvl >= 7); + return ( lvl >= 7 ); + case "m4": - return (lvl >= 10); + return ( lvl >= 10 ); + case "m40a3": return true; + case "m60e4": - return (lvl >= 19); + return ( lvl >= 19 ); + case "mp44": - return (lvl >= 52); + return ( lvl >= 52 ); + case "mp5": return true; + case "p90": - return (lvl >= 40); + return ( lvl >= 40 ); + case "rpd": return true; + case "saw": return true; + case "skorpion": return true; + case "uzi": - return (lvl >= 13); + return ( lvl >= 13 ); + case "winchester1200": return true; + case "remington700": - return (lvl >= 34); + return ( lvl >= 34 ); + case "beretta": return true; + case "colt45": - return (lvl >= 16); + return ( lvl >= 16 ); + case "deserteagle": - return (lvl >= 43); + return ( lvl >= 43 ); + case "deserteaglegold": - return (lvl >= 55); + return ( lvl >= 55 ); + case "usp": return true; + case "specialty_bulletdamage": return true; + case "specialty_armorvest": return true; + case "specialty_fastreload": - return (lvl >= 20); + return ( lvl >= 20 ); + case "specialty_rof": - return (lvl >= 29); + return ( lvl >= 29 ); + case "specialty_twoprimaries": - return (lvl >= 38); + return ( lvl >= 38 ); + case "specialty_gpsjammer": - return (lvl >= 11); + return ( lvl >= 11 ); + case "specialty_explosivedamage": return true; + case "specialty_longersprint": return true; + case "specialty_bulletaccuracy": return true; + case "specialty_pistoldeath": - return (lvl >= 8); + return ( lvl >= 8 ); + case "specialty_grenadepulldeath": - return (lvl >= 17); + return ( lvl >= 17 ); + case "specialty_bulletpenetration": return true; + case "specialty_holdbreath": - return (lvl >= 26); + return ( lvl >= 26 ); + case "specialty_quieter": - return (lvl >= 44); + return ( lvl >= 44 ); + case "specialty_parabolic": - return (lvl >= 35); + return ( lvl >= 35 ); + case "specialty_specialgrenade": return true; + case "specialty_weapon_rpg": return true; + case "specialty_weapon_claymore": - return (lvl >= 23); + return ( lvl >= 23 ); + case "specialty_fraggrenade": - return (lvl >= 41); + return ( lvl >= 41 ); + case "specialty_extraammo": - return (lvl >= 32); + return ( lvl >= 32 ); + case "specialty_detectexplosive": - return (lvl >= 14); + return ( lvl >= 14 ); + case "specialty_weapon_c4": return true; + default: return true; } @@ -665,21 +718,22 @@ isItemUnlocked(what, lvl) /* If the weapon is allowed to be dropped */ -isWeaponDroppable(weap) +isWeaponDroppable( weap ) { - return (maps\mp\gametypes\_weapons::mayDropWeapon(weap)); + return ( maps\mp\gametypes\_weapons::mayDropWeapon( weap ) ); } /* Selects a random element from the array. */ -Random(arr) +Random( arr ) { size = arr.size; - if(!size) + + if ( !size ) return undefined; - - return arr[randomInt(size)]; + + return arr[randomInt( size )]; } /* @@ -688,10 +742,11 @@ Random(arr) array_remove( ents, remover ) { newents = []; - for(i = 0; i < ents.size; i++) + + for ( i = 0; i < ents.size; i++ ) { index = ents[i]; - + if ( index != remover ) newents[ newents.size ] = index; } @@ -702,9 +757,9 @@ array_remove( ents, remover ) /* Waits until not or tim. */ -waittill_notify_or_timeout(not, tim) +waittill_notify_or_timeout( not, tim ) { - self endon(not); + self endon( not ); wait tim; } @@ -713,11 +768,11 @@ waittill_notify_or_timeout(not, tim) */ GetHostPlayer() { - for (i = 0; i < level.players.size; i++) + for ( i = 0; i < level.players.size; i++ ) { player = level.players[i]; - if (!player is_host()) + if ( !player is_host() ) continue; return player; @@ -727,44 +782,44 @@ GetHostPlayer() } /* - Waits for a host player + Waits for a host player */ bot_wait_for_host() { host = undefined; - while (!isDefined(level) || !isDefined(level.players)) + while ( !isDefined( level ) || !isDefined( level.players ) ) wait 0.05; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) + + for ( i = getDvarFloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { host = GetHostPlayer(); - - if(isDefined(host)) + + 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" ] )) + if ( !isDefined( host ) ) return; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) + + for ( i = getDvarFloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) { - if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis") + 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; } } @@ -773,46 +828,47 @@ bot_wait_for_host() Pezbot's line sphere intersection. http://paulbourke.net/geometry/circlesphere/raysphere.c */ -RaySphereIntersect(start, end, spherePos, radius) +RaySphereIntersect( start, end, spherePos, radius ) { // check if the start or end points are in the sphere r2 = radius * radius; - if (DistanceSquared(start, spherePos) < r2) + + if ( DistanceSquared( start, spherePos ) < r2 ) return true; - if (DistanceSquared(end, spherePos) < r2) + 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]; - b = 2 * (dp[0] * (start[0] - spherePos[0]) + dp[1] * (start[1] - spherePos[1]) + dp[2] * (start[2] - spherePos[2])); + b = 2 * ( dp[0] * ( start[0] - spherePos[0] ) + dp[1] * ( start[1] - spherePos[1] ) + dp[2] * ( start[2] - spherePos[2] ) ); c = spherePos[0] * spherePos[0] + spherePos[1] * spherePos[1] + spherePos[2] * spherePos[2]; c += start[0] * start[0] + start[1] * start[1] + start[2] * start[2]; - c -= 2.0 * (spherePos[0] * start[0] + spherePos[1] * start[1] + spherePos[2] * start[2]); + 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) + if ( abs( a ) < 0.0001 || bb4ac < 0 ) return false; - mu1 = (0-b + sqrt(bb4ac)) / (2 * a); + 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); + myDist = DistanceSquared( start, end ); // check if both intersection points far - if (DistanceSquared(start, ip1) > myDist/* && DistanceSquared(start, ip2) > myDist*/) + if ( DistanceSquared( start, ip1 ) > myDist/* && DistanceSquared(start, ip2) > myDist*/ ) return false; - dpAngles = VectorToAngles(dp); + dpAngles = VectorToAngles( dp ); // check if the point is behind us - if (getConeDot(ip1, start, dpAngles) < 0/* || getConeDot(ip2, start, dpAngles) < 0*/) + if ( getConeDot( ip1, start, dpAngles ) < 0/* || getConeDot(ip2, start, dpAngles) < 0*/ ) return false; return true; @@ -821,55 +877,55 @@ RaySphereIntersect(start, end, spherePos, radius) /* Returns if a smoke grenade would intersect start to end line. */ -SmokeTrace(start, end, rad) +SmokeTrace( start, end, rad ) { - for(i = level.bots_smokeList.count - 1; i >= 0; i--) + for ( i = level.bots_smokeList.count - 1; i >= 0; i-- ) { nade = level.bots_smokeList.data[i]; - - if(nade.state != "smoking") + + if ( nade.state != "smoking" ) continue; - - if(!RaySphereIntersect(start, end, nade.origin, rad)) + + if ( !RaySphereIntersect( start, end, nade.origin, rad ) ) continue; - + return false; } - + return true; } /* Returns the cone dot (like fov, or distance from the center of our screen). 1.0 = directly looking at, 0.0 = completely right angle, -1.0, completely 180 */ -getConeDot(to, from, dir) +getConeDot( to, from, dir ) { - dirToTarget = VectorNormalize(to-from); - forward = AnglesToForward(dir); - return vectordot(dirToTarget, forward); + dirToTarget = VectorNormalize( to - from ); + forward = AnglesToForward( dir ); + return vectordot( dirToTarget, forward ); } /* Returns the distance squared in a 2d space */ -DistanceSquared2D(to, from) +DistanceSquared2D( to, from ) { - to = (to[0], to[1], 0); - from = (from[0], from[1], 0); - - return DistanceSquared(to, from); + to = ( to[0], to[1], 0 ); + from = ( from[0], from[1], 0 ); + + return DistanceSquared( to, from ); } /* Rounds to the nearest whole number. */ -Round(x) +Round( x ) { - y = int(x); - - if(abs(x) - abs(y) > 0.5) + y = int( x ); + + if ( abs( x ) - abs( y ) > 0.5 ) { - if(x < 0) + if ( x < 0 ) return y - 1; else return y + 1; @@ -884,6 +940,7 @@ Round(x) RoundUp( floatVal ) { i = int( floatVal ); + if ( i != floatVal ) return i + 1; else @@ -893,40 +950,125 @@ RoundUp( floatVal ) /* Matches a num to a char */ -keyCodeToString(a) +keyCodeToString( a ) { - b=""; - switch(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; + 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; } @@ -936,42 +1078,47 @@ keyCodeToString(a) cac_init_patch() { // oldschool mode does not create these, we need those tho. - if(!isDefined(level.tbl_weaponIDs)) + if ( !isDefined( level.tbl_weaponIDs ) ) { level.tbl_weaponIDs = []; - for( i=0; i<150; i++ ) + + for ( i = 0; i < 150; i++ ) { reference_s = tableLookup( "mp/statsTable.csv", 0, i, 4 ); - if( reference_s != "" ) - { + + if ( reference_s != "" ) + { level.tbl_weaponIDs[i]["reference"] = reference_s; level.tbl_weaponIDs[i]["group"] = tablelookup( "mp/statstable.csv", 0, i, 2 ); level.tbl_weaponIDs[i]["count"] = int( tablelookup( "mp/statstable.csv", 0, i, 5 ) ); - level.tbl_weaponIDs[i]["attachment"] = tablelookup( "mp/statstable.csv", 0, i, 8 ); + level.tbl_weaponIDs[i]["attachment"] = tablelookup( "mp/statstable.csv", 0, i, 8 ); } else continue; } } - - if(!isDefined(level.tbl_WeaponAttachment)) + + if ( !isDefined( level.tbl_WeaponAttachment ) ) { level.tbl_WeaponAttachment = []; - for( i=0; i<8; i++ ) + + 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)) + + if ( !isDefined( level.tbl_PerkData ) ) { level.tbl_PerkData = []; + // generating perk data vars collected form statsTable.csv - for( i=150; i<194; i++ ) + for ( i = 150; i < 194; i++ ) { reference_s = tableLookup( "mp/statsTable.csv", 0, i, 4 ); - if( reference_s != "" ) + + if ( reference_s != "" ) { level.tbl_PerkData[i]["reference"] = reference_s; level.tbl_PerkData[i]["reference_full"] = tableLookup( "mp/statsTable.csv", 0, i, 6 ); @@ -988,28 +1135,28 @@ cac_init_patch() level.perkReferenceToIndex = []; level.weaponReferenceToIndex = []; level.weaponAttachmentReferenceToIndex = []; - - for( i=0; i<150; i++ ) + + for ( i = 0; i < 150; i++ ) { - if(!isDefined(level.tbl_weaponIDs[i]) || !isDefined(level.tbl_weaponIDs[i]["reference"])) + 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++ ) + + for ( i = 0; i < 8; i++ ) { - if(!isDefined(level.tbl_WeaponAttachment[i]) || !isDefined(level.tbl_WeaponAttachment[i]["reference"])) + 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++ ) + + for ( i = 150; i < 194; i++ ) { - if(!isDefined(level.tbl_PerkData[i]) || !isDefined(level.tbl_PerkData[i]["reference_full"])) + if ( !isDefined( level.tbl_PerkData[i] ) || !isDefined( level.tbl_PerkData[i]["reference_full"] ) ) continue; - + level.perkReferenceToIndex[ level.tbl_PerkData[i]["reference_full"] ] = i; } } @@ -1017,16 +1164,17 @@ cac_init_patch() /* Tokenizes a string (strtok has limits...) (only one char tok) */ -tokenizeLine(line, tok) +tokenizeLine( line, tok ) { tokens = []; token = ""; - for (i = 0; i < line.size; i++) + + for ( i = 0; i < line.size; i++ ) { c = line[i]; - if (c == tok) + if ( c == tok ) { tokens[tokens.size] = token; token = ""; @@ -1035,6 +1183,7 @@ tokenizeLine(line, tok) token += c; } + tokens[tokens.size] = token; return tokens; @@ -1043,28 +1192,30 @@ tokenizeLine(line, tok) /* Parses tokens into a waypoint obj */ -parseTokensIntoWaypoint(tokens) +parseTokensIntoWaypoint( tokens ) { waypoint = spawnStruct(); orgStr = tokens[0]; - orgToks = strtok(orgStr, " "); - waypoint.origin = (float(orgToks[0]), float(orgToks[1]), float(orgToks[2])); + orgToks = strtok( orgStr, " " ); + waypoint.origin = ( float( orgToks[0] ), float( orgToks[1] ), float( orgToks[2] ) ); childStr = tokens[1]; - childToks = strtok(childStr, " "); + childToks = strtok( childStr, " " ); waypoint.children = []; - for( j=0; j dist) + if ( DistanceSquared( waypoint.origin, self.origin ) > dist ) continue; return true; @@ -1302,17 +1476,17 @@ nearAnyOfWaypoints(dist, waypoints) /* Returns the waypoints that are near */ -waypointsNear(waypoints, dist) +waypointsNear( waypoints, dist ) { dist *= dist; answer = []; - for (i = 0; i < waypoints.size; i++) + for ( i = 0; i < waypoints.size; i++ ) { wp = level.waypoints[waypoints[i]]; - if (DistanceSquared(wp.origin, self.origin) > dist) + if ( DistanceSquared( wp.origin, self.origin ) > dist ) continue; answer[answer.size] = waypoints[i]; @@ -1324,16 +1498,17 @@ waypointsNear(waypoints, dist) /* Returns nearest waypoint of waypoints */ -getNearestWaypointOfWaypoints(waypoints) +getNearestWaypointOfWaypoints( waypoints ) { answer = undefined; closestDist = 2147483647; - for (i = 0; i < waypoints.size; i++) + + for ( i = 0; i < waypoints.size; i++ ) { waypoint = level.waypoints[waypoints[i]]; - thisDist = DistanceSquared(self.origin, waypoint.origin); + thisDist = DistanceSquared( self.origin, waypoint.origin ); - if (isDefined(answer) && thisDist > closestDist) + if ( isDefined( answer ) && thisDist > closestDist ) continue; answer = waypoints[i]; @@ -1346,35 +1521,37 @@ getNearestWaypointOfWaypoints(waypoints) /* Returns all waypoints of type */ -getWaypointsOfType(type) +getWaypointsOfType( type ) { answer = []; - for(i = 0; i < level.waypointCount; i++) + + for ( i = 0; i < level.waypointCount; i++ ) { wp = level.waypoints[i]; - - if (type == "camp") + + if ( type == "camp" ) { - if (wp.type != "crouch") + if ( wp.type != "crouch" ) continue; - if (wp.children.size != 1) + if ( wp.children.size != 1 ) continue; } - else if (type != wp.type) + else if ( type != wp.type ) continue; answer[answer.size] = i; } + return answer; } /* Returns the waypoint for index */ -getWaypointForIndex(i) +getWaypointForIndex( i ) { - if (!isDefined(i)) + if ( !isDefined( i ) ) return undefined; return level.waypoints[i]; @@ -1385,7 +1562,7 @@ getWaypointForIndex(i) */ getGoodMapAmount() { - switch(getDvar("mapname")) + switch ( getDvar( "mapname" ) ) { case "mp_crash": case "mp_crash_snow": @@ -1402,82 +1579,102 @@ getGoodMapAmount() case "mp_backlot": case "mp_convoy": case "mp_bloc": - if(level.teamBased) + if ( level.teamBased ) return 14; else return 9; - + case "mp_vacant": case "mp_showdown": case "mp_citystreets": case "mp_bog": - if(level.teamBased) + if ( level.teamBased ) return 12; else return 8; - + case "mp_killhouse": case "mp_shipment": - if(level.teamBased) + if ( level.teamBased ) return 8; else return 4; } - + return 2; } /* Returns the friendly user name for a given map's codename */ -getMapName(map) +getMapName( map ) { - switch(map) + switch ( 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; } @@ -1496,16 +1693,17 @@ getBotArray() { result = []; playercount = level.players.size; - for(i = 0; i < playercount; i++) + + for ( i = 0; i < playercount; i++ ) { player = level.players[i]; - - if(!player is_bot()) + + if ( !player is_bot() ) continue; - + result[result.size] = player; } - + return result; } @@ -1515,64 +1713,68 @@ getBotArray() WaypointsToKDTree() { kdTree = KDTree(); - - kdTree _WaypointsToKDTree(level.waypoints, 0); - + + kdTree _WaypointsToKDTree( level.waypoints, 0 ); + return kdTree; } /* Recurive function. We construct a balanced KD tree by sorting the waypoints using heap sort. */ -_WaypointsToKDTree(waypoints, dem) +_WaypointsToKDTree( waypoints, dem ) { - if(!waypoints.size) + if ( !waypoints.size ) return; callbacksort = undefined; - - switch(dem) + + switch ( dem ) { case 0: callbacksort = ::HeapSortCoordX; - break; + break; + case 1: callbacksort = ::HeapSortCoordY; - break; + break; + case 2: callbacksort = ::HeapSortCoordZ; - break; + break; } - - heap = NewHeap(callbacksort); - - for(i = 0; i < waypoints.size; i++) + + heap = NewHeap( callbacksort ); + + for ( i = 0; i < waypoints.size; i++ ) { - heap HeapInsert(waypoints[i]); + heap HeapInsert( waypoints[i] ); } - + sorted = []; - while(heap.data.size) + + while ( heap.data.size ) { sorted[sorted.size] = heap.data[0]; heap HeapRemove(); } - - median = int(sorted.size/2);//use divide and conq - + + median = int( sorted.size / 2 ); //use divide and conq + left = []; right = []; - for(i = 0; i < sorted.size; i++) - if(i < median) + + for ( i = 0; i < sorted.size; i++ ) + if ( i < median ) right[right.size] = sorted[i]; - else if(i > median) + else if ( i > median ) left[left.size] = sorted[i]; - - self KDTreeInsert(sorted[median]); - - _WaypointsToKDTree(left, (dem+1)%3); - - _WaypointsToKDTree(right, (dem+1)%3); + + self KDTreeInsert( sorted[median] ); + + _WaypointsToKDTree( left, ( dem + 1 ) % 3 ); + + _WaypointsToKDTree( right, ( dem + 1 ) % 3 ); } /* @@ -1583,26 +1785,26 @@ List() list = spawnStruct(); list.count = 0; list.data = []; - + return list; } /* Adds a new thing to the list. */ -ListAdd(thing) +ListAdd( thing ) { self.data[self.count] = thing; - + self.count++; } /* Adds to the start of the list. */ -ListAddFirst(thing) +ListAddFirst( thing ) { - for (i = self.count - 1; i >= 0; i--) + for ( i = self.count - 1; i >= 0; i-- ) { self.data[i + 1] = self.data[i]; } @@ -1614,18 +1816,18 @@ ListAddFirst(thing) /* Removes the thing from the list. */ -ListRemove(thing) +ListRemove( thing ) { for ( i = 0; i < self.count; i++ ) { if ( self.data[i] == thing ) { - while ( i < self.count-1 ) + while ( i < self.count - 1 ) { - self.data[i] = self.data[i+1]; + self.data[i] = self.data[i + 1]; i++; } - + self.data[i] = undefined; self.count--; break; @@ -1641,24 +1843,24 @@ KDTree() kdTree = spawnStruct(); kdTree.root = undefined; kdTree.count = 0; - + return kdTree; } /* Called on a KDTree. Will insert the object into the KDTree. */ -KDTreeInsert(data)//as long as what you insert has a .origin attru, it will work. +KDTreeInsert( data ) //as long as what you insert has a .origin attru, it will work. { - self.root = self _KDTreeInsert(self.root, data, 0, -2147483647, -2147483647, -2147483647, 2147483647, 2147483647, 2147483647); + self.root = self _KDTreeInsert( self.root, data, 0, -2147483647, -2147483647, -2147483647, 2147483647, 2147483647, 2147483647 ); } /* Recurive function that insert the object into the KDTree. */ -_KDTreeInsert(node, data, dem, x0, y0, z0, x1, y1, z1) +_KDTreeInsert( node, data, dem, x0, y0, z0, x1, y1, z1 ) { - if(!isDefined(node)) + if ( !isDefined( node ) ) { r = spawnStruct(); r.data = data; @@ -1670,116 +1872,122 @@ _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) + + switch ( dem ) { case 0: - if(data.origin[0] < node.data.origin[0]) - node.left = self _KDTreeInsert(node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1); + if ( data.origin[0] < node.data.origin[0] ) + node.left = self _KDTreeInsert( node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1 ); else - node.right = self _KDTreeInsert(node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1); - break; + node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1 ); + + break; + case 1: - if(data.origin[1] < node.data.origin[1]) - node.left = self _KDTreeInsert(node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1); + if ( data.origin[1] < node.data.origin[1] ) + node.left = self _KDTreeInsert( node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1 ); else - node.right = self _KDTreeInsert(node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1); - break; + node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1 ); + + break; + case 2: - if(data.origin[2] < node.data.origin[2]) - node.left = self _KDTreeInsert(node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2]); + if ( data.origin[2] < node.data.origin[2] ) + node.left = self _KDTreeInsert( node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2] ); else - node.right = self _KDTreeInsert(node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1); - break; + node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1 ); + + break; } - + return node; } /* Called on a KDTree, will return the nearest object to the given origin. */ -KDTreeNearest(origin) +KDTreeNearest( origin ) { - if(!isDefined(self.root)) + if ( !isDefined( self.root ) ) return undefined; - - return self _KDTreeNearest(self.root, origin, self.root.data, DistanceSquared(self.root.data.origin, origin), 0); + + return self _KDTreeNearest( self.root, origin, self.root.data, DistanceSquared( self.root.data.origin, origin ), 0 ); } /* Recurive function that will retrieve the closest object to the query. */ -_KDTreeNearest(node, point, closest, closestdist, dem) +_KDTreeNearest( node, point, closest, closestdist, dem ) { - if(!isDefined(node)) + if ( !isDefined( node ) ) { return closest; } - - thisDis = DistanceSquared(node.data.origin, point); - - if(thisDis < closestdist) + + thisDis = DistanceSquared( node.data.origin, point ); + + if ( thisDis < closestdist ) { closestdist = thisDis; closest = node.data; } - - if(node RectDistanceSquared(point) < closestdist) + + if ( node RectDistanceSquared( point ) < closestdist ) { near = node.left; far = node.right; - if(point[dem] > node.data.origin[dem]) + + 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); + + 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; } /* Called on a rectangle, returns the distance from origin to the rectangle. */ -RectDistanceSquared(origin) +RectDistanceSquared( origin ) { dx = 0; dy = 0; dz = 0; - - if(origin[0] < self.x0) + + if ( origin[0] < self.x0 ) dx = origin[0] - self.x0; - else if(origin[0] > self.x1) + else if ( origin[0] > self.x1 ) dx = origin[0] - self.x1; - - if(origin[1] < self.y0) + + if ( origin[1] < self.y0 ) dy = origin[1] - self.y0; - else if(origin[1] > self.y1) + else if ( origin[1] > self.y1 ) dy = origin[1] - self.y1; - - if(origin[2] < self.z0) + + if ( origin[2] < self.z0 ) dz = origin[2] - self.z0; - else if(origin[2] > self.z1) + else if ( origin[2] > self.z1 ) dz = origin[2] - self.z1; - - return dx*dx + dy*dy + dz*dz; + + return dx * dx + dy * dy + dz * dz; } /* A heap invarient comparitor, used for objects, objects with a higher X coord will be first in the heap. */ -HeapSortCoordX(item, item2) +HeapSortCoordX( item, item2 ) { return item.origin[0] > item2.origin[0]; } @@ -1787,7 +1995,7 @@ HeapSortCoordX(item, item2) /* A heap invarient comparitor, used for objects, objects with a higher Y coord will be first in the heap. */ -HeapSortCoordY(item, item2) +HeapSortCoordY( item, item2 ) { return item.origin[1] > item2.origin[1]; } @@ -1795,7 +2003,7 @@ HeapSortCoordY(item, item2) /* A heap invarient comparitor, used for objects, objects with a higher Z coord will be first in the heap. */ -HeapSortCoordZ(item, item2) +HeapSortCoordZ( item, item2 ) { return item.origin[2] > item2.origin[2]; } @@ -1803,7 +2011,7 @@ HeapSortCoordZ(item, item2) /* A heap invarient comparitor, used for numbers, numbers with the highest number will be first in the heap. */ -Heap(item, item2) +Heap( item, item2 ) { return item > item2; } @@ -1811,7 +2019,7 @@ Heap(item, item2) /* A heap invarient comparitor, used for numbers, numbers with the lowest number will be first in the heap. */ -ReverseHeap(item, item2) +ReverseHeap( item, item2 ) { return item < item2; } @@ -1819,7 +2027,7 @@ ReverseHeap(item, item2) /* A heap invarient comparitor, used for traces. Wanting the trace with the largest length first in the heap. */ -HeapTraceFraction(item, item2) +HeapTraceFraction( item, item2 ) { return item["fraction"] > item2["fraction"]; } @@ -1827,53 +2035,53 @@ HeapTraceFraction(item, item2) /* Returns a new heap. */ -NewHeap(compare) +NewHeap( compare ) { heap_node = spawnStruct(); heap_node.data = []; heap_node.compare = compare; - + return heap_node; } /* Inserts the item into the heap. Called on a heap. */ -HeapInsert(item) +HeapInsert( item ) { insert = self.data.size; self.data[insert] = item; - - current = insert+1; - - while(current > 1) + + current = insert + 1; + + while ( current > 1 ) { last = current; - current = int(current/2); - - if(![[self.compare]](item, self.data[current-1])) + 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; + + self.data[last - 1] = self.data[current - 1]; + self.data[current - 1] = item; } } /* Helper function to determine what is the next child of the bst. */ -_HeapNextChild(node, hsize) +_HeapNextChild( node, hsize ) { left = node * 2; right = left + 1; - - if(left > hsize) + + if ( left > hsize ) return -1; - - if(right > hsize) + + if ( right > hsize ) return left; - - if([[self.compare]](self.data[left-1], self.data[right-1])) + + if ( [[self.compare]]( self.data[left - 1], self.data[right - 1] ) ) return left; else return right; @@ -1885,40 +2093,40 @@ _HeapNextChild(node, hsize) HeapRemove() { remove = self.data.size; - - if(!remove) + + if ( !remove ) return remove; - - move = self.data[remove-1]; + + move = self.data[remove - 1]; self.data[0] = move; - self.data[remove-1] = undefined; + self.data[remove - 1] = undefined; remove--; - - if(!remove) + + if ( !remove ) return remove; - + last = 1; - next = self _HeapNextChild(1, remove); - - while(next != -1) + next = self _HeapNextChild( 1, remove ); + + while ( next != -1 ) { - if([[self.compare]](move, self.data[next-1])) + if ( [[self.compare]]( move, self.data[next - 1] ) ) break; - - self.data[last-1] = self.data[next-1]; - self.data[next-1] = move; - + + self.data[last - 1] = self.data[next - 1]; + self.data[next - 1] = move; + last = next; - next = self _HeapNextChild(next, remove); + next = self _HeapNextChild( next, remove ); } - + return remove; } /* A heap invarient comparitor, used for the astar's nodes, wanting the node with the lowest f to be first in the heap. */ -ReverseHeapAStar(item, item2) +ReverseHeapAStar( item, item2 ) { return item.f < item2.f; } @@ -1926,62 +2134,64 @@ ReverseHeapAStar(item, item2) /* Removes the waypoint usage */ -RemoveWaypointUsage(wp, team) +RemoveWaypointUsage( wp, team ) { - if (!isDefined(level.waypointUsage)) - return; - - if (!isDefined(level.waypointUsage[team][wp+""])) + if ( !isDefined( level.waypointUsage ) ) return; - level.waypointUsage[team][wp+""]--; + if ( !isDefined( level.waypointUsage[team][wp + ""] ) ) + return; - if (level.waypointUsage[team][wp+""] <= 0) - level.waypointUsage[team][wp+""] = undefined; + level.waypointUsage[team][wp + ""]--; + + if ( level.waypointUsage[team][wp + ""] <= 0 ) + level.waypointUsage[team][wp + ""] = undefined; } /* Will linearly search for the nearest waypoint to pos that has a direct line of sight. */ -GetNearestWaypointWithSight(pos) +GetNearestWaypointWithSight( pos ) { candidate = undefined; dist = 2147483647; - - for(i = 0; i < level.waypointCount; i++) + + for ( i = 0; i < level.waypointCount; i++ ) { - if(!bulletTracePassed(pos + (0, 0, 15), level.waypoints[i].origin + (0, 0, 15), false, undefined)) + 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) + + curdis = DistanceSquared( level.waypoints[i].origin, pos ); + + if ( curdis > dist ) continue; - + dist = curdis; candidate = i; } - + return candidate; } /* Will linearly search for the nearest waypoint */ -GetNearestWaypoint(pos) +GetNearestWaypoint( pos ) { candidate = undefined; dist = 2147483647; - - for(i = 0; i < level.waypointCount; i++) + + for ( i = 0; i < level.waypointCount; i++ ) { - curdis = DistanceSquared(level.waypoints[i].origin, pos); - if(curdis > dist) + curdis = DistanceSquared( level.waypoints[i].origin, pos ); + + if ( curdis > dist ) continue; - + dist = curdis; candidate = i; } - + return candidate; } @@ -1990,75 +2200,79 @@ GetNearestWaypoint(pos) This makes use of sets for quick look up and a heap for a priority queue instead of simple lists which require to linearly search for elements everytime. It is also modified to make paths with bots already on more expensive and will try a less congested path first. Thus spliting up the bots onto more paths instead of just one (the smallest). */ -AStarSearch(start, goal, team, greedy_path) +AStarSearch( start, goal, team, greedy_path ) { - open = NewHeap(::ReverseHeapAStar);//heap + open = NewHeap( ::ReverseHeapAStar ); //heap openset = [];//set for quick lookup closed = [];//set for quick lookup - - startWp = getNearestWaypoint(start); - if(!isDefined(startWp)) + + 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 = 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)) + + 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)) + + 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.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); - + openset[node.index + ""] = node; + open HeapInsert( node ); + //while the queue is not empty - while(open.data.size) + while ( open.data.size ) { //pop bestnode from queue bestNode = open.data[0]; open HeapRemove(); - openset[bestNode.index+""] = undefined; + openset[bestNode.index + ""] = undefined; wp = level.waypoints[bestNode.index]; - + //check if we made it to the goal - if(bestNode.index == goalWp) + if ( bestNode.index == goalWp ) { path = []; - - while(isDefined(bestNode)) - { - if(isdefined(team) && isDefined(level.waypointUsage)) - { - if (!isDefined(level.waypointUsage[team][bestNode.index+""])) - level.waypointUsage[team][bestNode.index+""] = 0; - level.waypointUsage[team][bestNode.index+""]++; + while ( isDefined( bestNode ) ) + { + if ( isdefined( team ) && isDefined( level.waypointUsage ) ) + { + if ( !isDefined( level.waypointUsage[team][bestNode.index + ""] ) ) + level.waypointUsage[team][bestNode.index + ""] = 0; + + level.waypointUsage[team][bestNode.index + ""]++; } - + //construct path path[path.size] = bestNode.index; - + bestNode = bestNode.parent; } @@ -2066,87 +2280,92 @@ AStarSearch(start, goal, team, greedy_path) } //for each child of bestnode - for(i = wp.children.size - 1; i >= 0; i--) + 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)) + + if ( !greedy_path && isdefined( team ) && isDefined( level.waypointUsage ) ) { temppen = 1; - if (isDefined(level.waypointUsage[team][child+""])) - temppen = level.waypointUsage[team][child+""];//consider how many bots are taking this path - - if(temppen > 1) + + if ( isDefined( level.waypointUsage[team][child + ""] ) ) + temppen = level.waypointUsage[team][child + ""]; //consider how many bots are taking this path + + if ( temppen > 1 ) penalty = temppen; } // have certain types of nodes more expensive - if (childWp.type == "climb" || childWp.type == "prone") + 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 - + 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) + inopen = isDefined( openset[child + ""] ); + + if ( inopen && openset[child + ""].g <= newg ) continue; - - inclosed = isDefined(closed[child+""]); - if(inclosed && closed[child+""].g <= newg) + + inclosed = isDefined( closed[child + ""] ); + + if ( inclosed && closed[child + ""].g <= newg ) continue; - + node = undefined; - if(inopen) - node = openset[child+""]; - else if(inclosed) - node = closed[child+""]; + + if ( inopen ) + node = openset[child + ""]; + else if ( inclosed ) + node = closed[child + ""]; else node = spawnStruct(); - + node.parent = bestNode; node.g = newg; - node.h = DistanceSquared(childWp.origin, level.waypoints[goalWp].origin); + 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; - + if ( inclosed ) + closed[child + ""] = undefined; + //check if not in open, add it - if(!inopen) + if ( !inopen ) { - open HeapInsert(node); - openset[child+""] = node; + open HeapInsert( node ); + openset[child + ""] = node; } } - + //done with children, push onto closed - closed[bestNode.index+""] = bestNode; + closed[bestNode.index + ""] = bestNode; } - + return []; } /* Returns the natural log of x using harmonic series. */ -Log(x) +Log( x ) { - /*if (!isDefined(level.log_cache)) + /* if (!isDefined(level.log_cache)) level.log_cache = []; - - key = x + ""; - - if (isDefined(level.log_cache[key])) + + key = x + ""; + + if (isDefined(level.log_cache[key])) return level.log_cache[key];*/ //thanks Bob__ at stackoverflow old_sum = 0.0; - xmlxpl = (x - 1) / (x + 1); + xmlxpl = ( x - 1 ) / ( x + 1 ); xmlxpl_2 = xmlxpl * xmlxpl; denom = 1.0; frac = xmlxpl; @@ -2159,9 +2378,9 @@ Log(x) frac *= xmlxpl_2; sum += frac / denom; } - + answer = 2.0 * sum; - + //level.log_cache[key] = answer; return answer; } @@ -2171,24 +2390,29 @@ Log(x) */ array_combine( array1, array2 ) { - if( !array1.size ) + if ( !array1.size ) { - return array2; + return array2; } + array3 = []; keys = GetArrayKeys( array1 ); - for( i = 0;i < keys.size;i++ ) + + for ( i = 0; i < keys.size; i++ ) { key = keys[ i ]; - array3[ array3.size ] = array1[ key ]; - } + array3[ array3.size ] = array1[ key ]; + } + keys = GetArrayKeys( array2 ); - for( i = 0;i < keys.size;i++ ) + + for ( i = 0; i < keys.size; i++ ) { key = keys[ i ]; array3[ array3.size ] = array2[ key ]; } - return array3; + + return array3; } /* @@ -2200,10 +2424,12 @@ array_average( array ) assert( IsArray( array ) ); assert( array.size > 0 ); total = 0; + for ( i = 0; i < array.size; i++ ) { total += array[i]; } + return ( total / array.size ); } @@ -2216,15 +2442,19 @@ array_std_deviation( array, mean ) assert( IsArray( array ) ); 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 ); } @@ -2238,25 +2468,29 @@ 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 ); + + return ( number ); } /* @@ -2269,20 +2503,22 @@ 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++ ) { if ( level.bombZones[index] == self ) 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 ); @@ -2297,14 +2533,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) ) ); + setGameEndTime( int( gettime() + ( level.bombTimer * 1000 ) ) ); setDvar( "ui_bomb_timer", 1 ); - + if ( !level.multiBomb ) { level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); @@ -2314,39 +2550,40 @@ bombPlantedFix( destroyedObj, player ) } else { - + for ( index = 0; index < level.players.size; index++ ) { if ( isDefined( level.players[index].carryIcon ) ) level.players[index].carryIcon destroyElem(); } - trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player ); - + trace = bulletTrace( player.origin + ( 0, 0, 20 ), player.origin - ( 0, 0, 2000 ), false, player ); + tempAngle = randomfloat( 360 ); - forward = (cos( tempAngle ), sin( tempAngle ), 0); + 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" ); /* - destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined ); - destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", undefined ); + destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", undefined ); + destroyedObj maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", undefined ); + destroyedObj maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", undefined ); + 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; visuals = []; - defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,32) ); + defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, ( 0, 0, 32 ) ); defuseObject maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); defuseObject maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); defuseObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); @@ -2361,43 +2598,44 @@ 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 ); else 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) ); + + 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/main_shared/maps/mp/bots/_menu.gsc b/main_shared/maps/mp/bots/_menu.gsc index b92f8f9..770b9e1 100644 --- a/main_shared/maps/mp/bots/_menu.gsc +++ b/main_shared/maps/mp/bots/_menu.gsc @@ -12,10 +12,10 @@ init() { - if (getDvar("bots_main_menu") == "") - setDvar("bots_main_menu", true); + if ( getDvar( "bots_main_menu" ) == "" ) + setDvar( "bots_main_menu", true ); - if (!getDvarInt("bots_main_menu")) + if ( !getDvarInt( "bots_main_menu" ) ) return; thread watchPlayers(); @@ -23,21 +23,21 @@ init() watchPlayers() { - for (;;) + for ( ;; ) { wait 1; - if (!getDvarInt("bots_main_menu")) + if ( !getDvarInt( "bots_main_menu" ) ) return; - for (i = level.players.size - 1; i >= 0; i--) + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[i]; - if (!player is_host()) + if ( !player is_host() ) continue; - if (isDefined(player.menuInit) && player.menuInit) + if ( isDefined( player.menuInit ) && player.menuInit ) continue; player thread init_menu(); @@ -48,55 +48,55 @@ 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(); } kill_menu() { - self notify("bots_kill_menu"); + self notify( "bots_kill_menu" ); self.menuInit = undefined; } watchDisconnect() { - self waittill_either("disconnect", "bots_kill_menu"); - - if(self.menuOpen) + self waittill_either( "disconnect", "bots_kill_menu" ); + + if ( self.menuOpen ) { - if(isDefined(self.MenuTextY)) - for(i = 0; i < self.MenuTextY.size; i++) - if(isDefined(self.MenuTextY[i])) + if ( isDefined( self.MenuTextY ) ) + for ( i = 0; i < self.MenuTextY.size; i++ ) + if ( isDefined( self.MenuTextY[i] ) ) self.MenuTextY[i] destroy(); - - if(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) + + if ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) { - if(isDefined(self.Menu["X"]["Shader"])) + if ( isDefined( self.Menu["X"]["Shader"] ) ) self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) self.Menu["X"]["Scroller"] destroy(); } - if (isDefined(self.menuVersionHud)) + if ( isDefined( self.menuVersionHud ) ) self.menuVersionHud destroy(); } } @@ -106,42 +106,44 @@ doGreetings() self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); wait 1; - self iPrintln("Welcome to Bot Warfare "+self.name+"!"); + self iPrintln( "Welcome to Bot Warfare " + self.name + "!" ); wait 5; - self iPrintln("Press [{+frag}] + [{+smoke}] to open menu!"); + self iPrintln( "Press [{+frag}] + [{+smoke}] to open menu!" ); } watchPlayerOpenMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - - for(;;) + + for ( ;; ) { - while(!self FragButtonPressed() || !self SecondaryOffhandButtonPressed()) + while ( !self FragButtonPressed() || !self SecondaryOffhandButtonPressed() ) wait 0.05; - - if(!self.menuOpen) + + if ( !self.menuOpen ) { self playLocalSound( "mouse_click" ); - self thread OpenSub(self.SubMenu); + self thread OpenSub( self.SubMenu ); } else { self playLocalSound( "mouse_click" ); - if(self.SubMenu != "Main") + + if ( self.SubMenu != "Main" ) self ExitSub(); else { self ExitMenu(); - if(level.inPrematchPeriod || level.gameEnded) - self freezeControls(true); + + if ( level.inPrematchPeriod || level.gameEnded ) + self freezeControls( true ); else - self freezecontrols(false); + self freezecontrols( false ); } } - - while(self FragButtonPressed() && self SecondaryOffhandButtonPressed()) + + while ( self FragButtonPressed() && self SecondaryOffhandButtonPressed() ) wait 0.05; } } @@ -150,22 +152,23 @@ MenuSelect() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - - for(;;) + + for ( ;; ) { - while(!self MeleeButtonPressed()) + while ( !self MeleeButtonPressed() ) wait 0.05; - - if(self.MenuOpen) + + 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"]]); + + if ( self.SubMenu == "Main" ) + self thread [[self.Option["Function"][self.SubMenu][self.Curs["Main"]["X"]]]]( self.Option["Arg1"][self.SubMenu][self.Curs["Main"]["X"]], self.Option["Arg2"][self.SubMenu][self.Curs["Main"]["X"]] ); else - self thread [[self.Option["Function"][self.SubMenu][self.Curs[self.SubMenu]["Y"]]]](self.Option["Arg1"][self.SubMenu][self.Curs[self.SubMenu]["Y"]],self.Option["Arg2"][self.SubMenu][self.Curs[self.SubMenu]["Y"]]); + 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()) + + while ( self MeleeButtonPressed() ) wait 0.05; } } @@ -175,36 +178,36 @@ LeftMenu() self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - for(;;) + for ( ;; ) { - while(!self AttackButtonPressed()) + while ( !self AttackButtonPressed() ) wait 0.05; - - if(self.MenuOpen) + + if ( self.MenuOpen ) { - self playLocalSound("mouse_over"); - - if(self.SubMenu == "Main") + 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; + if ( self.Curs["Main"]["X"] < 0 ) + self.Curs["Main"]["X"] = self.Option["Name"][self.SubMenu].size - 1; - self CursMove("X"); + 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; + if ( self.Curs[self.SubMenu]["Y"] < 0 ) + self.Curs[self.SubMenu]["Y"] = self.Option["Name"][self.SubMenu].size - 1; - self CursMove("Y"); + self CursMove( "Y" ); } } - - while(self AttackButtonPressed()) + + while ( self AttackButtonPressed() ) wait 0.05; } } @@ -214,242 +217,249 @@ RightMenu() self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - for(;;) + for ( ;; ) { - while(!self AdsButtonPressed()) + while ( !self AdsButtonPressed() ) wait 0.05; - - if(self.MenuOpen) + + if ( self.MenuOpen ) { - self playLocalSound("mouse_over"); - - if(self.SubMenu == "Main") + self playLocalSound( "mouse_over" ); + + if ( self.SubMenu == "Main" ) { self.Curs["Main"]["X"]++; - if(self.Curs["Main"]["X"] > self.Option["Name"][self.SubMenu].size -1) + if ( self.Curs["Main"]["X"] > self.Option["Name"][self.SubMenu].size - 1 ) self.Curs["Main"]["X"] = 0; - self CursMove("X"); + self CursMove( "X" ); } else { self.Curs[self.SubMenu]["Y"]++; - if(self.Curs[self.SubMenu]["Y"] > self.Option["Name"][self.SubMenu].size -1) + if ( self.Curs[self.SubMenu]["Y"] > self.Option["Name"][self.SubMenu].size - 1 ) self.Curs[self.SubMenu]["Y"] = 0; - self CursMove("Y"); + self CursMove( "Y" ); } } - - while(self AdsButtonPressed()) + + while ( self AdsButtonPressed() ) wait 0.05; } } -OpenSub(menu, menu2) +OpenSub( menu, menu2 ) { - if(menu != "Main" && (!isDefined(self.Menu[menu]) || !!isDefined(self.Menu[menu]["FirstOpen"]))) + if ( menu != "Main" && ( !isDefined( self.Menu[menu] ) || !!isDefined( self.Menu[menu]["FirstOpen"] ) ) ) { self.Curs[menu]["Y"] = 0; self.Menu[menu]["FirstOpen"] = true; } - + logoldi = true; self.SubMenu = menu; - - if(self.SubMenu == "Main") + + if ( self.SubMenu == "Main" ) { - if(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) + if ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) { - if(isDefined(self.Menu["X"]["Shader"])) + if ( isDefined( self.Menu["X"]["Shader"] ) ) self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) self.Menu["X"]["Scroller"] destroy(); } - if (isDefined(self.menuVersionHud)) + if ( isDefined( self.menuVersionHud ) ) self.menuVersionHud destroy(); - - for(i=0 ; i < self.Option["Name"][self.SubMenu].size ; i++) + + 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.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) + + 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] 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"); + if ( !logOldi ) + self.Menu["X"]["Shader"] = self createRectangle( "CENTER", "CENTER", 0, -225, 1000, 90, ( 0, 0, 0 ), -2, 1, "white" ); else - self.Menu["X"]["Shader"] = self createRectangle("CENTER","CENTER",0,-225,1000,30, (0,0,0), -2, 1,"white"); + self.Menu["X"]["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.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.menuVersionHud = initHudElem("Bot Warfare " + level.bw_VERSION, 0, 0); - self.MenuOpen = true; } else { - if(isDefined(self.MenuTextY)) - for(i=0 ; i < self.MenuTextY.size ; i++) - if(isDefined(self.MenuTextY[i])) + if ( isDefined( self.MenuTextY ) ) + for ( i = 0 ; i < self.MenuTextY.size ; i++ ) + if ( isDefined( self.MenuTextY[i] ) ) self.MenuTextY[i] destroy(); - - for(i=0 ; i < self.Option["Name"][self.SubMenu].size ; i++) + + for ( i = 0 ; i < self.Option["Name"][self.SubMenu].size ; i++ ) { - self.MenuTextY[i] = self createfontstring("default", 1.6); - self.MenuTextY[i] setpoint("CENTER", "CENTER", self.MenuText[self.Curs["Main"]["X"]].x, -160+(i*20)); - self.MenuTextY[i] settext(self.Option["Name"][self.SubMenu][i]); + self.MenuTextY[i] = self createfontstring( "default", 1.6 ); + self.MenuTextY[i] setpoint( "CENTER", "CENTER", self.MenuText[self.Curs["Main"]["X"]].x, -160 + ( i * 20 ) ); + self.MenuTextY[i] settext( self.Option["Name"][self.SubMenu][i] ); self.MenuTextY[i].alpha = 1; self.MenuTextY[i].sort = 999; } - - self CursMove("Y"); + + self CursMove( "Y" ); } } -CursMove(direction) +CursMove( direction ) { - self notify("scrolled"); - if(self.SubMenu == "Main") + 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)) + + if ( isDefined( self.MenuText ) ) { - for(i = 0; i < self.MenuText.size; i++) + for ( i = 0; i < self.MenuText.size; i++ ) { - if(isDefined(self.MenuText[i])) + if ( isDefined( self.MenuText[i] ) ) { self.MenuText[i].fontscale = 1.5; - self.MenuText[i].color = (1,1,1); + self.MenuText[i].color = ( 1, 1, 1 ); self.MenuText[i].glowAlpha = 0; } } } - - self thread ShowOptionOn(direction); + + self thread ShowOptionOn( direction ); } else { - if(isDefined(self.MenuTextY)) + if ( isDefined( self.MenuTextY ) ) { - for(i = 0; i < self.MenuTextY.size; i++) + for ( i = 0; i < self.MenuTextY.size; i++ ) { - if(isDefined(self.MenuTextY[i])) + if ( isDefined( self.MenuTextY[i] ) ) { self.MenuTextY[i].fontscale = 1.5; - self.MenuTextY[i].color = (1,1,1); + self.MenuTextY[i].color = ( 1, 1, 1 ); self.MenuTextY[i].glowAlpha = 0; } } } - - if(isDefined(self.MenuText)) + + if ( isDefined( self.MenuText ) ) { - for(i = 0; i < self.MenuText.size; i++) + for ( i = 0; i < self.MenuText.size; i++ ) { - if(isDefined(self.MenuText[i])) + if ( isDefined( self.MenuText[i] ) ) { self.MenuText[i].fontscale = 1.5; - self.MenuText[i].color = (1,1,1); + self.MenuText[i].color = ( 1, 1, 1 ); self.MenuText[i].glowAlpha = 0; } } } - - self thread ShowOptionOn(direction); + + self thread ShowOptionOn( direction ); } } -ShowOptionOn(variable) +ShowOptionOn( variable ) { - self endon("scrolled"); - self endon("disconnect"); - self endon("exit"); - self endon("bots_kill_menu"); - - for(time=0;;time+=0.05) + self endon( "scrolled" ); + 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) - self freezecontrols(false); + if ( !self isOnGround() && isAlive( self ) && !level.inPrematchPeriod && !level.gameEnded ) + self freezecontrols( false ); else - self freezecontrols(true); - - self setClientDvar( "r_blur", "5" ); + self freezecontrols( true ); + + self setClientDvar( "r_blur", "5" ); self setClientDvar( "sc_blur", "4" ); self addOptions(); - - if(self.SubMenu == "Main") + + if ( self.SubMenu == "Main" ) { - if(isDefined(self.Curs[self.SubMenu][variable]) && isDefined(self.MenuText) && isDefined(self.MenuText[self.Curs[self.SubMenu][variable]])) + if ( isDefined( self.Curs[self.SubMenu][variable] ) && isDefined( self.MenuText ) && isDefined( self.MenuText[self.Curs[self.SubMenu][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); + 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)) + + if ( isDefined( self.MenuText ) ) { - for(i = 0; i < self.Option["Name"][self.SubMenu].size; i++) + for ( i = 0; i < self.Option["Name"][self.SubMenu].size; i++ ) { - if(isDefined(self.MenuText[i])) - self.MenuText[i] settext(self.Option["Name"][self.SubMenu][i]); + if ( isDefined( self.MenuText[i] ) ) + self.MenuText[i] settext( self.Option["Name"][self.SubMenu][i] ); } } } else { - if(isDefined(self.Curs[self.SubMenu][variable]) && isDefined(self.MenuTextY) && isDefined(self.MenuTextY[self.Curs[self.SubMenu][variable]])) + if ( isDefined( self.Curs[self.SubMenu][variable] ) && isDefined( self.MenuTextY ) && isDefined( self.MenuTextY[self.Curs[self.SubMenu][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); + 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)) + + if ( isDefined( self.MenuTextY ) ) { - for(i = 0; i < self.Option["Name"][self.SubMenu].size; i++) + for ( i = 0; i < self.Option["Name"][self.SubMenu].size; i++ ) { - if(isDefined(self.MenuTextY[i])) - self.MenuTextY[i] settext(self.Option["Name"][self.SubMenu][i]); + if ( isDefined( self.MenuTextY[i] ) ) + self.MenuTextY[i] settext( self.Option["Name"][self.SubMenu][i] ); } } } - + wait 0.05; } } -AddMenu(menu, num, text, function, arg1, arg2) +AddMenu( menu, num, text, function, arg1, arg2 ) { self.Option["Name"][menu][num] = text; self.Option["Function"][menu][num] = function; @@ -457,56 +467,56 @@ AddMenu(menu, num, text, function, arg1, arg2) self.Option["Arg2"][menu][num] = arg2; } -AddBack(menu, back) +AddBack( menu, back ) { self.Menu["Back"][menu] = back; } ExitSub() { - if(isDefined(self.MenuTextY)) - for(i = 0; i < self.MenuTextY.size; i++) - if(isDefined(self.MenuTextY[i])) + if ( isDefined( self.MenuTextY ) ) + for ( i = 0; i < self.MenuTextY.size; i++ ) + if ( isDefined( self.MenuTextY[i] ) ) self.MenuTextY[i] destroy(); - + self.SubMenu = self.Menu["Back"][self.Submenu]; - - if(self.SubMenu == "Main") - self CursMove("X"); + + if ( self.SubMenu == "Main" ) + self CursMove( "X" ); else - self CursMove("Y"); + self CursMove( "Y" ); } ExitMenu() { - if(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) + if ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) { - if(isDefined(self.Menu["X"]["Shader"])) + if ( isDefined( self.Menu["X"]["Shader"] ) ) self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) self.Menu["X"]["Scroller"] destroy(); } - if (isDefined(self.menuVersionHud)) + if ( isDefined( self.menuVersionHud ) ) self.menuVersionHud destroy(); - + self.MenuOpen = false; - self notify("exit"); - + self notify( "exit" ); + self setClientDvar( "r_blur", "0" ); self setClientDvar( "sc_blur", "2" ); } -initHudElem(txt, xl, yl) +initHudElem( txt, xl, yl ) { hud = NewClientHudElem( self ); - hud setText(txt); + hud setText( txt ); hud.alignX = "center"; hud.alignY = "bottom"; hud.horzAlign = "center"; @@ -521,11 +531,11 @@ initHudElem(txt, xl, yl) hud.glowColor = ( 0, 0, 0 ); hud.glowAlpha = 1; hud.color = ( 1.0, 1.0, 1.0 ); - + return hud; } -createRectangle(align,relative,x,y,width,height,color,sort,alpha,shader) +createRectangle( align, relative, x, y, width, height, color, sort, alpha, shader ) { barElemBG = newClientHudElem( self ); barElemBG.elemType = "bar_"; @@ -540,479 +550,582 @@ createRectangle(align,relative,x,y,width,height,color,sort,alpha,shader) barElemBG.color = color; barElemBG.alpha = alpha; barElemBG setParent( level.uiParent ); - barElemBG setShader( shader, width , height ); + barElemBG setShader( shader, width, height ); barElemBG.hidden = false; - barElemBG setPoint(align, relative, x, y); + barElemBG setPoint( align, relative, x, y ); return barElemBG; } AddOptions() { - self AddMenu("Main", 0, "Manage bots", ::OpenSub, "man_bots", ""); - self AddBack("man_bots", "Main"); - + 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); - self AddMenu("man_bots", 1, "Add 3 bot", ::man_bots, "add", 3 + _tempDvar); - self AddMenu("man_bots", 2, "Add 7 bot", ::man_bots, "add", 7 + _tempDvar); - self AddMenu("man_bots", 3, "Add 11 bot", ::man_bots, "add", 11 + _tempDvar); - 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) + _tempDvar = getDvarInt( "bots_manage_add" ); + self AddMenu( "man_bots", 0, "Add 1 bot", ::man_bots, "add", 1 + _tempDvar ); + self AddMenu( "man_bots", 1, "Add 3 bot", ::man_bots, "add", 3 + _tempDvar ); + self AddMenu( "man_bots", 2, "Add 7 bot", ::man_bots, "add", 7 + _tempDvar ); + self AddMenu( "man_bots", 3, "Add 11 bot", ::man_bots, "add", 11 + _tempDvar ); + 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"; else _temp = "false"; - self AddMenu("man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar); - - _tempDvar = getDvarInt("bots_manage_fill_mode"); - switch(_tempDvar) + + 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; + break; + case 1: _temp = "just bots"; - break; + break; + case 2: _temp = "everyone, adjust to map"; - break; + break; + case 3: _temp = "just bots, adjust to map"; - break; + break; + case 4: _temp = "bots used as team balance"; - break; + break; + default: _temp = "out of range"; - break; + 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) + + 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"; else _temp = "false"; - self AddMenu("man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar); + + 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) + 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"; else _temp = "false"; - self AddMenu("man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar); - - _tempDvar = getDvarInt("bots_team_mode"); - if(_tempDvar) + + self AddMenu( "man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar ); + + _tempDvar = getDvarInt( "bots_team_mode" ); + + if ( _tempDvar ) _temp = "only bots"; else _temp = "everyone"; - self AddMenu("man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar); - - _tempDvar = getdvarint("bots_skill"); - switch(_tempDvar) + + 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; + break; + case 1: _temp = "too easy"; - break; + break; + case 2: _temp = "easy"; - break; + break; + case 3: _temp = "easy-medium"; - break; + break; + case 4: _temp = "medium"; - break; + break; + case 5: _temp = "hard"; - break; + break; + case 6: _temp = "very hard"; - break; + break; + case 7: _temp = "hardest"; - break; + break; + case 8: _temp = "custom"; - break; + break; + case 9: _temp = "complete random"; - break; + break; + default: _temp = "out of range"; - break; + 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( "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"); + self AddMenu( "Main", 2, "Bot settings", ::OpenSub, "set1", "" ); + self AddBack( "set1", "Main" ); - _tempDvar = getDvarInt("bots_loadout_reasonable"); - if(_tempDvar) + _tempDvar = getDvarInt( "bots_loadout_reasonable" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 0, "Bots use only good class setups: "+_temp, ::bot_func, "reasonable", _tempDvar); - _tempDvar = getDvarInt("bots_loadout_allow_op"); - if(_tempDvar) + self AddMenu( "set1", 0, "Bots use only good class setups: " + _temp, ::bot_func, "reasonable", _tempDvar ); + + _tempDvar = getDvarInt( "bots_loadout_allow_op" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 1, "Bots can use op and annoying class setups: "+_temp, ::bot_func, "op", _tempDvar); - _tempDvar = getDvarInt("bots_play_move"); - if(_tempDvar) + self AddMenu( "set1", 1, "Bots can use op and annoying class setups: " + _temp, ::bot_func, "op", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_move" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 2, "Bots can move: "+_temp, ::bot_func, "move", _tempDvar); - _tempDvar = getDvarInt("bots_play_knife"); - if(_tempDvar) + self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_knife" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 3, "Bots can knife: "+_temp, ::bot_func, "knife", _tempDvar); - _tempDvar = getDvarInt("bots_play_fire"); - if(_tempDvar) + self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_fire" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 4, "Bots can fire: "+_temp, ::bot_func, "fire", _tempDvar); - _tempDvar = getDvarInt("bots_play_nade"); - if(_tempDvar) + self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_nade" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 5, "Bots can nade: "+_temp, ::bot_func, "nade", _tempDvar); - _tempDvar = getDvarInt("bots_play_obj"); - if(_tempDvar) + self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_obj" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 6, "Bots play the objective: "+_temp, ::bot_func, "obj", _tempDvar); - _tempDvar = getDvarInt("bots_play_camp"); - if(_tempDvar) + self AddMenu( "set1", 6, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_camp" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 7, "Bots can camp: "+_temp, ::bot_func, "camp", _tempDvar); - _tempDvar = getDvarInt("bots_play_jumpdrop"); - if(_tempDvar) + self AddMenu( "set1", 7, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_jumpdrop" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 8, "Bots can jump and dropshot: "+_temp, ::bot_func, "jump", _tempDvar); - _tempDvar = getDvarInt("bots_play_target_other"); - if(_tempDvar) + self AddMenu( "set1", 8, "Bots can jump and dropshot: " + _temp, ::bot_func, "jump", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_target_other" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 9, "Bots can target other script objects: "+_temp, ::bot_func, "targetother", _tempDvar); - _tempDvar = getDvarInt("bots_play_killstreak"); - if(_tempDvar) + self AddMenu( "set1", 9, "Bots can target other script objects: " + _temp, ::bot_func, "targetother", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_killstreak" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 10, "Bots can use killstreaks: "+_temp, ::bot_func, "killstreak", _tempDvar); - _tempDvar = getDvarInt("bots_play_ads"); - if(_tempDvar) + self AddMenu( "set1", 10, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_ads" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 11, "Bots can ads: "+_temp, ::bot_func, "ads", _tempDvar); + + self AddMenu( "set1", 11, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar ); } -bot_func(a, b) +bot_func( a, b ) { - switch (a) + switch ( a ) { case "reasonable": - setDvar("bots_loadout_reasonable", !b); - self iPrintln("Bots using reasonable setups: " + !b); - break; + 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; + 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; + setDvar( "bots_play_move", !b ); + self iPrintln( "Bots move: " + !b ); + break; + case "knife": - setDvar("bots_play_knife", !b); - self iPrintln("Bots knife: " + !b); - break; + setDvar( "bots_play_knife", !b ); + self iPrintln( "Bots knife: " + !b ); + break; + case "fire": - setDvar("bots_play_fire", !b); - self iPrintln("Bots fire: " + !b); - break; + setDvar( "bots_play_fire", !b ); + self iPrintln( "Bots fire: " + !b ); + break; + case "nade": - setDvar("bots_play_nade", !b); - self iPrintln("Bots nade: " + !b); - break; + 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; + 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; + setDvar( "bots_play_camp", !b ); + self iPrintln( "Bots camp: " + !b ); + break; + case "jump": - setDvar("bots_play_jumpdrop", !b); - self iPrintln("Bots jump: " + !b); - break; + 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; + 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; + setDvar( "bots_play_killstreak", !b ); + self iPrintln( "Bots use killstreaks: " + !b ); + break; + case "ads": - setDvar("bots_play_ads", !b); - self iPrintln("Bots ads: " + !b); - break; + setDvar( "bots_play_ads", !b ); + self iPrintln( "Bots ads: " + !b ); + break; } } -bot_teams(a, b) +bot_teams( a, b ) { - switch(a) + switch ( a ) { case "team": - switch(b) + switch ( b ) { case "autoassign": - setdvar("bots_team", "allies"); - self iPrintlnBold("Changed bot team to allies."); - break; + 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; + 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; + 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; + setdvar( "bots_team", "autoassign" ); + self iPrintlnBold( "Changed bot team to autoassign." ); + break; } - break; + + break; + case "teamup": - setdvar("bots_team_amount", b+1); - self iPrintln((b+1)+" bot(s) will try to be on axis team."); - break; + 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; + 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; + 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; + setDvar( "bots_team_mode", !b ); + self iPrintln( "Only count bots on team: " + !b ); + break; + case "skill": - switch(b) + switch ( b ) { case 0: - self iPrintlnBold("Changed bot skill to easy."); - setDvar("bots_skill", 1); - break; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + 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; + self iPrintlnBold( "Changed bot skill to random. Takes effect at restart." ); + setDvar( "bots_skill", 0 ); + break; } - break; + + break; + case "axishardup": - setdvar("bots_skill_axis_hard", (b+1)); - self iPrintln(((b+1))+" hard bots will be on axis team."); - break; + 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; + 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; + 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; + 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; + 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; + 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; + 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."); - break; + setdvar( "bots_skill_allies_med", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " med bots will be on allies team." ); + break; } } -man_bots(a, b) +man_bots( a, b ) { - switch(a) + switch ( a ) { case "add": - setdvar("bots_manage_add", b); - if(b == 1) + setdvar( "bots_manage_add", b ); + + if ( b == 1 ) { - self iPrintln("Adding "+b+" bot."); + self iPrintln( "Adding " + b + " bot." ); } else { - self iPrintln("Adding "+b+" bots."); + self iPrintln( "Adding " + b + " bots." ); } - break; + + break; + case "kick": - for (i = 0; i < b; i++) + for ( i = 0; i < b; i++ ) { RemoveTestClient(); wait 0.25; } - break; + + break; + case "autokick": - setDvar("bots_manage_fill_kick", !b); - self iPrintln("Kicking bots when bots_fill is exceeded: " + !b); - break; + setDvar( "bots_manage_fill_kick", !b ); + self iPrintln( "Kicking bots when bots_fill is exceeded: " + !b ); + break; + case "fillmode": - switch(b) + switch ( b ) { case 0: - setdvar("bots_manage_fill_mode", 1); - self iPrintln("bot_fill will now count only bots."); - break; + 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; + 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; + 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; + 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; + setdvar( "bots_manage_fill_mode", 0 ); + self iPrintln( "bot_fill will now count everyone." ); + break; } - break; + + break; + case "fillup": - setdvar("bots_manage_fill", b+1); - self iPrintln("Increased to maintain "+(b+1)+" bot(s)."); - break; + 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; + 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); - break; + setDvar( "bots_manage_fill_spec", !b ); + self iPrintln( "Count players on spectator for bots_fill: " + !b ); + break; } } diff --git a/main_shared/maps/mp/bots/_wp_editor.gsc b/main_shared/maps/mp/bots/_wp_editor.gsc index 80ce3d6..e4dedf8 100644 --- a/main_shared/maps/mp/bots/_wp_editor.gsc +++ b/main_shared/maps/mp/bots/_wp_editor.gsc @@ -1,631 +1,648 @@ -/* - _wp_editor - Author: INeedGames - Date: 09/26/2020 - The ingame waypoint editor. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -init() -{ - if(getDvar("bots_main_debug") == "") - 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); - setdvar("bots_manage_fill", 0); - 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"); - self thread beginDebug(); - } -} - -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 = []; - self giveWeapon("m16_gl_mp"); - 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"); -} - -sayExtras() -{ - self endon("disconnect"); - self endon("death"); - self iprintln("Making a crouch waypoint with only one link..."); - self iprintln("Makes a camping waypoint."); -} - -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) - stringChildren = stringChildren + "," + level.waypoints[closest].children[i]; - else - 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")); - } - } -} - -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; - } -} - -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); - else - self UnLinkWaypoint(self.closest); - - self.command = undefined; - - while(self MeleeButtonPressed()) - wait 0.05; - } -} - -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(); - else if(self adsButtonPressed()) - self LoadWaypoints(); - else - self DeleteWaypoint(self.closest); - - self.command = undefined; - - while(self fragButtonPressed()) - wait 0.05; - } -} - -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"; - fd = FS_FOpen(filename, "write"); - - PrintLn("********* Start Bot Warfare WPDump *********"); - PrintLn(level.waypointCount); - - if (fd > 0) - { - if (!FS_WriteLine(fd, level.waypointCount+"")) - { - FS_FClose(fd); - fd = 0; - } - } - 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] + ","; - else - str += ","; - - str += ","; - - PrintLn(str); - - if (fd > 0) - { - if (!FS_WriteLine(fd, str)) - { - FS_FClose(fd); - fd = 0; - } - } - } - PrintLn("\n\n\n\n\n\n"); - - self iprintln("Saved!!! to " + filename); - - if (fd > 0) - FS_FClose(fd); - } - else - { - if(level.autoLink) - { - self iPrintlnBold("Auto link disabled"); - level.autoLink = false; - level.wpToLink = -1; - } - else - { - self iPrintlnBold("Auto link enabled"); - level.autoLink = true; - level.wpToLink = self.closest; - } - } - - self.command = undefined; - - while(self useButtonPressed() && self attackButtonPressed()) - wait 0.05; - } -} - -LoadWaypoints() -{ - self DeleteAllWaypoints(); - self iPrintlnBold("Loading WPS..."); - load_waypoints(); - - wait 1; - - self checkForWarnings(); -} - -checkForWarnings() -{ - if(level.waypointCount <= 0) - self iprintln("WARNING: waypointCount is "+level.waypointCount); - - if(level.waypointCount != level.waypoints.size) - self iprintln("WARNING: waypointCount is not "+level.waypoints.size); - - for(i = 0; i < level.waypointCount; i++) - { - if(!isDefined(level.waypoints[i])) - { - 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); - else - { - if (!isDefined(level.waypoints[i].children) || !isDefined(level.waypoints[i].children.size)) - { - self iprintln("WARNING: waypoint "+i+" children is not defined"); - } - else - { - 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"); - else if(child == i) - self iprintln("WARNING: waypoint "+i+" child "+child+" is itself"); - } - } - } - - 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"); - } -} - -DeleteAllWaypoints() -{ - level.waypoints = []; - level.waypointCount = 0; - - self iprintln("DelAllWps"); -} - -DeleteWaypoint(nwp) -{ - if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) - { - 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--) - { - if(level.waypoints[i].children[h] > nwp) - level.waypoints[i].children[h]--; - } - } - - for ( entry = 0; entry < level.waypointCount; entry++ ) - { - if ( entry == nwp ) - { - while ( entry < level.waypointCount-1 ) - { - 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"; - else if(self AttackButtonPressed() && self UseButtonPressed()) - level.waypoints[level.waypointCount].type = "tube"; - else if(self AttackButtonPressed()) - level.waypoints[level.waypointCount].type = "grenade"; - else if(self UseButtonPressed()) - level.waypoints[level.waypointCount].type = "claymore"; - else - level.waypoints[level.waypointCount].type = self getStance(); - - level.waypoints[level.waypointCount].angles = self getPlayerAngles(); - - 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); - } - else - { - level.waypointCount++; - } -} - -UnLinkWaypoint(nwp) -{ - if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) - { - self iprintln("Waypoint Unlink Cancelled "+level.wpToLink); - 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; -} - -LinkWaypoint(nwp) -{ - if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) - { - self iprintln("Waypoint Link Cancelled "+level.wpToLink); - 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) - { - weGood = false; - break; - } - } - if(weGood) - { - for(i = level.waypoints[nwp].children.size - 1; i >= 0; i--) - { - if(level.waypoints[nwp].children[i] == level.wpToLink) - { - weGood = false; - break; - } - } - } - - 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; -} - -destroyOnDeath(hud) -{ - hud endon("death"); - self waittill_either("death","disconnect"); - hud destroy(); -} - -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); - text setPoint("CENTER", undefined, -1200, 220, 20); - wait 20; - } -} +/* + _wp_editor + Author: INeedGames + Date: 09/26/2020 + The ingame waypoint editor. +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\bots\_bot_utility; + +init() +{ + if ( getDvar( "bots_main_debug" ) == "" ) + 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 ); + setdvar( "bots_manage_fill", 0 ); + 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" ); + self thread beginDebug(); + } +} + +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 = []; + self giveWeapon( "m16_gl_mp" ); + 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" ); +} + +sayExtras() +{ + self endon( "disconnect" ); + self endon( "death" ); + self iprintln( "Making a crouch waypoint with only one link..." ); + self iprintln( "Makes a camping waypoint." ); +} + +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 ) + stringChildren = stringChildren + "," + level.waypoints[closest].children[i]; + else + 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" ) ); + } + } +} + +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; + } +} + +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 ); + else + self UnLinkWaypoint( self.closest ); + + self.command = undefined; + + while ( self MeleeButtonPressed() ) + wait 0.05; + } +} + +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(); + else if ( self adsButtonPressed() ) + self LoadWaypoints(); + else + self DeleteWaypoint( self.closest ); + + self.command = undefined; + + while ( self fragButtonPressed() ) + wait 0.05; + } +} + +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"; + fd = FS_FOpen( filename, "write" ); + + PrintLn( "********* Start Bot Warfare WPDump *********" ); + PrintLn( level.waypointCount ); + + if ( fd > 0 ) + { + if ( !FS_WriteLine( fd, level.waypointCount + "" ) ) + { + FS_FClose( fd ); + fd = 0; + } + } + + 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] + ","; + else + str += ","; + + str += ","; + + PrintLn( str ); + + if ( fd > 0 ) + { + if ( !FS_WriteLine( fd, str ) ) + { + FS_FClose( fd ); + fd = 0; + } + } + } + + PrintLn( "\n\n\n\n\n\n" ); + + self iprintln( "Saved!!! to " + filename ); + + if ( fd > 0 ) + FS_FClose( fd ); + } + else + { + if ( level.autoLink ) + { + self iPrintlnBold( "Auto link disabled" ); + level.autoLink = false; + level.wpToLink = -1; + } + else + { + self iPrintlnBold( "Auto link enabled" ); + level.autoLink = true; + level.wpToLink = self.closest; + } + } + + self.command = undefined; + + while ( self useButtonPressed() && self attackButtonPressed() ) + wait 0.05; + } +} + +LoadWaypoints() +{ + self DeleteAllWaypoints(); + self iPrintlnBold( "Loading WPS..." ); + load_waypoints(); + + wait 1; + + self checkForWarnings(); +} + +checkForWarnings() +{ + if ( level.waypointCount <= 0 ) + self iprintln( "WARNING: waypointCount is " + level.waypointCount ); + + if ( level.waypointCount != level.waypoints.size ) + self iprintln( "WARNING: waypointCount is not " + level.waypoints.size ); + + for ( i = 0; i < level.waypointCount; i++ ) + { + if ( !isDefined( level.waypoints[i] ) ) + { + 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 ); + else + { + if ( !isDefined( level.waypoints[i].children ) || !isDefined( level.waypoints[i].children.size ) ) + { + self iprintln( "WARNING: waypoint " + i + " children is not defined" ); + } + else + { + 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" ); + else if ( child == i ) + self iprintln( "WARNING: waypoint " + i + " child " + child + " is itself" ); + } + } + } + + 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" ); + } +} + +DeleteAllWaypoints() +{ + level.waypoints = []; + level.waypointCount = 0; + + self iprintln( "DelAllWps" ); +} + +DeleteWaypoint( nwp ) +{ + if ( nwp == -1 || distance( self.origin, level.waypoints[nwp].origin ) > getDvarFloat( "bots_main_debug_minDist" ) ) + { + 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-- ) + { + if ( level.waypoints[i].children[h] > nwp ) + level.waypoints[i].children[h]--; + } + } + + for ( entry = 0; entry < level.waypointCount; entry++ ) + { + if ( entry == nwp ) + { + while ( entry < level.waypointCount - 1 ) + { + 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"; + else if ( self AttackButtonPressed() && self UseButtonPressed() ) + level.waypoints[level.waypointCount].type = "tube"; + else if ( self AttackButtonPressed() ) + level.waypoints[level.waypointCount].type = "grenade"; + else if ( self UseButtonPressed() ) + level.waypoints[level.waypointCount].type = "claymore"; + else + level.waypoints[level.waypointCount].type = self getStance(); + + level.waypoints[level.waypointCount].angles = self getPlayerAngles(); + + 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 ); + } + else + { + level.waypointCount++; + } +} + +UnLinkWaypoint( nwp ) +{ + if ( nwp == -1 || distance( self.origin, level.waypoints[nwp].origin ) > getDvarFloat( "bots_main_debug_minDist" ) ) + { + self iprintln( "Waypoint Unlink Cancelled " + level.wpToLink ); + 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; +} + +LinkWaypoint( nwp ) +{ + if ( nwp == -1 || distance( self.origin, level.waypoints[nwp].origin ) > getDvarFloat( "bots_main_debug_minDist" ) ) + { + self iprintln( "Waypoint Link Cancelled " + level.wpToLink ); + 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 ) + { + weGood = false; + break; + } + } + + if ( weGood ) + { + for ( i = level.waypoints[nwp].children.size - 1; i >= 0; i-- ) + { + if ( level.waypoints[nwp].children[i] == level.wpToLink ) + { + weGood = false; + break; + } + } + } + + 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; +} + +destroyOnDeath( hud ) +{ + hud endon( "death" ); + self waittill_either( "death", "disconnect" ); + hud destroy(); +} + +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 ); + text setPoint( "CENTER", undefined, -1200, 220, 20 ); + wait 20; + } +}