2
VARP(swayspeeddiv, 1, 105, 1000);
3
VARP(swaymovediv, 1, 200, 1000);
4
VARP(swayupspeeddiv, 1, 105, 1000);
5
VARP(swayupmovediv, 1, 200, 1000);
10
static int swaymillis, lastsway;
16
weaponmove() : k_rot(0), kick(0), anim(0), basetime(0) { pos.x = pos.y = pos.z = 0.0f; }
18
void calcmove(vec aimdir, int lastaction)
25
float k = pow(0.7f, (lastmillis-lastsway)/10.0f);
28
dv.mul((1-k)/max(player1->vel.magnitude(), player1->maxspeed));
36
if(player1->onfloor || player1->onladder || player1->inwater) swaymillis += lastmillis-lastsway;
37
lastsway = lastmillis;
39
if(player1->weaponchanging)
41
anim = ANIM_GUN_RELOAD;
42
basetime = player1->weaponchanging;
43
float progress = clamp((lastmillis - player1->weaponchanging)/(float)weapon::weaponchangetime, 0.0f, 1.0f);
44
k_rot = -90*sinf(progress*M_PI);
46
else if(player1->weaponsel->reloading)
48
anim = ANIM_GUN_RELOAD;
49
basetime = player1->weaponsel->reloading;
50
float reloadtime = (float)player1->weaponsel->info.reloadtime,
51
progress = clamp((lastmillis - player1->weaponsel->reloading)/reloadtime, 0.0f, clamp(1.0f - (player1->lastaction + player1->weaponsel->gunwait - lastmillis)/reloadtime, 0.5f, 1.0f));
52
k_rot = -90*sinf(progress*M_PI);
57
basetime = lastaction;
59
int timediff = lastmillis-lastaction,
60
animtime = min(player1->weaponsel->gunwait, (int)player1->weaponsel->info.attackdelay);
62
float progress = 0.0f;
65
if(player1->weaponsel==player1->lastattackweapon)
67
progress = max(0.0f, min(1.0f, timediff/(float)animtime));
68
// f(x) = -sin(x-1.5)^3
69
kick = -sinf(pow((1.5f*progress)-1.5f,3));
70
if(player1->crouching) kick *= 0.75f;
71
if(player1->lastaction) anim = player1->weaponsel->modelanim();
74
if(player1->weaponsel->info.mdl_kick_rot || player1->weaponsel->info.mdl_kick_back)
76
k_rot = player1->weaponsel->info.mdl_kick_rot*kick;
77
k_back = player1->weaponsel->info.mdl_kick_back*kick/10;
80
if(nosway) sway.x = sway.y = sway.z = 0;
83
float swayspeed = sinf((float)swaymillis/swayspeeddiv)/(swaymovediv/10.0f);
84
float swayupspeed = cosf((float)swaymillis/swayupspeeddiv)/(swayupmovediv/10.0f);
86
float plspeed = min(1.0f, sqrtf(player1->vel.x*player1->vel.x + player1->vel.y*player1->vel.y));
88
swayspeed *= plspeed/2;
89
swayupspeed *= plspeed/2;
94
swayupspeed = fabs(swayupspeed); // sway a semicirle only
99
sway.z *= swayupspeed;
101
if(player1->crouching) sway.mul(0.75f);
104
pos.x -= aimdir.x*k_back+sway.x;
105
pos.y -= aimdir.y*k_back+sway.y;
106
pos.z -= aimdir.z*k_back+sway.z;
111
vec weaponmove::swaydir(0, 0, 0);
112
int weaponmove::lastsway = 0, weaponmove::swaymillis = 0;
114
void preload_hudguns()
118
s_sprintfd(path)("weapons/%s", guns[i].modelname);