]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host_cmd.c
changed particleaccumulator check to use >= 1 instead of > 0, hopefully this will...
[xonotic/darkplaces.git] / host_cmd.c
index 5f93996d0734f199c6f2607757607459b3b2af2a..3c2409e45b86c9df16b1a21fad76b18a25265303 100644 (file)
@@ -22,6 +22,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 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)"};
@@ -969,6 +970,8 @@ void Host_Say(qboolean teamonly)
        // note this uses the chat prefix \001
        if (!fromServer)
                dpsnprintf (text, sizeof(text), "\001%s" STRING_COLOR_DEFAULT_STR ": %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);
        else
                dpsnprintf (text, sizeof(text), "\001<%s" STRING_COLOR_DEFAULT_STR "> %s", hostname.string, p1);
        p2 = text + strlen(text);
@@ -984,7 +987,7 @@ void Host_Say(qboolean teamonly)
        // note: save is not a valid edict if fromServer is true
        save = host_client;
        for (j = 0, host_client = svs.clients;j < svs.maxclients;j++, host_client++)
-               if (host_client->spawned && (!teamonly || host_client->edict->fields.server->team == save->edict->fields.server->team))
+               if (host_client->active && (!teamonly || host_client->edict->fields.server->team == save->edict->fields.server->team))
                        SV_ClientPrint(text);
        host_client = save;
 
@@ -1007,6 +1010,9 @@ void Host_Say_Team_f(void)
 
 void Host_Tell_f(void)
 {
+       const char *playername_start = NULL;
+       size_t playername_length = 0;
+       int playernumber = 0;
        client_t *save;
        int j;
        const char *p1, *p2;
@@ -1024,22 +1030,83 @@ void Host_Tell_f(void)
                }
        }
 
-       if (Cmd_Argc () < 3)
+       if (Cmd_Argc () < 2)
                return;
 
        // note this uses the chat prefix \001
        if (!fromServer)
                sprintf (text, "\001%s tells you: ", host_client->name);
+       else if(*(sv_adminnick.string))
+               sprintf (text, "\001<%s tells you> ", sv_adminnick.string);
        else
                sprintf (text, "\001<%s tells you> ", hostname.string);
 
        p1 = Cmd_Args();
        p2 = p1 + strlen(p1);
        // remove the target name
-       while (p1 < p2 && *p1 != ' ')
+       while (p1 < p2 && *p1 == ' ')
                p1++;
+       if(*p1 == '#')
+       {
+               ++p1;
+               while (p1 < p2 && *p1 == ' ')
+                       p1++;
+               while (p1 < p2 && isdigit(*p1))
+               {
+                       playernumber = playernumber * 10 + (*p1 - '0');
+                       p1++;
+               }
+               --playernumber;
+       }
+       else if(*p1 == '"')
+       {
+               ++p1;
+               playername_start = p1;
+               while (p1 < p2 && *p1 != '"')
+                       p1++;
+               playername_length = p1 - playername_start;
+               if(p1 < p2)
+                       p1++;
+       }
+       else
+       {
+               playername_start = p1;
+               while (p1 < p2 && *p1 != ' ')
+                       p1++;
+               playername_length = p1 - playername_start;
+       }
        while (p1 < p2 && *p1 == ' ')
                p1++;
+       if(playername_start)
+       {
+               // set playernumber to the right client
+               char namebuf[128];
+               if(playername_length >= sizeof(namebuf))
+               {
+                       if (fromServer)
+                               Con_Print("Host_Tell: too long player name/ID\n");
+                       else
+                               SV_ClientPrint("Host_Tell: too long player name/ID\n");
+                       return;
+               }
+               memcpy(namebuf, playername_start, playername_length);
+               namebuf[playername_length] = 0;
+               for (playernumber = 0; playernumber < svs.maxclients; playernumber++)
+               {
+                       if (!svs.clients[playernumber].active)
+                               continue;
+                       if (strcasecmp(svs.clients[playernumber].name, namebuf) == 0)
+                               break;
+               }
+       }
+       if(playernumber < 0 || playernumber >= svs.maxclients || !(svs.clients[playernumber].active))
+       {
+               if (fromServer)
+                       Con_Print("Host_Tell: invalid player name/ID\n");
+               else
+                       SV_ClientPrint("Host_Tell: invalid player name/ID\n");
+               return;
+       }
        // remove trailing newlines
        while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r'))
                p2--;
@@ -1056,15 +1123,16 @@ void Host_Tell_f(void)
        }
        while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r'))
                p2--;
+       if(p1 == p2)
+               return; // empty say
        for (j = (int)strlen(text);j < (int)(sizeof(text) - 2) && p1 < p2;)
                text[j++] = *p1++;
        text[j++] = '\n';
        text[j++] = 0;
 
        save = host_client;
-       for (j = 0, host_client = svs.clients;j < svs.maxclients;j++, host_client++)
-               if (host_client->spawned && !strcasecmp(host_client->name, Cmd_Argv(1)))
-                       SV_ClientPrint(text);
+       host_client = svs.clients + playernumber;
+       SV_ClientPrint(text);
        host_client = save;
 }
 
@@ -2419,5 +2487,6 @@ void Host_InitCommands (void)
        Cvar_RegisterVariable (&noaim);
 
        Cvar_RegisterVariable(&sv_cheats);
+       Cvar_RegisterVariable(&sv_adminnick);
 }