X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=host_cmd.c;h=2fbc012f7abec4be55156636d6e0938b5c19fe60;hb=35b6b522b4b9300121a15f94c1065273bab3e9a5;hp=a97af9f6ff0b5f2267ed47a391c986a67c8f6613;hpb=c0ae57bf5351638d583698717f3d2290e5ea419b;p=xonotic%2Fdarkplaces.git diff --git a/host_cmd.c b/host_cmd.c index a97af9f6..2fbc012f 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -30,19 +30,9 @@ Host_Quit_f ================== */ -// LordHavoc: didn't like it asking me if I wanted to quit -//extern void M_Menu_Quit_f (void); - extern qboolean host_shuttingdown; void Host_Quit_f (void) { - /* - if (key_dest != key_console && cls.state != ca_dedicated) - { - M_Menu_Quit_f (); - return; - } - */ host_shuttingdown = true; CL_Disconnect (); Host_ShutdownServer(false); @@ -58,12 +48,9 @@ Host_Status_f */ void Host_Status_f (void) { - client_t *client; - int seconds; - int minutes; - int hours = 0; - int j; - void (*print) (char *fmt, ...); + client_t *client; + int seconds, minutes, hours = 0, j; + void (*print) (const char *fmt, ...); if (cmd_source == src_command) { @@ -78,7 +65,7 @@ void Host_Status_f (void) print = SV_ClientPrintf; print ("host: %s\n", Cvar_VariableString ("hostname")); - print ("version: %s build %i\n", gamename, buildnumber); + print ("version: %s build %s\n", gamename, buildstring); if (tcpipAvailable) print ("tcp/ip: %s\n", my_tcpip_address); if (ipxAvailable) @@ -251,25 +238,25 @@ SERVER TRANSITIONS ====================== Host_Map_f -handle a +handle a map command from the console. Active clients are kicked off. ====================== */ void Host_Map_f (void) { - int i; - char name[MAX_QPATH]; + int i; + char name[MAX_QPATH]; if (cmd_source != src_command) return; cls.demonum = -1; // stop demo loop in case this fails -// SCR_BeginLoadingPlaque (); + SCR_BeginLoadingPlaque (); CL_Disconnect (); - Host_ShutdownServer(false); + Host_ShutdownServer(false); key_dest = key_game; // remove console or menu @@ -286,9 +273,10 @@ void Host_Map_f (void) SV_SpawnServer (name); if (!sv.active) return; - + if (cls.state != ca_dedicated) { + /* strcpy (cls.spawnparms, ""); for (i=2 ; iv.health <= 0) ) @@ -473,7 +461,7 @@ void Host_Savegame_f (void) sprintf (name, "%s/%s", com_gamedir, Cmd_Argv(1)); COM_DefaultExtension (name, ".sav"); - + Con_Printf ("Saving game to %s...\n", name); f = Qopen (name, "w"); if (!f) @@ -481,7 +469,7 @@ void Host_Savegame_f (void) Con_Printf ("ERROR: couldn't open.\n"); return; } - + Qprintf (f, "%i\n", SAVEGAME_VERSION); Host_SavegameComment (comment); Qprintf (f, "%s\n", comment); @@ -522,17 +510,18 @@ Host_Loadgame_f */ void Host_Loadgame_f (void) { - char name[MAX_OSPATH]; - QFile *f; - char mapname[MAX_QPATH]; - float time, tfloat; - char buf[32768], *start; - char *str; - int i, r; - edict_t *ent; - int entnum; - int version; - float spawn_parms[NUM_SPAWN_PARMS]; + char name[MAX_OSPATH]; + QFile *f; + char mapname[MAX_QPATH]; + float time, tfloat; + char buf[32768]; + const char *start; + char *str; + int i, r; + edict_t *ent; + int entnum; + int version; + float spawn_parms[NUM_SPAWN_PARMS]; if (cmd_source != src_command) return; @@ -548,11 +537,6 @@ void Host_Loadgame_f (void) sprintf (name, "%s/%s", com_gamedir, Cmd_Argv(1)); COM_DefaultExtension (name, ".sav"); - // LordHavoc: made SCR_UpdateScreen use a great deal less stack space, no longer an issue - //// we can't call SCR_BeginLoadingPlaque, because too much stack space has - //// been used. The menu calls it before stuffing loadgame command -// SCR_BeginLoadingPlaque (); - Con_Printf ("Loading game from %s...\n", name); f = Qopen (name, "rz"); if (!f) @@ -569,6 +553,9 @@ void Host_Loadgame_f (void) Con_Printf ("Savegame is version %i, not %i\n", version, SAVEGAME_VERSION); return; } + + SCR_BeginLoadingPlaque (); + str = Qgetline (f); for (i=0 ; iv, 0, progs->entityfields * 4); ent->free = false; ED_ParseEdict (start, ent); - - // link it into the bsp tree + + // link it into the bsp tree if (!ent->free) SV_LinkEdict (ent, false); } entnum++; } - + sv.num_edicts = entnum; sv.time = time; @@ -682,11 +673,7 @@ void Host_Name_f (void) 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_Argc () == 2) strncpy(newName, Cmd_Argv(1), 15); else @@ -716,22 +703,21 @@ void Host_Name_f (void) MSG_WriteString (&sv.reliable_datagram, host_client->name); } - + void Host_Version_f (void) { - Con_Printf ("Version: %s build %i\n", gamename, buildnumber); - Con_Printf ("Exe: "__TIME__" "__DATE__"\n"); + Con_Printf ("Version: %s build %s\n", gamename, buildstring); } void Host_Say(qboolean teamonly) { client_t *client; client_t *save; - int j; - char *p; + int j; + const char *p1, *p2; // LordHavoc: 256 char say messages - unsigned char text[256]; - qboolean fromServer = false; + unsigned char text[256]; + qboolean fromServer = false; if (cmd_source == src_command) { @@ -750,28 +736,34 @@ void Host_Say(qboolean teamonly) if (Cmd_Argc () < 2) return; - save = host_client; - - p = Cmd_Args(); -// remove quotes if present - if (*p == '"') - { - p++; - p[strlen(p)-1] = 0; - } - // turn on color set 1 if (!fromServer) - sprintf (text, "%c%s: ", 1, save->name); + sprintf (text, "%c%s: ", 1, host_client->name); else sprintf (text, "%c<%s> ", 1, hostname.string); - j = sizeof(text) - 2 - strlen(text); // -2 for /n and null terminator - if (strlen(p) > j) - p[j] = 0; + save = host_client; - strcat (text, p); - strcat (text, "\n"); + p1 = Cmd_Args(); + p2 = p1 + strlen(p1); + // remove trailing newlines + while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r')) + p2--; + // remove quotes if present + if (*p1 == '"') + { + p1++; + if (p2[-1] == '"') + p2--; + else + Con_Printf("Host_Say: missing end quote\n"); + } + while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r')) + p2--; + for (j = strlen(text);j < (sizeof(text) - 2) && p1 < p2;) + text[j++] = *p1++; + text[j++] = '\n'; + text[j++] = 0; for (j = 0, client = svs.clients; j < svs.maxclients; j++, client++) { @@ -804,38 +796,55 @@ void Host_Tell_f(void) { client_t *client; client_t *save; - int j; - char *p; - char text[1024]; // LordHavoc: FIXME: temporary buffer overflow fix (was 64) + int j; + const char *p1, *p2; + char text[1024]; // LordHavoc: FIXME: temporary buffer overflow fix (was 64) + qboolean fromServer = false; if (cmd_source == src_command) { - Cmd_ForwardToServer (); - return; + if (cls.state == ca_dedicated) + fromServer = true; + else + { + Cmd_ForwardToServer (); + return; + } } if (Cmd_Argc () < 3) return; - strcpy(text, host_client->name); - strcat(text, ": "); - - p = Cmd_Args(); - -// remove quotes if present - if (*p == '"') - { - p++; - p[strlen(p)-1] = 0; + if (!fromServer) + sprintf (text, "%s: ", host_client->name); + else + sprintf (text, "<%s> ", hostname.string); + + p1 = Cmd_Args(); + p2 = p1 + strlen(p1); + // remove the target name + while (p1 < p2 && *p1 != ' ') + p1++; + while (p1 < p2 && *p1 == ' ') + p1++; + // remove trailing newlines + while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r')) + p2--; + // remove quotes if present + if (*p1 == '"') + { + p1++; + if (p2[-1] == '"') + p2--; + else + Con_Printf("Host_Say: missing end quote\n"); } - -// check length & truncate if necessary - j = sizeof(text) - 2 - strlen(text); // -2 for /n and null terminator - if (strlen(p) > j) - p[j] = 0; - - strcat (text, p); - strcat (text, "\n"); + while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r')) + p2--; + for (j = strlen(text);j < (sizeof(text) - 2) && p1 < p2;) + text[j++] = *p1++; + text[j++] = '\n'; + text[j++] = 0; save = host_client; for (j = 0, client = svs.clients; j < svs.maxclients; j++, client++) @@ -863,11 +872,11 @@ void Host_Color_f(void) int playercolor; dfunction_t *f; func_t SV_ChangeTeam; - + if (Cmd_Argc() == 1) { Con_Printf ("\"color\" is \"%i %i\"\n", cl_color.integer >> 4, cl_color.integer & 15); - Con_Printf ("color <0-13> [0-13]\n"); + Con_Printf ("color <0-15> [0-15]\n"); return; } @@ -878,7 +887,7 @@ void Host_Color_f(void) top = atoi(Cmd_Argv(1)); bottom = atoi(Cmd_Argv(2)); } - + top &= 15; // LordHavoc: allow skin colormaps 14 and 15 (was 13) if (top > 15) @@ -887,7 +896,7 @@ void Host_Color_f(void) // LordHavoc: allow skin colormaps 14 and 15 (was 13) if (bottom > 15) bottom = 15; - + playercolor = top*16 + bottom; if (cmd_source == src_command) @@ -898,12 +907,11 @@ void Host_Color_f(void) return; } - // void(float color) SV_ChangeTeam; if ((f = ED_FindFunction ("SV_ChangeTeam")) && (SV_ChangeTeam = (func_t)(f - pr_functions))) { Con_DPrintf("Calling SV_ChangeTeam\n"); pr_global_struct->time = sv.time; - pr_globals[0] = playercolor; + pr_globals[OFS_PARM0] = playercolor; pr_global_struct->self = EDICT_TO_PROG(host_client->edict); PR_ExecuteProgram (SV_ChangeTeam, ""); } @@ -937,7 +945,7 @@ void Host_Kill_f (void) SV_ClientPrintf ("Can't suicide -- already dead!\n"); return; } - + pr_global_struct->time = sv.time; pr_global_struct->self = EDICT_TO_PROG(sv_player); PR_ExecuteProgram (pr_global_struct->ClientKill, "QC function ClientKill is missing"); @@ -1037,7 +1045,8 @@ void Host_Spawn_f (void) // run the entrance script if (sv.loadgame) - { // loaded games are fully inited already + { + // loaded games are fully initialized already // if this is the last client to be connected, unpause sv.paused = false; @@ -1097,7 +1106,7 @@ void Host_Spawn_f (void) MSG_WriteByte (&host_client->message, i); MSG_WriteByte (&host_client->message, client->colors); } - + // send all current light styles for (i=0 ; imessage, STAT_MONSTERS); MSG_WriteLong (&host_client->message, pr_global_struct->killed_monsters); -// // send a fixangle // Never send a roll angle, because savegames can catch the server // in a state where it is expecting the client to correct the angle @@ -1172,11 +1180,11 @@ Kicks a user off of the server */ void Host_Kick_f (void) { - char *who; - char *message = NULL; - client_t *save; - int i; - qboolean byNumber = false; + char *who; + const char *message = NULL; + client_t *save; + int i; + qboolean byNumber = false; if (cmd_source == src_command) { @@ -1215,10 +1223,12 @@ void Host_Kick_f (void) if (i < svs.maxclients) { if (cmd_source == src_command) + { if (cls.state == ca_dedicated) who = "Console"; else who = cl_name.string; + } else who = save->name; @@ -1228,7 +1238,8 @@ void Host_Kick_f (void) if (Cmd_Argc() > 2) { - message = COM_Parse(Cmd_Args()); + message = Cmd_Args(); + COM_ParseToken(&message); if (byNumber) { message++; // skip the # @@ -1264,9 +1275,9 @@ Host_Give_f */ void Host_Give_f (void) { - char *t; - int v; - eval_t *val; + const char *t; + int v; + eval_t *val; if (cmd_source == src_command) { @@ -1665,3 +1676,4 @@ void Host_InitCommands (void) Cmd_AddCommand ("viewnext", Host_Viewnext_f); Cmd_AddCommand ("viewprev", Host_Viewprev_f); } +