При написание в чате, чтобы сбрасывался таймер - как?:)

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

  1. HOSTVD

    HOSTVD

    Сообщения:
    11
    Симпатии:
    2
    PHP:
    public OnMapStart()
    {
        
    CreateTimer(30.0timervd_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
        
    AddCommandListener(chat"say"); AddCommandListener(chat"say_team");
    }

    public 
    Action:timervd(Handle:timer)

        for (new 
    client 1client <= MaxClientsclient++)
        {    
               
    // код.
        
    }
        return 
    Plugin_Continue;
    }

    public 
    Action:chat(client, const String:command[], args)
    {
             
    // Мне нужно здесь сбросить таймер, чтобы отсчет начался с 0. Реально сделать без Handle таймера?
    }
     
    Последнее редактирование: 24 апр 2014
  2. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    Почему без Handle
     
  3. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    HOSTVD, таймер пихаешь в глобальный хэндл при запуске, а при написании в чат этот хэндл убиваешь запуская новый таймер.

    Также можно сделать глобальную числовую переменную и равнять её нужному нам количеству секунд при запуске таймера и написании в чат, таймер же крутить каждую секунду и убавлять в нём по 1 от глобальной переменной + проверять её на 0, ну и если переменная равно нулю, то вот тебе и момент когда нужное время никто не пишет в чат.

    Впринципе оба кода не затратны по ресурсам, далее решай сам что тебе проще сделать.
     
    HOSTVD нравится это.
  4. HOSTVD

    HOSTVD

    Сообщения:
    11
    Симпатии:
    2
    Все работает, спасибо semjef:) Только в логах ошибка...
    PHP:
    new Handle:Timers;

    public 
    OnMapStart()
    {
        
    Timers CreateTimer(7.0runvd_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
        
    AddCommandListener(chat"say"); AddCommandListener(chat"say_team");
    }

    public 
    Action:chat(client, const String:command[], args)
    {
        
    KillTimer(Timers);
        
    CreateTimer(7.0runvd);
    }  

    public 
    Action:runvd(Handle:timer)

        for (new 
    client 1client <= MaxClientsclient++)
        {    
                   
    // Code
        
    }
        return 
    Plugin_Continue;
    }
    Лог:
    Код:
    L 04/24/2014 - 14:06:56: [SM] Native "KillTimer" reported: Invalid timer handle 2e0028 (error 1)
    L 04/24/2014 - 14:06:56: [SM] Displaying call stack trace for plugin "test.smx":
    L 04/24/2014 - 14:06:56: [SM]   [0]  Line 16, test.sp::chat()
     
  5. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    PHP:
    new Handle:Timers INVALID_HANDLE;

    public 
    OnMapStart()
    {
        if(
    Timers == INVALID_HANDLE)
        {
            
    Timers CreateTimer(7.0runvd_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); //зачем тебе чтоб этот таймер повторялся!?
        
    }
        
    AddCommandListener(chat"say"); AddCommandListener(chat"say_team");
    }

    public 
    Action:chat(client, const String:command[], args)
    {
        
    CloseHandle(Timers);
        
    Timers CreateTimer(7.0runvd_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
         
    }
     
  6. HOSTVD

    HOSTVD

    Сообщения:
    11
    Симпатии:
    2
    хочу сделать легкий афк, для себя. csgo. Суть: кикает игрока, если он живой и бездействует.

    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <sdktools>

    new Float:fEyePosition[MAXPLAYERS+1][3], Float:fMapPosition[MAXPLAYERS+1][3];

    public 
    OnMapStart()
    {
        
    CreateTimer(60.0chekafk_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
        
    AddCommandListener(chat"say"); AddCommandListener(chat"say_team");
    }

    public 
    Action:chat(client, const String:command[], args)
    {
        
    // тут нужно перезапустить таймер, если игрок что то то написал в чат.
    }  

    public 
    Action:chekafk(Handle:timer)

        for (new 
    client 1client <= MaxClientsclient++)
        {    
            if (
    IsClientInGame(client) && IsPlayerAlive(client)) 
            {
                
    decl Float:f_Eye_Loc[3], Float:f_Map_Loc[3];
                
    f_Eye_Loc fEyePosition[client]; 
                
    f_Map_Loc fMapPosition[client];
                
    GetClientEyeAngles(clientfEyePosition[client]); 
                
    GetClientAbsOrigin(clientfMapPosition[client]);
                
                if ((
    fEyePosition[client][0] == f_Eye_Loc[0]) && 
                    (
    fEyePosition[client][1] == f_Eye_Loc[1]) &&
                    (
    fEyePosition[client][2] == f_Eye_Loc[2]) &&
                    (
    FloatAbs(fMapPosition[client][0] - f_Map_Loc[0]) < 5.0) &&
                    (
    FloatAbs(fMapPosition[client][1] - f_Map_Loc[1]) < 5.0) &&
                    (
    FloatAbs(fMapPosition[client][2] - f_Map_Loc[2]) < 5.0)) KickClient(client"AFK");
            }
        }
        return 
    Plugin_Continue;
    }
     
    Последнее редактирование: 24 апр 2014
  7. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    HOSTVD, используй http://docs.sourcemod.net/api/index.php?fastload=show&id=937&
    ну банально это любое движение, в этот момент можно bool переменную ставить в true, а по таймеру её ставить в false, если таймер словит false, то этот игрок стоял дольше заданного в таймере промежутка, а значит можно кикнуть, но тут загвоздка в том, что время сильно меняется в зависимости от того в какой момент игрок перестал двигаться.

    т.е. если проверка будет раз минуту, то одного кикнет через 61 секунду, а другого через 119.
     
  8. HOSTVD

    HOSTVD

    Сообщения:
    11
    Симпатии:
    2
    semjef нашел выход) теперь вопрос в другом: тут можно что-то оптимизировать/упростить?
    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <sdktools>

    new Float:fEyePosition[MAXPLAYERS+1][3], Float:fMapPosition[MAXPLAYERS+1][3];

    public 
    OnMapStart()
    {
        
    CreateTimer(30.0chekafk_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
        
    AddCommandListener(chat"say"); AddCommandListener(chat"say_team");
    }

    public 
    Action:chat(client, const String:command[], args)
    {
        
    fEyePosition[client] = Float:{0.0,0.0,0.0};
    }  

    public 
    Action:chekafk(Handle:timer)

        for (new 
    client 1client <= MaxClientsclient++)
        {    
            if (
    IsClientInGame(client) && IsPlayerAlive(client)) 
            {
                
    decl Float:f_Eye_Loc[3], Float:f_Map_Loc[3];
                
    f_Eye_Loc fEyePosition[client]; 
                
    f_Map_Loc fMapPosition[client];
                
    GetClientEyeAngles(clientfEyePosition[client]); 
                
    GetClientAbsOrigin(clientfMapPosition[client]);
                
                if ((
    fEyePosition[client][0] == f_Eye_Loc[0]) && 
                    (
    fEyePosition[client][1] == f_Eye_Loc[1]) &&
                    (
    fEyePosition[client][2] == f_Eye_Loc[2]) &&
                    (
    FloatAbs(fMapPosition[client][0] - f_Map_Loc[0]) < 5.0) &&
                    (
    FloatAbs(fMapPosition[client][1] - f_Map_Loc[1]) < 5.0) &&
                    (
    FloatAbs(fMapPosition[client][2] - f_Map_Loc[2]) < 5.0)) KickClient(client"AFK");
            }
        }
        return 
    Plugin_Continue;
    }  
    P.S. Спасибо KorDen.

    Добавлено через 22 минуты
    Сильно ли будет грузить сервер, такой "плагин"?)
     
    Последнее редактирование: 24 апр 2014
  9. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    semjef
    Думаешь, в твоем коде нет ошибок?
     
  10. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    The End Is Near..., ты о чём? какой код? я ни одного примера не давал.


    HOSTVD, нет, не сильно будет грузить впринципе.
     
  11. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
  12. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    The End Is Near..., омг, код не полный на столько, что это даже за пример не считается.