Проблема с Gag-системой

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
19
Реакции
1
Ошибка
-
ОС
Windows
Amx Mod X
AMX Mod X 1.9.0.5263 (http://www.amxmodx.org)
Authors:
David "BAILOPAN" Anderson, Pavol "PM OnoTo" Marko
Felix "SniperBeamer" Geyer, Jonny "Got His Gun" Bergstrom
Lukasz "SidLuke" Wlasinski, Christian "Basic-Master" Hammacher
Borja "faluco" Ferrer, Scott "DS" Ehlert
Compiled: Oct 27 2019 16:23:31
Built from: https://github.com/alliedmodders/amxmodx/commit/15a14a0
Build ID: 5263:15a14a0
Core mode: JIT+ASM32
Билд
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
Exe build: 13:12:29 Aug 29 2013 (6153)
ReGamedll
-
Версия Metamod
Metamod v1.21p38  2018/02/11 (5:13)
by Will Day
http://www.metamod.org/
Patch: Metamod-P (mm-p) v38
by Jussi Kivilinna
http://metamod-p.sourceforge.net/
compiled: Feb 11 2018, 11:05:06 EET (optimized)
Список метамодулей
[ 1] VoiceTranscoder  RUN   -    vtc.so            v2017RC5  ini   ANY  
[ 2] LocalizeBug Fix RUN - localizebugfix.s v2.4 ini Start Never
[ 3] dproto_EF RUN - dproto.so v0.9.582 ini Start Never
[ 4] AMX Mod X RUN - amxmodx.so v1.9.0.5 ini Start ANY
[ 5] Semiclip RUN - semiclip.so v2.2 ini ANY
[ 6] CStrike RUN - cstrike_amxx_i38 v1.9.0.5 pl4 ANY
[ 7] FakeMeta RUN - fakemeta_amxx_i3 v1.9.0.5 pl4 ANY
[ 8] Engine RUN - engine_amxx_i386 v1.9.0.5 pl4 ANY
[ 9] Ham Sandwich RUN - hamsandwich_amxx v1.9.0.5 pl4 ANY
[10] MySQL RUN - mysql_amxx_i386. v1.9.0.5 pl4 ANY ANY
[11] Fun RUN - fun_amxx_i386.so v1.9.0.5 pl4 ANY ANY
11 plugins, 11 running
Список плагинов
[ 1] Plugins Core            1.3.0       Radius            plugins_core.am  running  
[ 2] Gag Me 2.4.0 Radius gag_me.amxx running
[ 3] CSStatsX SQL 0.7.4+2 serfreeman1337 aes_csstatsx_sq running
[ 4] Admin Loader 3.5 neygomon admin_loader.am running
[ 5] FreshBans 1.4.6b kanagava fresh_bans.amxx running
[ 6] Admin Chat 1.9.0.5263 AMXX Dev Team adminchat.amxx running
[ 7] Admin Commands 1.9.0.5263 AMXX Dev Team admincmd.amxx running
[ 8] Commands Menu 1.9.0.5263 AMXX Dev Team cmdmenu.amxx running
[ 9] Menus Front-End 1.5 neugomon menufront_end.a running
[ 10] Maps Menu 1.9.0.5263 AMXX Dev Team mapsmenu.amxx running
[ 11] Plugin Menu 1.9.0.5263 AMXX Dev Team pluginmenu.amxx running
[ 12] Admin Votes 1.9.0.5263 AMXX Dev Team adminvote.amxx running
[ 13] CS Misc. Stats 1.9.0.5263 AMXX Dev Team miscstats.amxx running
[ 14] CS Stats Logging 1.9.0.5263 AMXX Dev Team stats_logging.a running
[ 15] Stats Configuration 1.9.0.5263 AMXX Dev Team statscfg.amxx running
[ 16] [182] High Ping Kicker 20.06.06 SKAJIbnEJIb hpk_rbs.amxx running
[ 17] Parachute New 1.0 Csserv.Ru parachute_new.a running
[ 18] Advanced MapChooser 1.4 neygomon advanced_mapcho running
[ 19] FM ResetScore 0.1 neygomon fm_rs.amxx running
[ 20] Green Fade 0.1 Stimul green_fade.amxx running
[ 21] Damager 2.0 Prayer damager.amxx running
[ 22] Lite Translit 2.8 neygomon lite_translit_a running
[ 23] Players Menu 1.7 neugomon players_menu.am running
[ 24] Lighting Menu 0.1.1 Nordic Warrior lighting_menu.a running
[ 25] Lite Admin ESP 1.0 neygomon lite_admin_esp. running
[ 26] Menu System 0.1.2 serfreeman1337 menuSystem.amxx running
[ 27] Auto recording demo 2.0 IzI | Bonaqua (R amx_autodemorec running
[ 28] Change Team 1.1 neygomon change_team.amx running
[ 29] Ban Sound: Fresh Bans 1.0 Leo_[BH] ban_sound_fresh running
[ 30] Ad From Server 1.0 BadMandarin ad_from_server. running
[ 31] UAIO (Admin Menu) 1.50 xeroblood/$uicid uaio_admin.amxx running
[ 32] Killa HP 1.0 jas0n killa_hp.amxx running
[ 33] AMXX VIP Gold 1.0 Flymic24 amxx_vip_gold_n stopped
[ 34] Plugins Controller 1.0 neygomon plugins_control stopped
[ 35] Free ammo 1.4 asstolavista free_ammo.amxx running
[ 36] secret_menu 1.0 Seroff secret_menu.amx running
[ 37] UAIO Manager 2.1 $uicid3 uaio_manager.am running
[ 38] Advanced Experience Sy 0.5 Vega serfreeman1337 aes_main.amxx running
[ 39] AES: StatsX 0.5+1 serfreeman1337 aes_statsx.amxx running
[ 40] AES: CStrike Addon 0.5 Vega serfreeman1337 aes_exp_cstrike running
[ 41] AES: Informer 0.5 Vega serfreeman1337 aes_informer.am running
[ 42] AES: Admin Tools 0.5 Vega serfreeman1337 aes_exp_editor. running
42 plugins, 40 running
Автор плагина
Radius
Версия плагина
2.4.0
Исходный код
Нету в данном плагине.
Приветствую! У меня возникла такая проблема, что игроки дальше могут разговаривать после выдачи мута. Использую плагин от Радиуса "Gag Me". Буду очень благодарен, если кто-то знает в чём дело.
 
Сообщения
208
Реакции
39
Помог
4 раз(а)
Логи ? Ошибки ? Конфиг где ? Когда возникла такая проблема ?
Давно его использовал не помню , могу ошибаться есть ли gag.vault ?
gm_data_storage_time ?
Давно не видел HLDS :good2:
 
Последнее редактирование:
Сообщения
619
Реакции
130
Предупреждения
5
Помог
10 раз(а)
Мута или гага? Если мута, то мут слетает после смены карты.
Я на версии 2.3.4 сижу до сих пор, все исправно работает, хотя сейчас плагины от Радиуса бесплатные.
 
Сообщения
208
Реакции
39
Помог
4 раз(а)
wood-grouse, Так обнови версию , и там посмотрим
 
Сообщения
19
Реакции
1
Loki, с проблемой столкнулся сразу же. В логах плагина никаких ошибок нету, только мои действия с игры. gm_data_storage_time ввести в консоль и скинуть тебе результат? Да, gag.vault присутствует. Вот настройки cfg файла:
9 Авг 2022
wood-grouse, именно Gag. Насчёт мута я вкурсе что он слетает после смены карты и так должно быть.
 

Вложения

Сообщения
208
Реакции
39
Помог
4 раз(а)
Loki, с проблемой столкнулся сразу же. В логах плагина никаких ошибок нету, только мои действия с игры. gm_data_storage_time ввести в консоль и скинуть тебе результат? Да, gag.vault присутствует. Вот настройки cfg файла:
9 Авг 2022
wood-grouse, именно Gag. Насчёт мута я вкурсе что он слетает после смены карты и так должно быть.
Поставь версию 2.4.0
 
Сообщения
208
Реакции
39
Помог
4 раз(а)
Loki, так у меня и эта версия стоит.
Вчера попробовал .. Gag me у меня все работает .
Могу предположить что иза dproto_EF RUN - dproto.so возможно слетает ( player list может читает )
Могу ошибаться. c Reunion на REHLDS все норм
 
Сообщения
19
Реакции
1
Loki, ладно, буду наверное на ReHLDS переходить. Спасибо за ответ, всего доброго!
 
Сообщения
619
Реакции
130
Предупреждения
5
Помог
10 раз(а)
wxre, а причем тут рхлдс? Плагины Радиуса рассчитаны и для хлдс.
 
Сообщения
208
Реакции
39
Помог
4 раз(а)
wxre, а причем тут рхлдс? Плагины Радиуса рассчитаны и для хлдс.
я написал во первых так Могу предположить что иза dproto_EF RUN - dproto.so возможно слетает ( player list может читает )
Не говорил что и за РЕХЛДС
Акцент делаю именно на dproto
и я же вроде написал могу ошибаться .
Спасибо за критику :thank_you:
 
Сообщения
619
Реакции
130
Предупреждения
5
Помог
10 раз(а)
Loki, я не критикую)) просто у меня и на хлдс норм работал плагин, правда версия другая. Но лучше, действительно, перейти на rhlds.
 
