X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=host_cmd.c;h=a7109dd4d53461e8c8d9d5c337d75dcd2cbc1d0a;hb=3a237df932bf2f895e9a026f72cd155e70ae3c3d;hp=53e35a3b4fd8600df1c265380726b93900760915;hpb=28b6442c3d8b337e36a8b402c55b47696fb9085a;p=xonotic%2Fdarkplaces.git diff --git a/host_cmd.c b/host_cmd.c index 53e35a3b..a7109dd4 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -38,135 +38,19 @@ cvar_t rcon_password = {CVAR_CLIENT | CVAR_SERVER | CVAR_PRIVATE, "rcon_password cvar_t rcon_secure = {CVAR_CLIENT | CVAR_SERVER, "rcon_secure", "0", "force secure rcon authentication (1 = time based, 2 = challenge based); NOTE: changing rcon_secure clears rcon_password, so set rcon_secure always before rcon_password"}; cvar_t rcon_secure_challengetimeout = {CVAR_CLIENT, "rcon_secure_challengetimeout", "5", "challenge-based secure rcon: time out requests if no challenge came within this time interval"}; cvar_t rcon_address = {CVAR_CLIENT, "rcon_address", "", "server address to send rcon commands to (when not connected to a server)"}; -cvar_t name = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "name", "player", "change your player name"}; -cvar_t topcolor = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "topcolor", "0", "change the color of your shirt"}; -cvar_t bottomcolor = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "bottomcolor", "0", "change the color of your pants"}; -cvar_t team = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "team", "none", "QW team (4 character limit, example: blue)"}; -cvar_t skin = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "skin", "", "QW player skin name (example: base)"}; -cvar_t playermodel = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "playermodel", "", "current player model in Nexuiz/Xonotic"}; -cvar_t playerskin = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "playerskin", "", "current player skin in Nexuiz/Xonotic"}; -cvar_t noaim = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "noaim", "1", "QW option to disable vertical autoaim"}; -cvar_t pmodel = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "pmodel", "0", "current player model number in nehahra"}; +cvar_t cl_name = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "name", "player", "change your player name"}; +cvar_t cl_topcolor = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "topcolor", "0", "change the color of your shirt"}; +cvar_t cl_bottomcolor = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "bottomcolor", "0", "change the color of your pants"}; +cvar_t cl_team = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "team", "none", "QW team (4 character limit, example: blue)"}; +cvar_t cl_skin = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "skin", "", "QW player skin name (example: base)"}; +cvar_t cl_playermodel = {CVAR_CLIENT | CVAR_SERVER | CVAR_USERINFO | CVAR_SAVE, "playermodel", "", "current player model in Nexuiz/Xonotic"}; +cvar_t cl_playerskin = {CVAR_CLIENT | CVAR_SERVER | CVAR_USERINFO | CVAR_SAVE, "playerskin", "", "current player skin in Nexuiz/Xonotic"}; +cvar_t cl_noaim = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "noaim", "1", "QW option to disable vertical autoaim"}; +cvar_t cl_pmodel = {CVAR_CLIENT | CVAR_USERINFO | CVAR_SAVE, "pmodel", "0", "current player model number in nehahra"}; cvar_t r_fixtrans_auto = {CVAR_CLIENT, "r_fixtrans_auto", "0", "automatically fixtrans textures (when set to 2, it also saves the fixed versions to a fixtrans directory)"}; //============================================================================ -/* -====================== -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 @@ -183,7 +67,7 @@ static void CL_Playermodel_f(cmd_state_t *cmd) { if (cmd->source == src_command) { - Con_Printf("\"playermodel\" is \"%s\"\n", playermodel.string); + Con_Printf("\"playermodel\" is \"%s\"\n", cl_playermodel.string); } return; } @@ -242,7 +126,7 @@ static void CL_Playerskin_f(cmd_state_t *cmd) { if (cmd->source == src_command) { - Con_Printf("\"playerskin\" is \"%s\"\n", playerskin.string); + Con_Printf("\"playerskin\" is \"%s\"\n", cl_playerskin.string); } return; } @@ -294,103 +178,39 @@ CL_Color_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_c(cvar_t *var) { char vabuf[1024]; - Cvar_Set_NoCallback(&topcolor, va(vabuf, sizeof(vabuf), "%i", ((atoi(string) >> 4) & 15))); - Cvar_Set_NoCallback(&bottomcolor, va(vabuf, sizeof(vabuf), "%i", (atoi(string) & 15))); + Cvar_Set_NoCallback(&cl_topcolor, va(vabuf, sizeof(vabuf), "%i", ((var->integer >> 4) & 15))); + Cvar_Set_NoCallback(&cl_bottomcolor, va(vabuf, sizeof(vabuf), "%i", (var->integer & 15))); } -static void CL_Topcolor_c(char *string) +static void CL_Topcolor_c(cvar_t *var) { char vabuf[1024]; - Cvar_Set_NoCallback(&cl_color, va(vabuf, sizeof(vabuf), "%i", atoi(string)*16 + bottomcolor.integer)); + Cvar_Set_NoCallback(&cl_color, va(vabuf, sizeof(vabuf), "%i", var->integer*16 + cl_bottomcolor.integer)); } -static void CL_Bottomcolor_c(char *string) +static void CL_Bottomcolor_c(cvar_t *var) { char vabuf[1024]; - Cvar_Set_NoCallback(&cl_color, va(vabuf, sizeof(vabuf), "%i", topcolor.integer*16 + atoi(string))); + Cvar_Set_NoCallback(&cl_color, va(vabuf, sizeof(vabuf), "%i", cl_topcolor.integer*16 + var->integer)); } static void CL_Color_f(cmd_state_t *cmd) { - int top, bottom; + int top, bottom; if (Cmd_Argc(cmd) == 1) { if (cmd->source == src_command) { - Con_Printf("\"color\" is \"%i %i\"\n", topcolor.integer, bottomcolor.integer); + Con_Printf("\"color\" is \"%i %i\"\n", cl_topcolor.integer, cl_bottomcolor.integer); Con_Print("color <0-15> [0-15]\n"); } return; @@ -403,34 +223,36 @@ static void CL_Color_f(cmd_state_t *cmd) 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 = top >= 0 ? top : cl_topcolor.integer; + bottom = bottom >= 0 ? bottom : cl_bottomcolor.integer; - rate = atoi(Cmd_Argv(cmd, 1)); + 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; if (cmd->source == src_command) + { + Cvar_SetValueQuick(&cl_topcolor, top); + Cvar_SetValueQuick(&cl_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 cl_rate = {CVAR_CLIENT | CVAR_SAVE | CVAR_USERINFO, "rate", "20000", "change your connection speed"}; +cvar_t cl_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)"}; /* ====================== @@ -448,7 +270,7 @@ static void CL_PModel_f(cmd_state_t *cmd) { if (cmd->source == src_command) { - Con_Printf("\"pmodel\" is \"%s\"\n", pmodel.string); + Con_Printf("\"pmodel\" is \"%s\"\n", cl_pmodel.string); } return; } @@ -456,7 +278,7 @@ static void CL_PModel_f(cmd_state_t *cmd) if (cmd->source == src_command) { - if (pmodel.integer == i) + if (cl_pmodel.integer == i) return; Cvar_SetValue (&cvars_all, "_cl_pmodel", i); if (cls.state == ca_connected) @@ -660,12 +482,12 @@ static void CL_Rcon_f(cmd_state_t *cmd) // credit: taken from QuakeWorld } } -static void CL_RCon_ClearPassword_c(char *string) +static void CL_RCon_ClearPassword_c(cvar_t *var) { // whenever rcon_secure is changed to 0, clear rcon_password for // security reasons (prevents a send-rcon-password-as-plaintext // attack based on NQ protocol session takeover and svc_stufftext) - if(atoi(string) <= 0) + if(var->integer <= 0) Cvar_SetQuick(&rcon_password, ""); } @@ -872,39 +694,35 @@ 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\\dp"); - Cvar_RegisterVariable(&name); - Cvar_RegisterAlias(&name, "_cl_name"); + Cvar_RegisterVariable(&cl_name); + Cvar_RegisterAlias(&cl_name, "_cl_name"); Cvar_RegisterVariable(&cl_color); Cvar_RegisterCallback(&cl_color, CL_Color_c); - Cvar_RegisterVariable(&topcolor); - Cvar_RegisterCallback(&topcolor, CL_Topcolor_c); - Cvar_RegisterVariable(&bottomcolor); - Cvar_RegisterCallback(&bottomcolor, CL_Bottomcolor_c); - Cvar_RegisterVariable(&rate); - Cvar_RegisterAlias(&rate, "_cl_rate"); - Cvar_RegisterVariable(&rate_burstsize); - Cvar_RegisterAlias(&rate_burstsize, "_cl_rate_burstsize"); - Cvar_RegisterVariable(&pmodel); - Cvar_RegisterAlias(&pmodel, "_cl_pmodel"); - Cvar_RegisterVariable(&playermodel); - Cvar_RegisterAlias(&playermodel, "_cl_playermodel"); - Cvar_RegisterVariable(&playerskin); - Cvar_RegisterAlias(&playerskin, "_cl_playerskin"); + Cvar_RegisterVariable(&cl_topcolor); + Cvar_RegisterCallback(&cl_topcolor, CL_Topcolor_c); + Cvar_RegisterVariable(&cl_bottomcolor); + Cvar_RegisterCallback(&cl_bottomcolor, CL_Bottomcolor_c); + Cvar_RegisterVariable(&cl_rate); + Cvar_RegisterAlias(&cl_rate, "_cl_rate"); + Cvar_RegisterVariable(&cl_rate_burstsize); + Cvar_RegisterAlias(&cl_rate_burstsize, "_cl_rate_burstsize"); + Cvar_RegisterVariable(&cl_pmodel); + Cvar_RegisterAlias(&cl_pmodel, "_cl_pmodel"); + Cvar_RegisterVariable(&cl_playermodel); + Cvar_RegisterAlias(&cl_playermodel, "_cl_playermodel"); + Cvar_RegisterVariable(&cl_playerskin); + Cvar_RegisterAlias(&cl_playerskin, "_cl_playerskin"); Cvar_RegisterVariable(&rcon_password); Cvar_RegisterVariable(&rcon_address); Cvar_RegisterVariable(&rcon_secure); Cvar_RegisterCallback(&rcon_secure, CL_RCon_ClearPassword_c); Cvar_RegisterVariable(&rcon_secure_challengetimeout); Cvar_RegisterVariable(&r_fixtrans_auto); - Cvar_RegisterVariable(&team); - Cvar_RegisterVariable(&skin); - Cvar_RegisterVariable(&noaim); + Cvar_RegisterVariable(&cl_team); + Cvar_RegisterVariable(&cl_skin); + Cvar_RegisterVariable(&cl_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");