diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index d3fad8cbe..6424fff67 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -33,6 +33,7 @@ extern cvar_t cl_r2g; extern cvar_t r_powerupglow; extern cvar_t v_powerupshell; extern cvar_t cl_nolerp; +extern cvar_t cl_nolerp_netquake; extern cvar_t cl_gibfilter, cl_deadbodyfilter; extern int cl_playerindex; @@ -1538,6 +1539,21 @@ packet_entities_t *CL_ProcessPacketEntities(float *servertime, qboolean nolerp) return packnew; } +qboolean CL_MayLerp(void) +{ + //force lerping when playing low-framerate demos. + if (cls.demoplayback == DPB_MVD || cls.demoplayback == DPB_EZTV) + return true; +#ifdef NQPROT + if (cls.demoplayback == DPB_NETQUAKE) + return true; + + if (cls.protocol == CP_NETQUAKE) //this includes DP protocols. + return !cl_nolerp_netquake.value; +#endif + return !cl_nolerp.value; +} + void CL_LinkPacketEntities (void) { entity_t *ent; @@ -1560,7 +1576,7 @@ void CL_LinkPacketEntities (void) CL_CalcClientTime(); servertime = cl.servertime; - nolerp = !!cl_nolerp.value && cls.demoplayback != DPB_MVD && cls.demoplayback != DPB_EZTV; + nolerp = !CL_MayLerp() && cls.demoplayback != DPB_MVD && cls.demoplayback != DPB_EZTV; #ifdef NQPROT nolerp = nolerp && cls.demoplayback != DPB_NETQUAKE; #endif @@ -1882,9 +1898,7 @@ void CL_LinkPacketEntities (void) ent->forcedshader = NULL; #endif - if (cl_nolerp.value) - f = 1; - else + if (CL_MayLerp()) { //figure out the lerp factor if (cl.lerpents[s1->number].lerprate<=0) @@ -1896,6 +1910,8 @@ void CL_LinkPacketEntities (void) if (f>1) f=1; } + else + f = 1; ent->lerpfrac = 1-(cl.servertime-cl.lerpents[s1->number].lerptime)/cl.lerpents[s1->number].lerprate; if (ent->lerpfrac<0) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 769d936c7..7ef10db63 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -51,6 +51,7 @@ cvar_t cl_maxfps = SCVARF("cl_maxfps", "1000", CVAR_ARCHIVE); cvar_t cl_nopext = SCVARF("cl_nopext", "0", CVAR_ARCHIVE); cvar_t cl_pext_mask = SCVAR("cl_pext_mask", "0xffffffff"); cvar_t cl_nolerp = SCVAR("cl_nolerp", "1"); +cvar_t cl_nolerp_netquake = SCVAR("cl_nolerp_netquake", "0"); cvar_t hud_tracking_show = SCVAR("hud_tracking_show", "1"); cvar_t cfg_save_name = SCVARF("cfg_save_name", "fte", CVAR_ARCHIVE); @@ -2180,6 +2181,7 @@ void CL_ConnectionlessPacket (void) Con_Printf ("accept\n"); Validation_Apply_Ruleset(); Netchan_Setup(NS_CLIENT, &cls.netchan, net_from, cls.qport); + CL_ParseEstablished(); Con_DPrintf ("CL_EstablishConnection: connected to %s\n", cls.servername); @@ -2222,6 +2224,7 @@ client_connect: //fixme: make function } compress = cls.netchan.compress; Netchan_Setup (NS_CLIENT, &cls.netchan, net_from, cls.qport); + CL_ParseEstablished(); cls.netchan.compress = compress; #ifdef Q3CLIENT if (cls.protocol != CP_QUAKE3) @@ -2339,6 +2342,7 @@ void CLNQ_ConnectionlessPacket(void) Con_TPrintf (TLC_DUPCONNECTION); return; } + //this is the port that we're meant to respond to. net_from.port = htons((short)MSG_ReadLong()); if (MSG_ReadByte() == 1) //a proquake server adds a little extra info @@ -2348,6 +2352,7 @@ void CLNQ_ConnectionlessPacket(void) if (MSG_ReadByte() == 1) { + //its a 'pure' server. Con_Printf("ProQuake sucks\nGo play on a decent server.\n"); return; } @@ -2356,6 +2361,7 @@ void CLNQ_ConnectionlessPacket(void) Validation_Apply_Ruleset(); Netchan_Setup (NS_CLIENT, &cls.netchan, net_from, cls.qport); + CL_ParseEstablished(); cls.netchan.isnqprotocol = true; cls.netchan.compress = 0; cls.protocol = CP_NETQUAKE; @@ -2869,6 +2875,7 @@ void CL_Init (void) Cvar_Register (&cl_deadbodyfilter, "Item effects"); Cvar_Register (&cl_nolerp, "Item effects"); + Cvar_Register (&cl_nolerp_netquake, "Item effects"); Cvar_Register (&r_drawflame, "Item effects"); diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 747e2c2fa..d1096c6f9 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -33,6 +33,7 @@ int msgflags; char cl_dp_csqc_progsname[128]; int cl_dp_csqc_progssize; int cl_dp_csqc_progscrc; +int cl_dp_serverextension_download; char *svc_strings[] = @@ -298,6 +299,12 @@ qboolean CL_EnqueDownload(char *filename, char *localname, unsigned int flags) if (!(flags & DLLF_IGNOREFAILED)) { +#ifdef NQPROT + if (cls.protocol == CP_NETQUAKE) + if (!cl_dp_serverextension_download) + return false; +#endif + for (dl = cl.faileddownloads; dl; dl = dl->next) //yeah, so it failed... Ignore it. { if (!strcmp(dl->name, filename)) @@ -2213,6 +2220,15 @@ void CLQ2_ParseServerData (void) +void CL_ParseEstablished(void) +{ +#ifdef NQPROT + cl_dp_serverextension_download = false; + cl_dp_csqc_progscrc = 0; + cl_dp_csqc_progssize = 0; +#endif +} + #ifdef NQPROT //FIXME: move to header void CL_KeepaliveMessage(void){} @@ -2312,7 +2328,8 @@ void CLNQ_ParseServerData(void) //Doesn't change gamedir - use with caution. return; } strcpy (cl.model_name[nummodels], str); - CL_CheckOrEnqueDownloadFile(str, NULL, 0); + if (*str != '*') //not inline models! + CL_CheckOrEnqueDownloadFile(str, NULL, 0); Mod_TouchModel (str); } @@ -2328,6 +2345,10 @@ void CLNQ_ParseServerData(void) //Doesn't change gamedir - use with caution. return; } strcpy (cl.sound_name[numsounds], str); + +#pragma message("the logic that we should have here is rather long") + //CL_CheckOrEnqueDownloadFile(str, NULL, 0); + S_TouchSound (str); } @@ -5301,6 +5322,7 @@ void CLNQ_ParseServerMessage (void) Con_DPrintf ("stufftext: %s\n", s); if (!strncmp(s, "cl_serverextension_download ", 14)) { + cl_dp_serverextension_download = true; } else if (!strncmp(s, "\ncl_downloadbegin ", 17)) CLDP_ParseDownloadBegin(s); diff --git a/engine/client/cl_pred.c b/engine/client/cl_pred.c index 83ba4fad7..9087fce71 100644 --- a/engine/client/cl_pred.c +++ b/engine/client/cl_pred.c @@ -544,7 +544,7 @@ static void CL_LerpMove (int pnum, float msgtime) int i; int from, to; - if (cl_nolerp.value || cls.demoplayback == DPB_MVD || cls.demoplayback == DPB_EZTV) + if (!CL_MayLerp() || cls.demoplayback == DPB_MVD || cls.demoplayback == DPB_EZTV) return; #ifdef NQPROT @@ -837,11 +837,7 @@ fixedorg: to = &cl.frames[cl.ackedinputsequence & UPDATE_MASK]; -#ifdef NQPROT - if (Cam_TrackNum(pnum)>=0 && !cl_nolerp.value && cls.demoplayback != DPB_MVD && cls.demoplayback != DPB_EZTV && cls.demoplayback != DPB_NETQUAKE) -#else - if (Cam_TrackNum(pnum)>=0 && !cl_nolerp.value && cls.demoplayback != DPB_MVD && cls.demoplayback != DPB_EZTV) -#endif + if (Cam_TrackNum(pnum)>=0 && CL_MayLerp()) { float f; diff --git a/engine/client/client.h b/engine/client/client.h index c990b702d..730e73892 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -806,6 +806,7 @@ extern int packet_latency[NET_TIMINGS]; int CL_CalcNet (void); void CL_ParseServerMessage (void); void CL_DumpPacket(void); +void CL_ParseEstablished(void); void CLNQ_ParseServerMessage (void); #ifdef Q2CLIENT void CLQ2_ParseServerMessage (void); @@ -878,6 +879,7 @@ void CL_LinkViewModel(void); void CL_LinkPlayers (void); void CL_LinkPacketEntities (void); void CL_LinkProjectiles (void); +qboolean CL_MayLerp(void); // //clq3_parse.c