Детект команды клиента

nuPAT

Участник
Сообщения
163
Реакции
25
Не знаю, есть ли такая возможность в ГОУ, потому пишу сюда. Есть ли возможность обнаружить, какая переменная команды стоит на клиенте?
 

nuPAT

Участник
Сообщения
163
Реакции
25
Точно также, как проверить, стоит закачка всех файлов на клиенте игрока или нет.
Буду считать это "Да"...
Сможет кто сделать плагин чекающий текущее значение команды на клиенте?
Буду рад, если плагин уже существует.
 
Последнее редактирование:

nuPAT

Участник
Сообщения
163
Реакции
25
Вот тема. Там и код на пробу и ниже ссылки на готовые примеры.
Спасибо! А можешь доработать плагин? Хочется не кика, а персонального уведомления для игрока в чат...
Если уж совсем обнаглеть, то с определенной периодичностью :)

Нужно предложить игроку выставить переменную команды на 0. А конкретно - cl_disablehtmlmotd 0...
Чтобы этого добиться, я пишу
QueryClientConVar(client, "cl_disablehtmlmotd", ConVarQueryFinished:ClientConVar1, client);
а сюда
Так?

#include <sourcemod>

public OnClientAuthorized(client, const String:auth[])
{
QueryClientConVar(client, "cl_allowdownload", ConVarQueryFinished:ClientConVar1, client);
}

public
ClientConVar1(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName1[], const String:cvarValue1[])
{
if ( !
IsClientConnected(client) )
return
true;

new
cvarValueNew = StringToInt(cvarValue1);

if (
cvarValueNew != 1)
{
KickClient(client, "Пропиши в консоль: cl_allowdownload 1");
}
return
true;
}
//UP
Заставил плагин кикать игроков с нужной переменной. Но нет сообщения, как пишется при кике с сервера. Просто при коннекте на сервер выкидывает в главное меню без сообщения в центре экрана. В консоли есть.
Можно сделать версию без кика, но с предложением о включении нужной ф-ции в чат или лучше в подсказку игроку (hint, на черном фоне, с ! знаком)...
//UP
Нашел еще одну проблему. Плагин бесполезен, если поменять квар находясь уже на сервере. Т.е зашел с cl_disablehtmlmotd 0 а затем выставил cl_disablehtmlmotd 1
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
есть баг. Поменяв переменную - сообщение не исчезает пока не перезайдешь на сервер
Я путаю с переменной закачки. Там это только плюс.
Значит, ещё в самом сообщении проверять:
PHP:
#define TIME_MESSAGE 60.0 //Время повтора проверки переменной клиента и выдачи сообщения (секунд).

new Handle:hTimerMessage[MAXPLAYERS+1];

public OnClientPostAdminCheck(client) hTimerMessage[client] = CreateTimer(TIME_MESSAGE, RepeatMessage, client, TIMER_REPEAT);

public OnClientDisconnect(client) if (hTimerMessage[client])
{
	KillTimer(hTimerMessage[client]);
	hTimerMessage[client] = INVALID_HANDLE;
}

public ClientConVar1(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName1[], const String:cvarValue1[])
{
	if (cvarValue1[0] == '1') PrintHintText(client, "Пропиши в консоль: cl_disablehtmlmotd 0");
}

public Action:RepeatMessage(Handle:timer, any:client)
{
	QueryClientConVar(client, "cl_disablehtmlmotd", ConVarQueryFinished:ClientConVar1, client);
	return Plugin_Continue;
}
Плагин постоянно проверяет переменную игрока с заданным интервалом.
 

nuPAT

Участник
Сообщения
163
Реакции
25
Плагин постоянно проверяет переменную игрока с заданным интервалом.
Благодарю!
Есть 1 вопрос: Не будет ли плагин, постоянно проверяющий клиентов (пусть и через период) создавать нагрузку/лаги/фризы и т.д во время проверки? Ведь, как я понимаю, все игроки (а у меня их много) будут проверяться одновременно... Или у каждого это время свое и таймер ведет отсчет от времени захода игрока на сервер?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
создавать нагрузку
Конечно будет. До лагов от такого мелкого кода, конечно, далеко.
у каждого это время свое и таймер ведет отсчет от времени захода игрока на сервер?
Да. Кстати, надо было общий таймер сделать, раз уж наклон плагина изменился (чтобы не меняли переменные, находясь уже на сервере).
Если хочется сообщения одновременно всем отсылать, то:
PHP:
#define TIME_MESSAGE 60.0 //Время повтора проверки переменной клиентов и выдачи сообщения (секунд).

new bool:bNoActive = true;

public OnClientPostAdminCheck(client) if (bNoActive)
{
	CreateTimer(TIME_MESSAGE, RepeatMessage, _, TIMER_REPEAT);
	bNoActive = false;
}

public ClientConVar1(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName1[], const String:cvarValue1[])
{
	if (cvarValue1[0] == '1') PrintHintText(client, "Пропиши в консоль: cl_disablehtmlmotd 0");
}

public Action:RepeatMessage(Handle:timer)
{
	for (new i = bNoActive = true; i <= MaxClients; ++i) if (IsClientInGame(i))
	{
		QueryClientConVar(i, "cl_disablehtmlmotd", ConVarQueryFinished:ClientConVar1, i);
		bNoActive = false;
	}
	return bNoActive ? Plugin_Stop:Plugin_Continue;
}
Таймер отключится, если на сервере долго (TIME_MESSAGE) никого нет.
 

nuPAT

Участник
Сообщения
163
Реакции
25
Вопрос. Разве не будет лучше, чтобы таймер был у всех разным? Ведь нагрузка будет создаваться меньше, когда не всем разом будет исполняться проверка.

Таймер отключится, если на сервере долго (TIME_MESSAGE) никого нет.
Это в какой версии плагина? В последней? И что произойдет, если долго никого не будет? При возвращении игроков - плагин не будет работать до перезапуска сервера?

(чтобы не меняли переменные, находясь уже на сервере).
Ты это уже поборол в предыдущей версии. Проверил.
//UP Меняешь значение - плагин реагирует. (сообщение есть при 1. При 0 - его нет)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Разве не будет лучше, чтобы таймер был у всех разным?
В плане сообщений лучше - у каждого оно через свой промежуток времени с самого начала (но нам это не требуется, такая точность, поэтому опускаем).
не всем разом будет исполняться проверка
Только в этот момент, зато всё остальное время будет тикать аж до 64 таймеров вместо 1-го.
В последней? И что произойдет, если долго никого не будет? При возвращении игроков - плагин не будет работать до перезапуска сервера?
Да. Плагин "отключится". Как только игрок зайдёт - активируется заново.
 
Сверху Снизу