亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cl_parse.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*
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

#include "client.h"

char *svc_strings[256] =
{
	"svc_bad",

	"svc_muzzleflash",
	"svc_muzzlflash2",
	"svc_temp_entity",
	"svc_layout",
	"svc_inventory",

	"svc_nop",
	"svc_disconnect",
	"svc_reconnect",
	"svc_sound",
	"svc_print",
	"svc_stufftext",
	"svc_serverdata",
	"svc_configstring",
	"svc_spawnbaseline",	
	"svc_centerprint",
	"svc_download",
	"svc_playerinfo",
	"svc_packetentities",
	"svc_deltapacketentities",
	"svc_frame"
};

//=============================================================================

void CL_DownloadFileName(char *dest, int destlen, char *fn)
{
	if (strncmp(fn, "players", 7) == 0)
		Com_sprintf (dest, destlen, "%s/%s", BASEDIRNAME, fn);
	else
		Com_sprintf (dest, destlen, "%s/%s", FS_Gamedir(), fn);
}

/*
===============
CL_CheckOrDownloadFile

Returns true if the file exists, otherwise it attempts
to start a download from the server.
===============
*/
qboolean	CL_CheckOrDownloadFile (char *filename)
{
	FILE *fp;
	char	name[MAX_OSPATH];

	if (strstr (filename, ".."))
	{
		Com_Printf ("Refusing to download a path with ..\n");
		return true;
	}

	if (FS_LoadFile (filename, NULL) != -1)
	{	// it exists, no need to download
		return true;
	}

	strcpy (cls.downloadname, filename);

	// download to a temp name, and only rename
	// to the real name when done, so if interrupted
	// a runt file wont be left
	COM_StripExtension (cls.downloadname, cls.downloadtempname);
	strcat (cls.downloadtempname, ".tmp");

//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);

//	FS_CreatePath (name);

	fp = fopen (name, "r+b");
	if (fp) { // it exists
		int len;
		fseek(fp, 0, SEEK_END);
		len = ftell(fp);

		cls.download = fp;

		// give the server an offset to start the download
		Com_Printf ("Resuming %s\n", cls.downloadname);
		MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
		MSG_WriteString (&cls.netchan.message,
			va("download %s %i", cls.downloadname, len));
	} else {
		Com_Printf ("Downloading %s\n", cls.downloadname);
		MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
		MSG_WriteString (&cls.netchan.message,
			va("download %s", cls.downloadname));
	}

	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) {
		Com_Printf("Usage: download <filename>\n");
		return;
	}

	Com_sprintf(filename, sizeof(filename), "%s", Cmd_Argv(1));

	if (strstr (filename, ".."))
	{
		Com_Printf ("Refusing to download a path with ..\n");
		return;
	}

	if (FS_LoadFile (filename, NULL) != -1)
	{	// it exists, no need to download
		Com_Printf("File already exists.\n");
		return;
	}

	strcpy (cls.downloadname, filename);
	Com_Printf ("Downloading %s\n", cls.downloadname);

	// download to a temp name, and only rename
	// to the real name when done, so if interrupted
	// a runt file wont be left
	COM_StripExtension (cls.downloadname, cls.downloadtempname);
	strcat (cls.downloadtempname, ".tmp");

	MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
	MSG_WriteString (&cls.netchan.message,
		va("download %s", cls.downloadname));

	cls.downloadnumber++;
}

/*
======================
CL_RegisterSounds
======================
*/
void CL_RegisterSounds (void)
{
	int		i;

	S_BeginRegistration ();
	CL_RegisterTEntSounds ();
	for (i=1 ; i<MAX_SOUNDS ; i++)
	{
		if (!cl.configstrings[CS_SOUNDS+i][0])
			break;
		cl.sound_precache[i] = S_RegisterSound (cl.configstrings[CS_SOUNDS+i]);
		Sys_SendKeyEvents ();	// pump message loop
	}
	S_EndRegistration ();
}


/*
=====================
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
// change display routines by zoid
#if 0
		Com_Printf (".");
		if (10*(percent/10) != cls.downloadpercent)
		{
			cls.downloadpercent = 10*(percent/10);
			Com_Printf ("%i%%", cls.downloadpercent);
		}
#endif
		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];

//		Com_Printf ("100%%\n");

		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 ();
	}
}


/*
=====================================================================

  SERVER CONNECTING MESSAGES

=====================================================================
*/