Сообщения
208
Реакции
39
Помог
4 раз(а)
DEVV,
С VTC он совместим однозначно! а LocalizeBugfix давно в топку
 
Сообщения
208
Реакции
39
Помог
4 раз(а)
самый простой вариант исправить, это использовать любой другой плагин https://dev-cs.ru/resources/1335/ например
Согласен .. не стал поднимать такой ответ человеку. Так как тут решение именно с этим плагином и именно с этой сборкой .
А так еще неугомон прост и работает.
Код:
// *************************************************************************************//
// Плагин загружен с  www.neugomon.ru                                                   //
// Автор: Neygomon  [ https://neugomon.ru/members/1/ ]                                  //
// Официальная тема поддержки: https://neugomon.ru/threads/91/                          //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
// *************************************************************************************//

#include <amxmodx>
#tryinclude <reapi>
#if !defined _reapi_included
    #include <VtcApi>
#endif
#if AMXX_VERSION_NUM < 183
    #include <colorchat>
#endif

#define SORRY                // Разрешить команду /sorry для извинения игроков
#define MUTEMENU            // Поддержка команды /mute
#define GAG_ACCESS    ADMIN_BAN     // Доступ к функциям гага
#define SORRYTIME     60        // Как часто можно пользоваться командой /sorry. Время в секундах
#define PREFIX        "AMX Gag"     // Префикс в чате
#define SUPERADMIN    ADMIN_RCON    // Админ с флагом L может гагать других админов с иммунитетом

new g_BlockTimes[] =     // Время блокировки в минутах
{
    5,
    10,
    30,
    60,
    180,
    0 // навсегда
}

new g_AllowCommands[][] = // Разрешенные команды
{
    "/me",
    "/top15",
    "/rank",
    "/hp"
}

/* Словарь плагина */
#define MSG_SORRY_FLOOD     "^1[^4%s^1] ^3Прекратите флудить! ^4Повторно извиниться можно через ^3%d сек"
#define MSG_SORRY_ADMIN     "^1[^4%s^1] ^4Уважаемый ^3адмнистратор^4, игрок ^3%s ^4просит снять с него ^3GAG^4!"
#define MSG_CHAT_IS_BLOCKED     "^1[^4%s^1] ^4Уважаемый ^3%s^4, Ваш чат ^3заблокирован^4!"
#define MSG_BLOCK_EXPIRED_TIME     "^1[^4%s^1] ^4До разблокировки осталось ^1примерно ^3%d ^4мин."
#define MSG_BLOCK_EXPIRED     "^1[^4%s^1] ^4Время блокировки ^3истекло^4. ^1Подождите обновления информации ..."
#define MSG_SAY_SORRY         "^1[^4%s^1] ^4Чтобы извиниться, напишите в чат ^3/sorry^4. Возможно, разблокируют раньше :)"
#define MSG_CHAT_UNBLOCK_ALL     "^1[^4%s^1] ^4Игроку ^3%s ^4был разблокирован чат администратором ^3%s"
#define MSG_CHAT_UNBLOCK_PL     "^1[^4%s^1] ^4Уважаемый ^3%s^4, администратор ^3%s ^4снял с Вас блокировку чата"
#define MSG_CHAT_BLOCK_ALL     "^1[^4%s^1] ^4Администратор ^3%s ^4заблокировал чат игроку ^3%s ^1%s"
#define MSG_CHAT_BLOCK_PL     "^1[^4%s^1] ^4Уважаемый ^3%s^4, администратор ^3%s ^4заблокировал Вам чат ^1%s"
#define MSG_MUTE_ALL_PLAYERS     "^1[^4%s^1] ^4Вы установили mute на ^3всех ^4игроков."
#define MSG_UNMUTE_ALL_PLAYERS     "^1[^4%s^1] ^4Вы сняли mute со ^3всех ^4игроков."
#define MSG_UNMUTE_PLAYER     "^1[^4%s^1] ^4Вы сняли ^3mute ^4с игрока ^3%s^4."
#define MSG_MUTE_PLAYER     "^1[^4%s^1] ^4Вы установили ^3mute ^4на игрока ^3%s^4."

/* Технические данные */
#if defined MUTEMENU
    #include <fakemeta>
#endif

#define STORAGE     "addons/amxmodx/data/amx_gag.dat"
#define MAX_ITEMS    1000
#if !defined MAX_PLAYERS
    const MAX_PLAYERS = 32;
#endif
#define    GetBit(%1,%2)    (%1 & (1 << (%2 & 31)))
#define    SetBit(%1,%2)    %1 |= (1 << (%2 & 31))
#define    ResetBit(%1,%2)    %1 &= ~(1 << (%2 & 31))

enum _:DATA
{
    IP[16],
    STEAMID[25],
    BLOCKTIME
};
enum MENUS
{
    GAG,
    MUTE
};
enum _:MENU_SETTINGS
{
    Menu,
    SelectTime,
    Pos
};

new g_bitBlockChats;
new g_aLoadedData[MAX_PLAYERS + 1][DATA];
new Trie:g_tAllowCmds, Array:g_aUsersBlocked;
new g_arrData[DATA];
new pl[MAX_PLAYERS], pnum;
new g_iMutePlayer[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
new g_arrPlayers[MAX_PLAYERS + 1][MAX_PLAYERS];
new g_iMenuInfo[MAX_PLAYERS + 1][MENU_SETTINGS];

public plugin_init()
{
#define VERSION "1.9.0"
    register_plugin("Advanced Gag", VERSION, "neygomon");
    register_cvar("adv_gag", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
#if defined _reapi_included   
    if(has_vtc())
    {
        register_clcmd("amx_gagmenu", "ClCmdGagMenu");
    }
    #if !defined MUTEMENU
    else    set_fail_state("Needed meta plugin VTC [https://neugomon.ru/threads/257/]");
    #endif
#else
    register_clcmd("amx_gagmenu", "ClCmdGagMenu");
#endif
#if defined MUTEMENU
    register_clcmd("say /mute", "ClCmdMuteMenu");
    register_clcmd("say_team /mute", "ClCmdMuteMenu");
    
    register_forward(FM_Voice_SetClientListening, "SetClientListening_Pre", false);
#endif
#if defined SORRY
    register_clcmd("say /sorry", "SaySorry");
    register_clcmd("say_team /sorry", "SaySorry");
#endif
    register_clcmd("say", "SayChat");
    register_clcmd("say_team", "SayChat");
    
    register_srvcmd("adv_flush_gags", "SrvCmdFlush");
    
    register_menucmd(register_menuid("AdvGag Menu"), 1023, "MenuHandler");
    
    set_task(60.0, "CheckBlockedUsers", .flags = "b");
}

public plugin_cfg()
{
    g_aUsersBlocked = ArrayCreate(DATA);
    
    new fp = fopen(STORAGE, "rt");
    if(fp)
    {
        new i, blocktime[15], buffer[128];
        new sys = get_systime();

        while(!feof(fp) && i < MAX_ITEMS)
        {
            fgets(fp, buffer, charsmax(buffer));
            trim(buffer);
            
            if(buffer[0] == EOS || buffer[0] == ';')
                continue;
            
            if(parse(buffer,
                    g_arrData[IP], charsmax(g_arrData[IP]),
                    g_arrData[STEAMID], charsmax(g_arrData[STEAMID]),
                    blocktime, charsmax(blocktime)
                )
            )
            {
                g_arrData[BLOCKTIME] = str_to_num(blocktime);
                if(!g_arrData[BLOCKTIME] || g_arrData[BLOCKTIME] > sys)
                {
                    ArrayPushArray(g_aUsersBlocked, g_arrData);
                    i++;
                }   
            }
        }
        fclose(fp);
    }

    g_tAllowCmds = TrieCreate();
    for(new i; i < sizeof g_AllowCommands; ++i)
        TrieSetCell(g_tAllowCmds, g_AllowCommands[i], i);
}

public client_putinserver(id)
{
    if(!is_user_bot(id) && !is_user_hltv(id))
    {
        get_user_ip(id, g_aLoadedData[id][IP], charsmax(g_aLoadedData[][IP]), 1);
        get_user_authid(id, g_aLoadedData[id][STEAMID], charsmax(g_aLoadedData[][STEAMID]));
        
        if(IsUserBlocked(id, g_aLoadedData[id][IP], g_aLoadedData[id][STEAMID]) != -1)
        {
            VTC_MuteClient(id);
            SetBit(g_bitBlockChats, id);
        }
        else     ResetBit(g_bitBlockChats, id);
        
        arrayset(g_iMutePlayer[id], 0, sizeof g_iMutePlayer[]);
    }
}
#if defined MUTEMENU
public SetClientListening_Pre(iReciever, iSender)
{
    if(iSender != iReciever)
    {
        if(g_iMutePlayer[iReciever][iSender])
        {   
            engfunc(EngFunc_SetClientListening, iReciever, iSender, false);
            forward_return(FMV_CELL, false);
            return FMRES_SUPERCEDE;
        }   
    }
    return FMRES_IGNORED;
}
#endif
public SaySorry(id)
{
    if(GetBit(g_bitBlockChats, id))
    {
        static iFloodTime[33], systime;
        if(iFloodTime[id] > (systime = get_systime()))
            ChatColor(id, 0, MSG_SORRY_FLOOD, PREFIX, iFloodTime[id] - systime);
        else
        {
            new sName[32];
            get_user_name(id, sName, charsmax(sName));

            get_players(pl, pnum, "ch");
            for(new i; i < pnum; ++i)
            {
                if(get_user_flags(pl[i]) & GAG_ACCESS)
                    ChatColor(pl[i], 0, MSG_SORRY_ADMIN, PREFIX, sName);
            }

            iFloodTime[id] = systime + SORRYTIME;
        }
    }
    return PLUGIN_HANDLED;
}
public SayChat(id)
{
    if(!GetBit(g_bitBlockChats, id))
        return PLUGIN_CONTINUE;

    new sMessage[128];
    read_args(sMessage, charsmax(sMessage));
    remove_quotes(sMessage);

    if(TrieKeyExists(g_tAllowCmds, sMessage))
        return PLUGIN_CONTINUE;   
    else
    {
        new sName[32], ost;
        get_user_name(id, sName, charsmax(sName));
        ChatColor(id, 0, MSG_CHAT_IS_BLOCKED, PREFIX, sName);
        
        if(g_aLoadedData[id][BLOCKTIME])
        {
            if((ost = g_aLoadedData[id][BLOCKTIME] - get_systime()) / 60 > 0)
                ChatColor(id, 0, MSG_BLOCK_EXPIRED_TIME, PREFIX, ost / 60);
            else     ChatColor(id, 0, MSG_BLOCK_EXPIRED, PREFIX);
        }
        
        ChatColor(id, 0, MSG_SAY_SORRY, PREFIX);
    }
    return PLUGIN_HANDLED;
}

public SrvCmdFlush()
{
    ArrayClear(g_aUsersBlocked);
    log_amx("Advanced Gag [v %s] flush gags", VERSION);
    
    for(new id; id < sizeof g_aLoadedData; ++id)
    {
        arrayset(g_aLoadedData[id], 0, sizeof g_aLoadedData[]);
        ResetBit(g_bitBlockChats, id);
    }
}

public CheckBlockedUsers()
{
    if(ArraySize(g_aUsersBlocked))
    {
        get_players(pl, pnum);   
        
        for(new i, sys = get_systime(); i < pnum; ++i)
        {
            if(g_aLoadedData[pl[i]][BLOCKTIME] && sys > g_aLoadedData[pl[i]][BLOCKTIME])
                UserBlock(pl[i], 0);
        }
    }
}

public ClCmdGagMenu(id)
{
    if(get_user_flags(id) & GAG_ACCESS)
    {
        g_iMenuInfo[id][SelectTime] = 0;
        g_iMenuInfo[id][Pos] = 0;
        g_iMenuInfo[id][Menu] = any:GAG;
        
        ShowMenu(id, 0);
    }   
    
    return PLUGIN_HANDLED;
}

public ClCmdMuteMenu(id)
{
    g_iMenuInfo[id][Pos] = 0;
    g_iMenuInfo[id][Menu] = any:MUTE;

    ShowMenu(id, 0);
    return PLUGIN_HANDLED;
}

ShowMenu(id, iPos)
{
    new start, end;
    new iLen, sMenu[512];
    new iKeys = MENU_KEY_0|MENU_KEY_8;
    get_players(g_arrPlayers[id], pnum, "ch");
    
    switch(g_iMenuInfo[id][Menu])
    {
        case GAG:
        {
            start = iPos * 7;
            end   = start + 7;
            iLen  = formatex(sMenu, charsmax(sMenu), "\d[\rAMX Gag\d] \yВыберите игрока\w\R%d/%d^n^n", iPos + 1, (pnum / 7 + ((pnum % 7) ? 1 : 0)));
        }
        case MUTE:
        {
            start = iPos * 6;
            end   = start + 6;
            iKeys |= MENU_KEY_7;
            iLen  = formatex(sMenu, charsmax(sMenu), "\d[\rMute\d] \yВыберите игрока\w\R%d/%d^n^n", iPos + 1, (pnum / 6 + ((pnum % 6) ? 1 : 0)));
        }
    }
    
    if(start >= pnum)
        start = iPos = g_iMenuInfo[id][Pos] = 0;
    if(end > pnum)
        end = pnum;
    
    switch(g_iMenuInfo[id][Menu])
    {
        case GAG:
        {
        #if defined SUPERADMIN
            for(new i = start, bool:superadmin = bool:(get_user_flags(id) & SUPERADMIN), sName[32], plr, a; i < end; ++i)
        #else
            for(new i = start, sName[32], plr, a; i < end; ++i)
        #endif
            {   
                plr = g_arrPlayers[id][i];
                get_user_name(plr, sName, charsmax(sName));

                if(id == plr)
                    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rЭто Вы\y]^n", ++a, sName);
            #if defined SUPERADMIN       
                else if(!superadmin && get_user_flags(plr) & ADMIN_IMMUNITY)
            #else
                else if(get_user_flags(plr) & ADMIN_IMMUNITY)
            #endif
                    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rImmunity\y]^n", ++a, sName);   
                else
                {
                    iKeys |= (1 << a++);
                    
                    if(GetBit(g_bitBlockChats, plr))
                        iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s \d[\yUngag\d]^n", a, sName);
                    else    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s%s^n", a, sName, VTC_IsClientSpeaking(plr) ? " \d[\rSpeaking\d]" : "");
                }
            }
        
            if(!g_BlockTimes[g_iMenuInfo[id][SelectTime]])
                iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r8. \wGag\d'\wнуть \rнавсегда^n^n");
            else     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r8. \wGag\d'\wнуть на \y%d \wмин^n^n", g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
        }
        case MUTE:
        {
            for(new i = start, sName[32], plr, a; i < end; ++i)
            {   
                plr = g_arrPlayers[id][i];
                get_user_name(plr, sName, charsmax(sName));

                if(id == plr)
                    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rЭто Вы\y]^n", ++a, sName);
                else
                {
                    iKeys |= (1 << a++);
                    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s%s^n", a, sName, g_iMutePlayer[id][plr] ? " \d[\yMuted\d]" : "");
                }
            }
        
            iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r7. \wЗаглушить \rвсех^n\r8. \wСнять Mute со \rвсех^n^n");
        }
    }

    if(end != pnum)
    {
        formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r9. \yДалее^n\r0. \r%s", iPos ? "Назад" : "Выход");
        iKeys |= MENU_KEY_9;
    }
    else formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r0. \r%s", iPos ? "Назад" : "Выход");

    show_menu(id, iKeys, sMenu, -1, "AdvGag Menu");
    return PLUGIN_HANDLED;
}

