1171 lines · 24.5 KB · C
RawDownload
#include "quakedef.h" int current_skill;bool noclip_anglehack; extern void M_Menu_Quit_f(cmd_t *c); voidHost_Quit_f(cmd_t *c){	USED(c);	if(key_dest != key_console && cls.state != ca_dedicated) {		M_Menu_Quit_f(c);		return;	}	CL_Disconnect();	Host_ShutdownServer(false); 	game_shutdown();} static voidHost_Status_f(cmd_t *c){	client_t *client;	int seconds, minutes, hours, j;	void (*print)(const char *fmt, ...) format_printf(1, 2); 	USED(c);	if(cmd_source == src_command) {		if(!sv.active) {			Cmd_ForwardToServer(nil);			return;		}		print = Con_Printf;	} else		print = SV_ClientPrintf; 	print("host:	%s\n", Cvar_VariableString("hostname"));	print("version: %4.2f\n", VERSION);	print("map:	 %s\n", sv.name);	print("players: %d active (%d 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(			"#%-2ud %-16.16s  %3d  %2d:%02d:%02d\n",			j + 1,			client->name,			(int)client->edict->v.frags,			hours,			minutes,			seconds		);		print("   %s\n", client->netconnection->address);	}} static voidHost_God_f(cmd_t *c){	USED(c);	if(cmd_source == src_command) {		Cmd_ForwardToServer(nil);		return;	} 	if(sv.pr->global_struct->deathmatch)		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");} static voidHost_Notarget_f(cmd_t *c){	USED(c);	if(cmd_source == src_command) {		Cmd_ForwardToServer(nil);		return;	} 	if(sv.pr->global_struct->deathmatch)		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");} static voidHost_Noclip_f(cmd_t *c){	USED(c);	if(cmd_source == src_command) {		Cmd_ForwardToServer(nil);		return;	} 	if(sv.pr->global_struct->deathmatch)		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");	}} static voidHost_Fly_f(cmd_t *c){	USED(c);	if(cmd_source == src_command) {		Cmd_ForwardToServer(nil);		return;	} 	if(sv.pr->global_struct->deathmatch)		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");	}} static voidHost_Ping_f(cmd_t *c){	int i, j;	float total;	client_t *client; 	USED(c);	if(cmd_source == src_command) {		Cmd_ForwardToServer(nil);		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("%4d %s\n", (int)(total * 1000), client->name);	}} /* handle a "map <servername>" command from the console.  Active clients are kicked off. */static voidHost_Map_f(cmd_t *c){	int i;	char name[Npath]; 	if(Cmd_Argc() < 2) {		if(cls.state != ca_disconnected)			Con_Printf("%s\n", cls.mapstring);		return;	}	USED(c);	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);	}} /* Goes to a new map, taking all clients along */static voidHost_Changelevel_f(cmd_t *c){	char level[Npath]; 	USED(c);	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);} /* Restarts the current server for a dead player */static voidHost_Restart_f(cmd_t *c){	char mapname[Npath]; 	USED(c);	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);} /* wait for signon messages; sent before server level change */static voidreconnect(cmd_t *c){	USED(c);	SCR_BeginLoadingPlaque();	cls.signon = 0;} /* User command to connect to server */static voidHost_Connect_f(cmd_t *c){	char name[Npath]; 	USED(c);	cls.demonum = -1; // stop demo loop in case this fails	if(cls.demoplayback) {		abortdemo();		CL_Disconnect();	}	strcpy(name, Cmd_Argv(1));	CL_EstablishConnection(name);	reconnect(c);} static voidHost_Name_f(cmd_t *c){	char newName[16]; 	USED(c);	if(Cmd_Argc() == 1) {		Con_Printf("\"name\" is \"%s\"\n", cl_name.string);		return;	}	if(Cmd_Argc() == 2)		strncpy(newName, Cmd_Argv(1), sizeof(newName));	else		strncpy(newName, Cmd_Args(), sizeof(newName));	newName[sizeof(newName) - 1] = 0; 	if(cmd_source == src_command) {		if(strcmp(cl_name.string, newName) == 0)			return;		setcvar("_cl_name", newName);		if(cls.state == ca_connected)			Cmd_ForwardToServer(nil);		return;	} 	if(host_client->name[0] && strcmp(host_client->name, "unconnected") != 0) {		if(strcmp(host_client->name, newName) != 0)			Con_Printf("%s renamed to %s\n", host_client->name, newName);	}	strcpy(host_client->name, newName);	host_client->edict->v.netname = PR_SetStr(sv.pr, host_client->name); 	// send notification to all clients 	MSG_WriteByte(&sv.reliable_datagram, svc_updatename);	MSG_WriteByte(&sv.reliable_datagram, host_client - svs.clients);	MSG_WriteString(&sv.reliable_datagram, host_client->name);} static voidHost_Version_f(cmd_t *c){	USED(c);	Con_Printf("Version %4.2f\n", VERSION);	Con_Printf("Exe: <REDACTED>\n");} static voidHost_Say(bool teamonly){	bool fromServer = false, quoted = false;	client_t *client, *save;	const char *p;	char *text;	int j, n; 	if(cmd_source == src_command) {		if(cls.state == ca_dedicated) {			fromServer = true;			teamonly = false;		} else {			Cmd_ForwardToServer(nil);			return;		}	} 	if(Cmd_Argc() < 2)		return; 	save = host_client; 	p = Cmd_Args();	quoted = *p == '"' && p[strlen(p) - 1] == '"';	if(quoted)		p++;	// turn on color set 1	if(fromServer)		text = va("%c<%s> %s", 1, hostname.string, p);	else		text = va("%c%s: %s", 1, save->name, p);	n = strlen(text);	if(quoted)		n--;	text[n++] = '\n';	text[n++] = 0; 	for(j = 0, client = svs.clients; j < svs.maxclients; j++, client++) {		if(!client || !client->active || !client->spawned)			continue;		if(teamplay.value && teamonly && client->edict->v.team != save->edict->v.team)			continue;		host_client = client;		SV_ClientPrintf("%s", text);	}	host_client = save;	Con_DPrintf("%s", text + 1);} static voidHost_Say_f(cmd_t *c){	USED(c);	Host_Say(false);} static voidHost_Say_Team_f(cmd_t *c){	USED(c);	Host_Say(true);} static voidHost_Tell_f(cmd_t *c){	client_t *client, *save;	bool quoted = false;	const char *p;	char *text;	int j, n; 	USED(c);	if(cmd_source == src_command) {		Cmd_ForwardToServer(nil);		return;	} 	if(Cmd_Argc() < 3)		return; 	p = Cmd_Args();	quoted = *p == '"' && p[strlen(p) - 1] == '"';	if(quoted)		p++;	text = va("%s: %s", host_client->name, p);	n = strlen(text);	if(quoted)		n--;	text[n++] = '\n';	text[n++] = 0; 	save = host_client;	for(j = 0, client = svs.clients; j < svs.maxclients; j++, client++) {		if(!client->active || !client->spawned)			continue;		if(cistrcmp(client->name, Cmd_Argv(1)) != 0)			continue;		host_client = client;		SV_ClientPrintf("%s", text);		break;	}	host_client = save;} static voidHost_Color_f(cmd_t *c){	int top, bottom, playercolor; 	USED(c);	if(Cmd_Argc() == 1) {		Con_Printf(			"\"color\" is \"%d %d\"\n", ((int)cl_color.value) >> 4, ((int)cl_color.value) & 0x0f		);		Con_Printf("color <0-13> [0-13]\n");		return;	} 	if(Cmd_Argc() == 2)		top = bottom = atoi(Cmd_Argv(1));	else {		top = atoi(Cmd_Argv(1));		bottom = atoi(Cmd_Argv(2));	} 	top &= 15;	if(top > 13)		top = 13;	bottom &= 15;	if(bottom > 13)		bottom = 13; 	playercolor = top * 16 + bottom; 	if(cmd_source == src_command) {		setcvarv("_cl_color", playercolor);		if(cls.state == ca_connected)			Cmd_ForwardToServer(nil);		return;	} 	host_client->colors = playercolor;	host_client->edict->v.team = bottom + 1; 	// send notification to all clients	MSG_WriteByte(&sv.reliable_datagram, svc_updatecolors);	MSG_WriteByte(&sv.reliable_datagram, host_client - svs.clients);	MSG_WriteByte(&sv.reliable_datagram, host_client->colors);} static voidHost_Kill_f(cmd_t *c){	USED(c);	if(cmd_source == src_command) {		Cmd_ForwardToServer(nil);		return;	} 	if(sv_player->v.health <= 0) {		SV_ClientPrintf("Can't suicide -- already dead!\n");		return;	} 	sv.pr->global_struct->time = sv.time;	sv.pr->global_struct->self = EDICT_TO_PROG(sv.pr, sv_player);

Lines 1–500 of 1171.

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