/*
==================
CL_ParseServerData
==================
*/
void CL_ParseServerData (void)
{
	extern cvar_t	*fs_gamedirvar;
	char	*str;
	int		i;
	
	Com_DPrintf ("Serverdata packet received.\n");
//
// wipe the client_state_t struct
//
	CL_ClearState ();
	cls.state = ca_connected;

// parse protocol version number
	i = MSG_ReadLong (&net_message);
	cls.serverProtocol = i;

	// BIG HACK to let demos from release work with the 3.0x patch!!!
	if (Com_ServerState() && PROTOCOL_VERSION == 34)
	{
	}
	else if (i != PROTOCOL_VERSION)
		Com_Error (ERR_DROP,"Server returned version %i, not %i", i, PROTOCOL_VERSION);

	cl.servercount = MSG_ReadLong (&net_message);
	cl.attractloop = MSG_ReadByte (&net_message);

	// game directory
	str = MSG_ReadString (&net_message);
	strncpy (cl.gamedir, str, sizeof(cl.gamedir)-1);

	// set gamedir
	if ((*str && (!fs_gamedirvar->string || !*fs_gamedirvar->string || strcmp(fs_gamedirvar->string, str))) || (!*str && (fs_gamedirvar->string || *fs_gamedirvar->string)))
		Cvar_Set("game", str);

	// parse player entity number
	cl.playernum = MSG_ReadShort (&net_message);

	// get the full level name
	str = MSG_ReadString (&net_message);

	if (cl.playernum == -1)
	{	// playing a cinematic or showing a pic, not a level
		SCR_PlayCinematic (str);
	}
	else
	{
		// seperate the printfs so the server message can have a color
		Com_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");
		Com_Printf ("%c%s\n", 2, str);

		// need to prep refresh at next oportunity
		cl.refresh_prepped = false;
	}
}

/*
==================
CL_ParseBaseline
==================
*/
void CL_ParseBaseline (void)
{
	entity_state_t	*es;
	int				bits;
	int				newnum;
	entity_state_t	nullstate;

	memset (&nullstate, 0, sizeof(nullstate));

	newnum = CL_ParseEntityBits (&bits);
	es = &cl_entities[newnum].baseline;
	CL_ParseDelta (&nullstate, es, newnum, bits);
}