public MenuHandler(id, iKey)
{
    switch(iKey)
    {
        case 6:
        {
            switch(g_iMenuInfo[id][Menu])
            {
                case GAG:
                {
                    GagHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 7 + iKey], g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
                }
                case MUTE:
                {
                    arrayset(g_iMutePlayer[id], 1, sizeof g_iMutePlayer[]);
                    ChatColor(id, 0, MSG_MUTE_ALL_PLAYERS, PREFIX);
                }
            }
        }
        case 7:
        {
            switch(g_iMenuInfo[id][Menu])
            {
                case GAG:
                {
                    if(++g_iMenuInfo[id][SelectTime] > charsmax(g_BlockTimes))
                        g_iMenuInfo[id][SelectTime] = 0;
                    
                    ShowMenu(id, g_iMenuInfo[id][Pos]);
                }
                case MUTE:
                {
                    arrayset(g_iMutePlayer[id], 0, sizeof g_iMutePlayer[]);
                    ChatColor(id, 0, MSG_UNMUTE_ALL_PLAYERS, PREFIX);
                }
            }
        }
        case 8: ShowMenu(id, ++g_iMenuInfo[id][Pos]);
        case 9:
        {
            if(g_iMenuInfo[id][Pos])
                ShowMenu(id, --g_iMenuInfo[id][Pos]);
        }
        default:
        {
            switch(g_iMenuInfo[id][Menu])
            {
                case GAG:
                {
                    GagHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 7 + iKey], g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
                }
                case MUTE:
                {
                    MuteHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 6 + iKey]);
                }
            }
        }
    }
    return PLUGIN_HANDLED;
}

