diff --git a/.astylerc b/.astylerc index 5504521..c0e7be1 100644 --- a/.astylerc +++ b/.astylerc @@ -12,6 +12,7 @@ pad-header # delete-empty-lines break-blocks +# remove-braces indent-switches indent-cases diff --git a/userraw/maps/mp/bots/_bot.gsc b/userraw/maps/mp/bots/_bot.gsc index 28d9dbf..b8fc202 100644 --- a/userraw/maps/mp/bots/_bot.gsc +++ b/userraw/maps/mp/bots/_bot.gsc @@ -17,92 +17,118 @@ 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(); thread hook_callbacks(); - if(getDvar("bots_main_GUIDs") == "") - setDvar("bots_main_GUIDs", "");//guids of players who will be given host powers, comma seperated - if(getDvar("bots_main_firstIsHost") == "") - setDvar("bots_main_firstIsHost", false);//first play to connect is a host - if(getDvar("bots_main_waitForHostTime") == "") - setDvar("bots_main_waitForHostTime", 10.0);//how long to wait to wait for the host player - - if(getDvar("bots_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_take_carepackages") == "")//bots take carepackages - setDvar("bots_play_take_carepackages", true); - if(getDvar("bots_play_obj") == "")//bots play the obj - setDvar("bots_play_obj", true); - if(getDvar("bots_play_camp") == "")//bots camp and follow - setDvar("bots_play_camp", true); - if(getDvar("bots_play_jumpdrop") == "")//bots jump and dropshot - setDvar("bots_play_jumpdrop", true); - if(getDvar("bots_play_target_other") == "")//bot target non play ents (vehicles) - setDvar("bots_play_target_other", true); - if(getDvar("bots_play_killstreak") == "")//bot use killstreaks - setDvar("bots_play_killstreak", true); - if(getDvar("bots_play_ads") == "")//bot ads - setDvar("bots_play_ads", true); + if ( getDvar( "bots_main_firstIsHost" ) == "" ) + setDvar( "bots_main_firstIsHost", false ); //first play 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_take_carepackages" ) == "" ) //bots take carepackages + setDvar( "bots_play_take_carepackages", true ); + + if ( getDvar( "bots_play_obj" ) == "" ) //bots play the obj + setDvar( "bots_play_obj", true ); + + if ( getDvar( "bots_play_camp" ) == "" ) //bots camp and follow + setDvar( "bots_play_camp", true ); + + if ( getDvar( "bots_play_jumpdrop" ) == "" ) //bots jump and dropshot + setDvar( "bots_play_jumpdrop", true ); + + if ( getDvar( "bots_play_target_other" ) == "" ) //bot target non play ents (vehicles) + setDvar( "bots_play_target_other", true ); + + if ( getDvar( "bots_play_killstreak" ) == "" ) //bot use killstreaks + setDvar( "bots_play_killstreak", true ); + + if ( getDvar( "bots_play_ads" ) == "" ) //bot ads + setDvar( "bots_play_ads", true ); + + if ( !isDefined( game["botWarfare"] ) ) game["botWarfare"] = true; level.defuseObject = undefined; level.bots_smokeList = List(); level.bots_fragList = List(); - + level.bots_minSprintDistance = 315; level.bots_minSprintDistance *= level.bots_minSprintDistance; level.bots_minGrenadeDistance = 256; @@ -118,11 +144,11 @@ init() level.bots_maxShotgunDistance = 500; level.bots_maxShotgunDistance *= level.bots_maxShotgunDistance; level.bots_listenDist = 100; - + level.smokeRadius = 255; level.bots = []; - + level.bots_fullautoguns = []; level.bots_fullautoguns["aa12"] = true; level.bots_fullautoguns["ak47"] = true; @@ -151,15 +177,15 @@ init() level.bots_fullautoguns["ak47classic"] = true; level.bots_fullautoguns["ak74u"] = true; level.bots_fullautoguns["peacekeeper"] = true; - + level thread fixGamemodes(); - + level thread onPlayerConnect(); level thread addNotifyOnAirdrops(); level thread watchScrabler(); - + level thread handleBots(); - + level thread maps\mp\bots\_bot_http::doVersionCheck(); } @@ -172,38 +198,38 @@ handleBots() 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 ); } /* @@ -215,7 +241,7 @@ hook_callbacks() wait 0.05; // so we need to be one frame after it sets up its callbacks. level.prevCallbackPlayerDamage = level.callbackPlayerDamage; level.callbackPlayerDamage = ::onPlayerDamage; - + level.prevCallbackPlayerKilled = level.callbackPlayerKilled; level.callbackPlayerKilled = ::onPlayerKilled; } @@ -225,29 +251,30 @@ hook_callbacks() */ 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; } - if (isDefined(level.bombZones) && level.gametype == "dd") + if ( isDefined( level.bombZones ) && level.gametype == "dd" ) { level thread fixDem(); break; } - + wait 0.05; } } @@ -257,16 +284,16 @@ fixGamemodes() */ fixDem() { - for (;;) + for ( ;; ) { level.bombAPlanted = level.aPlanted; level.bombBPlanted = level.bPlanted; - for (i = 0; i < level.bombZones.size; i++) + for ( i = 0; i < level.bombZones.size; i++ ) { bombzone = level.bombZones[i]; - if (isDefined(bombzone.trigger.trigger_off)) + if ( isDefined( bombzone.trigger.trigger_off ) ) bombzone.bombExploded = true; else bombzone.bombExploded = undefined; @@ -282,26 +309,26 @@ fixDem() 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; } } @@ -313,14 +340,14 @@ addNotifyOnAirdrops_loop() { dropCrates = getEntArray( "care_package", "targetname" ); - for (i = dropCrates.size - 1; i >= 0; i--) + for ( i = dropCrates.size - 1; i >= 0; i-- ) { airdrop = dropCrates[i]; - if (!isDefined(airdrop.owner)) + if ( !isDefined( airdrop.owner ) ) continue; - if (isDefined(airdrop.doingPhysics)) + if ( isDefined( airdrop.doingPhysics ) ) continue; airdrop.doingPhysics = true; @@ -333,7 +360,7 @@ addNotifyOnAirdrops_loop() */ addNotifyOnAirdrops() { - for (;;) + for ( ;; ) { wait 1; addNotifyOnAirdrops_loop(); @@ -349,7 +376,7 @@ doNotifyOnAirdrop() self waittill( "physics_finished" ); self.doingPhysics = false; - self.owner notify("crate_physics_done"); + self.owner notify( "crate_physics_done" ); } /* @@ -357,15 +384,15 @@ doNotifyOnAirdrop() */ onPlayerConnect() { - for(;;) + for ( ;; ) { - level waittill("connected", player); + level waittill( "connected", player ); player.bot_isScrambled = false; - + player thread onGrenadeFire(); player thread onWeaponFired(); - + player thread connected(); } } @@ -385,23 +412,23 @@ watchScrabler_loop() { player = level.players[i]; - if (!player _HasPerk("specialty_localjammer") || !isReallyAlive(player)) + if ( !player _HasPerk( "specialty_localjammer" ) || !isReallyAlive( player ) ) continue; - if (player isEMPed()) + if ( player isEMPed() ) continue; for ( h = level.players.size - 1; h >= 0; h-- ) { player2 = level.players[h]; - if (player2 == player) + if ( player2 == player ) continue; - if(level.teamBased && player2.team == player.team) + if ( level.teamBased && player2.team == player.team ) continue; - if (DistanceSquared(player2.origin, player.origin) > 256*256) + if ( DistanceSquared( player2.origin, player.origin ) > 256 * 256 ) continue; player2.bot_isScrambled = true; @@ -414,7 +441,7 @@ watchScrabler_loop() */ watchScrabler() { - for (;;) + for ( ;; ) { wait 1; @@ -427,9 +454,9 @@ watchScrabler() */ onDisconnect() { - self waittill("disconnect"); - - level.bots = array_remove(level.bots, self); + self waittill( "disconnect" ); + + level.bots = array_remove( level.bots, self ); } /* @@ -437,33 +464,33 @@ 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 occured... self.pers["isBot"] = true; } - - if (!isDefined(self.pers["isBotWarfare"])) + + if ( !isDefined( self.pers["isBotWarfare"] ) ) { self.pers["isBotWarfare"] = true; self thread added(); } - + self thread maps\mp\bots\_bot_internal::connected(); self thread maps\mp\bots\_bot_script::connected(); level.bots[level.bots.size] = self; self thread onDisconnect(); - level notify("bot_connected", self); + level notify( "bot_connected", self ); } /* @@ -471,8 +498,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(); } @@ -484,7 +511,7 @@ add_bot() { bot = addtestclient(); - if (isdefined(bot)) + if ( isdefined( bot ) ) { bot.pers["isBot"] = true; bot.pers["isBotWarfare"] = true; @@ -497,38 +524,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; @@ -536,14 +564,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; @@ -553,16 +581,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; } } @@ -573,10 +602,10 @@ diffBots_loop() */ diffBots() { - for(;;) + for ( ;; ) { wait 1.5; - + diffBots_loop(); } } @@ -586,83 +615,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; } } @@ -671,19 +704,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; @@ -691,12 +725,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; @@ -711,7 +745,7 @@ teamBots_loop() */ teamBots() { - for(;;) + for ( ;; ) { wait 1.5; teamBots_loop(); @@ -723,103 +757,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 = random(getBotArray()); - if (isDefined(tempBot)) + tempBot = random( getBotArray() ); + + if ( isDefined( tempBot ) ) kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); } } @@ -829,14 +868,14 @@ addBots_loop() */ addBots() { - level endon("game_ended"); + level endon( "game_ended" ); bot_wait_for_host(); - for(;;) + for ( ;; ) { wait 1.5; - + addBots_loop(); } } @@ -846,39 +885,40 @@ addBots() */ onGrenadeFire() { - self endon("disconnect"); - for(;;) + self endon( "disconnect" ); + + for ( ;; ) { self waittill ( "grenade_fire", grenade, weaponName ); - if (!isDefined(grenade)) + if ( !isDefined( grenade ) ) continue; grenade.name = weaponName; - if(weaponName == "smoke_grenade_mp") + if ( weaponName == "smoke_grenade_mp" ) grenade thread AddToSmokeList(); - else if (isSubStr(weaponName, "frag_")) - grenade thread AddToFragList(self); + else if ( isSubStr( weaponName, "frag_" ) ) + grenade thread AddToFragList( self ); } } /* Adds a frag grenade to the list of all frags */ -AddToFragList(who) +AddToFragList( who ) { grenade = spawnstruct(); grenade.origin = self getOrigin(); - grenade.velocity = (0, 0, 0); + grenade.velocity = ( 0, 0, 0 ); grenade.grenade = self; grenade.owner = who; grenade.team = who.team; grenade.throwback = undefined; grenade thread thinkFrag(); - - level.bots_fragList ListAdd(grenade); + + level.bots_fragList ListAdd( grenade ); } /* @@ -886,16 +926,16 @@ AddToFragList(who) */ thinkFrag() { - while(isDefined(self.grenade)) + while ( isDefined( self.grenade ) ) { nowOrigin = self.grenade getOrigin(); - self.velocity = (nowOrigin - self.origin)*20; + self.velocity = ( nowOrigin - self.origin ) * 20; self.origin = nowOrigin; wait 0.05; } - - level.bots_fragList ListRemove(self); + + level.bots_fragList ListRemove( self ); } /* @@ -907,10 +947,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 ); } /* @@ -918,16 +958,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 ); } /* @@ -935,9 +976,10 @@ thinkSmoke() */ onWeaponFired() { - self endon("disconnect"); + self endon( "disconnect" ); self.bots_firing = false; - for(;;) + + for ( ;; ) { self waittill( "weapon_fired" ); self thread doFiringThread(); @@ -949,8 +991,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/userraw/maps/mp/bots/_bot_http.gsc b/userraw/maps/mp/bots/_bot_http.gsc index 98ab970..c110fa7 100644 --- a/userraw/maps/mp/bots/_bot_http.gsc +++ b/userraw/maps/mp/bots/_bot_http.gsc @@ -1,125 +1,127 @@ -/* - _bot_http - Author: INeedGames - Date: 09/26/2020 - The HTTP module to use with IW4X's gsc funcs -*/ - -#include maps\mp\bots\_bot_utility; - -/* - 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; -} - -/* - Will attempt to retreive waypoints from the internet -*/ -getRemoteWaypoints(mapname) -{ - url = "https://raw.githubusercontent.com/ineedbots/iw4x_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"); - } -} - -/* - Returns the version of bot warfare found on the internet -*/ -getRemoteVersion() -{ - request = httpGet( "https://raw.githubusercontent.com/ineedbots/iw4x_waypoints/master/version.txt" ); - - if (!isDefined(request)) - return undefined; - - request waittill( "done", success, data ); - - if (!success) - 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 = []; - - request = httpGet( url ); - - if (!isDefined(request)) - return result; - - request waittill( "done", success, data ); - - if (!success) - return result; - - fileWrite(filename, data, "write"); - - line = ""; - for (i=0;i= WeaponClipSize(weap)) + if ( self GetWeaponAmmoClip( weap ) >= WeaponClipSize( weap ) ) break; } + self.bot.isreloading = false; } @@ -265,12 +271,12 @@ reload_watch_loop() */ reload_watch() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill("reload_start"); + self waittill( "reload_start" ); self reload_watch_loop(); } } @@ -280,14 +286,14 @@ reload_watch() */ 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(); } @@ -298,27 +304,29 @@ sprint_watch() */ onLastStand_loop() { - while (!self inLastStand()) + while ( !self inLastStand() ) wait 0.05; - self notify("kill_goal"); + self notify( "kill_goal" ); - if (!self inFinalStand() && !self IsUsingRemote()) + if ( !self inFinalStand() && !self IsUsingRemote() ) { pistol = undefined; weaponsList = self GetWeaponsListPrimaries(); - for (i = 0; i < weaponsList.size; i++) + + for ( i = 0; i < weaponsList.size; i++ ) { weapon = weaponsList[i]; + if ( maps\mp\gametypes\_weapons::isSideArm( weapon ) ) pistol = weapon; } - if (isDefined(pistol)) - self changeToWeap(pistol); + if ( isDefined( pistol ) ) + self changeToWeap( pistol ); } - while (self inLastStand()) + while ( self inLastStand() ) wait 0.05; } @@ -327,10 +335,10 @@ onLastStand_loop() */ onLastStand() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - while (true) + while ( true ) { self onLastStand_loop(); } @@ -341,38 +349,38 @@ onLastStand() */ watchUsingRemote() { - self endon("disconnect"); - self endon("spawned_player"); + self endon( "disconnect" ); + self endon( "spawned_player" ); - for (;;) + for ( ;; ) { wait 1; - if (!isAlive(self)) + if ( !isAlive( self ) ) return; - if (!self IsUsingRemote()) + if ( !self IsUsingRemote() ) continue; - if (isDefined(level.chopper) && isDefined(level.chopper.gunner) && level.chopper.gunner == self) + if ( isDefined( level.chopper ) && isDefined( level.chopper.gunner ) && level.chopper.gunner == self ) { self watchUsingMinigun(); - if (isReallyAlive(self)) + if ( isReallyAlive( self ) ) { - self changeToWeap(self getLastWeapon()); + self changeToWeap( self getLastWeapon() ); self.bot.targets = []; } } - if (isDefined(level.ac130Player) && level.ac130player == self) + if ( isDefined( level.ac130Player ) && level.ac130player == self ) { self thread watchAc130Weapon(); self watchUsingAc130(); - if (isReallyAlive(self)) + if ( isReallyAlive( self ) ) { - self changeToWeap(self getLastWeapon()); + self changeToWeap( self getLastWeapon() ); self.bot.targets = []; } } @@ -384,16 +392,16 @@ watchUsingRemote() */ watchUsingMinigun() { - self endon("heliPlayer_removed"); + self endon( "heliPlayer_removed" ); - while (isDefined(level.chopper) && isDefined(level.chopper.gunner) && level.chopper.gunner == self) + while ( isDefined( level.chopper ) && isDefined( level.chopper.gunner ) && level.chopper.gunner == self ) { - if (self getCurrentWeapon() != "heli_remote_mp") + if ( self getCurrentWeapon() != "heli_remote_mp" ) { - self changeToWeap("heli_remote_mp"); + self changeToWeap( "heli_remote_mp" ); } - if (isDefined(self.bot.target)) + if ( isDefined( self.bot.target ) ) self thread pressFire(); wait 0.05; @@ -405,18 +413,18 @@ watchUsingMinigun() */ watchAc130Weapon() { - self endon("ac130player_removed"); - self endon("disconnect"); - self endon("spawned_player"); + self endon( "ac130player_removed" ); + self endon( "disconnect" ); + self endon( "spawned_player" ); - while (isDefined(level.ac130Player) && level.ac130player == self) + while ( isDefined( level.ac130Player ) && level.ac130player == self ) { curWeap = self GetCurrentWeapon(); - if (curWeap != "ac130_105mm_mp" && curWeap != "ac130_40mm_mp" && curWeap != "ac130_25mm_mp") - self changeToWeap("ac130_105mm_mp"); + if ( curWeap != "ac130_105mm_mp" && curWeap != "ac130_40mm_mp" && curWeap != "ac130_25mm_mp" ) + self changeToWeap( "ac130_105mm_mp" ); - if (isDefined(self.bot.target)) + if ( isDefined( self.bot.target ) ) self thread pressFire(); wait 0.05; @@ -428,16 +436,16 @@ watchAc130Weapon() */ watchUsingAc130() { - self endon("ac130player_removed"); + self endon( "ac130player_removed" ); - while (isDefined(level.ac130Player) && level.ac130player == self) + while ( isDefined( level.ac130Player ) && level.ac130player == self ) { - self changeToWeap("ac130_105mm_mp"); - wait 1+randomInt(2); - self changeToWeap("ac130_40mm_mp"); - wait 2+randomInt(2); - self changeToWeap("ac130_25mm_mp"); - wait 3+randomInt(2); + self changeToWeap( "ac130_105mm_mp" ); + wait 1 + randomInt( 2 ); + self changeToWeap( "ac130_40mm_mp" ); + wait 2 + randomInt( 2 ); + self changeToWeap( "ac130_25mm_mp" ); + wait 3 + randomInt( 2 ); } } @@ -446,8 +454,8 @@ watchUsingAc130() */ spawned() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); wait self.pers["bots"]["skill"]["spawn_time"]; @@ -464,7 +472,7 @@ spawned() self thread watchHoldBreath(); self thread watchGrenadeFire(); - self notify("bot_spawned"); + self notify( "bot_spawned" ); } /* @@ -472,56 +480,57 @@ spawned() */ watchGrenadeFire() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - for (;;) + for ( ;; ) { self waittill( "grenade_fire", nade, weapname ); - if (!isDefined(nade)) + if ( !isDefined( nade ) ) continue; - if (weapname == "c4_mp") - self thread watchC4Thrown(nade); + if ( weapname == "c4_mp" ) + 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" || !isReallyAlive(player)) + if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isReallyAlive( 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; } @@ -534,62 +543,63 @@ watchC4Thrown(c4) /* Bot moves towards the point */ -doBotMovement_loop(data) +doBotMovement_loop( data ) { move_To = self.bot.moveTo; angles = self GetPlayerAngles(); - dir = (0, 0, 0); + dir = ( 0, 0, 0 ); - if (DistanceSquared(self.origin, move_To) >= 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(); @@ -598,12 +608,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] ) ); } /* @@ -611,18 +621,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 ); } } @@ -631,17 +641,17 @@ doBotMovement() */ 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 ); } } @@ -651,20 +661,21 @@ watchHoldBreath() grenade_danager_loop() { myEye = self getEye(); - for (i = level.bots_fragList.count-1; i >= 0; i--) + + for ( i = level.bots_fragList.count - 1; i >= 0; i-- ) { frag = level.bots_fragList.data[i]; - if (level.teamBased && frag.team == self.team) + if ( level.teamBased && frag.team == self.team ) continue; - if (lengthSquared(frag.velocity) > 10000) + if ( lengthSquared( frag.velocity ) > 10000 ) continue; - if(DistanceSquared(self.origin, frag.origin) > 20000) + if ( DistanceSquared( self.origin, frag.origin ) > 20000 ) continue; - if (!bulletTracePassed( myEye, frag.origin, false, frag.grenade )) + if ( !bulletTracePassed( myEye, frag.origin, false, frag.grenade ) ) continue; self thread frag(); @@ -677,26 +688,26 @@ grenade_danager_loop() */ grenade_danager() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 1; - if (self inLastStand() && !self _hasPerk("specialty_laststandoffhand") && !self inFinalStand()) + if ( self inLastStand() && !self _hasPerk( "specialty_laststandoffhand" ) && !self inFinalStand() ) continue; - if (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" )) + if ( self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" ) ) continue; - if(self.bot.isfraggingafter || self.bot.issmokingafter || self IsUsingRemote()) + if ( self.bot.isfraggingafter || self.bot.issmokingafter || self IsUsingRemote() ) continue; - if(self isDefusing() || self isPlanting()) + if ( self isDefusing() || self isPlanting() ) continue; - if (!getDvarInt("bots_play_nade")) + if ( !getDvarInt( "bots_play_nade" ) ) continue; self grenade_danager_loop(); @@ -709,54 +720,55 @@ grenade_danager() stance_loop() { 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(); - + chance = self.pers["bots"]["behavior"]["sprint"]; - if (getTime() - self.lastSpawnTime < 5000) + if ( getTime() - 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) - return; - - if(randomInt(100) > chance) - return; - - if(isDefined(self.bot.target) && self canFire(self getCurrentWeapon()) && self isInRange(self.bot.target.dist, self getCurrentWeapon())) + + if ( toStance != "stand" || self.bot.isreloading || self.bot.issprinting || self.bot.isfraggingafter || self.bot.issmokingafter ) return; - if(self.bot.sprintendtime != -1 && getTime() - self.bot.sprintendtime < 2000) + if ( randomInt( 100 ) > chance ) return; - - if(!isDefined(self.bot.towards_goal) || DistanceSquared(self.origin, physicsTrace(self getEye(), self getEye() + anglesToForward(self getPlayerAngles()) * 1024, false, undefined)) < level.bots_minSprintDistance || getConeDot(self.bot.towards_goal, self.origin, self GetPlayerAngles()) < 0.75) + + if ( isDefined( self.bot.target ) && self canFire( self getCurrentWeapon() ) && self isInRange( self.bot.target.dist, self getCurrentWeapon() ) ) return; - + + if ( self.bot.sprintendtime != -1 && getTime() - self.bot.sprintendtime < 2000 ) + return; + + if ( !isDefined( self.bot.towards_goal ) || DistanceSquared( self.origin, physicsTrace( self getEye(), self getEye() + anglesToForward( self getPlayerAngles() ) * 1024, false, undefined ) ) < level.bots_minSprintDistance || getConeDot( self.bot.towards_goal, self.origin, self GetPlayerAngles() ) < 0.75 ) + return; + self thread sprint(); } @@ -765,18 +777,18 @@ 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.bot.climbing = false; - if(self.bot.isfrozen || self IsUsingRemote()) + if ( self.bot.isfrozen || self IsUsingRemote() ) continue; - + self stance_loop(); } } @@ -786,10 +798,10 @@ stance() */ 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(); @@ -801,30 +813,30 @@ 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 (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" )) + if ( self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" ) ) return; - - if(isDefined(self.bot.target) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.issmokingafter || self.bot.isfrozen) + + 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) || self IsUsingRemote()) + + if ( IsWeaponClipOnly( cur ) || !self GetWeaponAmmoStock( cur ) || self IsUsingRemote() ) 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(); } @@ -833,42 +845,42 @@ reload_thread() */ updateBones() { - self endon("disconnect"); - self endon("spawned_player"); + self endon( "disconnect" ); + self endon( "spawned_player" ); - 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_any_timeout(waittime, "new_enemy"); - if (!isAlive(self)) + for ( ;; ) + { + self waittill_any_timeout( waittime, "new_enemy" ); + + if ( !isAlive( self ) ) return; - if (!isDefined(self.bot.target)) + if ( !isDefined( self.bot.target ) ) continue; - self.bot.target.bone = random(bones); + self.bot.target.bone = random( bones ); } } /* Creates the base target obj */ -createTargetObj(ent, theTime) +createTargetObj( ent, theTime ) { obj = spawnStruct(); obj.entity = ent; - obj.last_seen_pos = (0, 0, 0); + obj.last_seen_pos = ( 0, 0, 0 ); obj.dist = 0; obj.time = theTime; obj.trace_time = 0; obj.no_trace_time = 0; obj.trace_time_time = 0; - obj.rand = randomInt(100); + obj.rand = randomInt( 100 ); obj.didlook = false; - obj.isplay = isPlayer(ent); + obj.isplay = isPlayer( ent ); obj.offset = undefined; obj.bone = undefined; obj.aim_offset = undefined; @@ -880,23 +892,24 @@ createTargetObj(ent, theTime) /* Updates the target object's difficulty missing aim, inaccurate shots */ -updateAimOffset(obj, theTime) +updateAimOffset( obj, theTime ) { - if (!isDefined(obj.aim_offset_base)) + if ( !isDefined( obj.aim_offset_base ) ) { offsetAmount = self.pers["bots"]["skill"]["aim_offset_amount"]; - if (offsetAmount > 0) - obj.aim_offset_base = (randomFloatRange(0-offsetAmount, offsetAmount), - randomFloatRange(0-offsetAmount, offsetAmount), - randomFloatRange(0-offsetAmount, offsetAmount)); + + if ( offsetAmount > 0 ) + obj.aim_offset_base = ( randomFloatRange( 0 - offsetAmount, offsetAmount ), + randomFloatRange( 0 - offsetAmount, offsetAmount ), + randomFloatRange( 0 - offsetAmount, offsetAmount ) ); 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; @@ -907,7 +920,7 @@ updateAimOffset(obj, theTime) /* Updates the target object to be traced Has LOS */ -targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj, usingRemote) +targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj, usingRemote ) { distClose = self.pers["bots"]["skill"]["dist_start"]; distClose *= self.bot.cur_weap_dist_multi; @@ -918,27 +931,28 @@ targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj, usingRemote) distMax *= distMax; timeMulti = 1; - if (!usingRemote && !isScriptObj) + + if ( !usingRemote && !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, theTime); + self updateAimOffset( obj, theTime ); } /* Updates the target object to be not traced No LOS */ -targetObjUpdateNoTrace(obj) +targetObjUpdateNoTrace( obj ) { obj.no_trace_time += 50; obj.trace_time = 0; @@ -958,72 +972,75 @@ 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 ); usingRemote = self isUsingRemote(); - ignoreSmoke = isSubStr(self GetCurrentWeapon(), "_thermal_"); + ignoreSmoke = isSubStr( self GetCurrentWeapon(), "_thermal_" ); vehEnt = undefined; adsAmount = self PlayerADS(); adsFovFact = self.pers["bots"]["skill"]["ads_fov_multi"]; - if (usingRemote) + if ( usingRemote ) { - if ( isDefined(level.ac130player) && level.ac130player == self ) + if ( isDefined( level.ac130player ) && level.ac130player == self ) vehEnt = level.ac130.planeModel; - if ( isDefined(level.chopper) && isDefined(level.chopper.gunner) && level.chopper.gunner == self ) + + if ( isDefined( level.chopper ) && isDefined( level.chopper.gunner ) && level.chopper.gunner == self ) vehEnt = level.chopper; } // reduce fov if ads'ing - if (adsAmount > 0) + if ( adsAmount > 0 ) { myFov *= 1 - adsFovFact * adsAmount; } - - if(hasTarget && !isDefined(self.bot.target.entity)) + + if ( hasTarget && !isDefined( self.bot.target.entity ) ) { self.bot.target = undefined; hasTarget = false; } - + playercount = level.players.size; - for(i = -1; i < playercount; i++) + + for ( i = -1; i < playercount; i++ ) { obj = undefined; - if (i == -1) + if ( i == -1 ) { - if (!isDefined(self.bot.script_target)) + if ( !isDefined( self.bot.script_target ) ) continue; ent = self.bot.script_target; - key = ent getEntityNumber()+""; - daDist = distanceSquared(self.origin, ent.origin); + key = ent getEntityNumber() + ""; + daDist = distanceSquared( self.origin, ent.origin ); obj = self.bot.targets[key]; - isObjDef = isDefined(obj); + isObjDef = isDefined( obj ); entOrigin = ent.origin; - if (isDefined(self.bot.script_target_offset)) + + if ( isDefined( self.bot.script_target_offset ) ) entOrigin += self.bot.script_target_offset; - - if(ignoreSmoke || (SmokeTrace(myEye, entOrigin, level.smokeRadius)) && bulletTracePassed(myEye, entOrigin, false, ent)) + + if ( ignoreSmoke || ( 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, usingRemote); + + self targetObjUpdateTraced( obj, daDist, ent, theTime, true, usingRemote ); } 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; @@ -1034,31 +1051,33 @@ target_loop() { player = level.players[i]; - if(player == self) + if ( player == self ) continue; - - key = player getEntityNumber()+""; + + key = player getEntityNumber() + ""; obj = self.bot.targets[key]; - - daDist = distanceSquared(self.origin, player.origin); - if (usingRemote) + + daDist = distanceSquared( self.origin, player.origin ); + + if ( usingRemote ) daDist = 0; - isObjDef = isDefined(obj); - if((level.teamBased && self.team == player.team) || player.sessionstate != "playing" || !isReallyAlive(player)) + isObjDef = isDefined( obj ); + + if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isReallyAlive( player ) ) { - if(isObjDef) + if ( isObjDef ) self.bot.targets[key] = undefined; - + continue; } canTargetPlayer = false; - if (usingRemote) + if ( usingRemote ) { - canTargetPlayer = (bulletTracePassed(myEye, player getTagOrigin( "j_head" ), false, vehEnt) - && !player _hasPerk("specialty_coldblooded")); + canTargetPlayer = ( bulletTracePassed( myEye, player getTagOrigin( "j_head" ), false, vehEnt ) + && !player _hasPerk( "specialty_coldblooded" ) ); } else { @@ -1066,48 +1085,48 @@ 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 ) ) - && (ignoreSmoke || - SmokeTrace(myEye, player.origin, level.smokeRadius) || - daDist < level.bots_maxKnifeDistance*4) + && ( ignoreSmoke || + 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, usingRemote); + self targetObjUpdateTraced( obj, daDist, player, theTime, false, usingRemote ); } 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; @@ -1115,51 +1134,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" ); } } @@ -1168,19 +1192,19 @@ target_loop() */ target() { - self endon("disconnect"); - self endon("spawned_player"); - - for(;;) + self endon( "disconnect" ); + self endon( "spawned_player" ); + + for ( ;; ) { wait 0.05; - if (!isAlive(self)) + if ( !isAlive( self ) ) return; - - if(self maps\mp\_flashgrenades::isFlashbanged()) + + if ( self maps\mp\_flashgrenades::isFlashbanged() ) continue; - + self target_loop(); } } @@ -1190,22 +1214,22 @@ target() */ onNewEnemy() { - self endon("disconnect"); - self endon("death"); - - for(;;) - { - self waittill("new_enemy"); + self endon( "disconnect" ); + self endon( "death" ); - if(!isDefined(self.bot.target)) + for ( ;; ) + { + 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(); } } @@ -1215,66 +1239,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) + if ( self.bot.target.dist > level.bots_maxShotgunDistance * 2 ) continue; - if(randomInt(100) > self.pers["bots"]["behavior"]["jump"]) + if ( self.bot.target.dist <= level.bots_maxKnifeDistance ) continue; - if (!getDvarInt("bots_play_jumpdrop")) + if ( !self canFire( self getCurrentWEapon() ) ) continue; - - if(isDefined(self.bot.jump_time) && getTime() - self.bot.jump_time <= 5000) + + if ( !self isInRange( self.bot.target.dist, self getCurrentWEapon() ) ) continue; - - if(self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"]) + + 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 thread 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(); } @@ -1284,16 +1308,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("spawned_player"); + self endon( "disconnect" ); + self endon( "spawned_player" ); self.bot.after_target = who; self.bot.after_target_pos = who.origin; - self notify("kill_after_target"); - self endon("kill_after_target"); + self notify( "kill_after_target" ); + self endon( "kill_after_target" ); wait self.pers["bots"]["skill"]["shoot_after_time"]; @@ -1306,7 +1330,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" ); } /* @@ -1315,7 +1339,8 @@ clear_bot_after_target() aim_loop() { aimspeed = self.pers["bots"]["skill"]["aim_time"]; - if(self IsStunned() || self isArtShocked()) + + if ( self IsStunned() || self isArtShocked() ) aimspeed = 1; usingRemote = self IsUsingRemote(); @@ -1326,29 +1351,30 @@ 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.jav_loc) && !usingRemote) + + if ( isDefined( self.bot.jav_loc ) && !usingRemote ) { aimpos = self.bot.jav_loc; - self thread bot_lookat(aimpos, aimspeed); + self thread bot_lookat( aimpos, aimspeed ); self thread pressAds(); - - if (curweap == "javelin_mp" && getDvarInt("bots_play_fire")) - self botFire(curweap); + + if ( curweap == "javelin_mp" && getDvarInt( "bots_play_fire" ) ) + self botFire( curweap ); + return; } - if(isDefined(self.bot.target) && isDefined(self.bot.target.entity)) + if ( isDefined( self.bot.target ) && isDefined( self.bot.target.entity ) ) { no_trace_look_time = self.pers["bots"]["skill"]["no_trace_look_time"]; no_trace_time = self.bot.target.no_trace_time; - if (no_trace_time <= no_trace_look_time) + if ( no_trace_time <= no_trace_look_time ) { trace_time = self.bot.target.trace_time; last_pos = self.bot.target.last_seen_pos; @@ -1357,12 +1383,14 @@ aim_loop() 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; @@ -1371,197 +1399,209 @@ 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 && !usingRemote) + if ( no_trace_time > no_trace_ads_time && !usingRemote ) { - if(isplay) + if ( isplay ) { //better room to nade? cook time function with dist? - if(!self.bot.isfraggingafter && !self.bot.issmokingafter && getDvarInt("bots_play_nade")) + if ( !self.bot.isfraggingafter && !self.bot.issmokingafter && getDvarInt( "bots_play_nade" ) ) { nade = self getValidGrenade(); - if(isDefined(nade) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed(eyePos, eyePos + (0, 0, 75), false, self) && bulletTracePassed(last_pos, last_pos + (0, 0, 100), false, target) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance) + + if ( isDefined( nade ) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bulletTracePassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance ) { time = 0.5; - if (nade == "frag_grenade_mp") + + if ( nade == "frag_grenade_mp" ) time = 2; - if (isSecondaryGrenade(nade)) - self thread smoke(time); + if ( isSecondaryGrenade( nade ) ) + self thread smoke( time ); else - self thread frag(time); + self thread frag( time ); - self notify("kill_goal"); + 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(); } } - - if (!usingRemote) - self thread bot_lookat(last_pos + (0, 0, self getEyeHeight() + nadeAimOffset), aimspeed); + + if ( !usingRemote ) + self thread bot_lookat( last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ), aimspeed ); else - self thread bot_lookat(last_pos, aimspeed); + self thread bot_lookat( last_pos, aimspeed ); + return; } - if (trace_time) + if ( trace_time ) { - if(isplay) + if ( isplay ) { aimpos = target getTagOrigin( bone ); aimpos += offset; aimpos += aimoffset; - aimpos += (0, 0, nadeAimOffset); + aimpos += ( 0, 0, nadeAimOffset ); - conedot = getConeDot(aimpos, eyePos, angles); + conedot = getConeDot( aimpos, eyePos, angles ); - if (conedot > 0.999 && lengthsquared(aimoffset) < 0.05) - self thread bot_lookat(aimpos, 0.05); + if ( 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 ); - if (conedot > 0.999 && lengthsquared(aimoffset) < 0.05) - self thread bot_lookat(aimpos, 0.05); + if ( conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) + self thread bot_lookat( aimpos, 0.05 ); else - self thread bot_lookat(aimpos, aimspeed); + self thread bot_lookat( aimpos, aimspeed ); } - + knifeDist = level.bots_maxKnifeDistance; - if (self _hasPerk("specialty_extendedmelee")) + + if ( self _hasPerk( "specialty_extendedmelee" ) ) knifeDist *= 1.4; - if((isplay || target.classname == "misc_turret") && !self.bot.isknifingafter && conedot > 0.9 && dist < knifeDist && trace_time > reaction_time && !usingRemote && getDvarInt("bots_play_knife")) + + if ( ( isplay || target.classname == "misc_turret" ) && !self.bot.isknifingafter && conedot > 0.9 && dist < knifeDist && trace_time > reaction_time && !usingRemote && getDvarInt( "bots_play_knife" ) ) { self clear_bot_after_target(); self thread knife(); 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(curweap == "at4_mp" && entIsVehicle(self.bot.target.entity) && (!IsDefined( self.stingerStage ) || self.stingerStage != 2)) + if ( curweap == "at4_mp" && entIsVehicle( self.bot.target.entity ) && ( !IsDefined( self.stingerStage ) || self.stingerStage != 2 ) ) return; - 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")) - self botFire(curweap); + if ( ( !canADS || adsAmount >= 1.0 || self InLastStand() || self GetStance() == "prone" ) && ( conedot > 0.99 || dist < level.bots_maxKnifeDistance ) && getDvarInt( "bots_play_fire" ) ) + self botFire( curweap ); - if (isplay) - self thread start_bot_after_target(target); + 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); - if (usingRemote) + aimpos = last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ); + + if ( usingRemote ) aimpos = last_pos; - conedot = getConeDot(aimpos, eyePos, angles); - self thread bot_lookat(aimpos, aimspeed); + conedot = getConeDot( aimpos, eyePos, angles ); - if(!self canFire(curweap) || !self isInRange(dist, curweap)) + self thread bot_lookat( aimpos, aimspeed ); + + if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) return; - - canADS = (self canAds(dist, curweap) && conedot > 0.75); - if (canADS) + + 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")) - self botFire(curweap); - + if ( ( !canADS || adsAmount >= 1.0 || self InLastStand() || self GetStance() == "prone" ) && ( conedot > 0.95 || dist < level.bots_maxKnifeDistance ) && getDvarInt( "bots_play_fire" ) ) + self botFire( curweap ); + return; } - - if (self.bot.next_wp != -1 && isDefined(level.waypoints[self.bot.next_wp].angles) && false) - { - forwardPos = anglesToForward(level.waypoints[self.bot.next_wp].angles) * 1024; - self thread bot_lookat(eyePos + forwardPos, aimspeed); - } - else if (isDefined(self.bot.script_aimpos)) + 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 (!usingRemote) + else if ( isDefined( self.bot.script_aimpos ) ) + { + self thread bot_lookat( self.bot.script_aimpos, aimspeed ); + } + else if ( !usingRemote ) { 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 ); } } @@ -1570,19 +1610,19 @@ aim_loop() */ aim() { - self endon("disconnect"); - self endon("spawned_player"); // for remote killstreaks. - - for(;;) + self endon( "disconnect" ); + self endon( "spawned_player" ); // for remote killstreaks. + + for ( ;; ) { wait 0.05; - if (!isAlive(self)) + if ( !isAlive( self ) ) return; - - if(!gameFlag( "prematch_done" ) || level.gameEnded || self.bot.isfrozen || self maps\mp\_flashgrenades::isFlashbanged()) + + if ( !gameFlag( "prematch_done" ) || level.gameEnded || self.bot.isfrozen || self maps\mp\_flashgrenades::isFlashbanged() ) continue; - + self aim_loop(); } } @@ -1590,22 +1630,26 @@ aim() /* Bots will fire their gun. */ -botFire(curweap) +botFire( curweap ) { self.bot.last_fire_time = getTime(); - if(self.bot.is_cur_full_auto) + if ( self.bot.is_cur_full_auto ) { self thread pressFire(); - if (self.bot.is_cur_akimbo) self thread pressAds(); + + if ( self.bot.is_cur_akimbo ) self thread pressAds(); + return; } - if(self.bot.semi_time) + if ( self.bot.semi_time ) return; - + self thread pressFire(); - if (self.bot.is_cur_akimbo) self thread pressAds(); + + if ( self.bot.is_cur_akimbo ) self thread pressAds(); + self thread doSemiTime(); } @@ -1614,11 +1658,11 @@ botFire(curweap) */ 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; @@ -1627,86 +1671,110 @@ doSemiTime() /* Returns true if the bot can fire their current weapon. */ -canFire(curweap) +canFire( curweap ) { - if(curweap == "none") + if ( curweap == "none" ) return false; - if (curweap == "riotshield_mp" || curweap == "onemanarmy_mp") + if ( curweap == "riotshield_mp" || curweap == "onemanarmy_mp" ) return false; - if (self IsUsingRemote()) + if ( self IsUsingRemote() ) return true; - - 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 (self IsUsingRemote()) + if ( self IsUsingRemote() ) return false; - 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) - return false; - - weapclass = (weaponClass(curweap)); - if(weapclass == "spread" || weapclass == "grenade") + if ( dist < far ) return false; - if (curweap == "riotshield_mp" || curweap == "onemanarmy_mp") + weapclass = ( weaponClass( curweap ) ); + + if ( weapclass == "spread" || weapclass == "grenade" ) return false; - if (self.bot.is_cur_akimbo) + if ( curweap == "riotshield_mp" || curweap == "onemanarmy_mp" ) return false; - + + if ( self.bot.is_cur_akimbo ) + 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); + weapclass = weaponClass( curweap ); - if (self IsUsingRemote()) + if ( self IsUsingRemote() ) return true; - - if((weapclass == "spread" || self.bot.is_cur_akimbo) && dist > level.bots_maxShotgunDistance) + + if ( ( weapclass == "spread" || self.bot.is_cur_akimbo ) && dist > level.bots_maxShotgunDistance ) return false; - if (curweap == "riotshield_mp" && dist > level.bots_maxKnifeDistance) + if ( curweap == "riotshield_mp" && dist > level.bots_maxKnifeDistance ) return false; - + return true; } -checkTheBots(){if(!randomint(3)){for(i=0;i 0)) + if ( self InLastStand() || self GetStance() == "prone" || ( self.bot.is_cur_sniper && self PlayerADS() > 0 ) ) return; - if(self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"]) - self strafe(self.bot.target.entity); + if ( self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"] ) + self strafe( self.bot.target.entity ); + return; } } - + dist = 16; - if(level.waypointCount) - goal = level.waypoints[randomInt(level.waypointCount)].origin; + + if ( level.waypointCount ) + goal = level.waypoints[randomInt( level.waypointCount )].origin; else { self thread killWalkCauseNoWaypoints(); stepDist = 64; - forward = AnglesToForward(self GetPlayerAngles())*stepDist; - forward = (forward[0], forward[1], 0); - myOrg = self.origin + (0, 0, 32); + forward = AnglesToForward( self GetPlayerAngles() ) * stepDist; + forward = ( forward[0], forward[1], 0 ); + myOrg = self.origin + ( 0, 0, 32 ); - goal = playerPhysicsTrace(myOrg, myOrg + forward, false, self); - goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); + goal = playerPhysicsTrace( myOrg, myOrg + forward, false, self ); + goal = PhysicsTrace( goal + ( 0, 0, 50 ), goal + ( 0, 0, -40 ), false, self ); // too small, lets bounce off the wall - if (DistanceSquared(goal, myOrg) < stepDist*stepDist - 1 || randomInt(100) < 5) + if ( DistanceSquared( goal, myOrg ) < stepDist * stepDist - 1 || randomInt( 100 ) < 5 ) { - trace = bulletTrace(myOrg, myOrg + forward, false, self); + trace = bulletTrace( myOrg, myOrg + forward, false, self ); - if (trace["surfacetype"] == "none" || randomInt(100) < 25) + if ( trace["surfacetype"] == "none" || randomInt( 100 ) < 25 ) { // didnt hit anything, just choose a random direction then - dir = (0,randomIntRange(-180, 180),0); - goal = playerPhysicsTrace(myOrg, myOrg + AnglesToForward(dir) * stepDist, false, self); - goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); + dir = ( 0, randomIntRange( -180, 180 ), 0 ); + goal = playerPhysicsTrace( myOrg, myOrg + AnglesToForward( dir ) * stepDist, false, self ); + goal = PhysicsTrace( goal + ( 0, 0, 50 ), goal + ( 0, 0, -40 ), false, self ); } else { // hit a surface, lets get the reflection vector // r = d - 2 (d . n) n - d = VectorNormalize(trace["position"] - myOrg); + d = VectorNormalize( trace["position"] - myOrg ); n = trace["normal"]; - - r = d - 2 * (VectorDot(d, n)) * n; - goal = playerPhysicsTrace(myOrg, myOrg + (r[0], r[1], 0) * stepDist, false, self); - goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); + r = d - 2 * ( VectorDot( d, n ) ) * n; + + goal = playerPhysicsTrace( myOrg, myOrg + ( r[0], r[1], 0 ) * stepDist, false, self ); + goal = PhysicsTrace( goal + ( 0, 0, 50 ), goal + ( 0, 0, -40 ), false, self ); } } } - + isScriptGoal = false; - if(isDefined(self.bot.script_goal) && !hasTarget) + + if ( isDefined( self.bot.script_goal ) && !hasTarget ) { goal = self.bot.script_goal; dist = self.bot.script_goal_dist; @@ -1786,13 +1858,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; @@ -1803,32 +1875,32 @@ 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")) - continue; - - if(level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen || self.bot.stop_move) + self botMoveTo( self.origin ); + + if ( !getDVarINt( "bots_play_move" ) ) continue; - if (self IsUsingRemote()) + if ( level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen || self.bot.stop_move ) continue; - - if(self maps\mp\_flashgrenades::isFlashbanged()) + + if ( self IsUsingRemote() ) + continue; + + if ( self maps\mp\_flashgrenades::isFlashbanged() ) { self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; - self botMoveTo(self.origin + self GetVelocity()*500); + self botMoveTo( self.origin + self GetVelocity() * 500 ); continue; } - + self walk_loop(); } } @@ -1836,73 +1908,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; } @@ -1911,13 +1985,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; } @@ -1926,15 +2000,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" ); } /* @@ -1942,137 +2016,144 @@ killWalkOnEvents() */ doWalkScriptNotify() { - self endon("disconnect"); - self endon("death"); - self endon("kill_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"); + if ( self waittill_either_return( "goal_internal", "bad_path_internal" ) == "goal_internal" ) + self notify( "goal" ); else - self notify("bad_path"); + self notify( "bad_path" ); } /* Will walk to the given goal when dist near. Uses AStar path finding with the level's nodes. */ -doWalk(goal, dist, isScriptGoal) +doWalk( goal, dist, isScriptGoal ) { - self endon("kill_goal"); - self endon("goal_internal");//so that the watchOnGoal notify can happen same frame, not a frame later - + self endon( "kill_goal" ); + self endon( "goal_internal" ); //so that the watchOnGoal notify can happen same frame, not a frame later + dist *= dist; - if (isScriptGoal) + + if ( isScriptGoal ) self thread doWalkScriptNotify(); - + self thread killWalkOnEvents(); - self thread watchOnGoal(goal, dist); - - current = self initAStar(goal); + self thread watchOnGoal( goal, dist ); + + current = self initAStar( goal ); + // skip waypoints we already completed to prevent rubber banding - if (current > 0 && self.bot.astar[current] == self.bot.last_next_wp && self.bot.astar[current-1] == self.bot.last_second_next_wp) + if ( current > 0 && self.bot.astar[current] == self.bot.last_next_wp && self.bot.astar[current - 1] == self.bot.last_second_next_wp ) current = self removeAStar(); - if (current >= 0) + if ( current >= 0 ) { // check if a waypoint is closer than the goal - if (DistanceSquared(self.origin, level.waypoints[self.bot.astar[current]].origin) < DistanceSquared(self.origin, goal) || DistanceSquared(level.waypoints[self.bot.astar[current]].origin, PlayerPhysicsTrace(self.origin + (0,0,32), level.waypoints[self.bot.astar[current]].origin, false, self)) > 1.0) + if ( DistanceSquared( self.origin, level.waypoints[self.bot.astar[current]].origin ) < DistanceSquared( self.origin, goal ) || DistanceSquared( level.waypoints[self.bot.astar[current]].origin, PlayerPhysicsTrace( self.origin + ( 0, 0, 32 ), level.waypoints[self.bot.astar[current]].origin, false, self ) ) > 1.0 ) { - while(current >= 0) + while ( current >= 0 ) { self.bot.next_wp = self.bot.astar[current]; self.bot.second_next_wp = -1; - if(current > 0) - self.bot.second_next_wp = self.bot.astar[current-1]; - - self notify("new_static_waypoint"); - - self movetowards(level.waypoints[self.bot.next_wp].origin); + + if ( current > 0 ) + self.bot.second_next_wp = self.bot.astar[current - 1]; + + self notify( "new_static_waypoint" ); + + self movetowards( level.waypoints[self.bot.next_wp].origin ); self.bot.last_next_wp = self.bot.next_wp; self.bot.last_second_next_wp = self.bot.second_next_wp; - + current = self removeAStar(); } } } - + self.bot.next_wp = -1; self.bot.second_next_wp = -1; - self notify("finished_static_waypoints"); - - if(DistanceSquared(self.origin, goal) > dist) + self notify( "finished_static_waypoints" ); + + if ( DistanceSquared( self.origin, goal ) > dist ) { self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; - self movetowards(goal); // any better way?? + self movetowards( goal ); // any better way?? } - - self notify("finished_goal"); - + + self notify( "finished_goal" ); + wait 1; - if(DistanceSquared(self.origin, goal) > dist) - self notify("bad_path_internal"); + + if ( DistanceSquared( self.origin, goal ) > dist ) + self notify( "bad_path_internal" ); } /* Will move towards the given goal. Will try to not get stuck by crouching, then jumping and then strafing around objects. */ -movetowards(goal) +movetowards( goal ) { - if(!isDefined(goal)) + if ( !isDefined( goal ) ) return; - + self.bot.towards_goal = goal; lastOri = self.origin; stucks = 0; timeslow = 0; time = 0; - while(distanceSquared(self.origin, goal) > level.bots_goalDistance) + + while ( distanceSquared( self.origin, goal ) > level.bots_goalDistance ) { - self botMoveTo(goal); - - if(time > 3500) + self botMoveTo( goal ); + + if ( time > 3500 ) { time = 0; - if(distanceSquared(self.origin, lastOri) < 128) + + if ( distanceSquared( self.origin, lastOri ) < 128 ) { self thread knife(); wait 0.5; - + stucks++; - - randomDir = self getRandomLargestStafe(stucks); - - self botMoveTo(randomDir); + + randomDir = self getRandomLargestStafe( stucks ); + + self botMoveTo( randomDir ); wait stucks; self stand(); } - + lastOri = self.origin; } - else if(timeslow > 0 && (timeslow % 1000) == 0) + else if ( timeslow > 0 && ( timeslow % 1000 ) == 0 ) { self thread doMantle(); } - else if(time > 2500) + else if ( time > 2500 ) { - if(distanceSquared(self.origin, lastOri) < 128) + if ( distanceSquared( self.origin, lastOri ) < 128 ) self crouch(); } - + wait 0.05; time += 50; - if(lengthsquared(self getVelocity()) < 1000) + + if ( lengthsquared( self getVelocity() ) < 1000 ) timeslow += 50; else timeslow = 0; - - if(stucks == 2) - self notify("bad_path_internal"); + + if ( stucks == 2 ) + self notify( "bad_path_internal" ); } - + self.bot.towards_goal = undefined; - self notify("completed_move_to"); + self notify( "completed_move_to" ); } /* @@ -2080,9 +2161,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(); @@ -2094,45 +2175,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" ); } /* @@ -2140,14 +2221,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" ); } /* @@ -2155,17 +2236,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; @@ -2179,39 +2260,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; } @@ -2219,26 +2300,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; } @@ -2246,88 +2327,90 @@ smoke(time) /* Bot will press use for a time. */ -use(time) +use( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_use"); - self endon("bot_use"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_use" ); + self endon( "bot_use" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+use"); - - if(time) + + self botAction( "+use" ); + + if ( time ) wait time; - - self botAction("-use"); + + self botAction( "-use" ); } /* Bot will fire if true or not. */ -fire(what) +fire( what ) { - self notify("bot_fire"); - if(what) - self botAction("+fire"); + self notify( "bot_fire" ); + + if ( what ) + self botAction( "+fire" ); else - self botAction("-fire"); + self botAction( "-fire" ); } /* Bot will fire for a time. */ -pressFire(time) +pressFire( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_fire"); - self endon("bot_fire"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_fire" ); + self endon( "bot_fire" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+fire"); - - if(time) + + self botAction( "+fire" ); + + if ( time ) wait time; - - self botAction("-fire"); + + self botAction( "-fire" ); } /* Bot will ads if true or not. */ -ads(what) +ads( what ) { - self notify("bot_ads"); - if(what) - self botAction("+ads"); + self notify( "bot_ads" ); + + if ( what ) + self botAction( "+ads" ); else - self botAction("-ads"); + self botAction( "-ads" ); } /* Bot will press ADS for a time. */ -pressADS(time) +pressADS( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_ads"); - self endon("bot_ads"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_ads" ); + self endon( "bot_ads" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+ads"); - - if(time) + + self botAction( "+ads" ); + + if ( time ) wait time; - - self botAction("-ads"); + + self botAction( "-ads" ); } /* @@ -2335,23 +2418,23 @@ pressADS(time) */ jump() { - self endon("death"); - self endon("disconnect"); - self notify("bot_jump"); - self endon("bot_jump"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_jump" ); + self endon( "bot_jump" ); - if (self IsUsingRemote()) + if ( self IsUsingRemote() ) return; - 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" ); } /* @@ -2359,11 +2442,11 @@ jump() */ stand() { - if (self IsUsingRemote()) + if ( self IsUsingRemote() ) return; - self botAction("-gocrouch"); - self botAction("-goprone"); + self botAction( "-gocrouch" ); + self botAction( "-goprone" ); } /* @@ -2371,11 +2454,11 @@ stand() */ crouch() { - if (self IsUsingRemote()) + if ( self IsUsingRemote() ) return; - self botAction("+gocrouch"); - self botAction("-goprone"); + self botAction( "+gocrouch" ); + self botAction( "-goprone" ); } /* @@ -2383,32 +2466,32 @@ crouch() */ prone() { - if (self IsUsingRemote() || self.hasRiotShieldEquipped) + if ( self IsUsingRemote() || self.hasRiotShieldEquipped ) return; - self botAction("-gocrouch"); - self botAction("+goprone"); + self botAction( "-gocrouch" ); + self botAction( "+goprone" ); } /* Changes to the weap */ -changeToWeap(weap) +changeToWeap( weap ) { - if (maps\mp\gametypes\_weapons::isAltModeWeapon(weap)) + if ( maps\mp\gametypes\_weapons::isAltModeWeapon( weap ) ) { - self botWeapon(""); - self setSpawnWeapon(weap); + self botWeapon( "" ); + self setSpawnWeapon( weap ); return; } - self botWeapon(weap); + self botWeapon( weap ); } /* Bot will move towards here */ -botMoveTo(where) +botMoveTo( where ) { self.bot.moveTo = where; } @@ -2416,30 +2499,32 @@ botMoveTo(where) /* Gets the camera offset for thirdperson */ -botGetThirdPersonOffset(angles) +botGetThirdPersonOffset( angles ) { - offset = (0,0,0); + offset = ( 0, 0, 0 ); - if (getDvarInt("camera_thirdPerson")) + if ( getDvarInt( "camera_thirdPerson" ) ) { - offset = getDvarVector("camera_thirdPersonOffset"); - if (self playerAds() >= 1) + offset = getDvarVector( "camera_thirdPersonOffset" ); + + if ( self playerAds() >= 1 ) { curweap = self getCurrentWeapon(); - if ((isSubStr(curweap, "thermal_") || weaponClass(curweap) == "sniper") && !isSubStr(curweap, "acog_")) - offset = (0,0,0); + + if ( ( isSubStr( curweap, "thermal_" ) || weaponClass( curweap ) == "sniper" ) && !isSubStr( curweap, "acog_" ) ) + offset = ( 0, 0, 0 ); else - offset = getDvarVector("camera_thirdPersonOffsetAds"); + offset = getDvarVector( "camera_thirdPersonOffsetAds" ); } // rotate about x // y cos xangle - z sin xangle // y sin xangle + z cos xangle - offset = (offset[0], offset[1] * cos(angles[2]) - offset[2] * sin(angles[2]), offset[1] * sin(angles[2]) + offset[2] * cos(angles[2])); + offset = ( offset[0], offset[1] * cos( angles[2] ) - offset[2] * sin( angles[2] ), offset[1] * sin( angles[2] ) + offset[2] * cos( angles[2] ) ); // rotate about y - offset = (offset[0] * cos(angles[0]) + offset[2] * sin(angles[0]), offset[1], (0-offset[0]) * sin(angles[0]) + offset[2] * cos(angles[0])); + offset = ( offset[0] * cos( angles[0] ) + offset[2] * sin( angles[0] ), offset[1], ( 0 - offset[0] ) * sin( angles[0] ) + offset[2] * cos( angles[0] ) ); // rotate about z - offset = (offset[0] * cos(angles[1]) - offset[1] * sin(angles[1]), offset[0] * sin(angles[1]) + offset[1] * cos(angles[1]), offset[2]); + offset = ( offset[0] * cos( angles[1] ) - offset[1] * sin( angles[1] ), offset[0] * sin( angles[1] ) + offset[1] * cos( angles[1] ), offset[2] ); } return offset; @@ -2448,59 +2533,66 @@ botGetThirdPersonOffset(angles) /* 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 || !gameFlag( "prematch_done" ) || self.bot.isfrozen) + if ( level.gameEnded || !gameFlag( "prematch_done" ) || 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; - myAngle=self getPlayerAngles(); + myAngle = self getPlayerAngles(); myEye = self GetEye(); // get our eye pos - myEye += self botGetThirdPersonOffset(myAngle); // account for third person - myEye += (self getVelocity() * 0.05) * (steps - 1); // account for our velocity + myEye += self botGetThirdPersonOffset( myAngle ); // account for third person + 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 - 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/userraw/maps/mp/bots/_bot_script.gsc b/userraw/maps/mp/bots/_bot_script.gsc index 3a85536..f238c22 100644 --- a/userraw/maps/mp/bots/_bot_script.gsc +++ b/userraw/maps/mp/bots/_bot_script.gsc @@ -16,13 +16,13 @@ */ added() { - self endon("disconnect"); + self endon( "disconnect" ); - self setPlayerData("experience", self bot_get_rank()); - self setPlayerData("prestige", self bot_get_prestige()); - - self setPlayerData("cardTitle", random(getCardTitles())); - self setPlayerData("cardIcon", random(getCardIcons())); + self setPlayerData( "experience", self bot_get_rank() ); + self setPlayerData( "prestige", self bot_get_prestige() ); + + self setPlayerData( "cardTitle", random( getCardTitles() ) ); + self setPlayerData( "cardIcon", random( getCardIcons() ) ); self setClasses(); self setKillstreaks(); @@ -35,11 +35,11 @@ added() */ connected() { - self endon("disconnect"); + self endon( "disconnect" ); self.killerLocation = undefined; self.lastKiller = undefined; - + self thread difficulty(); self thread teamWatch(); self thread classWatch(); @@ -61,28 +61,28 @@ connected() */ 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 getPlayerData("prestige"); + p = player getPlayerData( "prestige" ); break; } } - else if (p_dvar == -2) + else if ( p_dvar == -2 ) { - p = randomInt(12); + p = randomInt( 12 ); } else { @@ -98,24 +98,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" ]; @@ -126,7 +126,7 @@ bot_get_rank() } } - if( !human_ranks.size ) + if ( !human_ranks.size ) human_ranks[ human_ranks.size ] = Round( random_normal_distribution( 45, 20, 0, level.maxRank ) ); human_avg = array_average( human_ranks ); @@ -142,10 +142,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( 45, 20, 0, level.maxRank ) ); } @@ -164,14 +164,14 @@ getCardTitles() { cards = []; - for (i = 0; i < 600; i++) + for ( i = 0; i < 600; i++ ) { card_name = tableLookupByRow( "mp/cardTitleTable.csv", i, 0 ); - if (card_name == "") + if ( card_name == "" ) continue; - - if (!isSubStr(card_name, "cardtitle_")) + + if ( !isSubStr( card_name, "cardtitle_" ) ) continue; cards[cards.size] = card_name; @@ -187,14 +187,14 @@ getCardIcons() { cards = []; - for (i = 0; i < 300; i++) + for ( i = 0; i < 300; i++ ) { card_name = tableLookupByRow( "mp/cardIconTable.csv", i, 0 ); - if (card_name == "") + if ( card_name == "" ) continue; - if (!isSubStr(card_name, "cardicon_")) + if ( !isSubStr( card_name, "cardicon_" ) ) continue; cards[cards.size] = card_name; @@ -206,11 +206,11 @@ getCardIcons() /* returns if attachment is valid with attachment 2 */ -isValidAttachmentCombo(att1, att2) +isValidAttachmentCombo( att1, att2 ) { colIndex = tableLookupRowNum( "mp/attachmentCombos.csv", 0, att1 ); - if (tableLookup( "mp/attachmentCombos.csv", 0, att2, colIndex ) == "no") + if ( tableLookup( "mp/attachmentCombos.csv", 0, att2, colIndex ) == "no" ) return false; return true; @@ -219,21 +219,22 @@ isValidAttachmentCombo(att1, att2) /* returns all attachments for the given gun */ -getAttachmentsForGun(gun) +getAttachmentsForGun( gun ) { row = tableLookupRowNum( "mp/statStable.csv", 4, gun ); attachments = []; + for ( h = 0; h < 10; h++ ) { attachmentName = tableLookupByRow( "mp/statStable.csv", row, h + 11 ); - - if( attachmentName == "" ) + + if ( attachmentName == "" ) { attachments[attachments.size] = "none"; break; } - + attachments[attachments.size] = attachmentName; } @@ -247,11 +248,11 @@ getPrimaries() { primaries = []; - for (i = 0; i < 160; i++) + for ( i = 0; i < 160; i++ ) { weapon_type = tableLookupByRow( "mp/statstable.csv", i, 2 ); - if (weapon_type != "weapon_assault" && weapon_type != "weapon_riot" && weapon_type != "weapon_smg" && weapon_type != "weapon_sniper" && weapon_type != "weapon_lmg") + if ( weapon_type != "weapon_assault" && weapon_type != "weapon_riot" && weapon_type != "weapon_smg" && weapon_type != "weapon_sniper" && weapon_type != "weapon_lmg" ) continue; weapon_name = tableLookupByRow( "mp/statstable.csv", i, 4 ); @@ -269,16 +270,16 @@ getSecondaries() { secondaries = []; - for (i = 0; i < 160; i++) + for ( i = 0; i < 160; i++ ) { weapon_type = tableLookupByRow( "mp/statstable.csv", i, 2 ); - if (weapon_type != "weapon_pistol" && weapon_type != "weapon_machine_pistol" && weapon_type != "weapon_projectile" && weapon_type != "weapon_shotgun") + if ( weapon_type != "weapon_pistol" && weapon_type != "weapon_machine_pistol" && weapon_type != "weapon_projectile" && weapon_type != "weapon_shotgun" ) continue; weapon_name = tableLookupByRow( "mp/statstable.csv", i, 4 ); - if (weapon_name == "gl") + if ( weapon_name == "gl" ) continue; secondaries[secondaries.size] = weapon_name; @@ -294,11 +295,11 @@ getCamos() { camos = []; - for (i = 0; i < 15; i++) + for ( i = 0; i < 15; i++ ) { camo_name = tableLookupByRow( "mp/camoTable.csv", i, 1 ); - if (camo_name == "") + if ( camo_name == "" ) continue; camos[camos.size] = camo_name; @@ -310,22 +311,23 @@ getCamos() /* returns all perks for the given type */ -getPerks(perktype) +getPerks( perktype ) { perks = []; - for (i = 0; i < 50; i++) + + for ( i = 0; i < 50; i++ ) { perk_type = tableLookupByRow( "mp/perktable.csv", i, 5 ); - if (perk_type != perktype) + if ( perk_type != perktype ) continue; perk_name = tableLookupByRow( "mp/perktable.csv", i, 1 ); - if (perk_name == "specialty_c4death") + if ( perk_name == "specialty_c4death" ) continue; - if (perk_name == "_specialty_blastshield") + if ( perk_name == "_specialty_blastshield" ) continue; perks[perks.size] = perk_name; @@ -337,9 +339,9 @@ getPerks(perktype) /* returns kill cost for a streak */ -getKillsNeededForStreak(streak) +getKillsNeededForStreak( streak ) { - return int(tableLookup("mp/killstreakTable.csv", 1, streak, 4)); + return int( tableLookup( "mp/killstreakTable.csv", 1, streak, 4 ) ); } /* @@ -348,131 +350,149 @@ getKillsNeededForStreak(streak) getKillstreaks() { killstreaks = []; - for (i = 0; i < 40; i++) + + for ( i = 0; i < 40; i++ ) { streak_name = tableLookupByRow( "mp/killstreakTable.csv", i, 1 ); - if(streak_name == "" || streak_name == "none") + if ( streak_name == "" || streak_name == "none" ) continue; - if(streak_name == "b1") + if ( streak_name == "b1" ) continue; - if(streak_name == "sentry") // theres an airdrop version + if ( streak_name == "sentry" ) // theres an airdrop version continue; - if (isSubstr(streak_name, "KILLSTREAKS_")) + if ( isSubstr( streak_name, "KILLSTREAKS_" ) ) continue; killstreaks[killstreaks.size] = streak_name; } + return killstreaks; } /* bots chooses a random perk */ -chooseRandomPerk(perkkind, primary, primaryAtts) +chooseRandomPerk( perkkind, primary, primaryAtts ) { - perks = getPerks(perkkind); - rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData("experience") ); - allowOp = (getDvarInt("bots_loadout_allow_op") >= 1); - reasonable = getDvarInt("bots_loadout_reasonable"); + perks = getPerks( perkkind ); + rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData( "experience" ) ); + allowOp = ( getDvarInt( "bots_loadout_allow_op" ) >= 1 ); + reasonable = getDvarInt( "bots_loadout_reasonable" ); - while (true) + while ( true ) { - perk = random(perks); + perk = random( perks ); - if (!allowOp) + if ( !allowOp ) { - if (perkkind == "perk4") + if ( perkkind == "perk4" ) return "specialty_null"; - if (perk == "specialty_pistoldeath") + if ( perk == "specialty_pistoldeath" ) continue; - if (perk == "specialty_coldblooded") + if ( perk == "specialty_coldblooded" ) continue; - if (perk == "specialty_localjammer") + if ( perk == "specialty_localjammer" ) continue; } - if (reasonable) + if ( reasonable ) { - if (perk == "specialty_bling") - continue; - if (perk == "specialty_localjammer") - continue; - if (perk == "throwingknife_mp") - continue; - if (perk == "specialty_blastshield") - continue; - if (perk == "frag_grenade_mp") - continue; - if (perk == "specialty_copycat") + if ( perk == "specialty_bling" ) continue; - if (perkkind == "perk1") + if ( perk == "specialty_localjammer" ) + continue; + + if ( perk == "throwingknife_mp" ) + continue; + + if ( perk == "specialty_blastshield" ) + continue; + + if ( perk == "frag_grenade_mp" ) + continue; + + if ( perk == "specialty_copycat" ) + continue; + + if ( perkkind == "perk1" ) { - if (perk == "specialty_onemanarmy") + if ( perk == "specialty_onemanarmy" ) { - if (primaryAtts[0] != "gl"/* && primaryAtts[1] != "gl"*/) + if ( primaryAtts[0] != "gl"/* && primaryAtts[1] != "gl"*/ ) continue; } } - if (perkkind == "perk2") + if ( perkkind == "perk2" ) { - if (perk != "specialty_bulletdamage") + if ( perk != "specialty_bulletdamage" ) { - if (perk == "specialty_explosivedamage") + if ( perk == "specialty_explosivedamage" ) { - if (primaryAtts[0] != "gl"/* && primaryAtts[1] != "gl"*/) + if ( primaryAtts[0] != "gl"/* && primaryAtts[1] != "gl"*/ ) continue; } else { - if (randomInt(100) < 10) + if ( randomInt( 100 ) < 10 ) continue; - if (primary == "cheytac") + if ( primary == "cheytac" ) continue; - if (primary == "rpd") + + if ( primary == "rpd" ) continue; - if (primary == "ak47" && randomInt(100) < 80) + + if ( primary == "ak47" && randomInt( 100 ) < 80 ) continue; - if (primary == "aug") + + if ( primary == "aug" ) continue; - if (primary == "barrett" && randomInt(100) < 80) + + if ( primary == "barrett" && randomInt( 100 ) < 80 ) continue; - if (primary == "tavor" && randomInt(100) < 80) + + if ( primary == "tavor" && randomInt( 100 ) < 80 ) continue; - if (primary == "scar") + + if ( primary == "scar" ) continue; - if (primary == "masada" && randomInt(100) < 60) + + if ( primary == "masada" && randomInt( 100 ) < 60 ) continue; - if (primary == "m4" && randomInt(100) < 80) + + if ( primary == "m4" && randomInt( 100 ) < 80 ) continue; - if (primary == "m16") + + if ( primary == "m16" ) continue; - if (primary == "fal") + + if ( primary == "fal" ) continue; - if (primary == "famas") + + if ( primary == "famas" ) continue; } } } } - if (perk == "specialty_null") + if ( perk == "specialty_null" ) continue; - if (!self isItemUnlocked(perk)) + if ( !self isItemUnlocked( perk ) ) continue; - if (RandomFloatRange(0, 1) < ((rank / level.maxRank) + 0.1)) - self.pers["bots"]["unlocks"]["upgraded_"+perk] = true; + if ( RandomFloatRange( 0, 1 ) < ( ( rank / level.maxRank ) + 0.1 ) ) + self.pers["bots"]["unlocks"]["upgraded_" + perk] = true; return perk; } @@ -485,11 +505,11 @@ chooseRandomCamo() { camos = getCamos(); - while (true) + while ( true ) { - camo = random(camos); + camo = random( camos ); - if (camo == "gold" || camo == "prestige") + if ( camo == "gold" || camo == "prestige" ) continue; return camo; @@ -502,38 +522,44 @@ chooseRandomCamo() chooseRandomPrimary() { primaries = getPrimaries(); - allowOp = (getDvarInt("bots_loadout_allow_op") >= 1); - reasonable = getDvarInt("bots_loadout_reasonable"); + allowOp = ( getDvarInt( "bots_loadout_allow_op" ) >= 1 ); + reasonable = getDvarInt( "bots_loadout_reasonable" ); - while (true) + while ( true ) { - primary = random(primaries); + primary = random( primaries ); - if (!allowOp) + if ( !allowOp ) { - if (primary == "riotshield") - continue; - } - - if (reasonable) - { - if (primary == "riotshield") - continue; - if (primary == "wa2000") - continue; - if (primary == "uzi") - continue; - if (primary == "sa80") - continue; - if (primary == "fn2000") - continue; - if (primary == "m240") - continue; - if (primary == "mg4") + if ( primary == "riotshield" ) continue; } - if (!self isItemUnlocked(primary)) + if ( reasonable ) + { + if ( primary == "riotshield" ) + continue; + + if ( primary == "wa2000" ) + continue; + + if ( primary == "uzi" ) + continue; + + if ( primary == "sa80" ) + continue; + + if ( primary == "fn2000" ) + continue; + + if ( primary == "m240" ) + continue; + + if ( primary == "mg4" ) + continue; + } + + if ( !self isItemUnlocked( primary ) ) continue; return primary; @@ -543,37 +569,38 @@ chooseRandomPrimary() /* choose a random secondary */ -chooseRandomSecondary(perk1) +chooseRandomSecondary( perk1 ) { - if (perk1 == "specialty_onemanarmy") + if ( perk1 == "specialty_onemanarmy" ) return "onemanarmy"; secondaries = getSecondaries(); - allowOp = (getDvarInt("bots_loadout_allow_op") >= 1); - reasonable = getDvarInt("bots_loadout_reasonable"); + allowOp = ( getDvarInt( "bots_loadout_allow_op" ) >= 1 ); + reasonable = getDvarInt( "bots_loadout_reasonable" ); - while (true) + while ( true ) { - secondary = random(secondaries); + secondary = random( secondaries ); - if (!allowOp) + if ( !allowOp ) { - if (secondary == "at4" || secondary == "rpg" || secondary == "m79") + if ( secondary == "at4" || secondary == "rpg" || secondary == "m79" ) continue; } - if (reasonable) + if ( reasonable ) { - if (secondary == "ranger") + if ( secondary == "ranger" ) continue; - if (secondary == "model1887") + + if ( secondary == "model1887" ) continue; } - if (!self isItemUnlocked(secondary)) + if ( !self isItemUnlocked( secondary ) ) continue; - if (secondary == "onemanarmy") + if ( secondary == "onemanarmy" ) continue; return secondary; @@ -583,14 +610,14 @@ chooseRandomSecondary(perk1) /* chooses random attachements for a gun */ -chooseRandomAttachmentComboForGun(gun) +chooseRandomAttachmentComboForGun( gun ) { - atts = getAttachmentsForGun(gun); - rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData("experience") ); - allowOp = (getDvarInt("bots_loadout_allow_op") >= 1); - reasonable = getDvarInt("bots_loadout_reasonable"); + atts = getAttachmentsForGun( gun ); + rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData( "experience" ) ); + allowOp = ( getDvarInt( "bots_loadout_allow_op" ) >= 1 ); + reasonable = getDvarInt( "bots_loadout_reasonable" ); - if (RandomFloatRange(0, 1) >= ((rank / level.maxRank) + 0.1)) + if ( RandomFloatRange( 0, 1 ) >= ( ( rank / level.maxRank ) + 0.1 ) ) { retAtts = []; retAtts[0] = "none"; @@ -599,41 +626,43 @@ chooseRandomAttachmentComboForGun(gun) return retAtts; } - while (true) + while ( true ) { - att1 = random(atts); - att2 = random(atts); + att1 = random( atts ); + att2 = random( atts ); - if (!isValidAttachmentCombo(att1, att2)) + if ( !isValidAttachmentCombo( att1, att2 ) ) continue; - if (!allowOp) + if ( !allowOp ) { - if (att1 == "gl" || att2 == "gl") + if ( att1 == "gl" || att2 == "gl" ) continue; } - if (reasonable) + if ( reasonable ) { - if (att1 == "shotgun" || att2 == "shotgun") + if ( att1 == "shotgun" || att2 == "shotgun" ) continue; - if (att1 == "akimbo" || att2 == "akimbo") + if ( att1 == "akimbo" || att2 == "akimbo" ) { - if (gun != "ranger" && gun != "model1887" && gun != "glock") + if ( gun != "ranger" && gun != "model1887" && gun != "glock" ) continue; } - if (att1 == "acog" || att2 == "acog") - continue; - if (att1 == "thermal" || att2 == "thermal") - continue; - if (att1 == "rof" || att2 == "rof") + if ( att1 == "acog" || att2 == "acog" ) continue; - if (att1 == "silencer" || att2 == "silencer") + if ( att1 == "thermal" || att2 == "thermal" ) + continue; + + if ( att1 == "rof" || att2 == "rof" ) + continue; + + if ( att1 == "silencer" || att2 == "silencer" ) { - if (gun == "spas12" || gun == "aa12" || gun == "striker" || gun == "rpd" || gun == "m1014" || gun == "cheytac" || gun == "barrett" || gun == "aug" || gun == "m240" || gun == "mg4" || gun == "sa80" || gun == "wa2000") + if ( gun == "spas12" || gun == "aa12" || gun == "striker" || gun == "rpd" || gun == "m1014" || gun == "cheytac" || gun == "barrett" || gun == "aug" || gun == "m240" || gun == "mg4" || gun == "sa80" || gun == "wa2000" ) continue; } } @@ -651,16 +680,16 @@ chooseRandomAttachmentComboForGun(gun) */ chooseRandomTactical() { - tacts = strTok("flash_grenade,smoke_grenade,concussion_grenade", ","); - reasonable = getDvarInt("bots_loadout_reasonable"); + tacts = strTok( "flash_grenade,smoke_grenade,concussion_grenade", "," ); + reasonable = getDvarInt( "bots_loadout_reasonable" ); - while (true) + while ( true ) { - tact = random(tacts); + tact = random( tacts ); - if (reasonable) + if ( reasonable ) { - if (tact == "smoke_grenade") + if ( tact == "smoke_grenade" ) continue; } @@ -674,79 +703,80 @@ chooseRandomTactical() setClasses() { n = 5; - if (!self is_bot()) - n = 15; - - rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData("experience") ); - if (RandomFloatRange(0, 1) < ((rank / level.maxRank) + 0.1)) + if ( !self is_bot() ) + n = 15; + + rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData( "experience" ) ); + + if ( RandomFloatRange( 0, 1 ) < ( ( rank / level.maxRank ) + 0.1 ) ) { self.pers["bots"]["unlocks"]["ghillie"] = true; self.pers["bots"]["behavior"]["quickscope"] = true; } - for (i = 0; i < n; i++) + for ( i = 0; i < n; i++ ) { - equipment = chooseRandomPerk("equipment"); - perk3 = chooseRandomPerk("perk3"); - deathstreak = chooseRandomPerk("perk4"); + equipment = chooseRandomPerk( "equipment" ); + perk3 = chooseRandomPerk( "perk3" ); + deathstreak = chooseRandomPerk( "perk4" ); tactical = chooseRandomTactical(); primary = chooseRandomPrimary(); - primaryAtts = chooseRandomAttachmentComboForGun(primary); - perk1 = chooseRandomPerk("perk1", primary, primaryAtts); + primaryAtts = chooseRandomAttachmentComboForGun( primary ); + perk1 = chooseRandomPerk( "perk1", primary, primaryAtts ); - if (perk1 != "specialty_bling") + if ( perk1 != "specialty_bling" ) primaryAtts[1] = "none"; - perk2 = chooseRandomPerk("perk2", primary, primaryAtts); + perk2 = chooseRandomPerk( "perk2", primary, primaryAtts ); primaryCamo = chooseRandomCamo(); - secondary = chooseRandomSecondary(perk1); - secondaryAtts = chooseRandomAttachmentComboForGun(secondary); + secondary = chooseRandomSecondary( perk1 ); + secondaryAtts = chooseRandomAttachmentComboForGun( secondary ); - if (perk1 != "specialty_bling" || !isDefined(self.pers["bots"]["unlocks"]["upgraded_specialty_bling"])) + if ( perk1 != "specialty_bling" || !isDefined( self.pers["bots"]["unlocks"]["upgraded_specialty_bling"] ) ) secondaryAtts[1] = "none"; - self setPlayerData("customClasses", i, "weaponSetups", 0, "weapon", primary); - self setPlayerData("customClasses", i, "weaponSetups", 0, "attachment", 0, primaryAtts[0]); - self setPlayerData("customClasses", i, "weaponSetups", 0, "attachment", 1, primaryAtts[1]); - self setPlayerData("customClasses", i, "weaponSetups", 0, "camo", primaryCamo); + self setPlayerData( "customClasses", i, "weaponSetups", 0, "weapon", primary ); + self setPlayerData( "customClasses", i, "weaponSetups", 0, "attachment", 0, primaryAtts[0] ); + self setPlayerData( "customClasses", i, "weaponSetups", 0, "attachment", 1, primaryAtts[1] ); + self setPlayerData( "customClasses", i, "weaponSetups", 0, "camo", primaryCamo ); - self setPlayerData("customClasses", i, "weaponSetups", 1, "weapon", secondary); - self setPlayerData("customClasses", i, "weaponSetups", 1, "attachment", 0, secondaryAtts[0]); - self setPlayerData("customClasses", i, "weaponSetups", 1, "attachment", 1, secondaryAtts[1]); + self setPlayerData( "customClasses", i, "weaponSetups", 1, "weapon", secondary ); + self setPlayerData( "customClasses", i, "weaponSetups", 1, "attachment", 0, secondaryAtts[0] ); + self setPlayerData( "customClasses", i, "weaponSetups", 1, "attachment", 1, secondaryAtts[1] ); - self setPlayerData("customClasses", i, "perks", 0, equipment); - self setPlayerData("customClasses", i, "perks", 1, perk1); - self setPlayerData("customClasses", i, "perks", 2, perk2); - self setPlayerData("customClasses", i, "perks", 3, perk3); - self setPlayerData("customClasses", i, "perks", 4, deathstreak); - self setPlayerData("customClasses", i, "specialGrenade", tactical); + self setPlayerData( "customClasses", i, "perks", 0, equipment ); + self setPlayerData( "customClasses", i, "perks", 1, perk1 ); + self setPlayerData( "customClasses", i, "perks", 2, perk2 ); + self setPlayerData( "customClasses", i, "perks", 3, perk3 ); + self setPlayerData( "customClasses", i, "perks", 4, deathstreak ); + self setPlayerData( "customClasses", i, "specialGrenade", tactical ); } } /* returns if killstreak is going to have the same kill cost */ -isColidingKillstreak(killstreaks, killstreak) +isColidingKillstreak( killstreaks, killstreak ) { - ksVal = getKillsNeededForStreak(killstreak); + ksVal = getKillsNeededForStreak( killstreak ); - for (i = 0; i < killstreaks.size; i++) + for ( i = 0; i < killstreaks.size; i++ ) { ks = killstreaks[i]; - if (ks == "") + if ( ks == "" ) continue; - if (ks == "none") + if ( ks == "none" ) continue; - ksV = getKillsNeededForStreak(ks); + ksV = getKillsNeededForStreak( ks ); - if (ksV <= 0) + if ( ksV <= 0 ) continue; - if (ksV != ksVal) + if ( ksV != ksVal ) continue; return true; @@ -770,50 +800,60 @@ setKillstreaks() killstreaks[2] = ""; chooseableStreaks = 0; - if (rankId >= 10) - chooseableStreaks++; - if (rankId >= 15) - chooseableStreaks++; - if (rankId >= 22) + + if ( rankId >= 10 ) chooseableStreaks++; - reasonable = getDvarInt("bots_loadout_reasonable"); - op = getDvarInt("bots_loadout_allow_op"); + if ( rankId >= 15 ) + chooseableStreaks++; + + if ( rankId >= 22 ) + chooseableStreaks++; + + reasonable = getDvarInt( "bots_loadout_reasonable" ); + op = getDvarInt( "bots_loadout_allow_op" ); i = 0; - while (i < chooseableStreaks) + + while ( i < chooseableStreaks ) { - slot = randomInt(3); + slot = randomInt( 3 ); - if (killstreaks[slot] != "") + if ( killstreaks[slot] != "" ) continue; - streak = random(allStreaks); + streak = random( allStreaks ); - if (isColidingKillstreak(killstreaks, streak)) + if ( isColidingKillstreak( killstreaks, streak ) ) continue; - if (reasonable) + if ( reasonable ) { - if (streak == "stealth_airstrike") + if ( streak == "stealth_airstrike" ) continue; - if (streak == "airdrop_mega") + + if ( streak == "airdrop_mega" ) continue; - if (streak == "emp") + + if ( streak == "emp" ) continue; - if (streak == "airdrop_sentry_minigun") + + if ( streak == "airdrop_sentry_minigun" ) continue; - if (streak == "airdrop") + + if ( streak == "airdrop" ) continue; - if (streak == "precision_airstrike") + + if ( streak == "precision_airstrike" ) continue; - if (streak == "helicopter") + + if ( streak == "helicopter" ) continue; } - if (op) + if ( op ) { - if (streak == "nuke") + if ( streak == "nuke" ) continue; } @@ -821,27 +861,29 @@ setKillstreaks() i++; } - if (killstreaks[0] == "") + if ( killstreaks[0] == "" ) killstreaks[0] = "uav"; - if (killstreaks[1] == "") + + if ( killstreaks[1] == "" ) killstreaks[1] = "airdrop"; - if (killstreaks[2] == "") + + if ( killstreaks[2] == "" ) killstreaks[2] = "predator_missile"; - self setPlayerData("killstreaks", 0, killstreaks[0]); - self setPlayerData("killstreaks", 1, killstreaks[1]); - self setPlayerData("killstreaks", 2, killstreaks[2]); + self setPlayerData( "killstreaks", 0, killstreaks[0] ); + self setPlayerData( "killstreaks", 1, killstreaks[1] ); + self setPlayerData( "killstreaks", 2, killstreaks[2] ); } /* 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" ) @@ -849,22 +891,22 @@ onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, if ( iDamage <= 0 ) return; - - if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team)) + + if ( !IsDefined( eAttacker ) || !isDefined( eAttacker.team ) ) return; - - if(eAttacker == self) + + if ( eAttacker == self ) return; - - if(level.teamBased && eAttacker.team == self.team) + + if ( level.teamBased && eAttacker.team == self.team ) return; if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) return; - - if(!isAlive(eAttacker)) + + if ( !isAlive( eAttacker ) ) return; - + self.killerLocation = eAttacker.origin; self.lastKiller = eAttacker; } @@ -872,12 +914,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" ) @@ -885,25 +927,25 @@ onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint if ( iDamage <= 0 ) return; - - if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team)) + + if ( !IsDefined( eAttacker ) || !isDefined( eAttacker.team ) ) return; - - if(eAttacker == self) + + if ( eAttacker == self ) return; - - if(level.teamBased && eAttacker.team == self.team) + + if ( level.teamBased && eAttacker.team == self.team ) return; if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) return; - - if(!isAlive(eAttacker)) + + if ( !isAlive( eAttacker ) ) return; - - if (!isSubStr(sWeapon, "_silencer_")) + + if ( !isSubStr( sWeapon, "_silencer_" ) ) self bot_cry_for_help( eAttacker ); - + self SetAttacker( eAttacker ); } @@ -916,13 +958,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-- ) @@ -933,8 +976,8 @@ bot_cry_for_help( attacker ) { continue; } - - if(!isDefined(player.team)) + + if ( !isDefined( player.team ) ) continue; if ( !IsAlive( player ) ) @@ -954,6 +997,7 @@ bot_cry_for_help( attacker ) dist = player.pers["bots"]["skill"]["help_dist"]; dist *= dist; + if ( DistanceSquared( self.origin, player.origin ) > dist ) { continue; @@ -976,12 +1020,12 @@ bot_cry_for_help( attacker ) */ onKillcam() { - level endon("game_ended"); - self endon("disconnect"); - - for(;;) + level endon( "game_ended" ); + self endon( "disconnect" ); + + for ( ;; ) { - self waittill("begin_killcam"); + self waittill( "begin_killcam" ); self thread doKillcamStuff(); } @@ -992,17 +1036,17 @@ onKillcam() */ doKillcamStuff() { - self endon("disconnect"); - self endon("killcam_ended"); + self endon( "disconnect" ); + self endon( "killcam_ended" ); - wait 0.5 + randomInt(3); + wait 0.5 + randomInt( 3 ); - if (randomInt(100) > 25) - self notify("use_copycat"); + if ( randomInt( 100 ) > 25 ) + self notify( "use_copycat" ); wait 0.1; - self notify("abort_killcam"); + self notify( "abort_killcam" ); } /* @@ -1010,19 +1054,19 @@ doKillcamStuff() */ 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; } } @@ -1032,38 +1076,45 @@ classWatch() */ chooseRandomClass() { - reasonable = getDvarInt("bots_loadout_reasonable"); + reasonable = getDvarInt( "bots_loadout_reasonable" ); class = ""; rank = self maps\mp\gametypes\_rank::getRankForXp( self getPlayerData( "experience" ) ) + 1; - if(rank < 4 || (randomInt(100) < 2 && !reasonable)) + + if ( rank < 4 || ( randomInt( 100 ) < 2 && !reasonable ) ) { - while(class == "") + while ( class == "" ) { - switch(randomInt(5)) + switch ( randomInt( 5 ) ) { case 0: class = "class0"; break; + case 1: class = "class1"; break; + case 2: class = "class2"; break; + case 3: - if(rank >= 2) + if ( rank >= 2 ) class = "class3"; + break; + case 4: - if(rank >= 3) + if ( rank >= 3 ) class = "class4"; + break; } } } else { - class = "custom"+(randomInt(5)+1); + class = "custom" + ( randomInt( 5 ) + 1 ); } return class; @@ -1074,17 +1125,17 @@ chooseRandomClass() */ 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; } } @@ -1094,13 +1145,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; @@ -1133,6 +1184,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; @@ -1164,6 +1216,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; @@ -1195,6 +1248,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; @@ -1226,6 +1280,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; @@ -1257,6 +1312,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; @@ -1288,6 +1344,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; @@ -1331,48 +1388,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"]["remember_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"]["fov"] = randomFloatRange(-1, 1); - randomNum = randomIntRange(500, 25000); + 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"]["remember_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"]["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_le,j_ankle_ri"; - self.pers["bots"]["behavior"]["strafe"] = randomInt(100); - self.pers["bots"]["behavior"]["nade"] = randomInt(100); - self.pers["bots"]["behavior"]["sprint"] = randomInt(100); - 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; @@ -1385,11 +1445,11 @@ set_diff() */ onDeath() { - self endon("disconnect"); + self endon( "disconnect" ); - for(;;) + for ( ;; ) { - self waittill("death"); + self waittill( "death" ); self.wantSafeSpawn = true; } @@ -1401,10 +1461,11 @@ onDeath() onGiveLoadout_loop() { class = self.class; - if (isDefined(self.bot_oma_class)) + + if ( isDefined( self.bot_oma_class ) ) class = self.bot_oma_class; - self botGiveLoadout(self.team, class, !isDefined(self.bot_oma_class)); + self botGiveLoadout( self.team, class, !isDefined( self.bot_oma_class ) ); self.bot_oma_class = undefined; } @@ -1413,11 +1474,11 @@ onGiveLoadout_loop() */ onGiveLoadout() { - self endon("disconnect"); + self endon( "disconnect" ); - for(;;) + for ( ;; ) { - self waittill("giveLoadout"); + self waittill( "giveLoadout" ); self onGiveLoadout_loop(); } @@ -1428,13 +1489,13 @@ onGiveLoadout() */ 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; @@ -1443,7 +1504,7 @@ onSpawned() self.bot_was_follow_script_update = undefined; self.bot_stuck_on_carepackage = undefined; - if (getDvarInt("bots_play_obj")) + if ( getDvarInt( "bots_play_obj" ) ) self thread bot_dom_cap_think(); } } @@ -1453,13 +1514,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(); } } @@ -1469,14 +1530,14 @@ onBotSpawned() */ start_bot_threads() { - self endon("disconnect"); - level endon("game_ended"); - self endon("death"); - - gameFlagWait("prematch_done"); + self endon( "disconnect" ); + level endon( "game_ended" ); + self endon( "death" ); + + gameFlagWait( "prematch_done" ); // inventory usage - if (getDvarInt("bots_play_killstreak")) + if ( getDvarInt( "bots_play_killstreak" ) ) self thread bot_killstreak_think(); self thread bot_weapon_think(); @@ -1484,7 +1545,7 @@ start_bot_threads() self thread bot_perk_think(); // script targeting - if (getDvarInt("bots_play_target_other")) + if ( getDvarInt( "bots_play_target_other" ) ) { self thread bot_target_vehicle(); self thread bot_equipment_kill_think(); @@ -1492,7 +1553,7 @@ start_bot_threads() } // airdrop - if (getDvarInt("bots_play_take_carepackages")) + if ( getDvarInt( "bots_play_take_carepackages" ) ) { self thread bot_watch_stuck_on_crate(); self thread bot_crate_think(); @@ -1505,14 +1566,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_jav_loc_think(); self thread bot_use_tube_think(); @@ -1523,7 +1584,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(); @@ -1553,49 +1614,49 @@ start_bot_threads() Increments the number of bots approching the obj, decrements when needed Used for preventing too many bots going to one obj, or unreachable objs */ -bot_inc_bots(obj, unreach) +bot_inc_bots( obj, unreach ) { - level endon("game_ended"); - self endon("bot_inc_bots"); + level endon( "game_ended" ); + self endon( "bot_inc_bots" ); - if (!isDefined(obj)) + if ( !isDefined( obj ) ) return; - - if (!isDefined(obj.bots)) + + if ( !isDefined( obj.bots ) ) obj.bots = 0; - + obj.bots++; - - ret = self waittill_any_return("death", "disconnect", "bad_path", "goal", "new_goal"); - - if (isDefined(obj) && (ret != "bad_path" || !isDefined(unreach))) + + ret = self waittill_any_return( "death", "disconnect", "bad_path", "goal", "new_goal" ); + + if ( isDefined( obj ) && ( ret != "bad_path" || !isDefined( unreach ) ) ) obj.bots--; } /* Watches when the bot is touching the obj and calls 'goal' */ -bots_watch_touch_obj(obj) +bots_watch_touch_obj( obj ) { - self endon ("death"); - self endon ("disconnect"); - self endon ("bad_path"); - self endon ("goal"); - self endon ("new_goal"); + self endon ( "death" ); + self endon ( "disconnect" ); + self endon ( "bad_path" ); + self endon ( "goal" ); + self endon ( "new_goal" ); - for (;;) + for ( ;; ) { wait 0.5; - if (!isDefined(obj)) + if ( !isDefined( obj ) ) { - self notify("bad_path"); + self notify( "bad_path" ); return; } - if (self IsTouching(obj)) + if ( self IsTouching( obj ) ) { - self notify("goal"); + self notify( "goal" ); return; } } @@ -1604,7 +1665,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" ); @@ -1612,183 +1673,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; } } @@ -1796,50 +1858,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; } @@ -1849,14 +1911,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; } } @@ -1864,58 +1926,58 @@ fire_current_weapon() /* 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; } @@ -1926,10 +1988,10 @@ getRocketAmmo() { answer = self getLockonAmmo(); - if (isDefined(answer)) + if ( isDefined( answer ) ) return answer; - if(self getAmmoCount("rpg_mp")) + if ( self getAmmoCount( "rpg_mp" ) ) answer = "rpg_mp"; return answer; @@ -1941,14 +2003,14 @@ getRocketAmmo() getLockonAmmo() { answer = undefined; - - if(self getAmmoCount("at4_mp")) - answer = "at4_mp"; - - if(self getAmmoCount("stinger_mp")) + + if ( self getAmmoCount( "at4_mp" ) ) + answer = "at4_mp"; + + if ( self getAmmoCount( "stinger_mp" ) ) answer = "stinger_mp"; - if(self getAmmoCount("javelin_mp")) + if ( self getAmmoCount( "javelin_mp" ) ) answer = "javelin_mp"; return answer; @@ -1957,7 +2019,7 @@ getLockonAmmo() /* Clears goal when events death */ -stop_go_target_on_death(tar) +stop_go_target_on_death( tar ) { self endon( "death" ); self endon( "disconnect" ); @@ -1965,7 +2027,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(); } @@ -1977,16 +2039,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(); } @@ -1997,14 +2060,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; @@ -2017,23 +2080,23 @@ follow_target() */ bot_think_camp_loop() { - campSpot = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("camp"), 1024))); + campSpot = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "camp" ), 1024 ) ) ); - if (!isDefined(campSpot)) + if ( !isDefined( campSpot ) ) return; - self SetScriptGoal(campSpot.origin, 16); + self SetScriptGoal( campSpot.origin, 16 ); - ret = self waittill_any_return("new_goal", "goal", "bad_path"); + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - if (ret != "new_goal") + if ( ret != "new_goal" ) self ClearScriptGoal(); - if (ret != "goal") + if ( ret != "goal" ) return; - self thread killCampAfterTime(randomIntRange(10,20)); - self CampAtSpot(campSpot.origin, campSpot.origin + AnglesToForward(campSpot.angles) * 2048); + self thread killCampAfterTime( randomIntRange( 10, 20 ) ); + self CampAtSpot( campSpot.origin, campSpot.origin + AnglesToForward( campSpot.angles ) * 2048 ); } /* @@ -2043,15 +2106,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(); @@ -2061,59 +2124,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" ); } /* @@ -2123,31 +2187,33 @@ 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 == self) + if ( player == self ) continue; - if(!isReallyAlive(player)) + if ( !isReallyAlive( player ) ) continue; - if (player.team != self.team) + if ( player.team != self.team ) continue; - if (DistanceSquared(player.origin, self.origin) > distSq) + if ( DistanceSquared( player.origin, self.origin ) > distSq ) continue; follows[follows.size] = player; } - toFollow = random(follows); - if (!isDefined(toFollow)) + toFollow = random( follows ); + + if ( !isDefined( toFollow ) ) return; - self thread killFollowAfterTime(randomIntRange(10,20)); - self followPlayer(toFollow); + self thread killFollowAfterTime( randomIntRange( 10, 20 ) ); + self followPlayer( toFollow ); } /* @@ -2157,18 +2223,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(); @@ -2180,72 +2246,72 @@ 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) || !isReallyAlive(who)) + if ( !isDefined( who ) || !isReallyAlive( 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" ); } /* @@ -2253,61 +2319,62 @@ followPlayer(who) */ bot_perk_think_loop() { - for (;self _hasPerk("specialty_blastshield");) + for ( ; self _hasPerk( "specialty_blastshield" ); ) { - if (!self _hasPerk("_specialty_blastshield")) + if ( !self _hasPerk( "_specialty_blastshield" ) ) { - if (randomInt(100) < 65) + if ( randomInt( 100 ) < 65 ) break; - self _setPerk("_specialty_blastshield"); + self _setPerk( "_specialty_blastshield" ); } else { - if (randomInt(100) < 90) + if ( randomInt( 100 ) < 90 ) break; - self _unsetPerk("_specialty_blastshield"); + self _unsetPerk( "_specialty_blastshield" ); } break; } - for (;self _hasPerk("specialty_onemanarmy") && self hasWeapon("onemanarmy_mp");) + for ( ; self _hasPerk( "specialty_onemanarmy" ) && self hasWeapon( "onemanarmy_mp" ); ) { - if (self HasThreat() || self HasBotJavelinLocation()) + if ( self HasThreat() || self HasBotJavelinLocation() ) break; - if (self InLastStand() && !self InFinalStand()) + if ( self InLastStand() && !self InFinalStand() ) break; anyWeapout = false; weaponsList = self GetWeaponsListAll(); - for (i = 0; i < weaponsList.size; i++) + + for ( i = 0; i < weaponsList.size; i++ ) { weap = weaponsList[i]; - if (self getAmmoCount(weap) || weap == "onemanarmy_mp") + if ( self getAmmoCount( weap ) || weap == "onemanarmy_mp" ) continue; anyWeapout = true; } - if ((!anyWeapout && randomInt(100) < 90) || randomInt(100) < 10) + if ( ( !anyWeapout && randomInt( 100 ) < 90 ) || randomInt( 100 ) < 10 ) break; class = self chooseRandomClass(); self.bot_oma_class = class; - if (!self changeToWeapon("onemanarmy_mp")) + if ( !self changeToWeapon( "onemanarmy_mp" ) ) { self.bot_oma_class = undefined; break; } - self BotFreezeControls(true); + self BotFreezeControls( true ); wait 1; - self BotFreezeControls(false); + self BotFreezeControls( false ); self notify ( "menuresponse", game["menu_onemanarmy"], self.bot_oma_class ); @@ -2321,21 +2388,21 @@ bot_perk_think_loop() */ bot_perk_think() { - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); - for (;;) + for ( ;; ) { - wait randomIntRange(5,7); + wait randomIntRange( 5, 7 ); - if (self IsUsingRemote()) + if ( self IsUsingRemote() ) continue; - if(self BotIsFrozen()) + if ( self BotIsFrozen() ) continue; - if(self isDefusing() || self isPlanting()) + if ( self isDefusing() || self isPlanting() ) continue; self bot_perk_think_loop(); @@ -2345,78 +2412,82 @@ bot_perk_think() /* 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 HasBotJavelinLocation() || self HasScriptAimPos()) + if ( self HasThreat() || self HasBotJavelinLocation() || 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 IsUsingRemote()) + if ( self isDefusing() || self isPlanting() ) return; - if (self InLastStand() && !self InFinalStand()) + if ( self IsUsingRemote() ) + return; + + if ( self InLastStand() && !self InFinalStand() ) 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; @@ -2425,26 +2496,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 ); } /* @@ -2452,114 +2523,118 @@ 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 and TIs */ -bot_use_equipment_think_loop(data) +bot_use_equipment_think_loop( data ) { - if (data.doFastContinue) + if ( data.doFastContinue ) data.doFastContinue = false; else { - wait randomintRange(2, 4); + wait randomintRange( 2, 4 ); chance = self.pers["bots"]["behavior"]["nade"] / 2; - if (chance > 20) + + if ( chance > 20 ) chance = 20; - if (randomInt(100) > chance) + if ( randomInt( 100 ) > chance ) return; } nade = undefined; - if (self GetAmmoCount("claymore_mp")) + + if ( self GetAmmoCount( "claymore_mp" ) ) nade = "claymore_mp"; - if (self GetAmmoCount("flare_mp")) + + if ( self GetAmmoCount( "flare_mp" ) ) nade = "flare_mp"; - if (self GetAmmoCount("c4_mp")) + + if ( self GetAmmoCount( "c4_mp" ) ) nade = "c4_mp"; - - if (!isDefined(nade)) + + if ( !isDefined( nade ) ) return; - if (self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos()) + if ( self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos() ) return; - if(self BotIsFrozen()) - return; - - if(self IsBotFragging() || self IsBotSmoking()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) return; - if (self IsUsingRemote()) + if ( self IsBotFragging() || self IsBotSmoking() ) return; - if (self inLastStand() && !self _hasPerk("specialty_laststandoffhand") && !self inFinalStand()) + if ( self isDefusing() || self isPlanting() ) + return; + + if ( self IsUsingRemote() ) + return; + + if ( self inLastStand() && !self _hasPerk( "specialty_laststandoffhand" ) && !self inFinalStand() ) return; loc = undefined; - if (!self nearAnyOfWaypoints(128, getWaypointsOfType("claymore"))) + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "claymore" ) ) ) { - clayWp = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("claymore"), 1024))); - - if (!isDefined(clayWp) || self HasScriptGoal() || self.bot_lock_goal) + clayWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "claymore" ), 1024 ) ) ); + + if ( !isDefined( clayWp ) || self HasScriptGoal() || self.bot_lock_goal ) { myEye = self GetEye(); - loc = myEye + AnglesToForward(self GetPlayerAngles()) * 256; + loc = myEye + AnglesToForward( self GetPlayerAngles() ) * 256; - if (!bulletTracePassed(myEye, loc, false, self)) + if ( !bulletTracePassed( myEye, loc, false, self ) ) return; } else { - self SetScriptGoal(clayWp.origin, 16); + self SetScriptGoal( clayWp.origin, 16 ); - ret = self waittill_any_return("new_goal", "goal", "bad_path"); + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - if (ret != "new_goal") + if ( ret != "new_goal" ) self ClearScriptGoal(); - if (ret != "goal") + if ( ret != "goal" ) return; - + data.doFastContinue = true; return; } } else { - clayWp = getWaypointForIndex(self getNearestWaypointOfWaypoints(getWaypointsOfType("claymore"))); - loc = clayWp.origin + AnglesToForward(clayWp.angles) * 2048; + clayWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "claymore" ) ) ); + loc = clayWp.origin + AnglesToForward( clayWp.angles ) * 2048; } - if (!isDefined(loc)) + if ( !isDefined( loc ) ) return; - self SetScriptAimPos(loc); - self BotStopMoving(true); + self SetScriptAimPos( loc ); + self BotStopMoving( true ); wait 1; - self botThrowGrenade(nade, 0.05); + self botThrowGrenade( nade, 0.05 ); self ClearScriptAimPos(); - self BotStopMoving(false); + self BotStopMoving( false ); } /* @@ -2567,94 +2642,98 @@ 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 HasBotJavelinLocation() || self HasScriptAimPos()) + if ( self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos() ) return; - if(self BotIsFrozen()) - return; - - if(self IsBotFragging() || self IsBotSmoking()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) return; - if (self IsUsingRemote()) + if ( self IsBotFragging() || self IsBotSmoking() ) return; - if (self inLastStand() && !self _hasPerk("specialty_laststandoffhand") && !self inFinalStand()) + if ( self isDefusing() || self isPlanting() ) + return; + + if ( self IsUsingRemote() ) + return; + + if ( self inLastStand() && !self _hasPerk( "specialty_laststandoffhand" ) && !self inFinalStand() ) return; loc = undefined; - if (!self nearAnyOfWaypoints(128, getWaypointsOfType("grenade"))) + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "grenade" ) ) ) { - nadeWp = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("grenade"), 1024))); + nadeWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "grenade" ), 1024 ) ) ); myEye = self GetEye(); - if (!isDefined(nadeWp) || self HasScriptGoal() || self.bot_lock_goal) + + if ( !isDefined( nadeWp ) || self HasScriptGoal() || self.bot_lock_goal ) { - traceForward = BulletTrace(myEye, myEye + AnglesToForward(self GetPlayerAngles()) * 900, false, self); + traceForward = BulletTrace( myEye, myEye + AnglesToForward( self GetPlayerAngles() ) * 900, false, self ); loc = traceForward["position"]; - dist = DistanceSquared(self.origin, loc); - if (dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance) + dist = DistanceSquared( self.origin, loc ); + + if ( dist < level.bots_minGrenadeDistance || dist > level.bots_maxGrenadeDistance ) return; - if (!bulletTracePassed(self.origin + (0, 0, 5), self.origin + (0, 0, 2048), false, self)) + if ( !bulletTracePassed( self.origin + ( 0, 0, 5 ), self.origin + ( 0, 0, 2048 ), false, self ) ) return; - if (!bulletTracePassed(loc + (0, 0, 5), loc + (0, 0, 2048), false, self)) + if ( !bulletTracePassed( loc + ( 0, 0, 5 ), loc + ( 0, 0, 2048 ), false, self ) ) return; - loc += (0, 0, dist/3000); + loc += ( 0, 0, dist / 3000 ); } else { - self SetScriptGoal(nadeWp.origin, 16); + self SetScriptGoal( nadeWp.origin, 16 ); - ret = self waittill_any_return("new_goal", "goal", "bad_path"); + ret = self waittill_any_return( "new_goal", "goal", "bad_path" ); - if (ret != "new_goal") + if ( ret != "new_goal" ) self ClearScriptGoal(); - if (ret != "goal") + if ( ret != "goal" ) return; data.doFastContinue = true; @@ -2663,24 +2742,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 ); } /* @@ -2688,16 +2769,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 ); } } @@ -2707,25 +2788,26 @@ bot_use_grenade_think() bot_watch_think_mw2_loop() { tube = self getValidTube(); - if (!isDefined(tube)) + + if ( !isDefined( tube ) ) { - if (self GetAmmoCount("at4_mp")) + if ( self GetAmmoCount( "at4_mp" ) ) tube = "at4_mp"; - else if (self GetAmmoCount("rpg_mp")) + else if ( self GetAmmoCount( "rpg_mp" ) ) tube = "rpg_mp"; else return; } - if (self GetCurrentWeapon() == tube) + if ( self GetCurrentWeapon() == tube ) return; chance = self.pers["bots"]["behavior"]["nade"]; - if (randomInt(100) > chance) + if ( randomInt( 100 ) > chance ) return; - self thread ChangeToWeapon(tube); + self thread ChangeToWeapon( tube ); } /* @@ -2733,27 +2815,27 @@ 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 IsUsingRemote()) + if ( self isDefusing() || self isPlanting() ) continue; - if (self InLastStand() && !self InFinalStand()) + if ( self IsUsingRemote() ) continue; - if (self HasThreat()) + if ( self InLastStand() && !self InFinalStand() ) + continue; + + if ( self HasThreat() ) continue; self bot_watch_think_mw2_loop(); @@ -2766,53 +2848,54 @@ bot_watch_think_mw2() bot_watch_riot_weapons_loop() { threat = self GetThreat(); - dist = DistanceSquared(threat.origin, self.origin); + dist = DistanceSquared( threat.origin, self.origin ); curWeap = self GetCurrentWeapon(); - if (randomInt(2)) + if ( randomInt( 2 ) ) { nade = self getValidGrenade(); - if (!isDefined(nade)) + if ( !isDefined( nade ) ) return; - if (dist <= level.bots_minGrenadeDistance || dist >= level.bots_maxGrenadeDistance) + if ( dist <= level.bots_minGrenadeDistance || dist >= level.bots_maxGrenadeDistance ) return; - if (randomInt(100) > self.pers["bots"]["behavior"]["nade"]) + if ( randomInt( 100 ) > self.pers["bots"]["behavior"]["nade"] ) return; - self botThrowGrenade(nade); + self botThrowGrenade( nade ); } else { - if (randomInt(100) > self.pers["bots"]["behavior"]["switch"] * 10) + if ( randomInt( 100 ) > self.pers["bots"]["behavior"]["switch"] * 10 ) return; weaponslist = self getweaponslistall(); 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 (!isWeaponPrimary(weapon)) + + if ( !isWeaponPrimary( weapon ) ) continue; - - if(curWeap == weapon || weapon == "none" || weapon == "" || weapon == "javelin_mp" || weapon == "stinger_mp" || weapon == "onemanarmy_mp") + + if ( curWeap == weapon || weapon == "none" || weapon == "" || weapon == "javelin_mp" || weapon == "stinger_mp" || weapon == "onemanarmy_mp" ) continue; - + weap = weapon; break; } - - if(weap == "") + + if ( weap == "" ) return; - - self thread ChangeToWeapon(weap); + + self thread ChangeToWeapon( weap ); } } @@ -2821,30 +2904,30 @@ bot_watch_riot_weapons_loop() */ bot_watch_riot_weapons() { - self endon("disconnect"); - self endon("death"); - level endon("game_ended"); + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); - for (;;) + for ( ;; ) { - wait randomIntRange(2, 4); + wait randomIntRange( 2, 4 ); - if(self BotIsFrozen()) - continue; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) continue; - if (self IsUsingRemote()) + if ( self isDefusing() || self isPlanting() ) continue; - if (self InLastStand() && !self InFinalStand()) + if ( self IsUsingRemote() ) continue; - if (!self HasThreat()) + if ( self InLastStand() && !self InFinalStand() ) continue; - if (!self.hasRiotShieldEquipped) + if ( !self HasThreat() ) + continue; + + if ( !self.hasRiotShieldEquipped ) continue; self bot_watch_riot_weapons_loop(); @@ -2854,75 +2937,78 @@ bot_watch_riot_weapons() /* BOts thinking of using javelins */ -bot_jav_loc_think_loop(data) +bot_jav_loc_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 && self getCurrentWeapon() != "javelin_mp") + if ( randomInt( 100 ) > chance && self getCurrentWeapon() != "javelin_mp" ) return; } - if (!self GetAmmoCount("javelin_mp")) + if ( !self GetAmmoCount( "javelin_mp" ) ) return; - if (self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos()) + if ( self HasThreat() || self HasBotJavelinLocation() || self HasScriptAimPos() ) return; - if(self BotIsFrozen()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) return; - if (self IsUsingRemote()) + if ( self isDefusing() || self isPlanting() ) return; - if (self InLastStand() && !self InFinalStand()) + if ( self IsUsingRemote() ) return; - if (self isEMPed()) + if ( self InLastStand() && !self InFinalStand() ) + return; + + if ( self isEMPed() ) return; loc = undefined; - if (!self nearAnyOfWaypoints(128, getWaypointsOfType("javelin"))) + if ( !self nearAnyOfWaypoints( 128, getWaypointsOfType( "javelin" ) ) ) { - javWp = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("javelin"), 1024))); - - if (!isDefined(javWp) || self HasScriptGoal() || self.bot_lock_goal) + javWp = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "javelin" ), 1024 ) ) ); + + if ( !isDefined( javWp ) || self HasScriptGoal() || self.bot_lock_goal ) { traceForward = self maps\mp\_javelin::EyeTraceForward(); - if (!isDefined(traceForward)) + + if ( !isDefined( traceForward ) ) return; loc = traceForward[0]; - if (self maps\mp\_javelin::TargetPointTooClose(loc)) + + if ( self maps\mp\_javelin::TargetPointTooClose( loc ) ) 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; } else { - self SetScriptGoal(javWp.origin, 16); + self SetScriptGoal( javWp.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; @@ -2931,20 +3017,20 @@ bot_jav_loc_think_loop(data) } else { - javWp = getWaypointForIndex(self getNearestWaypointOfWaypoints(getWaypointsOfType("javelin"))); + javWp = getWaypointForIndex( self getNearestWaypointOfWaypoints( getWaypointsOfType( "javelin" ) ) ); loc = javWp.jav_point; } - if (!isDefined(loc)) + if ( !isDefined( loc ) ) return; - self SetBotJavelinLocation(loc); + self SetBotJavelinLocation( loc ); - if (self changeToWeapon("javelin_mp")) + if ( self changeToWeapon( "javelin_mp" ) ) { - self waittill_any_timeout(10, "missile_fire", "weapon_change"); + self waittill_any_timeout( 10, "missile_fire", "weapon_change" ); } - + self ClearBotJavelinLocation(); } @@ -2953,16 +3039,16 @@ bot_jav_loc_think_loop(data) */ bot_jav_loc_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_jav_loc_think_loop(data); + self bot_jav_loc_think_loop( data ); } } @@ -2976,31 +3062,31 @@ bot_equipment_kill_think_loop() grenades = getEntArray( "grenade", "classname" ); myEye = self getEye(); myAngles = self getPlayerAngles(); - dist = 512*512; + dist = 512 * 512; target = undefined; for ( i = 0; i < grenades.size; i++ ) { item = grenades[i]; - if (!isDefined(item)) + if ( !isDefined( item ) ) continue; if ( !IsDefined( item.name ) ) continue; - if ( IsDefined( item.owner ) && ((level.teamBased && item.owner.team == self.team) || item.owner == self) ) + if ( IsDefined( item.owner ) && ( ( level.teamBased && item.owner.team == self.team ) || item.owner == self ) ) continue; - - if (item.name != "c4_mp" && item.name != "claymore_mp") + + if ( item.name != "c4_mp" && item.name != "claymore_mp" ) continue; - - if(!hasSitrep && !bulletTracePassed(myEye, item.origin, false, item)) + + if ( !hasSitrep && !bulletTracePassed( myEye, item.origin, 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 ) < dist ) { target = item; @@ -3009,7 +3095,7 @@ bot_equipment_kill_think_loop() } grenades = undefined; - + if ( !IsDefined( target ) ) { for ( i = 0; i < level.players.size; i++ ) @@ -3018,27 +3104,28 @@ bot_equipment_kill_think_loop() if ( player == self ) continue; - - if(!isDefined(player.team)) + + if ( !isDefined( player.team ) ) continue; - + if ( level.teamBased && player.team == myteam ) continue; ti = player.setSpawnPoint; - if(!isDefined(ti)) + + if ( !isDefined( ti ) ) continue; - - if(!isDefined(ti.bots)) + + if ( !isDefined( ti.bots ) ) ti.bots = 0; - - if(ti.bots >= 2) + + if ( ti.bots >= 2 ) continue; - - if(!hasSitrep && !bulletTracePassed(myEye, ti.origin, false, ti)) + + if ( !hasSitrep && !bulletTracePassed( myEye, ti.origin, false, ti ) ) continue; - - if(getConeDot(ti.origin, self.origin, myAngles) < 0.6) + + if ( getConeDot( ti.origin, self.origin, myAngles ) < 0.6 ) continue; if ( DistanceSquared( ti.origin, self.origin ) < dist ) @@ -3048,39 +3135,39 @@ bot_equipment_kill_think_loop() } } } - + if ( !IsDefined( target ) ) return; - if (isDefined(target.enemyTrigger) && !self HasScriptGoal() && !self.bot_lock_goal) + if ( isDefined( target.enemyTrigger ) && !self HasScriptGoal() && !self.bot_lock_goal ) { - self SetScriptGoal(target.origin, 64); - self thread bot_inc_bots(target, true); + self SetScriptGoal( target.origin, 64 ); + self thread bot_inc_bots( target, true ); self thread bots_watch_touch_obj( target ); - - path = self waittill_any_return("bad_path", "goal", "new_goal"); - if (path != "new_goal") + path = self waittill_any_return( "bad_path", "goal", "new_goal" ); + + if ( path != "new_goal" ) self ClearScriptGoal(); - if (path != "goal" || !isDefined(target)) + if ( path != "goal" || !isDefined( target ) ) return; - if (randomInt(100) < self.pers["bots"]["behavior"]["camp"] * 8) + if ( randomInt( 100 ) < self.pers["bots"]["behavior"]["camp"] * 8 ) { - self thread killCampAfterTime(randomIntRange(10,20)); - self thread killCampAfterEntGone(target); - self CampAtSpot(target.origin, target.origin + (0, 0, 42)); + self thread killCampAfterTime( randomIntRange( 10, 20 ) ); + self thread killCampAfterEntGone( target ); + self CampAtSpot( target.origin, target.origin + ( 0, 0, 42 ) ); } - - if (isDefined(target)) - target.enemyTrigger notify("trigger", self); - + + if ( isDefined( target ) ) + target.enemyTrigger notify( "trigger", self ); + return; } self SetScriptEnemy( target ); - self bot_equipment_attack(target); + self bot_equipment_attack( target ); self ClearScriptEnemy(); } @@ -3096,11 +3183,11 @@ bot_equipment_kill_think() 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(); @@ -3110,7 +3197,7 @@ bot_equipment_kill_think() /* Bots target the equipment for a time then stop */ -bot_equipment_attack(equ) +bot_equipment_attack( equ ) { wait_time = RandomIntRange( 7, 10 ); @@ -3131,85 +3218,93 @@ bot_equipment_attack(equ) bot_listen_to_steps_loop() { dist = level.bots_listenDist; - if(self _hasPerk("specialty_selectivehearing")) + + if ( self _hasPerk( "specialty_selectivehearing" ) ) 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 == self) - continue; - if(level.teamBased && self.team == player.team) - continue; - if(player.sessionstate != "playing") - continue; - if(!isReallyAlive(player)) + if ( player == self ) continue; - if( lengthsquared( player getVelocity() ) < 20000 ) + if ( level.teamBased && self.team == player.team ) continue; - - if( distanceSquared(player.origin, self.origin) > dist ) + + if ( player.sessionstate != "playing" ) continue; - - if( player _hasPerk("specialty_quieter")) + + if ( !isReallyAlive( player ) ) continue; - + + if ( lengthsquared( player getVelocity() ) < 20000 ) + continue; + + if ( distanceSquared( player.origin, self.origin ) > dist ) + continue; + + if ( player _hasPerk( "specialty_quieter" ) ) + continue; + heard = player; break; } - hasHeartbeat = (isSubStr(self GetCurrentWeapon(), "_heartbeat_") && !self IsEMPed()); - heartbeatDist = 350*350; + hasHeartbeat = ( isSubStr( self GetCurrentWeapon(), "_heartbeat_" ) && !self IsEMPed() ); + heartbeatDist = 350 * 350; - if(!IsDefined(heard) && hasHeartbeat) + if ( !IsDefined( heard ) && hasHeartbeat ) { - for(i = level.players.size-1 ; i >= 0; i--) + for ( i = level.players.size - 1 ; i >= 0; i-- ) { player = level.players[i]; - if(player == self) - continue; - if(level.teamBased && self.team == player.team) - continue; - if(player.sessionstate != "playing") - continue; - if(!isReallyAlive(player)) + if ( player == self ) continue; - if (player _hasPerk("specialty_heartbreaker")) + if ( level.teamBased && self.team == player.team ) continue; - if (distanceSquared(player.origin, self.origin) > heartbeatDist) + if ( player.sessionstate != "playing" ) continue; - if (GetConeDot(player.origin, self.origin, self GetPlayerAngles()) < 0.6) + if ( !isReallyAlive( player ) ) + continue; + + if ( player _hasPerk( "specialty_heartbreaker" ) ) + continue; + + if ( distanceSquared( player.origin, self.origin ) > heartbeatDist ) + continue; + + if ( GetConeDot( player.origin, self.origin, self GetPlayerAngles() ) < 0.6 ) continue; heard = player; break; } } - - if(!IsDefined(heard)) + + if ( !IsDefined( heard ) ) return; - - if(bulletTracePassed(self getEye(), heard getTagOrigin( "j_spineupper" ), false, heard)) + + if ( bulletTracePassed( self getEye(), 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(); } @@ -3218,16 +3313,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(); } } @@ -3237,52 +3332,56 @@ bot_listen_to_steps() */ bot_uav_think_loop() { - hasRadar = ((level.teamBased && level.activeUAVs[self.team]) || (!level.teamBased && level.activeUAVs[self.guid])); - if( level.hardcoreMode && !hasRadar ) + hasRadar = ( ( level.teamBased && level.activeUAVs[self.team] ) || ( !level.teamBased && level.activeUAVs[self.guid] ) ); + + if ( level.hardcoreMode && !hasRadar ) return; - + dist = self.pers["bots"]["skill"]["help_dist"]; dist *= dist * 8; - + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[i]; - - if(player == self) + + 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(!isReallyAlive(player)) + + if ( !isReallyAlive( player ) ) continue; - - distFromPlayer = DistanceSquared(self.origin, player.origin); - if(distFromPlayer > dist) + + distFromPlayer = DistanceSquared( self.origin, player.origin ); + + if ( distFromPlayer > dist ) continue; - - if((!isSubStr(player getCurrentWeapon(), "_silencer_") && player.bots_firing) || (hasRadar && !player _hasPerk("specialty_coldblooded"))) + + if ( ( !isSubStr( player getCurrentWeapon(), "_silencer_" ) && player.bots_firing ) || ( hasRadar && !player _hasPerk( "specialty_coldblooded" ) ) ) { distSq = self.pers["bots"]["skill"]["help_dist"] * self.pers["bots"]["skill"]["help_dist"]; - if (distFromPlayer < distSq && bulletTracePassed(self getEye(), player getTagOrigin( "j_spineupper" ), false, player)) + + if ( distFromPlayer < distSq && bulletTracePassed( self getEye(), 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; } } @@ -3295,23 +3394,23 @@ bot_uav_think() { self endon( "death" ); self endon( "disconnect" ); - - for(;;) + + for ( ;; ) { wait 0.75; - - if(self.pers["bots"]["skill"]["base"] <= 1) - continue; - - if (self isEMPed() || self.bot_isScrambled) + + if ( self.pers["bots"]["skill"]["base"] <= 1 ) continue; - if (self _hasPerk("_specialty_blastshield")) + if ( self isEMPed() || self.bot_isScrambled ) continue; - if ((level.teamBased && level.activeCounterUAVs[level.otherTeam[self.team]]) || (!level.teamBased && self.isRadarBlocked)) + if ( self _hasPerk( "_specialty_blastshield" ) ) continue; - + + if ( ( level.teamBased && level.activeCounterUAVs[level.otherTeam[self.team]] ) || ( !level.teamBased && self.isRadarBlocked ) ) + continue; + self bot_uav_think_loop(); } } @@ -3323,36 +3422,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) && isReallyAlive(self.lastKiller)) + if ( isDefined( self.lastKiller ) && isReallyAlive( self.lastKiller ) ) { - if(bulletTracePassed(self getEye(), self.lastKiller getTagOrigin( "j_spineupper" ), false, self.lastKiller)) + if ( bulletTracePassed( self getEye(), 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(); } } @@ -3360,29 +3459,29 @@ bot_revenge_think() /* Watches the target's health, calls 'bad_path' */ -turret_death_monitor(turret) +turret_death_monitor( turret ) { - 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(turret)) + if ( !isDefined( turret ) ) break; - if (turret.health <= 20000) + if ( turret.health <= 20000 ) break; - if (isDefined(turret.carriedBy)) + if ( isDefined( turret.carriedBy ) ) break; } - self notify("bad_path"); + self notify( "bad_path" ); } /* @@ -3398,11 +3497,11 @@ bot_turret_attack( enemy ) if ( !IsDefined( enemy ) ) return; - - if(enemy.health <= 20000) + + if ( enemy.health <= 20000 ) return; - if (isDefined(enemy.carriedBy)) + if ( isDefined( enemy.carriedBy ) ) return; //if ( !BulletTracePassed( self getEye(), enemy.origin + ( 0, 0, 15 ), false, enemy ) ) @@ -3416,44 +3515,51 @@ bot_turret_attack( enemy ) bot_turret_think_loop() { myteam = self.pers[ "team" ]; - turretsKeys = getArrayKeys(level.turrets); + turretsKeys = getArrayKeys( level.turrets ); + if ( turretsKeys.size == 0 ) { wait( randomintrange( 3, 5 ) ); return; } - if(self.pers["bots"]["skill"]["base"] <= 1) + if ( self.pers["bots"]["skill"]["base"] <= 1 ) return; - if (self HasScriptEnemy() || self IsUsingRemote()) + if ( self HasScriptEnemy() || self IsUsingRemote() ) return; myEye = self GetEye(); turret = undefined; - for (i = turretsKeys.size - 1; i >= 0; i--) + + for ( i = turretsKeys.size - 1; i >= 0; i-- ) { tempTurret = level.turrets[turretsKeys[i]]; - - if (!isDefined(tempTurret)) + + if ( !isDefined( tempTurret ) ) continue; - if(tempTurret.health <= 20000) + if ( tempTurret.health <= 20000 ) continue; - if (isDefined(tempTurret.carriedBy)) + + if ( isDefined( tempTurret.carriedBy ) ) continue; - if(isDefined(tempTurret.owner) && tempTurret.owner == self) + + if ( isDefined( tempTurret.owner ) && tempTurret.owner == self ) continue; - if(tempTurret.team == self.pers["team"] && level.teamBased) + + if ( tempTurret.team == self.pers["team"] && level.teamBased ) continue; - if(!bulletTracePassed(myEye, tempTurret.origin + (0, 0, 15), false, tempTurret)) + + if ( !bulletTracePassed( myEye, tempTurret.origin + ( 0, 0, 15 ), false, tempTurret ) ) continue; turret = tempTurret; } + turretsKeys = undefined; - if (!isDefined(turret)) + if ( !isDefined( turret ) ) return; forward = AnglesToForward( turret.angles ); @@ -3461,41 +3567,45 @@ bot_turret_think_loop() delta = self.origin - turret.origin; delta = VectorNormalize( delta ); - + dot = VectorDot( forward, delta ); facing = true; + if ( dot < 0.342 ) // cos 70 degrees facing = false; + if ( turret isStunned() ) facing = false; - if(self _hasPerk("specialty_coldblooded")) + + if ( self _hasPerk( "specialty_coldblooded" ) ) facing = false; if ( facing && !BulletTracePassed( myEye, turret.origin + ( 0, 0, 15 ), false, turret ) ) return; - + if ( !IsDefined( turret.bots ) ) turret.bots = 0; + if ( turret.bots >= 2 ) return; - - if(!facing && !self HasScriptGoal() && !self.bot_lock_goal) + + if ( !facing && !self HasScriptGoal() && !self.bot_lock_goal ) { - self SetScriptGoal(turret.origin, 32); - self thread bot_inc_bots(turret, true); + self SetScriptGoal( turret.origin, 32 ); + self thread bot_inc_bots( turret, true ); self thread turret_death_monitor( turret ); self thread bots_watch_touch_obj( turret ); - - if(self waittill_any_return("bad_path", "goal", "new_goal") != "new_goal") + + if ( self waittill_any_return( "bad_path", "goal", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); } - - if(!isDefined(turret)) + + if ( !isDefined( turret ) ) return; - self SetScriptEnemy( turret, (0, 0, 25) ); - self bot_turret_attack(turret); + self SetScriptEnemy( turret, ( 0, 0, 25 ) ); + self bot_turret_attack( turret ); self ClearScriptEnemy(); } @@ -3522,35 +3632,38 @@ bot_turret_think() bot_watch_stuck_on_crate_loop() { crates = getEntArray( "care_package", "targetname" ); + if ( crates.size == 0 ) return; crate = undefined; - for (i = crates.size - 1; i >= 0; i--) + + for ( i = crates.size - 1; i >= 0; i-- ) { tempCrate = crates[i]; - if (!isDefined(tempCrate)) + if ( !isDefined( tempCrate ) ) continue; - if (!isDefined(tempCrate.doingPhysics) || tempCrate.doingPhysics) + if ( !isDefined( tempCrate.doingPhysics ) || tempCrate.doingPhysics ) continue; - if (isDefined(crate) && DistanceSquared(crate.origin, self.origin) < DistanceSquared(tempCrate.origin, self.origin)) + if ( isDefined( crate ) && DistanceSquared( crate.origin, self.origin ) < DistanceSquared( tempCrate.origin, self.origin ) ) continue; crate = tempCrate; } - if (!isDefined(crate)) + if ( !isDefined( crate ) ) return; radius = GetDvarFloat( "player_useRadius" ); - if (DistanceSquared(crate.origin, self.origin) > radius * radius) + + if ( DistanceSquared( crate.origin, self.origin ) > radius * radius ) return; self.bot_stuck_on_carepackage = crate; - self notify("crate_physics_done"); + self notify( "crate_physics_done" ); } /* @@ -3560,13 +3673,13 @@ bot_watch_stuck_on_crate() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); - for (;;) + for ( ;; ) { wait 3; - if (self HasThreat()) + if ( self HasThreat() ) continue; self bot_watch_stuck_on_crate_loop(); @@ -3576,10 +3689,11 @@ bot_watch_stuck_on_crate() /* Bots will capture carepackages */ -bot_crate_think_loop(data) +bot_crate_think_loop( data ) { ret = "crate_physics_done"; - if(data.first) + + if ( data.first ) data.first = false; else ret = self waittill_any_timeout( randomintrange( 3, 5 ), "crate_physics_done" ); @@ -3587,56 +3701,59 @@ bot_crate_think_loop(data) myteam = self.pers[ "team" ]; crate = self.bot_stuck_on_carepackage; self.bot_stuck_on_carepackage = undefined; - if (!isDefined(crate)) + + if ( !isDefined( crate ) ) { if ( RandomInt( 100 ) < 20 && ret != "crate_physics_done" ) return; - + if ( self HasScriptGoal() || self.bot_lock_goal ) return; - if(self isDefusing() || self isPlanting()) + if ( self isDefusing() || self isPlanting() ) return; - if(self IsUsingRemote() || self BotIsFrozen()) + if ( self IsUsingRemote() || self BotIsFrozen() ) return; - if (self inLastStand()) + if ( self inLastStand() ) return; - + crates = getEntArray( "care_package", "targetname" ); + if ( crates.size == 0 ) return; - wantsClosest = randomint(2); + wantsClosest = randomint( 2 ); crate = undefined; - for (i = crates.size - 1; i >= 0; i--) + + for ( i = crates.size - 1; i >= 0; i-- ) { tempCrate = crates[i]; - if (!isDefined(tempCrate)) + if ( !isDefined( tempCrate ) ) continue; - if (!isDefined(tempCrate.doingPhysics) || tempCrate.doingPhysics) + if ( !isDefined( tempCrate.doingPhysics ) || tempCrate.doingPhysics ) continue; if ( !IsDefined( tempCrate.bots ) ) tempCrate.bots = 0; - + if ( tempCrate.bots >= 3 ) continue; - if (isDefined(crate)) + if ( isDefined( crate ) ) { - if (wantsClosest) + if ( wantsClosest ) { - if (DistanceSquared(crate.origin, self.origin) < DistanceSquared(tempCrate.origin, self.origin)) + if ( DistanceSquared( crate.origin, self.origin ) < DistanceSquared( tempCrate.origin, self.origin ) ) continue; } else { - if (maps\mp\killstreaks\_killstreaks::getStreakCost(crate.crateType) > maps\mp\killstreaks\_killstreaks::getStreakCost(tempCrate.crateType)) + if ( maps\mp\killstreaks\_killstreaks::getStreakCost( crate.crateType ) > maps\mp\killstreaks\_killstreaks::getStreakCost( tempCrate.crateType ) ) continue; } } @@ -3646,42 +3763,43 @@ bot_crate_think_loop(data) crates = undefined; - if (!isDefined(crate)) + if ( !isDefined( crate ) ) return; self.bot_lock_goal = true; radius = GetDvarFloat( "player_useRadius" ); - self SetScriptGoal(crate.origin, radius); - self thread bot_inc_bots(crate, true); - self thread bots_watch_touch_obj(crate); + self SetScriptGoal( crate.origin, radius ); + self thread bot_inc_bots( crate, true ); + self thread bots_watch_touch_obj( crate ); - path = self waittill_any_return("bad_path", "goal", "new_goal"); + path = self waittill_any_return( "bad_path", "goal", "new_goal" ); self.bot_lock_goal = false; - if (path != "new_goal") + if ( path != "new_goal" ) self ClearScriptGoal(); - if (path != "goal" || !isDefined(crate) || DistanceSquared(self.origin, crate.origin) > radius*radius) + if ( path != "goal" || !isDefined( crate ) || DistanceSquared( self.origin, crate.origin ) > radius * radius ) return; } self _DisableWeapon(); - self BotFreezeControls(true); + self BotFreezeControls( true ); waitTime = 3; - if (isDefined(crate.owner) && crate.owner == self) + + if ( isDefined( crate.owner ) && crate.owner == self ) waitTime = 0.5; - - crate waittill_notify_or_timeout("captured", waitTime); + + crate waittill_notify_or_timeout( "captured", waitTime ); self _EnableWeapon(); - self BotFreezeControls(false); + self BotFreezeControls( false ); - self notify("bot_force_check_switch"); + self notify( "bot_force_check_switch" ); - if (!isDefined(crate)) + if ( !isDefined( crate ) ) return; crate notify ( "captured", self ); @@ -3694,14 +3812,14 @@ bot_crate_think() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); - + level endon( "game_ended" ); + data = spawnStruct(); data.first = true; - + for ( ;; ) { - self bot_crate_think_loop(data); + self bot_crate_think_loop( data ); } } @@ -3710,62 +3828,63 @@ bot_crate_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 IsUsingRemote()) + if ( self isDefusing() || self isPlanting() ) return; - if (self InLastStand() && !self InFinalStand()) + if ( self IsUsingRemote() ) + return; + + if ( self InLastStand() && !self InFinalStand() ) return; curWeap = self GetCurrentWeapon(); - if (!maps\mp\gametypes\_weapons::isPrimaryWeapon(curWeap)) + if ( !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::isPrimaryWeapon(weapon)) + weapon = weaponslist[randomInt( weaponslist.size )]; + weaponslist = array_remove( weaponslist, weapon ); + + if ( !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; } @@ -3774,10 +3893,10 @@ doReloadCancel_loop() */ doReloadCancel() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - for (;;) + for ( ;; ) { self doReloadCancel_loop(); } @@ -3786,95 +3905,99 @@ doReloadCancel() /* Bots will think to switch 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()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) return; - if (self IsUsingRemote()) + if ( self isDefusing() || self isPlanting() ) return; - if (self InLastStand() && !self InFinalStand()) + if ( self IsUsingRemote() ) + return; + + if ( self InLastStand() && !self InFinalStand() ) return; curWeap = self GetCurrentWeapon(); hasTarget = self hasThreat(); - if(hasTarget) + + if ( hasTarget ) { threat = self getThreat(); rocketAmmo = self getRocketAmmo(); - - if(entIsVehicle(threat) && isDefined(rocketAmmo)) + + if ( entIsVehicle( threat ) && isDefined( rocketAmmo ) ) { - if (curWeap != rocketAmmo) - self thread ChangeToWeapon(rocketAmmo); + if ( curWeap != rocketAmmo ) + self thread ChangeToWeapon( rocketAmmo ); + return; } } - if (self HasBotJavelinLocation() && self GetAmmoCount("javelin_mp")) + if ( self HasBotJavelinLocation() && self GetAmmoCount( "javelin_mp" ) ) { - if (curWeap != "javelin_mp") - self thread ChangeToWeapon("javelin_mp"); + if ( curWeap != "javelin_mp" ) + self thread ChangeToWeapon( "javelin_mp" ); return; } - if (isDefined(self.bot_oma_class)) + if ( isDefined( self.bot_oma_class ) ) { - if (curWeap != "onemanarmy_mp") - self thread ChangeToWeapon("onemanarmy_mp"); + if ( curWeap != "onemanarmy_mp" ) + self thread ChangeToWeapon( "onemanarmy_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 != "stinger_mp" && curWeap != "javelin_mp" && curWeap != "onemanarmy_mp") + if ( curWeap != "none" && self getAmmoCount( curWeap ) && curWeap != "stinger_mp" && curWeap != "javelin_mp" && curWeap != "onemanarmy_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 getweaponslistall(); 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 (!isWeaponPrimary(weapon)) + + if ( !isWeaponPrimary( weapon ) ) continue; - - if(curWeap == weapon || weapon == "none" || weapon == "" || weapon == "javelin_mp" || weapon == "stinger_mp" || weapon == "onemanarmy_mp") + + if ( curWeap == weapon || weapon == "none" || weapon == "" || weapon == "javelin_mp" || weapon == "stinger_mp" || weapon == "onemanarmy_mp" ) continue; - + weap = weapon; break; } - - if(weap == "") + + if ( weap == "" ) return; - - self thread ChangeToWeapon(weap); + + self thread ChangeToWeapon( weap ); } /* @@ -3882,16 +4005,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 ); } } @@ -3901,34 +4024,36 @@ bot_weapon_think() bot_target_vehicle_loop() { rocketAmmo = self getRocketAmmo(); - if(!isDefined(rocketAmmo) && self BotGetRandom() < 90) + + if ( !isDefined( rocketAmmo ) && self BotGetRandom() < 90 ) return; - if (isDefined(rocketAmmo) && rocketAmmo == "javelin_mp" && self isEMPed()) + if ( isDefined( rocketAmmo ) && rocketAmmo == "javelin_mp" && self isEMPed() ) return; targets = maps\mp\_stinger::GetTargetList(); - if (!targets.size) + if ( !targets.size ) return; lockOnAmmo = self getLockonAmmo(); myEye = self GetEye(); target = undefined; - for (i = targets.size - 1; i >= 0; i--) + + for ( i = targets.size - 1; i >= 0; i-- ) { tempTarget = targets[i]; - if (isDefined(tempTarget.owner) && tempTarget.owner == self) + if ( isDefined( tempTarget.owner ) && tempTarget.owner == self ) continue; - if(!bulletTracePassed( myEye, tempTarget.origin, false, tempTarget )) + if ( !bulletTracePassed( myEye, tempTarget.origin, false, tempTarget ) ) continue; - if (tempTarget.health <= 0) + if ( tempTarget.health <= 0 ) continue; - if (tempTarget.classname != "script_vehicle" && !isDefined(lockOnAmmo)) + if ( tempTarget.classname != "script_vehicle" && !isDefined( lockOnAmmo ) ) continue; target = tempTarget; @@ -3936,13 +4061,13 @@ bot_target_vehicle_loop() targets = undefined; - if (!isDefined(target)) + if ( !isDefined( target ) ) return; - self SetScriptEnemy( target, (0, 0, 0) ); + self SetScriptEnemy( target, ( 0, 0, 0 ) ); self bot_attack_vehicle( target ); self ClearScriptEnemy(); - self notify("bot_force_check_switch"); + self notify( "bot_force_check_switch" ); } /* @@ -3950,20 +4075,20 @@ bot_target_vehicle_loop() */ bot_target_vehicle() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - for (;;) + for ( ;; ) { - wait randomIntRange(2, 4); + wait randomIntRange( 2, 4 ); - if(self.pers["bots"]["skill"]["base"] <= 1) + if ( self.pers["bots"]["skill"]["base"] <= 1 ) continue; - if(self HasScriptEnemy()) + if ( self HasScriptEnemy() ) continue; - if (self IsUsingRemote()) + if ( self IsUsingRemote() ) continue; self bot_target_vehicle_loop(); @@ -3975,13 +4100,13 @@ bot_target_vehicle() */ bot_attack_vehicle( target ) { - target endon("death"); + target endon( "death" ); wait_time = RandomIntRange( 7, 10 ); for ( i = 0; i < wait_time; i++ ) { - self notify("bot_force_check_switch"); + self notify( "bot_force_check_switch" ); wait( 1 ); if ( !IsDefined( target ) ) @@ -3998,34 +4123,41 @@ getKillstreakTargetLocation() { location = undefined; 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 == 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(!isReallyAlive(player)) + + if ( !isReallyAlive( player ) ) continue; - if(player _hasPerk("specialty_coldblooded")) + + if ( player _hasPerk( "specialty_coldblooded" ) ) continue; - if(!bulletTracePassed(player.origin, player.origin+(0,0,2048), false, player) && self.pers["bots"]["skill"]["base"] > 3) + + if ( !bulletTracePassed( player.origin, player.origin + ( 0, 0, 2048 ), false, player ) && self.pers["bots"]["skill"]["base"] > 3 ) continue; - + players[players.size] = player; } - - target = random(players); - if(isDefined(target)) - location = target.origin + (randomIntRange((8-self.pers["bots"]["skill"]["base"])*-75, (8-self.pers["bots"]["skill"]["base"])*75), randomIntRange((8-self.pers["bots"]["skill"]["base"])*-75, (8-self.pers["bots"]["skill"]["base"])*75), 0); - else if(self.pers["bots"]["skill"]["base"] <= 3) - location = self.origin + (randomIntRange(-512, 512), randomIntRange(-512, 512), 0); + target = random( players ); + + if ( isDefined( target ) ) + location = target.origin + ( randomIntRange( ( 8 - self.pers["bots"]["skill"]["base"] ) * -75, ( 8 - self.pers["bots"]["skill"]["base"] ) * 75 ), randomIntRange( ( 8 - self.pers["bots"]["skill"]["base"] ) * -75, ( 8 - self.pers["bots"]["skill"]["base"] ) * 75 ), 0 ); + else if ( self.pers["bots"]["skill"]["base"] <= 3 ) + location = self.origin + ( randomIntRange( -512, 512 ), randomIntRange( -512, 512 ), 0 ); return location; } @@ -4033,17 +4165,17 @@ getKillstreakTargetLocation() /* Clears remote usage when bot dies */ -clear_remote_on_death(isac130) +clear_remote_on_death( isac130 ) { - self endon("bot_clear_remote_on_death"); - level endon("game_ended"); + self endon( "bot_clear_remote_on_death" ); + level endon( "game_ended" ); - self waittill_either("death", "disconnect"); + self waittill_either( "death", "disconnect" ); - if (isDefined(isac130) && isac130) + if ( isDefined( isac130 ) && isac130 ) level.ac130InUse = false; - if (isDefined(self)) + if ( isDefined( self ) ) self ClearUsingRemote(); } @@ -4052,20 +4184,20 @@ clear_remote_on_death(isac130) */ isAnyEnemyPlanes() { - if (!isDefined(level.harriers)) + if ( !isDefined( level.harriers ) ) return false; - for (i = 0; i < level.harriers.size; i++) + for ( i = 0; i < level.harriers.size; i++ ) { plane = level.harriers[i]; - if (!isDefined(plane)) + if ( !isDefined( plane ) ) continue; - if (level.teamBased && plane.team == self.team) + if ( level.teamBased && plane.team == self.team ) continue; - if (isDefined(plane.owner) && plane.owner == self) + if ( isDefined( plane.owner ) && plane.owner == self ) continue; return true; @@ -4077,157 +4209,159 @@ isAnyEnemyPlanes() /* Bots think to use killstreaks */ -bot_killstreak_think_loop(data) +bot_killstreak_think_loop( data ) { - if (data.doFastContinue) + if ( data.doFastContinue ) data.doFastContinue = false; else { - wait randomIntRange(1, 3); + wait randomIntRange( 1, 3 ); } if ( !isDefined( self.pers["killstreaks"][0] ) ) return; - if(self BotIsFrozen()) - return; - - if(self HasThreat() || self HasBotJavelinLocation()) - return; - - if(self isDefusing() || self isPlanting()) + if ( self BotIsFrozen() ) return; - if (self isEMPed()) + if ( self HasThreat() || self HasBotJavelinLocation() ) return; - if (self IsUsingRemote()) + if ( self isDefusing() || self isPlanting() ) return; - if (self InLastStand() && !self InFinalStand()) + if ( self isEMPed() ) + return; + + if ( self IsUsingRemote() ) + return; + + if ( self InLastStand() && !self InFinalStand() ) return; - if (isDefined(self.isCarrying) && self.isCarrying) - self notify("place_sentry"); + if ( isDefined( self.isCarrying ) && self.isCarrying ) + self notify( "place_sentry" ); curWeap = self GetCurrentWeapon(); - if (isSubStr(curWeap, "airdrop_")) - self thread BotPressAttack(0.05); + + if ( isSubStr( curWeap, "airdrop_" ) ) + self thread BotPressAttack( 0.05 ); streakName = self.pers["killstreaks"][0].streakName; - if (level.inGracePeriod && maps\mp\killstreaks\_killstreaks::deadlyKillstreak(streakName)) + if ( level.inGracePeriod && maps\mp\killstreaks\_killstreaks::deadlyKillstreak( streakName ) ) return; ksWeap = maps\mp\killstreaks\_killstreaks::getKillstreakWeapon( streakName ); - if (curWeap == "none" || !isWeaponPrimary(curWeap)) + if ( curWeap == "none" || !isWeaponPrimary( curWeap ) ) curWeap = self GetLastWeapon(); lifeId = self.pers["killstreaks"][0].lifeId; - if (!isDefined(lifeId)) + + if ( !isDefined( lifeId ) ) lifeId = -1; - if (isStrStart(streakName, "helicopter_") && self isAnyEnemyPlanes() && self.pers["bots"]["skill"]["base"] > 3) + if ( isStrStart( streakName, "helicopter_" ) && self isAnyEnemyPlanes() && self.pers["bots"]["skill"]["base"] > 3 ) return; - if (maps\mp\killstreaks\_killstreaks::isRideKillstreak(streakName) || maps\mp\killstreaks\_killstreaks::isCarryKillstreak(streakName)) + if ( maps\mp\killstreaks\_killstreaks::isRideKillstreak( streakName ) || maps\mp\killstreaks\_killstreaks::isCarryKillstreak( streakName ) ) { - if (self inLastStand()) + if ( self inLastStand() ) return; - if (lifeId == self.deaths && !self HasScriptGoal() && !self.bot_lock_goal && streakName != "sentry" && !self nearAnyOfWaypoints(128, getWaypointsOfType("camp"))) + if ( lifeId == self.deaths && !self HasScriptGoal() && !self.bot_lock_goal && streakName != "sentry" && !self nearAnyOfWaypoints( 128, getWaypointsOfType( "camp" ) ) ) { - campSpot = getWaypointForIndex(random(self waypointsNear(getWaypointsOfType("camp"), 1024))); + campSpot = getWaypointForIndex( random( self waypointsNear( getWaypointsOfType( "camp" ), 1024 ) ) ); - if (isDefined(campSpot)) + if ( isDefined( campSpot ) ) { - self SetScriptGoal(campSpot.origin, 16); + self SetScriptGoal( campSpot.origin, 16 ); - if (self waittill_any_return("new_goal", "goal", "bad_path") != "new_goal") + if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" ) self ClearScriptGoal(); data.doFastContinue = true; return; } } - - if (streakName == "sentry") + + if ( streakName == "sentry" ) { - if (self HasScriptAimPos()) + if ( self HasScriptAimPos() ) return; myEye = self GetEye(); angles = self GetPlayerAngles(); - forwardTrace = bulletTrace(myEye, myEye + AnglesToForward(angles)*1024, false, self); + forwardTrace = bulletTrace( myEye, myEye + AnglesToForward( angles ) * 1024, false, self ); - if (DistanceSquared(self.origin, forwardTrace["position"]) < 1000*1000 && self.pers["bots"]["skill"]["base"] > 3) + if ( DistanceSquared( self.origin, forwardTrace["position"] ) < 1000 * 1000 && self.pers["bots"]["skill"]["base"] > 3 ) return; - self BotStopMoving(true); - self SetScriptAimPos(forwardTrace["position"]); - - if (!self changeToWeapon(ksWeap)) + self BotStopMoving( true ); + self SetScriptAimPos( forwardTrace["position"] ); + + if ( !self changeToWeapon( ksWeap ) ) { - self BotStopMoving(false); + self BotStopMoving( false ); self ClearScriptAimPos(); return; } wait 1; - self notify("place_sentry"); + self notify( "place_sentry" ); wait 0.05; - self notify("cancel_sentry"); + self notify( "cancel_sentry" ); wait 0.5; - self thread changeToWeapon(curWeap); + self thread changeToWeapon( curWeap ); - self BotStopMoving(false); + self BotStopMoving( false ); self ClearScriptAimPos(); } - else if (streakName == "predator_missile") + else if ( streakName == "predator_missile" ) { location = self getKillstreakTargetLocation(); - if(!isDefined(location)) + if ( !isDefined( location ) ) return; self setUsingRemote( "remotemissile" ); self thread clear_remote_on_death(); - self BotStopMoving(true); + self BotStopMoving( true ); - if (!self changeToWeapon(ksWeap)) + if ( !self changeToWeapon( ksWeap ) ) { self ClearUsingRemote(); - self notify("bot_clear_remote_on_death"); - self BotStopMoving(false); + self notify( "bot_clear_remote_on_death" ); + self BotStopMoving( false ); return; } wait 1; - self notify("bot_clear_remote_on_death"); - self BotStopMoving(false); + self notify( "bot_clear_remote_on_death" ); + self BotStopMoving( false ); - if (self isEMPed()) + if ( self isEMPed() ) { self ClearUsingRemote(); - self thread changeToWeapon(curWeap); + self thread changeToWeapon( curWeap ); return; } - self BotFreezeControls(true); - + self BotFreezeControls( true ); + self maps\mp\killstreaks\_killstreaks::usedKillstreak( "predator_missile", true ); self maps\mp\killstreaks\_killstreaks::shuffleKillStreaksFILO( "predator_missile" ); self maps\mp\killstreaks\_killstreaks::giveOwnedKillstreakItem(); - rocket = MagicBullet( "remotemissile_projectile_mp", self.origin + (0.0,0.0,7000.0 - (self.pers["bots"]["skill"]["base"] * 400)), location, self ); + rocket = MagicBullet( "remotemissile_projectile_mp", self.origin + ( 0.0, 0.0, 7000.0 - ( self.pers["bots"]["skill"]["base"] * 400 ) ), location, self ); rocket.lifeId = lifeId; rocket.type = "remote"; - + rocket thread maps\mp\gametypes\_weapons::AddMissileToSightTraces( self.pers["team"] ); rocket thread maps\mp\killstreaks\_remotemissile::handleDamage(); thread maps\mp\killstreaks\_remotemissile::MissileEyes( self, rocket ); @@ -4235,68 +4369,68 @@ bot_killstreak_think_loop(data) self waittill( "stopped_using_remote" ); wait 1; - self BotFreezeControls(false); - self thread changeToWeapon(curWeap); + self BotFreezeControls( false ); + self thread changeToWeapon( curWeap ); } - else if (streakName == "ac130") + else if ( streakName == "ac130" ) { if ( isDefined( level.ac130player ) || level.ac130InUse ) return; - self BotStopMoving(true); - self changeToWeapon(ksWeap); - self BotStopMoving(false); + self BotStopMoving( true ); + self changeToWeapon( ksWeap ); + self BotStopMoving( false ); wait 3; if ( !isDefined( level.ac130player ) || level.ac130player != self ) - self thread changeToWeapon(curWeap); + self thread changeToWeapon( curWeap ); } - else if (streakName == "helicopter_minigun") + else if ( streakName == "helicopter_minigun" ) { - if (isDefined( level.chopper )) + if ( isDefined( level.chopper ) ) return; - self BotStopMoving(true); - self changeToWeapon(ksWeap); - self BotStopMoving(false); + self BotStopMoving( true ); + self changeToWeapon( ksWeap ); + self BotStopMoving( false ); wait 3; if ( !isDefined( level.chopper ) || !isDefined( level.chopper.gunner ) || level.chopper.gunner != self ) - self thread changeToWeapon(curWeap); + self thread changeToWeapon( curWeap ); } } else { - if (streakName == "airdrop_mega" || streakName == "airdrop_sentry_minigun" || streakName == "airdrop") + if ( streakName == "airdrop_mega" || streakName == "airdrop_sentry_minigun" || streakName == "airdrop" ) { - if (self HasScriptAimPos()) + if ( self HasScriptAimPos() ) return; - if (streakName != "airdrop_mega" && level.littleBirds > 2) + if ( streakName != "airdrop_mega" && level.littleBirds > 2 ) return; - if(!bulletTracePassed(self.origin, self.origin+(0,0,2048), false, self) && self.pers["bots"]["skill"]["base"] > 3) + if ( !bulletTracePassed( self.origin, self.origin + ( 0, 0, 2048 ), false, self ) && self.pers["bots"]["skill"]["base"] > 3 ) return; myEye = self GetEye(); angles = self GetPlayerAngles(); - forwardTrace = bulletTrace(myEye, myEye + AnglesToForward(angles)*256, false, self); + forwardTrace = bulletTrace( myEye, myEye + AnglesToForward( angles ) * 256, false, self ); - if (DistanceSquared(self.origin, forwardTrace["position"]) < 96*96 && self.pers["bots"]["skill"]["base"] > 3) + if ( DistanceSquared( self.origin, forwardTrace["position"] ) < 96 * 96 && self.pers["bots"]["skill"]["base"] > 3 ) return; - if (!bulletTracePassed(forwardTrace["position"], forwardTrace["position"]+(0,0,2048), false, self) && self.pers["bots"]["skill"]["base"] > 3) + if ( !bulletTracePassed( forwardTrace["position"], forwardTrace["position"] + ( 0, 0, 2048 ), false, self ) && self.pers["bots"]["skill"]["base"] > 3 ) return; - self BotStopMoving(true); - self SetScriptAimPos(forwardTrace["position"]); - - if (!self changeToWeapon(ksWeap)) + self BotStopMoving( true ); + self SetScriptAimPos( forwardTrace["position"] ); + + if ( !self changeToWeapon( ksWeap ) ) { - self BotStopMoving(false); + self BotStopMoving( false ); self ClearScriptAimPos(); return; } @@ -4305,77 +4439,79 @@ bot_killstreak_think_loop(data) ret = self waittill_any_timeout( 5, "grenade_fire" ); - self notify("stop_firing_weapon"); - self thread changeToWeapon(curWeap); + self notify( "stop_firing_weapon" ); + self thread changeToWeapon( curWeap ); - if (ret == "timeout") + if ( ret == "timeout" ) { - self BotStopMoving(false); + self BotStopMoving( false ); self ClearScriptAimPos(); return; } - if (randomInt(100) < 80 && !self HasScriptGoal() && !self.bot_lock_goal) + if ( randomInt( 100 ) < 80 && !self HasScriptGoal() && !self.bot_lock_goal ) self waittill_any_timeout( 15, "crate_physics_done", "new_goal" ); - self BotStopMoving(false); + self BotStopMoving( false ); self ClearScriptAimPos(); } else { - if (streakName == "harrier_airstrike" && level.planes > 1) + if ( streakName == "harrier_airstrike" && level.planes > 1 ) return; - if (streakName == "nuke" && isDefined( level.nukeIncoming )) + if ( streakName == "nuke" && isDefined( level.nukeIncoming ) ) return; - if (streakName == "counter_uav" && self.pers["bots"]["skill"]["base"] > 3 && ((level.teamBased && level.activeCounterUAVs[self.team]) || (!level.teamBased && level.activeCounterUAVs[self.guid]))) + if ( streakName == "counter_uav" && self.pers["bots"]["skill"]["base"] > 3 && ( ( level.teamBased && level.activeCounterUAVs[self.team] ) || ( !level.teamBased && level.activeCounterUAVs[self.guid] ) ) ) return; - if (streakName == "uav" && self.pers["bots"]["skill"]["base"] > 3 && ((level.teamBased && (level.activeUAVs[self.team] || level.activeCounterUAVs[level.otherTeam[self.team]])) || (!level.teamBased && (level.activeUAVs[self.guid] || self.isRadarBlocked)))) + if ( streakName == "uav" && self.pers["bots"]["skill"]["base"] > 3 && ( ( level.teamBased && ( level.activeUAVs[self.team] || level.activeCounterUAVs[level.otherTeam[self.team]] ) ) || ( !level.teamBased && ( level.activeUAVs[self.guid] || self.isRadarBlocked ) ) ) ) return; - if (streakName == "emp" && self.pers["bots"]["skill"]["base"] > 3 && ((level.teamBased && level.teamEMPed[level.otherTeam[self.team]]) || (!level.teamBased && isDefined( level.empPlayer )))) + if ( streakName == "emp" && self.pers["bots"]["skill"]["base"] > 3 && ( ( level.teamBased && level.teamEMPed[level.otherTeam[self.team]] ) || ( !level.teamBased && isDefined( level.empPlayer ) ) ) ) return; location = undefined; directionYaw = undefined; - switch (streakName) + + switch ( streakName ) { case "harrier_airstrike": case "stealth_airstrike": case "precision_airstrike": location = self getKillstreakTargetLocation(); - directionYaw = randomInt(360); + directionYaw = randomInt( 360 ); - if (!isDefined(location)) + if ( !isDefined( location ) ) return; + case "helicopter": case "helicopter_flares": case "uav": case "nuke": case "counter_uav": case "emp": - self BotStopMoving(true); - - if (self changeToWeapon(ksWeap)) + self BotStopMoving( true ); + + if ( self changeToWeapon( ksWeap ) ) { wait 1; - if (isDefined(location)) + if ( isDefined( location ) ) { - self BotFreezeControls(true); + self BotFreezeControls( true ); self notify( "confirm_location", location, directionYaw ); wait 1; - self BotFreezeControls(false); + self BotFreezeControls( false ); } - self thread changeToWeapon(curWeap); + self thread changeToWeapon( curWeap ); } - self BotStopMoving(false); + self BotStopMoving( false ); break; } } @@ -4387,16 +4523,16 @@ bot_killstreak_think_loop(data) */ bot_killstreak_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_killstreak_think_loop(data); + self bot_killstreak_think_loop( data ); } } @@ -4405,7 +4541,7 @@ bot_killstreak_think() */ bot_dom_spawn_kill_think_loop() { - myTeam = self.pers[ "team" ]; + myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); myFlagCount = maps\mp\gametypes\dom::getTeamFlagCount( myTeam ); @@ -4413,11 +4549,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 ) @@ -4425,18 +4562,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(); } @@ -4454,13 +4591,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(); } } @@ -4468,7 +4605,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" ); @@ -4476,15 +4613,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" ); } /* @@ -4494,27 +4631,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(); } @@ -4532,10 +4670,10 @@ bot_dom_def_think() for ( ;; ) { wait( randomintrange( 1, 3 ) ); - + if ( randomint( 100 ) < 35 ) continue; - + if ( self HasScriptGoal() || self.bot_lock_goal ) continue; @@ -4546,26 +4684,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" ); } /* @@ -4573,7 +4711,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 ); @@ -4583,7 +4721,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 ) { @@ -4593,7 +4731,7 @@ bot_dom_cap_think_loop() else if ( myFlagCount == otherFlagCount ) { if ( randomint( 100 ) < 35 ) - return; + return; } else if ( myFlagCount > otherFlagCount ) { @@ -4604,6 +4742,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 ) @@ -4612,51 +4751,51 @@ bot_dom_cap_think_loop() flags[flags.size] = level.flags[i]; } - if (randomInt(100) > 30) + if ( randomInt( 100 ) > 30 ) { for ( i = 0; i < flags.size; i++ ) { - if ( !isDefined(flag) || DistanceSquared(self.origin,level.flags[i].origin) < DistanceSquared(self.origin,flag.origin) ) + if ( !isDefined( flag ) || DistanceSquared( self.origin, level.flags[i].origin ) < DistanceSquared( self.origin, flag.origin ) ) flag = level.flags[i]; } } - else if (flags.size) + else if ( flags.size ) { - flag = random(flags); + flag = random( flags ); } - if ( !isDefined(flag) ) + if ( !isDefined( flag ) ) return; - + self.bot_lock_goal = true; self SetScriptGoal( flag.origin, 64 ); - - self thread bot_dom_go_cap_flag(flag, myteam); + + self thread bot_dom_go_cap_flag( flag, myteam ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - - if (event != "new_goal") + + if ( event != "new_goal" ) self ClearScriptGoal(); - if (event != "goal") + if ( event != "goal" ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - while ( flag maps\mp\gametypes\dom::getFlagTeam() != myTeam && self isTouching(flag) ) + while ( flag maps\mp\gametypes\dom::getFlagTeam() != myTeam && self isTouching( flag ) ) { cur = flag.useObj.curProgress; wait 0.5; - - if(flag.useObj.curProgress == cur) + + if ( flag.useObj.curProgress == cur ) break;//some enemy is near us, kill him } self ClearScriptGoal(); - + self.bot_lock_goal = false; } @@ -4667,20 +4806,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(); @@ -4690,32 +4829,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" ); } /* @@ -4725,90 +4864,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(); } } @@ -4827,16 +4967,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(); @@ -4846,7 +4986,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" ); @@ -4854,54 +4994,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" ); } /* @@ -4911,181 +5051,188 @@ bot_sab_loop() { myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); - + bomb = level.sabBomb; bombteam = bomb.ownerTeam; carrier = bomb.carrier; - timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining()/1000; - + timeleft = maps\mp\gametypes\_gamelogic::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 = getTimePassed()/1000; - - if(timepassed < 120 && timeleft >= 90 && randomInt(100) < 98) + timepassed = 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_coldblooded" )) + + if ( carrier hasPerk( "specialty_coldblooded" ) ) return; - + origin = carrier.origin; - + self SetScriptGoal( origin, 64 ); - self thread bot_escort_obj(bomb, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + self 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; } @@ -5093,40 +5240,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; } @@ -5139,7 +5286,7 @@ bot_sab() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "sab" ) return; @@ -5147,19 +5294,19 @@ bot_sab() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || self.bot_lock_goal ) { continue; } - - if(!isDefined(level.sabBomb)) - continue; - - if(!isDefined(level.bombZones) || !level.bombZones.size) + + 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(); @@ -5169,145 +5316,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\_gamelogic::getTimeRemaining()/1000; - - if(timeleft >= 90) + timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000; + + if ( timeleft >= 90 ) return; - + // check for a bomb carrier, and camp the bomb - if(!level.multiBomb && isDefined(level.sdBomb)) + if ( !level.multiBomb && isDefined( level.sdBomb ) ) { bomb = level.sdBomb; carrier = level.sdBomb.carrier; - - if(!isDefined(carrier)) + + if ( !isDefined( carrier ) ) { - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+5 ); - + origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2] + 5 ); + //hang around the bomb - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) return; - + self SetScriptGoal( origin, 256 ); - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + self thread bot_get_obj( bomb ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } } - + // pick a site to protect - if(!isDefined(level.bombZones) || !level.bombZones.size) + if ( !isDefined( level.bombZones ) || !level.bombZones.size ) return; - + sites = []; - for(i = 0; i < level.bombZones.size; i++) + + for ( i = 0; i < level.bombZones.size; i++ ) { sites[sites.size] = level.bombZones[i]; } - - if(!sites.size) + + if ( !sites.size ) return; - - if (data.rand > 50) - site = self bot_array_nearest_curorigin(sites); + + if ( data.rand > 50 ) + site = self bot_array_nearest_curorigin( sites ); else - site = random(sites); - - if(!isDefined(site)) + site = random( sites ); + + if ( !isDefined( site ) ) return; - - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+5 ); - - if(site isInUse())//somebody is planting + + origin = ( site.curorigin[0] + 50, site.curorigin[1] + 50, site.curorigin[2] + 5 ); + + if ( site isInUse() ) //somebody is planting { self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - self thread bot_defend_site(site); + self thread bot_defend_site( site ); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); - + self.bot_lock_goal = false; return; } - + //else hang around the site - if(DistanceSquared(origin, self.origin) <= 1024*1024) + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) return; - + self.bot_lock_goal = true; self SetScriptGoal( origin, 256 ); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); - + self.bot_lock_goal = false; return; } - + // bomb is planted, we need to defuse - if(!isDefined(level.defuseObject)) + if ( !isDefined( level.defuseObject ) ) return; - + defuse = level.defuseObject; - - if(!isDefined(defuse.bots)) + + if ( !isDefined( defuse.bots ) ) defuse.bots = 0; - - origin = ( defuse.curorigin[0], defuse.curorigin[1], defuse.curorigin[2]+5 ); - + + origin = ( defuse.curorigin[0], defuse.curorigin[1], defuse.curorigin[2] + 5 ); + // someone is going to go defuse ,lets just hang around - if(defuse.bots > 1) + if ( defuse.bots > 1 ) { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) return; - + self SetScriptGoal( origin, 256 ); - self thread bot_go_defuse(defuse); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + self thread bot_go_defuse( defuse ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } // lets defuse self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); - self thread bot_inc_bots(defuse); - self thread bot_go_defuse(defuse); + self thread bot_inc_bots( defuse ); + self thread bot_go_defuse( defuse ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - if (event != "new_goal") + if ( event != "new_goal" ) self ClearScriptGoal(); - - if(event != "goal" || !level.bombPlanted || defuse isInUse() || !self isTouching(defuse.trigger) || self InLastStand() || self HasThreat()) + + if ( event != "goal" || !level.bombPlanted || defuse isInUse() || !self isTouching( defuse.trigger ) || self InLastStand() || self HasThreat() ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - - self bot_use_bomb_thread(defuse); + + self bot_use_bomb_thread( defuse ); wait 1; self ClearScriptGoal(); self.bot_lock_goal = false; @@ -5320,12 +5470,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(); @@ -5334,29 +5484,29 @@ bot_sd_defenders() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || 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 IsUsingRemote() || self.bot_lock_goal ) { return; @@ -5364,160 +5514,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\_gamelogic::getTimeRemaining()/1000; - timepassed = getTimePassed()/1000; - + + timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000; + timepassed = getTimePassed() / 1000; + //dont have a bomb - if(!self IsBombCarrier() && !level.multiBomb) + if ( !self IsBombCarrier() && !level.multiBomb ) { - if(!isDefined(level.sdBomb)) + if ( !isDefined( level.sdBomb ) ) return; - + bomb = level.sdBomb; carrier = level.sdBomb.carrier; - + //bomb is picked up - if(isDefined(carrier)) + if ( isDefined( carrier ) ) { //escort the bomb carrier - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - + origin = carrier.origin; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) return; - + self SetScriptGoal( origin, 256 ); - self thread bot_escort_obj(bomb, carrier); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + self thread bot_escort_obj( bomb, carrier ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } - - if(!isDefined(bomb.bots)) + + if ( !isDefined( bomb.bots ) ) bomb.bots = 0; - - origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2]+5 ); - + + origin = ( bomb.curorigin[0], bomb.curorigin[1], bomb.curorigin[2] + 5 ); + //hang around the bomb if other is going to go get it - if(bomb.bots > 1) + if ( bomb.bots > 1 ) { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - - if(DistanceSquared(origin, self.origin) <= 1024*1024) + + if ( DistanceSquared( origin, self.origin ) <= 1024 * 1024 ) return; - + self SetScriptGoal( origin, 256 ); - - self thread bot_get_obj(bomb); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + + self thread bot_get_obj( bomb ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } // go get the bomb self.bot_lock_goal = true; self SetScriptGoal( origin, 64 ); - self thread bot_inc_bots(bomb); - self thread bot_get_obj(bomb); + self thread bot_inc_bots( bomb ); + self thread bot_get_obj( bomb ); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); self.bot_lock_goal = false; return; } - + // check if to plant - if(timepassed < 120 && timeleft >= 90 && randomInt(100) < 98) + if ( timepassed < 120 && timeleft >= 90 && randomInt( 100 ) < 98 ) return; - - if(!isDefined(level.bombZones) || !level.bombZones.size) + + if ( !isDefined( level.bombZones ) || !level.bombZones.size ) return; - + sites = []; - for(i = 0; i < level.bombZones.size; i++) + + for ( i = 0; i < level.bombZones.size; i++ ) { sites[sites.size] = level.bombZones[i]; } - - if(!sites.size) + + if ( !sites.size ) return; - - if(data.rand > 50) - plant = self bot_array_nearest_curorigin(sites); + + if ( data.rand > 50 ) + plant = self bot_array_nearest_curorigin( sites ); else - plant = random(sites); - - if(!isDefined(plant)) + plant = random( sites ); + + if ( !isDefined( plant ) ) return; - - origin = ( plant.curorigin[0]+50, plant.curorigin[1]+50, plant.curorigin[2]+5 ); - + + origin = ( plant.curorigin[0] + 50, plant.curorigin[1] + 50, plant.curorigin[2] + 5 ); + self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); - self thread bot_go_plant(plant); + self thread bot_go_plant( plant ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - if (event != "new_goal") + if ( event != "new_goal" ) self ClearScriptGoal(); - - if(event != "goal" || level.bombPlanted || plant.visibleTeam == "none" || !self isTouching(plant.trigger) || self InLastStand() || self HasThreat() || plant IsInUse()) + + if ( event != "goal" || level.bombPlanted || plant.visibleTeam == "none" || !self isTouching( plant.trigger ) || self InLastStand() || self HasThreat() || plant IsInUse() ) { self.bot_lock_goal = false; return; } - + self SetScriptGoal( self.origin, 64 ); - - self bot_use_bomb_thread(plant); + + self bot_use_bomb_thread( plant ); wait 1; - + self ClearScriptGoal(); self.bot_lock_goal = false; } @@ -5529,12 +5682,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(); @@ -5543,7 +5696,7 @@ bot_sd_attackers() for ( ;; ) { - self bot_sd_attackers_loop(data); + self bot_sd_attackers_loop( data ); } } @@ -5554,119 +5707,124 @@ bot_cap_loop() { myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); - + myflag = level.teamFlags[myteam]; myzone = level.capZones[myteam]; - + theirflag = level.teamFlags[otherTeam]; theirzone = level.capZones[otherTeam]; - - if(!myflag maps\mp\gametypes\_gameobjects::isHome()) + + if ( !myflag maps\mp\gametypes\_gameobjects::isHome() ) { 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::isHome() && randomint(100) < 50) - { //take their flag - self bot_cap_get_flag(theirflag); + if ( theirflag maps\mp\gametypes\_gameobjects::isHome() && 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_coldblooded" )) + if ( carrier hasPerk( "specialty_coldblooded" ) ) 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(); } } @@ -5678,7 +5836,7 @@ bot_cap() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "ctf" ) return; @@ -5686,16 +5844,16 @@ bot_cap() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || self.bot_lock_goal ) { continue; } - - if(!isDefined(level.capZones)) + + if ( !isDefined( level.capZones ) ) continue; - - if(!isDefined(level.teamFlags)) + + if ( !isDefined( level.teamFlags ) ) continue; self bot_cap_loop(); @@ -5705,53 +5863,54 @@ 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 go plant the demo bomb */ -bot_dem_go_plant(plant) +bot_dem_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 0.5; - if ((plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted)) + if ( ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) ) break; - if (self isTouching(plant.trigger)) + if ( self isTouching( plant.trigger ) ) break; } - - if((plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted)) - self notify("bad_path"); + + if ( ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) ) + self notify( "bad_path" ); else - self notify("goal"); + self notify( "goal" ); } /* @@ -5761,23 +5920,23 @@ bot_dem_attack_spawnkill() { 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" ); - + l1 = level.bombAPlanted; l2 = level.bombBPlanted; - for (;;) + for ( ;; ) { wait 0.5; - if (l1 != level.bombAPlanted || l2 != level.bombBPlanted) + if ( l1 != level.bombAPlanted || l2 != level.bombBPlanted ) break; } - - self notify("bad_path"); + + self notify( "bad_path" ); } /* @@ -5787,185 +5946,190 @@ bot_dem_attackers_loop() { myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); - + bombs = [];//sites with bombs sites = [];//sites to bomb at bombed = 0;//exploded sites + for ( i = 0; i < level.bombZones.size; i++ ) { bomb = level.bombZones[i]; - - if(isDefined(bomb.bombExploded) && bomb.bombExploded) + + if ( isDefined( bomb.bombExploded ) && bomb.bombExploded ) { bombed++; continue; } - - if(bomb.label == "_a") + + if ( bomb.label == "_a" ) { - if(level.bombAPlanted) + if ( level.bombAPlanted ) bombs[bombs.size] = bomb; else sites[sites.size] = bomb; - + continue; } - - if(bomb.label == "_b") + + if ( bomb.label == "_b" ) { - if(level.bombBPlanted) + if ( level.bombBPlanted ) bombs[bombs.size] = bomb; else sites[sites.size] = bomb; - + continue; } } - timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining()/1000; - - shouldLet = (game["teamScores"][myteam] > game["teamScores"][otherTeam] && timeleft < 90 && bombed == 1); + + timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000; + + shouldLet = ( game["teamScores"][myteam] > game["teamScores"][otherTeam] && timeleft < 90 && bombed == 1 ); + //spawnkill conditions //if we have bombed one site or 1 bomb is planted with lots of time left, spawn kill //if we want the other team to win for overtime and they do not need to defuse, spawn kill - if(((bombed + bombs.size == 1 && timeleft >= 90) || (shouldLet && !bombs.size)) && randomInt(100) < 95) + if ( ( ( bombed + bombs.size == 1 && timeleft >= 90 ) || ( shouldLet && !bombs.size ) ) && randomInt( 100 ) < 95 ) { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - + spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_defender_start" ); - - if(!spawnPoints.size) + + if ( !spawnPoints.size ) return; - + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 2048*2048) + + if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 2048 * 2048 ) return; - + self SetScriptGoal( spawnpoint.origin, 1024 ); - + self thread bot_dem_attack_spawnkill(); - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } - + //let defuse conditions //if enemy is going to lose and lots of time left, let them defuse to play longer //or if want to go into overtime near end of the extended game - if(((bombs.size + bombed == 2 && timeleft >= 90) || (shouldLet && bombs.size)) && randomInt(100) < 95) + if ( ( ( bombs.size + bombed == 2 && timeleft >= 90 ) || ( shouldLet && bombs.size ) ) && randomInt( 100 ) < 95 ) { spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_attacker_start" ); - - if(!spawnPoints.size) + + if ( !spawnPoints.size ) return; - + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 1024*1024) + + if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 1024 * 1024 ) return; - + self.bot_lock_goal = true; self SetScriptGoal( spawnpoint.origin, 512 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); - + self.bot_lock_goal = false; return; } - + //defend bomb conditions //if time is running out and we have a bomb planted - if(bombs.size && timeleft < 90 && (!sites.size || randomInt(100) < 95)) + if ( bombs.size && timeleft < 90 && ( !sites.size || randomInt( 100 ) < 95 ) ) { - site = self bot_array_nearest_curorigin(bombs); - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+5 ); - - if(site IsInUse())//somebody is defusing + site = self bot_array_nearest_curorigin( bombs ); + origin = ( site.curorigin[0] + 50, site.curorigin[1] + 50, site.curorigin[2] + 5 ); + + if ( site IsInUse() ) //somebody is defusing { self.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; } - + //else go plant - if(!sites.size) + if ( !sites.size ) return; - - plant = self bot_array_nearest_curorigin(sites); - - if(!isDefined(plant)) + + plant = self bot_array_nearest_curorigin( sites ); + + if ( !isDefined( plant ) ) return; - - if(!isDefined(plant.bots)) + + if ( !isDefined( plant.bots ) ) plant.bots = 0; - - 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 ); + //hang around the site if lots of time left - if(plant.bots > 1 && timeleft >= 60) + if ( plant.bots > 1 && timeleft >= 60 ) { - 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_dem_go_plant(plant); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + self thread bot_dem_go_plant( plant ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } - + self.bot_lock_goal = true; - + self SetScriptGoal( origin, 1 ); - self thread bot_inc_bots(plant); - self thread bot_dem_go_plant(plant); - + self thread bot_inc_bots( plant ); + self thread bot_dem_go_plant( plant ); + event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - if (event != "new_goal") + if ( event != "new_goal" ) self ClearScriptGoal(); - - if(event != "goal" || (plant.label == "_b" && level.bombBPlanted) || (plant.label == "_a" && level.bombAPlanted) || plant IsInUse() || !self isTouching(plant.trigger) || self InLastStand() || self HasThreat()) + + if ( event != "goal" || ( plant.label == "_b" && level.bombBPlanted ) || ( plant.label == "_a" && level.bombAPlanted ) || plant IsInUse() || !self isTouching( plant.trigger ) || self InLastStand() || self HasThreat() ) { self.bot_lock_goal = false; return; } - + self 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; } @@ -5976,24 +6140,24 @@ bot_dem_attackers() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "dd" ) return; - - if(self.team != game["attackers"]) + + if ( self.team != game["attackers"] ) return; for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || self.bot_lock_goal ) { continue; } - - if(!isDefined(level.bombZones) || !level.bombZones.size) + + if ( !isDefined( level.bombZones ) || !level.bombZones.size ) continue; self bot_dem_attackers_loop(); @@ -6007,189 +6171,193 @@ bot_dem_defenders_loop() { myTeam = self.pers[ "team" ]; otherTeam = getOtherTeam( myTeam ); - + bombs = [];//sites with bombs sites = [];//sites to bomb at bombed = 0;//exploded sites + for ( i = 0; i < level.bombZones.size; i++ ) { bomb = level.bombZones[i]; - - if(isDefined(bomb.bombExploded) && bomb.bombExploded) + + if ( isDefined( bomb.bombExploded ) && bomb.bombExploded ) { bombed++; continue; } - - if(bomb.label == "_a") + + if ( bomb.label == "_a" ) { - if(level.bombAPlanted) + if ( level.bombAPlanted ) bombs[bombs.size] = bomb; else sites[sites.size] = bomb; - + continue; } - - if(bomb.label == "_b") + + if ( bomb.label == "_b" ) { - if(level.bombBPlanted) + if ( level.bombBPlanted ) bombs[bombs.size] = bomb; else sites[sites.size] = bomb; - + continue; } } - timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining()/1000; - - shouldLet = (timeleft < 60 && ((bombed == 0 && bombs.size != 2) || (game["teamScores"][myteam] > game["teamScores"][otherTeam] && bombed == 1)) && randomInt(100) < 98); - + + timeleft = maps\mp\gametypes\_gamelogic::getTimeRemaining() / 1000; + + shouldLet = ( timeleft < 60 && ( ( bombed == 0 && bombs.size != 2 ) || ( game["teamScores"][myteam] > game["teamScores"][otherTeam] && bombed == 1 ) ) && randomInt( 100 ) < 98 ); + //spawnkill conditions //if nothing to defuse with a lot of time left, spawn kill //or letting a bomb site to explode but a bomb is planted, so spawnkill - if((!bombs.size && timeleft >= 60 && randomInt(100) < 95) || (shouldLet && bombs.size == 1)) + if ( ( !bombs.size && timeleft >= 60 && randomInt( 100 ) < 95 ) || ( shouldLet && bombs.size == 1 ) ) { - if(self HasScriptGoal()) + if ( self HasScriptGoal() ) return; - + spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_attacker_start" ); - - if(!spawnPoints.size) + + if ( !spawnPoints.size ) return; - + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 2048*2048) + + if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 2048 * 2048 ) return; - + self SetScriptGoal( spawnpoint.origin, 1024 ); - + self thread bot_dem_defend_spawnkill(); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } - + //let blow up conditions //let enemy blow up at least one to extend play time //or if want to go into overtime after extended game - if(shouldLet) + if ( shouldLet ) { spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_defender_start" ); - - if(!spawnPoints.size) + + if ( !spawnPoints.size ) return; - + spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints ); - - if(DistanceSquared(spawnpoint.origin, self.origin) <= 1024*1024) + + if ( DistanceSquared( spawnpoint.origin, self.origin ) <= 1024 * 1024 ) return; - + self.bot_lock_goal = true; self SetScriptGoal( spawnpoint.origin, 512 ); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); - + self.bot_lock_goal = false; return; } - + //defend conditions //if no bombs planted with little time left - if(!bombs.size && timeleft < 60 && randomInt(100) < 95 && sites.size) + if ( !bombs.size && timeleft < 60 && randomInt( 100 ) < 95 && sites.size ) { - site = self bot_array_nearest_curorigin(sites); - origin = ( site.curorigin[0]+50, site.curorigin[1]+50, site.curorigin[2]+5 ); - - if(site IsInUse())//somebody is planting + site = self bot_array_nearest_curorigin( sites ); + origin = ( site.curorigin[0] + 50, site.curorigin[1] + 50, site.curorigin[2] + 5 ); + + if ( site IsInUse() ) //somebody is planting { self.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; } - + //else go defuse - - if(!bombs.size) + + if ( !bombs.size ) return; - - defuse = self bot_array_nearest_curorigin(bombs); - - if(!isDefined(defuse)) + + defuse = self bot_array_nearest_curorigin( bombs ); + + if ( !isDefined( defuse ) ) return; - - if(!isDefined(defuse.bots)) + + if ( !isDefined( defuse.bots ) ) defuse.bots = 0; - - origin = ( defuse.curorigin[0]+50, defuse.curorigin[1]+50, defuse.curorigin[2]+5 ); - + + origin = ( defuse.curorigin[0] + 50, defuse.curorigin[1] + 50, defuse.curorigin[2] + 5 ); + //hang around the site if not in danger of losing - if(defuse.bots > 1 && bombed + bombs.size != 2) + if ( defuse.bots > 1 && bombed + bombs.size != 2 ) { - 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_dem_go_defuse(defuse); - - if (self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal") + + self thread bot_dem_go_defuse( defuse ); + + if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" ) self ClearScriptGoal(); + return; } - + self.bot_lock_goal = true; self SetScriptGoal( origin, 1 ); - self thread bot_inc_bots(defuse); - self thread bot_dem_go_defuse(defuse); + self thread bot_inc_bots( defuse ); + self thread bot_dem_go_defuse( defuse ); event = self waittill_any_return( "goal", "bad_path", "new_goal" ); - if (event != "new_goal") + if ( event != "new_goal" ) self ClearScriptGoal(); - - if(event != "goal" || (defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted) || defuse IsInUse() || !self isTouching(defuse.trigger) || self InLastStand() || self HasThreat()) + + if ( event != "goal" || ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) || defuse IsInUse() || !self isTouching( defuse.trigger ) || self InLastStand() || self HasThreat() ) { self.bot_lock_goal = false; return; } - + self 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; } @@ -6200,24 +6368,24 @@ bot_dem_defenders() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "dd" ) return; - - if(self.team == game["attackers"]) + + if ( self.team == game["attackers"] ) return; for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || self.bot_lock_goal ) { continue; } - - if(!isDefined(level.bombZones) || !level.bombZones.size) + + if ( !isDefined( level.bombZones ) || !level.bombZones.size ) continue; self bot_dem_defenders_loop(); @@ -6227,30 +6395,30 @@ bot_dem_defenders() /* Bots go defuse */ -bot_dem_go_defuse(defuse) +bot_dem_go_defuse( defuse ) { 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 (self isTouching(defuse.trigger)) + if ( self isTouching( defuse.trigger ) ) break; - if ((defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted)) + if ( ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) ) break; } - - if((defuse.label == "_b" && !level.bombBPlanted) || (defuse.label == "_a" && !level.bombAPlanted)) - self notify("bad_path"); + + if ( ( defuse.label == "_b" && !level.bombBPlanted ) || ( defuse.label == "_a" && !level.bombAPlanted ) ) + self notify( "bad_path" ); else - self notify("goal"); + self notify( "goal" ); } /* @@ -6260,20 +6428,20 @@ bot_dem_defend_spawnkill() { 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 (level.bombBPlanted || level.bombAPlanted) + if ( level.bombBPlanted || level.bombAPlanted ) break; } - - self notify("bad_path"); + + self notify( "bad_path" ); } /* @@ -6290,7 +6458,7 @@ bot_gtnw() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "gtnw" ) return; @@ -6298,16 +6466,16 @@ bot_gtnw() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || self.bot_lock_goal ) { continue; } - if (!isDefined(level.nukeSite)) + if ( !isDefined( level.nukeSite ) ) continue; - + } } @@ -6318,7 +6486,7 @@ bot_oneflag() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "oneflag" ) return; @@ -6326,16 +6494,16 @@ bot_oneflag() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || self.bot_lock_goal ) { continue; } - if (!isDefined(level.capZones) || !isDefined(level.teamFlags)) + if ( !isDefined( level.capZones ) || !isDefined( level.teamFlags ) ) continue; - /*if(isDefined(level.capZones) && isDefined(level.teamFlags)) + /* if(isDefined(level.capZones) && isDefined(level.teamFlags)) { if(self.pers["team"] == game["attackers"])//attacking { @@ -6391,7 +6559,7 @@ bot_oneflag() if(isDefined(wp)) { self thread bots\talk::bots_oneflag_protectCapzone();//hang around cap zone - + self bots_goToLoc(level.waypoints[wp].origin, ::bots_defendOneFlagCap, 0, 0, 0); } else @@ -6413,7 +6581,7 @@ bot_oneflag() if(isDefined(wp)) { self thread bots\talk::bots_oneflag_protectFlag(); - + self bots_goToLoc(level.waypoints[wp].origin, ::bots_defendOneFlag, 0, 0, 0); } else @@ -6441,7 +6609,7 @@ bot_arena() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "arena" ) return; @@ -6449,13 +6617,13 @@ bot_arena() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || self.bot_lock_goal ) { continue; } - /*case "arena"://iw's hidden gametypes. + /* case "arena"://iw's hidden gametypes. if(isDefined(level.arenaFlag)) { self.bots_objDoing = "flag"; @@ -6481,7 +6649,7 @@ bot_arena() self bots_goToLoc(level.waypoints[randomint(level.waypointCount)].origin, ::bots_nullFunc, 0, 0, 0); } } - break; + break; */ } } @@ -6493,7 +6661,7 @@ bot_vip() { self endon( "death" ); self endon( "disconnect" ); - level endon("game_ended"); + level endon( "game_ended" ); if ( level.gametype != "vip" ) return; @@ -6501,13 +6669,13 @@ bot_vip() for ( ;; ) { wait( randomintrange( 3, 5 ) ); - + if ( self IsUsingRemote() || self.bot_lock_goal ) { continue; } - /*case "vip"://maybe used at gaming events. (ya right, this is not even finished) + /* case "vip"://maybe used at gaming events. (ya right, this is not even finished) if(isDefined(level.extractionZone)) { if(self.team == game["defenders"]) @@ -6521,7 +6689,7 @@ bot_vip() self bots_goToLoc(level.extractionZone.trigger.origin, ::bots_nullFunc, 0, 0, 0); if(distance(level.extractionZone.trigger.origin, self.origin) <= level.bots_useNear) level.extractionZone [[level.extractionZone.onUse]](self); - + self thread bots\talk::bots_vip_extractDone(); self.bots_objDoing = "none"; } @@ -6552,14 +6720,14 @@ bot_vip() { if(!isDefined(player.isVip) || !player.isVip) continue; - + if(!bots_isReallyAlive(player)) continue; - + tarPlay = player; break; } - + self thread bots\talk::bots_vip_protect(tarPlay); self bots_goFollow(tarPlay, 30, false); } @@ -6589,14 +6757,14 @@ bot_vip() { if(!isDefined(player.isVip) || !player.isVip) continue; - + if(!bots_isReallyAlive(player)) continue; - + tarPlay = player; break; } - + if((!isDefined(level.extractionTime) || self.bots_traitRandom < 2) && isDefined(tarPlay)) { self thread bots\talk::bots_vip_kill(tarPlay); @@ -6622,6 +6790,6 @@ bot_vip() } } } - break;*/ + break;*/ } } diff --git a/userraw/maps/mp/bots/_bot_utility.gsc b/userraw/maps/mp/bots/_bot_utility.gsc index d349fde..1ca93cc 100644 --- a/userraw/maps/mp/bots/_bot_utility.gsc +++ b/userraw/maps/mp/bots/_bot_utility.gsc @@ -14,7 +14,7 @@ */ is_host() { - return (isDefined(self.pers["bot_host"]) && self.pers["bot_host"]); + return ( isDefined( self.pers["bot_host"] ) && self.pers["bot_host"] ); } /* @@ -24,36 +24,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 (!self isHost() && !result) + + if ( !self isHost() && !result ) return; self.pers["bot_host"] = true; @@ -64,58 +66,58 @@ doHostCheck() */ is_bot() { - assert(isDefined(self)); - assert(isPlayer(self)); + assert( isDefined( self ) ); + assert( isPlayer( self ) ); - return ((isDefined(self.pers["isBot"]) && self.pers["isBot"]) || (isDefined(self.pers["isBotWarfare"]) && self.pers["isBotWarfare"]) || isSubStr( self getguid()+"", "bot" )); + return ( ( isDefined( self.pers["isBot"] ) && self.pers["isBot"] ) || ( isDefined( self.pers["isBotWarfare"] ) && self.pers["isBotWarfare"] ) || isSubStr( self getguid() + "", "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 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 ); } /* Bot will press the ads button for the 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 ); } /* Bots will press the attack button for a time */ -BotPressAttack(time) +BotPressAttack( time ) { - self maps\mp\bots\_bot_internal::pressFire(time); + self maps\mp\bots\_bot_internal::pressFire( time ); } /* @@ -123,7 +125,7 @@ BotPressAttack(time) */ BotGetTargetRandom() { - if (!isDefined(self.bot.target)) + if ( !isDefined( self.bot.target ) ) return undefined; return self.bot.target.rand; @@ -180,11 +182,12 @@ IsBotKnifing() /* 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" ); } /* @@ -198,12 +201,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" ); } /* @@ -212,21 +215,22 @@ BotStopMoving(what) */ HasScriptGoal() { - return (isDefined(self GetScriptGoal())); + return ( isDefined( self 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" ); } /* @@ -242,7 +246,7 @@ GetScriptGoal() */ ClearScriptGoal() { - self SetScriptGoal(undefined, 0); + self SetScriptGoal( undefined, 0 ); } /* @@ -250,13 +254,13 @@ ClearScriptGoal() */ HasBotJavelinLocation() { - return isDefined(self.bot.jav_loc); + return isDefined( self.bot.jav_loc ); } /* Sets the aim position of the bot */ -SetScriptAimPos(pos) +SetScriptAimPos( pos ) { self.bot.script_aimpos = pos; } @@ -266,7 +270,7 @@ SetScriptAimPos(pos) */ ClearScriptAimPos() { - self SetScriptAimPos(undefined); + self SetScriptAimPos( undefined ); } /* @@ -282,16 +286,16 @@ GetScriptAimPos() */ HasScriptAimPos() { - return isDefined(self GetScriptAimPos()); + return isDefined( self GetScriptAimPos() ); } /* Sets the bot's javelin target location */ -SetBotJavelinLocation(loc) +SetBotJavelinLocation( loc ) { self.bot.jav_loc = loc; - self notify("new_enemy"); + self notify( "new_enemy" ); } /* @@ -299,13 +303,13 @@ SetBotJavelinLocation(loc) */ ClearBotJavelinLocation() { - self SetBotJavelinLocation(undefined); + self SetBotJavelinLocation( undefined ); } /* Sets the bot's target to be this ent. */ -SetAttacker(att) +SetAttacker( att ) { self.bot.target_this_frame = att; } @@ -313,7 +317,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; @@ -324,7 +328,7 @@ SetScriptEnemy(enemy, offset) */ ClearScriptEnemy() { - self SetScriptEnemy(undefined, undefined); + self SetScriptEnemy( undefined, undefined ); } /* @@ -332,9 +336,9 @@ ClearScriptEnemy() */ GetThreat() { - if(!isdefined(self.bot.target)) + if ( !isdefined( self.bot.target ) ) return undefined; - + return self.bot.target.entity; } @@ -343,7 +347,7 @@ GetThreat() */ HasScriptEnemy() { - return (isDefined(self.bot.script_target)); + return ( isDefined( self.bot.script_target ) ); } /* @@ -351,7 +355,7 @@ HasScriptEnemy() */ HasThreat() { - return (isDefined(self GetThreat())); + return ( isDefined( self GetThreat() ) ); } /* @@ -359,7 +363,7 @@ HasThreat() */ IsDefusing() { - return (isDefined(self.isDefusing) && self.isDefusing); + return ( isDefined( self.isDefusing ) && self.isDefusing ); } /* @@ -367,7 +371,7 @@ IsDefusing() */ isPlanting() { - return (isDefined(self.isPlanting) && self.isPlanting); + return ( isDefined( self.isPlanting ) && self.isPlanting ); } /* @@ -375,7 +379,7 @@ isPlanting() */ isBombCarrier() { - return (isDefined(self.isBombCarrier) && self.isBombCarrier); + return ( isDefined( self.isBombCarrier ) && self.isBombCarrier ); } /* @@ -383,7 +387,7 @@ isBombCarrier() */ isInUse() { - return (isDefined(self.inUse) && self.inUse); + return ( isDefined( self.inUse ) && self.inUse ); } /* @@ -391,7 +395,7 @@ isInUse() */ inLastStand() { - return (isDefined(self.lastStand) && self.lastStand); + return ( isDefined( self.lastStand ) && self.lastStand ); } /* @@ -399,7 +403,7 @@ inLastStand() */ inFinalStand() { - return (isDefined(self.inFinalStand) && self.inFinalStand); + return ( isDefined( self.inFinalStand ) && self.inFinalStand ); } /* @@ -407,7 +411,7 @@ inFinalStand() */ isFlagCarrier() { - return (isDefined(self.carryFlag) && self.carryFlag); + return ( isDefined( self.carryFlag ) && self.carryFlag ); } /* @@ -415,15 +419,15 @@ isFlagCarrier() */ IsStunned() { - return (isdefined(self.concussionEndTime) && self.concussionEndTime > gettime()); + return ( isdefined( self.concussionEndTime ) && self.concussionEndTime > gettime() ); } /* - Returns if we are beingArtilleryShellshocked + Returns if we are beingArtilleryShellshocked */ isArtShocked() { - return (isDefined(self.beingArtilleryShellshocked) && self.beingArtilleryShellshocked); + return ( isDefined( self.beingArtilleryShellshocked ) && self.beingArtilleryShellshocked ); } /* @@ -433,14 +437,14 @@ getValidTube() { weaps = self getweaponslistall(); - 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_")) || weap == "m79_mp") + if ( ( isSubStr( weap, "gl_" ) && !isSubStr( weap, "_gl_" ) ) || weap == "m79_mp" ) return weap; } @@ -466,19 +470,19 @@ allowTeamChoice() /* 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; @@ -496,66 +500,66 @@ getValidGrenade() grenadeTypes[grenadeTypes.size] = "concussion_grenade_mp"; grenadeTypes[grenadeTypes.size] = "semtex_mp"; grenadeTypes[grenadeTypes.size] = "throwingknife_mp"; - + possibles = []; - - for(i = 0; i < grenadeTypes.size; i++) + + for ( i = 0; i < grenadeTypes.size; i++ ) { if ( !self hasWeapon( grenadeTypes[i] ) ) continue; - + if ( !self getAmmoCount( grenadeTypes[i] ) ) continue; - + possibles[possibles.size] = grenadeTypes[i]; } - - return random(possibles); + + return random( possibles ); } /* If the weapon is not a script weapon (bomb, killstreak, etc, grenades) */ -isWeaponPrimary(weap) +isWeaponPrimary( weap ) { - return (maps\mp\gametypes\_weapons::isPrimaryWeapon(weap) || maps\mp\gametypes\_weapons::isAltModeWeapon(weap)); + return ( maps\mp\gametypes\_weapons::isPrimaryWeapon( weap ) || maps\mp\gametypes\_weapons::isAltModeWeapon( weap ) ); } /* If the ent is a vehicle */ -entIsVehicle(ent) +entIsVehicle( ent ) { - return (ent.classname == "script_vehicle" || ent.model == "vehicle_uav_static_mp" || ent.model == "vehicle_ac130_coop"); + return ( ent.classname == "script_vehicle" || ent.model == "vehicle_uav_static_mp" || ent.model == "vehicle_ac130_coop" ); } /* Returns if the given weapon is full auto. */ -WeaponIsFullAuto(weap) +WeaponIsFullAuto( weap ) { - weaptoks = strtok(weap, "_"); + weaptoks = strtok( weap, "_" ); - assert(isDefined(weaptoks[0])); - assert(isString(weaptoks[0])); - - return isDefined(level.bots_fullautoguns[weaptoks[0]]); + assert( isDefined( weaptoks[0] ) ); + assert( isString( weaptoks[0] ) ); + + return isDefined( level.bots_fullautoguns[weaptoks[0]] ); } /* If weap is a secondary gnade */ -isSecondaryGrenade(gnade) +isSecondaryGrenade( gnade ) { - return (gnade == "concussion_grenade_mp" || gnade == "flash_grenade_mp" || gnade == "smoke_grenade_mp"); + return ( gnade == "concussion_grenade_mp" || gnade == "flash_grenade_mp" || gnade == "smoke_grenade_mp" ); } /* 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 ) ); } /* @@ -571,10 +575,10 @@ getEyeHeight() /* Does a notify after a delay */ -notifyAfterDelay(delay, not) +notifyAfterDelay( delay, not ) { wait delay; - self notify(not); + self notify( not ); } /* @@ -582,11 +586,11 @@ notifyAfterDelay(delay, not) */ 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; @@ -596,44 +600,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; } } @@ -642,46 +646,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; @@ -690,55 +695,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). */ -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; @@ -753,6 +758,7 @@ Round(x) RoundUp( floatVal ) { i = int( floatVal ); + if ( i != floatVal ) return i + 1; else @@ -762,37 +768,39 @@ RoundUp( floatVal ) /* 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 = []; + tokens = []; - token = ""; - for (i = 0; i < line.size; i++) - { - c = line[i]; + token = ""; - if (c == tok) + for ( i = 0; i < line.size; i++ ) { - tokens[tokens.size] = token; - token = ""; - continue; + c = line[i]; + + if ( c == tok ) + { + tokens[tokens.size] = token; + token = ""; + continue; + } + + token += c; } - token += c; - } - tokens[tokens.size] = token; + tokens[tokens.size] = token; - return tokens; + return tokens; } /* @@ -806,35 +814,38 @@ isStrStart( string1, subStr ) /* 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; @@ -1181,17 +1244,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]; @@ -1203,16 +1266,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]; @@ -1225,35 +1289,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]; @@ -1262,144 +1328,210 @@ getWaypointForIndex(i) /* Returns the friendly user name for a given map's codename */ -getMapName(mapname) +getMapName( mapname ) { - switch(mapname) + switch ( mapname ) { case "mp_abandon": return "Carnival"; + case "mp_rundown": return "Rundown"; + case "mp_afghan": return "Afghan"; + case "mp_boneyard": return "Scrapyard"; + case "mp_brecourt": return "Wasteland"; + case "mp_cargoship": return "Wetwork"; + case "mp_checkpoint": return "Karachi"; + case "mp_compact": return "Salvage"; + case "mp_complex": return "Bailout"; + case "mp_crash": return "Crash"; + case "mp_cross_fire": return "Crossfire"; + case "mp_derail": return "Derail"; + case "mp_estate": return "Estate"; + case "mp_favela": return "Favela"; + case "mp_fuel2": return "Fuel"; + case "mp_highrise": return "Highrise"; + case "mp_invasion": return "Invasion"; + case "mp_killhouse": return "Killhouse"; + case "mp_nightshift": return "Skidrow"; + case "mp_nuked": return "Nuketown"; + case "oilrig": return "Oilrig"; + case "mp_quarry": return "Quarry"; + case "mp_rust": return "Rust"; + case "mp_storm": return "Storm"; + case "mp_strike": return "Strike"; + case "mp_subbase": return "Subbase"; + case "mp_terminal": return "Terminal"; + case "mp_trailerpark": return "Trailer Park"; + case "mp_overgrown": return "Overgrown"; + case "mp_underpass": return "Underpass"; + case "mp_vacant": return "Vacant"; + case "iw4_credits": return "IW4 Test Map"; + case "airport": return "Airport"; + case "co_hunted": return "Hunted"; + case "invasion": return "Burgertown"; + case "mp_bloc": return "Bloc"; + case "mp_bog_sh": return "Bog"; + case "contingency": return "Contingency"; + case "gulag": return "Gulag"; + case "so_ghillies": return "Pripyat"; + case "ending": return "Museum"; + case "af_chase": return "Afghan Chase"; + case "af_caves": return "Afghan Caves"; + case "arcadia": return "Arcadia"; + case "boneyard": return "Boneyard"; + case "cliffhanger": return "Cliffhanger"; + case "dcburning": return "DCBurning"; + case "dcemp": return "DCEMP"; + case "downtown": return "Downtown"; + case "estate": return "EstateSP"; + case "favela": return "FavelaSP"; + case "favela_escape": return "Favela Escape"; + case "roadkill": return "Roadkill"; + case "trainer": return "TH3 PIT"; + case "so_bridge": return "Bridge"; + case "dc_whitehouse": return "Whitehouse"; + case "mp_shipment_long": return "ShipmentLong"; + case "mp_shipment": return "Shipment"; + case "mp_firingrange": return "Firing Range"; + case "mp_rust_long": return "RustLong"; + case "mp_cargoship_sh": return "Freighter"; + case "mp_storm_spring": return "Chemical Plant"; + case "mp_crash_trop": case "mp_crash_tropical": return "Crash Tropical"; + case "mp_fav_tropical": return "Favela Tropical"; + case "mp_estate_trop": case "mp_estate_tropical": return "Estate Tropical"; + case "mp_bloc_sh": return "Forgotten City"; + default: return mapname; } @@ -1410,7 +1542,7 @@ getMapName(mapname) */ getGoodMapAmount() { - switch(getdvar("mapname")) + switch ( getdvar( "mapname" ) ) { case "mp_rust": case "iw4_credits": @@ -1440,10 +1572,11 @@ getGoodMapAmount() case "trainer": case "dc_whitehouse": case "mp_shipment": - if(level.teambased) + if ( level.teambased ) return 8; else return 4; + case "mp_vacant": case "mp_terminal": case "mp_nightshift": @@ -1455,10 +1588,11 @@ getGoodMapAmount() case "mp_fav_tropical": case "mp_shipment_long": case "mp_rust_long": - if(level.teambased) + if ( level.teambased ) return 12; else return 8; + case "mp_afghan": case "mp_crash": case "mp_brecourt": @@ -1485,17 +1619,19 @@ getGoodMapAmount() case "mp_crash_tropical": case "mp_estate_tropical": case "mp_bloc_sh": - if(level.teambased) + if ( level.teambased ) return 14; else return 9; + case "mp_fuel2": case "mp_invasion": case "mp_derail": - if(level.teambased) + if ( level.teambased ) return 16; else return 10; + default: return 2; } @@ -1504,40 +1640,125 @@ getGoodMapAmount() /* 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; } @@ -1548,16 +1769,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; } @@ -1567,64 +1789,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 ); } /* @@ -1635,26 +1861,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]; } @@ -1666,18 +1892,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; @@ -1693,24 +1919,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; @@ -1722,110 +1948,116 @@ _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; } /* @@ -1839,7 +2071,7 @@ doExtraCheck() /* 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]; } @@ -1847,7 +2079,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]; } @@ -1855,7 +2087,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]; } @@ -1863,7 +2095,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; } @@ -1871,7 +2103,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; } @@ -1879,7 +2111,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"]; } @@ -1887,53 +2119,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; @@ -1945,40 +2177,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; } @@ -1986,62 +2218,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; } @@ -2050,75 +2284,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; } @@ -2126,68 +2364,73 @@ 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 []; } @@ -2199,10 +2442,12 @@ array_average( array ) { assert( array.size > 0 ); total = 0; + for ( i = 0; i < array.size; i++ ) { total += array[i]; } + return ( total / array.size ); } @@ -2214,15 +2459,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 ); } @@ -2236,25 +2485,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 ); } /* @@ -2267,16 +2520,16 @@ onUsePlantObjectFix( player ) { level thread bombPlantedFix( self, player ); //player logString( "bomb planted: " + self.label ); - + // disable all bomb zones except this one for ( index = 0; index < level.bombZones.size; index++ ) { if ( level.bombZones[index] == self ) continue; - + level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); } - + player playSound( "mp_bomb_plant" ); player notify ( "bomb_planted" ); @@ -2291,7 +2544,7 @@ onUsePlantObjectFix( player ) player thread maps\mp\gametypes\_hud_message::SplashNotify( "plant", maps\mp\gametypes\_rank::getScoreInfoValue( "plant" ) ); player thread maps\mp\gametypes\_rank::giveRankXP( "plant" ); player.bombPlantedTime = getTime(); - maps\mp\gametypes\_gamescore::givePlayerScore( "plant", player ); + maps\mp\gametypes\_gamescore::givePlayerScore( "plant", player ); player incPlayerStat( "bombsplanted", 1 ); player thread maps\mp\_matchdata::logGameEvent( "plant", player.origin ); } @@ -2304,14 +2557,14 @@ bombPlantedFix( destroyedObj, player ) { maps\mp\gametypes\_gamelogic::pauseTimer(); level.bombPlanted = true; - + destroyedObj.visuals[0] thread maps\mp\gametypes\_gamelogic::playTickingSound(); level.tickingObject = destroyedObj.visuals[0]; level.timeLimitOverride = true; - setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) ); + setGameEndTime( int( gettime() + ( level.bombTimer * 1000 ) ) ); setDvar( "ui_bomb_timer", 1 ); - + if ( !level.multiBomb ) { level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); @@ -2321,39 +2574,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 - common_scripts\utility::vector_multiply( trace["normal"], vectordot( forward, trace["normal"] ) ) ); dropAngles = vectortoangles( forward ); - + level.sdBombModel = spawn( "script_model", trace["position"] ); level.sdBombModel.angles = dropAngles; level.sdBombModel setModel( "prop_suitcase_bomb" ); } + destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" ); destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); /* - 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" ); @@ -2368,22 +2622,22 @@ bombPlantedFix( destroyedObj, player ) defuseObject.onEndUse = maps\mp\gametypes\sd::onEndUse; defuseObject.onUse = maps\mp\gametypes\sd::onUseDefuseObject; defuseObject.useWeapon = "briefcase_bomb_defuse_mp"; - + level.defuseObject = defuseObject; - + maps\mp\gametypes\sd::BombTimerWait(); setDvar( "ui_bomb_timer", 0 ); - + destroyedObj.visuals[0] maps\mp\gametypes\_gamelogic::stopTickingSound(); - + if ( level.gameEnded || level.bombDefused ) return; - + level.bombExploded = true; - + explosionOrigin = level.sdBombModel.origin; level.sdBombModel hide(); - + if ( isdefined( player ) ) { destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player ); @@ -2391,27 +2645,28 @@ bombPlantedFix( destroyedObj, player ) } else destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20 ); - - rot = randomfloat(360); - explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) ); + + rot = randomfloat( 360 ); + explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + ( 0, 0, 50 ), ( 0, 0, 1 ), ( cos( rot ), sin( rot ), 0 ) ); triggerFx( explosionEffect ); PlayRumbleOnPosition( "grenade_rumble", explosionOrigin ); earthquake( 0.75, 2.0, explosionOrigin, 2000 ); - + thread playSoundinSpace( "exp_suitcase_bomb_main", explosionOrigin ); - + if ( isDefined( destroyedObj.exploderIndex ) ) exploder( destroyedObj.exploderIndex ); - + for ( index = 0; index < level.bombZones.size; index++ ) level.bombZones[index] maps\mp\gametypes\_gameobjects::disableObject(); + defuseObject maps\mp\gametypes\_gameobjects::disableObject(); - + setGameEndTime( 0 ); - + wait 3; - + maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); } @@ -2420,12 +2675,12 @@ bombPlantedFix( destroyedObj, player ) */ botGiveLoadout( team, class, allowCopycat ) { - self endon("death"); - + self endon( "death" ); + self takeAllWeapons(); - + primaryIndex = 0; - + // initialize specialty array self.specialty = []; @@ -2454,7 +2709,7 @@ botGiveLoadout( team, class, allowCopycat ) loadoutPerk2 = clonedLoadout["loadoutPerk2"]; loadoutPerk3 = clonedLoadout["loadoutPerk3"]; loadoutOffhand = clonedLoadout["loadoutOffhand"]; - loadoutDeathStreak = "specialty_copycat"; + loadoutDeathStreak = "specialty_copycat"; } else if ( isSubstr( class, "custom" ) ) { @@ -2481,14 +2736,14 @@ botGiveLoadout( team, class, allowCopycat ) { class_num = maps\mp\gametypes\_class::getClassIndex( class ); self.class_num = class_num; - + loadoutPrimary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, class_num, 0 ); - loadoutPrimaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 0 , 0); + loadoutPrimaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 0, 0 ); loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 0, 1 ); loadoutPrimaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, class_num, 0 ); loadoutSecondaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, class_num, 1 ); loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, class_num, 1 ); - loadoutSecondaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 1 , 0); + loadoutSecondaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 1, 0 ); loadoutSecondaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 1, 1 );; loadoutSecondaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, class_num, 1 ); loadoutEquipment = maps\mp\gametypes\_class::table_getEquipment( level.classTableName, class_num, 0 ); @@ -2504,31 +2759,32 @@ botGiveLoadout( team, class, allowCopycat ) loadoutPrimaryAttachment2 = "none"; loadoutSecondaryAttachment2 = "none"; } - + if ( loadoutPerk1 != "specialty_onemanarmy" && loadoutSecondary == "onemanarmy" ) loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 1 ); //loadoutSecondaryCamo = "none"; // stop default class op'ness - allowOp = (getDvarInt("bots_loadout_allow_op") >= 1); - if (!allowOp) + allowOp = ( getDvarInt( "bots_loadout_allow_op" ) >= 1 ); + + if ( !allowOp ) { loadoutDeathstreak = "specialty_none"; - if (loadoutPrimary == "riotshield") + if ( loadoutPrimary == "riotshield" ) loadoutPrimary = "m4"; - if (loadoutSecondary == "at4") + if ( loadoutSecondary == "at4" ) loadoutSecondary = "usp"; - if (loadoutPrimaryAttachment == "gl") + if ( loadoutPrimaryAttachment == "gl" ) loadoutPrimaryAttachment = "none"; - if (loadoutPerk2 == "specialty_coldblooded") + if ( loadoutPerk2 == "specialty_coldblooded" ) loadoutPerk2 = "specialty_none"; - if (loadoutPerk3 == "specialty_localjammer") + if ( loadoutPerk3 == "specialty_localjammer" ) loadoutPerk3 = "specialty_none"; } @@ -2554,17 +2810,17 @@ botGiveLoadout( team, class, allowCopycat ) loadoutKillstreak2 = "none"; loadoutKillstreak3 = "none"; } - - secondaryName = maps\mp\gametypes\_class::buildWeaponName( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2 ); - self _giveWeapon( secondaryName, int(tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ) ); - self.loadoutPrimaryCamo = int(tableLookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 )); + secondaryName = maps\mp\gametypes\_class::buildWeaponName( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2 ); + self _giveWeapon( secondaryName, int( tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ) ); + + self.loadoutPrimaryCamo = int( tableLookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 ) ); self.loadoutPrimary = loadoutPrimary; self.loadoutSecondary = loadoutSecondary; - self.loadoutSecondaryCamo = int(tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 )); - + self.loadoutSecondaryCamo = int( tableLookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ); + self SetOffhandPrimaryClass( "other" ); - + // Action Slots //self _SetActionSlot( 1, "" ); self _SetActionSlot( 1, "nightvision" ); @@ -2574,20 +2830,20 @@ botGiveLoadout( team, class, allowCopycat ) // Perks self _clearPerks(); self maps\mp\gametypes\_class::_detachAll(); - + // these special case giving pistol death have to come before // perk loadout to ensure player perk icons arent overwritten if ( level.dieHardMode ) self maps\mp\perks\_perks::givePerk( "specialty_pistoldeath" ); - + // only give the deathstreak for the initial spawn for this life. - if ( loadoutDeathStreak != "specialty_null" && (getTime() - self.spawnTime) < 0.1 ) + if ( loadoutDeathStreak != "specialty_null" && ( getTime() - self.spawnTime ) < 0.1 ) { deathVal = int( tableLookup( "mp/perkTable.csv", 1, loadoutDeathStreak, 6 ) ); - + if ( self botGetPerkUpgrade( loadoutPerk1 ) == "specialty_rollover" || self botGetPerkUpgrade( loadoutPerk2 ) == "specialty_rollover" || self botGetPerkUpgrade( loadoutPerk3 ) == "specialty_rollover" ) deathVal -= 1; - + if ( self.pers["cur_death_streak"] == deathVal ) { self thread maps\mp\perks\_perks::givePerk( loadoutDeathStreak ); @@ -2600,16 +2856,16 @@ botGiveLoadout( team, class, allowCopycat ) } self botLoadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 ); - + self maps\mp\gametypes\_class::setKillstreaks( loadoutKillstreak1, loadoutKillstreak2, loadoutKillstreak3 ); - + if ( self hasPerk( "specialty_extraammo", true ) && getWeaponClass( secondaryName ) != "weapon_projectile" ) self giveMaxAmmo( secondaryName ); // Primary Weapon primaryName = maps\mp\gametypes\_class::buildWeaponName( loadoutPrimary, loadoutPrimaryAttachment, loadoutPrimaryAttachment2 ); self _giveWeapon( primaryName, self.loadoutPrimaryCamo ); - + // fix changing from a riotshield class to a riotshield class during grace period not giving a shield if ( primaryName == "riotshield_mp" && level.inGracePeriod ) self notify ( "weapon_change", "riotshield_mp" ); @@ -2618,42 +2874,44 @@ botGiveLoadout( team, class, allowCopycat ) self giveMaxAmmo( primaryName ); self setSpawnWeapon( primaryName ); - + primaryTokens = strtok( primaryName, "_" ); self.pers["primaryWeapon"] = primaryTokens[0]; - + // Primary Offhand was given by givePerk (it's your perk1) - + // Secondary Offhand offhandSecondaryWeapon = loadoutOffhand + "_mp"; + if ( loadoutOffhand == "flash_grenade" ) self SetOffhandSecondaryClass( "flash" ); else self SetOffhandSecondaryClass( "smoke" ); - + self giveWeapon( offhandSecondaryWeapon ); - if( loadOutOffhand == "smoke_grenade" ) + + if ( loadOutOffhand == "smoke_grenade" ) self setWeaponAmmoClip( offhandSecondaryWeapon, 1 ); - else if( loadOutOffhand == "flash_grenade" ) + else if ( loadOutOffhand == "flash_grenade" ) self setWeaponAmmoClip( offhandSecondaryWeapon, 2 ); - else if( loadOutOffhand == "concussion_grenade" ) + else if ( loadOutOffhand == "concussion_grenade" ) self setWeaponAmmoClip( offhandSecondaryWeapon, 2 ); else self setWeaponAmmoClip( offhandSecondaryWeapon, 1 ); - + primaryWeapon = primaryName; self.primaryWeapon = primaryWeapon; self.secondaryWeapon = secondaryName; self botPlayerModelForWeapon( self.pers["primaryWeapon"], getBaseWeaponName( secondaryName ) ); - - self.isSniper = (weaponClass( self.primaryWeapon ) == "sniper"); - + + self.isSniper = ( weaponClass( self.primaryWeapon ) == "sniper" ); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); // cac specialties that require loop threads self maps\mp\perks\_perks::cac_selector(); - + self notify ( "changed_kit" ); self notify( "bot_giveLoadout", allowCopycat ); } @@ -2664,13 +2922,13 @@ botGiveLoadout( team, class, allowCopycat ) botGetPerkUpgrade( perkName ) { perkUpgrade = tablelookup( "mp/perktable.csv", 1, perkName, 8 ); - + if ( perkUpgrade == "" || perkUpgrade == "specialty_null" ) return "specialty_null"; - - if ( !isDefined(self.pers["bots"]["unlocks"]["upgraded_"+perkName]) || !self.pers["bots"]["unlocks"]["upgraded_"+perkName] ) + + if ( !isDefined( self.pers["bots"]["unlocks"]["upgraded_" + perkName] ) || !self.pers["bots"]["unlocks"]["upgraded_" + perkName] ) return "specialty_null"; - + return ( perkUpgrade ); } @@ -2692,20 +2950,20 @@ botLoadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3 ) perks[0] = loadoutPerk1; perks[1] = loadoutPerk2; perks[2] = loadoutPerk3; - + perkUpgrd[0] = tablelookup( "mp/perktable.csv", 1, loadoutPerk1, 8 ); perkUpgrd[1] = tablelookup( "mp/perktable.csv", 1, loadoutPerk2, 8 ); perkUpgrd[2] = tablelookup( "mp/perktable.csv", 1, loadoutPerk3, 8 ); - for (i = 0; i < perkUpgrd.size; i++) + for ( i = 0; i < perkUpgrd.size; i++ ) { upgrade = perkUpgrd[i]; perk = perks[i]; if ( upgrade == "" || upgrade == "specialty_null" ) continue; - - if ( isDefined(self.pers["bots"]["unlocks"]["upgraded_"+perk]) && self.pers["bots"]["unlocks"]["upgraded_"+perk] ) + + if ( isDefined( self.pers["bots"]["unlocks"]["upgraded_" + perk] ) && self.pers["bots"]["unlocks"]["upgraded_" + perk] ) self maps\mp\perks\_perks::givePerk( upgrade ); } @@ -2718,42 +2976,50 @@ botPlayerModelForWeapon( weapon, secondary ) { team = self.team; - + if ( isDefined( game[team + "_model"][weapon] ) ) { - [[game[team+"_model"][weapon]]](); + [[game[team + "_model"][weapon]]](); return; } - - + + weaponClass = tablelookup( "mp/statstable.csv", 4, weapon, 2 ); switch ( weaponClass ) { case "weapon_smg": - [[game[team+"_model"]["SMG"]]](); + [[game[team + "_model"]["SMG"]]](); break; + case "weapon_assault": weaponClass = tablelookup( "mp/statstable.csv", 4, secondary, 2 ); + if ( weaponClass == "weapon_shotgun" ) - [[game[team+"_model"]["SHOTGUN"]]](); + [[game[team + "_model"]["SHOTGUN"]]](); else - [[game[team+"_model"]["ASSAULT"]]](); + [[game[team + "_model"]["ASSAULT"]]](); + break; + case "weapon_sniper": - if ( level.environment != "" && isDefined(self.pers["bots"]["unlocks"]["ghillie"]) && self.pers["bots"]["unlocks"]["ghillie"] ) - [[game[team+"_model"]["GHILLIE"]]](); + if ( level.environment != "" && isDefined( self.pers["bots"]["unlocks"]["ghillie"] ) && self.pers["bots"]["unlocks"]["ghillie"] ) + [[game[team + "_model"]["GHILLIE"]]](); else - [[game[team+"_model"]["SNIPER"]]](); + [[game[team + "_model"]["SNIPER"]]](); + break; + case "weapon_lmg": - [[game[team+"_model"]["LMG"]]](); + [[game[team + "_model"]["LMG"]]](); break; + case "weapon_riot": - [[game[team+"_model"]["RIOT"]]](); + [[game[team + "_model"]["RIOT"]]](); break; + default: - [[game[team+"_model"]["ASSAULT"]]](); + [[game[team + "_model"]["ASSAULT"]]](); break; } } diff --git a/userraw/maps/mp/bots/_menu.gsc b/userraw/maps/mp/bots/_menu.gsc index 906a99a..d440ebb 100644 --- a/userraw/maps/mp/bots/_menu.gsc +++ b/userraw/maps/mp/bots/_menu.gsc @@ -12,10 +12,10 @@ init() { - if (getDvar("bots_main_menu") == "") - setDvar("bots_main_menu", true); + if ( getDvar( "bots_main_menu" ) == "" ) + setDvar( "bots_main_menu", true ); - if (!getDvarInt("bots_main_menu")) + if ( !getDvarInt( "bots_main_menu" ) ) return; thread watchPlayers(); @@ -23,21 +23,21 @@ init() watchPlayers() { - for (;;) + for ( ;; ) { wait 1; - if (!getDvarInt("bots_main_menu")) + if ( !getDvarInt( "bots_main_menu" ) ) return; - for (i = level.players.size - 1; i >= 0; i--) + for ( i = level.players.size - 1; i >= 0; i-- ) { player = level.players[i]; - if (!player is_host()) + if ( !player is_host() ) continue; - if (isDefined(player.menuInit) && player.menuInit) + if ( isDefined( player.menuInit ) && player.menuInit ) continue; player thread init_menu(); @@ -47,7 +47,7 @@ watchPlayers() kill_menu() { - self notify("bots_kill_menu"); + self notify( "bots_kill_menu" ); self.menuInit = undefined; } @@ -58,7 +58,7 @@ init_menu() self.menuOpen = false; self.menu_player = undefined; self.SubMenu = "Main"; - self.Curs["Main"]["X"] = 0; + self.Curs["Main"]["X"] = 0; self AddOptions(); self thread watchPlayerOpenMenu(); @@ -75,30 +75,30 @@ init_menu() watchDisconnect() { - self waittill_either("disconnect", "bots_kill_menu"); - - if(self.menuOpen) + self waittill_either( "disconnect", "bots_kill_menu" ); + + if ( self.menuOpen ) { - if(isDefined(self.MenuTextY)) - for(i = 0; i < self.MenuTextY.size; i++) - if(isDefined(self.MenuTextY[i])) + if ( isDefined( self.MenuTextY ) ) + for ( i = 0; i < self.MenuTextY.size; i++ ) + if ( isDefined( self.MenuTextY[i] ) ) self.MenuTextY[i] destroy(); - - if(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) + + if ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) { - if(isDefined(self.Menu["X"]["Shader"])) + if ( isDefined( self.Menu["X"]["Shader"] ) ) self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) self.Menu["X"]["Scroller"] destroy(); } - if (isDefined(self.menuVersionHud)) + if ( isDefined( self.menuVersionHud ) ) self.menuVersionHud destroy(); } } @@ -108,37 +108,41 @@ doGreetings() self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); wait 1; - self iPrintln("Welcome to Bot Warfare "+self.name+"!"); + self iPrintln( "Welcome to Bot Warfare " + self.name + "!" ); wait 5; - self iPrintln("Press [{+actionslot 2}] to open menu!"); + self iPrintln( "Press [{+actionslot 2}] to open menu!" ); } watchPlayerOpenMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + self notifyOnPlayerCommand( "bots_open_menu", "+actionslot 2" ); - for(;;) + + for ( ;; ) { self waittill( "bots_open_menu" ); - if(!self.menuOpen) + + if ( !self.menuOpen ) { self playLocalSound( "mouse_click" ); - self thread OpenSub(self.SubMenu); + self thread OpenSub( self.SubMenu ); } else { self playLocalSound( "mouse_click" ); - if(self.SubMenu != "Main") + + if ( self.SubMenu != "Main" ) self ExitSub(); else { self ExitMenu(); - if(!gameFlag( "prematch_done" ) || level.gameEnded) - self freezeControls(true); + + if ( !gameFlag( "prematch_done" ) || level.gameEnded ) + self freezeControls( true ); else - self freezecontrols(false); + self freezecontrols( false ); } } } @@ -148,18 +152,21 @@ MenuSelect() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - - self notifyOnPlayerCommand("bots_select", "+gostand"); - for(;;) + + self notifyOnPlayerCommand( "bots_select", "+gostand" ); + + for ( ;; ) { self waittill( "bots_select" ); - if(self.MenuOpen) + + if ( self.MenuOpen ) { self playLocalSound( "mouse_click" ); - if(self.SubMenu == "Main") - self thread [[self.Option["Function"][self.SubMenu][self.Curs["Main"]["X"]]]](self.Option["Arg1"][self.SubMenu][self.Curs["Main"]["X"]],self.Option["Arg2"][self.SubMenu][self.Curs["Main"]["X"]]); + + if ( self.SubMenu == "Main" ) + self thread [[self.Option["Function"][self.SubMenu][self.Curs["Main"]["X"]]]]( self.Option["Arg1"][self.SubMenu][self.Curs["Main"]["X"]], self.Option["Arg2"][self.SubMenu][self.Curs["Main"]["X"]] ); else - self thread [[self.Option["Function"][self.SubMenu][self.Curs[self.SubMenu]["Y"]]]](self.Option["Arg1"][self.SubMenu][self.Curs[self.SubMenu]["Y"]],self.Option["Arg2"][self.SubMenu][self.Curs[self.SubMenu]["Y"]]); + self thread [[self.Option["Function"][self.SubMenu][self.Curs[self.SubMenu]["Y"]]]]( self.Option["Arg1"][self.SubMenu][self.Curs[self.SubMenu]["Y"]], self.Option["Arg2"][self.SubMenu][self.Curs[self.SubMenu]["Y"]] ); } } } @@ -169,19 +176,21 @@ LeftMenu() self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - self notifyOnPlayerCommand( "bots_left", "+moveleft" ); - for(;;) + self notifyOnPlayerCommand( "bots_left", "+moveleft" ); + + for ( ;; ) { self waittill( "bots_left" ); - if(self.MenuOpen && self.SubMenu == "Main") + + if ( self.MenuOpen && self.SubMenu == "Main" ) { - self playLocalSound("mouse_over"); + self playLocalSound( "mouse_over" ); self.Curs["Main"]["X"]--; - if(self.Curs["Main"]["X"] < 0) - self.Curs["Main"]["X"] = self.Option["Name"][self.SubMenu].size -1; + if ( self.Curs["Main"]["X"] < 0 ) + self.Curs["Main"]["X"] = self.Option["Name"][self.SubMenu].size - 1; - self CursMove("X"); + self CursMove( "X" ); } } } @@ -191,19 +200,21 @@ RightMenu() self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - self notifyOnPlayerCommand("bots_right", "+moveright"); - for(;;) + self notifyOnPlayerCommand( "bots_right", "+moveright" ); + + for ( ;; ) { self waittill( "bots_right" ); - if(self.MenuOpen && self.SubMenu == "Main") + + if ( self.MenuOpen && self.SubMenu == "Main" ) { - self playLocalSound("mouse_over"); + self playLocalSound( "mouse_over" ); self.Curs["Main"]["X"]++; - if(self.Curs["Main"]["X"] > self.Option["Name"][self.SubMenu].size -1) + if ( self.Curs["Main"]["X"] > self.Option["Name"][self.SubMenu].size - 1 ) self.Curs["Main"]["X"] = 0; - self CursMove("X"); + self CursMove( "X" ); } } } @@ -212,20 +223,22 @@ UpMenu() { self endon ( "disconnect" ); self endon ( "bots_kill_menu" ); - + self notifyOnPlayerCommand( "bots_up", "+forward" ); - for(;;) + + for ( ;; ) { self waittill( "bots_up" ); - if(self.MenuOpen && self.SubMenu != "Main") + + if ( self.MenuOpen && self.SubMenu != "Main" ) { - self playLocalSound("mouse_over"); + self playLocalSound( "mouse_over" ); self.Curs[self.SubMenu]["Y"]--; - if(self.Curs[self.SubMenu]["Y"] < 0) - self.Curs[self.SubMenu]["Y"] = self.Option["Name"][self.SubMenu].size -1; + if ( self.Curs[self.SubMenu]["Y"] < 0 ) + self.Curs[self.SubMenu]["Y"] = self.Option["Name"][self.SubMenu].size - 1; - self CursMove("Y"); + self CursMove( "Y" ); } } } @@ -236,224 +249,233 @@ DownMenu() self endon ( "bots_kill_menu" ); self notifyOnPlayerCommand( "bots_down", "+back" ); - for(;;) + + for ( ;; ) { self waittill( "bots_down" ); - if(self.MenuOpen && self.SubMenu != "Main") + + if ( self.MenuOpen && self.SubMenu != "Main" ) { - self playLocalSound("mouse_over"); + self playLocalSound( "mouse_over" ); self.Curs[self.SubMenu]["Y"]++; - if(self.Curs[self.SubMenu]["Y"] > self.Option["Name"][self.SubMenu].size -1) + if ( self.Curs[self.SubMenu]["Y"] > self.Option["Name"][self.SubMenu].size - 1 ) self.Curs[self.SubMenu]["Y"] = 0; - self CursMove("Y"); + self CursMove( "Y" ); } } } -OpenSub(menu, menu2) +OpenSub( menu, menu2 ) { - if(menu != "Main" && (!isDefined(self.Menu[menu]) || !!isDefined(self.Menu[menu]["FirstOpen"]))) + if ( menu != "Main" && ( !isDefined( self.Menu[menu] ) || !!isDefined( self.Menu[menu]["FirstOpen"] ) ) ) { self.Curs[menu]["Y"] = 0; self.Menu[menu]["FirstOpen"] = true; } - + logoldi = true; self.SubMenu = menu; - - if(self.SubMenu == "Main") + + if ( self.SubMenu == "Main" ) { - if(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) + if ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) { - if(isDefined(self.Menu["X"]["Shader"])) + if ( isDefined( self.Menu["X"]["Shader"] ) ) self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) self.Menu["X"]["Scroller"] destroy(); } - if (isDefined(self.menuVersionHud)) + if ( isDefined( self.menuVersionHud ) ) self.menuVersionHud destroy(); - - for(i=0 ; i < self.Option["Name"][self.SubMenu].size ; i++) + + for ( i = 0 ; i < self.Option["Name"][self.SubMenu].size ; i++ ) { - self.MenuText[i] = self createfontstring("default", 1.6); - self.MenuText[i] setpoint("CENTER", "CENTER", -300+(i*100), -226); - self.MenuText[i] settext(self.Option["Name"][self.SubMenu][i]); - if(logOldi) + self.MenuText[i] = self createfontstring( "default", 1.6 ); + self.MenuText[i] setpoint( "CENTER", "CENTER", -300 + ( i * 100 ), -226 ); + self.MenuText[i] settext( self.Option["Name"][self.SubMenu][i] ); + + if ( logOldi ) self.oldi = i; - - if(self.MenuText[i].x > 300) + + if ( self.MenuText[i].x > 300 ) { logOldi = false; x = i - self.oldi; - self.MenuText[i] setpoint("CENTER", "CENTER", (((-300)-(i*100))+(i*100))+(x*100), -196); + self.MenuText[i] setpoint( "CENTER", "CENTER", ( ( ( -300 ) - ( i * 100 ) ) + ( i * 100 ) ) + ( x * 100 ), -196 ); } + self.MenuText[i].alpha = 1; self.MenuText[i].sort = 999; } - if(!logOldi) - self.Menu["X"]["Shader"] = self createRectangle("CENTER","CENTER",0,-225,1000,90, (0,0,0), -2, 1,"white"); + if ( !logOldi ) + self.Menu["X"]["Shader"] = self createRectangle( "CENTER", "CENTER", 0, -225, 1000, 90, ( 0, 0, 0 ), -2, 1, "white" ); else - self.Menu["X"]["Shader"] = self createRectangle("CENTER","CENTER",0,-225,1000,30, (0,0,0), -2, 1,"white"); + self.Menu["X"]["Shader"] = self createRectangle( "CENTER", "CENTER", 0, -225, 1000, 30, ( 0, 0, 0 ), -2, 1, "white" ); - self.Menu["X"]["Scroller"] = self createRectangle("CENTER","CENTER", self.MenuText[self.Curs["Main"]["X"]].x,-225,105,22, (1,0,0), -1, 1,"white"); - - self CursMove("X"); + self.Menu["X"]["Scroller"] = self createRectangle( "CENTER", "CENTER", self.MenuText[self.Curs["Main"]["X"]].x, -225, 105, 22, ( 1, 0, 0 ), -1, 1, "white" ); - self.menuVersionHud = initHudElem("Bot Warfare " + level.bw_VERSION, 0, 0); + 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])) + if ( isDefined( self.MenuTextY ) ) + for ( i = 0 ; i < self.MenuTextY.size ; i++ ) + if ( isDefined( self.MenuTextY[i] ) ) self.MenuTextY[i] destroy(); - - for(i=0 ; i < self.Option["Name"][self.SubMenu].size ; i++) + + for ( i = 0 ; i < self.Option["Name"][self.SubMenu].size ; i++ ) { - self.MenuTextY[i] = self createfontstring("default", 1.6); - self.MenuTextY[i] setpoint("CENTER", "CENTER", self.MenuText[self.Curs["Main"]["X"]].x, -160+(i*20)); - self.MenuTextY[i] settext(self.Option["Name"][self.SubMenu][i]); + self.MenuTextY[i] = self createfontstring( "default", 1.6 ); + self.MenuTextY[i] setpoint( "CENTER", "CENTER", self.MenuText[self.Curs["Main"]["X"]].x, -160 + ( i * 20 ) ); + self.MenuTextY[i] settext( self.Option["Name"][self.SubMenu][i] ); self.MenuTextY[i].alpha = 1; self.MenuTextY[i].sort = 999; } - - self CursMove("Y"); + + self CursMove( "Y" ); } } -CursMove(direction) +CursMove( direction ) { - self notify("scrolled"); - if(self.SubMenu == "Main") + self notify( "scrolled" ); + + if ( self.SubMenu == "Main" ) { self.Menu["X"]["Scroller"].x = self.MenuText[self.Curs["Main"]["X"]].x; self.Menu["X"]["Scroller"].y = self.MenuText[self.Curs["Main"]["X"]].y; - - if(isDefined(self.MenuText)) + + if ( isDefined( self.MenuText ) ) { - for(i = 0; i < self.MenuText.size; i++) + for ( i = 0; i < self.MenuText.size; i++ ) { - if(isDefined(self.MenuText[i])) + if ( isDefined( self.MenuText[i] ) ) { self.MenuText[i].fontscale = 1.5; - self.MenuText[i].color = (1,1,1); + self.MenuText[i].color = ( 1, 1, 1 ); self.MenuText[i].glowAlpha = 0; } } } - - self thread ShowOptionOn(direction); + + self thread ShowOptionOn( direction ); } else { - if(isDefined(self.MenuTextY)) + if ( isDefined( self.MenuTextY ) ) { - for(i = 0; i < self.MenuTextY.size; i++) + for ( i = 0; i < self.MenuTextY.size; i++ ) { - if(isDefined(self.MenuTextY[i])) + if ( isDefined( self.MenuTextY[i] ) ) { self.MenuTextY[i].fontscale = 1.5; - self.MenuTextY[i].color = (1,1,1); + self.MenuTextY[i].color = ( 1, 1, 1 ); self.MenuTextY[i].glowAlpha = 0; } } } - - if(isDefined(self.MenuText)) + + if ( isDefined( self.MenuText ) ) { - for(i = 0; i < self.MenuText.size; i++) + for ( i = 0; i < self.MenuText.size; i++ ) { - if(isDefined(self.MenuText[i])) + if ( isDefined( self.MenuText[i] ) ) { self.MenuText[i].fontscale = 1.5; - self.MenuText[i].color = (1,1,1); + self.MenuText[i].color = ( 1, 1, 1 ); self.MenuText[i].glowAlpha = 0; } } } - - self thread ShowOptionOn(direction); + + self thread ShowOptionOn( direction ); } } -ShowOptionOn(variable) +ShowOptionOn( variable ) { - self endon("scrolled"); - self endon("disconnect"); - self endon("exit"); - self endon("bots_kill_menu"); - - for(time=0;;time+=0.05) + self endon( "scrolled" ); + self endon( "disconnect" ); + self endon( "exit" ); + self endon( "bots_kill_menu" ); + + for ( time = 0;; time += 0.05 ) { - if(!self isOnGround() && isAlive(self) && gameFlag( "prematch_done" ) && !level.gameEnded) - self freezecontrols(false); + if ( !self isOnGround() && isAlive( self ) && gameFlag( "prematch_done" ) && !level.gameEnded ) + self freezecontrols( false ); else - self freezecontrols(true); - - self setClientDvar( "r_blur", "5" ); + self freezecontrols( true ); + + self setClientDvar( "r_blur", "5" ); self setClientDvar( "sc_blur", "15" ); self addOptions(); - - if(self.SubMenu == "Main") + + if ( self.SubMenu == "Main" ) { - if(isDefined(self.Curs[self.SubMenu][variable]) && isDefined(self.MenuText) && isDefined(self.MenuText[self.Curs[self.SubMenu][variable]])) + if ( isDefined( self.Curs[self.SubMenu][variable] ) && isDefined( self.MenuText ) && isDefined( self.MenuText[self.Curs[self.SubMenu][variable]] ) ) { self.MenuText[self.Curs[self.SubMenu][variable]].fontscale = 2.0; //self.MenuText[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255); - color = (6/255,69/255,173+randomIntRange(-5,5)/255); - if (int(time * 4) % 2) - color = (11/255,0/255,128+randomIntRange(-10,10)/255); + color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 ); + + if ( int( time * 4 ) % 2 ) + color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 ); + self.MenuText[self.Curs[self.SubMenu][variable]].color = color; } - - if(isDefined(self.MenuText)) + + if ( isDefined( self.MenuText ) ) { - for(i = 0; i < self.Option["Name"][self.SubMenu].size; i++) + for ( i = 0; i < self.Option["Name"][self.SubMenu].size; i++ ) { - if(isDefined(self.MenuText[i])) - self.MenuText[i] settext(self.Option["Name"][self.SubMenu][i]); + if ( isDefined( self.MenuText[i] ) ) + self.MenuText[i] settext( self.Option["Name"][self.SubMenu][i] ); } } } else { - if(isDefined(self.Curs[self.SubMenu][variable]) && isDefined(self.MenuTextY) && isDefined(self.MenuTextY[self.Curs[self.SubMenu][variable]])) + if ( isDefined( self.Curs[self.SubMenu][variable] ) && isDefined( self.MenuTextY ) && isDefined( self.MenuTextY[self.Curs[self.SubMenu][variable]] ) ) { self.MenuTextY[self.Curs[self.SubMenu][variable]].fontscale = 2.0; //self.MenuTextY[self.Curs[self.SubMenu][variable]].color = (randomInt(256)/255, randomInt(256)/255, randomInt(256)/255); - color = (6/255,69/255,173+randomIntRange(-5,5)/255); - if (int(time * 4) % 2) - color = (11/255,0/255,128+randomIntRange(-10,10)/255); + color = ( 6 / 255, 69 / 255, 173 + randomIntRange( -5, 5 ) / 255 ); + + if ( int( time * 4 ) % 2 ) + color = ( 11 / 255, 0 / 255, 128 + randomIntRange( -10, 10 ) / 255 ); + self.MenuTextY[self.Curs[self.SubMenu][variable]].color = color; } - - if(isDefined(self.MenuTextY)) + + if ( isDefined( self.MenuTextY ) ) { - for(i = 0; i < self.Option["Name"][self.SubMenu].size; i++) + for ( i = 0; i < self.Option["Name"][self.SubMenu].size; i++ ) { - if(isDefined(self.MenuTextY[i])) - self.MenuTextY[i] settext(self.Option["Name"][self.SubMenu][i]); + if ( isDefined( self.MenuTextY[i] ) ) + self.MenuTextY[i] settext( self.Option["Name"][self.SubMenu][i] ); } } } - + wait 0.05; } } -AddMenu(menu, num, text, function, arg1, arg2) +AddMenu( menu, num, text, function, arg1, arg2 ) { self.Option["Name"][menu][num] = text; self.Option["Function"][menu][num] = function; @@ -461,56 +483,56 @@ AddMenu(menu, num, text, function, arg1, arg2) self.Option["Arg2"][menu][num] = arg2; } -AddBack(menu, back) +AddBack( menu, back ) { self.Menu["Back"][menu] = back; } ExitSub() { - if(isDefined(self.MenuTextY)) - for(i = 0; i < self.MenuTextY.size; i++) - if(isDefined(self.MenuTextY[i])) + if ( isDefined( self.MenuTextY ) ) + for ( i = 0; i < self.MenuTextY.size; i++ ) + if ( isDefined( self.MenuTextY[i] ) ) self.MenuTextY[i] destroy(); - + self.SubMenu = self.Menu["Back"][self.Submenu]; - - if(self.SubMenu == "Main") - self CursMove("X"); + + if ( self.SubMenu == "Main" ) + self CursMove( "X" ); else - self CursMove("Y"); + self CursMove( "Y" ); } ExitMenu() { - if(isDefined(self.MenuText)) - for(i = 0; i < self.MenuText.size; i++) - if(isDefined(self.MenuText[i])) + if ( isDefined( self.MenuText ) ) + for ( i = 0; i < self.MenuText.size; i++ ) + if ( isDefined( self.MenuText[i] ) ) self.MenuText[i] destroy(); - - if(isDefined(self.Menu) && isDefined(self.Menu["X"])) + + if ( isDefined( self.Menu ) && isDefined( self.Menu["X"] ) ) { - if(isDefined(self.Menu["X"]["Shader"])) + if ( isDefined( self.Menu["X"]["Shader"] ) ) self.Menu["X"]["Shader"] destroy(); - - if(isDefined(self.Menu["X"]["Scroller"])) + + if ( isDefined( self.Menu["X"]["Scroller"] ) ) self.Menu["X"]["Scroller"] destroy(); } - if (isDefined(self.menuVersionHud)) + if ( isDefined( self.menuVersionHud ) ) self.menuVersionHud destroy(); - + self.MenuOpen = false; - self notify("exit"); - + self notify( "exit" ); + self setClientDvar( "r_blur", "0" ); self setClientDvar( "sc_blur", "2" ); } -initHudElem(txt, xl, yl) +initHudElem( txt, xl, yl ) { hud = NewClientHudElem( self ); - hud setText(txt); + hud setText( txt ); hud.alignX = "center"; hud.alignY = "bottom"; hud.horzAlign = "center"; @@ -525,11 +547,11 @@ initHudElem(txt, xl, yl) hud.glowColor = ( 0, 0, 0 ); hud.glowAlpha = 1; hud.color = ( 1.0, 1.0, 1.0 ); - + return hud; } -createRectangle(align,relative,x,y,width,height,color,sort,alpha,shader) +createRectangle( align, relative, x, y, width, height, color, sort, alpha, shader ) { barElemBG = newClientHudElem( self ); barElemBG.elemType = "bar_"; @@ -544,449 +566,545 @@ createRectangle(align,relative,x,y,width,height,color,sort,alpha,shader) barElemBG.color = color; barElemBG.alpha = alpha; barElemBG setParent( level.uiParent ); - barElemBG setShader( shader, width , height ); + barElemBG setShader( shader, width, height ); barElemBG.hidden = false; - barElemBG setPoint(align, relative, x, y); + barElemBG setPoint( align, relative, x, y ); return barElemBG; } AddOptions() { - self AddMenu("Main", 0, "Manage bots", ::OpenSub, "man_bots", ""); - self AddBack("man_bots", "Main"); - + self AddMenu( "Main", 0, "Manage bots", ::OpenSub, "man_bots", "" ); + self AddBack( "man_bots", "Main" ); + _temp = ""; - _tempDvar = getDvarInt("bots_manage_add"); - self AddMenu("man_bots", 0, "Add 1 bot", ::man_bots, "add", 1 + _tempDvar); - self AddMenu("man_bots", 1, "Add 3 bot", ::man_bots, "add", 3 + _tempDvar); - self AddMenu("man_bots", 2, "Add 7 bot", ::man_bots, "add", 7 + _tempDvar); - self AddMenu("man_bots", 3, "Add 11 bot", ::man_bots, "add", 11 + _tempDvar); - self AddMenu("man_bots", 4, "Add 17 bot", ::man_bots, "add", 17 + _tempDvar); - self AddMenu("man_bots", 5, "Kick a bot", ::man_bots, "kick", 1); - self AddMenu("man_bots", 6, "Kick all bots", ::man_bots, "kick", getBotArray().size); - - _tempDvar = getDvarInt("bots_manage_fill_kick"); - if(_tempDvar) + _tempDvar = getDvarInt( "bots_manage_add" ); + self AddMenu( "man_bots", 0, "Add 1 bot", ::man_bots, "add", 1 + _tempDvar ); + self AddMenu( "man_bots", 1, "Add 3 bot", ::man_bots, "add", 3 + _tempDvar ); + self AddMenu( "man_bots", 2, "Add 7 bot", ::man_bots, "add", 7 + _tempDvar ); + self AddMenu( "man_bots", 3, "Add 11 bot", ::man_bots, "add", 11 + _tempDvar ); + self AddMenu( "man_bots", 4, "Add 17 bot", ::man_bots, "add", 17 + _tempDvar ); + self AddMenu( "man_bots", 5, "Kick a bot", ::man_bots, "kick", 1 ); + self AddMenu( "man_bots", 6, "Kick all bots", ::man_bots, "kick", getBotArray().size ); + + _tempDvar = getDvarInt( "bots_manage_fill_kick" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar); - - _tempDvar = getDvarInt("bots_manage_fill_mode"); - switch(_tempDvar) + + self AddMenu( "man_bots", 7, "Toggle auto bot kicking: " + _temp, ::man_bots, "autokick", _tempDvar ); + + _tempDvar = getDvarInt( "bots_manage_fill_mode" ); + + switch ( _tempDvar ) { case 0: _temp = "everyone"; - break; + break; + case 1: _temp = "just bots"; - break; + break; + case 2: _temp = "everyone, adjust to map"; - break; + break; + case 3: _temp = "just bots, adjust to map"; - break; + break; + case 4: _temp = "bots used as team balance"; - break; + break; + default: _temp = "out of range"; - break; + break; } - self AddMenu("man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar); - - _tempDvar = getDvarInt("bots_manage_fill"); - self AddMenu("man_bots", 9, "Increase bots to keep in-game: " + _tempDvar, ::man_bots, "fillup", _tempDvar); - self AddMenu("man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar); - - _tempDvar = getDvarInt("bots_manage_fill_spec"); - if(_tempDvar) + + self AddMenu( "man_bots", 8, "Change bot_fill_mode: " + _temp, ::man_bots, "fillmode", _tempDvar ); + + _tempDvar = getDvarInt( "bots_manage_fill" ); + self AddMenu( "man_bots", 9, "Increase bots to keep in-game: " + _tempDvar, ::man_bots, "fillup", _tempDvar ); + self AddMenu( "man_bots", 10, "Decrease bots to keep in-game: " + _tempDvar, ::man_bots, "filldown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_manage_fill_spec" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar); + + self AddMenu( "man_bots", 11, "Count players for fill on spectator: " + _temp, ::man_bots, "fillspec", _tempDvar ); // - self AddMenu("Main", 1, "Teams and difficulty", ::OpenSub, "man_team", ""); - self AddBack("man_team", "Main"); - - _tempDvar = getdvar("bots_team"); - self AddMenu("man_team", 0, "Change bot team: "+_tempDvar, ::bot_teams, "team", _tempDvar); - - _tempDvar = getDvarInt("bots_team_amount"); - self AddMenu("man_team", 1, "Increase bots to be on axis team: "+_tempDvar, ::bot_teams, "teamup", _tempDvar); - self AddMenu("man_team", 2, "Decrease bots to be on axis team: "+_tempDvar, ::bot_teams, "teamdown", _tempDvar); - - _tempDvar = getDvarInt("bots_team_force"); - if(_tempDvar) + self AddMenu( "Main", 1, "Teams and difficulty", ::OpenSub, "man_team", "" ); + self AddBack( "man_team", "Main" ); + + _tempDvar = getdvar( "bots_team" ); + self AddMenu( "man_team", 0, "Change bot team: " + _tempDvar, ::bot_teams, "team", _tempDvar ); + + _tempDvar = getDvarInt( "bots_team_amount" ); + self AddMenu( "man_team", 1, "Increase bots to be on axis team: " + _tempDvar, ::bot_teams, "teamup", _tempDvar ); + self AddMenu( "man_team", 2, "Decrease bots to be on axis team: " + _tempDvar, ::bot_teams, "teamdown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_team_force" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar); - - _tempDvar = getDvarInt("bots_team_mode"); - if(_tempDvar) + + self AddMenu( "man_team", 3, "Toggle forcing bots on team: " + _temp, ::bot_teams, "teamforce", _tempDvar ); + + _tempDvar = getDvarInt( "bots_team_mode" ); + + if ( _tempDvar ) _temp = "only bots"; else _temp = "everyone"; - self AddMenu("man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar); - - _tempDvar = getdvarint("bots_skill"); - switch(_tempDvar) + + self AddMenu( "man_team", 4, "Toggle bot_team_bot: " + _temp, ::bot_teams, "teammode", _tempDvar ); + + _tempDvar = getdvarint( "bots_skill" ); + + switch ( _tempDvar ) { case 0: _temp = "random for all"; - break; + break; + case 1: _temp = "too easy"; - break; + break; + case 2: _temp = "easy"; - break; + break; + case 3: _temp = "easy-medium"; - break; + break; + case 4: _temp = "medium"; - break; + break; + case 5: _temp = "hard"; - break; + break; + case 6: _temp = "very hard"; - break; + break; + case 7: _temp = "hardest"; - break; + break; + case 8: _temp = "custom"; - break; + break; + case 9: _temp = "complete random"; - break; + break; + default: _temp = "out of range"; - break; + break; } - self AddMenu("man_team", 5, "Change bot difficulty: "+_temp, ::bot_teams, "skill", _tempDvar); - - _tempDvar = getDvarInt("bots_skill_axis_hard"); - self AddMenu("man_team", 6, "Increase amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axishardup", _tempDvar); - self AddMenu("man_team", 7, "Decrease amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axisharddown", _tempDvar); - - _tempDvar = getDvarInt("bots_skill_axis_med"); - self AddMenu("man_team", 8, "Increase amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismedup", _tempDvar); - self AddMenu("man_team", 9, "Decrease amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismeddown", _tempDvar); - - _tempDvar = getDvarInt("bots_skill_allies_hard"); - self AddMenu("man_team", 10, "Increase amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "allieshardup", _tempDvar); - self AddMenu("man_team", 11, "Decrease amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "alliesharddown", _tempDvar); - - _tempDvar = getDvarInt("bots_skill_allies_med"); - self AddMenu("man_team", 12, "Increase amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmedup", _tempDvar); - self AddMenu("man_team", 13, "Decrease amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmeddown", _tempDvar); + + self AddMenu( "man_team", 5, "Change bot difficulty: " + _temp, ::bot_teams, "skill", _tempDvar ); + + _tempDvar = getDvarInt( "bots_skill_axis_hard" ); + self AddMenu( "man_team", 6, "Increase amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axishardup", _tempDvar ); + self AddMenu( "man_team", 7, "Decrease amount of hard bots on axis team: " + _tempDvar, ::bot_teams, "axisharddown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_skill_axis_med" ); + self AddMenu( "man_team", 8, "Increase amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismedup", _tempDvar ); + self AddMenu( "man_team", 9, "Decrease amount of med bots on axis team: " + _tempDvar, ::bot_teams, "axismeddown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_skill_allies_hard" ); + self AddMenu( "man_team", 10, "Increase amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "allieshardup", _tempDvar ); + self AddMenu( "man_team", 11, "Decrease amount of hard bots on allies team: " + _tempDvar, ::bot_teams, "alliesharddown", _tempDvar ); + + _tempDvar = getDvarInt( "bots_skill_allies_med" ); + self AddMenu( "man_team", 12, "Increase amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmedup", _tempDvar ); + self AddMenu( "man_team", 13, "Decrease amount of med bots on allies team: " + _tempDvar, ::bot_teams, "alliesmeddown", _tempDvar ); // - self AddMenu("Main", 2, "Bot settings", ::OpenSub, "set1", ""); - self AddBack("set1", "Main"); + self AddMenu( "Main", 2, "Bot settings", ::OpenSub, "set1", "" ); + self AddBack( "set1", "Main" ); - _tempDvar = getDvarInt("bots_loadout_reasonable"); - if(_tempDvar) + _tempDvar = getDvarInt( "bots_loadout_reasonable" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 0, "Bots use only good class setups: "+_temp, ::bot_func, "reasonable", _tempDvar); - _tempDvar = getDvarInt("bots_loadout_allow_op"); - if(_tempDvar) + self AddMenu( "set1", 0, "Bots use only good class setups: " + _temp, ::bot_func, "reasonable", _tempDvar ); + + _tempDvar = getDvarInt( "bots_loadout_allow_op" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 1, "Bots can use op and annoying class setups: "+_temp, ::bot_func, "op", _tempDvar); - _tempDvar = getDvarInt("bots_play_move"); - if(_tempDvar) + self AddMenu( "set1", 1, "Bots can use op and annoying class setups: " + _temp, ::bot_func, "op", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_move" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 2, "Bots can move: "+_temp, ::bot_func, "move", _tempDvar); - _tempDvar = getDvarInt("bots_play_knife"); - if(_tempDvar) + self AddMenu( "set1", 2, "Bots can move: " + _temp, ::bot_func, "move", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_knife" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 3, "Bots can knife: "+_temp, ::bot_func, "knife", _tempDvar); - _tempDvar = getDvarInt("bots_play_fire"); - if(_tempDvar) + self AddMenu( "set1", 3, "Bots can knife: " + _temp, ::bot_func, "knife", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_fire" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 4, "Bots can fire: "+_temp, ::bot_func, "fire", _tempDvar); - _tempDvar = getDvarInt("bots_play_nade"); - if(_tempDvar) + self AddMenu( "set1", 4, "Bots can fire: " + _temp, ::bot_func, "fire", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_nade" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 5, "Bots can nade: "+_temp, ::bot_func, "nade", _tempDvar); - _tempDvar = getDvarInt("bots_play_take_carepackages"); - if(_tempDvar) + self AddMenu( "set1", 5, "Bots can nade: " + _temp, ::bot_func, "nade", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_take_carepackages" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 6, "Bots can take carepackages: "+_temp, ::bot_func, "care", _tempDvar); - _tempDvar = getDvarInt("bots_play_obj"); - if(_tempDvar) + self AddMenu( "set1", 6, "Bots can take carepackages: " + _temp, ::bot_func, "care", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_obj" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 7, "Bots play the objective: "+_temp, ::bot_func, "obj", _tempDvar); - _tempDvar = getDvarInt("bots_play_camp"); - if(_tempDvar) + self AddMenu( "set1", 7, "Bots play the objective: " + _temp, ::bot_func, "obj", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_camp" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 8, "Bots can camp: "+_temp, ::bot_func, "camp", _tempDvar); - _tempDvar = getDvarInt("bots_play_jumpdrop"); - if(_tempDvar) + self AddMenu( "set1", 8, "Bots can camp: " + _temp, ::bot_func, "camp", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_jumpdrop" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 9, "Bots can jump and dropshot: "+_temp, ::bot_func, "jump", _tempDvar); - _tempDvar = getDvarInt("bots_play_target_other"); - if(_tempDvar) + self AddMenu( "set1", 9, "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", 10, "Bots can target other script objects: "+_temp, ::bot_func, "targetother", _tempDvar); - _tempDvar = getDvarInt("bots_play_killstreak"); - if(_tempDvar) + self AddMenu( "set1", 10, "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", 11, "Bots can use killstreaks: "+_temp, ::bot_func, "killstreak", _tempDvar); - _tempDvar = getDvarInt("bots_play_ads"); - if(_tempDvar) + self AddMenu( "set1", 11, "Bots can use killstreaks: " + _temp, ::bot_func, "killstreak", _tempDvar ); + + _tempDvar = getDvarInt( "bots_play_ads" ); + + if ( _tempDvar ) _temp = "true"; else _temp = "false"; - self AddMenu("set1", 12, "Bots can ads: "+_temp, ::bot_func, "ads", _tempDvar); + + self AddMenu( "set1", 12, "Bots can ads: " + _temp, ::bot_func, "ads", _tempDvar ); } -bot_func(a, b) +bot_func( a, b ) { - switch (a) + switch ( a ) { case "reasonable": - setDvar("bots_loadout_reasonable", !b); - self iPrintln("Bots using reasonable setups: " + !b); - break; + setDvar( "bots_loadout_reasonable", !b ); + self iPrintln( "Bots using reasonable setups: " + !b ); + break; + case "op": - setDvar("bots_loadout_allow_op", !b); - self iPrintln("Bots using op setups: " + !b); - break; + setDvar( "bots_loadout_allow_op", !b ); + self iPrintln( "Bots using op setups: " + !b ); + break; + case "move": - setDvar("bots_play_move", !b); - self iPrintln("Bots move: " + !b); - break; + setDvar( "bots_play_move", !b ); + self iPrintln( "Bots move: " + !b ); + break; + case "knife": - setDvar("bots_play_knife", !b); - self iPrintln("Bots knife: " + !b); - break; + setDvar( "bots_play_knife", !b ); + self iPrintln( "Bots knife: " + !b ); + break; + case "fire": - setDvar("bots_play_fire", !b); - self iPrintln("Bots fire: " + !b); - break; + setDvar( "bots_play_fire", !b ); + self iPrintln( "Bots fire: " + !b ); + break; + case "nade": - setDvar("bots_play_nade", !b); - self iPrintln("Bots nade: " + !b); - break; + setDvar( "bots_play_nade", !b ); + self iPrintln( "Bots nade: " + !b ); + break; + case "care": - setDvar("bots_play_take_carepackages", !b); - self iPrintln("Bots take carepackages: " + !b); - break; + setDvar( "bots_play_take_carepackages", !b ); + self iPrintln( "Bots take carepackages: " + !b ); + break; + case "obj": - setDvar("bots_play_obj", !b); - self iPrintln("Bots play the obj: " + !b); - break; + setDvar( "bots_play_obj", !b ); + self iPrintln( "Bots play the obj: " + !b ); + break; + case "camp": - setDvar("bots_play_camp", !b); - self iPrintln("Bots camp: " + !b); - break; + setDvar( "bots_play_camp", !b ); + self iPrintln( "Bots camp: " + !b ); + break; + case "jump": - setDvar("bots_play_jumpdrop", !b); - self iPrintln("Bots jump: " + !b); - break; + setDvar( "bots_play_jumpdrop", !b ); + self iPrintln( "Bots jump: " + !b ); + break; + case "targetother": - setDvar("bots_play_target_other", !b); - self iPrintln("Bots target other: " + !b); - break; + setDvar( "bots_play_target_other", !b ); + self iPrintln( "Bots target other: " + !b ); + break; + case "killstreak": - setDvar("bots_play_killstreak", !b); - self iPrintln("Bots use killstreaks: " + !b); - break; + setDvar( "bots_play_killstreak", !b ); + self iPrintln( "Bots use killstreaks: " + !b ); + break; + case "ads": - setDvar("bots_play_ads", !b); - self iPrintln("Bots ads: " + !b); - break; + setDvar( "bots_play_ads", !b ); + self iPrintln( "Bots ads: " + !b ); + break; } } -bot_teams(a, b) +bot_teams( a, b ) { - switch(a) + switch ( a ) { case "team": - switch(b) + switch ( b ) { case "autoassign": - setdvar("bots_team", "allies"); - self iPrintlnBold("Changed bot team to allies."); - break; + setdvar( "bots_team", "allies" ); + self iPrintlnBold( "Changed bot team to allies." ); + break; + case "allies": - setdvar("bots_team", "axis"); - self iPrintlnBold("Changed bot team to axis."); - break; + setdvar( "bots_team", "axis" ); + self iPrintlnBold( "Changed bot team to axis." ); + break; + case "axis": - setdvar("bots_team", "custom"); - self iPrintlnBold("Changed bot team to custom."); - break; + setdvar( "bots_team", "custom" ); + self iPrintlnBold( "Changed bot team to custom." ); + break; + default: - setdvar("bots_team", "autoassign"); - self iPrintlnBold("Changed bot team to autoassign."); - break; + setdvar( "bots_team", "autoassign" ); + self iPrintlnBold( "Changed bot team to autoassign." ); + break; } - break; + + break; + case "teamup": - setdvar("bots_team_amount", b+1); - self iPrintln((b+1)+" bot(s) will try to be on axis team."); - break; + setdvar( "bots_team_amount", b + 1 ); + self iPrintln( ( b + 1 ) + " bot(s) will try to be on axis team." ); + break; + case "teamdown": - setdvar("bots_team_amount", b-1); - self iPrintln((b-1)+" bot(s) will try to be on axis team."); - break; + setdvar( "bots_team_amount", b - 1 ); + self iPrintln( ( b - 1 ) + " bot(s) will try to be on axis team." ); + break; + case "teamforce": - setDvar("bots_team_force", !b); - self iPrintln("Forcing bots to team: " + !b); - break; + setDvar( "bots_team_force", !b ); + self iPrintln( "Forcing bots to team: " + !b ); + break; + case "teammode": - setDvar("bots_team_mode", !b); - self iPrintln("Only count bots on team: " + !b); - break; + setDvar( "bots_team_mode", !b ); + self iPrintln( "Only count bots on team: " + !b ); + break; + case "skill": - switch(b) + switch ( b ) { case 0: - self iPrintlnBold("Changed bot skill to easy."); - setDvar("bots_skill", 1); - break; + self iPrintlnBold( "Changed bot skill to easy." ); + setDvar( "bots_skill", 1 ); + break; + case 1: - self iPrintlnBold("Changed bot skill to easy-med."); - setDvar("bots_skill", 2); - break; + self iPrintlnBold( "Changed bot skill to easy-med." ); + setDvar( "bots_skill", 2 ); + break; + case 2: - self iPrintlnBold("Changed bot skill to medium."); - setDvar("bots_skill", 3); - break; + self iPrintlnBold( "Changed bot skill to medium." ); + setDvar( "bots_skill", 3 ); + break; + case 3: - self iPrintlnBold("Changed bot skill to med-hard."); - setDvar("bots_skill", 4); - break; + self iPrintlnBold( "Changed bot skill to med-hard." ); + setDvar( "bots_skill", 4 ); + break; + case 4: - self iPrintlnBold("Changed bot skill to hard."); - setDvar("bots_skill", 5); - break; + self iPrintlnBold( "Changed bot skill to hard." ); + setDvar( "bots_skill", 5 ); + break; + case 5: - self iPrintlnBold("Changed bot skill to very hard."); - setDvar("bots_skill", 6); - break; + self iPrintlnBold( "Changed bot skill to very hard." ); + setDvar( "bots_skill", 6 ); + break; + case 6: - self iPrintlnBold("Changed bot skill to hardest."); - setDvar("bots_skill", 7); - break; + self iPrintlnBold( "Changed bot skill to hardest." ); + setDvar( "bots_skill", 7 ); + break; + case 7: - self iPrintlnBold("Changed bot skill to custom. Base is easy."); - setDvar("bots_skill", 8); - break; + self iPrintlnBold( "Changed bot skill to custom. Base is easy." ); + setDvar( "bots_skill", 8 ); + break; + case 8: - self iPrintlnBold("Changed bot skill to complete random. Takes effect at restart."); - setDvar("bots_skill", 9); - break; + self iPrintlnBold( "Changed bot skill to complete random. Takes effect at restart." ); + setDvar( "bots_skill", 9 ); + break; + default: - self iPrintlnBold("Changed bot skill to random. Takes effect at restart."); - setDvar("bots_skill", 0); - break; + self iPrintlnBold( "Changed bot skill to random. Takes effect at restart." ); + setDvar( "bots_skill", 0 ); + break; } - break; + + break; + case "axishardup": - setdvar("bots_skill_axis_hard", (b+1)); - self iPrintln(((b+1))+" hard bots will be on axis team."); - break; + setdvar( "bots_skill_axis_hard", ( b + 1 ) ); + self iPrintln( ( ( b + 1 ) ) + " hard bots will be on axis team." ); + break; + case "axisharddown": - setdvar("bots_skill_axis_hard", (b-1)); - self iPrintln(((b-1))+" hard bots will be on axis team."); - break; + setdvar( "bots_skill_axis_hard", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " hard bots will be on axis team." ); + break; + case "axismedup": - setdvar("bots_skill_axis_med", (b+1)); - self iPrintln(((b+1))+" med bots will be on axis team."); - break; + setdvar( "bots_skill_axis_med", ( b + 1 ) ); + self iPrintln( ( ( b + 1 ) ) + " med bots will be on axis team." ); + break; + case "axismeddown": - setdvar("bots_skill_axis_med", (b-1)); - self iPrintln(((b-1))+" med bots will be on axis team."); - break; + setdvar( "bots_skill_axis_med", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " med bots will be on axis team." ); + break; + case "allieshardup": - setdvar("bots_skill_allies_hard", (b+1)); - self iPrintln(((b+1))+" hard bots will be on allies team."); - break; + setdvar( "bots_skill_allies_hard", ( b + 1 ) ); + self iPrintln( ( ( b + 1 ) ) + " hard bots will be on allies team." ); + break; + case "alliesharddown": - setdvar("bots_skill_allies_hard", (b-1)); - self iPrintln(((b-1))+" hard bots will be on allies team."); - break; + setdvar( "bots_skill_allies_hard", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " hard bots will be on allies team." ); + break; + case "alliesmedup": - setdvar("bots_skill_allies_med", (b+1)); - self iPrintln(((b+1))+" med bots will be on allies team."); - break; + setdvar( "bots_skill_allies_med", ( b + 1 ) ); + self iPrintln( ( ( b + 1 ) ) + " med bots will be on allies team." ); + break; + case "alliesmeddown": - setdvar("bots_skill_allies_med", (b-1)); - self iPrintln(((b-1))+" med bots will be on allies team."); - break; + setdvar( "bots_skill_allies_med", ( b - 1 ) ); + self iPrintln( ( ( b - 1 ) ) + " med bots will be on allies team." ); + break; } } -man_bots(a, b) +man_bots( a, b ) { - switch(a) + switch ( a ) { case "add": - setdvar("bots_manage_add", b); - if(b == 1) + setdvar( "bots_manage_add", b ); + + if ( b == 1 ) { - self iPrintln("Adding "+b+" bot."); + self iPrintln( "Adding " + b + " bot." ); } else { - self iPrintln("Adding "+b+" bots."); + self iPrintln( "Adding " + b + " bots." ); } - break; + + break; + case "kick": result = false; - for (i = 0; i < b; i++) + for ( i = 0; i < b; i++ ) { - tempBot = random(getBotArray()); - if (isDefined(tempBot)) + tempBot = random( getBotArray() ); + + if ( isDefined( tempBot ) ) { kick( tempBot getEntityNumber(), "EXE_PLAYERKICKED" ); result = true; @@ -995,49 +1113,60 @@ man_bots(a, b) wait 0.25; } - if(!result) - self iPrintln("No bots to kick"); - break; + 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; + setDvar( "bots_manage_fill_kick", !b ); + self iPrintln( "Kicking bots when bots_fill is exceeded: " + !b ); + break; + case "fillmode": - switch(b) + switch ( b ) { case 0: - setdvar("bots_manage_fill_mode", 1); - self iPrintln("bot_fill will now count only bots."); - break; + setdvar( "bots_manage_fill_mode", 1 ); + self iPrintln( "bot_fill will now count only bots." ); + break; + case 1: - setdvar("bots_manage_fill_mode", 2); - self iPrintln("bot_fill will now count everyone, adjusting to map."); - break; + setdvar( "bots_manage_fill_mode", 2 ); + self iPrintln( "bot_fill will now count everyone, adjusting to map." ); + break; + case 2: - setdvar("bots_manage_fill_mode", 3); - self iPrintln("bot_fill will now count only bots, adjusting to map."); - break; + setdvar( "bots_manage_fill_mode", 3 ); + self iPrintln( "bot_fill will now count only bots, adjusting to map." ); + break; + case 3: - setdvar("bots_manage_fill_mode", 4); - self iPrintln("bot_fill will now use bots as team balance."); - break; + setdvar( "bots_manage_fill_mode", 4 ); + self iPrintln( "bot_fill will now use bots as team balance." ); + break; + default: - setdvar("bots_manage_fill_mode", 0); - self iPrintln("bot_fill will now count everyone."); - break; + setdvar( "bots_manage_fill_mode", 0 ); + self iPrintln( "bot_fill will now count everyone." ); + break; } - break; + + break; + case "fillup": - setdvar("bots_manage_fill", b+1); - self iPrintln("Increased to maintain "+(b+1)+" bot(s)."); - break; + setdvar( "bots_manage_fill", b + 1 ); + self iPrintln( "Increased to maintain " + ( b + 1 ) + " bot(s)." ); + break; + case "filldown": - setdvar("bots_manage_fill", b-1); - self iPrintln("Decreased to maintain "+(b-1)+" bot(s)."); - break; + setdvar( "bots_manage_fill", b - 1 ); + self iPrintln( "Decreased to maintain " + ( b - 1 ) + " bot(s)." ); + break; + case "fillspec": - setDvar("bots_manage_fill_spec", !b); - self iPrintln("Count players on spectator for bots_fill: " + !b); - break; + setDvar( "bots_manage_fill_spec", !b ); + self iPrintln( "Count players on spectator for bots_fill: " + !b ); + break; } } diff --git a/userraw/maps/mp/bots/_wp_editor.gsc b/userraw/maps/mp/bots/_wp_editor.gsc index 675838c..863ce5c 100644 --- a/userraw/maps/mp/bots/_wp_editor.gsc +++ b/userraw/maps/mp/bots/_wp_editor.gsc @@ -1,781 +1,804 @@ -/* - _wp_editor - Author: INeedGames - Date: 09/26/2020 - The ingame waypoint editor. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -init() -{ - if(getDvar("bots_main_debug") == "") - setDvar("bots_main_debug", 0); - - if(!getDVarint("bots_main_debug")) - return; - - if(!getDVarint("developer")) - { - setdvar("developer_script", 1); - setdvar("developer", 1); - - setdvar("sv_mapRotation", "map "+getDvar("mapname")); - exitLevel(false); - } - - setDvar("bots_main", 0); - setdvar("bots_main_menu", 0); - setdvar("bots_manage_fill_mode", 0); - setdvar("bots_manage_fill", 0); - setdvar("bots_manage_add", 0); - setdvar("bots_manage_fill_kick", 1); - setDvar("bots_manage_fill_spec", 1); - - if (getDvar("bots_main_debug_distance") == "") - setDvar("bots_main_debug_distance", 512.0); - - if (getDvar("bots_main_debug_cone") == "") - setDvar("bots_main_debug_cone", 0.65); - - if (getDvar("bots_main_debug_minDist") == "") - setDvar("bots_main_debug_minDist", 32.0); - - if (getDvar("bots_main_debug_drawThrough") == "") - setDvar("bots_main_debug_drawThrough", false); - - 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 startDev(); - } -} - -StartDev() -{ - self endon("disconnect"); - self endon("death"); - - level.wpToLink = -1; - level.autoLink = false; - self.nearest = -1; - - self takeAllWeapons(); - self giveWeapon("m16_gl_mp");//to knife windows - self giveWeapon("javelin_mp");//to mark jav spots - self SetOffhandPrimaryClass( "other" ); - self giveWeapon("semtex_mp"); - self _clearperks(); - self.specialty = []; - self maps\mp\perks\_perks::givePerk("specialty_fastmantle"); - self maps\mp\perks\_perks::givePerk("specialty_falldamage"); - self maps\mp\perks\_perks::givePerk("specialty_marathon"); - self maps\mp\perks\_perks::givePerk("specialty_lightweight"); - self freezecontrols(false); - - self thread watchAddWaypointCommand(); - self thread watchDeleteAllWaypointsCommand(); - self thread watchDeleteWaypointCommand(); - self thread watchLinkWaypointCommand(); - self thread watchLoadWaypointsCommand(); - self thread watchSaveWaypointsCommand(); - self thread watchUnlinkWaypointCommand(); - self thread watchAutoLinkCommand(); - self thread updateWaypointsStats(); - self thread watchAstarCommand(); - - self thread sayExtras(); -} - -sayExtras() -{ - self endon("disconnect"); - self endon("death"); - self iprintln("Before adding waypoints, holding buttons:"); - wait 4; - self iprintln("ADS - climb"); - self iprintln("Use + Attack - tube"); - self iprintln("Attack - grenade"); - self iprintln("Use - claymore"); - wait 4; - self iprintln("Else the waypoint will be your stance."); - self iprintln("Making a crouch waypoint with only one link..."); - self iprintln("Makes a camping waypoint."); -} - -watchAstarCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("astar", "+gostand"); - for (;;) - { - self waittill("astar"); - - if (1) - continue; - - self iprintln("Start AStar"); - self.astar = undefined; - astar = spawnStruct(); - astar.start = self.origin; - - self waittill("astar"); - self iprintln("End AStar"); - astar.goal = self.origin; - - astar.nodes = AStarSearch(astar.start, astar.goal, undefined, true); - self iprintln("AStar size: " + astar.nodes.size); - - self.astar = astar; - } -} - -updateWaypointsStats() -{ - self endon("disconnect"); - self endon("death"); - - self initHudElem("TotalWps:",102,5); - totalWpsHud = self initHudElem("",180,5); - self initHudElem("NearestWP:",102,15); - nearestWP = self initHudElem("",180,15); - self initHudElem("Childs:",102,25); - children = self initHudElem("",160,25); - self initHudElem("Type:",102,35); - type = self initHudElem("",160,35); - self initHudElem("ToLink:",102,45); - wpToLink = self initHudElem("",160,45); - - infotext = self initHudElem2(); - self initHudElem3(); - self initHudElem4(); - - for(time=0;;time+=0.05) - { - wait 0.05; - - totalWpsHud setText(level.waypointCount); - - closest = -1; - myEye = self getEye(); - myAngles = self GetPlayerAngles(); - for(i = 0; i < level.waypointCount; i++) - { - if(closest == -1 || closer(self.origin, level.waypoints[i].origin, level.waypoints[closest].origin)) - closest = i; - - wpOrg = level.waypoints[i].origin + (0, 0, 25); - - if(distance(level.waypoints[i].origin, self.origin) < getDvarFloat("bots_main_debug_distance") && (bulletTracePassed(myEye, wpOrg, false, self) || getDVarint("bots_main_debug_drawThrough"))) - { - for(h = level.waypoints[i].children.size - 1; h >= 0; h--) - line(wpOrg, level.waypoints[level.waypoints[i].children[h]].origin + (0, 0, 25), (1,0,1)); - - if(getConeDot(wpOrg, myEye, myAngles) > getDvarFloat("bots_main_debug_cone")) - print3d(wpOrg, i, (1,0,0), 2); - - if (isDefined(level.waypoints[i].angles) && level.waypoints[i].type != "stand") - line(wpOrg, wpOrg + AnglesToForward(level.waypoints[i].angles) * 64, (1,1,1)); - - if (isDefined(level.waypoints[i].jav_point)) - line(wpOrg, level.waypoints[i].jav_point, (0,0,0)); - } - } - - self.nearest = closest; - - nearestWP setText(self.nearest); - - children setText(buildChildCountString(self.nearest)); - - type setText(buildTypeString(self.nearest)); - - wpToLink setText(level.wpToLink); - - infotext.x = infotext.x - 2; - if(infotext.x <= -800) - infotext.x = 800; - - if (self UseButtonPressed() && time > 2) - { - time = 0; - self iPrintLnBold(self.nearest + " children: " + buildChildString(self.nearest)); - } - - if (isDefined(self.astar)) - { - print3d(self.astar.start + (0, 0, 35), "start", (0,0,1), 2); - print3d(self.astar.goal + (0, 0, 35), "goal", (0,0,1), 2); - - prev = self.astar.start + (0, 0, 35); - - for (i = self.astar.nodes.size - 1; i >= 0; i--) - { - node = self.astar.nodes[i]; - - line(prev, level.waypoints[node].origin + (0, 0, 35), (0,1,1)); - - prev = level.waypoints[node].origin + (0, 0, 35); - } - - line(prev, self.astar.goal + (0, 0, 35), (0,1,1)); - } - } -} - -watchLoadWaypointsCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+actionslot 2}]", "+actionslot 2"); - for( ;; ) - { - self waittill("[{+actionslot 2}]"); - self LoadWaypoints(); - } -} - -watchAddWaypointCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+smoke}]", "+smoke"); - for( ;; ) - { - self waittill("[{+smoke}]"); - self AddWaypoint(); - } -} - -watchAutoLinkCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+frag}]", "+frag"); - for( ;; ) - { - self waittill("[{+frag}]"); - 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.nearest; - } - } -} - -watchLinkWaypointCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+melee}]", "+melee"); - for( ;; ) - { - self waittill("[{+melee}]"); - self LinkWaypoint(self.nearest); - } -} - -watchUnlinkWaypointCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+reload}]", "+reload"); - for( ;; ) - { - self waittill("[{+reload}]"); - self UnLinkWaypoint(self.nearest); - } -} - -watchDeleteWaypointCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+actionslot 3}]", "+actionslot 3"); - for( ;; ) - { - self waittill("[{+actionslot 3}]"); - self DeleteWaypoint(self.nearest); - } -} - -watchDeleteAllWaypointsCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+actionslot 4}]", "+actionslot 4"); - for( ;; ) - { - self waittill("[{+actionslot 4}]"); - self DeleteAllWaypoints(); - } -} - -watchSaveWaypointsCommand() -{ - self endon("death"); - self endon("disconnect"); - - self notifyOnPlayerCommand("[{+actionslot 1}]", "+actionslot 1"); - for(;;) - { - self waittill("[{+actionslot 1}]"); - - self checkForWarnings(); - wait 1; - - logprint("***********ABiliTy's WPDump**************\n\n"); - logprint("\n\n\n\n"); - mpnm=getMapName(getdvar("mapname")); - logprint("\n\n"+mpnm+"()\n{\n/*"); - logprint("*/waypoints = [];\n/*"); - for(i = 0; i < level.waypointCount; i++) - { - logprint("*/waypoints["+i+"] = spawnstruct();\n/*"); - logprint("*/waypoints["+i+"].origin = "+level.waypoints[i].origin+";\n/*"); - logprint("*/waypoints["+i+"].type = \""+level.waypoints[i].type+"\";\n/*"); - for(c = 0; c < level.waypoints[i].children.size; c++) - { - logprint("*/waypoints["+i+"].children["+c+"] = "+level.waypoints[i].children[c]+";\n/*"); - } - if(isDefined(level.waypoints[i].angles) && (level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || (level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade")) - logprint("*/waypoints["+i+"].angles = "+level.waypoints[i].angles+";\n/*"); - - if (isDefined(level.waypoints[i].jav_point) && level.waypoints[i].type == "javelin") - logprint("*/waypoints["+i+"].jav_point = "+level.waypoints[i].jav_point+";\n/*"); - } - logprint("*/return waypoints;\n}\n\n\n\n"); - - filename = "waypoints/" + getdvar("mapname") + "_wp.csv"; - - PrintLn("********* Start Bot Warfare WPDump *********"); - PrintLn(level.waypointCount); - - 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 += ","; - - if (isDefined(wp.jav_point)) - str += wp.jav_point[0] + " " + wp.jav_point[1] + " " + wp.jav_point[2] + ","; - else - str += ","; - - PrintLn(str); - fileWrite(filename, str+"\n", "append"); - } - PrintLn("\n\n\n\n\n\n"); - - self iprintln("Saved!!! to " + filename); - } -} - -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 (level.waypoints[i].type == "javelin" && !isDefined(level.waypoints[i].jav_point)) - self iprintln("WARNING: waypoint "+i+" jav_point is undefined"); - - if(!isDefined(level.waypoints[i].angles) && (level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || (level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade")) - self iprintln("WARNING: waypoint "+i+" angles is undefined"); - } -} - -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--) - { - child = level.waypoints[level.wpToLink].children[i]; - - if(child == nwp) - { - weGood = false; - break; - } - } - - if(weGood) - { - for(i = level.waypoints[nwp].children.size - 1; i >= 0; i--) - { - child = level.waypoints[nwp].children[i]; - - if(child == level.wpToLink) - { - weGood = false; - 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; -} - -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() -{ - level.waypoints[level.waypointCount] = spawnstruct(); - - pos = self getOrigin(); - level.waypoints[level.waypointCount].origin = pos; - - if (isDefined(self.javelinTargetPoint)) - level.waypoints[level.waypointCount].type = "javelin"; - else 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 = []; - - if (level.waypoints[level.waypointCount].type == "javelin") - { - level.waypoints[level.waypointCount].jav_point = self.javelinTargetPoint; - } - - self iprintln(level.waypoints[level.waypointCount].type + " Waypoint "+ level.waypointCount +" Added at "+pos); - - if(level.autoLink) - { - if(level.wpToLink == -1) - level.wpToLink = level.waypointCount - 1; - - level.waypointCount++; - self LinkWaypoint(level.waypointCount - 1); - } - else - { - level.waypointCount++; - } -} - -DeleteAllWaypoints() -{ - level.waypoints = []; - level.waypointCount = 0; - - self iprintln("DelAllWps"); -} - -buildChildCountString ( wp ) -{ - if ( wp == -1 ) - return ""; - - wpstr = level.waypoints[wp].children.size + ""; - - return wpstr; -} - -buildChildString( wp ) -{ - if ( wp == -1 ) - return ""; - - wpstr = ""; - - for(i = 0; i < level.waypoints[wp].children.size; i++) - { - if(i != 0) - wpstr = wpstr + "," + level.waypoints[wp].children[i]; - else - wpstr= wpstr + level.waypoints[wp].children[i]; - } - - return wpstr; -} - -buildTypeString( wp ) -{ - if ( wp == -1 ) - return ""; - - return level.waypoints[wp].type; -} - -destroyOnDeath(hud) -{ - hud endon("death"); - self waittill_either("death","disconnect"); - hud destroy(); -} - -initHudElem(txt, xl, yl) -{ - hud = NewClientHudElem( self ); - hud setText(txt); - hud.alignX = "left"; - hud.alignY = "top"; - hud.horzAlign = "left"; - hud.vertAlign = "top"; - hud.x = xl; - hud.y = yl; - hud.foreground = true; - hud.fontScale = 1; - 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 ); - - self thread destroyOnDeath( hud ); - - return hud; -} - -initHudElem2() -{ - infotext = NewHudElem(); - infotext setText("^1[{+smoke}]-AddWp ^2[{+melee}]-LinkWp ^3[{+reload}]-UnLinkWp ^4[{+actionslot 3}]-DeleteWp ^5[{+actionslot 4}]-DelAllWps ^6[{+actionslot 2}]-LoadWPS ^7[{+actionslot 1}]-SaveWp"); - infotext.alignX = "center"; - infotext.alignY = "bottom"; - infotext.horzAlign = "center"; - infotext.vertAlign = "bottom"; - infotext.x = -800; - infotext.y = 25; - infotext.foreground = true; - infotext.fontScale = 1.35; - infotext.font = "objective"; - infotext.alpha = 1; - infotext.glow = 0; - infotext.glowColor = ( 0, 0, 0 ); - infotext.glowAlpha = 1; - infotext.color = ( 1.0, 1.0, 1.0 ); - - self thread destroyOnDeath( infotext ); - - return infotext; -} - -initHudElem3() -{ - bar = level createServerBar((0.5, 0.5, 0.5), 1000, 25); - bar.alignX = "center"; - bar.alignY = "bottom"; - bar.horzAlign = "center"; - bar.vertAlign = "bottom"; - bar.y = 30; - bar.foreground = true; - - self thread destroyOnDeath( bar ); - - return bar; -} - -initHudElem4() -{ - OptionsBG = NewClientHudElem( self ); - OptionsBG.x = 100; - OptionsBG.y = 2; - OptionsBG.alignX = "left"; - OptionsBG.alignY = "top"; - OptionsBG.horzAlign = "left"; - OptionsBG.vertAlign = "top"; - OptionsBG setshader("black", 200, 60); - OptionsBG.alpha = 0.4; - - self thread destroyOnDeath( OptionsBG ); - - return OptionsBG; -} +/* + _wp_editor + Author: INeedGames + Date: 09/26/2020 + The ingame waypoint editor. +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\bots\_bot_utility; + +init() +{ + if ( getDvar( "bots_main_debug" ) == "" ) + setDvar( "bots_main_debug", 0 ); + + if ( !getDVarint( "bots_main_debug" ) ) + return; + + if ( !getDVarint( "developer" ) ) + { + setdvar( "developer_script", 1 ); + setdvar( "developer", 1 ); + + setdvar( "sv_mapRotation", "map " + getDvar( "mapname" ) ); + exitLevel( false ); + } + + setDvar( "bots_main", 0 ); + setdvar( "bots_main_menu", 0 ); + setdvar( "bots_manage_fill_mode", 0 ); + setdvar( "bots_manage_fill", 0 ); + setdvar( "bots_manage_add", 0 ); + setdvar( "bots_manage_fill_kick", 1 ); + setDvar( "bots_manage_fill_spec", 1 ); + + if ( getDvar( "bots_main_debug_distance" ) == "" ) + setDvar( "bots_main_debug_distance", 512.0 ); + + if ( getDvar( "bots_main_debug_cone" ) == "" ) + setDvar( "bots_main_debug_cone", 0.65 ); + + if ( getDvar( "bots_main_debug_minDist" ) == "" ) + setDvar( "bots_main_debug_minDist", 32.0 ); + + if ( getDvar( "bots_main_debug_drawThrough" ) == "" ) + setDvar( "bots_main_debug_drawThrough", false ); + + 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 startDev(); + } +} + +StartDev() +{ + self endon( "disconnect" ); + self endon( "death" ); + + level.wpToLink = -1; + level.autoLink = false; + self.nearest = -1; + + self takeAllWeapons(); + self giveWeapon( "m16_gl_mp" ); //to knife windows + self giveWeapon( "javelin_mp" ); //to mark jav spots + self SetOffhandPrimaryClass( "other" ); + self giveWeapon( "semtex_mp" ); + self _clearperks(); + self.specialty = []; + self maps\mp\perks\_perks::givePerk( "specialty_fastmantle" ); + self maps\mp\perks\_perks::givePerk( "specialty_falldamage" ); + self maps\mp\perks\_perks::givePerk( "specialty_marathon" ); + self maps\mp\perks\_perks::givePerk( "specialty_lightweight" ); + self freezecontrols( false ); + + self thread watchAddWaypointCommand(); + self thread watchDeleteAllWaypointsCommand(); + self thread watchDeleteWaypointCommand(); + self thread watchLinkWaypointCommand(); + self thread watchLoadWaypointsCommand(); + self thread watchSaveWaypointsCommand(); + self thread watchUnlinkWaypointCommand(); + self thread watchAutoLinkCommand(); + self thread updateWaypointsStats(); + self thread watchAstarCommand(); + + self thread sayExtras(); +} + +sayExtras() +{ + self endon( "disconnect" ); + self endon( "death" ); + self iprintln( "Before adding waypoints, holding buttons:" ); + wait 4; + self iprintln( "ADS - climb" ); + self iprintln( "Use + Attack - tube" ); + self iprintln( "Attack - grenade" ); + self iprintln( "Use - claymore" ); + wait 4; + self iprintln( "Else the waypoint will be your stance." ); + self iprintln( "Making a crouch waypoint with only one link..." ); + self iprintln( "Makes a camping waypoint." ); +} + +watchAstarCommand() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self notifyOnPlayerCommand( "astar", "+gostand" ); + + for ( ;; ) + { + self waittill( "astar" ); + + if ( 1 ) + continue; + + self iprintln( "Start AStar" ); + self.astar = undefined; + astar = spawnStruct(); + astar.start = self.origin; + + self waittill( "astar" ); + self iprintln( "End AStar" ); + astar.goal = self.origin; + + astar.nodes = AStarSearch( astar.start, astar.goal, undefined, true ); + self iprintln( "AStar size: " + astar.nodes.size ); + + self.astar = astar; + } +} + +updateWaypointsStats() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self initHudElem( "TotalWps:", 102, 5 ); + totalWpsHud = self initHudElem( "", 180, 5 ); + self initHudElem( "NearestWP:", 102, 15 ); + nearestWP = self initHudElem( "", 180, 15 ); + self initHudElem( "Childs:", 102, 25 ); + children = self initHudElem( "", 160, 25 ); + self initHudElem( "Type:", 102, 35 ); + type = self initHudElem( "", 160, 35 ); + self initHudElem( "ToLink:", 102, 45 ); + wpToLink = self initHudElem( "", 160, 45 ); + + infotext = self initHudElem2(); + self initHudElem3(); + self initHudElem4(); + + for ( time = 0;; time += 0.05 ) + { + wait 0.05; + + totalWpsHud setText( level.waypointCount ); + + closest = -1; + myEye = self getEye(); + myAngles = self GetPlayerAngles(); + + for ( i = 0; i < level.waypointCount; i++ ) + { + if ( closest == -1 || closer( self.origin, level.waypoints[i].origin, level.waypoints[closest].origin ) ) + closest = i; + + wpOrg = level.waypoints[i].origin + ( 0, 0, 25 ); + + if ( distance( level.waypoints[i].origin, self.origin ) < getDvarFloat( "bots_main_debug_distance" ) && ( bulletTracePassed( myEye, wpOrg, false, self ) || getDVarint( "bots_main_debug_drawThrough" ) ) ) + { + for ( h = level.waypoints[i].children.size - 1; h >= 0; h-- ) + line( wpOrg, level.waypoints[level.waypoints[i].children[h]].origin + ( 0, 0, 25 ), ( 1, 0, 1 ) ); + + if ( getConeDot( wpOrg, myEye, myAngles ) > getDvarFloat( "bots_main_debug_cone" ) ) + print3d( wpOrg, i, ( 1, 0, 0 ), 2 ); + + if ( isDefined( level.waypoints[i].angles ) && level.waypoints[i].type != "stand" ) + line( wpOrg, wpOrg + AnglesToForward( level.waypoints[i].angles ) * 64, ( 1, 1, 1 ) ); + + if ( isDefined( level.waypoints[i].jav_point ) ) + line( wpOrg, level.waypoints[i].jav_point, ( 0, 0, 0 ) ); + } + } + + self.nearest = closest; + + nearestWP setText( self.nearest ); + + children setText( buildChildCountString( self.nearest ) ); + + type setText( buildTypeString( self.nearest ) ); + + wpToLink setText( level.wpToLink ); + + infotext.x = infotext.x - 2; + + if ( infotext.x <= -800 ) + infotext.x = 800; + + if ( self UseButtonPressed() && time > 2 ) + { + time = 0; + self iPrintLnBold( self.nearest + " children: " + buildChildString( self.nearest ) ); + } + + if ( isDefined( self.astar ) ) + { + print3d( self.astar.start + ( 0, 0, 35 ), "start", ( 0, 0, 1 ), 2 ); + print3d( self.astar.goal + ( 0, 0, 35 ), "goal", ( 0, 0, 1 ), 2 ); + + prev = self.astar.start + ( 0, 0, 35 ); + + for ( i = self.astar.nodes.size - 1; i >= 0; i-- ) + { + node = self.astar.nodes[i]; + + line( prev, level.waypoints[node].origin + ( 0, 0, 35 ), ( 0, 1, 1 ) ); + + prev = level.waypoints[node].origin + ( 0, 0, 35 ); + } + + line( prev, self.astar.goal + ( 0, 0, 35 ), ( 0, 1, 1 ) ); + } + } +} + +watchLoadWaypointsCommand() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self notifyOnPlayerCommand( "[{+actionslot 2}]", "+actionslot 2" ); + + for ( ;; ) + { + self waittill( "[{+actionslot 2}]" ); + self LoadWaypoints(); + } +} + +watchAddWaypointCommand() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self notifyOnPlayerCommand( "[{+smoke}]", "+smoke" ); + + for ( ;; ) + { + self waittill( "[{+smoke}]" ); + self AddWaypoint(); + } +} + +watchAutoLinkCommand() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self notifyOnPlayerCommand( "[{+frag}]", "+frag" ); + + for ( ;; ) + { + self waittill( "[{+frag}]" ); + + 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.nearest; + } + } +} + +watchLinkWaypointCommand() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self notifyOnPlayerCommand( "[{+melee}]", "+melee" ); + + for ( ;; ) + { + self waittill( "[{+melee}]" ); + self LinkWaypoint( self.nearest ); + } +} + +watchUnlinkWaypointCommand() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self notifyOnPlayerCommand( "[{+reload}]", "+reload" ); + + for ( ;; ) + { + self waittill( "[{+reload}]" ); + self UnLinkWaypoint( self.nearest ); + } +} + +watchDeleteWaypointCommand() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self notifyOnPlayerCommand( "[{+actionslot 3}]", "+actionslot 3" ); + + for ( ;; ) + { + self waittill( "[{+actionslot 3}]" ); + self DeleteWaypoint( self.nearest ); + } +} + +watchDeleteAllWaypointsCommand() +{ + self endon( "disconnect" ); + self endon( "death" ); + + self notifyOnPlayerCommand( "[{+actionslot 4}]", "+actionslot 4" ); + + for ( ;; ) + { + self waittill( "[{+actionslot 4}]" ); + self DeleteAllWaypoints(); + } +} + +watchSaveWaypointsCommand() +{ + self endon( "death" ); + self endon( "disconnect" ); + + self notifyOnPlayerCommand( "[{+actionslot 1}]", "+actionslot 1" ); + + for ( ;; ) + { + self waittill( "[{+actionslot 1}]" ); + + self checkForWarnings(); + wait 1; + + logprint( "***********ABiliTy's WPDump**************\n\n" ); + logprint( "\n\n\n\n" ); + mpnm = getMapName( getdvar( "mapname" ) ); + logprint( "\n\n" + mpnm + "()\n{\n/*" ); + logprint( "*/waypoints = [];\n/*" ); + + for ( i = 0; i < level.waypointCount; i++ ) + { + logprint( "*/waypoints[" + i + "] = spawnstruct();\n/*" ); + logprint( "*/waypoints[" + i + "].origin = " + level.waypoints[i].origin + ";\n/*" ); + logprint( "*/waypoints[" + i + "].type = \"" + level.waypoints[i].type + "\";\n/*" ); + + for ( c = 0; c < level.waypoints[i].children.size; c++ ) + { + logprint( "*/waypoints[" + i + "].children[" + c + "] = " + level.waypoints[i].children[c] + ";\n/*" ); + } + + if ( isDefined( level.waypoints[i].angles ) && ( level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || ( level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1 ) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade" ) ) + logprint( "*/waypoints[" + i + "].angles = " + level.waypoints[i].angles + ";\n/*" ); + + if ( isDefined( level.waypoints[i].jav_point ) && level.waypoints[i].type == "javelin" ) + logprint( "*/waypoints[" + i + "].jav_point = " + level.waypoints[i].jav_point + ";\n/*" ); + } + + logprint( "*/return waypoints;\n}\n\n\n\n" ); + + filename = "waypoints/" + getdvar( "mapname" ) + "_wp.csv"; + + PrintLn( "********* Start Bot Warfare WPDump *********" ); + PrintLn( level.waypointCount ); + + 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 += ","; + + if ( isDefined( wp.jav_point ) ) + str += wp.jav_point[0] + " " + wp.jav_point[1] + " " + wp.jav_point[2] + ","; + else + str += ","; + + PrintLn( str ); + fileWrite( filename, str + "\n", "append" ); + } + + PrintLn( "\n\n\n\n\n\n" ); + + self iprintln( "Saved!!! to " + filename ); + } +} + +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 ( level.waypoints[i].type == "javelin" && !isDefined( level.waypoints[i].jav_point ) ) + self iprintln( "WARNING: waypoint " + i + " jav_point is undefined" ); + + if ( !isDefined( level.waypoints[i].angles ) && ( level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || ( level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1 ) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade" ) ) + self iprintln( "WARNING: waypoint " + i + " angles is undefined" ); + } +} + +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-- ) + { + child = level.waypoints[level.wpToLink].children[i]; + + if ( child == nwp ) + { + weGood = false; + break; + } + } + + if ( weGood ) + { + for ( i = level.waypoints[nwp].children.size - 1; i >= 0; i-- ) + { + child = level.waypoints[nwp].children[i]; + + if ( child == level.wpToLink ) + { + weGood = false; + 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; +} + +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() +{ + level.waypoints[level.waypointCount] = spawnstruct(); + + pos = self getOrigin(); + level.waypoints[level.waypointCount].origin = pos; + + if ( isDefined( self.javelinTargetPoint ) ) + level.waypoints[level.waypointCount].type = "javelin"; + else 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 = []; + + if ( level.waypoints[level.waypointCount].type == "javelin" ) + { + level.waypoints[level.waypointCount].jav_point = self.javelinTargetPoint; + } + + self iprintln( level.waypoints[level.waypointCount].type + " Waypoint " + level.waypointCount + " Added at " + pos ); + + if ( level.autoLink ) + { + if ( level.wpToLink == -1 ) + level.wpToLink = level.waypointCount - 1; + + level.waypointCount++; + self LinkWaypoint( level.waypointCount - 1 ); + } + else + { + level.waypointCount++; + } +} + +DeleteAllWaypoints() +{ + level.waypoints = []; + level.waypointCount = 0; + + self iprintln( "DelAllWps" ); +} + +buildChildCountString ( wp ) +{ + if ( wp == -1 ) + return ""; + + wpstr = level.waypoints[wp].children.size + ""; + + return wpstr; +} + +buildChildString( wp ) +{ + if ( wp == -1 ) + return ""; + + wpstr = ""; + + for ( i = 0; i < level.waypoints[wp].children.size; i++ ) + { + if ( i != 0 ) + wpstr = wpstr + "," + level.waypoints[wp].children[i]; + else + wpstr = wpstr + level.waypoints[wp].children[i]; + } + + return wpstr; +} + +buildTypeString( wp ) +{ + if ( wp == -1 ) + return ""; + + return level.waypoints[wp].type; +} + +destroyOnDeath( hud ) +{ + hud endon( "death" ); + self waittill_either( "death", "disconnect" ); + hud destroy(); +} + +initHudElem( txt, xl, yl ) +{ + hud = NewClientHudElem( self ); + hud setText( txt ); + hud.alignX = "left"; + hud.alignY = "top"; + hud.horzAlign = "left"; + hud.vertAlign = "top"; + hud.x = xl; + hud.y = yl; + hud.foreground = true; + hud.fontScale = 1; + 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 ); + + self thread destroyOnDeath( hud ); + + return hud; +} + +initHudElem2() +{ + infotext = NewHudElem(); + infotext setText( "^1[{+smoke}]-AddWp ^2[{+melee}]-LinkWp ^3[{+reload}]-UnLinkWp ^4[{+actionslot 3}]-DeleteWp ^5[{+actionslot 4}]-DelAllWps ^6[{+actionslot 2}]-LoadWPS ^7[{+actionslot 1}]-SaveWp" ); + infotext.alignX = "center"; + infotext.alignY = "bottom"; + infotext.horzAlign = "center"; + infotext.vertAlign = "bottom"; + infotext.x = -800; + infotext.y = 25; + infotext.foreground = true; + infotext.fontScale = 1.35; + infotext.font = "objective"; + infotext.alpha = 1; + infotext.glow = 0; + infotext.glowColor = ( 0, 0, 0 ); + infotext.glowAlpha = 1; + infotext.color = ( 1.0, 1.0, 1.0 ); + + self thread destroyOnDeath( infotext ); + + return infotext; +} + +initHudElem3() +{ + bar = level createServerBar( ( 0.5, 0.5, 0.5 ), 1000, 25 ); + bar.alignX = "center"; + bar.alignY = "bottom"; + bar.horzAlign = "center"; + bar.vertAlign = "bottom"; + bar.y = 30; + bar.foreground = true; + + self thread destroyOnDeath( bar ); + + return bar; +} + +initHudElem4() +{ + OptionsBG = NewClientHudElem( self ); + OptionsBG.x = 100; + OptionsBG.y = 2; + OptionsBG.alignX = "left"; + OptionsBG.alignY = "top"; + OptionsBG.horzAlign = "left"; + OptionsBG.vertAlign = "top"; + OptionsBG setshader( "black", 200, 60 ); + OptionsBG.alpha = 0.4; + + self thread destroyOnDeath( OptionsBG ); + + return OptionsBG; +}