IL-GSC/BO2/PC/MP/maps/mp/bots/_bot.gsc
2023-10-28 00:17:17 -04:00

2702 lines
50 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: maps\mp\bots\_bot.gsc
* Game: Call of Duty: Black Ops 2
* Platform: PC
* Function Count: 77
* Decompile Time: 39 ms
* Timestamp: 10/28/2023 12:10:25 AM
*******************************************************************/
#include common_scripts/utility;
#include maps/mp/_utility;
#include maps/mp/bots/_bot;
#include maps/mp/bots/_bot_combat;
#include maps/mp/bots/_bot_conf;
#include maps/mp/bots/_bot_ctf;
#include maps/mp/bots/_bot_dem;
#include maps/mp/bots/_bot_dom;
#include maps/mp/bots/_bot_hq;
#include maps/mp/bots/_bot_koth;
#include maps/mp/bots/_bot_loadout;
#include maps/mp/gametypes/_dev;
#include maps/mp/gametypes/_rank;
#include maps/mp/gametypes/_weapons;
#include maps/mp/killstreaks/_killstreakrules;
#include maps/mp/killstreaks/_killstreaks;
#include maps/mp/killstreaks/_radar;
#include maps/mp/teams/_teams;
//Function Number: 1
init()
{
/#
level thread bot_system_devgui_think();
#/
level thread maps/mp/bots/_bot_loadout::init();
if(!(bot_gametype_allowed()))
{
return;
}
if(level.rankedmatch && !is_bot_ranked_match())
{
return;
}
bot_friends = GetDvarInt(#"EB92E914");
bot_enemies = GetDvarInt(#"94FFF5AF");
if(bot_friends <= 0 && bot_enemies <= 0)
{
return;
}
bot_wait_for_host();
bot_set_difficulty();
if(is_bot_comp_stomp())
{
team = bot_choose_comp_stomp_team();
level thread bot_comp_stomp_think(team);
}
else if(is_bot_ranked_match())
{
level thread bot_ranked_think();
}
else
{
level thread bot_local_think();
}
}
//Function Number: 2
spawn_bot(team)
{
bot = addtestclient();
if(IsDefined(bot))
{
bot.pers["isBot"] = 1;
if(team != "autoassign")
{
bot.pers["team"] = team;
}
bot thread bot_spawn_think(team);
return 1;
}
}
//Function Number: 3
getenemyteamwithlowestplayercount(player_team)
{
counts = [];
foreach(team in level.teams)
{
counts[team] = 0;
}
foreach(player in level.players)
{
if(!(IsDefined(player.team)))
{
}
else if(!(IsDefined(counts[player.team])))
{
}
else
{
counts[player.team]++;
}
}
count = 999999;
enemy_team = player_team;
foreach(team in level.teams)
{
if(team == player_team)
{
}
else if(team == "spectator")
{
}
else if(counts[team] < count)
{
enemy_team = team;
count = counts[team];
}
}
return enemy_team;
}
//Function Number: 4
getenemyteamwithgreatestbotcount(player_team)
{
counts = [];
foreach(team in level.teams)
{
counts[team] = 0;
}
foreach(player in level.players)
{
if(!(IsDefined(player.team)))
{
}
else if(!(IsDefined(counts[player.team])))
{
}
else if(!(player is_bot()))
{
}
else
{
counts[player.team]++;
}
}
count = -1;
enemy_team = undefined;
foreach(team in level.teams)
{
if(team == player_team)
{
}
else if(team == "spectator")
{
}
else if(counts[team] > count)
{
enemy_team = team;
count = counts[team];
}
}
return enemy_team;
}
//Function Number: 5
bot_wait_for_host()
{
for(host = gethostplayerforbots();!(IsDefined(host));host = gethostplayerforbots())
{
wait(0.25);
}
if(level.prematchperiod > 0 && level.inprematchperiod == 1)
{
wait(1);
}
}
//Function Number: 6
bot_count_humans(team)
{
players = get_players();
count = 0;
foreach(player in players)
{
if(player is_bot())
{
}
else if(IsDefined(team))
{
if(getassignedteam(player) == team)
{
count++;
}
}
else
{
count++;
}
}
return count;
}
//Function Number: 7
bot_count_bots(team)
{
players = get_players();
count = 0;
foreach(player in players)
{
if(!(player is_bot()))
{
}
else if(IsDefined(team))
{
if(IsDefined(player.team) && player.team == team)
{
count++;
}
}
else
{
count++;
}
}
return count;
}
//Function Number: 8
bot_count_enemy_bots(friend_team)
{
if(!(level.teambased))
{
return bot_count_bots();
}
enemies = 0;
foreach(team in level.teams)
{
if(team == friend_team)
{
}
else
{
enemies = enemies + bot_count_bots(team);
}
}
return enemies;
}
//Function Number: 9
bot_choose_comp_stomp_team()
{
host = gethostplayerforbots();
/#
assert(IsDefined(host));
#/
teamkeys = getarraykeys(level.teams);
/#
assert(teamkeys.size == 2);
#/
enemy_team = host.pers["team"];
/#
assert(IsDefined(enemy_team) && enemy_team != "spectator");
#/
return getotherteam(enemy_team);
}
//Function Number: 10
bot_comp_stomp_think(team)
{
for(;;)
{
for(;;)
{
humans = bot_count_humans();
bots = bot_count_bots();
if(humans == bots)
{
break;
}
if(bots < humans)
{
spawn_bot(team);
}
if(bots > humans)
{
bot_comp_stomp_remove(team);
}
wait(1);
}
wait(3);
}
}
//Function Number: 11
bot_comp_stomp_remove(team)
{
players = get_players();
bots = [];
remove = undefined;
foreach(player in players)
{
if(!(IsDefined(player.team)))
{
}
else if(player is_bot())
{
if(level.teambased)
{
if(player.team == team)
{
bots[bots.size] = player;
}
}
else
{
bots[bots.size] = player;
}
}
}
if(!(bots.size))
{
return;
}
foreach(bot in bots)
{
if(!(bot maps/mp/bots/_bot_combat::bot_has_enemy()))
{
remove = bot;
break;
}
}
if(!(IsDefined(remove)))
{
remove = random(bots);
}
remove botleavegame();
}
//Function Number: 12
bot_ranked_remove()
{
if(!(level.teambased))
{
bot_comp_stomp_remove();
return;
}
high = -1;
highest_team = undefined;
foreach(team in level.teams)
{
count = countplayers(team);
if(count > high)
{
high = count;
highest_team = team;
}
}
bot_comp_stomp_remove(highest_team);
}
//Function Number: 13
bot_ranked_count(team)
{
count = countplayers(team);
if(count < 6)
{
spawn_bot(team);
return 1;
}
else if(count > 6)
{
bot_comp_stomp_remove(team);
return 1;
}
}
//Function Number: 14
bot_ranked_think()
{
level endon("game_ended");
wait(5);
for(;;)
{
for(;;)
{
wait(1);
teams = [];
teams[0] = "axis";
teams[1] = "allies";
if(cointoss())
{
teams[0] = "allies";
teams[1] = "axis";
}
if(!bot_ranked_count(teams[0]) && !bot_ranked_count(teams[1]))
{
break;
}
}
level waittill_any("connected","disconnect");
wait(5);
while(IsDefined(level.hostmigrationtimer))
{
wait(1);
}
}
}
//Function Number: 15
bot_local_friends(expected_friends,max,host_team)
{
if(level.teambased)
{
players = get_players();
friends = bot_count_bots(host_team);
if(friends < expected_friends && players.size < max)
{
spawn_bot(host_team);
return 1;
}
if(friends > expected_friends)
{
bot_comp_stomp_remove(host_team);
return 1;
}
}
}
//Function Number: 16
bot_local_enemies(expected_enemies,max,host_team)
{
enemies = bot_count_enemy_bots(host_team);
players = get_players();
if(enemies < expected_enemies && players.size < max)
{
team = getenemyteamwithlowestplayercount(host_team);
spawn_bot(team);
return 1;
}
if(enemies > expected_enemies)
{
team = getenemyteamwithgreatestbotcount(host_team);
if(IsDefined(team))
{
bot_comp_stomp_remove(team);
}
return 1;
}
}
//Function Number: 17
bot_local_think()
{
wait(5);
host = gethostplayerforbots();
/#
assert(IsDefined(host));
#/
host_team = host.team;
if(!IsDefined(host_team) || host_team == "spectator")
{
host_team = "allies";
}
bot_expected_friends = GetDvarInt(#"EB92E914");
bot_expected_enemies = GetDvarInt(#"94FFF5AF");
if(islocalgame())
{
}
else
{
}
max_players = 18;
for(;;)
{
for(;;)
{
if(bot_local_friends(bot_expected_friends,max_players,host_team))
{
wait(0.5);
continue;
}
if(bot_local_enemies(bot_expected_enemies,max_players,host_team))
{
wait(0.5);
continue;
}
break;
}
wait(3);
}
}
//Function Number: 18
is_bot_ranked_match()
{
bot_enemies = GetDvarInt(#"94FFF5AF");
isdedicatedbotsoak = GetDvarInt(#"E76315E0");
return level.rankedmatch && bot_enemies && 0 == isdedicatedbotsoak;
}
//Function Number: 19
is_bot_comp_stomp()
{
return is_bot_ranked_match() && !GetDvarInt(#"950A8887");
}
//Function Number: 20
bot_spawn_think(team)
{
self endon("disconnect");
while(!(IsDefined(self.pers["bot_loadout"])))
{
wait(0.1);
}
while(!(IsDefined(self.team)))
{
wait(0.05);
}
if(level.teambased)
{
self notify("menuresponse",game["menu_team"],team);
wait(0.5);
}
self notify("joined_team");
bot_classes = bot_build_classes();
self notify("menuresponse","changeclass",random(bot_classes));
}
//Function Number: 21
bot_build_classes()
{
bot_classes = [];
if(!(self isitemlocked(maps/mp/gametypes/_rank::getitemindex("feature_cac"))))
{
bot_classes[bot_classes.size] = "custom0";
bot_classes[bot_classes.size] = "custom1";
bot_classes[bot_classes.size] = "custom2";
bot_classes[bot_classes.size] = "custom3";
bot_classes[bot_classes.size] = "custom4";
if(randomint(100) < 10)
{
bot_classes[bot_classes.size] = "class_smg";
bot_classes[bot_classes.size] = "class_cqb";
bot_classes[bot_classes.size] = "class_assault";
bot_classes[bot_classes.size] = "class_lmg";
bot_classes[bot_classes.size] = "class_sniper";
}
}
else
{
bot_classes[bot_classes.size] = "class_smg";
bot_classes[bot_classes.size] = "class_cqb";
bot_classes[bot_classes.size] = "class_assault";
bot_classes[bot_classes.size] = "class_lmg";
bot_classes[bot_classes.size] = "class_sniper";
}
return bot_classes;
}
//Function Number: 22
bot_choose_class()
{
bot_classes = bot_build_classes();
if((self maps/mp/bots/_bot_combat::threat_requires_rocket(self.bot.attacker) || self maps/mp/bots/_bot_combat::threat_is_qrdrone(self.bot.attacker)) && !maps/mp/bots/_bot_combat::threat_is_warthog(self.bot.attacker))
{
if(randomint(100) < 75)
{
bot_classes[bot_classes.size] = "class_smg";
bot_classes[bot_classes.size] = "class_cqb";
bot_classes[bot_classes.size] = "class_assault";
bot_classes[bot_classes.size] = "class_lmg";
bot_classes[bot_classes.size] = "class_sniper";
}
for(i = 0;i < bot_classes.size;i++)
{
sidearm = self getloadoutweapon(i,"secondary");
if(sidearm == "fhj18_mp")
{
self notify("menuresponse","changeclass",bot_classes[i]);
return;
}
else if(sidearm == "smaw_mp")
{
bot_classes[bot_classes.size] = bot_classes[i];
bot_classes[bot_classes.size] = bot_classes[i];
bot_classes[bot_classes.size] = bot_classes[i];
}
}
}
if(maps/mp/bots/_bot_combat::threat_requires_rocket(self.bot.attacker) || maps/mp/bots/_bot_combat::threat_is_warthog(self.bot.attacker))
{
for(i = 0;i < bot_classes.size;i++)
{
perks = self getloadoutperks(i);
foreach(perk in perks)
{
if(perk == "specialty_nottargetedbyairsupport")
{
bot_classes[bot_classes.size] = bot_classes[i];
bot_classes[bot_classes.size] = bot_classes[i];
bot_classes[bot_classes.size] = bot_classes[i];
}
}
}
}
self notify("menuresponse","changeclass",random(bot_classes),_k642);
}
//Function Number: 23
bot_spawn()
{
self endon("disconnect");
/#
weapon = undefined;
if(GetDvarInt(#"98F33417") != 0)
{
player = gethostplayer();
weapon = player getcurrentweapon();
}
if(GetDvar(#"605D81B6") != "")
{
weapon = GetDvar(#"605D81B6");
}
if(IsDefined(weapon))
{
self maps/mp/gametypes/_weapons::detach_all_weapons();
self takeallweapons();
self giveweapon(weapon);
self switchtoweapon(weapon);
self setspawnweapon(weapon);
self maps/mp/teams/_teams::set_player_model(self.team,weapon);
}
#/
self bot_spawn_init();
if(IsDefined(self.bot_first_spawn))
{
self bot_choose_class();
}
self.bot_first_spawn = 1;
self thread bot_main();
/#
self thread bot_devgui_think();
#/
}
//Function Number: 24
bot_spawn_init()
{
time = GetTime();
if(!(IsDefined(self.bot)))
{
self.bot = spawnstruct();
self.bot.threat = spawnstruct();
}
self.bot.glass_origin = undefined;
self.bot.ignore_entity = [];
self.bot.previous_origin = self.origin;
self.bot.time_ads = 0;
self.bot.update_c4 = time + randomintrange(1000,3000);
self.bot.update_crate = time + randomintrange(1000,3000);
self.bot.update_crouch = time + randomintrange(1000,3000);
self.bot.update_failsafe = time + randomintrange(1000,3000);
self.bot.update_idle_lookat = time + randomintrange(1000,3000);
self.bot.update_killstreak = time + randomintrange(1000,3000);
self.bot.update_lookat = time + randomintrange(1000,3000);
self.bot.update_objective = time + randomintrange(1000,3000);
self.bot.update_objective_patrol = time + randomintrange(1000,3000);
self.bot.update_patrol = time + randomintrange(1000,3000);
self.bot.update_toss = time + randomintrange(1000,3000);
self.bot.update_launcher = time + randomintrange(1000,3000);
self.bot.update_weapon = time + randomintrange(1000,3000);
difficulty = bot_get_difficulty();
switch(difficulty)
{
case "easy":
self.bot.think_interval = 0.5;
self.bot.fov = 0.4226;
break;
case "normal":
self.bot.think_interval = 0.25;
self.bot.fov = 0.0872;
break;
case "hard":
self.bot.think_interval = 0.2;
self.bot.fov = -0.1736;
break;
case "fu":
self.bot.think_interval = 0.1;
self.bot.fov = -0.9396;
break;
default:
self.bot.think_interval = 0.25;
self.bot.fov = 0.0872;
break;
}
self.bot.threat.entity = undefined;
self.bot.threat.position = (0,0,0);
self.bot.threat.time_first_sight = 0;
self.bot.threat.time_recent_sight = 0;
self.bot.threat.time_aim_interval = 0;
self.bot.threat.time_aim_correct = 0;
self.bot.threat.update_riotshield = 0;
}
//Function Number: 25
bot_wakeup_think()
{
self endon("death");
self endon("disconnect");
level endon("game_ended");
for(;;)
{
wait(self.bot.think_interval);
self notify("wakeup");
}
}
//Function Number: 26
bot_damage_think()
{
self notify("bot_damage_think");
self endon("bot_damage_think");
self endon("disconnect");
level endon("game_ended");
for(;;)
{
self waittill("damage",damage,attacker,direction,point,mod,unused1,unused2,unused3,weapon,flags,inflictor);
if(attacker.classname == "worldspawn")
{
continue;
}
if(IsDefined(weapon))
{
if(weapon == "proximity_grenade_mp" || weapon == "proximity_grenade_aoe_mp")
{
continue;
}
else if(weapon == "claymore_mp")
{
continue;
}
else if(weapon == "satchel_charge_mp")
{
continue;
}
else if(weapon == "bouncingbetty_mp")
{
continue;
}
}
if(IsDefined(inflictor))
{
switch(inflictor.classname)
{
case "auto_turret":
case "script_vehicle":
attacker = inflictor;
break;
}
}
if(IsDefined(attacker.viewlockedentity))
{
attacker = attacker.viewlockedentity;
}
if(maps/mp/bots/_bot_combat::threat_requires_rocket(attacker) || maps/mp/bots/_bot_combat::threat_is_warthog(attacker))
{
level thread bot_killstreak_dangerous_think(self.origin,self.team,attacker);
}
self.bot.attacker = attacker;
self notify("wakeup",damage,attacker,direction);
}
}
//Function Number: 27
bot_killcam_think()
{
self notify("bot_killcam_think");
self endon("bot_killcam_think");
self endon("disconnect");
level endon("game_ended");
wait_time = 0.5;
if(level.playerrespawndelay)
{
wait_time = level.playerrespawndelay + 1.5;
}
if(!(level.killcam))
{
self waittill("death");
}
else
{
self waittill("begin_killcam");
}
wait(wait_time);
for(;;)
{
self pressusebutton(0.1);
wait(0.5);
}
}
//Function Number: 28
bot_glass_think()
{
self endon("death");
self endon("disconnect");
level endon("game_ended");
for(;;)
{
self waittill("glass",origin);
self.bot.glass_origin = origin;
self notify("wakeup");
}
}
//Function Number: 29
bot_main()
{
self endon("death");
self endon("disconnect");
level endon("game_ended");
if(level.inprematchperiod)
{
level waittill("prematch_over");
self.bot.update_failsafe = GetTime() + randomintrange(1000,3000);
}
self thread bot_wakeup_think();
self thread bot_damage_think();
self thread bot_killcam_think();
self thread bot_glass_think();
for(;;)
{
self waittill("wakeup",damage,attacker,direction);
if(self isremotecontrolling())
{
continue;
}
self maps/mp/bots/_bot_combat::bot_combat_think(damage,attacker,direction);
self bot_update_glass();
self bot_update_patrol();
self bot_update_lookat();
self bot_update_killstreak();
self bot_update_wander();
self bot_update_c4();
self bot_update_launcher();
self bot_update_weapon();
if(cointoss())
{
self bot_update_toss_flash();
self bot_update_toss_frag();
}
else
{
self bot_update_toss_frag();
self bot_update_toss_flash();
}
self [[ level.bot_gametype ]]();
}
}
//Function Number: 30
bot_failsafe_node_valid(nearest,node)
{
if(IsDefined(node.script_noteworthy))
{
return 0;
}
if(node.origin[2] - self.origin[2] > 18)
{
return 0;
}
if(nearest == node)
{
return 0;
}
if(!(nodesvisible(nearest,node)))
{
return 0;
}
if(self bot_friend_in_radius(node.origin,32))
{
return 0;
}
if(IsDefined(level.spawn_all) && level.spawn_all.size > 0)
{
spawns = arraysort(level.spawn_all,node.origin);
}
else if(IsDefined(level.spawnpoints) && level.spawnpoints.size > 0)
{
spawns = arraysort(level.spawnpoints,node.origin);
}
else if(IsDefined(level.spawn_start) && level.spawn_start.size > 0)
{
spawns = arraycombine(level.spawn_start["allies"],level.spawn_start["axis"],1,0);
spawns = arraysort(spawns,node.origin);
}
else
{
return 0;
}
goal = bot_nearest_node(spawns[0].origin);
if(IsDefined(goal) && findpath(node.origin,goal.origin,undefined,0,1))
{
return 1;
}
return 0;
}
//Function Number: 31
bot_get_mantle_start()
{
dist = self getlookaheaddist();
dir = self getlookaheaddir();
if(dist > 0 && IsDefined(dir))
{
forward = AnglesToForward(self.angles);
if(vectordot(dir,forward) < 0)
{
dir = VectorScale(dir);
origin = self.origin + dir;
nodes = getnodesinradius(origin,16,0,16,"Begin");
if(nodes.size && nodes[0].spawnflags & 8388608)
{
return nodes[0];
}
}
}
}
//Function Number: 32
bot_is_traversing()
{
if(!(self isonground()))
{
return !self ismantling() && !self isonladder();
}
}
//Function Number: 33
bot_update_failsafe()
{
time = GetTime();
if(time - self.spawntime < 7500)
{
return;
}
if(bot_is_traversing())
{
wait(0.25);
node = bot_get_mantle_start();
if(IsDefined(node))
{
end = getnode(node.target,"targetname");
self clearlookat();
self botsetfailsafenode(end);
self wait_endon(1,"goal");
self botsetfailsafenode();
return;
}
}
if(time < self.bot.update_failsafe)
{
return;
}
if(self ismantling() || self isonladder() || !self isonground())
{
wait(randomfloatrange(0.1,0.25));
return;
}
if(!self atgoal() && distance2dsquared(self.bot.previous_origin,self.origin) < 256)
{
nodes = getnodesinradius(self.origin,512,0);
nodes = array_randomize(nodes);
nearest = bot_nearest_node(self.origin);
failsafe = 0;
if(IsDefined(nearest))
{
foreach(node in nodes)
{
if(!(bot_failsafe_node_valid(nearest,node)))
{
}
else
{
self botsetfailsafenode(node);
wait(0.5);
self.bot.update_idle_lookat = 0;
self bot_update_lookat();
self cancelgoal("enemy_patrol");
self wait_endon(4,"goal");
self botsetfailsafenode();
self bot_update_lookat();
failsafe = 1;
break;
}
}
}
if(!failsafe && nodes.size)
{
node = random(nodes);
self botsetfailsafenode(node);
wait(0.5);
self.bot.update_idle_lookat = 0;
self bot_update_lookat();
self cancelgoal("enemy_patrol");
self wait_endon(4,"goal");
self botsetfailsafenode();
self bot_update_lookat();
}
}
self.bot.update_failsafe = GetTime() + 3500;
self.bot.previous_origin = self.origin;
}
//Function Number: 34
bot_update_crouch()
{
time = GetTime();
if(time < self.bot.update_crouch)
{
return;
}
if(self atgoal())
{
return;
}
if(self ismantling() || self isonladder() || !self isonground())
{
return;
}
dist = self getlookaheaddist();
if(dist > 0)
{
dir = self getlookaheaddir();
/#
assert(IsDefined(dir));
#/
dir = VectorScale(dir);
start = 70 + VectorScale((0,0,1));
end = start + dir;
if(dist >= 256)
{
self.bot.update_crouch = time + 1500;
}
if(self getstance() == "stand")
{
trace = worldtrace(start,end);
if(trace["fraction"] < 1)
{
self setstance("crouch");
self.bot.update_crouch = time + 2500;
}
}
else if(self getstance() == "crouch")
{
trace = worldtrace(start,end);
if(trace["fraction"] >= 1)
{
self setstance("stand");
}
}
}
}
//Function Number: 35
bot_update_glass()
{
if(IsDefined(self.bot.glass_origin))
{
forward = AnglesToForward(self.angles);
dir = vectornormalize(self.bot.glass_origin - self.origin);
dot = vectordot(forward,dir);
if(dot > 0)
{
self lookat(self.bot.glass_origin);
wait_time = 0.5 * 1 - dot;
wait_time = clamp(wait_time,0.05,0.5);
wait(wait_time);
self pressmelee();
wait(0.25);
self clearlookat();
self.bot.glass_origin = undefined;
}
}
}
//Function Number: 36
bot_has_radar()
{
if(level.teambased)
{
return maps/mp/killstreaks/_radar::teamhasspyplane(self.team) || maps/mp/killstreaks/_radar::teamhassatellite(self.team);
}
return (IsDefined(self.hasspyplane) && self.hasspyplane) || IsDefined(self.hassatellite) && self.hassatellite;
}
//Function Number: 37
bot_get_enemies(on_radar)
{
if(!(IsDefined(on_radar)))
{
on_radar = 0;
}
enemies = self getenemies(1);
/#
for(i = 0;i < enemies.size;i++)
{
if(enemies[i] isinmovemode("ufo","noclip"))
{
arrayremoveindex(enemies,i);
i--;
}
}
#/
if(on_radar && !self bot_has_radar())
{
for(i = 0;i < enemies.size;i++)
{
if(!(IsDefined(enemies[i].lastfiretime)))
{
arrayremoveindex(enemies,i);
i--;
}
else if(GetTime() - enemies[i].lastfiretime > 2000)
{
arrayremoveindex(enemies,i);
i--;
}
}
}
return enemies;
}
//Function Number: 38
bot_get_friends()
{
friends = self getfriendlies(1);
/#
for(i = 0;i < friends.size;i++)
{
if(friends[i] isinmovemode("ufo","noclip"))
{
arrayremoveindex(friends,i);
i--;
}
}
#/
return friends;
}
//Function Number: 39
bot_friend_goal_in_radius(goal_name,origin,radius)
{
count = 0;
friends = bot_get_friends();
foreach(friend in friends)
{
if(friend is_bot())
{
goal = friend getgoal(goal_name);
if(IsDefined(goal) && distancesquared(origin,goal) < radius * radius)
{
count++;
}
}
}
return count;
}
//Function Number: 40
bot_friend_in_radius(origin,radius)
{
friends = bot_get_friends();
foreach(friend in friends)
{
if(distancesquared(friend.origin,origin) < radius * radius)
{
return 1;
}
}
return 0;
}
//Function Number: 41
bot_get_closest_enemy(origin,on_radar)
{
enemies = self bot_get_enemies(on_radar);
enemies = arraysort(enemies,origin);
if(enemies.size)
{
return enemies[0];
}
return undefined;
}
//Function Number: 42
bot_update_wander()
{
goal = self getgoal("wander");
if(IsDefined(goal))
{
if(distancesquared(goal,self.origin) > 65536)
{
return;
}
}
if(IsDefined(level.spawn_all) && level.spawn_all.size > 0)
{
spawns = arraysort(level.spawn_all,self.origin);
}
else if(IsDefined(level.spawnpoints) && level.spawnpoints.size > 0)
{
spawns = arraysort(level.spawnpoints,self.origin);
}
else if(IsDefined(level.spawn_start) && level.spawn_start.size > 0)
{
spawns = arraycombine(level.spawn_start["allies"],level.spawn_start["axis"],1,0);
spawns = arraysort(spawns,self.origin);
}
else
{
return;
}
far = int(spawns.size / 2);
far = randomintrange(far,spawns.size);
goal = bot_nearest_node(spawns[far].origin);
if(!(IsDefined(goal)))
{
return;
}
self addgoal(goal,24,1,"wander");
}
//Function Number: 43
bot_get_look_at()
{
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy(self.origin,1);
if(IsDefined(enemy))
{
node = getvisiblenode(self.origin,enemy.origin);
if(IsDefined(node) && distancesquared(self.origin,node.origin) > 1024)
{
return node.origin;
}
}
enemies = self maps/mp/bots/_bot::bot_get_enemies(0);
if(enemies.size)
{
enemy = random(enemies);
}
if(IsDefined(enemy))
{
node = getvisiblenode(self.origin,enemy.origin);
if(IsDefined(node) && distancesquared(self.origin,node.origin) > 1024)
{
return node.origin;
}
}
spawn = self getgoal("wander");
if(IsDefined(spawn))
{
node = getvisiblenode(self.origin,spawn);
}
if(IsDefined(node) && distancesquared(self.origin,node.origin) > 1024)
{
return node.origin;
}
return undefined;
}
//Function Number: 44
bot_update_lookat()
{
path = IsDefined(self getlookaheaddir());
if(!path && GetTime() > self.bot.update_idle_lookat)
{
origin = bot_get_look_at();
if(!(IsDefined(origin)))
{
return;
}
self lookat(16 + VectorScale((0,0,1)));
self.bot.update_idle_lookat = GetTime() + randomintrange(1500,3000);
}
else if(path && self.bot.update_idle_lookat > 0)
{
self clearlookat();
self.bot.update_idle_lookat = 0;
}
}
//Function Number: 45
bot_update_patrol()
{
closest = bot_get_closest_enemy(self.origin,1);
if(IsDefined(closest) && distancesquared(self.origin,closest.origin) < 262144)
{
goal = self getgoal("enemy_patrol");
if(IsDefined(goal) && distancesquared(goal,closest.origin) > 16384)
{
self cancelgoal("enemy_patrol");
self.bot.update_patrol = 0;
}
}
if(GetTime() < self.bot.update_patrol)
{
return;
}
self maps/mp/bots/_bot_combat::bot_patrol_near_enemy();
self.bot.update_patrol = GetTime() + randomintrange(5000,10000);
}
//Function Number: 46
bot_update_toss_flash()
{
if(bot_get_difficulty() == "easy")
{
return;
}
time = GetTime();
if(time - self.spawntime < 7500)
{
return;
}
if(time < self.bot.update_toss)
{
return;
}
self.bot.update_toss = time + 1500;
if(self getweaponammostock("sensor_grenade_mp") <= 0 && self getweaponammostock("proximity_grenade_mp") <= 0 && self getweaponammostock("trophy_system_mp") <= 0)
{
return;
}
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy(self.origin,1);
node = undefined;
if(IsDefined(enemy))
{
node = getvisiblenode(self.origin,enemy.origin);
}
if(IsDefined(node) && distancesquared(self.origin,node.origin) < 65536)
{
self lookat(node.origin);
wait(0.75);
self pressattackbutton(2);
self.bot.update_toss = time + 20000;
self clearlookat();
}
}
//Function Number: 47
bot_update_toss_frag()
{
if(bot_get_difficulty() == "easy")
{
return;
}
time = GetTime();
if(time - self.spawntime < 7500)
{
return;
}
if(time < self.bot.update_toss)
{
return;
}
self.bot.update_toss = time + 1500;
if(self getweaponammostock("bouncingbetty_mp") <= 0 && self getweaponammostock("claymore_mp") <= 0 && self getweaponammostock("satchel_charge_mp") <= 0)
{
return;
}
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy(self.origin,1);
node = undefined;
if(IsDefined(enemy))
{
node = getvisiblenode(self.origin,enemy.origin);
}
if(IsDefined(node) && distancesquared(self.origin,node.origin) < 65536)
{
self lookat(node.origin);
wait(0.75);
self pressattackbutton(1);
self.bot.update_toss = time + 20000;
self clearlookat();
}
}
//Function Number: 48
bot_set_rank()
{
players = get_players();
ranks = [];
bot_ranks = [];
human_ranks = [];
for(i = 0;i < players.size;i++)
{
if(players[i] == self)
{
}
else if(IsDefined(players[i].pers["rank"]))
{
if(players[i] is_bot())
{
bot_ranks[bot_ranks.size] = players[i].pers["rank"];
}
else
{
human_ranks[human_ranks.size] = players[i].pers["rank"];
}
}
}
if(!(human_ranks.size))
{
human_ranks[human_ranks.size] = 10;
}
human_avg = array_average(human_ranks);
while(bot_ranks.size + human_ranks.size < 5)
{
r = human_avg + randomintrange(-5,5);
rank = clamp(r,0,level.maxrank);
human_ranks[human_ranks.size] = rank;
}
ranks = arraycombine(human_ranks,bot_ranks,1,0);
avg = array_average(ranks);
s = array_std_deviation(ranks,avg);
rank = int(random_normal_distribution(avg,s,0,level.maxrank));
self.pers["rank"] = rank;
self.pers["rankxp"] = maps/mp/gametypes/_rank::getrankinfominxp(rank);
self setrank(rank);
self maps/mp/gametypes/_rank::syncxpstat();
}
//Function Number: 49
bot_gametype_allowed()
{
level.bot_gametype = ::gametype_void;
switch(level.gametype)
{
case "dm":
case "tdm":
return 1;
case "ctf":
level.bot_gametype = maps/mp/bots/_bot_ctf::bot_ctf_think;
return 1;
case "dem":
level.bot_gametype = maps/mp/bots/_bot_dem::bot_dem_think;
return 1;
case "dom":
level.bot_gametype = maps/mp/bots/_bot_dom::bot_dom_think;
return 1;
case "koth":
level.bot_gametype = maps/mp/bots/_bot_koth::bot_koth_think;
return 1;
case "hq":
level.bot_gametype = maps/mp/bots/_bot_hq::bot_hq_think;
return 1;
case "conf":
level.bot_gametype = maps/mp/bots/_bot_conf::bot_conf_think;
return 1;
}
return 0;
}
//Function Number: 50
bot_get_difficulty()
{
if(!(IsDefined(level.bot_difficulty)))
{
level.bot_difficulty = "normal";
difficulty = getdvarintdefault("bot_difficulty",1);
if(difficulty == 0)
{
level.bot_difficulty = "easy";
}
else if(difficulty == 1)
{
level.bot_difficulty = "normal";
}
else if(difficulty == 2)
{
level.bot_difficulty = "hard";
}
else if(difficulty == 3)
{
level.bot_difficulty = "fu";
}
}
return level.bot_difficulty;
}
//Function Number: 51
bot_set_difficulty()
{
difficulty = bot_get_difficulty();
if(difficulty == "fu")
{
setdvar("bot_MinDeathTime","250");
setdvar("bot_MaxDeathTime","500");
setdvar("bot_MinFireTime","100");
setdvar("bot_MaxFireTime","250");
setdvar("bot_PitchUp","-5");
setdvar("bot_PitchDown","10");
setdvar("bot_Fov","160");
setdvar("bot_MinAdsTime","3000");
setdvar("bot_MaxAdsTime","5000");
setdvar("bot_MinCrouchTime","100");
setdvar("bot_MaxCrouchTime","400");
setdvar("bot_TargetLeadBias","2");
setdvar("bot_MinReactionTime","40");
setdvar("bot_MaxReactionTime","70");
setdvar("bot_StrafeChance","1");
setdvar("bot_MinStrafeTime","3000");
setdvar("bot_MaxStrafeTime","6000");
setdvar("scr_help_dist","512");
setdvar("bot_AllowGrenades","1");
setdvar("bot_MinGrenadeTime","1500");
setdvar("bot_MaxGrenadeTime","4000");
setdvar("bot_MeleeDist","70");
setdvar("bot_YawSpeed","2");
}
else if(difficulty == "hard")
{
setdvar("bot_MinDeathTime","250");
setdvar("bot_MaxDeathTime","500");
setdvar("bot_MinFireTime","400");
setdvar("bot_MaxFireTime","600");
setdvar("bot_PitchUp","-5");
setdvar("bot_PitchDown","10");
setdvar("bot_Fov","100");
setdvar("bot_MinAdsTime","3000");
setdvar("bot_MaxAdsTime","5000");
setdvar("bot_MinCrouchTime","100");
setdvar("bot_MaxCrouchTime","400");
setdvar("bot_TargetLeadBias","2");
setdvar("bot_MinReactionTime","400");
setdvar("bot_MaxReactionTime","700");
setdvar("bot_StrafeChance","0.9");
setdvar("bot_MinStrafeTime","3000");
setdvar("bot_MaxStrafeTime","6000");
setdvar("scr_help_dist","384");
setdvar("bot_AllowGrenades","1");
setdvar("bot_MinGrenadeTime","1500");
setdvar("bot_MaxGrenadeTime","4000");
setdvar("bot_MeleeDist","70");
setdvar("bot_YawSpeed","1.4");
}
else if(difficulty == "easy")
{
setdvar("bot_MinDeathTime","1000");
setdvar("bot_MaxDeathTime","2000");
setdvar("bot_MinFireTime","900");
setdvar("bot_MaxFireTime","1000");
setdvar("bot_PitchUp","-20");
setdvar("bot_PitchDown","40");
setdvar("bot_Fov","50");
setdvar("bot_MinAdsTime","3000");
setdvar("bot_MaxAdsTime","5000");
setdvar("bot_MinCrouchTime","4000");
setdvar("bot_MaxCrouchTime","6000");
setdvar("bot_TargetLeadBias","8");
setdvar("bot_MinReactionTime","1200");
setdvar("bot_MaxReactionTime","1600");
setdvar("bot_StrafeChance","0.1");
setdvar("bot_MinStrafeTime","3000");
setdvar("bot_MaxStrafeTime","6000");
setdvar("scr_help_dist","256");
setdvar("bot_AllowGrenades","0");
setdvar("bot_MeleeDist","40");
}
else
{
setdvar("bot_MinDeathTime","500");
setdvar("bot_MaxDeathTime","1000");
setdvar("bot_MinFireTime","600");
setdvar("bot_MaxFireTime","800");
setdvar("bot_PitchUp","-10");
setdvar("bot_PitchDown","20");
setdvar("bot_Fov","70");
setdvar("bot_MinAdsTime","3000");
setdvar("bot_MaxAdsTime","5000");
setdvar("bot_MinCrouchTime","2000");
setdvar("bot_MaxCrouchTime","4000");
setdvar("bot_TargetLeadBias","4");
setdvar("bot_MinReactionTime","600");
setdvar("bot_MaxReactionTime","800");
setdvar("bot_StrafeChance","0.6");
setdvar("bot_MinStrafeTime","3000");
setdvar("bot_MaxStrafeTime","6000");
setdvar("scr_help_dist","256");
setdvar("bot_AllowGrenades","1");
setdvar("bot_MinGrenadeTime","1500");
setdvar("bot_MaxGrenadeTime","4000");
setdvar("bot_MeleeDist","70");
setdvar("bot_YawSpeed","1.2");
}
if(level.gametype == "oic" && difficulty == "fu")
{
setdvar("bot_MinReactionTime","400");
setdvar("bot_MaxReactionTime","500");
setdvar("bot_MinAdsTime","1000");
setdvar("bot_MaxAdsTime","2000");
}
if(level.gametype == "oic" && difficulty == "hard" || difficulty == "fu")
{
setdvar("bot_SprintDistance","256");
}
}
//Function Number: 52
bot_update_c4()
{
if(!(IsDefined(self.weaponobjectwatcherarray)))
{
return;
}
time = GetTime();
if(time < self.bot.update_c4)
{
return;
}
self.bot.update_c4 = time + randomintrange(1000,2000);
radius = getweaponexplosionradius("satchel_charge_mp");
foreach(watcher in self.weaponobjectwatcherarray)
{
if(watcher.name == "satchel_charge")
{
break;
}
}
if(watcher.objectarray.size)
{
foreach(weapon in watcher.objectarray)
{
if(!(IsDefined(weapon)))
{
}
else
{
enemy = bot_get_closest_enemy(weapon.origin,0);
if(!(IsDefined(enemy)))
{
return;
}
if(distancesquared(enemy.origin,weapon.origin) < radius * radius)
{
self pressattackbutton(1);
return;
}
}
}
}
}
//Function Number: 53
bot_update_launcher()
{
time = GetTime();
if(time < self.bot.update_launcher)
{
return;
}
self.bot.update_launcher = time + randomintrange(5000,10000);
if(!(self maps/mp/bots/_bot_combat::bot_has_launcher()))
{
return;
}
enemies = self getthreats(-1);
foreach(enemy in enemies)
{
if(!(target_istarget(enemy)))
{
}
else if(maps/mp/bots/_bot_combat::threat_is_warthog(enemy))
{
}
else if(!(maps/mp/bots/_bot_combat::threat_requires_rocket(enemy)))
{
}
else
{
origin = self getplayercamerapos();
angles = VectorToAngles(enemy.origin - origin);
if(angles[0] < 290)
{
}
else if(self botsighttracepassed(enemy))
{
self maps/mp/bots/_bot_combat::bot_lookat_entity(enemy);
return;
}
}
}
}
//Function Number: 54
bot_update_weapon()
{
time = GetTime();
if(time < self.bot.update_weapon)
{
return;
}
self.bot.update_weapon = time + randomintrange(5000,7500);
weapon = self getcurrentweapon();
ammo = self getweaponammoclip(weapon) + self getweaponammostock(weapon);
if(weapon == "none")
{
return;
}
if(self maps/mp/bots/_bot_combat::bot_can_reload())
{
frac = 0.5;
if(maps/mp/bots/_bot_combat::bot_has_lmg())
{
frac = 0.25;
}
frac = frac + randomfloatrange(-0.1,0.1);
if(maps/mp/bots/_bot_combat::bot_weapon_ammo_frac() < frac)
{
self pressusebutton(0.1);
return;
}
}
if(ammo && !self maps/mp/bots/_bot_combat::bot_has_pistol() && !self maps/mp/bots/_bot_combat::bot_using_launcher())
{
return;
}
primaries = self getweaponslistprimaries();
foreach(primary in primaries)
{
if(primary == "knife_held_mp")
{
}
else if(primary != weapon && self getweaponammoclip(primary) || self getweaponammostock(primary))
{
self switchtoweapon(primary);
return;
}
}
}
//Function Number: 55
bot_update_crate()
{
time = GetTime();
if(time < self.bot.update_crate)
{
return;
}
self.bot.update_crate = time + randomintrange(1000,3000);
self cancelgoal("care package");
radius = GetDvarFloat(#"EFD45FA6");
crates = getentarray("care_package","script_noteworthy");
foreach(crate in crates)
{
if(distancesquared(self.origin,crate.origin) < radius * radius)
{
if(IsDefined(crate.hacker))
{
if(crate.hacker == self)
{
}
else if(crate.hacker.team == self.team)
{
}
else
{
if(crate.owner == self)
{
time = level.crateownerusetime / 1000 + 0.5;
}
else
{
time = level.cratenonownerusetime / 1000 + 0.5;
}
self setstance("crouch");
self addgoal(self.origin,24,4,"care package");
self pressusebutton(time);
wait(time);
self setstance("stand");
self cancelgoal("care package");
self.bot.update_crate = GetTime() + randomintrange(1000,3000);
return;
}
}
}
}
if(self getweaponammostock("pda_hack_mp"))
{
foreach(crate in crates)
{
if(!(IsDefined(crate.friendlyobjid)))
{
}
else if(IsDefined(crate.hacker))
{
if(crate.hacker == self)
{
}
else if(crate.hacker.team == self.team)
{
}
else if(self botsighttracepassed(crate))
{
self lookat(crate.origin);
self addgoal(self.origin,24,4,"care package");
wait(0.75);
start = GetTime();
if(!(IsDefined(crate.owner)))
{
self cancelgoal("care package");
return;
}
if(crate.owner == self)
{
end = level.crateownerusetime + 1000;
}
else
{
end = level.cratenonownerusetime + 1000;
}
while(GetTime() < start + end)
{
self pressattackbutton(2);
wait(0.05);
}
self.bot.update_crate = GetTime() + randomintrange(1000,3000);
self cancelgoal("care package");
return;
}
}
}
}
}
//Function Number: 56
bot_update_killstreak()
{
if(!(level.loadoutkillstreaksenabled))
{
return;
}
time = GetTime();
if(time < self.bot.update_killstreak)
{
return;
}
if(self isweaponviewonlylinked())
{
return;
}
/#
if(!(GetDvarInt(#"1D5FB2EC")))
{
return;
}
#/
self.bot.update_killstreak = time + randomintrange(1000,3000);
weapons = self getweaponslist();
ks_weapon = undefined;
inventoryweapon = self getinventoryweapon();
foreach(weapon in weapons)
{
if(self getweaponammoclip(weapon) <= 0 && !IsDefined(inventoryweapon) || weapon != inventoryweapon)
{
}
else if(iskillstreakweapon(weapon))
{
killstreak = maps/mp/killstreaks/_killstreaks::getkillstreakforweapon(weapon);
if(self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed(killstreak,self.team))
{
ks_weapon = weapon;
break;
}
}
}
if(!(IsDefined(ks_weapon)))
{
return;
}
killstreak = maps/mp/killstreaks/_killstreaks::getkillstreakforweapon(ks_weapon);
killstreak_ref = maps/mp/killstreaks/_killstreaks::getkillstreakmenuname(killstreak);
if(!(IsDefined(killstreak_ref)))
{
return;
}
switch(killstreak_ref)
{
case "killstreak_helicopter_comlink":
bot_killstreak_location(1,weapon);
break;
case "killstreak_planemortar":
bot_killstreak_location(3,weapon);
break;
case "killstreak_ai_tank_drop":
case "killstreak_missile_drone":
case "killstreak_supply_drop":
self bot_use_supply_drop(weapon);
break;
case "killstreak_auto_turret":
case "killstreak_microwave_turret":
case "killstreak_tow_turret":
self bot_turret_location(weapon);
break;
case "killstreak_helicopter_player_gunner":
case "killstreak_qrdrone":
case "killstreak_rcbomb":
case "killstreak_remote_mortar":
break;
case "killstreak_remote_missile":
self switchtoweapon(weapon);
self waittill(time - self.spawntime < 6000,"weapon_change_complete");
wait(1.5);
self pressattackbutton();
break;
default:
self switchtoweapon(weapon);
break;
}
}
//Function Number: 57
bot_get_vehicle_entity()
{
if(self isremotecontrolling())
{
if(IsDefined(self.rcbomb))
{
return self.rcbomb;
}
else if(IsDefined(self.qrdrone))
{
return self.qrdrone;
}
}
}
//Function Number: 58
bot_rccar_think()
{
self endon("disconnect");
self endon("rcbomb_done");
self endon("weapon_object_destroyed");
level endon("game_ended");
wait(2);
self thread bot_rccar_kill();
for(;;)
{
wait(0.5);
ent = self bot_get_vehicle_entity();
if(!(IsDefined(ent)))
{
return;
}
players = get_players();
for(i = 0;i < players.size;i++)
{
player = players[i];
if(player == self)
{
}
else if(!(isalive(player)))
{
}
else if(level.teambased && player.team == self.team)
{
}
else
{
/#
if(player isinmovemode("ufo","noclip"))
{
}
else
{
#/
if(bot_get_difficulty() == "easy")
{
if(distancesquared(ent.origin,player.origin) < 262144)
{
self pressattackbutton();
}
}
else if(distancesquared(ent.origin,player.origin) < 40000)
{
self pressattackbutton();
}
}
}
}
}
}
//Function Number: 59
bot_rccar_kill()
{
self endon("disconnect");
self endon("rcbomb_done");
self endon("weapon_object_destroyed");
level endon("game_ended");
og_origin = self.origin;
for(;;)
{
wait(1);
ent = bot_get_vehicle_entity();
if(!(IsDefined(ent)))
{
return;
}
if(distancesquared(og_origin,ent.origin) < 256)
{
wait(2);
if(!(IsDefined(ent)))
{
return;
}
if(distancesquared(og_origin,ent.origin) < 256)
{
self pressattackbutton();
}
}
og_origin = ent.origin;
}
}
//Function Number: 60
bot_turret_location(weapon)
{
enemy = bot_get_closest_enemy(self.origin);
if(!(IsDefined(enemy)))
{
return;
}
forward = AnglesToForward(self getplayerangles());
forward = vectornormalize(forward);
delta = enemy.origin - self.origin;
delta = vectornormalize(delta);
dot = vectordot(forward,delta);
if(dot < 0.707)
{
return;
}
node = getvisiblenode(self.origin,enemy.origin);
if(!(IsDefined(node)))
{
return;
}
if(distancesquared(self.origin,node.origin) < 262144)
{
return;
}
delta = node.origin - self.origin;
delta = vectornormalize(delta);
dot = vectordot(forward,delta);
if(dot < 0.707)
{
return;
}
self thread weapon_switch_failsafe();
self switchtoweapon(weapon);
self waittill("weapon_change_complete");
self freeze_player_controls(1);
wait(1);
self freeze_player_controls(0);
bot_use_item(weapon);
self switchtoweapon(self.lastnonkillstreakweapon);
}
//Function Number: 61
bot_use_supply_drop(weapon)
{
if(weapon == "inventory_supplydrop_mp" || weapon == "supplydrop_mp")
{
if(GetTime() - self.spawntime > 5000)
{
return;
}
}
yaw = (0,self.angles[1],0);
dir = AnglesToForward(yaw);
dir = vectornormalize(dir);
drop_point = 384 + VectorScale(dir);
end = 2048 + VectorScale((0,0,1));
if(!(sighttracepassed(drop_point,end,0,undefined)))
{
return;
}
if(!(sighttracepassed(self.origin,end,0,undefined)))
{
return;
}
end = 32 - VectorScale((0,0,1));
if(bullettracepassed(drop_point,end,0,undefined))
{
return;
}
self addgoal(self.origin,24,4,"killstreak");
if(weapon == "missile_drone_mp" || weapon == "inventory_missile_drone_mp")
{
self lookat(384 + VectorScale((0,0,1)));
}
else
{
self lookat(drop_point);
}
wait(0.5);
if(self getcurrentweapon() != weapon)
{
self thread weapon_switch_failsafe();
self switchtoweapon(weapon);
self waittill(self.origin,drop_point,drop_point,drop_point,"weapon_change_complete");
}
bot_use_item(weapon);
self switchtoweapon(self.lastnonkillstreakweapon);
self clearlookat();
self cancelgoal("killstreak");
}
//Function Number: 62
bot_use_item(weapon)
{
self pressattackbutton();
wait(0.5);
for(i = 0;i < 10;i++)
{
if(self getcurrentweapon() == weapon || self getcurrentweapon() == "none")
{
self pressattackbutton();
}
else
{
return;
}
wait(0.5);
}
}
//Function Number: 63
bot_killstreak_location(num,weapon)
{
enemies = bot_get_enemies();
if(!(enemies.size))
{
return;
}
if(!(self switchtoweapon(weapon)))
{
return;
}
self waittill("weapon_change");
self freeze_player_controls(1);
wait_time = 1;
while(!IsDefined(self.selectinglocation) || self.selectinglocation == 0)
{
wait(0.05);
wait_time = wait_time - 0.05;
if(wait_time <= 0)
{
self freeze_player_controls(0);
self switchtoweapon(self.lastnonkillstreakweapon);
return;
}
}
wait(2);
for(i = 0;i < num;i++)
{
enemies = bot_get_enemies();
if(enemies.size)
{
enemy = random(enemies);
self notify("confirm_location",enemy.origin,0);
}
wait(0.25);
}
self freeze_player_controls(0);
}
//Function Number: 64
bot_killstreak_dangerous_think(origin,team,attacker)
{
if(!(level.teambased))
{
return;
}
nodes = getnodesinradius(384 + VectorScale((0,0,1)),origin,384);
foreach(node in nodes)
{
if(node isdangerous(team))
{
return;
}
}
foreach(node in nodes)
{
node setdangerous(team,1);
}
attacker wait_endon(25,"death");
foreach(node in nodes)
{
node setdangerous(team,0);
}
}
//Function Number: 65
weapon_switch_failsafe()
{
self endon("death");
self endon("disconnect");
self endon("weapon_change_complete");
wait(10);
self notify("weapon_change_complete");
}
//Function Number: 66
bot_dive_to_prone(exit_stance)
{
self pressdtpbutton();
event = self waittill_any_timeout(0.25,"dtp_start");
if(event == "dtp_start")
{
self waittill("dtp_end");
self setstance("prone");
wait(0.35);
self setstance(exit_stance);
}
}
//Function Number: 67
gametype_void()
{
}
//Function Number: 68
bot_debug_star(origin,seconds,color)
{
/#
if(!(IsDefined(seconds)))
{
seconds = 1;
}
if(!(IsDefined(color)))
{
color = (1,0,0);
}
frames = int(20 * seconds);
debugstar(origin,frames,color);
#/
}
//Function Number: 69
bot_debug_circle(origin,radius,seconds,color)
{
/#
if(!(IsDefined(seconds)))
{
seconds = 1;
}
if(!(IsDefined(color)))
{
color = (1,0,0);
}
frames = int(20 * seconds);
circle(origin,radius,color,0,1,frames);
#/
}
//Function Number: 70
bot_debug_box(origin,mins,maxs,yaw,seconds,color)
{
/#
if(!(IsDefined(yaw)))
{
yaw = 0;
}
if(!(IsDefined(seconds)))
{
seconds = 1;
}
if(!(IsDefined(color)))
{
color = (1,0,0);
}
frames = int(20 * seconds);
box(origin,mins,maxs,yaw,color,1,0,frames);
#/
}
//Function Number: 71
bot_devgui_think()
{
/#
self endon("death");
self endon("disconnect");
setdvar("devgui_bot","");
setdvar("scr_bot_follow","0");
for(;;)
{
wait(1);
reset = 1;
switch(GetDvar(#"B67B1D0D"))
{
case "crosshair":
iprintln("Bot following enabled");
self thread bot_crosshair_follow();
continue;
iprintln("Bot following disabled");
self notify("crosshair_follow_off",GetDvarInt(#"487CD523") != 0);
setdvar("bot_AllowMovement","0");
break;
case "laststand":
setdvar("scr_forcelaststand","1");
self setperk("specialty_pistoldeath");
self setperk("specialty_finalstand");
self dodamage(self.health,self.origin);
break;
case "":
default:
reset = 0;
break;
}
if(reset)
{
setdvar("devgui_bot","");
}
}
#/
}
//Function Number: 72
bot_system_devgui_think()
{
/#
setdvar("devgui_bot","");
setdvar("devgui_bot_weapon","");
for(;;)
{
wait(1);
reset = 1;
switch(GetDvar(#"B67B1D0D"))
{
case "spawn_friendly":
player = gethostplayer();
team = player.team;
devgui_bot_spawn(team);
break;
case "spawn_enemy":
player = gethostplayer();
team = getenemyteamwithlowestplayercount(player.team);
devgui_bot_spawn(team);
break;
case "loadout":
case "player_weapon":
players = get_players();
_a2692 = players;
_k2692 = FirstArrayKey(_a2692);
for(;;)
{
player = _a2692[_k2692];
host = gethostplayer();
weapon = host getcurrentweapon();
player maps/mp/gametypes/_weapons::detach_all_weapons();
player takeallweapons();
player giveweapon(weapon);
player switchtoweapon(weapon);
player setspawnweapon(weapon);
player maps/mp/teams/_teams::set_player_model(player.team,weapon);
_k2692 = NextArrayKey(_a2692);
}
break;
_k2692
player is_bot()
IsDefined(_k2692)
break;
case "routes":
devgui_debug_route();
break;
case "":
default:
reset = 0;
break;
}
if(reset)
{
setdvar("devgui_bot","");
}
}
#/
}
//Function Number: 73
bot_crosshair_follow()
{
/#
self notify("crosshair_follow_off");
self endon("death");
self endon("disconnect");
self endon("crosshair_follow_off");
for(;;)
{
wait(1);
setdvar("bot_AllowMovement","1");
setdvar("bot_IgnoreHumans","1");
setdvar("bot_ForceStand","1");
player = gethostplayerforbots();
direction = player getplayerangles();
direction_vec = AnglesToForward(direction);
eye = player geteye();
scale = 8000;
direction_vec = (direction_vec[0] * scale,direction_vec[1] * scale,direction_vec[2] * scale);
trace = bullettrace(eye,eye + direction_vec,0,undefined);
origin = trace["position"] + (0,0,0);
if(distancesquared(self.origin,origin) > 16384)
{
}
}
#/
}
//Function Number: 74
bot_debug_patrol(node1,node2)
{
/#
self endon("death");
self endon("debug_patrol");
for(;;)
{
self addgoal(node1,24,4,"debug_route");
self waittill("debug_route",result);
if(result == "failed")
{
self cancelgoal("debug_route");
wait(5);
}
self addgoal(node2,24,4,"debug_route");
self waittill("debug_route",result);
if(result == "failed")
{
self cancelgoal("debug_route");
wait(5);
}
}
#/
}
//Function Number: 75
devgui_debug_route()
{
/#
iprintln("Choose nodes with \'A\' or press \'B\' to cancel");
nodes = maps/mp/gametypes/_dev::dev_get_node_pair();
if(!(IsDefined(nodes)))
{
iprintln("Route Debug Cancelled");
return;
}
iprintln("Sending bots to chosen nodes");
players = get_players();
foreach(player in players)
{
if(!(player is_bot()))
{
}
else
{
player notify("debug_patrol");
player thread bot_debug_patrol(nodes[0],nodes[1]);
}
}
#/
}
//Function Number: 76
devgui_bot_spawn(team)
{
/#
player = gethostplayer();
direction = player getplayerangles();
direction_vec = AnglesToForward(direction);
eye = player geteye();
scale = 8000;
direction_vec = (direction_vec[0] * scale,direction_vec[1] * scale,direction_vec[2] * scale);
trace = bullettrace(eye,eye + direction_vec,0,undefined);
direction_vec = player.origin - trace["position"];
direction = VectorToAngles(direction_vec);
bot = addtestclient();
if(!(IsDefined(bot)))
{
println("Could not add test client");
return;
}
bot.pers["isBot"] = 1;
bot thread bot_spawn_think(team);
yaw = direction[1];
bot thread devgui_bot_spawn_think(trace["position"],yaw);
#/
}
//Function Number: 77
devgui_bot_spawn_think(origin,yaw)
{
/#
self endon("disconnect");
for(;;)
{
self waittill("spawned_player");
self setorigin(origin);
angles = (0,yaw,0);
self setplayerangles(angles);
}
#/
}