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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? common.c

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

*/
// common.c -- misc functions used in client and server
#include "qcommon.h"
#include <setjmp.h>

#define	MAXPRINTMSG	4096

#define MAX_NUM_ARGVS	50


int		com_argc;
char	*com_argv[MAX_NUM_ARGVS+1];

int		realtime;

jmp_buf abortframe;		// an ERR_DROP occured, exit the entire frame


FILE	*log_stats_file;

cvar_t	*host_speeds;
cvar_t	*log_stats;
cvar_t	*developer;
cvar_t	*timescale;
cvar_t	*fixedtime;
cvar_t	*logfile_active;	// 1 = buffer log, 2 = flush after each print
cvar_t	*showtrace;
cvar_t	*dedicated;

FILE	*logfile;

int			server_state;

// host_speeds times
int		time_before_game;
int		time_after_game;
int		time_before_ref;
int		time_after_ref;

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

CLIENT / SERVER interactions

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

static int	rd_target;
static char	*rd_buffer;
static int	rd_buffersize;
static void	(*rd_flush)(int target, char *buffer);

void Com_BeginRedirect (int target, char *buffer, int buffersize, void (*flush))
{
	if (!target || !buffer || !buffersize || !flush)
		return;
	rd_target = target;
	rd_buffer = buffer;
	rd_buffersize = buffersize;
	rd_flush = flush;

	*rd_buffer = 0;
}

void Com_EndRedirect (void)
{
	rd_flush(rd_target, rd_buffer);

	rd_target = 0;
	rd_buffer = NULL;
	rd_buffersize = 0;
	rd_flush = NULL;
}

/*
=============
Com_Printf

Both client and server can use this, and it will output
to the apropriate place.
=============
*/
void Com_Printf (char *fmt, ...)
{
	va_list		argptr;
	char		msg[MAXPRINTMSG];

	va_start (argptr,fmt);
	vsprintf (msg,fmt,argptr);
	va_end (argptr);

	if (rd_target)
	{
		if ((strlen (msg) + strlen(rd_buffer)) > (rd_buffersize - 1))
		{
			rd_flush(rd_target, rd_buffer);
			*rd_buffer = 0;
		}
		strcat (rd_buffer, msg);
		return;
	}

	Con_Print (msg);
		
	// also echo to debugging console
	Sys_ConsoleOutput (msg);

	// logfile
	if (logfile_active && logfile_active->value)
	{
		char	name[MAX_QPATH];
		
		if (!logfile)
		{
			Com_sprintf (name, sizeof(name), "%s/qconsole.log", FS_Gamedir ());
			if (logfile_active->value > 2)
				logfile = fopen (name, "a");
			else
				logfile = fopen (name, "w");
		}
		if (logfile)
			fprintf (logfile, "%s", msg);
		if (logfile_active->value > 1)
			fflush (logfile);		// force it to save every time
	}
}


/*
================
Com_DPrintf

A Com_Printf that only shows up if the "developer" cvar is set
================
*/
void Com_DPrintf (char *fmt, ...)
{
	va_list		argptr;
	char		msg[MAXPRINTMSG];
		
	if (!developer || !developer->value)
		return;			// don't confuse non-developers with techie stuff...

	va_start (argptr,fmt);
	vsprintf (msg,fmt,argptr);
	va_end (argptr);
	
	Com_Printf ("%s", msg);
}


/*
=============
Com_Error

Both client and server can use this, and it will
do the apropriate things.
=============
*/
void Com_Error (int code, char *fmt, ...)
{
	va_list		argptr;
	static char		msg[MAXPRINTMSG];
	static	qboolean	recursive;

	if (recursive)
		Sys_Error ("recursive error after: %s", msg);
	recursive = true;

	va_start (argptr,fmt);
	vsprintf (msg,fmt,argptr);
	va_end (argptr);
	
	if (code == ERR_DISCONNECT)
	{
		CL_Drop ();
		recursive = false;
		longjmp (abortframe, -1);
	}
	else if (code == ERR_DROP)
	{
		Com_Printf ("********************\nERROR: %s\n********************\n", msg);
		SV_Shutdown (va("Server crashed: %s\n", msg), false);
		CL_Drop ();
		recursive = false;
		longjmp (abortframe, -1);
	}
	else
	{
		SV_Shutdown (va("Server fatal crashed: %s\n", msg), false);
		CL_Shutdown ();
	}

	if (logfile)
	{
		fclose (logfile);
		logfile = NULL;
	}

	Sys_Error ("%s", msg);
}


/*
=============
Com_Quit

Both client and server can use this, and it will
do the apropriate things.
=============
*/
void Com_Quit (void)
{
	SV_Shutdown ("Server quit\n", false);
	CL_Shutdown ();

	if (logfile)
	{
		fclose (logfile);
		logfile = NULL;
	}

	Sys_Quit ();
}


