/* ====================== Host_Map_f handle a map <servername> command from the console. Active clients are kicked off. ====================== */ void Host_Map_f (void) { int i; char name[MAX_QPATH], *p; if (Cmd_Argc() < 2) //no map name given { if (cls.state == ca_dedicated) { if (sv.active) Con_Printf ("Current map: %s\n", sv.name); else Con_Printf ("Server not active\n"); } else if (cls.state == ca_connected) { Con_Printf ("Current map: %s ( %s )\n", cl.levelname, cl.mapname); } else { Con_Printf ("map <levelname>: start a new server\n"); } return; } if (cmd_source != src_command) return; cls.demonum = -1; // stop demo loop in case this fails CL_Disconnect (); Host_ShutdownServer(false); if (cls.state != ca_dedicated) IN_Activate(); key_dest = key_game; // remove console or menu SCR_BeginLoadingPlaque (); svs.serverflags = 0; // haven't completed an episode yet q_strlcpy (name, Cmd_Argv(1), sizeof(name)); // remove (any) trailing ".bsp" from mapname -- S.A. p = strstr(name, ".bsp"); if (p && p[4] == '\0') *p = '\0'; SV_SpawnServer (name); if (!sv.active) return; if (cls.state != ca_dedicated) { memset (cls.spawnparms, 0, MAX_MAPSTRING); for (i = 2; i < Cmd_Argc(); i++) { q_strlcat (cls.spawnparms, Cmd_Argv(i), MAX_MAPSTRING); q_strlcat (cls.spawnparms, " ", MAX_MAPSTRING); } Cmd_ExecuteString ("connect local", src_command); } }
size_t qerr_strlcat (const char *caller, int linenum, char *dst, const char *src, size_t size) { size_t ret = q_strlcat (dst, src, size); if (ret >= size) Sys_Error("%s: %d: string buffer overflow!", caller, linenum); return ret; }
void LoadTriangleList(const char *fileName, triangle_t **triList, int *triangleCount) { FILE *input; q_strlcpy(InputFileName, fileName, sizeof(InputFileName)); StripExtension(InputFileName); q_strlcat(InputFileName, ".asc", sizeof(InputFileName)); if ((input = fopen(InputFileName, "rb")) != NULL) { fclose(input); LoadASC(InputFileName, triList, triangleCount); return; } StripExtension(InputFileName); q_strlcat(InputFileName, ".hrc", sizeof(InputFileName)); if ((input = fopen(InputFileName, "rb")) != NULL) { fclose(input); LoadHRC(InputFileName, triList, triangleCount); return; } StripExtension(InputFileName); q_strlcat(InputFileName, ".htr", sizeof(InputFileName)); if ((input = fopen(InputFileName, "rb")) != NULL) { fclose(input); LoadHTR(InputFileName, triList, triangleCount); return; } StripExtension(InputFileName); q_strlcat(InputFileName, ".tri", sizeof(InputFileName)); if ((input = fopen(InputFileName, "rb")) != NULL) { LoadTRI(input, triList, triangleCount); fclose(input); return; } COM_Error("Could not open file '%s':\n" "No ASC, HRC, HTR, or TRI match.\n", fileName); }
/* ============== S_LoadSound ============== */ sfxcache_t *S_LoadSound (sfx_t *s) { char namebuffer[256]; byte *data; wavinfo_t info; int len; float stepscale; sfxcache_t *sc; byte stackbuf[1*1024]; // avoid dirtying the cache heap // see if still in memory sc = (sfxcache_t *) Cache_Check (&s->cache); if (sc) return sc; // Con_Printf ("%s: %x\n", __thisfunc__, (int)stackbuf); // load it in q_strlcpy(namebuffer, "sound/", sizeof(namebuffer)); q_strlcat(namebuffer, s->name, sizeof(namebuffer)); // Con_Printf ("loading %s\n",namebuffer); data = FS_LoadStackFile(namebuffer, stackbuf, sizeof(stackbuf)); if (!data) { Con_Printf ("Couldn't load %s\n", namebuffer); return NULL; } info = GetWavinfo (s->name, data, fs_filesize); if (info.channels != 1) { Con_Printf ("%s is a stereo sample\n",s->name); return NULL; } stepscale = (float)info.rate / shm->speed; len = info.samples / stepscale; len = len * info.width * info.channels; sc = (sfxcache_t *) Cache_Alloc ( &s->cache, len + sizeof(sfxcache_t), s->name); if (!sc) return NULL; sc->length = info.samples; sc->loopstart = info.loopstart; sc->speed = info.rate; sc->width = info.width; sc->stereo = info.channels; ResampleSfx (s, sc->speed, sc->width, data + info.dataofs); return sc; }
/* =================== Key_Bind_f =================== */ static void Key_Bind_f (void) { int i, c, b; char cmd[1024]; c = Cmd_Argc(); if (c != 2 && c != 3) { Con_Printf ("bind <key> [command] : attach a command to a key\n"); return; } b = Key_StringToKeynum (Cmd_Argv(1)); if (b == -1) { Con_Printf ("\"%s\" isn't a valid key\n", Cmd_Argv(1)); return; } if (c == 2) { if (keybindings[b]) Con_Printf ("\"%s\" = \"%s\"\n", Cmd_Argv(1), keybindings[b] ); else Con_Printf ("\"%s\" is not bound\n", Cmd_Argv(1) ); return; } // copy the rest of the command line cmd[0] = 0; for (i = 2; i < c; i++) { q_strlcat (cmd, Cmd_Argv(i), sizeof(cmd)); if (i != (c-1)) q_strlcat (cmd, " ", sizeof(cmd)); } Key_SetBinding (b, cmd); }
static void S_Play (void) { static int hash = 345; int i; char name[256]; sfx_t *sfx; i = 1; while (i < Cmd_Argc()) { q_strlcpy(name, Cmd_Argv(i), sizeof(name)); if (!Q_strrchr(Cmd_Argv(i), '.')) { q_strlcat(name, ".wav", sizeof(name)); } sfx = S_PrecacheSound(name); S_StartSound(hash++, 0, sfx, listener_origin, 1.0, 1.0); i++; } }
static void S_PlayVol (void) { static int hash = 543; int i; float vol; char name[256]; sfx_t *sfx; i = 1; while (i < Cmd_Argc()) { q_strlcpy(name, Cmd_Argv(i), sizeof(name)); if (!Q_strrchr(Cmd_Argv(i), '.')) { q_strlcat(name, ".wav", sizeof(name)); } sfx = S_PrecacheSound(name); vol = Q_atof(Cmd_Argv(i + 1)); S_StartSound(hash++, 0, sfx, listener_origin, vol, 1.0); i += 2; } }
/* ====================== Host_Map_f handle a map <servername> command from the console. Active clients are kicked off. ====================== */ static void Host_Map_f (void) { int i; char name[MAX_QPATH]; if (Cmd_Argc() < 2) //no map name given { Con_Printf ("map <levelname>: start a new server\n"); if (cls.state == ca_disconnected) return; if (cls.state == ca_connected) { Con_Printf ("Current level: %s [ %s ]\n", cl.levelname, cl.mapname); return; } // (cls.state == ca_dedicated) if (sv.active) { Con_Printf ("Current level: %s [ %s ]\n", SV_GetLevelname(), sv.name); } return; } if (cmd_source != src_command) return; cls.demonum = -1; // stop demo loop in case this fails CL_Disconnect (); Host_ShutdownServer(false); Key_SetDest (key_game); // remove console or menu SCR_BeginLoadingPlaque (); info_mask = 0; if (!coop.integer && deathmatch.integer) info_mask2 = 0x80000000; else info_mask2 = 0; svs.serverflags = 0; // haven't completed an episode yet q_strlcpy (name, Cmd_Argv(1), sizeof(name)); SV_SpawnServer (name, NULL); if (!sv.active) return; if (cls.state != ca_dedicated) { loading_stage = 2; memset (cls.spawnparms, 0, MAX_MAPSTRING); for (i = 2; i < Cmd_Argc(); i++) { q_strlcat (cls.spawnparms, Cmd_Argv(i), MAX_MAPSTRING); q_strlcat (cls.spawnparms, " ", MAX_MAPSTRING); } Cmd_ExecuteString ("connect local", src_command); } }
/* =============== Cmd_Alias_f Creates a new command that executes a command string (possibly ; seperated) =============== */ static void Cmd_Alias_f (void) { cmdalias_t *a; char cmd[1024]; int i, c; const char *s; if (Cmd_Argc() == 1) { Con_Printf ("Current alias commands:\n"); for (a = cmd_alias ; a ; a = a->next) Con_Printf ("%s : %s\n", a->name, a->value); return; } s = Cmd_Argv(1); if (Cmd_Argc() == 2) { for (a = cmd_alias ; a ; a = a->next) { if ( !strcmp(s, a->name) ) { Con_Printf ("%s : %s\n", s, a->value); return; } } Con_Printf ("No alias named %s\n", s); return; } if (strlen(s) >= MAX_ALIAS_NAME) { Con_Printf ("Alias name is too long\n"); return; } // if the alias already exists, reuse it for (a = cmd_alias ; a ; a = a->next) { if ( !strcmp(s, a->name) ) { Z_Free (a->value); break; } } if (!a) { a = (cmdalias_t *) Z_Malloc (sizeof(cmdalias_t), Z_MAINZONE); a->next = cmd_alias; cmd_alias = a; } strcpy (a->name, s); // copy the rest of the command line cmd[0] = 0; // start out with a null string c = Cmd_Argc(); for (i = 2; i < c; i++) { q_strlcat (cmd, Cmd_Argv(i), sizeof(cmd)); if (i != c - 1) strcat (cmd, " "); } if (q_strlcat(cmd, "\n", sizeof(cmd)) >= sizeof(cmd)) { Con_Printf("alias value too long!\n"); cmd[0] = '\n'; // nullify the string cmd[1] = 0; } a->value = (char *) Z_Malloc (strlen(cmd) + 1, Z_MAINZONE); strcpy (a->value, cmd); }
/* ================== SV_Say ================== */ static void SV_Say (qboolean team) { client_t *client; int j = 0, tmp; const char *p; char text[2048]; char t1[32]; const char *t2; int speaknum = -1; if (Cmd_Argc () < 2) return; if (team) q_strlcpy (t1, Info_ValueForKey(host_client->userinfo, "team"), sizeof(t1)); if (host_client->spectator && (!sv_spectalk.integer || team)) q_snprintf (text, sizeof(text), "[SPEC] %s: ", host_client->name); else if (team) q_snprintf (text, sizeof(text), "(%s): ", host_client->name); else q_snprintf (text, sizeof(text), "%s: ", host_client->name); if (fp_messages) { if (realtime<host_client->lockedtill) { SV_ClientPrintf(host_client, PRINT_CHAT, "You can't talk for %d more seconds\n", (int) (host_client->lockedtill - realtime)); return; } tmp = host_client->whensaidhead - fp_messages + 1; if (tmp < 0) tmp = 10+tmp; if (host_client->whensaid[tmp] && (realtime-host_client->whensaid[tmp] < fp_persecond)) { host_client->lockedtill = realtime + fp_secondsdead; if (fp_msg[0]) SV_ClientPrintf(host_client, PRINT_CHAT, "FloodProt: %s\n", fp_msg); else SV_ClientPrintf(host_client, PRINT_CHAT, "FloodProt: You can't talk for %d seconds.\n", fp_secondsdead); return; } host_client->whensaidhead++; if (host_client->whensaidhead > 9) host_client->whensaidhead = 0; host_client->whensaid[host_client->whensaidhead] = realtime; } p = Cmd_Args(); if (*p == '"') { p++; j = 1; } if (p[0] == '`' && (!host_client->spectator && sv_allowtaunts.integer) ) { speaknum = atoi(&p[1]); if (speaknum <= 0 || speaknum > 255-PRINT_SOUND) { speaknum = -1; } else { text[strlen(text)-2] = '\0'; q_strlcat(text," speaks!\n", sizeof(text)); } } if (speaknum == -1) { q_strlcat(text, p, sizeof(text)); if (j == 1) // remove trailing quotes text[strlen(text)-1] = '\0'; q_strlcat(text, "\n", sizeof(text)); } Sys_Printf ("%s", text); for (j = 0, client = svs.clients; j < MAX_CLIENTS; j++, client++) { if (client->state != cs_spawned) continue; if (host_client->spectator && !sv_spectalk.integer) if (!client->spectator) continue; if (team) { // the spectator team if (host_client->spectator) { if (!client->spectator) continue; } else { t2 = Info_ValueForKey (client->userinfo, "team"); if (dmMode.integer == DM_SIEGE) { if ( (host_client->edict->v.skin == 102 && client->edict->v.skin != 102) || (client->edict->v.skin == 102 && host_client->edict->v.skin != 102)) // noteam players can team chat with each other, // cannot recieve team chat of other players continue; if (client->siege_team != host_client->siege_team) // on different teams continue; } else if (strcmp(t1, t2) || client->spectator) continue; // on different teams } } if (speaknum == -1) { if (dmMode.integer == DM_SIEGE && host_client->siege_team != client->siege_team) //other team speaking SV_ClientPrintf(client, PRINT_CHAT, "%s", text); // FIXME: print siege else SV_ClientPrintf(client, PRINT_CHAT, "%s", text); } else { SV_ClientPrintf(client, PRINT_SOUND + speaknum-1, "%s", text); } } }
/* =============== Cmd_Alias_f -- johnfitz -- rewritten Creates a new command that executes a command string (possibly ; seperated) =============== */ void Cmd_Alias_f (void) { cmdalias_t *a; char cmd[1024]; int i, c; const char *s; switch (Cmd_Argc()) { case 1: //list all aliases for (a = cmd_alias, i = 0; a; a=a->next, i++) Con_SafePrintf (" %s: %s", a->name, a->value); if (i) Con_SafePrintf ("%i alias command(s)\n", i); else Con_SafePrintf ("no alias commands found\n"); break; case 2: //output current alias string for (a = cmd_alias ; a ; a=a->next) if (!strcmp(Cmd_Argv(1), a->name)) Con_Printf (" %s: %s", a->name, a->value); break; default: //set alias string s = Cmd_Argv(1); if (strlen(s) >= MAX_ALIAS_NAME) { Con_Printf ("Alias name is too long\n"); return; } // if the alias allready exists, reuse it for (a = cmd_alias ; a ; a=a->next) { if (!strcmp(s, a->name)) { Z_Free (a->value); break; } } if (!a) { a = (cmdalias_t *) Z_Malloc (sizeof(cmdalias_t)); a->next = cmd_alias; cmd_alias = a; } strcpy (a->name, s); // copy the rest of the command line cmd[0] = 0; // start out with a null string c = Cmd_Argc(); for (i = 2; i < c; i++) { q_strlcat (cmd, Cmd_Argv(i), sizeof(cmd)); if (i != c - 1) q_strlcat (cmd, " ", sizeof(cmd)); } if (q_strlcat(cmd, "\n", sizeof(cmd)) >= sizeof(cmd)) { Con_Printf("alias value too long!\n"); cmd[0] = '\n'; // nullify the string cmd[1] = 0; } a->value = Z_Strdup (cmd); break; } }