Ошибка в работе Lite Bans

pollfank

Пользователь
Регистрация
10 Июл 2017
Сообщения
40
Симпатии
2
Пол
Мужской
OS
Linux
Amx Mod X
AMXX 1.9.0
Билд
Protocol version 48 Exe version 1.6.3.7/Stdio (cstrike) ReHLDS version: 3.7.0.699-dev Build date: 15:19:29 Sep 7 2020 (2340)
ReGamedll
ReGameDLL version: 5.18.0.474-dev Build date: 11:07:34 Jul 16 2020
Metamod
Metamod-r v1.3.0.84, API (5:13) Metamod-r build: 20:03:02 Jul 31 2017
Meta модули
Код:
[ 1] SafeNameAndChat RUN - safenameandchat. v1.1 ini ANY ANY
[ 2] Reunion RUN - reunion_mm_i386. v0.1.0.9 ini Start Never
[ 3] VoiceTranscoder RUN - vtc.so v2017RC5 ini ANY ANY
[ 4] AMX Mod X RUN - amxmodx_mm_i386. v1.9.0.5 ini Start ANY
[ 5] ReSemiclip RUN - resemiclip_mm_i3 v2.3.9 ini Chlvl ANY
[ 6] ReSRDetector RUN - resrdetector_mm_ v0.1.0 ini Chlvl ANY
[ 7] Rechecker RUN - rechecker_mm_i38 v2.5 ini Chlvl ANY
[ 8] ReAuthCheck RUN - reauthcheck_mm_i v0.1.6 ini Start Never
[ 9] WHBlocker RUN - whblocker_mm_i38 v1.5.696 ini Chlvl ANY
[10] ReAimDetector RUN - reaimdetector_am v0.2.2 pl4 ANY Never
[11] ReAPI RUN - reapi_amxx_i386. v5.16.0. pl4 ANY Never
[12] SxGeo RUN - sxgeo_amxx_i386. v2.2 pl4 ANY Never
[13] MySQL RUN - mysql_amxx_i386. v1.9.0.5 pl4 ANY ANY
[14] FakeMeta RUN - fakemeta_amxx_i3 v1.9.0.5 pl4 ANY ANY
[15] Engine RUN - engine_amxx_i386 v1.9.0.5 pl4 ANY ANY
[16] Ham Sandwich RUN - hamsandwich_amxx v1.9.0.5 pl4 ANY ANY
[17] CStrike RUN - cstrike_amxx_i38 v1.9.0.5 pl4 ANY ANY
[18] Fun RUN - fun_amxx_i386.so v1.9.0.5 pl4 ANY ANY
Плагины
Код:
[ 1] Lite Bans 2.2 neygomon lite_bans.amxx debug
[ 2] GameCMS_API 5.3.5 zhorzh78 gamecms_api.amx running
[ 3] SF Warn Menu 0.1.4g serfreeman1337 kick_menu.amxx running
[ 4] ReAimDetector API 0.2.2 ReHLDS Team reaimdetector.a running
[ 5] RC BaseChanger freesrv AMXX rc_basechanger. running
[ 6] Admin Commands 1.9.0.5271 AMXX Dev Team admincmd.amxx running
[ 7] Language Menu 1.0 F@nt0M langmenu.amxx running
[ 8] Super WeaponMenu 1.1 neygomon amx_weaponmenu. running
[ 9] GagManager 2.2.3 zhorzh78 gagmanager.amxx running
[ 10] Menus Front-End 1.4 neugomon menufront.amxx running
[ 11] Commands Menu 1.9.0.5271 AMXX Dev Team cmdmenu.amxx running
[ 12] Players Menu 1.7 neugomon plmenu.amxx running
[ 13] Map Manager 2.5.61 Mistrick mapmanager.amxx running
[ 14] Maps Menu 1.4.1 neugomon mapsmenu.amxx running
[ 15] Admin Chat 1.9.0.5271 AMXX Dev Team adminchat.amxx running
[ 16] Admin Votes 1.9.0.5271 AMXX Dev Team adminvote.amxx running
[ 17] Buy Nades Limit 0.0.3 steelzorrr restmenu.amxx running
[ 18] CMSStats_MySQL 1.17 / 13. zhorzh78 cmsstats_mysql. running
[ 19] CMSStats Award 1.0 zhorzh78 cms_awards.amxx running
[ 20] CMSStatsX_Configuratio 1.9.0.5229 AMXX Dev Team cmsstats_statsc running
[ 21] CMSStats_Ranks 1.2.2 zhorzh78 cmsstats_ranks. running
[ 22] CMSStats_StatsX 1.04 / 03. AMXX Dev Team++ cmsstats_statsx running
[ 23] Web Chat 1.3.11 BaHeK amx_webchat.amx running
[ 24] Chat Manager 1.1.2-16 Mistrick chatmanager.amx running
[ 25] [ReAPI] VIP 1.4.6 Fenix vip_menu.amxx running
[ 26] Auto-Give Privileges 1.0 SerGrib night_vip.amxx running
[ 27] User Connect 0.1 Fenix user_connect.am running
[ 28] Steam Bonus 1.0 Hypa_[KZ] steam_bonus.amx running
[ 29] [ReAPI] Custom Models 1.6.1 neugomon custom_models.a running
[ 30] Advanced Ultimate Weap 0.1.0b steelzzz ultimate_weapon running
[ 31] Menu 1.0 Teams custom_menu.amx running
[ 32] GameCMS_Present 1.6.6 zhorzh78 gamecms_present running
[ 33] GameCMS_Present Coins 1.1 zhorzh78 presents_coins_ running
[ 34] GameCMS_Registration 1.5 zhorzh78 gamecms_registr running
[ 35] GameCMS_Informer 2.3 API5 zhorzh78 forum_hud_infor running
[ 36] Radio Control 1.2.9 Radius radio_control.a running
[ 37] Menu System 0.1.2 serfreeman1337 amx_menu.amxx running
[ 38] Join Message 1.2 BigBaller join_leave.amxx running
[ 39] [SxGeo] Connect Info 1.0 s1lent connect_info.am running
[ 40] HS_Blood 1.1 tuty hs_bloodeffect. running
[ 41] RE C4 Timer [ON] 1.0 AcE bomb_timer.amxx running
[ 42] Ultimate Sound 1.0 FENIX ult_sound.amxx running
[ 43] AutoRestart 1.0 neygomon auto_rr.amxx running
[ 44] Lite Admin ESP 1.1 neygomon, AcE admin_esp.amxx running
[ 45] [ReAPI] Vampire 1.0 ApXuTekToR vampire.amxx running
[ 46] ComboSprites 0.5 Chrescoe1 combo_on_kill.a running
[ 47] Death Sprite 1.0 DarkGL kill_sprite.amx running
[ 48] Damager 1.0 Prayer damager.amxx running
[ 49] Player Votes 1.0 neugomon votesban.amxx running
[ 50] Back Weapons 1.90 fenix backweapons.amx running
[ 51] Chat 1.5 DiGiTaL ad_manager.amxx running
[ 52] [ReAPI] Parachute 1.1 ReHLDS Team parashut.amxx running
[ 53] NoFlash/SRW Name 0.0.2 Fenix no_team_flash.a running
[ 54] KiLL Assist poka_4to_b PRoSToTeM@ kill_assist.amx running
[ 55] DemoRecoder 1.2 neygomon demorecord.amxx running
[ 56] AFK Control 1.4.1 [Rnd neygomon afk_control.amx running
[ 57] Ping Control 1.31 neygomon ping_control.am running
[ 58] CMS Reset Score 1.1 ApXuTekToR cms_resetscore. running
[ 59] Knife Duel with Telepo 1.2 neygomon knife_duel.amxx running
[ 60] [ReAPI] AWPoff 1.4.3 PAffAEJIkA :3 awp_off.amxx running
Amxx Модули
Код:
ReAimDetector 0.2.2 ReHLDS Team running
ReAPI 5.16.0.198 Asmodai & s1lent running
SxGeo 2.2 s1lent running
MySQL 1.9.0.5271 AMX Mod X Dev Team running
FakeMeta 1.9.0.5271 AMX Mod X Dev Team running
nVault 1.9.0.5271 AMX Mod X Dev Team running
Engine 1.9.0.5271 AMX Mod X Dev Team running
Ham Sandwich 1.9.0.5271 AMX Mod X Dev Team running
CStrike 1.9.0.5271 AMX Mod X Dev Team running
Fun 1.9.0.5271 AMX Mod X Dev Team running
Sockets 1.9.0.5271 AMX Mod X Dev Team running
Ошибка
Код:
L 10/31/2020 - 19:53:15: [AMXX] Displaying debug trace (plugin "lite_bans.amxx", version "2.2")
L 10/31/2020 - 19:53:15: [AMXX] Run time error 25: parameter error
L 10/31/2020 - 19:53:15: [AMXX] [0] lite_bans.sma::BanAction (line 821)
L 10/31/2020 - 19:53:15: [AMXX] [1] lite_bans.sma::concmdBan (line 407)
L 10/31/2020 - 19:53:15: String formatted incorrectly - parameter 4 (total 3)
Исходник
Код:
Код:
#include <amxmodx>
#include <time>
#include <sqlx>

#if !defined MAX_PLAYERS
    const MAX_PLAYERS = 32;
#endif
#if !defined MAX_NAME_LENGTH
    const MAX_NAME_LENGTH = 32;
#endif
#if !defined MAX_AUTHID_LENGTH
    const MAX_AUTHID_LENGTH = 25;
#endif
const MAX_REASON_LENGTH = 96;

enum _:global_cvars
{
    srv_name[64],
    srv_ip[24],
    cookie_link[128],
    hud_msg[512],
    hud_msg_color[3],
    superadmin,
    global_bans,
    ip_bantime,
    static_reasons,
    static_time
};
enum _:BanData
{
    index,
    bantime,
    reason[MAX_REASON_LENGTH]
};
enum _:OffData
{
    name[MAX_NAME_LENGTH],
    ip[16],
    authid[MAX_AUTHID_LENGTH],
    immunity
};
enum _:KickData
{
    auth[MAX_AUTHID_LENGTH],
    u_name[MAX_NAME_LENGTH],
    a_name[MAX_NAME_LENGTH],
    ban_reason[MAX_REASON_LENGTH],
    ban_time,
    ban_length,
    bid
};
enum _:PlrData
{
    bool:cookie,
    pstate
};
enum
{
    none,
    checked,
    ban,
};
enum _:
{
    Ban,
    Unban,
    UnbanMenu,
    OffbanMenu,
    Check,
    Search,
    Expired,
    Update,   
    AddServer,
    GetServer
};

enum fwd
{
    SqlInit,
    PreBan
};
enum CVARS
{
    host,
    user,
    pass,
    db,
    pref,
    delay,
    srvname,
    srvip,
    allbans,
    ipban,
    reasons,
    rsnbtm,
    crsn,
    rmvexp,
    sadmin,
    unbanm,
    lnkck,
    hud,
    hudpos,
    hudclr
};

new Handle:g_hSqlTuple,
    g_Data[2],
    g_szTablePrefix[64],
    szQuery[1024];

new g_playerData[MAX_PLAYERS + 1][PlrData];
new g_arrBanData[MAX_PLAYERS + 1][BanData];
new g_arrKickData[MAX_PLAYERS + 1][KickData];

new g_iTimeMenu, g_iReasonMenu;

new g_fwdHandle[fwd];

new g_pCvars[CVARS],
    g_Cvars[global_cvars];

new Float:g_fHudPos[2];

new g_szConfigDir[64];

new Array:g_aOffPlayers, g_arrOffPlayers[OffData];
#define MAX_STRINGS 20
new g_iStrings;
new g_szConsole[MAX_STRINGS][256];

#if AMXX_VERSION_NUM < 183
    #define replace_string replace_all
#endif   

public plugin_init()
{
    register_plugin("Lite Bans", "2.2", "neygomon");
    register_dictionary("lite_bans.txt");
    
    register_message(get_user_msgid("MOTD"), "CheckCookies");
    
    register_clcmd("banreason", "clcmdBanReason",     ADMIN_BAN);
    register_clcmd("amx_banmenu", "clcmdBanMenu",     ADMIN_BAN);
    register_clcmd("amx_offbanmenu", "clcmdOffBanMenu", ADMIN_BAN);
    register_clcmd("amx_unbanmenu", "clcmdUnBanMenu", ADMIN_BAN);
    
    register_concmd("amx_ban",  "concmdBan",    ADMIN_BAN);
    register_concmd("amx_unban","concmdUnBan",       ADMIN_BAN);
    register_concmd("find_ban", "concmdFindBan",     ADMIN_BAN);
    
    g_pCvars[host] = register_cvar("lb_sql_host",     "127.0.0.1");
    g_pCvars[user] = register_cvar("lb_sql_user",     "root",        FCVAR_PROTECTED);
    g_pCvars[pass] = register_cvar("lb_sql_pass",     "password", FCVAR_PROTECTED);
    g_pCvars[db]   = register_cvar("lb_sql_db",       "database");
    g_pCvars[pref] = register_cvar("lb_sql_pref",     "amx");
    
    g_pCvars[delay]  = register_cvar("lb_kick_delay",     "3");
    g_pCvars[allbans]= register_cvar("lb_all_bans",       "1");
    g_pCvars[ipban]     = register_cvar("lb_ip_bantime",       "60");
    g_pCvars[reasons]= register_cvar("lb_static_reason",       "1");
    g_pCvars[rsnbtm] = register_cvar("lb_static_bantime",   "1");
    g_pCvars[crsn]   = register_cvar("lb_custom_reason",       "1");
    g_pCvars[rmvexp] = register_cvar("lb_remove_expired",   "1");
    g_pCvars[sadmin] = register_cvar("lb_full_access",       "l");
    g_pCvars[unbanm] = register_cvar("lb_unban_max_list",    "10");
    g_pCvars[lnkck]  = register_cvar("lb_link_to_banphp",   "");
    g_pCvars[srvname]= register_cvar("lb_server_name",    "Half-Life");
    g_pCvars[srvip]     = register_cvar("lb_server_ip",      "127.0.0.1:27015");
    
    g_pCvars[hud]      = register_cvar("lb_hud_text",      "");
    g_pCvars[hudpos] = register_cvar("lb_hud_pos",      "0.05 0.30");
    g_pCvars[hudclr] = register_cvar("lb_hud_color",      "0 255 0");
    
    g_fwdHandle[PreBan]  = CreateMultiForward("user_banned_pre", ET_IGNORE, FP_CELL);
    g_fwdHandle[SqlInit]  = CreateMultiForward("lite_bans_sql_init", ET_IGNORE, FP_CELL);
    
    LoadCvars();
}

public plugin_cfg()
{
    g_aOffPlayers = ArrayCreate(OffData);

    new str[190];
    formatex(str, charsmax(str), "%L", LANG_SERVER, "TIMEMENU_TITLE");
    g_iTimeMenu     = menu_create(str, "TimeMenuHandler");
    formatex(str, charsmax(str), "%L", LANG_SERVER, "REASONMENU_TITLE");
    g_iReasonMenu     = menu_create(str, "ReasonMenuHandler");
#define TEST
#if defined TEST
    new iLen = formatex(szQuery, charsmax(szQuery), "SELECT `id` FROM `%s_serverinfo` WHERE `address` = '%s';", g_szTablePrefix, g_Cvars[srv_ip]);
    if(get_pcvar_num(g_pCvars[rmvexp]))
        formatex(szQuery[iLen], charsmax(szQuery) - iLen, "DELETE FROM `%s_bans` WHERE ((`ban_created` + `ban_length` * 60) < UNIX_TIMESTAMP(NOW())) AND `ban_length` > '0'", g_szTablePrefix);
    else    formatex(szQuery[iLen], charsmax(szQuery) - iLen, "UPDATE `%s_bans` SET `expired` = '1' WHERE ((`ban_created` + `ban_length` * 60) < UNIX_TIMESTAMP(NOW())) AND `ban_length` > '0'", g_szTablePrefix);
    
    g_Data[0] = GetServer;
    SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
#else
    if(get_pcvar_num(g_pCvars[rmvexp]))
        formatex(szQuery, charsmax(szQuery), "DELETE FROM `%s_bans` WHERE ((`ban_created` + `ban_length` * 60) < UNIX_TIMESTAMP(NOW())) AND `ban_length` > '0'", g_szTablePrefix);
    else    formatex(szQuery, charsmax(szQuery), "UPDATE `%s_bans` SET `expired` = '1' WHERE ((`ban_created` + `ban_length` * 60) < UNIX_TIMESTAMP(NOW())) AND `ban_length` > '0'", g_szTablePrefix);

    g_Data[0] = Expired;
    SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
    
    formatex(szQuery, charsmax(szQuery), "SELECT `id` FROM `%s_serverinfo` WHERE `address` = '%s'", g_szTablePrefix, g_Cvars[srv_ip]);

    g_Data[0] = GetServer;
    SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
#endif
    LoadConfigs();
}

public plugin_end()
{
    SQL_FreeHandle(g_hSqlTuple);
    ArrayDestroy(g_aOffPlayers);
}

public client_putinserver(id)
{
    g_playerData[id][cookie] = false;
    g_playerData[id][pstate] = none;
    
    set_task(3.0, "CheckBan", id);
}   

#if AMXX_VERSION_NUM < 183
    #define client_disconnected client_disconnect
#endif
public client_disconnected(id)
{               
    get_user_name(id, g_arrOffPlayers[name], charsmax(g_arrOffPlayers[name]));
    get_user_ip(id, g_arrOffPlayers[ip], charsmax(g_arrOffPlayers[ip]), 1);
    get_user_authid(id, g_arrOffPlayers[authid], charsmax(g_arrOffPlayers[authid]));
    g_arrOffPlayers[immunity] = (get_user_flags(id) & ADMIN_IMMUNITY);

    for(new i, aSize = ArraySize(g_aOffPlayers), arrOff[OffData]; i < aSize; ++i)
    {
        ArrayGetArray(g_aOffPlayers, i, arrOff);

        if(strcmp(g_arrOffPlayers[authid], arrOff[authid]) == 0)
            return;
    }
    
    ArrayPushArray(g_aOffPlayers, g_arrOffPlayers);
}

public clcmdBanMenu(id, flags)
{
    if(!CmdAccess(id, flags))
        return PLUGIN_HANDLED;
    
    new str[190];
    formatex(str, charsmax(str), "%L", LANG_SERVER, "BANMENU_TITLE");
    new menu = menu_create(str, "BanMenuHandler");
    new pl[MAX_PLAYERS], pnum;
    get_players(pl, pnum, "c");
    
    if(get_user_flags(id) & g_Cvars[superadmin])
    {
        for(new i, pid[3], szName[MAX_NAME_LENGTH]; i < pnum; i++)
        {
            if(id == pl[i])
                continue;
            
            get_user_name(pl[i], szName, charsmax(szName));
            pid[0] = pl[i]; menu_additem(menu, szName, pid);
        }
    }
    else
    {
        for(new i, pid[3], szName[MAX_NAME_LENGTH]; i < pnum; i++)
        {
            if(get_user_flags(pl[i]) & ADMIN_IMMUNITY)
                continue;
        
            get_user_name(pl[i], szName, charsmax(szName));
            pid[0] = pl[i]; menu_additem(menu, szName, pid);
        }
    }

    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}

public clcmdOffBanMenu(id, flags)
{
    if(!CmdAccess(id, flags))
        return PLUGIN_HANDLED;
        
    new str[190];
    formatex(str, charsmax(str), "%L", LANG_SERVER, "OFFMENU_TITLE");
    new menu = menu_create(str, "OffMenuHandler");
    new szAuth[MAX_AUTHID_LENGTH]; get_user_authid(id, szAuth, charsmax(szAuth));
    
    if(get_user_flags(id) & g_Cvars[superadmin])
    {
        for(new i, pid[3], aSize = ArraySize(g_aOffPlayers); i < aSize; ++i)
        {
            ArrayGetArray(g_aOffPlayers, i, g_arrOffPlayers);
            
            if(strcmp(szAuth, g_arrOffPlayers[authid]) == 0)
                continue;
            
            pid[0] = i; menu_additem(menu, g_arrOffPlayers[name], pid);
        }
    }
    else
    {
        for(new i, pid[3], aSize = ArraySize(g_aOffPlayers); i < aSize; ++i)
        {
            ArrayGetArray(g_aOffPlayers, i, g_arrOffPlayers);
            
            if(g_arrOffPlayers[immunity])
                continue;
            if(strcmp(szAuth, g_arrOffPlayers[authid]) == 0)
                continue;

            pid[0] = i; menu_additem(menu, g_arrOffPlayers[name], pid);
        }
    }
    
    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}

public clcmdUnBanMenu(id, flags)
{
    if(!CmdAccess(id, flags))
        return PLUGIN_HANDLED;
    
    new flags[2];
    get_pcvar_string(g_pCvars[sadmin], flags, charsmax(flags));
    
    if(get_user_flags(id) & g_Cvars[superadmin])
        formatex(szQuery, charsmax(szQuery),
            "SELECT `bid`, `player_nick`, `admin_nick` FROM `%s_bans` WHERE `expired` = '0' ORDER BY `bid` DESC LIMIT 0, %d",
                g_szTablePrefix, get_pcvar_num(g_pCvars[unbanm])
        );
    else
    {
        new admin_authid[MAX_AUTHID_LENGTH];
        get_user_authid(id, admin_authid, charsmax(admin_authid));
        formatex(szQuery, charsmax(szQuery),
            "SELECT `bid`, `player_nick` FROM `%s_bans` WHERE `expired` = '0' AND `admin_id` = '%s' ORDER BY `bid` DESC LIMIT 0, %d",
                g_szTablePrefix,
                admin_authid,
                get_pcvar_num(g_pCvars[unbanm])
        );
    }
    
    g_Data[0] = UnbanMenu;
    g_Data[1] = id;
    SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));   
    return PLUGIN_HANDLED;
}

