| 				
					| Offline |  
					|  |  Csatlakozott:2014.10.30. 10:18
 Hozzászólások:468
 Megköszönt másnak: 235 alkalommal
 Megköszönték neki: 34 alkalommal
 | 
				
					| *GrafitY* írta: Sziasztok! Akinek van egy kis ideje, meg köszönném!  // *************************************************************************************//// Плагин загружен с  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 MUTEMENUpublic 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;}#endifpublic 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);            }        }    }}
Tessék! Ez most a végleges verzió!    // *************************************************************************************//// Плагин загрŃжен Ń  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               // EngedĂ©lyezze a / sorry parancsot, hogy bocsánatot kĂ©rjen a játĂ©kosoktĂłl#define MUTEMENU            // Támogatás / nĂ©mĂtás parancs#define GAG_ACCESS  ADMIN_LEVEL_A   // HozzáfĂ©rĂ©si jog funkciĂłkhoz#define SORRYTIME   60      // Milyen gyakran használhatja a / sorry parancsot. IdĹ‘ másodpercben#define PREFIX      "AMX Gag"   // CsevegĹ‘ elĹ‘tag#define SUPERADMIN  ADMIN_RCON  // Az adminisztrátor az L zászlĂłval megnevelhet más adminisztrátorokat new g_BlockTimes[] =    // ido percekben{    15,    60,    180,    1440,    2880,    0 // навŃегда} new g_AllowCommands[][] = // EngedĂ©lyezett parancsok{    "/me",    "/top15",    "/rank",    "/hp",    "/menu",    "/rang",    "/qsound",    "/dmg",    "/maxdmg",    "/rs"} /* Словарь плагина */#define MSG_SORRY_FLOOD     "^1[^4%s^1] ^3Chat letiltva! ^4Bocsanatot kerhetsz ^3%d masodperc mulva!"#define MSG_SORRY_ADMIN     "^1[^4%s^1] ^4Kedves ^3Admin^4, ^3%s jatekos ^4keri h vedd le a tiltast!"#define MSG_CHAT_IS_BLOCKED     "^1[^4%s^1] ^4Kedves ^3%s^4, a kommonukaciod ^3blokkoltuk^4!"#define MSG_BLOCK_EXPIRED_TIME  "^1[^4%s^1] ^4A tiltas feloldasa ^1 korulbelul ^3%d ^4 perc."#define MSG_BLOCK_EXPIRED   "^1[^4%s^1] ^4Blokkolasi ido ^3lejart^4. ^1Varja meg az informaciok frissiteset ..."#define MSG_SAY_SORRY       "^1[^4%s^1] ^4Bocsanat kereshez, ird say-be ^3/sorry^4. Remelhetoleg, oldjak a blokkolast :)"#define MSG_CHAT_UNBLOCK_ALL    "^1[^4%s^1] ^4A blokkolast ^3%s ^4jatekoson oldotta ^3%s admin."#define MSG_CHAT_UNBLOCK_PL     "^1[^4%s^1] ^4Kedves ^3%s^4,az admin ^3%s ^4oldotta a chat letiltasat"#define MSG_CHAT_BLOCK_ALL  "^1[^4%s^1] ^4Az admin ^3%s ^4blokkolta a kommonikaciot ^3%s ^1%s"#define MSG_CHAT_BLOCK_PL   "^1[^4%s^1] ^4Kedves ^3%s^4, az admin ^3%s ^4letiltotta a kommunikaciot ^1%s"#define MSG_MUTE_ALL_PLAYERS    "^1[^4%s^1] ^4Te letiltottad ^3az osszes jatekos ^4komminikaciojat." #define MSG_UNMUTE_ALL_PLAYERS  "^1[^4%s^1] ^4Te engedelyezted ^3az osszes jatekos ^4komminikaciojat." #define MSG_UNMUTE_PLAYER   "^1[^4%s^1] ^4Te engedelyezted ^3a kivalasztott jatekos ^4Ń kommunikaciojat: ^3%s^4."#define MSG_MUTE_PLAYER     "^1[^4%s^1] ^4Te letiltottad  ^3a kivalasztott jatekos ^4kommunikaciojat: ^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("Szukseges a VTC metaplugin [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 MUTEMENUpublic 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;}#endifpublic 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] \yKivalaszt\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] \yKivalaszt\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[\rEz te vagy\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[\yFeloldas\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. \wTiltas\d'\wki \rOrokre^n^n");            else    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r8. \wTiltas\d'\wadas a \y%d \wperc^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[\rEz te vagy\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. \wNemit \rMindenki^n\r8. \wNemitas oldasa \rMindenki^n^n");        }    }     if(end != pnum)    {        formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r9. \yTovabb^n\r0. \r%s", iPos ? "Vissza" : "Kilepes");        iKeys |= MENU_KEY_9;    }    else formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r0. \r%s", iPos ? "Vissza" : "Kilepes");     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), "Orokre");        else    formatex(blocktimeinfo, charsmax(blocktimeinfo), " %d Percre", blocktime);         log_amx(MSG_CHAT_BLOCK_ALL, PREFIX, sNameAdmin, sNamePlayer, blocktimeinfo);                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);            }        }    }}
 
 |  |