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

335 lines
6.9 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: maps\mp\bots\_bot_koth.gsc
* Game: Call of Duty: Black Ops 2
* Platform: PC
* Function Count: 11
* Decompile Time: 6 ms
* Timestamp: 10/28/2023 12:10:27 AM
*******************************************************************/
#include common_scripts/utility;
#include maps/mp/_utility;
#include maps/mp/bots/_bot;
#include maps/mp/bots/_bot_combat;
#include maps/mp/gametypes/koth;
//Function Number: 1
bot_koth_think()
{
if(!(IsDefined(level.zone.trig.goal_radius)))
{
maxs = level.zone.trig getmaxs();
maxs = level.zone.trig.origin + maxs;
level.zone.trig.goal_radius = distance(level.zone.trig.origin,maxs);
/#
println("distance: " + level.zone.trig.goal_radius);
#/
ground = bullettrace(level.zone.gameobject.curorigin,1024 - VectorScale((0,0,1)),level.zone.gameobject.curorigin,0);
level.zone.trig.goal = 8 + VectorScale((0,0,1));
}
if(!(bot_has_hill_goal()))
{
self bot_move_to_hill();
}
if(self bot_is_at_hill())
{
self bot_capture_hill();
}
bot_hill_tactical_insertion();
bot_hill_grenade();
}
//Function Number: 2
bot_has_hill_goal()
{
origin = self getgoal("koth_hill");
if(IsDefined(origin))
{
if(distance2dsquared(level.zone.gameobject.curorigin,origin) < level.zone.trig.goal_radius * level.zone.trig.goal_radius)
{
return 1;
}
}
}
//Function Number: 3
bot_is_at_hill()
{
return self atgoal("koth_hill");
}
//Function Number: 4
bot_move_to_hill()
{
if(GetTime() < self.bot.update_objective + 4000)
{
return;
}
self clearlookat();
self cancelgoal("koth_hill");
if(self getstance() == "prone")
{
self setstance("crouch");
wait(0.25);
}
if(self getstance() == "crouch")
{
self setstance("stand");
wait(0.25);
}
nodes = getnodesinradiussorted(level.zone.trig.goal,level.zone.trig.goal_radius,0,128);
foreach(node in nodes)
{
if(self maps/mp/bots/_bot::bot_friend_goal_in_radius("koth_hill",node.origin,64) == 0)
{
if(findpath(self.origin,node.origin,self,0,1))
{
self addgoal(node,24,3,"koth_hill");
self.bot.update_objective = GetTime();
return;
}
}
}
}
//Function Number: 5
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 = random(level.spawnpoints);
node = getvisiblenode(self.origin,spawn.origin);
if(IsDefined(node) && distancesquared(self.origin,node.origin) > 1024)
{
return node.origin;
}
return level.zone.gameobject.curorigin;
}
//Function Number: 6
bot_capture_hill()
{
self addgoal(self.origin,24,3,"koth_hill");
self setstance("crouch");
if(GetTime() > self.bot.update_lookat)
{
origin = self bot_get_look_at();
z = 20;
if(distancesquared(origin,self.origin) > 262144)
{
z = randomintrange(16,60);
}
self lookat(origin + (0,0,z));
if(distancesquared(origin,self.origin) > 65536)
{
dir = vectornormalize(self.origin - origin);
dir = VectorScale(dir);
origin = origin + dir;
}
self maps/mp/bots/_bot_combat::bot_combat_throw_proximity(origin);
if(cointoss() && lengthsquared(self getvelocity()) < 2)
{
nodes = getnodesinradius(level.zone.trig.goal,level.zone.trig.goal_radius + 128,0,128);
for(i = randomintrange(0,nodes.size);i < nodes.size;i++)
{
node = nodes[i];
if(distancesquared(node.origin,self.origin) > 1024)
{
if(self maps/mp/bots/_bot::bot_friend_goal_in_radius("koth_hill",node.origin,128) == 0)
{
if(findpath(self.origin,node.origin,self,0,1))
{
self addgoal(node,24,3,"koth_hill");
self.bot.update_objective = GetTime();
break;
}
}
}
}
}
self.bot.update_lookat = GetTime() + randomintrange(1500,3000);
}
}
//Function Number: 7
any_other_team_touching(skip_team)
{
foreach(team in level.teams)
{
if(team == skip_team)
{
}
else if(level.zone.gameobject.numtouching[team])
{
return 1;
}
}
return 0;
}
//Function Number: 8
is_hill_contested(skip_team)
{
if(any_other_team_touching(skip_team))
{
return 1;
}
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy(level.zone.gameobject.curorigin,1);
if(IsDefined(enemy) && distancesquared(enemy.origin,level.zone.gameobject.curorigin) < 262144)
{
return 1;
}
return 0;
}
//Function Number: 9
bot_hill_grenade()
{
enemies = bot_get_enemies();
if(!(enemies.size))
{
return;
}
if(self atgoal("hill_patrol") || self atgoal("koth_hill"))
{
if(self getweaponammostock("proximity_grenade_mp") > 0)
{
origin = bot_get_look_at();
if(self maps/mp/bots/_bot_combat::bot_combat_throw_proximity(origin))
{
return;
}
}
}
if(!(is_hill_contested(self.team)))
{
if(!(IsDefined(level.next_smoke_time)))
{
level.next_smoke_time = 0;
}
if(GetTime() > level.next_smoke_time)
{
if(self maps/mp/bots/_bot_combat::bot_combat_throw_smoke(level.zone.gameobject.curorigin))
{
level.next_smoke_time = GetTime() + randomintrange(60000,120000);
}
}
return;
}
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy(level.zone.gameobject.curorigin,0);
if(IsDefined(enemy))
{
origin = enemy.origin;
}
else
{
origin = level.zone.gameobject.curorigin;
}
dir = vectornormalize(self.origin - origin);
dir = (0,dir[1],0);
origin = 128 + VectorScale(dir);
if(maps/mp/bots/_bot::bot_get_difficulty() == "easy")
{
if(!(IsDefined(level.next_grenade_time)))
{
level.next_grenade_time = 0;
}
if(GetTime() > level.next_grenade_time)
{
if(!(self maps/mp/bots/_bot_combat::bot_combat_throw_lethal(origin)))
{
self maps/mp/bots/_bot_combat::bot_combat_throw_tactical(origin);
}
else
{
level.next_grenade_time = GetTime() + randomintrange(60000,120000);
}
}
}
else if(!(self maps/mp/bots/_bot_combat::bot_combat_throw_lethal(origin)))
{
self maps/mp/bots/_bot_combat::bot_combat_throw_tactical(origin);
}
}
//Function Number: 10
bot_hill_tactical_insertion()
{
if(!(self hasweapon("tactical_insertion_mp")))
{
return;
}
dist = self getlookaheaddist();
dir = self getlookaheaddir();
if(!IsDefined(dist) || !IsDefined(dir))
{
return;
}
node = hill_nearest_node();
mine = getnearestnode(self.origin);
if(IsDefined(mine) && !nodesvisible(mine,node))
{
origin = dist + VectorScale(dir);
next = getnearestnode(origin);
if(IsDefined(next) && nodesvisible(next,node))
{
bot_combat_tactical_insertion(self.origin);
}
}
}
//Function Number: 11
hill_nearest_node()
{
nodes = getnodesinradiussorted(level.zone.gameobject.curorigin,256,0);
/#
assert(nodes.size);
#/
return nodes[0];
}