diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index 9d84876f..2fd8b8e2 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -481,6 +481,7 @@ void selfdamage(int damage, int actor, dynent *act) player1->lifesequence++; player1->attacking = false; player1->state = CS_DEAD; + player1->oldpitch = player1->pitch; player1->pitch = 0; player1->roll = 60; playsound(S_DIE1+rnd(2)); diff --git a/source/src/cube.h b/source/src/cube.h index a369ec02..c47cfdf9 100644 --- a/source/src/cube.h +++ b/source/src/cube.h @@ -131,7 +131,8 @@ enum // md3 animations struct dynent // players & monsters { vec o, vel; // origin, velocity - float yaw, pitch, roll; // used as vec in one place + float yaw, pitch, roll; // used as vec in one place + float oldpitch; float maxspeed; // cubes per second, 24 for player bool outsidemap; // from his eyes bool inwater; diff --git a/source/src/main.cpp b/source/src/main.cpp index 3f7643de..4a27e4c8 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -180,7 +180,10 @@ int main(int argc, char **argv) exec("config/sounds.cfg"); exec("config/servers.cfg"); exec("config/autoexec.cfg"); - //exec("config/default_map_settings.cfg"); + //exec("config/default_map_settings.cfg"); + + log("base models"); + loadweapons(); log("localconnect"); localconnect(); diff --git a/source/src/protos.h b/source/src/protos.h index e92cd014..d5d8abbb 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -201,7 +201,8 @@ extern void rendermodel(char *mdl, int frame, int range, int tex, float rad, flo extern mapmodelinfo &getmminfo(int i); // rendermd3 -extern void rendermd3gun(); +extern void rendermd3gun(); +extern void loadweapons(); // server extern void initserver(bool dedicated, bool listen, int uprate, char *sdesc, char *ip, char *master, char *passwd); @@ -230,7 +231,8 @@ extern void createrays(vec &from, vec &to); extern void moveprojectiles(float time); extern void projreset(); extern dynent *playerincrosshair(); -extern int reloadtime(int gun); +extern int reloadtime(int gun); +extern int attackdelay(int gun); extern int kick_rot(int gun); extern int kick_back(int gun); diff --git a/source/src/rendergl.cpp b/source/src/rendergl.cpp index 5a71f98b..7dc818da 100644 --- a/source/src/rendergl.cpp +++ b/source/src/rendergl.cpp @@ -251,11 +251,11 @@ void transplayer() float t = (lastmillis-player1->lastaction)/1000.0f; if(t >= 1.6f) t = 1.6f; - player1->pitch = (float) sin(t)*-90.0f; + player1->pitch = (float) sin(t)*(-45.0f-player1->oldpitch)+player1->oldpitch; glRotated(player1->pitch,-1.0,0.0,0.0); glRotated(player1->yaw,0.0,1.0,0.0); - glTranslated(-player1->o.x, player1->eyeheight-sin(t)*7.0f-player1->o.z, -player1->o.y); + glTranslated(-player1->o.x, player1->eyeheight-sin(t)*7.0f-player1->o.z, -player1->o.y); } else { diff --git a/source/src/rendermd3.cpp b/source/src/rendermd3.cpp index 74dafc0f..d1e6f31d 100644 --- a/source/src/rendermd3.cpp +++ b/source/src/rendermd3.cpp @@ -394,8 +394,6 @@ void loadweapons() } }; -COMMAND(loadweapons, ARG_NONE); - void rendermd3gun() { if(firstweapon >= 0) @@ -406,25 +404,28 @@ void rendermd3gun() { weapon->animstate = new md3state(); weapon->animstate->anim = MDL_GUN_RELOAD; + float percent_done = (float)(lastmillis-player1->lastaction)*100.0f/reloadtime(player1->gunselect); + if(percent_done >= 100) percent_done = 100; + weapon->draw(player1->o.x, player1->o.z, player1->o.y, player1->yaw + 90, player1->pitch-(sin((float)(percent_done*2/100.0f*90.0f)*PI/180.0f)*90), 1.0f); } else { weapon->animstate = new md3state(); weapon->animstate->anim = MDL_GUN_IDLE; + float kick = 0.0f; + if(player1->gunselect==player1->lastattackgun) + { + int percent_done = (lastmillis-player1->lastaction)*100/attackdelay(player1->gunselect); + if(percent_done > 100) percent_done = 100.0; + // f(x) = -sin(x-1.5)^3 + kick = -sin(pow((1.5f/100*percent_done)-1.5f,3)); + }; + vdist(dist, unitv, player1->o, worldpos); + vdiv(unitv, dist); + float k_rot = kick_rot(player1->gunselect)*kick; + float k_back = kick_back(player1->gunselect)*kick/10; + weapon->draw(player1->o.x-unitv.x*k_back, player1->o.z-unitv.z*k_back, player1->o.y-unitv.y*k_back, player1->yaw + 90, player1->pitch+k_rot, 1.0f); }; - float kick = 0.0f; - if(player1->gunselect==player1->lastattackgun) - { - int percent_done = (lastmillis-player1->lastaction)*100/reloadtime(player1->gunselect); - if(percent_done > 100) percent_done = 100.0; - // f(x) = -sin(x-1.5)^3 - kick = -sin(pow((1.5f/100*percent_done)-1.5f,3)); - }; - vdist(dist, unitv, player1->o, worldpos); - vdiv(unitv, dist); - float k_rot = kick_rot(player1->gunselect)*kick; - float k_back = kick_back(player1->gunselect)*kick/10; - weapon->draw(player1->o.x-unitv.x*k_back, player1->o.z-unitv.z*k_back, player1->o.y-unitv.y*k_back, player1->yaw + 90, player1->pitch+k_rot, 1.0f); }; }; diff --git a/source/src/weapon.cpp b/source/src/weapon.cpp index e279d875..a2452178 100644 --- a/source/src/weapon.cpp +++ b/source/src/weapon.cpp @@ -148,7 +148,8 @@ void reload() COMMAND(reload,ARG_NONE); -int reloadtime(int gun) { return guns[gun].attackdelay; }; +int reloadtime(int gun) { return guns[gun].reloadtime; }; +int attackdelay(int gun) { return guns[gun].attackdelay; }; int kick_rot(int gun) { return guns[gun].mdl_kick_rot; }; int kick_back(int gun) { return guns[gun].mdl_kick_back; };