prozac-qfcc/speed.qc
Bill Currie 99190cb79a world -> NIL for null entities. Seems to work (only issue would be borked
tests for foo == world -> !foo and for != world -> foo).
2001-11-02 17:00:52 +00:00

221 lines
5.8 KiB
C++

#include "defs.qh"
//some of this by Cyto 3-27-00
//other by CH
//Used for testing tolerence, prints out various stuff
//#define SHOW_CHEAT_LEVELS
//If defined any cheat cmd results in kicking
//#define ENABLE_CHEAT_CMDS
void() Kick_My_Owner =
{
local string ip;
local string oldname,nospeed;
local float banned,off;
banned = FALSE;
//Don't kick if cheats are off
off = FALSE;
nospeed = infokey(NIL,"nospeed");
if (nospeed) {
off = stof(nospeed);
}
if (off) return;
oldname = self.owner.netname;
sprint(self.owner, PRINT_HIGH,"\nYou have been ËÉÃËÅÄ for ÃÈÅÁÔÉÎÇ.\nIf you were not cheating, I apologize.\nHave a nice day.\n");
ip = infokey(self.owner,"ip");
if (infokey(NIL,"infip") == ip) { // second infraction. ban.
localcmd("addip ");
localcmd(ip);
localcmd("\n");
localcmd("localinfo infip \"\"");
banned = TRUE;
} else {
localcmd("localinfo infip ");
localcmd(ip);
localcmd("\n");
}
stuffcmd(self.owner,"disconnect\n");
bprint(PRINT_HIGH, oldname);
if (banned)
bprint(PRINT_HIGH, " was BANNED for cheating!\n");
else
bprint(PRINT_HIGH, " was kicked for cheating.\n");
self.think = NIL;
dremove(self);
};
#define MAXPERCENT 35 //WK this looks good for wall strafing
//reasons for not checking
#define IMMUNE 1
#define GRAPPLE 2
#define FLYING 4
#define NOCLASS 16
#define BUILDING 32
#define DEAD 64
void () TeamFortress_CheckForSpeed =
{
#if 0
local vector tempvec;
local float dist;
#endif
local float max, check, immune = 0;
local string nospeed;
local float off;
off = FALSE;
nospeed = infokey(NIL,"nospeed");
if (nospeed) {
off = stof(nospeed);
}
if (off) return;
max = self.owner.maxspeed;
if ((self.owner.job & JOB_RUNNER) && (self.owner.job & JOB_ACTIVE))
max = max + 200;
//make sure ok to check
if (self.owner.immune_to_chec > time)
immune = immune | IMMUNE; //its ok since IMMUNE becomes 1
if (self.owner.hook_out)
immune = immune | GRAPPLE;
//WK We should boot if they have no set speed and are moving
//if (self.owner.maxspeed == 0) // no set speed
if (!(self.owner.flags & FL_ONGROUND)) //WK People in air immune
immune = immune | FLYING;
if (self.owner.playerclass == PC_UNDEFINED)
immune = immune | NOCLASS;
if (self.owner.done_custom & CUSTOM_BUILDING)
immune = immune | BUILDING;
if (self.owner.health <= 0)
immune = immune | DEAD;
if (self.owner.has_disconnected)
dremove(self);
if (immune)
check = FALSE;
else
check = TRUE;
//WK Lowered percent chance of restuffing because stuffcmds()
// cause overflows
if (!self.lip || !(self.has_camera) || (random() <= 0.1)) {
// periodically reset ping and gotwalls.
self.has_camera = 0;
self.has_camera = stof(infokey(self.owner,"ping")) / 20;
#ifdef ENABLE_CHEAT_CMDS
if (!self.lip || (random() <= 0.1)) {
stuffcmd(self.owner,"alias aa_enabled \"impulse I_CHEAT_ONE;wait;impulse I_CHEAT_TWO;wait;impulse I_CHEAT_THREE\"\n");
stuffcmd(self.owner,"alias +aa \"aa_enabled\"\n");
stuffcmd(self.owner,"alias -aa \"aa_enabled\"\n");
stuffcmd(self.owner,"alias aa_teamlock \"aa_enabled\"\n");
stuffcmd(self.owner,"alias aa_on \"aa_enabled\"\n");
stuffcmd(self.owner,"alias aa_off \"aa_enabled\"\n");
stuffcmd(self.owner,"alias +showradar \"aa_enabled\"\n");
stuffcmd(self.owner,"alias -showradar \"aa_enabled\"\n");
stuffcmd(self.owner,"alias cl_speed \"aa_enabled\"\n");
stuffcmd(self.owner,"alias cl_gotwalls \"aa_enabled\"\n");
stuffcmd(self.owner,"alias fullbright \"aa_enabled\"\n");
self.lip = 1;
}
#endif
}
#if 0
// Ignore z part of vector
tempvec = self.oldorigin - self.owner.origin;
tempvec_z = 0;
dist = vlen(tempvec);
if (check && (max == 0) && (dist > 100)) { //Definitely cheating...
self.owner.cheat_level = self.owner.cheat_level + 700;
}
if (check && (dist > (max * (1 + (MAXPERCENT / 100.0))))) // Maybe cheating.
self.owner.cheat_level = self.owner.cheat_level + 200;
if (self.owner.cheat_level >= 900 && self.has_sentry == 0 && dist > max) {
bprint(PRINT_HIGH, self.owner.netname);
bprint(PRINT_HIGH, " may be cheating. (Current:");
bprint(PRINT_HIGH, ftos(dist));
bprint(PRINT_HIGH, "/Max:");
bprint(PRINT_HIGH, ftos(max));
bprint(PRINT_HIGH, ")\n");
self.has_sentry = 10;
} else {
self.has_sentry = self.has_sentry - 1;
if (self.has_sentry <= 0)
self.has_sentry = 0;
}
if (self.owner.cheat_level >= 1800) { //bye....
self.owner.cheat_level = 0; //WK Clear so we don't boot twice
self.think = Kick_My_Owner;
self.nextthink = time + 0.1;
}
#ifdef SHOW_CHEAT_LEVELS
local string st;
st = ftos(max);
bprint(PRINT_HIGH, "Max: ");
bprint(PRINT_HIGH, st);
bprint(PRINT_HIGH, " Imm: ");
st = ftos(immune);
bprint(PRINT_HIGH, st);
bprint(PRINT_HIGH, " Cht: ");
st = ftos(self.owner.cheat_level);
bprint(PRINT_HIGH, st);
bprint(PRINT_HIGH, " Speed: (");
st = ftos(dist);
bprint(PRINT_HIGH, st);
bprint(PRINT_HIGH, "/");
st = ftos(max * (1 + (MAXPERCENT / 100)));
bprint(PRINT_HIGH, st);
bprint(PRINT_HIGH, ")\n");
#endif
self.oldorigin = self.owner.origin;
#endif
self.nextthink = time + 1;
};
//This checks so that the impulse cmds were not by accident
//One, must be called before two, and two before three
void() I_DID_CHEAT_ONE =
{
// bprint(PRINT_HIGH, "I did the cheat 1 cmd!\n");
if (self.has_cheated == 0)
self.has_cheated = 1;
};
void() I_DID_CHEAT_TWO =
{
// bprint(PRINT_HIGH, "I did the cheat 2 cmd!\n");
if (self.has_cheated >= 1) {
self.has_cheated = 2;
} else {
self.has_cheated = 0;
}
};
void() I_DID_CHEAT_THREE =
{
// bprint(PRINT_HIGH, "I did the cheat 3 cmd!\n");
if (self.has_cheated == 2) {
//bprint(PRINT_HIGH, "Making kick entity!\n");
local entity te;
te = spawn(); //CH
te.nextthink = time + (random() * 5) + 5; //5-10 seconds
self.cheat_level = 0; //WK Clear so we don't boot twice
self.has_cheated = 0;
te.think = Kick_My_Owner;
te.owner = self;
te.classname = "kicktimer";
} else {
self.has_cheated = 0;
}
};