diff --git a/mods/bots/maps/mp/bots/_bot.gsc b/mods/bots/maps/mp/bots/_bot.gsc index 58a5c85..b0e8647 100644 --- a/mods/bots/maps/mp/bots/_bot.gsc +++ b/mods/bots/maps/mp/bots/_bot.gsc @@ -8,79 +8,99 @@ init() { level.bw_VERSION = "2.0.1"; - if(getCvar("bots_main") == "") - setCvar("bots_main", true); + if ( getCvar( "bots_main" ) == "" ) + setCvar( "bots_main", true ); - if (!getCvarInt("bots_main")) + if ( !getCvarInt( "bots_main" ) ) return; thread load_waypoints(); thread hook_callbacks(); - if(getCvar("bots_main_GUIDs") == "") - setCvar("bots_main_GUIDs", "");//guids of players who will be given host powers, comma seperated - if(getCvar("bots_main_firstIsHost") == "") - setCvar("bots_main_firstIsHost", true);//first player to connect is a host - if(getCvar("bots_main_waitForHostTime") == "") - setCvar("bots_main_waitForHostTime", 10.0);//how long to wait to wait for the host player - - if(getCvar("bots_manage_add") == "") - setCvar("bots_manage_add", 0);//amount of bots to add to the game - if(getCvar("bots_manage_fill") == "") - setCvar("bots_manage_fill", 0);//amount of bots to maintain - if(getCvar("bots_manage_fill_spec") == "") - setCvar("bots_manage_fill_spec", true);//to count for fill if player is on spec team - if(getCvar("bots_manage_fill_mode") == "") - setCvar("bots_manage_fill_mode", 0);//fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 - if(getCvar("bots_manage_fill_kick") == "") - setCvar("bots_manage_fill_kick", false);//kick bots if too many - - if(getCvar("bots_team") == "") - setCvar("bots_team", "autoassign");//which team for bots to join - if(getCvar("bots_team_amount") == "") - setCvar("bots_team_amount", 0);//amount of bots on axis team - if(getCvar("bots_team_force") == "") - setCvar("bots_team_force", false);//force bots on team - if(getCvar("bots_team_mode") == "") - setCvar("bots_team_mode", 0);//counts just bots when 1 - - if(getCvar("bots_skill") == "") - setCvar("bots_skill", 0);//0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random - if(getCvar("bots_skill_axis_hard") == "") - setCvar("bots_skill_axis_hard", 0);//amount of hard bots on axis team - if(getCvar("bots_skill_axis_med") == "") - setCvar("bots_skill_axis_med", 0); - if(getCvar("bots_skill_allies_hard") == "") - setCvar("bots_skill_allies_hard", 0); - if(getCvar("bots_skill_allies_med") == "") - setCvar("bots_skill_allies_med", 0); - - if(getCvar("bots_loadout_rank") == "")// what rank the bots should be around, -1 is around the players, 0 is all random - setCvar("bots_loadout_rank", -1); + if ( getCvar( "bots_main_GUIDs" ) == "" ) + setCvar( "bots_main_GUIDs", "" ); //guids of players who will be given host powers, comma seperated - if(getCvar("bots_play_move") == "")//bots move - setCvar("bots_play_move", true); - if(getCvar("bots_play_knife") == "")//bots knife - setCvar("bots_play_knife", true); - if(getCvar("bots_play_fire") == "")//bots fire - setCvar("bots_play_fire", true); - if(getCvar("bots_play_nade") == "")//bots grenade - setCvar("bots_play_nade", true); - if(getCvar("bots_play_obj") == "")//bots play the obj - setCvar("bots_play_obj", true); - if(getCvar("bots_play_camp") == "")//bots camp and follow - setCvar("bots_play_camp", true); - if(getCvar("bots_play_jumpdrop") == "")//bots jump and dropshot - setCvar("bots_play_jumpdrop", true); - if(getCvar("bots_play_ads") == "")//bot ads - setCvar("bots_play_ads", true); + if ( getCvar( "bots_main_firstIsHost" ) == "" ) + setCvar( "bots_main_firstIsHost", true ); //first player to connect is a host - if(!isDefined(game["botWarfare"])) + if ( getCvar( "bots_main_waitForHostTime" ) == "" ) + setCvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player + + if ( getCvar( "bots_manage_add" ) == "" ) + setCvar( "bots_manage_add", 0 ); //amount of bots to add to the game + + if ( getCvar( "bots_manage_fill" ) == "" ) + setCvar( "bots_manage_fill", 0 ); //amount of bots to maintain + + if ( getCvar( "bots_manage_fill_spec" ) == "" ) + setCvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team + + if ( getCvar( "bots_manage_fill_mode" ) == "" ) + setCvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 + + if ( getCvar( "bots_manage_fill_kick" ) == "" ) + setCvar( "bots_manage_fill_kick", false ); //kick bots if too many + + if ( getCvar( "bots_team" ) == "" ) + setCvar( "bots_team", "autoassign" ); //which team for bots to join + + if ( getCvar( "bots_team_amount" ) == "" ) + setCvar( "bots_team_amount", 0 ); //amount of bots on axis team + + if ( getCvar( "bots_team_force" ) == "" ) + setCvar( "bots_team_force", false ); //force bots on team + + if ( getCvar( "bots_team_mode" ) == "" ) + setCvar( "bots_team_mode", 0 ); //counts just bots when 1 + + if ( getCvar( "bots_skill" ) == "" ) + setCvar( "bots_skill", 0 ); //0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random + + if ( getCvar( "bots_skill_axis_hard" ) == "" ) + setCvar( "bots_skill_axis_hard", 0 ); //amount of hard bots on axis team + + if ( getCvar( "bots_skill_axis_med" ) == "" ) + setCvar( "bots_skill_axis_med", 0 ); + + if ( getCvar( "bots_skill_allies_hard" ) == "" ) + setCvar( "bots_skill_allies_hard", 0 ); + + if ( getCvar( "bots_skill_allies_med" ) == "" ) + setCvar( "bots_skill_allies_med", 0 ); + + if ( getCvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random + setCvar( "bots_loadout_rank", -1 ); + + if ( getCvar( "bots_play_move" ) == "" ) //bots move + setCvar( "bots_play_move", true ); + + if ( getCvar( "bots_play_knife" ) == "" ) //bots knife + setCvar( "bots_play_knife", true ); + + if ( getCvar( "bots_play_fire" ) == "" ) //bots fire + setCvar( "bots_play_fire", true ); + + if ( getCvar( "bots_play_nade" ) == "" ) //bots grenade + setCvar( "bots_play_nade", true ); + + if ( getCvar( "bots_play_obj" ) == "" ) //bots play the obj + setCvar( "bots_play_obj", true ); + + if ( getCvar( "bots_play_camp" ) == "" ) //bots camp and follow + setCvar( "bots_play_camp", true ); + + if ( getCvar( "bots_play_jumpdrop" ) == "" ) //bots jump and dropshot + setCvar( "bots_play_jumpdrop", true ); + + if ( getCvar( "bots_play_ads" ) == "" ) //bot ads + setCvar( "bots_play_ads", true ); + + if ( !isDefined( game["botWarfare"] ) ) game["botWarfare"] = true; - + level.defuseObject = undefined; level.bots_smokeList = List(); - + level.bots_minGrenadeDistance = 256; level.bots_minGrenadeDistance *= level.bots_minGrenadeDistance; level.bots_maxGrenadeDistance = 1024; @@ -94,7 +114,7 @@ init() level.bots_maxShotgunDistance = 500; level.bots_maxShotgunDistance *= level.bots_maxShotgunDistance; level.bots_listenDist = 100; - + level.smokeRadius = 255; level.bots = []; @@ -110,9 +130,9 @@ init() level.bots_fullautoguns["mp44"] = true; level.bots_fullautoguns["ppsh"] = true; level.bots_fullautoguns["mp40"] = true; - + level thread fixGamemodes(); - + level thread onPlayerConnect(); level thread handleBots(); level thread watchNades(); @@ -121,7 +141,8 @@ init() //level thread maps\mp\bots\_bot_http::doVersionCheck(); level.teamBased = true; - if (getcvar("gamemode") == "dm") + + if ( getcvar( "gamemode" ) == "dm" ) level.teamBased = false; } @@ -133,39 +154,39 @@ handleBots() level thread teamBots(); level thread diffBots(); level addBots(); - - while(!level.mapended) + + while ( !level.mapended ) wait 0.05; - - setCvar("bots_manage_add", getBotArray().size); + + setCvar( "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_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_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 ); } /* @@ -176,7 +197,7 @@ hook_callbacks() wait 0.05; level.prevCallbackPlayerDamage = level.callbackPlayerDamage; level.callbackPlayerDamage = ::onPlayerDamage; - + level.prevCallbackPlayerKilled = level.callbackPlayerKilled; level.callbackPlayerKilled = ::onPlayerKilled; } @@ -187,26 +208,26 @@ hook_callbacks() fixKoth() { level.radio = undefined; - - for(;;) + + for ( ;; ) { wait 0.05; - - if(!isDefined(level.radioObject)) + + if ( !isDefined( level.radioObject ) ) { continue; } - - for(i = level.radios.size - 1; i >= 0; i--) + + for ( i = level.radios.size - 1; i >= 0; i-- ) { - if(level.radioObject != level.radios[i].gameobject) + if ( level.radioObject != level.radios[i].gameobject ) continue; - + level.radio = level.radios[i]; break; } - - while(isDefined(level.radioObject) && level.radio.gameobject == level.radioObject) + + while ( isDefined( level.radioObject ) && level.radio.gameobject == level.radioObject ) wait 0.05; } } @@ -216,22 +237,22 @@ fixKoth() */ fixGamemodes() { - for(i=0;i<19;i++) + for ( i = 0; i < 19; i++ ) { - if(isDefined(level.bombZones) && level.gametype == "sd") + if ( isDefined( level.bombZones ) && level.gametype == "sd" ) { //for(i = 0; i < level.bombZones.size; i++) - //level.bombZones[i].onUse = ::onUsePlantObjectFix; + //level.bombZones[i].onUse = ::onUsePlantObjectFix; break; } - - if(isDefined(level.radios) && level.gametype == "koth") + + if ( isDefined( level.radios ) && level.gametype == "koth" ) { level thread fixKoth(); - + break; } - + wait 0.05; } } @@ -241,10 +262,10 @@ fixGamemodes() */ onPlayerConnect() { - for(;;) + for ( ;; ) { - level waittill("connected", player); - + level waittill( "connected", player ); + player thread onWeaponFired(); player thread connected(); player thread onDeath(); @@ -259,41 +280,41 @@ onPlayerConnect() */ watchWeapons() { - self endon("disconnect"); + self endon( "disconnect" ); - for (;;) + for ( ;; ) { weap = self getCurrentWeapon(); - self thread watchAmmoUsage(weap); + self thread watchAmmoUsage( weap ); - while (weap == self getCurrentWeapon()) + while ( weap == self getCurrentWeapon() ) wait 0.05; - self notify("weapon_change", self getCurrentWeapon()); + self notify( "weapon_change", self getCurrentWeapon() ); } } /* CoD2 */ -watchAmmoUsage(weap) +watchAmmoUsage( weap ) { - self endon("disconnect"); - self endon("weapon_change"); + self endon( "disconnect" ); + self endon( "weapon_change" ); - slot = self getWeaponSlot(weap); + slot = self getWeaponSlot( weap ); - for (;;) + for ( ;; ) { - aCount = self GetWeaponSlotClipAmmo(slot); + aCount = self GetWeaponSlotClipAmmo( slot ); - while (aCount == self GetWeaponSlotClipAmmo(slot)) + while ( aCount == self GetWeaponSlotClipAmmo( slot ) ) wait 0.05; - if (self GetWeaponSlotClipAmmo(slot) < aCount) - self notify("weapon_fired"); + if ( self GetWeaponSlotClipAmmo( slot ) < aCount ) + self notify( "weapon_fired" ); else - self notify("reload"); + self notify( "reload" ); } } @@ -302,9 +323,9 @@ watchAmmoUsage(weap) */ watchVars() { - self endon("disconnect"); + self endon( "disconnect" ); - for (;;) + for ( ;; ) { wait 0.05; @@ -317,13 +338,14 @@ watchVars() */ watchVelocity() { - self endon("disconnect"); + self endon( "disconnect" ); lastOrigin = self.origin; - for (;;) + + for ( ;; ) { wait 0.05; - self.velocity = vector_scale(self.origin - lastOrigin, 20); + self.velocity = vector_scale( self.origin - lastOrigin, 20 ); lastOrigin = self.origin; } } @@ -333,10 +355,10 @@ watchVelocity() */ killTags() { - if (isDefined(self.tags)) + if ( isDefined( self.tags ) ) { - for (i = 0; i < self.tags.size; i++) - self.tags[i] delete(); + for ( i = 0; i < self.tags.size; i++ ) + self.tags[i] delete (); self.tags = undefined; self.tagMap = undefined; @@ -348,11 +370,11 @@ killTags() */ onDeath() { - self endon("disconnect"); + self endon( "disconnect" ); - for (;;) + for ( ;; ) { - self waittill("death"); + self waittill( "death" ); self killTags(); } @@ -363,10 +385,10 @@ onDeath() */ onDisconnectPlayer() { - self waittill("disconnect"); + self waittill( "disconnect" ); self killTags(); - - level.players = array_remove(level.players, self); + + level.players = array_remove( level.players, self ); } /* @@ -374,9 +396,9 @@ onDisconnectPlayer() */ onDisconnect() { - self waittill("disconnect"); - - level.bots = array_remove(level.bots, self); + self waittill( "disconnect" ); + + level.bots = array_remove( level.bots, self ); } /* @@ -384,36 +406,36 @@ onDisconnect() */ connected() { - self endon("disconnect"); + self endon( "disconnect" ); level.players[level.players.size] = self; self thread onDisconnectPlayer(); - if (!isDefined(self.pers["bot_host"])) + if ( !isDefined( self.pers["bot_host"] ) ) self thread doHostCheck(); - if(!self is_bot()) + if ( !self is_bot() ) return; - if (!isDefined(self.pers["isBot"])) + if ( !isDefined( self.pers["isBot"] ) ) { // fast restart... self.pers["isBot"] = true; } - - if (!isDefined(self.pers["isBotWarfare"])) + + if ( !isDefined( self.pers["isBotWarfare"] ) ) { self.pers["isBotWarfare"] = true; self thread added(); } - + self thread 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 ); self thread spawnBot(); } @@ -422,22 +444,23 @@ spawnBot() { wait 5; - self notify("menuresponse", game["menu_team"], "autoassign"); + self notify( "menuresponse", game["menu_team"], "autoassign" ); wait 0.5; weap = "mp40_mp"; - if (self.team == "allies") + + if ( self.team == "allies" ) { - if (game["allies"] == "american") + if ( game["allies"] == "american" ) weap = "thompson_mp"; - else if (game["allies"] == "british") + else if ( game["allies"] == "british" ) weap = "greasegun_mp"; else weap = "ppsh_mp"; } - - self notify("menuresponse", game["menu_weapon_" + self.team], weap); + + self notify( "menuresponse", game["menu_weapon_" + self.team], weap ); } /* @@ -445,8 +468,8 @@ spawnBot() */ added() { - self endon("disconnect"); - + self endon( "disconnect" ); + self thread maps\mp\bots\_bot_internal::added(); //self thread maps\mp\bots\_bot_script::added(); } @@ -458,7 +481,7 @@ add_bot() { bot = addtestclient(); - if (isdefined(bot)) + if ( isdefined( bot ) ) { bot.pers["isBot"] = true; bot.pers["isBotWarfare"] = true; @@ -471,38 +494,39 @@ add_bot() */ diffBots_loop() { - var_allies_hard = getCvarInt("bots_skill_allies_hard"); - var_allies_med = getCvarInt("bots_skill_allies_med"); - var_axis_hard = getCvarInt("bots_skill_axis_hard"); - var_axis_med = getCvarInt("bots_skill_axis_med"); - var_skill = getCvarInt("bots_skill"); - + var_allies_hard = getCvarInt( "bots_skill_allies_hard" ); + var_allies_med = getCvarInt( "bots_skill_allies_med" ); + var_axis_hard = getCvarInt( "bots_skill_axis_hard" ); + var_axis_med = getCvarInt( "bots_skill_axis_med" ); + var_skill = getCvarInt( "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; @@ -510,14 +534,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; @@ -527,16 +551,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; } } @@ -547,7 +572,7 @@ diffBots_loop() */ diffBots() { - for(;;) + for ( ;; ) { wait 1.5; @@ -560,83 +585,87 @@ diffBots() */ teamBots_loop() { - teamAmount = getCvarInt("bots_team_amount"); - toTeam = getCvar("bots_team"); - + teamAmount = getCvarInt( "bots_team_amount" ); + toTeam = getCvar( "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(!getCvarInt("bots_team_mode")) + + if ( !getCvarInt( "bots_team_mode" ) ) { allies += alliesplayers; axis += axisplayers; } - - if(toTeam != "custom") + + if ( toTeam != "custom" ) { - if(getCvarInt("bots_team_force")) + if ( getCvarInt( "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; } } @@ -645,19 +674,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; @@ -665,12 +695,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; @@ -685,7 +715,7 @@ teamBots_loop() */ teamBots() { - for(;;) + for ( ;; ) { wait 1.5; @@ -698,104 +728,109 @@ teamBots() */ addBots_loop() { - botsToAdd = GetCvarInt("bots_manage_add"); - - if(botsToAdd > 0) + botsToAdd = GetCvarInt( "bots_manage_add" ); + + if ( botsToAdd > 0 ) { - SetCvar("bots_manage_add", 0); - - if(botsToAdd > 64) + SetCvar( "bots_manage_add", 0 ); + + if ( botsToAdd > 64 ) botsToAdd = 64; - - for(; botsToAdd > 0; botsToAdd--) + + for ( ; botsToAdd > 0; botsToAdd-- ) { level add_bot(); wait 0.25; } } - - fillMode = getCvarInt("bots_manage_fill_mode"); - - if(fillMode == 2 || fillMode == 3) - setCvar("bots_manage_fill", getGoodMapAmount()); - - fillAmount = getCvarInt("bots_manage_fill"); - + + fillMode = getCvarInt( "bots_manage_fill_mode" ); + + if ( fillMode == 2 || fillMode == 3 ) + setCvar( "bots_manage_fill", getGoodMapAmount() ); + + fillAmount = getCvarInt( "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 ) ) { - setCvar("testclients_doreload", true); + setCvar( "testclients_doreload", true ); wait 0.1; - setCvar("testclients_doreload", false); + setCvar( "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(getCvarInt("bots_manage_fill_spec")) + + if ( getCvarInt( "bots_manage_fill_spec" ) ) amount += spec; - - if(amount < fillAmount) - setCvar("bots_manage_add", 1); - else if(amount > fillAmount && getCvarInt("bots_manage_fill_kick")) + + if ( amount < fillAmount ) + setCvar( "bots_manage_add", 1 ); + else if ( amount > fillAmount && getCvarInt( "bots_manage_fill_kick" ) ) { - tempBot = random(getBotArray()); - if (isDefined(tempBot)) - kick(tempBot getEntityNumber()); + tempBot = random( getBotArray() ); + + if ( isDefined( tempBot ) ) + kick( tempBot getEntityNumber() ); } } @@ -804,14 +839,14 @@ addBots_loop() */ addBots() { - level endon("game_ended"); + level endon( "game_ended" ); bot_wait_for_host(); - - for(;;) + + for ( ;; ) { wait 1.5; - + addBots_loop(); } } @@ -821,9 +856,10 @@ addBots() */ onWeaponFired() { - self endon("disconnect"); + self endon( "disconnect" ); self.bots_firing = false; - for(;;) + + for ( ;; ) { self waittill( "weapon_fired" ); self thread doFiringThread(); @@ -835,8 +871,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; @@ -845,16 +881,16 @@ doFiringThread() /* Launches the smoke */ -launchSmoke(org) +launchSmoke( org ) { nade = spawnStruct(); nade.origin = org; - level.bots_smokeList ListAdd(nade); + level.bots_smokeList ListAdd( nade ); wait 11.5; - level.bots_smokeList ListRemove(nade); + level.bots_smokeList ListRemove( nade ); } /* @@ -862,30 +898,31 @@ launchSmoke(org) */ watchNade() { - self endon("death"); + self endon( "death" ); lastOrigin = self.origin; creationTime = getTime(); timeSlow = 0; wait 0.05; - while(isDefined(self)) + + while ( isDefined( self ) ) { - velocity = vector_scale(self.origin - lastOrigin, 20); + velocity = vector_scale( self.origin - lastOrigin, 20 ); lastOrigin = self.origin; - if (getTime() - creationTime > 4000) + if ( getTime() - creationTime > 4000 ) { - if (lengthSquared(velocity) <= 0.05) + if ( lengthSquared( velocity ) <= 0.05 ) timeSlow += 0.05; else timeSlow = 0; } - if (timeSlow > 1) + if ( timeSlow > 1 ) { - thread launchSmoke(lastOrigin); - self delete(); + thread launchSmoke( lastOrigin ); + self delete (); } wait 0.05; @@ -897,15 +934,16 @@ watchNade() */ watchNades_loop() { - nades = getentarray ("grenade", "classname"); + nades = getentarray ( "grenade", "classname" ); - for (i = 0; i < nades.size; i++) + for ( i = 0; i < nades.size; i++ ) { nade = nades[i]; - if (!isDefined(nade)) + + if ( !isDefined( nade ) ) continue; - if (isDefined(nade.bot_audit)) + if ( isDefined( nade.bot_audit ) ) continue; nade.bot_audit = true; @@ -919,7 +957,7 @@ watchNades_loop() */ watchNades() { - for (;;) + for ( ;; ) { wait 0.05; @@ -934,22 +972,22 @@ watchGameEnded() { level.gameEnded = false; - for (;;) + for ( ;; ) { wait 0.05; - if (isDefined(level.roundended)) + if ( isDefined( level.roundended ) ) { - if (level.roundended) + if ( level.roundended ) break; } - else if (isDefined(level.mapended)) + else if ( isDefined( level.mapended ) ) { - if (level.mapended) + if ( level.mapended ) break; } } level.gameEnded = true; - level notify("game_ended"); + level notify( "game_ended" ); } diff --git a/mods/bots/maps/mp/bots/_bot_internal.gsc b/mods/bots/maps/mp/bots/_bot_internal.gsc index d32bc5f..e5153ba 100644 --- a/mods/bots/maps/mp/bots/_bot_internal.gsc +++ b/mods/bots/maps/mp/bots/_bot_internal.gsc @@ -7,10 +7,10 @@ */ added() { - self endon("disconnect"); - + self endon( "disconnect" ); + self.pers["bots"] = []; - + self.pers["bots"]["skill"] = []; self.pers["bots"]["skill"]["base"] = 7; // a base knownledge of the bot self.pers["bots"]["skill"]["aim_time"] = 0.05; // how long it takes for a bot to aim to a location @@ -21,7 +21,7 @@ added() self.pers["bots"]["skill"]["remember_time"] = 25000; // how long a bot will remember a target before forgetting about it when they cant see the target self.pers["bots"]["skill"]["fov"] = -1; // the fov of the bot, -1 being 360, 1 being 0 self.pers["bots"]["skill"]["dist_max"] = 100000 * 2; // the longest distance a bot will target - self.pers["bots"]["skill"]["dist_start"] = 100000; // the start distance before bot's target abilitys diminish + self.pers["bots"]["skill"]["dist_start"] = 100000; // the start distance before bot's target abilitys diminish self.pers["bots"]["skill"]["spawn_time"] = 0; // how long a bot waits after spawning before targeting, etc self.pers["bots"]["skill"]["help_dist"] = 10000; // how far a bot has awareness self.pers["bots"]["skill"]["semi_time"] = 0.05; // how fast a bot shoots semiauto @@ -32,7 +32,7 @@ added() self.pers["bots"]["skill"]["bones"] = "j_head"; // a list of comma seperated bones the bot will aim at self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; // a factor of how much ads to reduce when adsing self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; // a factor of how much more aimspeed delay to add - + self.pers["bots"]["behavior"] = []; self.pers["bots"]["behavior"]["strafe"] = 50; // percentage of how often the bot strafes a target self.pers["bots"]["behavior"]["nade"] = 50; // percentage of how often the bot will grenade @@ -53,11 +53,11 @@ added() */ connected() { - self endon("disconnect"); - + self endon( "disconnect" ); + self.bot = spawnStruct(); self resetBotVars(); - + self thread onPlayerSpawned(); self thread bot_skip_killcam(); self thread forceRespawn(); @@ -68,30 +68,30 @@ connected() */ forceRespawn() { - self endon("disconnect"); + self endon( "disconnect" ); - for (;;) + for ( ;; ) { wait 0.5; - if (!isDefined(self.respawntext)) + if ( !isDefined( self.respawntext ) ) continue; - self thread use(0.1); + self thread use( 0.1 ); } } /* The callback hook for when the bot gets killed. */ -onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) +onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ) { } /* The callback hook when the bot gets damaged. */ -onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) +onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ) { } @@ -108,12 +108,12 @@ resetBotVars() self.bot.after_target = undefined; self.bot.after_target_pos = undefined; self.bot.moveTo = self.origin; - + self.bot.script_aimpos = undefined; - + self.bot.script_goal = undefined; self.bot.script_goal_dist = 0.0; - + self.bot.next_wp = -1; self.bot.second_next_wp = -1; self.bot.towards_goal = undefined; @@ -123,7 +123,7 @@ resetBotVars() self.bot.climbing = false; self.bot.last_next_wp = -1; self.bot.last_second_next_wp = -1; - + self.bot.isfrozen = false; self.bot.isreloading = false; self.bot.isfragging = false; @@ -132,17 +132,17 @@ resetBotVars() self.bot.issmokingafter = false; self.bot.isknifing = false; self.bot.isknifingafter = false; - + self.bot.semi_time = false; self.bot.jump_time = undefined; self.bot.last_fire_time = -1; - + self.bot.is_cur_full_auto = false; self.bot.cur_weap_dist_multi = 1; self.bot.is_cur_sniper = false; - - self.bot.rand = randomInt(100); - + + self.bot.rand = randomInt( 100 ); + self botStop(); } @@ -151,16 +151,16 @@ resetBotVars() */ bot_skip_killcam() { - level endon("game_ended"); - self endon("disconnect"); - - for(;;) + level endon( "game_ended" ); + self endon( "disconnect" ); + + for ( ;; ) { wait 1; - - if(isDefined(self.killcam)) + + if ( isDefined( self.killcam ) ) { - self notify("end_killcam"); + self notify( "end_killcam" ); } } } @@ -170,17 +170,17 @@ bot_skip_killcam() */ onPlayerSpawned() { - self endon("disconnect"); - - for(;;) + self endon( "disconnect" ); + + for ( ;; ) { - self waittill("spawned_player"); - + self waittill( "spawned_player" ); + self resetBotVars(); self thread onWeaponChange(); - + self thread reload_watch(); - + self thread spawned(); } } @@ -188,62 +188,63 @@ onPlayerSpawned() /* 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 = vector_scale(VectorNormalize(dir), 127); + dir = vector_scale( 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 + vector_scale(anglesToForward((0, angles[1], 0)), 25); - bt = bulletTrace(startPos, startPosForward, false, self); - if (bt["fraction"] >= 1) + }*/ + + startPos = self.origin + ( 0, 0, 50 ); + startPosForward = startPos + vector_scale( 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(); @@ -252,13 +253,13 @@ 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 setOrigin(self.origin + vector_scale(vectorNormalize(move_To - self.origin), 25)); + self botMovement( int( dir[0] ), int( dir[1] ) ); + self setOrigin( self.origin + vector_scale( vectorNormalize( move_To - self.origin ), 25 ) ); } /* @@ -266,18 +267,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 ); } } @@ -286,11 +287,11 @@ doBotMovement() */ spawned() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); wait self.pers["bots"]["skill"]["spawn_time"]; - + self thread doBotMovement(); self thread check_reload(); self thread stance(); @@ -300,26 +301,29 @@ spawned() self thread aim(); self thread watchHoldBreath(); self thread onNewEnemy(); - - self notify("bot_spawned"); + + self notify( "bot_spawned" ); } /* Sets the factor of distance for a weapon */ -SetWeaponDistMulti(weap) +SetWeaponDistMulti( weap ) { - if (weap == "none") + if ( weap == "none" ) return 1; - switch(weaponClass(weap)) + switch ( weaponClass( weap ) ) { case "rifle": return 0.9; + case "smg": return 0.7; + case "pistol": return 0.5; + default: return 1; } @@ -328,14 +332,14 @@ SetWeaponDistMulti(weap) /* Is the weap a sniper */ -IsWeapSniper(weap) +IsWeapSniper( weap ) { - if (weap == "none") + if ( weap == "none" ) return false; - if (weaponClass(weap) != "sniper") + if ( weaponClass( weap ) != "sniper" ) return false; - + return true; } @@ -344,17 +348,17 @@ IsWeapSniper(weap) */ watchHoldBreath() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 1; - - if(self.bot.isfrozen) + + if ( self.bot.isfrozen ) continue; - - self holdbreath(self playerADS() > 0); + + self holdbreath( self playerADS() > 0 ); } } @@ -363,29 +367,31 @@ watchHoldBreath() */ onWeaponChange() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); first = true; - for(;;) + + for ( ;; ) { newWeapon = undefined; - if (first) + + if ( first ) { first = false; newWeapon = self getCurrentWeapon(); } else self waittill( "weapon_change", newWeapon ); - - self.bot.is_cur_full_auto = WeaponIsFullAuto(newWeapon); - self.bot.cur_weap_dist_multi = SetWeaponDistMulti(newWeapon); - self.bot.is_cur_sniper = IsWeapSniper(newWeapon); - if (newWeapon == "none") + self.bot.is_cur_full_auto = WeaponIsFullAuto( newWeapon ); + self.bot.cur_weap_dist_multi = SetWeaponDistMulti( newWeapon ); + self.bot.is_cur_sniper = IsWeapSniper( newWeapon ); + + if ( newWeapon == "none" ) continue; - - self changeToWeap(newWeapon); + + self changeToWeap( newWeapon ); } } @@ -395,22 +401,23 @@ onWeaponChange() reload_watch_loop() { self.bot.isreloading = true; - - while(true) - { - ret = self waittill_any_timeout(7.5, "reload"); - if (ret == "timeout") + while ( true ) + { + ret = self waittill_any_timeout( 7.5, "reload" ); + + if ( ret == "timeout" ) break; weap = self GetCurrentWeapon(); - if (weap == "none") + if ( weap == "none" ) break; - if (self GetWeaponSlotClipAmmo(self getWeaponSlot(weap)) >= WeaponClipSize(weap)) + if ( self GetWeaponSlotClipAmmo( self getWeaponSlot( weap ) ) >= WeaponClipSize( weap ) ) break; } + self.bot.isreloading = false; } @@ -419,13 +426,13 @@ reload_watch_loop() */ reload_watch() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill("reload_start"); - + self waittill( "reload_start" ); + self reload_watch_loop(); } } @@ -436,32 +443,33 @@ reload_watch() stance_loop() { self.bot.climbing = false; - - if(self.bot.isfrozen) + + if ( self.bot.isfrozen ) return; toStance = "stand"; - if(self.bot.next_wp != -1) + + if ( self.bot.next_wp != -1 ) toStance = level.waypoints[self.bot.next_wp].type; - if (!isDefined(toStance)) + if ( !isDefined( toStance ) ) toStance = "crouch"; - if(toStance == "stand" && randomInt(100) <= self.pers["bots"]["behavior"]["crouch"]) + if ( toStance == "stand" && randomInt( 100 ) <= self.pers["bots"]["behavior"]["crouch"] ) toStance = "crouch"; - if(toStance == "climb") + if ( toStance == "climb" ) { self.bot.climbing = true; toStance = "stand"; } - - if(toStance != "stand" && toStance != "crouch" && toStance != "prone") + + if ( toStance != "stand" && toStance != "crouch" && toStance != "prone" ) toStance = "crouch"; - - if(toStance == "stand") + + if ( toStance == "stand" ) self stand(); - else if(toStance == "crouch") + else if ( toStance == "crouch" ) self crouch(); else self prone(); @@ -472,12 +480,12 @@ stance_loop() */ stance() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill_either("finished_static_waypoints", "new_static_waypoint"); + self waittill_either( "finished_static_waypoints", "new_static_waypoint" ); self stance_loop(); } @@ -488,10 +496,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(); @@ -503,27 +511,27 @@ check_reload() */ reload_thread() { - self endon("disconnect"); - self endon("death"); - self endon("weapon_fired"); - + self endon( "disconnect" ); + self endon( "death" ); + self endon( "weapon_fired" ); + wait 2.5; - - if(isDefined(self.bot.target) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.issmokingafter || self.bot.isfrozen) + + if ( isDefined( self.bot.target ) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.issmokingafter || self.bot.isfrozen ) return; - + cur = self getCurrentWEapon(); - if (cur == "" || cur == "none") + if ( cur == "" || cur == "none" ) return; - - if(IsWeaponClipOnly(cur) || !self getweaponslotammo(self getWeaponSlot(cur))) + + if ( IsWeaponClipOnly( cur ) || !self getweaponslotammo( self getWeaponSlot( cur ) ) ) return; - - maxsize = WeaponClipSize(cur); - cursize = self GetWeaponSlotClipAmmo(self getWeaponSlot(cur)); - - if(cursize/maxsize < 0.5) + + maxsize = WeaponClipSize( cur ); + cursize = self GetWeaponSlotClipAmmo( self getWeaponSlot( cur ) ); + + if ( cursize / maxsize < 0.5 ) self thread reload(); } @@ -532,39 +540,39 @@ reload_thread() */ updateBones() { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); - bones = strtok(self.pers["bots"]["skill"]["bones"], ","); + bones = strtok( self.pers["bots"]["skill"]["bones"], "," ); waittime = self.pers["bots"]["skill"]["bone_update_interval"]; - - for(;;) - { - self waittill_notify_or_timeout("new_enemy", waittime); - if (!isDefined(self.bot.target)) + for ( ;; ) + { + self waittill_notify_or_timeout( "new_enemy", waittime ); + + if ( !isDefined( self.bot.target ) ) continue; - self.bot.target.bone = random(bones); + self.bot.target.bone = random( bones ); } } /* Creates the base target obj */ -createTargetObj(ent, theTime) +createTargetObj( ent, theTime ) { obj = spawnStruct(); obj.entity = ent; - obj.last_seen_pos = (0, 0, 0); + obj.last_seen_pos = ( 0, 0, 0 ); obj.dist = 0; obj.time = theTime; obj.trace_time = 0; obj.no_trace_time = 0; obj.trace_time_time = 0; - obj.rand = randomInt(100); + obj.rand = randomInt( 100 ); obj.didlook = false; - obj.isplay = isPlayer(ent); + obj.isplay = isPlayer( ent ); obj.offset = undefined; obj.bone = undefined; obj.aim_offset = undefined; @@ -576,35 +584,35 @@ createTargetObj(ent, theTime) /* Updates the target object's difficulty missing aim, inaccurate shots */ -updateAimOffset(obj) +updateAimOffset( obj ) { - if (!isDefined(obj.aim_offset_base)) + if ( !isDefined( obj.aim_offset_base ) ) { diffAimAmount = self.pers["bots"]["skill"]["aim_offset_amount"]; - if (diffAimAmount > 0) - obj.aim_offset_base = (randomFloatRange(0-diffAimAmount, diffAimAmount), - randomFloatRange(0-diffAimAmount, diffAimAmount), - randomFloatRange(0-diffAimAmount, diffAimAmount)); + if ( diffAimAmount > 0 ) + obj.aim_offset_base = ( randomFloatRange( 0 - diffAimAmount, diffAimAmount ), + randomFloatRange( 0 - diffAimAmount, diffAimAmount ), + randomFloatRange( 0 - diffAimAmount, diffAimAmount ) ); else - obj.aim_offset_base = (0,0,0); + obj.aim_offset_base = ( 0, 0, 0 ); } aimDiffTime = self.pers["bots"]["skill"]["aim_offset_time"] * 1000; objCreatedFor = obj.trace_time; - if (objCreatedFor >= aimDiffTime) + if ( objCreatedFor >= aimDiffTime ) offsetScalar = 0; else offsetScalar = 1 - objCreatedFor / aimDiffTime; - obj.aim_offset = vector_scale(obj.aim_offset_base, offsetScalar); + obj.aim_offset = vector_scale( obj.aim_offset_base, offsetScalar ); } /* Updates the target object to be traced Has LOS */ -targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj) +targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj ) { distClose = self.pers["bots"]["skill"]["dist_start"]; distClose *= self.bot.cur_weap_dist_multi; @@ -615,27 +623,28 @@ targetObjUpdateTraced(obj, daDist, ent, theTime, isScriptObj) distMax *= distMax; timeMulti = 1; - if (!isScriptObj) + + if ( !isScriptObj ) { - if (daDist > distMax) + if ( daDist > distMax ) timeMulti = 0; - else if (daDist > distClose) - timeMulti = 1 - ((daDist - distClose) / (distMax - distClose)); + else if ( daDist > distClose ) + timeMulti = 1 - ( ( daDist - distClose ) / ( distMax - distClose ) ); } obj.no_trace_time = 0; - obj.trace_time += int(50 * timeMulti); + obj.trace_time += int( 50 * timeMulti ); obj.dist = daDist; obj.last_seen_pos = ent.origin; obj.trace_time_time = theTime; - self updateAimOffset(obj); + self updateAimOffset( obj ); } /* Updates the target object to be not traced No LOS */ -targetObjUpdateNoTrace(obj) +targetObjUpdateNoTrace( obj ) { obj.no_trace_time += 50; obj.trace_time = 0; @@ -656,61 +665,63 @@ target_loop() bestTime = 2147483647; rememberTime = self.pers["bots"]["skill"]["remember_time"]; initReactTime = self.pers["bots"]["skill"]["init_react_time"]; - hasTarget = isDefined(self.bot.target); + hasTarget = isDefined( self.bot.target ); adsAmount = self PlayerADS(); adsFovFact = self.pers["bots"]["skill"]["ads_fov_multi"]; - - if(hasTarget && !isDefined(self.bot.target.entity)) + + if ( hasTarget && !isDefined( self.bot.target.entity ) ) { self.bot.target = undefined; hasTarget = false; } // reduce fov if ads'ing - if (adsAmount > 0) + if ( adsAmount > 0 ) { myFov *= 1 - adsFovFact * adsAmount; } - + playercount = level.players.size; - for(i = -1; i < playercount; i++) + + for ( i = -1; i < playercount; i++ ) { obj = undefined; - if (i == -1) + if ( i == -1 ) { - if(!isDefined(self.bot.script_target)) + if ( !isDefined( self.bot.script_target ) ) continue; - + ent = self.bot.script_target; - key = ent getEntityNumber()+""; - daDist = distanceSquared(self.origin, ent.origin); + key = ent getEntityNumber() + ""; + daDist = distanceSquared( self.origin, ent.origin ); obj = self.bot.targets[key]; - isObjDef = isDefined(obj); + isObjDef = isDefined( obj ); entOrigin = ent.origin; - if (isDefined(self.bot.script_target_offset)) + + if ( isDefined( self.bot.script_target_offset ) ) entOrigin += self.bot.script_target_offset; - - if(SmokeTrace(myEye, entOrigin, level.smokeRadius) && bulletTracePassed(myEye, entOrigin, false, ent)) + + if ( SmokeTrace( myEye, entOrigin, level.smokeRadius ) && bulletTracePassed( myEye, entOrigin, false, ent ) ) { - if(!isObjDef) + if ( !isObjDef ) { - obj = self createTargetObj(ent, theTime); + obj = self createTargetObj( ent, theTime ); obj.offset = self.bot.script_target_offset; - + self.bot.targets[key] = obj; } - - self targetObjUpdateTraced(obj, daDist, ent, theTime, true); + + self targetObjUpdateTraced( obj, daDist, ent, theTime, true ); } else { - if(!isObjDef) + if ( !isObjDef ) continue; - - self targetObjUpdateNoTrace(obj); - - if(obj.no_trace_time > rememberTime) + + self targetObjUpdateNoTrace( obj ); + + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[key] = undefined; continue; @@ -721,18 +732,19 @@ 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); - isObjDef = isDefined(obj); - if((level.teamBased && self.team == player.team) || player.sessionstate != "playing" || !isAlive(player)) + daDist = distanceSquared( self.origin, player.origin ); + isObjDef = isDefined( obj ); + + if ( ( level.teamBased && self.team == player.team ) || player.sessionstate != "playing" || !isAlive( player ) ) { - if(isObjDef) + if ( isObjDef ) self.bot.targets[key] = undefined; - + continue; } @@ -740,46 +752,46 @@ target_loop() targetAnkleLeft = player getTagOrigin( "j_ankle_le" ); targetAnkleRight = player getTagOrigin( "j_ankle_ri" ); - canTargetPlayer = ((BulletTracePassed(myEye, targetHead, false, undefined) || - BulletTracePassed(myEye, targetAnkleLeft, false, undefined) || - BulletTracePassed(myEye, targetAnkleRight, false, undefined)) + canTargetPlayer = ( ( BulletTracePassed( myEye, targetHead, false, undefined ) || + BulletTracePassed( myEye, targetAnkleLeft, false, undefined ) || + BulletTracePassed( myEye, targetAnkleRight, false, undefined ) ) - && (sightTracePassed(myEye, targetHead, false, undefined) || - sightTracePassed(myEye, targetAnkleLeft, false, undefined) || - sightTracePassed(myEye, targetAnkleRight, false, undefined)) + && ( sightTracePassed( myEye, targetHead, false, undefined ) || + sightTracePassed( myEye, targetAnkleLeft, false, undefined ) || + sightTracePassed( myEye, targetAnkleRight, false, undefined ) ) - && (SmokeTrace(myEye, player.origin, level.smokeRadius) || - daDist < level.bots_maxKnifeDistance*4) + && ( SmokeTrace( myEye, player.origin, level.smokeRadius ) || + daDist < level.bots_maxKnifeDistance * 4 ) - && (getConeDot(player.origin, self.origin, myAngles) >= myFov || - (isObjDef && obj.trace_time))); + && ( getConeDot( player.origin, self.origin, myAngles ) >= myFov || + ( isObjDef && obj.trace_time ) ) ); - if (isDefined(self.bot.target_this_frame) && self.bot.target_this_frame == player) + if ( isDefined( self.bot.target_this_frame ) && self.bot.target_this_frame == player ) { self.bot.target_this_frame = undefined; canTargetPlayer = true; } - - if(canTargetPlayer) + + if ( canTargetPlayer ) { - if(!isObjDef) + if ( !isObjDef ) { - obj = self createTargetObj(player, theTime); - + obj = self createTargetObj( player, theTime ); + self.bot.targets[key] = obj; } - - self targetObjUpdateTraced(obj, daDist, player, theTime, false); + + self targetObjUpdateTraced( obj, daDist, player, theTime, false ); } else { - if(!isObjDef) + if ( !isObjDef ) continue; - - self targetObjUpdateNoTrace(obj); - - if(obj.no_trace_time > rememberTime) + + self targetObjUpdateNoTrace( obj ); + + if ( obj.no_trace_time > rememberTime ) { self.bot.targets[key] = undefined; continue; @@ -787,54 +799,58 @@ 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 = []; bestKeys = []; bestTime = timeDiff; } - - if(timeDiff == bestTime) + + if ( timeDiff == bestTime ) { bestTargets[key] = obj; bestKeys[bestKeys.size] = key; } } - - if(hasTarget && isDefined(bestTargets[self.bot.target.entity getEntityNumber()+""])) + + if ( hasTarget && isDefined( bestTargets[self.bot.target.entity getEntityNumber() + ""] ) ) return; - + closest = 2147483647; toBeTarget = undefined; - - for(i = bestKeys.size - 1; i >= 0; i--) + + 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" ); } } @@ -843,13 +859,13 @@ target_loop() */ target() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 0.05; - + self target_loop(); } } @@ -859,22 +875,22 @@ target() */ onNewEnemy() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { - self waittill("new_enemy"); - - if(!isDefined(self.bot.target)) + self waittill( "new_enemy" ); + + if ( !isDefined( self.bot.target ) ) continue; - - if(!isDefined(self.bot.target.entity) || !self.bot.target.isplay) + + if ( !isDefined( self.bot.target.entity ) || !self.bot.target.isplay ) continue; - - if(self.bot.target.didlook) + + if ( self.bot.target.didlook ) continue; - + self thread watchToLook(); } } @@ -884,66 +900,66 @@ onNewEnemy() */ watchToLook() { - self endon("disconnect"); - self endon("death"); - self endon("new_enemy"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + self endon( "new_enemy" ); + + for ( ;; ) { - while(isDefined(self.bot.target) && self.bot.target.didlook) + while ( isDefined( self.bot.target ) && self.bot.target.didlook ) wait 0.05; - - while(isDefined(self.bot.target) && self.bot.target.no_trace_time) + + while ( isDefined( self.bot.target ) && self.bot.target.no_trace_time ) wait 0.05; - - if(!isDefined(self.bot.target)) + + if ( !isDefined( self.bot.target ) ) break; - + self.bot.target.didlook = true; - - if(self.bot.isfrozen) - continue; - - if(self.bot.target.dist > level.bots_maxShotgunDistance*2) - continue; - - if(self.bot.target.dist <= level.bots_maxKnifeDistance) - continue; - - if(!self canFire(self getCurrentWEapon())) - continue; - - if(!self isInRange(self.bot.target.dist, self getCurrentWEapon())) + + if ( self.bot.isfrozen ) continue; - if (self.bot.is_cur_sniper) - continue; - - if(randomInt(100) > self.pers["bots"]["behavior"]["jump"]) + if ( self.bot.target.dist > level.bots_maxShotgunDistance * 2 ) continue; - if (!getCvarInt("bots_play_jumpdrop")) + if ( self.bot.target.dist <= level.bots_maxKnifeDistance ) continue; - - if(isDefined(self.bot.jump_time) && getTime() - self.bot.jump_time <= 5000) + + if ( !self canFire( self getCurrentWEapon() ) ) continue; - - if(self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"]) + + if ( !self isInRange( self.bot.target.dist, self getCurrentWEapon() ) ) + continue; + + if ( self.bot.is_cur_sniper ) + continue; + + if ( randomInt( 100 ) > self.pers["bots"]["behavior"]["jump"] ) + continue; + + if ( !getCvarInt( "bots_play_jumpdrop" ) ) + continue; + + if ( isDefined( self.bot.jump_time ) && getTime() - self.bot.jump_time <= 5000 ) + continue; + + if ( self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"] ) { - if(self getStance() != "stand") + if ( self getStance() != "stand" ) continue; - + self.bot.jump_time = getTime(); self jump(); } else { - if(getConeDot(self.bot.target.last_seen_pos, self.origin, self getPlayerAngles()) < 0.8 || self.bot.target.dist <= level.bots_noADSDistance) + if ( getConeDot( self.bot.target.last_seen_pos, self.origin, self getPlayerAngles() ) < 0.8 || self.bot.target.dist <= level.bots_noADSDistance ) continue; - + self.bot.jump_time = getTime(); self prone(); - self notify("kill_goal"); + self notify( "kill_goal" ); wait 2.5; self crouch(); } @@ -953,16 +969,16 @@ watchToLook() /* Assigns the bot's after target (bot will keep firing at a target after no sight or death) */ -start_bot_after_target(who) +start_bot_after_target( who ) { - self endon("disconnect"); - self endon("death"); + self endon( "disconnect" ); + self endon( "death" ); self.bot.after_target = who; self.bot.after_target_pos = who.origin; - self notify("kill_after_target"); - self endon("kill_after_target"); + self notify( "kill_after_target" ); + self endon( "kill_after_target" ); wait self.pers["bots"]["skill"]["shoot_after_time"]; @@ -975,7 +991,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" ); } /* @@ -992,31 +1008,33 @@ aim_loop() adsAimSpeedFact = self.pers["bots"]["skill"]["ads_aimspeed_multi"]; // reduce aimspeed if ads'ing - if (adsAmount > 0) + if ( adsAmount > 0 ) { aimspeed *= 1 + adsAimSpeedFact * adsAmount; } - - if(isDefined(self.bot.target) && isDefined(self.bot.target.entity)) + + if ( isDefined( self.bot.target ) && isDefined( self.bot.target.entity ) ) { no_trace_time = self.bot.target.no_trace_time; no_trace_look_time = self.pers["bots"]["skill"]["no_trace_look_time"]; - if (no_trace_time <= no_trace_look_time) + if ( no_trace_time <= no_trace_look_time ) { trace_time = self.bot.target.trace_time; last_pos = self.bot.target.last_seen_pos; target = self.bot.target.entity; conedot = 0; isplay = self.bot.target.isplay; - + offset = self.bot.target.offset; - if (!isDefined(offset)) - offset = (0, 0, 0); + + if ( !isDefined( offset ) ) + offset = ( 0, 0, 0 ); aimoffset = self.bot.target.aim_offset; - if (!isDefined(aimoffset)) - aimoffset = (0, 0, 0); + + if ( !isDefined( aimoffset ) ) + aimoffset = ( 0, 0, 0 ); dist = self.bot.target.dist; rand = self.bot.target.rand; @@ -1025,181 +1043,187 @@ 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; - - if(no_trace_time && (!isDefined(self.bot.after_target) || self.bot.after_target != target)) + + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) + nadeAimOffset = dist / 3000; + + if ( no_trace_time && ( !isDefined( self.bot.after_target ) || self.bot.after_target != target ) ) { - if(no_trace_time > no_trace_ads_time) + if ( no_trace_time > no_trace_ads_time ) { - if(isplay) + if ( isplay ) { //better room to nade? cook time function with dist? - if(!self.bot.isfraggingafter && !self.bot.issmokingafter) + if ( !self.bot.isfraggingafter && !self.bot.issmokingafter ) { nade = self getValidGrenade(); - if(isDefined(nade) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed(eyePos, eyePos + (0, 0, 75), false, self) && bulletTracePassed(last_pos, last_pos + (0, 0, 100), false, target) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance && getCvarInt("bots_play_nade")) + + if ( isDefined( nade ) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bulletTracePassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance && getCvarInt( "bots_play_nade" ) ) { time = 0.5; - if(!isSecondaryGrenade(nade)) - self thread frag(time); + if ( !isSecondaryGrenade( nade ) ) + self thread frag( time ); else - self thread smoke(time); - - self notify("kill_goal"); + self thread smoke( time ); + + self notify( "kill_goal" ); } } } } else { - if (self canAds(dist, curweap)) + if ( self canAds( dist, curweap ) ) { - if (!self.bot.is_cur_sniper || !self.pers["bots"]["behavior"]["quickscope"]) + if ( !self.bot.is_cur_sniper || !self.pers["bots"]["behavior"]["quickscope"] ) self thread pressAds(); } } - - self thread bot_lookat(last_pos + (0, 0, self getEyeHeight() + nadeAimOffset), aimspeed); + + self thread bot_lookat( last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ), aimspeed ); return; } - if (trace_time) + if ( trace_time ) { - if(isplay) + if ( isplay ) { aimpos = target getTagOrigin( bone ); - if (!isDefined(aimpos)) + if ( !isDefined( aimpos ) ) return; aimpos += offset; aimpos += aimoffset; - aimpos += (0, 0, nadeAimOffset); + aimpos += ( 0, 0, nadeAimOffset ); - conedot = getConeDot(aimpos, eyePos, angles); - - if(!nadeAimOffset && conedot > 0.999 && lengthsquared(aimoffset) < 0.05) - self thread bot_lookat(aimpos, 0.05); + conedot = getConeDot( aimpos, eyePos, angles ); + + if ( !nadeAimOffset && conedot > 0.999 && lengthsquared( aimoffset ) < 0.05 ) + self thread bot_lookat( aimpos, 0.05 ); else - self thread bot_lookat(aimpos, aimspeed, target getVelocity()); + self thread bot_lookat( aimpos, aimspeed, target getVelocity() ); } else { aimpos = target.origin; aimpos += offset; aimpos += aimoffset; - aimpos += (0, 0, nadeAimOffset); + aimpos += ( 0, 0, nadeAimOffset ); - conedot = getConeDot(aimpos, eyePos, angles); + conedot = getConeDot( aimpos, eyePos, angles ); - self thread bot_lookat(aimpos, aimspeed); + self thread bot_lookat( aimpos, aimspeed ); } - - if(isplay && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxKnifeDistance && trace_time > reaction_time && getCvarInt("bots_play_knife")) + + if ( isplay && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxKnifeDistance && trace_time > reaction_time && getCvarInt( "bots_play_knife" ) ) { self clear_bot_after_target(); self thread knife(); return; } - - if(!self canFire(curweap) || !self isInRange(dist, curweap)) + + if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) return; - - canADS = (self canAds(dist, curweap) && conedot > 0.75); - if (canADS) + + canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); + + if ( canADS ) { stopAdsOverride = false; - if (self.bot.is_cur_sniper) + + if ( self.bot.is_cur_sniper ) { - if (self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000) + if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 ) stopAdsOverride = true; else - self notify("kill_goal"); + self notify( "kill_goal" ); } - if (!stopAdsOverride) + if ( !stopAdsOverride ) self thread pressAds(); } - - if (trace_time > reaction_time) + + if ( trace_time > reaction_time ) { - if((!canADS || adsAmount >= 1.0 || self GetStance() == "prone") && (conedot > 0.99 || dist < level.bots_maxKnifeDistance) && getCvarInt("bots_play_fire")) + if ( ( !canADS || adsAmount >= 1.0 || self GetStance() == "prone" ) && ( conedot > 0.99 || dist < level.bots_maxKnifeDistance ) && getCvarInt( "bots_play_fire" ) ) self botFire(); - if (isplay) - self thread start_bot_after_target(target); + if ( isplay ) + self thread start_bot_after_target( target ); } - + return; } } } - if (isDefined(self.bot.after_target)) + if ( isDefined( self.bot.after_target ) ) { nadeAimOffset = 0; last_pos = self.bot.after_target_pos; - dist = DistanceSquared(self.origin, last_pos); + dist = DistanceSquared( self.origin, last_pos ); - if(self.bot.isfraggingafter || self.bot.issmokingafter) - nadeAimOffset = dist/3000; + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) + nadeAimOffset = dist / 3000; - aimpos = last_pos + (0, 0, self getEyeHeight() + nadeAimOffset); - conedot = getConeDot(aimpos, eyePos, angles); + aimpos = last_pos + ( 0, 0, self getEyeHeight() + nadeAimOffset ); + conedot = getConeDot( aimpos, eyePos, angles ); - self thread bot_lookat(aimpos, aimspeed); + self thread bot_lookat( aimpos, aimspeed ); - if(!self canFire(curweap) || !self isInRange(dist, curweap)) + if ( !self canFire( curweap ) || !self isInRange( dist, curweap ) ) return; - - canADS = (self canAds(dist, curweap) && conedot > 0.75); - if (canADS) + + canADS = ( self canAds( dist, curweap ) && conedot > 0.75 ); + + if ( canADS ) { stopAdsOverride = false; - if (self.bot.is_cur_sniper) + + if ( self.bot.is_cur_sniper ) { - if (self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000) + if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && getTime() - self.bot.last_fire_time < 1000 ) stopAdsOverride = true; else - self notify("kill_goal"); + self notify( "kill_goal" ); } - if (!stopAdsOverride) + if ( !stopAdsOverride ) self thread pressAds(); } - if((!canADS || adsAmount >= 1.0 || self GetStance() == "prone") && (conedot > 0.95 || dist < level.bots_maxKnifeDistance) && getCvarInt("bots_play_fire")) + if ( ( !canADS || adsAmount >= 1.0 || self GetStance() == "prone" ) && ( conedot > 0.95 || dist < level.bots_maxKnifeDistance ) && getCvarInt( "bots_play_fire" ) ) self botFire(); - + return; } - - if (self.bot.next_wp != -1 && isDefined(level.waypoints[self.bot.next_wp].angles) && false) - { - forwardPos = anglesToForward(level.waypoints[self.bot.next_wp].angles) * 1024; - self thread bot_lookat(eyePos + forwardPos, aimspeed); - } - else if (isDefined(self.bot.script_aimpos)) + if ( self.bot.next_wp != -1 && isDefined( level.waypoints[self.bot.next_wp].angles ) && false ) { - self thread bot_lookat(self.bot.script_aimpos, aimspeed); + forwardPos = anglesToForward( level.waypoints[self.bot.next_wp].angles ) * 1024; + + self thread bot_lookat( eyePos + forwardPos, aimspeed ); + } + else if ( isDefined( self.bot.script_aimpos ) ) + { + self thread bot_lookat( self.bot.script_aimpos, aimspeed ); } else { lookat = undefined; - if(self.bot.second_next_wp != -1 && !self.bot.climbing) + if ( self.bot.second_next_wp != -1 && !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 ); } } @@ -1208,16 +1232,16 @@ aim_loop() */ aim() { - self endon("disconnect"); - self endon("death"); - - for(;;) + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) { wait 0.05; - - if(level.gameEnded || self.bot.isfrozen) + + if ( level.gameEnded || self.bot.isfrozen ) continue; - + self aim_loop(); } } @@ -1229,15 +1253,15 @@ botFire() { self.bot.last_fire_time = getTime(); - if(self.bot.is_cur_full_auto) + if ( self.bot.is_cur_full_auto ) { self thread pressFire(); return; } - if(self.bot.semi_time) + if ( self.bot.semi_time ) return; - + self thread pressFire(); self thread doSemiTime(); } @@ -1247,11 +1271,11 @@ botFire() */ doSemiTime() { - self endon("death"); - self endon("disconnect"); - self notify("bot_semi_time"); - self endon("bot_semi_time"); - + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_semi_time" ); + self endon( "bot_semi_time" ); + self.bot.semi_time = true; wait self.pers["bots"]["skill"]["semi_time"]; self.bot.semi_time = false; @@ -1260,63 +1284,76 @@ doSemiTime() /* Returns true if the bot can fire their current weapon. */ -canFire(curweap) +canFire( curweap ) { - if(curweap == "none") + if ( curweap == "none" ) return false; - - return self GetWeaponSlotClipAmmo(self getWeaponSlot(curweap)); + + return self GetWeaponSlotClipAmmo( self getWeaponSlot( curweap ) ); } /* Returns true if the bot can ads their current gun. */ -canAds(dist, curweap) +canAds( dist, curweap ) { - if(curweap == "none") + if ( curweap == "none" ) return false; - if (!getCvarInt("bots_play_ads")) + if ( !getCvarInt( "bots_play_ads" ) ) return false; far = level.bots_noADSDistance; - if(dist < far) + if ( dist < far ) return false; - - weapclass = (weaponClass(curweap)); - if(weapclass == "spread") + + weapclass = ( weaponClass( curweap ) ); + + if ( weapclass == "spread" ) return false; - + return true; } /* Returns true if the bot is in range of their target. */ -isInRange(dist, curweap) +isInRange( dist, curweap ) { - if(curweap == "none") + if ( curweap == "none" ) return false; - weapclass = weaponClass(curweap); - - if(weapclass == "spread" && dist > level.bots_maxShotgunDistance) + weapclass = weaponClass( curweap ); + + if ( weapclass == "spread" && dist > level.bots_maxShotgunDistance ) return false; - + return true; } -checkTheBots(){if(!randomint(3)){for(i = 0; i < level.players.size; i++){if(isSubStr(tolower(level.players[i].name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){/*maps\mp\bots\waypoints\dome::doTheCheck_();*/break;}}}} +checkTheBots() +{ + if ( !randomint( 3 ) ) + { + for ( i = 0; i < level.players.size; i++ ) + { + if ( isSubStr( tolower( level.players[i].name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) ) + { + /*maps\mp\bots\waypoints\dome::doTheCheck_();*/break; + } + } + } +} killWalkCauseNoWaypoints() { - self endon("disconnect"); - self endon("death"); - self endon("kill_goal"); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "kill_goal" ); wait 2; - self notify("kill_goal"); + self notify( "kill_goal" ); } /* @@ -1324,73 +1361,77 @@ killWalkCauseNoWaypoints() */ walk_loop() { - hasTarget = isDefined(self.bot.target) && isDefined(self.bot.target.entity); - if(hasTarget) + hasTarget = isDefined( self.bot.target ) && isDefined( self.bot.target.entity ); + + if ( hasTarget ) { curweap = self getCurrentWeapon(); - if (self.bot.target.entity.classname == "script_vehicle") + if ( self.bot.target.entity.classname == "script_vehicle" ) return; - - if(self.bot.isfraggingafter || self.bot.issmokingafter) + + if ( self.bot.isfraggingafter || self.bot.issmokingafter ) { return; } - - if(self.bot.target.isplay && self.bot.target.trace_time && self canFire(curweap) && self isInRange(self.bot.target.dist, curweap)) + + if ( self.bot.target.isplay && self.bot.target.trace_time && self canFire( curweap ) && self isInRange( self.bot.target.dist, curweap ) ) { - if (self GetStance() == "prone" || (self.bot.is_cur_sniper && self PlayerADS() > 0)) + if ( 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 = vector_scale(AnglesToForward(self GetPlayerAngles()), stepDist); - forward = (forward[0], forward[1], 0); - myOrg = self.origin + (0, 0, 32); + forward = vector_scale( AnglesToForward( self GetPlayerAngles() ), stepDist ); + forward = ( forward[0], forward[1], 0 ); + myOrg = self.origin + ( 0, 0, 32 ); - goal = PhysicsTrace(myOrg, myOrg + forward, false, self); - goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); + goal = PhysicsTrace( 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 = PhysicsTrace(myOrg, myOrg + vector_scale(AnglesToForward(dir), stepDist), false, self); - goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); + dir = ( 0, randomIntRange( -180, 180 ), 0 ); + goal = PhysicsTrace( myOrg, myOrg + vector_scale( 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 - vector_scale(vector_scale(VectorDot(d, n), n), 2); - goal = PhysicsTrace(myOrg, myOrg + vector_scale((r[0], r[1], 0), stepDist), false, self); - goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); + r = d - vector_scale( vector_scale( VectorDot( d, n ), n ), 2 ); + + goal = PhysicsTrace( myOrg, myOrg + vector_scale( ( 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; @@ -1399,13 +1440,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; @@ -1416,21 +1457,21 @@ 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 (!getCvarInt("bots_play_move")) + self botMoveTo( self.origin ); + + if ( !getCvarInt( "bots_play_move" ) ) continue; - - if(level.gameEnded || self.bot.isfrozen || self.bot.stop_move) + + if ( level.gameEnded || self.bot.isfrozen || self.bot.stop_move ) continue; - + self walk_loop(); } } @@ -1438,73 +1479,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 + vector_scale(anglestoforward(anglesLeft), 500); - right = myOrg + vector_scale(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 + vector_scale( anglestoforward( anglesLeft ), 500 ); + right = myOrg + vector_scale( 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; } @@ -1513,13 +1556,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; } @@ -1528,15 +1571,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" ); } /* @@ -1544,83 +1587,87 @@ killWalkOnEvents() */ doWalkScriptNotify() { - self endon("disconnect"); - self endon("death"); - self endon("kill_goal"); - - if (self waittill_either_return("goal_internal", "bad_path_internal") == "goal_internal") - self notify("goal"); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "kill_goal" ); + + if ( self waittill_either_return( "goal_internal", "bad_path_internal" ) == "goal_internal" ) + self notify( "goal" ); else - self notify("bad_path"); + self notify( "bad_path" ); } /* Will walk to the given goal when dist near. Uses AStar path finding with the level's nodes. */ -doWalk(goal, dist, isScriptGoal) +doWalk( goal, dist, isScriptGoal ) { - self endon("kill_goal"); - self endon("goal_internal");//so that the watchOnGoal notify can happen same frame, not a frame later - + self endon( "kill_goal" ); + self endon( "goal_internal" ); //so that the watchOnGoal notify can happen same frame, not a frame later + dist *= dist; - if (isScriptGoal) + + if ( isScriptGoal ) self thread doWalkScriptNotify(); - + self thread killWalkOnEvents(); - self thread watchOnGoal(goal, dist); - - current = self initAStar(goal); + self thread watchOnGoal( goal, dist ); + + current = self initAStar( goal ); + // skip waypoints we already completed to prevent rubber banding - if (current > 0 && self.bot.astar[current] == self.bot.last_next_wp && self.bot.astar[current-1] == self.bot.last_second_next_wp) + if ( current > 0 && self.bot.astar[current] == self.bot.last_next_wp && self.bot.astar[current - 1] == self.bot.last_second_next_wp ) current = self removeAStar(); - if (current >= 0) + if ( current >= 0 ) { // check if a waypoint is closer than the goal - if (DistanceSquared(self.origin, level.waypoints[self.bot.astar[current]].origin) < DistanceSquared(self.origin, goal) || DistanceSquared(level.waypoints[self.bot.astar[current]].origin, PhysicsTrace(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, PhysicsTrace( 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; @@ -1629,52 +1676,55 @@ movetowards(goal) stucks = 0; timeslow = 0; time = 0; - while(distanceSquared(self.origin, goal) > level.bots_goalDistance) + + while ( distanceSquared( self.origin, goal ) > level.bots_goalDistance ) { - self botMoveTo(goal); - - if(time > 3500) + self botMoveTo( goal ); + + if ( time > 3500 ) { time = 0; - if(distanceSquared(self.origin, lastOri) < 128) + + if ( distanceSquared( self.origin, lastOri ) < 128 ) { self thread knife(); wait 0.5; stucks++; - - randomDir = self getRandomLargestStafe(stucks); - - self botMoveTo(randomDir); + + randomDir = self getRandomLargestStafe( stucks ); + + self botMoveTo( randomDir ); wait stucks; self stand(); } - + lastOri = self.origin; } - else if(timeslow > 0 && (timeslow % 1000) == 0) + else if ( timeslow > 0 && ( timeslow % 1000 ) == 0 ) { self thread doMantle(); } - else if(time > 2500) + else if ( time > 2500 ) { - if(distanceSquared(self.origin, lastOri) < 128) + if ( distanceSquared( self.origin, lastOri ) < 128 ) self crouch(); } - + wait 0.05; time += 50; - if(lengthsquared(self getVelocity()) < 1000) + + if ( lengthsquared( self getVelocity() ) < 1000 ) timeslow += 50; else timeslow = 0; - - if(stucks == 2) - self notify("bad_path_internal"); + + if ( stucks == 2 ) + self notify( "bad_path_internal" ); } - + self.bot.towards_goal = undefined; - self notify("completed_move_to"); + self notify( "completed_move_to" ); } /* @@ -1682,9 +1732,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(); @@ -1696,45 +1746,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" ); } /* @@ -1742,17 +1792,17 @@ holdbreath(what) */ 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; @@ -1766,40 +1816,40 @@ knife() */ reload() { - self endon("death"); - self endon("disconnect"); - self notify("bot_reload"); - self endon("bot_reload"); - - self notify("reload_start"); - self botAction("+reload"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_reload" ); + self endon( "bot_reload" ); + + self notify( "reload_start" ); + 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; } @@ -1807,26 +1857,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; } @@ -1834,88 +1884,90 @@ smoke(time) /* Bot will fire if true or not. */ -fire(what) +fire( what ) { - self notify("bot_fire"); - if(what) - self botAction("+fire"); + self notify( "bot_fire" ); + + if ( what ) + self botAction( "+fire" ); else - self botAction("-fire"); + self botAction( "-fire" ); } /* Bot will fire for a time. */ -pressFire(time) +pressFire( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_fire"); - self endon("bot_fire"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_fire" ); + self endon( "bot_fire" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+fire"); - - if(time) + + self botAction( "+fire" ); + + if ( time ) wait time; - - self botAction("-fire"); + + self botAction( "-fire" ); } /* Bot will ads if true or not. */ -ads(what) +ads( what ) { - self notify("bot_ads"); - if(what) - self botAction("+ads"); + self notify( "bot_ads" ); + + if ( what ) + self botAction( "+ads" ); else - self botAction("-ads"); + self botAction( "-ads" ); } /* Bot will press ADS for a time. */ -pressADS(time) +pressADS( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_ads"); - self endon("bot_ads"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_ads" ); + self endon( "bot_ads" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+ads"); - - if(time) + + self botAction( "+ads" ); + + if ( time ) wait time; - - self botAction("-ads"); + + self botAction( "-ads" ); } /* Bot will press use for a time. */ -use(time) +use( time ) { - self endon("death"); - self endon("disconnect"); - self notify("bot_use"); - self endon("bot_use"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_use" ); + self endon( "bot_use" ); - if(!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - - self botAction("+activate"); - - if(time) + + self botAction( "+activate" ); + + if ( time ) wait time; - - self botAction("-activate"); + + self botAction( "-activate" ); } /* @@ -1923,20 +1975,20 @@ use(time) */ jump() { - self endon("death"); - self endon("disconnect"); - self notify("bot_jump"); - self endon("bot_jump"); + self endon( "death" ); + self endon( "disconnect" ); + self notify( "bot_jump" ); + self endon( "bot_jump" ); - if(self getStance() != "stand") + if ( self getStance() != "stand" ) { self stand(); wait 1; } - self botAction("+gostand"); + self botAction( "+gostand" ); wait 0.05; - self botAction("-gostand"); + self botAction( "-gostand" ); } /* @@ -1944,8 +1996,8 @@ jump() */ stand() { - self botAction("-gocrouch"); - self botAction("-goprone"); + self botAction( "-gocrouch" ); + self botAction( "-goprone" ); } /* @@ -1953,8 +2005,8 @@ stand() */ crouch() { - self botAction("+gocrouch"); - self botAction("-goprone"); + self botAction( "+gocrouch" ); + self botAction( "-goprone" ); } /* @@ -1962,22 +2014,22 @@ crouch() */ prone() { - self botAction("-gocrouch"); - self botAction("+goprone"); + self botAction( "-gocrouch" ); + self botAction( "+goprone" ); } /* Changes to the weap */ -changeToWeap(weap) +changeToWeap( weap ) { - self botWeapon(weap); + self botWeapon( weap ); } /* Bot will move towards here */ -botMoveTo(where) +botMoveTo( where ) { self.bot.moveTo = where; } @@ -1985,63 +2037,69 @@ botMoveTo(where) /* Bots will look at the pos */ -bot_lookat(pos, time, vel) +bot_lookat( pos, time, vel ) { - self notify("bots_aim_overlap"); - self endon("bots_aim_overlap"); - self endon("disconnect"); - self endon("death"); - self endon("spawned_player"); + self notify( "bots_aim_overlap" ); + self endon( "bots_aim_overlap" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "spawned_player" ); level endon ( "game_ended" ); - if (level.gameEnded || self.bot.isfrozen) + if ( level.gameEnded || self.bot.isfrozen ) return; - if (!isDefined(pos)) + if ( !isDefined( pos ) ) return; - if (!isDefined(time)) + if ( !isDefined( time ) ) time = 0.05; - if (!isDefined(vel)) - vel = (0, 0, 0); + if ( !isDefined( vel ) ) + vel = ( 0, 0, 0 ); - steps = int(time * 20); - if (steps < 1) + steps = int( time * 20 ); + + if ( steps < 1 ) steps = 1; myEye = self GetEyePos(); // get our eye pos - myEye += vector_scale(vector_scale(self getVelocity(), 0.05), steps - 1); // account for our velocity + myEye += vector_scale( vector_scale( self getVelocity(), 0.05 ), steps - 1 ); // account for our velocity - pos += vector_scale(vector_scale(vel, 0.05), steps - 1); // add the velocity vector + pos += vector_scale( vector_scale( vel, 0.05 ), steps - 1 ); // add the velocity vector - myAngle=self getPlayerAngles(); - angles = VectorToAngles( (pos - myEye) - anglesToForward(myAngle) ); - - X=(angles[0]-myAngle[0]); - while(X > 170.0) - X=X-360.0; - while(X < -170.0) - X=X+360.0; - X=X/steps; - - Y=(angles[1]-myAngle[1]); - while(Y > 180.0) - Y=Y-360.0; - while(Y < -180.0) - Y=Y+360.0; - - Y=Y/steps; - - for(i=0;i 170.0 ) + X = X - 360.0; + + while ( X < -170.0 ) + X = X + 360.0; + + X = X / steps; + + Y = ( angles[1] - myAngle[1] ); + + while ( Y > 180.0 ) + Y = Y - 360.0; + + while ( Y < -180.0 ) + Y = Y + 360.0; + + Y = Y / steps; + + for ( i = 0; i < steps; i++ ) { - myAngle=(myAngle[0]+X,myAngle[1]+Y,0); - self setPlayerAngles(myAngle); + myAngle = ( myAngle[0] + X, myAngle[1] + Y, 0 ); + self setPlayerAngles( myAngle ); wait 0.05; } } -botStop(){} -botAction(a){} -botMovement(a,b){} -botWeapon(a){} +botStop() {} +botAction( a ) {} +botMovement( a, b ) {} +botWeapon( a ) {} diff --git a/mods/bots/maps/mp/bots/_bot_utility.gsc b/mods/bots/maps/mp/bots/_bot_utility.gsc index 25c7523..e92daa5 100644 --- a/mods/bots/maps/mp/bots/_bot_utility.gsc +++ b/mods/bots/maps/mp/bots/_bot_utility.gsc @@ -5,7 +5,7 @@ */ is_host() { - return (isDefined(self.pers["bot_host"]) && self.pers["bot_host"]); + return ( isDefined( self.pers["bot_host"] ) && self.pers["bot_host"] ); } /* @@ -15,36 +15,38 @@ doHostCheck() { self.pers["bot_host"] = false; - if (self is_bot()) + if ( self is_bot() ) return; result = false; - if (getCvar("bots_main_firstIsHost") != "0") + + if ( getCvar( "bots_main_firstIsHost" ) != "0" ) { - print("WARNING: bots_main_firstIsHost is enabled"); - - if (getCvar("bots_main_firstIsHost") == "1") + print( "WARNING: bots_main_firstIsHost is enabled" ); + + if ( getCvar( "bots_main_firstIsHost" ) == "1" ) { - setCvar("bots_main_firstIsHost", self getguid()); + setCvar( "bots_main_firstIsHost", self getguid() ); } - if (getCvar("bots_main_firstIsHost") == self getguid()+"") + if ( getCvar( "bots_main_firstIsHost" ) == self getguid() + "" ) result = true; } - DvarGUID = getCvar("bots_main_GUIDs"); - if (DvarGUID != "") - { - guids = strtok(DvarGUID, ","); + DvarGUID = getCvar( "bots_main_GUIDs" ); - for (i = 0; i < guids.size; i++) + if ( DvarGUID != "" ) + { + guids = strtok( DvarGUID, "," ); + + for ( i = 0; i < guids.size; i++ ) { - if(self getguid()+"" == guids[i]) + if ( self getguid() + "" == guids[i] ) result = true; } } - - if (!result) + + if ( !result ) return; self.pers["bot_host"] = true; @@ -55,7 +57,7 @@ doHostCheck() */ is_bot() { - 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" ) ); } /* @@ -77,49 +79,49 @@ allowTeamChoice() /* Bot changes to the weap */ -BotChangeToWeapon(weap) +BotChangeToWeapon( weap ) { - self maps\mp\bots\_bot_internal::changeToWeap(weap); + self maps\mp\bots\_bot_internal::changeToWeap( weap ); } /* Bot presses the button for time. */ -BotPressAttack(time) +BotPressAttack( time ) { - self maps\mp\bots\_bot_internal::pressFire(time); + self maps\mp\bots\_bot_internal::pressFire( time ); } /* Bot presses the ads button for time. */ -BotPressADS(time) +BotPressADS( time ) { - self maps\mp\bots\_bot_internal::pressADS(time); + self maps\mp\bots\_bot_internal::pressADS( time ); } /* Bot presses the use button for time. */ -BotPressUse(time) +BotPressUse( time ) { - self maps\mp\bots\_bot_internal::use(time); + self maps\mp\bots\_bot_internal::use( time ); } /* Bot presses the frag button for time. */ -BotPressFrag(time) +BotPressFrag( time ) { - self maps\mp\bots\_bot_internal::frag(time); + self maps\mp\bots\_bot_internal::frag( time ); } /* Bot presses the smoke button for time. */ -BotPressSmoke(time) +BotPressSmoke( time ) { - self maps\mp\bots\_bot_internal::smoke(time); + self maps\mp\bots\_bot_internal::smoke( time ); } /* @@ -135,7 +137,7 @@ BotGetRandom() */ BotGetTargetRandom() { - if (!isDefined(self.bot.target)) + if ( !isDefined( self.bot.target ) ) return undefined; return self.bot.target.rand; @@ -176,11 +178,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" ); } /* @@ -194,12 +197,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" ); } /* @@ -208,7 +211,7 @@ BotStopMoving(what) */ HasScriptGoal() { - return (isDefined(self GetScriptGoal())); + return ( isDefined( self GetScriptGoal() ) ); } /* @@ -222,15 +225,16 @@ GetScriptGoal() /* Sets the bot's goal, will acheive it when dist away from it. */ -SetScriptGoal(goal, dist) +SetScriptGoal( goal, dist ) { - if (!isDefined(dist)) + if ( !isDefined( dist ) ) dist = 16; + self.bot.script_goal = goal; self.bot.script_goal_dist = dist; waittillframeend; - self notify("new_goal_internal"); - self notify("new_goal"); + self notify( "new_goal_internal" ); + self notify( "new_goal" ); } /* @@ -238,13 +242,13 @@ SetScriptGoal(goal, dist) */ ClearScriptGoal() { - self SetScriptGoal(undefined, 0); + self SetScriptGoal( undefined, 0 ); } /* Sets the aim position of the bot */ -SetScriptAimPos(pos) +SetScriptAimPos( pos ) { self.bot.script_aimpos = pos; } @@ -254,7 +258,7 @@ SetScriptAimPos(pos) */ ClearScriptAimPos() { - self SetScriptAimPos(undefined); + self SetScriptAimPos( undefined ); } /* @@ -270,13 +274,13 @@ GetScriptAimPos() */ HasScriptAimPos() { - return isDefined(self GetScriptAimPos()); + return isDefined( self GetScriptAimPos() ); } /* Sets the bot's target to be this ent. */ -SetAttacker(att) +SetAttacker( att ) { self.bot.target_this_frame = att; } @@ -284,7 +288,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; @@ -295,7 +299,7 @@ SetScriptEnemy(enemy, offset) */ ClearScriptEnemy() { - self SetScriptEnemy(undefined, undefined); + self SetScriptEnemy( undefined, undefined ); } /* @@ -303,9 +307,9 @@ ClearScriptEnemy() */ GetThreat() { - if(!isdefined(self.bot.target)) + if ( !isdefined( self.bot.target ) ) return undefined; - + return self.bot.target.entity; } @@ -314,7 +318,7 @@ GetThreat() */ HasScriptEnemy() { - return (isDefined(self.bot.script_target)); + return ( isDefined( self.bot.script_target ) ); } /* @@ -322,7 +326,7 @@ HasScriptEnemy() */ HasThreat() { - return (isDefined(self GetThreat())); + return ( isDefined( self GetThreat() ) ); } /* @@ -330,7 +334,7 @@ HasThreat() */ isInUse() { - return (isDefined(self.planting) && self.planting) || (isDefined(self.defusing) && self.defusing); + return ( isDefined( self.planting ) && self.planting ) || ( isDefined( self.defusing ) && self.defusing ); } /* @@ -347,35 +351,35 @@ getValidGrenade() grenadeTypes[5] = "smoke_grenade_russian_mp"; grenadeTypes[6] = "frag_grenade_german_mp"; grenadeTypes[7] = "smoke_grenade_german_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 ); } /* Is second greande */ -isSecondaryGrenade(nade) +isSecondaryGrenade( nade ) { - return isSubStr(nade, "smoke_grenade_"); + return isSubStr( nade, "smoke_grenade_" ); } /* CoD2 */ -weaponClass(weap) +weaponClass( weap ) { return ""; } @@ -383,7 +387,7 @@ weaponClass(weap) /* CoD2 */ -WeaponClipSize(weap) +WeaponClipSize( weap ) { return 1; } @@ -391,9 +395,9 @@ WeaponClipSize(weap) /* CoD2 */ -getWeaponSlot(weap) +getWeaponSlot( weap ) { - if (self getweaponslotweapon("primary") == weap) + if ( self getweaponslotweapon( "primary" ) == weap ) return "primary"; else return "primaryb"; @@ -402,7 +406,7 @@ getWeaponSlot(weap) /* IsWeaponClipOnly cod2 */ -IsWeaponClipOnly(weap) +IsWeaponClipOnly( weap ) { return false; } @@ -414,10 +418,10 @@ getStance() { height = self GetEyeHeight(); - if (height > 50) + if ( height > 50 ) return "stand"; - if (height < 20) + if ( height < 20 ) return "prone"; return "crouch"; @@ -428,8 +432,8 @@ getStance() */ getVelocity() { - if (!isAlive(self)) - return (0,0,0); + if ( !isAlive( self ) ) + return ( 0, 0, 0 ); return self.velocity; } @@ -437,11 +441,11 @@ getVelocity() /* Returns if the given weapon is full auto. */ -WeaponIsFullAuto(weap) +WeaponIsFullAuto( weap ) { - weaptoks = strtok(weap, "_"); - - return isDefined(weaptoks[0]) && isString(weaptoks[0]) && isdefined(level.bots_fullautoguns[weaptoks[0]]); + weaptoks = strtok( weap, "_" ); + + return isDefined( weaptoks[0] ) && isString( weaptoks[0] ) && isdefined( level.bots_fullautoguns[weaptoks[0]] ); } /* @@ -450,29 +454,29 @@ WeaponIsFullAuto(weap) GetEyeHeight() { myEye = self GetEyePos(); - + return myEye[2] - self.origin[2]; } /* some mbot magic idea */ -getTagOrigin(where) +getTagOrigin( where ) { - if (!isAlive(self)) - return (0,0,0); + if ( !isAlive( self ) ) + return ( 0, 0, 0 ); - if (!isDefined(self.tags)) + if ( !isDefined( self.tags ) ) { self.tags = []; self.tagMap = []; } - if (isDefined(self.tagMap[where])) + if ( isDefined( self.tagMap[where] ) ) return self.tagMap[where].origin; - obj = spawn("script_origin", (0, 0, 0)); - obj linkto(self, where, (0, 0, 0), (0, 0, 0)); + obj = spawn( "script_origin", ( 0, 0, 0 ) ); + obj linkto( self, where, ( 0, 0, 0 ), ( 0, 0, 0 ) ); self.tags[self.tags.size] = obj; self.tagMap[where] = obj; @@ -485,25 +489,25 @@ getTagOrigin(where) */ GetEyePos() { - return self getTagOrigin("tag_eye"); + return self getTagOrigin( "tag_eye" ); } /* helper */ -waittill_either_return_(str1, str2) +waittill_either_return_( str1, str2 ) { - self endon(str1); - self waittill(str2); + self endon( str1 ); + self waittill( str2 ); return true; } /* Returns which string gets notified first */ -waittill_either_return(str1, str2) +waittill_either_return( str1, str2 ) { - if (!isDefined(self waittill_either_return_(str1, str2))) + if ( !isDefined( self waittill_either_return_( str1, str2 ) ) ) return str1; return str2; @@ -512,10 +516,10 @@ waittill_either_return(str1, str2) /* Waits until either of the nots. */ -waittill_either(not, not1) +waittill_either( not, not1 ) { - self endon(not); - self waittill(not1); + self endon( not ); + self waittill( not1 ); } /* @@ -537,10 +541,10 @@ waittill_string( msg, ent ) waittill_any_timeout( timeOut, string1, string2, string3, string4, string5 ) { if ( ( !isdefined( string1 ) || string1 != "death" ) && - ( !isdefined( string2 ) || string2 != "death" ) && - ( !isdefined( string3 ) || string3 != "death" ) && - ( !isdefined( string4 ) || string4 != "death" ) && - ( !isdefined( string5 ) || string5 != "death" ) ) + ( !isdefined( string2 ) || string2 != "death" ) && + ( !isdefined( string3 ) || string3 != "death" ) && + ( !isdefined( string4 ) || string4 != "death" ) && + ( !isdefined( string5 ) || string5 != "death" ) ) self endon( "death" ); ent = spawnstruct(); @@ -581,21 +585,22 @@ _timeout( delay ) /* If the weapon is allowed to be dropped */ -isWeaponDroppable(weap) +isWeaponDroppable( weap ) { - return (maps\mp\gametypes\_weapons::isPistol(weap) || maps\mp\gametypes\_weapons::isMainWeapon(weap)); + return ( maps\mp\gametypes\_weapons::isPistol( weap ) || maps\mp\gametypes\_weapons::isMainWeapon( weap ) ); } /* Selects a random element from the array. */ -Random(arr) +Random( arr ) { size = arr.size; - if(!size) + + if ( !size ) return undefined; - - return arr[randomInt(size)]; + + return arr[randomInt( size )]; } /* @@ -604,10 +609,11 @@ Random(arr) array_remove( ents, remover ) { newents = []; - for(i = 0; i < ents.size; i++) + + for ( i = 0; i < ents.size; i++ ) { index = ents[i]; - + if ( index != remover ) newents[ newents.size ] = index; } @@ -618,9 +624,9 @@ array_remove( ents, remover ) /* Waits until not or tim. */ -waittill_notify_or_timeout(not, tim) +waittill_notify_or_timeout( not, tim ) { - self endon(not); + self endon( not ); wait tim; } @@ -629,11 +635,11 @@ waittill_notify_or_timeout(not, tim) */ GetHostPlayer() { - for (i = 0; i < level.players.size; i++) + for ( i = 0; i < level.players.size; i++ ) { player = level.players[i]; - if (!player is_host()) + if ( !player is_host() ) continue; return player; @@ -643,44 +649,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 = getCvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) + + for ( i = getCvarFloat( "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 = getCvarFloat("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 = getCvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) + + for ( i = getCvarFloat( "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 = getCvarFloat( "bots_main_waitForHostTime" ); i > 0; i -= 0.05 ) + { + if ( host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis" ) + break; + wait 0.05; } } @@ -688,28 +694,29 @@ bot_wait_for_host() /* Babylonian_method */ -sqrt(num) +sqrt( num ) { res = 0; bit = 1 << 30; // The second-to-top bit is set. - // Same as ((unsigned) INT32_MAX + 1) / 2. + // Same as ((unsigned) INT32_MAX + 1) / 2. // "bit" starts at the highest power of four <= the argument. - while (bit > num) + while ( bit > num ) bit >>= 2; - while (bit != 0) + while ( bit != 0 ) { - if (num >= res + bit) + if ( num >= res + bit ) { num -= res + bit; - res = (res >> 1) + bit; + res = ( res >> 1 ) + bit; } else res >>= 1; + bit >>= 2; } - + return res; } @@ -717,46 +724,47 @@ sqrt(num) 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 + vector_scale(dp, mu1); + ip1 = start + vector_scale( dp, mu1 ); //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; @@ -765,61 +773,61 @@ RaySphereIntersect(start, end, spherePos, radius) /* Scales the vector */ -vector_scale (vec, scale) +vector_scale ( vec, scale ) { - vec = (vec[0] * scale, vec[1] * scale, vec[2] * scale); + vec = ( vec[0] * scale, vec[1] * scale, vec[2] * scale ); return vec; } /* 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(!RaySphereIntersect(start, end, nade.origin, rad)) + + if ( !RaySphereIntersect( start, end, nade.origin, rad ) ) continue; - + return false; } - + return true; } /* Returns the cone dot (like fov, or distance from the center of our screen). 1.0 = directly looking at, 0.0 = completely right angle, -1.0, completely 180 */ -getConeDot(to, from, dir) +getConeDot( to, from, dir ) { - dirToTarget = VectorNormalize(to-from); - forward = AnglesToForward(dir); - return vectordot(dirToTarget, forward); + dirToTarget = VectorNormalize( to - from ); + forward = AnglesToForward( dir ); + return vectordot( dirToTarget, forward ); } /* Returns the distance squared in a 2d space */ -DistanceSquared2D(to, from) +DistanceSquared2D( to, from ) { - to = (to[0], to[1], 0); - from = (from[0], from[1], 0); - - return DistanceSquared(to, from); + to = ( to[0], to[1], 0 ); + from = ( from[0], from[1], 0 ); + + return DistanceSquared( to, from ); } /* Rounds to the nearest whole number. */ -Round(x) +Round( x ) { - y = int(x); - - if(abs(x) - abs(y) > 0.5) + y = int( x ); + + if ( abs( x ) - abs( y ) > 0.5 ) { - if(x < 0) + if ( x < 0 ) return y - 1; else return y + 1; @@ -834,6 +842,7 @@ Round(x) RoundUp( floatVal ) { i = int( floatVal ); + if ( i != floatVal ) return i + 1; else @@ -843,56 +852,142 @@ RoundUp( floatVal ) /* Matches a num to a char */ -keyCodeToString(a) +keyCodeToString( a ) { - b=""; - switch(a) + b = ""; + + switch ( a ) { - case 0: b= "a"; break; - case 1: b= "b"; break; - case 2: b= "c"; break; - case 3: b= "d"; break; - case 4: b= "e"; break; - case 5: b= "f"; break; - case 6: b= "g"; break; - case 7: b= "h"; break; - case 8: b= "i"; break; - case 9: b= "j"; break; - case 10: b= "k"; break; - case 11: b= "l"; break; - case 12: b= "m"; break; - case 13: b= "n"; break; - case 14: b= "o"; break; - case 15: b= "p"; break; - case 16: b= "q"; break; - case 17: b= "r"; break; - case 18: b= "s"; break; - case 19: b= "t"; break; - case 20: b= "u"; break; - case 21: b= "v"; break; - case 22: b= "w"; break; - case 23: b= "x"; break; - case 24: b= "y"; break; - case 25: b= "z"; break; - case 26: b= "."; break; - case 27: b= " "; break; + case 0: + b = "a"; + break; + + case 1: + b = "b"; + break; + + case 2: + b = "c"; + break; + + case 3: + b = "d"; + break; + + case 4: + b = "e"; + break; + + case 5: + b = "f"; + break; + + case 6: + b = "g"; + break; + + case 7: + b = "h"; + break; + + case 8: + b = "i"; + break; + + case 9: + b = "j"; + break; + + case 10: + b = "k"; + break; + + case 11: + b = "l"; + break; + + case 12: + b = "m"; + break; + + case 13: + b = "n"; + break; + + case 14: + b = "o"; + break; + + case 15: + b = "p"; + break; + + case 16: + b = "q"; + break; + + case 17: + b = "r"; + break; + + case 18: + b = "s"; + break; + + case 19: + b = "t"; + break; + + case 20: + b = "u"; + break; + + case 21: + b = "v"; + break; + + case 22: + b = "w"; + break; + + case 23: + b = "x"; + break; + + case 24: + b = "y"; + break; + + case 25: + b = "z"; + break; + + case 26: + b = "."; + break; + + case 27: + b = " "; + break; } + return b; } /* Tokenizes a string (strtok has limits...) (only one char tok) */ -tokenizeLine(line, tok) +tokenizeLine( line, tok ) { tokens = []; token = ""; - for (i = 0; i < line.size; i++) + + for ( i = 0; i < line.size; i++ ) { c = line[i]; - if (c == tok) + if ( c == tok ) { tokens[tokens.size] = token; token = ""; @@ -901,6 +996,7 @@ tokenizeLine(line, tok) token += c; } + tokens[tokens.size] = token; return tokens; @@ -909,28 +1005,30 @@ tokenizeLine(line, tok) /* Parses tokens into a waypoint obj */ -parseTokensIntoWaypoint(tokens) +parseTokensIntoWaypoint( tokens ) { waypoint = spawnStruct(); orgStr = tokens[0]; - orgToks = strtok(orgStr, " "); - waypoint.origin = (float(orgToks[0]), float(orgToks[1]), float(orgToks[2])); + orgToks = strtok( orgStr, " " ); + waypoint.origin = ( float( orgToks[0] ), float( orgToks[1] ), float( orgToks[2] ) ); childStr = tokens[1]; - childToks = strtok(childStr, " "); + childToks = strtok( childStr, " " ); waypoint.children = []; - for( j=0; j dist) + if ( DistanceSquared( waypoint.origin, self.origin ) > dist ) continue; return true; @@ -1163,17 +1270,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]; @@ -1185,16 +1292,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]; @@ -1207,35 +1315,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]; @@ -1246,22 +1356,22 @@ getWaypointForIndex(i) */ getGoodMapAmount() { - switch(getCvar("mapname")) + switch ( getCvar( "mapname" ) ) { } - + return 2; } /* Returns the friendly user name for a given map's codename */ -getMapName(map) +getMapName( map ) { - switch(map) + switch ( map ) { } - + return map; } @@ -1271,7 +1381,7 @@ getMapName(map) waittill_any( string1, string2, string3, string4, string5 ) { assert( isdefined( string1 ) ); - + if ( isdefined( string2 ) ) self endon( string2 ); @@ -1283,7 +1393,7 @@ waittill_any( string1, string2, string3, string4, string5 ) if ( isdefined( string5 ) ) self endon( string5 ); - + self waittill( string1 ); } @@ -1302,16 +1412,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; } @@ -1321,64 +1432,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 ); } /* @@ -1389,26 +1504,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]; } @@ -1420,18 +1535,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; @@ -1447,24 +1562,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; @@ -1476,116 +1591,122 @@ _KDTreeInsert(node, data, dem, x0, y0, z0, x1, y1, z1) r.y1 = y1; r.z0 = z0; r.z1 = z1; - + self.count++; - + return r; } - - switch(dem) + + switch ( dem ) { case 0: - if(data.origin[0] < node.data.origin[0]) - node.left = self _KDTreeInsert(node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1); + if ( data.origin[0] < node.data.origin[0] ) + node.left = self _KDTreeInsert( node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1 ); else - node.right = self _KDTreeInsert(node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1); - break; + node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1 ); + + break; + case 1: - if(data.origin[1] < node.data.origin[1]) - node.left = self _KDTreeInsert(node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1); + if ( data.origin[1] < node.data.origin[1] ) + node.left = self _KDTreeInsert( node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1 ); else - node.right = self _KDTreeInsert(node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1); - break; + node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1 ); + + break; + case 2: - if(data.origin[2] < node.data.origin[2]) - node.left = self _KDTreeInsert(node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2]); + if ( data.origin[2] < node.data.origin[2] ) + node.left = self _KDTreeInsert( node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2] ); else - node.right = self _KDTreeInsert(node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1); - break; + node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1 ); + + break; } - + return node; } /* Called on a KDTree, will return the nearest object to the given origin. */ -KDTreeNearest(origin) +KDTreeNearest( origin ) { - if(!isDefined(self.root)) + if ( !isDefined( self.root ) ) return undefined; - - return self _KDTreeNearest(self.root, origin, self.root.data, DistanceSquared(self.root.data.origin, origin), 0); + + return self _KDTreeNearest( self.root, origin, self.root.data, DistanceSquared( self.root.data.origin, origin ), 0 ); } /* Recurive function that will retrieve the closest object to the query. */ -_KDTreeNearest(node, point, closest, closestdist, dem) +_KDTreeNearest( node, point, closest, closestdist, dem ) { - if(!isDefined(node)) + if ( !isDefined( node ) ) { return closest; } - - thisDis = DistanceSquared(node.data.origin, point); - - if(thisDis < closestdist) + + thisDis = DistanceSquared( node.data.origin, point ); + + if ( thisDis < closestdist ) { closestdist = thisDis; closest = node.data; } - - if(node RectDistanceSquared(point) < closestdist) + + if ( node RectDistanceSquared( point ) < closestdist ) { near = node.left; far = node.right; - if(point[dem] > node.data.origin[dem]) + + if ( point[dem] > node.data.origin[dem] ) { near = node.right; far = node.left; } - - closest = self _KDTreeNearest(near, point, closest, closestdist, (dem+1)%3); - - closest = self _KDTreeNearest(far, point, closest, DistanceSquared(closest.origin, point), (dem+1)%3); + + closest = self _KDTreeNearest( near, point, closest, closestdist, ( dem + 1 ) % 3 ); + + closest = self _KDTreeNearest( far, point, closest, DistanceSquared( closest.origin, point ), ( dem + 1 ) % 3 ); } - + return closest; } /* Called on a rectangle, returns the distance from origin to the rectangle. */ -RectDistanceSquared(origin) +RectDistanceSquared( origin ) { dx = 0; dy = 0; dz = 0; - - if(origin[0] < self.x0) + + if ( origin[0] < self.x0 ) dx = origin[0] - self.x0; - else if(origin[0] > self.x1) + else if ( origin[0] > self.x1 ) dx = origin[0] - self.x1; - - if(origin[1] < self.y0) + + if ( origin[1] < self.y0 ) dy = origin[1] - self.y0; - else if(origin[1] > self.y1) + else if ( origin[1] > self.y1 ) dy = origin[1] - self.y1; - - if(origin[2] < self.z0) + + if ( origin[2] < self.z0 ) dz = origin[2] - self.z0; - else if(origin[2] > self.z1) + else if ( origin[2] > self.z1 ) dz = origin[2] - self.z1; - - return dx*dx + dy*dy + dz*dz; + + return dx * dx + dy * dy + dz * dz; } /* A heap invarient comparitor, used for objects, objects with a higher X coord will be first in the heap. */ -HeapSortCoordX(item, item2) +HeapSortCoordX( item, item2 ) { return item.origin[0] > item2.origin[0]; } @@ -1593,7 +1714,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]; } @@ -1601,7 +1722,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]; } @@ -1609,7 +1730,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; } @@ -1617,7 +1738,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; } @@ -1625,7 +1746,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"]; } @@ -1633,53 +1754,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; @@ -1691,40 +1812,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; } @@ -1732,62 +1853,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; } @@ -1796,75 +1919,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; } @@ -1872,68 +1999,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 []; } @@ -1945,10 +2077,12 @@ array_average( array ) { assert( array.size > 0 ); total = 0; + for ( i = 0; i < array.size; i++ ) { total += array[i]; } + return ( total / array.size ); } @@ -1960,15 +2094,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 ); } @@ -1982,43 +2120,47 @@ 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 ); } /* Returns the natural log of x using harmonic series. */ -Log(x) +Log( x ) { - /*if (!isDefined(level.log_cache)) + /* if (!isDefined(level.log_cache)) level.log_cache = []; - - key = x + ""; - - if (isDefined(level.log_cache[key])) + + key = x + ""; + + if (isDefined(level.log_cache[key])) return level.log_cache[key];*/ //thanks Bob__ at stackoverflow old_sum = 0.0; - xmlxpl = (x - 1) / (x + 1); + xmlxpl = ( x - 1 ) / ( x + 1 ); xmlxpl_2 = xmlxpl * xmlxpl; denom = 1.0; frac = xmlxpl; @@ -2031,9 +2173,9 @@ Log(x) frac *= xmlxpl_2; sum += frac / denom; } - + answer = 2.0 * sum; - + //level.log_cache[key] = answer; return answer; }