Hiermit sprintet er solange sprint_v > 2, danach läuft er normal weiter bis du shift wieder loslässt und er sich regeneriert. Ist es das was du willst?
Code:
if(sprint_v > 2 )
{
	if(c_move(me,vector(dist_sprint,0,0),vector(0,0,0), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON | GLIDE) > 0)
	{
		sprint_act = 1;
		sprint_v = sprint_v -0.7 *time_step;
	}
	
}
else
	sprint_act = 0;

if(sprint_act == 0)
{
	sprint_v = clamp(sprint_v,0,100);
	sprint_v = sprint_v +0.3 *time_step;
}


Dass sprint_act hin und herspringt ist logisch:
runde 1 (sprint_act ist 0): sprint_v ist größer 2: du springst in die if und reduzierst sprint_v auf <= 2 und setzt sprint_act = 1. zweite if wird übersprungen weil sprint_act nicht 0 ist
runde 2 (sprint_act ist 1): sprint_v ist <= 2, damit geht er in die else und setzt sprint_act auf 0. er geht in die zweite if und erhöht sprint_v (nach 2 oder 3 durchläufen auf > 2)
und das spielt geht von vorne los.
zum checken of der spieler sprintet (für die soundausgabe) würde ich da lieber direkt sprint_v benutzen. da kannst du ja direkt sehen ob er sprinted oder nicht und musst keinen flag aktuell halten (was in deinem fall sowiso nicht geht, da er hin und herspringt)