2007-06-21 22:00:00 +02:00
|
|
|
/*
|
|
|
|
Copyright (C) 1997-2001 Id Software, Inc.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
*/
|
|
|
|
// cl_parse.c -- parse a message received from the server
|
|
|
|
|
2008-06-09 22:00:00 +02:00
|
|
|
#include "common.h"
|
2007-06-21 22:00:00 +02:00
|
|
|
#include "client.h"
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
void CL_DownloadFileName(char *dest, int destlen, char *fn)
|
|
|
|
{
|
|
|
|
strncpy(dest, fn, destlen );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============
|
|
|
|
CL_CheckOrDownloadFile
|
|
|
|
|
|
|
|
Returns true if the file exists, otherwise it attempts
|
|
|
|
to start a download from the server.
|
|
|
|
===============
|
|
|
|
*/
|
|
|
|
bool CL_CheckOrDownloadFile (char *filename)
|
|
|
|
{
|
|
|
|
file_t *fp;
|
|
|
|
char name[MAX_SYSPATH];
|
|
|
|
|
|
|
|
if (strstr (filename, ".."))
|
|
|
|
{
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg ("Refusing to download a path with ..\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (FS_LoadFile (filename, NULL))
|
|
|
|
{
|
|
|
|
// it exists, no need to download
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
strcpy (cls.downloadname, filename);
|
2007-08-01 22:00:00 +02:00
|
|
|
strcpy (cls.downloadtempname, filename);
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
// download to a temp name, and only rename
|
|
|
|
// to the real name when done, so if interrupted
|
|
|
|
// a runt file wont be left
|
2007-08-01 22:00:00 +02:00
|
|
|
FS_StripExtension (cls.downloadtempname);
|
|
|
|
FS_DefaultExtension(cls.downloadtempname, ".tmp");
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
//ZOID
|
|
|
|
// check to see if we already have a tmp for this file, if so, try to resume
|
|
|
|
// open the file if not opened yet
|
|
|
|
CL_DownloadFileName(name, sizeof(name), cls.downloadtempname);
|
|
|
|
|
|
|
|
|
|
|
|
fp = FS_Open(name, "r+b");
|
|
|
|
if (fp)
|
|
|
|
{
|
|
|
|
// it exists
|
|
|
|
int len;
|
|
|
|
FS_Seek(fp, 0, SEEK_END);
|
|
|
|
len = FS_Tell(fp);
|
|
|
|
|
|
|
|
cls.download = fp;
|
|
|
|
|
|
|
|
// give the server an offset to start the download
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg ("Resuming %s\n", cls.downloadname);
|
2008-07-15 22:00:00 +02:00
|
|
|
MSG_WriteByte( &cls.netchan.message, clc_stringcmd );
|
|
|
|
MSG_Print( &cls.netchan.message, va("download %s %i", cls.downloadname, len));
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg ("Downloading %s\n", cls.downloadname);
|
2008-07-15 22:00:00 +02:00
|
|
|
MSG_WriteByte( &cls.netchan.message, clc_stringcmd );
|
|
|
|
MSG_Print( &cls.netchan.message, va("download %s", cls.downloadname));
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
cls.downloadnumber++;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============
|
|
|
|
CL_Download_f
|
|
|
|
|
|
|
|
Request a download from the server
|
|
|
|
===============
|
|
|
|
*/
|
|
|
|
void CL_Download_f (void)
|
|
|
|
{
|
|
|
|
char filename[MAX_OSPATH];
|
|
|
|
|
|
|
|
if (Cmd_Argc() != 2)
|
|
|
|
{
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg("Usage: download <filename>\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-06-09 22:00:00 +02:00
|
|
|
com.sprintf(filename, "%s", Cmd_Argv(1));
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
if (strstr (filename, ".."))
|
|
|
|
{
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg ("Refusing to download a path with ..\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (FS_LoadFile (filename, NULL))
|
|
|
|
{
|
|
|
|
// it exists, no need to download
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg("File already exists.\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
strcpy (cls.downloadname, filename);
|
2007-08-01 22:00:00 +02:00
|
|
|
strcpy (cls.downloadtempname, filename);
|
|
|
|
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg ("Downloading %s\n", cls.downloadname);
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
// download to a temp name, and only rename
|
|
|
|
// to the real name when done, so if interrupted
|
|
|
|
// a runt file wont be left
|
2007-08-01 22:00:00 +02:00
|
|
|
|
|
|
|
|
|
|
|
// download to a temp name, and only rename
|
|
|
|
// to the real name when done, so if interrupted
|
|
|
|
// a runt file wont be left
|
|
|
|
FS_StripExtension (cls.downloadtempname);
|
|
|
|
FS_DefaultExtension(cls.downloadtempname, ".tmp");
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-07-15 22:00:00 +02:00
|
|
|
MSG_WriteByte( &cls.netchan.message, clc_stringcmd );
|
|
|
|
MSG_Print( &cls.netchan.message, va("download %s", cls.downloadname));
|
2007-06-21 22:00:00 +02:00
|
|
|
cls.downloadnumber++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
======================
|
|
|
|
CL_RegisterSounds
|
|
|
|
======================
|
|
|
|
*/
|
|
|
|
void CL_RegisterSounds (void)
|
|
|
|
{
|
2008-06-30 22:00:00 +02:00
|
|
|
int i;
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2007-11-01 22:00:00 +01:00
|
|
|
S_BeginRegistration();
|
|
|
|
for (i = 1; i < MAX_SOUNDS; i++)
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2007-11-01 22:00:00 +01:00
|
|
|
if (!cl.configstrings[CS_SOUNDS+i][0]) break;
|
2007-06-21 22:00:00 +02:00
|
|
|
cl.sound_precache[i] = S_RegisterSound (cl.configstrings[CS_SOUNDS+i]);
|
2008-07-11 22:00:00 +02:00
|
|
|
Sys_SendKeyEvents (); // pump message loop
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
2007-11-01 22:00:00 +01:00
|
|
|
S_EndRegistration();
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
=====================
|
|
|
|
CL_ParseDownload
|
|
|
|
|
|
|
|
A download message has been received from the server
|
|
|
|
=====================
|
|
|
|
*/
|
2008-05-20 22:00:00 +02:00
|
|
|
void CL_ParseDownload( sizebuf_t *msg )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
|
|
|
int size, percent;
|
2008-05-20 22:00:00 +02:00
|
|
|
string name;
|
2007-06-21 22:00:00 +02:00
|
|
|
int r;
|
|
|
|
|
|
|
|
// read the data
|
2008-05-20 22:00:00 +02:00
|
|
|
size = MSG_ReadShort( msg );
|
|
|
|
percent = MSG_ReadByte( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
if (size == -1)
|
|
|
|
{
|
2008-05-20 22:00:00 +02:00
|
|
|
Msg("Server does not have this file.\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
if (cls.download)
|
|
|
|
{
|
|
|
|
// if here, we tried to resume a file but the server said no
|
2008-05-20 22:00:00 +02:00
|
|
|
FS_Close(cls.download);
|
2007-06-21 22:00:00 +02:00
|
|
|
cls.download = NULL;
|
|
|
|
}
|
|
|
|
CL_RequestNextDownload ();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// open the file if not opened yet
|
|
|
|
if (!cls.download)
|
|
|
|
{
|
|
|
|
CL_DownloadFileName(name, sizeof(name), cls.downloadtempname);
|
|
|
|
|
|
|
|
cls.download = FS_Open (name, "wb");
|
|
|
|
if (!cls.download)
|
|
|
|
{
|
2008-05-20 22:00:00 +02:00
|
|
|
msg->readcount += size;
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg ("Failed to open %s\n", cls.downloadtempname);
|
2007-06-21 22:00:00 +02:00
|
|
|
CL_RequestNextDownload ();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-05-20 22:00:00 +02:00
|
|
|
FS_Write (cls.download, msg->data + msg->readcount, size );
|
|
|
|
msg->readcount += size;
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
if (percent != 100)
|
|
|
|
{
|
|
|
|
// request next block
|
|
|
|
cls.downloadpercent = percent;
|
2008-07-15 22:00:00 +02:00
|
|
|
MSG_WriteByte( &cls.netchan.message, clc_stringcmd );
|
|
|
|
MSG_Print( &cls.netchan.message, "nextdl" );
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char oldn[MAX_OSPATH];
|
|
|
|
char newn[MAX_OSPATH];
|
|
|
|
|
|
|
|
FS_Close (cls.download);
|
|
|
|
|
|
|
|
// rename the temp file to it's final name
|
|
|
|
CL_DownloadFileName(oldn, sizeof(oldn), cls.downloadtempname);
|
|
|
|
CL_DownloadFileName(newn, sizeof(newn), cls.downloadname);
|
|
|
|
r = rename (oldn, newn);
|
|
|
|
if (r)
|
2007-07-28 22:00:00 +02:00
|
|
|
Msg ("failed to rename.\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
cls.download = NULL;
|
|
|
|
cls.downloadpercent = 0;
|
|
|
|
|
|
|
|
// get another file if needed
|
|
|
|
|
|
|
|
CL_RequestNextDownload ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
=====================================================================
|
|
|
|
|
|
|
|
SERVER CONNECTING MESSAGES
|
|
|
|
|
|
|
|
=====================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
==================
|
|
|
|
CL_ParseServerData
|
|
|
|
==================
|
|
|
|
*/
|
2008-05-20 22:00:00 +02:00
|
|
|
void CL_ParseServerData( sizebuf_t *msg )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2007-11-17 22:00:00 +01:00
|
|
|
char *str;
|
2007-06-21 22:00:00 +02:00
|
|
|
int i;
|
2007-10-19 22:00:00 +02:00
|
|
|
|
2008-07-11 22:00:00 +02:00
|
|
|
MsgDev(D_INFO, "Serverdata packet received.\n");
|
|
|
|
|
2007-11-04 22:00:00 +01:00
|
|
|
// wipe the client_t struct
|
2008-07-12 22:00:00 +02:00
|
|
|
CL_ClearState();
|
2007-06-21 22:00:00 +02:00
|
|
|
cls.state = ca_connected;
|
|
|
|
|
2007-09-10 22:00:00 +02:00
|
|
|
// parse protocol version number
|
2008-05-20 22:00:00 +02:00
|
|
|
i = MSG_ReadLong( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
cls.serverProtocol = i;
|
|
|
|
|
2008-07-12 22:00:00 +02:00
|
|
|
if( i != PROTOCOL_VERSION ) Host_Error("Server returned version %i, not %i", i, PROTOCOL_VERSION );
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-05-20 22:00:00 +02:00
|
|
|
cl.servercount = MSG_ReadLong( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
// parse player entity number
|
2008-05-20 22:00:00 +02:00
|
|
|
cl.playernum = MSG_ReadShort( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
// get the full level name
|
2008-05-20 22:00:00 +02:00
|
|
|
str = MSG_ReadString( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-07-12 22:00:00 +02:00
|
|
|
if( cl.playernum == -1 )
|
2007-09-10 22:00:00 +02:00
|
|
|
{
|
|
|
|
// playing a cinematic or showing a pic, not a level
|
2007-11-06 22:00:00 +01:00
|
|
|
SCR_PlayCinematic( str, 0 );
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-07-12 22:00:00 +02:00
|
|
|
// get splash name
|
|
|
|
Cvar_Set( "cl_levelshot_name", va("background/%s.tga", str ));
|
|
|
|
Cvar_SetValue("scr_loading", 0.0f ); // reset progress bar
|
|
|
|
if(!FS_FileExists(va("gfx/%s", Cvar_VariableString("cl_levelshot_name"))))
|
|
|
|
{
|
|
|
|
Cvar_Set("cl_levelshot_name", "common/black");
|
|
|
|
cl.make_levelshot = true; // make levelshot
|
|
|
|
}
|
2007-06-21 22:00:00 +02:00
|
|
|
// seperate the printfs so the server message can have a color
|
2007-11-08 22:00:00 +01:00
|
|
|
Msg("\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
// need to prep refresh at next oportunity
|
|
|
|
cl.refresh_prepped = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
==================
|
|
|
|
CL_ParseBaseline
|
|
|
|
==================
|
|
|
|
*/
|
2008-05-20 22:00:00 +02:00
|
|
|
void CL_ParseBaseline( sizebuf_t *msg )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2007-10-29 22:00:00 +01:00
|
|
|
int newnum;
|
2007-06-21 22:00:00 +02:00
|
|
|
entity_state_t nullstate;
|
2008-07-01 22:00:00 +02:00
|
|
|
edict_t *ent;
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-07-15 22:00:00 +02:00
|
|
|
CL_VM_Begin();
|
|
|
|
memset( &nullstate, 0, sizeof(nullstate));
|
|
|
|
newnum = MSG_ReadBits( msg, NET_WORD );
|
2008-07-01 22:00:00 +02:00
|
|
|
|
|
|
|
// allocate edicts
|
|
|
|
while( newnum >= prog->num_edicts ) PRVM_ED_Alloc();
|
|
|
|
ent = PRVM_EDICT_NUM( newnum );
|
|
|
|
|
2008-07-12 22:00:00 +02:00
|
|
|
MSG_ReadDeltaEntity( msg, &nullstate, &ent->priv.cl->baseline, newnum );
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
CL_LoadClientinfo
|
|
|
|
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void CL_LoadClientinfo (clientinfo_t *ci, char *s)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
char *t;
|
|
|
|
char model_name[MAX_QPATH];
|
|
|
|
char skin_name[MAX_QPATH];
|
|
|
|
char model_filename[MAX_QPATH];
|
|
|
|
char weapon_filename[MAX_QPATH];
|
|
|
|
|
|
|
|
strncpy(ci->cinfo, s, sizeof(ci->cinfo));
|
|
|
|
ci->cinfo[sizeof(ci->cinfo)-1] = 0;
|
|
|
|
|
|
|
|
// isolate the player's name
|
|
|
|
strncpy(ci->name, s, sizeof(ci->name));
|
|
|
|
ci->name[sizeof(ci->name)-1] = 0;
|
|
|
|
t = strstr (s, "\\");
|
|
|
|
if (t)
|
|
|
|
{
|
|
|
|
ci->name[t-s] = 0;
|
|
|
|
s = t+1;
|
|
|
|
}
|
|
|
|
|
2008-06-29 22:00:00 +02:00
|
|
|
if( *s == 0)
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2008-06-09 22:00:00 +02:00
|
|
|
com.sprintf (model_filename, "models/players/gordon/player.mdl");
|
|
|
|
com.sprintf (weapon_filename, "models/weapons/w_glock.mdl");
|
2007-08-17 22:00:00 +02:00
|
|
|
ci->model = re->RegisterModel (model_filename);
|
2007-06-21 22:00:00 +02:00
|
|
|
memset(ci->weaponmodel, 0, sizeof(ci->weaponmodel));
|
2007-08-17 22:00:00 +02:00
|
|
|
ci->weaponmodel[0] = re->RegisterModel (weapon_filename);
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// isolate the model name
|
2008-06-09 22:00:00 +02:00
|
|
|
com.strcpy (model_name, s);
|
2007-06-21 22:00:00 +02:00
|
|
|
t = strstr(model_name, "/");
|
2007-09-14 22:00:00 +02:00
|
|
|
if (!t) t = strstr(model_name, "\\");
|
|
|
|
if (!t) t = model_name;
|
2007-06-21 22:00:00 +02:00
|
|
|
*t = 0;
|
|
|
|
|
|
|
|
// isolate the skin name
|
|
|
|
strcpy (skin_name, s + strlen(model_name) + 1);
|
|
|
|
|
|
|
|
// model file
|
2008-06-09 22:00:00 +02:00
|
|
|
com.sprintf (model_filename, "models/players/%s/player.mdl", model_name);
|
2007-08-17 22:00:00 +02:00
|
|
|
ci->model = re->RegisterModel (model_filename);
|
2007-06-21 22:00:00 +02:00
|
|
|
if (!ci->model)
|
|
|
|
{
|
2008-06-09 22:00:00 +02:00
|
|
|
com.strcpy(model_name, "gordon");
|
|
|
|
com.sprintf (model_filename, "models/players/gordon/player.mdl");
|
2007-08-17 22:00:00 +02:00
|
|
|
ci->model = re->RegisterModel (model_filename);
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// if we don't have the skin and the model wasn't male,
|
|
|
|
// see if the male has it (this is for CTF's skins)
|
2007-08-01 22:00:00 +02:00
|
|
|
if (!ci->skin && strcasecmp(model_name, "male"))
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
|
|
|
// change model to male
|
2008-06-09 22:00:00 +02:00
|
|
|
com.strcpy(model_name, "male");
|
|
|
|
com.sprintf (model_filename, "models/players/gordon/player.mdl");
|
2007-08-17 22:00:00 +02:00
|
|
|
ci->model = re->RegisterModel (model_filename);
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// weapon file
|
2007-09-14 22:00:00 +02:00
|
|
|
for (i = 0; i < num_cl_weaponmodels; i++)
|
|
|
|
{
|
2008-06-09 22:00:00 +02:00
|
|
|
com.sprintf (weapon_filename, "models/weapons/%s", cl_weaponmodels[i]);
|
2007-08-17 22:00:00 +02:00
|
|
|
ci->weaponmodel[i] = re->RegisterModel(weapon_filename);
|
2007-09-14 22:00:00 +02:00
|
|
|
if (!cl_vwep->value) break; // only one when vwep is off
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// must have loaded all data types to be valud
|
2008-06-28 22:00:00 +02:00
|
|
|
if (!ci->skin || !ci->model || !ci->weaponmodel[0])
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
|
|
|
ci->skin = NULL;
|
|
|
|
ci->model = NULL;
|
|
|
|
ci->weaponmodel[0] = NULL;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
CL_ParseClientinfo
|
|
|
|
|
|
|
|
Load the skin, icon, and model for a client
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void CL_ParseClientinfo (int player)
|
|
|
|
{
|
|
|
|
char *s;
|
|
|
|
clientinfo_t *ci;
|
|
|
|
|
|
|
|
s = cl.configstrings[player+CS_PLAYERSKINS];
|
|
|
|
|
|
|
|
ci = &cl.clientinfo[player];
|
|
|
|
|
|
|
|
CL_LoadClientinfo (ci, s);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
CL_ParseConfigString
|
|
|
|
================
|
|
|
|
*/
|
2008-05-20 22:00:00 +02:00
|
|
|
void CL_ParseConfigString( sizebuf_t *msg )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
|
|
|
int i;
|
2008-05-20 22:00:00 +02:00
|
|
|
char *s;
|
|
|
|
string olds;
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-05-20 22:00:00 +02:00
|
|
|
i = MSG_ReadShort( msg );
|
2007-09-10 22:00:00 +02:00
|
|
|
if (i < 0 || i >= MAX_CONFIGSTRINGS) Host_Error("configstring > MAX_CONFIGSTRINGS\n");
|
2008-05-20 22:00:00 +02:00
|
|
|
s = MSG_ReadString( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
|
|
|
|
strncpy (olds, cl.configstrings[i], sizeof(olds));
|
|
|
|
olds[sizeof(olds) - 1] = 0;
|
|
|
|
|
|
|
|
strcpy (cl.configstrings[i], s);
|
|
|
|
|
|
|
|
// do something apropriate
|
2008-07-11 22:00:00 +02:00
|
|
|
|
2007-06-21 22:00:00 +02:00
|
|
|
if (i >= CS_LIGHTS && i < CS_LIGHTS+MAX_LIGHTSTYLES)
|
|
|
|
{
|
2007-11-08 22:00:00 +01:00
|
|
|
CL_SetLightstyle (i - CS_LIGHTS);
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
else if (i >= CS_MODELS && i < CS_MODELS+MAX_MODELS)
|
|
|
|
{
|
2008-01-13 22:00:00 +01:00
|
|
|
if(cl.refresh_prepped)
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2007-08-17 22:00:00 +02:00
|
|
|
cl.model_draw[i-CS_MODELS] = re->RegisterModel (cl.configstrings[i]);
|
2007-06-21 22:00:00 +02:00
|
|
|
if (cl.configstrings[i][0] == '*')
|
2008-01-15 22:00:00 +01:00
|
|
|
cl.model_clip[i-CS_MODELS] = pe->RegisterModel(cl.configstrings[i] );
|
2008-01-13 22:00:00 +01:00
|
|
|
else cl.model_clip[i-CS_MODELS] = NULL;
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (i >= CS_SOUNDS && i < CS_SOUNDS+MAX_MODELS)
|
|
|
|
{
|
|
|
|
if (cl.refresh_prepped)
|
|
|
|
cl.sound_precache[i-CS_SOUNDS] = S_RegisterSound (cl.configstrings[i]);
|
|
|
|
}
|
|
|
|
else if (i >= CS_IMAGES && i < CS_IMAGES+MAX_MODELS)
|
|
|
|
{
|
|
|
|
if (cl.refresh_prepped)
|
2007-08-17 22:00:00 +02:00
|
|
|
cl.image_precache[i-CS_IMAGES] = re->RegisterPic (cl.configstrings[i]);
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
else if (i >= CS_PLAYERSKINS && i < CS_PLAYERSKINS+MAX_CLIENTS)
|
|
|
|
{
|
|
|
|
if (cl.refresh_prepped && strcmp(olds, s))
|
|
|
|
CL_ParseClientinfo (i-CS_PLAYERSKINS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
=====================================================================
|
|
|
|
|
|
|
|
ACTION MESSAGES
|
|
|
|
|
|
|
|
=====================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
==================
|
|
|
|
CL_ParseStartSoundPacket
|
|
|
|
==================
|
|
|
|
*/
|
2008-05-20 22:00:00 +02:00
|
|
|
void CL_ParseStartSoundPacket( sizebuf_t *msg )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2008-05-20 22:00:00 +02:00
|
|
|
vec3_t pos_v;
|
2008-07-16 22:00:00 +02:00
|
|
|
float *pos = NULL;
|
|
|
|
int channel = 0;
|
2007-10-29 22:00:00 +01:00
|
|
|
int sound_num;
|
|
|
|
float volume;
|
2008-07-16 22:00:00 +02:00
|
|
|
int attenuation;
|
|
|
|
int flags, ent = 0;
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-05-20 22:00:00 +02:00
|
|
|
flags = MSG_ReadByte( msg );
|
|
|
|
sound_num = MSG_ReadByte( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-07-16 22:00:00 +02:00
|
|
|
if( flags & SND_VOL ) volume = MSG_ReadBits( msg, NET_COLOR );
|
|
|
|
else volume = 1.0f;
|
|
|
|
if( flags & SND_ATTN ) attenuation = MSG_ReadByte( msg );
|
|
|
|
else attenuation = ATTN_NORM;
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-07-16 22:00:00 +02:00
|
|
|
if( flags & SND_ENT )
|
2007-09-10 22:00:00 +02:00
|
|
|
{
|
|
|
|
// entity reletive
|
2008-05-20 22:00:00 +02:00
|
|
|
channel = MSG_ReadShort( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
ent = channel>>3;
|
2008-07-16 22:00:00 +02:00
|
|
|
if( ent > MAX_EDICTS ) Host_Error("CL_ParseStartSoundPacket: ent out of range\n" );
|
2007-06-21 22:00:00 +02:00
|
|
|
channel &= 7;
|
|
|
|
}
|
2008-07-16 22:00:00 +02:00
|
|
|
if( flags & SND_POS )
|
2007-10-29 22:00:00 +01:00
|
|
|
{
|
|
|
|
// positioned in space
|
2008-07-16 22:00:00 +02:00
|
|
|
MSG_ReadPos( msg, pos_v );
|
2007-06-21 22:00:00 +02:00
|
|
|
pos = pos_v;
|
|
|
|
}
|
2008-07-16 22:00:00 +02:00
|
|
|
if(!cl.sound_precache[sound_num]) return;
|
|
|
|
S_StartSound( pos, ent, channel, cl.sound_precache[sound_num], volume, attenuation );
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
|
2008-05-20 22:00:00 +02:00
|
|
|
void SHOWNET( sizebuf_t *msg, char *s )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2008-05-20 22:00:00 +02:00
|
|
|
if (cl_shownet->value >= 2) Msg ("%3i:%s\n", msg->readcount-1, s);
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=====================
|
|
|
|
CL_ParseServerMessage
|
|
|
|
=====================
|
|
|
|
*/
|
2008-05-20 22:00:00 +02:00
|
|
|
void CL_ParseServerMessage( sizebuf_t *msg )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2008-06-30 22:00:00 +02:00
|
|
|
char *s;
|
|
|
|
int cmd;
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2007-08-17 22:00:00 +02:00
|
|
|
// if recording demos, copy the message out
|
2008-05-20 22:00:00 +02:00
|
|
|
if (cl_shownet->value == 1) Msg ("%i ",msg->cursize);
|
2007-08-17 22:00:00 +02:00
|
|
|
else if (cl_shownet->value >= 2) Msg ("------------------\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
|
2008-05-23 22:00:00 +02:00
|
|
|
cls.multicast = msg; // client progs can recivied messages too
|
|
|
|
|
2007-08-17 22:00:00 +02:00
|
|
|
// parse the message
|
2008-05-20 22:00:00 +02:00
|
|
|
while( 1 )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2008-07-12 22:00:00 +02:00
|
|
|
if( msg->readcount > msg->cursize )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2007-09-10 22:00:00 +02:00
|
|
|
Host_Error("CL_ParseServerMessage: Bad server message\n");
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2008-05-20 22:00:00 +02:00
|
|
|
cmd = MSG_ReadByte( msg );
|
2008-07-12 22:00:00 +02:00
|
|
|
if( cmd == -1 ) break;
|
2008-07-15 22:00:00 +02:00
|
|
|
|
2007-08-17 22:00:00 +02:00
|
|
|
// other commands
|
2008-06-30 22:00:00 +02:00
|
|
|
switch( cmd )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
|
|
|
case svc_nop:
|
2008-06-30 22:00:00 +02:00
|
|
|
MsgDev( D_ERROR, "CL_ParseServerMessage: user message out of bounds\n" );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_disconnect:
|
2007-09-10 22:00:00 +02:00
|
|
|
CL_Drop ();
|
|
|
|
Host_AbortCurrentFrame();
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_reconnect:
|
2008-06-30 22:00:00 +02:00
|
|
|
Msg( "Server disconnected, reconnecting\n" );
|
|
|
|
if( cls.download )
|
2007-06-21 22:00:00 +02:00
|
|
|
{
|
2008-06-30 22:00:00 +02:00
|
|
|
FS_Close( cls.download );
|
2007-06-21 22:00:00 +02:00
|
|
|
cls.download = NULL;
|
|
|
|
}
|
|
|
|
cls.state = ca_connecting;
|
2008-06-30 22:00:00 +02:00
|
|
|
cls.connect_time = MAX_HEARTBEAT; // CL_CheckForResend() will fire immediately
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_stufftext:
|
2008-05-20 22:00:00 +02:00
|
|
|
s = MSG_ReadString( msg );
|
2008-06-30 22:00:00 +02:00
|
|
|
Cbuf_AddText( s );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_serverdata:
|
2008-06-30 22:00:00 +02:00
|
|
|
Cbuf_Execute(); // make sure any stuffed commands are done
|
2008-05-20 22:00:00 +02:00
|
|
|
CL_ParseServerData( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_configstring:
|
2008-05-20 22:00:00 +02:00
|
|
|
CL_ParseConfigString( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_sound:
|
2008-05-20 22:00:00 +02:00
|
|
|
CL_ParseStartSoundPacket( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_spawnbaseline:
|
2008-05-20 22:00:00 +02:00
|
|
|
CL_ParseBaseline( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_temp_entity:
|
2008-06-30 22:00:00 +02:00
|
|
|
CL_ParseTempEnts( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_download:
|
2008-05-20 22:00:00 +02:00
|
|
|
CL_ParseDownload( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_frame:
|
2008-05-20 22:00:00 +02:00
|
|
|
CL_ParseFrame( msg );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
|
|
|
case svc_playerinfo:
|
|
|
|
case svc_packetentities:
|
|
|
|
case svc_deltapacketentities:
|
2008-06-30 22:00:00 +02:00
|
|
|
Host_Error("CL_ParseServerMessage: out of place frame data\n");
|
|
|
|
break;
|
|
|
|
case svc_bad:
|
|
|
|
Host_Error("CL_ParseServerMessage: svc_bad\n" );
|
2007-06-21 22:00:00 +02:00
|
|
|
break;
|
2007-11-17 22:00:00 +01:00
|
|
|
default:
|
2008-06-30 22:00:00 +02:00
|
|
|
// parse user messages
|
|
|
|
if(!CL_ParseUserMessage( cmd ))
|
|
|
|
Host_Error("CL_ParseServerMessage: illegible server message %d\n", cmd );
|
2007-11-17 22:00:00 +01:00
|
|
|
break;
|
2007-06-21 22:00:00 +02:00
|
|
|
}
|
|
|
|
}
|
2008-06-30 22:00:00 +02:00
|
|
|
}
|