GagHandler(id, player, blocktime)
{
    if(!is_user_connected(player))
    {
        return;
    }
    
    new sNameAdmin[32], sNamePlayer[32];
    get_user_name(id, sNameAdmin, charsmax(sNameAdmin));
    get_user_name(player, sNamePlayer, charsmax(sNamePlayer));

    if(GetBit(g_bitBlockChats, player))
    {
        UserBlock(player, 0);

        ChatColor(0, player, MSG_CHAT_UNBLOCK_ALL, PREFIX, sNamePlayer, sNameAdmin);
        ChatColor(player, 0, MSG_CHAT_UNBLOCK_PL, PREFIX, sNamePlayer, sNameAdmin);
    }
    else
    {
        UserBlock(player, 1, blocktime);

        new blocktimeinfo[32];
        if(!blocktime)
            formatex(blocktimeinfo, charsmax(blocktimeinfo), "навсегда");
        else    formatex(blocktimeinfo, charsmax(blocktimeinfo), "на %d минут", blocktime);

        ChatColor(0, player, MSG_CHAT_BLOCK_ALL, PREFIX, sNameAdmin, sNamePlayer, blocktimeinfo);
        ChatColor(player, 0, MSG_CHAT_BLOCK_PL, PREFIX, sNamePlayer, sNameAdmin, blocktimeinfo);
    }
    ShowMenu(id, g_iMenuInfo[id][Pos]);
}

MuteHandler(id, player)
{
    if(!is_user_connected(player))
    {
        return;
    }
    
    new sNamePlayer[32];
    get_user_name(player, sNamePlayer, charsmax(sNamePlayer));

    g_iMutePlayer[id][player] = !g_iMutePlayer[id][player];
    ChatColor(id, 0, g_iMutePlayer[id][player] ? MSG_MUTE_PLAYER : MSG_UNMUTE_PLAYER, PREFIX, sNamePlayer);
    
    ShowMenu(id, g_iMenuInfo[id][Pos]);
}

UserBlock(id, block, btime = 0)
{
    if(block)
    {
        g_aLoadedData[id][BLOCKTIME] = !btime ? 0 : get_systime() + btime * 60;

        ArrayPushArray(g_aUsersBlocked, g_aLoadedData[id]);
        SetBit(g_bitBlockChats, id);
        VTC_MuteClient(id);
        client_cmd(id, "-voicerecord");     // типа отключаем войс, ога
    }
    else    IsUserBlocked(id, g_aLoadedData[id][IP], g_aLoadedData[id][STEAMID], 1);
}

IsUserBlocked(id, const Ip[], const SteamID[], UnBlock = 0)
{
    new i, aSize = ArraySize(g_aUsersBlocked), sys = get_systime();
    
    if(UnBlock)
    {
        for(i = 0; i < aSize; ++i)
        {
            ArrayGetArray(g_aUsersBlocked, i, g_arrData);
            if(strcmp(g_arrData[IP], Ip) == 0 || strcmp(g_arrData[STEAMID], SteamID) == 0)
            {
                ArrayDeleteItem(g_aUsersBlocked, i);
                ResetBit(g_bitBlockChats, id);
                VTC_UnmuteClient(id);
                break;
            }
        }
    }
    else
    {
        for(i = 0; i < aSize; ++i)
        {
            ArrayGetArray(g_aUsersBlocked, i, g_arrData);
            if(strcmp(g_arrData[IP], Ip) == 0 || strcmp(g_arrData[STEAMID], SteamID) == 0)
            {
                if(!g_arrData[BLOCKTIME] || g_arrData[BLOCKTIME] > sys)
                {
                    g_aLoadedData[id][BLOCKTIME] = g_arrData[BLOCKTIME];
                    return i;
                }
                else    ArrayDeleteItem(g_aUsersBlocked, i);

                break;
            }
        }
    }
    return -1;
}

