I'll leave the cameras to someone else, as my vector maths is terrible.
And the hang I havent any idea on, I think its a big bit beyond the scope of this script.
But, here is some code to get the double-jump in, splice it in at around line 250 in PLAYER.c The the abs(my.velocity_z) <= 10 is the number to play with to set the time the double jump is available. Its currently set to about the top 20% of the jump. So double jump wont react unless you hit space when you are 'almost' at the top, or just starting to come back down. It doesnt react at all to falling from a height.
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*********************
}
Last edited by paracharlie; 06/17/0920:10. Reason: updated player.rar
A8 Commercial
Re: [REQ] converting a code to lite-c
[Re: paracharlie]
#272284 06/17/0909:1806/17/0909:18