diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index b7d6fb12..f4c0e3ff 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -179,6 +179,8 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) case SV_WELCOME: joining = getint(p); + player1->resetspec(); + resetcamera(); break; case SV_CLIENT: @@ -773,8 +775,8 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) watchingdemo = demoplayback = getint(p)!=0; if(demoplayback) { + player1->resetspec(); player1->state = CS_SPECTATE; - player1->spectatemode = SM_NONE; } else { @@ -782,7 +784,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) loopv(players) zapplayer(players[i]); clearvote(); player1->state = CS_ALIVE; - player1->spectatemode = SM_NONE; + player1->resetspec(); } player1->clientnum = getint(p); break; diff --git a/source/src/entity.h b/source/src/entity.h index bec613c9..0c5528b8 100644 --- a/source/src/entity.h +++ b/source/src/entity.h @@ -343,7 +343,6 @@ struct playerent : dynent, playerstate int spectatemode, followplayercn; int eardamagemillis; int respawnoffset; - //virtual float eyeheight const { return (state==CS_DEAD || state==CS_SPECTATE) && spectatemode==SM_FLY ? 1.0f : physent::eyeheight; } bool allowmove() { return state!=CS_DEAD || spectatemode==SM_FLY; } weapon *weapons[NUMGUNS]; @@ -409,6 +408,12 @@ struct playerent : dynent, playerstate if(gun==GUN_GRENADE && damage > 50) eardamagemillis = lastmillis+damage*100; } + void resetspec() + { + spectatemode = SM_NONE; + followplayercn = -1; + } + void respawn() { dynent::reset(); @@ -419,8 +424,7 @@ struct playerent : dynent, playerstate lastattackweapon = NULL; attacking = false; weaponchanging = 0; - spectatemode = SM_NONE; - followplayercn = -1; // flowtron : default to non-valid cn + resetspec(); eardamagemillis = 0; eyeheight = maxeyeheight; } diff --git a/source/src/protos.h b/source/src/protos.h index f71acba5..416ef6f5 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -210,6 +210,7 @@ extern void updatefrommaster(int force); // rendergl extern glmatrixf mvmatrix, projmatrix, clipmatrix, mvpmatrix, invmvmatrix, invmvpmatrix; +extern void resetcamera(); extern void gl_checkextensions(); extern void gl_init(int w, int h, int bpp, int depth, int fsaa); diff --git a/source/src/rendergl.cpp b/source/src/rendergl.cpp index 1905d43e..990cd8b1 100644 --- a/source/src/rendergl.cpp +++ b/source/src/rendergl.cpp @@ -126,7 +126,7 @@ void gl_init(int w, int h, int bpp, int depth, int fsaa) inittmus(); - camera1 = player1; + resetcamera(); } FVAR(polygonoffsetfactor, -1e4f, -3.0f, 1e4f); @@ -433,6 +433,11 @@ int farplane; physent *camera1 = NULL; +void resetcamera() +{ + camera1 = player1; +} + void recomputecamera() { if((player1->state==CS_SPECTATE || player1->state==CS_DEAD) && !editmode) @@ -453,7 +458,7 @@ void recomputecamera() break; } case SM_FLY: - camera1 = player1; + resetcamera(); camera1->eyeheight = 1.0f; break; case SM_FOLLOW1ST: @@ -499,7 +504,7 @@ void recomputecamera() } else { - camera1 = player1; + resetcamera(); } }