Продвинутая работа с таймерами в Pawn

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Таймеры позволяют выполнять код через определенные промежутки времени. Разберем продвинутые техники.

Система управления таймерами
Код:
enum TimerInfo
{
    Timer:handle,
    Function[32],
    Interval,
    Repeating,
    Active
}

new TimerData[100][TimerInfo];
new TotalTimers = 0;

CreateManagedTimer(function[], interval, repeating)
{
    if(TotalTimers >= sizeof(TimerData))
    {
        return -1;
    }
    
    strcpy(TimerData[TotalTimers][Function], function, 32);
    TimerData[TotalTimers][Interval] = interval;
    TimerData[TotalTimers][Repeating] = repeating;
    TimerData[TotalTimers][Active] = 1;
    
    if(repeating)
    {
        TimerData[TotalTimers][handle] = SetTimer(function, interval, true);
    }
    else
    {
        TimerData[TotalTimers][handle] = SetTimer(function, interval, false);
    }
    
    TotalTimers++;
    return TotalTimers - 1;
}

StopManagedTimer(timerid)
{
    if(timerid >= TotalTimers)
    {
        return 0;
    }
    
    if(TimerData[timerid][Active])
    {
        KillTimer(TimerData[timerid][handle]);
        TimerData[timerid][Active] = 0;
    }
    
    return 1;
}

Таймеры с параметрами
Код:
// Создание таймера с параметрами
SetTimerEx("DelayedAction", 5000, false, "is", playerid, "параметр");

forward DelayedAction(playerid, text[]);
public DelayedAction(playerid, text[])
{
    if(IsPlayerConnected(playerid))
    {
        new string[128];
        format(string, sizeof(string), "Выполнено: %s", text);
        SendClientMessage(playerid, -1, string);
    }
}

// Множественные параметры
SetTimerEx("ComplexAction", 3000, false, "iif", playerid, 100, 3.14);

forward ComplexAction(playerid, value, Float:floatValue);
public ComplexAction(playerid, value, Float:floatValue)
{
    // обработка
}

Каскадные таймеры
Код:
new CountdownValue = 10;

forward Countdown();
public Countdown()
{
    if(CountdownValue > 0)
    {
        new string[64];
        format(string, sizeof(string), "Осталось: %d секунд", CountdownValue);
        SendClientMessageToAll(-1, string);
        CountdownValue--;
    }
    else
    {
        SendClientMessageToAll(-1, "Время вышло!");
        KillTimer(countdownTimer);
        CountdownValue = 10; // сброс
    }
}

StartCountdown()
{
    CountdownValue = 10;
    countdownTimer = SetTimer("Countdown", 1000, true);
}

Таймеры с условиями
Код:
forward ConditionalTimer();
public ConditionalTimer()
{
    new activePlayers = 0;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i))
        {
            activePlayers++;
        }
    }
    
    // Выполнение только при наличии игроков
    if(activePlayers > 0)
    {
        // код
        ProcessPlayers();
    }
    else
    {
        // Остановка таймера при отсутствии игроков
        KillTimer(conditionalTimer);
    }
}

Таймеры с приоритетами
Код:
enum TimerPriority
{
    PRIORITY_LOW,
    PRIORITY_NORMAL,
    PRIORITY_HIGH,
    PRIORITY_CRITICAL
}

new TimerPriority[MAX_TIMERS];

CreatePriorityTimer(function[], interval, repeating, priority)
{
    new timerid = CreateManagedTimer(function, interval, repeating);
    if(timerid != -1)
    {
        TimerPriority[timerid] = priority;
    }
    return timerid;
}

// Выполнение таймеров по приоритету
ProcessTimers()
{
    // Сначала критические
    for(new i = 0; i < TotalTimers; i++)
    {
        if(TimerData[i][Active] && TimerPriority[i] == PRIORITY_CRITICAL)
        {
            // выполнение
        }
    }
    // Затем высокие и т.д.
}

Важные моменты:
- Управляйте таймерами централизованно
- Останавливайте ненужные таймеры
- Используйте правильные интервалы
- Оптимизируйте количество таймеров

Правильное использование таймеров улучшает производительность!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху