Событие смены карты, когда ещё имеются игроки

Сообщения
225
Реакции
90
Помог
1 раз(а)
Здравствуйте. Столкнулся с такой проблемой, нужно получить данные об игроках, которые находятся на сервере в момент, когда карта сменяется. Интырнеты меня вывели к следующим решениям: server_changelevel(), который не вызывается при команде changelevel и
C++:
public plugin_init()
     register_event("30", "ChangeMap", "a");

public ChangeMap()
{
    //супир приваты!
}
Второй вариант если когда-то где-то и работал, то разве что на орочей магии.
Имеется вообще смысл искать это событие? Или может стоит выполнять сохранение данных в plugin_end(), а данные собирать до него?
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
RG_CSGameRules_GoToIntermission будет вызван в один из моментов окончания игры. Один из примеров - истечение mp_timelimit времени

Код:
register_event("30", "ChangeMap", "a")
- сработает внутри функции GoToIntermission когда сервер начнёт отсылать клиентам SVC_INTERMISSION message, чтобы те включили таб и повесили игроков на mp_chattime время ожидания до следующей карты.

RG_CSGameRules_ChangeLevel вызывается непосредственно перед сменой карты логикой GameDLL. То есть, время INTERMISSION уже будет пройдено.

Эти функции не будут вызваны если сервер сменил карту не естественным путём, в обход логики GameDLL.
То есть, вмешался админ консольной командой Changelevel или ещё чем-то.

Например этими командами:

Благодарю за хороший вопрос. В своё время меня этот вопрос так же мучал, и я не понимал куда копать.
7 Мар 2021
Или может стоит выполнять сохранение данных в plugin_end()
Именно, но решение не единственное. Так же можно хукнуть всё выше пречисленное из команд и RG_CSGameRules_ChangeLevel

AMXModX вызывает эту функцию прямо перед завершением карты в C_ServerDeactivate().

Который в свою очередь будет вызван в любом из выше перечисленных случаев, из функции SV_ServerShutdown() , допустим по команде restart или же правилами GameDLL, который так же сошлются (CHANGE_LEVEL == *g_engfuncs.pfnChangeLevel == Host_Changelevel_f() ) в HLDS Engine и совершат вызов SV_ServerShutdown()


Постарался дать развёрнутый ответ, надеюсь это кому-нибудь поможет.
 
Последнее редактирование:
Сообщения
225
Реакции
90
Помог
1 раз(а)
wopox1337, не разобрался как команды хукнуть, а RG_CSGameRules_ChangeLevel у меня не вызывается при смене карты.
Задаче накостылял. В player_disconnected() учитывал, когда игрок вышел с сервера. Основываясь на этих данных в plugin_end() сохранял.
 

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

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