100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #pragma semicolon 1
 | |
| 
 | |
| #define PLUGIN_AUTHOR "null138"
 | |
| #define PLUGIN_VERSION "1.00"
 | |
| 
 | |
| #include <sourcemod>
 | |
| #include <sdktools>
 | |
| #include <dhooks>
 | |
| // linux
 | |
| #define GetPlayerSlotOffs 3
 | |
| #pragma newdecls required
 | |
| Handle hExecuteStringCommand;
 | |
| Handle hGetPlayerSlot;
 | |
| 
 | |
| public Plugin myinfo = 
 | |
| {
 | |
| 	name = "cmd reader",
 | |
| 	author = PLUGIN_AUTHOR,
 | |
| 	description = "reads all client cmd commands",
 | |
| 	version = PLUGIN_VERSION,
 | |
| 	url = "https://steamcommunity.com/id/null138/"
 | |
| }
 | |
| 
 | |
| //written by madness
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	Handle conf = LoadGameConfigFile("readcmds.css");
 | |
| 	if (conf == INVALID_HANDLE)
 | |
| 		SetFailState("Failed to load gamedata readcmds.css");
 | |
| 	
 | |
| 	hExecuteStringCommand = DHookCreateDetour(Address_Null, CallConv_THISCALL, ReturnType_Bool, ThisPointer_Address);
 | |
| 	if (!hExecuteStringCommand)
 | |
| 		SetFailState("Failed to setup detour for CGameClient::ExecuteStringCommand()");
 | |
| 	
 | |
| 	if (!DHookSetFromConf(hExecuteStringCommand, conf, SDKConf_Signature, "CGameClient::ExecuteStringCommand()"))
 | |
| 		SetFailState("Failed to load CGameClient::ExecuteStringCommand() signature from gamedata");
 | |
| 	
 | |
| 	DHookAddParam(hExecuteStringCommand, HookParamType_CharPtr);
 | |
| 	
 | |
| 	if (!DHookEnableDetour(hExecuteStringCommand, false, ExecuteStringCommand))
 | |
| 		SetFailState("Failed to detour CGameClient::ExecuteStringCommand()");
 | |
| 
 | |
| 	// And a post hook.
 | |
|     /*
 | |
| 	if (!DHookEnableDetour(hExecuteStringCommand, true, Detour_OnExecuteStringCommand_Post))
 | |
| 		SetFailState("Failed to detour ExecuteStringCommand post.");
 | |
|     */
 | |
| 
 | |
| 	 // Setup quick hack to get the client index of the IClient this pointer in the detour callback.
 | |
| 	StartPrepSDKCall(SDKCall_Raw);
 | |
|         PrepSDKCall_SetVirtual(GetPlayerSlotOffs);
 | |
|         PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
 | |
|         hGetPlayerSlot = EndPrepSDKCall();
 | |
| 	delete conf;
 | |
| }
 | |
| 
 | |
| /*
 | |
| public MRESReturn Detour_OnExecuteStringCommand_Post(Address pThis, Handle hReturn, Handle hParams)
 | |
| {
 | |
|     int client = SDKCall(hGetPlayerSlot, pThis) + 1;
 | |
|     char sBuffer[2048];
 | |
|     DHookGetParamString(hParams, 1, sBuffer, sizeof(sBuffer));
 | |
|     if((sBuffer[0] == 'r' && sBuffer[1] == 'p' && sBuffer[2] == 't'))
 | |
|     {
 | |
|         if(IsClientInGame(client) && !IsClientSourceTV(client))
 | |
|         {
 | |
|              LogMessage("client: %N wanted command pre: %s", client, sBuffer);
 | |
|              KickClient(client, "DO NOT USE EXPLOITS ON THIS SERVER"); 
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }  
 | |
| */
 | |
| 
 | |
| 
 | |
| public MRESReturn ExecuteStringCommand(Address addrThis, Handle hReturn, Handle hParams) 
 | |
| {
 | |
|     int client = SDKCall(hGetPlayerSlot, addrThis) + 1;
 | |
|     
 | |
|     char cmd[512];
 | |
|     DHookGetParamString(hParams, 1, cmd, 512);
 | |
|     char sSID[64];
 | |
|     GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | |
| 
 | |
|     LogMessage("client: %N. steamid: %s. command: %s", client, sSID, cmd);
 | |
|     /*
 | |
|     // "rpt", "rpt_"
 | |
|     if((cmd[0] == 'r' && cmd[1] == 'p' && cmd[2] == 't'))
 | |
|     {
 | |
|         if(IsClientInGame(client) && !IsClientSourceTV(client)) 
 | |
|         {
 | |
|             LogMessage("client: %N wanted command pre: %s", client, cmd);
 | |
|             KickClient(client, "DO NOT USE EXPLOITS ON THIS SERVER");
 | |
|         }
 | |
|     }
 | |
|     */
 | |
|     return MRES_Ignored;
 | |
| }
 | |
| 
 |