/*
================
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		skin_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;
	}

	if (cl_noskins->value || *s == 0)
	{
		Com_sprintf (model_filename, sizeof(model_filename), "players/male/tris.md2");
		Com_sprintf (weapon_filename, sizeof(weapon_filename), "players/male/weapon.md2");

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
图片区小说区区亚洲影院| 麻豆freexxxx性91精品| 欧美人体做爰大胆视频| 国产麻豆精品视频| 亚洲国产综合91精品麻豆| 久久精品欧美一区二区三区麻豆| 91极品美女在线| 国产一区欧美二区| 日韩一区欧美二区| 亚洲欧美激情小说另类| 国产人成亚洲第一网站在线播放| 91精品国产综合久久国产大片| 成人国产精品视频| 久久成人久久鬼色| 首页国产欧美日韩丝袜| 亚洲欧美福利一区二区| 久久美女高清视频| 日韩欧美中文一区二区| 欧美色老头old∨ideo| 色综合咪咪久久| 成人激情黄色小说| 国产一区二三区| 免费观看成人鲁鲁鲁鲁鲁视频| 一区二区三区四区高清精品免费观看 | 亚洲超丰满肉感bbw| 成人免费一区二区三区视频| 日本一区二区三区国色天香| 精品国产麻豆免费人成网站| 欧美一卡2卡三卡4卡5免费| 91福利小视频| 欧亚一区二区三区| 91蝌蚪porny| fc2成人免费人成在线观看播放| 国产精品一区久久久久| 狠狠色狠狠色综合系列| 韩国女主播成人在线观看| 免费久久99精品国产| 日本伊人色综合网| 日韩高清不卡一区| 天堂av在线一区| 视频在线观看一区| 日韩在线卡一卡二| 日韩1区2区日韩1区2区| 免费看日韩精品| 经典三级视频一区| 国产精品99久| 成年人国产精品| 91啦中文在线观看| 在线观看免费亚洲| 欧美亚洲高清一区| 欧美乱妇15p| 精品人在线二区三区| 精品成人一区二区| 国产免费成人在线视频| 国产精品丝袜在线| 一区二区三区在线免费观看| 亚洲伊人色欲综合网| 日韩国产精品大片| 精品在线视频一区| 懂色av一区二区三区免费看| 色综合天天综合网国产成人综合天 | 91精品国产综合久久精品图片| 欧美日韩中文字幕一区| 777xxx欧美| 久久只精品国产| 国产精品卡一卡二卡三| 一区二区三区在线观看国产| 日韩高清电影一区| 韩国三级电影一区二区| 97久久精品人人做人人爽50路| 在线亚洲一区二区| 欧美另类一区二区三区| 久久精品一区二区| 亚洲丝袜精品丝袜在线| 奇米色一区二区三区四区| 国产精品一区二区三区99| 一本到三区不卡视频| 91精品婷婷国产综合久久性色| 国产三级精品视频| 亚洲福利视频导航| 国产成人在线视频免费播放| 日本精品一级二级| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲色图欧洲色图婷婷| 免费成人在线观看视频| www.色综合.com| 欧美精品777| 国产精品国产三级国产有无不卡| 天天操天天干天天综合网| 国产精品一级片在线观看| 欧美视频一区二区三区在线观看| 337p粉嫩大胆色噜噜噜噜亚洲| 一区二区久久久| 国产成人精品免费看| 欧美乱妇23p| 亚洲欧美电影一区二区| 激情偷乱视频一区二区三区| 欧美视频在线观看一区二区| 中文一区二区在线观看| 美国av一区二区| 欧美日韩亚洲另类| 亚洲欧洲三级电影| 国产一区二区三区电影在线观看| 欧美婷婷六月丁香综合色| 中文字幕av资源一区| 精品一区二区三区欧美| 欧美精品成人一区二区三区四区| 国产精品国产成人国产三级| 久久精品国产99| 欧美精品丝袜久久久中文字幕| 亚洲欧洲成人精品av97| 国产成人免费视频网站 | 成人免费视频视频在线观看免费 | av电影在线观看一区| 欧美精品一区二区在线播放 | 亚洲精品视频观看| 成人免费视频一区| 精品裸体舞一区二区三区| 天堂蜜桃一区二区三区| 欧美天堂亚洲电影院在线播放| 亚洲视频在线观看一区| 国产盗摄精品一区二区三区在线 | 欧美日韩激情一区二区三区| 亚洲人成影院在线观看| 大美女一区二区三区| 精品国产污污免费网站入口| 免费在线欧美视频| 欧美精品三级在线观看| 亚洲777理论| 欧美老女人在线| 午夜精品福利一区二区三区蜜桃| 日本道色综合久久| 一区二区三区中文在线观看| 91丨porny丨蝌蚪视频| 国产精品色哟哟网站| 成人免费视频视频| 亚洲视频在线一区| 欧亚洲嫩模精品一区三区| 一区二区在线看| 欧美在线不卡一区| 午夜久久久久久电影| 日韩小视频在线观看专区| 久久精品免费看| 国产视频一区二区三区在线观看| 盗摄精品av一区二区三区| 亚洲欧洲av色图| 欧美亚洲国产一区二区三区va| 亚洲国产欧美日韩另类综合| 9191精品国产综合久久久久久| 人人狠狠综合久久亚洲| 精品精品国产高清a毛片牛牛| 国产一区在线观看麻豆| 国产欧美日韩三区| 色偷偷久久一区二区三区| 亚洲国产欧美日韩另类综合| 欧美一区二区精美| 国产精品 日产精品 欧美精品| 国产精品久久久久精k8| 91视频91自| 日韩极品在线观看| 久久久蜜臀国产一区二区| 成人app网站| 偷窥少妇高潮呻吟av久久免费| 欧美一区三区二区| 东方欧美亚洲色图在线| 亚洲影院理伦片| 欧美tk—视频vk| 成人免费的视频| 午夜精品福利视频网站| 久久青草欧美一区二区三区| 色综合中文字幕| 日本欧洲一区二区| 国产精品美女久久久久久久久| 欧美亚洲一区二区在线观看| 青青国产91久久久久久| 中文无字幕一区二区三区| 欧美女孩性生活视频| 国产乱码字幕精品高清av | 中文字幕一区av| 91麻豆精品国产自产在线 | 91精品国产综合久久久蜜臀图片| 国产精品资源站在线| 亚洲午夜成aⅴ人片| 久久新电视剧免费观看| 欧美综合亚洲图片综合区| 黑人巨大精品欧美黑白配亚洲| 亚洲男人都懂的| 精品99999| 欧美美女bb生活片| 成a人片国产精品| 日本欧美久久久久免费播放网| 国产精品久久久久永久免费观看| 欧美视频中文字幕| av在线综合网| 国产麻豆精品一区二区| 婷婷六月综合亚洲| 亚洲精品欧美在线| 国产欧美日韩久久| 精品少妇一区二区三区在线播放| 色天天综合久久久久综合片|