Проблема с ReHLDS build > 788

Сообщения
401
Реакции
113
Помог
2 раз(а)
Ошибка
Игроки заходят в слот под никами предыдущих игроков
ОС
Linux
Amx Mod X
1.10.0.5467
Билд
3.13.0.823-dev
ReGamedll
5.26.0.668-dev
Версия Metamod
1.3.0.131
Список метамодулей
[ 1] SafeNameAndChat     RUN   -    SafeNameAndChat.so          v1.2 Beta 3        ini  ANY   ANY  
[ 2] Reunion RUN - reunion_mm_i386.so v0.1.92d ini Start Never
[ 3] ReAuthCheck RUN - reauthcheck_mm_i386.so v0.1.6 ini Start Never
[ 4] Rechecker RUN - rechecker_mm_i386.so v2.7 ini Chlvl ANY
[ 5] ReSRDetector RUN - resrdetector_mm_i386.so v0.1.0 ini Chlvl ANY
[ 6] ReSemiclip RUN - resemiclip_mm_i386.so v2.3.9 ini Chlvl ANY
[ 7] Revoice RUN - revoice_plus_mm.so v2.1.0 ini ANY Never
[ 8] VoiceUtils RUN - voice_utils_amxx_i386.so v1.0.0 ini ANY ANY
[ 9] AMX Mod X RUN - amxmodx_mm_i386.so v1.10.0.5467 ini Start ANY
[10] HitBox Fix RUN - hitbox_fix_mm_i386.so v1.1.5 ini Start ANY
[11] Accuracy Fix (ACS) RUN - accuracyfix_mm.so v1.0.7b ini ANY ANY
[12] MySQL RUN - mysql_amxx_i386.so v1.10.0.5467 pl9 ANY ANY
[13] CSX RUN - csx_amxx_i386.so v1.10.0.5467 pl9 ANY ANY
[14] CStrike RUN - cstrike_amxx_i386.so v1.10.0.5467 pl9 ANY ANY
[15] ReAPI RUN - reapi_amxx_i386.so v5.24.0.300-dev pl9 ANY Never
[16] ReAimDetector RUN - reaimdetector_amxx_i386.so v0.2.2 pl9 ANY Never
[17] Engine RUN - engine_amxx_i386.so v1.10.0.5467 pl9 ANY ANY
[18] Ham Sandwich RUN - hamsandwich_amxx_i386.so v1.10.0.5467 pl9 ANY ANY
[19] FakeMeta RUN - fakemeta_amxx_i386.so v1.10.0.5467 pl9 ANY ANY
[20] Fun RUN - fun_amxx_i386.so v1.10.0.5467 pl9 ANY ANY
[21] AuthEmu RUN - authemu_amxx_i386.so v5.2.12.525-dev+m pl9 ANY Never
[22] GeoIP RUN - geoip_amxx_i386.so v1.10.0.5467 pl9 ANY ANY
Список плагинов
[  1] 0   ACS Log System          2.0.5       ACADEMY-CS.RU                                      acs_log.amx  debug    
[ 2] 1 ACS Admin Commands 1.2.9 ACADEMY-CS.RU acs_admincm running
[ 3] 2 ACS Admin Menus 1.1.9 ACADEMY-CS.RU acs_plmenu. running
[ 4] 3 ACS Security 1.0.5 ACADEMY-CS.RU acs_securit running
[ 5] 4 ACS Mute 1.0.1.1 ACADEMY-CS.RU acs_mute.am debug
[ 6] 5 ACS Weapon Control Sys 1.2.0.2 DEV-CS.RU acs_wcs.amx debug
[ 7] 6 ACS Teams Balancer 1.1.6 ACADEMY-CS.RU acs_balance debug
[ 8] 7 AuthEmu API 1.0 Dev-MS Team authemu.amx running
[ 9] 8 GameCMS_API 5.6.3 zhorzh78 gamecms_api running
[ 10] 9 ReAimDetector API 0.2.2 ReHLDS Team reaimdetect running
После обновления с ReHLDS билда 788, начались проблемы с именами игроков:
1714078978715_41967945308828436.jpeg

Хронология, примерно, такая:

