Ultimate Chats Control (не работает)

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
OS
Linux
Amx Mod X
ReAMXX 1.8.3
Билд
[code=cpp]3.4.0.668-dev[/code]
ReGamedll
[code=cpp] 5.7.0.314-dev[/code]
Metamod
[code=cpp] 1.21p37[/code]
Meta модули
Код:

	

		Спойлер: meta list
	
	
		
			
	
	



	



	











	
	
		
			
				C++:
			
		
		
		
			
			
			
			
			
		
	
	
	
		[ 1] AMX Mod X        RUN   -    amxmodx_mm_i386.  v1.9.0.5  ini   Start ANY  
 [ 2] Reunion          RUN   -    reunion_mm_i386.  v0.1.0.9  ini   Start Never
 [ 3] WHBlocker        RUN   -    whblocker_mm_i38  v1.5.696  ini   Chlvl ANY  
 [ 4] hackdetector     RUN   -    hackdetector_amx  v0.15.32  ini   ANY   ANY  
 [ 5] SoftBlocker      RUN   -    softblocker_mm_i  v1.1g     ini   ANY   Never
 [ 6] ReSemiclip       RUN   -    resemiclip_mm_i3  v2.3.9    ini   Chlvl ANY  
 [ 7] ReFreeLook       RUN   -    refreelook_amxx_  v1.3      ini   ANY   ANY  
 [ 8] VoiceTranscoder  RUN   -    VoiceTranscoder.  v2017RC3  ini   ANY   ANY  
 [ 9] MySQL            RUN   -    mysql_amxx_i386.  v1.9.0.5  pl1   ANY   ANY  
 [10] Fun              RUN   -    fun_amxx_i386.so  v1.9.0.5  pl1   ANY   ANY  
 [11] FakeMeta         RUN   -    fakemeta_amxx_i3  v1.9.0.5  pl1   ANY   ANY  
 [12] Ham Sandwich     RUN   -    hamsandwich_amxx  v1.9.0.5  pl1   ANY   ANY  
 [13] ReAPI            RUN   -    reapi_amxx_i386.  v5.9.0.1  pl1   ANY   Never
 [14] CStrike          RUN   -    cstrike_amxx_i38  v1.9.0.5  pl1   ANY   ANY  
 [15] CSX              RUN   -    csx_amxx_i386.so  v1.9.0.5  pl1   ANY   ANY  
 [16] Engine           RUN   -    engine_amxx_i386  v1.9.0.5  pl1   ANY   ANY
	
	
	
		
	

		
	
