]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host_cmd.c
cleaned up qw-related todo items and added some newly discovered qw issues
[xonotic/darkplaces.git] / host_cmd.c
index 4920a35a330ac79ff513ab4db29479a9aff6db51..463fb7293bd971699ec8ce0fe4d70eac42f15708 100644 (file)
@@ -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++)
        {
@@ -428,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 ; i<SAVEGAME_COMMENT_LENGTH ; i++)
-               text[i] = ' ';
-       // LordHavoc: added min() to prevent overflow
-       memcpy (text, cl.levelname, min(strlen(cl.levelname), SAVEGAME_COMMENT_LENGTH));
-       sprintf (kills,"kills:%3i/%3i", cl.stats[STAT_MONSTERS], cl.stats[STAT_TOTALMONSTERS]);
-       memcpy (text+22, kills, strlen(kills));
-       // convert space to _ to make stdio happy
-       // LordHavoc: convert control characters to _ as well
-       for (i=0 ; i<SAVEGAME_COMMENT_LENGTH ; i++)
-               if (text[i] <= ' ')
-                       text[i] = '_';
-       text[SAVEGAME_COMMENT_LENGTH] = '\0';
-}
-
-
 /*
 ===============
 Host_Savegame_f
@@ -467,34 +440,29 @@ void Host_Savegame_f (void)
        int             i;
        char    comment[SAVEGAME_COMMENT_LENGTH+1];
 
-       if (cls.state != ca_connected || !sv.active)
+       if (!sv.active)
        {
-               Con_Print("Not playing a local game.\n");
+               Con_Print("Can't save - no server running.\n");
                return;
        }
 
-       if (cl.intermission)
+       if (cl.islocalgame)
        {
-               Con_Print("Can't save in intermission.\n");
-               return;
-       }
+               // singleplayer checks
+               if (cl.intermission)
+               {
+                       Con_Print("Can't save in intermission.\n");
+                       return;
+               }
 
-       for (i = 0;i < svs.maxclients;i++)
-       {
-               if (svs.clients[i].active)
+               if (svs.clients[0].active && svs.clients[0].edict->fields.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)
        {
@@ -519,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 ; 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]);
@@ -537,8 +516,6 @@ void Host_Savegame_f (void)
                        FS_Print(f,"m\n");
        }
 
-       SV_VM_Begin();
-
        PRVM_ED_WriteGlobals (f);
        for (i=0 ; i<prog->num_edicts ; i++)
                PRVM_ED_Write (f, PRVM_EDICT_NUM(i));
@@ -725,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");
 }
 
@@ -754,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);
@@ -776,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
        {
@@ -1389,7 +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 = true;         // send this message, this will be cleared later
+               host_client->sendsignon = 0;            // enable unlimited sends again
        }
 
        // reset the name change timer because the client will send name soon
@@ -1533,7 +1510,6 @@ void Host_Spawn_f (void)
 
        MSG_WriteByte (&host_client->netconnection->message, svc_signonnum);
        MSG_WriteByte (&host_client->netconnection->message, 3);
-       host_client->sendsignon = true;         // send this message, this will be cleared later
 }
 
 /*