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
 |