Player Name Fixer

Player Name Fixer 2.1

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #1
romeo7 добавил(а) новый ресурс:

Player Name Fixer - Исправляет ошибки, связанные с никнеймом.

Когда игрок входит на сервере или меняет имя, этот плагин проверяет его имя и если он находит символы, которые не поддерживают mysql (utf8mb4) и выдает ошибки (например: вы не можете заблокировать его за этих символов), тогда плагин очистить такие символы от имени. После очистки игрок будет предупрежден и когда плагин меняет имя, сообщение об изменении имени на сервере будет удалено.
Если вам нравится плагин, буду обновлять и добавлять новые функции (Например: очистить IP-адрес от имени) к...

Узнать больше об этом ресурсе...
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
Что ж, плагина лучше не вышло.
  1. player_name_fixer.sp:
    public void OnPluginStart()
    {
        // ...
        g_bEnable = g_CVEnable.BoolValue;
        g_bWarning = g_CVWarning.BoolValue;
        // ...
    }
    В OnPluginStart() оно может вернуть Вам стандартные значения этих переменных. Доставать их стоит в OnConfigsExecuted().
  2. Мне не совсем понятно, почему при изменении любой переменной своего плагина, Вы полностью перестраиваете локальный кеш их значений.
  3. OnClientPostAdminCheck(). Серьёзно? Некоторые плагины ходят в базу до срабатывания этого события (привет СБ с его поиском банов), а Вы только здесь решились посмотреть, а чё там за никнейм у юзера.
    Мало того, зачем-то bFixName приводится в false значение в if-блоке. Зачем?
    Ещё и в таймер напрямую передаётся идентификатор клиента, при условии, что за эти 7 секунд, на месте этого игрока может быть уже совсем другой (в CS:S - вполне возможно, там клиент очень быстро загружает ресурсы).
  4. Код в OnPlayerChangeNamePre() выглядит странным. Для блокировки выставляется утвердительное свойство "броадкастинга сообщения".
  5. SayText2 аналогичная хрень. При чтении этой функции, складывается впечатление, что плагин нацелен полностью на CS (#Cstrike_Name_Change в TF2 и других играх не существует, но они указаны как "совместимые").
 

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #3
romeo7 обновил(а) ресурс Player Name Fixer новой записью:

Оптимизация и исправление

* переменные исправлены;
* OnClientPostAdminCheck() изменена на OnClientPutInServer();
* таймер предупреждения удален;
* добавлено предупреждение, когда игрок подключается и выбирает команду;
* теперь блокировка сообщения об изменении имени должна работать в TF2 и других играх;
* оптимизация кода.

Узнать больше об этом обновлении...
Сообщения автоматически склеены:

Что ж, плагина лучше не вышло.
- интрига 😀
1. это был старый метод. [ИСПРАВЛЕНА].
2. ???
3. - изменена на OnClientPutInServer().
- сначала был глобалный, забыл удалить. [ИСПРАВЛЕНА].
- удалена таймер. добавлена HookEvent("player_team").
4. это был рип код. [ИСПРАВЛЕНА].
5. [ИСПРАВЛЕНА].
 
Последнее редактирование:

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
1. Поддерживаемые игры и \x02 в выводе сообщений клиенту, увы, но движок OB не умеет.
2. Незначительная претензия к переменным, в которые записывается ник игрока, да размер = 64, но разве для этого не придумана директива MAX_TARGET_LENGTH
3. Лишние проверки ClientId
4. Бесконечное непонятное для меня дергание GetUserMessageType()
5. Двойная проверка ?
C-подобный:
...
        int author = PbReadInt(bf, "ent_idx");
        
        if(!PbReadBool(bf, "chat") || !author) return Plugin_Continue; // ?
        
        PbReadString(bf, "msg_name", buffer, sizeof(buffer));
        
        if(StrContains(buffer, "_Name_Change") != -1 && IsValidClient(author)/* ? */ && g_bBlockMessage[author])
        {
            g_bBlockMessage[author] = false;
            return Plugin_Handled;
        }
...
6. Хранение двух Handle вместо int/bool
7. Повторение одного куска кода в разных функциях.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #5
изменена на OnClientPutInServer()
Провальная идея по прежнему.
SB может ещё раньше полезть в базу, чем сработает OnClientPutInServer(). Порядок вызова каллбеков не определен же.

А вот это самый смешной код, который я когда-либо видел:
C-подобный:
    char buffer[25];
    if(GetUserMessageType() == UM_Protobuf)
    {
        int author = PbReadInt(bf, "ent_idx");
        
        if(!PbReadBool(bf, "chat") || !author) return Plugin_Continue;
        
        PbReadString(bf, "msg_name", buffer, sizeof(buffer));
        
        if(StrContains(buffer, "_Name_Change") != -1 && IsValidClient(author) && g_bBlockMessage[author])
        {
            g_bBlockMessage[author] = false;
            return Plugin_Handled;
        }
    }
    else
    {
        int author = BfReadByte(bf);
                
        if(BfReadByte(bf) || !author) return Plugin_Continue;
                
        BfReadChar(bf);
        BfReadChar(bf);
        BfReadString(bf, buffer, sizeof(buffer));
        
        if(StrContains(buffer, "_Name_Change") != -1 && IsValidClient(author) && g_bBlockMessage[author])
        {
            g_bBlockMessage[author] = false;
            return Plugin_Handled;
        }
    }
Во избежание дублирования, его можно было записать так:
C-подобный:
    char buffer[25];
    int author = 0;
    if(GetUserMessageType() == UM_Protobuf)
    {
        author = PbReadInt(bf, "ent_idx");
        if(!PbReadBool(bf, "chat")) return Plugin_Continue;
        PbReadString(bf, "msg_name", buffer, sizeof(buffer));
    }
    else
    {
        author = BfReadByte(bf);
        if(BfReadByte(bf)) return Plugin_Continue;

        BfReadChar(bf);
        BfReadChar(bf);
        BfReadString(bf, buffer, sizeof(buffer));
    }
    
    if(StrContains(buffer, "_Name_Change") != -1 && IsValidClient(author) && g_bBlockMessage[author])
    {
        g_bBlockMessage[author] = false;
        return Plugin_Handled;
    }

Ну и вообще, IsClientConnected() в IsValidClient() можно опустить, ибо IsClientInGame() возвращает false если игрок просто не подключен.
 

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #6
1. Поддерживаемые игры и \x02 в выводе сообщений клиенту, увы, но движок OB не умеет.
2. Незначительная претензия к переменным, в которые записывается ник игрока, да размер = 64, но разве для этого не придумана директива MAX_TARGET_LENGTH
3. Лишние проверки ClientId
4. Бесконечное непонятное для меня дергание GetUserMessageType()
5. Двойная проверка ?
C-подобный:
...
        int author = PbReadInt(bf, "ent_idx");
       
        if(!PbReadBool(bf, "chat") || !author) return Plugin_Continue; // ?
       
        PbReadString(bf, "msg_name", buffer, sizeof(buffer));
       
        if(StrContains(buffer, "_Name_Change") != -1 && IsValidClient(author)/* ? */ && g_bBlockMessage[author])
        {
            g_bBlockMessage[author] = false;
            return Plugin_Handled;
        }
...
6. Хранение двух Handle вместо int/bool
7. Повторение одного куска кода в разных функциях.
1. у меня нет другие игы. но буду исправитт.
2. эачем мне искать MAX_TARGET_LENGTH, если я могу проста нажать 2 кнопка (6 и 4)?
3. ?
4. это твой проблем.
5. в чем проблема?
6. какая разница?
7. ?
Сообщения автоматически склеены:

Провальная идея по прежнему.
SB может ещё раньше полезть в базу, чем сработает OnClientPutInServer(). Порядок вызова каллбеков не определен же.

А вот это самый смешной код, который я когда-либо видел:
C-подобный:
    char buffer[25];
    if(GetUserMessageType() == UM_Protobuf)
    {
        int author = PbReadInt(bf, "ent_idx");
       
        if(!PbReadBool(bf, "chat") || !author) return Plugin_Continue;
       
        PbReadString(bf, "msg_name", buffer, sizeof(buffer));
       
        if(StrContains(buffer, "_Name_Change") != -1 && IsValidClient(author) && g_bBlockMessage[author])
        {
            g_bBlockMessage[author] = false;
            return Plugin_Handled;
        }
    }
    else
    {
        int author = BfReadByte(bf);
               
        if(BfReadByte(bf) || !author) return Plugin_Continue;
               
        BfReadChar(bf);
        BfReadChar(bf);
        BfReadString(bf, buffer, sizeof(buffer));
       
        if(StrContains(buffer, "_Name_Change") != -1 && IsValidClient(author) && g_bBlockMessage[author])
        {
            g_bBlockMessage[author] = false;
            return Plugin_Handled;
        }
    }
Во избежание дублирования, его можно было записать так:
C-подобный:
    char buffer[25];
    int author = 0;
    if(GetUserMessageType() == UM_Protobuf)
    {
        author = PbReadInt(bf, "ent_idx");
        if(!PbReadBool(bf, "chat")) return Plugin_Continue;
        PbReadString(bf, "msg_name", buffer, sizeof(buffer));
    }
    else
    {
        author = BfReadByte(bf);
        if(BfReadByte(bf)) return Plugin_Continue;

        BfReadChar(bf);
        BfReadChar(bf);
        BfReadString(bf, buffer, sizeof(buffer));
    }
   
    if(StrContains(buffer, "_Name_Change") != -1 && IsValidClient(author) && g_bBlockMessage[author])
    {
        g_bBlockMessage[author] = false;
        return Plugin_Handled;
    }

Ну и вообще, IsClientConnected() в IsValidClient() можно опустить, ибо IsClientInGame() возвращает false если игрок просто не подключен.
- умный малчик, сначала сам проверя и увидеш зачем OnClientPutInServer(). тогда можеш сказать провал или нет.
- зачем SB раньше полезает в базу, если игрок проста зашел на сервер?
- смешной? какая разница? зачем тратить время для ней?
 
Последнее редактирование:

NaN

FPE_INTDIV_TRAP
Сообщения
1,513
Реакции
1,487
1. у меня нет другие игы. но буду исправитт.
2. эачем мне искать MAX_TARGET_LENGTH, если я могу проста нажать 2 кнопка (6 и 4)?
3. ?
4. это твой проблем.
5. в чем проблема?
6. какая разница?
7. ?
Сообщения автоматически склеены:


- умный малчик, сначала сам проверя и увидеш зачем OnClientPutInServer(). тогда можеш сказать провал или нет.
- зачем SB раньше полезает в базу, если игрок проста зашел на сервер?
- смешной? какая разница? зачем тратить время для ней?
оптимизация кода? Не, не слышали.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #8
Для Вас я не "умный малчик", а злой дядя, который пытается заботиться о качестве плагинов, предоставляемых здесь.

сначала сам проверя и увидеш зачем OnClientPutInServer(). тогда можеш сказать провал или нет.
Да я Вам и так могу сказать, что провал.
Заодно, отвечу и на этот вопрос:
зачем SB раньше полезает в базу, если игрок проста зашел на сервер?
SB пытается искать бан сразу, как только может это сделать (т.е. с появлением доступности SteamID у клиента, когда авторизация тикета произошла).
Никнейм уже гарантированно доступен в OnClientAuthorized() (откуда SB и начинает поиск бана), который может быть вызван (порядок не гарантирован) задолго до OnClientPutInServer().
А теперь попробуем угадать, что случится, если зайдет юзер с кривым ником, его быстро авторизует, СБ найдёт бан и попытается его кикнуть (Вы же помните, что вместе с киком он пытается записать в базу информацию о том, что кто-то был кикнут? Правда?).

Этот форвард может так и не сработать, игрока уже кикнет и SB начнёт писать в базу его ник, но зафэйлится (ведь символы-то в нике остались).

Вы бы вместо того, чтобы спорить с человеком, который за 5 лет понажрался дерьма от приколов Сурсмода, просто взяли и послушали бы, а не стали тянуть свою телегу.
На всякий, вот тут порядок вызова клиентских каллбеков есть. Обратите внимание обязательно на самую первую строчку.
These callbacks are listed in no specific order

эачем мне искать MAX_TARGET_LENGTH, если я могу проста нажать 2 кнопка (6 и 4)?
Чтобы не прострелить себе колено после того, как Valve, если захотят, увеличат размер никнейма.
Когда это произойдёт (если это действительно произойдёт), Вам достаточно будет просто перекомпилировать плагин с актуальными инклудами (авторы SM сами обновят эту константу).

А ещё, я ни на что не намекаю, но на данный момент, максимальная длина никнейма разнится. В обычных, задекларирована максимальная длина в 32 символа, в CS:GO - 128.
 

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #9
Для Вас я не "умный малчик", а злой дядя, который пытается заботиться о качестве плагинов, предоставляемых здесь.
дорогой злой мальчик, дядя так не сделает. дядя верный путь показывает, а не наказывает!

SB пытается искать бан сразу, как только может это сделать (т.е. с появлением доступности SteamID у клиента, когда авторизация тикета произошла).
Никнейм уже гарантированно доступен в OnClientAuthorized() (откуда SB и начинает поиск бана), который может быть вызван (порядок не гарантирован) задолго до OnClientPutInServer().
А теперь попробуем угадать, что случится, если зайдет юзер с кривым ником, его быстро авторизует, СБ найдёт бан и попытается его кикнуть (Вы же помните, что вместе с киком он пытается записать в базу информацию о том, что кто-то был кикнут? Правда?).

Этот форвард может так и не сработать, игрока уже кикнет и SB начнёт писать в базу его ник, но зафэйлится (ведь символы-то в нике остались).
Ты прав ошибка будет. Но это тоже правда что запрещенный игрок все равно не сможет зайти на сервер.

Вы бы вместо того, чтобы спорить с человеком, который за 5 лет понажрался дерьма от приколов Сурсмода, просто взяли и послушали бы, а не стали тянуть свою телегу.
На всякий, вот тут порядок вызова клиентских каллбеков есть. Обратите внимание обязательно на самую первую строчку.
Я все каллбекы знаю. Но OnClientConnect(), OnClientAuthorized(), OnClientConnected() выдает ошибка:
C-подобный:
L 02/14/2020 - 08:02:20: [SM] Exception reported: Entity 1 (1) is invalid
L 02/14/2020 - 08:02:20: [SM] Blaming: player_name_fixer.smx
L 02/14/2020 - 08:02:20: [SM] Call stack trace:
L 02/14/2020 - 08:02:20: [SM]   [0] SetEntPropString
Поэтому пока что выбрал OnClientPutInServer(). Есть предложения для исправление? Если нет, когда я сам найду и тогда вставлю.

Чтобы не прострелить себе колено после того, как Valve, если захотят, увеличат размер никнейма.
Когда это произойдёт (если это действительно произойдёт), Вам достаточно будет просто перекомпилировать плагин с актуальными инклудами (авторы SM сами обновят эту константу).

А ещё, я ни на что не намекаю, но на данный момент, максимальная длина никнейма разнится. В обычных, задекларирована максимальная длина в 32 символа, в CS:GO - 128.
Ты про MAX_NAME_LENGTH (128), а он MAX_TARGET_LENGTH (64). Это хорошая идея, буду изменить на MAX_NAME_LENGTH.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #10
дядя верный путь показывает, а не наказывает!
Где я Вас наказал? Я Вам баллы предупреждений дал, что-ли? Я просто обращаю внимание на ошибки, которые заметил.

Но OnClientConnect(), OnClientAuthorized(), OnClientConnected() выдает ошибка
Потому что игрока в этот момент на сервере еще нет, и можно обойтись без изменения m_szNetname. Энтити для игрока впоследствии будет создана сразу с правильным неймом.
 

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #11

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #12
romeo7 обновил(а) ресурс Player Name Fixer новой записью:

Оптимизация и исправление

* OnClientPutInServer() изменена на OnClientConnect(). Теперь плагин совместим со всеми плагинами;
* добавлено цветное предупреждение для движок OB (не проверял, жду ваш отзыв);
* оптимизация.

Узнать больше об этом обновлении...
 

s777

Участник
Сообщения
449
Реакции
74
Поставил, но никак не реагирует на символы в нике. Попробовал разные символы вставлять, те, что блокирует Client name fixer но результата ноль. Ошибок тоже нет. Решил попробовать этот плагин потому что с нейм фиксером все равно есть ошибки Incorrect string value: "'\xF0\x9F\x95\x86Al...' for column 'name' at row 1"
 

Иван132

Участник
Сообщения
57
Реакции
25
Поставил, но никак не реагирует на символы в нике. Попробовал разные символы вставлять, те, что блокирует Client name fixer но результата ноль. Ошибок тоже нет. Решил попробовать этот плагин потому что с нейм фиксером все равно есть ошибки Incorrect string value: "'\xF0\x9F\x95\x86Al...' for column 'name' at row 1"
А можно у вас уточнить какая игра и если это ксс, то какая версия? А то собирался тоже ставить, у меня css ob.
 

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #16
Поставил, но никак не реагирует на символы в нике. Попробовал разные символы вставлять, те, что блокирует Client name fixer но результата ноль. Ошибок тоже нет. Решил попробовать этот плагин потому что с нейм фиксером все равно есть ошибки Incorrect string value: "'\xF0\x9F\x95\x86Al...' for column 'name' at row 1"
а какие символы именно?
 

s777

Участник
Сообщения
449
Реакции
74
@romeo7 " ᠌ ᠌ ᠌ ", "★", "ℐãℭk", "ヒ;ューストンにしています " - эти варианты попробовал
 

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #18
@romeo7 " ᠌ ᠌ ᠌ ", "★", "ℐãℭk", "ヒ;ューストンにしています " - эти варианты попробовал
эти символы менше 3 байт. это обозначает что utf8mb4 поддерживает ети символы. проблем у твоей ДБ. базу данных нужно преобразовать в utf8mb4. если не хочешь сделать это, тогдо попробый 3 байт utf8 (utf8mb3) версия.
Сообщения автоматически склеены:

Incorrect string value: "'\xF0\x9F\x95\x86Al...' for column 'name' at row 1"
поставил Client name fixer и это ошибка все равно бываеть?
Сообщения автоматически склеены:

А можно у вас уточнить какая игра и если это ксс, то какая версия? А то собирался тоже ставить, у меня css ob.
если у тебя датабаза utf8mb4 тогда проблема не будеть. можешь ставить.
 
Последнее редактирование:

s777

Участник
Сообщения
449
Реакции
74
@romeo7 У меня utf8mb4_unicode_ci
Раз 10 в сутки в еррор логах ошибка бывает с Client name fixer ( от каких символов не знаю)
Можешь скинуть пример символов, которые создают ошибки? Я хочу протестировать
 

romeo7

Участник
Сообщения
189
Реакции
93
  • Автор ресурса
  • #20
@romeo7 У меня utf8mb4_unicode_ci
Раз 10 в сутки в еррор логах ошибка бывает с Client name fixer ( от каких символов не знаю)
Можешь скинуть пример символов, которые создают ошибки? Я хочу протестировать
подожди щас обновляю. добавлял новый переменный.
 
Сверху Снизу