]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/waypoints.qc
Display hardwired waypoints purple
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / waypoints.qc
index 0e63398472c49efd379b2b75f20bd54f797da9c9..1127a9d61873060c82fff14a983449d344ffc8b9 100644 (file)
@@ -24,7 +24,14 @@ void waypoint_unreachable(entity pl)
                it.colormod = '0.5 0.5 0.5';
                it.effects &= ~(EF_NODEPTHTEST | EF_RED | EF_BLUE);
        });
+
        entity e2 = navigation_findnearestwaypoint(pl, false);
+       if(!e2)
+       {
+               LOG_INFOF("Can't find any waypoint nearby\n");
+               return;
+       }
+
        navigation_markroutes(pl, e2);
 
        int j = 0;
@@ -161,6 +168,8 @@ void waypoint_setupmodel(entity wp)
                        wp.colormod = '1 0 0';
                else if (wp.wpflags & WAYPOINTFLAG_GENERATED)
                        wp.colormod = '1 1 0';
+               else if (wp.wphardwired)
+                       wp.colormod = '0.5 0 1';
                else
                        wp.colormod = '1 1 1';
        }
@@ -391,23 +400,63 @@ bool waypoint_islinked(entity from, entity to)
        return false;
 }
 
-float waypoint_getdistancecost_simple(float dist)
+void waypoint_updatecost_foralllinks()
 {
+       IL_EACH(g_waypoints, !(it.wpflags & WAYPOINTFLAG_TELEPORT),
+       {
+               if(it.wp00) it.wp00mincost = waypoint_getlinkcost(it, it.wp00);
+               if(it.wp01) it.wp01mincost = waypoint_getlinkcost(it, it.wp01);
+               if(it.wp02) it.wp02mincost = waypoint_getlinkcost(it, it.wp02);
+               if(it.wp03) it.wp03mincost = waypoint_getlinkcost(it, it.wp03);
+               if(it.wp04) it.wp04mincost = waypoint_getlinkcost(it, it.wp04);
+               if(it.wp05) it.wp05mincost = waypoint_getlinkcost(it, it.wp05);
+               if(it.wp06) it.wp06mincost = waypoint_getlinkcost(it, it.wp06);
+               if(it.wp07) it.wp07mincost = waypoint_getlinkcost(it, it.wp07);
+               if(it.wp08) it.wp08mincost = waypoint_getlinkcost(it, it.wp08);
+               if(it.wp09) it.wp09mincost = waypoint_getlinkcost(it, it.wp09);
+               if(it.wp10) it.wp10mincost = waypoint_getlinkcost(it, it.wp10);
+               if(it.wp11) it.wp11mincost = waypoint_getlinkcost(it, it.wp11);
+               if(it.wp12) it.wp12mincost = waypoint_getlinkcost(it, it.wp12);
+               if(it.wp13) it.wp13mincost = waypoint_getlinkcost(it, it.wp13);
+               if(it.wp14) it.wp14mincost = waypoint_getlinkcost(it, it.wp14);
+               if(it.wp15) it.wp15mincost = waypoint_getlinkcost(it, it.wp15);
+               if(it.wp16) it.wp16mincost = waypoint_getlinkcost(it, it.wp16);
+               if(it.wp17) it.wp17mincost = waypoint_getlinkcost(it, it.wp17);
+               if(it.wp18) it.wp18mincost = waypoint_getlinkcost(it, it.wp18);
+               if(it.wp19) it.wp19mincost = waypoint_getlinkcost(it, it.wp19);
+               if(it.wp20) it.wp20mincost = waypoint_getlinkcost(it, it.wp20);
+               if(it.wp21) it.wp21mincost = waypoint_getlinkcost(it, it.wp21);
+               if(it.wp22) it.wp22mincost = waypoint_getlinkcost(it, it.wp22);
+               if(it.wp23) it.wp23mincost = waypoint_getlinkcost(it, it.wp23);
+               if(it.wp24) it.wp24mincost = waypoint_getlinkcost(it, it.wp24);
+               if(it.wp25) it.wp25mincost = waypoint_getlinkcost(it, it.wp25);
+               if(it.wp26) it.wp26mincost = waypoint_getlinkcost(it, it.wp26);
+               if(it.wp27) it.wp27mincost = waypoint_getlinkcost(it, it.wp27);
+               if(it.wp28) it.wp28mincost = waypoint_getlinkcost(it, it.wp28);
+               if(it.wp29) it.wp29mincost = waypoint_getlinkcost(it, it.wp29);
+               if(it.wp30) it.wp30mincost = waypoint_getlinkcost(it, it.wp30);
+               if(it.wp31) it.wp31mincost = waypoint_getlinkcost(it, it.wp31);
+       });
+}
+
+float waypoint_getlinearcost(float dist)
+{
+       if(skill >= autocvar_bot_ai_bunnyhop_skilloffset)
+               return dist / (autocvar_sv_maxspeed * 1.25);
        return dist / autocvar_sv_maxspeed;
 }
 
-float waypoint_getdistancecost(vector from, vector to)
+float waypoint_gettravelcost(vector from, vector to)
 {
-       float c = waypoint_getdistancecost_simple(vlen(to - from));
+       float c = waypoint_getlinearcost(vlen(to - from));
 
        float height = from.z - to.z;
-       if(height > 0 && autocvar_sv_gravity > 0)
+       if(height > jumpheight_vec.z && autocvar_sv_gravity > 0)
        {
-               float height_cost = sqrt(height / autocvar_sv_gravity);
-               float xydist = vlen(vec2(to - from));
-               float xydist_cost = xydist / autocvar_sv_maxspeed;
-               if(max(height_cost, xydist_cost) < c)
-                       c = max(height_cost, xydist_cost);
+               float height_cost = sqrt(height / (autocvar_sv_gravity / 2));
+               c = waypoint_getlinearcost(vlen(vec2(to - from))); // xy distance cost
+               if(height_cost > c)
+                       c = height_cost;
        }
        return c;
 }
@@ -416,23 +465,21 @@ float waypoint_getlinkcost(entity from, entity to)
 {
        vector v1 = from.origin;
        vector v2 = to.origin;
-       if (to.wpisbox || from.wpisbox)
+       if (from.wpisbox)
        {
-               // if either is a box we have to find the nearest points on them to
-               // calculate the distance properly
-               vector m1, m2;
-               m1 = to.absmin;
-               m2 = to.absmax;
+               vector m1 = to.absmin, m2 = to.absmax;
                v1_x = bound(m1_x, v1_x, m2_x);
                v1_y = bound(m1_y, v1_y, m2_y);
                v1_z = bound(m1_z, v1_z, m2_z);
-               m1 = from.absmin;
-               m2 = from.absmax;
+       }
+       if (to.wpisbox)
+       {
+               vector m1 = from.absmin, m2 = from.absmax;
                v2_x = bound(m1_x, v2_x, m2_x);
                v2_y = bound(m1_y, v2_y, m2_y);
                v2_z = bound(m1_z, v2_z, m2_z);
        }
-       return waypoint_getdistancecost(v1, v2);
+       return waypoint_gettravelcost(v1, v2);
 }
 
 // add a new link to the spawnfunc_waypoint, replacing the furthest link it already has
@@ -533,6 +580,8 @@ void waypoint_think(entity this)
                                ++relink_lengthculled;
                                continue;
                        }
+                       float sv_deviation = 0;
+                       float ev_deviation = 0;
                        navigation_testtracewalk = 0;
                        if (!this.wpisbox)
                        {
@@ -540,6 +589,7 @@ void waypoint_think(entity this)
                                if (!trace_startsolid)
                                {
                                        //dprint("sv deviation", vtos(trace_endpos - sv), "\n");
+                                       sv_deviation = trace_endpos.z + 1 - sv.z;
                                        sv = trace_endpos + '0 0 1';
                                }
                        }
@@ -549,19 +599,37 @@ void waypoint_think(entity this)
                                if (!trace_startsolid)
                                {
                                        //dprint("ev deviation", vtos(trace_endpos - ev), "\n");
+                                       ev_deviation = trace_endpos.z + 1 - ev.z;
                                        ev = trace_endpos + '0 0 1';
                                }
                        }
                        //traceline(this.origin, it.origin, false, NULL);
                        //if (trace_fraction == 1)
-                       if (!this.wpisbox && tracewalk(this, sv, PL_MIN_CONST, PL_MAX_CONST, ev, MOVE_NOMONSTERS))
-                               waypoint_addlink(this, it);
-                       else
+                       if (this.wpisbox)
                                relink_walkculled += 0.5;
-                       if (!it.wpisbox && tracewalk(it, ev, PL_MIN_CONST, PL_MAX_CONST, sv, MOVE_NOMONSTERS))
-                               waypoint_addlink(it, this);
                        else
+                       {
+                               vector dest = ev;
+                               dest.z = em1.z + ev_deviation;
+                               float dest_height = em2.z - em1.z;
+                               if(tracewalk(this, sv, PL_MIN_CONST, PL_MAX_CONST, dest, dest_height, MOVE_NOMONSTERS))
+                                       waypoint_addlink(this, it);
+                               else
+                                       relink_walkculled += 0.5;
+                       }
+
+                       if (it.wpisbox)
                                relink_walkculled += 0.5;
+                       else
+                       {
+                               vector dest = sv;
+                               dest.z = sm1.z + sv_deviation;
+                               float dest_height = sm2.z - sm1.z;
+                               if(tracewalk(it, ev, PL_MIN_CONST, PL_MAX_CONST, dest, dest_height, MOVE_NOMONSTERS))
+                                       waypoint_addlink(it, this);
+                               else
+                                       relink_walkculled += 0.5;
+                       }
                }
        });
        navigation_testtracewalk = 0;