157 lines
5.0 KiB
SourcePawn
157 lines
5.0 KiB
SourcePawn
/* Oryx AC: collects and analyzes statistics to find some cheaters in CS:S, CS:GO, and TF2 bunnyhop.
|
|
* Copyright (C) 2018 Nolan O.
|
|
* Copyright (C) 2018 shavit.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#if defined _oryx_included
|
|
#endinput
|
|
#endif
|
|
#define _oryx_included
|
|
|
|
#define ORYX_VERSION "1.3.1"
|
|
|
|
/**
|
|
* List of current detection descriptions:
|
|
*
|
|
* "Acute TR formatter"
|
|
* "+left/right bypasser"
|
|
* "Prestrafe tool"
|
|
* "Average strafe too close to 0"
|
|
* "Too many perfect strafes"
|
|
* "Movement config"
|
|
* "Unsynchronised movement"
|
|
* "Invalid wish velocity"
|
|
* "Script on scroll"
|
|
* "Hyperscroll"
|
|
*/
|
|
|
|
enum
|
|
{
|
|
TRIGGER_LOW, // Reachable by skilled players occasionally. Not always necessary before a med detect.
|
|
TRIGGER_MEDIUM, // Reachable by skilled players by unlikely chance.
|
|
TRIGGER_HIGH, // Only theoretically reachable by the aligning of stars by the gods.
|
|
TRIGGER_HIGH_NOKICK, // This should really only be used for a follow up definitive detection.
|
|
TRIGGER_DEFINITIVE, // Non-skill-based detection type. 100% sure detection.
|
|
TRIGGER_TEST // Allows you to develop new detections on live servers with minimal side effects.
|
|
};
|
|
|
|
/**
|
|
* Called when Oryx gets triggered on a client.
|
|
*
|
|
* @param client Client entity index.
|
|
* @param level Level of detection as defined in the above enum.
|
|
* @param cheat Short description or name of the cheat being detected. 32 cells char array.
|
|
* @return Plugin_Continue to do nothing. Plugin_Changed to modify values. Plugin_Handled to abort kicks. Plugin_Stop to completely ignore the trigger.
|
|
*/
|
|
forward Action Oryx_OnTrigger(int client, int &level, char[] cheat);
|
|
|
|
/**
|
|
* Call to activate Oryx's trigger procedure (logging, kicking, admin notifications, etc..).
|
|
*
|
|
* @param client Client entity index.
|
|
* @param level Level of detection as defined in the above enum.
|
|
* @param cheat Short description or name of the cheat being detected.
|
|
* @return Return value of the Oryx_OnTrigger forward.
|
|
*/
|
|
native Action Oryx_Trigger(int client, int level, const char[] cheat);
|
|
|
|
/**
|
|
* Prints a message to admins' chat.
|
|
*
|
|
* @param format Formatting rules.
|
|
* @param any Variable number of format parameters.
|
|
* @noreturn
|
|
*/
|
|
native void Oryx_PrintToAdmins(const char[] format, any ...);
|
|
|
|
/**
|
|
* Prints a message to admins' console.
|
|
*
|
|
* @param format Formatting rules.
|
|
* @param any Variable number of format parameters.
|
|
* @noreturn
|
|
*/
|
|
native void Oryx_PrintToAdminsConsole(const char[] format, any ...);
|
|
|
|
/**
|
|
* Logs an entry to Oryx's log file.
|
|
*
|
|
* @param format Formatting rules.
|
|
* @param any Variable number of format parameters.
|
|
* @noreturn
|
|
*/
|
|
native void Oryx_LogMessage(const char[] format, any ...);
|
|
|
|
/**
|
|
* Checks if f1 is inbetween a specified threshold of f12.
|
|
*
|
|
* @param f1 First value.
|
|
* @param f2 Second value.
|
|
* @param frac Used as a threshold of f2 for f1 to be within.
|
|
* @return True if the test passed.
|
|
*/
|
|
native bool Oryx_WithinThreshold(float f1, float f2, float threshold);
|
|
|
|
/**
|
|
* Checks if the player has permissions to bypass Oryx.
|
|
* Will return false if `oryx_allow_bypass` is set to 0.
|
|
* With bhoptimer or bTimes v1.8.3, will return true for styles with the `oryx_bypass` special flag.
|
|
* For bTimes2, will return true if the player is in edit mode (rewind/fastforward etc).
|
|
*
|
|
* @param client Client index.
|
|
* @return True if the player can bypass the anticheat.
|
|
*/
|
|
native bool Oryx_CanBypass(int client);
|
|
|
|
/**
|
|
* A tiny function to veify if the player fits gameplay.
|
|
*
|
|
* @param client Client entity index.
|
|
* @param watrer Check for water level?
|
|
* @return True if the test passed.
|
|
*/
|
|
stock bool IsLegalMoveType(int client, bool water = true)
|
|
{
|
|
MoveType iMoveType = GetEntityMoveType(client);
|
|
|
|
return (!water || GetEntProp(client, Prop_Data, "m_nWaterLevel") < 2) &&
|
|
(GetEntityFlags(client) & FL_ATCONTROLS) == 0 &&
|
|
(iMoveType == MOVETYPE_WALK || iMoveType == MOVETYPE_ISOMETRIC || iMoveType == MOVETYPE_LADDER);
|
|
}
|
|
|
|
public SharedPlugin __pl_oryx =
|
|
{
|
|
name = "oryx",
|
|
file = "oryx.smx",
|
|
#if defined REQUIRE_PLUGIN
|
|
required = 1
|
|
#else
|
|
required = 0
|
|
#endif
|
|
};
|
|
|
|
#if !defined REQUIRE_PLUGIN
|
|
public void __pl_oryx_SetNTVOptional()
|
|
{
|
|
MarkNativeAsOptional("Oryx_CanBypass");
|
|
MarkNativeAsOptional("Oryx_LogMessage");
|
|
MarkNativeAsOptional("Oryx_PrintToAdmins");
|
|
MarkNativeAsOptional("Oryx_PrintToAdminsConsole");
|
|
MarkNativeAsOptional("Oryx_Trigger");
|
|
MarkNativeAsOptional("Oryx_WithinThreshold");
|
|
}
|
|
#endif
|