Плагины
Код:

	

		Спойлер: plugins
	
	
		
			
	
	



	



	











	
	
		
			
				C++:
			
		
		
		
			
			
			
			
			
		
	
	
	
		[ 1] AMXBans: Core           Gm 1.6      Larte Team        amxbans_core.am  running  
 [  2] FreshBan                1.0.5b      kanagava          fresh_bans.amxx  running  
 [  3] DopBan                  3.0.3b      kanagava          dop_ban.amxx     running  
 [  4] Ultimate Chats Control  5.2(c)      neygomon          ucc.amxx         running  
 [  5] Admin Commands          1.9.0.5247  AMXX Dev Team     admincmd.amxx    running  
 [  6] Slots Reservation       1.9.0.5247  AMXX Dev Team     adminslots.amxx  running  
 [  7] Menus Front-End         1.9.0.5247  AMXX Dev Team     menufront.amxx   running  
 [  8] Commands Menu           1.9.0.5247  AMXX Dev Team     cmdmenu.amxx     running  
 [ 9] Players Menu            1.9.0.5247  AMXX Dev Team     plmenu.amxx      running  
 [ 10] Maps Menu               1.9.0.5247  AMXX Dev Team     mapsmenu.amxx    running
 [ 11] Plugin Menu             1.9.0.5247  AMXX Dev Team     pluginmenu.amxx  running
 [ 12] Admin Chat              1.9.0.5247  AMXX Dev Team     adminchat.amxx   running
 [ 13] Anti Flood              1.9.0.5247  AMXX Dev Team     antiflood.amxx   running
 [ 14] Admin Votes             1.9.0.5247  AMXX Dev Team     adminvote.amxx   running
 [ 15] Pause Plugins           1.9.0.5247  AMXX Dev Team     pausecfg.amxx    running
 [ 16] Stats Configuration     1.9.0.5247  AMXX Dev Team     statscfg.amxx    running
 [ 17] gameME Plugin           2.4[v4.5.4  TTS Oetzel & Goe  gameme_cstrike.  running
 [ 18] PlrMdls                 1.0         rxki              plr_mdls.amxx    running
 [ 19] VIP:Easy                1.0         rxki              vip_easy.amxx    running
 [ 20] Reset Score             1.0         Silenttt          resetscore.amxx  running
 [ 21] AWP Control             1.4.3       PAffAEJIkA :3     awp_limit.amxx   running
	
	
	
		
	

		
	
Amxx Модули
Код:

	

		Спойлер: modules
	
	
		
			
	
	



	



	











	
	
		
			
				C++:
			
		
		
		
			
			
			
			
			
		
	
	
	
		MySQL                   1.9.0.5247  AMX Mod X Dev Team   running    
Fun                     1.9.0.5247  AMX Mod X Dev Team   running    
FakeMeta                1.9.0.5247  AMX Mod X Dev Team   running    
nVault                  1.9.0.5247  AMX Mod X Dev Team   running    
Ham Sandwich            1.9.0.5247  AMX Mod X Dev Team   running    
ReAPI                   5.9.0.167-  Asmodai & s1lent     running    
CStrike                 1.9.0.5247  AMX Mod X Dev Team   running    
CSX                     1.9.0.5247  AMX Mod X Dev Team   running    
Engine                  1.9.0.5247  AMX Mod X Dev Team   running    
Sockets                 1.9.0.5247  AMX Mod X Dev Team   running
	
	
	
		
	

		
	
Ошибка
Код:

	
	
		
			
				C++:
			
		
		
		
			
			
			
			
			
		
	
	
	
		[AMXX] Run time error 10 (plugin "ucc.amxx") (native "RegisterHookChain")
	
	
	
		
	
Исходник
Код:

	

		Спойлер: sma
	
	
		
			#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#include <reapi>

//#define CSX_EASY_STATS // use only with CSX Easy Stats plugin!!!

const MYSQL_TIMEOUT = 2;
const REASON_LENGTH = 64;
const GAG_MENU_ITEMS = 5;
const MUTE_MENU_ITEMS = 6;

enum natives_return {
    RETURN_ERR = 0,
    RETURN_OK
};

enum chats_by_stats {
    DISABLE = -1,
    CSX,
    CSSTATS_MYSQL,
    CSSTATSX_SQL,
    AES
#if defined CSX_EASY_STATS
    , CSXES_GAMETIME
#endif
};

enum block_types {
    NONE = -2,
    STATS,
    TEXT_CHAT,
    VOICE_CHAT,
    ALL_CHATS
};

enum _:menu_settings {
    SELECTED_TIME,
    SELECTED_REASON,
    SELECTED_TYPE,
    CURRENT_POS
};

enum _:block_data {
    EXPIRED,
    REASON[REASON_LENGTH],
    ADMIN_STEAMID[MAX_AUTHID_LENGTH],
    block_types:GAG_BLOCK_TYPE
};

enum _:cvars {
    MYSQL_HOST,
    MYSQL_USER,
    MYSQL_PASS,
    MYSQL_DBNAME,
    MYSQL_CLEAR_EXPIRED,
    
    SAY_SORRY,
    SAY_MUTE,
    chats_by_stats:CHATS_BY_STATS,
    BLOCK_INFO,
    block_typesEFAULT_BLOCK,
    MIN_ALLOW_VAL,
    GAG_ACCESS,
    SUPER_ACCESS,
    C_BY_S_IMMUNITY
};

new Trie:g_tAllowCmds;
new Array:g_arrGagTimes,
    Array:g_arrBlockTypes,
    Array:g_arrReasons

new Handle:g_hTuple,
        g_thData[3];

new g_PlayerData[MAX_PLAYERS + 1][block_data],
    g_PlayerMute[MAX_PLAYERS + 1][MAX_PLAYERS + 1],
        g_arrPlayers[MAX_PLAYERS + 1][MAX_PLAYERS],
            g_MenuData[MAX_PLAYERS + 1][menu_settings],
                g_iFragStats[MAX_PLAYERS + 1];
            
new g_szAesLevelName[64];

new g_Cvar[cvars];
new pCvar1,     // mysql host
    pCvar2, // mysql user
    pCvar3, // mysql pass
    pCvar4, // mysql db
    pCvar5, // mysql expired period
    pCvar6, // gag access
    pCvar7, // super access
    pCvar8; // immunity

#define is_blocked_text_chat(%0) (g_PlayerData[%0][GAG_BLOCK_TYPE] == STATS || g_PlayerData[%0][GAG_BLOCK_TYPE] == TEXT_CHAT || g_PlayerData[%0][GAG_BLOCK_TYPE] == ALL_CHATS)
#define is_blocked_voice_chat(%0) (g_PlayerData[%0][GAG_BLOCK_TYPE] == STATS || g_PlayerData[%0][GAG_BLOCK_TYPE] == VOICE_CHAT || g_PlayerData[%0][GAG_BLOCK_TYPE] == ALL_CHATS)

native get_user_stats(index, st[8], bh[8]);
native csstats_get_user_stats(index, st[22]);
native get_user_stats_sql(index, st[8], bh[8]);
native aes_get_player_level(index);
native aes_get_level_name(index, name[], len, lang);

public plugin_natives()
{
    register_library("Ultimate Chats Controller");
    register_native("ucc_is_client_gaged", "native_ucc_is_client_gaged");
    register_native("ucc_set_client_gag", "native_ucc_set_client_gag");    
    register_native("ucc_is_client_muted", "native_ucc_is_client_muted");
    register_native("ucc_set_client_muted", "native_ucc_set_client_muted");
    
    set_native_filter("native_filter");
}

public native_filter(const name[], index, trap)
    return trap ? PLUGIN_CONTINUE : PLUGIN_HANDLED;

public plugin_init()
{
#define PNAME "Ultimate Chats Controller"
#define VERSION "5.2(c)"
#define AUTHOR "neygomon"
    register_plugin(PNAME, VERSION, AUTHOR);
    register_dictionary("ucc.txt");
    create_cvar("ucc_version", VERSION, .flags = FCVAR_SERVER, .description = "Plugin version. Don't edit, please ");
    
    pCvar1 = create_cvar(
        "ucc_mysql_host", 
        "127.0.0.1", 
        .flags = FCVAR_PROTECTED,
        .description = fmt("%l", "DESC_MYSQL_HOST")
    );
    pCvar2 = create_cvar(
        "ucc_mysql_user", 
        "root", 
        .flags = FCVAR_PROTECTED,
        .description = fmt("%l", "DESC_MYSQL_USER") 
    );
    pCvar3 = create_cvar(
        "ucc_mysql_pass", 
        "", 
        .flags = FCVAR_PROTECTED,
        .description = fmt("%l", "DESC_MYSQL_PASS")
    );
    pCvar4 = create_cvar(
        "ucc_mysql_dbname", 
        "dbname", 
        .flags = FCVAR_PROTECTED,
        .description = fmt("%l", "DESC_MYSQL_DBNAME") 
    );
    pCvar5 = create_cvar(
        "ucc_mysql_clear_expired", 
        "30",
        .description = fmt("%l", "DESC_MYSQL_CLEAR_EXPIRED"),
        .has_min = true,
        .min_val = 0.0
    );
    
    pCvar6 = create_cvar(
        "ucc_gag_access", 
        "d", 
        .description = fmt("%l", "DESC_GAG_ACCESS")
    );
    pCvar7 = create_cvar(
        "ucc_superadmin_access", 
        "l", 
        .description = fmt("%l", "DESC_SUPER_ACCESS") 
    );
    pCvar8 = create_cvar(
        "ucc_chats_by_stats_immunity", 
        "u", 
        .description = fmt("%l", "DESC_C_BY_S_IMMUNITY") 
    );

    bind_pcvar_num(
        create_cvar(
            "ucc_say_sorry", 
            "15", 
            .description = fmt("%l", "DESC_SAY_SORRY"),
            .has_min = true, 
            .min_val = 0.0
        ), 
        g_Cvar[SAY_SORRY]
    );
    bind_pcvar_num(
        create_cvar(
            "ucc_say_mute", 
            "1", 
            .description = fmt("%l", "DESC_SAY_MUTE"),
            .has_min = true, 
            .has_max = true,
            .min_val = 0.0,
            .max_val = 1.0
        ), 
        g_Cvar[SAY_MUTE]
    );
    bind_pcvar_num(
        create_cvar(
            "ucc_chats_by_stats", 
            "0", 
            .description = fmt("%l", "DESC_CHATS_BY_STATS"),
            .has_min = true, 
            .has_max = true,
            .min_val = -1.0,
            .max_val = 4.0
        ), 
        g_Cvar[CHATS_BY_STATS]
    );
    bind_pcvar_num(
        create_cvar(
            "ucc_block_info", 
            "1", 
            .description = fmt("%l", "DESC_BLOCK_INFO"),
            .has_min = true, 
            .has_max = true,
            .min_val = 0.0,
            .max_val = 1.0
        ), 
        g_Cvar[BLOCK_INFO]
    );
    bind_pcvar_num(
        create_cvar(
            "ucc_default_block", 
            "1", 
            .description = fmt("%l", "DESC_DEFAULT_BLOCK"),
            .has_min = true,
            .has_max = true,
            .min_val = 0.0,
            .max_val = 2.0
        ), 
        g_Cvar[DEFAULT_BLOCK]
    );
    bind_pcvar_num(
        create_cvar(
            "ucc_min_allow_value", 
            "1", 
            .description = fmt("%l", "DESC_MIN_ALLOW_VAL"),
            .has_min = true, 
            .min_val = 0.0
        ), 
        g_Cvar[MIN_ALLOW_VAL]
    );
    
    AutoExecConfig(.autoCreate = true, .name = "ucc");

    if(SQL__Connect())
    {
        Get_Flags();
        Get_ArrayCvars();
        Reg_Commands();

        if(g_Cvar[CHATS_BY_STATS] == AES && g_Cvar[BLOCK_INFO])
            set_task_ex(1.0, "get_allow_level");

        register_menucmd(register_menuid("UCC GagMenu"), 1023, "GagMenuHandler");
        register_menucmd(register_menuid("UCC MuteMenu"), 1023, "MuteMenuHandler");
        set_task_ex(60.0, "CheckBlockedUsers", .flags = SetTask_Repeat);
    }
}

public plugin_end()
{
    SQL_FreeHandle(g_hTuple);
    TrieDestroy(g_tAllowCmds);
    ArrayDestroy(g_arrGagTimes);
    ArrayDestroy(g_arrBlockTypes);
    ArrayDestroy(g_arrReasons);
}

public client_putinserver(id)
{
    if(is_user_bot(id) || is_user_hltv(id))
        return;

    arrayset(g_PlayerMute[id], 0, sizeof g_PlayerMute[]);
    g_PlayerData[id][EXPIRED] = -1;
    g_PlayerData[id][REASON][0] = EOS;
    g_PlayerData[id][ADMIN_STEAMID][0] = EOS;
    g_PlayerData[id][GAG_BLOCK_TYPE]  = NONE;

    if(g_Cvar[CHATS_BY_STATS] > DISABLE)
    {
        if(!get_chats_access(id))
            set_user_block(id, STATS);
    }

    new szIP[MAX_IP_LENGTH], szAuth[MAX_AUTHID_LENGTH];
    get_user_ip(id, szIP, charsmax(szIP), true);
    get_user_authid(id, szAuth, charsmax(szAuth));
    
    g_thData[0] = id;
    SQL_ThreadQuery(
        g_hTuple, 
        "SQL_ThreadHandler_LoadPlayer", 
        fmt("SELECT `expired_time`, `reason`, `admin_steamid`, `block_type` FROM `ucc_gag` WHERE (`ip` = '%s' OR `steamid` = '%s') AND (`expired_time` = '0' OR `expired_time` > '%d')", szIP, szAuth, get_systime()), 
        g_thData, 
        sizeof(g_thData)
    );
}
/* HookChain Handlers */
public CBasePlayer_Spawn_Post(const id)
{
    if(!is_user_connected(id))    
        return;
    if(g_PlayerData[id][GAG_BLOCK_TYPE] != STATS)
        return;
    if(get_chats_access(id))
    {
        VTC_UnmuteClient(id);
        g_PlayerData[id][GAG_BLOCK_TYPE] = NONE;
    }
    else if(g_Cvar[BLOCK_INFO])
    {
        custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS0");
        
        switch(g_Cvar[CHATS_BY_STATS])
        {
            case AES: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS2", g_szAesLevelName);
        #if defined CSX_EASY_STATS
            case CSXES_GAMETIME:
                custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS4", g_Cvar[MIN_ALLOW_VAL]);
        #endif
            default: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS3", g_iFragStats[id], g_Cvar[MIN_ALLOW_VAL]);
        }
    }
}

public CanPlayerHearPlayer_Pre(const iReciever, const iSender)
{
    if(iSender != iReciever)
    {
        if(g_PlayerMute[iReciever][iSender])
        {
            SetHookChainReturn(ATYPE_INTEGER, false);
            return HC_SUPERCEDE;
        }
    }
    return HC_CONTINUE;
}
/* srvcmd_Flush */
public srvcmd_Flush()
{
    SQL_ThreadQuery(g_hTuple, "SQL_ThreadHandler_Truncate", "TRUNCATE `ucc_gag`");

    for(new id; id < sizeof g_PlayerData; ++id)
    {
        if(g_PlayerData[id][EXPIRED] >= 0 && is_user_connected(id))
            VTC_UnmuteClient(id);
    
        g_PlayerData[id][EXPIRED] = -1;
        g_PlayerData[id][REASON][0] = EOS;
        g_PlayerData[id][ADMIN_STEAMID][0]= EOS;
        g_PlayerData[id][GAG_BLOCK_TYPE] = NONE;
    }
    
    log_amx("%s [v: %s][a: %s] flushed all gags", PNAME, VERSION, AUTHOR);
}
/* clcmd_SaySorry */
public clcmd_SaySorry(id)
{
    if(is_blocked_text_chat(id))
    {
        static iFloodTime[MAX_PLAYERS + 1], systime;
        if(iFloodTime[id] > (systime = get_systime()))
            custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_SORRY_FLOOD", iFloodTime[id] - systime);
        else
        {
            new szName[MAX_NAME_LENGTH]; 
            get_user_name(id, szName, charsmax(szName));
            
            new players[MAX_PLAYERS], pnum;
            get_players_ex(players, pnum, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV);
            
            for(new i, admin, flags, auth[MAX_AUTHID_LENGTH]; i < pnum; ++i)
            {
                admin = players;
                flags = get_user_flags(admin);
                
                if(flags & g_Cvar[SUPER_ACCESS])
                    custom_color_chat(admin, 0, "%l %l", "MSG_PREFIX", "MSG_SORRY_ADMIN", szName, g_PlayerData[id][REASON]);
                else if(flags & g_Cvar[GAG_ACCESS])
                {
                    if(strcmp(g_PlayerData[id][ADMIN_STEAMID], auth) == 0)
                        custom_color_chat(admin, 0, "%l %l", "MSG_PREFIX", "MSG_SORRY_ADMIN", szName, g_PlayerData[id][REASON]);
                }
            }

            iFloodTime[id] = systime + g_Cvar[SAY_SORRY];
        }
    }
    
    return PLUGIN_HANDLED;
}
/* clcmd_SayChat */
public clcmd_SayChat(id)
{
    if(!is_blocked_text_chat(id))
        return PLUGIN_CONTINUE;
        
    new szMessage[64]; 
    read_args(szMessage, charsmax(szMessage));
    remove_quotes(szMessage);

    if(TrieKeyExists(g_tAllowCmds, szMessage))
        return PLUGIN_CONTINUE;
    else if(g_PlayerData[id][GAG_BLOCK_TYPE] == STATS)
    {
        if(g_Cvar[BLOCK_INFO])
        {
            custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS0");
            
            switch(g_Cvar[CHATS_BY_STATS])
            {
                case AES: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS2", g_szAesLevelName);
            #if defined CSX_EASY_STATS
                case CSXES_GAMETIME:
                    custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS4", g_Cvar[MIN_ALLOW_VAL]);
            #endif
                default: custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_CHATS3", g_iFragStats[id], g_Cvar[MIN_ALLOW_VAL]);
            }
        }
    }    
    else
    {
        new szName[MAX_NAME_LENGTH], ost; 
        get_user_name(id, szName, charsmax(szName));
        custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_CHAT_IS_BLOCKED", szName, g_PlayerData[id][REASON]);
            
        if(g_PlayerData[id][EXPIRED] > 0)
        {
            if((ost = g_PlayerData[id][EXPIRED] - get_systime()) / 60 > 0)
                custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_EXPIRED_TIME", ost / 60);
            else     custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_BLOCK_EXPIRED");
        }
        else    custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_SAY_SORRY");
    }        
    
    return PLUGIN_HANDLED;
}
/* clcmd_GagMenu */
public clcmd_GagMenu(id)
{
    if(get_user_flags(id) & g_Cvar[GAG_ACCESS])
    {
        g_MenuData[id][SELECTED_TIME] = 0;
        g_MenuData[id][SELECTED_TYPE] = any:g_Cvar[DEFAULT_BLOCK];
        g_MenuData[id][CURRENT_POS] = 0;
        
        Show_GagMenu(id, 0);
    }    
    
    return PLUGIN_HANDLED;
}
/* clcmd_MuteMenu */
public clcmd_MuteMenu(id)
{
    g_MenuData[id][CURRENT_POS] = 0;

    Show_MuteMenu(id, 0);
    return PLUGIN_HANDLED;
}
/* MySQL handlers */
public SQL_ThreadHandler_Init(failstate, Handle:query, err[], errcode)
{
    if(failstate != TQUERY_SUCCESS)
        log_amx("MySQL INIT is FAILED... [#%d] %s", errcode, err);
        
    return PLUGIN_CONTINUE;
}

public SQL_ThreadHandler_LoadPlayer(failstate, Handle:query, err[], errcode, data[], datasize)
{
    if(failstate  == TQUERY_SUCCESS)
    {
        if(SQL_NumResults(query))
        {
            new id = data[0];
                
            g_PlayerData[id][EXPIRED] = SQL_ReadResult(query, 0);
            g_PlayerData[id][GAG_BLOCK_TYPE] = any:SQL_ReadResult(query, 3);
            SQL_ReadResult(query, 1, g_PlayerData[id][REASON], charsmax(g_PlayerData[][REASON]));
            SQL_ReadResult(query, 2, g_PlayerData[id][ADMIN_STEAMID], charsmax(g_PlayerData[][ADMIN_STEAMID]));
            
            set_user_block(id, g_PlayerData[id][GAG_BLOCK_TYPE]);
        }
    }
    else     log_amx("MySQL LoadPlayer is FAILED... [#%d] %s", errcode, err);
    
    return PLUGIN_CONTINUE;
}

public SQL_ThreadHandler_BlockPlayer(failstate, Handle:query, err[], errcode)
{
    if(failstate != TQUERY_SUCCESS)
        log_amx("MySQL BLOCK is FAILED... [#%d] %s", errcode, err);
        
    return PLUGIN_CONTINUE;
}


public SQL_ThreadHandler_UnblockPlayer(failstate, Handle:query, err[], errcode)
{
    if(failstate != TQUERY_SUCCESS)
        log_amx("MySQL UNBLOCK is FAILED... [#%d] %s", errcode, err);
        
    return PLUGIN_CONTINUE;
}

public SQL_ThreadHandler_Truncate(failstate, Handle:query, err[], errcode)
{
    if(failstate != TQUERY_SUCCESS)
        log_amx("MySQL FLUSH is FAILED... [#%d] %s", errcode, err);
        
    return PLUGIN_CONTINUE;
}
/* Tasks handlers */
public get_allow_level()
    aes_get_level_name(g_Cvar[MIN_ALLOW_VAL], g_szAesLevelName, charsmax(g_szAesLevelName), LANG_SERVER);
    
public CheckBlockedUsers()
{
    new players[MAX_PLAYERS], pnum;
    get_players_ex(players, pnum);
    
    for(new i, id, sys = get_systime(); i < pnum; ++i)
    {
        id = players;
    
        if(g_PlayerData[id][EXPIRED] > 0)
        {
            if(sys > g_PlayerData[id][EXPIRED])
                user_unblock(id);
        }
    }
}
/* Menu Handlers */
public GagMenuHandler(id, iKey)
{
    switch(iKey)
    {
        case 5:
        {
            if(++g_MenuData[id][SELECTED_TIME] > ArraySize(g_arrGagTimes)-1) 
                g_MenuData[id][SELECTED_TIME] = 0;
                        
            Show_GagMenu(id, g_MenuData[id][CURRENT_POS]);
        }
        case 6:
        {
            if(++g_MenuData[id][SELECTED_TYPE] > ArraySize(g_arrBlockTypes)-1)
                g_MenuData[id][SELECTED_TYPE] = 0;
                    
            Show_GagMenu(id, g_MenuData[id][CURRENT_POS]);
        }
        case 7:
        {
            if(++g_MenuData[id][SELECTED_REASON] > ArraySize(g_arrReasons)-1) 
                g_MenuData[id][SELECTED_REASON] = 0;
                    
            Show_GagMenu(id, g_MenuData[id][CURRENT_POS]);
        }
        case 8: Show_GagMenu(id, ++g_MenuData[id][CURRENT_POS]);
        case 9: 
        {
            if(g_MenuData[id][CURRENT_POS]) 
                Show_GagMenu(id, --g_MenuData[id][CURRENT_POS]);
        }
        default:
        {
            new player = g_arrPlayers[id][g_MenuData[id][CURRENT_POS] * GAG_MENU_ITEMS + iKey];
            
            if(!is_user_connected(player))
            {
                Show_GagMenu(id, g_MenuData[id][CURRENT_POS]);
                return PLUGIN_HANDLED;
            }

            new szAdminName[MAX_NAME_LENGTH], szPlayerName[MAX_NAME_LENGTH];
            get_user_name(id, szAdminName, charsmax(szAdminName));
            get_user_name(player, szPlayerName, charsmax(szPlayerName));
        
            if(g_PlayerData[player][GAG_BLOCK_TYPE] > STATS)
            {
                user_unblock(player);
        
                custom_color_chat(0, player, "%l %l", "MSG_PREFIX", "MSG_CHAT_UNBLOCK_ALL", szPlayerName, szAdminName);
                custom_color_chat(player, 0, "%l %l", "MSG_PREFIX", "MSG_CHAT_UNBLOCK_PL", szPlayerName, szAdminName);
            }
            else
            {
                new blocktime = ArrayGetCell(g_arrGagTimes, g_MenuData[id][SELECTED_TIME]),
                    block_types:block_type = any:g_MenuData[id][SELECTED_TYPE],
                    blockreason[REASON_LENGTH];
                
                ArrayGetString(g_arrReasons, g_MenuData[id][SELECTED_REASON], blockreason, charsmax(blockreason));
            
                user_block(player, id, blocktime, blockreason, block_type);
        
                new blocktimeinfo[32];
                
                if(!blocktime)
                    formatex(blocktimeinfo, charsmax(blocktimeinfo), "навсегда");
                else    formatex(blocktimeinfo, charsmax(blocktimeinfo), "Р Р…Р В° %d Р СРёРЅСѓС‚", blocktime);
                
                switch(block_type)
                {
                    case TEXT_CHAT:
                    {
                        custom_color_chat(0, player, "%l %l", "MSG_PREFIX", "MSG_TEXTCHAT_BLOCK_ALL", szAdminName, szPlayerName, blocktimeinfo, blockreason);
                        custom_color_chat(player, 0, "%l %l", "MSG_PREFIX", "MSG_TEXTCHAT_BLOCK_PL", szPlayerName, szAdminName, blocktimeinfo, blockreason);
                    }
                    case VOICE_CHAT:
                    {
                        custom_color_chat(0, player, "%l %l", "MSG_PREFIX", "MSG_VOICECHAT_BLOCK_ALL", szAdminName, szPlayerName, blocktimeinfo, blockreason);
                        custom_color_chat(player, 0, "%l %l", "MSG_PREFIX", "MSG_VOICECHAT_BLOCK_PL", szPlayerName, szAdminName, blocktimeinfo, blockreason);
                    }
                    case ALL_CHATS:
                    {
                        custom_color_chat(0, player, "%l %l", "MSG_PREFIX", "MSG_ALLCHATS_BLOCK_ALL", szAdminName, szPlayerName, blocktimeinfo, blockreason);
                        custom_color_chat(player, 0, "%l %l", "MSG_PREFIX", "MSG_ALLCHATS_BLOCK_PL", szPlayerName, szAdminName, blocktimeinfo, blockreason);
                    }
                }
            }
            Show_GagMenu(id, g_MenuData[id][CURRENT_POS]);
        }
    }
    return PLUGIN_HANDLED;
}

public MuteMenuHandler(id, iKey)
{
    switch(iKey)
    {
        case 6:
        {
            arrayset(g_PlayerMute[id], 1, sizeof g_PlayerMute[]);
            custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_MUTE_ALL_PLAYERS");
        }
        case 7:
        {
            arrayset(g_PlayerMute[id], 0, sizeof g_PlayerMute[]);
            custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", "MSG_UNMUTE_ALL_PLAYERS");
        }
        case 8: Show_MuteMenu(id, ++g_MenuData[id][CURRENT_POS]);
        case 9: 
        {
            if(g_MenuData[id][CURRENT_POS]) 
                Show_MuteMenu(id, --g_MenuData[id][CURRENT_POS]);
        }
        default: 
        {
            new player = g_arrPlayers[id][g_MenuData[id][CURRENT_POS] * MUTE_MENU_ITEMS + iKey];
            
            if(!is_user_connected(player))
            {
                Show_MuteMenu(id, g_MenuData[id][CURRENT_POS]);
                return PLUGIN_HANDLED;
            }
            
            new szName[MAX_NAME_LENGTH];
            get_user_name(player, szName, charsmax(szName));
        
            g_PlayerMute[id][player] = !g_PlayerMute[id][player];
            custom_color_chat(id, 0, "%l %l", "MSG_PREFIX", g_PlayerMute[id][player] ? "MSG_MUTE_PLAYER" : "MSG_UNMUTE_PLAYER", szName);
            
            Show_MuteMenu(id, g_MenuData[id][CURRENT_POS]);
        }
    }
    
    return PLUGIN_HANDLED;
}
/* Plugin API */
public native_ucc_is_client_gaged(plugin, params)
{
    enum { index = 1, exp_time, gag_reason, gag_type };

    new id = get_param(index);
    
    if(is_user_connected(id))
    {
        set_param_byref(exp_time, g_PlayerData[id][EXPIRED]);
        set_string(gag_reason, g_PlayerData[id][REASON], charsmax(g_PlayerData[][REASON]));
        
        if(params > 3)
            set_param_byref(gag_type, any:g_PlayerData[id][GAG_BLOCK_TYPE]);
        
        return (g_PlayerData[id][GAG_BLOCK_TYPE] > NONE);
    }
    
    log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", id);
    return RETURN_ERR;
}

public native_ucc_set_client_gag(plugin, params)
{
    enum { index = 1, admin_id, block_time, gag_reason, gag_type };
    
    new id    = get_param(index);
    new admin = get_param(admin_id);
    new type = (params > 4) ? get_param(gag_type) : any:ALL_CHATS;
    
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", id);
        return RETURN_ERR;
    }
    if(!is_user_connected(admin))
        admin = 0;
    
    new szReason[REASON_LENGTH];
    get_string(gag_reason, szReason, charsmax(szReason));
    
    user_block(id, admin, get_param(block_time), szReason, any:type);
    return RETURN_OK;
}    
public native_ucc_is_client_muted(plugin, params)
{
    enum { index = 1, player };
        
    new id = get_param(index);
    new victim = get_param(player);
        
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", id);
        return RETURN_ERR;
    }
    if(!is_user_connected(victim))
    {
        log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", victim);
        return RETURN_ERR;
    }
        
    return g_PlayerMute[id][victim];
}
    
public native_ucc_set_client_muted(plugin, params)
{
    enum { index = 1, player, muted };
        
    new id = get_param(index);
    new victim = get_param(player);
    new set_mute = get_param(muted);
        
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", id);
        return RETURN_ERR;
    }
    if(!is_user_connected(victim))
    {
        log_error(AMX_ERR_NATIVE, "Client %d not connected or index out of range!", victim);
        return RETURN_ERR;
    }
        
    g_PlayerMute[id][victim] = (set_mute > 0) ? 1 : 0;
    return RETURN_OK;
}
/* hook__cvar_change callbacks */
public hook__cvar_change_ga(pCvar, szOldValue[], szNewValue[])
    read__flags(szNewValue, cvars:GAG_ACCESS);
public hook__cvar_change_sa(pCvar, szOldValue[], szNewValue[])
    read__flags(szNewValue, cvars:SUPER_ACCESS);
public hook__cvar_change_cbs_imm(pCvar, szOldValue[], szNewValue[])
    read__flags(szNewValue, cvars:C_BY_S_IMMUNITY);
/* Private functions */
Get_Flags()
{
    hook_cvar_change(pCvar6, "hook__cvar_change_ga");
    hook_cvar_change(pCvar7, "hook__cvar_change_sa");
    hook_cvar_change(pCvar8, "hook__cvar_change_cbs_imm");
    
    new szFlags[32]; 
    get_pcvar_string(pCvar6, szFlags, charsmax(szFlags));
    read__flags(szFlags, cvars:GAG_ACCESS);
    get_pcvar_string(pCvar7, szFlags, charsmax(szFlags));
    read__flags(szFlags, cvars:SUPER_ACCESS);
    get_pcvar_string(pCvar8, szFlags, charsmax(szFlags));
    read__flags(szFlags, cvars:C_BY_S_IMMUNITY);
}

Get_ArrayCvars()
{
    g_tAllowCmds = TrieCreate();
    g_arrGagTimes = ArrayCreate();
    g_arrBlockTypes = ArrayCreate(REASON_LENGTH); // РІРґСЂСѓРі кто-то РїРѕРґ спайсоРС...
    g_arrReasons = ArrayCreate(REASON_LENGTH);

    enum { times = 0, block_names, reasons, allowed_commands };
    get_lang_settings(times);
    get_lang_settings(block_names);
    get_lang_settings(reasons);
    get_lang_settings(allowed_commands);
}

SQL__Connect()
{
    /*
        fucking amxx...
        @ force load config configs/plugins/ucc.cfg 
        @ plugin stopped, if config not found
    */
    new szPath[64];
    get_localinfo("amxx_configsdir", szPath, charsmax(szPath));
    add(szPath, charsmax(szPath), "/plugins/ucc.cfg");
    if(file_exists(szPath))
    {
        server_cmd("exec %s", szPath);
        server_exec();
    }
    else
    {
        log_amx("%l", "INSTALL_INFO");
        pause("d");
        return false;
    }
    
    new szHost[64], szUser[64], szPass[64], szDB[32];
    get_pcvar_string(pCvar1, szHost, charsmax(szHost));
    get_pcvar_string(pCvar2, szUser, charsmax(szUser));
    get_pcvar_string(pCvar3, szPass, charsmax(szPass));
    get_pcvar_string(pCvar4, szDB, charsmax(szDB));
    
    SQL_SetAffinity("mysql");
    g_hTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB, MYSQL_TIMEOUT);
    
    new errcode, errstr[128], Handle:hTest = SQL_Connect(g_hTuple, errcode, errstr, charsmax(errstr));
    if(hTest == Empty_Handle)
        set_fail_state("[SQL ERROR #%d] %s", errcode, errstr);
    else
    {
        SQL_FreeHandle(hTest);
        SQL_SetCharset(g_hTuple, "utf8");

        new iClearPeriod = get_systime() - 86400 * get_pcvar_num(pCvar5);
        
        new szQuery[1024];
        formatex(szQuery, charsmax(szQuery), 
            "CREATE TABLE IF NOT EXISTS `ucc_gag` ( \
                 `id` smallint(6) NOT NULL AUTO_INCREMENT, \
                 `name` varchar(32) NOT NULL, \
                 `steamid` varchar(32) NOT NULL, \
                 `ip` varchar(16) NOT NULL, \
                 `admin_name` varchar(32) NOT NULL, \
                 `admin_steamid` varchar(32) NOT NULL, \
                 `admin_ip` varchar(32) NOT NULL, \
                 `create_time` int(11) NOT NULL, \
                 `expired_time` int(11) NOT NULL, \
                `reason` varchar(%d) NOT NULL, \
                 `block_type` int(11) NOT NULL, \
                 PRIMARY KEY (`id`), \
                  UNIQUE KEY `steamid` (`steamid`) \
                )ENGINE=InnoDB DEFAULT CHARSET=utf8; \
                DELETE FROM `ucc_gag` WHERE (`expired_time` < '%d' AND `expired_time` > '0') OR (`expired_time` = '-1' AND `create_time` < '%d');", 
                    REASON_LENGTH, iClearPeriod, iClearPeriod
        );
        
        SQL_ThreadQuery(g_hTuple, "SQL_ThreadHandler_Init", szQuery);
        return true;
    }
    
    return false;
}

