-.float anticheat_jointime;
+#include "anticheat.qh"
+
+#include "antilag.qh"
+#include "autocvars.qh"
+#include "defs.qh"
+#include "miscfunctions.qh"
-void mean_accumulate(entity e, .float a, .float c, float mean, float value, float weight)
-{
- if(weight == 0)
- return;
- if(mean == 0)
- e.a *= pow(value, weight);
- else
- e.a += pow(value, mean) * weight;
- e.c += weight;
-}
-float mean_evaluate(entity e, .float a, .float c, float mean)
-{
- if(e.c == 0)
- return 0;
- if(mean == 0)
- return pow(e.a, 1.0 / e.c);
- else
- return pow(e.a / e.c, 1.0 / mean);
-}
-#define MEAN_ACCUMULATE(prefix,v,w) mean_accumulate(self,prefix##_accumulator,prefix##_count,prefix##_mean,v,w)
-#define MEAN_EVALUATE(prefix) mean_evaluate(self,prefix##_accumulator,prefix##_count,prefix##_mean)
-#define MEAN_DECLARE(prefix,m) float prefix##_mean = m; .float prefix##_count, prefix##_accumulator
+#include "command/common.qh"
+
+.float anticheat_jointime;
.float anticheat_fixangle_endtime;
}
void anticheat_physics()
-{
- float f, wishspeed;
- vector wishvel;
+{SELFPARAM();
+ float f;
// div0_evade -> SPECTATORS
makevectors(self.v_angle);
self.anticheat_speedhack_accu = 1;
self.anticheat_speedhack_lasttime = servertime;
}
-
- // race/CTS: force kbd movement for fairness
- if(g_race || g_cts)
- {
- // if record times matter
- // ensure nothing EVIL is being done (i.e. div0_evade)
- // this hinders joystick users though
- // but it still gives SOME analog control
- wishvel_x = fabs(self.movement_x);
- wishvel_y = fabs(self.movement_y);
- if(wishvel_x != 0 && wishvel_y != 0 && wishvel_x != wishvel_y)
- {
- wishvel_z = 0;
- wishspeed = vlen(wishvel);
- if(wishvel_x >= 2 * wishvel_y)
- {
- // pure X motion
- if(self.movement_x > 0)
- self.movement_x = wishspeed;
- else
- self.movement_x = -wishspeed;
- self.movement_y = 0;
- }
- else if(wishvel_y >= 2 * wishvel_x)
- {
- // pure Y motion
- self.movement_x = 0;
- if(self.movement_y > 0)
- self.movement_y = wishspeed;
- else
- self.movement_y = -wishspeed;
- }
- else
- {
- // diagonal
- if(self.movement_x > 0)
- self.movement_x = M_SQRT1_2 * wishspeed;
- else
- self.movement_x = -M_SQRT1_2 * wishspeed;
- if(self.movement_y > 0)
- self.movement_y = M_SQRT1_2 * wishspeed;
- else
- self.movement_y = -M_SQRT1_2 * wishspeed;
- }
- }
- }
}
void anticheat_spectatecopy(entity spectatee)
-{
+{SELFPARAM();
// div0_evade -> SPECTATORS
self.angles = spectatee.anticheat_div0_evade_v_angle;
}
void anticheat_prethink()
-{
+{SELFPARAM();
// div0_evade -> SPECTATORS
self.anticheat_div0_evade_offset = 0;
}
}
void anticheat_report()
-{
+{SELFPARAM();
if(!autocvar_sv_eventlog)
return;
// TODO(divVerent): Use xonstat to acquire good thresholds.
}
float anticheat_getvalue(string id)
-{
+{SELFPARAM();
switch(id) {
case "_time": return servertime - self.anticheat_jointime;
case "speedhack": return MEAN_EVALUATE(anticheat_speedhack);
}
void anticheat_fixangle()
-{
+{SELFPARAM();
self.anticheat_fixangle_endtime = servertime + ANTILAG_LATENCY(self) + 0.2;
}
void anticheat_endframe()
-{
- entity oldself = self;
- FOR_EACH_CLIENT(self)
- if (self.fixangle)
- anticheat_fixangle();
- self = oldself;
+{SELFPARAM();
+ entity e;
+ FOR_EACH_CLIENT(e)
+ if (e.fixangle) {
+ WITH(entity, self, e, anticheat_fixangle());
+ }
anticheat_div0_evade_evasion_delta += frametime * (0.5 + random());
}
void anticheat_init()
-{
+{SELFPARAM();
self.anticheat_speedhack_offset = 0;
self.anticheat_jointime = servertime;
}