void BotMoveToGoal( gentity_t *self ) { int staminaJumpCost; vec3_t dir; VectorCopy( self->botMind->nav.dir, dir ); if ( dir[ 2 ] < 0 ) { dir[ 2 ] = 0; VectorNormalize( dir ); } BotAvoidObstacles( self, dir ); BotSeek( self, dir ); staminaJumpCost = BG_Class( self->client->ps.stats[ STAT_CLASS ] )->staminaJumpCost; //dont sprint or dodge if we dont have enough stamina and are about to slow if ( self->client->pers.team == TEAM_HUMANS && self->client->ps.stats[ STAT_STAMINA ] < staminaJumpCost ) { usercmd_t *botCmdBuffer = &self->botMind->cmdBuffer; usercmdReleaseButton( botCmdBuffer->buttons, BUTTON_SPRINT ); usercmdReleaseButton( botCmdBuffer->buttons, BUTTON_DODGE ); // walk to regain stamina BotWalk( self, true ); } }
bool BotSprint( gentity_t *self, bool enable ) { usercmd_t *botCmdBuffer = &self->botMind->cmdBuffer; int staminaJumpCost; if ( !enable ) { usercmdReleaseButton( botCmdBuffer->buttons, BUTTON_SPRINT ); return false; } staminaJumpCost = BG_Class( self->client->ps.stats[ STAT_CLASS ] )->staminaJumpCost; if ( self->client->pers.team == TEAM_HUMANS && self->client->ps.stats[ STAT_STAMINA ] > staminaJumpCost && self->botMind->botSkill.level >= 5 ) { usercmdPressButton( botCmdBuffer->buttons, BUTTON_SPRINT ); BotWalk( self, false ); return true; } else { usercmdReleaseButton( botCmdBuffer->buttons, BUTTON_SPRINT ); return false; } }
void BotWalk( gentity_t *self, bool enable ) { usercmd_t *botCmdBuffer = &self->botMind->cmdBuffer; if ( !enable ) { if ( usercmdButtonPressed( botCmdBuffer->buttons, BUTTON_WALKING ) ) { usercmdReleaseButton( botCmdBuffer->buttons, BUTTON_WALKING ); botCmdBuffer->forwardmove *= 2; botCmdBuffer->rightmove *= 2; } return; } if ( !usercmdButtonPressed( botCmdBuffer->buttons, BUTTON_WALKING ) ) { usercmdPressButton( botCmdBuffer->buttons, BUTTON_WALKING ); botCmdBuffer->forwardmove /= 2; botCmdBuffer->rightmove /= 2; } }
/* ================ CL_KeyMove Sets the usercmd_t based on key states ================ */ void CL_KeyMove( usercmd_t *cmd ) { int movespeed; int forward, side, up; // // adjust for speed key / running // the walking flag is to keep animations consistent // even during acceleration and deceleration // if ( kb[ KB_SPEED ].active ^ cl_run->integer ) { movespeed = 127; usercmdReleaseButton( cmd->buttons, BUTTON_WALKING ); } else { usercmdPressButton( cmd->buttons, BUTTON_WALKING ); movespeed = 64; } forward = 0; side = 0; up = 0; if ( kb[ KB_STRAFE ].active ) { side += movespeed * CL_KeyState( &kb[ KB_RIGHT ] ); side -= movespeed * CL_KeyState( &kb[ KB_LEFT ] ); } side += movespeed * CL_KeyState( &kb[ KB_MOVERIGHT ] ); side -= movespeed * CL_KeyState( &kb[ KB_MOVELEFT ] ); up += movespeed * CL_KeyState( &kb[ KB_UP ] ); up -= movespeed * CL_KeyState( &kb[ KB_DOWN ] ); forward += movespeed * CL_KeyState( &kb[ KB_FORWARD ] ); forward -= movespeed * CL_KeyState( &kb[ KB_BACK ] ); // fretn - moved this to bg_pmove.c //if (!(cl.snap.ps.persistant[PERS_HWEAPON_USE])) //{ cmd->forwardmove = ClampChar( forward ); cmd->rightmove = ClampChar( side ); cmd->upmove = ClampChar( up ); //} // Arnout: double tap cmd->doubleTap = DT_NONE; // reset if ( !cl.doubleTap.lastdoubleTap || com_frameTime - cl.doubleTap.lastdoubleTap > cl_doubletapdelay->integer + cls.frametime ) { int i; qboolean key_down; int lastKey = 0; unsigned int lastKeyTime = 0; // Which was last pressed or released? for ( i = 1; i < DT_NUM; i++ ) { if ( cl.doubleTap.pressedTime[ i ] > lastKeyTime ) { lastKeyTime = cl.doubleTap.pressedTime[ i ]; lastKey = i; } if ( cl.doubleTap.releasedTime[ i ] > lastKeyTime ) { lastKeyTime = cl.doubleTap.releasedTime[ i ]; lastKey = i; } } // Clear the others; don't want e.g. left-right-left causing dodge left if ( lastKey ) { for ( i = 1; i < DT_NUM; i++ ) { if ( i != lastKey ) { cl.doubleTap.pressedTime[ i ] = cl.doubleTap.releasedTime[ i ] = 0; } } } for ( i = 1; i < DT_NUM; i++ ) { key_down = dtmapping[ i ] == -1 || kb[ dtmapping[ i ] ].active || kb[ dtmapping[ i ] ].wasPressed; if ( key_down && !cl.doubleTap.pressedTime[ i ] ) { cl.doubleTap.pressedTime[ i ] = com_frameTime; } else if ( !key_down && cl.doubleTap.pressedTime[ i ] && !cl.doubleTap.releasedTime[ i ] && com_frameTime - cl.doubleTap.pressedTime[ i ] < cl_doubletapdelay->integer + cls.frametime ) { cl.doubleTap.releasedTime[ i ] = com_frameTime; } else if ( key_down && cl.doubleTap.pressedTime[ i ] && cl.doubleTap.releasedTime[ i ] && com_frameTime - cl.doubleTap.pressedTime[ i ] < cl_doubletapdelay->integer + cls.frametime && com_frameTime - cl.doubleTap.releasedTime[ i ] < cl_doubletapdelay->integer + cls.frametime ) { cl.doubleTap.pressedTime[ i ] = cl.doubleTap.releasedTime[ i ] = 0; cmd->doubleTap = i; cl.doubleTap.lastdoubleTap = com_frameTime; } else if ( !key_down && ( cl.doubleTap.pressedTime[ i ] || cl.doubleTap.releasedTime[ i ] ) ) { if ( com_frameTime - cl.doubleTap.pressedTime[ i ] >= ( cl_doubletapdelay->integer + cls.frametime ) ) { cl.doubleTap.pressedTime[ i ] = cl.doubleTap.releasedTime[ i ] = 0; } } } } }