Reg_Commands()
{
    if(has_vtc())
    {
        register_clcmd("amx_gagmenu", "clcmd_GagMenu");
    
        if(g_Cvar[CHATS_BY_STATS] > DISABLE)
            RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Post", true);
    }
    else    log_amx("For amx_gagmenu needed meta plugin VTC");
    
    if(g_Cvar[SAY_MUTE])
    {
        register_clcmd("say /mute", "clcmd_MuteMenu");
        register_clcmd("say_team /mute", "clcmd_MuteMenu");
    
        RegisterHookChain(RG_CSGameRules_CanPlayerHearPlayer, "CanPlayerHearPlayer_Pre", false);
    }
    
    if(g_Cvar[SAY_SORRY])
    {
        register_clcmd("say /sorry", "clcmd_SaySorry");
        register_clcmd("say_team /sorry", "clcmd_SaySorry");
    }
    
    register_clcmd("say", "clcmd_SayChat");
    register_clcmd("say_team", "clcmd_SayChat");
    
    register_srvcmd("uРЎРѓc_flush", "srvcmd_Flush");
}
/* Main Menu for gags/mute */
Show_GagMenu(id, iPos)
{
    new szAuth[MAX_AUTHID_LENGTH];
    new start, end, pnum;
    new iLen, szMenu[512];
    new iKeys = MENU_KEY_0|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8;
    
    get_players_ex(g_arrPlayers[id], pnum, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV);
    get_user_authid(id, szAuth, charsmax(szAuth));

    start = iPos * GAG_MENU_ITEMS; 
    end   = start + GAG_MENU_ITEMS;
    
    iLen = formatex(szMenu, charsmax(szMenu), "%l\w\R%d/%d^n^n", "MENU_GAG_HEADER", iPos + 1, (pnum / GAG_MENU_ITEMS + ((pnum % GAG_MENU_ITEMS) ? 1 : 0)));
    
    if(start >= pnum)
        start = iPos = g_MenuData[id][CURRENT_POS] = 0;
    if(end > pnum)
        end = pnum;
    
    for(new i = start, bool:bSuper = boolget_user_flags(id) & g_Cvar[SUPER_ACCESS]), szName[MAX_NAME_LENGTH], player, a; i < end; ++i)
    {
        player = g_arrPlayers[id];
        get_user_name(player, szName, charsmax(szName));
        
        if(id == player)
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s %l^n", ++a, szName, "MENU_GAG_ITEM_YOU");    
        else if(!bSuper && get_user_flags(player) & ADMIN_IMMUNITY)
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s %l^n", ++a, szName, "MENU_GAG_ITEM_IMMUNITY");
        else if(g_PlayerData[player][GAG_BLOCK_TYPE] > NONE)
        {
            if(g_PlayerData[player][GAG_BLOCK_TYPE] == STATS)
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s %l^n", ++a, szName, "MENU_GAG_ITEM_LOWSTATS");
            else if(bSuper || strcmp(g_PlayerData[player][ADMIN_STEAMID], szAuth) == 0)
            {
                iKeys |= (1 << a++);
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s %l^n", a, szName, "MENU_GAG_ITEM_UNGAG");
            }
        }
        else 
        {
            iKeys |= (1 << a++);
            
            if(VTC_IsClientSpeaking(player))
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s %l^n", a, szName, "MENU_GAG_ITEM_SPEAKING");
            else    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", a, szName);
        }    
    }
    
    static selected_string[REASON_LENGTH], 
        selected_time;
    
    selected_time = ArrayGetCell(g_arrGagTimes, g_MenuData[id][SELECTED_TIME]);
    
    if(!selected_time) 
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r6. %l^n", "MENU_GAG_PERMANENT");
    else     iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r6. %l^n", "MENU_GAG_MINUTES", selected_time);

    ArrayGetString(g_arrBlockTypes, g_MenuData[id][SELECTED_TYPE], selected_string, charsmax(selected_string));
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r7. %l^n", "MENU_GAG_BLOCK_TYPE", selected_string);
    ArrayGetString(g_arrReasons, g_MenuData[id][SELECTED_REASON], selected_string, charsmax(selected_string));
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r8. %l^n^n", "MENU_GAG_REASON", selected_string);

    if(end != pnum)
    {
        formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r9. %l^n\r0. %l", "MENU_ITEM_NEXT", iPos ? "MENU_ITEM_BACK" : "MENU_ITEM_EXIT");
        iKeys |= MENU_KEY_9;
    }
    else     formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0. %l", iPos ? "MENU_ITEM_BACK" : "MENU_ITEM_EXIT");

    show_menu(id, iKeys, szMenu, -1, "UCC GagMenu");
    return PLUGIN_HANDLED;
}

