From f5822de9dd7f185161528e3830692ae75bbeef67 Mon Sep 17 00:00:00 2001 From: havoc Date: Sun, 4 Aug 2002 20:07:11 +0000 Subject: [PATCH] fix svc_setview git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2194 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_main.c | 2 +- cl_parse.c | 4 ++++ client.h | 5 +++++ sv_main.c | 15 +++++++++++---- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/cl_main.c b/cl_main.c index 78c41e34..6f8a666e 100644 --- a/cl_main.c +++ b/cl_main.c @@ -638,7 +638,7 @@ void CL_LerpPlayer(float frac) int i; float d; - if (cl.entitydatabase.numframes) + if (cl.entitydatabase.numframes && cl.viewentity == cl.playerentity) { cl.viewentorigin[0] = cl.viewentoriginold[0] + frac * (cl.viewentoriginnew[0] - cl.viewentoriginold[0]); cl.viewentorigin[1] = cl.viewentoriginold[1] + frac * (cl.viewentoriginnew[1] - cl.viewentoriginold[1]); diff --git a/cl_parse.c b/cl_parse.c index 039f54e2..6bbe9338 100644 --- a/cl_parse.c +++ b/cl_parse.c @@ -470,6 +470,7 @@ void CL_ParseServerInfo (void) // local state ent = &cl_entities[0]; // entire entity array was cleared, so just fill in a few fields + ent->state_current.active = true; ent->render.model = cl.worldmodel = cl.model_precache[1]; ent->render.scale = 1; ent->render.alpha = 1; @@ -1135,6 +1136,9 @@ void CL_ParseServerMessage (void) case svc_setview: cl.viewentity = MSG_ReadShort (); + // LordHavoc: assume first setview recieved is the real player entity + if (!cl.playerentity) + cl.playerentity = cl.viewentity; break; case svc_lightstyle: diff --git a/client.h b/client.h index 2457c2f9..7d37ebcc 100644 --- a/client.h +++ b/client.h @@ -384,7 +384,12 @@ typedef struct char levelname[40]; // cl_entitites[cl.viewentity] = player int viewentity; + // the real player entity (normally same as viewentity, + // different than viewentity if mod uses chasecam or other tricks) + int playerentity; + // max players that can be in this game int maxclients; + // type of game (deathmatch, coop, singleplayer) int gametype; // refresh related state diff --git a/sv_main.c b/sv_main.c index 1dc26376..3f17d411 100644 --- a/sv_main.c +++ b/sv_main.c @@ -881,9 +881,16 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg) Mod_CheckLoaded(sv.worldmodel); // find the client's PVS + // the real place being tested from VectorAdd (clent->v.origin, clent->v.view_ofs, testeye); pvs = SV_FatPVS (testeye); - EntityFrame_Clear(&entityframe, testeye); + + // the place being reported (to consider the fact the client still + // applies the view_ofs[2], so we have to only send the fractional part + // of view_ofs[2], undoing what the client will redo) + VectorCopy (testeye, testorigin); + testorigin[2] -= (float) ((int)(clent->v.view_ofs[2]) & 255); + EntityFrame_Clear(&entityframe, testorigin); culled_pvs = 0; culled_portal = 0; @@ -1170,7 +1177,8 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg) bits = 0; - bits |= SU_VIEWHEIGHT; + if (ent->v.view_ofs[2] != DEFAULT_VIEWHEIGHT) + bits |= SU_VIEWHEIGHT; if (ent->v.idealpitch) bits |= SU_IDEALPITCH; @@ -1244,8 +1252,7 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg) MSG_WriteByte(msg, bits >> 24); if (bits & SU_VIEWHEIGHT) - //MSG_WriteChar (msg, ent->v.view_ofs[2]); - MSG_WriteChar (msg, 0); + MSG_WriteChar (msg, ent->v.view_ofs[2]); if (bits & SU_IDEALPITCH) MSG_WriteChar (msg, ent->v.idealpitch); -- 2.39.2