hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.03.29. 13:39



Jelenlévő felhasználók

Jelenleg 334 felhasználó van jelen :: 0 regisztrált, 0 rejtett és 334 vendég

A legtöbb felhasználó (1565 fő) 2020.11.21. 11:26-kor tartózkodott itt.

Regisztrált felhasználók: nincs regisztrált felhasználó az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása  Hozzászólás a témához  [ 2 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: Advanced gag
HozzászólásElküldve: 2017.10.02. 20:53 
Offline
GFX-Designer
Avatar

Csatlakozott: 2015.03.12. 15:06
Hozzászólások: 624
Megköszönt másnak: 199 alkalommal
Megköszönték neki: 78 alkalommal
Sziasztok!

Akinek van egy kis ideje, meg köszönném!

  1. // *************************************************************************************//
  2. // Плагин загружен с  www.neugomon.ru                                                   //
  3. // Автор: Neygomon  [ https://neugomon.ru/members/1/ ]                                  //
  4. // Официальная тема поддержки: https://neugomon.ru/threads/91/                          //
  5. // При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
  6. // *************************************************************************************//
  7.  
  8. #include <amxmodx>
  9. #tryinclude <reapi>
  10. #if !defined _reapi_included
  11.     #include <VtcApi>
  12. #endif
  13. #if AMXX_VERSION_NUM < 183
  14.     #include <colorchat>
  15. #endif
  16.  
  17. #define SORRY               // Разрешить команду /sorry для извинения игроков
  18. #define MUTEMENU            // Поддержка команды /mute
  19. #define GAG_ACCESS  ADMIN_BAN   // Доступ к функциям гага
  20. #define SORRYTIME   60      // Как часто можно пользоваться командой /sorry. Время в секундах
  21. #define PREFIX      "AMX Gag"   // Префикс в чате
  22. #define SUPERADMIN  ADMIN_RCON  // Админ с флагом L может гагать других админов с иммунитетом
  23.  
  24. new g_BlockTimes[] =    // Время блокировки в минутах
  25. {
  26.     5,
  27.     10,
  28.     30,
  29.     60,
  30.     180,
  31.     0 // навсегда
  32. }
  33.  
  34. new g_AllowCommands[][] = // Разрешенные команды
  35. {
  36.     "/me",
  37.     "/top15",
  38.     "/rank",
  39.     "/hp"
  40. }
  41.  
  42. /* Словарь плагина */
  43. #define MSG_SORRY_FLOOD     "^1[^4%s^1] ^3Прекратите флудить! ^4Повторно извиниться можно через ^3%d сек"
  44. #define MSG_SORRY_ADMIN     "^1[^4%s^1] ^4Уважаемый ^3адмнистратор^4, игрок ^3%s ^4просит снять с него ^3GAG^4!"
  45. #define MSG_CHAT_IS_BLOCKED     "^1[^4%s^1] ^4Уважаемый ^3%s^4, Ваш чат ^3заблокирован^4!"
  46. #define MSG_BLOCK_EXPIRED_TIME  "^1[^4%s^1] ^4До разблокировки осталось ^1примерно ^3%d ^4мин."
  47. #define MSG_BLOCK_EXPIRED   "^1[^4%s^1] ^4Время блокировки ^3истекло^4. ^1Подождите обновления информации ..."
  48. #define MSG_SAY_SORRY       "^1[^4%s^1] ^4Чтобы извиниться, напишите в чат ^3/sorry^4. Возможно, разблокируют раньше :)"
  49. #define MSG_CHAT_UNBLOCK_ALL    "^1[^4%s^1] ^4Игроку ^3%s ^4был разблокирован чат администратором ^3%s"
  50. #define MSG_CHAT_UNBLOCK_PL     "^1[^4%s^1] ^4Уважаемый ^3%s^4, администратор ^3%s ^4снял с Вас блокировку чата"
  51. #define MSG_CHAT_BLOCK_ALL  "^1[^4%s^1] ^4Администратор ^3%s ^4заблокировал чат игроку ^3%s ^1%s"
  52. #define MSG_CHAT_BLOCK_PL   "^1[^4%s^1] ^4Уважаемый ^3%s^4, администратор ^3%s ^4заблокировал Вам чат ^1%s"
  53. #define MSG_MUTE_ALL_PLAYERS    "^1[^4%s^1] ^4Вы установили mute на ^3всех ^4игроков."
  54. #define MSG_UNMUTE_ALL_PLAYERS  "^1[^4%s^1] ^4Вы сняли mute со ^3всех ^4игроков."
  55. #define MSG_UNMUTE_PLAYER   "^1[^4%s^1] ^4Вы сняли ^3mute ^4с игрока ^3%s^4."
  56. #define MSG_MUTE_PLAYER     "^1[^4%s^1] ^4Вы установили ^3mute ^4на игрока ^3%s^4."
  57.  
  58. /* Технические данные */
  59. #if defined MUTEMENU
  60.     #include <fakemeta>
  61. #endif
  62.  
  63. #define STORAGE     "addons/amxmodx/data/amx_gag.dat"
  64. #define MAX_ITEMS   1000
  65. #if !defined MAX_PLAYERS
  66.     const MAX_PLAYERS = 32;
  67. #endif
  68. #define GetBit(%1,%2)   (%1 & (1 << (%2 & 31)))
  69. #define SetBit(%1,%2)   %1 |= (1 << (%2 & 31))
  70. #define ResetBit(%1,%2) %1 &= ~(1 << (%2 & 31))
  71.  
  72. enum _:DATA
  73. {
  74.     IP[16],
  75.     STEAMID[25],
  76.     BLOCKTIME
  77. };
  78. enum MENUS
  79. {
  80.     GAG,
  81.     MUTE
  82. };
  83. enum _:MENU_SETTINGS
  84. {
  85.     Menu,
  86.     SelectTime,
  87.     Pos
  88. };
  89.  
  90. new g_bitBlockChats;
  91. new g_aLoadedData[MAX_PLAYERS + 1][DATA];
  92. new Trie:g_tAllowCmds, Array:g_aUsersBlocked;
  93. new g_arrData[DATA];
  94. new pl[MAX_PLAYERS], pnum;
  95. new g_iMutePlayer[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
  96. new g_arrPlayers[MAX_PLAYERS + 1][MAX_PLAYERS];
  97. new g_iMenuInfo[MAX_PLAYERS + 1][MENU_SETTINGS];
  98.  
  99. public plugin_init()
  100. {
  101. #define VERSION "1.9.0"
  102.     register_plugin("Advanced Gag", VERSION, "neygomon");
  103.     register_cvar("adv_gag", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
  104. #if defined _reapi_included
  105.     if(has_vtc())
  106.     {
  107.         register_clcmd("amx_gagmenu", "ClCmdGagMenu");
  108.     }
  109.     #if !defined MUTEMENU
  110.     else    set_fail_state("Needed meta plugin VTC [https://neugomon.ru/threads/257/]");
  111.     #endif
  112. #else
  113.     register_clcmd("amx_gagmenu", "ClCmdGagMenu");
  114. #endif
  115. #if defined MUTEMENU
  116.     register_clcmd("say /mute", "ClCmdMuteMenu");
  117.     register_clcmd("say_team /mute", "ClCmdMuteMenu");
  118.    
  119.     register_forward(FM_Voice_SetClientListening, "SetClientListening_Pre", false);
  120. #endif
  121. #if defined SORRY
  122.     register_clcmd("say /sorry", "SaySorry");
  123.     register_clcmd("say_team /sorry", "SaySorry");
  124. #endif
  125.     register_clcmd("say", "SayChat");
  126.     register_clcmd("say_team", "SayChat");
  127.    
  128.     register_srvcmd("adv_flush_gags", "SrvCmdFlush");
  129.    
  130.     register_menucmd(register_menuid("AdvGag Menu"), 1023, "MenuHandler");
  131.    
  132.     set_task(60.0, "CheckBlockedUsers", .flags = "b");
  133. }
  134.  
  135. public plugin_cfg()
  136. {
  137.     g_aUsersBlocked = ArrayCreate(DATA);
  138.    
  139.     new fp = fopen(STORAGE, "rt");
  140.     if(fp)
  141.     {
  142.         new i, blocktime[15], buffer[128];
  143.         new sys = get_systime();
  144.  
  145.         while(!feof(fp) && i < MAX_ITEMS)
  146.         {
  147.             fgets(fp, buffer, charsmax(buffer));
  148.             trim(buffer);
  149.            
  150.             if(buffer[0] == EOS || buffer[0] == ';')
  151.                 continue;
  152.            
  153.             if(parse(buffer,
  154.                     g_arrData[IP], charsmax(g_arrData[IP]),
  155.                     g_arrData[STEAMID], charsmax(g_arrData[STEAMID]),
  156.                     blocktime, charsmax(blocktime)
  157.                 )
  158.             )
  159.             {
  160.                 g_arrData[BLOCKTIME] = str_to_num(blocktime);
  161.                 if(!g_arrData[BLOCKTIME] || g_arrData[BLOCKTIME] > sys)
  162.                 {
  163.                     ArrayPushArray(g_aUsersBlocked, g_arrData);
  164.                     i++;
  165.                 }  
  166.             }
  167.         }
  168.         fclose(fp);
  169.     }
  170.  
  171.     g_tAllowCmds = TrieCreate();
  172.     for(new i; i < sizeof g_AllowCommands; ++i)
  173.         TrieSetCell(g_tAllowCmds, g_AllowCommands[i], i);
  174. }
  175.  
  176. public client_putinserver(id)
  177. {
  178.     if(!is_user_bot(id) && !is_user_hltv(id))
  179.     {
  180.         get_user_ip(id, g_aLoadedData[id][IP], charsmax(g_aLoadedData[][IP]), 1);
  181.         get_user_authid(id, g_aLoadedData[id][STEAMID], charsmax(g_aLoadedData[][STEAMID]));
  182.        
  183.         if(IsUserBlocked(id, g_aLoadedData[id][IP], g_aLoadedData[id][STEAMID]) != -1)
  184.         {
  185.             VTC_MuteClient(id);
  186.             SetBit(g_bitBlockChats, id);
  187.         }
  188.         else    ResetBit(g_bitBlockChats, id);
  189.        
  190.         arrayset(g_iMutePlayer[id], 0, sizeof g_iMutePlayer[]);
  191.     }
  192. }
  193. #if defined MUTEMENU
  194. public SetClientListening_Pre(iReciever, iSender)
  195. {
  196.     if(iSender != iReciever)
  197.     {
  198.         if(g_iMutePlayer[iReciever][iSender])
  199.         {  
  200.             engfunc(EngFunc_SetClientListening, iReciever, iSender, false);
  201.             forward_return(FMV_CELL, false);
  202.             return FMRES_SUPERCEDE;
  203.         }  
  204.     }
  205.     return FMRES_IGNORED;
  206. }
  207. #endif
  208. public SaySorry(id)
  209. {
  210.     if(GetBit(g_bitBlockChats, id))
  211.     {
  212.         static iFloodTime[33], systime;
  213.         if(iFloodTime[id] > (systime = get_systime()))
  214.             ChatColor(id, 0, MSG_SORRY_FLOOD, PREFIX, iFloodTime[id] - systime);
  215.         else
  216.         {
  217.             new sName[32];
  218.             get_user_name(id, sName, charsmax(sName));
  219.  
  220.             get_players(pl, pnum, "ch");
  221.             for(new i; i < pnum; ++i)
  222.             {
  223.                 if(get_user_flags(pl[i]) & GAG_ACCESS)
  224.                     ChatColor(pl[i], 0, MSG_SORRY_ADMIN, PREFIX, sName);
  225.             }
  226.  
  227.             iFloodTime[id] = systime + SORRYTIME;
  228.         }
  229.     }
  230.     return PLUGIN_HANDLED;
  231. }
  232. public SayChat(id)
  233. {
  234.     if(!GetBit(g_bitBlockChats, id))
  235.         return PLUGIN_CONTINUE;
  236.  
  237.     new sMessage[128];
  238.     read_args(sMessage, charsmax(sMessage));
  239.     remove_quotes(sMessage);
  240.  
  241.     if(TrieKeyExists(g_tAllowCmds, sMessage))
  242.         return PLUGIN_CONTINUE;
  243.     else
  244.     {
  245.         new sName[32], ost;
  246.         get_user_name(id, sName, charsmax(sName));
  247.         ChatColor(id, 0, MSG_CHAT_IS_BLOCKED, PREFIX, sName);
  248.        
  249.         if(g_aLoadedData[id][BLOCKTIME])
  250.         {
  251.             if((ost = g_aLoadedData[id][BLOCKTIME] - get_systime()) / 60 > 0)
  252.                 ChatColor(id, 0, MSG_BLOCK_EXPIRED_TIME, PREFIX, ost / 60);
  253.             else    ChatColor(id, 0, MSG_BLOCK_EXPIRED, PREFIX);
  254.         }
  255.        
  256.         ChatColor(id, 0, MSG_SAY_SORRY, PREFIX);
  257.     }
  258.     return PLUGIN_HANDLED;
  259. }
  260.  
  261. public SrvCmdFlush()
  262. {
  263.     ArrayClear(g_aUsersBlocked);
  264.     log_amx("Advanced Gag [v %s] flush gags", VERSION);
  265.    
  266.     for(new id; id < sizeof g_aLoadedData; ++id)
  267.     {
  268.         arrayset(g_aLoadedData[id], 0, sizeof g_aLoadedData[]);
  269.         ResetBit(g_bitBlockChats, id);
  270.     }
  271. }
  272.  
  273. public CheckBlockedUsers()
  274. {
  275.     if(ArraySize(g_aUsersBlocked))
  276.     {
  277.         get_players(pl, pnum)
  278.        
  279.         for(new i, sys = get_systime(); i < pnum; ++i)
  280.         {
  281.             if(g_aLoadedData[pl[i]][BLOCKTIME] && sys > g_aLoadedData[pl[i]][BLOCKTIME])
  282.                 UserBlock(pl[i], 0);
  283.         }
  284.     }
  285. }
  286.  
  287. public ClCmdGagMenu(id)
  288. {
  289.     if(get_user_flags(id) & GAG_ACCESS)
  290.     {
  291.         g_iMenuInfo[id][SelectTime] = 0;
  292.         g_iMenuInfo[id][Pos] = 0;
  293.         g_iMenuInfo[id][Menu] = any:GAG;
  294.        
  295.         ShowMenu(id, 0);
  296.     }  
  297.    
  298.     return PLUGIN_HANDLED;
  299. }
  300.  
  301. public ClCmdMuteMenu(id)
  302. {
  303.     g_iMenuInfo[id][Pos] = 0;
  304.     g_iMenuInfo[id][Menu] = any:MUTE;
  305.  
  306.     ShowMenu(id, 0);
  307.     return PLUGIN_HANDLED;
  308. }
  309.  
  310. ShowMenu(id, iPos)
  311. {
  312.     new start, end;
  313.     new iLen, sMenu[512];
  314.     new iKeys = MENU_KEY_0|MENU_KEY_8;
  315.     get_players(g_arrPlayers[id], pnum, "ch");
  316.    
  317.     switch(g_iMenuInfo[id][Menu])
  318.     {
  319.         case GAG:
  320.         {
  321.             start = iPos * 7;
  322.             end   = start + 7;
  323.             iLen  = formatex(sMenu, charsmax(sMenu), "\d[\rAMX Gag\d] \yВыберите игрока\w\R%d/%d^n^n", iPos + 1, (pnum / 7 + ((pnum % 7) ? 1 : 0)));
  324.         }
  325.         case MUTE:
  326.         {
  327.             start = iPos * 6;
  328.             end   = start + 6;
  329.             iKeys |= MENU_KEY_7;
  330.             iLen  = formatex(sMenu, charsmax(sMenu), "\d[\rMute\d] \yВыберите игрока\w\R%d/%d^n^n", iPos + 1, (pnum / 6 + ((pnum % 6) ? 1 : 0)));
  331.         }
  332.     }
  333.    
  334.     if(start >= pnum)
  335.         start = iPos = g_iMenuInfo[id][Pos] = 0;
  336.     if(end > pnum)
  337.         end = pnum;
  338.    
  339.     switch(g_iMenuInfo[id][Menu])
  340.     {
  341.         case GAG:
  342.         {
  343.         #if defined SUPERADMIN
  344.             for(new i = start, bool:superadmin = bool:(get_user_flags(id) & SUPERADMIN), sName[32], plr, a; i < end; ++i)
  345.         #else
  346.             for(new i = start, sName[32], plr, a; i < end; ++i)
  347.         #endif
  348.             {  
  349.                 plr = g_arrPlayers[id][i];
  350.                 get_user_name(plr, sName, charsmax(sName));
  351.  
  352.                 if(id == plr)
  353.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rЭто Вы\y]^n", ++a, sName);
  354.             #if defined SUPERADMIN     
  355.                 else if(!superadmin && get_user_flags(plr) & ADMIN_IMMUNITY)
  356.             #else
  357.                 else if(get_user_flags(plr) & ADMIN_IMMUNITY)
  358.             #endif
  359.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rImmunity\y]^n", ++a, sName);
  360.                 else
  361.                 {
  362.                     iKeys |= (1 << a++);
  363.                    
  364.                     if(GetBit(g_bitBlockChats, plr))
  365.                         iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s \d[\yUngag\d]^n", a, sName);
  366.                     else    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s%s^n", a, sName, VTC_IsClientSpeaking(plr) ? " \d[\rSpeaking\d]" : "");
  367.                 }
  368.             }
  369.        
  370.             if(!g_BlockTimes[g_iMenuInfo[id][SelectTime]])
  371.                 iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r8. \wGag\d'\wнуть \rнавсегда^n^n");
  372.             else    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r8. \wGag\d'\wнуть на \y%d \wмин^n^n", g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
  373.         }
  374.         case MUTE:
  375.         {
  376.             for(new i = start, sName[32], plr, a; i < end; ++i)
  377.             {  
  378.                 plr = g_arrPlayers[id][i];
  379.                 get_user_name(plr, sName, charsmax(sName));
  380.  
  381.                 if(id == plr)
  382.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rЭто Вы\y]^n", ++a, sName);
  383.                 else
  384.                 {
  385.                     iKeys |= (1 << a++);
  386.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s%s^n", a, sName, g_iMutePlayer[id][plr] ? " \d[\yMuted\d]" : "");
  387.                 }
  388.             }
  389.        
  390.             iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r7. \wЗаглушить \rвсех^n\r8. \wСнять Mute со \rвсех^n^n");
  391.         }
  392.     }
  393.  
  394.     if(end != pnum)
  395.     {
  396.         formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r9. \yДалее^n\r0. \r%s", iPos ? "Назад" : "Выход");
  397.         iKeys |= MENU_KEY_9;
  398.     }
  399.     else formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r0. \r%s", iPos ? "Назад" : "Выход");
  400.  
  401.     show_menu(id, iKeys, sMenu, -1, "AdvGag Menu");
  402.     return PLUGIN_HANDLED;
  403. }
  404.  
  405. public MenuHandler(id, iKey)
  406. {
  407.     switch(iKey)
  408.     {
  409.         case 6:
  410.         {
  411.             switch(g_iMenuInfo[id][Menu])
  412.             {
  413.                 case GAG:
  414.                 {
  415.                     GagHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 7 + iKey], g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
  416.                 }
  417.                 case MUTE:
  418.                 {
  419.                     arrayset(g_iMutePlayer[id], 1, sizeof g_iMutePlayer[]);
  420.                     ChatColor(id, 0, MSG_MUTE_ALL_PLAYERS, PREFIX);
  421.                 }
  422.             }
  423.         }
  424.         case 7:
  425.         {
  426.             switch(g_iMenuInfo[id][Menu])
  427.             {
  428.                 case GAG:
  429.                 {
  430.                     if(++g_iMenuInfo[id][SelectTime] > charsmax(g_BlockTimes))
  431.                         g_iMenuInfo[id][SelectTime] = 0;
  432.                    
  433.                     ShowMenu(id, g_iMenuInfo[id][Pos]);
  434.                 }
  435.                 case MUTE:
  436.                 {
  437.                     arrayset(g_iMutePlayer[id], 0, sizeof g_iMutePlayer[]);
  438.                     ChatColor(id, 0, MSG_UNMUTE_ALL_PLAYERS, PREFIX);
  439.                 }
  440.             }
  441.         }
  442.         case 8: ShowMenu(id, ++g_iMenuInfo[id][Pos]);
  443.         case 9:
  444.         {
  445.             if(g_iMenuInfo[id][Pos])
  446.                 ShowMenu(id, --g_iMenuInfo[id][Pos]);
  447.         }
  448.         default:
  449.         {
  450.             switch(g_iMenuInfo[id][Menu])
  451.             {
  452.                 case GAG:
  453.                 {
  454.                     GagHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 7 + iKey], g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
  455.                 }
  456.                 case MUTE:
  457.                 {
  458.                     MuteHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 6 + iKey]);
  459.                 }
  460.             }
  461.         }
  462.     }
  463.     return PLUGIN_HANDLED;
  464. }
  465.  
  466. GagHandler(id, player, blocktime)
  467. {
  468.     if(!is_user_connected(player))
  469.     {
  470.         return;
  471.     }
  472.    
  473.     new sNameAdmin[32], sNamePlayer[32];
  474.     get_user_name(id, sNameAdmin, charsmax(sNameAdmin));
  475.     get_user_name(player, sNamePlayer, charsmax(sNamePlayer));
  476.  
  477.     if(GetBit(g_bitBlockChats, player))
  478.     {
  479.         UserBlock(player, 0);
  480.  
  481.         ChatColor(0, player, MSG_CHAT_UNBLOCK_ALL, PREFIX, sNamePlayer, sNameAdmin);
  482.         ChatColor(player, 0, MSG_CHAT_UNBLOCK_PL, PREFIX, sNamePlayer, sNameAdmin);
  483.     }
  484.     else
  485.     {
  486.         UserBlock(player, 1, blocktime);
  487.  
  488.         new blocktimeinfo[32];
  489.         if(!blocktime)
  490.             formatex(blocktimeinfo, charsmax(blocktimeinfo), "навсегда");
  491.         else    formatex(blocktimeinfo, charsmax(blocktimeinfo), "на %d минут", blocktime);
  492.  
  493.         ChatColor(0, player, MSG_CHAT_BLOCK_ALL, PREFIX, sNameAdmin, sNamePlayer, blocktimeinfo);
  494.         ChatColor(player, 0, MSG_CHAT_BLOCK_PL, PREFIX, sNamePlayer, sNameAdmin, blocktimeinfo);
  495.     }
  496.     ShowMenu(id, g_iMenuInfo[id][Pos]);
  497. }
  498.  
  499. MuteHandler(id, player)
  500. {
  501.     if(!is_user_connected(player))
  502.     {
  503.         return;
  504.     }
  505.    
  506.     new sNamePlayer[32];
  507.     get_user_name(player, sNamePlayer, charsmax(sNamePlayer));
  508.  
  509.     g_iMutePlayer[id][player] = !g_iMutePlayer[id][player];
  510.     ChatColor(id, 0, g_iMutePlayer[id][player] ? MSG_MUTE_PLAYER : MSG_UNMUTE_PLAYER, PREFIX, sNamePlayer);
  511.    
  512.     ShowMenu(id, g_iMenuInfo[id][Pos]);
  513. }
  514.  
  515. UserBlock(id, block, btime = 0)
  516. {
  517.     if(block)
  518.     {
  519.         g_aLoadedData[id][BLOCKTIME] = !btime ? 0 : get_systime() + btime * 60;
  520.  
  521.         ArrayPushArray(g_aUsersBlocked, g_aLoadedData[id]);
  522.         SetBit(g_bitBlockChats, id);
  523.         VTC_MuteClient(id);
  524.         client_cmd(id, "-voicerecord");     // типа отключаем войс, ога
  525.     }
  526.     else    IsUserBlocked(id, g_aLoadedData[id][IP], g_aLoadedData[id][STEAMID], 1);
  527. }
  528.  
  529. IsUserBlocked(id, const Ip[], const SteamID[], UnBlock = 0)
  530. {
  531.     new i, aSize = ArraySize(g_aUsersBlocked), sys = get_systime();
  532.    
  533.     if(UnBlock)
  534.     {
  535.         for(i = 0; i < aSize; ++i)
  536.         {
  537.             ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  538.             if(strcmp(g_arrData[IP], Ip) == 0 || strcmp(g_arrData[STEAMID], SteamID) == 0)
  539.             {
  540.                 ArrayDeleteItem(g_aUsersBlocked, i);
  541.                 ResetBit(g_bitBlockChats, id);
  542.                 VTC_UnmuteClient(id);
  543.                 break;
  544.             }
  545.         }
  546.     }
  547.     else
  548.     {
  549.         for(i = 0; i < aSize; ++i)
  550.         {
  551.             ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  552.             if(strcmp(g_arrData[IP], Ip) == 0 || strcmp(g_arrData[STEAMID], SteamID) == 0)
  553.             {
  554.                 if(!g_arrData[BLOCKTIME] || g_arrData[BLOCKTIME] > sys)
  555.                 {
  556.                     g_aLoadedData[id][BLOCKTIME] = g_arrData[BLOCKTIME];
  557.                     return i;
  558.                 }
  559.                 else    ArrayDeleteItem(g_aUsersBlocked, i);
  560.  
  561.                 break;
  562.             }
  563.         }
  564.     }
  565.     return -1;
  566. }
  567.  
  568. public plugin_end()
  569. {
  570.     if(file_exists(STORAGE))
  571.         unlink(STORAGE);
  572.    
  573.     new aSize, fp = fopen(STORAGE, "w+");
  574.     if(!fprintf(fp, "; File generated by Advanced Gag [v %s][neygomon | https://neugomon.ru/threads/91/]^n^n", VERSION))
  575.     {
  576.         new err[128]; formatex(err, charsmax(err), "Plugin not write file %s! Users not saved!", STORAGE);
  577.         set_fail_state(err);
  578.     }
  579.  
  580.     aSize = ArraySize(g_aUsersBlocked);
  581.     for(new i; i < aSize; ++i)
  582.     {
  583.         ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  584.         fprintf(fp, "^"%s^" ^"%s^" ^"%d^"^n", g_arrData[IP], g_arrData[STEAMID], g_arrData[BLOCKTIME]);
  585.     }
  586.    
  587.     if(aSize)
  588.     {
  589.         log_amx("Successfully saved %d items in %s :)", aSize, STORAGE);
  590.     }
  591.    
  592.     fclose(fp);
  593.     ArrayDestroy(g_aUsersBlocked);
  594.     TrieDestroy(g_tAllowCmds);
  595. }
  596.  
  597. stock ChatColor(id, id2, const szMessage[], any:...)
  598. {
  599.     new szMsg[190];
  600.     vformat(szMsg, charsmax(szMsg), szMessage, 4);
  601.    
  602.     if(id && id != id2)
  603.     {
  604.         client_print_color(id, print_team_default, szMsg);
  605.     }
  606.     else
  607.     {
  608.         get_players(pl, pnum, "c");
  609.         for(new i; i < pnum; ++i)
  610.         {
  611.             if(pl[i] != id2)
  612.             {
  613.                 client_print_color(pl[i], print_team_default, szMsg);
  614.             }
  615.         }
  616.     }
  617. }

