Представляю вам новый способ использования таймеров, взамен SetTimer. Приведу + и - работы с ним.
gettime:
+ Нагружает сервер меньше чем SetTimer
+ На данный момент самый точный способ использования таймеров
- Может работать только с таймерами где число секунд - целое число. 30 секунд, 21 секунда, 1 минута, 2 часа и т.п. (1.5 секунды, 0.4 и т.д. не будут работать)
Чтобы таймеры на этой функции работали, нужно создать всего лишь один таймер на 250 мс. Он не будет нагружать сервер, можете не волноваться. Вот пример создания:
В public OnGameModeInit
SetTimer("UpdateTimers", 250, 1);
Если увеличить 250, то можно ещё больше снизить нагрузку, взамен точности. Решать вам, что важнее.
В конец мода:
forward UpdateTimers();
public UpdateTimers()
{
return 1;
}
Давайте попробуем создать 2 типа таймеров. Глобальный и для определённого игрока.
Глобальный таймер:
Ко всем глобальным переменным:
В public OnGameModeInit
Timer[0] = gettime()+30; // Запустили таймер на 30 секунд
Timer[1] = gettime()+60; // Запустили таймер на 1 минуту
Timer[2] = gettime()+90; // Запустили таймер на 1 минуту 30 секунд
В public UpdateTimers
new GetTime = gettime();
if(Timer[0] <= GetTime && Timer[0] != 0)
{
Timer[0] = GetTime+30; // Снова запустили таймер. Он будет повторяющийся
Timer1Start(); // Тут выполняем действие
}
if(Timer[1] <= GetTime && Timer[1] != 0)
{
Timer[1] = 0; // Завершаем работу таймера
Timer2Start(); // Выполняем действие
}
if(Timer[2] <= GetTime && Timer[2] != 0)
{
Timer[2] = 0; // Завершаем работу таймера
Timer3Start(); // Выполняем действие
}
Таймер для игрока:
В public OnPlayerConnect
SetPVarInt(playerid, "Timer1", gettime()+30); // Запустили таймер на 30 секунд
SetPVarInt(playerid, "Timer2", gettime()+60); // Запустили таймер на 60 секунд
В public UpdateTimers
Ниже приведены тесты точности различных способов реализации таймеров. Тесты проводились на повторяющемся минутном таймере.
Стандартный способ:
1 выполнение - отклонение 4746 мс
2 выполнение - отклонение 4787 мс
3 выполнение - отклонение 4920 мс
Способ на gettime:
1 выполнение - отклонение 163 мс
2 выполнение - отклонение 188 мс
3 выполнение - отклонение 5 мс
Автор: Неизвестен.
gettime:
+ Нагружает сервер меньше чем SetTimer
+ На данный момент самый точный способ использования таймеров
- Может работать только с таймерами где число секунд - целое число. 30 секунд, 21 секунда, 1 минута, 2 часа и т.п. (1.5 секунды, 0.4 и т.д. не будут работать)
Чтобы таймеры на этой функции работали, нужно создать всего лишь один таймер на 250 мс. Он не будет нагружать сервер, можете не волноваться. Вот пример создания:
В public OnGameModeInit
SetTimer("UpdateTimers", 250, 1);
Если увеличить 250, то можно ещё больше снизить нагрузку, взамен точности. Решать вам, что важнее.
В конец мода:
forward UpdateTimers();
public UpdateTimers()
{
return 1;
}
Давайте попробуем создать 2 типа таймеров. Глобальный и для определённого игрока.
Глобальный таймер:
Ко всем глобальным переменным:
Код:
new Timer[3];
Timer[0] = gettime()+30; // Запустили таймер на 30 секунд
Timer[1] = gettime()+60; // Запустили таймер на 1 минуту
Timer[2] = gettime()+90; // Запустили таймер на 1 минуту 30 секунд
В public UpdateTimers
new GetTime = gettime();
if(Timer[0] <= GetTime && Timer[0] != 0)
{
Timer[0] = GetTime+30; // Снова запустили таймер. Он будет повторяющийся
Timer1Start(); // Тут выполняем действие
}
if(Timer[1] <= GetTime && Timer[1] != 0)
{
Timer[1] = 0; // Завершаем работу таймера
Timer2Start(); // Выполняем действие
}
if(Timer[2] <= GetTime && Timer[2] != 0)
{
Timer[2] = 0; // Завершаем работу таймера
Timer3Start(); // Выполняем действие
}
Таймер для игрока:
В public OnPlayerConnect
SetPVarInt(playerid, "Timer1", gettime()+30); // Запустили таймер на 30 секунд
SetPVarInt(playerid, "Timer2", gettime()+60); // Запустили таймер на 60 секунд
В public UpdateTimers
Код:
for(new A, B = GetMaxPlayers(); A != B; A++)
{
new GetTime = gettime();
if(GetPVarInt(A, "Timer1") <= GetTime && GetPVarInt(A, "Timer1") != 0)
{
SetPVarInt(A, "Timer1", GetTime+30); // Снова запустили таймер. Он будет повторяющийся
Timer1Start(A); // Тут выполняем действие
}
if(GetPVarInt(A, "Timer2") <= GetTime && GetPVarInt(A, "Timer2") != 0)
{
SetPVarInt(A, "Timer2", 0); // Завершаем работу таймера
Timer1Start(A); // Тут выполняем действие
}
}
Стандартный способ:
1 выполнение - отклонение 4746 мс
2 выполнение - отклонение 4787 мс
3 выполнение - отклонение 4920 мс
Способ на gettime:
1 выполнение - отклонение 163 мс
2 выполнение - отклонение 188 мс
3 выполнение - отклонение 5 мс
Автор: Неизвестен.