X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=cl_parse.c;h=e49f1c3c44843677b233d5f83ba341cf12257160;hb=a2445d85eccf4d0c5766f44f02cd04a600c4bad4;hp=c67225d03e813ca94cd5737455b296c3452999a9;hpb=e28da8260480813deb08c7acc7babc814c4918be;p=xonotic%2Fdarkplaces.git diff --git a/cl_parse.c b/cl_parse.c index c67225d0..e49f1c3c 100644 --- a/cl_parse.c +++ b/cl_parse.c @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // cl_parse.c -- parse a message received from the server #include "quakedef.h" +#include "cdaudio.h" #include "cl_collision.h" char *svc_strings[128] = @@ -152,7 +153,7 @@ void CL_ParseStartSoundPacket(int largesoundindex) MSG_ReadVector(pos, cl.protocol); - S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation); + S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0f, attenuation); } /* @@ -402,18 +403,12 @@ void CL_ParseServerInfo (void) for (i = 1;i < nummodels;i++) { CL_KeepaliveMessage(); - Mod_TouchModel(parse_model_precache[i]); + Mod_FindName(parse_model_precache[i]); } Mod_PurgeUnused(); // do the same for sounds - S_ClearUsed(); - for (i = 1;i < numsounds;i++) - { - CL_KeepaliveMessage(); - S_TouchSound(parse_sound_precache[i], true); - } - S_PurgeUnused(); + S_ServerSounds (parse_sound_precache, numsounds); // now we try to load everything that is new @@ -435,7 +430,9 @@ void CL_ParseServerInfo (void) for (i=1 ; imodelindex]; Mod_CheckLoaded(model); - if (model && s->frame >= model->numframes) + if (model && model->type && s->frame >= model->numframes) { - Con_DPrintf("CL_ValidateState: no such frame %i in \"%s\"\n", s->frame, model->name); + Con_DPrintf("CL_ValidateState: no such frame %i in \"%s\" (which has %i frames)\n", s->frame, model->name, model->numframes); s->frame = 0; } - if (model && s->skin > 0 && s->skin >= model->numskins) + if (model && model->type && s->skin > 0 && s->skin >= model->numskins && !(s->lightpflags & PFLAGS_FULLDYNAMIC)) { - Con_DPrintf("CL_ValidateState: no such skin %i in \"%s\"\n", s->skin, model->name); + Con_DPrintf("CL_ValidateState: no such skin %i in \"%s\" (which has %i skins)\n", s->skin, model->name, model->numskins); s->skin = 0; } } @@ -499,9 +496,26 @@ void CL_MoveLerpEntityStates(entity_t *ent) CL_ValidateState(&ent->state_current); VectorSubtract(ent->state_current.origin, ent->persistent.neworigin, odelta); VectorSubtract(ent->state_current.angles, ent->persistent.newangles, adelta); - if (!ent->state_previous.active || cls.timedemo || DotProduct(odelta, odelta) > 1000*1000 || cl_nolerp.integer) + if (!ent->state_previous.active || ent->state_previous.modelindex != ent->state_current.modelindex) + { + // reset all persistent stuff if this is a new entity + ent->persistent.lerpdeltatime = 0; + ent->persistent.lerpstarttime = cl.mtime[1]; + VectorCopy(ent->state_current.origin, ent->persistent.oldorigin); + VectorCopy(ent->state_current.angles, ent->persistent.oldangles); + 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.frame1time = ent->render.frame2time = cl.time; + ent->render.framelerp = 1; + // reset various persistent stuff + ent->persistent.muzzleflash = 0; + VectorCopy(ent->state_current.origin, ent->persistent.trail_origin); + } + else if (cls.timedemo || cl_nolerp.integer || DotProduct(odelta, odelta) > 1000*1000) { - // we definitely shouldn't lerp + // don't interpolate the move ent->persistent.lerpdeltatime = 0; ent->persistent.lerpstarttime = cl.mtime[1]; VectorCopy(ent->state_current.origin, ent->persistent.oldorigin); @@ -525,12 +539,12 @@ void CL_MoveLerpEntityStates(entity_t *ent) else { // not a monster - ent->persistent.lerpstarttime = cl.mtime[1]; + ent->persistent.lerpstarttime = ent->state_previous.time; // no lerp if it's singleplayer if (cl.islocalgame) ent->persistent.lerpdeltatime = 0; else - ent->persistent.lerpdeltatime = cl.mtime[0] - cl.mtime[1]; + ent->persistent.lerpdeltatime = bound(0, ent->state_current.time - ent->state_previous.time, 0.1); VectorCopy(ent->persistent.neworigin, ent->persistent.oldorigin); VectorCopy(ent->persistent.newangles, ent->persistent.oldangles); VectorCopy(ent->state_current.origin, ent->persistent.neworigin); @@ -538,16 +552,6 @@ void CL_MoveLerpEntityStates(entity_t *ent) } } -void CL_ReadEntityFrame(void) -{ - if (cl.protocol == PROTOCOL_DARKPLACES1 || cl.protocol == PROTOCOL_DARKPLACES2 || cl.protocol == PROTOCOL_DARKPLACES3) - EntityFrame_CL_ReadFrame(); - else if (cl.protocol == PROTOCOL_DARKPLACES4) - EntityFrame4_CL_ReadFrame(); - else if (cl.protocol == PROTOCOL_DARKPLACES5) - EntityFrame5_CL_ReadFrame(); -} - /* ================== CL_ParseBaseline @@ -616,10 +620,10 @@ void CL_ParseClientdata (int bits) { if (cl.protocol == PROTOCOL_DARKPLACES1 || cl.protocol == PROTOCOL_DARKPLACES2 || cl.protocol == PROTOCOL_DARKPLACES3 || cl.protocol == PROTOCOL_DARKPLACES4 || cl.protocol == PROTOCOL_DARKPLACES5) cl.punchangle[i] = MSG_ReadAngle16i(); - else if (cl.protocol == PROTOCOL_QUAKE) + else if (cl.protocol == PROTOCOL_QUAKE || cl.protocol == PROTOCOL_NEHAHRAMOVIE) cl.punchangle[i] = MSG_ReadChar(); else - Host_Error("CL_ParseClientData: unknown cl.protocol\n"); + Host_Error("CL_ParseClientData: unknown cl.protocol %i\n", cl.protocol); } else cl.punchangle[i] = 0; @@ -630,18 +634,18 @@ void CL_ParseClientdata (int bits) else if (cl.protocol == PROTOCOL_DARKPLACES5) cl.punchvector[i] = MSG_ReadCoord32f(); else - Host_Error("CL_ParseClientData: unknown cl.protocol\n"); + Host_Error("CL_ParseClientData: unknown cl.protocol %i\n", cl.protocol); } else cl.punchvector[i] = 0; if (bits & (SU_VELOCITY1<