Русское сообщество по скриптингу

Task Manager

Статьи или фрагменты кода для новичков и уже опытных скриптеров по Metamod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

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

Task Manager

Сообщение sa1me » 01 фев 2017, 15:06

Автор: Вы должны зарегистрироваться, чтобы видеть ссылки.

Благодарности:
  • s1lent
  • AMXX Dev Team

Описание: Это готовое решение для вызова функций в указанное время.

Установка: Первым делом необходимо выделить память для объекта класса CTaskManager, а затем освободить.
Код: Выделить всё
void OnMetaAttach()//or amxx attach
{
    g_pTaskManager = new CTaskManager;
}

void OnMetaDetach()//or amxx detach
{
    delete g_pTaskManager;

Далее, в StartFrame вызывать соответствующий метод класса.
Код: Выделить всё
void StartFrame_Post()
{
    if (g_pTaskManager != NULL)
        g_pTaskManager->StartFrame(TASK_FREQUENCY);

    SET_META_RESULT(MRES_IGNORED);
}

Собственно, установка завершена, но я рекомендую также при включении сервера очищать все задачи (далее, "таски"). Делается это с помощью метода ClearTaskByOwner, который очищает все таски указанного edict'а. Если не указывать значение аргументу, то он очищает все существующие таски.
Код: Выделить всё
void ServerActivate_Post(edict_t *pEdictList, int edictCount, int clientMax)
{
    if (g_pTaskManager != NULL)
        g_pTaskManager->ClearTaskByOwner();

    SET_META_RESULT(MRES_IGNORED);
}

С помощью этого же метода мы можем очистить все таски закрепленные за игроками, когда он заходит или выходит из сервера.
Код: Выделить всё
void ClientPutInServer_Post(edict_t *pPlayer)
{
    if (g_pTaskManager != NULL)
        g_pTaskManager->ClearTaskByOwner(pPlayer);

    SET_META_RESULT(MRES_IGNORED);


Пример использования:
Код: Выделить всё
int ShowPlayerGreeting_TaskHandle(edict_t *pPlayer);

void ClientPutInServer_Post(edict_t *pPlayer)
{
    if (g_pTaskManager != NULL)
        g_pTaskManager->ClearTaskByOwner(pPlayer);

    g_pTaskManager->SetTask(pPlayer, (task_handle_t)ShowPlayerGreeting_TaskHandle, 5.0, TASK_NORMAL);

    SET_META_RESULT(MRES_IGNORED);
}

int ShowPlayerGreeting_TaskHandle(edict_t *pPlayer)
{
    UTIL_ClientPrint(pPlayer, print_center, "Hello, %s!", pPlayer->v.netname);

    return TASK_IGNORED;


Вы должны зарегистрироваться, чтобы видеть ссылки..
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 177 раз.
Опыт программирования: Меньше недели

Re: Task Manager

Сообщение sa1me » 04 фев 2017, 13:16

Забыл также добавить. Помнится, раньше все негодовали, что в AMXX минимальная частота проверок у таска равна 0.1. Это дело вы можете настроить в макросе TASK_FREQUENCY.
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 177 раз.
Опыт программирования: Меньше недели


Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7