1587 lines · 30.8 KB · C
RawDownload
#include <stdlib.h>#include "quakedef.h" extern cvar_t pausable; int current_skill; void Mod_Print (void); /*==================Host_Quit_f==================*/ extern void M_Menu_Quit_f (void); void Host_Quit_f (void){	if (key_dest != key_console && cls.state != ca_dedicated)	{		M_Menu_Quit_f ();		return;	}	CL_Disconnect ();	Host_ShutdownServer(false); 	Sys_Quit ();} /*==================Host_Status_f==================*/void Host_Status_f (void){	client_t *client;	int seconds;	int minutes;	int hours = 0;	int j;	void (*print) (char *fmt, ...); 	if (cmd_source == src_command)	{		if (!sv.active)		{			Cmd_ForwardToServer ();			return;		}		print = Con_Printf;	}	else		print = SV_ClientPrintf; 	print ("host: %s\n", Cvar_VariableString ("hostname"));	print ("version: %4.2f\n", VERSION);	if (tcpipAvailable)		print ("tcp/ip: %s\n", my_tcpip_address);	if (ipxAvailable)		print ("ipx: %s\n", my_ipx_address);	print ("map: %s\n", sv.name);	print ("players: %i active (%i max)\n\n", net_activeconnections, svs.maxclients);	for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)	{		if (!client->active)			continue;		seconds = (int)(net_time - client->netconnection->connecttime);		minutes = seconds / 60;		if (minutes)		{			seconds -= (minutes * 60);			hours = minutes / 60;			if (hours)				minutes -= (hours * 60);		}		else			hours = 0;		print ("#%-2u %-16.16s %3i %2i:%02i:%02i\n", j+1, client->name, (int)client->edict->v.frags, hours, minutes, seconds);		print (" %s\n", client->netconnection->address);	}} /*==================Host_God_f Sets client to godmode==================*/void Host_God_f (void){	if (cmd_source == src_command)	{		Cmd_ForwardToServer ();		return;	} 	if (pr_global_struct->deathmatch && !host_client->privileged)		return; 	sv_player->v.flags = (int)sv_player->v.flags ^ FL_GODMODE;	if (!((int)sv_player->v.flags & FL_GODMODE) )		SV_ClientPrintf ("godmode OFF\n");	else		SV_ClientPrintf ("godmode ON\n");} void Host_Notarget_f (void){	if (cmd_source == src_command)	{		Cmd_ForwardToServer ();		return;	} 	if (pr_global_struct->deathmatch && !host_client->privileged)		return; 	sv_player->v.flags = (int)sv_player->v.flags ^ FL_NOTARGET;	if (!((int)sv_player->v.flags & FL_NOTARGET) )		SV_ClientPrintf ("notarget OFF\n");	else		SV_ClientPrintf ("notarget ON\n");} bool noclip_anglehack; void Host_Noclip_f (void){	if (cmd_source == src_command)	{		Cmd_ForwardToServer ();		return;	} 	if (pr_global_struct->deathmatch && !host_client->privileged)		return; 	if (sv_player->v.movetype != MOVETYPE_NOCLIP)	{		noclip_anglehack = true;		sv_player->v.movetype = MOVETYPE_NOCLIP;		SV_ClientPrintf ("noclip ON\n");	}	else	{		noclip_anglehack = false;		sv_player->v.movetype = MOVETYPE_WALK;		SV_ClientPrintf ("noclip OFF\n");	}} /*==================Host_Fly_f Sets client to flymode==================*/void Host_Fly_f (void){	if (cmd_source == src_command)	{		Cmd_ForwardToServer ();		return;	} 	if (pr_global_struct->deathmatch && !host_client->privileged)		return; 	if (sv_player->v.movetype != MOVETYPE_FLY)	{		sv_player->v.movetype = MOVETYPE_FLY;		SV_ClientPrintf ("flymode ON\n");	}	else	{		sv_player->v.movetype = MOVETYPE_WALK;		SV_ClientPrintf ("flymode OFF\n");	}} /*==================Host_Ping_f ==================*/void Host_Ping_f (void){	int i, j;	float total;	client_t *client; 	if (cmd_source == src_command)	{		Cmd_ForwardToServer ();		return;	} 	SV_ClientPrintf ("Client ping times:\n");	for (i=0, client = svs.clients ; i<svs.maxclients ; i++, client++)	{		if (!client->active)			continue;		total = 0;		for (j=0 ; j<NUM_PING_TIMES ; j++)			total+=client->ping_times[j];		total /= NUM_PING_TIMES;		SV_ClientPrintf ("%4i %s\n", (int)(total*1000), client->name);	}} /*=============================================================================== SERVER TRANSITIONS ===============================================================================*/ /*======================Host_Map_f handle amap <servername>command from the console. Active clients are kicked off.======================*/void Host_Map_f (void){	int i;	char name[MAX_QPATH]; 	if (cmd_source != src_command)		return; 	cls.demonum = -1; // stop demo loop in case this fails 	CL_Disconnect ();	Host_ShutdownServer(false); 	key_dest = key_game; // remove console or menu	SCR_BeginLoadingPlaque (); 	cls.mapstring[0] = 0;	for (i=0 ; i<Cmd_Argc() ; i++)	{		strcat (cls.mapstring, Cmd_Argv(i));		strcat (cls.mapstring, " ");	}	strcat (cls.mapstring, "\n"); 	svs.serverflags = 0; // haven't completed an episode yet	strcpy (name, Cmd_Argv(1));	SV_SpawnServer (name); 	if (!sv.active)		return; 	if (cls.state != ca_dedicated)	{		strcpy (cls.spawnparms, ""); 		for (i=2 ; i<Cmd_Argc() ; i++)		{			strcat (cls.spawnparms, Cmd_Argv(i));			strcat (cls.spawnparms, " ");		} 		Cmd_ExecuteString ("connect local", src_command);	}} /*==================Host_Changelevel_f Goes to a new map, taking all clients along==================*/void Host_Changelevel_f (void){	char level[MAX_QPATH]; 	if (Cmd_Argc() != 2)	{		Con_Printf ("changelevel <levelname> : continue game on a new level\n");		return;	}	if (!sv.active || cls.demoplayback)	{		Con_Printf ("Only the server may changelevel\n");		return;	}	SV_SaveSpawnparms ();	strcpy (level, Cmd_Argv(1));	SV_SpawnServer (level);} /*==================Host_Restart_f Restarts the current server for a dead player==================*/void Host_Restart_f (void){	char mapname[MAX_QPATH]; 	if (cls.demoplayback || !sv.active)		return; 	if (cmd_source != src_command)		return;	strcpy (mapname, sv.name); // must copy out, because it gets cleared								// in sv_spawnserver	SV_SpawnServer (mapname);} /*==================Host_Reconnect_f This command causes the client to wait for the signon messages again.This is sent just before a server changes levels==================*/void Host_Reconnect_f (void){	SCR_BeginLoadingPlaque ();	cls.signon = 0; // need new connection messages} /*=====================Host_Connect_f User command to connect to server=====================*/void Host_Connect_f (void){	char name[MAX_QPATH]; 	cls.demonum = -1; // stop demo loop in case this fails	if (cls.demoplayback)	{		CL_StopPlayback ();		CL_Disconnect ();	}	strcpy (name, Cmd_Argv(1));	CL_EstablishConnection (name);	Host_Reconnect_f ();} /*=============================================================================== LOAD / SAVE GAME ===============================================================================*/ #define SAVEGAME_VERSION 5 /*===============Host_SavegameComment Writes a SAVEGAME_COMMENT_LENGTH character comment describing the current===============*/void Host_SavegameComment (char *text){	int i;	char kills[20]; 	for (i=0 ; i<SAVEGAME_COMMENT_LENGTH ; i++)		text[i] = ' ';	memmove (text, cl.levelname, strlen(cl.levelname));	sprintf (kills,"kills:%3i/%3i", cl.stats[STAT_MONSTERS], cl.stats[STAT_TOTALMONSTERS]);	memmove (text+22, kills, strlen(kills));// convert space to _ to make stdio happy	for (i=0 ; i<SAVEGAME_COMMENT_LENGTH ; i++)		if (text[i] == ' ')			text[i] = '_';	text[SAVEGAME_COMMENT_LENGTH] = '\0';} /*===============Host_Savegame_f===============*/void Host_Savegame_f (void){	char name[256];	FILE *f;	int i;	char comment[SAVEGAME_COMMENT_LENGTH+1]; 	if (cmd_source != src_command)		return; 	if (!sv.active)	{		Con_Printf ("Not playing a local game.\n");		return;	} 	if (cl.intermission)	{		Con_Printf ("Can't save in intermission.\n");		return;	} 	if (svs.maxclients != 1)	{		Con_Printf ("Can't save multiplayer games.\n");		return;	} 	if (Cmd_Argc() != 2)	{		Con_Printf ("save <savename> : save a game\n");		return;	} 	if (strstr(Cmd_Argv(1), ".."))	{		Con_Printf ("Relative pathnames are not allowed.\n");		return;	} 	for (i=0 ; i<svs.maxclients ; i++)	{		if (svs.clients[i].active && (svs.clients[i].edict->v.health <= 0) )		{			Con_Printf ("Can't savegame with a dead player\n");			return;		}	} 	sprintf (name, "%s/%s", com_gamedir, Cmd_Argv(1));	COM_DefaultExtension (name, ".sav"); 	Con_Printf ("Saving game to %s...\n", name);	f = fopen (name, "w");	if (!f)	{		Con_Printf ("ERROR: couldn't open.\n");		return;	} 	fprintf (f, "%i\n", SAVEGAME_VERSION);	Host_SavegameComment (comment);	fprintf (f, "%s\n", comment);	for (i=0 ; i<NUM_SPAWN_PARMS ; i++)		fprintf (f, "%f\n", svs.clients->spawn_parms[i]);	fprintf (f, "%d\n", current_skill);	fprintf (f, "%s\n", sv.name);	fprintf (f, "%f\n",sv.time); // write the light styles 	for (i=0 ; i<MAX_LIGHTSTYLES ; i++)	{		if (sv.lightstyles[i])			fprintf (f, "%s\n", sv.lightstyles[i]);		else			fprintf (f,"m\n");	} 	ED_WriteGlobals (f);	for (i=0 ; i<sv.num_edicts ; i++)	{		ED_Write (f, EDICT_NUM(i));		fflush (f);	}	fclose (f);	Con_Printf ("done.\n");} /*===============Host_Loadgame_f===============*/void Host_Loadgame_f (void){	char name[MAX_OSPATH];	FILE *f;	char mapname[MAX_QPATH];	float time, tfloat;	char str[32768], *start;

Lines 1–500 of 1587.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t