//============================================================================
-/*
-======================
-SV_Name_f
-======================
-*/
-static void SV_Name_f(cmd_state_t *cmd)
-{
- prvm_prog_t *prog = SVVM_prog;
- int i, j;
- qboolean valid_colors;
- const char *newNameSource;
- char newName[sizeof(host_client->name)];
-
- if (Cmd_Argc (cmd) == 1)
- return;
-
- if (Cmd_Argc (cmd) == 2)
- newNameSource = Cmd_Argv(cmd, 1);
- else
- newNameSource = Cmd_Args(cmd);
-
- strlcpy(newName, newNameSource, sizeof(newName));
-
- if (cmd->source == src_command)
- return;
-
- if (host.realtime < host_client->nametime && strcmp(newName, host_client->name))
- {
- SV_ClientPrintf("You can't change name more than once every %.1f seconds!\n", max(0.0f, sv_namechangetimer.value));
- return;
- }
-
- host_client->nametime = host.realtime + max(0.0f, sv_namechangetimer.value);
-
- // point the string back at updateclient->name to keep it safe
- strlcpy (host_client->name, newName, sizeof (host_client->name));
-
- for (i = 0, j = 0;host_client->name[i];i++)
- if (host_client->name[i] != '\r' && host_client->name[i] != '\n')
- host_client->name[j++] = host_client->name[i];
- host_client->name[j] = 0;
-
- if(host_client->name[0] == 1 || host_client->name[0] == 2)
- // may interfere with chat area, and will needlessly beep; so let's add a ^7
- {
- memmove(host_client->name + 2, host_client->name, sizeof(host_client->name) - 2);
- host_client->name[sizeof(host_client->name) - 1] = 0;
- host_client->name[0] = STRING_COLOR_TAG;
- host_client->name[1] = '0' + STRING_COLOR_DEFAULT;
- }
-
- u8_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_RGB_TAG_CHAR && isxdigit(host_client->name[i+2]) && isxdigit(host_client->name[i+3]) && isxdigit(host_client->name[i+4]))
- {
- j = i;
- i += 4;
- 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);
-
- PRVM_serveredictstring(host_client->edict, netname) = PRVM_SetEngineString(prog, host_client->name);
- if (strcmp(host_client->old_name, host_client->name))
- {
- if (host_client->begun)
- SV_BroadcastPrintf("%s ^7changed name to %s\n", host_client->old_name, host_client->name);
- strlcpy(host_client->old_name, host_client->name, sizeof(host_client->old_name));
- // send notification to all clients
- MSG_WriteByte (&sv.reliable_datagram, svc_updatename);
- MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
- MSG_WriteString (&sv.reliable_datagram, host_client->name);
- SV_WriteNetnameIntoDemo(host_client);
- }
-}
-
/*
======================
CL_Playermodel_f
==================
*/
cvar_t cl_color = {CVAR_READONLY | CVAR_CLIENT | CVAR_SAVE, "_cl_color", "0", "internal storage cvar for current player colors (changed by color command)"};
-static void CL_Color(cmd_state_t *cmd, int changetop, int changebottom)
-{
- /*
- * This is just a convenient way to change topcolor and bottomcolor
- * We can't change cl_color from here directly because topcolor and
- * bottomcolor may be changed separately and do not call this function.
- * So it has to be changed when the userinfo strings are updated, which
- * happens twice here. Perhaps find a cleaner way?
- */
-
- prvm_prog_t *prog = SVVM_prog;
- int top, bottom, playercolor;
-
- // get top and bottom either from the provided values or the current values
- // (allows changing only top or bottom, or both at once)
- top = changetop >= 0 ? changetop : (topcolor.integer);
- bottom = changebottom >= 0 ? changebottom : bottomcolor.integer;
-
- top &= 15;
- bottom &= 15;
- // LadyHavoc: allowing skin colormaps 14 and 15 by commenting this out
- //if (top > 13)
- // top = 13;
- //if (bottom > 13)
- // bottom = 13;
-
- playercolor = top*16 + bottom;
-
- if (cmd->source == src_command)
- {
- Cvar_SetValueQuick(&topcolor, top);
- Cvar_SetValueQuick(&bottomcolor, bottom);
- return;
- }
-
- if (cls.protocol == PROTOCOL_QUAKEWORLD)
- return;
-
- if (host_client->edict && PRVM_serverfunction(SV_ChangeTeam))
- {
- Con_DPrint("Calling SV_ChangeTeam\n");
- prog->globals.fp[OFS_PARM0] = playercolor;
- PRVM_serverglobalfloat(time) = sv.time;
- PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(host_client->edict);
- prog->ExecuteProgram(prog, PRVM_serverfunction(SV_ChangeTeam), "QC function SV_ChangeTeam is missing");
- }
- else
- {
- if (host_client->edict)
- {
- PRVM_serveredictfloat(host_client->edict, clientcolors) = playercolor;
- PRVM_serveredictfloat(host_client->edict, team) = bottom + 1;
- }
- host_client->colors = playercolor;
- if (host_client->old_colors != host_client->colors)
- {
- host_client->old_colors = host_client->colors;
- // send notification to all clients
- MSG_WriteByte (&sv.reliable_datagram, svc_updatecolors);
- MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
- MSG_WriteByte (&sv.reliable_datagram, host_client->colors);
- }
- }
-}
// Ignore the callbacks so this two-to-three way synchronization doesn't cause an infinite loop.
static void CL_Color_c(char *string)
static void CL_Color_f(cmd_state_t *cmd)
{
- int top, bottom;
+ int top, bottom;
if (Cmd_Argc(cmd) == 1)
{
top = atoi(Cmd_Argv(cmd, 1));
bottom = atoi(Cmd_Argv(cmd, 2));
}
- CL_Color(cmd, top, bottom);
-}
+ /*
+ * This is just a convenient way to change topcolor and bottomcolor
+ * We can't change cl_color from here directly because topcolor and
+ * bottomcolor may be changed separately and do not call this function.
+ * So it has to be changed when the userinfo strings are updated, which
+ * happens twice here. Perhaps find a cleaner way?
+ */
-cvar_t rate = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "rate", "20000", "change your connection speed"};
-cvar_t rate_burstsize = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "rate_burstsize", "1024", "internal storage cvar for current rate control burst size (changed by rate_burstsize command)"};
-static void SV_Rate_f(cmd_state_t *cmd)
-{
- int rate;
+ top &= 15;
+ bottom &= 15;
- rate = atoi(Cmd_Argv(cmd, 1));
+ // LadyHavoc: allowing skin colormaps 14 and 15 by commenting this out
+ //if (top > 13)
+ // top = 13;
+ //if (bottom > 13)
+ // bottom = 13;
if (cmd->source == src_command)
+ {
+ Cvar_SetValueQuick(&topcolor, top);
+ Cvar_SetValueQuick(&bottomcolor, bottom);
return;
-
- host_client->rate = rate;
+ }
}
-static void SV_Rate_BurstSize_f(cmd_state_t *cmd)
-{
- int rate_burstsize;
-
- if (Cmd_Argc(cmd) != 2)
- return;
-
- rate_burstsize = atoi(Cmd_Argv(cmd, 1));
-
- host_client->rate_burstsize = rate_burstsize;
-}
+cvar_t rate = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "rate", "20000", "change your connection speed"};
+cvar_t rate_burstsize = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "rate_burstsize", "1024", "internal storage cvar for current rate control burst size (changed by rate_burstsize command)"};
/*
======================
Cvar_RegisterVariable(&skin);
Cvar_RegisterVariable(&noaim);
- Cmd_AddCommand(CMD_USERINFO, "name", SV_Name_f, "change your player name");
Cmd_AddCommand(CMD_CLIENT, "color", CL_Color_f, "change your player shirt and pants colors");
- Cmd_AddCommand(CMD_USERINFO, "color", CL_Color_f, "change your player shirt and pants colors");
- Cmd_AddCommand(CMD_USERINFO, "rate", SV_Rate_f, "change your network connection speed");
- Cmd_AddCommand(CMD_USERINFO, "rate_burstsize", SV_Rate_BurstSize_f, "change your network connection speed");
Cmd_AddCommand(CMD_USERINFO, "pmodel", CL_PModel_f, "(Nehahra-only) change your player model choice");
Cmd_AddCommand(CMD_USERINFO, "playermodel", CL_Playermodel_f, "change your player model");
Cmd_AddCommand(CMD_USERINFO, "playerskin", CL_Playerskin_f, "change your player skin number");
*/
#include <quakedef.h>
+#include <utf8lib.h>
#include <server.h>
+#include <sv_demo.h>
int current_skill;
cvar_t sv_cheats = {CVAR_SERVER | CVAR_NOTIFY, "sv_cheats", "0", "enables cheat commands in any game, and cheat impulses in dpmod"};
}
}
+/*
+======================
+SV_Name_f
+======================
+*/
+static void SV_Name_f(cmd_state_t *cmd)
+{
+ prvm_prog_t *prog = SVVM_prog;
+ int i, j;
+ qboolean valid_colors;
+ const char *newNameSource;
+ char newName[sizeof(host_client->name)];
+
+ if (Cmd_Argc (cmd) == 1)
+ return;
+
+ if (Cmd_Argc (cmd) == 2)
+ newNameSource = Cmd_Argv(cmd, 1);
+ else
+ newNameSource = Cmd_Args(cmd);
+
+ strlcpy(newName, newNameSource, sizeof(newName));
+
+ if (cmd->source == src_command)
+ return;
+
+ if (host.realtime < host_client->nametime && strcmp(newName, host_client->name))
+ {
+ SV_ClientPrintf("You can't change name more than once every %.1f seconds!\n", max(0.0f, sv_namechangetimer.value));
+ return;
+ }
+
+ host_client->nametime = host.realtime + max(0.0f, sv_namechangetimer.value);
+
+ // point the string back at updateclient->name to keep it safe
+ strlcpy (host_client->name, newName, sizeof (host_client->name));
+
+ for (i = 0, j = 0;host_client->name[i];i++)
+ if (host_client->name[i] != '\r' && host_client->name[i] != '\n')
+ host_client->name[j++] = host_client->name[i];
+ host_client->name[j] = 0;
+
+ if(host_client->name[0] == 1 || host_client->name[0] == 2)
+ // may interfere with chat area, and will needlessly beep; so let's add a ^7
+ {
+ memmove(host_client->name + 2, host_client->name, sizeof(host_client->name) - 2);
+ host_client->name[sizeof(host_client->name) - 1] = 0;
+ host_client->name[0] = STRING_COLOR_TAG;
+ host_client->name[1] = '0' + STRING_COLOR_DEFAULT;
+ }
+
+ u8_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_RGB_TAG_CHAR && isxdigit(host_client->name[i+2]) && isxdigit(host_client->name[i+3]) && isxdigit(host_client->name[i+4]))
+ {
+ j = i;
+ i += 4;
+ 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);
+
+ PRVM_serveredictstring(host_client->edict, netname) = PRVM_SetEngineString(prog, host_client->name);
+ if (strcmp(host_client->old_name, host_client->name))
+ {
+ if (host_client->begun)
+ SV_BroadcastPrintf("%s ^7changed name to %s\n", host_client->old_name, host_client->name);
+ strlcpy(host_client->old_name, host_client->name, sizeof(host_client->old_name));
+ // send notification to all clients
+ MSG_WriteByte (&sv.reliable_datagram, svc_updatename);
+ MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
+ MSG_WriteString (&sv.reliable_datagram, host_client->name);
+ SV_WriteNetnameIntoDemo(host_client);
+ }
+}
+
+static void SV_Rate_f(cmd_state_t *cmd)
+{
+ int rate;
+
+ rate = atoi(Cmd_Argv(cmd, 1));
+
+ if (cmd->source == src_command)
+ return;
+
+ host_client->rate = rate;
+}
+
+static void SV_Rate_BurstSize_f(cmd_state_t *cmd)
+{
+ int rate_burstsize;
+
+ if (Cmd_Argc(cmd) != 2)
+ return;
+
+ rate_burstsize = atoi(Cmd_Argv(cmd, 1));
+
+ host_client->rate_burstsize = rate_burstsize;
+}
+
+static void SV_Color_f(cmd_state_t *cmd)
+{
+ prvm_prog_t *prog = SVVM_prog;
+
+ int top, bottom, playercolor;
+
+ top = atoi(Cmd_Argv(cmd, 1));
+ bottom = atoi(Cmd_Argv(cmd, 2));
+
+ playercolor = top*16 + bottom;
+
+ if (host_client->edict && PRVM_serverfunction(SV_ChangeTeam))
+ {
+ Con_DPrint("Calling SV_ChangeTeam\n");
+ prog->globals.fp[OFS_PARM0] = playercolor;
+ PRVM_serverglobalfloat(time) = sv.time;
+ PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(host_client->edict);
+ prog->ExecuteProgram(prog, PRVM_serverfunction(SV_ChangeTeam), "QC function SV_ChangeTeam is missing");
+ }
+ else
+ {
+ if (host_client->edict)
+ {
+ PRVM_serveredictfloat(host_client->edict, clientcolors) = playercolor;
+ PRVM_serveredictfloat(host_client->edict, team) = bottom + 1;
+ }
+ host_client->colors = playercolor;
+ if (host_client->old_colors != host_client->colors)
+ {
+ host_client->old_colors = host_client->colors;
+ // send notification to all clients
+ MSG_WriteByte (&sv.reliable_datagram, svc_updatecolors);
+ MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
+ MSG_WriteByte (&sv.reliable_datagram, host_client->colors);
+ }
+ }
+}
+
/*
==================
SV_Kick_f
Cmd_AddCommand(CMD_CHEAT | CMD_SERVER_FROM_CLIENT, "noclip", SV_Noclip_f, "noclip mode (flight without collisions, move through walls)");
Cmd_AddCommand(CMD_CHEAT | CMD_SERVER_FROM_CLIENT, "give", SV_Give_f, "alter inventory");
Cmd_AddCommand(CMD_SERVER_FROM_CLIENT, "kill", SV_Kill_f, "die instantly");
+
+ Cmd_AddCommand(CMD_USERINFO, "color", SV_Color_f, "change your player shirt and pants colors");
+ Cmd_AddCommand(CMD_USERINFO, "name", SV_Name_f, "change your player name");
+ Cmd_AddCommand(CMD_USERINFO, "rate", SV_Rate_f, "change your network connection speed");
+ Cmd_AddCommand(CMD_USERINFO, "rate_burstsize", SV_Rate_BurstSize_f, "change your network connection speed");
}
\ No newline at end of file