return;
}
- if(this.waterlevel > WATERLEVEL_WETFEET)
+ if(this.waterlevel > WATERLEVEL_WETFEET || IS_DUCKED(this))
{
this.aistatus &= ~AI_STATUS_RUNNING;
return;
CS(this).movement = '0 0 0';
maxspeed = autocvar_sv_maxspeed;
+ if (this.goalcurrent.wpflags & WAYPOINTFLAG_CROUCH)
+ PHYS_INPUT_BUTTON_CROUCH(this) = true;
+ else
+ PHYS_INPUT_BUTTON_CROUCH(this) = false;
+
PHYS_INPUT_BUTTON_JETPACK(this) = false;
// Jetpack navigation
if(this.navigation_jetpack_goal)
return;
}
- else if(!this.jumppadcount && !this.goalcurrent.wphardwired
+ else if(!this.jumppadcount && !waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent)
&& !(this.goalcurrent_prev && this.goalcurrent_prev.wpflags & WAYPOINTFLAG_JUMP)
&& GetResource(this, RES_HEALTH) + GetResource(this, RES_ARMOR) > ROCKETJUMP_DAMAGE())
{
LABEL(jumpobstacle_check);
dir = flatdir = normalize(actual_destorg - this.origin);
- if (turning || fabs(deviation.y) < 50) // don't even try to jump if deviation is too high
+ bool jump_forbidden = false;
+ if (!turning && fabs(deviation.y) > 50)
+ jump_forbidden = true;
+ else if (IS_DUCKED(this))
+ {
+ tracebox(this.origin, PL_MIN_CONST, PL_MAX_CONST, this.origin, false, this);
+ if (trace_startsolid)
+ jump_forbidden = true;
+ }
+
+ if (!jump_forbidden)
{
tracebox(this.origin, this.mins, this.maxs, actual_destorg, false, this);
if (trace_fraction < 1 && trace_plane_normal.z < 0.7)
bool unreachable = false;
s = CONTENT_SOLID;
- if (trace_fraction == 1 && !this.jumppadcount && !this.goalcurrent.wphardwired
+ if (trace_fraction == 1 && !this.jumppadcount
+ && !waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent)
&& !(this.goalcurrent_prev && this.goalcurrent_prev.wpflags & WAYPOINTFLAG_JUMP) )
if((IS_ONGROUND(this)) || (this.aistatus & AI_STATUS_RUNNING) || (this.aistatus & AI_STATUS_ROAMING) || PHYS_INPUT_BUTTON_JUMP(this))
{
}
// slow down if bot is in the air and goal is under it
- if (!this.goalcurrent.wphardwired
+ if (!waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent)
&& vdist(flat_diff, <, 250) && this.origin.z - destorg.z > 120
&& (!IS_ONGROUND(this) || vdist(vec2(this.velocity), >, maxspeed * 0.3)))
{
if(skill+this.bot_moveskill >= autocvar_bot_ai_bunnyhop_skilloffset)
havocbot_bunnyhop(this, dir);
- if ((dir * v_up) >= autocvar_sv_jumpvelocity*0.5 && (IS_ONGROUND(this))) PHYS_INPUT_BUTTON_JUMP(this) = true;
- if (((dodge * v_up) > 0) && random()*frametime >= 0.2*bound(0,(10-skill-this.bot_dodgeskill)*0.1,1)) PHYS_INPUT_BUTTON_JUMP(this) = true;
- if (((dodge * v_up) < 0) && random()*frametime >= 0.5*bound(0,(10-skill-this.bot_dodgeskill)*0.1,1)) this.havocbot_ducktime=time+0.3/bound(0.1,skill+this.bot_dodgeskill,10);
+ if (dir * v_up >= autocvar_sv_jumpvelocity * 0.5 && IS_ONGROUND(this))
+ PHYS_INPUT_BUTTON_JUMP(this) = true;
+ if (dodge)
+ {
+ if (dodge * v_up > 0 && random() * frametime >= 0.2 * bound(0, (10 - skill - this.bot_dodgeskill) * 0.1, 1))
+ PHYS_INPUT_BUTTON_JUMP(this) = true;
+ if (dodge * v_up < 0 && random() * frametime >= 0.5 * bound(0, (10 - skill - this.bot_dodgeskill) * 0.1, 1))
+ this.havocbot_ducktime = time + 0.3 / bound(0.1, skill + this.bot_dodgeskill, 10);
+ }
}
entity havocbot_gettarget(entity this, bool secondary)