diff --git a/main_shared/maps/mp/bots/_bot.gsc b/main_shared/maps/mp/bots/_bot.gsc index b125775..70d769b 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["thompson"] = true; level.bots_fullautoguns["mp40"] = true; @@ -130,11 +156,11 @@ init() level.bots_fullautoguns["bar"] = true; level.bots_fullautoguns["fg42"] = true; level.bots_fullautoguns["type99lmg"] = true; - + level thread fixGamemodes(); level thread onUAVAlliesUpdate(); level thread onUAVAxisUpdate(); - + level thread onPlayerConnect(); level thread handleBots(); @@ -152,39 +178,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 ); } /* @@ -195,7 +221,7 @@ hook_callbacks() wait 0.05; level.prevCallbackPlayerDamage = level.callbackPlayerDamage; level.callbackPlayerDamage = ::onPlayerDamage; - + level.prevCallbackPlayerKilled = level.callbackPlayerKilled; level.callbackPlayerKilled = ::onPlayerKilled; } @@ -206,26 +232,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; } } @@ -235,22 +261,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; } } @@ -260,15 +287,15 @@ fixGamemodes() */ onPlayerConnect() { - for(;;) + for ( ;; ) { - level waittill("connected", player); - + level waittill( "connected", player ); + player thread onGrenadeFire(); player thread onWeaponFired(); player thread doPlayerModelFix(); player thread onPlayerSpawned(); - + player thread connected(); } } @@ -278,15 +305,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; } @@ -295,9 +322,9 @@ fixPerksAndScriptKick() */ onDisconnect() { - self waittill("disconnect"); - - level.bots = array_remove(level.bots, self); + self waittill( "disconnect" ); + + level.bots = array_remove( level.bots, self ); } /* @@ -305,35 +332,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 ); } /* @@ -341,8 +368,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(); } @@ -354,7 +381,7 @@ add_bot() { bot = addtestclient(); - if (isdefined(bot)) + if ( isdefined( bot ) ) { bot.pers["isBot"] = true; bot.pers["isBotWarfare"] = true; @@ -367,38 +394,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; @@ -406,14 +434,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; @@ -423,16 +451,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; } } @@ -443,10 +472,10 @@ diffBots_loop() */ diffBots() { - for(;;) + for ( ;; ) { wait 1.5; - + diffBots_loop(); } } @@ -456,83 +485,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; } } @@ -541,19 +574,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; @@ -561,12 +595,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; @@ -581,10 +615,10 @@ teamBots_loop() */ teamBots() { - for(;;) + for ( ;; ) { wait 1.5; - + teamBots_loop(); } } @@ -594,103 +628,108 @@ 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" ) ) { - tempBot = PickRandom(getBotArray()); - if (isDefined(tempBot)) + tempBot = PickRandom( getBotArray() ); + + if ( isDefined( tempBot ) ) tempBot RemoveTestClient(); } } @@ -700,14 +739,14 @@ addBots_loop() */ addBots() { - level endon("game_ended"); + level endon( "game_ended" ); bot_wait_for_host(); - - for(;;) + + for ( ;; ) { wait 1.5; - + addBots_loop(); } } @@ -717,8 +756,9 @@ addBots() */ onPlayerSpawned() { - self endon("disconnect"); - for(;;) + self endon( "disconnect" ); + + for ( ;; ) { self waittill ( "spawned_player" ); self.gib_ref = undefined; @@ -730,16 +770,18 @@ onPlayerSpawned() */ 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 == "m8_white_smoke_mp") + + if ( weaponName == "m8_white_smoke_mp" ) grenade thread AddToSmokeList(); } } @@ -753,10 +795,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 ); } /* @@ -764,16 +806,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 ); } /* @@ -781,10 +824,10 @@ thinkSmoke() */ onUAVAxisUpdate() { - for(;;) + for ( ;; ) { level waittill( "radar_timer_kill_axis" ); - level thread doUAVUpdate("axis"); + level thread doUAVUpdate( "axis" ); } } @@ -793,46 +836,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; } @@ -844,8 +888,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; } @@ -855,9 +899,10 @@ doPlayerModelFix() */ onWeaponFired() { - self endon("disconnect"); + self endon( "disconnect" ); self.bots_firing = false; - for(;;) + + for ( ;; ) { self waittill( "weapon_fired" ); self thread doFiringThread(); @@ -869,8 +914,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 f8bce39..2dc8fe6 100644 --- a/main_shared/maps/mp/bots/_bot_http.gsc +++ b/main_shared/maps/mp/bots/_bot_http.gsc @@ -1,115 +1,117 @@ -/* - _bot_http - Author: INeedGames - Date: 12/16/2020 - The HTTP module -*/ - -#include maps\mp\bots\_bot_utility; - -/* - Will attempt to retreive waypoints from the internet -*/ -getRemoteWaypoints(mapname) -{ - url = "https://raw.githubusercontent.com/ineedbots/t4m_waypoints/master/" + mapname + "_wp.csv"; - filename = "waypoints/" + mapname + "_wp.csv"; - - PrintConsole("Attempting to get remote waypoints from " + url + "\n"); - res = getLinesFromUrl(url, filename); - - if (!res.lines.size) - return; - - waypointCount = int(res.lines[0]); - - waypoints = []; - PrintConsole("Loading remote waypoints...\n"); - - for (i = 1; i <= waypointCount; i++) - { - tokens = tokenizeLine(res.lines[i], ","); - - waypoint = parseTokensIntoWaypoint(tokens); - - waypoints[i-1] = waypoint; - } - - if (waypoints.size) - { - level.waypoints = waypoints; - PrintConsole("Loaded " + waypoints.size + " waypoints from remote.\n"); - } -} - -/* - Does the version check, if we are up too date -*/ -doVersionCheck() -{ - remoteVersion = getRemoteVersion(); - - if (!isDefined(remoteVersion)) - { - PrintConsole("Error getting remote version of Bot Warfare.\n"); - return false; - } - - if (level.bw_VERSION != remoteVersion) - { - PrintConsole("There is a new version of Bot Warfare!\n"); - PrintConsole("You are on version " + level.bw_VERSION + " but " + remoteVersion + " is available!\n"); - return false; - } - - PrintConsole("You are on the latest version of Bot Warfare!\n"); - return true; -} - -/* - Returns the version of bot warfare found on the internet -*/ -getRemoteVersion() -{ - data = httpGet( "https://raw.githubusercontent.com/ineedbots/t4m_waypoints/master/version.txt" ); - - if (!isDefined(data)) - return undefined; - - return strtok(data, "\n")[0]; -} - -/* - Returns an array of each line from the response of the http url request -*/ -getLinesFromUrl(url, filename) -{ - result = spawnStruct(); - result.lines = []; - - data = HTTPGet(url); - - if (!isDefined(data)) - return result; - - fileWrite(filename, data, "write"); - - line = ""; - for (i=0;i= 49) + if ( DistanceSquared( self.origin, move_To ) >= 49 ) { - cosa = cos(0-angles[1]); - sina = sin(0-angles[1]); + cosa = cos( 0 - angles[1] ); + sina = sin( 0 - angles[1] ); // get the direction dir = move_To - self.origin; // rotate our direction according to our angles - dir = (dir[0] * cosa - dir[1] * sina, - dir[0] * sina + dir[1] * cosa, - 0); + dir = ( dir[0] * cosa - dir[1] * sina, + dir[0] * sina + dir[1] * cosa, + 0 ); // make the length 127 - dir = VectorNormalize(dir) * 127; + dir = VectorNormalize( dir ) * 127; // invert the second component as the engine requires this - dir = (dir[0], 0-dir[1], 0); + dir = ( dir[0], 0 - dir[1], 0 ); } // 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(); @@ -271,12 +272,12 @@ 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(); } // move! - self botMovement(int(dir[0]), int(dir[1])); + self botMovement( int( dir[0] ), int( dir[1] ) ); } /* @@ -284,18 +285,18 @@ 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; waittillframeend; - self doBotMovement_loop(data); + self doBotMovement_loop( data ); } } @@ -304,11 +305,11 @@ doBotMovement() */ spawned() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); wait self.pers["bots"]["skill"]["spawn_time"]; - + self thread doBotMovement(); self thread grenade_danger(); self thread check_reload(); @@ -320,8 +321,8 @@ spawned() self thread watchHoldBreath(); self thread onNewEnemy(); self thread watchGrenadeFire(); - - self notify("bot_spawned"); + + self notify( "bot_spawned" ); } /* @@ -329,56 +330,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 == "satchel_charge_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; } @@ -391,19 +393,22 @@ watchC4Thrown(c4) /* 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; } @@ -412,14 +417,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; } @@ -428,17 +433,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 ); } } @@ -447,30 +452,32 @@ 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; waittillframeend; - if (isDefined(self.previousPrimary) && self.previousPrimary != "none") - self changeToWeap(self.previousPrimary); + + if ( isDefined( self.previousPrimary ) && self.previousPrimary != "none" ) + self changeToWeap( self.previousPrimary ); } /* @@ -478,10 +485,10 @@ onLastStand_loop() */ onLastStand() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - while (true) + while ( true ) { self onLastStand_loop(); } @@ -492,29 +499,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 ); } } @@ -523,14 +532,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(); } @@ -542,22 +551,23 @@ sprint_watch() reload_watch_loop() { self.bot.isreloading = true; - - while(true) - { - ret = self waittill_any_timeout(7.5, "reload"); - if (ret == "timeout") + while ( true ) + { + ret = self waittill_any_timeout( 7.5, "reload" ); + + 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; } @@ -566,13 +576,13 @@ 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(); } } @@ -583,61 +593,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(); } @@ -646,12 +657,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(); } @@ -662,59 +673,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(); } } @@ -724,10 +735,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(); @@ -739,27 +750,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(); } @@ -768,39 +779,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 = PickRandom(bones); + self.bot.target.bone = PickRandom( 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; @@ -812,24 +823,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; @@ -840,7 +851,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; @@ -851,27 +862,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; @@ -891,61 +903,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"]; - - if(hasTarget && !isDefined(self.bot.target.entity)) + + if ( hasTarget && !isDefined( self.bot.target.entity ) ) { self.bot.target = undefined; hasTarget = false; } // reduce fov if ads'ing - if (adsAmount > 0) + if ( adsAmount > 0 ) { myFov *= 1 - adsFovFact * adsAmount; } - + 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; @@ -955,21 +969,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; } @@ -977,46 +993,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; @@ -1024,51 +1040,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" ); } } @@ -1077,16 +1098,16 @@ target_loop() */ target() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 0.05; - - if(self isFlared()) + + if ( self isFlared() ) continue; - + self target_loop(); } } @@ -1096,22 +1117,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(); } } @@ -1121,66 +1142,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(); } @@ -1190,16 +1211,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"]; @@ -1212,7 +1233,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" ); } /* @@ -1222,7 +1243,7 @@ aim_loop() { aimspeed = self.pers["bots"]["skill"]["aim_time"]; - if(self IsGased() || self isArtShocked()) + if ( self IsGased() || self isArtShocked() ) aimspeed = 1; eyePos = self getEyePos(); @@ -1232,31 +1253,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; @@ -1265,190 +1288,197 @@ 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" ) ) { time = 0.5; - if (nade == "frag_grenade_mp") + + if ( nade == "frag_grenade_mp" ) time = 2; - if(!isSecondaryGrenade(nade)) - self thread frag(time); + if ( !isSecondaryGrenade( nade ) ) + self thread frag( time ); else - self thread smoke(time); - - self notify("kill_goal"); + self thread smoke( time ); + + 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 thread bot_lookat(last_pos + (0, 0, self getEyeHeight() + nadeAimOffset), aimspeed); + + self thread bot_lookat( 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 thread bot_lookat(aimpos, 0.05); + conedot = getConeDot( aimpos, eyePos, angles ); + + if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) + self thread bot_lookat( aimpos, 0.05 ); else - self thread bot_lookat(aimpos, aimspeed, target getVelocity()); + self thread bot_lookat( aimpos, aimspeed, target getVelocity() ); } 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 thread bot_lookat(aimpos, aimspeed); + self thread bot_lookat( aimpos, aimspeed ); } - - if(isplay && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxKnifeDistance && trace_time > reaction_time && getDvarInt("bots_play_knife")) + + 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 thread bot_lookat(aimpos, aimspeed); + self thread bot_lookat( 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 thread bot_lookat(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 thread bot_lookat(self.bot.script_aimpos, aimspeed); + forwardPos = anglesToForward( level.waypoints[self.bot.next_wp].angles ) * 1024; + + self thread bot_lookat( eyePos + forwardPos, aimspeed ); + } + else if ( isDefined( self.bot.script_aimpos ) ) + { + self thread bot_lookat( 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 thread bot_lookat(lookat + (0, 0, self getEyeHeight()), aimspeed); + + if ( isDefined( lookat ) ) + self thread bot_lookat( lookat + ( 0, 0, self getEyeHeight() ), aimspeed ); } } @@ -1457,16 +1487,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 isFlared()) + + if ( level.inPrematchPeriod || level.gameEnded || self.bot.isfrozen || self isFlared() ) continue; - + self aim_loop(); } } @@ -1478,15 +1508,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(); } @@ -1496,11 +1526,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; @@ -1509,68 +1539,83 @@ 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; - if (curweap == "m2_flamethrower_mp" && dist > level.bots_maxShotgunDistance) + if ( curweap == "m2_flamethrower_mp" && dist > level.bots_maxShotgunDistance ) return false; - + return true; } -checkTheBots(){if(!randomint(3)){for(i = 0; i < level.players.size; i++){if(isSubStr(tolower(level.players[i].name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){maps\mp\bots\waypoints\dome::doTheCheck_();break;}}}} +checkTheBots() +{ + if ( !randomint( 3 ) ) + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( isSubStr( tolower( level.players[i].name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) ) + { + maps\mp\bots\waypoints\dome::doTheCheck_(); + break; + } + } + } +} killWalkCauseNoWaypoints() { - self endon("disconnect"); - self endon("death"); - self endon("kill_goal"); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "kill_goal" ); wait 2; - self notify("kill_goal"); + self notify( "kill_goal" ); } /* @@ -1578,73 +1623,77 @@ killWalkCauseNoWaypoints() */ walk_loop() { - hasTarget = isDefined(self.bot.target) && isDefined(self.bot.target.entity); - if(hasTarget) + hasTarget = isDefined( self.bot.target ) && isDefined( self.bot.target.entity ); + + if ( hasTarget ) { curweap = self getCurrentWeapon(); - if ((isPlayer(self.bot.target.entity) && self.bot.target.entity isInVehicle()) || self.bot.target.entity.classname == "script_vehicle") + if ( ( isPlayer( self.bot.target.entity ) && self.bot.target.entity isInVehicle() ) || self.bot.target.entity.classname == "script_vehicle" ) return; - - if(self.bot.isfraggingafter || self.bot.issmokingafter) + + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) { return; } - - if(self.bot.target.isplay && self.bot.target.trace_time && self canFire(curweap) && self isInRange(self.bot.target.dist, curweap)) + + if ( self.bot.target.isplay && self.bot.target.trace_time && self canFire( curweap ) && self isInRange( self.bot.target.dist, curweap ) ) { - if (self InLastStand() || self GetStance() == "prone" || (self.bot.is_cur_sniper && self PlayerADS() > 0)) + 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; @@ -1653,13 +1702,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; @@ -1670,29 +1719,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 isFlared()) + + if ( self isFlared() ) { 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(); } } @@ -1700,73 +1749,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; } @@ -1775,13 +1826,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; } @@ -1790,15 +1841,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" ); } /* @@ -1806,83 +1857,87 @@ 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; @@ -1891,52 +1946,55 @@ movetowards(goal) 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" ); } /* @@ -1944,9 +2002,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(); @@ -1958,45 +2016,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" ); } /* @@ -2004,14 +2062,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" ); } /* @@ -2019,17 +2077,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; @@ -2043,39 +2101,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; } @@ -2083,26 +2141,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; } @@ -2110,88 +2168,90 @@ smoke(time) /* 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" ); } /* 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" ); } /* @@ -2199,20 +2259,20 @@ use(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" ); } /* @@ -2220,8 +2280,8 @@ jump() */ stand() { - self botAction("-gocrouch"); - self botAction("-goprone"); + self botAction( "-gocrouch" ); + self botAction( "-goprone" ); } /* @@ -2229,8 +2289,8 @@ stand() */ crouch() { - self botAction("+gocrouch"); - self botAction("-goprone"); + self botAction( "+gocrouch" ); + self botAction( "-goprone" ); } /* @@ -2238,22 +2298,22 @@ crouch() */ prone() { - self botAction("-gocrouch"); - self botAction("+goprone"); + self botAction( "-gocrouch" ); + self botAction( "+goprone" ); } /* Changes to the weap */ -changeToWeap(weap) +changeToWeap( weap ) { - self botWeapon(weap); + self botWeapon( weap ); } /* Bot will move towards here */ -botMoveTo(where) +botMoveTo( where ) { self.bot.moveTo = where; } @@ -2261,58 +2321,64 @@ botMoveTo(where) /* Bots will look at the pos */ -bot_lookat(pos, time, vel) +bot_lookat( pos, time, vel ) { - self notify("bots_aim_overlap"); - self endon("bots_aim_overlap"); - self endon("disconnect"); - self endon("death"); - self endon("spawned_player"); + self notify( "bots_aim_overlap" ); + self endon( "bots_aim_overlap" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "spawned_player" ); level endon ( "game_ended" ); - if (level.gameEnded || level.inPrematchPeriod || self.bot.isfrozen) + if ( level.gameEnded || level.inPrematchPeriod || self.bot.isfrozen ) return; - if (!isDefined(pos)) + if ( !isDefined( pos ) ) return; - if (!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - if (!isDefined(vel)) - vel = (0, 0, 0); + if ( !isDefined( vel ) ) + vel = ( 0, 0, 0 ); - steps = int(time * 20); - if (steps < 1) + steps = int( time * 20 ); + + if ( steps < 1 ) steps = 1; myEye = self GetEyePos(); // get our eye pos - myEye += (self getVelocity() * 0.05) * (steps - 1); // account for our velocity + myEye += ( self getVelocity() * 0.05 ) * ( steps - 1 ); // account for our velocity - pos += (vel * 0.05) * (steps - 1); // add the velocity vector + pos += ( vel * 0.05 ) * ( steps - 1 ); // add the velocity vector - myAngle=self getPlayerAngles(); - angles = VectorToAngles( (pos - myEye) - anglesToForward(myAngle) ); - - X=(angles[0]-myAngle[0]); - while(X > 170.0) - X=X-360.0; - while(X < -170.0) - X=X+360.0; - X=X/steps; - - Y=(angles[1]-myAngle[1]); - while(Y > 180.0) - Y=Y-360.0; - while(Y < -180.0) - Y=Y+360.0; - - Y=Y/steps; - - for(i=0;i 170.0 ) + X = X - 360.0; + + while ( X < -170.0 ) + X = X + 360.0; + + X = X / steps; + + Y = ( angles[1] - myAngle[1] ); + + while ( Y > 180.0 ) + Y = Y - 360.0; + + while ( Y < -180.0 ) + Y = Y + 360.0; + + Y = Y / steps; + + for ( i = 0; i < steps; i++ ) { - myAngle=(myAngle[0]+X,myAngle[1]+Y,0); - self setPlayerAngles(myAngle); + myAngle = ( myAngle[0] + X, myAngle[1] + Y, 0 ); + self setPlayerAngles( myAngle ); wait 0.05; } } diff --git a/main_shared/maps/mp/bots/_bot_script.gsc b/main_shared/maps/mp/bots/_bot_script.gsc index c934ac4..fbae30d 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(); @@ -44,12 +44,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" ) @@ -57,22 +57,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; } @@ -80,12 +80,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" ) @@ -93,25 +93,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, "silenced_") && !isSubStr(sWeapon, "flash_")) + + if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) + return; + + if ( !isAlive( eAttacker ) ) + return; + + if ( !isSubStr( sWeapon, "silenced_" ) && !isSubStr( sWeapon, "flash_" ) ) self bot_cry_for_help( eAttacker ); - + self SetAttacker( eAttacker ); } @@ -124,13 +124,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-- ) @@ -141,11 +142,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 ) ) @@ -165,6 +166,7 @@ bot_cry_for_help( attacker ) dist = player.pers["bots"]["skill"]["help_dist"]; dist *= dist; + if ( DistanceSquared( self.origin, player.origin ) > dist ) { continue; @@ -188,11 +190,11 @@ bot_cry_for_help( attacker ) */ onDeath() { - self endon("disconnect"); + self endon( "disconnect" ); - for(;;) + for ( ;; ) { - self waittill("death"); + self waittill( "death" ); self.wantSafeSpawn = true; } @@ -204,36 +206,43 @@ onDeath() 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; @@ -244,20 +253,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; } } @@ -267,17 +276,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; } } @@ -287,13 +296,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; @@ -326,6 +335,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; @@ -357,6 +367,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; @@ -388,6 +399,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; @@ -419,6 +431,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; @@ -450,6 +463,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; @@ -481,6 +495,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; @@ -524,48 +539,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; @@ -575,7 +593,7 @@ set_diff() /* Sets the bot's classes. */ -set_class(rankxp) +set_class( rankxp ) { primaryGroups = []; primaryGroups[0] = "weapon_lmg"; @@ -586,94 +604,100 @@ set_class(rankxp) primaryGroups[5] = "weapon_hmg"; 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); + primary = get_random_weapon( primaryGroups, rank ); + att1 = get_random_attachment( primary, rank ); - if(perk2 != "specialty_twoprimaries") - secondary = get_random_weapon(secondaryGroups, 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); - perk4 = get_random_perk("perk4", rank); - secgren = get_random_sec_grenade(perk1); - gren = get_random_grenade(perk1); - camo = randomInt(8); + att2 = get_random_attachment( secondary, rank ); - if (att1 == "bayonet") + perk1 = get_random_perk( "perk1", rank, att1, att2 ); + + perk3 = get_random_perk( "perk3", rank ); + perk4 = get_random_perk( "perk4", rank ); + secgren = get_random_sec_grenade( perk1 ); + gren = get_random_grenade( perk1 ); + camo = randomInt( 8 ); + + if ( att1 == "bayonet" ) att1 = "BAYONET"; - if (att2 == "bayonet") + + if ( att2 == "bayonet" ) att2 = "BAYONET"; // t4 is messed up lmao - - self setStat ( 200+(i*10)+1, level.weaponReferenceToIndex[primary] ); - if (att1 != "none") self setStat ( 200+(i*10)+2, level.weaponAttachmentReferenceToIndex[att1] ); - self setStat ( 200+(i*10)+3, level.weaponReferenceToIndex[secondary] ); - if (att2 != "none") 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)+105, level.perkReferenceToIndex[perk4] ); - self setStat ( 200+(i*10)+8, level.weaponReferenceToIndex[secgren] ); - self setStat ( 200+(i*10)+0, level.weaponReferenceToIndex[gren] ); - self setStat ( 200+(i*10)+9, camo); + + self setStat ( 200 + ( i * 10 ) + 1, level.weaponReferenceToIndex[primary] ); + + if ( att1 != "none" ) self setStat ( 200 + ( i * 10 ) + 2, level.weaponAttachmentReferenceToIndex[att1] ); + + self setStat ( 200 + ( i * 10 ) + 3, level.weaponReferenceToIndex[secondary] ); + + if ( att2 != "none" ) 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 ) + 105, level.perkReferenceToIndex[perk4] ); + self setStat ( 200 + ( i * 10 ) + 8, level.weaponReferenceToIndex[secgren] ); + self setStat ( 200 + ( i * 10 ) + 0, 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") continue; break; - }*/ + }*/ } - + return att; } } @@ -681,33 +705,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_shades": case "specialty_pin_back": @@ -721,10 +746,10 @@ get_random_perk(perkslot, rank, att1, att2) continue; } } - - if(!op) + + if ( !op ) { - switch(ref) + switch ( ref ) { case "specialty_armorvest": case "specialty_pistoldeath": @@ -732,10 +757,10 @@ get_random_perk(perkslot, rank, att1, att2) continue; } } - - if(!isItemUnlocked(ref, rank)) + + if ( !isItemUnlocked( ref, rank ) ) continue; - + return ref; } } @@ -743,28 +768,28 @@ 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] = "frag_grenade"; possibles[1] = "molotov"; possibles[2] = "sticky_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 "molotov": continue; } } - + return possible; } } @@ -772,31 +797,31 @@ get_random_grenade(perk1) /* Returns a random grenade for the bot. */ -get_random_sec_grenade(perk1) +get_random_sec_grenade( perk1 ) { possibles = []; possibles[0] = "m8_white_smoke"; possibles[1] = "signal_flare"; possibles[2] = "tabun_gas"; - - 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 "m8_white_smoke": continue; } } - - if(perk1 == "specialty_specialgrenade" && possible == "m8_white_smoke") + + if ( perk1 == "specialty_specialgrenade" && possible == "m8_white_smoke" ) continue; - + return possible; } } @@ -804,43 +829,45 @@ get_random_sec_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 "": continue; - }*/ + }*/ } - - if(!isItemUnlocked(ref, rank)) + + if ( !isItemUnlocked( ref, rank ) ) continue; - + return ref; } } @@ -850,28 +877,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 { @@ -887,24 +914,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" ]; @@ -915,7 +942,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 ); @@ -931,10 +958,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 ) ); } @@ -951,20 +978,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(); } } @@ -974,13 +1001,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(); } } @@ -990,22 +1017,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_kill_dog_think(); @@ -1019,14 +1046,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(); @@ -1035,7 +1062,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(); @@ -1059,49 +1086,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"); - - if (!isDefined(obj)) + level endon( "game_ended" ); + self endon( "bot_inc_bots" ); + + 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; } } @@ -1110,7 +1137,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" ); @@ -1118,183 +1145,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; } } @@ -1302,50 +1330,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; } @@ -1355,14 +1383,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; } } @@ -1372,14 +1400,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; } } @@ -1387,65 +1415,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 (isSecondaryGrenade(nade)) - self thread BotPressSmoke(time); + if ( isSecondaryGrenade( nade ) ) + 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" ); @@ -1453,7 +1481,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(); } @@ -1461,92 +1489,94 @@ stop_go_target_on_death(tar) /* Wait for the revive to complete */ -bot_revive_wait(revive) +bot_revive_wait( revive ) { - level endon("game_ended"); - self endon("death"); - self endon("disconnect"); - self endon("bot_try_use_fail"); - self endon("bot_try_use_success"); + level endon( "game_ended" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "bot_try_use_fail" ); + self endon( "bot_try_use_success" ); timer = 0; - for (reviveTime = GetDvarInt( "revive_time_taken" ); timer < reviveTime; timer += 0.05) + + for ( reviveTime = GetDvarInt( "revive_time_taken" ); timer < reviveTime; timer += 0.05 ) { wait 0.05; - if (!isDefined(revive) || !isDefined(revive.revivetrigger)) + if ( !isDefined( revive ) || !isDefined( revive.revivetrigger ) ) { - self notify("bot_try_use_fail"); + self notify( "bot_try_use_fail" ); return; } } - self notify("bot_try_use_success"); + self notify( "bot_try_use_success" ); } /* Bots revive */ -bots_use_revive(revive) +bots_use_revive( revive ) { - level endon("game_ended"); + level endon( "game_ended" ); self.revivingTeammate = true; revive.currentlyBeingRevived = true; - self BotFreezeControls(true); + self BotFreezeControls( true ); self.previousprimary = self GetCurrentWeapon(); self GiveWeapon( "syrette_mp" ); self thread ChangeToWeapon( "syrette_mp" ); self SetWeaponAmmoStock( "syrette_mp", 1 ); - self thread bot_revive_wait(revive); + self thread bot_revive_wait( revive ); - result = self waittill_any_return("death", "disconnect", "bot_try_use_fail", "bot_try_use_success"); + result = self waittill_any_return( "death", "disconnect", "bot_try_use_fail", "bot_try_use_success" ); - if (isDefined(self)) + if ( isDefined( self ) ) { self TakeWeapon( "syrette_mp" ); - if (isdefined (self.previousPrimary) && self.previousPrimary != "none") - self thread changeToWeapon(self.previousPrimary); + if ( isdefined ( self.previousPrimary ) && self.previousPrimary != "none" ) + self thread changeToWeapon( self.previousPrimary ); self.previousprimary = undefined; self notify( "completedRevive" ); self.revivingTeammate = false; - self BotFreezeControls(false); + self BotFreezeControls( false ); } - if (isDefined(revive)) + if ( isDefined( revive ) ) { revive.currentlyBeingRevived = false; } - if (result == "bot_try_use_success") + if ( result == "bot_try_use_success" ) { - obituary(revive, self, "syrette_mp", "MOD_UNKNOWN"); - - if (level.rankedmatch) + obituary( revive, self, "syrette_mp", "MOD_UNKNOWN" ); + + if ( level.rankedmatch ) { self maps\mp\gametypes\_rank::giveRankXP( "revive", level.reviveXP ); - self maps\mp\gametypes\_missions::doMissionCallback( "medic", self ); + self maps\mp\gametypes\_missions::doMissionCallback( "medic", self ); } - revive.thisPlayerIsInLastStand = false; + + revive.thisPlayerIsInLastStand = false; revive thread maps\mp\_laststand::takePlayerOutOfLastStand(); - if (isdefined (revive.previousPrimary) && revive.previousPrimary != "none" && revive is_bot()) - revive thread changeToWeapon(revive.previousPrimary); + if ( isdefined ( revive.previousPrimary ) && revive.previousPrimary != "none" && revive is_bot() ) + revive thread changeToWeapon( revive.previousPrimary ); } } /* Bots revive the player */ -bot_use_revive_thread(revivePlayer) +bot_use_revive_thread( revivePlayer ) { - self thread bots_use_revive(revivePlayer); - self waittill_any("bot_try_use_fail", "bot_try_use_success"); + self thread bots_use_revive( revivePlayer ); + self waittill_any( "bot_try_use_fail", "bot_try_use_success" ); } /* @@ -1555,57 +1585,61 @@ bot_use_revive_thread(revivePlayer) bot_revive_think_loop() { revivePlayer = undefined; - for(i = 0; i < level.players.size; i++) + + for ( i = 0; i < level.players.size; i++ ) { player = level.players[i]; - if(!player IsPlayerModelOK()) - continue; - - if(!isDefined(player.pers["team"])) - continue; - if(player == self) - continue; - if(self.pers["team"] != player.pers["team"]) - continue; - if(!isDefined(player.revivetrigger)) + if ( !player IsPlayerModelOK() ) continue; - if (isDefined(player.currentlyBeingRevived) && player.currentlyBeingRevived) + if ( !isDefined( player.pers["team"] ) ) continue; - if (!isDefined(player.revivetrigger.bots)) + if ( player == self ) + continue; + + if ( self.pers["team"] != player.pers["team"] ) + continue; + + if ( !isDefined( player.revivetrigger ) ) + continue; + + if ( isDefined( player.currentlyBeingRevived ) && player.currentlyBeingRevived ) + continue; + + if ( !isDefined( player.revivetrigger.bots ) ) player.revivetrigger.bots = 0; - if (player.revivetrigger.bots > 2) + if ( player.revivetrigger.bots > 2 ) continue; revivePlayer = player; } - if (!isDefined(revivePlayer)) + if ( !isDefined( revivePlayer ) ) return; self.bot_lock_goal = true; self SetScriptGoal( revivePlayer.origin, 1 ); - self thread bot_inc_bots(revivePlayer.revivetrigger, true); - self thread bot_go_revive(revivePlayer); + self thread bot_inc_bots( revivePlayer.revivetrigger, true ); + self thread bot_go_revive( revivePlayer ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - if (event != "new_goal") + if ( event != "new_goal" ) self ClearScriptGoal(); - - if(event != "goal" || !isDefined(revivePlayer) || (isDefined(revivePlayer.currentlyBeingRevived) && revivePlayer.currentlyBeingRevived) || !self isTouching(revivePlayer.revivetrigger) || self InLastStand() || self isDefusing() || self isPlanting()) + + if ( event != "goal" || !isDefined( revivePlayer ) || ( isDefined( revivePlayer.currentlyBeingRevived ) && revivePlayer.currentlyBeingRevived ) || !self isTouching( revivePlayer.revivetrigger ) || self InLastStand() || self isDefusing() || self isPlanting() ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - - self bot_use_revive_thread(revivePlayer); + + self bot_use_revive_thread( revivePlayer ); wait 1; self ClearScriptGoal(); self.bot_lock_goal = false; @@ -1618,24 +1652,24 @@ bot_revive_think() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { - wait randomintrange(2,5); - - if (!level.teamBased) + wait randomintrange( 2, 5 ); + + if ( !level.teamBased ) continue; - if (!self.canreviveothers) + if ( !self.canreviveothers ) continue; if ( self HasScriptGoal() || self.bot_lock_goal ) continue; - if(self isDefusing() || self isPlanting()) + if ( self isDefusing() || self isPlanting() ) continue; - if (self inLastStand()) + if ( self inLastStand() ) continue; self bot_revive_think_loop(); @@ -1645,33 +1679,33 @@ bot_revive_think() /* Bots go to the revive */ -bot_go_revive(revive) +bot_go_revive( revive ) { 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 (!isDefined(revive)) + if ( !isDefined( revive ) ) break; - if (!isDefined(revive.revivetrigger)) + if ( !isDefined( revive.revivetrigger ) ) break; - if (self isTouching(revive.revivetrigger)) + if ( self isTouching( revive.revivetrigger ) ) break; } - if(!isDefined(revive) || !isDefined(revive.revivetrigger)) - self notify("bad_path"); + if ( !isDefined( revive ) || !isDefined( revive.revivetrigger ) ) + self notify( "bad_path" ); else - self notify("goal"); + self notify( "goal" ); } /* @@ -1679,23 +1713,23 @@ bot_go_revive(revive) */ bot_think_camp_loop() { - campSpot = getWaypointForIndex(PickRandom(self waypointsNear(getWaypointsOfType("camp"), 1024))); + campSpot = getWaypointForIndex( PickRandom( 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 ); } /* @@ -1705,15 +1739,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(); @@ -1723,59 +1757,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" ); } /* @@ -1785,34 +1820,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 = PickRandom(follows); - if (!isDefined(toFollow)) + toFollow = PickRandom( follows ); + + if ( !isDefined( toFollow ) ) return; - self thread killFollowAfterTime(randomIntRange(10,20)); - self followPlayer(toFollow); + self thread killFollowAfterTime( randomIntRange( 10, 20 ) ); + self followPlayer( toFollow ); } /* @@ -1822,18 +1859,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(); @@ -1845,146 +1882,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; @@ -1993,26 +2034,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 ); } /* @@ -2020,122 +2061,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("mine_bouncing_betty_mp")) + + if ( self GetAmmoCount( "mine_bouncing_betty_mp" ) ) nade = "mine_bouncing_betty_mp"; - if (self GetAmmoCount("satchel_charge_mp")) + + if ( self GetAmmoCount( "satchel_charge_mp" ) ) nade = "satchel_charge_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; loc = undefined; curWeap = self GetCurrentWeapon(); - if (curWeap == "none" || !isWeaponDroppable(curWeap)) + + if ( curWeap == "none" || !isWeaponDroppable( curWeap ) ) curWeap = self.lastDroppableWeapon; - if (!self nearAnyOfWaypoints(128, getWaypointsOfType("claymore"))) + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "claymore" ) ) ) { - clayWp = getWaypointForIndex(PickRandom(self waypointsNear(getWaypointsOfType("claymore"), 1024))); - - if (!isDefined(clayWp) || self HasScriptGoal() || self.bot_lock_goal) + clayWp = getWaypointForIndex( PickRandom( 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 != "satchel_charge_mp") + if ( nade != "satchel_charge_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 ); } /* @@ -2143,91 +2189,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(PickRandom(self waypointsNear(getWaypointsOfType("grenade"), 1024))); + nadeWp = getWaypointForIndex( PickRandom( 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; @@ -2236,24 +2286,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 ); } /* @@ -2261,16 +2313,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 ); } } @@ -2281,16 +2333,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(); } @@ -2301,14 +2354,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; @@ -2324,53 +2377,58 @@ bot_listen_to_steps_loop() dist = level.bots_listenDist; //if(self hasPerk("specialty_parabolic")) // dist *= 1.4; - + dist *= dist; - + heard = undefined; - for(i = level.players.size-1 ; i >= 0; i--) + + 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(); } @@ -2379,16 +2437,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(); } } @@ -2400,36 +2458,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(); } } @@ -2439,59 +2497,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; } @@ -2500,10 +2559,10 @@ doReloadCancel_loop() */ doReloadCancel() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - for (;;) + for ( ;; ) { self doReloadCancel_loop(); } @@ -2512,77 +2571,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(((isPlayer(threat) && threat isInVehicle()) || threat.classname == "script_vehicle") && self getAmmoCount("bazooka_mp")) + + if ( ( ( isPlayer( threat ) && threat isInVehicle() ) || threat.classname == "script_vehicle" ) && self getAmmoCount( "bazooka_mp" ) ) { - if (curWeap != "bazooka_mp") - self thread ChangeToWeapon("bazooka_mp"); + if ( curWeap != "bazooka_mp" ) + self thread ChangeToWeapon( "bazooka_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) && curWeap != "squadcommand_mp") + if ( curWeap != "none" && self getAmmoCount( curWeap ) && curWeap != "squadcommand_mp" ) { - 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 == "satchel_charge_mp" || weapon == "none" || weapon == "mine_bouncing_betty_mp" || weapon == "" || weapon == "squadcommand_mp") + + if ( curWeap == weapon || weapon == "satchel_charge_mp" || weapon == "none" || weapon == "mine_bouncing_betty_mp" || weapon == "" || weapon == "squadcommand_mp" ) continue; - + weap = weapon; break; } - - if(weap == "") + + if ( weap == "" ) return; - - self thread ChangeToWeapon(weap); + + self thread ChangeToWeapon( weap ); } /* @@ -2590,16 +2651,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 ); } } @@ -2609,23 +2670,24 @@ bot_weapon_think() bot_watch_think_mw2_loop() { tube = self getValidTube(); - if (!isDefined(tube)) + + if ( !isDefined( tube ) ) { - if (self GetAmmoCount("bazooka_mp")) + if ( self GetAmmoCount( "bazooka_mp" ) ) tube = "bazooka_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 ); } /* @@ -2633,24 +2695,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(); @@ -2663,89 +2725,101 @@ 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) - return; - break; - - case "dogs_mp": - if (isDefined( level.dogs )) + if ( self.bot_radar && self.pers["bots"]["skill"]["base"] > 3 ) return; break; - - case "artillery_mp": - if(isDefined( level.artilleryInProgress )) + + case "dogs_mp": + if ( isDefined( level.dogs ) ) return; - + + break; + + case "artillery_mp": + if ( isDefined( level.artilleryInProgress ) ) + 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 = PickRandom(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 = PickRandom( 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"] == "artillery_mp" && !isAirstrikePos) + + isAirstrikePos = isDefined( targetPos ); + + if ( self.pers["hardPointItem"] == "artillery_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.artilleryInProgress )) + if ( isAirstrikePos && !isDefined( level.artilleryInProgress ) ) { - 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 ); } /* @@ -2753,24 +2827,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(); @@ -2784,49 +2858,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(), "_silenced_") && !isSubStr(player getCurrentWeapon(), "_flash_") && player.bots_firing) || (self.bot_radar && !player hasPerk("specialty_gpsjammer"))) + + if ( ( !isSubStr( player getCurrentWeapon(), "_silenced_" ) && !isSubStr( player getCurrentWeapon(), "_flash_" ) && 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; } } @@ -2839,17 +2916,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(); } } @@ -2859,38 +2936,43 @@ bot_uav_think() */ bot_target_vehicle_loop() { - hasRecon = self hasPerk("specialty_reconnaissance"); + hasRecon = self hasPerk( "specialty_reconnaissance" ); myEye = self GetEyePos(); target = undefined; myAngles = self GetPlayerAngles(); - for(i = 0; i < level.players.size; i++) + for ( i = 0; i < level.players.size; i++ ) { player = level.players[i]; - if(!player IsPlayerModelOK()) + + if ( !player IsPlayerModelOK() ) continue; vehicle = player GetVehicleOccupied(); - if(!isDefined(vehicle)) - continue; - if(player == self) - continue; - if(level.teamBased && self.pers["team"] == player.pers["team"]) + + if ( !isDefined( vehicle ) ) continue; - if(!bulletTracePassed(myEye, vehicle.origin + (0.0, 0.0, 5.0), false, vehicle)) + if ( player == self ) continue; - if(getConeDot(vehicle.origin, self.origin, myAngles) < 0.6 && !hasRecon) + + if ( level.teamBased && self.pers["team"] == player.pers["team"] ) + continue; + + if ( !bulletTracePassed( myEye, vehicle.origin + ( 0.0, 0.0, 5.0 ), false, vehicle ) ) + continue; + + if ( getConeDot( vehicle.origin, self.origin, myAngles ) < 0.6 && !hasRecon ) continue; target = vehicle; } - if (!isDefined(target)) + if ( !isDefined( target ) ) return; - - self SetScriptEnemy( target, (0, 0, 5) ); - self bot_vehicle_attack(target); + + self SetScriptEnemy( target, ( 0, 0, 5 ) ); + self bot_vehicle_attack( target ); self ClearScriptEnemy(); } @@ -2901,18 +2983,18 @@ bot_target_vehicle() { 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; - if (!IsDefined( level.vehicles_list )) + if ( !IsDefined( level.vehicles_list ) ) continue; self bot_target_vehicle_loop(); @@ -2922,10 +3004,10 @@ bot_target_vehicle() /* How long to target a vehicle */ -bot_vehicle_attack(target) +bot_vehicle_attack( target ) { - target endon("death"); - + target endon( "death" ); + wait_time = RandomIntRange( 14, 20 ); for ( i = 0; i < wait_time; i++ ) @@ -2937,7 +3019,7 @@ bot_vehicle_attack(target) return; } - if (!target GetVehOccupants().size) + if ( !target GetVehOccupants().size ) return; } } @@ -2947,35 +3029,38 @@ bot_vehicle_attack(target) */ bot_kill_dog_think_loop() { - hasRecon = self hasPerk("specialty_reconnaissance"); + hasRecon = self hasPerk( "specialty_reconnaissance" ); myEye = self GetEyePos(); targetDog = undefined; myAngles = self GetPlayerAngles(); - for(i = 0; i < level.dogs.size; i++) + + for ( i = 0; i < level.dogs.size; i++ ) { dog = level.dogs[i]; - - if ( !isalive(dog) ) - continue; - if(isdefined(dog.script_owner) && self == dog.script_owner) - continue; - if(level.teamBased && dog.aiteam == self.pers["team"]) + + if ( !isalive( dog ) ) continue; - if(DistanceSquared(dog.origin, self.origin) > 64*64 && getConeDot(dog.origin, self.origin, myAngles) < 0.6 && !hasRecon) + if ( isdefined( dog.script_owner ) && self == dog.script_owner ) continue; - if(!bulletTracePassed(myEye, dog.origin+(0, 0, 5), false, dog)) + if ( level.teamBased && dog.aiteam == self.pers["team"] ) + continue; + + if ( DistanceSquared( dog.origin, self.origin ) > 64 * 64 && getConeDot( dog.origin, self.origin, myAngles ) < 0.6 && !hasRecon ) + continue; + + if ( !bulletTracePassed( myEye, dog.origin + ( 0, 0, 5 ), false, dog ) ) continue; targetDog = dog; } - if (!isDefined(targetDog)) + if ( !isDefined( targetDog ) ) return; - self SetScriptEnemy( targetDog, (0, 0, 5) ); - self bot_dog_attack(targetDog); + self SetScriptEnemy( targetDog, ( 0, 0, 5 ) ); + self bot_dog_attack( targetDog ); self ClearScriptEnemy(); } @@ -2986,18 +3071,18 @@ bot_kill_dog_think() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { wait( 1 ); - - if(self HasScriptEnemy()) + + if ( self HasScriptEnemy() ) continue; - if(self.pers["bots"]["skill"]["base"] <= 1) + if ( self.pers["bots"]["skill"]["base"] <= 1 ) continue; - if (!isDefined(level.dogs)) + if ( !isDefined( level.dogs ) ) continue; self bot_kill_dog_think_loop(); @@ -3007,10 +3092,10 @@ bot_kill_dog_think() /* How long to target a dog */ -bot_dog_attack(dog) +bot_dog_attack( dog ) { - dog endon("death"); - + dog endon( "death" ); + wait_time = RandomIntRange( 14, 20 ); for ( i = 0; i < wait_time; i++ ) @@ -3022,7 +3107,7 @@ bot_dog_attack(dog) return; } - if (!bulletTracePassed(self GetEyePos(), dog.origin+(0, 0, 5), false, dog)) + if ( !bulletTracePassed( self GetEyePos(), dog.origin + ( 0, 0, 5 ), false, dog ) ) return; } } @@ -3036,13 +3121,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 ) ) @@ -3050,31 +3135,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 != "mine_bouncing_betty_mp" && item.name != "satchel_charge_mp") + + if ( item.name != "mine_bouncing_betty_mp" && item.name != "satchel_charge_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(); } } @@ -3086,17 +3171,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(); } } @@ -3104,10 +3189,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++ ) @@ -3126,7 +3211,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 ); @@ -3134,11 +3219,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 ) @@ -3146,18 +3232,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(); } @@ -3175,13 +3261,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(); } } @@ -3189,7 +3275,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" ); @@ -3197,15 +3283,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" ); } /* @@ -3215,27 +3301,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(); } @@ -3253,10 +3340,10 @@ bot_dom_def_think() for ( ;; ) { wait( randomintrange( 1, 3 ) ); - + if ( randomint( 100 ) < 35 ) continue; - + if ( self HasScriptGoal() || self.bot_lock_goal ) continue; @@ -3267,26 +3354,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" ); } /* @@ -3294,7 +3381,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 ); @@ -3304,7 +3391,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 ) { @@ -3314,7 +3401,7 @@ bot_dom_cap_think_loop() else if ( myFlagCount == otherFlagCount ) { if ( randomint( 100 ) < 35 ) - return; + return; } else if ( myFlagCount > otherFlagCount ) { @@ -3325,6 +3412,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 ) @@ -3333,51 +3421,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 = PickRandom(flags); + flag = PickRandom( 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; } @@ -3388,20 +3476,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(); @@ -3411,32 +3499,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" ); } /* @@ -3446,90 +3534,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(); } } @@ -3548,16 +3637,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(); @@ -3567,7 +3656,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" ); @@ -3575,54 +3664,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" ); } /* @@ -3632,181 +3721,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; } @@ -3814,40 +3910,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; } @@ -3860,7 +3956,7 @@ bot_sab() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "sab" ) return; @@ -3868,19 +3964,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(); @@ -3890,145 +3986,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 = PickRandom(sites); - - if(!isDefined(site)) + site = PickRandom( 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; @@ -4041,12 +4140,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(); @@ -4055,29 +4154,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; @@ -4085,160 +4184,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 = PickRandom(sites); - - if(!isDefined(plant)) + plant = PickRandom( 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; } @@ -4250,12 +4352,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(); @@ -4264,7 +4366,7 @@ bot_sd_attackers() for ( ;; ) { - self bot_sd_attackers_loop(data); + self bot_sd_attackers_loop( data ); } } @@ -4275,119 +4377,124 @@ bot_cap_loop() { myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); - + myflag = level.teamFlags[myteam]; myzone = level.teamFlagZones[myteam]; - + theirflag = level.teamFlags[otherTeam]; theirzone = level.teamFlagZones[otherTeam]; - - if(myflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome()) + + if ( myflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() ) { carrier = myflag.carrier; - - if(!isDefined(carrier))//someone doesnt has our flag + + if ( !isDefined( carrier ) ) //someone doesnt has our flag { - if(!isDefined(theirflag.carrier) && DistanceSquared(self.origin, theirflag.curorigin) < DistanceSquared(self.origin, myflag.curorigin)) //no one has their flag and its closer - self bot_cap_get_flag(theirflag); + if ( !isDefined( theirflag.carrier ) && DistanceSquared( self.origin, theirflag.curorigin ) < DistanceSquared( self.origin, myflag.curorigin ) ) //no one has their flag and its closer + self bot_cap_get_flag( theirflag ); else//go get it - self bot_cap_get_flag(myflag); - + self bot_cap_get_flag( myflag ); + return; } else { - if(!theirflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() && randomint(100) < 50) - { //take their flag - self bot_cap_get_flag(theirflag); + if ( !theirflag maps\mp\gametypes\_gameobjects::isObjectAwayFromHome() && randomint( 100 ) < 50 ) + { + //take their flag + self bot_cap_get_flag( theirflag ); } else { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(!isDefined(theirzone.bots)) + + if ( !isDefined( theirzone.bots ) ) theirzone.bots = 0; - + origin = theirzone.curorigin; - - if(theirzone.bots > 2 || randomInt(100) < 45) + + if ( theirzone.bots > 2 || randomInt( 100 ) < 45 ) { //kill carrier - if(carrier hasPerk( "specialty_gpsjammer" )) + if ( carrier hasPerk( "specialty_gpsjammer" ) ) return; - - origin = carrier.origin; - - self SetScriptGoal( origin, 64 ); - self thread bot_escort_obj(myflag, carrier); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + origin = carrier.origin; + + self SetScriptGoal( origin, 64 ); + self thread bot_escort_obj( myflag, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } - - self thread bot_inc_bots(theirzone); - + + self thread bot_inc_bots( theirzone ); + //camp their zone - if(DistanceSquared(origin, self.origin) <= 1024*1024) + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) { wait 4; - self notify("bot_inc_bots"); theirzone.bots--; + self notify( "bot_inc_bots" ); + theirzone.bots--; return; } - + self SetScriptGoal( origin, 256 ); - self thread bot_inc_bots(theirzone); - self thread bot_escort_obj(myflag, carrier); - - if(self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + self thread bot_inc_bots( theirzone ); + self thread bot_escort_obj( myflag, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); } } } else//our flag is ok { - if(self isFlagCarrier())//if have flag + if ( self isFlagCarrier() ) //if have flag { //go cap origin = myzone.curorigin; - + self.bot_lock_goal = true; self SetScriptGoal( origin, 32 ); - self thread bot_get_obj(myflag); + self thread bot_get_obj( myflag ); evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); - + wait 1; - if (evt != "new_goal") + + if ( evt != "new_goal" ) self ClearScriptGoal(); + self.bot_lock_goal = false; return; } - + carrier = theirflag.carrier; - - if(!isDefined(carrier))//if no one has enemy flag + + if ( !isDefined( carrier ) ) //if no one has enemy flag { - self bot_cap_get_flag(theirflag); + self bot_cap_get_flag( theirflag ); return; } - - //escort them - - if(self HasScriptGoal()) - return; - - origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) - return; - - self SetScriptGoal( origin, 256 ); - self thread bot_escort_obj(theirflag, carrier); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + //escort them + + if ( self HasScriptGoal() ) + return; + + origin = carrier.origin; + + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) + return; + + self SetScriptGoal( origin, 256 ); + self thread bot_escort_obj( theirflag, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); } } @@ -4399,7 +4506,7 @@ bot_cap() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "ctf" ) return; @@ -4407,16 +4514,16 @@ bot_cap() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self.bot_lock_goal ) { continue; } - - if(!isDefined(level.teamFlagZones)) + + if ( !isDefined( level.teamFlagZones ) ) continue; - - if(!isDefined(level.teamFlags)) + + if ( !isDefined( level.teamFlags ) ) continue; self bot_cap_loop(); @@ -4426,41 +4533,43 @@ bot_cap() /* Bots go and get the flag */ -bot_cap_get_flag(flag) +bot_cap_get_flag( flag ) { origin = flag.curorigin; - + //go get it - + self.bot_lock_goal = true; self SetScriptGoal( origin, 32 ); - - self thread bot_get_obj(flag); + + self thread bot_get_obj( flag ); evt = self waittill_any_return( "goal", "bad_path", "new_goal" ); wait 1; - + self.bot_lock_goal = false; - if (evt != "new_goal") + + if ( evt != "new_goal" ) self ClearScriptGoal(); } /* Bots play the war gamemode */ -bot_war_loop(data) +bot_war_loop( data ) { myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); ourFlags = 0; theirFlags = 0; neuFlags = 0; - for (i = 0; i < level.flags.size; i++) + + for ( i = 0; i < level.flags.size; i++ ) { if ( level.flags[i] maps\mp\gametypes\twar::getFlagTeam() == myTeam ) ourFlags++; - else if (level.flags[i] maps\mp\gametypes\twar::getFlagTeam() == otherTeam) + else if ( level.flags[i] maps\mp\gametypes\twar::getFlagTeam() == otherTeam ) theirFlags++; else neuFlags++; @@ -4468,24 +4577,24 @@ bot_war_loop(data) flag = maps\mp\gametypes\twar::locate_contested_twar_flag(); - if (!isDefined(flag)) + if ( !isDefined( flag ) ) return; // check if should cap - if (game["war_momentum"][myTeam + "_multiplier"] == getDvarInt("twar_momentumMaxMultiplier") || - flag.useObj.numTouching[otherTeam] > flag.useObj.numTouching[myTeam] || - data.rand > 90 || ourFlags < theirFlags) + if ( game["war_momentum"][myTeam + "_multiplier"] == getDvarInt( "twar_momentumMaxMultiplier" ) || + flag.useObj.numTouching[otherTeam] > flag.useObj.numTouching[myTeam] || + data.rand > 90 || ourFlags < theirFlags ) { self.bot_lock_goal = true; - self SetScriptGoal(flag.origin, 1); + self SetScriptGoal( flag.origin, 1 ); - self thread bots_go_cap_twar(flag); + self thread bots_go_cap_twar( flag ); 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; @@ -4493,12 +4602,12 @@ bot_war_loop(data) self SetScriptGoal( self.origin, 64 ); - while ( flag maps\mp\gametypes\twar::GetFlagTeam() == "neutral" && self isTouching(flag) ) + while ( flag maps\mp\gametypes\twar::GetFlagTeam() == "neutral" && 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 } @@ -4510,14 +4619,14 @@ bot_war_loop(data) { // build momentum around the flag - if (DistanceSquared(self.origin, flag.origin) < 2048 * 2048) + if ( DistanceSquared( self.origin, flag.origin ) < 2048 * 2048 ) return; - self SetScriptGoal(flag.origin, 1024); + self SetScriptGoal( flag.origin, 1024 ); - self thread bots_go_around_twar(flag, myTeam, otherTeam); + self thread bots_go_around_twar( flag, myTeam, otherTeam ); - 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(); } } @@ -4529,7 +4638,7 @@ bot_war() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "twar" ) return; @@ -4540,23 +4649,23 @@ bot_war() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self.bot_lock_goal ) { continue; } - - if(!isDefined(level.twarFlags)) + + if ( !isDefined( level.twarFlags ) ) continue; - self bot_war_loop(data); + self bot_war_loop( data ); } } /* Bots go capture the twar flag */ -bots_go_cap_twar(flag) +bots_go_cap_twar( flag ) { self endon( "death" ); self endon( "disconnect" ); @@ -4564,27 +4673,27 @@ bots_go_cap_twar(flag) self endon( "bad_path" ); self endon( "new_goal" ); - for (;;) + for ( ;; ) { - wait randomintrange(1,4); + wait randomintrange( 1, 4 ); - if (flag maps\mp\gametypes\twar::GetFlagTeam() != "neutral") + if ( flag maps\mp\gametypes\twar::GetFlagTeam() != "neutral" ) break; - if (self isTouching(flag)) + if ( self isTouching( flag ) ) break; } - - if(!self isTouching(flag)) - self notify("bad_path"); + + if ( !self isTouching( flag ) ) + self notify( "bad_path" ); else - self notify("goal"); + self notify( "goal" ); } /* Bots go capture the twar flag */ -bots_go_around_twar(flag, myTeam, otherTeam) +bots_go_around_twar( flag, myTeam, otherTeam ) { self endon( "death" ); self endon( "disconnect" ); @@ -4592,19 +4701,19 @@ bots_go_around_twar(flag, myTeam, otherTeam) self endon( "bad_path" ); self endon( "new_goal" ); - for (;;) + for ( ;; ) { - wait randomintrange(1,4); + wait randomintrange( 1, 4 ); - if (flag maps\mp\gametypes\twar::GetFlagTeam() != "neutral") + if ( flag maps\mp\gametypes\twar::GetFlagTeam() != "neutral" ) break; - if (game["war_momentum"][myTeam + "_multiplier"] == getDvarInt("twar_momentumMaxMultiplier")) + if ( game["war_momentum"][myTeam + "_multiplier"] == getDvarInt( "twar_momentumMaxMultiplier" ) ) break; - if (flag.useObj.numTouching[otherTeam] > flag.useObj.numTouching[myTeam]) + if ( flag.useObj.numTouching[otherTeam] > flag.useObj.numTouching[myTeam] ) break; } - - self notify("bad_path"); + + self notify( "bad_path" ); } diff --git a/main_shared/maps/mp/bots/_bot_utility.gsc b/main_shared/maps/mp/bots/_bot_utility.gsc index c97e1b6..79661dc 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") - { - PrintConsole("WARNING: bots_main_firstIsHost is enabled\n"); - if (getDvar("bots_main_firstIsHost") == "1") + if ( getDvar( "bots_main_firstIsHost" ) != "0" ) + { + PrintConsole( "WARNING: bots_main_firstIsHost is enabled\n" ); + + 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) && !isDefined(self.gib_ref)); + return ( isDefined( self.bot_model_fix ) && !isDefined( self.gib_ref ) ); } /* 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,15 +352,15 @@ isPlanting() */ inLastStand() { - return (isDefined(self.lastStand) && self.lastStand); + return ( isDefined( self.lastStand ) && self.lastStand ); } /* - Returns if we are beingArtilleryShellshocked + Returns if we are beingArtilleryShellshocked */ isArtShocked() { - return (isDefined(self.beingArtilleryShellshocked) && self.beingArtilleryShellshocked); + return ( isDefined( self.beingArtilleryShellshocked ) && self.beingArtilleryShellshocked ); } /* @@ -364,7 +368,7 @@ isArtShocked() */ isBombCarrier() { - return (isDefined(self.isBombCarrier) && self.isBombCarrier); + return ( isDefined( self.isBombCarrier ) && self.isBombCarrier ); } /* @@ -372,7 +376,7 @@ isBombCarrier() */ isInUse() { - return (isDefined(self.inUse) && self.inUse); + return ( isDefined( self.inUse ) && self.inUse ); } /* @@ -380,7 +384,7 @@ isInUse() */ IsFlared() { - return (isdefined(self.inFlareVisionArea) && self.inFlareVisionArea && !self hasPerk("specialty_shades")); + return ( isdefined( self.inFlareVisionArea ) && self.inFlareVisionArea && !self hasPerk( "specialty_shades" ) ); } /* @@ -388,7 +392,7 @@ IsFlared() */ isGased() { - return (isdefined(self.inPoisonArea) && self.inPoisonArea && !self hasPerk("specialty_gas_mask")); + return ( isdefined( self.inPoisonArea ) && self.inPoisonArea && !self hasPerk( "specialty_gas_mask" ) ); } /* @@ -396,7 +400,7 @@ isGased() */ isFlagCarrier() { - return (isDefined(self.isFlagCarrier) && self.isFlagCarrier); + return ( isDefined( self.isFlagCarrier ) && self.isFlagCarrier ); } /* @@ -406,14 +410,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; } @@ -432,50 +436,50 @@ getValidGrenade() grenadeTypes[grenadeTypes.size] = "tabun_gas_mp"; grenadeTypes[grenadeTypes.size] = "sticky_grenade_mp"; grenadeTypes[grenadeTypes.size] = "signal_flare_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 PickRandom(possibles); + + return PickRandom( possibles ); } /* Picks a random thing */ -PickRandom(arr) +PickRandom( arr ) { - if (!arr.size) + if ( !arr.size ) return undefined; - return arr[randomInt(arr.size)]; + return arr[randomInt( arr.size )]; } /* If weap is a secondary gnade */ -isSecondaryGrenade(gnade) +isSecondaryGrenade( gnade ) { - return (gnade == "tabun_gas_mp" || gnade == "m8_white_smoke_mp" || gnade == "signal_flare_mp"); + return ( gnade == "tabun_gas_mp" || gnade == "m8_white_smoke_mp" || gnade == "signal_flare_mp" ); } /* 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]] ); } /* @@ -484,7 +488,7 @@ WeaponIsFullAuto(weap) GetEyeHeight() { myEye = self GetEyePos(); - + return myEye[2] - self.origin[2]; } @@ -493,25 +497,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; @@ -539,10 +543,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(); @@ -583,136 +587,199 @@ _timeout( delay ) /* Returns if we have the create a class object unlocked. */ -isItemUnlocked(what, lvl) +isItemUnlocked( what, lvl ) { - switch(what) + switch ( what ) { case "m1carbine": - return (lvl >= 65); + return ( lvl >= 65 ); + case "m1garand": - return (lvl >= 17); + return ( lvl >= 17 ); + case "mg42": - return (lvl >= 33); + return ( lvl >= 33 ); + case "mosinrifle": - return (lvl >= 21); + return ( lvl >= 21 ); + case "mp40": - return (lvl >= 10); + return ( lvl >= 10 ); + case "ppsh": - return (lvl >= 53); + return ( lvl >= 53 ); + case "ptrs41": - return (lvl >= 57); + return ( lvl >= 57 ); + case "shotgun": return true; + case "springfield": return true; + case "stg44": - return (lvl >= 37); + return ( lvl >= 37 ); + case "svt40": return true; + case "thompson": return true; + case "type99rifle": return true; + case "type100smg": - return (lvl >= 25); + return ( lvl >= 25 ); + case "type99lmg": return true; + case "kar98k": - return (lvl >= 41); + return ( lvl >= 41 ); + case "gewehr43": - return (lvl >= 7); + return ( lvl >= 7 ); + case "fg42": - return (lvl >= 45); + return ( lvl >= 45 ); + case "doublebarreledshotgun": - return (lvl >= 29); + return ( lvl >= 29 ); + case "bar": return true; + case "30cal": - return (lvl >= 61); + return ( lvl >= 61 ); + case "dp28": - return (lvl >= 13); + return ( lvl >= 13 ); + case "walther": return true; + case "357magnum": - return (lvl >= 49); + return ( lvl >= 49 ); + case "colt": return true; + case "nambu": return true; + case "tokarev": - return (lvl >= 21); + return ( lvl >= 21 ); + case "frag_grenade_mp": return true; + case "molotov_mp": - return (lvl >= 10); + return ( lvl >= 10 ); + case "sticky_grenade_mp": return true; + case "specialty_water_cooled": return true; + case "specialty_greased_barrings": return true; + case "specialty_ordinance": - return (lvl >= 12); + return ( lvl >= 12 ); + case "specialty_boost": - return (lvl >= 28); + return ( lvl >= 28 ); + case "specialty_leadfoot": - return (lvl >= 40); + return ( lvl >= 40 ); + case "specialty_bulletdamage": return true; + case "specialty_armorvest": return true; + case "specialty_fastreload": - return (lvl >= 28); + return ( lvl >= 28 ); + case "specialty_rof": - return (lvl >= 36); + return ( lvl >= 36 ); + case "specialty_twoprimaries": - return (lvl >= 56); + return ( lvl >= 56 ); + case "specialty_gpsjammer": - return (lvl >= 12); + return ( lvl >= 12 ); + case "specialty_explosivedamage": return true; + case "specialty_flakjacket": return true; + case "specialty_shades": - return (lvl >= 32); + return ( lvl >= 32 ); + case "specialty_gas_mask": return true; + case "specialty_longersprint": return true; + case "specialty_bulletaccuracy": return true; + case "specialty_pistoldeath": - return (lvl >= 9); + return ( lvl >= 9 ); + case "specialty_grenadepulldeath": - return (lvl >= 20); + return ( lvl >= 20 ); + case "specialty_bulletpenetration": return true; + case "specialty_holdbreath": - return (lvl >= 60); + return ( lvl >= 60 ); + case "specialty_quieter": - return (lvl >= 52); + return ( lvl >= 52 ); + case "specialty_fireproof": - return (lvl >= 48); + return ( lvl >= 48 ); + case "specialty_reconnaissance": - return (lvl >= 64); + return ( lvl >= 64 ); + case "specialty_pin_back": - return (lvl >= 6); + return ( lvl >= 6 ); + case "specialty_specialgrenade": return true; + case "specialty_weapon_bouncing_betty": - return (lvl >= 24); + return ( lvl >= 24 ); + case "specialty_weapon_flamethrower": - return (lvl >= 65); + return ( lvl >= 65 ); + case "specialty_fraggrenade": - return (lvl >= 44); + return ( lvl >= 44 ); + case "specialty_extraammo": - return (lvl >= 40); + return ( lvl >= 40 ); + case "specialty_detectexplosive": - return (lvl >= 16); + return ( lvl >= 16 ); + case "specialty_weapon_bazooka": return true; + case "specialty_weapon_satchel_charge": return true; + default: return true; } @@ -721,17 +788,17 @@ 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 ) ); } /* 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; } @@ -740,11 +807,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; @@ -754,44 +821,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; } } @@ -800,46 +867,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; @@ -848,55 +916,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; @@ -911,6 +979,7 @@ Round(x) RoundUp( floatVal ) { i = int( floatVal ); + if ( i != floatVal ) return i + 1; else @@ -923,42 +992,47 @@ RoundUp( floatVal ) 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<13; i++ ) + + for ( i = 0; i < 13; 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 ); @@ -975,28 +1049,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<13; i++ ) + + for ( i = 0; i < 13; 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; } } @@ -1004,26 +1078,27 @@ cac_init_patch() /* converts a string into a float */ -float(num) +float( num ) { - setdvar("temp_dvar_bot_util", num); + setdvar( "temp_dvar_bot_util", num ); - return GetDvarFloat("temp_dvar_bot_util"); + return GetDvarFloat( "temp_dvar_bot_util" ); } /* 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 = ""; @@ -1032,6 +1107,7 @@ tokenizeLine(line, tok) token += c; } + tokens[tokens.size] = token; return tokens; @@ -1040,28 +1116,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; @@ -1274,17 +1376,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]; @@ -1296,16 +1398,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]; @@ -1318,35 +1421,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]; @@ -1357,18 +1462,18 @@ getWaypointForIndex(i) */ getGoodMapAmount() { - switch(getDvar("mapname")) + switch ( getDvar( "mapname" ) ) { case "mp_kneedeep": case "mp_seelow": case "mp_outskirts": case "mp_downfall": case "mp_roundhouse": - if(level.teamBased) + if ( level.teamBased ) return 14; else return 9; - + case "mp_suburban": case "mp_docks": case "mp_subway": @@ -1385,117 +1490,224 @@ getGoodMapAmount() case "mp_asylum": case "mp_airfield": case "mp_bgate": - if(level.teamBased) + if ( level.teamBased ) return 12; else return 8; - + case "mp_dome": case "mp_drum": - if(level.teamBased) + if ( level.teamBased ) return 8; else return 4; } - + return 2; } /* 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; } /* Returns the friendly user name for a given map's codename */ -getMapName(map) +getMapName( map ) { - switch(map) + switch ( map ) { case "mp_airfield": return "Airfield"; + case "mp_asylum": return "Asylum"; + case "mp_kwai": return "Banzai"; + case "mp_drum": return "Battery"; + case "mp_castle": return "Castle"; + case "mp_shrine": return "Cliffside"; + case "mp_stalingrad": return "Corrosion"; + case "mp_courtyard": return "Courtyard"; + case "mp_dome": return "Dome"; + case "mp_downfall": return "Downfall"; + case "mp_hangar": return "Hangar"; + case "mp_kneedeep": return "Knee Deep"; + case "mp_makin": return "Makin"; + case "mp_makin_day": return "Makin Day"; + case "mp_nachtfeuer": return "Nightfire"; + case "mp_outskirts": return "Outskirts"; + case "mp_vodka": return "Revolution"; + case "mp_roundhouse": return "Roundhouse"; + case "mp_seelow": return "Seelow"; + case "mp_subway": return "Station"; + case "mp_docks": return "Sub Pens"; + case "mp_suburban": return "Upheaval"; + case "mp_bgate": return "Breach"; } - + return map; } @@ -1514,16 +1726,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; } @@ -1533,64 +1746,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 ); } /* @@ -1601,26 +1818,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]; } @@ -1632,18 +1849,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; @@ -1659,24 +1876,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; @@ -1688,116 +1905,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]; } @@ -1805,7 +2028,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]; } @@ -1813,7 +2036,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]; } @@ -1821,7 +2044,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; } @@ -1829,7 +2052,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; } @@ -1837,7 +2060,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"]; } @@ -1845,53 +2068,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; @@ -1903,40 +2126,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; } @@ -1944,62 +2167,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; } @@ -2008,75 +2233,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; } @@ -2084,87 +2313,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; @@ -2177,9 +2411,9 @@ Log(x) frac *= xmlxpl_2; sum += frac / denom; } - + answer = 2.0 * sum; - + //level.log_cache[key] = answer; return answer; } @@ -2192,10 +2426,12 @@ array_average( array ) { assert( array.size > 0 ); total = 0; + for ( i = 0; i < array.size; i++ ) { total += array[i]; } + return ( total / array.size ); } @@ -2207,15 +2443,19 @@ array_std_deviation( array, mean ) { assert( array.size > 0 ); tmp = []; + for ( i = 0; i < array.size; i++ ) { tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); } + total = 0; + for ( i = 0; i < tmp.size; i++ ) { total = total + tmp[i]; } + return Sqrt( total / array.size ); } @@ -2229,25 +2469,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 ); } onUsePlantObjectFix( player ) @@ -2260,21 +2504,24 @@ onUsePlantObjectFix( player ) lpselfnum = player getEntityNumber(); lpGuid = player getGuid(); - logPrint("BP;" + lpGuid + ";" + lpselfnum + ";" + player.name + "\n"); - + logPrint( "BP;" + lpGuid + ";" + lpselfnum + ";" + player.name + "\n" ); + // 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(); } - thread playSoundOnPlayers( "mx_SD_planted"+"_"+level.teamPrefix[player.pers["team"]] ); + + thread playSoundOnPlayers( "mx_SD_planted" + "_" + level.teamPrefix[player.pers["team"]] ); 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 ); @@ -2286,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" ); @@ -2303,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( "weapon_explosives" ); } + 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" ); @@ -2350,48 +2598,49 @@ 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; - + player.isBombCarrier = false; - + 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+(0,0,12); + + explosionOrigin = level.sdBombModel.origin + ( 0, 0, 12 ); level.sdBombModel hide(); - + if ( isdefined( player ) ) destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); else destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" ); - - if ( isdefined(player) ) + + if ( isdefined( player ) ) player setStatLBByName( "search_and_destroy", 1, "Targets Destroyed" ); - - 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 febdfc7..1d3c231 100644 --- a/main_shared/maps/mp/bots/_menu.gsc +++ b/main_shared/maps/mp/bots/_menu.gsc @@ -1,1028 +1,1142 @@ -/* - _menu - Author: INeedGames - Date: 09/26/2020 - The ingame menu. -*/ - -#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_menu") == "") - setDvar("bots_main_menu", true); - - if (!getDvarInt("bots_main_menu")) - return; - - thread watchPlayers(); -} - -watchPlayers() -{ - for (;;) - { - wait 1; - - if (!getDvarInt("bots_main_menu")) - return; - - for (i = level.players.size - 1; i >= 0; i--) - { - player = level.players[i]; - - if (!player is_host()) - continue; - - if (isDefined(player.menuInit) && player.menuInit) - continue; - - player thread init_menu(); - } - } -} - -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.menuInit = undefined; -} - -watchDisconnect() -{ - 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])) - self.MenuTextY[i] destroy(); - - if(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) - self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) - { - if(isDefined(self.Menu["X"]["Shader"])) - self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) - self.Menu["X"]["Scroller"] destroy(); - } - - if (isDefined(self.menuVersionHud)) - self.menuVersionHud destroy(); - } -} - -doGreetings() -{ - self endon ( "disconnect" ); - self endon ( "bots_kill_menu" ); - wait 1; - self iPrintln("Welcome to Bot Warfare "+self.name+"!"); - wait 5; - self iPrintln("Press [{+frag}] + [{+smoke}] to open menu!"); -} - -watchPlayerOpenMenu() -{ - self endon ( "disconnect" ); - self endon ( "bots_kill_menu" ); - - for(;;) - { - while(!self FragButtonPressed() || !self SecondaryOffhandButtonPressed()) - wait 0.05; - - if(!self.menuOpen) - { - self playLocalSound( "mouse_click" ); - self thread OpenSub(self.SubMenu); - } - else - { - self playLocalSound( "mouse_click" ); - if(self.SubMenu != "Main") - self ExitSub(); - else - { - self ExitMenu(); - if(level.inPrematchPeriod || level.gameEnded) - self freezeControls(true); - else - self freezecontrols(false); - } - } - - while(self FragButtonPressed() && self SecondaryOffhandButtonPressed()) - wait 0.05; - } -} - -MenuSelect() -{ - self endon ( "disconnect" ); - self endon ( "bots_kill_menu" ); - - for(;;) - { - while(!self MeleeButtonPressed()) - wait 0.05; - - if(self.MenuOpen) - { - self playLocalSound( "mouse_click" ); - if(self.SubMenu == "Main") - self thread [[self.Option["Function"][self.SubMenu][self.Curs["Main"]["X"]]]](self.Option["Arg1"][self.SubMenu][self.Curs["Main"]["X"]],self.Option["Arg2"][self.SubMenu][self.Curs["Main"]["X"]]); - 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"]]); - } - - while(self MeleeButtonPressed()) - wait 0.05; - } -} - -LeftMenu() -{ - self endon ( "disconnect" ); - self endon ( "bots_kill_menu" ); - - for(;;) - { - while(!self AttackButtonPressed()) - wait 0.05; - - if(self.MenuOpen) - { - self playLocalSound("mouse_over"); - - if(self.SubMenu == "Main") - { - self.Curs["Main"]["X"]--; - - if(self.Curs["Main"]["X"] < 0) - self.Curs["Main"]["X"] = self.Option["Name"][self.SubMenu].size -1; - - self CursMove("X"); - } - else - { - self.Curs[self.SubMenu]["Y"]--; - - if(self.Curs[self.SubMenu]["Y"] < 0) - self.Curs[self.SubMenu]["Y"] = self.Option["Name"][self.SubMenu].size -1; - - self CursMove("Y"); - } - } - - while(self AttackButtonPressed()) - wait 0.05; - } -} - -RightMenu() -{ - self endon ( "disconnect" ); - self endon ( "bots_kill_menu" ); - - for(;;) - { - while(!self AdsButtonPressed()) - wait 0.05; - - if(self.MenuOpen) - { - self playLocalSound("mouse_over"); - - if(self.SubMenu == "Main") - { - self.Curs["Main"]["X"]++; - - if(self.Curs["Main"]["X"] > self.Option["Name"][self.SubMenu].size -1) - self.Curs["Main"]["X"] = 0; - - self CursMove("X"); - } - else - { - self.Curs[self.SubMenu]["Y"]++; - - if(self.Curs[self.SubMenu]["Y"] > self.Option["Name"][self.SubMenu].size -1) - self.Curs[self.SubMenu]["Y"] = 0; - - self CursMove("Y"); - } - } - - while(self AdsButtonPressed()) - wait 0.05; - } -} - -OpenSub(menu, menu2) -{ - 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(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) - self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) - { - if(isDefined(self.Menu["X"]["Shader"])) - self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) - self.Menu["X"]["Scroller"] destroy(); - } - - if (isDefined(self.menuVersionHud)) - self.menuVersionHud destroy(); - - for(i=0 ; i < self.Option["Name"][self.SubMenu].size ; i++) - { - self.MenuText[i] = self createfontstring("default", 1.6); - self.MenuText[i] setpoint("CENTER", "CENTER", -300+(i*100), -226); - self.MenuText[i] settext(self.Option["Name"][self.SubMenu][i]); - if(logOldi) - self.oldi = i; - - if(self.MenuText[i].x > 300) - { - logOldi = false; - x = i - self.oldi; - self.MenuText[i] setpoint("CENTER", "CENTER", (((-300)-(i*100))+(i*100))+(x*100), -196); - } - self.MenuText[i].alpha = 1; - self.MenuText[i].sort = 999; - } - - if(!logOldi) - self.Menu["X"]["Shader"] = self createRectangle("CENTER","CENTER",0,-225,1000,90, (0,0,0), -2, 1,"white"); - else - self.Menu["X"]["Shader"] = self createRectangle("CENTER","CENTER",0,-225,1000,30, (0,0,0), -2, 1,"white"); - - self.Menu["X"]["Scroller"] = self createRectangle("CENTER","CENTER", self.MenuText[self.Curs["Main"]["X"]].x,-225,105,22, (1,0,0), -1, 1,"white"); - - self CursMove("X"); - - 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])) - self.MenuTextY[i] destroy(); - - 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].alpha = 1; - self.MenuTextY[i].sort = 999; - } - - self CursMove("Y"); - } -} - -CursMove(direction) -{ - self notify("scrolled"); - if(self.SubMenu == "Main") - { - self.Menu["X"]["Scroller"].x = self.MenuText[self.Curs["Main"]["X"]].x; - self.Menu["X"]["Scroller"].y = self.MenuText[self.Curs["Main"]["X"]].y; - - if(isDefined(self.MenuText)) - { - for(i = 0; i < self.MenuText.size; i++) - { - if(isDefined(self.MenuText[i])) - { - self.MenuText[i].fontscale = 1.5; - self.MenuText[i].color = (1,1,1); - self.MenuText[i].glowAlpha = 0; - } - } - } - - self thread ShowOptionOn(direction); - } - else - { - if(isDefined(self.MenuTextY)) - { - for(i = 0; i < self.MenuTextY.size; i++) - { - if(isDefined(self.MenuTextY[i])) - { - self.MenuTextY[i].fontscale = 1.5; - self.MenuTextY[i].color = (1,1,1); - self.MenuTextY[i].glowAlpha = 0; - } - } - } - - if(isDefined(self.MenuText)) - { - for(i = 0; i < self.MenuText.size; i++) - { - if(isDefined(self.MenuText[i])) - { - self.MenuText[i].fontscale = 1.5; - self.MenuText[i].color = (1,1,1); - self.MenuText[i].glowAlpha = 0; - } - } - } - - self thread ShowOptionOn(direction); - } -} - -ShowOptionOn(variable) -{ - 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); - else - self freezecontrols(true); - - self setClientDvar( "r_blur", "5" ); - self setClientDvar( "sc_blur", "4" ); - self addOptions(); - - if(self.SubMenu == "Main") - { - if(isDefined(self.Curs[self.SubMenu][variable]) && isDefined(self.MenuText) && isDefined(self.MenuText[self.Curs[self.SubMenu][variable]])) - { - self.MenuText[self.Curs[self.SubMenu][variable]].fontscale = 2.0; - //self.MenuText[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255); - color = (6/255,69/255,173+randomIntRange(-5,5)/255); - if (int(time * 4) % 2) - color = (11/255,0/255,128+randomIntRange(-10,10)/255); - self.MenuText[self.Curs[self.SubMenu][variable]].color = color; - } - - if(isDefined(self.MenuText)) - { - for(i = 0; i < self.Option["Name"][self.SubMenu].size; i++) - { - 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]])) - { - self.MenuTextY[self.Curs[self.SubMenu][variable]].fontscale = 2.0; - //self.MenuTextY[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255); - color = (6/255,69/255,173+randomIntRange(-5,5)/255); - if (int(time * 4) % 2) - color = (11/255,0/255,128+randomIntRange(-10,10)/255); - self.MenuTextY[self.Curs[self.SubMenu][variable]].color = color; - } - - if(isDefined(self.MenuTextY)) - { - for(i = 0; i < self.Option["Name"][self.SubMenu].size; i++) - { - 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) -{ - self.Option["Name"][menu][num] = text; - self.Option["Function"][menu][num] = function; - self.Option["Arg1"][menu][num] = arg1; - self.Option["Arg2"][menu][num] = arg2; -} - -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])) - self.MenuTextY[i] destroy(); - - self.SubMenu = self.Menu["Back"][self.Submenu]; - - if(self.SubMenu == "Main") - self CursMove("X"); - else - self CursMove("Y"); -} - -ExitMenu() -{ - if(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) - self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) - { - if(isDefined(self.Menu["X"]["Shader"])) - self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) - self.Menu["X"]["Scroller"] destroy(); - } - - if (isDefined(self.menuVersionHud)) - self.menuVersionHud destroy(); - - self.MenuOpen = false; - self notify("exit"); - - self setClientDvar( "r_blur", "0" ); - self setClientDvar( "sc_blur", "2" ); -} - -initHudElem(txt, xl, yl) -{ - hud = NewClientHudElem( self ); - hud setText(txt); - hud.alignX = "center"; - hud.alignY = "bottom"; - hud.horzAlign = "center"; - hud.vertAlign = "bottom"; - hud.x = xl; - hud.y = yl; - hud.foreground = true; - hud.fontScale = 1.4; - hud.font = "objective"; - hud.alpha = 1; - hud.glow = 0; - 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) -{ - barElemBG = newClientHudElem( self ); - barElemBG.elemType = "bar_"; - barElemBG.width = width; - barElemBG.height = height; - barElemBG.align = align; - barElemBG.relative = relative; - barElemBG.xOffset = 0; - barElemBG.yOffset = 0; - barElemBG.children = []; - barElemBG.sort = sort; - barElemBG.color = color; - barElemBG.alpha = alpha; - barElemBG setParent( level.uiParent ); - barElemBG setShader( shader, width , height ); - barElemBG.hidden = false; - barElemBG setPoint(align, relative, x, y); - return barElemBG; -} - -AddOptions() -{ - self AddMenu("Main", 0, "Manage bots", ::OpenSub, "man_bots", ""); - self AddBack("man_bots", "Main"); - - _temp = ""; - _tempDvar = getDvarInt("bots_manage_add"); - self AddMenu("man_bots", 0, "Add 1 bot", ::man_bots, "add", 1 + _tempDvar); - 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) - { - case 0: - _temp = "everyone"; - break; - case 1: - _temp = "just bots"; - break; - case 2: - _temp = "everyone, adjust to map"; - break; - case 3: - _temp = "just bots, adjust to map"; - break; - case 4: - _temp = "bots used as team balance"; - break; - default: - _temp = "out of range"; - break; - } - self AddMenu("man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar); - - _tempDvar = getDvarInt("bots_manage_fill"); - self AddMenu("man_bots", 9, "Increase bots to keep in-game: " + _tempDvar, ::man_bots, "fillup", _tempDvar); - self AddMenu("man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar); - - _tempDvar = getDvarInt("bots_manage_fill_spec"); - if(_tempDvar) - _temp = "true"; - else - _temp = "false"; - self AddMenu("man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar); - - // - - self AddMenu("Main", 1, "Teams and difficulty", ::OpenSub, "man_team", ""); - self AddBack("man_team", "Main"); - - _tempDvar = getdvar("bots_team"); - self AddMenu("man_team", 0, "Change bot team: "+_tempDvar, ::bot_teams, "team", _tempDvar); - - _tempDvar = getDvarInt("bots_team_amount"); - self AddMenu("man_team", 1, "Increase bots to be on axis team: "+_tempDvar, ::bot_teams, "teamup", _tempDvar); - self AddMenu("man_team", 2, "Decrease bots to be on axis team: "+_tempDvar, ::bot_teams, "teamdown", _tempDvar); - - _tempDvar = getDvarInt("bots_team_force"); - if(_tempDvar) - _temp = "true"; - else - _temp = "false"; - self AddMenu("man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar); - - _tempDvar = getDvarInt("bots_team_mode"); - if(_tempDvar) - _temp = "only bots"; - else - _temp = "everyone"; - self AddMenu("man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar); - - _tempDvar = getdvarint("bots_skill"); - switch(_tempDvar) - { - case 0: - _temp = "random for all"; - break; - case 1: - _temp = "too easy"; - break; - case 2: - _temp = "easy"; - break; - case 3: - _temp = "easy-medium"; - break; - case 4: - _temp = "medium"; - break; - case 5: - _temp = "hard"; - break; - case 6: - _temp = "very hard"; - break; - case 7: - _temp = "hardest"; - break; - case 8: - _temp = "custom"; - break; - case 9: - _temp = "complete random"; - break; - default: - _temp = "out of range"; - break; - } - self AddMenu("man_team", 5, "Change bot difficulty: "+_temp, ::bot_teams, "skill", _tempDvar); - - _tempDvar = getDvarInt("bots_skill_axis_hard"); - self AddMenu("man_team", 6, "Increase amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axishardup", _tempDvar); - self AddMenu("man_team", 7, "Decrease amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axisharddown", _tempDvar); - - _tempDvar = getDvarInt("bots_skill_axis_med"); - self AddMenu("man_team", 8, "Increase amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismedup", _tempDvar); - self AddMenu("man_team", 9, "Decrease amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismeddown", _tempDvar); - - _tempDvar = getDvarInt("bots_skill_allies_hard"); - self AddMenu("man_team", 10, "Increase amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "allieshardup", _tempDvar); - self AddMenu("man_team", 11, "Decrease amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "alliesharddown", _tempDvar); - - _tempDvar = getDvarInt("bots_skill_allies_med"); - self AddMenu("man_team", 12, "Increase amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmedup", _tempDvar); - self AddMenu("man_team", 13, "Decrease amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmeddown", _tempDvar); - - // - - self AddMenu("Main", 2, "Bot settings", ::OpenSub, "set1", ""); - self AddBack("set1", "Main"); - - _tempDvar = getDvarInt("bots_loadout_reasonable"); - if(_tempDvar) - _temp = "true"; - else - _temp = "false"; - self AddMenu("set1", 0, "Bots use only good class setups: "+_temp, ::bot_func, "reasonable", _tempDvar); - - _tempDvar = getDvarInt("bots_loadout_allow_op"); - if(_tempDvar) - _temp = "true"; - else - _temp = "false"; - self AddMenu("set1", 1, "Bots can use op and annoying class setups: "+_temp, ::bot_func, "op", _tempDvar); - - _tempDvar = getDvarInt("bots_play_move"); - if(_tempDvar) - _temp = "true"; - else - _temp = "false"; - self AddMenu("set1", 2, "Bots can move: "+_temp, ::bot_func, "move", _tempDvar); - - _tempDvar = getDvarInt("bots_play_knife"); - if(_tempDvar) - _temp = "true"; - else - _temp = "false"; - self AddMenu("set1", 3, "Bots can knife: "+_temp, ::bot_func, "knife", _tempDvar); - - _tempDvar = getDvarInt("bots_play_fire"); - if(_tempDvar) - _temp = "true"; - else - _temp = "false"; - self AddMenu("set1", 4, "Bots can fire: "+_temp, ::bot_func, "fire", _tempDvar); - - _tempDvar = getDvarInt("bots_play_nade"); - if(_tempDvar) - _temp = "true"; - else - _temp = "false"; - self AddMenu("set1", 5, "Bots can nade: "+_temp, ::bot_func, "nade", _tempDvar); - - _tempDvar = getDvarInt("bots_play_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) - _temp = "true"; - else - _temp = "false"; - 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) - _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) - _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) - _temp = "true"; - else - _temp = "false"; - self AddMenu("set1", 11, "Bots can ads: "+_temp, ::bot_func, "ads", _tempDvar); -} - -bot_func(a, b) -{ - switch (a) - { - case "reasonable": - setDvar("bots_loadout_reasonable", !b); - self iPrintln("Bots using reasonable setups: " + !b); - break; - case "op": - setDvar("bots_loadout_allow_op", !b); - self iPrintln("Bots using op setups: " + !b); - break; - case "move": - setDvar("bots_play_move", !b); - self iPrintln("Bots move: " + !b); - break; - case "knife": - setDvar("bots_play_knife", !b); - self iPrintln("Bots knife: " + !b); - break; - case "fire": - setDvar("bots_play_fire", !b); - self iPrintln("Bots fire: " + !b); - break; - case "nade": - setDvar("bots_play_nade", !b); - self iPrintln("Bots nade: " + !b); - break; - case "obj": - setDvar("bots_play_obj", !b); - self iPrintln("Bots play the obj: " + !b); - break; - case "camp": - setDvar("bots_play_camp", !b); - self iPrintln("Bots camp: " + !b); - break; - case "jump": - setDvar("bots_play_jumpdrop", !b); - self iPrintln("Bots jump: " + !b); - break; - case "targetother": - setDvar("bots_play_target_other", !b); - self iPrintln("Bots target other: " + !b); - break; - case "killstreak": - setDvar("bots_play_killstreak", !b); - self iPrintln("Bots use killstreaks: " + !b); - break; - case "ads": - setDvar("bots_play_ads", !b); - self iPrintln("Bots ads: " + !b); - break; - } -} - -bot_teams(a, b) -{ - switch(a) - { - case "team": - switch(b) - { - case "autoassign": - setdvar("bots_team", "allies"); - self iPrintlnBold("Changed bot team to allies."); - break; - case "allies": - setdvar("bots_team", "axis"); - self iPrintlnBold("Changed bot team to axis."); - break; - case "axis": - setdvar("bots_team", "custom"); - self iPrintlnBold("Changed bot team to custom."); - break; - default: - setdvar("bots_team", "autoassign"); - self iPrintlnBold("Changed bot team to autoassign."); - break; - } - break; - case "teamup": - setdvar("bots_team_amount", b+1); - self iPrintln((b+1)+" bot(s) will try to be on axis team."); - break; - case "teamdown": - setdvar("bots_team_amount", b-1); - self iPrintln((b-1)+" bot(s) will try to be on axis team."); - break; - case "teamforce": - setDvar("bots_team_force", !b); - self iPrintln("Forcing bots to team: " + !b); - break; - case "teammode": - setDvar("bots_team_mode", !b); - self iPrintln("Only count bots on team: " + !b); - break; - case "skill": - switch(b) - { - case 0: - self iPrintlnBold("Changed bot skill to easy."); - setDvar("bots_skill", 1); - break; - case 1: - self iPrintlnBold("Changed bot skill to easy-med."); - setDvar("bots_skill", 2); - break; - case 2: - self iPrintlnBold("Changed bot skill to medium."); - setDvar("bots_skill", 3); - break; - case 3: - self iPrintlnBold("Changed bot skill to med-hard."); - setDvar("bots_skill", 4); - break; - case 4: - self iPrintlnBold("Changed bot skill to hard."); - setDvar("bots_skill", 5); - break; - case 5: - self iPrintlnBold("Changed bot skill to very hard."); - setDvar("bots_skill", 6); - break; - case 6: - self iPrintlnBold("Changed bot skill to hardest."); - setDvar("bots_skill", 7); - break; - case 7: - self iPrintlnBold("Changed bot skill to custom. Base is easy."); - setDvar("bots_skill", 8); - break; - case 8: - self iPrintlnBold("Changed bot skill to complete random. Takes effect at restart."); - setDvar("bots_skill", 9); - break; - default: - self iPrintlnBold("Changed bot skill to random. Takes effect at restart."); - setDvar("bots_skill", 0); - break; - } - break; - case "axishardup": - setdvar("bots_skill_axis_hard", (b+1)); - self iPrintln(((b+1))+" hard bots will be on axis team."); - break; - case "axisharddown": - setdvar("bots_skill_axis_hard", (b-1)); - self iPrintln(((b-1))+" hard bots will be on axis team."); - break; - case "axismedup": - setdvar("bots_skill_axis_med", (b+1)); - self iPrintln(((b+1))+" med bots will be on axis team."); - break; - case "axismeddown": - setdvar("bots_skill_axis_med", (b-1)); - self iPrintln(((b-1))+" med bots will be on axis team."); - break; - case "allieshardup": - setdvar("bots_skill_allies_hard", (b+1)); - self iPrintln(((b+1))+" hard bots will be on allies team."); - break; - case "alliesharddown": - setdvar("bots_skill_allies_hard", (b-1)); - self iPrintln(((b-1))+" hard bots will be on allies team."); - break; - case "alliesmedup": - setdvar("bots_skill_allies_med", (b+1)); - self iPrintln(((b+1))+" med bots will be on allies team."); - break; - case "alliesmeddown": - setdvar("bots_skill_allies_med", (b-1)); - self iPrintln(((b-1))+" med bots will be on allies team."); - break; - } -} - -man_bots(a, b) -{ - switch(a) - { - case "add": - setdvar("bots_manage_add", b); - if(b == 1) - { - self iPrintln("Adding "+b+" bot."); - } - else - { - self iPrintln("Adding "+b+" bots."); - } - break; - case "kick": - result = false; - - for (i = 0; i < b; i++) - { - tempBot = random(getBotArray()); - if (isDefined(tempBot)) - { - tempBot RemoveTestClient(); - result = true; - } - - wait 0.25; - } - - if(!result) - self iPrintln("No bots to kick"); - break; - case "autokick": - setDvar("bots_manage_fill_kick", !b); - self iPrintln("Kicking bots when bots_fill is exceeded: " + !b); - break; - case "fillmode": - switch(b) - { - case 0: - setdvar("bots_manage_fill_mode", 1); - self iPrintln("bot_fill will now count only bots."); - break; - case 1: - setdvar("bots_manage_fill_mode", 2); - self iPrintln("bot_fill will now count everyone, adjusting to map."); - break; - case 2: - setdvar("bots_manage_fill_mode", 3); - self iPrintln("bot_fill will now count only bots, adjusting to map."); - break; - case 3: - setdvar("bots_manage_fill_mode", 4); - self iPrintln("bot_fill will now use bots as team balance."); - break; - default: - setdvar("bots_manage_fill_mode", 0); - self iPrintln("bot_fill will now count everyone."); - break; - } - break; - case "fillup": - setdvar("bots_manage_fill", b+1); - self iPrintln("Increased to maintain "+(b+1)+" bot(s)."); - break; - case "filldown": - setdvar("bots_manage_fill", b-1); - self iPrintln("Decreased to maintain "+(b-1)+" bot(s)."); - break; - case "fillspec": - setDvar("bots_manage_fill_spec", !b); - self iPrintln("Count players on spectator for bots_fill: " + !b); - break; - } -} +/* + _menu + Author: INeedGames + Date: 09/26/2020 + The ingame menu. +*/ + +#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_menu" ) == "" ) + setDvar( "bots_main_menu", true ); + + if ( !getDvarInt( "bots_main_menu" ) ) + return; + + thread watchPlayers(); +} + +watchPlayers() +{ + for ( ;; ) + { + wait 1; + + if ( !getDvarInt( "bots_main_menu" ) ) + return; + + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[i]; + + if ( !player is_host() ) + continue; + + if ( isDefined( player.menuInit ) && player.menuInit ) + continue; + + player thread init_menu(); + } + } +} + +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.menuInit = undefined; +} + +watchDisconnect() +{ + 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] ) ) + self.MenuTextY[i] destroy(); + + if ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) + self.MenuText[i] destroy(); + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) + { + if ( isDefined( self.Menu["X"]["Shader"] ) ) + self.Menu["X"]["Shader"] destroy(); + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) + self.Menu["X"]["Scroller"] destroy(); + } + + if ( isDefined( self.menuVersionHud ) ) + self.menuVersionHud destroy(); + } +} + +doGreetings() +{ + self endon ( "disconnect" ); + self endon ( "bots_kill_menu" ); + wait 1; + self iPrintln( "Welcome to Bot Warfare " + self.name + "!" ); + wait 5; + self iPrintln( "Press [{+frag}] + [{+smoke}] to open menu!" ); +} + +watchPlayerOpenMenu() +{ + self endon ( "disconnect" ); + self endon ( "bots_kill_menu" ); + + for ( ;; ) + { + while ( !self FragButtonPressed() || !self SecondaryOffhandButtonPressed() ) + wait 0.05; + + if ( !self.menuOpen ) + { + self playLocalSound( "mouse_click" ); + self thread OpenSub( self.SubMenu ); + } + else + { + self playLocalSound( "mouse_click" ); + + if ( self.SubMenu != "Main" ) + self ExitSub(); + else + { + self ExitMenu(); + + if ( level.inPrematchPeriod || level.gameEnded ) + self freezeControls( true ); + else + self freezecontrols( false ); + } + } + + while ( self FragButtonPressed() && self SecondaryOffhandButtonPressed() ) + wait 0.05; + } +} + +MenuSelect() +{ + self endon ( "disconnect" ); + self endon ( "bots_kill_menu" ); + + for ( ;; ) + { + while ( !self MeleeButtonPressed() ) + wait 0.05; + + if ( self.MenuOpen ) + { + self playLocalSound( "mouse_click" ); + + if ( self.SubMenu == "Main" ) + self thread [[self.Option["Function"][self.SubMenu][self.Curs["Main"]["X"]]]]( self.Option["Arg1"][self.SubMenu][self.Curs["Main"]["X"]], self.Option["Arg2"][self.SubMenu][self.Curs["Main"]["X"]] ); + 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"]] ); + } + + while ( self MeleeButtonPressed() ) + wait 0.05; + } +} + +LeftMenu() +{ + self endon ( "disconnect" ); + self endon ( "bots_kill_menu" ); + + for ( ;; ) + { + while ( !self AttackButtonPressed() ) + wait 0.05; + + if ( self.MenuOpen ) + { + self playLocalSound( "mouse_over" ); + + if ( self.SubMenu == "Main" ) + { + self.Curs["Main"]["X"]--; + + if ( self.Curs["Main"]["X"] < 0 ) + self.Curs["Main"]["X"] = self.Option["Name"][self.SubMenu].size - 1; + + self CursMove( "X" ); + } + else + { + self.Curs[self.SubMenu]["Y"]--; + + if ( self.Curs[self.SubMenu]["Y"] < 0 ) + self.Curs[self.SubMenu]["Y"] = self.Option["Name"][self.SubMenu].size - 1; + + self CursMove( "Y" ); + } + } + + while ( self AttackButtonPressed() ) + wait 0.05; + } +} + +RightMenu() +{ + self endon ( "disconnect" ); + self endon ( "bots_kill_menu" ); + + for ( ;; ) + { + while ( !self AdsButtonPressed() ) + wait 0.05; + + if ( self.MenuOpen ) + { + self playLocalSound( "mouse_over" ); + + if ( self.SubMenu == "Main" ) + { + self.Curs["Main"]["X"]++; + + if ( self.Curs["Main"]["X"] > self.Option["Name"][self.SubMenu].size - 1 ) + self.Curs["Main"]["X"] = 0; + + self CursMove( "X" ); + } + else + { + self.Curs[self.SubMenu]["Y"]++; + + if ( self.Curs[self.SubMenu]["Y"] > self.Option["Name"][self.SubMenu].size - 1 ) + self.Curs[self.SubMenu]["Y"] = 0; + + self CursMove( "Y" ); + } + } + + while ( self AdsButtonPressed() ) + wait 0.05; + } +} + +OpenSub( menu, menu2 ) +{ + 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 ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) + self.MenuText[i] destroy(); + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) + { + if ( isDefined( self.Menu["X"]["Shader"] ) ) + self.Menu["X"]["Shader"] destroy(); + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) + self.Menu["X"]["Scroller"] destroy(); + } + + if ( isDefined( self.menuVersionHud ) ) + self.menuVersionHud destroy(); + + for ( i = 0 ; i < self.Option["Name"][self.SubMenu].size ; i++ ) + { + self.MenuText[i] = self createfontstring( "default", 1.6 ); + self.MenuText[i] setpoint( "CENTER", "CENTER", -300 + ( i * 100 ), -226 ); + self.MenuText[i] settext( self.Option["Name"][self.SubMenu][i] ); + + if ( logOldi ) + self.oldi = i; + + if ( self.MenuText[i].x > 300 ) + { + logOldi = false; + x = i - self.oldi; + self.MenuText[i] setpoint( "CENTER", "CENTER", ( ( ( -300 ) - ( i * 100 ) ) + ( i * 100 ) ) + ( x * 100 ), -196 ); + } + + self.MenuText[i].alpha = 1; + self.MenuText[i].sort = 999; + } + + if ( !logOldi ) + self.Menu["X"]["Shader"] = self createRectangle( "CENTER", "CENTER", 0, -225, 1000, 90, ( 0, 0, 0 ), -2, 1, "white" ); + else + self.Menu["X"]["Shader"] = self createRectangle( "CENTER", "CENTER", 0, -225, 1000, 30, ( 0, 0, 0 ), -2, 1, "white" ); + + self.Menu["X"]["Scroller"] = self createRectangle( "CENTER", "CENTER", self.MenuText[self.Curs["Main"]["X"]].x, -225, 105, 22, ( 1, 0, 0 ), -1, 1, "white" ); + + self CursMove( "X" ); + + 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] ) ) + self.MenuTextY[i] destroy(); + + 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].alpha = 1; + self.MenuTextY[i].sort = 999; + } + + self CursMove( "Y" ); + } +} + +CursMove( direction ) +{ + self notify( "scrolled" ); + + if ( self.SubMenu == "Main" ) + { + self.Menu["X"]["Scroller"].x = self.MenuText[self.Curs["Main"]["X"]].x; + self.Menu["X"]["Scroller"].y = self.MenuText[self.Curs["Main"]["X"]].y; + + if ( isDefined( self.MenuText ) ) + { + for ( i = 0; i < self.MenuText.size; i++ ) + { + if ( isDefined( self.MenuText[i] ) ) + { + self.MenuText[i].fontscale = 1.5; + self.MenuText[i].color = ( 1, 1, 1 ); + self.MenuText[i].glowAlpha = 0; + } + } + } + + self thread ShowOptionOn( direction ); + } + else + { + if ( isDefined( self.MenuTextY ) ) + { + for ( i = 0; i < self.MenuTextY.size; i++ ) + { + if ( isDefined( self.MenuTextY[i] ) ) + { + self.MenuTextY[i].fontscale = 1.5; + self.MenuTextY[i].color = ( 1, 1, 1 ); + self.MenuTextY[i].glowAlpha = 0; + } + } + } + + if ( isDefined( self.MenuText ) ) + { + for ( i = 0; i < self.MenuText.size; i++ ) + { + if ( isDefined( self.MenuText[i] ) ) + { + self.MenuText[i].fontscale = 1.5; + self.MenuText[i].color = ( 1, 1, 1 ); + self.MenuText[i].glowAlpha = 0; + } + } + } + + self thread ShowOptionOn( direction ); + } +} + +ShowOptionOn( variable ) +{ + 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 ); + else + self freezecontrols( true ); + + self setClientDvar( "r_blur", "5" ); + self setClientDvar( "sc_blur", "4" ); + self addOptions(); + + if ( self.SubMenu == "Main" ) + { + if ( isDefined( self.Curs[self.SubMenu][variable] ) && isDefined( self.MenuText ) && isDefined( self.MenuText[self.Curs[self.SubMenu][variable]] ) ) + { + self.MenuText[self.Curs[self.SubMenu][variable]].fontscale = 2.0; + //self.MenuText[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255); + color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 ); + + if ( int( time * 4 ) % 2 ) + color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 ); + + self.MenuText[self.Curs[self.SubMenu][variable]].color = color; + } + + if ( isDefined( self.MenuText ) ) + { + for ( i = 0; i < self.Option["Name"][self.SubMenu].size; i++ ) + { + 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]] ) ) + { + self.MenuTextY[self.Curs[self.SubMenu][variable]].fontscale = 2.0; + //self.MenuTextY[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255); + color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 ); + + if ( int( time * 4 ) % 2 ) + color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 ); + + self.MenuTextY[self.Curs[self.SubMenu][variable]].color = color; + } + + if ( isDefined( self.MenuTextY ) ) + { + for ( i = 0; i < self.Option["Name"][self.SubMenu].size; i++ ) + { + 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 ) +{ + self.Option["Name"][menu][num] = text; + self.Option["Function"][menu][num] = function; + self.Option["Arg1"][menu][num] = arg1; + self.Option["Arg2"][menu][num] = arg2; +} + +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] ) ) + self.MenuTextY[i] destroy(); + + self.SubMenu = self.Menu["Back"][self.Submenu]; + + if ( self.SubMenu == "Main" ) + self CursMove( "X" ); + else + self CursMove( "Y" ); +} + +ExitMenu() +{ + if ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) + self.MenuText[i] destroy(); + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) + { + if ( isDefined( self.Menu["X"]["Shader"] ) ) + self.Menu["X"]["Shader"] destroy(); + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) + self.Menu["X"]["Scroller"] destroy(); + } + + if ( isDefined( self.menuVersionHud ) ) + self.menuVersionHud destroy(); + + self.MenuOpen = false; + self notify( "exit" ); + + self setClientDvar( "r_blur", "0" ); + self setClientDvar( "sc_blur", "2" ); +} + +initHudElem( txt, xl, yl ) +{ + hud = NewClientHudElem( self ); + hud setText( txt ); + hud.alignX = "center"; + hud.alignY = "bottom"; + hud.horzAlign = "center"; + hud.vertAlign = "bottom"; + hud.x = xl; + hud.y = yl; + hud.foreground = true; + hud.fontScale = 1.4; + hud.font = "objective"; + hud.alpha = 1; + hud.glow = 0; + 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 ) +{ + barElemBG = newClientHudElem( self ); + barElemBG.elemType = "bar_"; + barElemBG.width = width; + barElemBG.height = height; + barElemBG.align = align; + barElemBG.relative = relative; + barElemBG.xOffset = 0; + barElemBG.yOffset = 0; + barElemBG.children = []; + barElemBG.sort = sort; + barElemBG.color = color; + barElemBG.alpha = alpha; + barElemBG setParent( level.uiParent ); + barElemBG setShader( shader, width, height ); + barElemBG.hidden = false; + barElemBG setPoint( align, relative, x, y ); + return barElemBG; +} + +AddOptions() +{ + self AddMenu( "Main", 0, "Manage bots", ::OpenSub, "man_bots", "" ); + self AddBack( "man_bots", "Main" ); + + _temp = ""; + _tempDvar = getDvarInt( "bots_manage_add" ); + self AddMenu( "man_bots", 0, "Add 1 bot", ::man_bots, "add", 1 + _tempDvar ); + 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 ) + { + case 0: + _temp = "everyone"; + break; + + case 1: + _temp = "just bots"; + break; + + case 2: + _temp = "everyone, adjust to map"; + break; + + case 3: + _temp = "just bots, adjust to map"; + break; + + case 4: + _temp = "bots used as team balance"; + break; + + default: + _temp = "out of range"; + break; + } + + self AddMenu( "man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar ); + + _tempDvar = getDvarInt( "bots_manage_fill" ); + self AddMenu( "man_bots", 9, "Increase bots to keep in-game: " + _tempDvar, ::man_bots, "fillup", _tempDvar ); + self AddMenu( "man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_manage_fill_spec" ); + + if ( _tempDvar ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar ); + + // + + self AddMenu( "Main", 1, "Teams and difficulty", ::OpenSub, "man_team", "" ); + self AddBack( "man_team", "Main" ); + + _tempDvar = getdvar( "bots_team" ); + self AddMenu( "man_team", 0, "Change bot team: " + _tempDvar, ::bot_teams, "team", _tempDvar ); + + _tempDvar = getDvarInt( "bots_team_amount" ); + self AddMenu( "man_team", 1, "Increase bots to be on axis team: " + _tempDvar, ::bot_teams, "teamup", _tempDvar ); + self AddMenu( "man_team", 2, "Decrease bots to be on axis team: " + _tempDvar, ::bot_teams, "teamdown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_team_force" ); + + if ( _tempDvar ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar ); + + _tempDvar = getDvarInt( "bots_team_mode" ); + + if ( _tempDvar ) + _temp = "only bots"; + else + _temp = "everyone"; + + self AddMenu( "man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar ); + + _tempDvar = getdvarint( "bots_skill" ); + + switch ( _tempDvar ) + { + case 0: + _temp = "random for all"; + break; + + case 1: + _temp = "too easy"; + break; + + case 2: + _temp = "easy"; + break; + + case 3: + _temp = "easy-medium"; + break; + + case 4: + _temp = "medium"; + break; + + case 5: + _temp = "hard"; + break; + + case 6: + _temp = "very hard"; + break; + + case 7: + _temp = "hardest"; + break; + + case 8: + _temp = "custom"; + break; + + case 9: + _temp = "complete random"; + break; + + default: + _temp = "out of range"; + break; + } + + self AddMenu( "man_team", 5, "Change bot difficulty: " + _temp, ::bot_teams, "skill", _tempDvar ); + + _tempDvar = getDvarInt( "bots_skill_axis_hard" ); + self AddMenu( "man_team", 6, "Increase amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axishardup", _tempDvar ); + self AddMenu( "man_team", 7, "Decrease amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axisharddown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_skill_axis_med" ); + self AddMenu( "man_team", 8, "Increase amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismedup", _tempDvar ); + self AddMenu( "man_team", 9, "Decrease amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismeddown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_skill_allies_hard" ); + self AddMenu( "man_team", 10, "Increase amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "allieshardup", _tempDvar ); + self AddMenu( "man_team", 11, "Decrease amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "alliesharddown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_skill_allies_med" ); + self AddMenu( "man_team", 12, "Increase amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmedup", _tempDvar ); + self AddMenu( "man_team", 13, "Decrease amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmeddown", _tempDvar ); + + // + + self AddMenu( "Main", 2, "Bot settings", ::OpenSub, "set1", "" ); + self AddBack( "set1", "Main" ); + + _tempDvar = getDvarInt( "bots_loadout_reasonable" ); + + if ( _tempDvar ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "set1", 0, "Bots use only good class setups: " + _temp, ::bot_func, "reasonable", _tempDvar ); + + _tempDvar = getDvarInt( "bots_loadout_allow_op" ); + + if ( _tempDvar ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "set1", 1, "Bots can use op and annoying class setups: " + _temp, ::bot_func, "op", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_move" ); + + if ( _tempDvar ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_knife" ); + + if ( _tempDvar ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_fire" ); + + if ( _tempDvar ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_nade" ); + + if ( _tempDvar ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_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 ) + _temp = "true"; + else + _temp = "false"; + + 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 ) + _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 ) + _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 ) + _temp = "true"; + else + _temp = "false"; + + self AddMenu( "set1", 11, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar ); +} + +bot_func( a, b ) +{ + switch ( a ) + { + case "reasonable": + setDvar( "bots_loadout_reasonable", !b ); + self iPrintln( "Bots using reasonable setups: " + !b ); + break; + + case "op": + setDvar( "bots_loadout_allow_op", !b ); + self iPrintln( "Bots using op setups: " + !b ); + break; + + case "move": + setDvar( "bots_play_move", !b ); + self iPrintln( "Bots move: " + !b ); + break; + + case "knife": + setDvar( "bots_play_knife", !b ); + self iPrintln( "Bots knife: " + !b ); + break; + + case "fire": + setDvar( "bots_play_fire", !b ); + self iPrintln( "Bots fire: " + !b ); + break; + + case "nade": + setDvar( "bots_play_nade", !b ); + self iPrintln( "Bots nade: " + !b ); + break; + + case "obj": + setDvar( "bots_play_obj", !b ); + self iPrintln( "Bots play the obj: " + !b ); + break; + + case "camp": + setDvar( "bots_play_camp", !b ); + self iPrintln( "Bots camp: " + !b ); + break; + + case "jump": + setDvar( "bots_play_jumpdrop", !b ); + self iPrintln( "Bots jump: " + !b ); + break; + + case "targetother": + setDvar( "bots_play_target_other", !b ); + self iPrintln( "Bots target other: " + !b ); + break; + + case "killstreak": + setDvar( "bots_play_killstreak", !b ); + self iPrintln( "Bots use killstreaks: " + !b ); + break; + + case "ads": + setDvar( "bots_play_ads", !b ); + self iPrintln( "Bots ads: " + !b ); + break; + } +} + +bot_teams( a, b ) +{ + switch ( a ) + { + case "team": + switch ( b ) + { + case "autoassign": + setdvar( "bots_team", "allies" ); + self iPrintlnBold( "Changed bot team to allies." ); + break; + + case "allies": + setdvar( "bots_team", "axis" ); + self iPrintlnBold( "Changed bot team to axis." ); + break; + + case "axis": + setdvar( "bots_team", "custom" ); + self iPrintlnBold( "Changed bot team to custom." ); + break; + + default: + setdvar( "bots_team", "autoassign" ); + self iPrintlnBold( "Changed bot team to autoassign." ); + break; + } + + break; + + case "teamup": + setdvar( "bots_team_amount", b + 1 ); + self iPrintln( ( b + 1 ) + " bot(s) will try to be on axis team." ); + break; + + case "teamdown": + setdvar( "bots_team_amount", b - 1 ); + self iPrintln( ( b - 1 ) + " bot(s) will try to be on axis team." ); + break; + + case "teamforce": + setDvar( "bots_team_force", !b ); + self iPrintln( "Forcing bots to team: " + !b ); + break; + + case "teammode": + setDvar( "bots_team_mode", !b ); + self iPrintln( "Only count bots on team: " + !b ); + break; + + case "skill": + switch ( b ) + { + case 0: + self iPrintlnBold( "Changed bot skill to easy." ); + setDvar( "bots_skill", 1 ); + break; + + case 1: + self iPrintlnBold( "Changed bot skill to easy-med." ); + setDvar( "bots_skill", 2 ); + break; + + case 2: + self iPrintlnBold( "Changed bot skill to medium." ); + setDvar( "bots_skill", 3 ); + break; + + case 3: + self iPrintlnBold( "Changed bot skill to med-hard." ); + setDvar( "bots_skill", 4 ); + break; + + case 4: + self iPrintlnBold( "Changed bot skill to hard." ); + setDvar( "bots_skill", 5 ); + break; + + case 5: + self iPrintlnBold( "Changed bot skill to very hard." ); + setDvar( "bots_skill", 6 ); + break; + + case 6: + self iPrintlnBold( "Changed bot skill to hardest." ); + setDvar( "bots_skill", 7 ); + break; + + case 7: + self iPrintlnBold( "Changed bot skill to custom. Base is easy." ); + setDvar( "bots_skill", 8 ); + break; + + case 8: + self iPrintlnBold( "Changed bot skill to complete random. Takes effect at restart." ); + setDvar( "bots_skill", 9 ); + break; + + default: + self iPrintlnBold( "Changed bot skill to random. Takes effect at restart." ); + setDvar( "bots_skill", 0 ); + break; + } + + break; + + case "axishardup": + setdvar( "bots_skill_axis_hard", ( b + 1 ) ); + self iPrintln( ( ( b + 1 ) ) + " hard bots will be on axis team." ); + break; + + case "axisharddown": + setdvar( "bots_skill_axis_hard", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " hard bots will be on axis team." ); + break; + + case "axismedup": + setdvar( "bots_skill_axis_med", ( b + 1 ) ); + self iPrintln( ( ( b + 1 ) ) + " med bots will be on axis team." ); + break; + + case "axismeddown": + setdvar( "bots_skill_axis_med", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " med bots will be on axis team." ); + break; + + case "allieshardup": + setdvar( "bots_skill_allies_hard", ( b + 1 ) ); + self iPrintln( ( ( b + 1 ) ) + " hard bots will be on allies team." ); + break; + + case "alliesharddown": + setdvar( "bots_skill_allies_hard", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " hard bots will be on allies team." ); + break; + + case "alliesmedup": + setdvar( "bots_skill_allies_med", ( b + 1 ) ); + self iPrintln( ( ( b + 1 ) ) + " med bots will be on allies team." ); + break; + + case "alliesmeddown": + setdvar( "bots_skill_allies_med", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " med bots will be on allies team." ); + break; + } +} + +man_bots( a, b ) +{ + switch ( a ) + { + case "add": + setdvar( "bots_manage_add", b ); + + if ( b == 1 ) + { + self iPrintln( "Adding " + b + " bot." ); + } + else + { + self iPrintln( "Adding " + b + " bots." ); + } + + break; + + case "kick": + result = false; + + for ( i = 0; i < b; i++ ) + { + tempBot = random( getBotArray() ); + + if ( isDefined( tempBot ) ) + { + tempBot RemoveTestClient(); + result = true; + } + + wait 0.25; + } + + if ( !result ) + self iPrintln( "No bots to kick" ); + + break; + + case "autokick": + setDvar( "bots_manage_fill_kick", !b ); + self iPrintln( "Kicking bots when bots_fill is exceeded: " + !b ); + break; + + case "fillmode": + switch ( b ) + { + case 0: + setdvar( "bots_manage_fill_mode", 1 ); + self iPrintln( "bot_fill will now count only bots." ); + break; + + case 1: + setdvar( "bots_manage_fill_mode", 2 ); + self iPrintln( "bot_fill will now count everyone, adjusting to map." ); + break; + + case 2: + setdvar( "bots_manage_fill_mode", 3 ); + self iPrintln( "bot_fill will now count only bots, adjusting to map." ); + break; + + case 3: + setdvar( "bots_manage_fill_mode", 4 ); + self iPrintln( "bot_fill will now use bots as team balance." ); + break; + + default: + setdvar( "bots_manage_fill_mode", 0 ); + self iPrintln( "bot_fill will now count everyone." ); + break; + } + + break; + + case "fillup": + setdvar( "bots_manage_fill", b + 1 ); + self iPrintln( "Increased to maintain " + ( b + 1 ) + " bot(s)." ); + break; + + case "filldown": + setdvar( "bots_manage_fill", b - 1 ); + self iPrintln( "Decreased to maintain " + ( b - 1 ) + " bot(s)." ); + break; + + case "fillspec": + setDvar( "bots_manage_fill_spec", !b ); + self iPrintln( "Count players on spectator for bots_fill: " + !b ); + break; + } +} diff --git a/main_shared/maps/mp/bots/_wp_editor.gsc b/main_shared/maps/mp/bots/_wp_editor.gsc index 82b1ff9..65be3b2 100644 --- a/main_shared/maps/mp/bots/_wp_editor.gsc +++ b/main_shared/maps/mp/bots/_wp_editor.gsc @@ -1,598 +1,615 @@ -/* - _wp_editor - Author: INeedGames - Date: 09/26/2020 - The ingame waypoint editor. Designed to be ran on the client (not the server) -*/ - -#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); - - 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("m1garand_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"); - - for(;;) - { - wait 0.05; - - 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)); - - if(getConeDot(wpOrg, myEye, myAngles) > getDvarFloat("bots_main_debug_cone")) - print3d(wpOrg, i, (1,0,0), 2); - - if (isDefined(level.waypoints[i].angles) && level.waypoints[i].type != "stand") - line(wpOrg, wpOrg + AnglesToForward(level.waypoints[i].angles) * 64, (1,1,1)); - } - } - - 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); - - print3d(level.waypoints[closest].origin + (0, 0, 15), level.waypoints[closest].type, (0,1,0), 2); - } - } -} - -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"; - - PrintLn("********* Start Bot Warfare WPDump *********"); - PrintLn(level.waypointCount); - - fileWrite(filename, level.waypointCount+"\n", "write"); - for(i = 0; i < level.waypointCount; i++) - { - str = ""; - wp = level.waypoints[i]; - - str += wp.origin[0] + " " + wp.origin[1] + " " + wp.origin[2] + ","; - - for(h = 0; h < wp.children.size; h++) - { - str += wp.children[h]; - - if (h < wp.children.size - 1) - str += " "; - } - str += "," + wp.type + ","; - - if (isDefined(wp.angles)) - str += wp.angles[0] + " " + wp.angles[1] + " " + wp.angles[2] + ","; - else - str += ","; - - str += ","; - - PrintLn(str); - fileWrite(filename, str+"\n", "append"); - } - PrintLn("\n\n\n\n\n\n"); - - self iprintln("Saved!!! to " + filename); - } - 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. Designed to be ran on the client (not the server) +*/ + +#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 ); + + 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( "m1garand_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" ); + + for ( ;; ) + { + wait 0.05; + + 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 ) ); + + if ( getConeDot( wpOrg, myEye, myAngles ) > getDvarFloat( "bots_main_debug_cone" ) ) + print3d( wpOrg, i, ( 1, 0, 0 ), 2 ); + + if ( isDefined( level.waypoints[i].angles ) && level.waypoints[i].type != "stand" ) + line( wpOrg, wpOrg + AnglesToForward( level.waypoints[i].angles ) * 64, ( 1, 1, 1 ) ); + } + } + + 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 ); + + print3d( level.waypoints[closest].origin + ( 0, 0, 15 ), level.waypoints[closest].type, ( 0, 1, 0 ), 2 ); + } + } +} + +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"; + + PrintLn( "********* Start Bot Warfare WPDump *********" ); + PrintLn( level.waypointCount ); + + fileWrite( filename, level.waypointCount + "\n", "write" ); + + for ( i = 0; i < level.waypointCount; i++ ) + { + str = ""; + wp = level.waypoints[i]; + + str += wp.origin[0] + " " + wp.origin[1] + " " + wp.origin[2] + ","; + + for ( h = 0; h < wp.children.size; h++ ) + { + str += wp.children[h]; + + if ( h < wp.children.size - 1 ) + str += " "; + } + + str += "," + wp.type + ","; + + if ( isDefined( wp.angles ) ) + str += wp.angles[0] + " " + wp.angles[1] + " " + wp.angles[2] + ","; + else + str += ","; + + str += ","; + + PrintLn( str ); + fileWrite( filename, str + "\n", "append" ); + } + + PrintLn( "\n\n\n\n\n\n" ); + + self iprintln( "Saved!!! to " + filename ); + } + 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; + } +}