Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Таймер (Выполнить команду через время)
Таймер
_wS_ Дата: Среда, 30.11.2011, 18:12:36 | Сообщение # 1
Handle:CreateTimer(Float:interval, Timer:TIMER_CallBack, any:data=INVALID_HANDLE, flags=0);

Код
interval - через сколько секунд сработает таймер (если повторяющийся, то будет вызываться каждые interval сек, минимум 0.1)
TIMER_CallBack - функция, которая будет вызвана
any:data - любое число (например, индекс игрока), или Handle DataPack'а
flags - флаги (если их несколько, то через символ |

Функция возвращает Handle таймера, зная который можно его остановить с помощью KillTimer(Handle:timer); (нельзя использовать CloseHandle)

Код
TIMER_REPEAT // повторяющийся таймер, чтобы остановить его, нужно сделать return Plugin_Stop (Plugin_Continue = продолжить выполнение)
TIMER_FLAG_NO_MAPCHANGE // SM сам убьёт (остановит) таймер перед сменой карты
TIMER_HNDL_CLOSE // устарело, не используется
TIMER_DATA_HNDL_CLOSE // После остановки таймера, SM сделает CloseHandle() на том Handle:hVar, что вы передавали (если вы сами сделаете CloseHandle, будет ошибка)

Функции-обработчики таймеров могут быть такими:

Код
public Action:TIMER_CallBack(Handle:timer)
{
    return Plugin_Stop;
}

public Action:TIMER_CallBack(Handle:timer, any:data)
{
    return Plugin_Stop;
}

public Action:TIMER_CallBack(Handle:timer, Handle:hndl)
{
    return Plugin_Stop;
}

Думаю в Handle:hndl нет особого смысла, т.к. и any:data без проблем примет вашу Handle: переменную.
Если вы передали таймеру какое-то значение (any:data), то и используйте функцию с any:data, но даже если вы сделаете так:

Код
CreateTimer(1.0, TIMER_CallBack, 5);

public Action:TIMER_CallBack(Handle:timer)
{
    PrintToServer("Это сработает, но доступа к 5, что мы передавали, у нас нет");
    return Plugin_Stop;
}


Если ваш таймер повторяющийся (TIMER_REPEAT), то чтобы он продолжил выполняться, сделайте return Plugin_Continue;
Во всех остальных случаях делайте return Plugin_Stop;

Пример с TIMER_DATA_HNDL_CLOSE

Код
public OnPluginStart()
{
    new Handle:pack = CreateDataPack();
    WritePackCell(pack, 5);
    CreateTimer(3.0, Timer_Func, pack, TIMER_FLAG_NO_MAPCHANGE | TIMER_DATA_HNDL_CLOSE); // перед сменой карты будет убит и SM сделает CloseHandle(pack)
}

public Action:Timer_Func(Handle:timer, any:pack)
{
    ResetPack(pack);
    PrintToServer("-> %d", ReadPackCell(pack));

    // Делать CloseHandle(pack) здесь НЕ НУЖНО, иначе увидите ошибку.
}

Приветствие игрока через 15 сек после входа на сервер:

Код
new Handle:g_hTimer[MAXPLAYERS + 1];

public OnClientPutInServer(client)
    g_hTimer[client] = CreateTimer(15.0, Hello, client); // Сохраняем Handle таймера

public OnClientDisconnect(client) // Если игрок покидает сервер, не увидев приветствие, то убиваем таймер.
{
    if (g_hTimer[client] != INVALID_HANDLE)
    {
        KillTimer(g_hTimer[client]);
        g_hTimer[client] = INVALID_HANDLE;
    }
}

public Action:Hello(Handle:timer, any:client)
{
    // Сбрасываем Handle таймера на INVALID_HANDLE, чтобы знать, что активного таймера НЕТ.
    g_hTimer[client] = INVALID_HANDLE;

    // Приветствуем через чат
    PrintToChat(client, "Hello, %N!", client);

    return Plugin_Stop;
}

Пример повторяющегося таймера:

Код
public OnPluginStart()
    CreateTimer(1.0, Timer_Func, _, TIMER_REPEAT);

public Action:Timer_Func(Handle:timer)
{
    static x = 0;
    if (++x < 10)
    {
        PrintToServer("-> %d", x);
        return Plugin_Continue;
    }
    return Plugin_Stop;
}
 
_wS_ Дата: Воскресенье, 13.05.2012, 23:55:09 | Сообщение # 2
Ещё есть CreateDataTimer, специально для DataPack (в него можно упаковывать разные типы данных).
Но в этом случае не нужно делать CreateDataPack(), делают так:

Код
new Handle:pack;
CreateDataTimer(10.0, xz_Func, pack); // тут пак создается вместе с таймером

// и ниже можно добавлять данные в пак:
WritePackCell(pack, 5);

// А внутри функции:

public Action:xz_Func(Handle:timer, Handle:pack)
{
     ResetPack(pack);
     new x = ReadPackCell(pack);
     PrintToServer("x = %d", x);

     // Handle пака закрывается само, после остановки (убийства) таймера.
     return Plugin_Stop;
}
 
olegseton Дата: Воскресенье, 30.04.2017, 21:20:17 | Сообщение # 3
Сообщений: 8
Репутация: 0 [ +/- ]
Можете добавить таймер? (то есть что бы оверлей отображался 3 секунды)
Вот плагин

Прикрепления: OverlayRoundEnd.sp(2.3 Kb)
 
_wS_ Дата: Воскресенье, 30.04.2017, 23:35:56 | Сообщение # 4
.

Прикрепления: 1686908.sp(2.3 Kb)
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Таймер (Выполнить команду через время)
  • Страница 1 из 1
  • 1
Поиск: