I would do it like you described it, but it looks like shit :|
My code:
Code:
#include <acknex.h>
#include <default.c>

function part_ev(PARTICLE *p)
{
	p->alpha -= 15 * p->vel_z * time_step;
	p->size += 0.05 * time_step;
	
	if(p->alpha <= 0)
		p->lifespan = 0;
}

function part(PARTICLE *p)
{
	p->vel_x = 0;
	p->vel_y = 0;
	p->vel_z = 1.2;
	p->gravity = 0;
	p->size = 0.1;
	p->flags = MOVE | TRANSLUCENT | BEAM;
	p->event = part_ev;
}

function main()
{
	fps_max = 60;
	video_mode = 10;
	level_load(NULL);
	
	ENTITY *pGun = ent_create("UZI_V.mdl", camera.x, NULL);
	ent_animate(pGun, "Take", 100, 0);
	camera.clip_near = 1;
	camera.arc = 85;
	
	int i = 0;
	
	while(1)
	{
		proc_mode = PROC_LATE;
		vec_set(pGun.pan, camera.pan);
		vec_set(pGun.x, camera.x);
		
		VECTOR v1, v2;
		vec_for_vertex(v1, pGun, 1778);
		vec_for_vertex(v2, pGun, 1788);
		vec_add(v1, v2);
		vec_scale(v1, 0.5);
		
		effect(part, 100, vector(v1.x, v1.y, v1.z), nullvector);
		
		/*for(i = 0; i < 50; i++)
		{
			effect(part, 1, vector(vPos.x, vPos.y, vPos.z + i*time_step), nullvector);
		}*/
		
		wait(1);
	}
}