I know this post is kind of old but I wanted to share this little extra because I think it's pretty cool.

I added mickey.z zoom in and out and also converted an old if comparison for alpha fade on the character. When you zoom in or if the camera collides with a wall and comes close to the character the character will become translucent. Also added two wait(1)'s to handle_sword_collision and handle_hand_collision. There seemed to be a Crash to desktop if you clicked the mouse to many times and from what I can tell the wait()'s seem to be helping.

I did not put alpha fade on the sword because it just seems really cool to me to be able to still see the sword while zoomed in.
I hope someone finds this useful, cheers...

Alpha fade between lines: 331 and 351
wait(1) at line: 413 and 432

Code:

function rotate_entity(var rotate_angle, var rotate_speed);
function handle_gravity();
function handle_movement();
function handle_camera();
function handle_animation(var animation_speed); 


#define nullframe	-2
#define blend		-1
#define stand		 0
#define run			 1
#define walk		 2
#define jump		 3
#define fall		 4
#define attack_a	 5
#define attack_b	 6
#define attack_c	 7
#define attack_d	 8
#define attack_e	 9
#define attack_f	 10

#define move_x				skill22
#define move_y				skill23
#define move_z				skill24
#define force_x			skill25
#define force_y			skill26
#define force_z			skill27
#define velocity_x		skill28
#define velocity_y		skill29
#define velocity_z		skill30
#define animate			skill31
#define animate2			skill32
#define animblend			skill33
#define currentframe		skill34
#define blendframe		skill35
#define z_offset			skill50
#define jumping_mode		skill51
#define gravity			skill52
#define movement_mode	skill53
#define moving				skill54
#define hit_by_player	skill55
#define entity_type		skill56

ENTITY*	player_weapon;
ENTITY*	target_enemy;

var		temp;
VECTOR*	tempV = { x=0; 	y=0; 		z=0; 		}
VECTOR*	tempV2= { x=0; 	y=0; 		z=0; 		}
ANGLE*	tempA = { pan=0; 	tilt=0; 	roll=0;	}
ANGLE*	tempA2= { pan=0; 	tilt=0; 	roll=0;	}

VECTOR*	camera_move_to = { x=0;	y=0;	z=0;	}
var camera_distance = 200;
var camera_pan;
var camera_tilt;
var fade_toggle = 1; //0 = off; 1 = on
var fade_start = 90;
var fade_end = 60; 
var space_press = 0;
var mouse_left_press = 0;
var mouse_right_press = 0;
var combo_continue = 0;
var player_lock_on = 0;
var airborne_attack = 0;


action attach_weapon()
{
	player_weapon = my;
	set(my,PASSABLE);
	proc_mode = PROC_LATE;
	while(you != NULL) 
	{
		vec_for_vertex(tempV.x, you, 1175);			//hand palm base
		vec_for_vertex(tempV2.x, you, 1240);		//hand palm tip
		vec_set(my.x, tempV.x);
		vec_diff(tempV.x, tempV2.x, tempV.x);
		vec_to_angle(tempA.pan, tempV.x);
		vec_set(my.pan, tempA.pan);
		wait(1);
	}
}

action player_action() 
{
	player = my;
	my.gravity = 6;
	my.z_offset = 12;
	set(my,SHADOW);
	ent_create("sword.mdl", my.x, attach_weapon);
	wait(1);
	while(1) 
	{	//the main player loop
		handle_gravity();
		handle_movement();
		handle_camera();
		handle_animation(1);
		wait(1);
	}
}

