]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host_cmd.c
only enable nonpoweroftwo textures if GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB > 0 ...
[xonotic/darkplaces.git] / host_cmd.c
index b5a4047b2bbc17e69a295a97dfc0de4ea636f09a..d77264f192eac4be61ea5d735a8c78c74ebe1667 100644 (file)
@@ -26,6 +26,7 @@ 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 sv_status_show_qcstatus = {CVAR_SAVE, "sv_status_show_qcstatus", "0", "show the 'qcstatus' field in status replies, not the 'frags' field. Turn this on if your mod uses this field, and the 'frags' field on the other hand has no meaningful value."};
 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)"};
@@ -58,11 +59,13 @@ Host_Status_f
 */
 void Host_Status_f (void)
 {
+       char qcstatus[256];
        client_t *client;
        int seconds = 0, minutes = 0, hours = 0, i, j, k, in, players, ping = 0, packetloss = 0;
        void (*print) (const char *fmt, ...);
        char ip[22];
-       
+       int frags;
+
        if (cmd_source == src_command)
        {
                // if running a client, try to send over network so the client's status report parser will see the report
@@ -79,6 +82,9 @@ void Host_Status_f (void)
        if (!sv.active)
                return;
        
+       if(cmd_source == src_command)
+               SV_VM_Begin();
+       
        in = 0;
        if (Cmd_Argc() == 2)
        {
@@ -137,12 +143,31 @@ void Host_Status_f (void)
                        strlcpy(ip, client->netconnection ? "hidden" : "botclient" , 22);
                else
                        strlcpy(ip, (client->netconnection && client->netconnection->address) ? client->netconnection->address : "botclient", 22);
+
+               frags = client->frags;
+
+               if(sv_status_show_qcstatus.integer && prog->fieldoffsets.clientstatus >= 0)
+               {
+                       const char *str = PRVM_E_STRING(PRVM_EDICT_NUM(i + 1), prog->fieldoffsets.clientstatus);
+                       if(str && *str)
+                       {
+                               char *p;
+                               const char *q;
+                               p = qcstatus;
+                               for(q = str; *q && p != qcstatus + sizeof(qcstatus) - 1; ++q)
+                                       if(*q != '\\' && *q != '"' && !ISWHITESPACE(*q))
+                                               *p++ = *q;
+                               *p = 0;
+                               if(*qcstatus)
+                                       frags = atoi(qcstatus);
+                       }
+               }
                
                if (in == 0) // default layout
                {
                        print ("#%-3u ", i+1);
-                       print ("%-16.16s  ", client->name);
-                       print ("%3i  ", client->frags);
+                       print ("%-16.16s ", client->name);
+                       print ("%4i  ", frags);
                        print ("%2i:%02i:%02i\n   ", hours, minutes, seconds);
                        print ("%s\n", ip);
                }
@@ -153,7 +178,7 @@ void Host_Status_f (void)
                        print ("%2i ", packetloss);
                        print ("%4i ", ping);
                        print ("%2i:%02i:%02i ", hours, minutes, seconds);
-                       print ("%4i  ", client->frags);
+                       print ("%4i  ", frags);
                        print ("#%-3u ", i+1);
                        print ("^7%s\n", client->name);
                }
@@ -165,6 +190,9 @@ void Host_Status_f (void)
                        print ("^7%s\n", client->name);
                }
        }
+
+       if(cmd_source == src_command)
+               SV_VM_End();
 }
 
 
@@ -335,6 +363,14 @@ void Host_Map_f (void)
        CL_Disconnect ();
        Host_ShutdownServer();
 
+       if(svs.maxclients != svs.maxclients_next)
+       {
+               svs.maxclients = svs.maxclients_next;
+               if (svs.clients)
+                       Mem_Free(svs.clients);
+               svs.clients = (client_t *)Mem_Alloc(sv_mempool, sizeof(client_t) * svs.maxclients);
+       }
+
        // remove menu
        key_dest = key_game;
 
@@ -530,7 +566,7 @@ void Host_Savegame_to (const char *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] <= ' ')
+               if (ISWHITESPACEORCONTROL(comment[i]))
                        comment[i] = '_';
        comment[SAVEGAME_COMMENT_LENGTH] = '\0';
 
@@ -1020,6 +1056,12 @@ void Host_Name_f (void)
                                i++;
                                continue;
                        }
+                       if (host_client->name[i+1] == STRING_COLOR_RGB_TAG_CHAR && isxdigit(host_client->name[i+2]) && isxdigit(host_client->name[i+3]) && isxdigit(host_client->name[i+4]))
+                       {
+                               j = i;
+                               i += 4;
+                               continue;
+                       }
                        if (host_client->name[i+1] == STRING_COLOR_TAG)
                        {
                                i++;
@@ -1035,7 +1077,7 @@ void Host_Name_f (void)
        if (strcmp(host_client->old_name, host_client->name))
        {
                if (host_client->spawned)
-                       SV_BroadcastPrintf("%s changed name to %s\n", host_client->old_name, host_client->name);
+                       SV_BroadcastPrintf("%s ^7changed 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);
@@ -2267,24 +2309,21 @@ static void MaxPlayers_f(void)
 
        if (Cmd_Argc() != 2)
        {
-               Con_Printf("\"maxplayers\" is \"%u\"\n", svs.maxclients);
+               Con_Printf("\"maxplayers\" is \"%u\"\n", svs.maxclients_next);
                return;
        }
 
        if (sv.active)
        {
                Con_Print("maxplayers can not be changed while a server is running.\n");
-               return;
+               Con_Print("It will be changed on next server startup (\"map\" command).\n");
        }
 
        n = atoi(Cmd_Argv(1));
        n = bound(1, n, MAX_SCOREBOARD);
        Con_Printf("\"maxplayers\" set to \"%u\"\n", n);
 
-       if (svs.clients)
-               Mem_Free(svs.clients);
-       svs.maxclients = n;
-       svs.clients = (client_t *)Mem_Alloc(sv_mempool, sizeof(client_t) * svs.maxclients);
+       svs.maxclients_next = n;
        if (n == 1)
                Cvar_Set ("deathmatch", "0");
        else
@@ -2317,7 +2356,7 @@ void Host_Rcon_f (void) // credit: taken from QuakeWorld
 
        for (i = 0;rcon_password.string[i];i++)
        {
-               if (rcon_password.string[i] <= ' ')
+               if (ISWHITESPACE(rcon_password.string[i]))
                {
                        Con_Printf("rcon_password is not allowed to have any whitespace.\n");
                        return;
@@ -2740,6 +2779,7 @@ void Host_InitCommands (void)
        Cvar_RegisterVariable(&sv_cheats);
        Cvar_RegisterVariable(&sv_adminnick);
        Cvar_RegisterVariable(&sv_status_privacy);
+       Cvar_RegisterVariable(&sv_status_show_qcstatus);
 }
 
 void Host_NoOperation_f(void)