Show_MuteMenu(id, iPos)
{
    new start, end, pnum;
    new iLen, szMenu[512];
    new iKeys = MENU_KEY_0|MENU_KEY_7|MENU_KEY_8;
    
    get_players_ex(g_arrPlayers[id], pnum, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV);
    
    start = iPos * MUTE_MENU_ITEMS; 
    end   = start + MUTE_MENU_ITEMS;
    
    iLen = formatex(szMenu, charsmax(szMenu), "%l\w\R%d/%d^n^n", "MENU_MUTE_HEADER", iPos + 1, (pnum / MUTE_MENU_ITEMS + ((pnum % MUTE_MENU_ITEMS) ? 1 : 0)));
    
    if(start >= pnum)
        start = iPos = g_MenuData[id][CURRENT_POS] = 0;
    if(end > pnum)
        end = pnum;
    
    for(new i = start, szName[MAX_NAME_LENGTH], player, a; i < end; ++i)
    {    
        player = g_arrPlayers[id];
        get_user_name(player, szName, charsmax(szName));

        if(id == player)
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \d%s %l^n", ++a, szName, "MENU_MUTE_ITEM_YOU");
        else
        {
            iKeys |= (1 << a++);
            
            if(g_PlayerMute[id][player])
                iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s %l^n", a, szName, "MENU_MUTE_ITEM_MUTED");
            else    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", a, szName);
        }
    }

    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r7. %l^n\r8. %l^n^n", "MENU_MUTE_ALL_GAG", "MENU_MUTE_ALL_UNGAG");
    
    if(end != pnum)
    {
        formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r9. %l^n\r0. %l", "MENU_ITEM_NEXT", iPos ? "MENU_ITEM_BACK" : "MENU_ITEM_EXIT");
        iKeys |= MENU_KEY_9;
    }
    else     formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0. %l", iPos ? "MENU_ITEM_BACK" : "MENU_ITEM_EXIT");

    show_menu(id, iKeys, szMenu, -1, "UCC MuteMenu");
    return PLUGIN_HANDLED;
}

user_block(id, admin, blocktime, blockreason[REASON_LENGTH], block_types:block_type)
{
    set_user_block(id, block_type);

    new szName[MAX_NAME_LENGTH * 2], szIP[MAX_IP_LENGTH], szAuth[MAX_AUTHID_LENGTH];
    get_user_name(id, szName, charsmax(szName));
    get_user_ip(id, szIP, charsmax(szIP), true);
    get_user_authid(id, szAuth, charsmax(szAuth));

    new szAdminName[MAX_NAME_LENGTH * 2], szAdminIP[MAX_IP_LENGTH], szAdminAuth[MAX_AUTHID_LENGTH];
    get_user_name(admin, szAdminName, charsmax(szAdminName));
    get_user_ip(admin, szAdminIP, charsmax(szAdminIP), true);
    get_user_authid(admin, szAdminAuth, charsmax(szAdminAuth));

    new iSystime = get_systime();
    
    g_PlayerData[id][EXPIRED] = !blocktime ? 0 : iSystime + blocktime * 60;
    g_PlayerData[id][REASON] = blockreason;
    g_PlayerData[id][ADMIN_STEAMID] = szAdminAuth;
    
    mysql_escape_string(szName, charsmax(szName));
    mysql_escape_string(szAdminName, charsmax(szAdminName));
    mysql_escape_string(g_PlayerData[id][REASON], charsmax(g_PlayerData[][REASON]));
    
    new szQuery[1024];
    formatex(szQuery, charsmax(szQuery), 
        "INSERT INTO `ucc_gag` (`name`, `steamid`, `ip`, `admin_name`, `admin_steamid`, `admin_ip`, `create_time`, `expired_time`, `reason`, `block_type`) \
            VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%d') \
        ON DUPLICATE KEY UPDATE `name` = '%s', `ip` = '%s', `admin_name` = '%s', `admin_steamid` = '%s', `admin_ip` = '%s', `create_time` = '%d', `expired_time` = '%d', `reason` = '%s', `block_type` = '%d'",
            szName, szAuth, szIP, szAdminName, szAdminAuth, szAdminIP, iSystime, g_PlayerData[id][EXPIRED], g_PlayerData[id][REASON], any:block_type, 
            szName, szIP, szAdminName, szAdminAuth, szAdminIP, iSystime, g_PlayerData[id][EXPIRED], g_PlayerData[id][REASON], any:block_type
    );
    
    SQL_ThreadQuery(g_hTuple, "SQL_ThreadHandler_BlockPlayer", szQuery);
}

user_unblock(id)
{
    if(is_blocked_voice_chat(id))
        VTC_UnmuteClient(id);
    
    g_PlayerData[id][EXPIRED] = -1;
    g_PlayerData[id][REASON][0] = EOS;
    g_PlayerData[id][ADMIN_STEAMID][0] = EOS;
    g_PlayerData[id][GAG_BLOCK_TYPE] = NONE;
    
    new szIP[MAX_IP_LENGTH], szAuth[MAX_AUTHID_LENGTH];
    get_user_ip(id, szIP, charsmax(szIP), true);
    get_user_authid(id, szAuth, charsmax(szAuth));
    
    SQL_ThreadQuery(
        g_hTuple, 
        "SQL_ThreadHandler_UnblockPlayer", 
        fmt("UPDATE `ucc_gag` SET `expired_time` = '-1' WHERE `ip` = '%s' OR `steamid` = '%s'", szIP, szAuth)
    );
}

set_user_block(id, block_types:block_type)
{
    g_PlayerData[id][GAG_BLOCK_TYPE] = block_type;

    switch(block_type)
    {
        case STATS, VOICE_CHAT, ALL_CHATS:
        {
            VTC_MuteClient(id);
            client_cmd(id, "-voicerecord");
        }
    }
}

bool:get_chats_access(id)
{
    if(get_user_flags(id) & g_Cvar[C_BY_S_IMMUNITY])
        return true;
    
    new value;
    
    switch(g_Cvar[CHATS_BY_STATS])
    {
        case DISABLE: return true;
        case CSX:
        {
        #if defined CSX_EASY_STATS
            new st[8], bh[12];
        #else
            new st[8], bh[HIT_RIGHTLEG + 1];
        #endif
            if(!get_user_stats(id, st, bh))
                return false;
                
            value = st[0];
        }
        case CSSTATS_MYSQL:
        {
            new st[22];
            if(csstats_get_user_stats(id, st) <= 0)
                return false;
                
            value = st[0];
        }
        case CSSTATSX_SQL:
        {
            new st[8], bh[HIT_RIGHTLEG + 1];
            if(!get_user_stats_sql(id, st, bh))
                return false;
                
            value = st[0];
        }
        case AES:
        {
            new st[1];
            if((st[0] = aes_get_player_level(id)) == -1)
                return false;
                
            value = st[0];
        }
    #if defined CSX_EASY_STATS
        case CSXES_GAMETIME:
        {
            new st[8], bh[12];
            if(!get_user_stats(id, st, bh))
                return false;
                
            value = bh[10] * 60;
        }
    #endif
    }
    
    g_iFragStats[id] = value;
    return (value < g_Cvar[MIN_ALLOW_VAL]) ? false : true;
}
/* Stocks */
stock read__flags(str[], cvars:cvar)
    g_Cvar[cvar] = read_flags(str);

