Поиск block change nickname

Сообщения
345
Реакции
77
Помог
14 раз(а)
Добрый вечер.
Ищу адекватно работающий плагин, который кикает за смену ника и выводит сообщение "На сервере запрещена смена ника!"
Спасибо.
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Код:
#include <amxmodx>
#include <reapi>

#pragma semicolon 1

new const g_szReason[] = "На сервере запрещена смена ника!";

new g_iMsgSayText;

public plugin_init()
{
    register_plugin("Kick on Change Name", "0.1", "w0w");

    RegisterHookChain(RG_CBasePlayer_SetClientUserInfoName, "refwd_SetClientUserInfoName_Pre");
    g_iMsgSayText = get_user_msgid("SayText");
}

public refwd_SetClientUserInfoName_Pre(id, szInfoBuffer[], szNewName[])
{
    set_msg_block(g_iMsgSayText, BLOCK_ONCE);
    server_cmd("kick #%d %s", get_user_userid(id), g_szReason);
}
 
Последнее редактирование:
Сообщения
11
Реакции
22
как-то так

Код:
#include <amxmodx>
#include <fakemeta>

#define PLUGIN "Block Change Name"
#define VERSION "1.0"
#define AUTHOR "AndrewZ"


public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )

    register_forward( FM_SetClientKeyValue, "fwd_setclientkeyvalue" )
}

public fwd_setclientkeyvalue( id, const sInfobuffer[], const sKey[], const sValue[] )
{
    if( !is_user_connected( id ) )
        return FMRES_IGNORED
       
    if( !equal( sKey, "name" ) )
        return FMRES_IGNORED
       
    server_cmd( "kick #%d ^"Смена ника запрещена!^"", get_user_userid( id ) )
   
    return FMRES_IGNORED
}

w0w, о реапи тоже может, современные технологии...
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
о реапи тоже может, современные технологии...
Да и на fakemeta можно немного лучше, там есть специальный форвард для этого: FM_ClientUserInfoChanged. Поправил свой вариант выше чтобы в чате не выводилось сообщение о смене ника.
 
Сообщения
187
Реакции
319
Помог
1 раз(а)
Зачем кикать, если можно блочить?
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
w0w, кул. но лайк не поставлю т.к не могу :ok:
28 Ноя 2018

Зачем, если не используется? :thinking:
Поправил, до этого была проверка если новый ник отличается от старого то тогда кик, но смысла от неё нет, забыл убрать
 
Сообщения
29
Реакции
62
кикает за смену ника и выводит сообщение "На сервере запрещена смена ника!"
Зачем так радикально то? Когда бы я, вот так, без предупреждения получил кик - владелец этого сервера одной моей горящей ass не отделался бы.
Если вы боритесь с хаками, которые меняют ник циклично, то можно воспользоваться чем-нибудь таким:
C++:
#include <amxmodx>
#include <reapi>

#pragma semicolon 1

#define MAC_MAXWARNINGS 3 // максимальное кол-во предупреждений перед киком
#define MAC_CHANGEDELAY 30 // время в секундах, по истечению которого ник вновь можно будет сменить

new Float:g_flTimeNextChangeName[MAX_PLAYERS +1], g_iWarnings[MAX_PLAYERS +1];

public plugin_init()
{
    register_plugin("AntiFlood Change Name", "28.11.2018", "sergrib");
    RegisterHookChain(RG_CBasePlayer_SetClientUserInfoName, "CBasePlayer_SetClientUserInfoName_Pre", .post = false);
}

public client_putinserver(iPlayer)
{
    g_flTimeNextChangeName[iPlayer] = 0.0;
    g_iWarnings[iPlayer] = 0;
}

