cvar_t noaim = {CVAR_USERINFO | CVAR_SAVE, "noaim", "1", "QW option to disable vertical autoaim"};
qboolean allowcheats = false;
+extern qboolean host_shuttingdown;
+
/*
==================
Host_Quit_f
void Host_Quit_f (void)
{
- Sys_Quit ();
+ if(host_shuttingdown)
+ Con_Printf("shutting down already!\n");
+ else
+ Sys_Quit (0);
}
}
// now call the Pings command also, which will send a report that contains packet loss for the scoreboard (as well as a simpler ping report)
- Host_Pings_f();
+ // actually, don't, it confuses old clients (resulting in "unknown command pingplreport" flooding the console)
+ //Host_Pings_f();
}
/*
}
// version
- COM_ParseTokenConsole(&t);
+ COM_ParseToken_Simple(&t, false);
version = atoi(com_token);
if (version != SAVEGAME_VERSION)
{
}
// description
- // this is a little hard to parse, as : is a separator in COM_ParseToken,
- // so use the console parser instead
- COM_ParseTokenConsole(&t);
+ COM_ParseToken_Simple(&t, false);
for (i = 0;i < NUM_SPAWN_PARMS;i++)
{
- COM_ParseTokenConsole(&t);
+ COM_ParseToken_Simple(&t, false);
spawn_parms[i] = atof(com_token);
}
// skill
- COM_ParseTokenConsole(&t);
+ COM_ParseToken_Simple(&t, false);
// this silliness is so we can load 1.06 save files, which have float skill values
current_skill = (int)(atof(com_token) + 0.5);
Cvar_SetValue ("skill", (float)current_skill);
// mapname
- COM_ParseTokenConsole(&t);
+ COM_ParseToken_Simple(&t, false);
strlcpy (mapname, com_token, sizeof(mapname));
// time
- COM_ParseTokenConsole(&t);
+ COM_ParseToken_Simple(&t, false);
time = atof(com_token);
allowcheats = sv_cheats.integer != 0;
{
// light style
oldt = t;
- COM_ParseTokenConsole(&t);
+ COM_ParseToken_Simple(&t, false);
// if this is a 64 lightstyle savegame produced by Quake, stop now
// we have to check this because darkplaces saves 256 lightstyle savegames
if (com_token[0] == '{')
for(;;)
{
oldt = t;
- COM_ParseTokenConsole(&t);
+ COM_ParseToken_Simple(&t, false);
if (com_token[0] == '{')
{
t = oldt;
for (;;)
{
start = t;
- while (COM_ParseTokenConsole(&t))
+ while (COM_ParseToken_Simple(&t, false))
if (!strcmp(com_token, "}"))
break;
- if (!COM_ParseTokenConsole(&start))
+ if (!COM_ParseToken_Simple(&start, false))
{
// end of file
break;
Host_Error("Host_PerformLoadGame: too many edicts in save file (reached MAX_EDICTS %i)", MAX_EDICTS);
}
while (entnum >= prog->max_edicts)
- //SV_IncreaseEdicts();
PRVM_MEM_IncreaseEdicts();
ent = PRVM_EDICT_NUM(entnum);
memset (ent->fields.server, 0, prog->progs->entityfields * 4);
void Host_Name_f (void)
{
int i, j;
+ qboolean valid_colors;
char newName[sizeof(host_client->name)];
if (Cmd_Argc () == 1)
return;
}
- if (sv.time < host_client->nametime)
+ if (realtime < host_client->nametime)
{
SV_ClientPrintf("You can't change name more than once every 5 seconds!\n");
return;
}
- host_client->nametime = sv.time + 5;
+ host_client->nametime = realtime + 5;
// point the string back at updateclient->name to keep it safe
strlcpy (host_client->name, newName, sizeof (host_client->name));
+
+ COM_StringLengthNoColors(host_client->name, 0, &valid_colors);
+ if(!valid_colors) // NOTE: this also proves the string is not empty, as "" is a valid colored string
+ {
+ size_t l;
+ l = strlen(host_client->name);
+ if(l < sizeof(host_client->name) - 1)
+ {
+ // duplicate the color tag to escape it
+ host_client->name[i] = STRING_COLOR_TAG;
+ host_client->name[i+1] = 0;
+ //Con_DPrintf("abuse detected, adding another trailing color tag\n");
+ }
+ else
+ {
+ // remove the last character to fix the color code
+ host_client->name[l-1] = 0;
+ //Con_DPrintf("abuse detected, removing a trailing color tag\n");
+ }
+ }
+
+ // find the last color tag offset and decide if we need to add a reset tag
+ for (i = 0, j = -1;host_client->name[i];i++)
+ {
+ if (host_client->name[i] == STRING_COLOR_TAG)
+ {
+ if (host_client->name[i+1] >= '0' && host_client->name[i+1] <= '9')
+ {
+ j = i;
+ // if this happens to be a reset tag then we don't need one
+ if (host_client->name[i+1] == '0' + STRING_COLOR_DEFAULT)
+ j = -1;
+ i++;
+ continue;
+ }
+ if (host_client->name[i+1] == STRING_COLOR_TAG)
+ {
+ i++;
+ continue;
+ }
+ }
+ }
+ // does not end in the default color string, so add it
+ if (j >= 0 && strlen(host_client->name) < sizeof(host_client->name) - 2)
+ memcpy(host_client->name + strlen(host_client->name), STRING_COLOR_DEFAULT_STR, strlen(STRING_COLOR_DEFAULT_STR) + 1);
+
host_client->edict->fields.server->netname = PRVM_SetEngineString(host_client->name);
if (strcmp(host_client->old_name, host_client->name))
{
}
/*
- if (sv.time < host_client->nametime)
+ if (realtime < host_client->nametime)
{
SV_ClientPrintf("You can't change playermodel more than once every 5 seconds!\n");
return;
}
- host_client->nametime = sv.time + 5;
+ host_client->nametime = realtime + 5;
*/
// point the string back at updateclient->name to keep it safe
}
/*
- if (sv.time < host_client->nametime)
+ if (realtime < host_client->nametime)
{
SV_ClientPrintf("You can't change playermodel more than once every 5 seconds!\n");
return;
}
- host_client->nametime = sv.time + 5;
+ host_client->nametime = realtime + 5;
*/
// point the string back at updateclient->name to keep it safe
}
// note this uses the chat prefix \001
if (!fromServer && !teamonly)
- dpsnprintf (text, sizeof(text), "\001%s" STRING_COLOR_DEFAULT_STR ": %s", host_client->name, p1);
+ dpsnprintf (text, sizeof(text), "\001%s: %s", host_client->name, p1);
else if (!fromServer && teamonly)
- dpsnprintf (text, sizeof(text), "\001(%s" STRING_COLOR_DEFAULT_STR "): %s", host_client->name, p1);
+ dpsnprintf (text, sizeof(text), "\001(%s): %s", host_client->name, p1);
else if(*(sv_adminnick.string))
- dpsnprintf (text, sizeof(text), "\001<%s" STRING_COLOR_DEFAULT_STR "> %s", sv_adminnick.string, p1);
+ dpsnprintf (text, sizeof(text), "\001<%s> %s", sv_adminnick.string, p1);
else
- dpsnprintf (text, sizeof(text), "\001<%s" STRING_COLOR_DEFAULT_STR "> %s", hostname.string, p1);
+ dpsnprintf (text, sizeof(text), "\001<%s> %s", hostname.string, p1);
p2 = text + strlen(text);
while ((const char *)p2 > (const char *)text && (p2[-1] == '\r' || p2[-1] == '\n' || (p2[-1] == '\"' && quoted)))
{
Host_Color(-1, atoi(Cmd_Argv(1)));
}
-cvar_t cl_rate = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_rate", "10000", "internal storage cvar for current rate (changed by rate command)"};
+cvar_t cl_rate = {CVAR_SAVE | CVAR_NQUSERINFOHACK, "_cl_rate", "20000", "internal storage cvar for current rate (changed by rate command)"};
void Host_Rate_f(void)
{
int rate;
SZ_Write (&host_client->netconnection->message, sv.signon.data, sv.signon.cursize);
MSG_WriteByte (&host_client->netconnection->message, svc_signonnum);
MSG_WriteByte (&host_client->netconnection->message, 2);
+ host_client->sendsignon = 0; // enable unlimited sends again
}
// reset the name change timer because the client will send name soon
if (Cmd_Argc() > 2)
{
message = Cmd_Args();
- COM_ParseTokenConsole(&message);
+ COM_ParseToken_Simple(&message, false);
if (byNumber)
{
message++; // skip the #
{
int i, c;
- if (cls.state == ca_dedicated || COM_CheckParm("-listen") || COM_CheckParm("-benchmark") || COM_CheckParm("-demo"))
+ if (cls.state == ca_dedicated || COM_CheckParm("-listen") || COM_CheckParm("-benchmark") || COM_CheckParm("-demo") || COM_CheckParm("-capturedemo"))
return;
c = Cmd_Argc() - 1;
{
int i;
cvar_t *c;
+ const char *cvarname;
client_t *old;
if(Cmd_Argc() != 2)
return;
- c = Cvar_FindVar(Cmd_Argv(1));
+ cvarname = Cmd_Argv(1);
if (cls.state == ca_connected)
{
+ c = Cvar_FindVar(cvarname);
// LordHavoc: if there is no such cvar or if it is private, send a
// reply indicating that it has no value
if(!c || (c->flags & CVAR_PRIVATE))
- Cmd_ForwardStringToServer(va("sentcvar %s\n", c->name));
+ Cmd_ForwardStringToServer(va("sentcvar %s", cvarname));
else
- Cmd_ForwardStringToServer(va("sentcvar %s \"%s\"\n", c->name, c->string));
+ Cmd_ForwardStringToServer(va("sentcvar %s \"%s\"", c->name, c->string));
return;
}
if(!sv.active)// || !prog->funcoffsets.SV_ParseClientCommand)
if(svs.clients[i].active && svs.clients[i].netconnection)
{
host_client = &svs.clients[i];
- Host_ClientCommands(va("sendcvar %s\n", c->name));
+ Host_ClientCommands(va("sendcvar %s\n", cvarname));
}
host_client = old;
}
{
packetloss = 0;
if (svs.clients[i].netconnection)
- for (j = 0;j < 100;j++)
- packetloss += svs.clients[i].netconnection->packetlost[j];
+ for (j = 0;j < NETGRAPH_PACKETS;j++)
+ if (svs.clients[i].netconnection->incoming_unreliablesize[j] == NETGRAPH_LOSTPACKET)
+ packetloss++;
+ packetloss = packetloss * 100 / NETGRAPH_PACKETS;
ping = (int)floor(svs.clients[i].ping*1000+0.5);
ping = bound(0, ping, 9999);
if (sv.protocol == PROTOCOL_QUAKEWORLD)
*/
void Host_InitCommands (void)
{
- dpsnprintf(cls.userinfo, sizeof(cls.userinfo), "\\name\\player\\team\\none\\topcolor\\0\\bottomcolor\\0\\rate\\10000\\msg\\1\\noaim\\1\\*ver\\%s", engineversion);
+ dpsnprintf(cls.userinfo, sizeof(cls.userinfo), "\\name\\player\\team\\none\\topcolor\\0\\bottomcolor\\0\\rate\\10000\\msg\\1\\noaim\\1\\*ver\\dp");
Cmd_AddCommand_WithClientCommand ("status", Host_Status_f, Host_Status_f, "print server status information");
Cmd_AddCommand ("quit", Host_Quit_f, "quit the game");