]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host_cmd.c
bound by 0.1 again (this bounding had its reason) AND by sv_clmovement_waitforinput...
[xonotic/darkplaces.git] / host_cmd.c
index cb83f33721e7ea7a10e6de71af07516a446268d0..93d4cb097b3a4946a9d7963a346d8a921adaf103 100644 (file)
@@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 int current_skill;
 cvar_t sv_cheats = {0, "sv_cheats", "0", "enables cheat commands in any game, and cheat impulses in dpmod"};
 cvar_t sv_adminnick = {CVAR_SAVE, "sv_adminnick", "", "nick name to use for admin messages instead of host name"};
+cvar_t sv_status_privacy = {CVAR_SAVE, "sv_status_privacy", "0", "do not show IP addresses in 'status' replies to clients"};
 cvar_t rcon_password = {CVAR_PRIVATE, "rcon_password", "", "password to authenticate rcon commands"};
 cvar_t rcon_address = {0, "rcon_address", "", "server address to send rcon commands to (when not connected to a server)"};
 cvar_t team = {CVAR_USERINFO | CVAR_SAVE, "team", "none", "QW team (4 character limit, example: blue)"};
@@ -101,7 +102,10 @@ void Host_Status_f (void)
                else
                        hours = 0;
                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");
+               if(sv_status_privacy.integer && cmd_source != src_command)
+                       print ("   %s\n", client->netconnection ? "hidden" : "botclient");
+               else
+                       print ("   %s\n", client->netconnection ? client->netconnection->address : "botclient");
        }
 }
 
@@ -435,6 +439,75 @@ LOAD / SAVE GAME
 
 #define        SAVEGAME_VERSION        5
 