public plugin_end()
{
    if(file_exists(STORAGE))
        unlink(STORAGE);
    
    new aSize, fp = fopen(STORAGE, "w+");
    if(!fprintf(fp, "; File generated by Advanced Gag [v %s][neygomon | https://neugomon.ru/threads/91/]^n^n", VERSION))
    {
        new err[128]; formatex(err, charsmax(err), "Plugin not write file %s! Users not saved!", STORAGE);
        set_fail_state(err);
    }

    aSize = ArraySize(g_aUsersBlocked);
    for(new i; i < aSize; ++i)
    {
        ArrayGetArray(g_aUsersBlocked, i, g_arrData);
        fprintf(fp, "^"%s^" ^"%s^" ^"%d^"^n", g_arrData[IP], g_arrData[STEAMID], g_arrData[BLOCKTIME]);
    }
    
    if(aSize)
    {
        log_amx("Successfully saved %d items in %s :)", aSize, STORAGE);
    }
    
    fclose(fp);
    ArrayDestroy(g_aUsersBlocked);
    TrieDestroy(g_tAllowCmds);
}

stock ChatColor(id, id2, const szMessage[], any:...)
{
    new szMsg[190];
    vformat(szMsg, charsmax(szMsg), szMessage, 4);
    
    if(id && id != id2)
    {
        client_print_color(id, print_team_default, szMsg);
    }
    else
    {
        get_players(pl, pnum, "c");
        for(new i; i < pnum; ++i)
        {
            if(pl[i] != id2)
            {
                client_print_color(pl[i], print_team_default, szMsg);
            }
        }
    }
}
 
Сообщения
208
Реакции
39
Помог
4 раз(а)
Loki, не понимаю, почему кто-то до сих пор юзает неугомонов каких-то и радиусов, когда есть amxx - reapi Chat Additions | Dev-CS.ru
Именно это творение я и использую , вообще все четко! , и все хотелки мои работают. Спасибо вам SergeyShorokhov, steelzzz, Nordic Warrior за эту работу . А неугамонский код кинул , чтоб человек(ки):mosking: знал(ли) какие есть варианты еще , мы же не знаем что ему именно надо.
 
Сообщения
2,831
Реакции
1,666
Помог
75 раз(а)
за неимением исходника советую обратиться к автору плагина
к тому же советов надавали уже целую тонну.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу