本文整理汇总了C++中MSG_ReadShort函数的典型用法代码示例。如果您正苦于以下问题:C++ MSG_ReadShort函数的具体用法?C++ MSG_ReadShort怎么用?C++ MSG_ReadShort使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MSG_ReadShort函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: TV_Relay_ParseServerData
/*
* TV_Relay_ParseServerData
*/
static void TV_Relay_ParseServerData( relay_t *relay, msg_t *msg )
{
int i, numpure;
TV_Relay_ClearState( relay );
relay->state = CA_CONNECTED;
relay->map_checksum = 0;
// parse protocol version number
i = MSG_ReadLong( msg );
if( i != APP_PROTOCOL_VERSION && !(relay->upstream->demo.playing && i == APP_DEMO_PROTOCOL_VERSION) )
TV_Relay_Error( relay, "Server returned version %i, not %i", i, APP_PROTOCOL_VERSION );
relay->servercount = MSG_ReadLong( msg );
relay->snapFrameTime = (unsigned int)MSG_ReadShort( msg );
Q_strncpyz( relay->basegame, MSG_ReadString( msg ), sizeof( relay->basegame ) );
Q_strncpyz( relay->game, MSG_ReadString( msg ), sizeof( relay->game ) );
// parse player entity number
relay->playernum = MSG_ReadShort( msg );
// get the full level name
Q_strncpyz( relay->levelname, MSG_ReadString( msg ), sizeof( relay->levelname ) );
relay->sv_bitflags = MSG_ReadByte( msg );
// using upstream->reliable won't work for TV_Relay_ParseServerMessage
// in case of reliable demo following unreliable demo, causing "clack message while reliable" error
relay->reliable = ( ( relay->sv_bitflags & SV_BITFLAGS_RELIABLE ) ? true : false );
if( ( relay->sv_bitflags & SV_BITFLAGS_HTTP ) != 0 ) {
if( ( relay->sv_bitflags & SV_BITFLAGS_HTTP_BASEURL ) != 0 ) {
// read base upstream url
MSG_ReadString( msg );
}
else {
// http port number
MSG_ReadShort( msg );
}
}
// pure list
// clean old, if necessary
Com_FreePureList( &relay->purelist );
// add new
numpure = MSG_ReadShort( msg );
while( numpure > 0 )
{
const char *pakname = MSG_ReadString( msg );
const unsigned checksum = MSG_ReadLong( msg );
Com_AddPakToPureList( &relay->purelist, pakname, checksum, relay->upstream->mempool );
numpure--;
}
}
示例2: CL_ParseDownload
/*
=====================
CL_ParseDownload
A download message has been received from the server
=====================
*/
void CL_ParseDownload ( msg_t *msg ) {
int size;
unsigned char data[MAX_MSGLEN];
uint16_t block;
if (!*clc.downloadTempName) {
Com_Printf("Server sending download, but no download was requested\n");
CL_AddReliableCommand("stopdl", qfalse);
return;
}
// read the data
block = MSG_ReadShort ( msg );
if ( !block && !clc.downloadBlock )
{
// block zero is special, contains file size
clc.downloadSize = MSG_ReadLong ( msg );
Cvar_SetValue( "cl_downloadSize", clc.downloadSize );
if (clc.downloadSize < 0)
{
Com_Error(ERR_DROP, "%s", MSG_ReadString( msg ) );
return;
}
}
size = /*(unsigned short)*/MSG_ReadShort ( msg );
if (size < 0 || size > sizeof(data))
{
Com_Error(ERR_DROP, "CL_ParseDownload: Invalid size %d for download chunk", size);
return;
}
MSG_ReadData( msg, data, size );
if((clc.downloadBlock & 0xFFFF) != block)
{
Com_DPrintf( "CL_ParseDownload: Expected block %d, got %d\n", (clc.downloadBlock & 0xFFFF), block);
return;
}
// open the file if not opened yet
if (!clc.download)
{
clc.download = FS_SV_FOpenFileWrite( clc.downloadTempName );
if (!clc.download) {
Com_Printf( "Could not create %s\n", clc.downloadTempName );
CL_AddReliableCommand( "stopdl", qfalse );
CL_NextDownload();
return;
}
}
if (size)
FS_Write( data, size, clc.download );
CL_AddReliableCommand( va("nextdl %d", clc.downloadBlock), qfalse );
clc.downloadBlock++;
clc.downloadCount += size;
// So UI gets access to it
Cvar_SetValue( "cl_downloadCount", clc.downloadCount );
if (!size) { // A zero length block means EOF
if (clc.download) {
FS_FCloseFile( clc.download );
clc.download = 0;
// rename the file
FS_SV_Rename ( clc.downloadTempName, clc.downloadName );
}
// send intentions now
// We need this because without it, we would hold the last nextdl and then start
// loading right away. If we take a while to load, the server is happily trying
// to send us that last block over and over.
// Write it twice to help make sure we acknowledge the download
CL_WritePacket();
CL_WritePacket();
// get another file if needed
CL_NextDownload ();
}
}
示例3: CL_ParseServerMessage
//.........这里部分代码省略.........
break;
case svc_serverdata:
if( cls.state == CA_HANDSHAKE )
{
Cbuf_Execute(); // make sure any stuffed commands are done
CL_ParseServerData( msg );
}
else
{
return; // ignore rest of the packet (serverdata is always sent alone)
}
break;
case svc_spawnbaseline:
CL_ParseBaseline( msg );
break;
case svc_download:
CL_ParseDownload( msg );
break;
case svc_clcack:
if( cls.reliable )
{
Com_Error( ERR_DROP, "CL_ParseServerMessage: clack message for reliable client\n" );
return;
}
cls.reliableAcknowledge = (unsigned)MSG_ReadLong( msg );
cls.ucmdAcknowledged = (unsigned)MSG_ReadLong( msg );
if( cl_debug_serverCmd->integer & 4 )
Com_Printf( "svc_clcack:reliable cmd ack:%i ucmdack:%i\n", cls.reliableAcknowledge, cls.ucmdAcknowledged );
break;
case svc_frame:
CL_ParseFrame( msg );
break;
case svc_demoinfo:
assert( cls.demo.playing );
{
size_t meta_data_maxsize;
MSG_ReadLong( msg );
MSG_ReadLong( msg );
cls.demo.meta_data_realsize = (size_t)MSG_ReadLong( msg );
meta_data_maxsize = (size_t)MSG_ReadLong( msg );
// sanity check
if( cls.demo.meta_data_realsize > meta_data_maxsize ) {
cls.demo.meta_data_realsize = meta_data_maxsize;
}
if( cls.demo.meta_data_realsize > sizeof( cls.demo.meta_data ) ) {
cls.demo.meta_data_realsize = sizeof( cls.demo.meta_data );
}
MSG_ReadData( msg, cls.demo.meta_data, cls.demo.meta_data_realsize );
MSG_SkipData( msg, meta_data_maxsize - cls.demo.meta_data_realsize );
}
break;
case svc_playerinfo:
case svc_packetentities:
case svc_match:
Com_Error( ERR_DROP, "Out of place frame data" );
break;
case svc_extension:
if( 1 )
{
int ext, len;
ext = MSG_ReadByte( msg ); // extension id
MSG_ReadByte( msg ); // version number
len = MSG_ReadShort( msg ); // command length
switch( ext )
{
default:
// unsupported
MSG_SkipData( msg, len );
break;
}
}
break;
}
}
CL_AddNetgraph();
//
// if recording demos, copy the message out
//
//
// we don't know if it is ok to save a demo message until
// after we have parsed the frame
//
if( cls.demo.recording && !cls.demo.waiting )
CL_WriteDemoMessage( msg );
}
示例4: CL_ParseGamestate
/*
==================
CL_ParseGamestate
==================
*/
void CL_ParseGamestate( msg_t *msg ) {
int i;
entityState_t *es;
int newnum;
entityState_t nullstate;
int cmd;
char *s;
Con_Close();
clc.connectPacketCount = 0;
// wipe local client state
CL_ClearState();
// a gamestate always marks a server command sequence
clc.serverCommandSequence = MSG_ReadLong( msg );
// parse all the configstrings and baselines
cl.gameState.dataCount = 1; // leave a 0 at the beginning for uninitialized configstrings
while ( 1 ) {
cmd = MSG_ReadByte( msg );
if ( cmd == svc_EOF ) {
break;
}
if ( cmd == svc_configstring ) {
int len;
i = MSG_ReadShort( msg );
if ( i < 0 || i >= MAX_CONFIGSTRINGS ) {
Com_Error( ERR_DROP, "configstring > MAX_CONFIGSTRINGS" );
}
s = MSG_ReadBigString( msg );
len = strlen( s );
if ( len + 1 + cl.gameState.dataCount > MAX_GAMESTATE_CHARS ) {
Com_Error( ERR_DROP, "MAX_GAMESTATE_CHARS exceeded" );
}
// append it to the gameState string buffer
cl.gameState.stringOffsets[ i ] = cl.gameState.dataCount;
Com_Memcpy( cl.gameState.stringData + cl.gameState.dataCount, s, len + 1 );
cl.gameState.dataCount += len + 1;
} else if ( cmd == svc_baseline ) {
newnum = MSG_ReadBits( msg, GENTITYNUM_BITS );
if ( newnum < 0 || newnum >= MAX_GENTITIES ) {
Com_Error( ERR_DROP, "Baseline number out of range: %i", newnum );
}
Com_Memset (&nullstate, 0, sizeof(nullstate));
es = &cl.entityBaselines[ newnum ];
MSG_ReadDeltaEntity( msg, &nullstate, es, newnum );
} else {
Com_Error( ERR_DROP, "CL_ParseGamestate: bad command byte" );
}
}
clc.clientNum = MSG_ReadLong(msg);
// read the checksum feed
clc.checksumFeed = MSG_ReadLong( msg );
// parse useful values out of CS_SERVERINFO
CL_ParseServerInfo();
// parse serverId and other cvars
CL_SystemInfoChanged();
// stop recording now so the demo won't have an unnecessary level load at the end.
if(cl_autoRecordDemo->integer && clc.demorecording)
CL_StopRecord_f();
// reinitialize the filesystem if the game directory has changed
FS_ConditionalRestart( clc.checksumFeed );
// This used to call CL_StartHunkUsers, but now we enter the download state before loading the
// cgame
CL_InitDownloads();
// make sure the game starts
Cvar_Set( "cl_paused", "0" );
}
示例5: CL_ParseRMG
void CL_ParseRMG ( msg_t* msg )
{
clc.rmgHeightMapSize = (unsigned short)MSG_ReadShort ( msg );
if ( !clc.rmgHeightMapSize )
{
return;
}
z_stream zdata;
int size;
unsigned char heightmap1[15000];
if ( MSG_ReadBits ( msg, 1 ) )
{
// Read the heightmap
memset(&zdata, 0, sizeof(z_stream));
inflateInit ( &zdata/*, Z_SYNC_FLUSH*/ );
MSG_ReadData ( msg, heightmap1, clc.rmgHeightMapSize );
zdata.next_in = heightmap1;
zdata.avail_in = clc.rmgHeightMapSize;
zdata.next_out = (unsigned char*)clc.rmgHeightMap;
zdata.avail_out = MAX_HEIGHTMAP_SIZE;
inflate (&zdata,Z_SYNC_FLUSH );
clc.rmgHeightMapSize = zdata.total_out;
inflateEnd(&zdata);
}
else
{
MSG_ReadData ( msg, (unsigned char*)clc.rmgHeightMap, clc.rmgHeightMapSize );
}
size = (unsigned short)MSG_ReadShort ( msg );
if ( MSG_ReadBits ( msg, 1 ) )
{
// Read the flatten map
memset(&zdata, 0, sizeof(z_stream));
inflateInit ( &zdata/*, Z_SYNC_FLUSH*/ );
MSG_ReadData ( msg, heightmap1, size );
zdata.next_in = heightmap1;
zdata.avail_in = clc.rmgHeightMapSize;
zdata.next_out = (unsigned char*)clc.rmgFlattenMap;
zdata.avail_out = MAX_HEIGHTMAP_SIZE;
inflate (&zdata, Z_SYNC_FLUSH);
inflateEnd(&zdata);
}
else
{
MSG_ReadData ( msg, (unsigned char*)clc.rmgFlattenMap, size );
}
// Read the seed
clc.rmgSeed = MSG_ReadLong ( msg );
CL_ParseAutomapSymbols ( msg );
}
示例6: CL_ParseUpdate
/*
==================
CL_ParseUpdate
Parse an entity update message from the server
If an entities model or origin changes from frame to frame, it must be
relinked. Other attributes can change without relinking.
==================
*/
static void CL_ParseUpdate (int bits)
{
int i;
model_t *model;
int modnum;
qboolean forcelink;
entity_t *ent;
int num;
entity_state2_t *ref_ent,*set_ent,build_ent,dummy;
if (cls.signon == SIGNONS - 1)
{ // first update is the final signon stage
cls.signon = SIGNONS;
CL_SignonReply ();
}
if (bits & U_MOREBITS)
{
i = MSG_ReadByte ();
bits |= (i<<8);
}
if (bits & U_MOREBITS2)
{
i = MSG_ReadByte ();
bits |= (i<<16);
}
if (bits & U_LONGENTITY)
num = MSG_ReadShort ();
else
num = MSG_ReadByte ();
ent = CL_EntityNum (num);
ent->baseline.flags |= BE_ON;
/* if (num == 2)
{
FH = fopen("c.txt","r+");
fseek(FH,0,SEEK_END);
}
*/
ref_ent = NULL;
for (i = 0; i < cl.frames[0].count; i++)
if (cl.frames[0].states[i].index == num)
{
ref_ent = &cl.frames[0].states[i];
// if (num == 2) fprintf(FH,"Found Reference\n");
break;
}
if (!ref_ent)
{
ref_ent = &build_ent;
build_ent.index = num;
build_ent.origin[0] = ent->baseline.origin[0];
build_ent.origin[1] = ent->baseline.origin[1];
build_ent.origin[2] = ent->baseline.origin[2];
build_ent.angles[0] = ent->baseline.angles[0];
build_ent.angles[1] = ent->baseline.angles[1];
build_ent.angles[2] = ent->baseline.angles[2];
build_ent.modelindex = ent->baseline.modelindex;
build_ent.frame = ent->baseline.frame;
build_ent.colormap = ent->baseline.colormap;
build_ent.skin = ent->baseline.skin;
build_ent.effects = ent->baseline.effects;
build_ent.scale = ent->baseline.scale;
build_ent.drawflags = ent->baseline.drawflags;
build_ent.abslight = ent->baseline.abslight;
}
if (cl.need_build)
{ // new sequence, first valid frame
set_ent = &cl.frames[1].states[cl.frames[1].count];
cl.frames[1].count++;
}
else
set_ent = &dummy;
if (bits & U_CLEAR_ENT)
{
memset(ent, 0, sizeof(entity_t));
memset(ref_ent, 0, sizeof(*ref_ent));
ref_ent->index = num;
}
*set_ent = *ref_ent;
if (ent->msgtime != cl.mtime[1])
//.........这里部分代码省略.........
示例7: CL_ParseClientdata
/*
==================
CL_ParseClientdata
Server information pertaining to this client only
==================
*/
static void CL_ParseClientdata (int bits)
{
int i, j;
if (bits & SU_VIEWHEIGHT)
cl.viewheight = MSG_ReadChar ();
//rjr else
//rjr cl.viewheight = DEFAULT_VIEWHEIGHT;
if (bits & SU_IDEALPITCH)
cl.idealpitch = MSG_ReadChar ();
if (bits & SU_IDEALROLL)
cl.idealroll = MSG_ReadChar ();
//rjr else
//rjr cl.idealroll = 0;
VectorCopy (cl.mvelocity[0], cl.mvelocity[1]);
for (i = 0; i < 3; i++)
{
if (bits & (SU_PUNCH1<<i) )
cl.punchangle[i] = MSG_ReadChar();
//rjr else
//rjr cl.punchangle[i] = 0;
if (bits & (SU_VELOCITY1<<i) )
cl.mvelocity[0][i] = MSG_ReadChar()*16;
//rjr else
//rjr cl.mvelocity[0][i] = 0;
}
/* if (bits & SU_ITEMS)
i = MSG_ReadLong ();
*/
if (cl.items != i)
{ // set flash times
Sbar_Changed();
for (j = 0; j < 32; j++)
if ( (i & (1<<j)) && !(cl.items & (1<<j)))
cl.item_gettime[j] = cl.time;
cl.items = i;
}
cl.onground = ((bits & SU_ONGROUND) != 0);
cl.inwater = ((bits & SU_INWATER) != 0);
if (bits & SU_WEAPONFRAME)
cl.stats[STAT_WEAPONFRAME] = MSG_ReadByte ();
//rjr else
//rjr cl.stats[STAT_WEAPONFRAME] = 0;
if (bits & SU_ARMOR)
{
cl.stats[STAT_ARMOR] = MSG_ReadByte ();
Sbar_Changed();
}
if (bits & SU_WEAPON)
{
cl.stats[STAT_WEAPON] = MSG_ReadShort ();
Sbar_Changed();
}
/* sc1 = sc2 = 0;
if (bits & SU_SC1)
sc1 = MSG_ReadLong ();
if (bits & SU_SC2)
sc2 = MSG_ReadLong ();
if (sc1 & SC1_HEALTH)
cl.v.health = MSG_ReadShort();
if (sc1 & SC1_LEVEL)
cl.v.level = MSG_ReadByte();
if (sc1 & SC1_INTELLIGENCE)
cl.v.intelligence = MSG_ReadByte();
if (sc1 & SC1_WISDOM)
cl.v.wisdom = MSG_ReadByte();
if (sc1 & SC1_STRENGTH)
cl.v.strength = MSG_ReadByte();
if (sc1 & SC1_DEXTERITY)
cl.v.dexterity = MSG_ReadByte();
if (sc1 & SC1_WEAPON)
cl.v.weapon = MSG_ReadByte();
if (sc1 & SC1_BLUEMANA)
cl.v.bluemana = MSG_ReadByte();
if (sc1 & SC1_GREENMANA)
cl.v.greenmana = MSG_ReadByte();
if (sc1 & SC1_EXPERIENCE)
cl.v.experience = MSG_ReadLong();
if (sc1 & SC1_CNT_TORCH)
cl.v.cnt_torch = MSG_ReadByte();
if (sc1 & SC1_CNT_H_BOOST)
//.........这里部分代码省略.........
示例8: CL_ParseGetServersResponseMessage
/*
* CL_ParseGetServersResponseMessage
* Handle a reply from getservers message to master server
*/
static void CL_ParseGetServersResponseMessage( msg_t *msg, qboolean extended )
{
const char *header;
char adrString[64];
qbyte addr[16];
unsigned short port;
netadr_t adr;
MSG_BeginReading( msg );
MSG_ReadLong( msg ); // skip the -1
//jump over the command name
header = ( extended ? "getserversExtResponse" : "getserversResponse" );
if( !MSG_SkipData( msg, strlen( header ) ) )
{
Com_Printf( "Invalid master packet ( missing %s )\n", header );
return;
}
while( msg->readcount + 7 <= msg->cursize )
{
char prefix = MSG_ReadChar( msg );
switch( prefix )
{
case '\\':
MSG_ReadData( msg, addr, 4 );
port = ShortSwap( MSG_ReadShort( msg ) ); // both endians need this swapped.
Q_snprintfz( adrString, sizeof( adrString ), "%u.%u.%u.%u:%u", addr[0], addr[1], addr[2], addr[3], port );
break;
case '/':
if( extended )
{
MSG_ReadData( msg, addr, 16 );
port = ShortSwap( MSG_ReadShort( msg ) ); // both endians need this swapped.
Q_snprintfz( adrString, sizeof( adrString ), "[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:%hu",
addr[ 0], addr[ 1], addr[ 2], addr[ 3], addr[ 4], addr[ 5], addr[ 6], addr[ 7],
addr[ 8], addr[ 9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15],
port );
}
else
{
Com_Printf( "Invalid master packet ( IPv6 prefix in a non-extended response )\n" );
return;
}
break;
default:
Com_Printf( "Invalid master packet ( missing separator )\n" );
return;
}
if( port == 0 ) // last server seen
return;
Com_DPrintf( "%s\n", adrString );
if( !NET_StringToAddress( adrString, &adr ) )
{
Com_Printf( "Bad address: %s\n", adrString );
continue;
}
CL_AddServerToList( &masterList, adrString, 0 );
}
}
示例9: CL_ParseDownload
/*
* A download message has been received from the server
*/
void CL_ParseDownload (void) {
int size, percent;
char name[MAX_OSPATH];
int r;
/* read the data */
size = MSG_ReadShort (&net_message);
percent = MSG_ReadByte (&net_message);
if (size == -1) {
Com_Printf ("Server does not have this file.\n");
if (cls.download) {
/* if here, we tried to resume a
file but the server said no */
fclose (cls.download);
cls.download = NULL;
}
CL_RequestNextDownload ();
return;
}
/* open the file if not opened yet */
if (!cls.download) {
CL_DownloadFileName(name, sizeof(name), cls.downloadtempname);
FS_CreatePath (name);
cls.download = fopen (name, "wb");
if (!cls.download) {
net_message.readcount += size;
Com_Printf ("Failed to open %s\n", cls.downloadtempname);
CL_RequestNextDownload ();
return;
}
}
fwrite (net_message.data + net_message.readcount, 1, size, cls.download);
net_message.readcount += size;
if (percent != 100) {
/* request next block */
cls.downloadpercent = percent;
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
SZ_Print (&cls.netchan.message, "nextdl");
} else {
char oldn[MAX_OSPATH];
char newn[MAX_OSPATH];
fclose (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)
Com_Printf ("failed to rename.\n");
cls.download = NULL;
cls.downloadpercent = 0;
/* get another file if needed */
CL_RequestNextDownload ();
}
}
示例10: CL_ParseServerInfo
/*
==================
CL_ParseServerInfo
==================
*/
void CL_ParseServerInfo (void)
{
char *str;
int i;
int nummodels, numsounds;
static char model_precache[MAX_MODELS][MAX_QPATH];
static char sound_precache[MAX_SOUNDS][MAX_QPATH];
Con_DPrintf ("Serverinfo packet received.\n");
//
// wipe the client_state_t struct
//
CL_ClearState ();
// parse protocol version number
i = MSG_ReadLong ();
if (i != PROTOCOL_VERSION)
{
Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION);
return;
}
// parse maxclients
cl.maxclients = MSG_ReadByte ();
if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD)
{
Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients);
return;
}
cl.scores = Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores");
// parse gametype
cl.gametype = MSG_ReadByte ();
if (cl.gametype == GAME_DEATHMATCH)
sv_kingofhill = MSG_ReadShort ();
// parse signon message
str = MSG_ReadString ();
strncpy (cl.levelname, str, sizeof(cl.levelname)-1);
// seperate the printfs so the server message can have a color
Con_Printf("\n\n\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\n");
Con_Printf ("%c%s\n", 2, str);
//
// first we go through and touch all of the precache data that still
// happens to be in the cache, so precaching something else doesn't
// needlessly purge it
//
// precache models
memset (cl.model_precache, 0, sizeof(cl.model_precache));
for (nummodels=1 ; ; nummodels++)
{
str = MSG_ReadString ();
if (!str[0])
break;
if (nummodels==MAX_MODELS)
{
Con_Printf ("Server sent too many model precaches\n");
return;
}
strcpy (model_precache[nummodels], str);
Mod_TouchModel (str);
}
// precache sounds
memset (cl.sound_precache, 0, sizeof(cl.sound_precache));
for (numsounds=1 ; ; numsounds++)
{
str = MSG_ReadString ();
if (!str[0])
break;
if (numsounds==MAX_SOUNDS)
{
Con_Printf ("Server sent too many sound precaches\n");
return;
}
strcpy (sound_precache[numsounds], str);
S_TouchSound (str);
}
//
// now we try to load everything else until a cache allocation fails
//
if (precache.value)
{
total_loading_size = nummodels + numsounds;
current_loading_size = 1;
loading_stage = 2;
}
//always precache the world!!!
//.........这里部分代码省略.........
示例11: SV_PacketEvent
/*
=================
SV_ReadPackets
=================
*/
void SV_PacketEvent( netadr_t from, msg_t *msg ) {
int i;
client_t *cl;
int qport;
// check for connectionless packet (0xffffffff) first
if ( msg->cursize >= 4 && *(int *)msg->data == -1) {
SV_ConnectionlessPacket( from, msg );
return;
}
// Broadcast packets should never be treated as sequenced packets!
// Don't even bother telling them to go away. It's not our game!
// if ( broadcast )
// return;
// read the qport out of the message so we can fix up
// stupid address translating routers
MSG_BeginReadingOOB( msg );
MSG_ReadLong( msg ); // sequence number
qport = MSG_ReadShort( msg ) & 0xffff;
// find which client the message is from
for (i=0, cl=svs.clients ; i < sv_maxclients->integer ; i++,cl++) {
#ifdef _XBOX
ClientManager::ActivateClient(i);
#endif
if (cl->state == CS_FREE) {
continue;
}
if ( !NET_CompareBaseAdr( from, cl->netchan.remoteAddress ) ) {
continue;
}
// it is possible to have multiple clients from a single IP
// address, so they are differentiated by the qport variable
if (cl->netchan.qport != qport) {
continue;
}
// the IP port can't be used to differentiate them, because
// some address translating routers periodically change UDP
// port assignments
if (cl->netchan.remoteAddress.port != from.port) {
Com_Printf( "SV_ReadPackets: fixing up a translated port\n" );
cl->netchan.remoteAddress.port = from.port;
}
// make sure it is a valid, in sequence packet
if (SV_Netchan_Process(cl, msg)) {
// zombie clients still need to do the Netchan_Process
// to make sure they don't need to retransmit the final
// reliable message, but they don't do any other processing
if (cl->state != CS_ZOMBIE) {
cl->lastPacketTime = svs.time; // don't timeout
SV_ExecuteClientMessage( cl, msg );
}
}
return;
}
// if we received a sequenced packet from an address we don't reckognize,
// send an out of band disconnect packet to it
NET_OutOfBandPrint( NS_SERVER, from, "disconnect" );
}
示例12: MSG_Init
/*
================
rvDebuggerServer::ProcessMessages
Process all incoming network messages from the debugger client
================
*/
bool rvDebuggerServer::ProcessMessages(void)
{
netadr_t adrFrom;
msg_t msg;
byte buffer[MAX_MSGLEN];
MSG_Init(&msg, buffer, sizeof(buffer));
// Check for pending udp packets on the debugger port
while (mPort.GetPacket(adrFrom, msg.data, msg.cursize, msg.maxsize)) {
unsigned short command;
// Only accept packets from the debugger server for security reasons
if (!Sys_CompareNetAdrBase(adrFrom, mClientAdr)) {
continue;
}
command = (unsigned short) MSG_ReadShort(&msg);
switch (command) {
case DBMSG_CONNECT:
mConnected = true;
SendMessage(DBMSG_CONNECTED);
break;
case DBMSG_CONNECTED:
mConnected = true;
break;
case DBMSG_DISCONNECT:
ClearBreakpoints();
Resume();
mConnected = false;
break;
case DBMSG_ADDBREAKPOINT:
HandleAddBreakpoint(&msg);
break;
case DBMSG_REMOVEBREAKPOINT:
HandleRemoveBreakpoint(&msg);
break;
case DBMSG_RESUME:
Resume();
break;
case DBMSG_BREAK:
mBreakNext = true;
break;
case DBMSG_STEPOVER:
mBreakStepOver = true;
mBreakStepOverDepth = mBreakInterpreter->GetCallstackDepth();
mBreakStepOverFunc1 = mBreakInterpreter->GetCallstack()[mBreakInterpreter->GetCallstackDepth()].f;
if (mBreakInterpreter->GetCallstackDepth() > 0) {
mBreakStepOverFunc2 = mBreakInterpreter->GetCallstack()[mBreakInterpreter->GetCallstackDepth()-1].f;
} else {
mBreakStepOverFunc2 = NULL;
}
Resume();
break;
case DBMSG_STEPINTO:
mBreakStepInto = true;
Resume();
break;
case DBMSG_INSPECTVARIABLE:
HandleInspectVariable(&msg);
break;
case DBMSG_INSPECTCALLSTACK:
HandleInspectCallstack(&msg);
break;
case DBMSG_INSPECTTHREADS:
HandleInspectThreads(&msg);
break;
}
}
return true;
}
示例13: Netchan_Process
/*
=================
Netchan_Process
Returns qfalse if the message should not be processed due to being
out of order or a fragment.
Msg must be large enough to hold MAX_MSGLEN, because if this is the
final fragment of a multi-part message, the entire thing will be
copied out.
=================
*/
qboolean Netchan_Process( netchan_t *chan, msg_t *msg ) {
int sequence, sequence_ack;
int qport;
int fragmentStart, fragmentLength;
qboolean fragmented;
// XOR unscramble all data in the packet after the header
Netchan_ScramblePacket( msg );
// get sequence numbers
MSG_BeginReading( msg );
sequence = MSG_ReadLong( msg );
sequence_ack = MSG_ReadLong( msg );
// check for fragment information
if ( sequence & FRAGMENT_BIT ) {
sequence &= ~FRAGMENT_BIT;
fragmented = qtrue;
} else {
fragmented = qfalse;
}
// read the qport if we are a server
if ( chan->sock == NS_SERVER ) {
qport = MSG_ReadShort( msg );
}
// read the fragment information
if ( fragmented ) {
fragmentStart = MSG_ReadShort( msg );
fragmentLength = MSG_ReadShort( msg );
} else {
fragmentStart = 0; // stop warning message
fragmentLength = 0;
}
if ( showpackets->integer ) {
if ( fragmented ) {
Com_Printf( "%s recv %4i : s=%i ack=%i fragment=%i,%i\n"
, netsrcString[ chan->sock ]
, msg->cursize
, sequence
, sequence_ack
, fragmentStart, fragmentLength );
} else {
Com_Printf( "%s recv %4i : s=%i ack=%i\n"
, netsrcString[ chan->sock ]
, msg->cursize
, sequence
, sequence_ack );
}
}
//
// discard out of order or duplicated packets
//
if ( sequence <= chan->incomingSequence ) {
if ( showdrop->integer || showpackets->integer ) {
Com_Printf( "%s:Out of order packet %i at %i\n"
, NET_AdrToString( chan->remoteAddress )
, sequence
, chan->incomingSequence );
}
return qfalse;
}
//
// dropped packets don't keep the message from being used
//
chan->dropped = sequence - (chan->incomingSequence+1);
if ( chan->dropped > 0 ) {
if ( showdrop->integer || showpackets->integer ) {
Com_Printf( "%s:Dropped %i packets at %i\n"
, NET_AdrToString( chan->remoteAddress )
, chan->dropped
, sequence );
}
}
//
// if this is the final framgent of a reliable message,
// bump incoming_reliable_sequence
//
if ( fragmented ) {
// make sure we
if ( sequence != chan->fragmentSequence ) {
chan->fragmentSequence = sequence;
//.........这里部分代码省略.........
示例14: SV_ReadPackets
//.........这里部分代码省略.........
}
}
#endif
MSG_Init( &msg, msgData, sizeof( msgData ) );
for( socketind = 0; socketind < sizeof( sockets ) / sizeof( sockets[0] ); socketind++ )
{
socket = sockets[socketind];
if( !socket->open )
continue;
while( ( ret = NET_GetPacket( socket, &address, &msg ) ) != 0 )
{
if( ret == -1 )
{
Com_Printf( "NET_GetPacket: Error: %s\n", NET_ErrorString() );
continue;
}
// check for connectionless packet (0xffffffff) first
if( *(int *)msg.data == -1 )
{
SV_ConnectionlessPacket( socket, &address, &msg );
continue;
}
// read the game port out of the message so we can fix up
// stupid address translating routers
MSG_BeginReading( &msg );
MSG_ReadLong( &msg ); // sequence number
MSG_ReadLong( &msg ); // sequence number
game_port = MSG_ReadShort( &msg ) & 0xffff;
// data follows
// check for packets from connected clients
for( i = 0, cl = svs.clients; i < sv_maxclients->integer; i++, cl++ )
{
unsigned short addr_port;
if( cl->state == CS_FREE || cl->state == CS_ZOMBIE )
continue;
if( cl->edict && ( cl->edict->r.svflags & SVF_FAKECLIENT ) )
continue;
if( !NET_CompareBaseAddress( &address, &cl->netchan.remoteAddress ) )
continue;
if( cl->netchan.game_port != game_port )
continue;
addr_port = NET_GetAddressPort( &address );
if( NET_GetAddressPort( &cl->netchan.remoteAddress ) != addr_port )
{
Com_Printf( "SV_ReadPackets: fixing up a translated port\n" );
NET_SetAddressPort( &cl->netchan.remoteAddress, addr_port );
}
if( SV_ProcessPacket( &cl->netchan, &msg ) ) // this is a valid, sequenced packet, so process it
{
cl->lastPacketReceivedTime = svs.realtime;
SV_ParseClientMessage( cl, &msg );
}
break;
}
}
}
示例15: CL_ParseServerMessage
/*
=====================
CL_ParseServerMessage
=====================
*/
void CL_ParseServerMessage (void)
{
int cmd;
int i, j, k;
int EntityCount = 0;
int EntitySize = 0;
int before;
static double lasttime;
static qboolean packet_loss = false;
entity_t *ent;
short RemovePlace, OrigPlace, NewPlace, AddedIndex;
int sc1, sc2;
byte test;
float compangles[2][3];
vec3_t deltaangles;
//
// if recording demos, copy the message out
//
if (net_message.cursize > LastServerMessageSize)
{
LastServerMessageSize = net_message.cursize;
}
if (cl_shownet.integer == 1)
{
Con_Printf ("Time: %2.2f Pck: %i ", realtime - lasttime, net_message.cursize);
lasttime = realtime;
}
else if (cl_shownet.integer == 2)
Con_Printf ("------------------\n");
cl.onground = false; // unless the server says otherwise
//
// parse the message
//
MSG_BeginReading ();
while (1)
{
if (msg_badread)
Host_Error ("%s: Bad server message", __thisfunc__);
cmd = MSG_ReadByte ();
if (cmd == -1)
{
if (cl_shownet.integer == 1)
Con_Printf ("Ent: %i (%i bytes)",EntityCount,EntitySize);
SHOWNET("END OF MESSAGE");
return; // end of message
}
// if the high bit of the command byte is set, it is a fast update
if (cmd & 128)
{
before = msg_readcount;
SHOWNET("fast update");
if (packet_loss)
CL_ParseUpdate2 (cmd&127);
else
CL_ParseUpdate (cmd&127);
EntityCount++;
EntitySize += msg_readcount - before + 1;
continue;
}
if (cmd < NUM_SVC_STRINGS) // else, it'll hit the illegible message below
{
SHOWNET(svc_strings[cmd]);
}
// other commands
switch (cmd)
{
default:
// CL_DumpPacket ();
Host_Error ("%s: Illegible server message %d", __thisfunc__, cmd);
break;
case svc_nop:
// Con_Printf ("svc_nop\n");
break;
case svc_time:
cl.mtime[1] = cl.mtime[0];
cl.mtime[0] = MSG_ReadFloat ();
break;
case svc_clientdata:
i = MSG_ReadShort ();
CL_ParseClientdata (i);
break;
//.........这里部分代码省略.........