Данный урок поможет вам научиться использовать минимальное количество таймеров в моде (в нашем случае 1), которые могут обрабатывать большинство операций со временем.
Например, вы используете в моде несколько таймеров: один для сохранения аккаунтов, который обновляется каждые 30 секунд, другой, например, для обновления склада с материалами, обновляется раз в 5 секунд, а третий отвечает за обновление часов на сервере и обновляется каждую секунду.
Допустим, Вы поставили 3 таймера в OnGameModeInit() и задали им нужный интервал:
Код
#define Время_Обновления_Часов 1*1000 // 1000 миллисекунд (1 сек)
#define Время_Обновления_Склада 5*1000 // 5000 миллисекунд ( 5 сек )
#define Время_Сохранения_Аккаунтов 30*1000 // 30000 миллисекунд ( 30 сек )
forward Обновить_часы();
forward Обновить_склад();
forward Сохранить_аккаунты();
public OnGameModeInit()
{
// Установить таймеры с временем обновления, равным соответствующим define
SetTimer("Обновить_часы",Время_Обновления_Часов,true);
SetTimer("Обновить_склад",Время_Обновления_Склада,true);
SetTimer("Сохранить_аккаунты",Время_Сохранения_Аккаунтов,true);
return 1;
}
public Обновить_часы()
{
// Обновление часов
return 1;
}
public Обновить_склад()
{
// Обновление склада
return 1;
}
public Сохранить_аккаунты()
{
// Сохранение аккаунтов
return 1;
}
Цитата
Три таймера будут создавать нагрузку на сервер, а ведь все это можно уместить в один таймер. Назовем его "Processor", зададим ему интервал в 1000 миллисекунд (значит в одну секунду) и включим при запуске мода.
Код
#define PROCESSOR_UPDATE 1000 // Время обновления в миллисекундах ( 1 сек )
forward Processor();
public OnGameModeInit()
{
SetTimer("Processor",PROCESSOR_UPDATE,true); // Установка таймера на обновление, равному define PROCESSOR_UPDATE (1 сек)
return 1;
}
public Processor()
{
// Заменяемый таймеры паблик
return 1;
}
Цитата
И теперь нацепим на паблик "процессор" функцию обновления часов.
Код
public Processor()
{
// Заменяемый таймеры паблик
Обновить_часы();
return 1;
}
Функция "Обновить_часы()" будет вызываться раз в секунду, как и должно было быть.
Но как поступить с сохранением аккаунтов и обновлением склада? Ведь они имеют иной интервал обновления.
А мы сделаем так:
Цитата
1. Сначала создадим переменные для хранения :
Код
new Обновление_склада = 0;
new Обновление_часов = 0;
new Сохранение_аккаунтов = 0;
Цитата
2. Заменим старые значения времени обновления склада, аккаунтов, часов на новые, переведенные из миллисекунд в секунды:
Код
#define Время_Обновления_Часов 1
#define Время_Обновления_Склада 5
#define Время_Сохранения_Аккаунтов 30
Цитата
3. В "Процессор", поверх старого, добавим новое содержание:
Код
public Processor()
{
Обновление_склада ++;
Сохранение_аккаунтов ++;
Обновление_часов ++;
if(Обновление_часов >= Время_Обновления_Часов)
//Зачем мы обновляем часы, когда они сами могут обновляться с процессором?
//- Для удобного настраивания времени обновления через define
{
Обновление_часов = 0;
Обновить_часы();
}
if(Обновление_склада >= Время_Обновления_Склада)
{
Обновление_склада = 0;
Обновить_склад();
}
if(Сохранение_аккаунтов >= Время_Сохранения_Аккаунтов )
{
Сохранение_аккаунтов = 0;
Сохранить_аккаунты();
}
return 1;
}
Что мы делаем? Мы добавляем к переменным значение, которое в действительности является одной секундой, а когда значение переменной достигнет времени обновления, то мы вызовем необходимую функцию и обнулим переменную, тем самым запустив цикл заново.
Цитата
В итоге у нас получилось:
Код
// Голова
#define PROCESSOR_UPDATE 1000
#define Время_Обновления_Часов 1
#define Время_Обновления_Склада 5
#define Время_Сохранения_Аккаунтов 30
new Обновление_склада = 0;
new Обновление_часов = 0;
new Сохранение_аккаунтов = 0;
forward Обновить_часы();
forward Обновить_склад();
forward Сохранить_аккаунты();
// Стандартная автовызываемая функция OnGameModeInit
public OnGameModeInit()
{
SetTimer("Processor",PROCESSOR_UPDATE,true);
return 1;
}
// Таймерозаменяющий паблик
forward Processor();
public Processor()
{
Обновление_склада ++;
Сохранение_аккаунтов ++;
Обновление_часов ++;
if(Обновление_часов >= Время_Обновления_Часов)
{
Обновление_часов = 0;
Обновить_часы();
}
if(Обновление_склада >= Время_Обновления_Склада)
{
Обновление_склада = 0;
Обновить_склад();
}
if(Сохранение_аккаунтов >= Время_Сохранения_Аккаунтов )
{
Сохранение_аккаунтов = 0;
Сохранить_аккаунты();
}
return 1;
}
public Обновить_часы()
{
// Обновление часов
return 1;
}
public Обновить_склад()
{
// Обновление склада
return 1;
}
public Сохранить_аккаунты()
{
// Сохранение аккаунтов
return 1;
}
Удачных разработок!
Автор урока: BRICS.