public BanMenuHandler(id, menu, item)
    return MenusHandler(id, menu, item, 1);

public TimeMenuHandler(id, menu, item)
    return MenusHandler(id, menu, item, 2);
    
public ReasonMenuHandler(id, menu, item)
    return MenusHandler(id, menu, item, 3);

public UnBanMenuHandler(id, menu, item)
    return MenusHandler(id, menu, item, 4);
    
public OffMenuHandler(id, menu, item)
    return MenusHandler(id, menu, item, 5);
    
public clcmdBanReason(id, flags)
{
    if(!CmdAccess(id, flags))
        return UTIL_console_print(id, "%L", id, "ACCESS_DENIED_CNSL");
    if(g_arrBanData[id][index])
    {
        read_argv(1, g_arrBanData[id][reason], charsmax(g_arrBanData[][reason]));
        
        if(g_arrBanData[id][index] > 32)
            OffBanAction(id, g_arrBanData[id][index] - 33);
        else     BanAction(id, g_arrBanData[id][index]);
    }
    return PLUGIN_HANDLED;
}

public concmdBan(id, flags)
{
    if(!CmdAccess(id, flags))
        return UTIL_console_print(id, "%L", id, "ACCESS_DENIED_CNSL");
    if(read_argc() < 4)
        return UTIL_console_print(id, "%L", id, "AMX_BAN_SYNTAX_CNSL");
    new szTime[10], szTarget[MAX_NAME_LENGTH];
    read_argv(1, szTime, charsmax(szTime));
    read_argv(2, szTarget, charsmax(szTarget));
    read_argv(3, g_arrBanData[id][reason], charsmax(g_arrBanData[][reason]));
    
    g_arrBanData[id][bantime] = str_to_num(szTime);
    g_arrBanData[id][index]   = cmd_target(id, szTarget);

    if(g_arrBanData[id][index])
    {
        switch(g_playerData[g_arrBanData[id][index]][pstate])
        {
            case checked:     BanAction(id, g_arrBanData[id][index]);
            case none:     g_playerData[g_arrBanData[id][index]][pstate] = ban;
        }
    }
    return PLUGIN_HANDLED;
}

