X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=host_cmd.c;h=463fb7293bd971699ec8ce0fe4d70eac42f15708;hb=1ca9043187a8f6406182e1056fb7edab4895c82e;hp=eb23e394364c4734c3f77feda227bfa52724c133;hpb=00d8da42f76d5e04a9d11e0deaac38391132808a;p=xonotic%2Fdarkplaces.git diff --git a/host_cmd.c b/host_cmd.c index eb23e394..463fb729 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -46,7 +46,6 @@ void Host_Quit_f (void) Sys_Quit (0); } - /* ================== Host_Status_f @@ -81,6 +80,7 @@ void Host_Status_f (void) print ("version: %s build %s\n", gamename, buildstring); print ("protocol: %i (%s)\n", Protocol_NumberForEnum(sv.protocol), Protocol_NameForEnum(sv.protocol)); print ("map: %s\n", sv.name); + print ("timing: %s\n", Host_TimingReport()); print ("players: %i active (%i max)\n\n", players, svs.maxclients); for (j = 0, client = svs.clients;j < svs.maxclients;j++, client++) { @@ -97,7 +97,7 @@ void Host_Status_f (void) } else hours = 0; - print ("#%-3u %-16.16s^%i %3i %2i:%02i:%02i\n", j+1, client->name, STRING_COLOR_DEFAULT, client->frags, hours, minutes, seconds); + print ("#%-3u %-16.16s %3i %2i:%02i:%02i\n", j+1, client->name, client->frags, hours, minutes, seconds); print (" %s\n", client->netconnection ? client->netconnection->address : "botclient"); } } @@ -230,7 +230,8 @@ void Host_Ping_f (void) } // now call the Pings command also, which will send a report that contains packet loss for the scoreboard (as well as a simpler ping report) - Host_Pings_f(); + // actually, don't, it confuses old clients (resulting in "unknown command pingplreport" flooding the console) + //Host_Pings_f(); } /* @@ -427,33 +428,6 @@ 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 ; ifields.server->deadflag) { - if (i > 0) - { - Con_Print("Can't save multiplayer games.\n"); - return; - } - if (svs.clients[i].edict->fields.server->deadflag) - { - Con_Print("Can't savegame with a dead player\n"); - return; - } + Con_Print("Can't savegame with a dead player\n"); + return; } } + else + Con_Print("Warning: saving a multiplayer game may have strange results when restored (to properly resume, all players must join in the same player slots and then the game can be reloaded).\n"); if (Cmd_Argc() != 2) { @@ -518,8 +487,19 @@ void Host_Savegame_f (void) return; } + SV_VM_Begin(); + FS_Printf(f, "%i\n", SAVEGAME_VERSION); - Host_SavegameComment (comment); + + memset(comment, 0, sizeof(comment)); + sprintf(comment, "%-21s kills:%3i/%3i", PRVM_GetString(prog->edicts->fields.server->message), (int)prog->globals.server->killed_monsters, (int)prog->globals.server->total_monsters); + // convert space to _ to make stdio happy + // LordHavoc: convert control characters to _ as well + for (i=0 ; inum_edicts ; i++) PRVM_ED_Write (f, PRVM_EDICT_NUM(i)); @@ -724,7 +702,7 @@ void Host_Loadgame_f (void) SV_VM_End(); // make sure we're connected to loopback - if (cls.state == ca_disconnected || !(cls.state == ca_connected && cls.netcon != NULL && LHNETADDRESS_GetAddressType(&cls.netcon->peeraddress) == LHNETADDRESSTYPE_LOOP)) + if (sv.active && cls.state == ca_disconnected) CL_EstablishConnection("local:1"); } @@ -753,11 +731,6 @@ void Host_Name_f (void) else strlcpy (newName, Cmd_Args(), sizeof (newName)); - for (i = 0, j = 0;newName[i];i++) - if (newName[i] != '\r' && newName[i] != '\n') - newName[j++] = newName[i]; - newName[j] = 0; - if (cmd_source == src_command) { Cvar_Set ("_cl_name", newName); @@ -775,6 +748,11 @@ void Host_Name_f (void) // point the string back at updateclient->name to keep it safe strlcpy (host_client->name, newName, sizeof (host_client->name)); + for (i = 0, j = 0;host_client->name[i];i++) + if (host_client->name[i] != '\r' && host_client->name[i] != '\n') + host_client->name[j++] = host_client->name[i]; + host_client->name[j] = 0; + COM_StringLengthNoColors(host_client->name, 0, &valid_colors); if(!valid_colors) // NOTE: this also proves the string is not empty, as "" is a valid colored string { @@ -795,11 +773,36 @@ void Host_Name_f (void) } } + // find the last color tag offset and decide if we need to add a reset tag + for (i = 0, j = -1;host_client->name[i];i++) + { + if (host_client->name[i] == STRING_COLOR_TAG) + { + if (host_client->name[i+1] >= '0' && host_client->name[i+1] <= '9') + { + j = i; + // if this happens to be a reset tag then we don't need one + if (host_client->name[i+1] == '0' + STRING_COLOR_DEFAULT) + j = -1; + i++; + continue; + } + if (host_client->name[i+1] == STRING_COLOR_TAG) + { + i++; + continue; + } + } + } + // does not end in the default color string, so add it + if (j >= 0 && strlen(host_client->name) < sizeof(host_client->name) - 2) + memcpy(host_client->name + strlen(host_client->name), STRING_COLOR_DEFAULT_STR, strlen(STRING_COLOR_DEFAULT_STR) + 1); + host_client->edict->fields.server->netname = PRVM_SetEngineString(host_client->name); if (strcmp(host_client->old_name, host_client->name)) { if (host_client->spawned) - SV_BroadcastPrintf("%s^%i changed name to %s\n", host_client->old_name, STRING_COLOR_DEFAULT, host_client->name); + SV_BroadcastPrintf("%s changed name to %s\n", host_client->old_name, host_client->name); strlcpy(host_client->old_name, host_client->name, sizeof(host_client->old_name)); // send notification to all clients MSG_WriteByte (&sv.reliable_datagram, svc_updatename); @@ -969,13 +972,13 @@ void Host_Say(qboolean teamonly) } // note this uses the chat prefix \001 if (!fromServer && !teamonly) - dpsnprintf (text, sizeof(text), "\001%s" STRING_COLOR_DEFAULT_STR ": %s", host_client->name, p1); + dpsnprintf (text, sizeof(text), "\001%s: %s", host_client->name, p1); else if (!fromServer && teamonly) - dpsnprintf (text, sizeof(text), "\001(%s" STRING_COLOR_DEFAULT_STR "): %s", host_client->name, p1); + dpsnprintf (text, sizeof(text), "\001(%s): %s", host_client->name, p1); else if(*(sv_adminnick.string)) - dpsnprintf (text, sizeof(text), "\001<%s" STRING_COLOR_DEFAULT_STR "> %s", sv_adminnick.string, p1); + dpsnprintf (text, sizeof(text), "\001<%s> %s", sv_adminnick.string, p1); else - dpsnprintf (text, sizeof(text), "\001<%s" STRING_COLOR_DEFAULT_STR "> %s", hostname.string, p1); + dpsnprintf (text, sizeof(text), "\001<%s> %s", hostname.string, p1); p2 = text + strlen(text); while ((const char *)p2 > (const char *)text && (p2[-1] == '\r' || p2[-1] == '\n' || (p2[-1] == '\"' && quoted))) { @@ -1247,7 +1250,7 @@ void Host_BottomColor_f(void) Host_Color(-1, atoi(Cmd_Argv(1))); } -cvar_t cl_rate = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_rate", "10000", "internal storage cvar for current rate (changed by rate command)"}; +cvar_t cl_rate = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_rate", "20000", "internal storage cvar for current rate (changed by rate command)"}; void Host_Rate_f(void) { int rate; @@ -1363,6 +1366,7 @@ void Host_PreSpawn_f (void) SZ_Write (&host_client->netconnection->message, sv.signon.data, sv.signon.cursize); MSG_WriteByte (&host_client->netconnection->message, svc_signonnum); MSG_WriteByte (&host_client->netconnection->message, 2); + host_client->sendsignon = 0; // enable unlimited sends again } // reset the name change timer because the client will send name soon @@ -1425,7 +1429,7 @@ void Host_Spawn_f (void) PRVM_ExecuteProgram (prog->globals.server->ClientConnect, "QC function ClientConnect is missing"); if (svs.maxclients > 1 || cls.state == ca_dedicated) - Con_Printf("%s^%i entered the game\n", host_client->name, STRING_COLOR_DEFAULT); + Con_Printf("%s entered the game\n", host_client->name); PRVM_ExecuteProgram (prog->globals.server->PutClientInServer, "QC function PutClientInServer is missing"); } @@ -1991,9 +1995,9 @@ void Host_SendCvar_f (void) // LordHavoc: if there is no such cvar or if it is private, send a // reply indicating that it has no value if(!c || (c->flags & CVAR_PRIVATE)) - Cmd_ForwardStringToServer(va("sentcvar %s\n", cvarname)); + Cmd_ForwardStringToServer(va("sentcvar %s", cvarname)); else - Cmd_ForwardStringToServer(va("sentcvar %s \"%s\"\n", c->name, c->string)); + Cmd_ForwardStringToServer(va("sentcvar %s \"%s\"", c->name, c->string)); return; } if(!sv.active)// || !prog->funcoffsets.SV_ParseClientCommand)