/*
==================
Com_ServerState
==================
*/
int Com_ServerState (void)
{
	return server_state;
}

/*
==================
Com_SetServerState
==================
*/
void Com_SetServerState (int state)
{
	server_state = state;
}


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

			MESSAGE IO FUNCTIONS

Handles byte ordering and avoids alignment errors
==============================================================================
*/

vec3_t	bytedirs[NUMVERTEXNORMALS] =
{
#include "../client/anorms.h"
};

//
// writing functions
//

void MSG_WriteChar (sizebuf_t *sb, int c)
{
	byte	*buf;
	
#ifdef PARANOID
	if (c < -128 || c > 127)
		Com_Error (ERR_FATAL, "MSG_WriteChar: range error");
#endif

	buf = SZ_GetSpace (sb, 1);
	buf[0] = c;
}

void MSG_WriteByte (sizebuf_t *sb, int c)
{
	byte	*buf;
	
#ifdef PARANOID
	if (c < 0 || c > 255)
		Com_Error (ERR_FATAL, "MSG_WriteByte: range error");
#endif

	buf = SZ_GetSpace (sb, 1);
	buf[0] = c;
}

void MSG_WriteShort (sizebuf_t *sb, int c)
{
	byte	*buf;
	
#ifdef PARANOID
	if (c < ((short)0x8000) || c > (short)0x7fff)
		Com_Error (ERR_FATAL, "MSG_WriteShort: range error");
#endif

	buf = SZ_GetSpace (sb, 2);
	buf[0] = c&0xff;
	buf[1] = c>>8;
}

void MSG_WriteLong (sizebuf_t *sb, int c)
{
	byte	*buf;
	
	buf = SZ_GetSpace (sb, 4);
	buf[0] = c&0xff;
	buf[1] = (c>>8)&0xff;
	buf[2] = (c>>16)&0xff;
	buf[3] = c>>24;
}

void MSG_WriteFloat (sizebuf_t *sb, float f)
{
	union
	{
		float	f;
		int	l;
	} dat;
	
	
	dat.f = f;
	dat.l = LittleLong (dat.l);
	
	SZ_Write (sb, &dat.l, 4);
}

void MSG_WriteString (sizebuf_t *sb, char *s)
{
	if (!s)
		SZ_Write (sb, "", 1);
	else
		SZ_Write (sb, s, strlen(s)+1);
}

void MSG_WriteCoord (sizebuf_t *sb, float f)
{
	MSG_WriteShort (sb, (int)(f*8));
}

void MSG_WritePos (sizebuf_t *sb, vec3_t pos)
{
	MSG_WriteShort (sb, (int)(pos[0]*8));
	MSG_WriteShort (sb, (int)(pos[1]*8));
	MSG_WriteShort (sb, (int)(pos[2]*8));
}

void MSG_WriteAngle (sizebuf_t *sb, float f)
{
	MSG_WriteByte (sb, (int)(f*256/360) & 255);
}

void MSG_WriteAngle16 (sizebuf_t *sb, float f)
{
	MSG_WriteShort (sb, ANGLE2SHORT(f));
}


void MSG_WriteDeltaUsercmd (sizebuf_t *buf, usercmd_t *from, usercmd_t *cmd)
{
	int		bits;

//
// send the movement message
//
	bits = 0;
	if (cmd->angles[0] != from->angles[0])
		bits |= CM_ANGLE1;
	if (cmd->angles[1] != from->angles[1])
		bits |= CM_ANGLE2;
	if (cmd->angles[2] != from->angles[2])
		bits |= CM_ANGLE3;
	if (cmd->forwardmove != from->forwardmove)
		bits |= CM_FORWARD;
	if (cmd->sidemove != from->sidemove)
		bits |= CM_SIDE;
	if (cmd->upmove != from->upmove)
		bits |= CM_UP;
	if (cmd->buttons != from->buttons)
		bits |= CM_BUTTONS;
	if (cmd->impulse != from->impulse)
		bits |= CM_IMPULSE;

    MSG_WriteByte (buf, bits);

	if (bits & CM_ANGLE1)
		MSG_WriteShort (buf, cmd->angles[0]);
	if (bits & CM_ANGLE2)
		MSG_WriteShort (buf, cmd->angles[1]);
	if (bits & CM_ANGLE3)
		MSG_WriteShort (buf, cmd->angles[2]);
	
	if (bits & CM_FORWARD)
		MSG_WriteShort (buf, cmd->forwardmove);
	if (bits & CM_SIDE)
	  	MSG_WriteShort (buf, cmd->sidemove);
	if (bits & CM_UP)
		MSG_WriteShort (buf, cmd->upmove);

 	if (bits & CM_BUTTONS)
	  	MSG_WriteByte (buf, cmd->buttons);
 	if (bits & CM_IMPULSE)
	    MSG_WriteByte (buf, cmd->impulse);

    MSG_WriteByte (buf, cmd->msec);
	MSG_WriteByte (buf, cmd->lightlevel);
}


