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

Тема в разделе "Программирование / Скриптинг", создана пользователем Anub1s, 28 авг 2016.

  1. Anub1s

    Anub1s

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

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    Это не команда, а переменная. И она серверная, а не клиентская.
     
  3. AlmazON

    AlmazON деревянный © yand3xmail

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

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

    Anub1s

    Сообщения:
    37
    Симпатии:
    1
    А разве ConVar поможет отследить значение клиентских команд? Мне нужно узнать конкретно sensetivity
     
  5. Крабос

    Крабос

    Сообщения:
    47
    Симпатии:
    21
    Вот так

    PHP:
    QueryClientConVar(client"sv_logecho"GetClientConVar);

    public 
    GetClientConVar(QueryCookie:cookieclientConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
    {

    }
     
    Последнее редактирование: 28 авг 2016
  6. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.590
    Симпатии:
    1.995
    Про что спрошено, на то и дано. Мы же не телепаты, квар дан просто для примера или действительно не знаешь, что он серверный.
    Выше дали про клиентскую часть.
     
  7. Anub1s

    Anub1s

    Сообщения:
    37
    Симпатии:
    1
    Спасибо, помогло. Но команда работает некорректно. Если предварительно перед входом написать 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");
    }
    }
     
  8. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.590
    Симпатии:
    1.995
    PHP:
    CreateTimer(2.0CommandsCheckclientTIMER_REPEAT);
    Квар надо проверять постоянно. "Хук" то одноразовый.
     
  9. Anub1s

    Anub1s

    Сообщения:
    37
    Симпатии:
    1
    А можно подробнее как это сделать? Я не силен в SP
    --- Добавлено позже ---
    Добавил рипит таймера теперь сервер крашится каждые 2с
     
    Последнее редактирование: 29 авг 2016
  10. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
    А одним таймером не лучше будет?

    PHP:
    #pragma semicolon 1

    new Handle:g_hTimer;

    public 
    OnMapStart()
    {
        
    g_hTimer CreateTimer(5.0CheckPlayerCvar_TIMER_REPEAT);
    }

    public 
    OnMapEnd()
    {
        
    KillTimer(g_hTimer);
    }

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

    public 
    ClientConVar(QueryCookie:cookieclientConVarQueryResult: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");
        }
    }
     
    Последнее редактирование: 29 авг 2016
  11. Anub1s

    Anub1s

    Сообщения:
    37
    Симпатии:
    1
    Все же плохая была идея с таймером, сервер перегружается вплоть до лагов
     
  12. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.590
    Симпатии:
    1.995
    Попробуй так:
    PHP:
    public OnPluginStart() CreateTimer(5.0CheckPlayerCvar_TIMER_REPEAT);

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

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

    Anub1s

    Сообщения:
    37
    Симпатии:
    1
    Да, работает и кикает. Но баг остался, пишешь перед входом

    sv_logflush 0
    sv_logecho 0
    sv_logflush 1
    sv_logecho 1

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.590
    Симпатии:
    1.995
    Не понял. Так если последние значения введены по единице, как и требуется, то с чего кикать?
     
  15. Anub1s

    Anub1s

    Сообщения:
    37
    Симпатии:
    1
    Да, это я перепутал. В таком порядке:

    sv_logflush 1
    sv_logecho 1
    sv_logflush 0
    sv_logecho 0

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.590
    Симпатии:
    1.995
    Сделай вывод сообщения в чат или консоль, да проверь, какое значение тогда имеет переменная.
    PHP:
    public OnPluginStart() CreateTimer(5.0CheckPlayerCvar_TIMER_REPEAT);

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

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