From e75c24b1e8be6f18dfb33ac2d3b6f860457d64d4 Mon Sep 17 00:00:00 2001 From: divverent Date: Wed, 23 Dec 2009 08:48:36 +0000 Subject: [PATCH] DP_SV_PING_PACKETLOSS: expose packet loss to server QC git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9638 d7cf8633-e32d-0410-b094-e92efae38249 --- progsvm.h | 2 ++ prvm_edict.c | 2 ++ prvm_exec.c | 2 +- sv_user.c | 15 +++++++++++++++ svvm_cmds.c | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/progsvm.h b/progsvm.h index 2dd9e0ff..5136c4c3 100644 --- a/progsvm.h +++ b/progsvm.h @@ -212,6 +212,8 @@ typedef struct prvm_prog_fieldoffsets_s int nodrawtoclient; // ssqc int pflags; // ssqc int ping; // ssqc + int packetloss; // ssqc + int movementloss; // ssqc int pitch_speed; // ssqc / csqc int playermodel; // ssqc int playerskin; // ssqc diff --git a/prvm_edict.c b/prvm_edict.c index 8b4ddf0a..828ebcfe 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -1609,6 +1609,8 @@ void PRVM_FindOffsets(void) prog->fieldoffsets.nodrawtoclient = PRVM_ED_FindFieldOffset("nodrawtoclient"); prog->fieldoffsets.pflags = PRVM_ED_FindFieldOffset("pflags"); prog->fieldoffsets.ping = PRVM_ED_FindFieldOffset("ping"); + prog->fieldoffsets.packetloss = PRVM_ED_FindFieldOffset("ping_packetloss"); + prog->fieldoffsets.movementloss = PRVM_ED_FindFieldOffset("ping_movementloss"); prog->fieldoffsets.pitch_speed = PRVM_ED_FindFieldOffset("pitch_speed"); prog->fieldoffsets.playermodel = PRVM_ED_FindFieldOffset("playermodel"); prog->fieldoffsets.playerskin = PRVM_ED_FindFieldOffset("playerskin"); diff --git a/prvm_exec.c b/prvm_exec.c index f32ff3f2..97130220 100644 --- a/prvm_exec.c +++ b/prvm_exec.c @@ -212,7 +212,7 @@ void PRVM_PrintFunctionStatements (const char *name) endstatement = prog->functions[i].first_statement; // now print the range of statements - Con_Printf("%s progs: disassembly of function %s (statements %i-%i):\n", PRVM_NAME, name, firststatement, endstatement); + Con_Printf("%s progs: disassembly of function %s (statements %i-%i, locals %i-%i):\n", PRVM_NAME, name, firststatement, endstatement, func->parm_start, func->parm_start + func->locals - 1); for (i = firststatement;i < endstatement;i++) { PRVM_PrintStatement(prog->statements + i); diff --git a/sv_user.c b/sv_user.c index 2ca62d7e..dfa9bb29 100644 --- a/sv_user.c +++ b/sv_user.c @@ -696,6 +696,7 @@ void SV_ApplyClientMove (void) { prvm_eval_t *val; usercmd_t *move = &host_client->cmd; + int j, movementloss, packetloss; if (!move->receivetime) return; @@ -714,6 +715,18 @@ void SV_ApplyClientMove (void) host_client->edict->fields.server->impulse = move->impulse; // only send the impulse to qc once move->impulse = 0; + + movementloss = packetloss = 0; + if(host_client->netconnection) + { + for (j = 0;j < NETGRAPH_PACKETS;j++) + if (host_client->netconnection->incoming_netgraph[j].unreliablebytes == NETGRAPH_LOSTPACKET) + packetloss++; + for (j = 0;j < NETGRAPH_PACKETS;j++) + if (host_client->movement_count[j] < 0) + movementloss++; + } + VectorCopy(move->viewangles, host_client->edict->fields.server->v_angle); if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.button3))) val->_float = ((move->buttons >> 2) & 1); if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.button4))) val->_float = ((move->buttons >> 3) & 1); @@ -738,6 +751,8 @@ void SV_ApplyClientMove (void) if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.cursor_trace_endpos))) VectorCopy(move->cursor_impact, val->vector); if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.cursor_trace_ent))) val->edict = PRVM_EDICT_TO_PROG(PRVM_EDICT_NUM(move->cursor_entitynumber)); if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.ping))) val->_float = host_client->ping * 1000.0; + if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.packetloss))) val->_float = packetloss / (float) NETGRAPH_PACKETS; + if ((val = PRVM_EDICTFIELDVALUE(host_client->edict, prog->fieldoffsets.movementloss))) val->_float = movementloss / (float) NETGRAPH_PACKETS; } void SV_FrameLost(int framenum) diff --git a/svvm_cmds.c b/svvm_cmds.c index e0e5dc36..a7819b02 100644 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@ -148,6 +148,7 @@ char *vm_sv_extensions = "DP_SV_ONENTITYNOSPAWNFUNCTION " "DP_SV_ONENTITYPREPOSTSPAWNFUNCTION " "DP_SV_PING " +"DP_SV_PING_PACKETLOSS " "DP_SV_PLAYERPHYSICS " "DP_SV_POINTPARTICLES " "DP_SV_POINTSOUND " -- 2.39.2