]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
changed the Sys_Error to a Con_Printf. LordHavoc, please check if the equation REALLY...
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 5d9b0a892a3689265a63f3f21272c58eeb15748d..88588672f8a9fdec0de1ee0ecc861b75102badec 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -70,7 +70,7 @@ typedef struct cmddeferred_s
        double time;
 } cmddeferred_t;
 
-static cmddeferred_t *cmd_deferred_list;
+static cmddeferred_t *cmd_deferred_list = NULL;
 
 /*
 ============
@@ -89,25 +89,44 @@ static void Cmd_Defer_f (void)
                        Con_Printf("No commands are pending.\n");
                while(next)
                {
-                       Con_Printf("-> In %'9.2f: %s\n", next->time-time, next->value);
+                       Con_Printf("-> In %9.2f: %s\n", next->time-time, next->value);
                        next = next->next;
                }
-       } else if(Cmd_Argc() != 3)
+       } else if(Cmd_Argc() == 2 && !strcasecmp("clear", Cmd_Argv(1)))
+       {
+               while(cmd_deferred_list)
+               {
+                       cmddeferred_t *cmd = cmd_deferred_list;
+                       cmd_deferred_list = cmd->next;
+                       Mem_Free(cmd->value);
+                       Mem_Free(cmd);
+               }
+       } else if(Cmd_Argc() == 3)
        {
-               Con_Printf("usage: defer <seconds> <command>\n");
-               return;
-       } else {
                const char *value = Cmd_Argv(2);
                cmddeferred_t *defcmd = (cmddeferred_t*)Mem_Alloc(tempmempool, sizeof(*defcmd));
-               unsigned int len = strlen(value);
+               size_t 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;
+               memcpy(defcmd->value, value, len+1);
+               defcmd->next = NULL;
 
-               defcmd->next = cmd_deferred_list;
-               cmd_deferred_list = defcmd;
+               if(cmd_deferred_list)
+               {
+                       cmddeferred_t *next = cmd_deferred_list;
+                       while(next->next)
+                               next = next->next;
+                       next->next = defcmd;
+               } else
+                       cmd_deferred_list = defcmd;
+               /* Stupid me... this changes the order... so commands with the same delay go blub :S
+                 defcmd->next = cmd_deferred_list;
+                 cmd_deferred_list = defcmd;*/
+       } else {
+               Con_Printf("usage: defer <seconds> <command>\n"
+                          "       defer clear\n");
+               return;
        }
 }
 
@@ -240,18 +259,19 @@ void Cbuf_Execute_Deferred (void)
                if(cmd->time <= time)
                {
                        Cbuf_AddText(cmd->value);
+                       Cbuf_AddText(";\n");
                        Mem_Free(cmd->value);
-                       
-                       if(prev)
+
+                       if(prev) {
                                prev->next = cmd->next;
-                       else
+                               Mem_Free(cmd);
+                               cmd = prev->next;
+                       } else {
                                cmd_deferred_list = cmd->next;
-                       
-                       Mem_Free(cmd);
-                       
-                       cmd = prev;
-                       if(!cmd)
-                               return;
+                               Mem_Free(cmd);
+                               cmd = cmd_deferred_list;
+                       }
+                       continue;
                }
                prev = cmd;
                cmd = cmd->next;
@@ -1448,11 +1468,13 @@ FIXME: lookupnoadd the token to speed search?
 void Cmd_ExecuteString (const char *text, cmd_source_t src)
 {
        int oldpos;
+       int found;
        cmd_function_t *cmd;
        cmdalias_t *a;
 
        oldpos = cmd_tokenizebufferpos;
        cmd_source = src;
+       found = false;
 
        Cmd_TokenizeString (text);
 
@@ -1487,8 +1509,9 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src)
                                }
                                else
                                        Con_Printf("Command \"%s\" can not be executed\n", Cmd_Argv(0));
-                               cmd_tokenizebufferpos = oldpos;
-                               return;
+                               found = true;
+                               goto command_found;
+                               break;
                        case src_client:
                                if (cmd->clientfunction)
                                {
@@ -1501,11 +1524,13 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src)
                        break;
                }
        }
+command_found:
 
        // if it's a client command and no command was found, say so.
        if (cmd_source == src_client)
        {
                Con_Printf("player \"%s\" tried to %s\n", host_client->name, text);
+               cmd_tokenizebufferpos = oldpos;
                return;
        }
 
@@ -1520,6 +1545,12 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src)
                }
        }
 
+       if(found) // if the command was hooked and found, all is good
+       {
+               cmd_tokenizebufferpos = oldpos;
+               return;
+       }
+
 // check cvars
        if (!Cvar_Command () && host_framecount > 0)
                Con_Printf("Unknown command \"%s\"\n", Cmd_Argv(0));