Отследить значение клиентской команды

Anub1s

Участник
Сообщения
37
Реакции
2
Здравствуйте. Как можно отследить значение клиентской команды, например, sv_logecho ?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
отследить значение клиентской команды, например, sv_logecho
PHP:
public OnPluginStart()
{
    decl Handle:convar;
    if ((convar = FindConVar("sv_logecho")) == INVALID_HANDLE) SetFailState("Данного СЕРВЕРНОГО квара не существует (не найден)!"); //Квары ПЛАГИНОВ обычно получают позже.
    //Начинаем отлов любых изменений квара выше.
    HookConVarChange(convar, ChangeCvar);
}

public ChangeCvar(Handle:convar, const String:oldValue[], const String:newValue[])
{
    // convar - Handle квара;
    // oldValue - старое строчное значение квара;
    // newValue - новое строковое значение квара.
}
 

Anub1s

Участник
Сообщения
37
Реакции
2
PHP:
public OnPluginStart()
{
    decl Handle:convar;
    if ((convar = FindConVar("sv_logecho")) == INVALID_HANDLE) SetFailState("Данного СЕРВЕРНОГО квара не существует (не найден)!"); //Квары ПЛАГИНОВ обычно получают позже.
    //Начинаем отлов любых изменений квара выше.
    HookConVarChange(convar, ChangeCvar);
}

public ChangeCvar(Handle:convar, const String:oldValue[], const String:newValue[])
{
    // convar - Handle квара;
    // oldValue - старое строчное значение квара;
    // newValue - новое строковое значение квара.
}
А разве ConVar поможет отследить значение клиентских команд? Мне нужно узнать конкретно sensetivity
 

FurFur

Участник
Сообщения
153
Реакции
85
Вот так

PHP:
QueryClientConVar(client, "sv_logecho", GetClientConVar);

