ClientDisconnect() после смены карты

Сообщения
403
Реакции
114
Помог
2 раз(а)
Искал очередную ошибку и столкнулся с интересным поведением ReGame... После смены карты ReHLDS дропает ботов и переключает игроков в "неактивное состояние" вот тут: https://github.com/dreamstalker/reh...c7e493dda28a6/rehlds/engine/sv_main.cpp#L7645

А эта функция вызывается отсюда: https://github.com/dreamstalker/reh...6/rehlds/engine/host_cmd.cpp#L1102C2-L1102C22

Смотрим что по факту происходит:
Код:
[DEBUG] SV_DropClient_RH() ===>
[DEBUG] Client_Disconnected(): id = 12, is_connected = 1
[DEBUG] Client_Disconnected(): id = 12, name = lidbil
[DEBUG] num_unassigned = 1, num_tt = 1, num_ct = 2, num_spec = 0
[DEBUG] R_ClientDisconnect() ===>
[DEBUG] Client_Disconnected(): id = 12, is_connected = 0
Dropped lidbil from server
Reason:  Dropping fakeclient on level change
[DEBUG] SV_DropClient_RH() ===>
[DEBUG] Client_Disconnected(): id = 13, is_connected = 1
[DEBUG] Client_Disconnected(): id = 13, name = ObsCure
[DEBUG] num_unassigned = 1, num_tt = 1, num_ct = 1, num_spec = 0
[DEBUG] R_ClientDisconnect() ===>
[DEBUG] Client_Disconnected(): id = 13, is_connected = 0
Dropped ObsCure from server
Reason:  Dropping fakeclient on level change
[DEBUG] SV_DropClient_RH() ===>
[DEBUG] Client_Disconnected(): id = 14, is_connected = 1
[DEBUG] Client_Disconnected(): id = 14, name = Botinok
[DEBUG] num_unassigned = 1, num_tt = 1, num_ct = 0, num_spec = 0
[DEBUG] R_ClientDisconnect() ===>
[DEBUG] Client_Disconnected(): id = 14, is_connected = 0
Dropped Botinok from server
Reason:  Dropping fakeclient on level change
[DEBUG] SV_DropClient_RH() ===>
[DEBUG] Client_Disconnected(): id = 15, is_connected = 1
[DEBUG] Client_Disconnected(): id = 15, name = 4you
[DEBUG] num_unassigned = 1, num_tt = 0, num_ct = 0, num_spec = 0
[DEBUG] R_ClientDisconnect() ===>
[DEBUG] Client_Disconnected(): id = 15, is_connected = 0
Dropped 4you from server
Reason:  Dropping fakeclient on level change
Shutting down bot thread worker.
[DEBUG] SERVER_DEACTIVATED
[DEBUG] R_ClientDisconnect() ===>
Все боты дропаются с сервера, потом он завершает свою работу, после чего, я, по аналогии с реапи, выставляю g_pEdicts = nullptr;, после чего прилетает событие ClientDisconnect() из ReGame... для обычных игроков, не ботов.

Кто-то из знающих может мне подсказать, это так и задумано? Просто мне кажется они должны дисконнектиться ДО завершения работы сервера... иначе какой смысл в этих событиях?!

ClientDisconnect() из ReGame полностью дублирует события SV_DropClient из ReHLDS, а когда мне нужно действительно знать отключился ли игрок при смене карте или его дропнуло - у меня уже нет указателя на объекты g_pEdicts... И я пока не нашел никакого другого события после дисконнекта всех игроков перед запуском новой карты... чтобы можно было отследить этот момент и обнулить указатель g_pEdicts там.

Либо не обнулять указатель и дождаться следующего вызова pfnKeyValue() для "worldspawn"... но на что он будет ссылаться в период времени между SERVER_DEACTIVATED и SERVER_ACTIVATED не понятно... память ведь должна быть освобождена в какой-то момент, поскольку адреса указателя g_pEdicts при смене карты до и после смены карты - не совпадают.
 
Последнее редактирование:
Сообщения
59
Реакции
10
Помог
1 раз(а)
@Refresh,Что-то мне подсказывает, что такие вопросы лучше задавать на гитхабе в соответствующих ветках.
 

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

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