void Host_Tell_f(void) { client_t *client; client_t *save; int j; char *p; char text[64]; if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (Cmd_Argc () < 3) return; Q_strcpy(text, host_client->name); Q_strcat(text, ": "); p = Cmd_Args(); // remove quotes if present if (*p == '"') { p++; p[Q_strlen(p)-1] = 0; } // check length & truncate if necessary j = sizeof(text) - 2 - Q_strlen(text); // -2 for /n and null terminator if (Q_strlen(p) > j) p[j] = 0; strcat (text, p); strcat (text, "\n"); save = host_client; for (j = 0, client = svs.clients; j < svs.maxclients; j++, client++) { if (!client->active || !client->spawned) continue; if (Q_strcasecmp(client->name, Cmd_Argv(1))) continue; host_client = client; SV_ClientPrintf("%s", text); break; } host_client = save; }
void NET_Ban_f(void) { char addrStr [32]; char maskStr [32]; void (*print)(char *fmt, ...); if (cmd_source == src_command) { if (!sv.active) { Cmd_ForwardToServer(); return; } print = Con_Printf; } else { if (pr_global_struct->deathmatch && !host_client->privileged) { return; } print = SV_ClientPrintf; } switch (Cmd_Argc()) { case 1: if (((struct in_addr *)&banAddr)->s_addr) { Q_strcpy(addrStr, inet_ntoa(*(struct in_addr *)&banAddr)); Q_strcpy(maskStr, inet_ntoa(*(struct in_addr *)&banMask)); print("Banning %s [%s]\n", addrStr, maskStr); } else { print("Banning not active\n"); } break; case 2: if (Q_strcasecmp(Cmd_Argv(1), "off") == 0) { banAddr = 0x00000000; } else { banAddr = inet_addr(Cmd_Argv(1)); } banMask = 0xffffffff; break; case 3: banAddr = inet_addr(Cmd_Argv(1)); banMask = inet_addr(Cmd_Argv(2)); break; default: print("BAN ip_address [mask]\n"); break; } }
/* =============== CL_Serverinfo_f =============== */ void CL_Serverinfo_f (void) { #ifndef CLIENTONLY if (cls.state < ca_connected || com_serveractive) { SV_Serverinfo_f(); return; } #endif if (cls.state >= ca_onserver && cl.serverinfo) Info_Print (cl.serverinfo); else // so that it says we are not connected :) Cmd_ForwardToServer(); }
/* ================== Host_Status_f ================== */ void Host_Status_f (void) { client_t *client; int seconds; int minutes; int hours = 0; int j; void (*print_fn) (const char *fmt, ...) __fp_attribute__((__format__(__printf__,1,2))); if (cmd_source == src_command) { if (!sv.active) { Cmd_ForwardToServer (); return; } print_fn = Con_Printf; } else print_fn = SV_ClientPrintf; print_fn ("host: %s\n", Cvar_VariableString ("hostname")); print_fn ("version: %4.2f\n", VERSION); if (tcpipAvailable) print_fn ("tcp/ip: %s\n", my_tcpip_address); if (ipxAvailable) print_fn ("ipx: %s\n", my_ipx_address); print_fn ("map: %s\n", sv.name); print_fn ("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 - NET_QSocketGetTime(client->netconnection)); minutes = seconds / 60; if (minutes) { seconds -= (minutes * 60); hours = minutes / 60; if (hours) minutes -= (hours * 60); } else hours = 0; print_fn ("#%-2u %-16.16s %3i %2i:%02i:%02i\n", j+1, client->name, (int)client->edict->v.frags, hours, minutes, seconds); print_fn (" %s\n", NET_QSocketGetAddressString(client->netconnection)); } }
/* ================== Host_Noclip_f ================== */ void Host_Noclip_f (void) { if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (pr_global_struct->deathmatch) return; //johnfitz -- allow user to explicitly set noclip to on or off switch (Cmd_Argc()) { case 1: 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"); } break; case 2: if (Q_atof(Cmd_Argv(1))) { 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"); } break; default: Con_Printf("noclip [value] : toggle noclip mode. values: 0 = off, 1 = on\n"); break; } //johnfitz }
/* ============ Cmd_ExecuteString A complete command line has been parsed, so try to execute it FIXME: lookupnoadd the token to speed search? ============ */ void Cmd_ExecuteString (char *text) { cmd_function_t *cmd; cmdalias_t *a; Cmd_TokenizeString (text); // execute the command line if (!Cmd_Argc()) return; // no tokens // check functions for (cmd=cmd_functions ; cmd ; cmd=cmd->next) { if (!Q_strcasecmp (cmd_argv[0],cmd->name)) { if (!strcmp(cmd->name, "kill")) { if ((trace_state == read_trace || trace_state == write_trace)) { trace_state = stop_trace; printf("GAJA: command = kill\n"); } } if (!cmd->function) Cmd_ForwardToServer (); else cmd->function (); return; } } // check alias for (a=cmd_alias ; a ; a=a->next) { if (!Q_strcasecmp (cmd_argv[0], a->name)) { Cbuf_InsertText (a->value); return; } } // check cvars if (!Cvar_Command () && (cl_warncmd.value || developer.value)) Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0)); }
/* ============ Cmd_ExecuteString A complete command line has been parsed, so try to execute it FIXME: lookupnoadd the token to speed search? ============ */ void Cmd_ExecuteString (char *text) { cmd_function_t *cmd; cmdalias_t *a; Cmd_TokenizeString (text, true); // execute the command line if (!Cmd_Argc()) return; // no tokens // check functions for (cmd=cmd_functions ; cmd ; cmd=cmd->next) { if (!Q_strcasecmp (cmd_argv[0],cmd->name)) { if (!cmd->function) { // forward to server command Cmd_ExecuteString (va("cmd %s", text)); } else cmd->function (); return; } } // check alias for (a=cmd_alias ; a ; a=a->next) { if (!Q_strcasecmp (cmd_argv[0], a->name)) { if (++alias_count == ALIAS_LOOP_COUNT) { Com_Printf ("ALIAS_LOOP_COUNT\n"); return; } Cbuf_InsertText (a->value); return; } } // check cvars if (Cvar_Command ()) return; // send it as a server command if we are connected Cmd_ForwardToServer (); }
void NET_Ban_f(void) { char addrStr[32]; char maskStr[32]; void (*print)(const char *fmt, ...) __attribute__((format(printf,1,2))); if (cmd_source == src_command) { if (!sv.active) { Cmd_ForwardToServer(); return; } print = Con_Printf; } else { if (pr_global_struct->deathmatch) return; print = SV_ClientPrintf; } switch (Cmd_Argc()) { case 1: if (banAddr.s_addr != INADDR_ANY) { strcpy(addrStr, inet_ntoa(banAddr)); strcpy(maskStr, inet_ntoa(banMask)); print("Banning %s [%s]\n", addrStr, maskStr); } else print("Banning not active\n"); break; case 2: if (strcasecmp(Cmd_Argv(1), "off") == 0) banAddr.s_addr = INADDR_ANY; else banAddr.s_addr = inet_addr(Cmd_Argv(1)); banMask.s_addr = INADDR_NONE; break; case 3: banAddr.s_addr = inet_addr(Cmd_Argv(1)); banMask.s_addr = inet_addr(Cmd_Argv(2)); break; default: print("BAN ip_address [mask]\n"); break; } }
/* ================== 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"); }
static void Host_Notarget_f (void) { if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (*sv_globals.deathmatch || skill.integer > 2) return; sv_player->v.flags = (int)sv_player->v.flags ^ FL_NOTARGET; if (!((int)sv_player->v.flags & FL_NOTARGET) ) SV_ClientPrintf (0, "notarget OFF\n"); else SV_ClientPrintf (0, "notarget ON\n"); }
/* ================== Host_God_f Sets client to godmode ================== */ static void Host_God_f (void) { if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (*sv_globals.deathmatch || *sv_globals.coop || skill.integer > 2) return; sv_player->v.flags = (int)sv_player->v.flags ^ FL_GODMODE; if (!((int)sv_player->v.flags & FL_GODMODE) ) SV_ClientPrintf (0, "godmode OFF\n"); else SV_ClientPrintf (0, "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"); }
/* ====================== Host_Name_f ====================== */ static void Host_Name_f (void) { char newName[32]; char *pdest; if (Cmd_Argc () == 1) { Con_Printf ("\"name\" is \"%s\"\n", cl_name.string); return; } if (Cmd_Argc () == 2) q_strlcpy (newName, Cmd_Argv(1), sizeof(newName)); else q_strlcpy (newName, Cmd_Args(), sizeof(newName)); newName[15] = 0; // client_t structure actually says name[32]. //this is for the fuckers who put braces in the name causing loadgame to crash. pdest = strchr(newName,'{'); if (pdest) { *pdest = 0; //zap the brace Con_Printf ("Illegal char in name removed!\n"); } if (cmd_source == src_command) { if (strcmp(cl_name.string, newName) == 0) return; Cvar_Set ("_cl_name", newName); if (cls.state == ca_connected) Cmd_ForwardToServer (); return; } if (host_client->name[0] && strcmp(host_client->name, "unconnected") ) 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_SetEngineString(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); }
void CL_Name_f(void) { char new_name[16]; const char *arg; if (Cmd_Argc() == 1) { Con_Printf("\"name\" is \"%s\"\n", cl_name.string); return; } arg = (Cmd_Argc() == 2) ? Cmd_Argv(1) : Cmd_Args(); snprintf(new_name, sizeof(new_name), "%s", arg); if (!strcmp(cl_name.string, new_name)) return; Cvar_Set("_cl_name", new_name); Cmd_ForwardToServer(); }
/* ================== CL_SetInfo_f Allow clients to change userinfo ================== */ void CL_SetInfo_f (void) { if (Cmd_Argc() == 1) { Info_Print (cls.userinfo); return; } if (Cmd_Argc() != 3) { Com_Printf ("usage: setinfo [ <key> <value> ]\n"); return; } if (!Q_stricmp(Cmd_Argv(1), pmodel_name) || !strcmp(Cmd_Argv(1), emodel_name)) return; Info_SetValueForKey (cls.userinfo, Cmd_Argv(1), Cmd_Argv(2), MAX_INFO_STRING); if (cls.state >= ca_connected) Cmd_ForwardToServer (); }
/* ================== Host_QC_Exec Execute QC commands from the console ================== */ void Host_QC_Exec (void) { dfunction_t *f; if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (!developer.value) return; f = 0; if ((f = ED_FindFunction(Cmd_Argv(1))) != NULL) { pr_global_struct->self = EDICT_TO_PROG(sv_player); PR_ExecuteProgram ((func_t)(f - pr_functions)); } else Con_Printf("bad function\n"); }
void EXT_FUNC Cmd_ExecuteString_internal(const char* cmdName, cmd_source_t src, IGameClient* client) { // Search in functions cmd_function_t *cmd = cmd_functions; while (cmd) { if (!Q_stricmp(cmd_argv[0], cmd->name)) { cmd->function(); if (g_pcls.demorecording && (cmd->flags & FCMD_HUD_COMMAND) && !g_pcls.spectator) { CL_RecordHUDCommand(cmd->name); } return; } cmd = cmd->next; } // Search in aliases cmdalias_t *a = cmd_alias; while (a) { if (!Q_stricmp(cmd_argv[0], a->name)) { Cbuf_InsertText(a->value); return; } a = a->next; } // Search in cvars if (!Cvar_Command() && g_pcls.state >= ca_connected) { // Send to a server if nothing processed locally and connected Cmd_ForwardToServer(); } }
/* ================== Host_Notarget_f ================== */ void Host_Notarget_f (void) { if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (pr_global_struct->deathmatch) return; //johnfitz -- allow user to explicitly set notarget to on or off switch (Cmd_Argc()) { case 1: 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"); break; case 2: if (Q_atof(Cmd_Argv(1))) { sv_player->v.flags = (int)sv_player->v.flags | FL_NOTARGET; SV_ClientPrintf ("notarget ON\n"); } else { sv_player->v.flags = (int)sv_player->v.flags & ~FL_NOTARGET; SV_ClientPrintf ("notarget OFF\n"); } break; default: Con_Printf("notarget [value] : toggle notarget mode. values: 0 = off, 1 = on\n"); break; } //johnfitz }
/* ====================== Host_Name_f ====================== */ void Host_Name_f (void) { char newName[32]; if (Cmd_Argc () == 1) { Con_Printf ("\"name\" is \"%s\"\n", cl_name.string); return; } if (Cmd_Argc () == 2) q_strlcpy(newName, Cmd_Argv(1), sizeof(newName)); else q_strlcpy(newName, Cmd_Args(), sizeof(newName)); newName[15] = 0; // client_t structure actually says name[32]. if (cmd_source == src_command) { if (Q_strcmp(cl_name.string, newName) == 0) return; Cvar_Set ("_cl_name", newName); if (cls.state == ca_connected) Cmd_ForwardToServer (); return; } if (host_client->name[0] && strcmp(host_client->name, "unconnected") ) { if (Q_strcmp(host_client->name, newName) != 0) Con_Printf ("%s renamed to %s\n", host_client->name, newName); } Q_strcpy (host_client->name, newName); host_client->edict->v.netname = PR_SetEngineString(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 void Host_Noclip_f (void) { if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (*sv_globals.deathmatch || *sv_globals.coop || skill.integer > 2) return; if (sv_player->v.movetype != MOVETYPE_NOCLIP) { sv_player->v.movetype = MOVETYPE_NOCLIP; SV_ClientPrintf (0, "noclip ON\n"); } else { sv_player->v.movetype = MOVETYPE_WALK; SV_ClientPrintf (0, "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"); } }
void Host_Notarget_f (void) { if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (!allowcheats) { SV_ClientPrintf("No cheats allowed, use sv_cheats 1 and restart level to enable.\n"); 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"); }
/* ====================== Host_Name_f ====================== */ void Host_Name_f (void) { char *newName; if (Cmd_Argc () == 1) { Con_Printf ("\"name\" is \"%s\"\n", cl_name.string); return; } if (Cmd_Argc () == 2) newName = Cmd_Argv(1); else newName = Cmd_Args(); newName[15] = 0; if (cmd_source == src_command) { if (Q_strcmp(cl_name.string, newName) == 0) return; Cvar_Set ("_cl_name", newName); if (cls.state == ca_connected) Cmd_ForwardToServer (); return; } if (host_client->name[0] && strcmp(host_client->name, "unconnected") ) if (Q_strcmp(host_client->name, newName) != 0) Con_Printf ("%s renamed to %s\n", host_client->name, newName); Q_strcpy (host_client->name, newName); host_client->edict->v.netname = host_client->name - pr_strings; // 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); }
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_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); } }
static void Host_Class_f (void) { float newClass; if (Cmd_Argc () == 1) { Con_Printf("\"playerclass\" is %d (\"%s\")\n", cl_playerclass.integer, (cl_playerclass.integer < 1 || cl_playerclass.integer > MAX_PLAYER_CLASS) ? "unknown" : ClassNames[cl_playerclass.integer - 1]); return; } if (Cmd_Argc () == 2) newClass = atof(Cmd_Argv(1)); else newClass = atof(Cmd_Args()); if (newClass < 0 || newClass > MAX_PLAYER_CLASS) { Con_Printf("Invalid player class.\n"); return; } #if ENABLE_OLD_DEMO if (gameflags & GAME_OLD_DEMO && (newClass != CLASS_PALADIN && newClass != CLASS_THEIF)) { Con_Printf("That class is not available in this demo version.\n"); return; } #endif /* OLD_DEMO */ if (newClass == CLASS_DEMON) { if (!(gameflags & GAME_PORTALS)) { Con_Printf("That class is only available in the mission pack.\n"); return; } if (sv.active && (progs->crc != PROGS_V112_CRC)) { /* FIXME: This isn't right!!! A custom progs can actually * support 5 classes and can have v1.11 structures at the * same time. I don't know a way to detect any such thing, * hence this lame solution! -- O.S. */ Con_Printf("progs.dat in use doesn't support that class.\n"); return; } } if (cmd_source == src_command) { Cvar_SetValue ("_cl_playerclass", newClass); // when class changes after map load, update cl_playerclass, // cl_playerclass should probably only be used in worldspawn, though. if (sv.active && sv_globals.cl_playerclass) *sv_globals.cl_playerclass = newClass; if (cls.state == ca_connected) Cmd_ForwardToServer (); return; } if (sv.loadgame || host_client->playerclass) { if (host_client->edict->v.playerclass) newClass = host_client->edict->v.playerclass; else if (host_client->playerclass) newClass = host_client->playerclass; } host_client->playerclass = newClass; host_client->edict->v.playerclass = newClass; // Change the weapon model used *sv_globals.self = EDICT_TO_PROG(host_client->edict); PR_ExecuteProgram (*sv_globals.ClassChangeWeapon); // send notification to all clients MSG_WriteByte (&sv.reliable_datagram, svc_updateclass); MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients); MSG_WriteByte (&sv.reliable_datagram, (byte)newClass); }
void Host_Tell_f(void) { int j; client_t *client; client_t *save; const char *p; char text[MAXCMDLINE], *p2; qboolean quoted; if (cmd_source == src_command) { Cmd_ForwardToServer (); return; } if (Cmd_Argc () < 3) return; p = Cmd_Args(); // remove quotes if present quoted = false; if (*p == '\"') { p++; quoted = true; } q_snprintf (text, sizeof(text), "%s: %s", host_client->name, p); // check length & truncate if necessary j = (int) strlen(text); if (j >= (int) sizeof(text) - 1) { text[sizeof(text) - 2] = '\n'; text[sizeof(text) - 1] = '\0'; } else { p2 = text + j; while ((const char *)p2 > (const char *)text && (p2[-1] == '\r' || p2[-1] == '\n' || (p2[-1] == '\"' && quoted)) ) { if (p2[-1] == '\"' && quoted) quoted = false; p2[-1] = '\0'; p2--; } p2[0] = '\n'; p2[1] = '\0'; } save = host_client; for (j = 0, client = svs.clients; j < svs.maxclients; j++, client++) { if (!client->active || !client->spawned) continue; if (q_strcasecmp(client->name, Cmd_Argv(1))) continue; host_client = client; SV_ClientPrintf("%s", text); break; } host_client = save; }
void Host_Say(qboolean teamonly) { int j; client_t *client; client_t *save; const char *p; char text[MAXCMDLINE], *p2; qboolean quoted; qboolean fromServer = false; if (cmd_source == src_command) { if (cls.state != ca_dedicated) { Cmd_ForwardToServer (); return; } fromServer = true; teamonly = false; } if (Cmd_Argc () < 2) return; save = host_client; p = Cmd_Args(); // remove quotes if present quoted = false; if (*p == '\"') { p++; quoted = true; } // turn on color set 1 if (!fromServer) q_snprintf (text, sizeof(text), "\001%s: %s", save->name, p); else q_snprintf (text, sizeof(text), "\001<%s> %s", hostname.string, p); // check length & truncate if necessary j = (int) strlen(text); if (j >= (int) sizeof(text) - 1) { text[sizeof(text) - 2] = '\n'; text[sizeof(text) - 1] = '\0'; } else { p2 = text + j; while ((const char *)p2 > (const char *)text && (p2[-1] == '\r' || p2[-1] == '\n' || (p2[-1] == '\"' && quoted)) ) { if (p2[-1] == '\"' && quoted) quoted = false; p2[-1] = '\0'; p2--; } p2[0] = '\n'; p2[1] = '\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; if (cls.state == ca_dedicated) Sys_Printf("%s", &text[1]); }
void Host_Say(qboolean teamonly) { client_t *client; client_t *save; int j; char *p; char text[64]; qboolean fromServer = false; if (cmd_source == src_command) { if (cls.state == ca_dedicated) { fromServer = true; teamonly = false; } else { Cmd_ForwardToServer (); return; } } if (Cmd_Argc () < 2) return; save = host_client; p = Cmd_Args(); // remove quotes if present if (*p == '"') { p++; p[Q_strlen(p)-1] = 0; } // turn on color set 1 if (!fromServer) sprintf (text, "%c%s: ", 1, save->name); //sprintf (text, "%s: ", save->name); else sprintf (text, "%c<%s> ", 1, hostname.string); //sprintf (text, "<%s> ", hostname.string); j = sizeof(text) - 2 - Q_strlen(text); // -2 for /n and null terminator if (Q_strlen(p) > j) p[j] = 0; strcat (text, p); strcat (text, "\n"); 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; Sys_Printf("%s", &text[1]); }
/* ============ Cmd_ExecuteString A complete command line has been parsed, so try to execute it FIXME: lookupnoadd the token to speed search? ============ */ void Cmd_ExecuteString (char *text) { cmd_function_t *cmd; cmdalias_t *a; void **data; Cmd_TokenizeString (text, true); // execute the command line if (!Cmd_Argc()) { //Com_DPrintf ("Cmd_ExecuteString: no tokens on '%s'\n", text); return; // no tokens } // check functions // FIXME CRASH: NULL in the rb tree! data = rbfind (cmd_argv[0], cmdtree); if (data) { cmd = *(cmd_function_t **)data; if (!cmd->function) { // forward to server command //Cmd_ExecuteString (va("cmd %s", text)); #ifndef DEDICATED_ONLY Cmd_ForwardToServer (); #endif //Com_DPrintf ("Cmd_ExecuteString: no function '%s' for '%s', using 'cmd'\n", cmd->name, text); } else { //Com_DPrintf ("Cmd_ExecuteString: function '%s' called for '%s'\n", cmd->name, text); cmd->function (); } return; } // check alias data = rbfind (cmd_argv[0], aliastree); if (data) { char expanded[MAX_STRING_CHARS]; a = *(cmdalias_t **)data; if (++alias_count == ALIAS_LOOP_COUNT) { Com_Printf ("ALIAS_LOOP_COUNT\n", LOG_GENERAL); return; } Cmd_Expand_Args (a->value, expanded, sizeof(expanded)); Cbuf_InsertText (expanded); return; } // check cvars if (Cvar_Command ()) { //Com_DPrintf ("Cmd_ExecuteString: '%s' : is cvar\n", text); return; } // send it as a server command if we are connected #ifndef DEDICATED_ONLY Cmd_ForwardToServer (); #else Com_Printf ("Unknown command \"%s\"\n", LOG_GENERAL, text); #endif }