From 577419de376bc7f09e8e3256f514103f7c61fc28 Mon Sep 17 00:00:00 2001 From: Spoike Date: Sat, 13 Apr 2013 08:15:18 +0000 Subject: [PATCH] improve handling of writing to world entity. split left and right alt. binds+gamecode still use left-alt exclusively. alt-for-red-chars only works with left alt. right alt is alt-gr, so text input now works fine. fixed support for keypad and text entry. sdl2 clipboard support, if we're compiled with sdl2. fixed issues with sdl sound. shouldn't be so terrible now. soundinfo command now more verbose. support for interpolated ramps. removed input line length limitations, although some limitations still remain. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4315 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/cl_parse.c | 5 +- engine/client/console.c | 25 +++- engine/client/in_sdl.c | 4 +- engine/client/in_win.c | 6 +- engine/client/keys.c | 191 +++++++++++++++++--------- engine/client/keys.h | 6 +- engine/client/m_mp3.c | 3 +- engine/client/menu.c | 4 + engine/client/p_script.c | 38 ++++- engine/client/pr_clcmd.c | 5 +- engine/client/pr_csqc.c | 39 ++++-- engine/client/snd_directx.c | 3 +- engine/client/snd_dma.c | 35 ++++- engine/client/snd_sdl.c | 23 +++- engine/client/snd_win.c | 1 + engine/client/sys_sdl.c | 26 +++- engine/client/textedit.c | 9 +- engine/common/cmd.c | 2 +- engine/common/console.h | 4 +- engine/d3d/vid_d3d11.c | 2 +- engine/dotnet2005/ftequake_SDL.vcproj | 169 +---------------------- engine/qclib/execloop.h | 31 ++--- engine/qclib/pr_exec.c | 21 ++- engine/server/net_preparse.c | 55 ++++++-- engine/server/pr_cmds.c | 7 +- engine/server/sv_main.c | 2 +- 26 files changed, 393 insertions(+), 323 deletions(-) diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 91f83d988..9a2d003ff 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -5258,6 +5258,7 @@ void CLQW_ParseServerMessage (void) int i, j; int destsplit; float f; + qboolean csqcpacket = false; received_framecount = host_framecount; cl.last_servermessage = realtime; @@ -5316,7 +5317,7 @@ void CLQW_ParseServerMessage (void) { default: CL_DumpPacket(); - Host_EndGame ("CL_ParseServerMessage: Illegible server message (%i@%i)", cmd, msg_readcount-1); + Host_EndGame ("CLQW_ParseServerMessage: Illegible server message (%i@%i)%s", cmd, msg_readcount-1, (!cl.csqcdebug && csqcpacket)?"\n'sv_csqcdebug 1' might aid in debugging this.":"" ); return; case svc_time: @@ -5747,6 +5748,7 @@ void CLQW_ParseServerMessage (void) #ifdef PEXT_CSQC case svcfte_csqcentities: + csqcpacket = true; CSQC_ParseEntities(); break; #endif @@ -5765,6 +5767,7 @@ void CLQW_ParseServerMessage (void) break; case svcfte_cgamepacket: + csqcpacket = true; #ifdef HLCLIENT if (CLHL_ParseGamePacket()) break; diff --git a/engine/client/console.c b/engine/client/console.c index 80914c046..ffa590c3c 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -358,17 +358,21 @@ void Con_QTerm_f(void) void Key_ClearTyping (void) { + key_lines[edit_line] = BZ_Realloc(key_lines[edit_line], 2); + key_lines[edit_line][0] = ']'; key_lines[edit_line][1] = 0; // clear any typing key_linepos = 1; } void Con_History_Load(void) { + char line[8192]; unsigned char *cr; vfsfile_t *file = FS_OpenVFS("conhistory.txt", "rb", FS_ROOT); for (edit_line=0 ; edit_line<=CON_EDIT_LINES_MASK ; edit_line++) { + key_lines[edit_line] = BZ_Realloc(key_lines[edit_line], 2); key_lines[edit_line][0] = ']'; key_lines[edit_line][1] = 0; } @@ -377,12 +381,15 @@ void Con_History_Load(void) if (file) { - while (VFS_GETS(file, key_lines[edit_line]+1, sizeof(key_lines[edit_line])-1)) + line[0] = ']'; + while (VFS_GETS(file, line+1, sizeof(line)-1)) { //strip a trailing \r if its from windows. - cr = key_lines[edit_line] + strlen(key_lines[edit_line]); - if (cr > key_lines[edit_line] && cr[-1] == '\r') + cr = line + strlen(line); + if (cr > line && cr[-1] == '\r') cr[-1] = '\0'; + key_lines[edit_line] = BZ_Realloc(key_lines[edit_line], strlen(line)+1); + strcpy(key_lines[edit_line], line); edit_line = (edit_line + 1) & CON_EDIT_LINES_MASK; } VFS_CLOSE(file); @@ -593,8 +600,15 @@ void Con_Init (void) void Con_Shutdown(void) { + int i; + Con_History_Save(); + for (i = 0; i <= CON_EDIT_LINES_MASK; i++) + { + BZ_Free(key_lines[i]); + } + while(con_main.next) { Con_Destroy(con_main.next); @@ -954,6 +968,8 @@ int Con_DrawInput (int left, int right, int y, qboolean selactive, int selsx, in endmtext = COM_ParseFunString(CON_WHITEMASK, text, maskedtext, sizeof(maskedtext) - sizeof(maskedtext[0]), PFS_KEEPMARKUP | PFS_FORCEUTF8); // endmtext = COM_ParseFunString(CON_WHITEMASK, text+key_linepos, cursor, ((char*)maskedtext)+sizeof(maskedtext) - (char*)(cursor+1), PFS_KEEPMARKUP | PFS_FORCEUTF8); + if ((char*)endmtext == (char*)(maskedtext-2) + sizeof(maskedtext)) + endmtext[-1] = CON_WHITEMASK | '+' | CON_NONCLEARBG; endmtext[1] = 0; i = 0; @@ -974,13 +990,14 @@ int Con_DrawInput (int left, int right, int y, qboolean selactive, int selsx, in int cmdstart; cmdstart = text[1] == '/'?2:1; fname = Cmd_CompleteCommand(text+cmdstart, true, true, con_commandmatch, NULL); - if (fname) //we can compleate it to: + if (fname && strlen(fname) < 256) //we can compleate it to: { for (p = min(strlen(fname), key_linepos-cmdstart); fname[p]>' '; p++) maskedtext[p+cmdstart] = (unsigned int)fname[p] | (COLOR_GREEN<>16)&255; + if (((vkey>>16)&511) == (0x138)) + return K_RALT; if (cl_keypad.value) { switch (key) diff --git a/engine/client/keys.c b/engine/client/keys.c index 50d26d466..5839f67c5 100644 --- a/engine/client/keys.c +++ b/engine/client/keys.c @@ -27,10 +27,11 @@ key up events are sent even if in console mode */ void Editor_Key(int key, int unicode); +void Key_ConsoleInsert(char *instext); +void Key_ClearTyping (void); #define KEY_MODIFIERSTATES 8 -#define MAXCMDLINE 256 -unsigned char key_lines[CON_EDIT_LINES_MASK+1][MAXCMDLINE]; +unsigned char *key_lines[CON_EDIT_LINES_MASK+1]; int key_linepos; int shift_down=false; int key_lastpress; @@ -92,7 +93,9 @@ keyname_t keynames[] = {"LEFTARROW", K_LEFTARROW}, {"RIGHTARROW", K_RIGHTARROW}, - {"ALT", K_ALT}, + {"LALT", K_LALT}, + {"RALT", K_RALT}, + {"ALT", K_LALT}, //depricated name {"CTRL", K_CTRL}, {"SHIFT", K_SHIFT}, @@ -262,11 +265,9 @@ int PaddedPrint (char *s, int x) return x; } - int con_commandmatch; void CompleteCommand (qboolean force) { - int i; char *cmd, *s; char *desc; @@ -283,24 +284,19 @@ void CompleteCommand (qboolean force) cmd = Cmd_CompleteCommand (s, true, true, con_commandmatch, &desc); if (cmd) { - key_lines[edit_line][1] = '/'; - Q_strcpy (key_lines[edit_line]+2, cmd); - key_linepos = Q_strlen(cmd)+2; + //complete to that (maybe partial) cmd. + Key_ClearTyping(); + Key_ConsoleInsert("/"); + Key_ConsoleInsert(cmd); + s = key_lines[edit_line]+2; - s = key_lines[edit_line]+1; //readjust to cope with the insertion of a / - if (*s == '\\' || *s == '/') - s++; - - // if (strlen(cmd)>strlen(s)) + //if its the only match, add a space ready for arguments. + cmd = Cmd_CompleteCommand (s, true, true, 0, NULL); + if (cmd && !strcmp(s, cmd)) { - cmd = Cmd_CompleteCommand (s, true, true, 0, NULL); - if (cmd && !strcmp(s, cmd)) //also a compleate var - { - key_lines[edit_line][key_linepos] = ' '; - key_linepos++; - } + Key_ConsoleInsert(" "); } - key_lines[edit_line][key_linepos] = 0; + if (!con_commandmatch) con_commandmatch = 1; @@ -309,12 +305,12 @@ void CompleteCommand (qboolean force) return; } } - cmd = Cmd_CompleteCommand (s, false, true, 0, &desc); +/* cmd = Cmd_CompleteCommand (s, false, true, 0, &desc); if (cmd) { - i = key_lines[edit_line][1] == '/'?2:1; + int i = key_lines[edit_line][1] == '/'?2:1; if (i != 2 || strcmp(key_lines[edit_line]+i, cmd)) - { //if changed, compleate it + { //if changed, complete it key_lines[edit_line][1] = '/'; Q_strcpy (key_lines[edit_line]+2, cmd); key_linepos = Q_strlen(cmd)+2; @@ -334,7 +330,7 @@ void CompleteCommand (qboolean force) return; //don't alter con_commandmatch if we compleated a tiny bit more } } - +*/ con_commandmatch++; if (Cmd_CompleteCommand(s, true, true, con_commandmatch, &desc)) { @@ -352,7 +348,7 @@ void CompleteCommand (qboolean force) void Con_ExecuteLine(console_t *con, char *line) { qboolean waschat = false; - char deutf8[1024]; + char deutf8[8192]; extern cvar_t com_parseutf8; if (com_parseutf8.ival <= 0) { @@ -384,6 +380,8 @@ void Con_ExecuteLine(console_t *con, char *line) else waschat = false; } + while (*line == ' ') + line++; if (waschat) Cbuf_AddText (line, RESTRICT_LOCAL); else @@ -465,24 +463,27 @@ qboolean Key_GetConsoleSelectionBox(int *sx, int *sy, int *ex, int *ey) void Key_ConsoleInsert(char *instext) { int i; - int len; + int len, olen; + char *old; + if (!*instext) + return; + + old = key_lines[edit_line]; len = strlen(instext); - if (len + strlen(key_lines[edit_line]) > MAXCMDLINE - 1) - len = MAXCMDLINE - 1 - strlen(key_lines[edit_line]); - if (len > 0) - { // insert the string - memmove (key_lines[edit_line] + key_linepos + len, - key_lines[edit_line] + key_linepos, strlen(key_lines[edit_line]) - key_linepos + 1); - memcpy (key_lines[edit_line] + key_linepos, instext, len); - for (i = 0; i < len; i++) - { - if (key_lines[edit_line][key_linepos+i] == '\r') - key_lines[edit_line][key_linepos+i] = ' '; - else if (key_lines[edit_line][key_linepos+i] == '\n') - key_lines[edit_line][key_linepos+i] = ';'; - } - key_linepos += len; + olen = strlen(old); + key_lines[edit_line] = BZ_Malloc(olen + len + 1); + memcpy(key_lines[edit_line], old, key_linepos); + memcpy(key_lines[edit_line]+key_linepos, instext, len); + memcpy(key_lines[edit_line]+key_linepos+len, old+key_linepos, olen - key_linepos+1); + Z_Free(old); + for (i = key_linepos; i < key_linepos+len; i++) + { + if (key_lines[edit_line][i] == '\r') + key_lines[edit_line][i] = ' '; + else if (key_lines[edit_line][i] == '\n') + key_lines[edit_line][i] = ';'; } + key_linepos += len; } void Key_DefaultLinkClicked(char *text, char *info) @@ -677,7 +678,10 @@ void Key_DefaultLinkClicked(char *text, char *info) } if (!*info && *text == '/') { - Q_strncpyz(key_lines[edit_line]+1, text, sizeof(key_lines[edit_line])-1); + Z_Free(key_lines[edit_line]); + key_lines[edit_line] = BZ_Malloc(strlen(text) + 2); + key_lines[edit_line][0] = ']'; + strcpy(key_lines[edit_line]+1, text); key_linepos = strlen(key_lines[edit_line]); return; } @@ -884,6 +888,10 @@ void Key_Console (unsigned int unicode, int key) char *clipText; char utf8[8]; + //weirdness for the keypad. + if ((unicode >= '0' && unicode <= '9') || unicode == '.') + key = 0; + if (con_current->redirect) { if (key == K_TAB) @@ -934,11 +942,13 @@ void Key_Console (unsigned int unicode, int key) return; } - if (key == K_ENTER) + if (key == K_ENTER || key == K_KP_ENTER) { // backslash text are commands, else chat int oldl = edit_line; edit_line = (edit_line + 1) & (CON_EDIT_LINES_MASK); history_line = edit_line; + Z_Free(key_lines[edit_line]); + key_lines[edit_line] = BZ_Malloc(2); key_lines[edit_line][0] = ']'; key_lines[edit_line][1] = '\0'; key_linepos = 1; @@ -977,12 +987,12 @@ void Key_Console (unsigned int unicode, int key) if (key != K_CTRL && key != K_SHIFT && con_commandmatch) con_commandmatch=1; - if (key == K_LEFTARROW) + if (key == K_LEFTARROW || key == K_KP_LEFTARROW) { key_linepos = utf_left(key_lines[edit_line]+1, key_lines[edit_line] + key_linepos) - key_lines[edit_line]; return; } - if (key == K_RIGHTARROW) + if (key == K_RIGHTARROW || key == K_KP_RIGHTARROW) { if (key_lines[edit_line][key_linepos]) { @@ -993,7 +1003,7 @@ void Key_Console (unsigned int unicode, int key) key = ' '; } - if (key == K_DEL) + if (key == K_DEL || key == K_KP_DEL) { if (key_lines[edit_line][key_linepos]) { @@ -1018,7 +1028,7 @@ void Key_Console (unsigned int unicode, int key) return; } - if (key == K_UPARROW) + if (key == K_UPARROW || key == K_KP_UPARROW) { do { @@ -1027,6 +1037,7 @@ void Key_Console (unsigned int unicode, int key) && !key_lines[history_line][1]); if (history_line == edit_line) history_line = (edit_line+1)&CON_EDIT_LINES_MASK; + key_lines[edit_line] = BZ_Realloc(key_lines[edit_line], strlen(key_lines[history_line])+1); Q_strcpy(key_lines[edit_line], key_lines[history_line]); key_linepos = Q_strlen(key_lines[edit_line]); @@ -1036,7 +1047,7 @@ void Key_Console (unsigned int unicode, int key) return; } - if (key == K_DOWNARROW) + if (key == K_DOWNARROW || key == K_KP_DOWNARROW) { if (history_line == edit_line) { @@ -1060,13 +1071,14 @@ void Key_Console (unsigned int unicode, int key) } else { + key_lines[edit_line] = BZ_Realloc(key_lines[edit_line], strlen(key_lines[history_line])+1); Q_strcpy(key_lines[edit_line], key_lines[history_line]); key_linepos = Q_strlen(key_lines[edit_line]); } return; } - if (key == K_PGUP || key==K_MWHEELUP) + if (key == K_PGUP || key == K_KP_PGUP || key==K_MWHEELUP) { int i = 2; if (keydown[K_CTRL]) @@ -1083,7 +1095,7 @@ void Key_Console (unsigned int unicode, int key) } return; } - if (key == K_PGDN || key==K_MWHEELDOWN) + if (key == K_PGDN || key == K_KP_PGDN || key==K_MWHEELDOWN) { int i = 2; if (keydown[K_CTRL]) @@ -1101,7 +1113,7 @@ void Key_Console (unsigned int unicode, int key) return; } - if (key == K_HOME) + if (key == K_HOME || key == K_KP_HOME) { if (keydown[K_CTRL]) con_current->display = con_current->oldest; @@ -1110,7 +1122,7 @@ void Key_Console (unsigned int unicode, int key) return; } - if (key == K_END) + if (key == K_END || key == K_KP_END) { if (keydown[K_CTRL]) con_current->display = con_current->current; @@ -1138,11 +1150,37 @@ void Key_Console (unsigned int unicode, int key) } if (unicode < ' ') - return; - - if (com_parseutf8.ival >= 0) //don't do this for iso8859-1. the major user of that is hexen2 which doesn't have these chars. { - if (keydown[K_CTRL]) + //if the user is entering control codes, then the ctrl+foo mechanism is probably unsupported by the unicode input stuff, so give best-effort replacements. + switch(unicode) + { + case 27/*'['*/: unicode = 0xe010; break; + case 29/*']'*/: unicode = 0xe011; break; + case 7/*'g'*/: unicode = 0xe086; break; + case 18/*'r'*/: unicode = 0xe087; break; + case 25/*'y'*/: unicode = 0xe088; break; + case 2/*'b'*/: unicode = 0xe089; break; + case 19/*'s'*/: unicode = 0xe080; break; + case 4/*'d'*/: unicode = 0xe081; break; + case 6/*'f'*/: unicode = 0xe082; break; + case 1/*'a'*/: unicode = 0xe083; break; + case 21/*'u'*/: unicode = 0xe01d; break; + case 9/*'i'*/: unicode = 0xe01e; break; + case 15/*'o'*/: unicode = 0xe01f; break; + case 10/*'j'*/: unicode = 0xe01c; break; + case 16/*'p'*/: unicode = 0xe09c; break; + case 13/*'m'*/: unicode = 0xe08b; break; + case 11/*'k'*/: unicode = 0xe08d; break; + case 14/*'n'*/: unicode = '\r'; break; + default: +// if (unicode) +// Con_Printf("escape code %i\n", unicode); + return; + } + } + else if (com_parseutf8.ival >= 0) //don't do this for iso8859-1. the major user of that is hexen2 which doesn't have these chars. + { + if (keydown[K_CTRL] && !keydown[K_RALT]) { if (unicode >= '0' && unicode <= '9') unicode = unicode - '0' + 0xe012; // yellow number @@ -1169,7 +1207,7 @@ void Key_Console (unsigned int unicode, int key) } } - if (keydown[K_ALT] && unicode > 32 && unicode < 128) + if (keydown[K_LALT] && unicode > 32 && unicode < 128) unicode |= 0xe080; // red char } @@ -1591,8 +1629,8 @@ void Key_Init (void) for (i=0 ; i<=CON_EDIT_LINES_MASK ; i++) { + key_lines[i] = Z_Malloc(2); key_lines[i][0] = ']'; - key_lines[i][1] = 0; } key_linepos = 1; @@ -1607,17 +1645,27 @@ void Key_Init (void) consolekeys[K_RIGHTARROW] = true; consolekeys[K_UPARROW] = true; consolekeys[K_DOWNARROW] = true; + consolekeys[K_KP_LEFTARROW] = true; + consolekeys[K_KP_RIGHTARROW] = true; + consolekeys[K_KP_UPARROW] = true; + consolekeys[K_KP_DOWNARROW] = true; consolekeys[K_BACKSPACE] = true; consolekeys[K_DEL] = true; + consolekeys[K_KP_DEL] = true; consolekeys[K_HOME] = true; + consolekeys[K_KP_HOME] = true; consolekeys[K_END] = true; + consolekeys[K_KP_END] = true; consolekeys[K_PGUP] = true; + consolekeys[K_KP_PGUP] = true; consolekeys[K_PGDN] = true; + consolekeys[K_KP_PGDN] = true; consolekeys[K_SHIFT] = true; consolekeys[K_MWHEELUP] = true; consolekeys[K_MWHEELDOWN] = true; consolekeys[K_CTRL] = true; - consolekeys[K_ALT] = true; + consolekeys[K_LALT] = true; + consolekeys[K_RALT] = true; consolekeys['`'] = false; consolekeys['~'] = false; @@ -1719,23 +1767,24 @@ void Key_Event (int devid, int key, unsigned int unicode, qboolean down) char p[16]; char cmd[1024]; int keystate, oldstate; + int conkey = consolekeys[key] || (unicode && (key != '`' || key_linepos>1)); //if the input line is empty, allow ` to toggle the console, otherwise enter it as actual text. // Con_Printf ("%i : %i : %i\n", key, unicode, down); //@@@ - oldstate = KeyModifier(keydown[K_SHIFT], keydown[K_ALT], keydown[K_CTRL]); + oldstate = KeyModifier(keydown[K_SHIFT], keydown[K_LALT]|keydown[K_RALT], keydown[K_CTRL]); keydown[key] = down; - if (key == K_SHIFT || key == K_ALT || key == K_CTRL) + if (key == K_SHIFT || key == K_LALT || key == K_RALT || key == K_CTRL) { int k; - keystate = KeyModifier(keydown[K_SHIFT], keydown[K_ALT], keydown[K_CTRL]); + keystate = KeyModifier(keydown[K_SHIFT], keydown[K_LALT]|keydown[K_RALT], keydown[K_CTRL]); for (k = 0; k < K_MAX; k++) { //go through the old state removing all depressed keys. they are all up now. - if (k == K_SHIFT || k == K_ALT || k == K_CTRL) + if (k == K_SHIFT || k == K_LALT || key == K_RALT || k == K_CTRL) continue; if (deltaused[k][oldstate]) @@ -1831,7 +1880,7 @@ void Key_Event (int devid, int key, unsigned int unicode, qboolean down) } //yes, csqc is allowed to steal the escape key. - if (key != '`' && key != '~') + if (key != '`' && (!down || key != K_ESCAPE || (key_dest == key_game && !shift_down))) if (key_dest == key_game && !Media_PlayingFullScreen()) { #ifdef CSQC_DAT @@ -1890,7 +1939,10 @@ void Key_Event (int devid, int key, unsigned int unicode, qboolean down) break; } case key_console: - M_ToggleMenu_f (); + if (cls.state) + key_dest = key_game; + else + M_ToggleMenu_f (); break; default: Sys_Error ("Bad key_dest"); @@ -1956,7 +2008,7 @@ void Key_Event (int devid, int key, unsigned int unicode, qboolean down) // // during demo playback, most keys bring up the main menu // - if (cls.demoplayback && cls.demoplayback != DPB_MVD && cls.demoplayback != DPB_EZTV && down && consolekeys[key] && key != K_TAB && key_dest == key_game) + if (cls.demoplayback && cls.demoplayback != DPB_MVD && cls.demoplayback != DPB_EZTV && down && conkey && key != K_TAB && key_dest == key_game) { M_ToggleMenu_f (); return; @@ -1975,8 +2027,8 @@ void Key_Event (int devid, int key, unsigned int unicode, qboolean down) #endif if (key && ((key_dest == key_menu && menubound[key]) - || (key_dest == key_console && !consolekeys[key]) - || (key_dest == key_game && ( cls.state == ca_active || !consolekeys[key] ) ) )) + || (key_dest == key_console && !conkey) + || (key_dest == key_game && ( cls.state == ca_active || (!conkey) ) ) )) { /*don't auto-repeat binds as it breaks too many scripts*/ if (key_repeats[key] > 1) @@ -1989,6 +2041,9 @@ void Key_Event (int devid, int key, unsigned int unicode, qboolean down) else *p = 0; + if (key == K_RALT) //simulate a singular alt for binds. really though, this code should translate to csqc/menu keycodes and back to resolve the weirdness instead. + key = K_ALT; + kb = keybindings[key][keystate]; if (kb) { diff --git a/engine/client/keys.h b/engine/client/keys.h index 1d195e7f8..7cfd76979 100644 --- a/engine/client/keys.h +++ b/engine/client/keys.h @@ -45,7 +45,7 @@ K_DOWNARROW, K_LEFTARROW, K_RIGHTARROW, -K_ALT, +K_LALT, K_CTRL, K_SHIFT, K_INS, @@ -158,6 +158,7 @@ K_APP = 241, K_SEARCH = 242, K_VOLUP = 243, K_VOLDOWN = 244, +K_RALT = 245, K_MAX = 256 }; @@ -166,8 +167,7 @@ K_MAX = 256 #define K_RSHIFT K_SHIFT #define K_RCTRL K_CTRL #define K_LCTRL K_CTRL -#define K_RALT K_CTRL -#define K_LALT K_CTRL +#define K_ALT K_LALT typedef enum {key_game, key_console, key_message, key_menu, key_editor} keydest_t; diff --git a/engine/client/m_mp3.c b/engine/client/m_mp3.c index 68e666d54..3f459cc32 100644 --- a/engine/client/m_mp3.c +++ b/engine/client/m_mp3.c @@ -1908,7 +1908,8 @@ void Media_Gecko_KeyPress (struct cin_s *cin, int code, int unicode, int event) case K_CTRL: code = OSGKKey_Control; break; - case K_ALT: + case K_LALT: + case K_RALT: code = OSGKKey_Alt; break; case K_CAPSLOCK: diff --git a/engine/client/menu.c b/engine/client/menu.c index bb9faaee9..7d73f9111 100644 --- a/engine/client/menu.c +++ b/engine/client/menu.c @@ -198,7 +198,11 @@ void M_ToggleMenu_f (void) #ifdef CSQC_DAT if (CSQC_ConsoleCommand("togglemenu")) + { + if (key_dest == key_console) + key_dest = key_game; return; + } #endif #ifdef MENU_DAT if (MP_Toggle()) diff --git a/engine/client/p_script.c b/engine/client/p_script.c index 07ba4dad1..f140516fb 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -264,7 +264,7 @@ typedef struct part_type_s { vec3_t stain_rgb; float stain_radius; - enum {RAMP_NONE, RAMP_DELTA, RAMP_ABSOLUTE} rampmode; + enum {RAMP_NONE, RAMP_DELTA, RAMP_NEAREST, RAMP_LERP} rampmode; int rampindexes; ramp_t *ramp; @@ -1310,7 +1310,14 @@ static void P_ParticleEffect_f(void) if (!strcmp(value, "none")) ptype->rampmode = RAMP_NONE; else if (!strcmp(value, "absolute")) - ptype->rampmode = RAMP_ABSOLUTE; + { + Con_DPrintf("'rampmode absolute' is deprechiated, use 'rampmode nearest'\n"); + ptype->rampmode = RAMP_NEAREST; + } + else if (!strcmp(value, "nearest")) + ptype->rampmode = RAMP_NEAREST; + else if (!strcmp(value, "lerp")) //don't use the name 'linear'. ramps are there to avoid linear... + ptype->rampmode = RAMP_LERP; else //if (!strcmp(value, "delta")) ptype->rampmode = RAMP_DELTA; } @@ -5104,7 +5111,7 @@ static void PScript_DrawParticleTypes (void) switch (type->rampmode) { - case RAMP_ABSOLUTE: + case RAMP_NEAREST: rampind = (int)(type->rampindexes * (type->die - (d->die - particletime)) / type->die); if (rampind >= type->rampindexes) rampind = type->rampindexes - 1; @@ -5112,6 +5119,17 @@ static void PScript_DrawParticleTypes (void) VectorCopy(ramp->rgb, d->rgba); d->rgba[3] = ramp->alpha; break; + case RAMP_LERP: + { + float frac = (type->rampindexes * (type->die - (d->die - particletime)) / type->die); + int s1, s2; + s1 = min(type->rampindexes-1, frac); + s2 = min(type->rampindexes-1, s1+1); + frac -= s1; + VectorInterpolate(type->ramp[s1].rgb, frac, type->ramp[s2].rgb, d->rgba); + FloatInterpolate(type->ramp[s1].alpha, frac, type->ramp[s2].alpha, d->rgba[3]); + } + break; case RAMP_DELTA: //particle ramps ramp = type->ramp + (int)(type->rampindexes * (type->die - (d->die - particletime)) / type->die); VectorMA(d->rgba, pframetime, ramp->rgb, d->rgba); @@ -5373,7 +5391,7 @@ static void PScript_DrawParticleTypes (void) switch (type->rampmode) { - case RAMP_ABSOLUTE: + case RAMP_NEAREST: rampind = (int)(type->rampindexes * (type->die - (p->die - particletime)) / type->die); if (rampind >= type->rampindexes) rampind = type->rampindexes - 1; @@ -5382,6 +5400,18 @@ static void PScript_DrawParticleTypes (void) p->rgba[3] = ramp->alpha; p->scale = ramp->scale; break; + case RAMP_LERP: + { + float frac = (type->rampindexes * (type->die - (p->die - particletime)) / type->die); + int s1, s2; + s1 = min(type->rampindexes-1, frac); + s2 = min(type->rampindexes-1, s1+1); + frac -= s1; + VectorInterpolate(type->ramp[s1].rgb, frac, type->ramp[s2].rgb, p->rgba); + FloatInterpolate(type->ramp[s1].alpha, frac, type->ramp[s2].alpha, p->rgba[3]); + FloatInterpolate(type->ramp[s1].scale, frac, type->ramp[s2].scale, p->scale); + } + break; case RAMP_DELTA: //particle ramps rampind = (int)(type->rampindexes * (type->die - (p->die - particletime)) / type->die); if (rampind >= type->rampindexes) diff --git a/engine/client/pr_clcmd.c b/engine/client/pr_clcmd.c index b239e0c6a..590826fbe 100644 --- a/engine/client/pr_clcmd.c +++ b/engine/client/pr_clcmd.c @@ -21,7 +21,8 @@ int MP_TranslateFTEtoDPCodes(int code) case K_DOWNARROW: return 129; case K_LEFTARROW: return 130; case K_RIGHTARROW: return 131; - case K_ALT: return 132; + case K_LALT: return 132; + case K_RALT: return 132; case K_CTRL: return 133; case K_SHIFT: return 134; case K_F1: return 135; @@ -123,7 +124,7 @@ int MP_TranslateDPtoFTECodes(int code) case 129: return K_DOWNARROW; case 130: return K_LEFTARROW; case 131: return K_RIGHTARROW; - case 132: return K_ALT; + case 132: return K_LALT; case 133: return K_CTRL; case 134: return K_SHIFT; case 135: return K_F1; diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index b6d350b23..9f9229b4e 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -105,6 +105,7 @@ extern sfx_t *cl_sfx_r_exp3; globalfunction(parse_stuffcmd, "CSQC_Parse_StuffCmd"); \ globalfunction(parse_centerprint, "CSQC_Parse_CenterPrint"); \ globalfunction(parse_print, "CSQC_Parse_Print"); \ + globalfunction(parse_event, "CSQC_Parse_Event"); \ globalfunction(input_event, "CSQC_InputEvent"); \ globalfunction(input_frame, "CSQC_Input_Frame");/*EXT_CSQC_1*/ \ globalfunction(console_command, "CSQC_ConsoleCommand"); \ @@ -5668,23 +5669,35 @@ qboolean CSQC_ParseTempEntity(unsigned char firstbyte) qboolean CSQC_ParseGamePacket(void) { - int len = (unsigned short)MSG_ReadShort(); - int start = msg_readcount; + int parsefnc = csqcg.parse_event?csqcg.parse_event:csqcg.parse_tempentity; - void *pr_globals; - if (!csqcprogs || !csqcg.parse_tempentity) + if (cl.csqcdebug) { - MSG_ReadSkip(len); - return false; + int len = (unsigned short)MSG_ReadShort(); + int start = msg_readcount; + + if (!csqcprogs || !parsefnc) + { + MSG_ReadSkip(len); + return false; + } + + PR_ExecuteProgram (csqcprogs, parsefnc); + + if (msg_readcount != start + len) + { + Con_Printf("Gamecode misread a gamecode packet (%i bytes too much)\n", msg_readcount - (start+len)); + msg_readcount = start + len; + } } - - pr_globals = PR_globals(csqcprogs, PR_CURRENT); - PR_ExecuteProgram (csqcprogs, csqcg.parse_tempentity); - - if (msg_readcount != start + len) + else { - Con_Printf("Gamecode misread a gamecode packet (%i bytes too much)\n", msg_readcount - (start+len)); - msg_readcount = start + len; + if (!csqcprogs || !parsefnc) + { + Host_EndGame("CSQC not running or is unable to parse events.\n"); + return false; + } + PR_ExecuteProgram (csqcprogs, parsefnc); } return true; } diff --git a/engine/client/snd_directx.c b/engine/client/snd_directx.c index f4a0785fb..aa94e2db2 100644 --- a/engine/client/snd_directx.c +++ b/engine/client/snd_directx.c @@ -628,8 +628,7 @@ static int DSOUND_InitCard_Internal (soundcardinfo_t *sc, int cardnum) pDirectSoundEnumerate(&DSEnumCallback, sc); if (!snd_usemultipledevices.ival) //if only one device, ALWAYS use the default. dsndguid=NULL; - - if (!dsndguid && sc->audio_fd != 0) //no more... + else if (!dsndguid) //no more... return SND_NOMORE; sc->handle = Z_Malloc(sizeof(dshandle_t)); diff --git a/engine/client/snd_dma.c b/engine/client/snd_dma.c index 0ef8759b4..8dba872a6 100644 --- a/engine/client/snd_dma.c +++ b/engine/client/snd_dma.c @@ -168,6 +168,8 @@ qboolean S_HaveOutput(void) void S_SoundInfo_f(void) { + int i, j; + int active, known; soundcardinfo_t *sc; if (!sound_started) { @@ -182,12 +184,33 @@ void S_SoundInfo_f(void) } for (sc = sndcardinfo; sc; sc = sc->next) { - Con_Printf("%5d stereo\n", sc->sn.numchannels - 1); - Con_Printf("%5d samples\n", sc->sn.samples); - Con_Printf("%5d samplepos\n", sc->sn.samplepos); - Con_Printf("%5d samplebits\n", sc->sn.samplebits); - Con_Printf("%5d speed\n", sc->sn.speed); - Con_Printf("%5d total_channels\n", sc->total_chans); + Con_Printf("Audio Device: %s\n", sc->name); + Con_Printf(" %d channels, %gkhz, %d bit audio%s\n", sc->sn.numchannels, sc->sn.speed/1000.0, sc->sn.samplebits, sc->selfpainting?", threaded":""); + Con_Printf(" %d samples in buffer\n", sc->sn.samples); + for (i = 0, active = 0, known = 0; i < sc->total_chans; i++) + { + if (sc->channel[i].sfx) + { + known++; + for (j = 0; j < MAXSOUNDCHANNELS; j++) + { + if (sc->channel[i].vol[j]) + { + active++; + break; + } + } + if (jchannel[i].sfx->name, sc->channel[i].entnum, sc->channel[i].entchannel, sc->channel[i].origin[0], sc->channel[i].origin[1], sc->channel[i].origin[2]); + else + Con_DPrintf(" %s (%i %i, %g %g %g, inactive)\n", sc->channel[i].sfx->name, sc->channel[i].entnum, sc->channel[i].entchannel, sc->channel[i].origin[0], sc->channel[i].origin[1], sc->channel[i].origin[2]); + } + } + Con_Printf(" %d/%d/%d/%d active/known/highest/max\n", active, known, sc->total_chans, MAX_CHANNELS); + for (i = 0; i < sc->sn.numchannels; i++) + { + Con_Printf(" chan %i: fwd:%-4g rt:%-4g up:%-4g dist:%-4g\n", i, sc->speakerdir[i][0], sc->speakerdir[i][1], sc->speakerdir[i][2], sc->dist[i]); + } } } diff --git a/engine/client/snd_sdl.c b/engine/client/snd_sdl.c index 9b9246e59..014710e29 100644 --- a/engine/client/snd_sdl.c +++ b/engine/client/snd_sdl.c @@ -2,7 +2,8 @@ #include "winquake.h" #include -#pragma comment(lib, MSVCLIBSPATH "sdl.lib") + +#define SELFPAINT //SDL calls a callback each time it needs to repaint the 'hardware' buffers //This results in extra latency. @@ -16,10 +17,12 @@ static void SSDL_Shutdown(soundcardinfo_t *sc) { -Con_Printf("Shutdown SDL sound\n"); + Con_DPrintf("Shutdown SDL sound\n"); SDL_CloseAudio(); +#ifndef SELFPAINT if (sc->sn.buffer) free(sc->sn.buffer); +#endif sc->sn.buffer = NULL; } static unsigned int SSDL_GetDMAPos(soundcardinfo_t *sc) @@ -35,6 +38,13 @@ static void VARGS SSDL_Paint(void *userdata, qbyte *stream, int len) soundcardinfo_t *sc = userdata; int buffersize = sc->sn.samples*(sc->sn.samplebits/8); +#ifdef SELFPAINT + sc->sn.buffer = stream; + sc->sn.samples = len / (sc->sn.samplebits/8); + sc->samplequeue = sc->sn.samples; + S_MixerThread(sc); + sc->snd_sent += len; +#else if (len > buffersize) { len = buffersize; //whoa nellie! @@ -51,6 +61,7 @@ static void VARGS SSDL_Paint(void *userdata, qbyte *stream, int len) } //and finish from the start memcpy(stream, (char*)sc->sn.buffer + (sc->snd_sent%buffersize), len); sc->snd_sent += len; +#endif } static void *SSDL_LockBuffer(soundcardinfo_t *sc, unsigned int *sampidx) @@ -96,7 +107,7 @@ static int SDL_InitCard(soundcardinfo_t *sc, int cardnum) desired.freq = sc->sn.speed; desired.channels = sc->sn.numchannels; //fixme! - desired.samples = 0x0100; + desired.samples = 0x0200; //'Good values seem to range between 512 and 8192 inclusive, depending on the application and CPU speed.' desired.format = AUDIO_S16SYS; desired.callback = (void*)SSDL_Paint; desired.userdata = sc; @@ -121,13 +132,19 @@ static int SDL_InitCard(soundcardinfo_t *sc, int cardnum) sc->sn.samplebits = obtained.format&0xff; sc->sn.samples = 32768;//*sc->sn.numchannels; //doesn't really matter, so long as it's higher than obtained.samples +#ifdef SELFPAINT + sc->selfpainting = true; +#endif + Con_DPrintf("channels: %i\n", sc->sn.numchannels); Con_DPrintf("Speed: %i\n", sc->sn.speed); Con_DPrintf("Samplebits: %i\n", sc->sn.samplebits); Con_DPrintf("SDLSamples: %i (low for latency)\n", obtained.samples); Con_DPrintf("FakeSamples: %i\n", sc->sn.samples); +#ifndef SELFPAINT sc->sn.buffer = malloc(sc->sn.samples*sc->sn.samplebits/8); +#endif Con_DPrintf("Got sound %i-%i\n", obtained.freq, obtained.format); sc->Lock = SSDL_LockBuffer; diff --git a/engine/client/snd_win.c b/engine/client/snd_win.c index db37005ec..10a8d46f7 100644 --- a/engine/client/snd_win.c +++ b/engine/client/snd_win.c @@ -354,6 +354,7 @@ int WAV_InitCard (soundcardinfo_t *sc, int cardnum) sc->sn.samples = wh->gSndBufSize/(sc->sn.samplebits/8); sc->sn.samplepos = 0; sc->sn.buffer = (unsigned char *) wh->lpData; + Q_strncpyz(sc->name, "wav out", sizeof(sc->name)); sc->Lock = WAV_Lock; diff --git a/engine/client/sys_sdl.c b/engine/client/sys_sdl.c index 805efce9a..14f1df453 100644 --- a/engine/client/sys_sdl.c +++ b/engine/client/sys_sdl.c @@ -611,7 +611,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin argv = malloc(argc * sizeof(char*)); for (i = 0; i < argc; i++) { - for(l = 0, c = 0; argvw[l]; l++) + for(l = 0, c = 0; argvw[i][l]; l++) c += utf8_encode(utf8arg+c, argvw[i][l], sizeof(utf8arg) - c-1); utf8arg[c] = 0; argv[i] = strdup(utf8arg); @@ -627,17 +627,37 @@ qboolean Sys_GetDesktopParameters(int *width, int *height, int *bpp, int *refres - +#if SDL_MAJOR_VERSION >= 2 //probably could inclued 1.3 +#include char *Sys_GetClipboard(void) { - return NULL; + return SDL_GetClipboardText(); } void Sys_CloseClipboard(char *bf) { + SDL_Free(bf); } void Sys_SaveClipboard(char *text) { + SDL_SetClipboardText(text); } +#else +static char *clipboard_buffer; +char *Sys_GetClipboard(void) +{ + return clipboard_buffer; +} + +void Sys_CloseClipboard(char *bf) +{ +} + +void Sys_SaveClipboard(char *text) +{ + free(clipboard_buffer); + clipboard_buffer = strdup(text); +} +#endif #ifdef MULTITHREAD /* Thread creation calls */ diff --git a/engine/client/textedit.c b/engine/client/textedit.c index 3efbf8914..a5f2e0fd3 100644 --- a/engine/client/textedit.c +++ b/engine/client/textedit.c @@ -502,7 +502,8 @@ void Editor_Key(int key, int unicode) { case K_SHIFT: break; - case K_ALT: + case K_LALT: + case K_RALT: break; case K_CTRL: break; @@ -979,7 +980,7 @@ static void Draw_Line(int vy, fileblock_t *b, int cursorx) { if (d == c) { - int e = Font_DrawChar(nx, y, (int)11 | (CON_WHITEMASK|CON_BLINKTEXT)); + int e = Font_DrawChar(nx, y, (int)0xe00b | (CON_WHITEMASK|CON_BLINKTEXT)); if (e >= vid.pixelwidth) viewportx += e - vid.pixelwidth; if (nx < 0) @@ -1000,7 +1001,7 @@ static void Draw_Line(int vy, fileblock_t *b, int cursorx) if (d == c) { - int e = Font_DrawChar(nx, y, (int)11 | (CON_WHITEMASK|CON_BLINKTEXT)); + int e = Font_DrawChar(nx, y, (int)0xe00b | (CON_WHITEMASK|CON_BLINKTEXT)); if (e >= vid.pixelwidth) viewportx += e - vid.pixelwidth; if (nx < 0) @@ -1018,7 +1019,7 @@ static void Draw_Line(int vy, fileblock_t *b, int cursorx) /*we didn't do the cursor! stick it at the end*/ if (c && c >= d) { - int e = Font_DrawChar(nx, y, (int)11 | (CON_WHITEMASK|CON_BLINKTEXT)); + int e = Font_DrawChar(nx, y, (int)0xe00b | (CON_WHITEMASK|CON_BLINKTEXT)); if (e >= vid.pixelwidth) viewportx += e - vid.pixelwidth; if (nx < 0) diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 07a9e2376..ad73b02ba 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -1971,7 +1971,7 @@ void Cmd_ExecuteString (char *text, int level) #ifndef SERVERONLY //an emergency escape mechansim, to avoid infinatly recursing aliases. extern qboolean keydown[]; - if (keydown[K_SHIFT] && keydown[K_CTRL] && keydown[K_ALT]) + if (keydown[K_SHIFT] && keydown[K_CTRL] && (keydown[K_LALT]||keydown[K_RALT])) return; #endif diff --git a/engine/common/console.h b/engine/common/console.h index 2b860a554..89dba0baf 100644 --- a/engine/common/console.h +++ b/engine/common/console.h @@ -140,9 +140,9 @@ extern console_t *con_chat; //shared between console and keys. //really the console input should be in console.c instead of keys.c I suppose. -#define MAXCMDLINE 256 +#define MAXCMDLINE 8192 #define CON_EDIT_LINES_MASK ((1<<6)-1) -extern unsigned char key_lines[CON_EDIT_LINES_MASK+1][MAXCMDLINE]; +extern unsigned char *key_lines[CON_EDIT_LINES_MASK+1]; extern int edit_line; extern int key_linepos; extern int history_line; diff --git a/engine/d3d/vid_d3d11.c b/engine/d3d/vid_d3d11.c index 16816e68a..3e94043ce 100644 --- a/engine/d3d/vid_d3d11.c +++ b/engine/d3d/vid_d3d11.c @@ -274,7 +274,7 @@ static LRESULT WINAPI D3D11_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR case WM_KEYDOWN: case WM_SYSKEYDOWN: - if (keydown[K_ALT] && wParam == '\r') + if (keydown[K_LALT] && wParam == '\r') { if (modestate == MS_FULLSCREEN) modestate = MS_WINDOWED; diff --git a/engine/dotnet2005/ftequake_SDL.vcproj b/engine/dotnet2005/ftequake_SDL.vcproj index 6b65732c0..6c3218cbd 100644 --- a/engine/dotnet2005/ftequake_SDL.vcproj +++ b/engine/dotnet2005/ftequake_SDL.vcproj @@ -15279,7 +15279,6 @@ + + @@ -26587,170 +26590,6 @@ /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/qclib/execloop.h b/engine/qclib/execloop.h index 51694b48e..5a2cf2c6a 100644 --- a/engine/qclib/execloop.h +++ b/engine/qclib/execloop.h @@ -491,14 +491,13 @@ reeval: case OP_ADDRESS: if ((unsigned)OPA->edict >= (unsigned)maxedicts) { -#ifndef DEBUGABLE - progfuncs->funcs.pr_trace++; - printf("OP_ADDRESS references invalid entity in %s", PR_StringToNative(&progfuncs->funcs, pr_xfunction->s_name)); - st--; - goto cont; -#else - PR_RunError (&progfuncs->funcs, "OP_ADDRESS references invalid entity in %s", PR_StringToNative(&progfuncs->funcs, pr_xfunction->s_name)); -#endif + pr_xstatement = st-pr_statements; + if (PR_RunWarning (&progfuncs->funcs, "OP_ADDRESS references invalid entity in %s", PR_StringToNative(&progfuncs->funcs, pr_xfunction->s_name))) + { + st--; + goto cont; + } + break; } ed = PROG_TO_EDICT(progfuncs, OPA->edict); #ifdef PARANOID @@ -506,22 +505,20 @@ reeval: #endif if (!ed || ed->readonly) { - pr_xstatement = st-pr_statements; -#ifndef DEBUGABLE + //boot it over to the debugger - progfuncs->funcs.pr_trace++; - printf("assignment to read-only entity in %s\n", PR_StringToNative(&progfuncs->funcs, pr_xfunction->s_name)); - st--; - goto cont; -#else { ddef16_t *d16; fdef_t *f; d16 = ED_GlobalAtOfs16(progfuncs, st->a); f = ED_FieldAtOfs(progfuncs, OPB->_int + progfuncs->funcs.fieldadjust); - printf ("assignment to read-only entity in %s (%s.%s)\n", PR_StringToNative(&progfuncs->funcs, pr_xfunction->s_name), d16?PR_StringToNative(&progfuncs->funcs, d16->s_name):NULL, f?f->name:NULL); + pr_xstatement = st-pr_statements; + if (PR_RunWarning(&progfuncs->funcs, "assignment to read-only entity in %s (%s.%s)", PR_StringToNative(&progfuncs->funcs, pr_xfunction->s_name), d16?PR_StringToNative(&progfuncs->funcs, d16->s_name):NULL, f?f->name:NULL)) + { + st--; + goto cont; + } } -#endif } //Whilst the next block would technically be correct, we don't use it as it breaks too many quake mods. diff --git a/engine/qclib/pr_exec.c b/engine/qclib/pr_exec.c index 7d3bfb779..f0f0a8a73 100644 --- a/engine/qclib/pr_exec.c +++ b/engine/qclib/pr_exec.c @@ -393,6 +393,23 @@ void VARGS PR_RunError (pubprogfuncs_t *progfuncs, char *error, ...) progfuncs->parms->Abort ("%s", string); } +pbool PR_RunWarning (pubprogfuncs_t *progfuncs, char *error, ...) +{ + va_list argptr; + char string[1024]; + + va_start (argptr,error); + Q_vsnprintf (string,sizeof(string)-1, error,argptr); + va_end (argptr); + + progfuncs->parms->Printf ("%s, %s\n", string, ((progfuncs->pr_trace)?"ignoring":"enabling trace")); + PR_StackTrace (progfuncs); + + if (progfuncs->pr_trace++ == 0) + return true; + return false; +} + /* ============================================================================ PR_ExecuteProgram @@ -1091,10 +1108,10 @@ static char *lastfile = 0; lastfile = f->s_file+progfuncs->funcs.stringtable; lastline = externs->useeditor(&progfuncs->funcs, lastfile, lastline, statement, 0, NULL); - if (lastline < 0) - return -lastline; if (!pr_progstate[pn].linenums) return statement; + if (lastline < 0) + return -lastline; if (pr_progstate[pn].linenums[statement] != lastline) { diff --git a/engine/server/net_preparse.c b/engine/server/net_preparse.c index f8aaf2dbd..18e016f46 100644 --- a/engine/server/net_preparse.c +++ b/engine/server/net_preparse.c @@ -741,6 +741,19 @@ void NPP_NQFlush(void) bufferlen+=2; break; + case svcfte_cgamepacket: + if (sv.csqcdebug) + { + /*shift the data up by two bytes*/ + memmove(buffer+3, buffer+1, bufferlen-1); + + /*add a length in the 2nd/3rd bytes*/ + buffer[1] = (bufferlen-1); + buffer[2] = (bufferlen-1) >> 8; + + bufferlen += 2; + } + break; case svc_temp_entity: switch (buffer[1]) { @@ -904,8 +917,8 @@ void NPP_NQWriteByte(int dest, qbyte data) //replacement write func (nq to qw) { case svcdp_showlmp: case svcdp_hidelmp: - break; case svc_sound: + break; case svc_temp_entity: te_515sevilhackworkaround = false; break; @@ -919,17 +932,20 @@ void NPP_NQWriteByte(int dest, qbyte data) //replacement write func (nq to qw) nullterms = 1; break; case svc_setfrags: - protocollen = 4; //or this + protocollen = 4; break; case svc_updatecolors: - protocollen = 3; //or even this + protocollen = 3; break; case svc_print: protocollen = 3; nullterms = 1; break; case svc_cdtrack: - protocollen = sizeof(qbyte)*3; + if (progstype == PROG_QW) + protocollen = 2; + else + protocollen = 3; break; case svc_killedmonster: protocollen = 1; @@ -1525,6 +1541,19 @@ void NPP_QWFlush(void) } } + break; + case svcfte_cgamepacket: + if (sv.csqcdebug) + { + /*shift the data up by two bytes*/ + memmove(buffer+3, buffer+1, bufferlen-1); + + /*add a length in the 2nd/3rd bytes*/ + buffer[1] = (bufferlen-1); + buffer[2] = (bufferlen-1) >> 8; + + bufferlen += 2; + } break; case svc_temp_entity: switch(minortype) @@ -1532,17 +1561,19 @@ void NPP_QWFlush(void) default: if (te_515sevilhackworkaround) { - /*shift the data up by two bytes*/ - memmove(buffer+3, buffer+1, bufferlen-1); + if (sv.csqcdebug) + { + /*shift the data up by two bytes*/ + memmove(buffer+3, buffer+1, bufferlen-1); + /*add a length in the 2nd/3rd bytes*/ + buffer[1] = (bufferlen-1); + buffer[2] = (bufferlen-1) >> 8; + + bufferlen += 2; + } /*replace the svc itself*/ buffer[0] = svcfte_cgamepacket; - - /*add a length in the 2nd/3rd bytes*/ - buffer[1] = (bufferlen-1); - buffer[2] = (bufferlen-1) >> 8; - - bufferlen += 2; } break; case TEQW_LIGHTNINGBLOOD: diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 53e472ae6..e4e131bb3 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -463,10 +463,8 @@ int QDECL QCEditor (pubprogfuncs_t *prinst, char *filename, int line, int statem char *r; vfsfile_t *f; - SV_EndRedirect(); - if (line == -1) - return -1; + return line; SV_EndRedirect(); if (developer.value) { @@ -9215,7 +9213,8 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"infokey", PF_infokey, 0, 80, 0, 80, "string(entity e, string key)"}, //80 {"stof", PF_stof, 0, 81, 0, 81, "float(string)"}, //81 - {"multicast", PF_multicast, 0, 82, 0, 82, "void(vector where, float set)"}, //82 + {"multicast", PF_multicast, 0, 82, 0, 82, "#define unicast(pl,reli) do{msg_entity = pl; multicast('0 0 0', reli?MULITCAST_ONE_R:MULTICAST_ONE);}while(0)\n" + "void(vector where, float set)"}, //82 diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 619518d05..23609a2fd 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -4140,7 +4140,7 @@ extern void Log_Init (void); void SV_InitLocal (void) { - int i, p; + int i; extern cvar_t pr_allowbutton1; extern cvar_t sv_aim;