mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-22 12:01:25 +00:00
Fixed a memory leak, made server browser listing more robust (shows recorded players). Added an untested ison clientcommand.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1367 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
3621fa8b8f
commit
4c04955563
1 changed files with 121 additions and 11 deletions
132
fteqtv/qw.c
132
fteqtv/qw.c
|
@ -446,15 +446,70 @@ void QTV_Rcon(sv_t *qtv, char *message, netadr_t *from)
|
||||||
}
|
}
|
||||||
void QTV_Status(sv_t *qtv, netadr_t *from)
|
void QTV_Status(sv_t *qtv, netadr_t *from)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
|
|
||||||
netmsg_t msg;
|
netmsg_t msg;
|
||||||
char buf[6];
|
char elem[256];
|
||||||
InitNetMsg(&msg, buffer, sizeof(buffer));
|
InitNetMsg(&msg, buffer, sizeof(buffer));
|
||||||
WriteLong(&msg, -1);
|
WriteLong(&msg, -1);
|
||||||
WriteByte(&msg, 'n');
|
WriteByte(&msg, 'n');
|
||||||
WriteString2(&msg, qtv->serverinfo);
|
WriteString2(&msg, qtv->serverinfo);
|
||||||
WriteString(&msg, "\n");
|
WriteString2(&msg, "\n");
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0;i < MAX_CLIENTS-1; i++)
|
||||||
|
{
|
||||||
|
if (!qtv->players[i].active)
|
||||||
|
continue;
|
||||||
|
//userid
|
||||||
|
sprintf(elem, "%i", i);
|
||||||
|
WriteString2(&msg, elem);
|
||||||
|
WriteString2(&msg, " ");
|
||||||
|
|
||||||
|
//frags
|
||||||
|
sprintf(elem, "%i", qtv->players[i].frags);
|
||||||
|
WriteString2(&msg, elem);
|
||||||
|
WriteString2(&msg, " ");
|
||||||
|
|
||||||
|
//time (minuites)
|
||||||
|
sprintf(elem, "%i", 0);
|
||||||
|
WriteString2(&msg, elem);
|
||||||
|
WriteString2(&msg, " ");
|
||||||
|
|
||||||
|
//ping
|
||||||
|
sprintf(elem, "%i", qtv->players[i].ping);
|
||||||
|
WriteString2(&msg, elem);
|
||||||
|
WriteString2(&msg, " ");
|
||||||
|
|
||||||
|
//name
|
||||||
|
Info_ValueForKey(qtv->players[i].userinfo, "name", elem, sizeof(elem));
|
||||||
|
WriteString2(&msg, "\"");
|
||||||
|
WriteString2(&msg, elem);
|
||||||
|
WriteString2(&msg, "\" ");
|
||||||
|
|
||||||
|
//skin
|
||||||
|
Info_ValueForKey(qtv->players[i].userinfo, "skin", elem, sizeof(elem));
|
||||||
|
WriteString2(&msg, "\"");
|
||||||
|
WriteString2(&msg, elem);
|
||||||
|
WriteString2(&msg, "\" ");
|
||||||
|
WriteString2(&msg, " ");
|
||||||
|
|
||||||
|
//tc
|
||||||
|
Info_ValueForKey(qtv->players[i].userinfo, "topcolor", elem, sizeof(elem));
|
||||||
|
WriteString2(&msg, elem);
|
||||||
|
WriteString2(&msg, " ");
|
||||||
|
|
||||||
|
//bc
|
||||||
|
Info_ValueForKey(qtv->players[i].userinfo, "bottomcolor", elem, sizeof(elem));
|
||||||
|
WriteString2(&msg, elem);
|
||||||
|
WriteString2(&msg, " ");
|
||||||
|
|
||||||
|
WriteString2(&msg, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WriteByte(&msg, 0);
|
||||||
NET_SendPacket(qtv->qwdsocket, msg.cursize, msg.data, *from);
|
NET_SendPacket(qtv->qwdsocket, msg.cursize, msg.data, *from);
|
||||||
|
|
||||||
|
|
||||||
|
@ -941,6 +996,38 @@ void QTV_Say(sv_t *qtv, viewer_t *v, char *message)
|
||||||
Multicast(qtv, msg.data, msg.cursize, dem_all, (unsigned int)-1);
|
Multicast(qtv, msg.data, msg.cursize, dem_all, (unsigned int)-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qboolean QW_IsOn(sv_t *qtv, char *name)
|
||||||
|
{
|
||||||
|
viewer_t *v;
|
||||||
|
for (v = qtv->viewers; v; v = v->next)
|
||||||
|
if (!strcmp(v->name, name)) //this needs to allow dequakified names.
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QW_PrintfToViewer(viewer_t *v, char *format, ...)
|
||||||
|
{
|
||||||
|
va_list argptr;
|
||||||
|
char buf[1024];
|
||||||
|
netmsg_t msg;
|
||||||
|
InitNetMsg(&msg, buf, sizeof(buf));
|
||||||
|
|
||||||
|
va_start (argptr, format);
|
||||||
|
#ifdef _WIN32
|
||||||
|
_vsnprintf (buf+2, sizeof(buf) - 3, format, argptr);
|
||||||
|
buf[sizeof(buf) - 3] = '\0';
|
||||||
|
#else
|
||||||
|
vsnprintf (buf+2, sizeof(buf)-2, format, argptr);
|
||||||
|
#endif // _WIN32
|
||||||
|
va_end (argptr);
|
||||||
|
|
||||||
|
buf[0] = svc_print;
|
||||||
|
buf[1] = 2; //PRINT_HIGH
|
||||||
|
|
||||||
|
SendBufferToViewer(v, buf, strlen(buf)+1, true);
|
||||||
|
}
|
||||||
|
|
||||||
void ParseQWC(sv_t *qtv, viewer_t *v, netmsg_t *m)
|
void ParseQWC(sv_t *qtv, viewer_t *v, netmsg_t *m)
|
||||||
{
|
{
|
||||||
usercmd_t oldest, oldcmd, newcmd;
|
usercmd_t oldest, oldcmd, newcmd;
|
||||||
|
@ -1064,6 +1151,13 @@ void ParseQWC(sv_t *qtv, viewer_t *v, netmsg_t *m)
|
||||||
}
|
}
|
||||||
else if (!strncmp(buf, "drop", 4))
|
else if (!strncmp(buf, "drop", 4))
|
||||||
v->drop = true;
|
v->drop = true;
|
||||||
|
else if (!strncmp(buf, "ison", 4))
|
||||||
|
{
|
||||||
|
if (QW_IsOn(qtv, buf+6))
|
||||||
|
QW_PrintfToViewer(v, "%s is on the proxy\n", buf+6);
|
||||||
|
else
|
||||||
|
QW_PrintfToViewer(v, "%s is not on the proxy, sorry\n", buf+6); //the apology is to make the alternatives distinct.
|
||||||
|
}
|
||||||
else if (!strncmp(buf, "ptrack ", 7))
|
else if (!strncmp(buf, "ptrack ", 7))
|
||||||
v->trackplayer = atoi(buf+7);
|
v->trackplayer = atoi(buf+7);
|
||||||
else if (!strncmp(buf, "ptrack", 6))
|
else if (!strncmp(buf, "ptrack", 6))
|
||||||
|
@ -1140,7 +1234,28 @@ void ParseQWC(sv_t *qtv, viewer_t *v, netmsg_t *m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char dropcmd[] = {svc_stufftext, 'd', 'i', 's', 'c', 'o', 'n', 'n', 'e', 'c', 't', '\n', '\0'};
|
static const char dropcmd[] = {svc_stufftext, 'd', 'i', 's', 'c', 'o', 'n', 'n', 'e', 'c', 't', '\n', '\0'};
|
||||||
|
void QW_FreeViewer(viewer_t *viewer)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
//note: unlink them yourself.
|
||||||
|
|
||||||
|
printf("Dropping viewer %s\n", viewer->name);
|
||||||
|
|
||||||
|
//spam them thrice, then forget about them
|
||||||
|
Netchan_Transmit(&viewer->netchan, strlen(dropcmd)+1, dropcmd);
|
||||||
|
Netchan_Transmit(&viewer->netchan, strlen(dropcmd)+1, dropcmd);
|
||||||
|
Netchan_Transmit(&viewer->netchan, strlen(dropcmd)+1, dropcmd);
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_BACK_BUFFERS; i++)
|
||||||
|
{
|
||||||
|
if (viewer->backbuf[i].data)
|
||||||
|
free(viewer->backbuf[i].data);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(viewer);
|
||||||
|
}
|
||||||
|
|
||||||
void QW_UpdateUDPStuff(sv_t *qtv)
|
void QW_UpdateUDPStuff(sv_t *qtv)
|
||||||
{
|
{
|
||||||
char buffer[MAX_MSGLEN*2];
|
char buffer[MAX_MSGLEN*2];
|
||||||
|
@ -1224,10 +1339,8 @@ void QW_UpdateUDPStuff(sv_t *qtv)
|
||||||
printf("Dropping client\n");
|
printf("Dropping client\n");
|
||||||
f = qtv->viewers;
|
f = qtv->viewers;
|
||||||
qtv->viewers = f->next;
|
qtv->viewers = f->next;
|
||||||
Netchan_Transmit(&f->netchan, strlen(dropcmd)+1, dropcmd);
|
|
||||||
Netchan_Transmit(&f->netchan, strlen(dropcmd)+1, dropcmd);
|
QW_FreeViewer(f);
|
||||||
Netchan_Transmit(&f->netchan, strlen(dropcmd)+1, dropcmd);
|
|
||||||
free(f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (v = qtv->viewers; v; v = v->next)
|
for (v = qtv->viewers; v; v = v->next)
|
||||||
|
@ -1238,10 +1351,7 @@ void QW_UpdateUDPStuff(sv_t *qtv)
|
||||||
f = v->next;
|
f = v->next;
|
||||||
v->next = f->next;
|
v->next = f->next;
|
||||||
|
|
||||||
Netchan_Transmit(&f->netchan, strlen(dropcmd)+1, dropcmd);
|
QW_FreeViewer(f);
|
||||||
Netchan_Transmit(&f->netchan, strlen(dropcmd)+1, dropcmd);
|
|
||||||
Netchan_Transmit(&f->netchan, strlen(dropcmd)+1, dropcmd);
|
|
||||||
free(f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->maysend && !qtv->parsingconnectiondata) //don't send incompleate connection data.
|
if (v->maysend && !qtv->parsingconnectiondata) //don't send incompleate connection data.
|
||||||
|
|
Loading…
Reference in a new issue