Пример #1
0
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 );
	}
}
Пример #2
0
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;
	}
}
Пример #3
0
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;
	}
}
Пример #4
0
/*
================
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;
				}
			}
		}
	}
}