function handle_movement() 
{
	tempV.x = -1000;
	tempV.y = 0;
	my.moving = 0;
	if(key_w == 1 && key_s == 0 && key_a == 0 && key_d == 0)	tempV.x = camera.pan;
	if(key_s == 1 && key_w == 0 && key_a == 0 && key_d == 0)	tempV.x = camera.pan + 180;
	if(key_a == 1 && key_s == 0 && key_w == 0 && key_d == 0)	tempV.x = camera.pan + 90;
	if(key_d == 1 && key_s == 0 && key_a == 0 && key_w == 0)	tempV.x = camera.pan - 90;
	if(key_w == 1 && key_a == 1 && key_d == 0 && key_s == 0)	tempV.x = camera.pan + 45;
	if(key_w == 1 && key_d == 1 && key_a == 0 && key_s == 0)	tempV.x = camera.pan - 45;
	if(key_s == 1 && key_a == 1 && key_d == 0 && key_w == 0)	tempV.x = camera.pan + 135;
	if(key_s == 1 && key_d == 1 && key_a == 0 && key_w == 0)	tempV.x = camera.pan - 135;
   if(key_cuu == 1 && key_cud == 0 && key_cul == 0 && key_cur == 0)	tempV.x = camera.pan;
	if(key_cud == 1 && key_cuu == 0 && key_cul == 0 && key_cur == 0)	tempV.x = camera.pan + 180;
	if(key_cul == 1 && key_cud == 0 && key_cuu == 0 && key_cur == 0)	tempV.x = camera.pan + 90;
	if(key_cur == 1 && key_cud == 0 && key_cur == 0 && key_cuu == 0)	tempV.x = camera.pan - 90;
	if(key_cuu == 1 && key_cul == 1 && key_cud == 0 && key_cud == 0)	tempV.x = camera.pan + 45;
	if(key_cuu == 1 && key_cur == 1 && key_cul == 0 && key_cud == 0)	tempV.x = camera.pan - 45;
	if(key_cud == 1 && key_cul == 1 && key_cur == 0 && key_cuu == 0)	tempV.x = camera.pan + 135;
	if(key_cud == 1 && key_cur == 1 && key_cul == 0 && key_cuu == 0)	tempV.x = camera.pan - 135;	
	if(tempV.x != -1000) 
	{
		my.moving = 1;
		if(key_shift == 1)	tempV.y = 10 * time_step;  
		else						tempV.y = 15 * time_step; 
	}
	//
	if(my.movement_mode==0)
	{
		my.move_x = fcos(tempV.x, tempV.y);
		my.move_y = fsin(tempV.x, tempV.y);
	}
	else if((my.movement_mode==1)||(my.movement_mode==2))
	{
		tempV.y = fsin((my.animate * 1.2) + 45,15 * time_step);
		my.move_x = fcos(my.pan, tempV.y);
		my.move_y = fsin(my.pan, tempV.y);
		tempV.y = 0;
		//NextLine: if we need to rotate whilst attacking (the player is pressing keys to rotate)
		if(tempV.x != -1000) 	tempV.y = 1;
	}
	//
	c_move(my, nullvector, my.move_x, USE_BOX | IGNORE_PASSABLE | GLIDE);
	result = -my.z_offset + c_trace(vector(my.x,my.y,my.z - my.z_offset), vector(my.x,my.y,my.z - 4000), IGNORE_ME | IGNORE_PASSABLE | USE_BOX);
	result = clamp(result, -150, 150);
	if(result < 0) 	{	my.z -= result;	my.velocity_z = 0;	}
	//
	if(target_enemy == NULL) 
	{	if(tempV.y > 0)	rotate_entity(tempV.x, 30); 	}
	else
	{
		vec_diff(tempV2.x, target_enemy.x, my.x);
		vec_to_angle(tempA2.pan, tempV2.x);
		rotate_entity(tempA2.pan,30);
	}
	//
	if(my.movement_mode == 0) 
	{
		my.gravity = 6;
		if(my.move_x != 0 || my.move_y != 0) 
		{	//ifwe are moving
			if(my.animblend == stand) 
			{	//ifour current animation is stand
				if(key_shift == 1)	my.blendframe = walk;
				else						my.blendframe = run;
			}
			if(my.animblend == run && key_shift == 1)		my.blendframe = walk;
			if(my.animblend == walk && key_shift == 0)	my.blendframe = run;
		} 
		else
		{
			if(my.animblend > stand && my.animblend != jump && my.animblend != fall) 
			{	//if we arn't moving and our current animation is walk or run, blend and cycle the stand animation
				my.blendframe = stand;
			}
		}
		if(mouse_left == 0 && mouse_left_press == 1)		mouse_left_press = 0;
		if(mouse_left == 1 && mouse_left_press == 0 && my.animblend >= stand) 
		{
			mouse_left_press = 1;
			my.blendframe = attack_a;
			if(my.jumping_mode == 1) 	airborne_attack = 1;
			else								airborne_attack = 0;
			my.movement_mode = 1;
			combo_continue = 0;
		}
		if(mouse_right == 0 && mouse_right_press == 1)	mouse_right_press = 0;
		if(mouse_right == 1 && mouse_right_press == 0) 
		{
			if(player_lock_on == 0) 
			{
				c_scan(player.x, player.pan, vector(360,180,250), SCAN_ENTS | SCAN_LIMIT | IGNORE_ME);
				if(you != NULL) 
				{
					if(you.entity_type == 2) 
					{	//make sure you've scanned an enemy
						player_lock_on = 1;
						target_enemy = you;
					}
				}
			} 
			else
			{
				player_lock_on = 0;
				target_enemy = NULL;
			}
			mouse_right_press = 1;
		}
	}
	//
	if(my.movement_mode == 1) 
	{
		if(my.jumping_mode != 10)										my.jumping_mode = 0;
		else if(my.animate >= 60 && my.animblend >= stand)		my.jumping_mode = 0;
		//
		if(mouse_left == 0 && mouse_left_press == 1)
			mouse_left_press = 0;
		if(mouse_left == 1 && mouse_left_press == 0 && my.animate >= 30 && combo_continue == 0) 
		{	mouse_left_press = 1; combo_continue = 1; }
	}
	//
	if(my.movement_mode == 2) 
	{
		my.jumping_mode = 0;
		if(mouse_left == 0 && mouse_left_press == 1)
			mouse_left_press = 0; 
		if(mouse_left == 1 && mouse_left_press == 0 && my.animate >= 30 && combo_continue == 0) 
		{	mouse_left_press = 1; combo_continue = 1; }
	}
}