public GetClientConVar(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{

}
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Anub1s

Участник
Сообщения
37
Реакции
2
Вот так

PHP:
QueryClientConVar(client, "sv_logecho", GetClientConVar);

public GetClientConVar(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{

}
Спасибо, помогло. Но команда работает некорректно. Если предварительно перед входом написать sv_logecho 0, а потом сразу sv_logecho 1, и зайти на сервер, то проверка не сработает. Вот код:


#include <sourcemod>

public Plugin:myinfo =
{
name = "Check change ip",
author = "Anubis",
version = "1.0"
};

new Handle:CheckCMDTimer[MAXPLAYERS+1];

public OnClientPutInServer(client)
{
CheckCMDTimer[client] = CreateTimer(2.0, CommandsCheck, client);
}

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

public Action:CommandsCheck(Handle:timer, any:client)
{
QueryClientConVar(client, "sv_logecho", GetClientConVar);
QueryClientConVar(client, "sv_logflush", GetClientConVar);
CheckCMDTimer[client] = INVALID_HANDLE;
}

public GetClientConVar(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{
if(StrEqual(cvarName,"sv_logecho") && StrEqual(cvarValue,"0")) {
KickClient(client, "Установите значение sv_logecho 1");
}

if(StrEqual(cvarName,"sv_logflush") && StrEqual(cvarValue,"0")) {
KickClient(client, "Установите значение sv_logflush 1");
}
}
 

Anub1s

Участник
Сообщения
37
Реакции
2
PHP:
CreateTimer(2.0, CommandsCheck, client, TIMER_REPEAT);
Квар надо проверять постоянно. "Хук" то одноразовый.
А можно подробнее как это сделать? Я не силен в SP
--- Добавлено позже ---
PHP:
CreateTimer(2.0, CommandsCheck, client, TIMER_REPEAT);
Квар надо проверять постоянно. "Хук" то одноразовый.
Добавил рипит таймера теперь сервер крашится каждые 2с
 
Последнее редактирование:

Someone

Участник
Сообщения
1,933
Реакции
1,653
А одним таймером не лучше будет?

PHP:
#pragma semicolon 1

new Handle:g_hTimer;

public OnMapStart()
{
    g_hTimer = CreateTimer(5.0, CheckPlayerCvar, _, TIMER_REPEAT);
}

public OnMapEnd()
{
    KillTimer(g_hTimer);
}

public Action CheckPlayerCvar(Handle timer)
{
    for(new i = 1; i <= MaxClients; i++) if(IsClientInGame(i))
    {
        QueryClientConVar(i, "sv_logecho", ConVarQueryFinished:ClientConVar);
        QueryClientConVar(i, "sv_logflush", ConVarQueryFinished:ClientConVar);
    }
}

public ClientConVar(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{
    new cvarInt = StringToInt(cvarValue);
  
    if(StrEqual(cvarName,"sv_logecho") && cvarInt == 1)
    {
        KickClient(client, "Установите значение sv_logecho 1");
    }

    if(StrEqual(cvarName,"sv_logflush") && cvarInt == 1)
    {
        KickClient(client, "Установите значение sv_logflush 1");
    }
}
 
Последнее редактирование:

Anub1s

Участник
Сообщения
37
Реакции
2
А одним таймером не лучше будет?

PHP:
#pragma semicolon 1

new Handle:g_hTimer;

public OnMapStart()
{
    g_hTimer = CreateTimer(5.0, CheckPlayerCvar, _, TIMER_REPEAT);
}

public OnMapEnd()
{
    KillTimer(g_hTimer);
}

public Action CheckPlayerCvar(Handle timer)
{
    for(new i = 1; i <= MaxClients; i++) if(IsClientInGame(i))
    {
        QueryClientConVar(i, "sv_logecho", ConVarQueryFinished:ClientConVar);
        QueryClientConVar(i, "sv_logflush", ConVarQueryFinished:ClientConVar);
    }
}

public ClientConVar(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{
    new cvarInt = StringToInt(cvarValue);
 
    if(StrEqual(cvarName,"sv_logecho") && cvarInt == 1)
    {
        KickClient(client, "Установите значение sv_logecho 1");
    }

    if(StrEqual(cvarName,"sv_logflush") && cvarInt == 1)
    {
        KickClient(client, "Установите значение sv_logflush 1");
    }
}
Все же плохая была идея с таймером, сервер перегружается вплоть до лагов
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
сервер перегружается вплоть до лагов
Попробуй так:
PHP:
public OnPluginStart() CreateTimer(5.0, CheckPlayerCvar, _, TIMER_REPEAT);

public Action:CheckPlayerCvar(Handle:timer)
{
	for (new i = 1; i <= MaxClients; ++i)
	{
		if (IsClientInGame(i) && !IsFakeClient(i))
		{
			QueryClientConVar(i, "sv_logecho", ClientConVar);
			QueryClientConVar(i, "sv_logflush", ClientConVar);
		}
	}
	return Plugin_Continue;
}

public ClientConVar(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{
	if (result != ConVarQuery_Okay) SetFailState("Что-то пошло не так (ошибка №:%i)!", result);
	if (cvarValue[0] == '0') KickClient(client, "Установите значение %s 1", strcmp(cvarName, "sv_logecho") ? "sv_logflush":"sv_logecho");
}
Посмотри лог ошибок после. Он всё скажет.
 

Anub1s

Участник
Сообщения
37
Реакции
2
Попробуй так:
PHP:
public OnPluginStart() CreateTimer(5.0, CheckPlayerCvar, _, TIMER_REPEAT);

public Action:CheckPlayerCvar(Handle:timer)
{
    for (new i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            QueryClientConVar(i, "sv_logecho", ClientConVar);
            QueryClientConVar(i, "sv_logflush", ClientConVar);
        }
    }
    return Plugin_Continue;
}

public ClientConVar(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{
    if (result != ConVarQuery_Okay) SetFailState("Что-то пошло не так (ошибка №:%i)!", result);
    if (cvarValue[0] == '0') KickClient(client, "Установите значение %s 1", strcmp(cvarName, "sv_logecho") ? "sv_logflush":"sv_logecho");
}
Посмотри лог ошибок после. Он всё скажет.
Да, работает и кикает. Но баг остался, пишешь перед входом

sv_logflush 0
sv_logecho 0
sv_logflush 1
sv_logecho 1

И тебя запускает без киков
 

Anub1s

Участник
Сообщения
37
Реакции
2
Не понял. Так если последние значения введены по единице, как и требуется, то с чего кикать?
Да, это я перепутал. В таком порядке:

sv_logflush 1
sv_logecho 1
sv_logflush 0
sv_logecho 0

Тогда плагин перестает почему то кикать
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
перестает почему то кикать
Сделай вывод сообщения в чат или консоль, да проверь, какое значение тогда имеет переменная.
PHP:
public OnPluginStart() CreateTimer(5.0, CheckPlayerCvar, _, TIMER_REPEAT);

public Action:CheckPlayerCvar(Handle:timer)
{
    for (new i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            QueryClientConVar(i, "sv_logecho", ClientConVar);
            QueryClientConVar(i, "sv_logflush", ClientConVar);
        }
    }
    return Plugin_Continue;
}

public ClientConVar(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{
    if (result != ConVarQuery_Okay) SetFailState("Что-то пошло не так (ошибка №:%i)!", result);
    if (cvarValue[0] == '0') KickClient(client, "Установите значение %s 1", strcmp(cvarName, "sv_logecho") ? "sv_logflush":"sv_logecho");
	else PrintToChat(client, "Значение переменной %s %s!", cvarName, cvarValue);
}
Результаты сюда, не забудь подписать, когда меняешь переменную.
 
Сверху Снизу