here is the code:
Code:
function mtl_uvspeed_render()
{
	mtl.matrix31 = floatd(my.skill1*total_ticks,256);
	mtl.matrix32 = floatd(my.skill2*total_ticks,256);
}

function mtl_uvspeed_init()
{
// copy standard model material properties
	mtl_copy(mat_model);
	mat_identity(mtl.matrix);
	mtl.event = mtl_uvspeed_render;
	mtl.ENABLE_RENDER = on;
}

MATERIAL mtl_uvspeed =
{
	event = mtl_uvspeed_init;
	effect = "
	matrix matMtl;

	technique uvspeed
	{
		pass one
		{
			TextureTransformFlags[0] = Count2;
			TextureTransform[0] = <matMtl>;
		}
	}
	technique fallback { pass one { } }
	";
}

action track()
{
	my.material = mtl_uvspeed;
	
while(1)
{
my.skill1 += time_step * my_speed;
wait(1);
}
}


just use skill1 and skill2 instead of u / v!
(it is also possible to change normal-mapping-shaders this way!)