From: havoc Date: Thu, 20 Mar 2008 20:02:03 +0000 (+0000) Subject: patch from Blub that adds the command "defer" which executes a command X-Git-Tag: xonotic-v0.1.0preview~2306 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=ac029734277dab95241936ad14aee465e8ee70c9;p=xonotic%2Fdarkplaces.git patch from Blub that adds the command "defer" which executes a command after a specified number of seconds, without interrupting normal play git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8221 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/cmd.c b/cmd.c index e7fe4a81..5d9b0a89 100644 --- a/cmd.c +++ b/cmd.c @@ -63,6 +63,54 @@ static void Cmd_Wait_f (void) cmd_wait = true; } +typedef struct cmddeferred_s +{ + struct cmddeferred_s *next; + char *value; + double time; +} cmddeferred_t; + +static cmddeferred_t *cmd_deferred_list; + +/* +============ +Cmd_Defer_f + +Cause a command to be executed after a delay. +============ +*/ +static void Cmd_Defer_f (void) +{ + if(Cmd_Argc() == 1) + { + double time = Sys_DoubleTime(); + cmddeferred_t *next = cmd_deferred_list; + if(!next) + Con_Printf("No commands are pending.\n"); + while(next) + { + Con_Printf("-> In %'9.2f: %s\n", next->time-time, next->value); + next = next->next; + } + } else if(Cmd_Argc() != 3) + { + Con_Printf("usage: defer \n"); + return; + } else { + const char *value = Cmd_Argv(2); + cmddeferred_t *defcmd = (cmddeferred_t*)Mem_Alloc(tempmempool, sizeof(*defcmd)); + unsigned int len = strlen(value); + + defcmd->time = Sys_DoubleTime() + atof(Cmd_Argv(1)); + defcmd->value = (char*)Mem_Alloc(tempmempool, len+1); + memcpy(defcmd->value, value, len); + defcmd->value[len] = 0; + + defcmd->next = cmd_deferred_list; + cmd_deferred_list = defcmd; + } +} + /* ============ Cmd_Centerprint_f @@ -176,6 +224,40 @@ void Cbuf_InsertText (const char *text) } } +/* +============ +Cbuf_Execute_Deferred --blub +============ +*/ +void Cbuf_Execute_Deferred (void) +{ + cmddeferred_t *cmd, *prev; + double time = Sys_DoubleTime(); + prev = NULL; + cmd = cmd_deferred_list; + while(cmd) + { + if(cmd->time <= time) + { + Cbuf_AddText(cmd->value); + Mem_Free(cmd->value); + + if(prev) + prev->next = cmd->next; + else + cmd_deferred_list = cmd->next; + + Mem_Free(cmd); + + cmd = prev; + if(!cmd) + return; + } + prev = cmd; + cmd = cmd->next; + } +} + /* ============ Cbuf_Execute @@ -194,6 +276,7 @@ void Cbuf_Execute (void) // LordHavoc: making sure the tokenizebuffer doesn't get filled up by repeated crashes cmd_tokenizebufferpos = 0; + Cbuf_Execute_Deferred(); while (cmd_text.cursize) { // find a \n or ; line break @@ -971,6 +1054,7 @@ void Cmd_Init_Commands (void) Cmd_AddCommand ("cvar_resettodefaults_saveonly", Cvar_ResetToDefaults_SaveOnly_f, "sets all saved cvars to their locked default values (variables that will be saved to config.cfg)"); Cmd_AddCommand ("cprint", Cmd_Centerprint_f, "print something at the screen center"); + Cmd_AddCommand ("defer", Cmd_Defer_f, "execute a command in the future"); // DRESK - 5/14/06 // Support Doom3-style Toggle Command