_________________
„Nem azért felejtünk el játszani, mert megöregszünk, hanem attól öregszünk meg, hogy elfelejtünk játszani.”

-MAXHACKED Website-
-HERViD Website-
► Spoiler mutatása


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Advanced gag
HozzászólásElküldve: 2017.10.30. 10:11 
Offline
Jómunkásember

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!

  1. // *************************************************************************************//
  2. // Плагин загружен с  www.neugomon.ru                                                   //
  3. // Автор: Neygomon  [ https://neugomon.ru/members/1/ ]                                  //
  4. // Официальная тема поддержки: https://neugomon.ru/threads/91/                          //
  5. // При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
  6. // *************************************************************************************//
  7.  
  8. #include <amxmodx>
  9. #tryinclude <reapi>
  10. #if !defined _reapi_included
  11.     #include <VtcApi>
  12. #endif
  13. #if AMXX_VERSION_NUM < 183
  14.     #include <colorchat>
  15. #endif
  16.  
  17. #define SORRY               // Разрешить команду /sorry для извинения игроков
  18. #define MUTEMENU            // Поддержка команды /mute
  19. #define GAG_ACCESS  ADMIN_BAN   // Доступ к функциям гага
  20. #define SORRYTIME   60      // Как часто можно пользоваться командой /sorry. Время в секундах
  21. #define PREFIX      "AMX Gag"   // Префикс в чате
  22. #define SUPERADMIN  ADMIN_RCON  // Админ с флагом L может гагать других админов с иммунитетом
  23.  
  24. new g_BlockTimes[] =    // Время блокировки в минутах
  25. {
  26.     5,
  27.     10,
  28.     30,
  29.     60,
  30.     180,
  31.     0 // навсегда
  32. }
  33.  
  34. new g_AllowCommands[][] = // Разрешенные команды
  35. {
  36.     "/me",
  37.     "/top15",
  38.     "/rank",
  39.     "/hp"
  40. }
  41.  
  42. /* Словарь плагина */
  43. #define MSG_SORRY_FLOOD     "^1[^4%s^1] ^3Прекратите флудить! ^4Повторно извиниться можно через ^3%d сек"
  44. #define MSG_SORRY_ADMIN     "^1[^4%s^1] ^4Уважаемый ^3адмнистратор^4, игрок ^3%s ^4просит снять с него ^3GAG^4!"
  45. #define MSG_CHAT_IS_BLOCKED     "^1[^4%s^1] ^4Уважаемый ^3%s^4, Ваш чат ^3заблокирован^4!"
  46. #define MSG_BLOCK_EXPIRED_TIME  "^1[^4%s^1] ^4До разблокировки осталось ^1примерно ^3%d ^4мин."
  47. #define MSG_BLOCK_EXPIRED   "^1[^4%s^1] ^4Время блокировки ^3истекло^4. ^1Подождите обновления информации ..."
  48. #define MSG_SAY_SORRY       "^1[^4%s^1] ^4Чтобы извиниться, напишите в чат ^3/sorry^4. Возможно, разблокируют раньше :)"
  49. #define MSG_CHAT_UNBLOCK_ALL    "^1[^4%s^1] ^4Игроку ^3%s ^4был разблокирован чат администратором ^3%s"
  50. #define MSG_CHAT_UNBLOCK_PL     "^1[^4%s^1] ^4Уважаемый ^3%s^4, администратор ^3%s ^4снял с Вас блокировку чата"
  51. #define MSG_CHAT_BLOCK_ALL  "^1[^4%s^1] ^4Администратор ^3%s ^4заблокировал чат игроку ^3%s ^1%s"
  52. #define MSG_CHAT_BLOCK_PL   "^1[^4%s^1] ^4Уважаемый ^3%s^4, администратор ^3%s ^4заблокировал Вам чат ^1%s"
  53. #define MSG_MUTE_ALL_PLAYERS    "^1[^4%s^1] ^4Вы установили mute на ^3всех ^4игроков."
  54. #define MSG_UNMUTE_ALL_PLAYERS  "^1[^4%s^1] ^4Вы сняли mute со ^3всех ^4игроков."
  55. #define MSG_UNMUTE_PLAYER   "^1[^4%s^1] ^4Вы сняли ^3mute ^4с игрока ^3%s^4."
  56. #define MSG_MUTE_PLAYER     "^1[^4%s^1] ^4Вы установили ^3mute ^4на игрока ^3%s^4."
  57.  
  58. /* Технические данные */
  59. #if defined MUTEMENU
  60.     #include <fakemeta>
  61. #endif
  62.  
  63. #define STORAGE     "addons/amxmodx/data/amx_gag.dat"
  64. #define MAX_ITEMS   1000
  65. #if !defined MAX_PLAYERS
  66.     const MAX_PLAYERS = 32;
  67. #endif
  68. #define GetBit(%1,%2)   (%1 & (1 << (%2 & 31)))
  69. #define SetBit(%1,%2)   %1 |= (1 << (%2 & 31))
  70. #define ResetBit(%1,%2) %1 &= ~(1 << (%2 & 31))
  71.  
  72. enum _:DATA
  73. {
  74.     IP[16],
  75.     STEAMID[25],
  76.     BLOCKTIME
  77. };
  78. enum MENUS
  79. {
  80.     GAG,
  81.     MUTE
  82. };
  83. enum _:MENU_SETTINGS
  84. {
  85.     Menu,
  86.     SelectTime,
  87.     Pos
  88. };
  89.  
  90. new g_bitBlockChats;
  91. new g_aLoadedData[MAX_PLAYERS + 1][DATA];
  92. new Trie:g_tAllowCmds, Array:g_aUsersBlocked;
  93. new g_arrData[DATA];
  94. new pl[MAX_PLAYERS], pnum;
  95. new g_iMutePlayer[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
  96. new g_arrPlayers[MAX_PLAYERS + 1][MAX_PLAYERS];
  97. new g_iMenuInfo[MAX_PLAYERS + 1][MENU_SETTINGS];
  98.  
  99. public plugin_init()
  100. {
  101. #define VERSION "1.9.0"
  102.     register_plugin("Advanced Gag", VERSION, "neygomon");
  103.     register_cvar("adv_gag", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
  104. #if defined _reapi_included
  105.     if(has_vtc())
  106.     {
  107.         register_clcmd("amx_gagmenu", "ClCmdGagMenu");
  108.     }
  109.     #if !defined MUTEMENU
  110.     else    set_fail_state("Needed meta plugin VTC [https://neugomon.ru/threads/257/]");
  111.     #endif
  112. #else
  113.     register_clcmd("amx_gagmenu", "ClCmdGagMenu");
  114. #endif
  115. #if defined MUTEMENU
  116.     register_clcmd("say /mute", "ClCmdMuteMenu");
  117.     register_clcmd("say_team /mute", "ClCmdMuteMenu");
  118.    
  119.     register_forward(FM_Voice_SetClientListening, "SetClientListening_Pre", false);
  120. #endif
  121. #if defined SORRY
  122.     register_clcmd("say /sorry", "SaySorry");
  123.     register_clcmd("say_team /sorry", "SaySorry");
  124. #endif
  125.     register_clcmd("say", "SayChat");
  126.     register_clcmd("say_team", "SayChat");
  127.    
  128.     register_srvcmd("adv_flush_gags", "SrvCmdFlush");
  129.    
  130.     register_menucmd(register_menuid("AdvGag Menu"), 1023, "MenuHandler");
  131.    
  132.     set_task(60.0, "CheckBlockedUsers", .flags = "b");
  133. }
  134.  
  135. public plugin_cfg()
  136. {
  137.     g_aUsersBlocked = ArrayCreate(DATA);
  138.    
  139.     new fp = fopen(STORAGE, "rt");
  140.     if(fp)
  141.     {
  142.         new i, blocktime[15], buffer[128];
  143.         new sys = get_systime();
  144.  
  145.         while(!feof(fp) && i < MAX_ITEMS)
  146.         {
  147.             fgets(fp, buffer, charsmax(buffer));
  148.             trim(buffer);
  149.            
  150.             if(buffer[0] == EOS || buffer[0] == ';')
  151.                 continue;
  152.            
  153.             if(parse(buffer,
  154.                     g_arrData[IP], charsmax(g_arrData[IP]),
  155.                     g_arrData[STEAMID], charsmax(g_arrData[STEAMID]),
  156.                     blocktime, charsmax(blocktime)
  157.                 )
  158.             )
  159.             {
  160.                 g_arrData[BLOCKTIME] = str_to_num(blocktime);
  161.                 if(!g_arrData[BLOCKTIME] || g_arrData[BLOCKTIME] > sys)
  162.                 {
  163.                     ArrayPushArray(g_aUsersBlocked, g_arrData);
  164.                     i++;
  165.                 }  
  166.             }
  167.         }
  168.         fclose(fp);
  169.     }
  170.  
  171.     g_tAllowCmds = TrieCreate();
  172.     for(new i; i < sizeof g_AllowCommands; ++i)
  173.         TrieSetCell(g_tAllowCmds, g_AllowCommands[i], i);
  174. }
  175.  
  176. public client_putinserver(id)
  177. {
  178.     if(!is_user_bot(id) && !is_user_hltv(id))
  179.     {
  180.         get_user_ip(id, g_aLoadedData[id][IP], charsmax(g_aLoadedData[][IP]), 1);
  181.         get_user_authid(id, g_aLoadedData[id][STEAMID], charsmax(g_aLoadedData[][STEAMID]));
  182.        
  183.         if(IsUserBlocked(id, g_aLoadedData[id][IP], g_aLoadedData[id][STEAMID]) != -1)
  184.         {
  185.             VTC_MuteClient(id);
  186.             SetBit(g_bitBlockChats, id);
  187.         }
  188.         else    ResetBit(g_bitBlockChats, id);
  189.        
  190.         arrayset(g_iMutePlayer[id], 0, sizeof g_iMutePlayer[]);
  191.     }
  192. }
  193. #if defined MUTEMENU
  194. public SetClientListening_Pre(iReciever, iSender)
  195. {
  196.     if(iSender != iReciever)
  197.     {
  198.         if(g_iMutePlayer[iReciever][iSender])
  199.         {  
  200.             engfunc(EngFunc_SetClientListening, iReciever, iSender, false);
  201.             forward_return(FMV_CELL, false);
  202.             return FMRES_SUPERCEDE;
  203.         }  
  204.     }
  205.     return FMRES_IGNORED;
  206. }
  207. #endif
  208. public SaySorry(id)
  209. {
  210.     if(GetBit(g_bitBlockChats, id))
  211.     {
  212.         static iFloodTime[33], systime;
  213.         if(iFloodTime[id] > (systime = get_systime()))
  214.             ChatColor(id, 0, MSG_SORRY_FLOOD, PREFIX, iFloodTime[id] - systime);
  215.         else
  216.         {
  217.             new sName[32];
  218.             get_user_name(id, sName, charsmax(sName));
  219.  
  220.             get_players(pl, pnum, "ch");
  221.             for(new i; i < pnum; ++i)
  222.             {
  223.                 if(get_user_flags(pl[i]) & GAG_ACCESS)
  224.                     ChatColor(pl[i], 0, MSG_SORRY_ADMIN, PREFIX, sName);
  225.             }
  226.  
  227.             iFloodTime[id] = systime + SORRYTIME;
  228.         }
  229.     }
  230.     return PLUGIN_HANDLED;
  231. }
  232. public SayChat(id)
  233. {
  234.     if(!GetBit(g_bitBlockChats, id))
  235.         return PLUGIN_CONTINUE;
  236.  
  237.     new sMessage[128];
  238.     read_args(sMessage, charsmax(sMessage));
  239.     remove_quotes(sMessage);
  240.  
  241.     if(TrieKeyExists(g_tAllowCmds, sMessage))
  242.         return PLUGIN_CONTINUE;
  243.     else
  244.     {
  245.         new sName[32], ost;
  246.         get_user_name(id, sName, charsmax(sName));
  247.         ChatColor(id, 0, MSG_CHAT_IS_BLOCKED, PREFIX, sName);
  248.        
  249.         if(g_aLoadedData[id][BLOCKTIME])
  250.         {
  251.             if((ost = g_aLoadedData[id][BLOCKTIME] - get_systime()) / 60 > 0)
  252.                 ChatColor(id, 0, MSG_BLOCK_EXPIRED_TIME, PREFIX, ost / 60);
  253.             else    ChatColor(id, 0, MSG_BLOCK_EXPIRED, PREFIX);
  254.         }
  255.        
  256.         ChatColor(id, 0, MSG_SAY_SORRY, PREFIX);
  257.     }
  258.     return PLUGIN_HANDLED;
  259. }
  260.  
  261. public SrvCmdFlush()
  262. {
  263.     ArrayClear(g_aUsersBlocked);
  264.     log_amx("Advanced Gag [v %s] flush gags", VERSION);
  265.    
  266.     for(new id; id < sizeof g_aLoadedData; ++id)
  267.     {
  268.         arrayset(g_aLoadedData[id], 0, sizeof g_aLoadedData[]);
  269.         ResetBit(g_bitBlockChats, id);
  270.     }
  271. }
  272.  
  273. public CheckBlockedUsers()
  274. {
  275.     if(ArraySize(g_aUsersBlocked))
  276.     {
  277.         get_players(pl, pnum)
  278.        
  279.         for(new i, sys = get_systime(); i < pnum; ++i)
  280.         {
  281.             if(g_aLoadedData[pl[i]][BLOCKTIME] && sys > g_aLoadedData[pl[i]][BLOCKTIME])
  282.                 UserBlock(pl[i], 0);
  283.         }
  284.     }
  285. }
  286.  
  287. public ClCmdGagMenu(id)
  288. {
  289.     if(get_user_flags(id) & GAG_ACCESS)
  290.     {
  291.         g_iMenuInfo[id][SelectTime] = 0;
  292.         g_iMenuInfo[id][Pos] = 0;
  293.         g_iMenuInfo[id][Menu] = any:GAG;
  294.        
  295.         ShowMenu(id, 0);
  296.     }  
  297.    
  298.     return PLUGIN_HANDLED;
  299. }
  300.  
  301. public ClCmdMuteMenu(id)
  302. {
  303.     g_iMenuInfo[id][Pos] = 0;
  304.     g_iMenuInfo[id][Menu] = any:MUTE;
  305.  
  306.     ShowMenu(id, 0);
  307.     return PLUGIN_HANDLED;
  308. }
  309.  
  310. ShowMenu(id, iPos)
  311. {
  312.     new start, end;
  313.     new iLen, sMenu[512];
  314.     new iKeys = MENU_KEY_0|MENU_KEY_8;
  315.     get_players(g_arrPlayers[id], pnum, "ch");
  316.    
  317.     switch(g_iMenuInfo[id][Menu])
  318.     {
  319.         case GAG:
  320.         {
  321.             start = iPos * 7;
  322.             end   = start + 7;
  323.             iLen  = formatex(sMenu, charsmax(sMenu), "\d[\rAMX Gag\d] \yВыберите игрока\w\R%d/%d^n^n", iPos + 1, (pnum / 7 + ((pnum % 7) ? 1 : 0)));
  324.         }
  325.         case MUTE:
  326.         {
  327.             start = iPos * 6;
  328.             end   = start + 6;
  329.             iKeys |= MENU_KEY_7;
  330.             iLen  = formatex(sMenu, charsmax(sMenu), "\d[\rMute\d] \yВыберите игрока\w\R%d/%d^n^n", iPos + 1, (pnum / 6 + ((pnum % 6) ? 1 : 0)));
  331.         }
  332.     }
  333.    
  334.     if(start >= pnum)
  335.         start = iPos = g_iMenuInfo[id][Pos] = 0;
  336.     if(end > pnum)
  337.         end = pnum;
  338.    
  339.     switch(g_iMenuInfo[id][Menu])
  340.     {
  341.         case GAG:
  342.         {
  343.         #if defined SUPERADMIN
  344.             for(new i = start, bool:superadmin = bool:(get_user_flags(id) & SUPERADMIN), sName[32], plr, a; i < end; ++i)
  345.         #else
  346.             for(new i = start, sName[32], plr, a; i < end; ++i)
  347.         #endif
  348.             {  
  349.                 plr = g_arrPlayers[id][i];
  350.                 get_user_name(plr, sName, charsmax(sName));
  351.  
  352.                 if(id == plr)
  353.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rЭто Вы\y]^n", ++a, sName);
  354.             #if defined SUPERADMIN     
  355.                 else if(!superadmin && get_user_flags(plr) & ADMIN_IMMUNITY)
  356.             #else
  357.                 else if(get_user_flags(plr) & ADMIN_IMMUNITY)
  358.             #endif
  359.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rImmunity\y]^n", ++a, sName);
  360.                 else
  361.                 {
  362.                     iKeys |= (1 << a++);
  363.                    
  364.                     if(GetBit(g_bitBlockChats, plr))
  365.                         iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s \d[\yUngag\d]^n", a, sName);
  366.                     else    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s%s^n", a, sName, VTC_IsClientSpeaking(plr) ? " \d[\rSpeaking\d]" : "");
  367.                 }
  368.             }
  369.        
  370.             if(!g_BlockTimes[g_iMenuInfo[id][SelectTime]])
  371.                 iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r8. \wGag\d'\wнуть \rнавсегда^n^n");
  372.             else    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r8. \wGag\d'\wнуть на \y%d \wмин^n^n", g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
  373.         }
  374.         case MUTE:
  375.         {
  376.             for(new i = start, sName[32], plr, a; i < end; ++i)
  377.             {  
  378.                 plr = g_arrPlayers[id][i];
  379.                 get_user_name(plr, sName, charsmax(sName));
  380.  
  381.                 if(id == plr)
  382.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rЭто Вы\y]^n", ++a, sName);
  383.                 else
  384.                 {
  385.                     iKeys |= (1 << a++);
  386.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s%s^n", a, sName, g_iMutePlayer[id][plr] ? " \d[\yMuted\d]" : "");
  387.                 }
  388.             }
  389.        
  390.             iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r7. \wЗаглушить \rвсех^n\r8. \wСнять Mute со \rвсех^n^n");
  391.         }
  392.     }
  393.  
  394.     if(end != pnum)
  395.     {
  396.         formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r9. \yДалее^n\r0. \r%s", iPos ? "Назад" : "Выход");
  397.         iKeys |= MENU_KEY_9;
  398.     }
  399.     else formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r0. \r%s", iPos ? "Назад" : "Выход");
  400.  
  401.     show_menu(id, iKeys, sMenu, -1, "AdvGag Menu");
  402.     return PLUGIN_HANDLED;
  403. }
  404.  
  405. public MenuHandler(id, iKey)
  406. {
  407.     switch(iKey)
  408.     {
  409.         case 6:
  410.         {
  411.             switch(g_iMenuInfo[id][Menu])
  412.             {
  413.                 case GAG:
  414.                 {
  415.                     GagHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 7 + iKey], g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
  416.                 }
  417.                 case MUTE:
  418.                 {
  419.                     arrayset(g_iMutePlayer[id], 1, sizeof g_iMutePlayer[]);
  420.                     ChatColor(id, 0, MSG_MUTE_ALL_PLAYERS, PREFIX);
  421.                 }
  422.             }
  423.         }
  424.         case 7:
  425.         {
  426.             switch(g_iMenuInfo[id][Menu])
  427.             {
  428.                 case GAG:
  429.                 {
  430.                     if(++g_iMenuInfo[id][SelectTime] > charsmax(g_BlockTimes))
  431.                         g_iMenuInfo[id][SelectTime] = 0;
  432.                    
  433.                     ShowMenu(id, g_iMenuInfo[id][Pos]);
  434.                 }
  435.                 case MUTE:
  436.                 {
  437.                     arrayset(g_iMutePlayer[id], 0, sizeof g_iMutePlayer[]);
  438.                     ChatColor(id, 0, MSG_UNMUTE_ALL_PLAYERS, PREFIX);
  439.                 }
  440.             }
  441.         }
  442.         case 8: ShowMenu(id, ++g_iMenuInfo[id][Pos]);
  443.         case 9:
  444.         {
  445.             if(g_iMenuInfo[id][Pos])
  446.                 ShowMenu(id, --g_iMenuInfo[id][Pos]);
  447.         }
  448.         default:
  449.         {
  450.             switch(g_iMenuInfo[id][Menu])
  451.             {
  452.                 case GAG:
  453.                 {
  454.                     GagHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 7 + iKey], g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
  455.                 }
  456.                 case MUTE:
  457.                 {
  458.                     MuteHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 6 + iKey]);
  459.                 }
  460.             }
  461.         }
  462.     }
  463.     return PLUGIN_HANDLED;
  464. }
  465.  
  466. GagHandler(id, player, blocktime)
  467. {
  468.     if(!is_user_connected(player))
  469.     {
  470.         return;
  471.     }
  472.    
  473.     new sNameAdmin[32], sNamePlayer[32];
  474.     get_user_name(id, sNameAdmin, charsmax(sNameAdmin));
  475.     get_user_name(player, sNamePlayer, charsmax(sNamePlayer));
  476.  
  477.     if(GetBit(g_bitBlockChats, player))
  478.     {
  479.         UserBlock(player, 0);
  480.  
  481.         ChatColor(0, player, MSG_CHAT_UNBLOCK_ALL, PREFIX, sNamePlayer, sNameAdmin);
  482.         ChatColor(player, 0, MSG_CHAT_UNBLOCK_PL, PREFIX, sNamePlayer, sNameAdmin);
  483.     }
  484.     else
  485.     {
  486.         UserBlock(player, 1, blocktime);
  487.  
  488.         new blocktimeinfo[32];
  489.         if(!blocktime)
  490.             formatex(blocktimeinfo, charsmax(blocktimeinfo), "навсегда");
  491.         else    formatex(blocktimeinfo, charsmax(blocktimeinfo), "на %d минут", blocktime);
  492.  
  493.         ChatColor(0, player, MSG_CHAT_BLOCK_ALL, PREFIX, sNameAdmin, sNamePlayer, blocktimeinfo);
  494.         ChatColor(player, 0, MSG_CHAT_BLOCK_PL, PREFIX, sNamePlayer, sNameAdmin, blocktimeinfo);
  495.     }
  496.     ShowMenu(id, g_iMenuInfo[id][Pos]);
  497. }
  498.  
  499. MuteHandler(id, player)
  500. {
  501.     if(!is_user_connected(player))
  502.     {
  503.         return;
  504.     }
  505.    
  506.     new sNamePlayer[32];
  507.     get_user_name(player, sNamePlayer, charsmax(sNamePlayer));
  508.  
  509.     g_iMutePlayer[id][player] = !g_iMutePlayer[id][player];
  510.     ChatColor(id, 0, g_iMutePlayer[id][player] ? MSG_MUTE_PLAYER : MSG_UNMUTE_PLAYER, PREFIX, sNamePlayer);
  511.    
  512.     ShowMenu(id, g_iMenuInfo[id][Pos]);
  513. }
  514.  
  515. UserBlock(id, block, btime = 0)
  516. {
  517.     if(block)
  518.     {
  519.         g_aLoadedData[id][BLOCKTIME] = !btime ? 0 : get_systime() + btime * 60;
  520.  
  521.         ArrayPushArray(g_aUsersBlocked, g_aLoadedData[id]);
  522.         SetBit(g_bitBlockChats, id);
  523.         VTC_MuteClient(id);
  524.         client_cmd(id, "-voicerecord");     // типа отключаем войс, ога
  525.     }
  526.     else    IsUserBlocked(id, g_aLoadedData[id][IP], g_aLoadedData[id][STEAMID], 1);
  527. }
  528.  
  529. IsUserBlocked(id, const Ip[], const SteamID[], UnBlock = 0)
  530. {
  531.     new i, aSize = ArraySize(g_aUsersBlocked), sys = get_systime();
  532.    
  533.     if(UnBlock)
  534.     {
  535.         for(i = 0; i < aSize; ++i)
  536.         {
  537.             ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  538.             if(strcmp(g_arrData[IP], Ip) == 0 || strcmp(g_arrData[STEAMID], SteamID) == 0)
  539.             {
  540.                 ArrayDeleteItem(g_aUsersBlocked, i);
  541.                 ResetBit(g_bitBlockChats, id);
  542.                 VTC_UnmuteClient(id);
  543.                 break;
  544.             }
  545.         }
  546.     }
  547.     else
  548.     {
  549.         for(i = 0; i < aSize; ++i)
  550.         {
  551.             ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  552.             if(strcmp(g_arrData[IP], Ip) == 0 || strcmp(g_arrData[STEAMID], SteamID) == 0)
  553.             {
  554.                 if(!g_arrData[BLOCKTIME] || g_arrData[BLOCKTIME] > sys)
  555.                 {
  556.                     g_aLoadedData[id][BLOCKTIME] = g_arrData[BLOCKTIME];
  557.                     return i;
  558.                 }
  559.                 else    ArrayDeleteItem(g_aUsersBlocked, i);
  560.  
  561.                 break;
  562.             }
  563.         }
  564.     }
  565.     return -1;
  566. }
  567.  
  568. public plugin_end()
  569. {
  570.     if(file_exists(STORAGE))
  571.         unlink(STORAGE);
  572.    
  573.     new aSize, fp = fopen(STORAGE, "w+");
  574.     if(!fprintf(fp, "; File generated by Advanced Gag [v %s][neygomon | https://neugomon.ru/threads/91/]^n^n", VERSION))
  575.     {
  576.         new err[128]; formatex(err, charsmax(err), "Plugin not write file %s! Users not saved!", STORAGE);
  577.         set_fail_state(err);
  578.     }
  579.  
  580.     aSize = ArraySize(g_aUsersBlocked);
  581.     for(new i; i < aSize; ++i)
  582.     {
  583.         ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  584.         fprintf(fp, "^"%s^" ^"%s^" ^"%d^"^n", g_arrData[IP], g_arrData[STEAMID], g_arrData[BLOCKTIME]);
  585.     }
  586.    
  587.     if(aSize)
  588.     {
  589.         log_amx("Successfully saved %d items in %s :)", aSize, STORAGE);
  590.     }
  591.    
  592.     fclose(fp);
  593.     ArrayDestroy(g_aUsersBlocked);
  594.     TrieDestroy(g_tAllowCmds);
  595. }
  596.  
  597. stock ChatColor(id, id2, const szMessage[], any:...)
  598. {
  599.     new szMsg[190];
  600.     vformat(szMsg, charsmax(szMsg), szMessage, 4);
  601.    
  602.     if(id && id != id2)
  603.     {
  604.         client_print_color(id, print_team_default, szMsg);
  605.     }
  606.     else
  607.     {
  608.         get_players(pl, pnum, "c");
  609.         for(new i; i < pnum; ++i)
  610.         {
  611.             if(pl[i] != id2)
  612.             {
  613.                 client_print_color(pl[i], print_team_default, szMsg);
  614.             }
  615.         }
  616.     }
  617. }