Код:
L 04/18/2024 - 17:39:32: [ACS_LOG] session: ( 3 ), check_trust: ALL-MS | BOSS < STEAM_1:0:1397272665 > = 58.103118, suspected = 0
L 04/18/2024 - 17:39:33: [ACS_LOG] session: (  3 ), check vpn: 84.54.70.190 [ STEAM_1:0:1397272665 ]
L 04/18/2024 - 17:40:46: [ACS_LOG] session: (  3 ), SetClientUserInfoName(), new_name = владик, punish_processed = 0, punish_flag = 0
L 04/18/2024 - 17:43:04: [ACS_LOG] session: (  3 ), DROPPED!!!, is_drop = 1, msg = Client sent 'drop'
L 04/18/2024 - 17:43:05: [ACS_LOG] session: ( 3 ), new player = владик [ 178.120.X.X:0 ] < STEAM_1:1:7200XXXXXX >
На полном сервере игрок желающий подключиться постоянно жмет кнопочку обновить и как только предыдущий игрок выходит с сервера, тут же подключается новый... НО, под ником предыдущего. Если перезайти (отключиться+подключиться) - то ник обновляется на установленный у нового игрока в настройках клиента. Если же будет просто смена карты - ник все равно останется прежнего игрока, не смотря на настройки клиента.

HLTV вчера у нас тоже зашла с ником игрока и никакие танцы с бубном до полного перезапуска сервера не помогли.

Это какой-то глюк сборки от Арены или баг в ReHLDS, возможно, связанный с ошибкой в SetClientUserInfoName()?
 
В этой теме было размещено решение! Перейти к решению.
Последнее редактирование:
Сообщения
401
Реакции
113
Помог
2 раз(а)
Nordic Warrior, проблема в наличии 32 игроков... я с ботами не могу повторить подобного сценария.
 
Последнее редактирование:
Сообщения
3,566
Реакции
1,560
Помог
131 раз(а)
Refresh, уверен что дело в рехлдс? У меня была такая проблема, когда я давно ещё плохо разбирался, и написал некачественный плагин блокировки смены ников, и возникали ровно такие же ситуации, что иногда у игрока подхватывался ник другого.
Если есть такой функционал, то стоит его отключить.
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Nordic Warrior, это началось с обновления, если бы была проблема ДО - ее уже давно бы заметили. У меня есть код в обработчике SetClientUserInfoName() но он срабатывает только если пользователь меняет ник находясь на сервере (никаких строк отладки этого события в процессе коннекта я никогда не видел). При коннекте ничего что бы могло влиять на "имя пользователя" в любых вариациях отсутствует.

В client_connect() имя пользователя выдается от предыдущего игрока.

Была аналогичная проблема с HLTV имеющая на сервере абсолютный иммунитет, никакие процессы не могут быть запущены для игрока is_user_hltv(), поэтому я уверен, что это проблема на стороне сервера.

Даже если принять во внимание гипотетическую возможность блокировки события SetClientUserInfoName(), например, в процессе работы плагина заблокировалась смена ника предыдущим игроком:
Код:
SetHookChainReturn(ATYPE_BOOL, false);
return HC_BREAK;
Я не вижу причин, по которым бы сервер при заходе нового игрока не обновлял бы свои данные.
 
Последнее редактирование:
Сообщения
3,566
Реакции
1,560
Помог
131 раз(а)
Refresh, проверяй на практике. Отключай этот функционал, ставь официальные билды рехлдс, перебором ищи билд, с которого всё пошло не так, если это в рехлдс дело. Гадать сколько угодно можно. Я посмотрел последние коммиты рехлдс, вроде не увидел ничего связанного с name
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Nordic Warrior, Я смог устойчиво воспроизвести проблему:

  1. Игрок мертвый. Висит в спектраторах или в своей команде.
  2. Меняет имя: name ZZZTT2S. Имя не изменится сразу до следующего спавна. Я это корректирую, чтобы в TAB-е отображалось корректно:
    Код:
    set_entvar(id, var_netname, new_name)
  3. Игрока дропает с сервера или он уходит сам.
  4. В его слот коннектится новый игрок. Причем у него будет тот ник на который предыдущий игрок его изменил и не дождался спавна... В моем примере ZZZTT2S.
Попробую еще установить set_user_info(...) или при дисконнекте var_netname обнулять, но в алгоритме изменения имени игрока очевидный косяк... Если игрок отключится, дальнейшие задачи по нему выполнять бесмысленно. Я попробую поискать ошибку, у вас.

