Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*============================================================================*\
- Anti Quick Re Connect v 1.0 by White_116
- Date: 16.10.13
- ================================================================================
- native AQRC_Ban(playerid, reason[]);
- native AQRC_Kick(playerid);
- native AQRC_UnBanIP(iip);
- native AQRC_ScriptInit();
- native AQRC_ScriptExit();
- native AQRC_OnPlayerConnect(playerid);
- native AQRC_OnPlayerDisconnect(playerid, reason);
- native AQRC_OnPlayerUpdate(playerid);
- native int2ip(iip, szIP[]);
- native ip2int(szIP[]);
- \*============================================================================*/
- #include <a_samp>
- new ReConnectTime=15000; // мсек. после дисконекта, после котороых снова можно конектится (15 стандарт)
- new DB:DATABASE;
- new DBResult:RESULT;
- new BanReason[MAX_PLAYERS][128];
- new IP[MAX_PLAYERS][16];
- new TimeKB[MAX_PLAYERS char];
- new TypeKB[MAX_PLAYERS char];
- new TimerKB[MAX_PLAYERS]={-1,...};
- //==============================================================================
- //Конвертируют ип в число и обратно.
- //==============================================================================
- #define int2ip(%0,%1) format(%1, sizeof(%1), "%i.%i.%i.%i", (%0 >>> 24), ((%0 >>> 16) & 255), ((%0 >>> 8) & 255), (%0 & 255))// bjiadokc
- stock ip2int(const szIP[])// RyDeR`
- {
- new aiBytes[1],iPos;
- aiBytes{0} = strval(szIP[iPos]);
- while(szIP[iPos] != EOS && szIP[iPos++] != '.') {}
- aiBytes{1} = strval(szIP[iPos]);
- while(szIP[iPos] != EOS && szIP[iPos++] != '.') {}
- aiBytes{2} = strval(szIP[iPos]);
- while(szIP[iPos] != EOS && szIP[iPos++] != '.') {}
- aiBytes{3} = strval(szIP[iPos]);
- return aiBytes[0];
- }
- //==============================================================================
- //Разбанит указаный ид в БД и в samp.ban
- //==============================================================================
- forward AQRC_UnBanIP(iip);
- public AQRC_UnBanIP(iip)
- {
- new QUERY[128],ip[16];
- int2ip(iip,ip);
- format(QUERY, sizeof(QUERY), "DELETE FROM `aqrc` WHERE `ip` = '%i'",iip);
- db_free_result(db_query(DATABASE, QUERY));
- format(QUERY, sizeof(QUERY), "AQRC_UnBanIP %s", ip);
- SendRconCommand(QUERY);
- //printf("===AQRC=== %s",QUERY);
- }
- //==============================================================================
- //Фикс кика для сервера Х версии
- //==============================================================================
- forward Kick2(playerid);
- public Kick2(playerid)
- {
- TimerKB[playerid]=-1;
- Kick(playerid);
- }
- stock AQRC_Kick(playerid)
- {
- if(TimerKB[playerid]== -1)
- {
- TimerKB[playerid]=SetTimerEx("KickEx2", 2000, false, "i", playerid);
- TypeKB{playerid}=1;
- TimeKB{playerid}=2;
- }
- }
- //==============================================================================
- //Фикс бана для сервера Х версии
- //==============================================================================
- forward Ban2(playerid);
- public Ban2(playerid)
- {
- TimerKB[playerid]=-1;
- if(BanReason[playerid][0])return BanEx(playerid,BanReason[playerid]);
- else return Ban(playerid);
- }
- stock AQRC_Ban(playerid, reason[]="~")
- {
- if(TimerKB[playerid]== -1)
- {
- TimerKB[playerid]=SetTimerEx("Ban2", 2000, false, "i", playerid);
- TimeKB{playerid}=2;
- }
- TypeKB{playerid}=2;
- strdel(BanReason[playerid], 0, 128);
- if(reason[0]!='~')strcat(BanReason[playerid], reason);
- return 1;
- }
- //==============================================================================
- //Откроет БД. Создаст таблицы если нет, разбанит игроков если упал сервер.
- //==============================================================================
- stock AQRC_ScriptInit()
- {
- DATABASE=db_open("DB.db");
- db_free_result(db_query(DATABASE, "CREATE TABLE IF NOT EXISTS `aqrc` (ip INTEGER)"));
- RESULT=db_query(DATABASE, "SELECT `ip` FROM `aqrc`");
- new VALUE[11], i=db_num_rows(RESULT);
- for(new x; x < i; x++)
- {
- db_get_field_assoc(RESULT, "ip", VALUE, 11);
- AQRC_UnBanIP(strval(VALUE));
- db_next_row(RESULT);
- }
- db_free_result(RESULT);
- return 1;
- }
- //==============================================================================
- //Закроет БД.
- //==============================================================================
- stock AQRC_ScriptExit()
- {
- db_close(DATABASE);
- return 1;
- }
- //==============================================================================
- //Фикс кика/бана для Х версии. Если игрок теоретически забанен то будет расинхронизорован.
- //==============================================================================
- stock AQRC_OnPlayerUpdate(playerid)
- {
- if(TimeKB{playerid}==2)
- {
- TimeKB{playerid}--;
- return 0;
- }
- else if(TimeKB{playerid}==1)
- {
- if(TypeKB{playerid}==1)return Kick(playerid);
- else
- {
- if(BanReason[playerid][0])return BanEx(playerid, BanReason[playerid]);
- else return Ban(playerid);
- }
- }
- return 1;
- }
- //==============================================================================
- //Проверяет игрока на двойной коннект. Не допускает более одного соединения с ип адреса.
- //==============================================================================
- stock AQRC_OnPlayerConnect(playerid)
- {
- //---------------------- AntiDoublConnect ------------------------
- if(IP[playerid][0] != 0)return 1;
- //---------------------- AntiMultiConnect ------------------------
- GetPlayerIp(playerid,IP[playerid],16);
- for(new x=MAX_PLAYERS; x--;)
- if(x != playerid)
- if(IP[x][0] != 0)
- if(!strcmp(IP[playerid],IP[x]))return 2;
- return 0;
- }
- //==============================================================================
- //Банит игрока после его выхода. Если был тайм оут то его не банит.
- //==============================================================================
- stock AQRC_OnPlayerDisconnect(playerid, reason)
- {
- //---------------------- AntiQuikReConnect ------------------------
- if(reason == 0)
- {
- IP[playerid][0]=0;
- return 1;
- }
- else if(reason == 2)
- {
- //---------------------- FixKickBan ------------------------
- new rn=TypeKB{playerid};
- if(TimerKB[playerid]!= -1)KillTimer(TimerKB[playerid]);
- TimerKB[playerid]=-1;
- TypeKB{playerid}=0;
- TimeKB{playerid}=0;
- if(rn>1)return 1;
- }
- new QUERY[128],ip=ip2int(IP[playerid]);
- format(QUERY, sizeof(QUERY), "banip %s", IP[playerid]);
- SendRconCommand(QUERY);
- printf("===AQRC=== %s",QUERY);
- format(QUERY,sizeof(QUERY),"INSERT INTO `aqrc` (ip) VALUES ('%i')", ip);
- db_free_result(db_query(DATABASE, QUERY));
- SetTimerEx("AQRC_UnBanIP", ReConnectTime, 0, "i", ip);
- //---------------------- AntiDoublConnect ------------------------
- IP[playerid][0]=0;
- return 1;
- }
- //========================== EOS ========================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement