Grey83
не пишу плагины с весны 2022
- Сообщения
- 8,521
- Реакции
- 4,980
@oleg_nelasy, я бы подсказал как отловить открытие меню с выбором команды в КСС, но подозреваю, что тебе нужно для КСГО, а там мой метод не срабатывает, емнип.
Про это в курсе. Но мне по факту нужно не открытие меню а именно событие когда игрок подключился и он уже не грузится то есть ему это меню выбора команды отрисовало.@oleg_nelasy, я бы подсказал как отловить открытие меню с выбором команды в КСС, но подозреваю, что тебе нужно для КСГО, а там мой метод не срабатывает, емнип.
OnClientPutInServer(int client)игрок подключился и он уже не грузится
Лучше вот так:C-подобный:public void Event_Activate(Event event, const char[] sEvName, bool bDontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if(!g_hTimer[client]) g_hTimer[client] = CreateTimer(g_fTimer, Timer_ConnectTeam, GetClientUserId(client)); } public Action Timer_ConnectTeam(Handle timer, any client) { if((client = GetClientOfUserId(client))) // если игрок всё ещё на сервере, возможно эта проверка не нужна { if(GetClientTeam(client) == CS_TEAM_NONE) ChangeClientTeam(client, CS_TEAM_SPECTATOR); g_hTimer[client] = null; // обнуляем хэндл таймера } return Plugin_Stop; } public void OnClientDisconnect(int client) { if(g_hTimer[client]) delete g_hTimer[client]; // если таймер существует, то его удаляем }
if(IsClientInGame(iClient) && GetClientTeam(iClient) == CS_TEAM_NONE) ChangeClientTeam(iClient, CS_TEAM_SPECTATOR);
если первая проверка возвращает false, то последующие через && не производятся за ненадобностьюНадеюсь если игрок не в игре на GetClientTeam уже проверять не будет?
текст ошибки?Заметил что ошибку не в игре при перезапуске сервера иногда появлялась. По сути сервер еще не поменял карту но игрок уже не в игре.
Клиент не в игре. После данной правки у всех все работает четко ошибка больше не вылазит. это выбивало иногда когда новый игрок недавно зашел и тут же карта поменялась. По сути у него таймер вот вот должен отработать и карта начала меняться.если первая проверка возвращает false, то последующие через && не производятся за ненадобностью
Сообщения автоматически склеены:
текст ошибки?
вообще при смене карты происходит дисконнект игроковПри смене карты таймер убивается если он есть?
так в логе и пишет, на русском языке и без подробностей?Клиент не в игре. После данной правки у всех все работает четко ошибка больше не вылазит.
В логе пишет на английском. Клиент не в игре. Указывает данною строку и ругалось на GetClientTeam.вообще при смене карты происходит дисконнект игроков
Но можно при событии OnMapEnd() убивать таймеры
Сообщения автоматически склеены:
так в логе и пишет, на русском языке и без подробностей?
public void Event_Activate(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
if(g_hTimer[iClient])
{
g_hTimer[iClient] = null;
delete g_hTimer[iClient];
}
g_hTimer[iClient] = CreateTimer(g_fTaimer, TimerConnectTeam, GetClientUserId(iClient));
}
Обнулять хэндл нужно после убийства таймера, а если используешь delete, то обнулять не нужно т.к. он и так обнуляется.if(g_hTimer[iClient]) { g_hTimer[iClient] = null; delete g_hTimer[iClient]; }
понятия не имею: ты так нигде не упомянул что за это у тебя событие ловитсяВажный вопрос что отработает раньше OnMapEnd() или Event_Activate?
А потом пишешь на C++ и тоже думаешь, что и там обнулять не нужно, и проги крашатся =) Я из-за этого свои ClearHandle/ClearTimer функции юзаю, а когда нужно просто закрыть и приравнивание к null не нужно, скармливаю delete, если лень написать более длинное CloseHandle или какое-то неявное не пойми где .Close(). Зачем sm ушёл от логики в этом моменте, странно, и плохоа если используешь delete, то обнулять не нужно т.к. он и так обнуляется.
понятия не имею: ты так нигде не упомянул что за это у тебя событие ловится
Это насколько я понял подключение игрока к серверу. Как мне объяснили когда игрок полностью подключен к серверу. Игрок при подключении активирует таймер. Таймер убивается если он отработал. Или если не отработал то при дисконекте убивается. Вызывается только один раз поэтому при дисконекте в любом случаи таймер убьет.