1714406630299.png

Upd: В дисконнекте set_entvar(id, var_netname, ""); решило проблему... Наверно, нужно сделать аналогично в ReHLDS.

Upd2: Корректно так:
Код:
public client_disconnected(id, bool:drop, message[], maxlen) {
    if (!is_nullent(id))
        set_entvar(id, var_netname, 0);
}
Если не проверять:
Код:
[ReAPI] set_entvar: invalid or uninitialized entity
 
Последнее редактирование:
Сообщения
73
Реакции
36
Помог
4 раз(а)
Аналогично встречал проблему если менять ник через var_netname, через set_user_info проблема исчезла
 
Сообщения
3,566
Реакции
1,560
Помог
131 раз(а)
Refresh, ну как я и думал, всё-таки из-за вмешательства плагинами была проблема.
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Nordic Warrior, :scratch_one-s_head:а мне показалось, что если игрок отключился и новый игрок подключается к серверу, то сервер должен брать имя нового игрока, а не предыдущего... в 100 из 100 случаях. Но это не точно... Поскольку логику разрабов понять довольно сложно. Возможно, плагин одной командой сломал сервер.
30 Апр 2024
CSBishop, через set_user_info не меняет сразу ник мертвому игроку или наблюдателю :sad:
 
Последнее редактирование:
Сообщения
654
Реакции
560
Помог
9 раз(а)
Скорее всего это баг в регейме.

Имя не изменится сразу до следующего спавн
Он хранится в мемберах временно и восстанавливается при след. спавне.



Я вообще не вижу в коде сброс этих 2 мемберов при дисконнекте.
В обычных условиях возможно будет работать нормально. Но при
наличии 32 игроков
Возможен такой сценарий.
30 Апр 2024
Скорее всего это баг в регейме.
Хотя может быть это более глубокий баг движка если оно возникнет только при 32 игроках.
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Сейчас еще попробую сбросить два мембера:
Код:
Public:
    bool m_bHasChangedName;   
    char m_szNewName[MAX_PLAYER_NAME_LENGTH];
 
Сообщения
654
Реакции
560
Помог
9 раз(а)
Refresh, А баг стабильно воспроизводится?
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Vaqtincha, да, тут можно попробовать 93.85.88.50:27017. Пофиксил.
Сейчас еще попробую сбросить два мембера:
Код:
Public:
    bool m_bHasChangedName;
    char m_szNewName[MAX_PLAYER_NAME_LENGTH];
Это не работает, ни в CBasePlayer_SetClientUserInfoName ни в client_disconnected(). Пока рабочий вариант обнуление var_netname при дисконнекте.
30 Апр 2024
Vaqtincha, Да. Количество игроков не имеет значения. Просто когда мало игроков, вероятность такой ситуации - входа в слот где предыдущий игрок "мертвым" изменил имя и вышел до респавна - значительно ниже.
 
Последнее редактирование:
Сообщения
401
Реакции
113
Помог
2 раз(а)
Лечение глюков ReGame:
Код:
public client_disconnected(id, bool:is_drop, message[], maxlen) {
    if (is_drop && !is_nullent(id))
        set_entvar(id, var_netname, 0);
}
 
Сообщения
59
Реакции
10
Помог
1 раз(а)
Refresh, не все тут скриптеры, поэтому дополню
Код:
#include <amxmodx>
#include <reapi>

public plugin_init()
{
    register_plugin("[ReAPI] Fix Name After Disconnect (ReGameDLL bug)", "0.1", "Refresh");
}

public client_disconnected(id, bool:is_drop, message[], maxlen)
{
    if (is_drop && !is_nullent(id))
    {
        set_entvar(id, var_netname, 0);
    }
}
 
Сообщения
1,031
Реакции
827
Помог
10 раз(а)
Проблему воспроизвести не смог, дай свой полный плагин того, что ты нам накодил

Логи
Код:
// Первый заход с ником Javekson
rh_client_connected - user: 32 | username:  | netname:
client_connectex - user: 32 | username:  | netname:  | name: Javekson
client_connect - user: 32 | username: Javekson | netname:
client_authorized - user: 32 | username: Javekson | netname:
client_putinserver - user: 32 | username: Javekson | netname: Javekson

// Меняю ник на Seledka и в хуке SetClientUserInfoName ставлю var_netname
// В табе сразу видно новый ник Seledka
rh_client_change_name - user: 32 | username: Javekson | netname: Javekson | newname: Seledka
rh_client_change_name - user: 32 | username: Javekson | netname: Seledka | newname: Seledka

// Выхожу с сервера
client_disconnected - user: 32 | username: Seledka | netname: Seledka
rh_client_drop - user: 32 | username: Seledka | netname: Seledka
client_remove - user: 32 | username: Seledka | netname: Seledka

// Меняю ник на Vodka и только затем захожу на сервер

// Почему то сработал SetClientUserInfoName при коннекте
rh_client_change_name - user: 32 | username: Seledka | netname: Seledka | newname: Vodka
rh_client_change_name - user: 32 | username: Seledka | netname: Vodka | newname: Vodka

// Сам коннект
rh_client_connected - user: 32 | username: Seledka | netname: Vodka
client_connectex - user: 32 | username: Seledka | netname: Vodka | name: Vodka
client_connect - user: 32 | username: Vodka | netname: Vodka
client_authorized - user: 32 | username: Vodka | netname: Vodka
client_putinserver - user: 32 | username: Vodka | netname: Vodka

// Как видим в client_connect мой новый ник, какой и должен быть, в табе тоже
Плагин
Код:
#include amxmodx
#include reapi

public plugin_init() {
    //RegisterHookChain(RH_SV_ConnectClient, "rh_client_connect", .post = true);
    RegisterHookChain(RH_ClientConnected, "rh_client_connected", .post = true);
    RegisterHookChain(RH_SV_DropClient, "rh_client_drop", .post = true);
    RegisterHookChain(RG_CBasePlayer_SetClientUserInfoName, "rh_client_change_name", .post = true);
}

/*
public rh_client_connect() {
    log_to_file("test_name.log", "rh_client_connect -");
}
*/

public rh_client_connected(const user) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "rh_client_connected - user: %i | username: %s | netname: %s", user, username, netname);
}

public rh_client_drop(const user, const bool:crash, const fmt[]) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "rh_client_drop - user: %i | username: %s | netname: %s", user, username, netname);
}

public rh_client_change_name(const user, const info_buffer[], const new_name[]) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "rh_client_change_name - user: %i | username: %s | netname: %s | newname: %s", user, username, netname, new_name);

    /* ------------------------------ */
    
    set_entvar(user, var_netname, new_name);
    get_entvar(user, var_netname, netname, charsmax(netname));
    get_user_name(user, username, charsmax(username));
    log_to_file("test_name.log", "rh_client_change_name - user: %i | username: %s | netname: %s | newname: %s", user, username, netname, new_name);
}

public client_connect(user) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "client_connect - user: %i | username: %s | netname: %s", user, username, netname);
}

public client_connectex(user, const name[], const ip[], reason[128]) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "client_connectex - user: %i | username: %s | netname: %s | name: %s", user, username, netname, name);
}

public client_authorized(user, const authid[]) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "client_authorized - user: %i | username: %s | netname: %s", user, username, netname);
}

public client_putinserver(user) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "client_putinserver - user: %i | username: %s | netname: %s", user, username, netname);
}

public client_disconnected(user, bool:drop, message[], maxlen) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "client_disconnected - user: %i | username: %s | netname: %s", user, username, netname);
}

public client_remove(user, bool:drop, const message[]) {
    if (is_user_bot(user)) return;

    new netname[32];
    get_entvar(user, var_netname, netname, charsmax(netname));

    new username[32];
    get_user_name(user, username, charsmax(username));

    log_to_file("test_name.log", "client_remove - user: %i | username: %s | netname: %s", user, username, netname);
}
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Javekson, в плагине хук прерывает смену имени по какому-то критерию.

Код:
RegisterHookChain(RG_CBasePlayer_SetClientUserInfoName, "CBasePlayer_SetClientUserInfoName");

Прерывается хук такой командой:

SetHookChainReturn(ATYPE_BOOL, false);
return HC_BREAK;
У меня стабильно воспроизводился баг вообще без плагинов на пустом сервере с 31 yapb ботом. Я переформатировал тестовый сервер под другой сценарий использования, попозже еще раз проверю.
 

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

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