line[index++] = STRING_COLOR_DEFAULT + '0';
// special color codes for chat messages must always come first
// for Con_PrintToHistory to work properly
- if (*msg <= 2)
+ if (*msg == 1 || *msg == 2)
{
+ // play talk wav
if (*msg == 1)
- {
- // play talk wav
S_LocalSound ("sound/misc/talk.wav");
- }
- //if (gamemode == GAME_NEXUIZ)
- //{
- line[index++] = STRING_COLOR_TAG;
- line[index++] = '3';
- //}
- //else
- //{
- // // go to colored text
- // mask = 128;
- //}
+ line[index++] = STRING_COLOR_TAG;
+ line[index++] = '3';
msg++;
}
// store timestamp
if (!key_consoleactive)
return; // don't draw anything
- text = strcpy(editlinecopy, key_lines[edit_line]);
+ strlcpy(editlinecopy, key_lines[edit_line], sizeof(editlinecopy));
+ text = editlinecopy;
// Advanced Console Editing by Radix radix@planetquake.com
// Added/Modified by EvilTypeGuy eviltypeguy@qeradiant.com
{
float x, v;
char *text;
- int i;
+ int i, stop;
float time;
char temptext[MAX_INPUTLINE];
int colorindex = -1; //-1 for default
v = 8;
else
v = 0;
- for (i= con_current-con_notify.integer+1 ; i<=con_current ; i++)
+ // make a copy of con_current here so that we can't get in a runaway loop printing new messages while drawing the notify text
+ stop = con_current;
+ for (i= stop-con_notify.integer+1 ; i<=stop ; i++)
{
if (i < 0)
text = con_text + (i % con_totallines)*con_linewidth;
if (gamemode == GAME_NEXUIZ) {
- int linewidth;
+ int chars = 0;
+ int finalchars = 0;
+ int j;
- for (linewidth = con_linewidth; linewidth && text[linewidth-1] == ' '; linewidth--);
- x = (vid_conwidth.integer - linewidth * con_textsize.value) * 0.5;
+ // count up to the last non-whitespace, and ignore color codes
+ for (j = 0;j < con_linewidth && text[j];j++)
+ {
+ if (text[j] == '^' && (text[j+1] >= '0' && text[j+1] <= '9'))
+ {
+ j++;
+ continue;
+ }
+ chars++;
+ if (text[j] == ' ')
+ continue;
+ finalchars = chars;
+ }
+ // center the line using the calculated width
+ x = (vid_conwidth.integer - finalchars * con_textsize.value) * 0.5;
} else
x = 0;
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 );
- strcpy(temptext, &temptext[con_linewidth]);
+ strlcpy(temptext, &temptext[con_linewidth], sizeof(temptext));
v += con_textsize.value;
}
if (strlen(temptext) > 0)
*/
void Con_DrawConsole (int lines)
{
- int i, rows, j;
+ int i, rows, j, stop;
float y;
char *text;
int colorindex = -1;
rows = (int)ceil((lines/con_textsize.value)-2); // rows of text to draw
y = lines - (rows+2)*con_textsize.value; // may start slightly negative
- for (i = con_current - rows + 1;i <= con_current;i++, y += con_textsize.value)
+ // make a copy of con_current here so that we can't get in a runaway loop printing new messages while drawing the notify text
+ stop = con_current;
+ for (i = stop - rows + 1;i <= stop;i++, y += con_textsize.value)
{
j = max(i - con_backscroll, 0);
text = con_text + (j % con_totallines)*con_linewidth;
return false;
if (t->numfilenames > 1)
Con_Printf("^1 %i maps found :\n", t->numfilenames);
- len = Z_Malloc(t->numfilenames);
+ len = (unsigned char *)Z_Malloc(t->numfilenames);
min = 666;
for(max=i=0;i<t->numfilenames;i++)
{
const char *data = NULL;
char keyname[64];
char entfilename[MAX_QPATH];
- strcpy(message, "^1**ERROR**^7");
+ strlcpy(message, "^1**ERROR**^7", sizeof(message));
p = 0;
f = FS_Open(t->filenames[i], "rb", true, false);
if(f)
else
p = 0;
strlcpy(entfilename, t->filenames[i], sizeof(entfilename));
- strcpy(entfilename + strlen(entfilename) - 4, ".ent");
+ memcpy(entfilename + strlen(entfilename) - 4, ".ent", 5);
entities = (char *)FS_LoadFile(entfilename, tempmempool, true, NULL);
if (!entities && lumplen >= 10)
{
FS_Seek(f, lumpofs, SEEK_SET);
- entities = Z_Malloc(lumplen + 1);
+ entities = (char *)Z_Malloc(lumplen + 1);
FS_Read(f, entities, lumplen);
}
if (entities)
for (;;)
{
int l;
- if (!COM_ParseToken(&data, false))
+ if (!COM_ParseTokenConsole(&data))
break;
if (com_token[0] == '{')
continue;
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_ParseToken(&data, false))
+ if (!COM_ParseTokenConsole(&data))
break;
if (developer.integer >= 100)
Con_Printf("key: %s %s\n", keyname, com_token);
*(t->filenames[i]+len[i]+5) = 0;
switch(p)
{
- case Q3BSPVERSION: strcpy((char *)buf, "Q3");break;
- case Q2BSPVERSION: strcpy((char *)buf, "Q2");break;
- case BSPVERSION: strcpy((char *)buf, "Q1");break;
- case MCBSPVERSION: strcpy((char *)buf, "MC");break;
- case 30: strcpy((char *)buf, "HL");break;
- default: strcpy((char *)buf, "??");break;
+ case Q3BSPVERSION: strlcpy((char *)buf, "Q3", sizeof(buf));break;
+ case Q2BSPVERSION: strlcpy((char *)buf, "Q2", sizeof(buf));break;
+ case BSPVERSION: strlcpy((char *)buf, "Q1", sizeof(buf));break;
+ case MCBSPVERSION: strlcpy((char *)buf, "MC", sizeof(buf));break;
+ case 30: strlcpy((char *)buf, "HL", sizeof(buf));break;
+ default: strlcpy((char *)buf, "??", sizeof(buf));break;
}
Con_Printf("%16s (%s) %s\n", t->filenames[i]+5, buf, message);
}
if (!(c + v + a)) // No possible matches
{
if(s2[0])
- strcpy(&key_lines[edit_line][key_linepos], s2);
+ strlcpy(&key_lines[edit_line][key_linepos], s2, sizeof(key_lines[edit_line]) - key_linepos);
return;
}