]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
Win32: ioctl SIO_UDP_CONNRESET <- FALSE
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 7a4c5c17ee7a4ef94510b5bb93e04816876b0c7e..00aa78ba00bda6298494e3cfc82bf98c3da610de 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -159,6 +159,8 @@ void Cbuf_Execute (void)
                {
                        if (text[i] == '"')
                                quotes ^= 1;
+                       if (text[i] == '\\' && text[i+1] == '"')
+                               i++;
                        if ( !quotes &&  text[i] == ';')
                                break;  // don't break if inside a quoted string
                        if (text[i] == '\r' || text[i] == '\n')
@@ -566,7 +568,7 @@ static void Cmd_PreprocessString( const char *intext, char *outtext, unsigned ma
                                cvar_t *cvar;
                                const char *tempin = in;
 
-                               COM_ParseTokenConsole( &tempin );
+                               COM_ParseToken_Console( &tempin );
                                // don't expand rcon_password or similar cvars (CVAR_PRIVATE flag)
                                if ((cvar = Cvar_FindVar(&com_token[0])) && !(cvar->flags & CVAR_PRIVATE)) {
                                        const char *cvarcontent = cvar->string;
@@ -776,7 +778,7 @@ static void Cmd_TokenizeString (const char *text)
                if (cmd_argc == 1)
                        cmd_args = text;
 
-               if (!COM_ParseTokenConsole(&text))
+               if (!COM_ParseToken_Console(&text))
                        return;
 
                if (cmd_argc < MAX_ARGS)
@@ -1169,6 +1171,7 @@ Sends an entire command string over to the server, unprocessed
 */
 void Cmd_ForwardStringToServer (const char *s)
 {
+       char temp[128];
        if (cls.state != ca_connected)
        {
                Con_Printf("Can't \"%s\", not connected\n", s);
@@ -1185,7 +1188,105 @@ void Cmd_ForwardStringToServer (const char *s)
                MSG_WriteByte(&cls.netcon->message, qw_clc_stringcmd);
        else
                MSG_WriteByte(&cls.netcon->message, clc_stringcmd);
-       SZ_Write(&cls.netcon->message, (const unsigned char *)s, (int)strlen(s) + 1);
+       if ((!strncmp(s, "say ", 4) || !strncmp(s, "say_team ", 9)) && cl_locs_enable.integer)
+       {
+               // say/say_team commands can replace % character codes with status info
+               while (*s)
+               {
+                       if (*s == '%' && s[1])
+                       {
+                               // handle proquake message macros
+                               temp[0] = 0;
+                               switch (s[1])
+                               {
+                               case 'l': // current location
+                                       CL_Locs_FindLocationName(temp, sizeof(temp), cl.movement_origin);
+                                       break;
+                               case 'h': // current health
+                                       dpsnprintf(temp, sizeof(temp), "%i", cl.stats[STAT_HEALTH]);
+                                       break;
+                               case 'a': // current armor
+                                       dpsnprintf(temp, sizeof(temp), "%i", cl.stats[STAT_ARMOR]);
+                                       break;
+                               case 'x': // current rockets
+                                       dpsnprintf(temp, sizeof(temp), "%i", cl.stats[STAT_ROCKETS]);
+                                       break;
+                               case 'c': // current cells
+                                       dpsnprintf(temp, sizeof(temp), "%i", cl.stats[STAT_CELLS]);
+                                       break;
+                               // silly proquake macros
+                               case 'd': // loc at last death
+                                       CL_Locs_FindLocationName(temp, sizeof(temp), cl.lastdeathorigin);
+                                       break;
+                               case 't': // current time
+                                       dpsnprintf(temp, sizeof(temp), "%.0f:%.0f", floor(cl.time / 60), cl.time - floor(cl.time / 60) * 60);
+                                       break;
+                               case 'r': // rocket launcher status ("I have RL", "I need rockets", "I need RL")
+                                       if (!(cl.stats[STAT_ITEMS] & IT_ROCKET_LAUNCHER))
+                                               dpsnprintf(temp, sizeof(temp), "I need RL");
+                                       else if (!cl.stats[STAT_ROCKETS])
+                                               dpsnprintf(temp, sizeof(temp), "I need rockets");
+                                       else
+                                               dpsnprintf(temp, sizeof(temp), "I have RL");
+                                       break;
+                               case 'p': // powerup status (outputs "quad" "pent" and "eyes" according to status)
+                                       if (cl.stats[STAT_ITEMS] & IT_QUAD)
+                                       {
+                                               if (temp[0])
+                                                       strlcat(temp, " ", sizeof(temp));
+                                               strlcat(temp, "quad", sizeof(temp));
+                                       }
+                                       if (cl.stats[STAT_ITEMS] & IT_INVULNERABILITY)
+                                       {
+                                               if (temp[0])
+                                                       strlcat(temp, " ", sizeof(temp));
+                                               strlcat(temp, "pent", sizeof(temp));
+                                       }
+                                       if (cl.stats[STAT_ITEMS] & IT_INVISIBILITY)
+                                       {
+                                               if (temp[0])
+                                                       strlcat(temp, " ", sizeof(temp));
+                                               strlcat(temp, "eyes", sizeof(temp));
+                                       }
+                                       break;
+                               case 'w': // weapon status (outputs "SSG:NG:SNG:GL:RL:LG" with the text between : characters omitted if you lack the weapon)
+                                       if (cl.stats[STAT_ITEMS] & IT_SUPER_SHOTGUN)
+                                               strlcat(temp, "SSG", sizeof(temp));
+                                       strlcat(temp, ":", sizeof(temp));
+                                       if (cl.stats[STAT_ITEMS] & IT_NAILGUN)
+                                               strlcat(temp, "NG", sizeof(temp));
+                                       strlcat(temp, ":", sizeof(temp));
+                                       if (cl.stats[STAT_ITEMS] & IT_SUPER_NAILGUN)
+                                               strlcat(temp, "SNG", sizeof(temp));
+                                       strlcat(temp, ":", sizeof(temp));
+                                       if (cl.stats[STAT_ITEMS] & IT_GRENADE_LAUNCHER)
+                                               strlcat(temp, "GL", sizeof(temp));
+                                       strlcat(temp, ":", sizeof(temp));
+                                       if (cl.stats[STAT_ITEMS] & IT_ROCKET_LAUNCHER)
+                                               strlcat(temp, "RL", sizeof(temp));
+                                       strlcat(temp, ":", sizeof(temp));
+                                       if (cl.stats[STAT_ITEMS] & IT_LIGHTNING)
+                                               strlcat(temp, "LG", sizeof(temp));
+                                       break;
+                               default:
+                                       // not a recognized macro, print it as-is...
+                                       temp[0] = s[0];
+                                       temp[1] = s[1];
+                                       temp[2] = 0;
+                                       break;
+                               }
+                               // write the resulting text
+                               SZ_Write(&cls.netcon->message, (unsigned char *)temp, strlen(temp));
+                               s += 2;
+                               continue;
+                       }
+                       MSG_WriteByte(&cls.netcon->message, *s);
+                       s++;
+               }
+               MSG_WriteByte(&cls.netcon->message, 0);
+       }
+       else // any other command is passed on as-is
+               SZ_Write(&cls.netcon->message, (const unsigned char *)s, (int)strlen(s) + 1);
 }
 
 /*