public CBasePlayer_SetClientUserInfoName_Pre(const iPlayer, infobuffer[], szNewName[])
{
    new Float:flCurrentTime = get_gametime();
    
    if (g_flTimeNextChangeName[iPlayer] > flCurrentTime)
    {
        if (g_iWarnings[iPlayer] < MAC_MAXWARNINGS)
        {
            client_print_color(iPlayer, print_team_default, "^1Эй! Не так часто! Ник можно будет сменить через ^3%0.f^1 сек. Предупреждение: ^4%i/%i",
                g_flTimeNextChangeName[iPlayer] - flCurrentTime, g_iWarnings[iPlayer]+1, MAC_MAXWARNINGS);
        }
        else if (g_iWarnings[iPlayer] == MAC_MAXWARNINGS)
        {
            server_cmd("kick #%i ^"Name change flooding!^"", get_user_userid(iPlayer));
        }
        
        g_iWarnings[iPlayer]++;
        SetHookChainReturn(ATYPE_INTEGER, false);
        return HC_SUPERCEDE;
    }
    
    g_flTimeNextChangeName[iPlayer] = flCurrentTime + MAC_CHANGEDELAY.0;
    g_iWarnings[iPlayer] = 0;
    
    return HC_CONTINUE;
}
Код:
public refwd_SetClientUserInfoName_Pre(id, szInfoBuffer[], szNewName[])
{
    set_msg_block(g_iMsgSayText, BLOCK_ONCE);
}
products.2853.1.b.jpg
 
Сообщения
667
Реакции
143
Помог
11 раз(а)
SerGrib, спасибо, только твой плагин у меня работает нормально. Не блокирует, но хотя бы кикает за флуд никнейма.
Из этой темы никак не блокируется смена ника https://dev-cs.ru/threads/205/1675268996633.png1675269032507.png
 
Сообщения
366
Реакции
5
Предупреждения
5
Помог
1 раз(а)
Код:
#include <amxmodx>
#include <fakemeta>

public plugin_init() {
    register_plugin("No Change Nick", "0.1.2", "VEN") //Edited by PurposeLess

    register_forward(FM_ClientUserInfoChanged, "ForwardUserInfoChanged")
}

public ForwardUserInfoChanged(id, buffer)
{
    if(!is_user_connected(id))
        return FMRES_IGNORED;

    static name[32]
    get_user_name(id, name, sizeof(name) - 1)

    engfunc(EngFunc_SetClientKeyValue, id, buffer, "name", name)
    client_cmd(id, "name ^"%s^"", name)
    set_user_info(id, "name", name)
    return FMRES_SUPERCEDE;
}
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
wood-grouse, cам не проверял, но человек, для которого я сделал, сказал, что работает хорошо.

Код:
#include <amxmodx>
#include <reapi>

new const PLUGIN_NAME[] = "Block flooding change nickname";
new const PLUGIN_VERSION[] = "0.1";
new const PLUGIN_AUTHOR[] = "bizon";

const Float: TIME_CHANGE_NAME_DELAY = 120.0; // Через сколько секунд можно вновь изменить ник

new Float: g_fTimeNextChangeNick[MAX_PLAYERS+1];

public plugin_init()
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);

    RegisterHookChain(RG_CBasePlayer_SetClientUserInfoName, "@CBasePlayer_SetClientUserInfoName_Pre");
}

@CBasePlayer_SetClientUserInfoName_Pre(pPlayer, const sInfoBuffer[], const sNewName[])
{
    new Float: fGameTime;
    fGameTime = get_gametime();

    if(g_fTimeNextChangeNick[pPlayer] < fGameTime)
    {
        g_fTimeNextChangeNick[pPlayer] = fGameTime + TIME_CHANGE_NAME_DELAY;
        return HC_CONTINUE;
    }

    static Float: fNextMessageTime[MAX_PLAYERS+1];

    if(fNextMessageTime[pPlayer] < fGameTime)
    {
        static
            iSeconds,
            sCeconds[16];

        iSeconds = floatround(g_fTimeNextChangeNick[pPlayer] - fGameTime);

        if(iSeconds > 60)
        {
            new
                iMinutes,
                sMinutes[16];

            iMinutes = iSeconds / 60
            iSeconds = iSeconds % 60;

            correct_word_minutes(iMinutes, sMinutes, charsmax(sMinutes));
            correct_word_seconds(iSeconds, sCeconds, charsmax(sCeconds));

            client_print_color(pPlayer, print_team_default, "^1[^4Block^1] Сменить ник можно через^4 %i %s ^1и^4 %i %s", iMinutes, sMinutes, iSeconds, sCeconds);
        }
        else
        {
            correct_word_seconds(iSeconds, sCeconds, charsmax(sCeconds));
            client_print_color(pPlayer, print_team_default, "^1[^4Block^1] Сменить ник можно через^4 %i %s", iSeconds, sCeconds);
        }

        fNextMessageTime[pPlayer] = fGameTime + 1.0;
    }

    static sCurName[MAX_AUTHID_LENGTH];
    get_user_name(pPlayer, sCurName, charsmax(sCurName));

    set_entvar(pPlayer, var_netname, sCurName);
    set_user_info(pPlayer, "name", sCurName);

    SetHookChainArg(3, ATYPE_STRING, sCurName);
    SetHookChainReturn(ATYPE_BOOL, false);

    return HC_SUPERCEDE;
}

enum _:
{
    Plural,
    Singular,
    Nominative
};

stock correct_word_minutes(iSeconds, sWords[], iWordsLen)
{
    switch(get_numerical_noun_form(iSeconds))
    {
        case Plural: format(sWords, iWordsLen, "минут");
        case Singular: format(sWords, iWordsLen, "минуты");
        case Nominative: format(sWords, iWordsLen, "минуту");
    }
}

stock correct_word_seconds(iSeconds, sWords[], iWordsLen)
{
    switch(get_numerical_noun_form(iSeconds))
    {
        case Plural: format(sWords, iWordsLen, "секунд");
        case Singular: format(sWords, iWordsLen, "секунды");
        case Nominative: format(sWords, iWordsLen, "секунду");
    }
}

// https://dev-cs.ru/threads/222/#post-2364
// by hunter
stock get_numerical_noun_form(iNum)
{
    if(iNum > 10 && ((iNum % 100) / 10) == 1)
        return Plural;                   

    switch (iNum % 10)
    {
        case 1: return Nominative;       
        case 2, 3, 4: return Singular;   
    }

    return Plural;
}
Его главная задача - противостоять ботам/игрокам со скриптами, которые флудят сменой ника.
Дополнительная задача - ограничивать в частой смене ника и обычных юзеров.
 

Вложения

Сообщения
667
Реакции
143
Помог
11 раз(а)
@bizon,оо, у тебя и блокирует еще)) Работает тоже!
1675274422159.png

Мне пришлось нормально так времени потратить, чтобы найти работающий плагин. Спасибо тебе и SerGrib

Странно, что нет в ресурсах таких плагинов.
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Странно, что нет в ресурсах таких плагинов.
У меня слишком простенький функционал. Если бы я его расширил, то выложил бы. Возможно.
Плюс толком не проверенный плагин ещё. До тебя попробовал 1 человек только. Я ещё не до конца уверен, что плагин полностью справляется со основной своей задачей.
 
Сообщения
667
Реакции
143
Помог
11 раз(а)
bizon, еще раз твой проверил. блокирует смену ника на 120 сек. по умолчанию и после 120 секунд дает возможность снова сменить ник.
Единственно, что если продолжить менять ник при блокировке, уведомление [Block] Сменить ник можно через N сек. то сразу выводится, то через раз, то через 3 раза.
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Единственно, что если продолжить менять ник при блокировке, уведомление [Block] Сменить ник можно через N сек. то сразу выводится, то через раз, то через 3 раза.
Это защита от спама дополнительная стоит, сообщение будет выводиться не чаще, чем раз в секунду.
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
wood-grouse, ну это хорошо.

60 строчка для изменения времени, если нужно:
Код:
fNextMessageTime[pPlayer] = fGameTime + 1.0;
1 Фев 2023
Вместо 1.0 своё время (в секундах, дробное значение).
1 Фев 2023
Это если нужно изменить время повторного показа сообщения о блокировке ника.
 
Сообщения
282
Реакции
34
Помог
3 раз(а)
I have too simple functionality. If I expanded it, I would post it. Maybe.
Plus, the plugin is not really tested yet. Before you tried 1 person only. I'm still not completely sure that the plugin fully copes with its main task.
sometimes it happens that new player enters on server with nick from someone else who played.
how is that possible? :D
 

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

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