================================================================ The fix is to replace FallSpot in botutil.qc with the following: ================================================================ void() FallSpotGround = { fallspot_self = self; self = dropper; self.origin = testplace; self.flags = FL_ONGROUND_PARTIALGROUND; if (walkmove(0, 0)) { if (!(droptofloor())) { self.origin = testplace + '0 0 -256'; if (!(droptofloor())) { fall = FALL_DEATH; // too far to fall (no need further check) self = fallspot_self; return; } } content = pointcontents(self.origin + '0 0 -24'); if (content == CONTENT_LAVA) fall = FALL_DEATH; else if (self.origin_z < fallheight) fall = FALL_LAND; else fall = FALL_FALSE; self = fallspot_self; return; } else { fall = FALL_BLOCKED; self = fallspot_self; } }; === and === void() FallSpotAir = { fallspot_self = self; self = dropper; self.origin = testplace; self.flags = FL_ONGROUND_PARTIALGROUND; if (walkmove(0, 0)) { if (self.origin_z > testplace_z) { fall = FALL_BLOCKED; self = fallspot_self; return; } } else { fall = FALL_BLOCKED; self = fallspot_self; return; } if (!(droptofloor())) { self.origin = testplace + '0 0 -256'; if (!(droptofloor())) { fall = FALL_DEATH; // too far to fall (no need further check) self = fallspot_self; return; } } content = pointcontents(self.origin + '0 0 -24'); if (content == CONTENT_LAVA) fall = FALL_DEATH; else if (self.origin_z < fallheight) fall = FALL_LAND; else fall = FALL_FALSE; self = fallspot_self; }; ============================================= and replace AvoidHazards in botthink.qc with: ============================================= void() AvoidHazards = { new_velocity = self.velocity; if (self.path_state & JUMP_LEDGE) { if (time > self.arrow_time2) if (self.flags & FL_ONGROUND) { rel_pos = (self.linked_marker.absmin + self.linked_marker.view_ofs) - self.origin; if (rel_pos_z > 18) { hor_normal_vec_x = 0 - rel_pos_y; hor_normal_vec_y = rel_pos_x; hor_normal_vec = normalize(hor_normal_vec); jumpspeed = new_velocity_z + JUMPSPEED; if ((jumpspeed * jumpspeed * 0.000625) >= rel_pos_z) // 0.000625 = 0.5 / sv_gravity { self.button2 = TRUE; return; } } } } else if (self.obstruction_normal != '0 0 0') { if (time > self.arrow_time) { if (self.flags & FL_WATERJUMP) return; if (vlen(oldvelocity_) <= 32) { dir_move = new_velocity - (self.obstruction_normal * (self.obstruction_normal * new_velocity)); if ((dir_move_x == 0) && (dir_move_y == 0)) dir_move = (-1) * self.obstruction_normal; else if ((oldvelocity__x == 0) && (oldvelocity__y == 0)) { // maybe stuck in a corner if (random() < 0.5) dir_move = (-1) * dir_move; } else { dir_move = normalize(dir_move); dir_move = dir_move + normalize(new_velocity); } dir_move_z = 0; makevectors(self.v_angle); BestArrowForDirection(); NewVelocityForArrow(); } } new_velocity = new_velocity - (self.obstruction_normal * (self.obstruction_normal * new_velocity)); } if (self.waterlevel) return; hor_velocity = new_velocity; hor_velocity_z = 0; hor_speed = vlen(hor_velocity); if (!hor_speed) return; dir_forward = normalize(hor_velocity); fallheight = self.origin_z - 36; if (self.linked_marker) { min_second = self.linked_marker.absmin_z + self.linked_marker.view_ofs_z - 36; if (fallheight > min_second) fallheight = min_second; } if (self.flags & FL_ONGROUND) { if (new_velocity_z < 0) new_velocity_z = 0; last_clear_point = self.origin; testplace = last_clear_point + new_velocity * (16 / hor_speed); FallSpotGround(); if (fall == FALL_BLOCKED) { first_trace_fraction = 1; TestTopBlock(); if (first_trace_fraction != 1) { testplace = last_clear_point + new_velocity * (16 / hor_speed) * first_trace_fraction; new_velocity = new_velocity - (first_trace_plane_normal * (first_trace_plane_normal * new_velocity)); hor_velocity = new_velocity; hor_velocity_z = 0; hor_speed = vlen(hor_velocity); testplace = testplace + (new_velocity * (16 / hor_speed) * (1 - first_trace_fraction)); } FallSpotGround(); } if (fall >= FALL_LAND) { new_fall = fall; testplace = self.origin; FallSpotGround(); if (new_fall > fall) { if (time > self.arrow_time2) { current_fallspot = fall; new_origin = self.origin; if (CanJumpOver()) return; new_velocity_z = new_velocity_z + JUMPSPEED; if (CanJumpOver()) { self.button2 = TRUE; return; } } AvoidEdge(); } return; } testplace = testplace + new_velocity * (16 / hor_speed); FallSpotGround(); if (fall >= FALL_LAND) { new_fall = fall; new_origin = testplace; testplace = self.origin; FallSpotGround(); if (new_fall > fall) RunAlongEdge(); } } else { local vector dummy; new_origin = self.origin; testplace = new_origin + new_velocity * (32 / hor_speed); dummy = testplace; FallSpotAir(); if (fall >= FALL_LAND) { new_fall = fall; testplace = new_origin; FallSpotAir(); if (new_fall > fall) { testplace = new_origin + new_velocity * (16 / hor_speed); FallSpotAir(); if (new_fall > fall) { current_fallspot = fall; if (CanJumpOver()) return; AvoidEdge(); } } } } };