public concmdUnBan(id, flags)
{
    if(!CmdAccess(id, flags))
        return UTIL_console_print(id, "%L", id, "ACCESS_DENIED_CNSL");
    if(read_argc() < 2)
        return UTIL_console_print(id, "%L", id, "AMX_UNBAN_SYNTAX_CNSL");
    
    new szTarget[MAX_NAME_LENGTH]; read_argv(1, szTarget, charsmax(szTarget));
    
    if(get_user_flags(id) & g_Cvars[superadmin])
    {
        if(get_pcvar_num(g_pCvars[rmvexp]))
            formatex(szQuery, charsmax(szQuery),
                "DELETE FROM `%s_bans` WHERE `player_id` = '%s' OR `player_nick` = '%s'",
            g_szTablePrefix, szTarget, szTarget);
        else
            formatex(szQuery, charsmax(szQuery),
                "UPDATE `%s_bans` SET `expired` = '1' WHERE `player_id` = '%s' OR `player_nick` = '%s'",
            g_szTablePrefix, szTarget, szTarget);
    }
    else
    {
        new admin_authid[MAX_AUTHID_LENGTH];
        get_user_authid(id, admin_authid, charsmax(admin_authid));
        
        if(get_pcvar_num(g_pCvars[rmvexp]))
            formatex(szQuery, charsmax(szQuery),
                "DELETE FROM `%s_bans` WHERE `admin_id` = '%s' AND (`player_id` = '%s' OR `player_nick` = '%s')",
            g_szTablePrefix, admin_authid, szTarget, szTarget);
        else
            formatex(szQuery, charsmax(szQuery),
                "UPDATE `%s_bans` SET `expired` = '1' WHERE `admin_id` = '%s' AND (`player_id` = '%s' OR `player_nick` = '%s')",
            g_szTablePrefix, admin_authid, szTarget, szTarget);
    }
    
    g_Data[0] = Unban;
    g_Data[1] = id;
    SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
    return PLUGIN_HANDLED;
}

public concmdFindBan(id, flags)
{
    if(!CmdAccess(id, flags))
        return UTIL_console_print(id, "%L", id, "ACCESS_DENIED_CNSL");
    if(read_argc() < 3)
        UTIL_console_print(id, "%L", id, "FIND_BAN_SYNTAX_CNSL");
    else
    {
        new szSearch[MAX_NAME_LENGTH], szPage[5];
        read_argv(1, szSearch, charsmax(szSearch));
        read_argv(2, szPage, charsmax(szPage));
        
        new iPage = str_to_num(szPage);
        new iLimit = (iPage > 1) ? iPage * 10 : 0;
        if(iLimit > 100) iLimit = 100;

        formatex(szQuery, charsmax(szQuery),
            "SELECT `player_nick`, `player_id`, `admin_nick`, `ban_reason`, `ban_created`, `ban_length` FROM `%s_bans` \
                WHERE `expired` = '0' AND (`player_id` REGEXP '^^.*%s*' OR `player_nick` REGEXP '^^.*%s*') LIMIT %d, 10",
        g_szTablePrefix, szSearch, szSearch, iLimit);

        g_Data[0] = Search;
        g_Data[1] = id;
        SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
    }
    return PLUGIN_HANDLED;
}       

public CheckCookies(msgId, msgDes, msgEnt)
{
    if(g_playerData[msgEnt][cookie])
        return PLUGIN_CONTINUE;
    else if(g_Cvars[cookie_link][0])
    {   
        static szBuffer[190], szAuth[MAX_AUTHID_LENGTH];
        get_user_authid(msgEnt, szAuth, charsmax(szAuth));
        formatex(szBuffer, charsmax(szBuffer), "%s?check=1&steam=%s", g_Cvars[cookie_link], szAuth);
        show_motd(msgEnt, szBuffer, "Counter-Strike 1.6 Server");
    }
    else     CheckBan(msgEnt);
    
    g_playerData[msgEnt][cookie] = true;
    return PLUGIN_HANDLED;
}

public CheckBan(id)
{
    if(!is_user_connected(id))
        return;
    else    remove_task(id);

    new szIP[16], szAuth[MAX_AUTHID_LENGTH];
    get_user_ip(id, szIP, charsmax(szIP), 1);
    get_user_authid(id, szAuth, charsmax(szAuth));

    if(g_Cvars[global_bans])
        formatex(szQuery, charsmax(szQuery),
            "SELECT `player_id`, `player_nick`, `admin_nick`, `ban_reason`, `ban_created`, `ban_length` FROM `%s_bans` \
                WHERE ((`ban_created` + `ban_length` * 60) > UNIX_TIMESTAMP(NOW()) OR `ban_length` = '0') \
                    AND ((`player_ip` = '%s' AND UNIX_TIMESTAMP(NOW()) - `ban_created` < '%d') OR `player_id` = '%s') AND `expired` = '0'",
        g_szTablePrefix, szIP, g_Cvars[ip_bantime], szAuth);
    else    formatex(szQuery, charsmax(szQuery),
            "SELECT `player_id`, `player_nick`, `admin_nick`, `ban_reason`, `ban_created`, `ban_length` FROM `%s_bans` \
                WHERE `server_ip` = '%s' AND ((`ban_created` + `ban_length` * 60) > UNIX_TIMESTAMP(NOW()) OR `ban_length` = '0') \
                    AND ((`player_ip` = '%s' AND UNIX_TIMESTAMP(NOW()) - `ban_created` < '%d') OR `player_id` = '%s') AND `expired` = '0'",
        g_szTablePrefix, g_Cvars[srv_ip], szIP, g_Cvars[ip_bantime], szAuth);

    g_Data[0] = Check;
    g_Data[1] = id;
    SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
}

