]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/base.qc
Merge branch 'master' into Mario/overkill
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / base.qc
index 6f42ff8e908514443eaaefa83fdf8a7ebcba09b1..d2cec391b90e1a167fd920cfd87a3a8b688b5165 100644 (file)
@@ -59,6 +59,7 @@ float CallbackChain_Remove(entity cb, float() func)
        entity e;
        float n;
        n = 0;
+       order = 0;
        for(e = cb; e.cbc_next; e = e.cbc_next)
        {
                while(e.cbc_next.cbc_func == func)
@@ -83,21 +84,24 @@ float CallbackChain_Call(entity cb)
        entity e;
        r = 0;
        for(e = cb; e.cbc_next; e = e.cbc_next)
+       {
+               CallbackChain_ReturnValue = r;
                r |= e.cbc_next.cbc_func();
+       }
        return r; // callbacks return an error status, so 0 is default return value
 }
 
 #define MAX_MUTATORS 8
-var mutatorfunc_t mutators[MAX_MUTATORS];
-float Mutator_Add(mutatorfunc_t func)
+string loaded_mutators[MAX_MUTATORS];
+float Mutator_Add(mutatorfunc_t func, string name)
 {
        float i, j;
        j = -1;
        for(i = 0; i < MAX_MUTATORS; ++i)
        {
-               if(func == mutators[i])
+               if(name == loaded_mutators[i])
                        return 1; // already added
-               if(func == func_null)
+               if (!(loaded_mutators[i]))
                        j = i;
        }
        if(j < 0)
@@ -105,29 +109,35 @@ float Mutator_Add(mutatorfunc_t func)
                backtrace("WARNING: too many mutators, cannot add any more\n");
                return 0;
        }
-       mutators[j] = func;
+       loaded_mutators[j] = name;
 
        if(func(MUTATOR_ADDING) == 0)
        {
                // good
                return 1;
        }
-       backtrace("WARNING: when adding mutator: adding failed\n");
-       Mutator_Remove(func);
+
+       backtrace("WARNING: when adding mutator: adding failed, rolling back\n");
+
+       if(func(MUTATOR_ROLLING_BACK) != 0)
+       {
+               // baaaaad
+               error("WARNING: when adding mutator: rolling back failed");
+       }
        return 0;
 }
-void Mutator_Remove(float(float) func)
+void Mutator_Remove(float(float) func, string name)
 {
        float i;
        for(i = 0; i < MAX_MUTATORS; ++i)
-               if(func == mutators[i])
+               if(name == loaded_mutators[i])
                        break;
        if(i >= MAX_MUTATORS)
        {
                backtrace("WARNING: removing not-added mutator\n");
                return;
        }
-       mutators[i] = func_null;
+       loaded_mutators[i] = string_null;
 
        if(func(MUTATOR_REMOVING) != 0)
        {