Advertisement
Guest User

Untitled

a guest
Sep 13th, 2018
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.47 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4.  
  5. #define PLUGIN "BhopHack Detector"
  6. #define VERSION "0.1"
  7. #define AUTHOR "Mistrick"
  8.  
  9. #pragma semicolon 1
  10.  
  11. #define LOGFILE "bhopdetector.log"
  12.  
  13. enum _:PLAYER_DATA
  14. {
  15.     m_GroundFrames,
  16.     m_OldGroundFrames,
  17.     m_PreJumpGroundFrames,
  18.     m_OldPreJumpGroundFrames,
  19.     m_AirFrames,//useless
  20.     m_JumpHoldFrames,
  21.     m_JumpPressCount,
  22.     m_DuckHoldFrames,
  23.     Float:m_Velocity//useless
  24. };
  25. enum _:WARNINGS_DATA
  26. {
  27.     m_WarnEqualFrames,
  28.     m_WarnGroundEqualFrames,
  29.     m_WarnJumpSpam
  30. }
  31.  
  32. #define MAX_JUMPCOUNT 16
  33. #define MAX_GROUND_FRAME_COINCIDENCE 16
  34. #define MAX_JUMP_SPAM 8
  35.  
  36. new g_ePlayerInfo[33][PLAYER_DATA];
  37. new g_ePlayerWarn[33][WARNINGS_DATA];
  38. new g_ePlayerWarnMax[33][WARNINGS_DATA];
  39.  
  40.  
  41. new g_szLogFile[128];
  42.  
  43. public plugin_init()
  44. {
  45.     register_plugin(PLUGIN, VERSION, AUTHOR);
  46.     register_forward(FM_PlayerPreThink, "FM_PlayerPreThink_Pre", false);   
  47. }
  48. public plugin_cfg()
  49. {
  50.     get_localinfo("amxx_logs", g_szLogFile, charsmax(g_szLogFile));
  51.     format(g_szLogFile, charsmax(g_szLogFile), "/%s/%s", g_szLogFile, LOGFILE);
  52. }
  53. public client_putinserver(id)
  54. {
  55.     g_ePlayerWarn[id][m_WarnEqualFrames] = 0;
  56.     g_ePlayerWarn[id][m_WarnGroundEqualFrames] = 0;
  57.     g_ePlayerWarn[id][m_WarnJumpSpam] = 0;
  58. }
  59. public client_disconnect(id)
  60. {
  61.     UTIL_LogUser(id, "onground %d, equaljump %d, jumpspam %d", g_ePlayerWarnMax[id][m_WarnGroundEqualFrames], g_ePlayerWarnMax[id][m_WarnEqualFrames], g_ePlayerWarnMax[id][m_WarnJumpSpam]);
  62.    
  63.     g_ePlayerWarnMax[id][m_WarnEqualFrames] = 0;
  64.     g_ePlayerWarnMax[id][m_WarnGroundEqualFrames] = 0;
  65.     g_ePlayerWarnMax[id][m_WarnJumpSpam] = 0;
  66. }
  67. public FM_PlayerPreThink_Pre(id)
  68. {
  69.     if(!is_user_alive(id)) return FMRES_IGNORED;
  70.    
  71.     new buttons = pev(id, pev_button);
  72.     new oldbuttons = pev(id, pev_oldbuttons);
  73.    
  74.     if(buttons & IN_JUMP)
  75.     {
  76.         g_ePlayerInfo[id][m_JumpHoldFrames]++;
  77.     }
  78.     if(buttons & IN_JUMP && ~oldbuttons & IN_JUMP)
  79.     {
  80.         g_ePlayerInfo[id][m_JumpPressCount]++;
  81.     }
  82.     if(~buttons & IN_JUMP && oldbuttons & IN_JUMP)
  83.     {
  84.         ///**************************************
  85.     }
  86.     if(buttons & IN_DUCK)
  87.     {
  88.         g_ePlayerInfo[id][m_DuckHoldFrames]++;
  89.     }
  90.    
  91.     new on_ground = bool:(pev(id, pev_flags) & FL_ONGROUND);
  92.    
  93.     if(on_ground)
  94.     {
  95.         g_ePlayerInfo[id][m_GroundFrames]++;
  96.     }
  97.     else
  98.     {
  99.         if(g_ePlayerInfo[id][m_GroundFrames])
  100.         {
  101.             new Float:velocity[3]; pev(id, pev_velocity, velocity); velocity[2] = 0.0;
  102.             g_ePlayerInfo[id][m_Velocity] = _:vector_length(velocity);
  103.             g_ePlayerInfo[id][m_PreJumpGroundFrames] = g_ePlayerInfo[id][m_GroundFrames];
  104.         }
  105.         g_ePlayerInfo[id][m_GroundFrames] = 0;
  106.         g_ePlayerInfo[id][m_AirFrames]++;
  107.     }
  108.    
  109.     if(g_ePlayerInfo[id][m_OldGroundFrames] == 0 && g_ePlayerInfo[id][m_GroundFrames])
  110.     {
  111.         if(g_ePlayerInfo[id][m_JumpPressCount] == 0 && g_ePlayerInfo[id][m_JumpHoldFrames] == 0 && g_ePlayerInfo[id][m_DuckHoldFrames] == 0)
  112.         {
  113.             //console_print(id, "wtf? JumpPressCount 0, JumpHoldFrames 0, DuckHoldFrames 0");
  114.         }
  115.         if(g_ePlayerInfo[id][m_JumpPressCount] > 0)
  116.         {
  117.             /// if g_ePlayerInfo[id][m_JumpHoldFrames] == g_ePlayerInfo[id][m_JumpPressCount] cheat
  118.             /// if g_ePlayerInfo[id][m_JumpPressCount] > 16 script
  119.            
  120.             //console_print(id, "ground [%d], air [%d], jumphold [%d], jumpcount [%d], velocity [%.3f]", g_ePlayerInfo[id][m_PreJumpGroundFrames],  g_ePlayerInfo[id][m_AirFrames], g_ePlayerInfo[id][m_JumpHoldFrames], g_ePlayerInfo[id][m_JumpPressCount], g_ePlayerInfo[id][m_Velocity]);
  121.            
  122.             /// TODO: сделать цикл
  123.             if(g_ePlayerInfo[id][m_JumpHoldFrames] == g_ePlayerInfo[id][m_JumpPressCount])
  124.             {
  125.                 g_ePlayerWarn[id][m_WarnEqualFrames]++;
  126.                 if(g_ePlayerWarn[id][m_WarnEqualFrames] > g_ePlayerWarnMax[id][m_WarnEqualFrames])
  127.                 {
  128.                     g_ePlayerWarnMax[id][m_WarnEqualFrames] = g_ePlayerWarn[id][m_WarnEqualFrames];
  129.                 }
  130.             }
  131.             else if(g_ePlayerWarn[id][m_WarnEqualFrames])
  132.             {
  133.                 g_ePlayerWarn[id][m_WarnEqualFrames]--;
  134.             }
  135.            
  136.             if(g_ePlayerInfo[id][m_PreJumpGroundFrames] == g_ePlayerInfo[id][m_OldPreJumpGroundFrames])
  137.             {
  138.                 g_ePlayerWarn[id][m_WarnGroundEqualFrames]++;
  139.                 if(g_ePlayerWarn[id][m_WarnGroundEqualFrames] > g_ePlayerWarnMax[id][m_WarnGroundEqualFrames])
  140.                 {
  141.                     g_ePlayerWarnMax[id][m_WarnGroundEqualFrames] = g_ePlayerWarn[id][m_WarnGroundEqualFrames];
  142.                 }
  143.             }
  144.             else if(g_ePlayerWarn[id][m_WarnGroundEqualFrames])
  145.             {
  146.                 g_ePlayerWarn[id][m_WarnGroundEqualFrames]--;
  147.             }
  148.            
  149.             if(g_ePlayerInfo[id][m_JumpPressCount] >= MAX_JUMPCOUNT)
  150.             {
  151.                 g_ePlayerWarn[id][m_WarnJumpSpam]++;
  152.                 if(g_ePlayerWarn[id][m_WarnJumpSpam] > g_ePlayerWarnMax[id][m_WarnJumpSpam])
  153.                 {
  154.                     g_ePlayerWarnMax[id][m_WarnJumpSpam] = g_ePlayerWarn[id][m_WarnJumpSpam];
  155.                 }
  156.             }
  157.             else if(g_ePlayerWarn[id][m_WarnJumpSpam])
  158.             {
  159.                 g_ePlayerWarn[id][m_WarnJumpSpam]--;
  160.             }
  161.            
  162.             //console_print(id, "groundequal [%d], jumpequal[%d], jumpspam [%d]", g_ePlayerWarn[id][m_WarnGroundEqualFrames], g_ePlayerWarn[id][m_WarnEqualFrames], g_ePlayerWarn[id][m_WarnJumpSpam]);
  163.            
  164.             if(g_ePlayerWarn[id][m_WarnGroundEqualFrames] >= MAX_GROUND_FRAME_COINCIDENCE)
  165.             {
  166.                 PunishPlayer(id, "BhopHack[g]");
  167.                 g_ePlayerWarn[id][m_WarnGroundEqualFrames] = 0;
  168.             }
  169.             if(g_ePlayerWarn[id][m_WarnJumpSpam] >= MAX_JUMP_SPAM)
  170.             {
  171.                 PunishPlayer(id, "BhopHack[s]");
  172.                 g_ePlayerWarn[id][m_WarnJumpSpam] = 0;
  173.             }
  174.         }
  175.        
  176.         g_ePlayerInfo[id][m_AirFrames] = 0;
  177.         g_ePlayerInfo[id][m_JumpHoldFrames] = 0;
  178.         g_ePlayerInfo[id][m_JumpPressCount] = 0;
  179.         g_ePlayerInfo[id][m_DuckHoldFrames] = 0;
  180.         g_ePlayerInfo[id][m_OldPreJumpGroundFrames] = g_ePlayerInfo[id][m_PreJumpGroundFrames];
  181.     }
  182.    
  183.     g_ePlayerInfo[id][m_OldGroundFrames] = g_ePlayerInfo[id][m_GroundFrames];
  184.    
  185.     return FMRES_IGNORED;
  186. }
  187. PunishPlayer(id, reason[])
  188. {
  189.     new name[32]; get_user_name(id, name, charsmax(name));
  190.     client_print(0, print_chat, "[BH Detector] %s using %s", name, reason);
  191.     server_cmd("amx_ban 0 #%d %s", get_user_userid(id), reason);
  192.    
  193.     UTIL_LogUser(id, "using %s", reason);
  194. }
  195. stock UTIL_LogUser(const id, const szCvar[], any:...)
  196. {
  197.     new iFile;
  198.     if( (iFile = fopen(g_szLogFile, "a")) )
  199.     {
  200.         new szName[32], szAuthid[32], szIp[32], szTime[22];
  201.         new message[128]; vformat(message, charsmax(message), szCvar, 3);
  202.        
  203.         get_user_name(id, szName, charsmax(szName));
  204.         get_user_authid(id, szAuthid, charsmax(szAuthid));
  205.         get_user_ip(id, szIp, charsmax(szIp), 1);
  206.         get_time("%m/%d/%Y - %H:%M:%S", szTime, charsmax(szTime));
  207.        
  208.         fprintf(iFile, "L %s: <%s><%s><%s> %s^n", szTime, szName, szAuthid, szIp, message);
  209.         fclose(iFile);
  210.     }
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement