Русское сообщество по скриптингу

Mute Menu: команда вызова меню

Все вопросы по работе и настройке AMXX и его плагинов.

Модератор: liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по AMX Mod X и его плагинам.

Mute Menu: команда вызова меню

Сообщение sontar » 24 дек 2016, 03:26

не получатся открыть меню. даже не пойму какой командой.
вот исходник

Код: Выделить всё
#include <amxmodx>
#include <nvault>
#include <geoip>
#include <fakemeta>

#define is_vip(%1) get_user_flags(%1) & ADMIN_KICK
#define is_admin(%1) get_user_flags(%1) & ADMIN_RCON

new g_szIp[33][24], bool:g_iPermMute[33]
new g_iMenuPosition[33], g_iMenuList[33][64], g_iNum[33]

new g_nVault, szPrefix[] = "!g***"
new Trie:g_tMutePidors
new g_iMaxPlayers

new const szDontSpeakCountry
[][] =
{
    "UZB",//uzbeki
    "KZH",//kazahi
    "USA"//america
}

new const szMenuNames[][] =
{
    "Заглушить",
    "Снять заглушку",
    "Заглушить навсегда"
}

public plugin_init()
{
    register_plugin("Mute Menu", "2.0", "pro")

    register_clcmd("say", "cmd_say") 
    register_clcmd
("say_team", "cmd_say")
    register_menucmd(register_menuid("show_mutemenu"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9), "mutemenu_handler")

    register_cvar("mute_country", "1")
    
    register_forward
(FM_Voice_SetClientListening, "Fwd_Voice_ClientListening")

    g_nVault = nvault_open("PermMute")
    if(g_nVault == INVALID_HANDLE)
    {
        new szError[218]
        formatex(szError, charsmax(szError), "Invalid handle Nvault %s", g_nVault)
        set_fail_state(szError)
        return
    
}
    g_tMutePidors = TrieCreate()
    g_iMaxPlayers = get_maxplayers()
}

public client_putinserver(id)
{
    get_user_ip(id, g_szIp[id], charsmax(g_szIp[]))
    
    if
(get_cvar_num("mute_country"))
    {
        new g_iCountry[33][4]
        geoip_code3_ex(g_szIp[id], g_iCountry[id])

        for(new i = 0; i < sizeof szDontSpeakCountry; i++)
            if(equal(g_iCountry[id], szDontSpeakCountry[i])) 
                TrieSetCell
(g_tMutePidors, g_szIp[id], 1)
    }
    CheckPermMute(id)
}

#if AMXX_VERSION_NUM < 183
public client_disconnect(id) g_szIp[id] = ""
#else 
public client_disconnected(id) g_szIp[id] = ""
#endif
    
public cmd_say
(id)
{
    if(native_get_mute(id)) 
    
{
        client_printc(id, "%s^x01 Вам %sзапрещено писать в чат и говорить в микрофон.", szPrefix, g_iPermMute[id] ? "навсегда " : "")
        return PLUGIN_HANDLED
    
}
    static szArgs[64]
    read_args(szArgs, charsmax(szArgs)); remove_quotes(szArgs)
    
    if
(equal(szArgs, "/mute")) native_showmenus(id, 0)
    else if(equal(szArgs, "/speak")) native_showmenus(id, 1)
    else if(equal(szArgs, "/pmute")) native_showmenus(id, 2)
    
    return PLUGIN_CONTINUE
}

public Fwd_Voice_ClientListening(iReceiver, iSender, listen) 
{
    if(iReceiver == iSender)
        return FMRES_IGNORED
    
    if
(!is_user_connected(iSender))
        return FMRES_IGNORED
    
    if
(native_get_mute(iSender))
    {
        engfunc(EngFunc_SetClientListening, iReceiver, iSender, false)
        return FMRES_SUPERCEDE
    
}
    return FMRES_IGNORED
}

public native_showmenus(id, num)
{
    if(!num && is_vip(id))
    {
        g_iNum[id] = 0
        show_mutemenu
(id, g_iMenuPosition[id] = 0)
    }
    else if(num == 1 && is_vip(id))
    {
        g_iNum[id] = 1
        show_mutemenu
(id, g_iMenuPosition[id] = 0)
    }
    else if(num == 2 && is_admin(id))
    {
        g_iNum[id] = 2
        show_mutemenu
(id, g_iMenuPosition[id] = 0)
    }
}

