]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
rewrote most of wad system, this eliminated 512KB of static arrays for
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 7a4c5c17ee7a4ef94510b5bb93e04816876b0c7e..82a98ae5e56dc947e22bffcc9760781804536266 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -1169,6 +1169,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 +1186,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);
 }
 
 /*