kANORIbAbYjEWNTT Posted March 17, 2022 Share Posted March 17, 2022 - Nume plugin: Anti-steam Multiple 1.0.0 - Autor: nu se cunoaște autorul - Engine : - Versiune: v1.0.0 - Informatii: Acest plugin limitează numărul de STEAMID-uri admise pe același ip. - Download: verifică mai jos. - Instalare: 1. Compliati fisierul SIDM.sma 2. Fisierul steambonus.amxx il puneti in addons/amxmodx/plugins 3. Intrati in fisierul addons/amxmodx/configs/plugins.ini si adaugati la urma: SIDM.amxx #include <amxmodx> #include <sqlx> #define PLUGIN "ANTI MULTIPLE STEAMID" #define VERSION "1.0" #define AUTHOR "Unknow (edited by Andy)" #pragma semicolon 1 #define STEAMID_PER_IP 2 #define SAVE_LASTDAYS 1 #define REASON "STEAMID MULTIPLICAT" //#define WHITELIST #if defined WHITELIST new const g_szWhiteList[][] = { "123.0.0.0/8", "123.123.0.0/24", "123.123.123.123" }; enum _:WhitelistData { NET_IP, NET_MASK }; new Array:g_aWhitelist; #endif new const DATABASE[] = "addons/amxmodx/data/steamidlimiter.db"; new Handle:g_Tuple, g_szQuery[256]; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); SQLite_Init(); #if defined WHITELIST new eNetData[WhitelistData]; g_aWhitelist = ArrayCreate(WhitelistData); for( new i; i < sizeof(g_szWhiteList); i++ ) { net_to_long( g_szWhiteList[i], eNetData[NET_IP], eNetData[NET_MASK] ); ArrayPushArray( g_aWhitelist, eNetData ); } #endif } SQLite_Init() { SQL_SetAffinity("sqlite"); if(!file_exists(DATABASE)) { new file = fopen(DATABASE, "w"); if(!file) { new szMsg[128]; formatex(szMsg, charsmax(szMsg), "%s file not found and cant be created.", DATABASE); set_fail_state(szMsg); } fclose(file); } g_Tuple = SQL_MakeDbTuple("", "", "", DATABASE, 0); formatex(g_szQuery, charsmax(g_szQuery), "CREATE TABLE IF NOT EXISTS `players`( \ id INTEGER PRIMARY KEY,\ ip TEXT NOT NULL, \ steamid TEXT NOT NULL,\ lastseen INTEGER)"); SQL_ThreadQuery(g_Tuple, "QueryHandleCreate", g_szQuery); formatex(g_szQuery, charsmax(g_szQuery), "DELETE FROM `players` WHERE lastseen<%d", get_systime() - SAVE_LASTDAYS * 86400); SQL_ThreadQuery(g_Tuple, "QueryHandleCreate", g_szQuery); } public QueryHandleCreate(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { log_amx("SQL QueryHandleCreate error: %s", error); } } public client_authorized(id) { if(is_user_steam(id) || is_user_bot(id) || is_user_hltv(id)) return; new szPlayerIp[32]; get_user_ip(id, szPlayerIp, charsmax(szPlayerIp), 1); new szPlayerSteamid[32]; get_user_authid(id, szPlayerSteamid, charsmax(szPlayerSteamid)); if(containi(szPlayerSteamid, "lan") != -1) return; #if defined WHITELIST new eNetData[WhitelistData]; for( new i; i < sizeof(g_szWhiteList); i++ ) { ArrayGetArray( g_aWhitelist, i, eNetData ); if( eNetData[NET_IP] == ip_to_long(szPlayerIp) & eNetData[NET_MASK] ) return; } #endif new data[1]; data[0] = id; formatex(g_szQuery, charsmax(g_szQuery), "SELECT * FROM `players` WHERE ip='%s' LIMIT %d", szPlayerIp, STEAMID_PER_IP); SQL_ThreadQuery(g_Tuple, "QueryHandleCheckPlayer", g_szQuery, data, sizeof(data)); } public QueryHandleCheckPlayer(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { log_amx("SQL QueryHandleCheckPlayer error: %s", error); return; } new id = data[0]; new szPlayerIp[32]; get_user_ip(id, szPlayerIp, charsmax(szPlayerIp), 1); new szPlayerSteamid[32]; get_user_authid(id, szPlayerSteamid, charsmax(szPlayerSteamid)); if(SQL_MoreResults(query)) { new index = SQL_ReadResult(query, 0); new szLoadedIp[32]; SQL_ReadResult(query, 1, szLoadedIp, charsmax(szLoadedIp)); new szLoadedSteamid[32]; SQL_ReadResult(query, 2, szLoadedSteamid, charsmax(szLoadedSteamid)); if(equali(szPlayerSteamid, szLoadedSteamid)) { UpdatePlayer(index); } else { #if STEAMID_PER_IP == 1 server_cmd("kick #%d %s", get_user_userid(id), REASON); #else new count = 1; SQL_NextRow(query); while(SQL_MoreResults(query)) { count++; index = SQL_ReadResult(query, 0); SQL_ReadResult(query, 1, szLoadedIp, charsmax(szLoadedIp)); SQL_ReadResult(query, 2, szLoadedSteamid, charsmax(szLoadedSteamid)); if(equali(szPlayerSteamid, szLoadedSteamid)) { UpdatePlayer(index); return; } else if(count == STEAMID_PER_IP) { server_cmd("kick #%d %s", get_user_userid(id), REASON); return; } SQL_NextRow(query); } if(count < STEAMID_PER_IP) { InsertPlayer(szPlayerIp, szPlayerSteamid); } #endif } } else { InsertPlayer(szPlayerIp, szPlayerSteamid); } } InsertPlayer(szPlayerIp[], szPlayerSteamid[]) { formatex(g_szQuery, charsmax(g_szQuery), "INSERT INTO `players`(ip, steamid, lastseen) VALUES ('%s', '%s', %d)", szPlayerIp, szPlayerSteamid, get_systime()); SQL_ThreadQuery(g_Tuple, "QueryHandleInsertPlayer", g_szQuery); } public QueryHandleInsertPlayer(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { log_amx("SQL QueryHandleInsertPlayer error: %s", error); } } UpdatePlayer(index) { formatex(g_szQuery, charsmax(g_szQuery), "UPDATE `players` SET lastseen=%d WHERE id=%d", get_systime(), index); SQL_ThreadQuery(g_Tuple, "QueryHandleUpdatePlayer", g_szQuery); } public QueryHandleUpdatePlayer(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { log_amx("SQL QueryHandleUpdatePlayer error: %s", error); } } stock bool:is_user_steam(id) { static dp_pointer; if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider"))) { server_cmd("dp_clientinfo %d", id); server_exec(); return (get_pcvar_num(dp_pointer) == 2) ? true : false; } return false; } /*-- Modified and simplified 'IP converter stocks' by Zetex --*/ // Gets net and mask as LONG from subnet. stock net_to_long( net_string[], &net, &mask ) { new i, ip[16]; i = copyc( ip, charsmax(ip), net_string, '/' ); mask = i ? cidr_to_long( net_string[i + 1] ) : 0xFFFFFFFF; /* mask /32, IP itself */ net = ip_to_long(ip) & mask; } // Converts mask to LONG. Returns unsigned long. stock cidr_to_long( mask_string[] ) { new mask = str_to_num(mask_string); new result = (1 << 31) >> (mask - 1); return result; } // Converts IP to LONG. Returns unsigned long. stock ip_to_long( ip_string[] ) { new right[16], part[4], octet, ip = 0; strtok( ip_string, part, 3, right, 15, '.' ); for( new i = 0; i < 4; i++ ) { octet = str_to_num(part); ip += octet; if( i == 3 ) break; strtok( right, part, 3, right, 15, '.' ); ip = ip << 8; } return ip; } Detașamentul de Operațiuni Speciale „Azov” Link to comment Share on other sites More sharing options...
Recommended Posts