mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-10 03:02:10 +00:00
- make SV_ReliableSVC_Emit mark overflowed clients as such, and die if
we ever giet a NET_ERROR - fix the baselines so all entities have the QSG2 extensions (alpha, scale, etc) inited, instead of just the entities that the map started with - make the server not include empty deltas in a svc_deltapacketentities for updated entities - change a silly for (; foo;) to while (foo)
This commit is contained in:
parent
f646786bf5
commit
3fdad3ce45
5 changed files with 54 additions and 22 deletions
|
@ -537,7 +537,7 @@ void SV_WriteEntitiesToClient (client_t *client, sizebuf_t *msg);
|
||||||
//
|
//
|
||||||
// sv_nchan.c
|
// sv_nchan.c
|
||||||
//
|
//
|
||||||
net_status_t SV_ReliableSVC_Emit (client_t *cl, int type, void *block);
|
void SV_ReliableSVC_Emit (client_t *cl, int type, void *block);
|
||||||
void ClientReliableCheckBlock(client_t *cl, int maxsize);
|
void ClientReliableCheckBlock(client_t *cl, int maxsize);
|
||||||
void ClientReliable_FinishWrite(client_t *cl);
|
void ClientReliable_FinishWrite(client_t *cl);
|
||||||
void ClientReliableWrite_Begin(client_t *cl, int c, int maxsize);
|
void ClientReliableWrite_Begin(client_t *cl, int c, int maxsize);
|
||||||
|
|
|
@ -263,7 +263,7 @@ CL_ParseDeltaPacketEntities (net_svc_deltapacketentities_t *block)
|
||||||
|
|
||||||
newp->num_entities = 0;
|
newp->num_entities = 0;
|
||||||
|
|
||||||
for (; block->words[wordindex];) {
|
while (block->words[wordindex]) {
|
||||||
newnum = block->words[wordindex] & 511;
|
newnum = block->words[wordindex] & 511;
|
||||||
oldnum = oldindex >= oldp->num_entities ? 9999 :
|
oldnum = oldindex >= oldp->num_entities ? 9999 :
|
||||||
oldp->entities[oldindex].number;
|
oldp->entities[oldindex].number;
|
||||||
|
|
|
@ -259,7 +259,7 @@ SV_EmitDeltaPacketEntities (client_t *client, packet_entities_t *to,
|
||||||
sizebuf_t *msg)
|
sizebuf_t *msg)
|
||||||
{
|
{
|
||||||
int newindex, oldindex, newnum, oldnum;
|
int newindex, oldindex, newnum, oldnum;
|
||||||
int word;
|
int word, delta;
|
||||||
entity_state_t *baseline;
|
entity_state_t *baseline;
|
||||||
packet_entities_t *from;
|
packet_entities_t *from;
|
||||||
net_svc_deltapacketentities_t block;
|
net_svc_deltapacketentities_t block;
|
||||||
|
@ -271,9 +271,8 @@ SV_EmitDeltaPacketEntities (client_t *client, packet_entities_t *to,
|
||||||
|
|
||||||
// SV_Printf ("---%i to %i ----\n", client->delta_sequence & UPDATE_MASK,
|
// SV_Printf ("---%i to %i ----\n", client->delta_sequence & UPDATE_MASK,
|
||||||
// client->netchan.outgoing_sequence & UPDATE_MASK);
|
// client->netchan.outgoing_sequence & UPDATE_MASK);
|
||||||
for (newindex = 0, oldindex = 0, word = 0;
|
for (newindex = 0, oldindex = 0, word = 0, delta = 0;
|
||||||
newindex < to->num_entities || oldindex < from->num_entities;
|
newindex < to->num_entities || oldindex < from->num_entities;) {
|
||||||
word++) {
|
|
||||||
newnum = newindex >= to->num_entities ?
|
newnum = newindex >= to->num_entities ?
|
||||||
9999 : to->entities[newindex].number;
|
9999 : to->entities[newindex].number;
|
||||||
oldnum = oldindex >= from->num_entities ?
|
oldnum = oldindex >= from->num_entities ?
|
||||||
|
@ -281,39 +280,50 @@ SV_EmitDeltaPacketEntities (client_t *client, packet_entities_t *to,
|
||||||
|
|
||||||
if (newnum == oldnum) { // delta update from old position
|
if (newnum == oldnum) { // delta update from old position
|
||||||
// SV_Printf ("delta %i\n", newnum);
|
// SV_Printf ("delta %i\n", newnum);
|
||||||
block.deltas[newindex] = to->entities[newindex];
|
block.deltas[delta] = to->entities[newindex];
|
||||||
block.deltas[newindex].flags =
|
block.deltas[delta].flags =
|
||||||
SV_EntityState_Diff (&from->entities[oldindex],
|
SV_EntityState_Diff (&from->entities[oldindex],
|
||||||
&to->entities[newindex]);
|
&to->entities[newindex]);
|
||||||
|
|
||||||
// check if it's a client that doesn't support QSG2
|
// check if it's a client that doesn't support QSG2
|
||||||
if (client->stdver <= 1)
|
if (client->stdver <= 1)
|
||||||
block.deltas[newindex].flags &= U_VERSION_ID;
|
block.deltas[delta].flags &= U_VERSION_ID;
|
||||||
|
|
||||||
block.words[word] = newnum | (block.deltas[newindex].flags & ~511);
|
if (!block.deltas[delta].flags) { // no updates to send
|
||||||
|
oldindex++;
|
||||||
|
newindex++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
block.words[word] = newnum | (block.deltas[delta].flags & ~511);
|
||||||
|
|
||||||
oldindex++;
|
oldindex++;
|
||||||
newindex++;
|
newindex++;
|
||||||
|
word++;
|
||||||
|
delta++;
|
||||||
} else if (newnum < oldnum) { // this is a new entity, send
|
} else if (newnum < oldnum) { // this is a new entity, send
|
||||||
// it from the baseline
|
// it from the baseline
|
||||||
baseline = EDICT_NUM (&sv_pr_state, newnum)->data;
|
baseline = EDICT_NUM (&sv_pr_state, newnum)->data;
|
||||||
// SV_Printf ("baseline %i\n", newnum);
|
// SV_Printf ("baseline %i\n", newnum);
|
||||||
block.deltas[newindex] = to->entities[newindex];
|
block.deltas[delta] = to->entities[newindex];
|
||||||
block.deltas[newindex].flags =
|
block.deltas[delta].flags =
|
||||||
SV_EntityState_Diff (baseline, &to->entities[newindex]);
|
SV_EntityState_Diff (baseline, &to->entities[newindex]);
|
||||||
|
|
||||||
// check if it's a client that doesn't support QSG2
|
// check if it's a client that doesn't support QSG2
|
||||||
if (client->stdver <= 1)
|
if (client->stdver <= 1)
|
||||||
block.deltas[newindex].flags &= U_VERSION_ID;
|
block.deltas[delta].flags &= U_VERSION_ID;
|
||||||
|
|
||||||
block.words[word] = newnum | (block.deltas[newindex].flags & ~511);
|
block.words[word] = newnum | (block.deltas[delta].flags & ~511);
|
||||||
|
|
||||||
newindex++;
|
newindex++;
|
||||||
|
word++;
|
||||||
|
delta++;
|
||||||
} else if (newnum > oldnum) { // the old entity isn't
|
} else if (newnum > oldnum) { // the old entity isn't
|
||||||
// present in the new message
|
// present in the new message
|
||||||
// SV_Printf ("remove %i\n", oldnum);
|
// SV_Printf ("remove %i\n", oldnum);
|
||||||
block.words[word] = oldnum | U_REMOVE;
|
block.words[word] = oldnum | U_REMOVE;
|
||||||
oldindex++;
|
oldindex++;
|
||||||
|
word++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,6 +109,19 @@ SV_CreateBaseline (void)
|
||||||
edict_t *svent;
|
edict_t *svent;
|
||||||
net_svc_spawnbaseline_t block;
|
net_svc_spawnbaseline_t block;
|
||||||
|
|
||||||
|
// setup the default baselines
|
||||||
|
memset (baselines, 0, sizeof (baselines));
|
||||||
|
for (entnum = 0; entnum < MAX_EDICTS; entnum++) {
|
||||||
|
svent = EDICT_NUM (&sv_pr_state, entnum);
|
||||||
|
// LordHavoc: setup baseline to include new effects
|
||||||
|
((entity_state_t*)svent->data)->alpha = 255;
|
||||||
|
((entity_state_t*)svent->data)->scale = 16;
|
||||||
|
((entity_state_t*)svent->data)->glow_size = 0;
|
||||||
|
((entity_state_t*)svent->data)->glow_color = 254;
|
||||||
|
((entity_state_t*)svent->data)->colormod = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup the baselines for map entities
|
||||||
for (entnum = 0; entnum < sv.num_edicts; entnum++) {
|
for (entnum = 0; entnum < sv.num_edicts; entnum++) {
|
||||||
svent = EDICT_NUM (&sv_pr_state, entnum);
|
svent = EDICT_NUM (&sv_pr_state, entnum);
|
||||||
if (svent->free)
|
if (svent->free)
|
||||||
|
@ -134,12 +147,6 @@ SV_CreateBaseline (void)
|
||||||
((entity_state_t*)svent->data)->modelindex =
|
((entity_state_t*)svent->data)->modelindex =
|
||||||
SV_ModelIndex (PR_GetString (&sv_pr_state, SVstring (svent, model)));
|
SV_ModelIndex (PR_GetString (&sv_pr_state, SVstring (svent, model)));
|
||||||
}
|
}
|
||||||
// LordHavoc: setup baseline to include new effects
|
|
||||||
((entity_state_t*)svent->data)->alpha = 255;
|
|
||||||
((entity_state_t*)svent->data)->scale = 16;
|
|
||||||
((entity_state_t*)svent->data)->glow_size = 0;
|
|
||||||
((entity_state_t*)svent->data)->glow_color = 254;
|
|
||||||
((entity_state_t*)svent->data)->colormod = 255;
|
|
||||||
|
|
||||||
// flush the signon message out to a seperate buffer if nearly full
|
// flush the signon message out to a seperate buffer if nearly full
|
||||||
SV_FlushSignon ();
|
SV_FlushSignon ();
|
||||||
|
|
|
@ -39,6 +39,7 @@ static const char rcsid[] =
|
||||||
|
|
||||||
#include "QF/msg.h"
|
#include "QF/msg.h"
|
||||||
#include "QF/net_svc.h"
|
#include "QF/net_svc.h"
|
||||||
|
#include "QF/sys.h"
|
||||||
|
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ PushBackbuf (client_t *cl)
|
||||||
cl->num_backbuf++;
|
cl->num_backbuf++;
|
||||||
}
|
}
|
||||||
|
|
||||||
net_status_t
|
void
|
||||||
SV_ReliableSVC_Emit (client_t *cl, int type, void *block)
|
SV_ReliableSVC_Emit (client_t *cl, int type, void *block)
|
||||||
{
|
{
|
||||||
net_status_t retval;
|
net_status_t retval;
|
||||||
|
@ -75,7 +76,21 @@ SV_ReliableSVC_Emit (client_t *cl, int type, void *block)
|
||||||
PushBackbuf (cl);
|
PushBackbuf (cl);
|
||||||
retval = NET_SVC_Emit (type, block, &cl->backbuf);
|
retval = NET_SVC_Emit (type, block, &cl->backbuf);
|
||||||
}
|
}
|
||||||
return retval;
|
|
||||||
|
switch (retval) {
|
||||||
|
case NET_SHORT:
|
||||||
|
SV_Printf ("SV_ReliableSVC_Emit: WARNING: reliable "
|
||||||
|
"overflow for %s with %d (%s) block\n",
|
||||||
|
cl->name, type, NET_SVC_GetString (type));
|
||||||
|
cl->netchan.message.overflowed = true;
|
||||||
|
break;
|
||||||
|
case NET_ERROR:
|
||||||
|
Sys_Error ("SV_ReliableSVC_Emit: error emitting %d (%s) "
|
||||||
|
"block for %s\n", type,
|
||||||
|
NET_SVC_GetString (type), cl->name);
|
||||||
|
break;
|
||||||
|
case NET_OK:
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue