here goes the whole thing

Code:
#include <acknex.h>

#define PRAGMA_PATH "%EXE_DIR%\templates\models"

#define skOffsetX       skill1
#define skOffsetY       skill2
#define skOffsetZ       skill3
#define skDistance      skill4
#define skDistSoft      skill5

action actCameraCollider () {
	proc_mode = PROC_LATE;
	wait(1);
	my->flags |= INVISIBLE | PASSABLE;
	my->eflags = FAT | NARROW;
	vec_set(&my->max_x, vector(8, 8, 8));
	vec_set(&my->min_x, vector(-8, -8, -8));
	vec_set(&my->skOffsetX, vector(0, -7, 35));
	my->skDistance = 200;
	my->skDistSoft = my->skDistance;
	my->parent = player;
	while (my->parent == player) {
		my->skDistance = clamp(my->skDistance + mickey.z * 0.3, 20, 400);
		camera->pan = player->pan;
		camera->tilt = clamp(camera->tilt - mickey.y * 0.2, -80, 45); 
		vec_set(&my->pan, &camera->pan);
		vec_set(&my->x, &my->skOffsetX);
		vec_rotate(&my->x, &player->pan);
		vec_add(&my->x, &player->x);
		VECTOR vDir;
		vec_for_angle(&vDir, &camera->pan);
		vec_scale(&vDir, -my->skDistance);
		VECTOR vTarget;
		vec_set(&vTarget, &my->x);
		vec_add(&vTarget, &vDir);
		you = player;
		var nDist = c_trace(&my->x, &vTarget, IGNORE_YOU | IGNORE_PASSABLE | USE_BOX);
		if (nDist > 0)
			my->skDistSoft += (nDist - my->skDistSoft) * time_step;
		else
			my->skDistSoft += (my->skDistance - my->skDistSoft) * time_step;
		vec_normalize(&vDir, my->skDistSoft);
		vec_set(&camera->x, &my->x);
		vec_add(&camera->x, &vDir);
		wait(1);
	}
	ent_remove(me);
}

#define skPan           skill1
#define skAngle         skill2
#define skMoveX         skill3
#define skMoveY         skill4
#define skMoveZ         skill5

action actPlayer () {
	player = me;
	ent_create(NULL, &my->x, actCameraCollider);
	wait(1);
	my->eflags |= FAT | NARROW;
	vec_set(&my->max_x, vector(16, 16, 32));
	vec_set(&my->min_x, vector(-16, -16, -32));
	my->skPan = 0;
	my->skMoveZ = 0;
	while (me == player) {
		my->skPan = ang(my->skPan - mickey.x * 0.2);
		my->skAngle = ang(my->skPan - my->pan) * time_step; 
		c_rotate(me, vector(my->skAngle, 0, 0), IGNORE_PASSABLE | GLIDE);
		my->skMoveX = key_w - key_s;
		my->skMoveY = key_a - key_d;
		vec_normalize(&my->skMoveX, time_step * 10);
		c_move(me, &my->skMoveX, NULL, IGNORE_PASSABLE | GLIDE);
		wait(1);
	}
	ent_remove(me);
}

void main () {
	video_mode = 10;
	fps_max = 60;
	wait(1);
	level_load("level.wmb");
	camera->clip_near = 1;
	ent_create("player.mdl", vector(100, 100, 32), actPlayer);
	while(!key_esc)
		wait(1);
	player = NULL;
	wait(1);
	sys_exit(NULL);
}