Fixed qtvplay, added a workaround for eztv proxies.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2799 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
1c85bc472b
commit
c77d0a981a
3 changed files with 68 additions and 17 deletions
|
@ -30,6 +30,9 @@ int cls_lasttype;
|
||||||
void CL_PlayDemo(char *demoname);
|
void CL_PlayDemo(char *demoname);
|
||||||
char lastdemoname[256];
|
char lastdemoname[256];
|
||||||
|
|
||||||
|
extern cvar_t qtv_workaroundeztv;
|
||||||
|
|
||||||
|
#define BUFFERTIME 0.1
|
||||||
/*
|
/*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
|
@ -175,7 +178,7 @@ int demo_preparsedemo(unsigned char *buffer, int bytes)
|
||||||
if (ofs+4 > bytes)
|
if (ofs+4 > bytes)
|
||||||
break;
|
break;
|
||||||
length = (buffer[ofs+0]<<0) + (buffer[ofs+1]<<8) + (buffer[ofs+2]<<16) + (buffer[ofs+3]<<24);
|
length = (buffer[ofs+0]<<0) + (buffer[ofs+1]<<8) + (buffer[ofs+2]<<16) + (buffer[ofs+3]<<24);
|
||||||
if (length > 1500)
|
if (length > MAX_OVERALLMSGLEN)
|
||||||
return parsed;
|
return parsed;
|
||||||
ofs+=4;
|
ofs+=4;
|
||||||
}
|
}
|
||||||
|
@ -210,11 +213,14 @@ int demopreparsedbytes;
|
||||||
int readdemobytes(int *readpos, void *data, int len)
|
int readdemobytes(int *readpos, void *data, int len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int trybytes;
|
||||||
|
|
||||||
if (demopreparsedbytes < 0) //won't happen in normal running, but can still happen on corrupt data... if we don't disconnect first.
|
if (demopreparsedbytes < 0) //won't happen in normal running, but can still happen on corrupt data... if we don't disconnect first.
|
||||||
demopreparsedbytes = 0;
|
demopreparsedbytes = 0;
|
||||||
|
|
||||||
i = VFS_READ(cls.demofile, demobuffer+demobuffersize, sizeof(demobuffer)-demobuffersize);
|
trybytes = sizeof(demobuffer)-demobuffersize;
|
||||||
|
|
||||||
|
i = VFS_READ(cls.demofile, demobuffer+demobuffersize, trybytes);
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{
|
{
|
||||||
demobuffersize += i;
|
demobuffersize += i;
|
||||||
|
@ -222,14 +228,16 @@ int readdemobytes(int *readpos, void *data, int len)
|
||||||
}
|
}
|
||||||
else if (i < 0)
|
else if (i < 0)
|
||||||
{ //0 means no data available yet
|
{ //0 means no data available yet
|
||||||
printf("VFS_READ failed: %i\n", i);
|
printf("VFS_READ failed\n");
|
||||||
|
// CL_StopPlayback();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (len > demobuffersize)
|
if (len > demobuffersize)
|
||||||
{
|
{
|
||||||
len = demobuffersize;
|
len = demobuffersize;
|
||||||
|
|
||||||
//CL_StopPlayback();
|
|
||||||
}
|
}
|
||||||
memcpy(data, demobuffer+*readpos, len);
|
memcpy(data, demobuffer+*readpos, len);
|
||||||
*readpos += len;
|
*readpos += len;
|
||||||
|
@ -445,7 +453,9 @@ readnext:
|
||||||
realtime = olddemotime - 1.0;
|
realtime = olddemotime - 1.0;
|
||||||
|
|
||||||
if (readdemobytes(&demopos, &msecsadded, sizeof(msecsadded)) != sizeof(msecsadded))
|
if (readdemobytes(&demopos, &msecsadded, sizeof(msecsadded)) != sizeof(msecsadded))
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
demotime = olddemotime + msecsadded*(1.0f/1000);
|
demotime = olddemotime + msecsadded*(1.0f/1000);
|
||||||
nextdemotime = demotime;
|
nextdemotime = demotime;
|
||||||
}
|
}
|
||||||
|
@ -491,7 +501,7 @@ readnext:
|
||||||
|
|
||||||
if (cls.demoplayback == DPB_MVD)
|
if (cls.demoplayback == DPB_MVD)
|
||||||
{
|
{
|
||||||
if (msecsadded)
|
if (msecsadded || cls.netchan.incoming_sequence < 2)
|
||||||
{
|
{
|
||||||
cls.netchan.incoming_sequence++;
|
cls.netchan.incoming_sequence++;
|
||||||
cls.netchan.incoming_acknowledged++;
|
cls.netchan.incoming_acknowledged++;
|
||||||
|
@ -600,7 +610,9 @@ readit:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (readdemobytes (&demopos, net_message.data, msglength) != msglength)
|
if (readdemobytes (&demopos, net_message.data, msglength) != msglength)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
net_message.cursize = msglength;
|
net_message.cursize = msglength;
|
||||||
|
|
||||||
if (cls.demoplayback == DPB_MVD)
|
if (cls.demoplayback == DPB_MVD)
|
||||||
|
@ -666,7 +678,6 @@ readit:
|
||||||
CL_StopPlayback ();
|
CL_StopPlayback ();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
demo_flushbytes(demopos);
|
demo_flushbytes(demopos);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1422,7 +1433,6 @@ void CL_PlayDemo(char *demoname)
|
||||||
|
|
||||||
void CL_QTVPlay (vfsfile_t *newf)
|
void CL_QTVPlay (vfsfile_t *newf)
|
||||||
{
|
{
|
||||||
#define BUFFERTIME 10
|
|
||||||
CL_Disconnect_f ();
|
CL_Disconnect_f ();
|
||||||
|
|
||||||
cls.demofile = newf;
|
cls.demofile = newf;
|
||||||
|
@ -1438,7 +1448,6 @@ void CL_QTVPlay (vfsfile_t *newf)
|
||||||
realtime = -BUFFERTIME;
|
realtime = -BUFFERTIME;
|
||||||
cl.gametime = -BUFFERTIME;
|
cl.gametime = -BUFFERTIME;
|
||||||
cl.gametimemark = realtime;
|
cl.gametimemark = realtime;
|
||||||
|
|
||||||
Con_Printf("Buffering for %i seconds\n", (int)-realtime);
|
Con_Printf("Buffering for %i seconds\n", (int)-realtime);
|
||||||
|
|
||||||
cls.netchan.last_received=realtime;
|
cls.netchan.last_received=realtime;
|
||||||
|
@ -1706,8 +1715,17 @@ void CL_QTVPlay_f (void)
|
||||||
else
|
else
|
||||||
host = NULL;
|
host = NULL;
|
||||||
|
|
||||||
connrequest = "QTV\n"
|
if (qtv_workaroundeztv.value)
|
||||||
"VERSION: 1.1\n";
|
{
|
||||||
|
connrequest = "QTV\n"
|
||||||
|
"VERSION: 1.0\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
connrequest = "QTV\n"
|
||||||
|
"VERSION: 1.1\n";
|
||||||
|
}
|
||||||
|
|
||||||
VFS_WRITE(newf, connrequest, strlen(connrequest));
|
VFS_WRITE(newf, connrequest, strlen(connrequest));
|
||||||
if (raw)
|
if (raw)
|
||||||
{
|
{
|
||||||
|
@ -1756,8 +1774,16 @@ void CL_QTVList_f (void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
connrequest = "QTV\n"
|
if (qtv_workaroundeztv.value)
|
||||||
"VERSION: 1.1\n";
|
{
|
||||||
|
connrequest = "QTV\n"
|
||||||
|
"VERSION: 1.0\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
connrequest = "QTV\n"
|
||||||
|
"VERSION: 1.1\n";
|
||||||
|
}
|
||||||
VFS_WRITE(newf, connrequest, strlen(connrequest));
|
VFS_WRITE(newf, connrequest, strlen(connrequest));
|
||||||
connrequest = "SOURCELIST\n";
|
connrequest = "SOURCELIST\n";
|
||||||
VFS_WRITE(newf, connrequest, strlen(connrequest));
|
VFS_WRITE(newf, connrequest, strlen(connrequest));
|
||||||
|
|
|
@ -73,6 +73,7 @@ cvar_t cl_predict_players2 = SCVAR("cl_predict_players2", "1");
|
||||||
cvar_t cl_solid_players = SCVAR("cl_solid_players", "1");
|
cvar_t cl_solid_players = SCVAR("cl_solid_players", "1");
|
||||||
cvar_t cl_noblink = SCVAR("cl_noblink", "0");
|
cvar_t cl_noblink = SCVAR("cl_noblink", "0");
|
||||||
cvar_t cl_servername = SCVAR("cl_servername", "none");
|
cvar_t cl_servername = SCVAR("cl_servername", "none");
|
||||||
|
cvar_t qtv_workaroundeztv = SCVAR("qtv_workaroundeztv", "0");
|
||||||
|
|
||||||
cvar_t cl_demospeed = FCVAR("cl_demospeed", "demo_setspeed", "1", 0);
|
cvar_t cl_demospeed = FCVAR("cl_demospeed", "demo_setspeed", "1", 0);
|
||||||
|
|
||||||
|
@ -2515,6 +2516,7 @@ void CL_ReadPackets (void)
|
||||||
{
|
{
|
||||||
MSG_BeginReading();
|
MSG_BeginReading();
|
||||||
cls.netchan.last_received = realtime;
|
cls.netchan.last_received = realtime;
|
||||||
|
cls.netchan.outgoing_sequence = cls.netchan.incoming_sequence;
|
||||||
}
|
}
|
||||||
else if (!Netchan_Process(&cls.netchan))
|
else if (!Netchan_Process(&cls.netchan))
|
||||||
continue; // wasn't accepted for some reason
|
continue; // wasn't accepted for some reason
|
||||||
|
@ -2901,6 +2903,8 @@ void CL_Init (void)
|
||||||
Cvar_Register (&ruleset_allow_particle_lightning, cl_controlgroup);
|
Cvar_Register (&ruleset_allow_particle_lightning, cl_controlgroup);
|
||||||
Cvar_Register (&ruleset_allow_overlongsounds, cl_controlgroup);
|
Cvar_Register (&ruleset_allow_overlongsounds, cl_controlgroup);
|
||||||
Cvar_Register (&ruleset_allow_larger_models, cl_controlgroup);
|
Cvar_Register (&ruleset_allow_larger_models, cl_controlgroup);
|
||||||
|
|
||||||
|
Cvar_Register (&qtv_workaroundeztv, cl_controlgroup);
|
||||||
#ifdef WEBCLIENT
|
#ifdef WEBCLIENT
|
||||||
Cmd_AddCommand ("ftp", CL_FTP_f);
|
Cmd_AddCommand ("ftp", CL_FTP_f);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2180,20 +2180,37 @@ int VFSTCP_ReadBytes (struct vfsfile_s *file, void *buffer, int bytestoread)
|
||||||
{
|
{
|
||||||
tcpfile_t *tf = (tcpfile_t*)file;
|
tcpfile_t *tf = (tcpfile_t*)file;
|
||||||
int len;
|
int len;
|
||||||
|
int trying;
|
||||||
|
|
||||||
if (tf->sock != INVALID_SOCKET)
|
if (tf->sock != INVALID_SOCKET)
|
||||||
{
|
{
|
||||||
len = recv(tf->sock, tf->readbuffer + tf->readbuffered, sizeof(tf->readbuffer) - tf->readbuffered, 0);
|
trying = sizeof(tf->readbuffer) - tf->readbuffered;
|
||||||
|
if (trying > 1500)
|
||||||
|
trying = 1500;
|
||||||
|
len = recv(tf->sock, tf->readbuffer + tf->readbuffered, trying, 0);
|
||||||
if (len == -1)
|
if (len == -1)
|
||||||
{
|
{
|
||||||
|
if (errno != EWOULDBLOCK)
|
||||||
|
printf("socket error\n");
|
||||||
//fixme: figure out wouldblock or error
|
//fixme: figure out wouldblock or error
|
||||||
}
|
}
|
||||||
else if (len == 0)
|
else if (len == 0 && trying != 0)
|
||||||
|
{
|
||||||
VFSTCP_Error(tf);
|
VFSTCP_Error(tf);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
tf->readbuffered += len;
|
tf->readbuffered += len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (bytestoread <= tf->readbuffered)
|
|
||||||
|
//return a partially filled buffer.
|
||||||
|
if (bytestoread > tf->readbuffered)
|
||||||
|
bytestoread = tf->readbuffered;
|
||||||
|
if (bytestoread < 0)
|
||||||
|
Host_Error("VFSTCP_ReadBytes: negative size request\n");
|
||||||
|
|
||||||
|
if (bytestoread > 0)
|
||||||
{
|
{
|
||||||
memcpy(buffer, tf->readbuffer, bytestoread);
|
memcpy(buffer, tf->readbuffer, bytestoread);
|
||||||
tf->readbuffered -= bytestoread;
|
tf->readbuffered -= bytestoread;
|
||||||
|
@ -2201,7 +2218,11 @@ int VFSTCP_ReadBytes (struct vfsfile_s *file, void *buffer, int bytestoread)
|
||||||
return bytestoread;
|
return bytestoread;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return 0;
|
{
|
||||||
|
if (tf->sock == INVALID_SOCKET)
|
||||||
|
return -1; //signal an error
|
||||||
|
return 0; //signal nothing available
|
||||||
|
}
|
||||||
}
|
}
|
||||||
int VFSTCP_WriteBytes (struct vfsfile_s *file, void *buffer, int bytestoread)
|
int VFSTCP_WriteBytes (struct vfsfile_s *file, void *buffer, int bytestoread)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue