#include "havocbot.qh"
-#include "role_ctf.qc"
#include "role_onslaught.qc"
#include "role_keyhunt.qc"
-#include "role_freezetag.qc"
-#include "role_keepaway.qc"
-#include "role_assault.qc"
#include "roles.qc"
void havocbot_ai()
self.aistatus |= AI_STATUS_ATTACKING;
self.aistatus &~= AI_STATUS_ROAMING;
- if(self.weapons)
+ if(!WEPSET_EMPTY_E(self))
{
weapon_action(self.weapon, WR_AIM);
if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self))
}
else
{
- if(self.bot_aimtarg.classname=="player")
+ if(IS_PLAYER(self.bot_aimtarg))
bot_aimdir(self.bot_aimtarg.origin + self.bot_aimtarg.view_ofs - self.origin - self.view_ofs , -1);
}
}
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
{
e = get_weaponinfo(i);
- if ((e.spawnflags & WEP_FLAG_RELOADABLE) && (self.weapon_load[i] < cvar(strcat("g_balance_", e.netname, "_reload_ammo"))))
+ if (WEPSET_CONTAINS_EW(self, i) && (e.spawnflags & WEP_FLAG_RELOADABLE) && (self.weapon_load[i] < cvar(strcat("g_balance_", e.netname, "_reload_ammo"))))
self.switchweapon = i;
}
}
}
-};
+}
void havocbot_keyboard_movement(vector destorg)
{
blend = bound(0,vlen(destorg-self.origin)/autocvar_bot_ai_keyboard_distance,1); // When getting close move with 360 degree
//dprint("movement ", vtos(self.movement), " keyboard ", vtos(keyboard), " blend ", ftos(blend), "\n");
self.movement = self.movement + (keyboard - self.movement) * blend;
-};
+}
void havocbot_bunnyhop(vector dir)
{
if(self.aistatus & AI_STATUS_ATTACKING)
return;
- if(self.goalcurrent.classname == "player")
+ if(IS_PLAYER(self.goalcurrent))
return;
maxspeed = autocvar_sv_maxspeed;
}
}
#endif
-};
+}
void havocbot_movetogoal()
{
{
if(fabs(self.velocity_z)<50)
{
- entity head, newgoal;
- float distance, bestdistance;
+ entity head, newgoal = world;
+ float distance, bestdistance = 0;
for (head = findchain(classname, "waypoint"); head; head = head.chain)
{
}
// Don't chase players while using a jump pad
- if(self.goalcurrent.classname=="player" || self.goalstack01.classname=="player")
+ if(IS_PLAYER(self.goalcurrent) || IS_PLAYER(self.goalstack01))
return;
}
}
dodge = dodge * bound(0,0.5+(skill+self.bot_dodgeskill)*0.1,1);
evadelava = evadelava * bound(1,3-(skill+self.bot_dodgeskill),3); //Noobs fear lava a lot and take more distance from it
traceline(self.origin, ( ( self.enemy.absmin + self.enemy.absmax ) * 0.5 ), TRUE, world);
- if(trace_ent.classname == "player")
+ if(IS_PLAYER(trace_ent))
dir = dir * bound(0,(skill+self.bot_dodgeskill)/7,1);
dir = normalize(dir + dodge + evadeobstacle + evadelava);
if ((dir * v_up) >= autocvar_sv_jumpvelocity*0.5 && (self.flags & FL_ONGROUND)) self.BUTTON_JUMP=1;
if (((dodge * v_up) > 0) && random()*frametime >= 0.2*bound(0,(10-skill-self.bot_dodgeskill)*0.1,1)) self.BUTTON_JUMP=TRUE;
if (((dodge * v_up) < 0) && random()*frametime >= 0.5*bound(0,(10-skill-self.bot_dodgeskill)*0.1,1)) self.havocbot_ducktime=time+0.3/bound(0.1,skill+self.bot_dodgeskill,10);
-};
+}
void havocbot_chooseenemy()
{
self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
- for(;;)
+ for(i = 0; ; ++i)
{
while (head)
{
// I want to do a second scan if no enemy was found or I don't have weapons
// TODO: Perform the scan when using the rifle (requires changes on the rifle code)
- if(best || self.weapons) // || self.weapon == WEP_RIFLE
+ if(best || !WEPSET_EMPTY_E(self)) // || self.weapon == WEP_RIFLE
break;
if(i)
break;
self.dphitcontentsmask |= DPCONTENTS_OPAQUE;
head = head2;
- ++i;
}
// Restore hit flags
self.enemy = best;
self.havocbot_stickenemy = TRUE;
-};
+}
float havocbot_chooseweapon_checkreload(float new_weapon)
{
// if this weapon is scheduled for reloading, don't switch to it during combat
if (self.weapon_load[new_weapon] < 0)
{
- float i, other_weapon_available;
+ float i, other_weapon_available = FALSE;
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
{
// if we are out of ammo for all other weapons, it's an emergency to switch to anything else
float i;
// ;)
- if(g_weaponarena == WEPBIT_TUBA)
+ if(WEPSET_EQ_AW(g_weaponarena_weapons, WEP_TUBA))
{
self.switchweapon = WEP_TUBA;
return;
}
}
}
-};
+}
void havocbot_aim()
{
}
else
lag_additem(time + self.ping, 0, 0, world, self.origin, selfvel, ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5, '0 0 0');
-};
+}
float havocbot_moveto_refresh_route()
{
}
return dodge;
#endif
-};
+}