X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=cl_parse.c;h=efee4d7ba798df9198308775e08cf56879418cbc;hb=72d40f74b4af7226666d862709d9046c1409a560;hp=1a85027fd76f292ef16804f73e43654e10b0a02e;hpb=3271e89128e8797d88ec86be7e283e09aa207309;p=xonotic%2Fdarkplaces.git diff --git a/cl_parse.c b/cl_parse.c index 1a85027f..efee4d7b 100644 --- a/cl_parse.c +++ b/cl_parse.c @@ -287,7 +287,7 @@ void CL_KeepaliveMessage (qboolean readmessages) sizebuf_t old; // no need if server is local and definitely not if this is a demo - if (sv.active || !cls.netcon || cls.protocol == PROTOCOL_QUAKEWORLD) + if (!cls.netcon || cls.protocol == PROTOCOL_QUAKEWORLD) return; if (readmessages) @@ -318,7 +318,7 @@ void CL_KeepaliveMessage (qboolean readmessages) msg.data = buf; msg.maxsize = sizeof(buf); MSG_WriteChar(&msg, clc_nop); - NetConn_SendUnreliableMessage(cls.netcon, &msg, cls.protocol, 10000); + NetConn_SendUnreliableMessage(cls.netcon, &msg, cls.protocol, 10000, false); } } @@ -979,6 +979,7 @@ void CL_BeginDownloads(qboolean aborteddownload) && (FS_CRCFile(csqc_progname.string, &progsize) != csqc_progcrc.integer || ((int)progsize != csqc_progsize.integer && csqc_progsize.integer != -1)) && !FS_FileExists(va("dlcache/%s.%i.%i", csqc_progname.string, csqc_progsize.integer, csqc_progcrc.integer))) { + Con_Printf("Downloading new CSQC code to dlcache/%s.%i.%i\n", csqc_progname.string, csqc_progsize.integer, csqc_progcrc.integer); Cmd_ForwardStringToServer(va("download %s", csqc_progname.string)); return; } @@ -1154,7 +1155,7 @@ void CL_BeginDownloads_f(void) void CL_StopDownload(int size, int crc) { - if (cls.qw_downloadmemory && cls.qw_downloadmemorycursize == size && CRC_Block(cls.qw_downloadmemory, size) == crc) + if (cls.qw_downloadmemory && cls.qw_downloadmemorycursize == size && CRC_Block(cls.qw_downloadmemory, cls.qw_downloadmemorycursize) == crc) { int existingcrc; size_t existingsize; @@ -1192,6 +1193,11 @@ void CL_StopDownload(int size, int crc) FS_Rescan(); } } + else if (cls.qw_downloadmemory && size) + { + Con_Printf("Download \"%s\" is corrupt (%i bytes, %i CRC, should be %i bytes, %i CRC), discarding\n", cls.qw_downloadname, size, crc, (int)cls.qw_downloadmemorycursize, (int)CRC_Block(cls.qw_downloadmemory, cls.qw_downloadmemorycursize)); + CL_BeginDownloads(true); + } if (cls.qw_downloadmemory) Mem_Free(cls.qw_downloadmemory); @@ -1440,7 +1446,7 @@ void CL_ParseServerInfo (void) i = MSG_ReadByte(); // cl.qw_spectator is an unneeded flag, cl.scores[cl.playerentity].qw_spectator works better (it can be updated by the server during the game) //cl.qw_spectator = (i & 128) != 0; - cl.playerentity = cl.viewentity = (i & 127) + 1; + cl.realplayerentity = cl.playerentity = cl.viewentity = (i & 127) + 1; cl.scores = (scoreboard_t *)Mem_Alloc(cls.levelmempool, cl.maxclients*sizeof(*cl.scores)); // get the full level name @@ -1577,6 +1583,7 @@ void CL_ParseServerInfo (void) cl.downloadcsqc = true; cl.loadbegun = false; cl.loadfinished = false; + cl.loadcsqc = true; } // check memory integrity @@ -1660,7 +1667,7 @@ void CL_MoveLerpEntityStates(entity_t *ent) VectorCopy(ent->state_current.origin, ent->persistent.neworigin); VectorCopy(ent->state_current.angles, ent->persistent.newangles); // reset animation interpolation as well - ent->render.frame = ent->render.frame1 = ent->render.frame2 = ent->state_current.frame; + ent->render.frame1 = ent->render.frame2 = ent->state_current.frame; ent->render.frame1time = ent->render.frame2time = cl.time; ent->render.framelerp = 1; // reset various persistent stuff @@ -1889,7 +1896,7 @@ void CL_ParseStatic (int large) // copy it to the current state ent->render.model = cl.model_precache[ent->state_baseline.modelindex]; - ent->render.frame = ent->render.frame1 = ent->render.frame2 = ent->state_baseline.frame; + ent->render.frame1 = ent->render.frame2 = ent->state_baseline.frame; ent->render.framelerp = 0; // make torchs play out of sync ent->render.frame1time = ent->render.frame2time = lhrandom(-10, -1); @@ -3493,7 +3500,10 @@ void CL_ParseServerMessage(void) if (cl.viewentity >= cl.max_entities) CL_ExpandEntities(cl.viewentity); // LordHavoc: assume first setview recieved is the real player entity - if (!cl.playerentity) + if (!cl.realplayerentity) + cl.realplayerentity = cl.viewentity; + // update cl.playerentity to this one if it is a valid player + if (cl.viewentity >= 1 && cl.viewentity <= cl.maxclients) cl.playerentity = cl.viewentity; break;