From 5a16c2f01d4aed999e044f0048a55e44aa98eda2 Mon Sep 17 00:00:00 2001 From: Spoike Date: Sat, 8 Sep 2007 20:15:59 +0000 Subject: [PATCH] Some changes to the way the proxy works, now the player will get the aliases git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2641 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- fteqtv/parse.c | 36 ++++++++++--- fteqtv/qtv.h | 3 +- fteqtv/qw.c | 136 ++++++++++++++++++++++++++++++++---------------- fteqtv/source.c | 15 ++++-- 4 files changed, 131 insertions(+), 59 deletions(-) diff --git a/fteqtv/parse.c b/fteqtv/parse.c index a0ae00a08..b9d798298 100644 --- a/fteqtv/parse.c +++ b/fteqtv/parse.c @@ -103,6 +103,11 @@ void ConnectionData(sv_t *tv, void *buffer, int length, int to, unsigned int pla { if (!tv->parsingconnectiondata) Multicast(tv, buffer, length, to, playermask, suitablefor); + else if (tv->controller) + { + if (suitablefor&(tv->controller->netchan.isnqprotocol?NQ:QW)) + SendBufferToViewer(tv->controller, buffer, length, true); + } } static void ParseServerData(sv_t *tv, netmsg_t *m, int to, unsigned int playermask) @@ -133,6 +138,8 @@ static void ParseServerData(sv_t *tv, netmsg_t *m, int to, unsigned int playerma tv->thisplayer = MAX_CLIENTS-1; /*tv->servertime =*/ ReadFloat(m); } + if (tv->controller) + tv->controller->thisplayer = tv->thisplayer; ReadString(m, tv->mapname, sizeof(tv->mapname)); QTV_Printf(tv, "Gamedir: %s\n", tv->gamedir); @@ -174,11 +181,13 @@ static void ParseServerData(sv_t *tv, netmsg_t *m, int to, unsigned int playerma tv->frame[i].numents = 0; } - if (tv->usequakeworldprotocols) + if (!tv->controller && tv->usequakeworldprotocols) { tv->netchan.message.cursize = 0; //mvdsv sucks SendClientCommand(tv, "soundlist %i 0\n", tv->clservercount); } + else + ConnectionData(tv, (void*)((char*)m->data+m->startpos), m->readpos - m->startpos, to, dem_read, QW); strcpy(tv->status, "Receiving soundlist\n"); } @@ -232,14 +241,16 @@ static void ParseStufftext(sv_t *tv, netmsg_t *m, int to, unsigned int mask) for (v = tv->cluster->viewers; v; v = v->next) { - if (v->server == tv) + if (v->server == tv && v != tv->controller) { v->servercount++; SendBufferToViewer(v, newcmd, sizeof(newcmd), true); } } - if (tv->usequakeworldprotocols) + if (tv->controller) + SendBufferToViewer(tv->controller, (char*)m->data+m->startpos, m->readpos - m->startpos, true); + else if (tv->usequakeworldprotocols) SendClientCommand(tv, "begin %i\n", tv->clservercount); return; } @@ -286,13 +297,17 @@ static void ParseStufftext(sv_t *tv, netmsg_t *m, int to, unsigned int mask) } else if (!strncmp(text, "cmd ", 4)) { - if (tv->usequakeworldprotocols) + if (tv->controller) + SendBufferToViewer(tv->controller, (char*)m->data+m->startpos, m->readpos - m->startpos, true); + else if (tv->usequakeworldprotocols) SendClientCommand(tv, "%s", text+4); return; //commands the game server asked for are pointless. } else if (!strncmp(text, "reconnect", 9)) { - if (tv->usequakeworldprotocols) + if (tv->controller) + SendBufferToViewer(tv->controller, (char*)m->data+m->startpos, m->readpos - m->startpos, true); + else if (tv->usequakeworldprotocols) SendClientCommand(tv, "new\n"); return; } @@ -325,7 +340,8 @@ static void ParseStufftext(sv_t *tv, netmsg_t *m, int to, unsigned int mask) else if (tv->usequakeworldprotocols && !strncmp(text, "setinfo ", 8)) { Multicast(tv, (char*)m->data+m->startpos, m->readpos - m->startpos, to, mask, Q1); - SendClientCommand(tv, text); + if (!tv->controller) + SendClientCommand(tv, text); } else { @@ -473,6 +489,8 @@ static void ParseBaseline(sv_t *tv, netmsg_t *m, int to, unsigned int mask) return; } ParseEntityState(&tv->entity[entnum].baseline, m); + + ConnectionData(tv, (char*)m->data+m->startpos, m->readpos - m->startpos, to, mask, Q1); } static void ParseStaticSound(sv_t *tv, netmsg_t *m, int to, unsigned int mask) @@ -1644,7 +1662,8 @@ void ParseMessage(sv_t *tv, void *buffer, int length, int to, int mask) } strcpy(tv->status, "Prespawning\n"); } - if (tv->usequakeworldprotocols) + ConnectionData(tv, (void*)((char*)buf.data+buf.startpos), buf.readpos - buf.startpos, to, mask, QW); + if (tv->usequakeworldprotocols && !tv->controller) { if (i) SendClientCommand(tv, "modellist %i %i\n", tv->clservercount, i); @@ -1682,7 +1701,8 @@ void ParseMessage(sv_t *tv, void *buffer, int length, int to, int mask) i = ParseList(tv, &buf, tv->soundlist, to, mask); if (!i) strcpy(tv->status, "Receiving modellist\n"); - if (tv->usequakeworldprotocols) + ConnectionData(tv, (void*)((char*)buf.data+buf.startpos), buf.readpos - buf.startpos, to, mask, QW); + if (tv->usequakeworldprotocols && !tv->controller) { if (i) SendClientCommand(tv, "soundlist %i %i\n", tv->clservercount, i); diff --git a/fteqtv/qtv.h b/fteqtv/qtv.h index b1c5c5eb6..ae8424562 100644 --- a/fteqtv/qtv.h +++ b/fteqtv/qtv.h @@ -347,7 +347,6 @@ typedef struct viewer_s { qboolean thinksitsconnected; qboolean conmenussupported; qboolean isproxy; - int delta_frame; int servercount; @@ -360,6 +359,7 @@ typedef struct viewer_s { int userid; packet_entities_t frame[ENTITY_FRAMES]; + int delta_frames[ENTITY_FRAMES]; struct viewer_s *next; struct viewer_s *commentator; @@ -776,6 +776,7 @@ qboolean Net_StopFileProxy(sv_t *qtv); void SV_FindProxies(SOCKET sock, cluster_t *cluster, sv_t *defaultqtv); qboolean SV_ReadPendingProxy(cluster_t *cluster, oproxy_t *pend); void SV_ForwardStream(sv_t *qtv, void *buffer, int length); +int SV_SayToUpstream(sv_t *qtv, char *message); unsigned char *FS_ReadFile(char *gamedir, char *filename, unsigned int *size); diff --git a/fteqtv/qw.c b/fteqtv/qw.c index 6099aaa8e..922584669 100644 --- a/fteqtv/qw.c +++ b/fteqtv/qw.c @@ -378,6 +378,8 @@ void SendServerData(sv_t *tv, viewer_t *viewer) SendBufferToViewer(viewer, msg.data, msg.cursize, true); viewer->thinksitsconnected = false; + if (tv && (tv->controller == viewer)) + viewer->thinksitsconnected = true; memset(viewer->currentstats, 0, sizeof(viewer->currentstats)); } @@ -829,6 +831,7 @@ void NewNQClient(cluster_t *cluster, netadr_t *addr) sv_t *initialserver; int header; int len; + int i; unsigned char buffer[64]; viewer_t *viewer = NULL;; @@ -879,7 +882,8 @@ void NewNQClient(cluster_t *cluster, netadr_t *addr) viewer->next = cluster->viewers; cluster->viewers = viewer; - viewer->delta_frame = -1; + for (i = 0; i < ENTITY_FRAMES; i++) + viewer->delta_frames[i] = -1; initialserver = NULL; if (cluster->numservers == 1) @@ -914,6 +918,7 @@ void NewQWClient(cluster_t *cluster, netadr_t *addr, char *connectmessage) char qport[32]; char challenge[32]; char infostring[256]; + int i; connectmessage+=11; @@ -941,7 +946,8 @@ void NewQWClient(cluster_t *cluster, netadr_t *addr, char *connectmessage) viewer->next = cluster->viewers; cluster->viewers = viewer; - viewer->delta_frame = -1; + for (i = 0; i < ENTITY_FRAMES; i++) + viewer->delta_frames[i] = -1; initialserver = NULL; if (cluster->nouserconnects && cluster->numservers == 1) @@ -1283,15 +1289,18 @@ void SV_EmitPacketEntities (const sv_t *qtv, const viewer_t *v, const packet_ent int oldindex, newindex; int oldnum, newnum; int oldmax; + int delta_frame; + + delta_frame = v->delta_frames[v->netchan.outgoing_sequence&(ENTITY_FRAMES-1)]; // this is the frame that we are going to delta update from - if (v->delta_frame != -1) + if (delta_frame != -1) { - from = &v->frame[v->delta_frame & (ENTITY_FRAMES-1)]; + from = &v->frame[delta_frame & (ENTITY_FRAMES-1)]; oldmax = from->numents; WriteByte (msg, svc_deltapacketentities); - WriteByte (msg, v->delta_frame); + WriteByte (msg, delta_frame); } else { @@ -1934,26 +1943,32 @@ void SendPlayerStates(sv_t *tv, viewer_t *v, netmsg_t *msg) lerp = 1; if (tv->controller == v) - lerp = 1; - - cv = GetCommentator(v); - track = cv->trackplayer; - - if (cv != v && track < 0) - { //following a commentator - track = MAX_CLIENTS-2; - } - - if (v->trackplayer != track) - QW_StuffcmdToViewer (v, "track %i\n", track); - - if (!v->commentator && track >= 0 && !v->backbuffered) { - if (v->trackplayer != tv->trackplayer && tv->usequakeworldprotocols) - if (!tv->players[v->trackplayer].active && tv->players[tv->trackplayer].active) - { - QW_StuffcmdToViewer (v, "track %i\n", tv->trackplayer); - } + lerp = 1; + track = tv->thisplayer; + v->trackplayer = tv->thisplayer; + } + else + { + cv = GetCommentator(v); + track = cv->trackplayer; + + if (cv != v && track < 0) + { //following a commentator + track = MAX_CLIENTS-2; + } + + if (v->trackplayer != track) + QW_StuffcmdToViewer (v, "track %i\n", track); + + if (!v->commentator && track >= 0 && !v->backbuffered) + { + if (v->trackplayer != tv->trackplayer && tv->usequakeworldprotocols) + if (!tv->players[v->trackplayer].active && tv->players[tv->trackplayer].active) + { + QW_StuffcmdToViewer (v, "track %i\n", tv->trackplayer); + } + } } for (i = 0; i < MAX_CLIENTS; i++) @@ -3095,7 +3110,8 @@ void QTV_Say(cluster_t *cluster, sv_t *qtv, viewer_t *v, char *message, qboolean if (cluster->notalking) return; - SV_SayToUpstream(v->server, message); + if (v->server) + SV_SayToUpstream(v->server, message); for (ov = cluster->viewers; ov; ov = ov->next) { @@ -3112,8 +3128,11 @@ void QTV_Say(cluster_t *cluster, sv_t *qtv, viewer_t *v, char *message, qboolean { if (ov->conmenussupported) { - WriteByte(&msg, 3); //PRINT_CHAT - WriteString2(&msg, "[^sQTV^s]^s^5"); + WriteByte(&msg, 2); //PRINT_HIGH + WriteByte(&msg, 91+128); + WriteString2(&msg, "QTV"); + WriteByte(&msg, 93+128); + WriteString2(&msg, "^5"); } else { @@ -3132,6 +3151,8 @@ void QTV_Say(cluster_t *cluster, sv_t *qtv, viewer_t *v, char *message, qboolean WriteString2(&msg, v->name); WriteString2(&msg, ": "); // WriteString2(&msg, "\x8d "); + if (ov->conmenussupported) + WriteString2(&msg, "^s"); WriteString2(&msg, message); WriteString(&msg, "\n"); @@ -3459,8 +3480,9 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) char buf[1024]; netmsg_t msg; int i; + int iscont; - v->delta_frame = -1; + v->delta_frames[v->netchan.incoming_sequence & (ENTITY_FRAMES-1)] = -1; while (m->readpos < m->cursize) { @@ -3470,18 +3492,19 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) case clc_nop: return; case clc_delta: - v->delta_frame = ReadByte(m); + v->delta_frames[v->netchan.incoming_sequence & (ENTITY_FRAMES-1)] = ReadByte(m); break; case clc_stringcmd: ReadString (m, buf, sizeof(buf)); -// printf("stringcmd: %s\n", buf); + + iscont = v->server && v->server->controller == v; if (!strncmp(buf, "cmd ", 4)) { if (v->server && v->server->controller == v) SendClientCommand(v->server, "%s", buf+4); } - else if (!strcmp(buf, "new")) + else if (!iscont && !strcmp(buf, "new")) { if (qtv && qtv->parsingconnectiondata) QW_StuffcmdToViewer(v, "cmd new\n"); @@ -3491,7 +3514,7 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) SendServerData(qtv, v); } } - else if (!strncmp(buf, "modellist ", 10)) + else if (!iscont && !strncmp(buf, "modellist ", 10)) { char *cmd = buf+10; int svcount = atoi(cmd); @@ -3515,7 +3538,7 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) SendList(qtv, first, qtv->modellist, svc_modellist, &msg); SendBufferToViewer(v, msg.data, msg.cursize, true); } - else if (!strncmp(buf, "soundlist ", 10)) + else if (!iscont && !strncmp(buf, "soundlist ", 10)) { char *cmd = buf+10; int svcount = atoi(cmd); @@ -3539,7 +3562,7 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) SendList(qtv, first, qtv->soundlist, svc_soundlist, &msg); SendBufferToViewer(v, msg.data, msg.cursize, true); } - else if (!strncmp(buf, "prespawn", 8)) + else if (!iscont && !strncmp(buf, "prespawn", 8)) { char skin[128]; @@ -3605,7 +3628,7 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) SendBufferToViewer(v, skin, strlen(skin)+1, true); } } - else if (!strncmp(buf, "spawn", 5)) + else if (!iscont && !strncmp(buf, "spawn", 5)) { char skin[64]; sprintf(skin, "%cskins\n", svc_stufftext); @@ -3613,7 +3636,13 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) QW_PositionAtIntermission(qtv, v); } - else if (!strncmp(buf, "begin", 5)) + else if (iscont && !strncmp(buf, "begin", 5)) + { //the client made it! + v->thinksitsconnected = true; + qtv->parsingconnectiondata = false; + SendClientCommand(v->server, "%s", buf); + } + else if (!iscont && !strncmp(buf, "begin", 5)) { int oldmenu; viewer_t *com; @@ -3681,7 +3710,7 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) v->trackplayer = -1; QW_SetCommentator(cluster, v, NULL); //clicking out will stop the client from tracking thier commentator } - else if (!strncmp(buf, "pings", 5)) + else if (!iscont && !strncmp(buf, "pings", 5)) { } else if (!strncmp(buf, "say \"", 5)) @@ -3774,7 +3803,9 @@ void ParseQWC(cluster_t *cluster, sv_t *qtv, viewer_t *v, netmsg_t *m) else { if (v->server && v->server->controller == v) + { SendClientCommand(v->server, "%s", buf); + } else Sys_Printf(cluster, "Client sent unknown string command: %s\n", buf); } @@ -4454,8 +4485,13 @@ void SendViewerPackets(cluster_t *cluster, viewer_t *v) v->nextpacket = cluster->curtime+1000/NQ_PACKETS_PER_SECOND; useserver = v->server; - if (useserver && useserver->parsingconnectiondata) - useserver = NULL; + if (useserver && useserver->controller == v) + v->netchan.outgoing_sequence = useserver->netchan.incoming_sequence; + else + { + if (useserver && useserver->parsingconnectiondata) + useserver = NULL; + } v->maysend = false; InitNetMsg(&m, buffer, MAX_MSGLEN); @@ -4470,16 +4506,25 @@ void SendViewerPackets(cluster_t *cluster, viewer_t *v) } if (v->menunum) Menu_Draw(cluster, v); - else if (v->server && v->server->parsingconnectiondata) + else if (v->server && v->server->parsingconnectiondata && v->server->controller != v) { WriteByte(&m, svc_centerprint); WriteString(&m, v->server->status); } -//printf("in %i, out %i, ", v->netchan.incoming_sequence, v->netchan.outgoing_sequence); +//printf("in %i, out %i\n", v->netchan.incoming_sequence, v->netchan.outgoing_sequence); //if (v->netchan.incoming_sequence != v->netchan.outgoing_sequence) -//printf("%s: in %i, out %i\n", v->name, v->netchan.incoming_sequence, v->netchan.outgoing_sequence); - Netchan_Transmit(cluster, &v->netchan, m.cursize, m.data); +printf("%s: in %i, out %i\n", v->name, v->netchan.incoming_sequence, v->netchan.outgoing_sequence); + if (v->server && v->server->controller == v) + { + int saved; + saved = v->netchan.incoming_sequence; + v->netchan.incoming_sequence = v->server->netchan.incoming_sequence; + Netchan_Transmit(cluster, &v->netchan, m.cursize, m.data); + v->netchan.incoming_sequence = saved; + } + else + Netchan_Transmit(cluster, &v->netchan, m.cursize, m.data); if (!v->netchan.message.cursize && v->backbuffered) {//shift the backbuffers around @@ -4600,20 +4645,19 @@ void QW_UpdateUDPStuff(cluster_t *cluster) if (Netchan_Process(&v->netchan, &m)) { useserver = v->server; - if (useserver && useserver->parsingconnectiondata) + if (useserver && useserver->parsingconnectiondata && useserver->controller != v) useserver = NULL; v->timeout = cluster->curtime + 15*1000; - v->netchan.outgoing_sequence = v->netchan.incoming_sequence; //compensate for client->server packetloss. if (v->server && v->server->controller == v) { // v->maysend = true; v->server->maysend = true; - v->server->netchan.outgoing_sequence = v->netchan.incoming_sequence + v->server->controllersquencebias; } else { + v->netchan.outgoing_sequence = v->netchan.incoming_sequence; //compensate for client->server packetloss. if (!v->server) v->maysend = true; else if (!v->chokeme || !cluster->chokeonnotupdated) diff --git a/fteqtv/source.c b/fteqtv/source.c index 05733984b..734b139cf 100644 --- a/fteqtv/source.c +++ b/fteqtv/source.c @@ -667,6 +667,7 @@ int SV_SayToUpstream(sv_t *qtv, char *message) { char buffer[1024]; netmsg_t nm; + if (!qtv->upstreamacceptschat) { Sys_Printf(qtv->cluster, "not forwarding say\n"); @@ -1035,6 +1036,7 @@ void QTV_Shutdown(sv_t *qtv) viewer_t *v; sv_t *peer; cluster_t *cluster; + int i; Sys_Printf(qtv->cluster, "Closing source %s\n", qtv->server); if (qtv->sourcesock != INVALID_SOCKET) @@ -1087,6 +1089,14 @@ void QTV_Shutdown(sv_t *qtv) } } + for (i = 0; i < ENTITY_FRAMES; i++) + { + if (qtv->frame[i].ents) + free(qtv->frame[i].ents); + if (qtv->frame[i].entnums) + free(qtv->frame[i].entnums); + } + for (prox = qtv->proxies; prox; ) { if (prox->file) @@ -1325,8 +1335,6 @@ void QTV_ParseQWStream(sv_t *qtv) qtv->controller->maysend = true; //if (qtv->controller->netchan.outgoing_sequence != qtv->controller->netchan.incoming_sequence) //printf("bug is here\n"); - qtv->controller->netchan.outgoing_sequence = qtv->controller->netchan.incoming_sequence; -// qtv->controller->netchan.incoming_sequence = qtv->netchan.incoming_acknowledged; } } } @@ -1502,8 +1510,7 @@ void QTV_Run(sv_t *qtv) if (qtv->controller && !qtv->controller->netchan.isnqprotocol) { -// qtv->netchan.outgoing_sequence = qtv->controller->netchan.incoming_sequence; -// qtv->netchan.incoming_sequence = qtv->controller->netchan.incoming_acknowledged; + qtv->netchan.outgoing_sequence = qtv->controller->netchan.incoming_sequence; if (qtv->maysend) { qtv->maysend = false;