void CLQW_ParseServerMessage( QMsg& message ) { CLQ1_ClearProjectiles(); // // if recording demos, copy the message out // if ( cl_shownet->value == 1 ) { common->Printf( "%i ",message.cursize ); } else if ( cl_shownet->value == 2 ) { common->Printf( "------------------\n" ); } CLQW_ParseClientdata(); // // parse the message // while ( 1 ) { if ( message.badread ) { common->Error( "CLQW_ParseServerMessage: Bad server message" ); break; } int cmd = message.ReadByte(); if ( cmd == -1 ) { message.readcount++; // so the EOM showner has the right value SHOWNET( message, "END OF MESSAGE" ); break; } SHOWNET( message, svcqw_strings[ cmd ] ); // other commands switch ( cmd ) { default: common->Error( "CLQW_ParseServerMessage: Illegible server message" ); break; case q1svc_nop: break; case q1svc_disconnect: CLQW_ParseDisconnect(); break; case q1svc_print: CLQW_ParsePrint( message ); break; case q1svc_centerprint: CL_ParseCenterPrint( message ); break; case q1svc_stufftext: CL_ParseStuffText( message ); break; case q1svc_damage: VQH_ParseDamage( message ); break; case qwsvc_serverdata: CLQW_ParseServerData( message ); break; case q1svc_setangle: CLQH_ParseSetAngle( message ); break; case q1svc_lightstyle: CLQH_ParseLightStyle( message ); break; case q1svc_sound: CLQW_ParseStartSoundPacket( message ); break; case q1svc_stopsound: CLQH_ParseStopSound( message ); break; case q1svc_updatefrags: CLQW_ParseUpdateFrags( message ); break; case qwsvc_updateping: CLQW_ParseUpdatePing( message ); break; case qwsvc_updatepl: CLQW_ParseUpdatePacketLossage( message ); break; case qwsvc_updateentertime: CLQW_ParseUpdateEnterTime( message ); break; case q1svc_spawnbaseline: CLQ1_ParseSpawnBaseline( message ); break; case q1svc_spawnstatic: CLQ1_ParseSpawnStatic( message ); break; case q1svc_temp_entity: CLQW_ParseTEnt( message ); break; case q1svc_killedmonster: CLQH_ParseKilledMonster(); break; case q1svc_foundsecret: CLQH_ParseFoundSecret(); break; case q1svc_updatestat: CLQW_ParseUpdateStat( message ); break; case qwsvc_updatestatlong: CLQW_ParseUpdateStatLong( message ); break; case q1svc_spawnstaticsound: CLQH_ParseStaticSound( message ); break; case q1svc_cdtrack: CLQHW_ParseCDTrack( message ); break; case q1svc_intermission: CLQW_ParseIntermission( message ); break; case q1svc_finale: CLQHW_ParseFinale( message ); break; case q1svc_sellscreen: CLQH_ParseSellScreen(); break; case qwsvc_smallkick: CLQHW_ParseSmallKick(); break; case qwsvc_bigkick: CLQHW_ParseBigKick(); break; case qwsvc_muzzleflash: CLQW_MuzzleFlash( message ); break; case qwsvc_updateuserinfo: CLQW_ParseUpdateUserinfo( message ); break; case qwsvc_setinfo: CLQW_ParseSetInfo( message ); break; case qwsvc_serverinfo: CLQW_ParseServerInfo( message ); break; case qwsvc_download: CLQW_ParseDownload( message ); break; case qwsvc_playerinfo: CLQW_ParsePlayerinfo( message ); break; case qwsvc_nails: CLQW_ParseNails( message ); break; case qwsvc_chokecount: CLQW_ParseChokeCount( message ); break; case qwsvc_modellist: CLQW_ParseModelList( message ); break; case qwsvc_soundlist: CLQW_ParseSoundList( message ); break; case qwsvc_packetentities: CLQW_ParsePacketEntities( message ); break; case qwsvc_deltapacketentities: CLQW_ParseDeltaPacketEntities( message ); break; case qwsvc_maxspeed: CLQHW_ParseMaxSpeed( message ); break; case qwsvc_entgravity: CLQHW_ParseEntGravity( message ); break; case q1svc_setpause: CLQW_ParseSetPause( message ); break; } } CLQW_SetSolidEntities(); }
/* ===================== CL_ParseServerMessage ===================== */ void CL_ParseServerMessage( sizebuf_t *msg ) { char *s; int i, j, cmd; int param1, param2; int bufStart; cls_message_debug.parsing = true; // begin parsing starting_count = BF_GetNumBytesRead( msg ); // updates each frame // parse the message while( 1 ) { if( BF_CheckOverflow( msg )) { Host_Error( "CL_ParseServerMessage: overflow!\n" ); return; } // mark start position bufStart = BF_GetNumBytesRead( msg ); // end of message if( BF_GetNumBitsLeft( msg ) < 8 ) break; cmd = BF_ReadByte( msg ); // record command for debugging spew on parse problem CL_Parse_RecordCommand( cmd, bufStart ); // other commands switch( cmd ) { case svc_bad: Host_Error( "svc_bad\n" ); break; case svc_nop: // this does nothing break; case svc_disconnect: MsgDev( D_INFO, "Disconnected from server\n" ); CL_Drop (); Host_AbortCurrentFrame (); break; case svc_changing: if( BF_ReadOneBit( msg )) { cls.changelevel = true; S_StopAllSounds(); if( cls.demoplayback ) { SCR_BeginLoadingPlaque( cl.background ); cls.changedemo = true; } } else MsgDev( D_INFO, "Server disconnected, reconnecting\n" ); CL_ClearState (); CL_InitEdicts (); // re-arrange edicts if( cls.demoplayback ) { cl.background = (cls.demonum != -1) ? true : false; cls.state = ca_connected; } else cls.state = ca_connecting; cls.connect_time = MAX_HEARTBEAT; // CL_CheckForResend() will fire immediately break; case svc_setview: cl.refdef.viewentity = BF_ReadWord( msg ); break; case svc_sound: CL_ParseSoundPacket( msg, false ); break; case svc_time: // shuffle timestamps cl.mtime[1] = cl.mtime[0]; cl.mtime[0] = BF_ReadFloat( msg ); break; case svc_print: i = BF_ReadByte( msg ); MsgDev( D_INFO, "^6%s", BF_ReadString( msg )); if( i == PRINT_CHAT ) S_StartLocalSound( "common/menu2.wav", VOL_NORM, false ); break; case svc_stufftext: CL_ParseStuffText( msg ); break; case svc_lightstyle: CL_ParseLightStyle( msg ); break; case svc_setangle: CL_ParseSetAngle( msg ); break; case svc_serverdata: Cbuf_Execute(); // make sure any stuffed commands are done CL_ParseServerData( msg ); break; case svc_addangle: CL_ParseAddAngle( msg ); break; case svc_clientdata: CL_ParseClientData( msg ); break; case svc_packetentities: CL_ParsePacketEntities( msg, false ); break; case svc_deltapacketentities: CL_ParsePacketEntities( msg, true ); break; case svc_updatepings: CL_UpdateUserPings( msg ); break; case svc_usermessage: CL_RegisterUserMessage( msg ); break; case svc_particle: CL_ParseParticles( msg ); break; case svc_restoresound: CL_ParseRestoreSoundPacket( msg ); break; case svc_spawnstatic: CL_ParseStaticEntity( msg ); break; case svc_ambientsound: CL_ParseSoundPacket( msg, true ); break; case svc_crosshairangle: CL_ParseCrosshairAngle( msg ); break; case svc_spawnbaseline: CL_ParseBaseline( msg ); break; case svc_temp_entity: CL_ParseTempEntity( msg ); break; case svc_setpause: cl.refdef.paused = ( BF_ReadOneBit( msg ) != 0 ); break; case svc_deltamovevars: CL_ParseMovevars( msg ); break; case svc_customization: CL_ParseCustomization( msg ); break; case svc_centerprint: CL_CenterPrint( BF_ReadString( msg ), 0.25f ); break; case svc_event: CL_ParseEvent( msg ); break; case svc_event_reliable: CL_ParseReliableEvent( msg ); break; case svc_updateuserinfo: CL_UpdateUserinfo( msg ); break; case svc_intermission: cl.refdef.intermission = true; break; case svc_modelindex: CL_PrecacheModel( msg ); break; case svc_soundindex: CL_PrecacheSound( msg ); break; case svc_soundfade: CL_ParseSoundFade( msg ); break; case svc_cdtrack: param1 = BF_ReadByte( msg ); param1 = bound( 1, param1, MAX_CDTRACKS ); // tracknum param2 = BF_ReadByte( msg ); param2 = bound( 1, param2, MAX_CDTRACKS ); // loopnum S_StartBackgroundTrack( clgame.cdtracks[param1-1], clgame.cdtracks[param2-1], 0 ); break; case svc_serverinfo: CL_ServerInfo( msg ); break; case svc_eventindex: CL_PrecacheEvent( msg ); break; case svc_deltatable: Delta_ParseTableField( msg ); break; case svc_weaponanim: param1 = BF_ReadByte( msg ); // iAnim param2 = BF_ReadByte( msg ); // body CL_WeaponAnim( param1, param2 ); break; case svc_bspdecal: CL_ParseStaticDecal( msg ); break; case svc_roomtype: param1 = BF_ReadShort( msg ); Cvar_SetFloat( "room_type", param1 ); break; case svc_chokecount: i = BF_ReadByte( msg ); j = cls.netchan.incoming_acknowledged - 1; for( ; i > 0 && j > cls.netchan.outgoing_sequence - CL_UPDATE_BACKUP; j-- ) { if( cl.frames[j & CL_UPDATE_MASK].receivedtime != -3.0 ) { cl.frames[j & CL_UPDATE_MASK].receivedtime = -2.0; i--; } } break; case svc_resourcelist: CL_ParseResourceList( msg ); break; case svc_director: CL_ParseDirector( msg ); break; case svc_studiodecal: CL_ParseStudioDecal( msg ); break; case svc_querycvarvalue: CL_ParseCvarValue( msg ); break; case svc_querycvarvalue2: CL_ParseCvarValue2( msg ); break; default: CL_ParseUserMessage( msg, cmd ); break; } } cls_message_debug.parsing = false; // done // we don't know if it is ok to save a demo message until // after we have parsed the frame if( !cls.demoplayback ) { if( cls.demorecording && !cls.demowaiting ) { CL_WriteDemoMessage( false, starting_count, msg ); } else if( cls.state != ca_active ) { CL_WriteDemoMessage( true, starting_count, msg ); } } }
void CLQ1_ParseServerMessage( QMsg& message ) { if ( cl_shownet->value == 1 ) { common->Printf( "%i ", message.cursize ); } else if ( cl_shownet->value == 2 ) { common->Printf( "------------------\n" ); } cl.qh_onground = false; // unless the server says otherwise // // parse the message // message.BeginReadingOOB(); while ( 1 ) { if ( message.badread ) { common->Error( "CLQ1_ParseServerMessage: Bad server message" ); } int cmd = message.ReadByte(); if ( cmd == -1 ) { SHOWNET( message, "END OF MESSAGE" ); return; // end of message } // if the high bit of the command byte is set, it is a fast update if ( cmd & Q1U_SIGNAL ) { SHOWNET( message, "fast update" ); CLQ1_ParseUpdate( message, cmd & 127 ); continue; } SHOWNET( message, svcq1_strings[ cmd ] ); // other commands switch ( cmd ) { default: common->Error( "CLQ1_ParseServerMessage: Illegible server message\n" ); break; case q1svc_nop: break; case q1svc_time: CLQH_ParseTime( message ); break; case q1svc_clientdata: CLQ1_ParseClientdata( message ); break; case q1svc_version: CLQ1_ParseVersion( message ); break; case q1svc_disconnect: CLQH_ParseDisconnect(); break; case q1svc_print: CLQ1_ParsePrint( message ); break; case q1svc_centerprint: CL_ParseCenterPrint( message ); break; case q1svc_stufftext: CL_ParseStuffText( message ); break; case q1svc_damage: VQH_ParseDamage( message ); break; case q1svc_serverinfo: CLQ1_ParseServerInfo( message ); break; case q1svc_setangle: CLQH_ParseSetAngle( message ); break; case q1svc_setview: CLQH_ParseSetView( message ); break; case q1svc_lightstyle: CLQH_ParseLightStyle( message ); break; case q1svc_sound: CLQ1_ParseStartSoundPacket( message ); break; case q1svc_stopsound: CLQH_ParseStopSound( message ); break; case q1svc_updatename: CLQ1_UpdateName( message ); break; case q1svc_updatefrags: CLQ1_ParseUpdateFrags( message ); break; case q1svc_updatecolors: CLQ1_ParseUpdateColours( message ); break; case q1svc_particle: CLQ1_ParseParticleEffect( message ); break; case q1svc_spawnbaseline: CLQ1_ParseSpawnBaseline( message ); break; case q1svc_spawnstatic: CLQ1_ParseSpawnStatic( message ); break; case q1svc_temp_entity: CLQ1_ParseTEnt( message ); break; case q1svc_setpause: CLQH_ParseSetPause( message ); break; case q1svc_signonnum: CLQ1_ParseSignonNum( message ); break; case q1svc_killedmonster: CLQH_ParseKilledMonster(); break; case q1svc_foundsecret: CLQH_ParseFoundSecret(); break; case q1svc_updatestat: CLQH_ParseUpdateStat( message ); break; case q1svc_spawnstaticsound: CLQH_ParseStaticSound( message ); break; case q1svc_cdtrack: CLQ1_ParseCDTrack( message ); break; case q1svc_intermission: CLQ1_ParseIntermission(); break; case q1svc_finale: CLQ1_ParseFinale( message ); break; case q1svc_cutscene: CLQ1_ParseCutscene( message ); break; case q1svc_sellscreen: CLQH_ParseSellScreen(); break; } } }