public SQL_Handler(failstate, Handle:query, err[], errcode, dt[], datasize)
{
    switch(failstate)
    {
        case TQUERY_CONNECT_FAILED, TQUERY_QUERY_FAILED:
        {
            new szPrefix[32];
            switch(dt[0])
            {
                case Ban:     szPrefix = "Player Ban";
                case Unban:     szPrefix = "Player Unban";
                case Update:    szPrefix = "Player Update";
                case Check:     szPrefix = "Check Ban";
                case Search:    szPrefix = "Search Bans";
                case Expired:    szPrefix = "Expired Items";
                case GetServer:    szPrefix = "Get Server Info";
                case AddServer:    szPrefix = "Add Server Info";
            }
        
            log_amx("[SQL ERROR #%d][%s] %s", errcode, szPrefix, err);
            return;
        }
    }
    new id = dt[1];
    switch(dt[0])
    {
        case Unban: UTIL_console_print(id, "[Player Unban] Player %s", SQL_AffectedRows(query) ? "was unbanned" : "not found");
        case Check:
        {
            if(SQL_NumResults(query))
            {
                new szAuth[MAX_AUTHID_LENGTH], szName[MAX_NAME_LENGTH * 2], szAdmin[MAX_NAME_LENGTH * 2], szReason[64]; 
                
                SQL_ReadResult(query, 0, szAuth, charsmax(szAuth));
                SQL_ReadResult(query, 1, szName, charsmax(szName));
                SQL_ReadResult(query, 2, szAdmin, charsmax(szAdmin));
                SQL_ReadResult(query, 3, szReason, charsmax(szReason));
                new b_time = SQL_ReadResult(query, 4);
                new b_len = SQL_ReadResult(query, 5);
                
                UserKick(id, szAuth, szName, szAdmin, szReason, b_time, b_len);
                
                formatex(szQuery, charsmax(szQuery),
                    "UPDATE `%s_bans` SET `ban_kicks` = ban_kicks + 1 WHERE `server_ip` = '%s' AND `ban_created` = '%d' AND `ban_length` = '%d'",
                        g_szTablePrefix,
                        g_Cvars[srv_ip],
                        b_time,
                        b_len
                    );
                g_Data[0] = Update;
                SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
            }
            else if(g_playerData[id][pstate] == ban)
                BanAction(0, id);
            else    g_playerData[id][pstate] = checked;
        }
        case Search:
        {
            if(!SQL_NumResults(query))
                UTIL_console_print(id, "[Search Ban] %L", id, "BAN_NOT_FOUND");
            else
            {
                new szAuth[MAX_AUTHID_LENGTH], szName[MAX_NAME_LENGTH * 2], szAdmin[MAX_NAME_LENGTH * 2], szReason[64], szBanExp[64], iBanLen;
                
                while(SQL_MoreResults(query))
                {
                    SQL_ReadResult(query, 0, szName, charsmax(szName));
                    SQL_ReadResult(query, 1, szAuth, charsmax(szAuth));
                    SQL_ReadResult(query, 2, szAdmin, charsmax(szAdmin));
                    SQL_ReadResult(query, 3, szReason, charsmax(szReason));
                    iBanLen = SQL_ReadResult(query, 5);
                    
                    if(!iBanLen)
                        formatex(szBanExp, charsmax(szBanExp), "%L", id, "NOT_EXPIRED");
                    else
                    {
                        get_time_length(
                            id,
                            SQL_ReadResult(query, 4) + iBanLen * 60,
                            timeunit_seconds,
                            szBanExp,
                            charsmax(szBanExp)
                        );
                    }
                    UTIL_console_print(
                        id,
                        "Player %s<%s> - Admin %s - Reason %s - Ban expired %s",
                            szName,
                            szAuth,
                            szAdmin,
                            szReason,
                            szBanExp
                    );
                    
                    SQL_NextRow(query);
                }
            }
        }
        case GetServer:
        {
            if(!SQL_NumResults(query))
            {
                formatex(szQuery, charsmax(szQuery),
                    "INSERT INTO `%s_serverinfo` (`timestamp`, `hostname`, `address`, `gametype`, `amxban_version`) \
                        VALUES ('%d', '%s', '%s', 'cstrike', 'lite_bans')",
                g_szTablePrefix, get_systime(), g_Cvars[srv_name], g_Cvars[srv_ip]);   
                
                g_Data[0] = AddServer;
                SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
            }
        }
        case Ban:
        {
            g_arrKickData[id][bid] = SQL_GetInsertId(query);
            
            new Float:fDelay = get_pcvar_float(g_pCvars[delay]);
            set_task((fDelay < 1.0) ? 1.0 : fDelay, "Task__Motd", id);   
        }
        case UnbanMenu:
        {
            if(!SQL_NumResults(query))
                UTIL_console_print(id, "[Unban Menu] %L", id, "UNBANMENU_PLAYERS_NOT_FOUND");
            else
            {
                new str[190];
                formatex(str, charsmax(str), "%L", LANG_SERVER, "UNBANMENU_TITLE");
                new menu = menu_create(str, "UnBanMenuHandler");

                new idStr[5];
                new szName[MAX_NAME_LENGTH];
                new szAdmin[MAX_NAME_LENGTH];
                new szMenuItem[MAX_NAME_LENGTH * 2 + 10];
                
                if(get_user_flags(id) & g_Cvars[superadmin])
                {
                    while(SQL_MoreResults(query))
                    {
                        num_to_str(SQL_ReadResult(query, 0), idStr, charsmax(idStr));
                        SQL_ReadResult(query, 1, szName, charsmax(szName));
                        SQL_ReadResult(query, 2, szAdmin, charsmax(szAdmin));
                        
                        formatex(szMenuItem, charsmax(szMenuItem), "%s \d[\y%s\d]", szName, szAdmin);
                        menu_additem(menu, szMenuItem, idStr);
                        
                        SQL_NextRow(query);
                    }
                }
                else
                {
                    while(SQL_MoreResults(query))
                    {
                        num_to_str(SQL_ReadResult(query, 0), idStr, charsmax(idStr));
                        SQL_ReadResult(query, 1, szName, charsmax(szName));
                        
                        formatex(szMenuItem, charsmax(szMenuItem), szName);
                        menu_additem(menu, szMenuItem, idStr);
                        
                        SQL_NextRow(query);
                    }
                }
                
                menu_display(id, menu, 0);
            }
        }
        case OffbanMenu, Expired, Update, AddServer: {}
    }
}