function handle_gravity() 
{
	result = -my.z_offset + c_trace(vector(my.x,my.y,my.z - my.z_offset), vector(my.x,my.y,my.z - 4000), IGNORE_ME | IGNORE_PASSABLE | USE_BOX );
	result = clamp(result, -150, 150);
	if(result < 3) 
	{
		if(my.jumping_mode == 0) 
		{
			my.force_z = -1 * result;
			if(key_space == 0 && space_press == 1) 			space_press = 0;
			if(key_space == 1 && space_press == 0 && my.movement_mode == 0 && my.animblend >= stand && my.animblend != jump && my.animblend != fall) 
			{
				space_press = 1;
				my.jumping_mode = 1;
				my.force_z = 25;
				my.blendframe = jump;
				my.animate2 = 0;
				my.animblend = blend;
			}
	   }
      if(my.jumping_mode == 2 || my.jumping_mode == 3)   my.jumping_mode = 0;
   } 
   else
   {

   ////////////////////////////////// vvvvv spliced this code
   if(my.jumping_mode == 1)
   {
      if(key_space == 0 && space_press == 1)         space_press = 0;
      if(key_space == 1 && space_press == 0 && abs(my.velocity_z) <= 10)  //section of jump where double jump is available play with 10
      {
         space_press = 1;
         my.jumping_mode = 2;
         my.force_z = 25;
         my.velocity_z = 0;
         my.blendframe = jump;
         my.animate2 = 0;
         my.animblend = blend;
      }
   }
   ////////////////////////////////// ^^^^^ spliced this code

   if(my.jumping_mode == 2) 
   {
      if(result > 120)
         {
				my.animate = 60;
				my.jumping_mode = 3;
			} 
			else
				my.jumping_mode = 0;
		}
		if(my.jumping_mode == 3 && result <= 120)		my.jumping_mode = 0;
		if(my.jumping_mode == 0 && my.movement_mode == 0) 
		{
			if(result > 120 && my.animblend >= stand && my.animblend != jump && my.animblend != fall) 
			{
				my.jumping_mode = 3;
				my.blendframe = fall;
				my.animate2 = 0;
				my.animblend = blend;
			}
		}
		my.force_z -= my.gravity * time_step;
		my.force_z =  maxv(-30, my.force_z);
		if(my.movement_mode == 2)		my.force_z = 0;
	}
 	my.velocity_z += (time_step * my.force_z) - (minv(time_step*0.7, 1) * my.velocity_z);
	my.move_z = my.velocity_z * time_step;
}

//////////////////////////////
//Stable/rigid camera collision
//////////////////////////////
function handle_camera() 
{
	camera_distance -= mickey.z * time_step;
	camera_distance = clamp(camera_distance, 50, 500);
	camera.pan -=  mouse_force.x * 12 * time_step;
	camera.tilt += mouse_force.y * 8 * time_step;
	camera.tilt = clamp(camera.tilt, -30, 10);
	temp = fcos(camera.tilt, -camera_distance);
	vec_set(camera.x, vector(my.x + fcos(camera.pan, temp),my.y + fsin(camera.pan, temp),my.z + 20 + fsin(camera.tilt, -camera_distance)));

	vec_diff(tempV.x, camera.x, my.x); //find the vector from the player to the camera
	vec_normalize(tempV.x, 16); //get the magnitude of it's vector to 16 quants and store it in temp
	vec_add(tempV.x, camera.x); //add the vector (from player to camera) of a magnitude of 16 quants and add it to the camera's position.

	result = c_trace(my.x, tempV.x, IGNORE_ME|IGNORE_PASSABLE|IGNORE_MODELS); //trace from the player to 16 quants behind the camera.
	if(result > 0) 
	{
		vec_diff(tempV.x, my.x, target.x); //find the vector from the point the trace hit to the player
		vec_normalize(tempV.x, 16); //get the magnitude of this vector to 16 quants and store in temp
		vec_set(camera.x, target.x); //place the camera at the trace hit point
		vec_add(camera.x, tempV.x); //move the camera away from the wall by the vector temp, 16 quants towards the player
	}//start the alpha fade on the character for zooming in and out ***********************
	if(fade_toggle == 1)	{
		
				vec_diff(tempV.x, my.x, camera.x);
				if(fade_start > 0) {	
				 
		  			tempV.x = vec_length(tempV.x); // distance from camera to target
		  			if(tempV.x < fade_start) {
		  				
				   	   set(my, TRANSLUCENT); // fade to zero depending distance to fade end
			   		   reset(my, SHADOW);
	   				//NOTE: use 1st max to avoid negative alpha
	   				//			use 2nd max to avoid divide by zero
	   			   	my.alpha = 100 * maxv(0, ((tempV.x - fade_end) / maxv(1,(fade_start - fade_end))));
	  				}
	  				else {
	  					
			    		reset(my, TRANSLUCENT);
			    		set(my, SHADOW);
			  		}
 		  		}//endif fade_start
   		}//endif fade_toggle == 1
}//endfunction