Tessék! Ez most a végleges verzió! :)

  1. // *************************************************************************************//
  2. // Плагин загружен с  www.neugomon.ru                                                   //
  3. // Автор: Neygomon  [ https://neugomon.ru/members/1/ ]                                  //
  4. // Официальная тема поддержки: https://neugomon.ru/threads/91/                          //
  5. // При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
  6. // *************************************************************************************//
  7.  
  8. #include <amxmodx>
  9. #tryinclude <reapi>
  10.  
  11. #if !defined _reapi_included
  12.     #include <VtcApi>
  13. #endif
  14.  
  15. #if AMXX_VERSION_NUM < 183
  16.     #include <colorchat>
  17. #endif
  18.  
  19. #define SORRY               // EngedĂ©lyezze a / sorry parancsot, hogy bocsánatot kĂ©rjen a játĂ©kosoktĂłl
  20. #define MUTEMENU            // Támogatás / nĂ©mĂ­tás parancs
  21. #define GAG_ACCESS  ADMIN_LEVEL_A   // HozzáfĂ©rĂ©si jog funkciĂłkhoz
  22. #define SORRYTIME   60      // Milyen gyakran használhatja a / sorry parancsot. IdĹ‘ másodpercben
  23. #define PREFIX      "AMX Gag"   // CsevegĹ‘ elĹ‘tag
  24. #define SUPERADMIN  ADMIN_RCON  // Az adminisztrátor az L zászlĂłval megnevelhet más adminisztrátorokat
  25.  
  26. new g_BlockTimes[] =    // ido percekben
  27. {
  28.     15,
  29.     60,
  30.     180,
  31.     1440,
  32.     2880,
  33.     0 // навсегда
  34. }
  35.  
  36. new g_AllowCommands[][] = // Engedélyezett parancsok
  37. {
  38.     "/me",
  39.     "/top15",
  40.     "/rank",
  41.     "/hp",
  42.     "/menu",
  43.     "/rang",
  44.     "/qsound",
  45.     "/dmg",
  46.     "/maxdmg",
  47.     "/rs"
  48. }
  49.  
  50. /* Словарь плагина */
  51. #define MSG_SORRY_FLOOD     "^1[^4%s^1] ^3Chat letiltva! ^4Bocsanatot kerhetsz ^3%d masodperc mulva!"
  52. #define MSG_SORRY_ADMIN     "^1[^4%s^1] ^4Kedves ^3Admin^4, ^3%s jatekos ^4keri h vedd le a tiltast!"
  53. #define MSG_CHAT_IS_BLOCKED     "^1[^4%s^1] ^4Kedves ^3%s^4, a kommonukaciod ^3blokkoltuk^4!"
  54. #define MSG_BLOCK_EXPIRED_TIME  "^1[^4%s^1] ^4A tiltas feloldasa ^1 korulbelul ^3%d ^4 perc."
  55. #define MSG_BLOCK_EXPIRED   "^1[^4%s^1] ^4Blokkolasi ido ^3lejart^4. ^1Varja meg az informaciok frissiteset ..."
  56. #define MSG_SAY_SORRY       "^1[^4%s^1] ^4Bocsanat kereshez, ird say-be ^3/sorry^4. Remelhetoleg, oldjak a blokkolast :)"
  57. #define MSG_CHAT_UNBLOCK_ALL    "^1[^4%s^1] ^4A blokkolast ^3%s ^4jatekoson oldotta ^3%s admin."
  58. #define MSG_CHAT_UNBLOCK_PL     "^1[^4%s^1] ^4Kedves ^3%s^4,az admin ^3%s ^4oldotta a chat letiltasat"
  59. #define MSG_CHAT_BLOCK_ALL  "^1[^4%s^1] ^4Az admin ^3%s ^4blokkolta a kommonikaciot ^3%s ^1%s"
  60. #define MSG_CHAT_BLOCK_PL   "^1[^4%s^1] ^4Kedves ^3%s^4, az admin ^3%s ^4letiltotta a kommunikaciot ^1%s"
  61. #define MSG_MUTE_ALL_PLAYERS    "^1[^4%s^1] ^4Te letiltottad ^3az osszes jatekos ^4komminikaciojat."
  62. #define MSG_UNMUTE_ALL_PLAYERS  "^1[^4%s^1] ^4Te engedelyezted ^3az osszes jatekos ^4komminikaciojat."
  63. #define MSG_UNMUTE_PLAYER   "^1[^4%s^1] ^4Te engedelyezted ^3a kivalasztott jatekos ^4с kommunikaciojat: ^3%s^4."
  64. #define MSG_MUTE_PLAYER     "^1[^4%s^1] ^4Te letiltottad  ^3a kivalasztott jatekos ^4kommunikaciojat: ^3%s^4."
  65.  
  66. /* Технические данные */
  67. #if defined MUTEMENU
  68.     #include <fakemeta>
  69. #endif
  70.  
  71. #define STORAGE     "addons/amxmodx/data/amx_gag.dat"
  72. #define MAX_ITEMS   1000
  73. #if !defined MAX_PLAYERS
  74.     const MAX_PLAYERS = 32;
  75. #endif
  76. #define GetBit(%1,%2)   (%1 & (1 << (%2 & 31)))
  77. #define SetBit(%1,%2)   %1 |= (1 << (%2 & 31))
  78. #define ResetBit(%1,%2) %1 &= ~(1 << (%2 & 31))
  79.  
  80. enum _:DATA
  81. {
  82.     IP[16],
  83.     STEAMID[25],
  84.     BLOCKTIME
  85. };
  86. enum MENUS
  87. {
  88.     GAG,
  89.     MUTE
  90. };
  91. enum _:MENU_SETTINGS
  92. {
  93.     Menu,
  94.     SelectTime,
  95.     Pos
  96. };
  97.  
  98. new g_bitBlockChats;
  99. new g_aLoadedData[MAX_PLAYERS + 1][DATA];
  100. new Trie:g_tAllowCmds, Array:g_aUsersBlocked;
  101. new g_arrData[DATA];
  102. new pl[MAX_PLAYERS], pnum;
  103. new g_iMutePlayer[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
  104. new g_arrPlayers[MAX_PLAYERS + 1][MAX_PLAYERS];
  105. new g_iMenuInfo[MAX_PLAYERS + 1][MENU_SETTINGS];
  106.  
  107. public plugin_init()
  108. {
  109. #define VERSION "1.9.0"
  110.     register_plugin("Advanced Gag", VERSION, "neygomon");
  111.     register_cvar("adv_gag", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
  112. #if defined _reapi_included
  113.     if(has_vtc())
  114.     {
  115.         register_clcmd("amx_gagmenu", "ClCmdGagMenu");
  116.     }
  117.     #if !defined MUTEMENU
  118.     else    set_fail_state("Szukseges a VTC metaplugin [https://neugomon.ru/threads/257/]");
  119.     #endif
  120. #else
  121.     register_clcmd("amx_gagmenu", "ClCmdGagMenu");
  122. #endif
  123. #if defined MUTEMENU
  124.     register_clcmd("say /mute", "ClCmdMuteMenu");
  125.     register_clcmd("say_team /mute", "ClCmdMuteMenu");
  126.    
  127.     register_forward(FM_Voice_SetClientListening, "SetClientListening_Pre", false);
  128. #endif
  129. #if defined SORRY
  130.     register_clcmd("say /sorry", "SaySorry");
  131.     register_clcmd("say_team /sorry", "SaySorry");
  132. #endif
  133.     register_clcmd("say", "SayChat");
  134.     register_clcmd("say_team", "SayChat");
  135.    
  136.     register_srvcmd("adv_flush_gags", "SrvCmdFlush");
  137.    
  138.     register_menucmd(register_menuid("AdvGag Menu"), 1023, "MenuHandler");
  139.    
  140.     set_task(60.0, "CheckBlockedUsers", .flags = "b");
  141. }
  142.  
  143. public plugin_cfg()
  144. {
  145.     g_aUsersBlocked = ArrayCreate(DATA);
  146.    
  147.     new fp = fopen(STORAGE, "rt");
  148.     if(fp)
  149.     {
  150.         new i, blocktime[15], buffer[128];
  151.         new sys = get_systime();
  152.  
  153.         while(!feof(fp) && i < MAX_ITEMS)
  154.         {
  155.             fgets(fp, buffer, charsmax(buffer));
  156.             trim(buffer);
  157.            
  158.             if(buffer[0] == EOS || buffer[0] == ';')
  159.                 continue;
  160.            
  161.             if(parse(buffer,
  162.                     g_arrData[IP], charsmax(g_arrData[IP]),
  163.                     g_arrData[STEAMID], charsmax(g_arrData[STEAMID]),
  164.                     blocktime, charsmax(blocktime)
  165.                 )
  166.             )
  167.             {
  168.                 g_arrData[BLOCKTIME] = str_to_num(blocktime);
  169.                 if(!g_arrData[BLOCKTIME] || g_arrData[BLOCKTIME] > sys)
  170.                 {
  171.                     ArrayPushArray(g_aUsersBlocked, g_arrData);
  172.                     i++;
  173.                 }  
  174.             }
  175.         }
  176.         fclose(fp);
  177.     }
  178.  
  179.     g_tAllowCmds = TrieCreate();
  180.     for(new i; i < sizeof g_AllowCommands; ++i)
  181.         TrieSetCell(g_tAllowCmds, g_AllowCommands[i], i);
  182. }
  183.  
  184. public client_putinserver(id)
  185. {
  186.     if(!is_user_bot(id) && !is_user_hltv(id))
  187.     {
  188.         get_user_ip(id, g_aLoadedData[id][IP], charsmax(g_aLoadedData[][IP]), 1);
  189.         get_user_authid(id, g_aLoadedData[id][STEAMID], charsmax(g_aLoadedData[][STEAMID]));
  190.        
  191.         if(IsUserBlocked(id, g_aLoadedData[id][IP], g_aLoadedData[id][STEAMID]) != -1)
  192.         {
  193.             VTC_MuteClient(id);
  194.             SetBit(g_bitBlockChats, id);
  195.         }
  196.         else    ResetBit(g_bitBlockChats, id);
  197.        
  198.         arrayset(g_iMutePlayer[id], 0, sizeof g_iMutePlayer[]);
  199.     }
  200. }
  201. #if defined MUTEMENU
  202. public SetClientListening_Pre(iReciever, iSender)
  203. {
  204.     if(iSender != iReciever)
  205.     {
  206.         if(g_iMutePlayer[iReciever][iSender])
  207.         {  
  208.             engfunc(EngFunc_SetClientListening, iReciever, iSender, false);
  209.             forward_return(FMV_CELL, false);
  210.             return FMRES_SUPERCEDE;
  211.         }  
  212.     }
  213.     return FMRES_IGNORED;
  214. }
  215. #endif
  216. public SaySorry(id)
  217. {
  218.     if(GetBit(g_bitBlockChats, id))
  219.     {
  220.         static iFloodTime[33], systime;
  221.         if(iFloodTime[id] > (systime = get_systime()))
  222.             ChatColor(id, 0, MSG_SORRY_FLOOD, PREFIX, iFloodTime[id] - systime);
  223.         else
  224.         {
  225.             new sName[32];
  226.             get_user_name(id, sName, charsmax(sName));
  227.  
  228.             get_players(pl, pnum, "ch");
  229.             for(new i; i < pnum; ++i)
  230.             {
  231.                 if(get_user_flags(pl[i]) & GAG_ACCESS)
  232.                     ChatColor(pl[i], 0, MSG_SORRY_ADMIN, PREFIX, sName);
  233.             }
  234.  
  235.             iFloodTime[id] = systime + SORRYTIME;
  236.         }
  237.     }
  238.     return PLUGIN_HANDLED;
  239. }
  240. public SayChat(id)
  241. {
  242.     if(!GetBit(g_bitBlockChats, id))
  243.         return PLUGIN_CONTINUE;
  244.  
  245.     new sMessage[128];
  246.     read_args(sMessage, charsmax(sMessage));
  247.     remove_quotes(sMessage);
  248.  
  249.     if(TrieKeyExists(g_tAllowCmds, sMessage))
  250.         return PLUGIN_CONTINUE;
  251.     else
  252.     {
  253.         new sName[32], ost;
  254.         get_user_name(id, sName, charsmax(sName));
  255.         ChatColor(id, 0, MSG_CHAT_IS_BLOCKED, PREFIX, sName);
  256.        
  257.         if(g_aLoadedData[id][BLOCKTIME])
  258.         {
  259.             if((ost = g_aLoadedData[id][BLOCKTIME] - get_systime()) / 60 > 0)
  260.                 ChatColor(id, 0, MSG_BLOCK_EXPIRED_TIME, PREFIX, ost / 60);
  261.             else    ChatColor(id, 0, MSG_BLOCK_EXPIRED, PREFIX);
  262.         }
  263.        
  264.         ChatColor(id, 0, MSG_SAY_SORRY, PREFIX);
  265.     }
  266.     return PLUGIN_HANDLED;
  267. }
  268.  
  269. public SrvCmdFlush()
  270. {
  271.     ArrayClear(g_aUsersBlocked);
  272.     log_amx("Advanced Gag [v %s] flush gags", VERSION);
  273.    
  274.     for(new id; id < sizeof g_aLoadedData; ++id)
  275.     {
  276.         arrayset(g_aLoadedData[id], 0, sizeof g_aLoadedData[]);
  277.         ResetBit(g_bitBlockChats, id);
  278.     }
  279. }
  280.  
  281. public CheckBlockedUsers()
  282. {
  283.     if(ArraySize(g_aUsersBlocked))
  284.     {
  285.         get_players(pl, pnum)
  286.        
  287.         for(new i, sys = get_systime(); i < pnum; ++i)
  288.         {
  289.             if(g_aLoadedData[pl[i]][BLOCKTIME] && sys > g_aLoadedData[pl[i]][BLOCKTIME])
  290.                 UserBlock(pl[i], 0);
  291.         }
  292.     }
  293. }
  294.  
  295. public ClCmdGagMenu(id)
  296. {
  297.     if(get_user_flags(id) & GAG_ACCESS)
  298.     {
  299.         g_iMenuInfo[id][SelectTime] = 0;
  300.         g_iMenuInfo[id][Pos] = 0;
  301.         g_iMenuInfo[id][Menu] = any:GAG;
  302.        
  303.         ShowMenu(id, 0);
  304.     }  
  305.    
  306.     return PLUGIN_HANDLED;
  307. }
  308.  
  309. public ClCmdMuteMenu(id)
  310. {
  311.     g_iMenuInfo[id][Pos] = 0;
  312.     g_iMenuInfo[id][Menu] = any:MUTE;
  313.  
  314.     ShowMenu(id, 0);
  315.     return PLUGIN_HANDLED;
  316. }
  317.  
  318. ShowMenu(id, iPos)
  319. {
  320.     new start, end;
  321.     new iLen, sMenu[512];
  322.     new iKeys = MENU_KEY_0|MENU_KEY_8;
  323.     get_players(g_arrPlayers[id], pnum, "ch");
  324.    
  325.     switch(g_iMenuInfo[id][Menu])
  326.     {
  327.         case GAG:
  328.         {
  329.             start = iPos * 7;
  330.             end   = start + 7;
  331.             iLen  = formatex(sMenu, charsmax(sMenu), "\d[\rAMX Gag\d] \yKivalaszt\w\R%d/%d^n^n", iPos + 1, (pnum / 7 + ((pnum % 7) ? 1 : 0)));
  332.         }
  333.         case MUTE:
  334.         {
  335.             start = iPos * 6;
  336.             end   = start + 6;
  337.             iKeys |= MENU_KEY_7;
  338.             iLen  = formatex(sMenu, charsmax(sMenu), "\d[\rMute\d] \yKivalaszt\w\R%d/%d^n^n", iPos + 1, (pnum / 6 + ((pnum % 6) ? 1 : 0)));
  339.         }
  340.     }
  341.    
  342.     if(start >= pnum)
  343.         start = iPos = g_iMenuInfo[id][Pos] = 0;
  344.     if(end > pnum)
  345.         end = pnum;
  346.    
  347.     switch(g_iMenuInfo[id][Menu])
  348.     {
  349.         case GAG:
  350.         {
  351.         #if defined SUPERADMIN
  352.             for(new i = start, bool:superadmin = bool:(get_user_flags(id) & SUPERADMIN), sName[32], plr, a; i < end; ++i)
  353.         #else
  354.             for(new i = start, sName[32], plr, a; i < end; ++i)
  355.         #endif
  356.             {  
  357.                 plr = g_arrPlayers[id][i];
  358.                 get_user_name(plr, sName, charsmax(sName));
  359.  
  360.                 if(id == plr)
  361.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rEz te vagy\y]^n", ++a, sName);
  362.             #if defined SUPERADMIN     
  363.                 else if(!superadmin && get_user_flags(plr) & ADMIN_IMMUNITY)
  364.             #else
  365.                 else if(get_user_flags(plr) & ADMIN_IMMUNITY)
  366.             #endif
  367.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rImmunity\y]^n", ++a, sName);
  368.                 else
  369.                 {
  370.                     iKeys |= (1 << a++);
  371.                    
  372.                     if(GetBit(g_bitBlockChats, plr))
  373.                         iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s \d[\yFeloldas\d]^n", a, sName);
  374.                     else    iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s%s^n", a, sName, VTC_IsClientSpeaking(plr) ? " \d[\rSpeaking\d]" : "");
  375.                 }
  376.             }
  377.        
  378.             if(!g_BlockTimes[g_iMenuInfo[id][SelectTime]])
  379.                 iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r8. \wTiltas\d'\wki \rOrokre^n^n");
  380.             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]]);
  381.         }
  382.         case MUTE:
  383.         {
  384.             for(new i = start, sName[32], plr, a; i < end; ++i)
  385.             {  
  386.                 plr = g_arrPlayers[id][i];
  387.                 get_user_name(plr, sName, charsmax(sName));
  388.  
  389.                 if(id == plr)
  390.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \d%s \y[\rEz te vagy\y]^n", ++a, sName);
  391.                 else
  392.                 {
  393.                     iKeys |= (1 << a++);
  394.                     iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r%d. \w%s%s^n", a, sName, g_iMutePlayer[id][plr] ? " \d[\yMuted\d]" : "");
  395.                 }
  396.             }
  397.        
  398.             iLen += formatex(sMenu[iLen], charsmax(sMenu) - iLen, "^n\r7. \wNemit \rMindenki^n\r8. \wNemitas oldasa \rMindenki^n^n");
  399.         }
  400.     }
  401.  
  402.     if(end != pnum)
  403.     {
  404.         formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r9. \yTovabb^n\r0. \r%s", iPos ? "Vissza" : "Kilepes");
  405.         iKeys |= MENU_KEY_9;
  406.     }
  407.     else formatex(sMenu[iLen], charsmax(sMenu) - iLen, "\r0. \r%s", iPos ? "Vissza" : "Kilepes");
  408.  
  409.     show_menu(id, iKeys, sMenu, -1, "AdvGag Menu");
  410.     return PLUGIN_HANDLED;
  411. }
  412.  
  413. public MenuHandler(id, iKey)
  414. {
  415.     switch(iKey)
  416.     {
  417.         case 6:
  418.         {
  419.             switch(g_iMenuInfo[id][Menu])
  420.             {
  421.                 case GAG:
  422.                 {
  423.                     GagHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 7 + iKey], g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
  424.                 }
  425.                 case MUTE:
  426.                 {
  427.                     arrayset(g_iMutePlayer[id], 1, sizeof g_iMutePlayer[]);
  428.                     ChatColor(id, 0, MSG_MUTE_ALL_PLAYERS, PREFIX);
  429.                 }
  430.             }
  431.         }
  432.         case 7:
  433.         {
  434.             switch(g_iMenuInfo[id][Menu])
  435.             {
  436.                 case GAG:
  437.                 {
  438.                     if(++g_iMenuInfo[id][SelectTime] > charsmax(g_BlockTimes))
  439.                         g_iMenuInfo[id][SelectTime] = 0;
  440.                    
  441.                     ShowMenu(id, g_iMenuInfo[id][Pos]);
  442.                 }
  443.                 case MUTE:
  444.                 {
  445.                     arrayset(g_iMutePlayer[id], 0, sizeof g_iMutePlayer[]);
  446.                     ChatColor(id, 0, MSG_UNMUTE_ALL_PLAYERS, PREFIX);
  447.                 }
  448.             }
  449.         }
  450.         case 8: ShowMenu(id, ++g_iMenuInfo[id][Pos]);
  451.         case 9:
  452.         {
  453.             if(g_iMenuInfo[id][Pos])
  454.                 ShowMenu(id, --g_iMenuInfo[id][Pos]);
  455.         }
  456.         default:
  457.         {
  458.             switch(g_iMenuInfo[id][Menu])
  459.             {
  460.                 case GAG:
  461.                 {
  462.                     GagHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 7 + iKey], g_BlockTimes[g_iMenuInfo[id][SelectTime]]);
  463.                 }
  464.                 case MUTE:
  465.                 {
  466.                     MuteHandler(id, g_arrPlayers[id][g_iMenuInfo[id][Pos] * 6 + iKey]);
  467.                 }
  468.             }
  469.         }
  470.     }
  471.     return PLUGIN_HANDLED;
  472. }
  473.  
  474. GagHandler(id, player, blocktime)
  475. {
  476.     if(!is_user_connected(player))
  477.     {
  478.         return;
  479.     }
  480.    
  481.     new sNameAdmin[32], sNamePlayer[32];
  482.     get_user_name(id, sNameAdmin, charsmax(sNameAdmin));
  483.     get_user_name(player, sNamePlayer, charsmax(sNamePlayer));
  484.  
  485.     if(GetBit(g_bitBlockChats, player))
  486.     {
  487.         UserBlock(player, 0);
  488.  
  489.         ChatColor(0, player, MSG_CHAT_UNBLOCK_ALL, PREFIX, sNamePlayer, sNameAdmin);
  490.         ChatColor(player, 0, MSG_CHAT_UNBLOCK_PL, PREFIX, sNamePlayer, sNameAdmin);
  491.     }
  492.     else
  493.     {
  494.         UserBlock(player, 1, blocktime);
  495.  
  496.         new blocktimeinfo[32];
  497.         if(!blocktime)
  498.             formatex(blocktimeinfo, charsmax(blocktimeinfo), "Orokre");
  499.         else    formatex(blocktimeinfo, charsmax(blocktimeinfo), " %d Percre", blocktime);
  500.  
  501.         log_amx(MSG_CHAT_BLOCK_ALL, PREFIX, sNameAdmin, sNamePlayer, blocktimeinfo);
  502.        
  503.         ChatColor(0, player, MSG_CHAT_BLOCK_ALL, PREFIX, sNameAdmin, sNamePlayer, blocktimeinfo);
  504.         ChatColor(player, 0, MSG_CHAT_BLOCK_PL, PREFIX, sNamePlayer, sNameAdmin, blocktimeinfo);
  505.     }
  506.     ShowMenu(id, g_iMenuInfo[id][Pos]);
  507. }
  508.  
  509. MuteHandler(id, player)
  510. {
  511.     if(!is_user_connected(player))
  512.     {
  513.         return;
  514.     }
  515.    
  516.     new sNamePlayer[32];
  517.     get_user_name(player, sNamePlayer, charsmax(sNamePlayer));
  518.  
  519.     g_iMutePlayer[id][player] = !g_iMutePlayer[id][player];
  520.     ChatColor(id, 0, g_iMutePlayer[id][player] ? MSG_MUTE_PLAYER : MSG_UNMUTE_PLAYER, PREFIX, sNamePlayer);
  521.    
  522.     ShowMenu(id, g_iMenuInfo[id][Pos]);
  523. }
  524.  
  525. UserBlock(id, block, btime = 0)
  526. {
  527.     if(block)
  528.     {
  529.         g_aLoadedData[id][BLOCKTIME] = !btime ? 0 : get_systime() + btime * 60;
  530.  
  531.         ArrayPushArray(g_aUsersBlocked, g_aLoadedData[id]);
  532.         SetBit(g_bitBlockChats, id);
  533.         VTC_MuteClient(id);
  534.         client_cmd(id, "-voicerecord");     // типа отключаем войс, ога
  535.     }
  536.     else    IsUserBlocked(id, g_aLoadedData[id][IP], g_aLoadedData[id][STEAMID], 1);
  537. }
  538.  
  539. IsUserBlocked(id, const Ip[], const SteamID[], UnBlock = 0)
  540. {
  541.     new i, aSize = ArraySize(g_aUsersBlocked), sys = get_systime();
  542.    
  543.     if(UnBlock)
  544.     {
  545.         for(i = 0; i < aSize; ++i)
  546.         {
  547.             ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  548.             if(strcmp(g_arrData[IP], Ip) == 0 || strcmp(g_arrData[STEAMID], SteamID) == 0)
  549.             {
  550.                 ArrayDeleteItem(g_aUsersBlocked, i);
  551.                 ResetBit(g_bitBlockChats, id);
  552.                 VTC_UnmuteClient(id);
  553.                 break;
  554.             }
  555.         }
  556.     }
  557.     else
  558.     {
  559.         for(i = 0; i < aSize; ++i)
  560.         {
  561.             ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  562.             if(strcmp(g_arrData[IP], Ip) == 0 || strcmp(g_arrData[STEAMID], SteamID) == 0)
  563.             {
  564.                 if(!g_arrData[BLOCKTIME] || g_arrData[BLOCKTIME] > sys)
  565.                 {
  566.                     g_aLoadedData[id][BLOCKTIME] = g_arrData[BLOCKTIME];
  567.                     return i;
  568.                 }
  569.                 else    ArrayDeleteItem(g_aUsersBlocked, i);
  570.  
  571.                 break;
  572.             }
  573.         }
  574.     }
  575.     return -1;
  576. }
  577.  
  578. public plugin_end()
  579. {
  580.     if(file_exists(STORAGE))
  581.         unlink(STORAGE);
  582.    
  583.     new aSize, fp = fopen(STORAGE, "w+");
  584.     if(!fprintf(fp, "; File generated by Advanced Gag [v %s][neygomon | https://neugomon.ru/threads/91/]^n^n", VERSION))
  585.     {
  586.         new err[128]; formatex(err, charsmax(err), "Plugin not write file %s! Users not saved!", STORAGE);
  587.         set_fail_state(err);
  588.     }
  589.  
  590.     aSize = ArraySize(g_aUsersBlocked);
  591.     for(new i; i < aSize; ++i)
  592.     {
  593.         ArrayGetArray(g_aUsersBlocked, i, g_arrData);
  594.         fprintf(fp, "^"%s^" ^"%s^" ^"%d^"^n", g_arrData[IP], g_arrData[STEAMID], g_arrData[BLOCKTIME]);
  595.     }
  596.    
  597.     if(aSize)
  598.     {
  599.         log_amx("Successfully saved %d items in %s :)", aSize, STORAGE);
  600.     }
  601.    
  602.     fclose(fp);
  603.     ArrayDestroy(g_aUsersBlocked);
  604.     TrieDestroy(g_tAllowCmds);
  605. }
  606.  
  607. stock ChatColor(id, id2, const szMessage[], any:...)
  608. {
  609.     new szMsg[190];
  610.     vformat(szMsg, charsmax(szMsg), szMessage, 4);
  611.    
  612.     if(id && id != id2)
  613.     {
  614.         client_print_color(id, print_team_default, szMsg);
  615.     }
  616.     else
  617.     {
  618.         get_players(pl, pnum, "c");
  619.         for(new i; i < pnum; ++i)
  620.         {
  621.             if(pl[i] != id2)
  622.             {
  623.                 client_print_color(pl[i], print_team_default, szMsg);
  624.             }
  625.         }
  626.     }
  627. }


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése:  Rendezés  
Új téma nyitása  Hozzászólás a témához  [ 2 hozzászólás ] 


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 3 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole