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

hostvd

Участник
Сообщения
21
Реакции
2
PHP:
public OnMapStart()
{
    CreateTimer(30.0, timervd, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    AddCommandListener(chat, "say"); AddCommandListener(chat, "say_team");
}

public Action:timervd(Handle:timer)
{ 
    for (new client = 1; client <= MaxClients; client++)
    {    
           // код.
    }
    return Plugin_Continue;
}

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

semjef

semjef.ru
Сообщения
993
Реакции
444
HOSTVD, таймер пихаешь в глобальный хэндл при запуске, а при написании в чат этот хэндл убиваешь запуская новый таймер.

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

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

hostvd

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

public OnMapStart()
{
    Timers = CreateTimer(7.0, runvd, _, 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.0, runvd);
}  

public Action:runvd(Handle:timer)
{ 
    for (new client = 1; client <= MaxClients; client++)
    {    
               // Code
    }
    return Plugin_Continue;
}
Лог:
C-подобный:
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()
 

semjef

semjef.ru
Сообщения
993
Реакции
444
PHP:
new Handle:Timers = INVALID_HANDLE;

public OnMapStart()
{
    if(Timers == INVALID_HANDLE)
    {
        Timers = CreateTimer(7.0, runvd, _, 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.0, runvd, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
     
}
 

hostvd

Участник
Сообщения
21
Реакции
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.0, chekafk, _, 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 = 1; client <= MaxClients; client++)
    {    
        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(client, fEyePosition[client]); 
            GetClientAbsOrigin(client, fMapPosition[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;
}
 
Последнее редактирование:

semjef

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

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

hostvd

Участник
Сообщения
21
Реакции
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.0, chekafk, _, 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 = 1; client <= MaxClients; client++)
    {    
        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(client, fEyePosition[client]); 
            GetClientAbsOrigin(client, fMapPosition[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 минуты
Сильно ли будет грузить сервер, такой "плагин"?)
 
Последнее редактирование:

semjef

semjef.ru
Сообщения
993
Реакции
444
The End Is Near..., ты о чём? какой код? я ни одного примера не давал.


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

semjef

semjef.ru
Сообщения
993
Реакции
444
The End Is Near..., омг, код не полный на столько, что это даже за пример не считается.
 
Сверху Снизу