1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// cl_main.c  -- client main loop
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "winquake.h"
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef _WIN32
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "winsock.h"
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#else
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <netinet/in.h>
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// we need to declare some mouse variables here, because the menu system
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// references them even when on a unix system.
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	noclip_anglehack;		// remnant from old quake
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	rcon_password = CVAR3("rcon_password", "", false);
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	rcon_address = CVAR2("rcon_address", "");
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	cl_timeout = CVAR2("cl_timeout", "60");
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	cl_shownet = CVAR2("cl_shownet","0");	// can be 0, 1, or 2
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	cl_sbar		= CVAR3("cl_sbar", "0", true);
46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	cl_hudswap	= CVAR3("cl_hudswap", "0", true);
47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	cl_maxfps	= CVAR3("cl_maxfps", "0", true);
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	lookspring = CVAR3("lookspring","0", true);
50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	lookstrafe = CVAR3("lookstrafe","0", true);
51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	sensitivity = CVAR3("sensitivity","3", true);
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	m_pitch = CVAR3("m_pitch","0.022", true);
54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	m_yaw = CVAR2("m_yaw","0.022");
55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	m_forward = CVAR2("m_forward","1");
56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	m_side = CVAR2("m_side","0.8");
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	entlatency = CVAR2("entlatency", "20");
59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	cl_predict_players = CVAR2("cl_predict_players", "1");
60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	cl_predict_players2 = CVAR2("cl_predict_players2", "1");
61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	cl_solid_players = CVAR2("cl_solid_players", "1");
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t  localid = CVAR2("localid", "");
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic qboolean allowremotecmd = true;
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// info mirrors
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	password = CVAR4("password", "", false, true);
71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	spectator = CVAR4("spectator", "", false, true);
72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	name = CVAR4("name","unnamed", true, true);
73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	team = CVAR4("team","", true, true);
74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	skin = CVAR4("skin","", true, true);
75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	topcolor = CVAR4("topcolor","0", true, true);
76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	bottomcolor = CVAR4("bottomcolor","0", true, true);
77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	rate = CVAR4("rate","2500", true, true);
78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	noaim = CVAR4("noaim","0", true, true);
79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	msg = CVAR4("msg","1", true, true);
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern cvar_t cl_hightrack;
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamclient_static_t	cls;
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamclient_state_t	cl;
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamentity_state_t	cl_baselines[MAX_EDICTS];
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamefrag_t			cl_efrags[MAX_EFRAGS];
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamentity_t		cl_static_entities[MAX_STATIC_ENTITIES];
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamlightstyle_t	cl_lightstyle[MAX_LIGHTSTYLES];
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdlight_t		cl_dlights[MAX_DLIGHTS];
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// refresh list
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// this is double buffered so the last frame
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// can be scanned for oldorigins of trailing objects
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint				cl_numvisedicts, cl_oldnumvisedicts;
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamentity_t		*cl_visedicts, *cl_oldvisedicts;
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamentity_t		cl_visedicts_list[2][MAX_VISEDICTS];
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdouble			connect_time = -1;		// for connection retransmits
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamquakeparms_t host_parms;
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	host_initialized;		// true if into command execution
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	nomaster;
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdouble		host_frametime;
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdouble		realtime;				// without any filtering or bounding
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdouble		oldrealtime;			// last frame run
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			host_framecount;
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			host_hunklevel;
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte		*host_basepal;
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte		*host_colormap;
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamnetadr_t	master_adr;				// address of the master server
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	host_speeds = CVAR2("host_speeds","0");			// set for running times
120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	show_fps = CVAR2("show_fps","0");			// set for running times
121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	developer = CVAR2("developer","0");
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			fps_count;
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamjmp_buf 	host_abort;
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Master_Connect_f (void);
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	server_version = 0;	// version of server we connected to
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar emodel_name[] =
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{ 'e' ^ 0xff, 'm' ^ 0xff, 'o' ^ 0xff, 'd' ^ 0xff, 'e' ^ 0xff, 'l' ^ 0xff, 0 };
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar pmodel_name[] =
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{ 'p' ^ 0xff, 'm' ^ 0xff, 'o' ^ 0xff, 'd' ^ 0xff, 'e' ^ 0xff, 'l' ^ 0xff, 0 };
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar prespawn_name[] =
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{ 'p'^0xff, 'r'^0xff, 'e'^0xff, 's'^0xff, 'p'^0xff, 'a'^0xff, 'w'^0xff, 'n'^0xff,
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		' '^0xff, '%'^0xff, 'i'^0xff, ' '^0xff, '0'^0xff, ' '^0xff, '%'^0xff, 'i'^0xff, 0 };
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar modellist_name[] =
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{ 'm'^0xff, 'o'^0xff, 'd'^0xff, 'e'^0xff, 'l'^0xff, 'l'^0xff, 'i'^0xff, 's'^0xff, 't'^0xff,
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		' '^0xff, '%'^0xff, 'i'^0xff, ' '^0xff, '%'^0xff, 'i'^0xff, 0 };
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar soundlist_name[] =
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{ 's'^0xff, 'o'^0xff, 'u'^0xff, 'n'^0xff, 'd'^0xff, 'l'^0xff, 'i'^0xff, 's'^0xff, 't'^0xff,
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		' '^0xff, '%'^0xff, 'i'^0xff, ' '^0xff, '%'^0xff, 'i'^0xff, 0 };
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Quit_f
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Quit_f (void)
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (1 /* key_dest != key_console */ /* && cls.state != ca_dedicated */)
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		M_Menu_Quit_f ();
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_Disconnect ();
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sys_Quit ();
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=======================
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Version_f
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream======================
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Version_f (void)
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("Version %4.2f\n", VERSION);
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("Exe: "__TIME__" "__DATE__"\n");
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=======================
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_SendConnectPacket
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcalled by CL_Connect_f and CL_CheckResend
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream======================
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_SendConnectPacket (void)
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	netadr_t	adr;
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	data[2048];
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double t1, t2;
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// JACK: Fixed bug where DNS lookups would cause two connects real fast
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//       Now, adds lookup time to the connect time.
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		 Should I add it to realtime instead?!?!
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state != ca_disconnected)
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	t1 = Sys_DoubleTime ();
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!NET_StringToAdr (cls.servername, &adr))
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Bad server address\n");
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		connect_time = -1;
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!NET_IsClientLegal(&adr))
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Illegal server address\n");
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		connect_time = -1;
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (adr.port == 0)
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		adr.port = BigShort (27500);
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	t2 = Sys_DoubleTime ();
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	connect_time = realtime+t2-t1;	// for retransmit requests
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.qport = Cvar_VariableValue("qport");
215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Info_SetValueForStarKey (cls.userinfo, "*ip", NET_AdrToString(adr), MAX_INFO_STRING);
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	Con_Printf ("Connecting to %s...\n", cls.servername);
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (data, "%c%c%c%cconnect %i %i %i \"%s\"\n",
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		255, 255, 255, 255,	PROTOCOL_VERSION, cls.qport, cls.challenge, cls.userinfo);
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	NET_SendPacket (strlen(data), data, adr);
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_CheckForResend
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamResend a connect message if the last one has timed out
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_CheckForResend (void)
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	netadr_t	adr;
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	data[2048];
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double t1, t2;
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (connect_time == -1)
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state != ca_disconnected)
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (connect_time && realtime - connect_time < 5.0)
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	t1 = Sys_DoubleTime ();
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!NET_StringToAdr (cls.servername, &adr))
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Bad server address\n");
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		connect_time = -1;
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!NET_IsClientLegal(&adr))
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Illegal server address\n");
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		connect_time = -1;
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (adr.port == 0)
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		adr.port = BigShort (27500);
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	t2 = Sys_DoubleTime ();
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	connect_time = realtime+t2-t1;	// for retransmit requests
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("Connecting to %s...\n", cls.servername);
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (data, "%c%c%c%cgetchallenge\n", 255, 255, 255, 255);
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	NET_SendPacket (strlen(data), data, adr);
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_BeginServerConnect(void)
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	connect_time = 0;
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_CheckForResend();
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Connect_f
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Connect_f (void)
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*server;
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() != 2)
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("usage: connect <server>\n");
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	server = Cmd_Argv (1);
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_Disconnect ();
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strncpy (cls.servername, server, sizeof(cls.servername)-1);
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_BeginServerConnect();
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Rcon_f
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream  Send the rest of the command line over as
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream  an unconnected command.
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Rcon_f (void)
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	message[1024];
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	netadr_t	to;
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!rcon_password.string)
3169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("You must set 'rcon_password' before\n"
3189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					"issuing an rcon command.\n");
3199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
3209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	message[0] = 255;
3239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	message[1] = 255;
3249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	message[2] = 255;
3259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	message[3] = 255;
3269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	message[4] = 0;
3279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcat (message, "rcon ");
3299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcat (message, rcon_password.string);
3319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcat (message, " ");
3329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=1 ; i<Cmd_Argc() ; i++)
3349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcat (message, Cmd_Argv(i));
3369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcat (message, " ");
3379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state >= ca_connected)
3409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		to = cls.netchan.remote_address;
3419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
3429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!strlen(rcon_address.string))
3449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("You must either be connected,\n"
3469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						"or set the 'rcon_address' cvar\n"
3479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						"to issue rcon commands\n");
3489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
3509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		NET_StringToAdr (rcon_address.string, &to);
3529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	NET_SendPacket (strlen(message)+1, message
3559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		, to);
3569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
3609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
3619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ClearState
3629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
3649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
3659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ClearState (void)
3669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
3689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_StopAllSounds (true);
3709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_DPrintf ("Clearing memory\n");
3729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	D_FlushCaches ();
3739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Mod_ClearAll ();
3749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (host_hunklevel)	// FIXME: check this...
3759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Hunk_FreeToLowMark (host_hunklevel);
3769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_ClearTEnts ();
3789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// wipe the entire cl structure
3809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memset (&cl, 0, sizeof(cl));
3819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SZ_Clear (&cls.netchan.message);
3839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// clear other arrays
3859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memset (cl_efrags, 0, sizeof(cl_efrags));
3869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memset (cl_dlights, 0, sizeof(cl_dlights));
3879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memset (cl_lightstyle, 0, sizeof(cl_lightstyle));
3889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// allocate the efrags and chain together into a free list
3919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.free_efrags = cl_efrags;
3939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<MAX_EFRAGS-1 ; i++)
3949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.free_efrags[i].entnext = &cl.free_efrags[i+1];
3959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.free_efrags[i].entnext = NULL;
3969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
3999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
4009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Disconnect
4019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSends a disconnect message to the server
4039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis is also called on Host_Error, so it shouldn't cause any errors
4049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
4059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
4069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Disconnect (void)
4079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char	final[10];
4099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	connect_time = -1;
4119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef _WIN32
4139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SetWindowText (mainwindow, "QuakeWorld: disconnected");
4149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
4159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// stop sounds (especially looping!)
4179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_StopAllSounds (true);
4189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// if running a local server, shut it down
4209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.demoplayback)
4219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_StopPlayback ();
4229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (cls.state != ca_disconnected)
4239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cls.demorecording)
4259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_Stop_f ();
4269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		final[0] = clc_stringcmd;
4289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (final+1, "drop");
429cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		Netchan_Transmit (&cls.netchan, 6, (byte*) final);
430cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		Netchan_Transmit (&cls.netchan, 6, (byte*) final);
431cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		Netchan_Transmit (&cls.netchan, 6, (byte*) final);
4329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cls.state = ca_disconnected;
4349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cls.demoplayback = cls.demorecording = cls.timedemo = false;
4369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cam_Reset();
4389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.download) {
4409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fclose(cls.download);
4419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cls.download = NULL;
4429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_StopUpload();
4459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Disconnect_f (void)
4499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_Disconnect ();
4519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
4549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
4559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_User_f
4569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamuser <name or userid>
4589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDump userdata / masterdata for a user
4609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
4619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
4629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_User_f (void)
4639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		uid;
4659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
4669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() != 2)
4689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Usage: user <username / userid>\n");
4709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
4719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	uid = atoi(Cmd_Argv(1));
4749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<MAX_CLIENTS ; i++)
4769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!cl.players[i].name[0])
4789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
4799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cl.players[i].userid == uid
4809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		|| !strcmp(cl.players[i].name, Cmd_Argv(1)) )
4819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Info_Print (cl.players[i].userinfo);
4839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
4849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
4859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("User not in server.\n");
4879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
4909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
4919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Users_f
4929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDump userids for all current players
4949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
4959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
4969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Users_f (void)
4979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
4999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		c;
5009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c = 0;
5029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("userid frags name\n");
5039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("------ ----- ----\n");
5049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<MAX_CLIENTS ; i++)
5059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cl.players[i].name[0])
5079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
5089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("%6i %4i %s\n", cl.players[i].userid, cl.players[i].frags, cl.players[i].name);
5099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			c++;
5109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("%i total users\n", c);
5149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Color_f (void)
5179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// just for quake compatability...
5199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		top, bottom;
5209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	num[16];
5219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() == 1)
5239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("\"color\" is \"%s %s\"\n",
5259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Info_ValueForKey (cls.userinfo, "topcolor"),
5269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Info_ValueForKey (cls.userinfo, "bottomcolor") );
5279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("color <0-13> [0-13]\n");
5289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
5299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() == 2)
5329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		top = bottom = atoi(Cmd_Argv(1));
5339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		top = atoi(Cmd_Argv(1));
5369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bottom = atoi(Cmd_Argv(2));
5379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	top &= 15;
5409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (top > 13)
5419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		top = 13;
5429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bottom &= 15;
5439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bottom > 13)
5449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bottom = 13;
5459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (num, "%i", top);
5479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_Set ("topcolor", num);
5489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (num, "%i", bottom);
5499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_Set ("bottomcolor", num);
5509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
5539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
5549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_FullServerinfo_f
5559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSent by server when serverinfo changes
5579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
5589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
5599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_FullServerinfo_f (void)
5609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char *p;
5629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float v;
5639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() != 2)
5659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("usage: fullserverinfo <complete info string>\n");
5679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
5689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (cl.serverinfo, Cmd_Argv(1));
5719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((p = Info_ValueForKey(cl.serverinfo, "*vesion")) && *p) {
5739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		v = Q_atof(p);
5749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (v) {
5759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!server_version)
5769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Con_Printf("Version %1.2f Server\n", v);
5779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			server_version = v;
5789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
5839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
5849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_FullInfo_f
5859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamAllow clients to change userinfo
5879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
5889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCasey was here :)
5899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
5909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_FullInfo_f (void)
5919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	key[512];
5939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	value[512];
5949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*o;
5959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*s;
5969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() != 2)
5989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("fullinfo <complete info string>\n");
6009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
6019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	s = Cmd_Argv(1);
6049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (*s == '\\')
6059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
6069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*s)
6079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = key;
6099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s && *s != '\\')
6109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
6119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
6129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!*s)
6149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("MISSING VALUE\n");
6169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
6179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = value;
6209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
6219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s && *s != '\\')
6229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
6239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
6249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*s)
6269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			s++;
6279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
628cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (!strcasecmp(key, pmodel_name) || !strcasecmp(key, emodel_name))
6299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
6309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Info_SetValueForKey (cls.userinfo, key, value, MAX_INFO_STRING);
6329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
6369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
6379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_SetInfo_f
6389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamAllow clients to change userinfo
6409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
6419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
6429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_SetInfo_f (void)
6439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() == 1)
6459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Info_Print (cls.userinfo);
6479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
6489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() != 3)
6509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("usage: setinfo [ <key> <value> ]\n");
6529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
6539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!stricmp(Cmd_Argv(1), pmodel_name) || !strcmp(Cmd_Argv(1), emodel_name))
6559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
6569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Info_SetValueForKey (cls.userinfo, Cmd_Argv(1), Cmd_Argv(2), MAX_INFO_STRING);
6589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state >= ca_connected)
6599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Cmd_ForwardToServer ();
6609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
6639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
6649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Packet_f
6659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreampacket <destination> <contents>
6679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamContents allows \n escape character
6699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
6709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
6719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Packet_f (void)
6729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	send[2048];
6749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i, l;
6759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*in, *out;
6769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	netadr_t	adr;
6779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() != 3)
6799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("packet <destination> <contents>\n");
6819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
6829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!NET_StringToAdr (Cmd_Argv(1), &adr))
6859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Bad address\n");
6879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
6889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	in = Cmd_Argv(2);
6919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	out = send+4;
6929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	send[0] = send[1] = send[2] = send[3] = 0xff;
6939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l = strlen (in);
6959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<l ; i++)
6969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (in[i] == '\\' && in[i+1] == 'n')
6989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*out++ = '\n';
7009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i++;
7019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
7039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*out++ = in[i];
7049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	*out = 0;
7069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	NET_SendPacket (out-send, send, adr);
7089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
7139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_NextDemo
7149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCalled to play the next demo in the demo loop
7169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
7179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_NextDemo (void)
7199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	str[1024];
7219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.demonum == -1)
7239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;		// don't play demos
7249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!cls.demos[cls.demonum][0] || cls.demonum == MAX_DEMOS)
7269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cls.demonum = 0;
7289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!cls.demos[cls.demonum][0])
7299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
7309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//			Con_Printf ("No demos listed with startdemos\n");
7319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cls.demonum = -1;
7329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
7339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (str,"playdemo %s\n", cls.demos[cls.demonum]);
7379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cbuf_InsertText (str);
7389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.demonum++;
7399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
7449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Changing_f
7459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamJust sent as a hint to the client that they should
7479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdrop to full console
7489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
7499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Changing_f (void)
7519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.download)  // don't change when downloading
7539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_StopAllSounds (true);
7569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.intermission = 0;
7579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.state = ca_connected;	// not active anymore, but not disconnected
7589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("\nChanging map...\n");
7599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
7649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Reconnect_f
7659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThe server is changing levels
7679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
7689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Reconnect_f (void)
7709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.download)  // don't change when downloading
7729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_StopAllSounds (true);
7759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state == ca_connected) {
7779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("reconnecting...\n");
7789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteChar (&cls.netchan.message, clc_stringcmd);
7799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteString (&cls.netchan.message, "new");
7809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!*cls.servername) {
7849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("No server to reconnect to...\n");
7859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
7869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_Disconnect();
7899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_BeginServerConnect();
7909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
7949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ConnectionlessPacket
7959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamResponses to broadcasts, etc
7979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
7989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ConnectionlessPacket (void)
8009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*s;
8029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		c;
8039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    MSG_BeginReading ();
8059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    MSG_ReadLong ();        // skip the -1
8069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c = MSG_ReadByte ();
8089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!cls.demoplayback)
8099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("%s: ", NET_AdrToString (net_from));
8109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	Con_DPrintf ("%s", net_message.data + 5);
8119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c == S2C_CONNECTION)
8129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("connection\n");
8149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cls.state >= ca_connected)
8159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
8169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!cls.demoplayback)
8179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Con_Printf ("Dup connect received.  Ignored.\n");
8189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
8199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
8209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Netchan_Setup (&cls.netchan, net_from, cls.qport);
8219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteChar (&cls.netchan.message, clc_stringcmd);
8229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteString (&cls.netchan.message, "new");
8239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cls.state = ca_connected;
8249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Connected.\n");
8259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		allowremotecmd = false; // localid required now for remote cmds
8269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
8279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// remote command from gui front end
8299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c == A2C_CLIENT_COMMAND)
8309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		char	cmdtext[2048];
8329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("client command\n");
8349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if ((*(unsigned *)net_from.ip != *(unsigned *)net_local_adr.ip
8369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			&& *(unsigned *)net_from.ip != htonl(INADDR_LOOPBACK)) )
8379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
8389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("Command packet from remote host.  Ignored.\n");
8399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
8409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
8419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef _WIN32
8429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ShowWindow (mainwindow, SW_RESTORE);
8439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SetForegroundWindow (mainwindow);
8449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
8459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s = MSG_ReadString ();
8469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strncpy(cmdtext, s, sizeof(cmdtext) - 1);
8489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cmdtext[sizeof(cmdtext) - 1] = 0;
8499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s = MSG_ReadString ();
8519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s && isspace(*s))
8539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			s++;
8549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s && isspace(s[strlen(s) - 1]))
8559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			s[strlen(s) - 1] = 0;
8569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!allowremotecmd && (!*localid.string || strcmp(localid.string, s))) {
8589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!*localid.string) {
8599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Con_Printf("===========================\n");
8609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Con_Printf("Command packet received from local host, but no "
8619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					"localid has been set.  You may need to upgrade your server "
8629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					"browser.\n");
8639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Con_Printf("===========================\n");
8649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return;
8659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
8669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf("===========================\n");
8679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf("Invalid localid on command packet received from local host. "
8689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				"\n|%s| != |%s|\n"
8699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				"You may need to reload your server browser and QuakeWorld.\n",
8709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				s, localid.string);
8719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf("===========================\n");
8729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cvar_Set("localid", "");
8739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
8749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
8759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Cbuf_AddText (cmdtext);
8779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		allowremotecmd = false;
8789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
8799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// print command from somewhere
8819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c == A2C_PRINT)
8829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("print\n");
8849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s = MSG_ReadString ();
8869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Print (s);
8879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
8889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// ping from somewhere
8919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c == A2A_PING)
8929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		char	data[6];
8949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("ping\n");
8969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data[0] = 0xff;
8989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data[1] = 0xff;
8999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data[2] = 0xff;
9009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data[3] = 0xff;
9019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data[4] = A2A_ACK;
9029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data[5] = 0;
9039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		NET_SendPacket (6, &data, net_from);
9059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
9069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c == S2C_CHALLENGE) {
9099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("challenge\n");
9109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s = MSG_ReadString ();
9129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cls.challenge = atoi(s);
9139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_SendConnectPacket ();
9149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
9159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#if 0
9189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c == svc_disconnect) {
9199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("disconnect\n");
9209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Host_EndGame ("Server disconnected");
9229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
9239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
9259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("unknown:  %c\n", c);
9279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
9329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ReadPackets
9339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
9349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ReadPackets (void)
9369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	while (NET_GetPacket ())
9389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (CL_GetMessage())
9399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		//
9419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// remote command packet
9429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		//
9439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*(int *)net_message.data == -1)
9449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
9459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ConnectionlessPacket ();
9469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
9479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (net_message.cursize < 8)
9509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
9519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("%s: Runt packet\n",NET_AdrToString(net_from));
9529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
9539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		//
9569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// packet from server
9579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		//
9589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!cls.demoplayback &&
9599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			!NET_CompareAdr (net_from, cls.netchan.remote_address))
9609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
9619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_DPrintf ("%s:sequenced packet without connection\n"
9629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				,NET_AdrToString(net_from));
9639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
9649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!Netchan_Process(&cls.netchan))
9669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;		// wasn't accepted for some reason
9679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_ParseServerMessage ();
9689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		if (cls.demoplayback && cls.state >= ca_active && !CL_DemoBehind())
9709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//			return;
9719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
9749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// check timeout
9759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
9769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state >= ca_connected
9779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	 && realtime - cls.netchan.last_received > cl_timeout.value)
9789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("\nServer connection timed out.\n");
9809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_Disconnect ();
9819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
9829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//=============================================================================
9879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
9909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Download_f
9919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
9929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Download_f (void)
9949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char *p, *q;
9969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state == ca_disconnected)
9989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Must be connected.\n");
10009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
10019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (Cmd_Argc() != 2)
10049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Usage: download <datafile>\n");
10069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
10079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (cls.downloadname, "%s/%s", com_gamedir, Cmd_Argv(1));
10109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	p = cls.downloadname;
10129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (;;) {
10139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if ((q = strchr(p, '/')) != NULL) {
10149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*q = 0;
10159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_mkdir(cls.downloadname);
10169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*q = '/';
10179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			p = q + 1;
10189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		} else
10199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
10209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy(cls.downloadtempname, cls.downloadname);
10239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.download = fopen (cls.downloadname, "wb");
10249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.downloadtype = dl_single;
10259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
10279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SZ_Print (&cls.netchan.message, va("download %s\n",Cmd_Argv(1)));
10289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef _WINDOWS
10319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <windows.h>
10329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Minimize_f
10359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Windows_f (void) {
10389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	if (modestate == MS_WINDOWED)
10399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		ShowWindow(mainwindow, SW_MINIMIZE);
10409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	else
10419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SendMessage(mainwindow, WM_SYSKEYUP, VK_TAB, 1 | (0x0F << 16) | (1<<29));
10429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
10449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_Init
10489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
10499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_Init (void)
10519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	extern	cvar_t		baseskin;
10539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	extern	cvar_t		noskins;
10549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char st[80];
10559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.state = ca_disconnected;
10579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Info_SetValueForKey (cls.userinfo, "name", "unnamed", MAX_INFO_STRING);
10599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Info_SetValueForKey (cls.userinfo, "topcolor", "0", MAX_INFO_STRING);
10609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Info_SetValueForKey (cls.userinfo, "bottomcolor", "0", MAX_INFO_STRING);
10619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Info_SetValueForKey (cls.userinfo, "rate", "2500", MAX_INFO_STRING);
10629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Info_SetValueForKey (cls.userinfo, "msg", "1", MAX_INFO_STRING);
10639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (st, "%4.2f-%04d", VERSION, build_number());
1064cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Info_SetValueForStarKey (cls.userinfo, "*ver", st, MAX_INFO_STRING);
10659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_InitInput ();
10679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_InitTEnts ();
10689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_InitPrediction ();
10699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_InitCam ();
10709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Pmove_Init ();
10719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
10739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// register our commands
10749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
10759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&show_fps);
10769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&host_speeds);
10779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&developer);
10789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_warncmd);
10809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_upspeed);
10819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_forwardspeed);
10829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_backspeed);
10839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_sidespeed);
10849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_movespeedkey);
10859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_yawspeed);
10869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_pitchspeed);
10879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_anglespeedkey);
10889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_shownet);
10899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_sbar);
10909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_hudswap);
10919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_maxfps);
10929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_timeout);
10939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&lookspring);
10949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&lookstrafe);
10959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&sensitivity);
10969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&m_pitch);
10989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&m_yaw);
10999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&m_forward);
11009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&m_side);
11019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&rcon_password);
11039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&rcon_address);
11049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&entlatency);
11069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_predict_players2);
11079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_predict_players);
11089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&cl_solid_players);
11099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&localid);
11119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&baseskin);
11139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&noskins);
11149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
11169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// info mirrors
11179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
11189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&name);
11199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&password);
11209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&spectator);
11219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&skin);
11229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&team);
11239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&topcolor);
11249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&bottomcolor);
11259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&rate);
11269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&msg);
11279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&noaim);
11289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("version", CL_Version_f);
11319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("changing", CL_Changing_f);
11339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("disconnect", CL_Disconnect_f);
11349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("record", CL_Record_f);
11359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("rerecord", CL_ReRecord_f);
11369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("stop", CL_Stop_f);
11379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("playdemo", CL_PlayDemo_f);
11389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("timedemo", CL_TimeDemo_f);
11399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("skins", Skin_Skins_f);
11419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("allskins", Skin_AllSkins_f);
11429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("quit", CL_Quit_f);
11449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("connect", CL_Connect_f);
11469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("reconnect", CL_Reconnect_f);
11479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("rcon", CL_Rcon_f);
11499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("packet", CL_Packet_f);
11509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("user", CL_User_f);
11519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("users", CL_Users_f);
11529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("setinfo", CL_SetInfo_f);
11549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("fullinfo", CL_FullInfo_f);
11559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("fullserverinfo", CL_FullServerinfo_f);
11569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("color", CL_Color_f);
11589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("download", CL_Download_f);
11599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("nextul", CL_NextUpload);
11619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("stopul", CL_StopUpload);
11629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
11649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// forward to server commands
11659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
11669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("kill", NULL);
11679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("pause", NULL);
11689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("say", NULL);
11699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("say_team", NULL);
11709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("serverinfo", NULL);
11719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
11739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//  Windows commands
11749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
11759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef _WINDOWS
11769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("windows", CL_Windows_f);
11779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
11789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
11829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHost_EndGame
11849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCall this to drop to a console without exiting the qwcl
11869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
11889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Host_EndGame (char *message, ...)
11899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_list		argptr;
11919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		string[1024];
11929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_start (argptr,message);
11949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vsprintf (string,message,argptr);
11959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_end (argptr);
11969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("\n===========================\n");
11979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("Host_EndGame: %s\n",string);
11989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("===========================\n\n");
11999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_Disconnect ();
12019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	longjmp (host_abort, 1);
12039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
12049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
12069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
12079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHost_Error
12089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis shuts down the client and exits qwcl
12109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
12119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
12129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Host_Error (char *error, ...)
12139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_list		argptr;
12159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		string[1024];
12169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static	qboolean inerror = false;
12179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (inerror)
12199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Host_Error: recursively entered");
12209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	inerror = true;
12219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_start (argptr,error);
12239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vsprintf (string,error,argptr);
12249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_end (argptr);
12259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("Host_Error: %s\n",string);
12269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_Disconnect ();
12289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.demonum = -1;
12299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	inerror = false;
12319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// FIXME
12339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sys_Error ("Host_Error: %s\n",string);
12349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
12359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
12389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
12399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHost_WriteConfiguration
12409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamWrites key bindings and archived cvars to config.cfg
12429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
12439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
12449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Host_WriteConfiguration (void)
12459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FILE	*f;
12479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (host_initialized)
12499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		f = fopen (va("%s/config.cfg",com_gamedir), "w");
12519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!f)
12529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
12539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("Couldn't write config.cfg.\n");
12549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
12559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
12569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Key_WriteBindings (f);
12589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Cvar_WriteVariables (f);
12599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fclose (f);
12619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
12639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//============================================================================
12669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#if 0
12689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
12699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
12709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHost_SimulationTime
12719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis determines if enough time has passed to run a simulation frame
12739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
12749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
12759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean Host_SimulationTime(float time)
12769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float fps;
12789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (oldrealtime > realtime)
12809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		oldrealtime = 0;
12819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl_maxfps.value)
12839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fps = max(30.0, min(cl_maxfps.value, 72.0));
12849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
12859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fps = max(30.0, min(rate.value/80.0, 72.0));
12869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!cls.timedemo && (realtime + time) - oldrealtime < 1.0/fps)
12889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return false;			// framerate is too high
12899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return true;
12909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
12919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
12929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
12959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
12969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHost_Frame
12979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamRuns all active servers
12999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
13009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
13019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint		nopacketcount;
13029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Host_Frame (float time)
13039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static double		time1 = 0;
13059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static double		time2 = 0;
13069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static double		time3 = 0;
13079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			pass1, pass2, pass3;
13089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float fps;
13099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (setjmp (host_abort) )
13109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;			// something bad happened, or the server disconnected
13119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// decide the simulation time
13139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	realtime += time;
13149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (oldrealtime > realtime)
13159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		oldrealtime = 0;
13169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl_maxfps.value)
13189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fps = max(30.0, min(cl_maxfps.value, 72.0));
13199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
13209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fps = max(30.0, min(rate.value/80.0, 72.0));
13219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!cls.timedemo && realtime - oldrealtime < 1.0/fps)
13239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;			// framerate is too high
13249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	host_frametime = realtime - oldrealtime;
13269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	oldrealtime = realtime;
13279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (host_frametime > 0.2)
13289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		host_frametime = 0.2;
13299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// get new key events
13319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sys_SendKeyEvents ();
13329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// allow mice or other external controllers to add commands
13349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	IN_Commands ();
13359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// process console commands
13379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cbuf_Execute ();
13389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// fetch results from server
13409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_ReadPackets ();
13419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// send intentions now
13439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// resend a connection request if necessary
13449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state == ca_disconnected) {
13459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_CheckForResend ();
13469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} else
13479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_SendCmd ();
13489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Set up prediction for other players
13509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_SetUpPlayerPrediction(false);
13519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// do client side motion prediction
13539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_PredictMove ();
13549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Set up prediction for other players
13569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_SetUpPlayerPrediction(true);
13579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// build a refresh entity list
13599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_EmitEntities ();
13609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// update video
13629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (host_speeds.value)
13639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		time1 = Sys_DoubleTime ();
13649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SCR_UpdateScreen ();
13669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (host_speeds.value)
13689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		time2 = Sys_DoubleTime ();
13699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// update audio
13719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.state == ca_active)
13729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
13739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_Update (r_origin, vpn, vright, vup);
13749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_DecayLights ();
13759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
13769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
13779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_Update (vec3_origin, vec3_origin, vec3_origin, vec3_origin);
13789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CDAudio_Update();
13809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (host_speeds.value)
13829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
13839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pass1 = (time1 - time3)*1000;
13849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		time3 = Sys_DoubleTime ();
13859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pass2 = (time2 - time1)*1000;
13869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pass3 = (time3 - time2)*1000;
13879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("%3i tot %3i server %3i gfx %3i snd\n",
13889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					pass1+pass2+pass3, pass1, pass2, pass3);
13899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
13909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	host_framecount++;
13929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fps_count++;
13939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
13949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic void simple_crypt(char *buf, int len)
13969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (len--)
13989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*buf++ ^= 0xff;
13999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
14009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Host_FixupModelNames(void)
14029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
14039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	simple_crypt(emodel_name, sizeof(emodel_name) - 1);
14049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	simple_crypt(pmodel_name, sizeof(pmodel_name) - 1);
14059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	simple_crypt(prespawn_name,  sizeof(prespawn_name)  - 1);
14069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	simple_crypt(modellist_name, sizeof(modellist_name) - 1);
14079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	simple_crypt(soundlist_name, sizeof(soundlist_name) - 1);
14089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
14099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//============================================================================
14119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
14139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
14149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHost_Init
14159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
14169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
14179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Host_Init (quakeparms_t *parms)
14189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
14199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_InitArgv (parms->argc, parms->argv);
14209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_AddParm ("-game");
14219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_AddParm ("qw");
14229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sys_mkdir("qw");
14249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (COM_CheckParm ("-minmemory"))
14269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		parms->memsize = MINIMUM_MEMORY;
14279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	host_parms = *parms;
14299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (parms->memsize < MINIMUM_MEMORY)
14319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Only %4.1f megs of memory reported, can't execute game", parms->memsize / (float)0x100000);
14329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Memory_Init (parms->membase, parms->memsize);
14349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cbuf_Init ();
14359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_Init ();
14369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	V_Init ();
14379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_Init ();
14399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Host_FixupModelNames();
14419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	NET_Init (PORT_CLIENT);
14439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Netchan_Init ();
14449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	W_LoadWadFile ("gfx.wad");
14469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Key_Init ();
14479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Init ();
14489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	M_Init ();
14499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Mod_Init ();
14509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	Con_Printf ("Exe: "__TIME__" "__DATE__"\n");
14529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("%4.1f megs RAM used.\n",parms->memsize/ (1024*1024.0));
14539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_InitTextures ();
14559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	host_basepal = (byte *)COM_LoadHunkFile ("gfx/palette.lmp");
14579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!host_basepal)
14589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Couldn't load gfx/palette.lmp");
14599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	host_colormap = (byte *)COM_LoadHunkFile ("gfx/colormap.lmp");
14609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!host_colormap)
14619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Couldn't load gfx/colormap.lmp");
14629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef __linux__
14639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	IN_Init ();
14649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CDAudio_Init ();
14659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_Init (host_basepal);
14669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Draw_Init ();
14679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SCR_Init ();
14689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_Init ();
14699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	S_Init ();		// S_Init is now done as part of VID. Sigh.
14719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.state = ca_disconnected;
14739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sbar_Init ();
14749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_Init ();
14759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#else
14769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_Init (host_basepal);
14779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Draw_Init ();
14789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SCR_Init ();
14799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_Init ();
14809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	S_Init ();		// S_Init is now done as part of VID. Sigh.
14819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef GLQUAKE
14829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_Init();
14839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
14849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cls.state = ca_disconnected;
14869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CDAudio_Init ();
14879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sbar_Init ();
14889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_Init ();
14899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	IN_Init ();
14909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
14919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cbuf_InsertText ("exec quake.rc\n");
14939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cbuf_AddText ("echo Type connect <internet address> or use GameSpy to connect to a game.\n");
14949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cbuf_AddText ("cl_warncmd 1\n");
14959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Hunk_AllocName (0, "-HOST_HUNKLEVEL-");
14979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	host_hunklevel = Hunk_LowMark ();
14989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	host_initialized = true;
15009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("\nClient Version %4.2f (Build %04d)\n\n", VERSION, build_number());
15029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("������� QuakeWorld Initialized �������\n");
15049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
15059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
15089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
15099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHost_Shutdown
15109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFIXME: this is a callback from Sys_Quit and Sys_Error.  It would be better
15129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamto run quit through here before the final handoff to the sys code.
15139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
15149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
15159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Host_Shutdown(void)
15169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
15179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static qboolean isdown = false;
15189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (isdown)
15209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
15219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		printf ("recursive shutdown\n");
15229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
15239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
15249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	isdown = true;
15259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Host_WriteConfiguration ();
15279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CDAudio_Shutdown ();
15299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	NET_Shutdown ();
15309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_Shutdown();
15319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	IN_Shutdown ();
15329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (host_basepal)
15339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VID_Shutdown();
15349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
15359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1536