X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fbot%2Fhavocbot%2Fhavocbot.qc;h=7a3ac0561af3c6ec66917479cad1b6a2ab1756de;hb=59b6575d5306d671853a67e37aa795f45315562b;hp=0ecafaf1e87c7aa62fda4892d2c38ef300e05683;hpb=d1ec6cd7b36e2c16817720fe5cce775fc3d26357;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/bot/havocbot/havocbot.qc b/qcsrc/server/bot/havocbot/havocbot.qc index 0ecafaf1e..7a3ac0561 100644 --- a/qcsrc/server/bot/havocbot/havocbot.qc +++ b/qcsrc/server/bot/havocbot/havocbot.qc @@ -1,10 +1,20 @@ #include "havocbot.qh" -#include "role_onslaught.qc" -#include "role_keyhunt.qc" -#include "roles.qc" +#include "../../_all.qh" + +#include "../aim.qh" +#include "../bot.qh" +#include "../navigation.qh" +#include "../scripting.qh" +#include "../waypoints.qh" + +#include "../../../common/constants.qh" + +#include "../../../common/triggers/trigger/jumppads.qh" + +#include "../../../warpzonelib/common.qh" void havocbot_ai() -{ +{SELFPARAM(); if(self.draggedby) return; @@ -148,9 +158,6 @@ void havocbot_ai() // if the bot is not attacking, consider reloading weapons if (!(self.aistatus & AI_STATUS_ATTACKING)) { - float i; - entity e; - // we are currently holding a weapon that's not fully loaded, reload it if(skill >= 2) // bots can only reload the held weapon on purpose past this skill if(self.clip_load < self.clip_size) @@ -161,9 +168,9 @@ void havocbot_ai() if(skill >= 5) // bots can only look for unloaded weapons past this skill if(self.clip_load >= 0) // only if we're not reloading a weapon already { - for(i = WEP_FIRST; i <= WEP_LAST; ++i) + for (int i = WEP_FIRST; i <= WEP_LAST; ++i) { - e = get_weaponinfo(i); + entity e = get_weaponinfo(i); if ((self.weapons & WepSet_FromWeapon(i)) && (e.spawnflags & WEP_FLAG_RELOADABLE) && (self.weapon_load[i] < e.reloading_ammo)) self.switchweapon = i; } @@ -172,7 +179,7 @@ void havocbot_ai() } void havocbot_keyboard_movement(vector destorg) -{ +{SELFPARAM(); vector keyboard; float blend, maxspeed; float sk; @@ -247,7 +254,7 @@ void havocbot_keyboard_movement(vector destorg) } void havocbot_bunnyhop(vector dir) -{ +{SELFPARAM(); float bunnyhopdistance; vector deviation; float maxspeed; @@ -390,7 +397,7 @@ void havocbot_bunnyhop(vector dir) } void havocbot_movetogoal() -{ +{SELFPARAM(); vector destorg; vector diff; vector dir; @@ -470,7 +477,7 @@ void havocbot_movetogoal() // Flying self.BUTTON_HOOK = true; - if(self.navigation_jetpack_point.z - PL_MAX_z + PL_MIN_z < self.origin.z) + if(self.navigation_jetpack_point.z - PL_MAX.z + PL_MIN.z < self.origin.z) { self.movement_x = dir * v_forward * maxspeed; self.movement_y = dir * v_right * maxspeed; @@ -530,7 +537,7 @@ void havocbot_movetogoal() threshold = maxspeed * 0.2; if(sxy < threshold) { - dprint("Warning: ", self.netname, " got stuck on a jumppad (velocity in xy is ", ftos(sxy), "), trying to get out of it now\n"); + LOG_TRACE("Warning: ", self.netname, " got stuck on a jumppad (velocity in xy is ", ftos(sxy), "), trying to get out of it now\n"); self.aistatus |= AI_STATUS_OUT_JUMPPAD; } return; @@ -593,7 +600,7 @@ void havocbot_movetogoal() else if(self.health>WEP_CVAR(devastator, damage)*0.5) { if(self.velocity.z < 0) - if(client_hasweapon(self, WEP_DEVASTATOR, true, false)) + if(client_hasweapon(self, WEP_DEVASTATOR.m_id, true, false)) { self.movement_x = maxspeed; @@ -607,7 +614,7 @@ void havocbot_movetogoal() return; } - self.switchweapon = WEP_DEVASTATOR; + self.switchweapon = WEP_DEVASTATOR.m_id; self.v_angle_x = 90; self.BUTTON_ATCK = true; self.rocketjumptime = time + WEP_CVAR(devastator, detonatedelay); @@ -781,7 +788,7 @@ void havocbot_movetogoal() if(tracebox_hits_trigger_hurt(dst_ahead, self.mins, self.maxs, trace_endpos)) { // Remove dangerous dynamic goals from stack - dprint("bot ", self.netname, " avoided the goal ", self.goalcurrent.classname, " ", etos(self.goalcurrent), " because it led to a dangerous path; goal stack cleared\n"); + LOG_TRACE("bot ", self.netname, " avoided the goal ", self.goalcurrent.classname, " ", etos(self.goalcurrent), " because it led to a dangerous path; goal stack cleared\n"); navigation_clearroute(); return; } @@ -847,7 +854,7 @@ void havocbot_movetogoal() } void havocbot_chooseenemy() -{ +{SELFPARAM(); entity head, best, head2; float rating, bestrating, i, hf; vector eye, v; @@ -923,7 +930,7 @@ void havocbot_chooseenemy() // 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 || self.weapons) // || self.weapon == WEP_RIFLE.m_id break; if(i) break; @@ -942,7 +949,7 @@ void havocbot_chooseenemy() } float havocbot_chooseweapon_checkreload(int new_weapon) -{ +{SELFPARAM(); // bots under this skill cannot find unloaded weapons to reload idly when not in combat, // so skip this for them, or they'll never get to reload their weapons at all. // this also allows bots under this skill to be more stupid, and reload more often during combat :) @@ -967,13 +974,13 @@ float havocbot_chooseweapon_checkreload(int new_weapon) } void havocbot_chooseweapon() -{ +{SELFPARAM(); int i; // ;) if(g_weaponarena_weapons == WEPSET_TUBA) { - self.switchweapon = WEP_TUBA; + self.switchweapon = WEP_TUBA.m_id; return; } @@ -982,7 +989,7 @@ void havocbot_chooseweapon() { // If no weapon was chosen get the first available weapon if(self.weapon==0) - for(i = WEP_FIRST; i <= WEP_LAST; ++i) if(i != WEP_BLASTER) + for(i = WEP_FIRST; i <= WEP_LAST; ++i) if(i != WEP_BLASTER.m_id) { if(client_hasweapon(self, i, true, false)) { @@ -1069,7 +1076,7 @@ void havocbot_chooseweapon() } void havocbot_aim() -{ +{SELFPARAM(); vector selfvel, enemyvel; // if(self.flags & FL_INWATER) // return; @@ -1091,7 +1098,7 @@ void havocbot_aim() } float havocbot_moveto_refresh_route() -{ +{SELFPARAM(); // Refresh path to goal if necessary entity wp; wp = self.havocbot_personal_waypoint; @@ -1102,7 +1109,7 @@ float havocbot_moveto_refresh_route() } float havocbot_moveto(vector pos) -{ +{SELFPARAM(); entity wp; if(self.aistatus & AI_STATUS_WAYPOINT_PERSONAL_GOING) @@ -1110,7 +1117,7 @@ float havocbot_moveto(vector pos) // Step 4: Move to waypoint if(self.havocbot_personal_waypoint==world) { - dprint("Error: ", self.netname, " trying to walk to a non existent personal waypoint\n"); + LOG_TRACE("Error: ", self.netname, " trying to walk to a non existent personal waypoint\n"); self.aistatus &= ~AI_STATUS_WAYPOINT_PERSONAL_GOING; return CMD_STATUS_ERROR; } @@ -1121,7 +1128,7 @@ float havocbot_moveto(vector pos) bot_strategytoken_taken = true; if(havocbot_moveto_refresh_route()) { - dprint(self.netname, " walking to its personal waypoint (after ", ftos(self.havocbot_personal_waypoint_failcounter), " failed attempts)\n"); + LOG_TRACE(self.netname, " walking to its personal waypoint (after ", ftos(self.havocbot_personal_waypoint_failcounter), " failed attempts)\n"); self.havocbot_personal_waypoint_searchtime = time + 10; self.havocbot_personal_waypoint_failcounter = 0; } @@ -1131,13 +1138,13 @@ float havocbot_moveto(vector pos) self.havocbot_personal_waypoint_searchtime = time + 2; if(self.havocbot_personal_waypoint_failcounter >= 30) { - dprint("Warning: can't walk to the personal waypoint located at ", vtos(self.havocbot_personal_waypoint.origin),"\n"); + LOG_TRACE("Warning: can't walk to the personal waypoint located at ", vtos(self.havocbot_personal_waypoint.origin),"\n"); self.aistatus &= ~AI_STATUS_WAYPOINT_PERSONAL_LINKING; remove(self.havocbot_personal_waypoint); return CMD_STATUS_ERROR; } else - dprint(self.netname, " can't walk to its personal waypoint (after ", ftos(self.havocbot_personal_waypoint_failcounter), " failed attempts), trying later\n"); + LOG_TRACE(self.netname, " can't walk to its personal waypoint (after ", ftos(self.havocbot_personal_waypoint_failcounter), " failed attempts), trying later\n"); } } @@ -1155,7 +1162,7 @@ float havocbot_moveto(vector pos) if(self.aistatus & AI_STATUS_WAYPOINT_PERSONAL_REACHED) { // Step 5: Waypoint reached - dprint(self.netname, "'s personal waypoint reached\n"); + LOG_TRACE(self.netname, "'s personal waypoint reached\n"); remove(self.havocbot_personal_waypoint); self.aistatus &= ~AI_STATUS_WAYPOINT_PERSONAL_REACHED; return CMD_STATUS_FINISHED; @@ -1170,7 +1177,7 @@ float havocbot_moveto(vector pos) // Wait until it is linked if(!self.havocbot_personal_waypoint.wplinked) { - dprint(self.netname, " waiting for personal waypoint to be linked\n"); + LOG_TRACE(self.netname, " waiting for personal waypoint to be linked\n"); return CMD_STATUS_EXECUTING; } @@ -1179,7 +1186,7 @@ float havocbot_moveto(vector pos) self.aistatus |= AI_STATUS_WAYPOINT_PERSONAL_GOING; // Step 3: Route to waypoint - dprint(self.netname, " walking to its personal waypoint\n"); + LOG_TRACE(self.netname, " walking to its personal waypoint\n"); return CMD_STATUS_EXECUTING; } @@ -1188,7 +1195,7 @@ float havocbot_moveto(vector pos) wp = waypoint_spawnpersonal(pos); if(wp==world) { - dprint("Error: Can't spawn personal waypoint at ",vtos(pos),"\n"); + LOG_TRACE("Error: Can't spawn personal waypoint at ",vtos(pos),"\n"); return CMD_STATUS_ERROR; } @@ -1224,7 +1231,7 @@ float havocbot_resetgoal() } void havocbot_setupbot() -{ +{SELFPARAM(); self.bot_ai = havocbot_ai; self.cmd_moveto = havocbot_moveto; self.cmd_resetgoal = havocbot_resetgoal; @@ -1233,7 +1240,7 @@ void havocbot_setupbot() } vector havocbot_dodge() -{ +{SELFPARAM(); // LordHavoc: disabled because this is too expensive return '0 0 0'; #if 0