//////////////////////////////
//Smooth camera collision
//////////////////////////////
/*function handle_camera() 
{
	camera_pan -= mouse_force.x * 12 * time_step;
	camera_tilt += mouse_force.y * 8 * time_step;
	camera_tilt = clamp(camera_tilt, -30, 10);

	camera.pan = camera_pan;
	temp = fcos(camera_tilt,-camera_distance);
	vec_set(camera_move_to.x, vector(my.x + fcos(camera.pan, temp), my.y + fsin(camera.pan, temp), my.z + 20 + fsin(camera_tilt, -camera_distance)));

	temp = minv(1,0.5 * time_step); //changing 0.5 will change how fast the camera moves, at 1 places us at target, this value is what allows the smooth movement
	camera.x += temp*(camera_move_to.x - camera.x);
	camera.y += temp*(camera_move_to.y - camera.y);
	camera.z += temp*(camera_move_to.z - camera.z);

	vec_diff(tempV.x, camera.x, my.x);
	vec_normalize(tempV.x, 16);
	vec_add(tempV.x, camera.x);

	if(c_trace(my.x, tempV.x, IGNORE_ME|IGNORE_PASSABLE|IGNORE_MODELS) > 0) 
	{
		vec_diff(tempV.x, my.x, target.x);
		vec_normalize(tempV.x, 16);
		vec_set(camera.x, target.x);
		vec_add(camera.x, tempV.x);
	}

	vec_diff(tempV.x, my.x, camera.x);
	vec_to_angle(camera.pan, tempV.x);
}*/

function rotate_entity(var rotate_angle, var rotate_speed) 
{
	if(my.pan == rotate_angle)		return;
	result = ang(rotate_angle - my.pan);
	if(result > 0)	my.pan += rotate_speed * time_step;
	if(result < 0)	my.pan -= rotate_speed * time_step; 
	if(ang(rotate_angle - my.pan) < 0 && result > 0)	my.pan = rotate_angle; 
	if(ang(rotate_angle - my.pan) > 0 && result < 0)	my.pan = rotate_angle; 
}

function handle_hand_collision()
{
	vec_for_vertex(tempV.x, player, 1146); 	//thumb tip
	vec_for_vertex(tempV2.x, player, 1144); 	//thumb joint
	result = c_trace(tempV.x, tempV2.x, IGNORE_ME | IGNORE_PASSABLE | USE_BOX);
	if(you != NULL) 
	{
		if(you.entity_type == 2 && you.hit_by_player == 0) 
		{
			if(airborne_attack == 1 && my.animblend == attack_a)		my.movement_mode = 2;
			you.hit_by_player = 2;
			if(target_enemy == NULL)				{ target_enemy = you; player_lock_on = 1; }
		}
	}
	wait(1);//added this because I was crashing to desktop with repeated mouseclicks **************************
}

function handle_sword_collision()
{
	you = NULL;
	if(player_weapon==NULL)		{	handle_hand_collision();	return;	}
	vec_for_vertex(tempV.x, player_weapon, 274); //sword base
	vec_for_vertex(tempV2.x, player_weapon, 54); //sword tip
	result = c_trace(tempV.x, tempV2.x, IGNORE_ME | IGNORE_PASSABLE | USE_BOX);
	if(you != NULL) 
	{
		if(you.entity_type == 2 && you.hit_by_player == 0) 
		{
			if(airborne_attack == 1 && my.animblend == attack_a)		my.movement_mode = 2;
			you.hit_by_player = 1;
			if(target_enemy == NULL)				{ target_enemy = you; player_lock_on = 1; }
		}
	}
	wait(1);//added this wait because I was crashing to desktop with repeated mouse clicks*********************
}
 




Attached Files
player.rar (88 downloads)
Last edited by paracharlie; 06/17/09 20:10. Reason: updated player.rar

A8 Commercial