Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
/*
=====================
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 );
		}
	}
}
Ejemplo n.º 3
0
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;
		}
	}
}