> > > > >

прибавить флаги доступа

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
47
Рейтинг
-26
#1
Как прибавить к текущим флагам доступа еще один флаг доступа, а потом его убрать?

Обычное set_user_flags с бит-суммой не катит, чет сообразить не могу.
Надо короче получить все флаги у чувака, записать их, к ним же прибавлять нужный флаг.
Потом тупо устанавливать обратно полученные флаги да?
А это как узнать какие щас флаги доступа у игрока?
7 Ноя 2018
а все есть get_flags
7 Ноя 2018
Код:
            new flags = get_user_flags(idsta)
            new string_flags[32]
            get_flags(flags,string_flags, charsmax(string_flags))
    
            set_user_flags(idsta, read_flags(string_flags + "d"))
это поцаны а че так нельзя сложить стринг и просто + "d" ?Как тогда
 
 
Сообщения
1.008
Рейтинг
953
#2
Код:
new flags = get_user_flags(id);
set_user_flags(id, flags | ADMIN_FLAG_T);
remove_user_flags(id, ADMIN_FLAG_T);
 
3  
Сообщения
47
Рейтинг
-26
#3
fantom, Выводит в чат че за хрень хДД
Код:
flags
set flags
Код:
public flags(id) {
    new flags = get_user_flags(id);
   
    client_print(id, print_chat, "%s", flags)
   
    set_user_flags(id, flags | ADMIN_LEVEL_H);
   
    if(get_user_flags(id) & ADMIN_LEVEL_H) {
        client_print(0, print_chat, "LOLOLO")
    }else{
        client_print(0, print_chat, "CHETO NE TAK")
    }
   
    remove_user_flags(id, ADMIN_LEVEL_H);
}
 
 
Сообщения
47
Рейтинг
-26
#5
zhorzh78, и че это даст? ты видишь условие if(get_user_flags(id) & ADMIN_LEVEL_H) оно не выполняется.
 
Сообщения
1.008
Рейтинг
953
#7
Mistrick, спс. Я уже и забыл что там set совсем не set, а add:ok:
 
2  
Сообщения
47
Рейтинг
-26
#9
zhorzh78, да при том, что я не просто так наезжаю сейчас.
я предоставил вывод инфы из чата игрока, где не доходит до моего условия, которое я уже тебе сказал.
 
 
Сообщения
309
Рейтинг
520
#10
SAM, вы предоставили вывод неизвестно чего, где код, который выводит ваш лог?
 
 
Сообщения
47
Рейтинг
-26
#11
Mistrick, вообще мне нужно айди игрока передать в другую функцию, че не получается не пойму.

через set_task айди не передается?

set_task(15.1, "endVotebanPlayer", id)


Короче вот

Код:
run_vote(id)
{
    g_lastVote = get_systime(0)
    
    g_VotePlayer[0] = 0
    g_VotePlayer[1] = 0
    
    new menuBody[512]
    new iPlayers[32], iNum
    get_players(iPlayers, iNum)
    
    new g_playervote[32]
    get_user_name(id, g_playervote, 31)
    
    ColorChat(0, RED, "^x04• ^x03%s^x01 создает голосование за бан ^x03%s", g_playervote, player_name)
    format(menuBody, 511, "\yЗабанить %s на %d минут?^n^n\r1.\w Да.^n\r2.\w Нет.", player_name, g_BanTimePl)
    
    for(new i; i < iNum; i++)
        show_menu(iPlayers[i], (1<<0)|(1<<1), menuBody, 15, "VoteMenu")
    
    set_task(15.1, "endVotebanPlayer", id) // @@@@@@@@@ тут приписал id
    return PLUGIN_CONTINUE
}

public endVotebanPlayer(id) // @@@@@@@@@ тут тоже id приписал
{
    new Float:result = (float(g_VotePlayer[0]) / float(g_VotePlayer[0] + g_VotePlayer[1]))

    if(0.60 > result)
        ColorChat(0, RED, "^x04• ^x03Недостаточно голосов, чтобы забанить ^x04%s", player_name)
    else
    {
        ColorChat(0, RED, "^x04•^x01 %s ^x03забанен на ^x04%d минут", player_name, g_BanTimePl)
        set_user_flags(id, ADMIN_BAN)
        client_cmd(id, "amx_ban ^"%d^" ^"%s^" ^"Voteban^"", g_BanTimePl, player_steam)
        remove_user_flags(id, ADMIN_BAN)
    }
    
    return PLUGIN_CONTINUE
}

И да, выполнение через server_cmd не подходит, нужно именно через client_cmd
 
 
Сообщения
309
Рейтинг
520
#12
SAM, и откуда run_vote() вызывается?
client_cmd() - костыль, ищите в своей бан системе нативу для бана, либо допишите ее сами.
 
1  
Сообщения
47
Рейтинг
-26
#13
Mistrick, public actionPlayerMenu(id, key)

Код:
#include <amxmodx>
#include <amxmisc>
#include <ColorChat>

new player_name[32]
new player_steam[50]
new g_lastVote