MenusHandler(id, menu, item, mmenu)
{
    if(item != MENU_EXIT)
    {
        new _access, rsn[64], pid[10], CallBack;
        menu_item_getinfo(menu, item, _access, pid, charsmax(pid), rsn, charsmax(rsn), CallBack);
        
        switch(mmenu)
        {
            case 1:
            {
                g_arrBanData[id][index] = pid[0];
                menu_display(id, g_Cvars[static_reasons] ? g_iReasonMenu : g_iTimeMenu, 0);
            }
            case 2:
            {
                new pre = g_arrBanData[id][bantime];
                g_arrBanData[id][bantime] = str_to_num(pid);
                if(pre == -1 || !g_Cvars[static_reasons])
                    client_cmd(id, "messagemode banreason");
                else
                {
                    if(g_arrBanData[id][index] > 32)
                        OffBanAction(id, g_arrBanData[id][index] - 33);
                    else     BanAction(id, g_arrBanData[id][index]);
                }
            }
            case 3:
            {
                g_arrBanData[id][bantime] = str_to_num(pid);
                if(g_arrBanData[id][bantime] == -1)
                    menu_display(id, g_iTimeMenu, 0);
                else
                {
                    copy(g_arrBanData[id][reason], charsmax(g_arrBanData[][reason]), rsn);
                    
                    if(g_Cvars[static_time])
                    {
                        if(g_arrBanData[id][index] > 32)
                            OffBanAction(id, g_arrBanData[id][index] - 33);
                        else     BanAction(id, g_arrBanData[id][index]);
                    }
                    else     menu_display(id, g_iTimeMenu, 0);
                }
            }
            case 4:
            {
                formatex(szQuery, charsmax(szQuery), "DELETE FROM `%s_bans` WHERE `bid` = '%d'", g_szTablePrefix, str_to_num(pid));
                
                g_Data[0] = Unban;
                g_Data[1] = id;
                SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
            }
            case 5:
            {
                g_arrBanData[id][index] = pid[0] + 33;
                menu_display(id, g_Cvars[static_reasons] ? g_iReasonMenu : g_iTimeMenu, 0);
            }
        }
    }
    if(mmenu == 1)
        menu_destroy(menu);
    return PLUGIN_HANDLED;   
}

BanAction(admin, banned)
{
    if(!is_user_connected(banned))
        return UTIL_console_print(admin, "^n^n%L^n^n", admin, "USER_NOT_CONN_CNSL");       
    if(admin)
    {
        if(~get_user_flags(admin) & g_Cvars[superadmin])
        {
            if(get_user_flags(banned) & ADMIN_IMMUNITY)
                return UTIL_console_print(admin, "^n^n%L^n^n", admin, "USER_IMMUNITY_CNSL");
        }
    }
    
    new szIp[16], szAuth[MAX_AUTHID_LENGTH], szaIP[16], szaAuth[MAX_AUTHID_LENGTH];
    new szaName[64], szuName[64];
    get_user_ip(banned, szIp, charsmax(szIp), 1);
    
    get_user_authid(banned, szAuth, charsmax(szAuth));
    get_user_name(banned, szuName, charsmax(szuName));
    new iSysTime = get_systime();
    
    if(admin)
    {
        get_user_ip(admin, szaIP, charsmax(szaAuth), 1);
        get_user_authid(admin, szaAuth, charsmax(szaAuth));
        get_user_name(admin, szaName, charsmax(szaName));
    }
    else
    {
        formatex(szaIP, charsmax(szaIP), g_Cvars[srv_ip]);
        formatex(szaAuth, charsmax(szaAuth), "SERVER_ID");
        copy(szaName, charsmax(szaName), g_Cvars[srv_name]);
    }
    
    if(g_Cvars[hud_msg][0])
    {
        new szBanLen[64];
        if(!g_arrBanData[admin][bantime])
            formatex(szBanLen, charsmax(szBanLen), "%L", LANG_SERVER, "BAN_PERMANENT");
        else    get_time_length(banned, g_arrBanData[admin][bantime], timeunit_minutes, szBanLen, charsmax(szBanLen));
        
        static HudSyncObj;
        if(HudSyncObj || (HudSyncObj = CreateHudSyncObj()))
        {
            set_hudmessage(
                .red = g_Cvars[hud_msg_color][0],
                .green = g_Cvars[hud_msg_color][1],
                .blue = g_Cvars[hud_msg_color][2],
                .x = g_fHudPos[0],
                .y = g_fHudPos[1],
                .holdtime = 10.0,
                .channel = 4
            );
            ClearSyncHud(0, HudSyncObj);
            
            new szText[512]; copy(szText, charsmax(szText), g_Cvars[hud_msg]);
            replace_string(szText, charsmax(szText), "%n%", "^n");
            replace_string(szText, charsmax(szText), "%player%", szuName);
            replace_string(szText, charsmax(szText), "%admin%", szaName);
            replace_string(szText, charsmax(szText), "%banlen%", szBanLen);
            replace_string(szText, charsmax(szText), "%reason%", g_arrBanData[admin][reason]);
            ShowSyncHudMsg(0, HudSyncObj, szText);
        }
    }

    mysql_escape_string(szuName, charsmax(szuName));
    mysql_escape_string(g_arrBanData[admin][reason], charsmax(g_arrBanData[][reason]));
    mysql_escape_string(szaName, charsmax(szaName));
    
    if(g_Cvars[cookie_link][0])
    {

        new szTempMd5[64], md5Buff[34];
        formatex(szTempMd5, charsmax(szTempMd5), "%s %d", szAuth, iSysTime);
    #if AMXX_VERSION_NUM < 183   
        md5(szTempMd5, md5Buff);   
    #else
        hash_string(szTempMd5, Hash_Md5, md5Buff, charsmax(md5Buff));
    #endif   
        formatex(
            szQuery,
            charsmax(szQuery),
            "INSERT INTO `%s_bans` \
            ( \
                `player_ip`, \
                `player_id`, \
                `player_nick`, \
                `admin_ip`, \
                `admin_id`, \
                `admin_nick`, \
                `ban_reason`, \
                `ban_created`, \
                `ban_length`, \
                `server_ip`, \
                `server_name`, \
                `cookie`, \
                `expired` \
            ) \
            VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%s', '%s', '0')",
                g_szTablePrefix,
                szIp,
                szAuth,
                szuName,
                szaIP,
                szaAuth,
                szaName,
                g_arrBanData[admin][reason],
                iSysTime,
                g_arrBanData[admin][bantime],
                g_Cvars[srv_ip],
                g_Cvars[srv_name],
                md5Buff
        );
    }
    else
    {
        formatex(
            szQuery,
            charsmax(szQuery),
            "INSERT INTO `%s_bans` \
            ( \
                `player_ip`, \
                `player_id`, \
                `player_nick`, \
                `admin_ip`, \
                `admin_id`, \
                `admin_nick`, \
                `ban_reason`, \
                `ban_created`, \
                `ban_length`, \
                `server_ip`, \
                `server_name`, \
                `expired` \
            ) \
            VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%s', '0')",
                g_szTablePrefix,
                szIp,
                szAuth,
                szuName,
                szaIP,
                szaAuth,
                szaName,
                g_arrBanData[admin][reason],
                iSysTime,
                g_arrBanData[admin][bantime],
                g_Cvars[srv_ip],
                g_Cvars[srv_name]
        );
    }
    
    g_Data[0] = Ban;
    g_Data[1] = banned;
    SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
        
    copy(g_arrKickData[banned][auth], charsmax(g_arrKickData[][auth]), szAuth);
    copy(g_arrKickData[banned][u_name], charsmax(g_arrKickData[][u_name]), szuName);
    copy(g_arrKickData[banned][a_name], charsmax(g_arrKickData[][a_name]), szaName);
    copy(g_arrKickData[banned][ban_reason], charsmax(g_arrKickData[][ban_reason]), g_arrBanData[admin][reason]);
    g_arrKickData[banned][ban_time] = iSysTime;
    g_arrKickData[banned][ban_length] = g_arrBanData[admin][bantime];

    return PLUGIN_HANDLED;
}