void MSG_WriteDir (sizebuf_t *sb, vec3_t dir)
{
	int		i, best;
	float	d, bestd;
	
	if (!dir)
	{
		MSG_WriteByte (sb, 0);
		return;
	}

	bestd = 0;
	best = 0;
	for (i=0 ; i<NUMVERTEXNORMALS ; i++)
	{
		d = DotProduct (dir, bytedirs[i]);
		if (d > bestd)
		{
			bestd = d;
			best = i;
		}
	}
	MSG_WriteByte (sb, best);
}


void MSG_ReadDir (sizebuf_t *sb, vec3_t dir)
{
	int		b;

	b = MSG_ReadByte (sb);
	if (b >= NUMVERTEXNORMALS)
		Com_Error (ERR_DROP, "MSF_ReadDir: out of range");
	VectorCopy (bytedirs[b], dir);
}


/*
==================
MSG_WriteDeltaEntity

Writes part of a packetentities message.
Can delta from either a baseline or a previous packet_entity
==================
*/
void MSG_WriteDeltaEntity (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qboolean force, qboolean newentity)
{
	int		bits;

	if (!to->number)
		Com_Error (ERR_FATAL, "Unset entity number");
	if (to->number >= MAX_EDICTS)
		Com_Error (ERR_FATAL, "Entity number >= MAX_EDICTS");

// send an update
	bits = 0;

	if (to->number >= 256)
		bits |= U_NUMBER16;		// number8 is implicit otherwise

	if (to->origin[0] != from->origin[0])
		bits |= U_ORIGIN1;
	if (to->origin[1] != from->origin[1])
		bits |= U_ORIGIN2;
	if (to->origin[2] != from->origin[2])
		bits |= U_ORIGIN3;

	if ( to->angles[0] != from->angles[0] )
		bits |= U_ANGLE1;		
	if ( to->angles[1] != from->angles[1] )
		bits |= U_ANGLE2;
	if ( to->angles[2] != from->angles[2] )
		bits |= U_ANGLE3;
		
	if ( to->skinnum != from->skinnum )
	{
		if ((unsigned)to->skinnum < 256)
			bits |= U_SKIN8;
		else if ((unsigned)to->skinnum < 0x10000)
			bits |= U_SKIN16;
		else
			bits |= (U_SKIN8|U_SKIN16);
	}
		
	if ( to->frame != from->frame )
	{
		if (to->frame < 256)
			bits |= U_FRAME8;
		else
			bits |= U_FRAME16;
	}

	if ( to->effects != from->effects )
	{
		if (to->effects < 256)
			bits |= U_EFFECTS8;
		else if (to->effects < 0x8000)
			bits |= U_EFFECTS16;
		else
			bits |= U_EFFECTS8|U_EFFECTS16;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区电影在线观看| 在线免费观看日本欧美| 99久久99久久免费精品蜜臀| 91精品国产综合久久久蜜臀图片| 日本一二三四高清不卡| 日韩av成人高清| 91在线视频免费观看| 久久综合九色综合久久久精品综合| 亚洲男同性视频| 国产大片一区二区| 91精品国产91综合久久蜜臀| 亚洲精品一二三区| 国产二区国产一区在线观看| 欧美一级片在线看| 亚洲一线二线三线久久久| 成人ar影院免费观看视频| 精品理论电影在线观看 | 国产呦萝稀缺另类资源| 欧美情侣在线播放| 亚洲精品中文在线影院| 国产**成人网毛片九色 | 日韩三级电影网址| 亚洲福利视频三区| 在线视频欧美精品| 国产精品美女久久久久aⅴ国产馆| 国产乱子轮精品视频| 欧美一区二区三区视频免费播放| 午夜精品久久久久久久蜜桃app| 色综合久久88色综合天天免费| 国产欧美va欧美不卡在线| 精品一区二区免费看| 日韩精品中文字幕一区二区三区| 亚洲一区在线视频观看| 欧美色窝79yyyycom| 午夜视频一区在线观看| 欧美日韩精品福利| 日韩影院免费视频| 欧美一区二区三区公司| 久久成人免费电影| 在线精品视频一区二区| 亚洲高清免费观看高清完整版在线观看| 欧美在线一区二区| 五月婷婷欧美视频| 日韩精品中午字幕| 国产精品一级在线| 中文字幕av一区 二区| 91在线视频观看| 午夜久久久久久电影| 777a∨成人精品桃花网| 久久不见久久见免费视频7| 日本一区二区三区国色天香 | 国产成人自拍网| 日本一区二区电影| 欧美亚洲国产一区在线观看网站| 五月天精品一区二区三区| 日韩免费观看2025年上映的电影| 国产精品一区免费视频| 亚洲精品国产精华液| 91精品国产全国免费观看| 国产精品中文字幕日韩精品| 亚洲欧洲精品天堂一级| 欧美在线|欧美| 极品美女销魂一区二区三区免费| 国产精品乱人伦| 777xxx欧美| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 毛片一区二区三区| 国产精品久久毛片av大全日韩| 欧美日韩不卡一区| 韩国一区二区视频| 亚洲精品日韩一| 久久久久久久久久久99999| 色噜噜狠狠色综合欧洲selulu| 免费成人你懂的| 亚洲欧美另类图片小说| 欧美成人高清电影在线| 91在线免费看| 国产成人h网站| 日本欧美大码aⅴ在线播放| 国产精品久久一级| 精品免费国产二区三区| 色拍拍在线精品视频8848| 国产精品一级黄| 美女看a上一区| 午夜激情综合网| 亚洲欧美激情在线| 久久久久国产精品厨房| 在线播放日韩导航| 色综合久久久久网| 国产成人在线电影| 免费在线看一区| 亚洲不卡一区二区三区| 国产精品嫩草久久久久| 亚洲精品在线三区| 欧美高清视频一二三区 | 色香蕉成人二区免费| 懂色av一区二区在线播放| 麻豆精品久久久| 日韩精品三区四区| 亚洲欧美激情在线| 国产精品蜜臀av| 国产精品久久夜| 国产精品网站导航| 国产日产欧美一区二区视频| 久久久久久影视| 欧美大肚乱孕交hd孕妇| 91精品国产色综合久久不卡电影 | 色中色一区二区| www..com久久爱| 成+人+亚洲+综合天堂| 国产精品18久久久久久久久久久久| 久久精品国产澳门| 亚洲大型综合色站| 亚洲大片免费看| 五月天丁香久久| 日韩黄色在线观看| 日日夜夜精品视频天天综合网| 五月婷婷激情综合| 日本系列欧美系列| 久久精品99国产精品| 国产一区二区福利| 国产不卡视频一区| 不卡一区二区中文字幕| 91免费看视频| 欧美日韩在线不卡| 欧美一激情一区二区三区| 91精品国产色综合久久| 欧美精品一区二区久久久| www激情久久| 亚洲欧美日本在线| 日韩专区一卡二卡| 久久不见久久见免费视频1| 国产乱码精品1区2区3区| 成人不卡免费av| 欧美手机在线视频| 欧美一级在线免费| 久久久综合网站| 亚洲精品综合在线| 免费观看日韩av| 99久久综合狠狠综合久久| 色域天天综合网| 欧美tickle裸体挠脚心vk| 国产女人aaa级久久久级| 亚洲精品国产无天堂网2021| 青娱乐精品视频在线| 国产成人在线观看| 欧美日韩一级大片网址| 精品国产一二三区| 亚洲人被黑人高潮完整版| 天天综合网 天天综合色| 国产精品一区二区久久不卡 | 在线看日韩精品电影| 日韩一区二区免费在线电影| 中文字幕欧美日韩一区| 亚洲成av人片一区二区三区| 成人中文字幕合集| 欧美体内she精视频| 国产亚洲短视频| 亚洲成人一区在线| 成人综合婷婷国产精品久久| 在线不卡的av| 亚洲欧美电影一区二区| 精品一区二区三区在线播放视频| 91女神在线视频| 2020日本不卡一区二区视频| 午夜精品久久久久影视| av在线不卡网| 国产清纯美女被跳蛋高潮一区二区久久w | 99精品视频在线观看| 日韩一级在线观看| 亚洲精品一卡二卡| 国产不卡在线播放| 欧美成人免费网站| 亚洲国产成人av网| 成人性视频免费网站| 日韩欧美一区二区免费| 亚洲一区二区在线免费观看视频| 国产·精品毛片| 久久久亚洲国产美女国产盗摄| 日韩1区2区3区| 欧美日韩极品在线观看一区| 亚洲男女一区二区三区| 成人午夜激情影院| 久久网站热最新地址| 秋霞av亚洲一区二区三| 欧美高清你懂得| 亚洲综合另类小说| 日本国产一区二区| 亚洲日穴在线视频| 99久久精品一区二区| 日本一区二区免费在线| 国产精品一卡二| 久久久午夜精品理论片中文字幕| 久88久久88久久久| 日韩精品最新网址| 久久电影国产免费久久电影| 精品国产一区二区精华| 国精产品一区一区三区mba桃花| 91精品国产高清一区二区三区 | 热久久免费视频|