+void Host_Savegame_to (const char *name)
+{
+       qfile_t *f;
+       int             i;
+       char    comment[SAVEGAME_COMMENT_LENGTH+1];
+       qboolean isserver;
+
+       isserver = !strcmp(PRVM_NAME, "server");
+
+       Con_Printf("Saving game to %s...\n", name);
+       f = FS_OpenRealFile(name, "wb", false);
+       if (!f)
+       {
+               Con_Print("ERROR: couldn't open.\n");
+               return;
+       }
+
+       FS_Printf(f, "%i\n", SAVEGAME_VERSION);
+
+       memset(comment, 0, sizeof(comment));
+       if(isserver)
+               dpsnprintf(comment, sizeof(comment), "%-21.21s kills:%3i/%3i", PRVM_GetString(prog->edicts->fields.server->message), (int)prog->globals.server->killed_monsters, (int)prog->globals.server->total_monsters);
+       else
+               dpsnprintf(comment, sizeof(comment), "(crash dump of %s progs)", PRVM_NAME);
+       // convert space to _ to make stdio happy
+       // LordHavoc: convert control characters to _ as well
+       for (i=0 ; i<SAVEGAME_COMMENT_LENGTH ; i++)
+               if (comment[i] <= ' ')
+                       comment[i] = '_';
+       comment[SAVEGAME_COMMENT_LENGTH] = '\0';
+
+       FS_Printf(f, "%s\n", comment);
+       if(isserver)
+       {
+               for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
+                       FS_Printf(f, "%f\n", svs.clients[0].spawn_parms[i]);
+               FS_Printf(f, "%d\n", current_skill);
+               FS_Printf(f, "%s\n", sv.name);
+               FS_Printf(f, "%f\n",sv.time);
+       }
+       else
+       {
+               for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
+                       FS_Printf(f, "(dummy)\n");
+               FS_Printf(f, "%d\n", 0);
+               FS_Printf(f, "%s\n", "(dummy)");
+               FS_Printf(f, "%f\n", realtime);
+       }
+
+       // write the light styles
+       for (i=0 ; i<MAX_LIGHTSTYLES ; i++)
+       {
+               if (isserver && sv.lightstyles[i][0])
+                       FS_Printf(f, "%s\n", sv.lightstyles[i]);
+               else
+                       FS_Print(f,"m\n");
+       }
+
+       PRVM_ED_WriteGlobals (f);
+       for (i=0 ; i<prog->num_edicts ; i++)
+       {
+               //Con_Printf("edict %d...\n", i);
+               PRVM_ED_Write (f, PRVM_EDICT_NUM(i));
+       }
+
+       FS_Close (f);
+       Con_Print("done.\n");
+}
+
 /*
 ===============
 Host_Savegame_f
@@ -443,9 +516,6 @@ Host_Savegame_f
 void Host_Savegame_f (void)
 {
        char    name[MAX_QPATH];
-       qfile_t *f;
-       int             i;
-       char    comment[SAVEGAME_COMMENT_LENGTH+1];
 
        if (!sv.active)
        {
@@ -486,51 +556,9 @@ void Host_Savegame_f (void)
        strlcpy (name, Cmd_Argv(1), sizeof (name));
        FS_DefaultExtension (name, ".sav", sizeof (name));
 
-       Con_Printf("Saving game to %s...\n", name);
-       f = FS_Open (name, "wb", false, false);
-       if (!f)
-       {
-               Con_Print("ERROR: couldn't open.\n");
-               return;
-       }
-
        SV_VM_Begin();
-
-       FS_Printf(f, "%i\n", SAVEGAME_VERSION);
-
-       memset(comment, 0, sizeof(comment));
-       sprintf(comment, "%-21.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 ; i<SAVEGAME_COMMENT_LENGTH ; i++)
-               if (comment[i] <= ' ')
-                       comment[i] = '_';
-       comment[SAVEGAME_COMMENT_LENGTH] = '\0';
-
-       FS_Printf(f, "%s\n", comment);
-       for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
-               FS_Printf(f, "%f\n", svs.clients[0].spawn_parms[i]);
-       FS_Printf(f, "%d\n", current_skill);
-       FS_Printf(f, "%s\n", sv.name);
-       FS_Printf(f, "%f\n",sv.time);
-
-       // write the light styles
-       for (i=0 ; i<MAX_LIGHTSTYLES ; i++)
-       {
-               if (sv.lightstyles[i][0])
-                       FS_Printf(f, "%s\n", sv.lightstyles[i]);
-               else
-                       FS_Print(f,"m\n");
-       }
-
-       PRVM_ED_WriteGlobals (f);
-       for (i=0 ; i<prog->num_edicts ; i++)
-               PRVM_ED_Write (f, PRVM_EDICT_NUM(i));
-
+       Host_Savegame_to(name);
        SV_VM_End();
-
-       FS_Close (f);
-       Con_Print("done.\n");
 }
 
 
@@ -767,6 +795,15 @@ void Host_Name_f (void)
                        host_client->name[j++] = host_client->name[i];
        host_client->name[j] = 0;
 
+       if(host_client->name[0] == 1 || host_client->name[0] == 2)
+       // may interfere with chat area, and will needlessly beep; so let's add a ^7
+       {
+               memmove(host_client->name + 2, host_client->name, sizeof(host_client->name) - 2);
+               host_client->name[sizeof(host_client->name) - 1] = 0;
+               host_client->name[0] = STRING_COLOR_TAG;
+               host_client->name[1] = '0' + STRING_COLOR_DEFAULT;
+       }
+
        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
        {
@@ -1055,11 +1092,11 @@ void Host_Tell_f(void)
 
        // note this uses the chat prefix \001
        if (!fromServer)
-               sprintf (text, "\001%s tells you: ", host_client->name);
+               dpsnprintf (text, sizeof(text), "\001%s tells you: ", host_client->name);
        else if(*(sv_adminnick.string))
-               sprintf (text, "\001<%s tells you> ", sv_adminnick.string);
+               dpsnprintf (text, sizeof(text), "\001<%s tells you> ", sv_adminnick.string);
        else
-               sprintf (text, "\001<%s tells you> ", hostname.string);
+               dpsnprintf (text, sizeof(text), "\001<%s tells you> ", hostname.string);
 
        p1 = Cmd_Args();
        p2 = p1 + strlen(p1);
@@ -1812,7 +1849,7 @@ Host_Viewmodel_f
 void Host_Viewmodel_f (void)
 {
        prvm_edict_t    *e;
-       model_t *m;
+       dp_model_t      *m;
 
        if (!sv.active)
                return;
@@ -1843,7 +1880,7 @@ void Host_Viewframe_f (void)
 {
        prvm_edict_t    *e;
        int             f;
-       model_t *m;
+       dp_model_t      *m;
 
        if (!sv.active)
                return;
@@ -1863,7 +1900,7 @@ void Host_Viewframe_f (void)
 }
 
 
-void PrintFrameName (model_t *m, int frame)
+void PrintFrameName (dp_model_t *m, int frame)
 {
        if (m->animscenes)
                Con_Printf("frame %i: %s\n", frame, m->animscenes[frame].name);
@@ -1879,7 +1916,7 @@ Host_Viewnext_f
 void Host_Viewnext_f (void)
 {
        prvm_edict_t    *e;
-       model_t *m;
+       dp_model_t      *m;
 
        if (!sv.active)
                return;
@@ -1906,7 +1943,7 @@ Host_Viewprev_f
 void Host_Viewprev_f (void)
 {
        prvm_edict_t    *e;
-       model_t *m;
+       dp_model_t      *m;
 
        if (!sv.active)
                return;
@@ -1953,7 +1990,7 @@ void Host_Startdemos_f (void)
                Con_Printf("Max %i demos in demoloop\n", MAX_DEMOS);
                c = MAX_DEMOS;
        }
-       Con_Printf("%i demo(s) in loop\n", c);
+       Con_DPrintf("%i demo(s) in loop\n", c);
 
        for (i=1 ; i<c+1 ; i++)
                strlcpy (cls.demos[i-1], Cmd_Argv(i), sizeof (cls.demos[i-1]));
@@ -2520,5 +2557,9 @@ void Host_InitCommands (void)
 
        Cvar_RegisterVariable(&sv_cheats);
        Cvar_RegisterVariable(&sv_adminnick);
+       Cvar_RegisterVariable(&sv_status_privacy);
 }
 
+void Host_NoOperation_f(void)
+{
+}