Искал очередную ошибку и столкнулся с интересным поведением 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
Смотрим что по факту происходит:
Все боты дропаются с сервера, потом он завершает свою работу, после чего, я, по аналогии с реапи, выставляю
Кто-то из знающих может мне подсказать, это так и задумано? Просто мне кажется они должны дисконнектиться ДО завершения работы сервера... иначе какой смысл в этих событиях?!
Либо не обнулять указатель и дождаться следующего вызова
А эта функция вызывается отсюда: 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
при смене карты до и после смены карты - не совпадают.
Последнее редактирование: