action phys_actor()
{
ent_playerphysic = me;
set(me,INVISIBLE | PHYSIC_DUMMY);
pXent_settype(me,PH_RIGID,PH_BALL);
pXent_setmass(me,76);
VECTOR temp;
VECTOR mov;
VECTOR vel;
on_space = phys_actor_jump;
on_mouse_left = actor_weaponprimary;
on_mouse_right = actor_weaponsecondary;
on_r = actor_weaponreload;
on_1 = actor_getweapon1;
on_2 = actor_getweapon2;
on_3 = actor_getweapon3;
var time = 0;
my.CAMERA_PAN = camera.pan;
my.CAMERA_TILT = camera.tilt;
var fall_damage_last_z = my.z;
var fall_damage_distance = 0;
var fall_damage_last_distance = 0;
var fall_damage_testtime = 1;
var movement_time = 0;
while(me)
{
my.CAMERA_PAN -= 2 * mouse_force.x / (1 + 3 * var_sniper_zoomed);
my.CAMERA_TILT = clamp(my.CAMERA_TILT + 2 * mouse_force.y / (1 + 3 * var_sniper_zoomed),-90,90);
time += 0.125 * time_step;
camera.pan = my.CAMERA_PAN + 0.5 * sin(0.125 * time);
camera.tilt = my.CAMERA_TILT + 0.5 * cos(0.25 * time);
switch(var_weapon_selected)
{
case WEAPON_SNIPER:
ent_weapon_sniper.flags2 |= SHOW;
ent_weapon_pistol.flags2 &= ~SHOW;
ent_weapon_knife.flags2 &= ~SHOW;
if(var_sniper_bullets > 0)
{
pan_weapon_sniperbullets.size_x = var_sniper_bullets * 16;
set(pan_weapon_sniperbullets,SHOW);
}
else
{
reset(pan_weapon_sniperbullets,SHOW);
}
reset(pan_weapon_pistolbullets,SHOW);
break;
case WEAPON_PISTOL:
ent_weapon_sniper.flags2 &= ~SHOW;
ent_weapon_pistol.flags2 |= SHOW;
ent_weapon_knife.flags2 &= ~SHOW;
var_sniper_zoomed = 0;
reset(pan_weapon_sniperbullets,SHOW);
if(var_pistol_bullets > 0)
{
pan_weapon_pistolbullets.size_x = var_pistol_bullets * 17;
set(pan_weapon_pistolbullets,SHOW);
}
else
{
reset(pan_weapon_pistolbullets,SHOW);
}
break;
case WEAPON_KNIFE:
ent_weapon_sniper.flags2 &= ~SHOW;
ent_weapon_pistol.flags2 &= ~SHOW;
ent_weapon_knife.flags2 |= SHOW;
var_sniper_zoomed = 0;
reset(pan_weapon_sniperbullets,SHOW);
reset(pan_weapon_pistolbullets,SHOW);
break;
case WEAPON_EMPTY:
ent_weapon_sniper.flags2 &= ~SHOW;
ent_weapon_pistol.flags2 &= ~SHOW;
ent_weapon_knife.flags2 &= ~SHOW;
var_sniper_zoomed = 0;
reset(pan_weapon_sniperbullets,SHOW);
reset(pan_weapon_pistolbullets,SHOW);
break;
}
if(var_sniper_zoomed)
{
var_sniper_zoomfac = clamp(var_sniper_zoomfac - mickey.z / 60,5,40);
}
else
{
var_weapon_selected = cycle(var_weapon_selected - mickey.z / 120,0,4);
}
if(key_w || key_s || key_a || key_d)
{
vec_set(mov,vector((key_w - key_s) * 150 * time_step,(key_a - key_d) * 100 * time_step,0));
vec_rotate(mov,vector(camera.pan,0,0));
pXent_getvelocity(me,vel,nullvector);
vel.x = -1 * vel.x * time_step + mov.x;
vel.y = -1 * vel.y * time_step + mov.y;
vel.z = 0;
pXent_addvelcentral(me,vel);
pXent_addvelcentral(me,mov);
movement_time = 4;
}
else
{
pXent_getvelocity(me,vel,nullvector);
vel.x = -1 * vel.x * time_step;
vel.y = -1 * vel.y * time_step;
if(c_trace(ent_playerphysic.x,vector(ent_playerphysic.x,ent_playerphysic.y,ent_playerphysic.z - 20),IGNORE_PASSABLE | IGNORE_ME) && !phys_actor_jumping)
{
vel.z = -1 * vel.z * time_step;
}
else
{
vel.z = 0;
}
pXent_addvelcentral(me,vel);
movement_time -= time_step;
}
if(movement_time < 0)
{
pXent_setbodyflag(me,NX_BF_FROZEN_POS_X,1);
pXent_setbodyflag(me,NX_BF_FROZEN_POS_Y,1);
}
else
{
pXent_setbodyflag(me,NX_BF_FROZEN_POS_X,0);
pXent_setbodyflag(me,NX_BF_FROZEN_POS_Y,0);
}
vec_set(ent_playerdummy.x,my.x);
ent_playerdummy.z += 22;
vec_set(camera.x,ent_playerdummy.x);
camera.z += 32;
ent_playerdummy.pan = camera.pan;
if(var_sniper_zoomed)
{
camera.arc = var_sniper_zoomfac;
set(pan_weapon_sniperscope,SHOW);
//set(pan_weapon_snipertarget,SHOW);
VECTOR target_pos;
weapon_sniper_gethitpoint(target_pos,camera.x,camera.pan);
vec_to_screen(target_pos,camera);
pan_weapon_snipertarget.pos_x = target_pos.x - 7;
pan_weapon_snipertarget.pos_y = target_pos.y - 7;
var scale_x = screen_size.x / bmap_width(pan_weapon_sniperscope.bmap);
var scale_y = screen_size.y / bmap_height(pan_weapon_sniperscope.bmap);
pan_weapon_sniperscope.scale_x = scale_x;
pan_weapon_sniperscope.scale_y = scale_y;
ent_weapon_sniper.flags2 &= ~SHOW;
VECTOR from;
VECTOR to;
vec_set(from,camera.x);
vec_set(to,vector(var_sniper_range,0,0));
vec_rotate(to,camera.pan);
vec_add(to,camera.x);
var dist = c_trace(from,to,IGNORE_PASSABLE | IGNORE_ME);
VECTOR center;
vec_set(center,screen_size.x);
vec_scale(center,0.5);
draw_line(vector(center.x - 350 * scale_x, center.y,0),COLOR_RED,0);
draw_line(vector(center.x - 350 * scale_x, center.y,0),COLOR_RED,100);
draw_line(vector(center.x - 25, center.y,0),COLOR_RED,100);
draw_line(vector(center.x - 25, center.y,0),COLOR_RED,0);
draw_line(vector(center.x + 25, center.y,0),COLOR_RED,0);
draw_line(vector(center.x + 25, center.y,0),COLOR_RED,100);
draw_line(vector(center.x + 350 * scale_x, center.y,0),COLOR_RED,100);
draw_line(vector(center.x + 350 * scale_x, center.y,0),COLOR_RED,0);
draw_line(vector(center.x,center.y - 350 * scale_y,0),COLOR_RED,0);
draw_line(vector(center.x,center.y - 350 * scale_y,0),COLOR_RED,100);
draw_line(vector(center.x,center.y - 25,0),COLOR_RED,100);
draw_line(vector(center.x,center.y - 25,0),COLOR_RED,0);
draw_line(vector(center.x,center.y + 25,0),COLOR_RED,0);
draw_line(vector(center.x,center.y + 25,0),COLOR_RED,100);
draw_line(vector(center.x,center.y + 350 * scale_y,0),COLOR_RED,100);
draw_line(vector(center.x,center.y + 350 * scale_y,0),COLOR_RED,0);
draw_text(str_printf(NULL,"Distanz: %im",(int)dist / 64),center.x + 25,center.y - 17,COLOR_WHITE);
VECTOR temp;
vec_set(temp,vWind);
vec_rotate(temp,vector(-camera.pan,0,0));
var debug_wind = center.x - temp.y * 4;
draw_line(vector(center.x,16,0),COLOR_BLUE,0);
draw_line(vector(center.x,16,0),NULL,100);
draw_line(vector(center.x,32,0),COLOR_BLUE,100);
draw_line(vector(center.x,32,0),COLOR_BLUE,0);
draw_line(vector(debug_wind,16,0),COLOR_GREEN,0);
draw_line(vector(debug_wind,16,0),NULL,100);
draw_line(vector(debug_wind,32,0),COLOR_GREEN,100);
draw_line(vector(debug_wind,32,0),COLOR_GREEN,0);
}
else
{
camera.arc = 60;
reset(pan_weapon_sniperscope,SHOW);
reset(pan_weapon_snipertarget,SHOW);
}
var_weapon_shottime -= time_step;
if(fall_damage_testtime < 0)
{
fall_damage_distance = my.z - fall_damage_last_z;
if((fall_damage_distance - fall_damage_last_distance) > 35)
ent_playerdummy.HEALTH -= 4;
fall_damage_last_z = my.z;
fall_damage_last_distance = fall_damage_distance;
fall_damage_testtime = 2;
}
fall_damage_testtime -= time_step;
wait(1);
}
}