show_mutemenu(id, iPos)
{
    if(iPos < 0)
        return PLUGIN_HANDLED

    static g_iPlayersNum
; g_iPlayersNum = 0
    for
(new i = 1; i < g_iMaxPlayers; i++)
    {
            if(!is_user_connected(i) || is_vip(i) || is_user_hltv(i) || is_user_bot(i)) continue
            g_iMenuList
[id][g_iPlayersNum++] = i
    
}

    new iStart = iPos * 8
    if
(iStart > g_iPlayersNum) iStart = g_iPlayersNum
    iStart 
= iStart - (iStart % 8)
    g_iMenuPosition[id] = iStart / 8
    new iEnd 
= iStart + 8
    if
(iEnd > g_iPlayersNum) iEnd = g_iPlayersNum
    new menu
[512], len, pagesnum = (g_iPlayersNum / 8 + ((g_iPlayersNum % 8) ? 1 : 0))

    switch(pagesnum) 
    
{
        case 0: return PLUGIN_HANDLED
        default
: len = formatex(menu, charsmax(menu), "%s \d[%d|%d]^n^n", szMenuNames[g_iNum[id]], iPos + 1, pagesnum)
    }
    
    new keys 
= (1<<9), b, szName[32], i
    for
(new a = iStart; a < iEnd; a++)
    {
        i = g_iMenuList[id][a]
        get_user_name(i, szName, charsmax(szName))
        if((g_iNum[id] == 0 || g_iNum[id] == 2) && native_get_mute(i) || g_iNum[id] == 1 && !native_get_mute(i))
            len += formatex(menu[len], charsmax(menu) - len, "\d[%d] \y~ \d%s^n", ++b, szName)
        else
        
{
            keys |= (1<<b)
            len += formatex(menu[len], charsmax(menu) - len, "\d[%d] \y~ \w%s %s^n", ++b, szName)
        }
    }
    for(new i = b; i < 8; i++) len += formatex(menu[len], charsmax(menu) - len, "^n")
    
    if
(iEnd < g_iPlayersNum)
    {
        keys |= (1<<8)
        formatex(menu[len], charsmax(menu) - len, "^n\d[9] \y~ \wВперёд^n\d[0] \y~ \w%s", iPos ? "Назад" : "Выход")
    }
    else formatex(menu[len], charsmax(menu) - len, "^n\d[0] \y~ \w%s", iPos ? "Назад" : "Закрыть")

    if(pev_valid(id) == 2) set_pdata_int(id, 205, 0, 5)

    return show_menu(id, keys, menu, -1, "show_mutemenu")
}

public mutemenu_handler(id, key)
{
    switch(key)
    {
        case 8: return show_mutemenu(id, ++g_iMenuPosition[id])
        case 9: return show_mutemenu(id, --g_iMenuPosition[id])
        default: Cmd_MuteUnmute(id, g_iMenuList[id][g_iMenuPosition[id] * 8 + key])
    }
    return PLUGIN_HANDLED
}

