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