]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - console.c
OGG_FreeSfx and WAV_FreeSfx no longer reference sfx_t
[xonotic/darkplaces.git] / console.c
index 75beb33032079366cb0835325e02e6fb7edcb300..d7e614a120c221380fd737cc8f314a9cfd2501f8 100644 (file)
--- a/console.c
+++ b/console.c
@@ -76,6 +76,10 @@ LOGGING
 */
 
 cvar_t log_file = {0, "log_file","", "filename to log messages to"};
+cvar_t log_dest_udp = {0, "log_dest_udp","", "UDP address to log messages to (in QW rcon compatible format); multiple destinations can be separated by spaces; DO NOT SPECIFY DNS NAMES HERE"};
+char log_dest_buffer[1400]; // UDP packet
+size_t log_dest_buffer_pos;
+qboolean log_dest_buffer_appending;
 char crt_log_file [MAX_OSPATH] = "";
 qfile_t* logfile = NULL;
 
@@ -85,6 +89,56 @@ size_t logq_size = 0;
 
 void Log_ConPrint (const char *msg);
 
+/*
+====================
+Log_DestBuffer_Init
+====================
+*/
+static void Log_DestBuffer_Init()
+{
+       memcpy(log_dest_buffer, "\377\377\377\377n", 5); // QW rcon print
+       log_dest_buffer_pos = 5;
+}
+
+/*
+====================
+Log_DestBuffer_Flush
+====================
+*/
+void Log_DestBuffer_Flush()
+{
+       lhnetaddress_t log_dest_addr;
+       lhnetsocket_t *log_dest_socket;
+       const char *s = log_dest_udp.string;
+       qboolean have_opened_temp_sockets = false;
+       if(s) if(log_dest_buffer_pos > 5)
+       {
+               ++log_dest_buffer_appending;
+               log_dest_buffer[log_dest_buffer_pos++] = 0;
+
+               if(!NetConn_HaveServerPorts() && !NetConn_HaveClientPorts()) // then temporarily open one
+               {
+                       have_opened_temp_sockets = true;
+                       NetConn_OpenServerPorts(true);
+               }
+
+               while(COM_ParseToken_Console(&s))
+                       if(LHNETADDRESS_FromString(&log_dest_addr, com_token, 26000))
+                       {
+                               log_dest_socket = NetConn_ChooseClientSocketForAddress(&log_dest_addr);
+                               if(!log_dest_socket)
+                                       log_dest_socket = NetConn_ChooseServerSocketForAddress(&log_dest_addr);
+                               if(log_dest_socket)
+                                       NetConn_WriteString(log_dest_socket, log_dest_buffer, &log_dest_addr);
+                       }
+
+               if(have_opened_temp_sockets)
+                       NetConn_CloseServerPorts();
+               --log_dest_buffer_appending;
+       }
+       log_dest_buffer_pos = 0;
+}
+
 /*
 ====================
 Log_Timestamp
@@ -156,6 +210,8 @@ Log_Start
 */
 void Log_Start (void)
 {
+       size_t pos;
+       size_t n;
        Log_Open ();
 
        // Dump the contents of the log queue into the log file and free it
@@ -163,8 +219,24 @@ void Log_Start (void)
        {
                unsigned char *temp = logqueue;
                logqueue = NULL;
-               if (logfile != NULL && logq_ind != 0)
-                       FS_Write (logfile, temp, logq_ind);
+               if(logq_ind != 0)
+               {
+                       if (logfile != NULL)
+                               FS_Write (logfile, temp, logq_ind);
+                       if(*log_dest_udp.string)
+                       {
+                               for(pos = 0; pos < logq_ind; )
+                               {
+                                       if(log_dest_buffer_pos == 0)
+                                               Log_DestBuffer_Init();
+                                       n = min(sizeof(log_dest_buffer) - log_dest_buffer_pos - 1, logq_ind - pos);
+                                       memcpy(log_dest_buffer + log_dest_buffer_pos, temp + pos, n);
+                                       log_dest_buffer_pos += n;
+                                       Log_DestBuffer_Flush();
+                                       pos += n;
+                               }
+                       }
+               }
                Mem_Free (temp);
                logq_ind = 0;
                logq_size = 0;
@@ -223,6 +295,7 @@ void Log_ConPrint (const char *msg)
        // If a log file is available
        if (logfile != NULL)
                FS_Print (logfile, msg);
+
        inprogress = false;
 }
 
@@ -451,6 +524,7 @@ void Con_Init (void)
        Cvar_RegisterVariable (&sys_specialcharactertranslation);
 
        Cvar_RegisterVariable (&log_file);
+       Cvar_RegisterVariable (&log_dest_udp);
 
        // support for the classic Quake option
 // COMMANDLINEOPTION: Console: -condebug logs console messages to qconsole.log, see also log_file
@@ -599,6 +673,38 @@ static char qfont_table[256] = {
        'x',  'y',  'z',  '{',  '|',  '}',  '~',  '<'
 };
 
+/*
+================
+Con_Rcon_AddChar
+
+Adds a character to the rcon buffer
+================
+*/
+void Con_Rcon_AddChar(char c)
+{
+       if(log_dest_buffer_appending)
+               return;
+       ++log_dest_buffer_appending;
+
+       // if this print is in response to an rcon command, add the character
+       // to the rcon redirect buffer
+
+       if (rcon_redirect && rcon_redirect_bufferpos < (int)sizeof(rcon_redirect_buffer) - 1)
+               rcon_redirect_buffer[rcon_redirect_bufferpos++] = c;
+       else if(*log_dest_udp.string) // don't duplicate rcon command responses here, these are sent another way
+       {
+               if(log_dest_buffer_pos == 0)
+                       Log_DestBuffer_Init();
+               log_dest_buffer[log_dest_buffer_pos++] = c;
+               if(log_dest_buffer_pos >= sizeof(log_dest_buffer) - 1) // minus one, to allow for terminating zero
+                       Log_DestBuffer_Flush();
+       }
+       else
+               log_dest_buffer_pos = 0;
+
+       --log_dest_buffer_appending;
+}
+
 /*
 ================
 Con_Print
@@ -611,16 +717,13 @@ extern cvar_t timeformat;
 extern qboolean sys_nostdout;
 void Con_Print(const char *msg)
 {
-       int mask = 0;
+       static int mask = 0;
        static int index = 0;
        static char line[MAX_INPUTLINE];
 
        for (;*msg;msg++)
        {
-               // if this print is in response to an rcon command, add the character
-               // to the rcon redirect buffer
-               if (rcon_redirect && rcon_redirect_bufferpos < (int)sizeof(rcon_redirect_buffer) - 1)
-                       rcon_redirect_buffer[rcon_redirect_bufferpos++] = *msg;
+               Con_Rcon_AddChar(*msg);
                // if this is the beginning of a new line, print timestamp
                if (index == 0)
                {
@@ -636,10 +739,16 @@ void Con_Print(const char *msg)
                        {
                                // play talk wav
                                if (*msg == 1)
-                                       S_LocalSound ("sound/misc/talk.wav");
+                               {
+                                       if (msg[1] == '(' && cl.foundtalk2wav)
+                                               S_LocalSound ("sound/misc/talk2.wav");
+                                       else
+                                               S_LocalSound ("sound/misc/talk.wav");
+                               }
                                line[index++] = STRING_COLOR_TAG;
                                line[index++] = '3';
                                msg++;
+                               Con_Rcon_AddChar(*msg);
                        }
                        // store timestamp
                        for (;*timestamp;index++, timestamp++)
@@ -925,7 +1034,7 @@ void Con_DrawInput (void)
                text += 1 + key_linepos - con_linewidth;
 
        // draw it
-       DrawQ_ColoredString(0, con_vislines - con_textsize.value*2, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, NULL );
+       DrawQ_String(0, con_vislines - con_textsize.value*2, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, NULL, false );
 
        // remove cursor
 //     key_lines[edit_line][key_linepos] = 0;
@@ -994,7 +1103,7 @@ void Con_DrawNotify (void)
                } else
                        x = 0;
 
-               DrawQ_ColoredString( x, v, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
+               DrawQ_String( x, v, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false );
 
                v += con_textsize.value;
        }
@@ -1013,13 +1122,13 @@ void Con_DrawNotify (void)
                        sprintf(temptext, "say:%s%c", chat_buffer, (int) 10+((int)(realtime*con_cursorspeed)&1));
                while ((int)strlen(temptext) >= con_linewidth)
                {
-                       DrawQ_ColoredString( 0, v, temptext, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
+                       DrawQ_String( 0, v, temptext, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false );
                        strlcpy(temptext, &temptext[con_linewidth], sizeof(temptext));
                        v += con_textsize.value;
                }
                if (strlen(temptext) > 0)
                {
-                       DrawQ_ColoredString( 0, v, temptext, 0, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
+                       DrawQ_String( 0, v, temptext, 0, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false );
                        v += con_textsize.value;
                }
        }
@@ -1045,7 +1154,7 @@ void Con_DrawConsole (int lines)
 
 // draw the background
        DrawQ_Pic(0, lines - vid_conheight.integer, scr_conbrightness.value >= 0.01f ? Draw_CachePic("gfx/conback", true) : NULL, vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, scr_conalpha.value, 0);
-       DrawQ_String(vid_conwidth.integer - strlen(engineversion) * con_textsize.value - con_textsize.value, lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0);
+       DrawQ_String(vid_conwidth.integer - strlen(engineversion) * con_textsize.value - con_textsize.value, lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0, NULL, true);
 
 // draw the text
        con_vislines = lines;
@@ -1060,7 +1169,7 @@ void Con_DrawConsole (int lines)
                j = max(i - con_backscroll, 0);
                text = con_text + (j % con_totallines)*con_linewidth;
 
-               DrawQ_ColoredString( 0, y, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
+               DrawQ_String( 0, y, text, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false );
        }
 
 // draw the input prompt, user text, and cursor if desired
@@ -1173,7 +1282,7 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                                for (;;)
                                {
                                        int l;
-                                       if (!COM_ParseTokenConsole(&data))
+                                       if (!COM_ParseToken_Simple(&data, false))
                                                break;
                                        if (com_token[0] == '{')
                                                continue;
@@ -1184,7 +1293,7 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                                        for (l = 0;l < (int)sizeof(keyname) - 1 && com_token[k+l] && com_token[k+l] > ' ';l++)
                                                keyname[l] = com_token[k+l];
                                        keyname[l] = 0;
-                                       if (!COM_ParseTokenConsole(&data))
+                                       if (!COM_ParseToken_Simple(&data, false))
                                                break;
                                        if (developer.integer >= 100)
                                                Con_Printf("key: %s %s\n", keyname, com_token);
@@ -1224,7 +1333,7 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                                goto endcomplete;
        }
 endcomplete:
-       if(p > o)
+       if(p > o && completedname && completednamebufferlength > 0)
        {
                memset(completedname, 0, completednamebufferlength);
                memcpy(completedname, (t->filenames[0]+5), min(p, completednamebufferlength - 1));