mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-07 17:17:50 -05:00
411 lines
7.9 KiB
Plaintext
411 lines
7.9 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: maps\mp\bots\_bot_hq.gsc
|
|
* Game: Call of Duty: Black Ops 2
|
|
* Platform: PC
|
|
* Function Count: 14
|
|
* Decompile Time: 2 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_hq_think()
|
|
{
|
|
time = GetTime();
|
|
if(time < self.bot.update_objective)
|
|
{
|
|
return;
|
|
}
|
|
|
|
self.bot.update_objective = time + randomintrange(500,1500);
|
|
if(bot_should_patrol_hq())
|
|
{
|
|
self bot_patrol_hq();
|
|
}
|
|
else if(!(bot_has_hq_goal()))
|
|
{
|
|
self bot_move_to_hq();
|
|
}
|
|
|
|
if(self bot_is_capturing_hq())
|
|
{
|
|
self bot_capture_hq();
|
|
}
|
|
|
|
bot_hq_tactical_insertion();
|
|
bot_hq_grenade();
|
|
if(!bot_is_capturing_hq() && !self atgoal("hq_patrol"))
|
|
{
|
|
mine = getnearestnode(self.origin);
|
|
node = hq_nearest_node();
|
|
if(IsDefined(mine) && nodesvisible(mine,node))
|
|
{
|
|
self lookat(30 + VectorScale((0,0,1)));
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 2
|
|
bot_has_hq_goal()
|
|
{
|
|
origin = self getgoal("hq_radio");
|
|
if(IsDefined(origin))
|
|
{
|
|
foreach(node in level.radio.nodes)
|
|
{
|
|
if(distancesquared(origin,node.origin) < 4096)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 3
|
|
bot_is_capturing_hq()
|
|
{
|
|
return self atgoal("hq_radio");
|
|
}
|
|
|
|
//Function Number: 4
|
|
bot_should_patrol_hq()
|
|
{
|
|
if(level.radio.gameobject.ownerteam == "neutral")
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(level.radio.gameobject.ownerteam != self.team)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(hq_is_contested())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 5
|
|
bot_patrol_hq()
|
|
{
|
|
self cancelgoal("hq_radio");
|
|
if(self atgoal("hq_patrol"))
|
|
{
|
|
node = getnearestnode(self.origin);
|
|
if(node.type == "Path")
|
|
{
|
|
self setstance("crouch");
|
|
}
|
|
else
|
|
{
|
|
self setstance("stand");
|
|
}
|
|
|
|
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);
|
|
self.bot.update_lookat = GetTime() + randomintrange(1500,3000);
|
|
}
|
|
|
|
goal = self getgoal("hq_patrol");
|
|
nearest = hq_nearest_node();
|
|
mine = getnearestnode(goal);
|
|
if(IsDefined(mine) && !nodesvisible(mine,nearest))
|
|
{
|
|
self clearlookat();
|
|
self cancelgoal("hq_patrol");
|
|
}
|
|
|
|
if(GetTime() > self.bot.update_objective_patrol)
|
|
{
|
|
self clearlookat();
|
|
self cancelgoal("hq_patrol");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
nearest = hq_nearest_node();
|
|
if(self hasgoal("hq_patrol"))
|
|
{
|
|
goal = self getgoal("hq_patrol");
|
|
if(distancesquared(self.origin,goal) < 65536)
|
|
{
|
|
origin = self bot_get_look_at();
|
|
self lookat(origin);
|
|
}
|
|
|
|
if(distancesquared(self.origin,goal) < 16384)
|
|
{
|
|
self.bot.update_objective_patrol = GetTime() + randomintrange(3000,6000);
|
|
}
|
|
|
|
mine = getnearestnode(goal);
|
|
if(IsDefined(mine) && !nodesvisible(mine,nearest))
|
|
{
|
|
self clearlookat();
|
|
self cancelgoal("hq_patrol");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
nodes = getvisiblenodes(nearest);
|
|
/#
|
|
assert(nodes.size);
|
|
#/
|
|
for(i = randomint(nodes.size);i < nodes.size;i++)
|
|
{
|
|
if(self maps/mp/bots/_bot::bot_friend_goal_in_radius("hq_radio",nodes[i].origin,128) == 0)
|
|
{
|
|
if(self maps/mp/bots/_bot::bot_friend_goal_in_radius("hq_patrol",nodes[i].origin,256) == 0)
|
|
{
|
|
self addgoal(nodes[i],24,3,"hq_patrol");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 6
|
|
bot_move_to_hq()
|
|
{
|
|
self clearlookat();
|
|
self cancelgoal("hq_radio");
|
|
self cancelgoal("hq_patrol");
|
|
if(self getstance() == "prone")
|
|
{
|
|
self setstance("crouch");
|
|
wait(0.25);
|
|
}
|
|
|
|
if(self getstance() == "crouch")
|
|
{
|
|
self setstance("stand");
|
|
wait(0.25);
|
|
}
|
|
|
|
nodes = array_randomize(level.radio.nodes);
|
|
foreach(node in nodes)
|
|
{
|
|
if(self maps/mp/bots/_bot::bot_friend_goal_in_radius("hq_radio",node.origin,64) == 0)
|
|
{
|
|
self addgoal(node,24,3,"hq_radio");
|
|
return;
|
|
}
|
|
}
|
|
|
|
self addgoal(random(nodes),24,3,"hq_radio");
|
|
}
|
|
|
|
//Function Number: 7
|
|
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) > 16384)
|
|
{
|
|
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) > 16384)
|
|
{
|
|
return node.origin;
|
|
}
|
|
}
|
|
|
|
spawn = random(level.spawnpoints);
|
|
node = getvisiblenode(self.origin,spawn.origin);
|
|
if(IsDefined(node) && distancesquared(self.origin,node.origin) > 16384)
|
|
{
|
|
return node.origin;
|
|
}
|
|
|
|
return level.radio.baseorigin;
|
|
}
|
|
|
|
//Function Number: 8
|
|
bot_capture_hq()
|
|
{
|
|
self addgoal(self.origin,24,3,"hq_radio");
|
|
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);
|
|
self.bot.update_lookat = GetTime() + randomintrange(1500,3000);
|
|
}
|
|
}
|
|
|
|
//Function Number: 9
|
|
any_other_team_touching(skip_team)
|
|
{
|
|
foreach(team in level.teams)
|
|
{
|
|
if(team == skip_team)
|
|
{
|
|
}
|
|
else if(level.radio.gameobject.numtouching[team])
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 10
|
|
is_hq_contested(skip_team)
|
|
{
|
|
if(any_other_team_touching(skip_team))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy(level.radio.baseorigin,1);
|
|
if(IsDefined(enemy) && distancesquared(enemy.origin,level.radio.baseorigin) < 262144)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 11
|
|
bot_hq_grenade()
|
|
{
|
|
enemies = bot_get_enemies();
|
|
if(!(enemies.size))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(self atgoal("hq_patrol") || self atgoal("hq_radio"))
|
|
{
|
|
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_hq_contested(self.team)))
|
|
{
|
|
self maps/mp/bots/_bot_combat::bot_combat_throw_smoke(level.radio.baseorigin);
|
|
return;
|
|
}
|
|
|
|
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy(level.radio.baseorigin,0);
|
|
if(IsDefined(enemy))
|
|
{
|
|
origin = enemy.origin;
|
|
}
|
|
else
|
|
{
|
|
origin = level.radio.baseorigin;
|
|
}
|
|
|
|
dir = vectornormalize(self.origin - origin);
|
|
dir = (0,dir[1],0);
|
|
origin = 128 + VectorScale(dir);
|
|
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: 12
|
|
bot_hq_tactical_insertion()
|
|
{
|
|
if(!(self hasweapon("tactical_insertion_mp")))
|
|
{
|
|
return;
|
|
}
|
|
|
|
dist = self getlookaheaddist();
|
|
dir = self getlookaheaddir();
|
|
if(!IsDefined(dist) || !IsDefined(dir))
|
|
{
|
|
return;
|
|
}
|
|
|
|
node = hq_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: 13
|
|
hq_nearest_node()
|
|
{
|
|
return random(level.radio.nodes);
|
|
}
|
|
|
|
//Function Number: 14
|
|
hq_is_contested()
|
|
{
|
|
enemy = self maps/mp/bots/_bot::bot_get_closest_enemy(level.radio.baseorigin,0);
|
|
return IsDefined(enemy) && distancesquared(enemy.origin,level.radio.baseorigin) < level.radio.node_radius * level.radio.node_radius;
|
|
} |