From: bones_was_here Date: Tue, 12 Dec 2023 04:33:48 +0000 (+1000) Subject: cmd: always register server-only commands, don't register client-only commands on... X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=b8692b8cd73685794b59b0522e8caa4b9d9a2dac;p=xonotic%2Fdarkplaces.git cmd: always register server-only commands, don't register client-only commands on dedicated server Fixes the lack of the `heartbeat` command on dedicated and listen, and the presence of commands like `toggleconsole` on dedicated. Similar to 3a58ad52e63635c93e95955f984fd6052156e56b this might reveal a few commands that aren't flagged correctly. Changes the bitmask vars to the correct type. Renames cmd_flags to cmd_flagsmask for consistency. Signed-off-by: bones_was_here --- diff --git a/cmd.c b/cmd.c index b4bb9a58..b1294c3c 100644 --- a/cmd.c +++ b/cmd.c @@ -1593,7 +1593,7 @@ static void Cmd_Apropos_f(cmd_state_t *cmd) Con_Printf("%i result%s\n\n", count, (count > 1) ? "s" : ""); } -static cmd_state_t *Cmd_AddInterpreter(cmd_buf_t *cbuf, cvar_state_t *cvars, int cvars_flagsmask, int cmds_flagsmask, cmd_userdefined_t *userdefined) +static cmd_state_t *Cmd_AddInterpreter(cmd_buf_t *cbuf, cvar_state_t *cvars, unsigned cvars_flagsmask, unsigned cmds_flagsmask, cmd_userdefined_t *userdefined) { cmd_state_t *cmd = (cmd_state_t *)Mem_Alloc(tempmempool, sizeof(cmd_state_t)); @@ -1604,7 +1604,7 @@ static cmd_state_t *Cmd_AddInterpreter(cmd_buf_t *cbuf, cvar_state_t *cvars, int cmd->cvars = cvars; cmd->cvars_flagsmask = cvars_flagsmask; - cmd->cmd_flags = cmds_flagsmask; + cmd->cmd_flagsmask = cmds_flagsmask; cmd->userdefined = userdefined; return cmd; @@ -1618,6 +1618,8 @@ Cmd_Init void Cmd_Init(void) { cmd_buf_t *cbuf; + unsigned cvars_flagsmask, cmds_flagsmask; + cbuf_mempool = Mem_AllocPool("Command buffer", 0, NULL); cbuf = (cmd_buf_t *)Mem_Alloc(cbuf_mempool, sizeof(cmd_buf_t)); cbuf->maxsize = CMDBUFSIZE; @@ -1633,7 +1635,17 @@ void Cmd_Init(void) cmd_iter_all = (cmd_iter_t *)Mem_Alloc(tempmempool, sizeof(cmd_iter_t) * 3); // local console - cmd_iter_all[0].cmd = cmd_local = Cmd_AddInterpreter(cbuf, &cvars_all, CF_CLIENT | CF_SERVER, CF_CLIENT | CF_CLIENT_FROM_SERVER | CF_SERVER_FROM_CLIENT, &cmd_userdefined_all); + if (cls.state == ca_dedicated) + { + cvars_flagsmask = CF_SERVER; + cmds_flagsmask = CF_SERVER | CF_SERVER_FROM_CLIENT; + } + else + { + cvars_flagsmask = CF_CLIENT | CF_SERVER; + cmds_flagsmask = CF_CLIENT | CF_SERVER | CF_CLIENT_FROM_SERVER | CF_SERVER_FROM_CLIENT; + } + cmd_iter_all[0].cmd = cmd_local = Cmd_AddInterpreter(cbuf, &cvars_all, cvars_flagsmask, cmds_flagsmask, &cmd_userdefined_all); cmd_local->Handle = Cmd_CL_Callback; // server commands received from clients have no reason to access cvars, cvar expansion seems perilous. @@ -1773,7 +1785,7 @@ static void Cmd_TokenizeString (cmd_state_t *cmd, const char *text) Cmd_AddCommand ============ */ -void Cmd_AddCommand(int flags, const char *cmd_name, xcommand_t function, const char *description) +void Cmd_AddCommand(unsigned flags, const char *cmd_name, xcommand_t function, const char *description) { cmd_function_t *func; cmd_function_t *prev, *current; @@ -1783,7 +1795,7 @@ void Cmd_AddCommand(int flags, const char *cmd_name, xcommand_t function, const for (i = 0; i < 2; i++) { cmd = cmd_iter_all[i].cmd; - if (flags & cmd->cmd_flags) + if (flags & cmd->cmd_flagsmask) { // fail if the command is a variable name if (Cvar_FindVar(cmd->cvars, cmd_name, ~0)) diff --git a/cmd.h b/cmd.h index fef1f11f..30b3abd0 100644 --- a/cmd.h +++ b/cmd.h @@ -85,7 +85,7 @@ typedef struct cmd_alias_s typedef struct cmd_function_s { - int flags; + unsigned flags; struct cmd_function_s *next; const char *name; const char *description; @@ -140,9 +140,8 @@ typedef struct cmd_state_s cmd_function_t *engine_functions; struct cvar_state_s *cvars; // which cvar system is this cmd state able to access? (&cvars_all or &cvars_null) - int cvars_flagsmask; // which CVAR_* flags should be visible to this interpreter? (CF_CLIENT | CF_SERVER, or just CF_SERVER) - - int cmd_flags; // cmd flags that identify this interpreter + unsigned cvars_flagsmask; // which CVAR_* flags should be visible to this interpreter? (CF_CLIENT | CF_SERVER, or just CF_SERVER) + unsigned cmd_flagsmask; // cmd flags that identify this interpreter qbool (*Handle)(struct cmd_state_s *, struct cmd_function_s *, const char *, enum cmd_source_s); } @@ -221,7 +220,7 @@ void Cmd_SaveInitState(void); // called by FS_GameDir_f, this restores cvars, commands and aliases to init values void Cmd_RestoreInitState(void); -void Cmd_AddCommand(int flags, const char *cmd_name, xcommand_t function, const char *description); +void Cmd_AddCommand(unsigned flags, const char *cmd_name, xcommand_t function, const char *description); // called by the init functions of other parts of the program to // register commands and functions to call for them. // The cmd_name is referenced later, so it should not be in temp memory