]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/havocbot/havocbot.qc
Fix head-banging detection against not so high walls. If detected simply find a goal...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / havocbot / havocbot.qc
index d523b6ab89ed13f8f42077e5da6a745fd8e9cd80..17f3a80b3f48db0cdb5b73b56e279788a34833b7 100644 (file)
@@ -290,7 +290,8 @@ void havocbot_bunnyhop(entity this, vector dir)
 
        maxspeed = autocvar_sv_maxspeed;
 
-       if(this.aistatus & AI_STATUS_DANGER_AHEAD)
+       if(this.aistatus & AI_STATUS_RUNNING && vdist(this.velocity, <, autocvar_sv_maxspeed * 0.75)
+               || this.aistatus & AI_STATUS_DANGER_AHEAD)
        {
                this.aistatus &= ~AI_STATUS_RUNNING;
                PHYS_INPUT_BUTTON_JUMP(this) = false;
@@ -516,7 +517,9 @@ void havocbot_movetogoal(entity this)
                        if(fabs(this.velocity.z)<50)
                        {
                                entity newgoal = NULL;
-                               IL_EACH(g_waypoints, vdist(it.origin - this.origin, <=, 1000),
+                               if (vdist(this.origin - this.goalcurrent.origin, <, 150))
+                                       this.aistatus &= ~AI_STATUS_OUT_JUMPPAD;
+                               else IL_EACH(g_waypoints, vdist(it.origin - this.origin, <=, 1000),
                                {
                                        traceline(this.origin + this.view_ofs, ((it.absmin + it.absmax) * 0.5), true, this);
 
@@ -543,12 +546,10 @@ void havocbot_movetogoal(entity this)
                }
                else
                {
-                       if(this.velocity.z>0)
+                       if(time - this.lastteleporttime > 0.3 && this.velocity.z > 0)
                        {
-                               float threshold;
                                vector velxy = this.velocity; velxy_z = 0;
-                               threshold = maxspeed * 0.2;
-                               if(vdist(velxy, <, threshold))
+                               if(vdist(velxy, <, autocvar_sv_maxspeed * 0.2))
                                {
                                        LOG_TRACE("Warning: ", this.netname, " got stuck on a jumppad (velocity in xy is ", vtos(velxy), "), trying to get out of it now");
                                        this.aistatus |= AI_STATUS_OUT_JUMPPAD;
@@ -673,7 +674,39 @@ void havocbot_movetogoal(entity this)
        if (this.goalcurrent == NULL)
                return;
 
-       navigation_poptouchedgoals(this);
+
+       bool locked_goal = false;
+       if(this.goalentity && wasfreed(this.goalentity))
+       {
+               navigation_clearroute(this);
+               this.bot_strategytime = 0;
+               return;
+       }
+       else if(this.goalentity.bot_pickup)
+       {
+               if(this.goalentity.bot_pickup_respawning)
+               {
+                       if(this.goalentity.solid) // item respawned
+                               this.goalentity.bot_pickup_respawning = false;
+                       else if(time < this.goalentity.scheduledrespawntime - 10) // item already taken (by someone else)
+                       {
+                               this.goalentity.bot_pickup_respawning = false;
+                               navigation_clearroute(this);
+                               this.bot_strategytime = 0;
+                               return;
+                       }
+                       else if(this.goalentity == this.goalcurrent)
+                               locked_goal = true; // wait for item to respawn
+               }
+               else if(!this.goalentity.solid)
+               {
+                       navigation_clearroute(this);
+                       this.bot_strategytime = 0;
+                       return;
+               }
+       }
+       if(!locked_goal)
+               navigation_poptouchedgoals(this);
 
        // if ran out of goals try to use an alternative goal or get a new strategy asap
        if(this.goalcurrent == NULL)
@@ -733,61 +766,54 @@ void havocbot_movetogoal(entity this)
 
                        // jump if going toward an obstacle that doesn't look like stairs we
                        // can walk up directly
-                       tracebox(this.origin, this.mins, this.maxs, this.origin + this.velocity * 0.2, false, this);
+                       offset = (vdist(this.velocity, >, 32) ? this.velocity * 0.2 : v_forward * 32);
+                       tracebox(this.origin, this.mins, this.maxs, this.origin + offset, false, this);
                        if (trace_fraction < 1)
                        if (trace_plane_normal.z < 0.7)
                        {
                                s = trace_fraction;
-                               tracebox(this.origin + stepheightvec, this.mins, this.maxs, this.origin + this.velocity * 0.2 + stepheightvec, false, this);
+                               tracebox(this.origin + stepheightvec, this.mins, this.maxs, this.origin + offset + stepheightvec, false, this);
                                if (trace_fraction < s + 0.01)
                                if (trace_plane_normal.z < 0.7)
                                {
                                        s = trace_fraction;
-                                       tracebox(this.origin + jumpstepheightvec, this.mins, this.maxs, this.origin + this.velocity * 0.2 + jumpstepheightvec, false, this);
+                                       tracebox(this.origin + jumpstepheightvec, this.mins, this.maxs, this.origin + offset + jumpstepheightvec, false, this);
                                        if (trace_fraction > s)
                                                PHYS_INPUT_BUTTON_JUMP(this) = true;
                                }
                        }
 
                        // avoiding dangers and obstacles
-                       offset = (vdist(this.velocity, >, 32) ? this.velocity * 0.5 : v_forward * 32);
-                       vector dst_ahead = this.origin + this.view_ofs + offset;
+                       offset = (vdist(this.velocity - eZ * this.velocity.z, >, 32) ? this.velocity * 0.5 : v_forward * 32);
+                       vector dst_ahead = this.origin + offset;
                        vector dst_down = dst_ahead - '0 0 3000';
 
-                       // Look ahead
-                       traceline(this.origin + this.view_ofs, dst_ahead, true, NULL);
-
                        // Check head-banging against walls
-                       if(vdist(this.origin + this.view_ofs - trace_endpos, <, 25) && !(this.aistatus & AI_STATUS_OUT_WATER))
+                       traceline(this.origin, dst_ahead, true, NULL);
+                       if(vdist(this.origin - trace_endpos, <, 25) && !(this.aistatus & AI_STATUS_OUT_WATER))
                        {
                                PHYS_INPUT_BUTTON_JUMP(this) = true;
-                               if(this.facingwalltime && time > this.facingwalltime)
+                               if(!this.facingwalltime)
+                                       this.facingwalltime = time + 0.2;
+                               else if(time > this.facingwalltime)
                                {
-                                       this.ignoregoal = this.goalcurrent;
-                                       this.ignoregoaltime = time + autocvar_bot_ai_ignoregoal_timeout;
+                                       navigation_clearroute(this);
                                        this.bot_strategytime = 0;
                                        return;
                                }
-                               else
-                               {
-                                       this.facingwalltime = time + 0.05;
-                               }
                        }
                        else
-                       {
                                this.facingwalltime = 0;
 
-                               if(this.ignoregoal != NULL && time > this.ignoregoaltime)
-                               {
-                                       this.ignoregoal = NULL;
-                                       this.ignoregoaltime = 0;
-                               }
-                       }
-
                        // Check for water/slime/lava and dangerous edges
                        // (only when the bot is on the ground or jumping intentionally)
                        this.aistatus &= ~AI_STATUS_DANGER_AHEAD;
 
+                       dst_ahead = this.origin + this.view_ofs + offset;
+                       dst_down = dst_ahead - '0 0 3000';
+
+                       traceline(this.origin + this.view_ofs, dst_ahead, true, NULL);
+
                        bool unreachable = false;
                        s = CONTENT_SOLID;
                        if(trace_fraction == 1 && this.jumppadcount == 0 && !this.goalcurrent.wphardwired )