stock custom_color_chat(id, id2, const szMessage[], any:...)
{
    new szMsg[190]; 
    vformat(szMsg, charsmax(szMsg), szMessage, 4);
    
    if(id) client_print_color(id, print_team_default, szMsg);
    else
    {
        new players[MAX_PLAYERS], pnum;
        get_players_ex(players, pnum, GetPlayers_ExcludeBots);
        for(new i; i < pnum; ++i)
        {
            if(players != id2)
            {
                client_print_color(players, print_team_default, szMsg);
            }
        }
    }
}

stock get_lang_settings(cvar_type)
{
    enum { times = 0, block_names, reasons, allowed_commands };
    
    new Key, 
        dummy,
        szLangKey[32],
        szLangValue[256];

    switch(cvar_type)
    {
        case times:
        {
            do {
                formatex(szLangKey, charsmax(szLangKey), "CFG_GAG_TIMES_%d", Key++);
                
                dummy = LookupLangKey(szLangValue, charsmax(szLangValue), szLangKey, dummy);
                if(dummy) ArrayPushCell(g_arrGagTimes, str_to_num(szLangValue));
            }
            while(dummy)
        }
        case block_names:
        {
            for(new i; i < any:ALL_CHATS+1; ++i)
            {
                formatex(szLangKey, charsmax(szLangKey), "CFG_BLOCK_NAMES_%d", i);
                if(LookupLangKey(szLangValue, charsmax(szLangValue), szLangKey, dummy)) 
                    ArrayPushString(g_arrBlockTypes, szLangValue);
            }
        }
        case reasons:
        {
            do {
                formatex(szLangKey, charsmax(szLangKey), "CFG_REASONS_%d", Key++);
                
                dummy = LookupLangKey(szLangValue, charsmax(szLangValue), szLangKey, dummy);
                if(dummy) ArrayPushString(g_arrReasons, szLangValue);
            }
            while(dummy)
        }
        case allowed_commands:
        {
            do {
                formatex(szLangKey, charsmax(szLangKey), "CFG_ALLOW_COMMANDS_%d", Key++);
                
                dummy = LookupLangKey(szLangValue, charsmax(szLangValue), szLangKey, dummy);
                if(dummy) TrieSetCell(g_tAllowCmds, szLangValue, 1);
            }
            while(dummy)
        }
    }
}

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, szReplaceOut);
}
		
	
Доброго всем времени суток. Установил Ultimate Chats Control от неугомона (последняя версия). Вроде бы сделал все по инструкции. Меню мута и гага открываются, но после ничего не происходит. Жму на ники - меню просто пропадает. Прошу помощи у светлых и благородных умов разобраться, где я накосячил :)

upd: забыл вытянуть еще одну строку из логов. Полная ошибка выглядит так:
L 06/22/2019 - 14:02:29: [ReAPI] RegisterHookChain: function (CSGameRules_CanPlayerHearPlayer) is not available, ReGameDLL required.
L 06/22/2019 - 14:02:29: [AMXX] Run time error 10 (plugin "ucc.amxx") (native "RegisterHookChain") - debug not enabled!
regamedll качал из этого сайта. cs.co кинул в dlls, конфиг в cstrike. Почему сервер его не видит - не знаю...
аналогично с reapi. Стоят последние версии.

upd: наткнулся на решение, может кому пригодится.
1. удалить строчку gamedll dlls/cs.so из конфига addons/metamod/config.ini

2. в папке cstrike/dlls/ из файлов касающиеся к gamedll оставить только cs.so
Проконсультируйте только в одном. У меня в папке dlls помимо cs.so лежали файлы: cs_amd64.so, cs_before.so, director_i386.so. Подскажите, что из этих файлов нужно, а что нет. Я удалил все эти файлы, ребутнул сервер и плагин заработал. Но, может я что то лишнее снес, подскажите)
 
Последнее редактирование:

Izmayl7

Пользователь
Регистрация
9 Июн 2017
Сообщения
527
Симпатии
103
Пол
Мужской
Доброго всем времени суток. Установил Ultimate Chats Control от неугомона (последняя версия). Вроде бы сделал все по инструкции. Меню мута и гага открываются, но после ничего не происходит. Жму на ники - меню просто пропадает. Прошу помощи у светлых и благородных умов разобраться, где я накосячил :)

upd: забыл вытянуть еще одну строку из логов. Полная ошибка выглядит так:


regamedll качал из этого сайта. cs.co кинул в dlls, конфиг в cstrike. Почему сервер его не видит - не знаю...
аналогично с reapi. Стоят последние версии.

upd: наткнулся на решение, может кому пригодится.


Проконсультируйте только в одном. У меня в папке dlls помимо cs.so лежали файлы: cs_amd64.so, cs_before.so, director_i386.so. Подскажите, что из этих файлов нужно, а что нет. Я удалил все эти файлы, ребутнул сервер и плагин заработал. Но, может я что то лишнее снес, подскажите)
cs.so, если сервер на linux
C-like:
Извлечь нужные бинарные файлы из папки bugfixed (рекомендуется использовать эту версию) или pure
Заменить оригинальный файл в папке /cstrike/dlls своего сервера (cs.so для Linux систем или mp.dll для Windows)
Конфигурационный файл game.cfg положить в корень сервера или в папку мода cstrike.
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Izmayl7, извиняюсь, а где лежит папка bugfixed? не могу найти никак. а во всем остальном я так и сделал.
Только при муте в чате на сервере некоторые вещи пишет квакозябрами. Кодировка lang файла и конфига utf-8

и еще такой вопрос назрел. Возможна ли интеграция мутлиста на gamecms? знаю, что есть gagmanager, который умеет импортировать список на сайт. Можно ли сделать тоже самое с ucc?
 

Izmayl7

Пользователь
Регистрация
9 Июн 2017
Сообщения
527
Симпатии
103
Пол
Мужской
Izmayl7, извиняюсь, а где лежит папка bugfixed? не могу найти никак. а во всем остальном я так и сделал.
Только при муте в чате на сервере некоторые вещи пишет квакозябрами. Кодировка lang файла и конфига utf-8

и еще такой вопрос назрел. Возможна ли интеграция мутлиста на gamecms? знаю, что есть gagmanager, который умеет импортировать список на сайт. Можно ли сделать тоже самое с ucc?
тебе не нужна эта папка, ты когда архив скачиваешь и открываешь всё видно, что тебе нужно и какие файлы:
1561215754779.png
кодировка lang файла и конфига utf-8 без bom должна быть.
по поводу интеграция мутлиста на gamecms не знаю, но думаю что возможно. а почему gagmanager не использовать?! там почти такой же функционал как и в ucc.
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Izmayl7, я спрашивал на счет вот этого дела)
1561288274097.png
а все остальное я сделал, как нужно вроде бы.
georgeml, дедукция на месте, шо тут скажешь)
 
Сверху Снизу