OffBanAction(admin, player)
{
    new szaName[64], szaIP[16], szaAuth[MAX_AUTHID_LENGTH];
    get_user_ip(admin, szaIP, charsmax(szaAuth), 1);
    get_user_authid(admin, szaAuth, charsmax(szaAuth));
    get_user_name(admin, szaName, charsmax(szaName));
    
    mysql_escape_string(g_arrBanData[admin][reason], charsmax(g_arrBanData[][reason]));
    mysql_escape_string(szaName, charsmax(szaName));
    
    new iSysTime = get_systime();
    ArrayGetArray(g_aOffPlayers, player, g_arrOffPlayers);
    
    if(g_Cvars[cookie_link][0])
    {

        new szTempMd5[64], md5Buff[34];
        formatex(szTempMd5, charsmax(szTempMd5), "%s %d", g_arrOffPlayers[authid], iSysTime);
    #if AMXX_VERSION_NUM < 183   
        md5(szTempMd5, md5Buff);   
    #else
        hash_string(szTempMd5, Hash_Md5, md5Buff, charsmax(md5Buff));
    #endif   
        formatex(
            szQuery,
            charsmax(szQuery),
            "INSERT INTO `%s_bans` \
            ( \
                `player_ip`, \
                `player_id`, \
                `player_nick`, \
                `admin_ip`, \
                `admin_id`, \
                `admin_nick`, \
                `ban_reason`, \
                `ban_created`, \
                `ban_length`, \
                `server_ip`, \
                `server_name`, \
                `cookie`, \
                `expired` \
            ) \
            VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%s', '%s', '0')",
                g_szTablePrefix,
                g_arrOffPlayers[ip],
                g_arrOffPlayers[authid],
                g_arrOffPlayers[name],
                szaIP,
                szaAuth,
                szaName,
                g_arrBanData[admin][reason],
                iSysTime,
                g_arrBanData[admin][bantime],
                g_Cvars[srv_ip],
                g_Cvars[srv_name],
                md5Buff
        );
    }
    else
    {
        formatex(
            szQuery,
            charsmax(szQuery),
            "INSERT INTO `%s_bans` \
            ( \
                `player_ip`, \
                `player_id`, \
                `player_nick`, \
                `admin_ip`, \
                `admin_id`, \
                `admin_nick`, \
                `ban_reason`, \
                `ban_created`, \
                `ban_length`, \
                `server_ip`, \
                `server_name`, \
                `expired` \
            ) \
            VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%s', '0')",
                g_szTablePrefix,
                g_arrOffPlayers[ip],
                g_arrOffPlayers[authid],
                g_arrOffPlayers[name],
                szaIP,
                szaAuth,
                szaName,
                g_arrBanData[admin][reason],
                iSysTime,
                g_arrBanData[admin][bantime],
                g_Cvars[srv_ip],
                g_Cvars[srv_name]
        );
    }
    
    g_Data[0] = OffbanMenu;
    SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, g_Data, sizeof(g_Data));
    ArrayDeleteItem(g_aOffPlayers, player);
}

public Task__Kick(id)
{
    if(is_user_connected(id))
    {
        UserKick(
            id,
            g_arrKickData[id][auth],
            g_arrKickData[id][u_name],
            g_arrKickData[id][a_name],
            g_arrKickData[id][ban_reason],
            g_arrKickData[id][ban_time],
            g_arrKickData[id][ban_length]
        );
        
        arrayset(g_arrKickData[id], 0, KickData);
    }
}

public Task__Motd(id)
{
    if(is_user_connected(id))
    {
        if(g_Cvars[cookie_link][0])
        {
            new szBuffer[190];
            formatex(szBuffer, charsmax(szBuffer), "%s?ban=1&bid=%d", g_Cvars[cookie_link], g_arrKickData[id][bid]);
            show_motd(id, szBuffer, "You are banned!");
        }
        set_task(1.5, "Task__Kick", id);
    }
}

UserKick(id, b_auth[], b_user[], b_admin[], b_reason[], b_time, b_length)   
{   
    static szBanDate[24], szExpired[24], szBanLen[64];
    format_time(szBanDate, charsmax(szBanDate), "%d.%m.%Y - %H:%M:%S", b_time);
    
    switch(b_length)
    {
        case 0:
        {
            formatex(szExpired, charsmax(szExpired), "%L", id, "NOT_EXPIRED");
            formatex(szBanLen, charsmax(szBanLen), "%L", id, "BAN_LEN_PERM");
        }   
        default:
        {
            format_time(szExpired, charsmax(szExpired), "%d.%m.%Y - %H:%M:%S", b_time + b_length * 60);
            get_time_length(id, b_length, timeunit_minutes, szBanLen, charsmax(szBanLen));
        }   
    }

    UTIL_console_print(id, "^n");
    for(new i, szText[256]; i < g_iStrings; i++)
    {
        copy(szText, charsmax(szText), g_szConsole[i]);
        replace_string(szText, charsmax(szText), "%player%", b_user);
        replace_string(szText, charsmax(szText), "%admin%", b_admin);
        replace_string(szText, charsmax(szText), "%steamid%", b_auth);
        replace_string(szText, charsmax(szText), "%reason%", b_reason);
        replace_string(szText, charsmax(szText), "%bandate%", szBanDate);
        replace_string(szText, charsmax(szText), "%banlen%", szBanLen);
        replace_string(szText, charsmax(szText), "%banexpired%",szExpired);
        UTIL_console_print(id, szText);
    }
    UTIL_console_print(id, "^n");
    
    set_task(0.5, "KickPlayer", id);
}

public KickPlayer(id)
{
    if(is_user_connected(id))
        server_cmd("kick #%d %L", get_user_userid(id), id, "BAN_KICK_MSG");
}

CmdAccess(id, flags)
    return (get_user_flags(id) & flags);

LoadCvars()
{
    get_localinfo("amxx_configsdir", g_szConfigDir, charsmax(g_szConfigDir));
    add(g_szConfigDir, charsmax(g_szConfigDir), "/LB");
    
    new szConfig[64];
    formatex(szConfig, charsmax(szConfig), "%s/main.cfg", g_szConfigDir);
    server_cmd("exec %s", szConfig);
    server_exec();
    
    new flags[3];
    get_pcvar_string(g_pCvars[sadmin], flags, charsmax(flags));
    g_Cvars[superadmin] = read_flags(flags);
    
    get_pcvar_string(g_pCvars[srvname], g_Cvars[srv_name], charsmax(g_Cvars[srv_name])); mysql_escape_string(g_Cvars[srv_name], charsmax(g_Cvars[srv_name]));
    get_pcvar_string(g_pCvars[srvip], g_Cvars[srv_ip], charsmax(g_Cvars[srv_ip]));
    get_pcvar_string(g_pCvars[lnkck], g_Cvars[cookie_link], charsmax(g_Cvars[cookie_link]));
    g_Cvars[global_bans] = get_pcvar_num(g_pCvars[allbans]);
    g_Cvars[ip_bantime] = get_pcvar_num(g_pCvars[ipban]) * 60;
    g_Cvars[static_reasons] = get_pcvar_num(g_pCvars[reasons]);
    g_Cvars[static_time]= get_pcvar_num(g_pCvars[rsnbtm]);
    
    get_pcvar_string(g_pCvars[hud], g_Cvars[hud_msg], charsmax(g_Cvars[hud_msg]));
    if(g_Cvars[hud_msg][0])
    {
        new string[15];get_pcvar_string(g_pCvars[hudpos], string, charsmax(string));
        new str[3][5]; parse(string, str[0], charsmax(str[]), str[1], charsmax(str[]));
        g_fHudPos[0] = str_to_float(str[0]);
        g_fHudPos[1] = str_to_float(str[1]);
        
        get_pcvar_string(g_pCvars[hudclr], string, charsmax(string));
        parse(string, str[0], charsmax(str[]), str[1], charsmax(str[]), str[2], charsmax(str[]));
        g_Cvars[hud_msg_color][0] = str_to_num(str[0]);
        g_Cvars[hud_msg_color][1] = str_to_num(str[1]);
        g_Cvars[hud_msg_color][2] = str_to_num(str[2]);
    }

    new szHost[64], szUser[64], szPass[64], szDB[64];
    get_pcvar_string(g_pCvars[host], szHost, charsmax(szHost));
    get_pcvar_string(g_pCvars[user], szUser, charsmax(szUser));
    get_pcvar_string(g_pCvars[pass], szPass, charsmax(szPass));
    get_pcvar_string(g_pCvars[db],   szDB,   charsmax(szDB));
    get_pcvar_string(g_pCvars[pref], g_szTablePrefix, charsmax(g_szTablePrefix));
    
    SQL_SetAffinity("mysql");
    g_hSqlTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB, 1);
    
    new errcode,
        errstr[128],
        Handle:hTest = SQL_Connect(g_hSqlTuple, errcode, errstr, charsmax(errstr));
        
    if(hTest == Empty_Handle)
    {
        new szError[128];
        formatex(szError, charsmax(szError), "[SQL ERROR #%d] %s", errcode, errstr);
        set_fail_state(szError);
    }
    else
    {
        SQL_FreeHandle(hTest);
#if AMXX_VERSION_NUM >= 183
        SQL_SetCharset(g_hSqlTuple, "utf8");
#endif
        new ret; ExecuteForward(g_fwdHandle[SqlInit], ret, g_hSqlTuple);
    }
}

