X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fbot%2Fdefault%2Fhavocbot%2Fhavocbot.qc;h=c26d768b038ae55501eb01c011dbb8c07ba74527;hb=c5fcf672c473edef7139d4250398184b8ae17224;hp=45051b6c270f1e738aa05786b3fbc9f54f1ecc34;hpb=393022c0e9b00481e68d1db786e96e4ffb7f37e0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/bot/default/havocbot/havocbot.qc b/qcsrc/server/bot/default/havocbot/havocbot.qc index 45051b6c2..c26d768b0 100644 --- a/qcsrc/server/bot/default/havocbot/havocbot.qc +++ b/qcsrc/server/bot/default/havocbot/havocbot.qc @@ -9,6 +9,7 @@ #include "../waypoints.qh" #include +#include #include #include #include @@ -28,6 +29,13 @@ void havocbot_ai(entity this) if(bot_execute_commands(this)) return; + while(this.goalcurrent && wasfreed(this.goalcurrent)) + { + navigation_poproute(this); + if(!this.goalcurrent) + this.bot_strategytime = 0; + } + if (bot_strategytoken == this) if (!bot_strategytoken_taken) { @@ -43,7 +51,7 @@ void havocbot_ai(entity this) // TODO: tracewalk() should take care of this job (better path finding under water) // if we don't have a goal and we're under water look for a waypoint near the "shore" and push it - if(IS_DEAD(this)) + if(!(IS_DEAD(this))) if(!this.goalcurrent) if(this.waterlevel == WATERLEVEL_SWIMMING || (this.aistatus & AI_STATUS_OUT_WATER)) { @@ -129,7 +137,7 @@ void havocbot_ai(entity this) //heading = this.velocity; //dprint(this.goalstack01.classname,etos(this.goalstack01),"\n"); if( - this.goalstack01 != this && this.goalstack01 != NULL && ((this.aistatus & AI_STATUS_RUNNING) == 0) && + this.goalstack01 != this && this.goalstack01 && !wasfreed(this.goalstack01) && ((this.aistatus & AI_STATUS_RUNNING) == 0) && !(this.goalcurrent.wpflags & WAYPOINTFLAG_TELEPORT) ) next = ((this.goalstack01.absmin + this.goalstack01.absmax) * 0.5) - (this.origin + this.view_ofs); @@ -320,7 +328,7 @@ void havocbot_bunnyhop(entity this, vector dir) if(this.goalcurrent.classname=="waypoint") if (!(this.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL)) if(fabs(gco.z - this.origin.z) < this.maxs.z - this.mins.z) - if(this.goalstack01!=NULL) + if(this.goalstack01 && !wasfreed(this.goalstack01)) { gno = (this.goalstack01.absmin + this.goalstack01.absmax) * 0.5; deviation = vectoangles(gno - this.origin) - vectoangles(gco - this.origin); @@ -472,7 +480,7 @@ void havocbot_movetogoal(entity this) // Flying PHYS_INPUT_BUTTON_HOOK(this) = true; - if(this.navigation_jetpack_point.z - STAT(PL_MAX, NULL).z + STAT(PL_MIN, NULL).z < this.origin.z) + if(this.navigation_jetpack_point.z - STAT(PL_MAX, this).z + STAT(PL_MIN, this).z < this.origin.z) { this.movement_x = dir * v_forward * maxspeed; this.movement_y = dir * v_right * maxspeed; @@ -859,9 +867,6 @@ entity havocbot_gettarget(entity this, bool secondary) void havocbot_chooseenemy(entity this) { - entity head, best, head2; - float rating, bestrating, hf; - vector eye, v; if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(this)) { this.enemy = NULL; @@ -900,13 +905,12 @@ void havocbot_chooseenemy(entity this) if (time < this.havocbot_chooseenemy_finished) return; this.havocbot_chooseenemy_finished = time + autocvar_bot_ai_enemydetectioninterval; - eye = this.origin + this.view_ofs; - best = NULL; - bestrating = 100000000; - head = head2 = findchainfloat(bot_attack, true); + vector eye = this.origin + this.view_ofs; + entity best = NULL; + float bestrating = 100000000; // Backup hit flags - hf = this.dphitcontentsmask; + int hf = this.dphitcontentsmask; // Search for enemies, if no enemy can be seen directly try to look through transparent objects @@ -919,42 +923,38 @@ void havocbot_chooseenemy(entity this) { scan_secondary_targets = false; LABEL(scan_targets) - for( ; head; head = head.chain) + IL_EACH(g_bot_targets, it.bot_attack, { if(!scan_secondary_targets) { - if(head.classname == "misc_breakablemodel") + if(it.classname == "misc_breakablemodel") { have_secondary_targets = true; continue; } } - else - { - if(head.classname != "misc_breakablemodel") - continue; - } + else if(it.classname != "misc_breakablemodel") + continue; - v = (head.absmin + head.absmax) * 0.5; - rating = vlen(v - eye); - if (rating rating) - if (bot_shouldattack(this, head)) + if (bot_shouldattack(this, it)) { traceline(eye, v, true, this); - if (trace_ent == head || trace_fraction >= 1) + if (trace_ent == it || trace_fraction >= 1) { - best = head; + best = it; bestrating = rating; } } - } + }); if(!best && have_secondary_targets && !scan_secondary_targets) { scan_secondary_targets = true; // restart the loop - head = head2; bestrating = 100000000; goto scan_targets; } @@ -969,7 +969,6 @@ LABEL(scan_targets) // Set flags to see through transparent objects this.dphitcontentsmask |= DPCONTENTS_OPAQUE; - head = head2; scan_transparent = true; }