new g_menuPosition[33]
new g_menuPlayers[33][32]
new g_menuPlayersNum[33]
new g_VotePlayer[2]

//Параметры
new g_TimeLastVote = 300 //время, между банами.
new g_BanTimePl = 30 //время бана.

public plugin_init()
{
    register_plugin("VoTeBan Player Menu", "4.9", "Sutar")
    
    register_clcmd("say /voteban", "cmdPlayerMenu")
    register_clcmd("say voteban", "cmdPlayerMenu")
    
    register_menucmd(register_menuid("Active Voteban"), 1023, "actionPlayerMenu")
    register_menucmd(register_menuid("VoteMenu"), 1023, "CountVotbanPlayer")
}

public cmdPlayerMenu(id)
{
    if(g_TimeLastVote > (get_systime(0) - g_lastVote))
    {
        new seconds = g_TimeLastVote - (get_systime(0) - g_lastVote)
        ColorChat(id, RED, "^x04•^x03 Подождите ^x04%d^x01 секунд(ы) для нового^x03 голосования", seconds)
        return PLUGIN_HANDLED
    }
    
    new iPlayers[32], iNum
    get_players(iPlayers, iNum)
    
    for(new i = 0; i < iNum; i++)
    {
        if(get_user_flags(iPlayers[i]) & ADMIN_LEVEL_A)
        {
            if(!(get_user_flags(id) & ADMIN_LEVEL_A))
            {
                ColorChat(id, RED, "^x04•^x03 На сервере есть ^x03привилегированный игрок")
                return PLUGIN_CONTINUE
            }
        }
    }
    
    displayPlayerMenu(id, g_menuPosition[id] = 0)
    return PLUGIN_CONTINUE
}

displayPlayerMenu(id, pos)
{
    if(pos < 0)
        return

    get_players(g_menuPlayers[id], g_menuPlayersNum[id])

    new menuBody[512]
    new b = 0
    new i
    new name[32]
    new start = pos * 8

    if(start >= g_menuPlayersNum[id])
        start = pos = g_menuPosition[id] = 0

    new len = format(menuBody, 511, "\yВыберите игрока [ %d | %d ]^n^n", pos + 1, (g_menuPlayersNum[id] / 8 + ((g_menuPlayersNum[id] % 8) ? 1 : 0)))
    new end = start + 8
    new keys = MENU_KEY_0

    if(end > g_menuPlayersNum[id])
        end = g_menuPlayersNum[id]

    for(new a = start; a < end; ++a)
    {
        i = g_menuPlayers[id][a]
        get_user_name(i, name, 31)

        if(get_user_flags(i) & ADMIN_IMMUNITY || i == id)
            len += format(menuBody[len], 511-len, "\d%d. %s \r*^n", ++b, name)
        else
        {
            keys |= (1<<b)
            
            if(is_user_admin(i))
                len += format(menuBody[len], 511-len, "\r%d.\w %s \r*^n", ++b, name)
            else
                len += format(menuBody[len], 511-len, "\r%d.\w %s^n", ++b, name)
        }
    }

    if(end != g_menuPlayersNum[id])
    {
        format(menuBody[len], 511-len, "^n\w9. Дальше...^n\r0.\w %s", pos ? "Назад" : "Выход")
        keys |= MENU_KEY_9
    }
    else
        format(menuBody[len], 511-len, "^n\r0.\w %s", pos ? "Назад" : "Выход")
    show_menu(id, keys, menuBody, -1, "Active Voteban")
}

public actionPlayerMenu(id, key)
{
    switch(key)
    {
        case 8: displayPlayerMenu(id, ++g_menuPosition[id])
        case 9: displayPlayerMenu(id, --g_menuPosition[id])
        default:
        {
            new g_banPlayer = g_menuPlayers[id][g_menuPosition[id] * 8 + key]
            
            get_user_name(g_banPlayer, player_name, 31)
            get_user_authid(g_banPlayer, player_steam, 49)
            run_vote(id)
        }
    }
    return PLUGIN_CONTINUE
}

run_vote(id)
{
    g_lastVote = get_systime(0)
    
    g_VotePlayer[0] = 0
    g_VotePlayer[1] = 0
    
    new menuBody[512]
    new iPlayers[32], iNum
    get_players(iPlayers, iNum)
    
    new g_playervote[32]
    get_user_name(id, g_playervote, 31)
    
    ColorChat(0, RED, "^x04• ^x03%s^x01 создает голосование за бан ^x03%s", g_playervote, player_name)
    format(menuBody, 511, "\yЗабанить %s на %d минут?^n^n\r1.\w Да.^n\r2.\w Нет.", player_name, g_BanTimePl)
    
    for(new i; i < iNum; i++)
        show_menu(iPlayers[i], (1<<0)|(1<<1), menuBody, 15, "VoteMenu")
    
    set_task(15.1, "endVotebanPlayer", id)
    return PLUGIN_CONTINUE
}

public CountVotbanPlayer(id, key)
{
    g_VotePlayer[key]++
    
/*    new player[32]
    get_user_name(id, player, 31)
    
    ColorChat(0, GREEN, "^x01[^x04Voteban!^x01] Игрок ^x04%s^x01 проголосовал ^x04%s^x01.", player, key ? "против бана игрока" : "за бан игрока")*/
    return PLUGIN_CONTINUE
}

public endVotebanPlayer(id)
{
    new Float:result = (float(g_VotePlayer[0]) / float(g_VotePlayer[0] + g_VotePlayer[1]))

    if(0.60 > result)
        ColorChat(0, RED, "^x04• ^x03Недостаточно голосов, чтобы забанить ^x04%s", player_name)
    else
    {
        ColorChat(0, RED, "^x04•^x01 %s ^x03забанен на ^x04%d минут", player_name, g_BanTimePl)
        set_user_flags(id, ADMIN_BAN)
        client_cmd(id, "amx_ban ^"%d^" ^"%s^" ^"Voteban^"", g_BanTimePl, player_steam)
        remove_user_flags(id, ADMIN_BAN)
    }
    
    return PLUGIN_CONTINUE
}
Нет, нужен именно client_cmd
8 Ноя 2018
И через get_user_index не получается
в run_vote юзаю массив g_playervote - как раз туда имя игрока пишется и get_user_index по нику же берет айди.
тоже не получается передать. Че не так? и g_playervote нигде не обнуляется, только пересоздает себя каждый раз при вызове run_vote
 
 
Сообщения
1.008
Рейтинг
953
#14
Нет, нужен именно client_cmd
Я бы на вашем месте послушал Mistrick-а. Он дело говорит. Простой пример: протектор может заблокировать команду и бана не будет. И еще много чего почему лучше не использвать client_cmd. Если так нужно от имени пользователя, то используйте amxclient_cmd
8 Ноя 2018
Возможная бага. Если будет еще одно меню содержать строку VoteMenu, и будет припустим 5 пунктов получите ошибку рантайма index out of bounds
8 Ноя 2018
не думали выбросить этот доисторический инклуд?
8 Ноя 2018
f
Код:
for(new i = 0; i < iNum; i++)
{
    if(get_user_flags(iPlayers[i]) & ADMIN_LEVEL_A)
    {
        if(!(get_user_flags(id) & ADMIN_LEVEL_A))
        {
            ColorChat(id, RED, "^x04•^x03 На сервере есть ^x03привилегированный игрок")
            return PLUGIN_CONTINUE
        }
    }
}
лучше не заходя в цыкл и не получая игроков сразу выйти из функции
Код:
if (~get_user_flags(id) & ADMIN_LEVEL_A) {
    ColorChat(id, RED, "^x04•^x03 На сервере есть ^x03привилегированный игрок")
    return PLUGIN_CONTINUE
}
8 Ноя 2018
И еще одновременно омжна запустить два голосования, что призведет к неожиданым результатам в связи с использованием глобальных переменных расчитаных на одно наказуемого игрока
 
1  
Сообщения
47
Рейтинг
-26
#15
fantom, спасибо, поправлю. Код не мой.
Возможная бага. Если будет еще одно меню содержать строку VoteMenu, и будет припустим 5 пунктов получите ошибку рантайма index out of bounds
То есть это если еще одно голосование запустят? Ну это легко убрать создать булевую переменную и условие, и чекать.

Че вот я хочу? Короче. Мне этот вотебан да можно и не этот без разницы, нужно прикрутить к amxbans
Если я выполняю бан через server_cmd, то естественно банится от имени сервера и в таблице указывается имя сервера, а мне это не надо.
Был минутный поиск в сети вотебана к амхбанс - единственное нашел так эт видео школопеда как он меняет тип бана в amxbans.cfg :DD
8 Ноя 2018
а касаемо colorchat этого, так он был прикручен уже, я не стал чет менять особо, мне лишь понять че я не так делаю, что индекс не передает.
и не думаю, что протектор заблочит простую админскую команду.
 
 
Сообщения
1.008
Рейтинг
953
#16
Моя вам рекомендация. Берете нормальный вотебан и все. Бан от имени пользователя или сервера не имеет значения. Вы все равно должны смотреть логы. А нормальные вотебаны как раз и логируют кто что когда и как
 
 
Сообщения
47
Рейтинг
-26
#17
fantom, мне логи не нужны от вотебана кто кого и что и как.
я сказал что мне нужен бан от имени игрока.
нормальный вотебан это какой? да во всех абсолютно бан идет от имени сервера.
8 Ноя 2018
я же сказал что вотебан к амхбансу хочу прикрутить.
а если инициатор выдает бан, то в бан-листе инициатор = имя сервера, ибо бан иде т через server_cmd, а не от имени пользователя
 
 
Сообщения
1.008
Рейтинг
953
#18
ладно делайте как считаете нужным. Ответ дан више. Один вопрос одна тема. А это уже переросло в обсуждение вотебанов
 
 
Статус
В этой теме нельзя размещать новые ответы.
> > > > >