cl.stats[STAT_ITEMS] = MSG_ReadLong ();
cl.onground = (bits & SU_ONGROUND) != 0;
- csqc_onground = cl.onground; //[515]: cause without this csqc will receive not right value on svc_print =/
cl.inwater = (bits & SU_INWATER) != 0;
if (cls.protocol == PROTOCOL_DARKPLACES5)
// viewzoom interpolation
cl.mviewzoom[0] = (float) max(cl.stats[STAT_VIEWZOOM], 2) * (1.0f / 255.0f);
+
+ // force a recalculation of the player prediction
+ cl.movement_replay = true;
}
/*
if (!strcmp(text, "Client ping times:\n"))
{
cl.parsingtextmode = CL_PARSETEXTMODE_PING;
- cl.parsingtextplayerindex = 0;
- return !sb_showscores;
+ for(cl.parsingtextplayerindex = 0; cl.parsingtextplayerindex < cl.maxclients && !cl.scores[cl.parsingtextplayerindex].name[0]; cl.parsingtextplayerindex++)
+ ;
+ if (cl.parsingtextplayerindex >= cl.maxclients) // should never happen, since the client itself should be in cl.scores
+ {
+ Con_Printf("ping reply but empty scoreboard?!?\n");
+ cl.parsingtextmode = CL_PARSETEXTMODE_NONE;
+ cl.parsingtextexpectingpingforscores = 0;
+ }
+ cl.parsingtextexpectingpingforscores = cl.parsingtextexpectingpingforscores ? 2 : 0;
+ return !cl.parsingtextexpectingpingforscores;
}
if (!strncmp(text, "host: ", 9))
{
+ // cl.parsingtextexpectingpingforscores = false; // really?
cl.parsingtextmode = CL_PARSETEXTMODE_STATUS;
cl.parsingtextplayerindex = 0;
return true;
if (cl.parsingtextmode == CL_PARSETEXTMODE_PING)
{
// if anything goes wrong, we'll assume this is not a ping report
+ qboolean expected = cl.parsingtextexpectingpingforscores;
+ cl.parsingtextexpectingpingforscores = 0;
cl.parsingtextmode = CL_PARSETEXTMODE_NONE;
t = text;
while (*t == ' ')
t++;
- if (*t >= '0' && *t <= '9')
+ if ((*t >= '0' && *t <= '9') || *t == '-')
{
int ping = atoi(t);
- while (*t >= '0' && *t <= '9')
+ while ((*t >= '0' && *t <= '9') || *t == '-')
t++;
if (*t == ' ')
{
int charindex = 0;
t++;
- for (charindex = 0;cl.scores[cl.parsingtextplayerindex].name[charindex] == t[charindex];charindex++)
- ;
- if (cl.scores[cl.parsingtextplayerindex].name[charindex] == 0 && t[charindex] == '\n')
+ if(cl.parsingtextplayerindex < cl.maxclients)
{
- cl.scores[cl.parsingtextplayerindex].qw_ping = bound(0, ping, 9999);
- for (cl.parsingtextplayerindex++;cl.parsingtextplayerindex < cl.maxclients && !cl.scores[cl.parsingtextplayerindex].name[0];cl.parsingtextplayerindex++)
+ for (charindex = 0;cl.scores[cl.parsingtextplayerindex].name[charindex] == t[charindex];charindex++)
;
- if (cl.parsingtextplayerindex < cl.maxclients)
+ if (cl.scores[cl.parsingtextplayerindex].name[charindex] == 0 && t[charindex] == '\n')
{
- // we parsed a valid ping entry, so expect another to follow
- cl.parsingtextmode = CL_PARSETEXTMODE_PING;
+ cl.scores[cl.parsingtextplayerindex].qw_ping = bound(0, ping, 9999);
+ for (cl.parsingtextplayerindex++;cl.parsingtextplayerindex < cl.maxclients && !cl.scores[cl.parsingtextplayerindex].name[0];cl.parsingtextplayerindex++)
+ ;
+ //if (cl.parsingtextplayerindex < cl.maxclients) // we could still get unconnecteds!
+ {
+ // we parsed a valid ping entry, so expect another to follow
+ cl.parsingtextmode = CL_PARSETEXTMODE_PING;
+ cl.parsingtextexpectingpingforscores = expected;
+ }
+ return !expected;
}
- return !sb_showscores;
}
+ if (!strncmp(t, "unconnected\n", 12))
+ {
+ // just ignore
+ cl.parsingtextmode = CL_PARSETEXTMODE_PING;
+ cl.parsingtextexpectingpingforscores = expected;
+ return !expected;
+ }
+ else
+ Con_DPrintf("player names '%s' and '%s' didn't match\n", cl.scores[cl.parsingtextplayerindex].name, t);
}
}
}
cl.mtime[1] = cl.mtime[0];
cl.mtime[0] = realtime; // qw has no clock
cl.movement_needupdate = true;
+ cl.onground = false; // since there's no clientdata parsing, clear the onground flag here
// if true the cl.viewangles are interpolated from cl.mviewangles[]
// during this frame
// (makes spectating players much smoother and prevents mouse movement from turning)
if (!cls.demoplayback)
VectorCopy(cl.mviewangles[0], cl.mviewangles[1]);
+ // force a recalculation of the player prediction
+ cl.movement_replay = true;
+
// slightly kill qw player entities each frame
for (i = 1;i < cl.maxclients;i++)
cl.entities_active[i] = false;
{
char description[32*64], temp[64];
int count;
- strcpy(description, "packet dump: ");
+ strlcpy(description, "packet dump: ", sizeof(description));
i = cmdcount - 32;
if (i < 0)
i = 0;
{
char description[32*64], temp[64];
int count;
- strcpy (description, "packet dump: ");
+ strlcpy (description, "packet dump: ", sizeof(description));
i = cmdcount - 32;
if (i < 0)
i = 0;