LoadConfigs()
{
    new szConfig[64], szBuffer[190], fp;
    if(g_Cvars[static_reasons])
    {
        formatex(szConfig, charsmax(szConfig), "%s/reasons.ini", g_szConfigDir);
        fp = fopen(szConfig, "rt");
        if(!fp)
        {
            new szError[96]; formatex(szError, charsmax(szError), "File '%s' not found or not read!", szConfig);
            set_fail_state(szError);
        }
        
        new array[2][64];
        if(g_Cvars[static_time])
        {
            while(!feof(fp))
            {
                fgets(fp, szBuffer, charsmax(szBuffer)); trim(szBuffer);
                if(!szBuffer[0] || szBuffer[0] == ';')
                    continue;
                if(parse(szBuffer, array[0], charsmax(array[]), array[1], charsmax(array[])) == 2)
                    menu_additem(g_iReasonMenu, array[0], array[1]);
            }
        }
        else
        {
            new i, z[3];
            while(!feof(fp))
            {
                fgets(fp, szBuffer, charsmax(szBuffer)); trim(szBuffer);
                if(!szBuffer[0] || szBuffer[0] == ';')
                    continue;
                
                z[0] = i; menu_additem(g_iReasonMenu, szBuffer, z);
                i++;
            }
        }
        fclose(fp);
        if(get_pcvar_num(g_pCvars[crsn]))
        {
            menu_addblank(g_iReasonMenu, 0);
            new str[64]; formatex(str, charsmax(str), "%L", LANG_SERVER, "CUSTOM_REASON");
            menu_additem(g_iReasonMenu, str, "-1");
        }   
    }
    
    formatex(szConfig, charsmax(szConfig), "%s/times.ini", g_szConfigDir);
    fp = fopen(szConfig, "rt");
    if(!fp)
    {
        new szError[96]; formatex(szError, charsmax(szError), "File '%s' not found or not read!", szConfig);
        set_fail_state(szError);
    }
    
    new array[3][64];
    while(!feof(fp))
    {
        fgets(fp, szBuffer, charsmax(szBuffer)); trim(szBuffer);
        if(!szBuffer[0] || szBuffer[0] == ';')
                continue;
        if(parse(szBuffer, array[0], charsmax(array[]), array[1], charsmax(array[])) == 2)
            menu_additem(g_iTimeMenu, array[0], array[1]);
    }
    fclose(fp);
    
    formatex(szConfig, charsmax(szConfig), "%s/console.ini", g_szConfigDir);
    fp = fopen(szConfig, "rt");
    if(!fp)
    {
        new szError[96]; formatex(szError, charsmax(szError), "File '%s' not found or not read!", szConfig);
        set_fail_state(szError);
    }

    while(!feof(fp) && g_iStrings < MAX_STRINGS)
    {
        fgets(fp, szBuffer, charsmax(szBuffer)); trim(szBuffer);
        if(szBuffer[0] && szBuffer[0] != ';')
            copy(g_szConsole[g_iStrings++], charsmax(g_szConsole[]), szBuffer);
    }
    fclose(fp);
}

stock cmd_target(id, const arg[])
{
    new player = find_player("bl", arg);
    if(player)
    {
        if(player != find_player("blj", arg))
        {
            UTIL_console_print(id, "%L", id, "MORE_CL_MATCHT");
            return PLUGIN_CONTINUE;
        }
    }
    else if((player = find_player("c", arg)) == 0 && arg[0] == '#' && arg[1])
    {
        player = find_player("k", str_to_num(arg[1]));
    }
    if(!player)
    {
        UTIL_console_print(id, "%L", id, "CL_NOT_FOUND");
        return PLUGIN_CONTINUE;
    }
    return player;
}

stock UTIL_console_print(const id, const szFmt[], any:...)
{
    static szMessage[256], iLen;
    vformat(szMessage, charsmax(szMessage), szFmt, 3);
    
    iLen = strlen(szMessage);
    szMessage[iLen++] = '^n';
    szMessage[iLen] = 0;   

    if(is_user_connected(id))
    {
        message_begin(MSG_ONE, SVC_PRINT, .player = id);
        write_string(szMessage);
        message_end();
    }
    else    server_print(szMessage);
    
    return PLUGIN_HANDLED;
}

stock mysql_escape_string(output[], len)
{
    static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" };
    static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" };
    for(new i; i < sizeof szReplaceIn; i++)
        replace_string(output, len, szReplaceIn[i], szReplaceOut[i]);
}
Всем привет.
Когда срабатывает античит при бане игрока в логах идут ошибки, хотя все работает игрока банит. Хотелось бы разобраться в чем проблема.
Не совсем уверен но кажется что это связанно с проверкой как то самого игрока перед баном.
Если банит Админ то ошибок никаких.

Вот пример синтаксиса в античите
Код:
"amx_ban 10080 [userid] '[RC] hack by eVOL'; rc_log loader.exe | md5hash '[file_md5hash]' - file '[file_name]' - '<[steamid]><[ip]>' - [name]"        BREAK
Прикреплю исходник так как код в спойлере сместился
 

Вложения

Последнее редактирование:

d3m37r4

Скриптер
Постоялец
Регистрация
8 Июн 2017
Сообщения
742
Симпатии
393
Пол
Мужской
Telegram
@dmitry_isakow
Ждем, когда неугомон пофиксит
 

angrybot

Администратор
Модератор
Разработчик
Постоялец
Пользователь
Дизайнер
Регистрация
15 Дек 2019
Сообщения
166
Симпатии
60
Перед 821 строкой добавьте новую, log_to_file("text.log", "szText is %s", szText);, после возникновения ошибки загрузите сюда этот файл.
 
Сверху Снизу