X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fbot%2Fnavigation.qc;h=bf963bc7cd703be9d53cacf49c422d0f84c726bd;hb=2c5bebce47736537b1a2311fb52db41a481f27f1;hp=636c0d58a0871945da808c91d61a971e4e3fd9bf;hpb=80cd34d0a48e975018605aabebacba50e8029585;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/bot/navigation.qc b/qcsrc/server/bot/navigation.qc index 636c0d58a..bf963bc7c 100644 --- a/qcsrc/server/bot/navigation.qc +++ b/qcsrc/server/bot/navigation.qc @@ -4,15 +4,15 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float movemode) { - local vector org; - local vector move; - local vector dir; - local float dist; - local float totaldist; - local float stepdist; - local float yaw; - local float ignorehazards; - local float swimming; + vector org; + vector move; + vector dir; + float dist; + float totaldist; + float stepdist; + float yaw; + float ignorehazards; + float swimming; if(autocvar_bot_debug_tracewalk) { @@ -147,7 +147,7 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float traceline( org, move, movemode, e); if ( trace_ent.classname == "door_rotating" || trace_ent.classname == "door") { - local vector nextmove; + vector nextmove; move = trace_endpos; while(trace_ent.classname == "door_rotating" || trace_ent.classname == "door") { @@ -185,7 +185,7 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float // moved successfully if(swimming) { - local float c; + float c; c = pointcontents(org + '0 0 1'); if not(c == CONTENT_WATER || c == CONTENT_LAVA || c == CONTENT_SLIME) swimming = FALSE; @@ -204,7 +204,7 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float debugnodestatus(org, DEBUG_NODE_FAIL); return FALSE; -}; +} ///////////////////////////////////////////////////////////////////////////// // goal stack @@ -247,7 +247,7 @@ void navigation_clearroute() self.goalstack29 = world; self.goalstack30 = world; self.goalstack31 = world; -}; +} // add a new goal at the beginning of the stack // (in other words: add a new prerequisite before going to the later goals) @@ -290,7 +290,7 @@ void navigation_pushroute(entity e) self.goalstack02 = self.goalstack01; self.goalstack01 = self.goalcurrent; self.goalcurrent = e; -}; +} // remove first goal from stack // (in other words: remove a prerequisite for reaching the later goals) @@ -330,14 +330,38 @@ void navigation_poproute() self.goalstack29 = self.goalstack30; self.goalstack30 = self.goalstack31; self.goalstack31 = world; -}; +} + +float navigation_waypoint_will_link(vector v, vector org, entity ent, float walkfromwp, float bestdist) +{ + float dist; + dist = vlen(v - org); + if (bestdist > dist) + { + traceline(v, org, TRUE, ent); + if (trace_fraction == 1) + { + if (walkfromwp) + { + if (tracewalk(ent, v, PL_MIN, PL_MAX, org, bot_navigation_movemode)) + return TRUE; + } + else + { + if (tracewalk(ent, org, PL_MIN, PL_MAX, v, bot_navigation_movemode)) + return TRUE; + } + } + } + return FALSE; +} // find the spawnfunc_waypoint near a dynamic goal such as a dropped weapon -entity navigation_findnearestwaypoint(entity ent, float walkfromwp) +entity navigation_findnearestwaypoint_withdist(entity ent, float walkfromwp, float bestdist) { - local entity waylist, w, best; - local float dist, bestdist; - local vector v, org, pm1, pm2; + entity waylist, w, best; + vector v, org, pm1, pm2; + pm1 = ent.origin + ent.mins; pm2 = ent.origin + ent.maxs; waylist = findchain(classname, "waypoint"); @@ -362,7 +386,6 @@ entity navigation_findnearestwaypoint(entity ent, float walkfromwp) te_plasmaburn(org); best = world; - bestdist = 1050; // box check failed, try walk w = waylist; @@ -373,7 +396,7 @@ entity navigation_findnearestwaypoint(entity ent, float walkfromwp) { if (w.wpisbox) { - local vector wm1, wm2; + vector wm1, wm2; wm1 = w.origin + w.mins; wm2 = w.origin + w.maxs; v_x = bound(wm1_x, org_x, wm2_x); @@ -382,43 +405,27 @@ entity navigation_findnearestwaypoint(entity ent, float walkfromwp) } else v = w.origin; - dist = vlen(v - org); - if (bestdist > dist) + if(navigation_waypoint_will_link(v, org, ent, walkfromwp, bestdist)) { - traceline(v, org, TRUE, ent); - if (trace_fraction == 1) - { - if (walkfromwp) - { - //print("^1can I reach ", vtos(org), " from ", vtos(v), "?\n"); - if (tracewalk(ent, v, PL_MIN, PL_MAX, org, bot_navigation_movemode)) - { - bestdist = dist; - best = w; - } - } - else - { - if (tracewalk(ent, org, PL_MIN, PL_MAX, v, bot_navigation_movemode)) - { - bestdist = dist; - best = w; - } - } - } + bestdist = vlen(v - org); + best = w; } } w = w.chain; } return best; } +entity navigation_findnearestwaypoint(entity ent, float walkfromwp) +{ + return navigation_findnearestwaypoint_withdist(ent, walkfromwp, 1050); +} // finds the waypoints near the bot initiating a navigation query float navigation_markroutes_nearestwaypoints(entity waylist, float maxdist) { - local entity head; - local vector v, m1, m2, diff; - local float c; + entity head; + vector v, m1, m2, diff; + float c; // navigation_testtracewalk = TRUE; c = 0; head = waylist; @@ -461,9 +468,9 @@ float navigation_markroutes_nearestwaypoints(entity waylist, float maxdist) // updates a path link if a spawnfunc_waypoint link is better than the current one void navigation_markroutes_checkwaypoint(entity w, entity wp, float cost2, vector p) { - local vector m1; - local vector m2; - local vector v; + vector m1; + vector m2; + vector v; if (wp.wpisbox) { m1 = wp.absmin; @@ -482,14 +489,14 @@ void navigation_markroutes_checkwaypoint(entity w, entity wp, float cost2, vecto wp.wpfire = 1; wp.wpnearestpoint = v; } -}; +} // queries the entire spawnfunc_waypoint network for pathes leading away from the bot void navigation_markroutes(entity fixed_source_waypoint) { - local entity w, wp, waylist; - local float searching, cost, cost2; - local vector p; + entity w, wp, waylist; + float searching, cost, cost2; + vector p; w = waylist = findchain(classname, "waypoint"); while (w) { @@ -513,7 +520,7 @@ void navigation_markroutes(entity fixed_source_waypoint) { // try a short range search for the nearest waypoints, and expand the search repeatedly if none are found // as this search is expensive we will use lower values if the bot is on the air - local float i, increment, maxdistance; + float i, increment, maxdistance; if(self.flags & FL_ONGROUND) { increment = 750; @@ -578,14 +585,14 @@ void navigation_markroutes(entity fixed_source_waypoint) w = w.chain; } } -}; +} // queries the entire spawnfunc_waypoint network for pathes leading to the bot void navigation_markroutes_inverted(entity fixed_source_waypoint) { - local entity w, wp, waylist; - local float searching, cost, cost2; - local vector p; + entity w, wp, waylist; + float searching, cost, cost2; + vector p; w = waylist = findchain(classname, "waypoint"); while (w) { @@ -641,7 +648,7 @@ void navigation_markroutes_inverted(entity fixed_source_waypoint) w = w.chain; } } -}; +} // updates the best goal according to a weighted calculation of travel cost and item value of a new proposed item void navigation_routerating(entity e, float f, float rangebias) @@ -684,8 +691,8 @@ void navigation_routerating(entity e, float f, float rangebias) // dprint("jetpack ai: can bridge these two points\n"); // Lower the altitude of these points as much as possible - local float zdistance, xydistance, cost, t, fuel; - local vector down, npa, npb; + float zdistance, xydistance, cost, t, fuel; + vector down, npa, npb; down = '0 0 -1' * (PL_MAX_z - PL_MIN_z) * 10; @@ -825,7 +832,7 @@ void navigation_routerating(entity e, float f, float rangebias) } } //dprint("\n"); -}; +} // adds an item to the the goal stack with the path to a given item float navigation_routetogoal(entity e, vector startposition) @@ -870,13 +877,13 @@ float navigation_routetogoal(entity e, vector startposition) } return FALSE; -}; +} // removes any currently touching waypoints from the goal stack // (this is how bots detect if they reached a goal) void navigation_poptouchedgoals() { - local vector org, m1, m2; + vector org, m1, m2; org = self.origin; m1 = org + self.mins; m2 = org + self.maxs; @@ -971,7 +978,7 @@ void navigation_goalrating_start() navigation_clearroute(); navigation_bestgoal = world; navigation_markroutes(world); -}; +} // ends a goal selection session (updates goal stack to the best goal) void navigation_goalrating_end() @@ -994,13 +1001,13 @@ void navigation_goalrating_end() self.navigation_hasgoals = FALSE; // Reset this value } -}; +} void botframe_updatedangerousobjects(float maxupdate) { - local entity head, bot_dodgelist; - local vector m1, m2, v, o; - local float c, d, danger; + entity head, bot_dodgelist; + vector m1, m2, v, o; + float c, d, danger; c = 0; bot_dodgelist = findchainfloat(bot_dodge, TRUE); botframe_dangerwaypoint = find(botframe_dangerwaypoint, classname, "waypoint"); @@ -1032,7 +1039,7 @@ void botframe_updatedangerousobjects(float maxupdate) break; botframe_dangerwaypoint = find(botframe_dangerwaypoint, classname, "waypoint"); } -}; +} void navigation_unstuck() { @@ -1176,8 +1183,8 @@ void debugnodestatus(vector position, float status) // Debug the goal stack visually void debuggoalstack() { - local entity goal; - local vector org, go; + entity goal; + vector org, go; if(self.goalcounter==0)goal=self.goalcurrent; else if(self.goalcounter==1)goal=self.goalstack01;