]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host_cmd.c
independent volume control for the 8 entity channels
[xonotic/darkplaces.git] / host_cmd.c
index 5e4b14764bf5bc32a94216063f3c39a9a4afb0a6..1a1b3d8d3916dc1fd4d08205e6a8bc7fd1271b24 100644 (file)
@@ -435,6 +435,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_Open (name, "wb", false, 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 +512,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 +552,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 +791,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 +1088,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 +1845,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 +1876,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 +1896,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 +1912,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 +1939,7 @@ Host_Viewprev_f
 void Host_Viewprev_f (void)
 {
        prvm_edict_t    *e;
-       model_t *m;
+       dp_model_t      *m;
 
        if (!sv.active)
                return;