From cecd93cddbdf51729ac97afab5c6961f91bf1603 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Wed, 23 Feb 2011 20:45:36 +0100 Subject: [PATCH] mutator system: refuse to add a mutator for the second time --- qcsrc/server/cl_client.qc | 3 ++- qcsrc/server/mutators/base.qc | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 71584d350..acf399f91 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -2365,7 +2365,6 @@ void SpectateCopy(entity spectatee) { self.fixangle = TRUE; setorigin(self, spectatee.origin); setsize(self, spectatee.mins, spectatee.maxs); - SetZoomState(spectatee.zoomstate); anticheat_spectatecopy(spectatee); } @@ -2402,6 +2401,8 @@ float SpectateNext() { self.movetype = MOVETYPE_NONE; accuracy_resend(self); + SetZoomState(spectatee.zoomstate); + if(!SpectateUpdate()) PutObserverInServer(); diff --git a/qcsrc/server/mutators/base.qc b/qcsrc/server/mutators/base.qc index 0b1bea45e..8c0c9439c 100644 --- a/qcsrc/server/mutators/base.qc +++ b/qcsrc/server/mutators/base.qc @@ -87,8 +87,26 @@ float CallbackChain_Call(entity cb) return r; // callbacks return an error status, so 0 is default return value } +#define MAX_MUTATORS 8 +float(float) mutators[MAX_MUTATORS]; float Mutator_Add(float(float) func) { + float i, j; + j = -1; + for(i = 0; i < MAX_MUTATORS; ++i) + { + if(func == mutators[i]) + return 1; // already added + if(func == func_null) + j = i; + } + if(j < 0) + { + backtrace("WARNING: too many mutators, cannot add any more\n"); + return 0; + } + mutators[j] = func; + if(func(MUTATOR_ADDING) == 0) { // good @@ -100,6 +118,17 @@ float Mutator_Add(float(float) func) } void Mutator_Remove(float(float) func) { + float i; + for(i = 0; i < MAX_MUTATORS; ++i) + if(func == mutators[i]) + break; + if(i >= MAX_MUTATORS) + { + backtrace("WARNING: removing not-added mutator\n"); + return 0; + } + mutators[i] = func_null; + if(func(MUTATOR_REMOVING) != 0) { // baaaaad -- 2.39.2