public Cmd_MuteUnmute(id, iTarget)
{
    if(!iTarget)
    {
        static szArg[5]
        read_argv(1, szArg, charsmax(szArg))
        if(!is_str_num(szArg))
        {
            client_printc(id, "%s ^x01Игрок не найден.", szPrefix)
            return PLUGIN_HANDLED
        
}
        iTarget = str_to_num(szArg)
    }
    if(!is_user_connected(iTarget))
    {
        client_printc(id, "%s ^x01Игрок отключился.", szPrefix)
        return PLUGIN_HANDLED
    
}
    
    static szName
[33], szName2[33]
    get_user_name(id, szName, charsmax(szName))
    get_user_name(iTarget, szName2, charsmax(szName2))
    static data[16], logfile[32], map[32]
    get_mapname(map, charsmax(map))
    get_time("%d-%m-%Y", data, charsmax(data))
    formatex(logfile, charsmax(logfile), "Mute_%s.log", data)
    switch(g_iNum[id])
    {
        case 0:
        {
            if(native_get_mute(iTarget))
            {
                client_printc(id, "%s ^x01Игрок уже заглушен!", szPrefix)
                return PLUGIN_HANDLED
            
}

            TrieSetCell(g_tMutePidors, g_szIp[iTarget], 1)
            client_cmd(iTarget, "-voicerecord")

            client_printc(0, "%s^x03 %s ^x01заткнул^x03 %s", szPrefix, szName, szName2)
            log_to_file(logfile, "%s Заткнул %s", szName, szName2)
        }
        case 1:
        {
            if(!native_get_mute(iTarget))
            {
                client_printc(id, "%s ^x01Игрок не заглушен!", szPrefix)
                return PLUGIN_HANDLED
            
}

            TrieDeleteKey(g_tMutePidors, g_szIp[iTarget])
            if(g_iPermMute[iTarget]) RemovePermMute(iTarget)

            client_printc(0, "%s^x03 %s^x01 размутил^x03 %s", szPrefix, szName, szName2)
            log_to_file(logfile, "%s размутил %s", szName, get_flags2(id, "o") ? "а" : "", szName2)
        }
        case 2:
        {
            if(native_get_mute(iTarget))
            {
                client_printc(id, "%s^x01 Игрок уже заглушен!", szPrefix)
                return PLUGIN_HANDLED
            
}

            TrieSetCell(g_tMutePidors, g_szIp[iTarget], 1)
            SetPermMute(iTarget)
            g_iPermMute[iTarget] = true
            client_cmd
(iTarget, "-voicerecord")

            client_printc(0, "%s^x03 %s ^x01заткнул навсегда^x03 %s", szPrefix, szName, szName2)
            log_to_file(logfile, "%s заткнул навсегда %s", szName, szName2)
        }
    }
    return PLUGIN_HANDLED
}

public bool:native_get_mute(id)
{
    if(TrieKeyExists(g_tMutePidors, g_szIp[id]))
        return true

    return false
}

public CheckPermMute(id)
{
    static szData[256], szKey[6], iTimeStamp
    if
(nvault_lookup(g_nVault, g_szIp[id], szData, charsmax(szData), iTimeStamp))
    {
        replace_all(szData, charsmax(szData), "|", " ")
        parse(szData, szKey, charsmax(szKey))
        if(str_to_num(szKey))
        {
            TrieSetCell(g_tMutePidors, g_szIp[id], 1)
            g_iPermMute[id] = true
        
}
    }
}
  

public SetPermMute
(id)
{
    if(TrieKeyExists(g_tMutePidors, g_szIp[id]))
        nvault_set(g_nVault, g_szIp[id], "|1|")
}

public RemovePermMute(id)
{
    nvault_remove(g_nVault, g_szIp[id])
    g_iPermMute[id] = false
}

stock get_flags2(id, const flags[])
    return get_user_flags(id) & read_flags(flags)

public plugin_end()
{
    TrieDestroy(g_tMutePidors)
    nvault_close(g_nVault)
}

stock client_printc(target, const message[], any:...)
{
    static buffer[191] 
    static i
, argscount
    argscount 
= numargs()

    if(!target)
    {
        static player
        for
(player = 1; player <= g_iMaxPlayers; player++)
        {
            if(!is_user_connected(player))
                continue

            static changed
[5], changedcount
            changedcount 
= 0

            for
(= 2; i < argscount; i++)
            {
                if(getarg(i) == LANG_PLAYER)
                {
                    setarg(i, 0, player)
                    changed[changedcount] = i
                    changedcount
++
                }
            }
            vformat(buffer, charsmax(buffer), message, 3)
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, player)
            write_byte(player)
            write_string(buffer)
            message_end()

            for(= 0; i < changedcount; i++)
                setarg(changed[i], 0, LANG_PLAYER)
        }
    }
    else
    
{
        if(is_user_connected(target))
        {
            vformat(buffer, charsmax(buffer), message, 3)
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, target)
            write_byte(target)
            write_string(buffer)
            message_end()
        }
    }

Название темы скорректировано // Subb98
Аватара пользователя
sontar
 
Сообщения: 44
Зарегистрирован: 10 июн 2016, 23:13
Благодарил (а): 3 раз.
Поблагодарили: 2 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: Mute Menu: команда вызова меню

Сообщение Subb98 » 24 дек 2016, 11:55

Вот все команды:

Код: Выделить всё
if(equal(szArgs"/mute")) native_showmenus(id0)
else if(
equal(szArgs"/speak")) native_showmenus(id1)
else if(
equal(szArgs"/pmute")) native_showmenus(id2
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 4415
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1223 раз.
Поблагодарили: 2050 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, PHP


Вернуться в Вопросы по AMXX и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 3