Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 2
    Гостей: 1
    Пользователи: - отсутствуют
    Роботы: crawl Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 25-11-2012, 20:02 Просмотров: 4946

    Урок 21. Отрезки времени без set_task на примере подсчета убийств за N секунд

    Не давно на одном форуме был задан вопрос о том как подсчитать количество фрагов за 5 секунд.Все предложенные варианты решения были с помощью функции set_task. Мне же было интересно сделать без ее использования, но автор темы поторопился ее закрыть. По этому решил что покажу пример тут.

    И так есть задача: Отловить количество чего либо ( в нашем варианте фрагов) за N (какое то) количество секунд.
    Отловить убийство игрока поможет функция RegisterHam с событием Ham_Killed, а дальше начинается сама логика процесса подсчета.

    Что бы нам подсчитать, что-либо за какое-то время, нам необходимо что?
    Вижу, правильно думаете! Это время с какого момента считаем и по какое.
    Получить время нам поможет функция get_gametime. Сохраним же в глобальны массив (это необходимо что бы обнулять значения при входе/выходе игроков на сервер). И так, по идее у нас уже есть время с какого считаем ( сохраненное в массиве) и текущее (получаем его в данную секунду) выглядит это так:
        static Float:gametime//Переменная для получения текущего времени 
        gametime = get_gametime()//получаем время
        ...
        g_fTimeForKill[id] = gametime //сохраняем текущее время для игрока id( это индекс игрока)

    Когда же через любое количество секунд мы обратимся к
    g_fTimeForKill[id]
    - данная ячейка массива вернет время которое было в него записано. И если получить текущее время и вычесть сохраненное, то мы получим сколько времени прошло с момента записи.
    gametime - g_fTimeForKill[id] = X// Х прошло времени


    С временем разобрались, переходим к фрагам и подсчету.
    У нас есть ограничение, нам нужно подсчитать что за 5 секунд убито 3 или более игроков.
    Если немного пораскинуть мозгами, то выплывают ( у меня по крайней мере) основные 4 ситуации:
    1. Для игрока это первый фраг - старт времени
    2. Для игрока это второй фраг в течении нужного времени ( от 0 до N секунд) - прибавляем фраг
    3. Дли игрока это второй фраг за пределами отлавливаемого времени - обнуляем таймер
    4. Игрок вышел с сервера и его место занял другой вошедший - обнуление переменных

    Теперь осталось это все объединить:
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>
    #include <hamsandwich>

    #define PLUGIN "[http://amxxmodx.ru] Number of kills at N seconds"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    //Массивы для записи времени и фрагов игроков
    new Float:g_fTimeForKill[33]
    new g_sFrags[33]
    //Переменная для квара
    new gf_CvarTime

    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        //Регистрируем событие убийство игрока
        RegisterHam(Ham_Killed,"player","fwd_killed")
        //Регистрация квара и получение его индекса
        gf_CvarTime = register_cvar("amxxmodx_time","8")
        
    }
    //Событие убийства игрока
    public fwd_killed(victim, id, corpse){

        
        static Float:gametime//Переменная для записи текущего времени
        gametime = get_gametime()//Получение текущего времени
        new Float:timekill = get_pcvar_float(gf_CvarTime)//Получение значения квара
        
        
        if((gametime - g_fTimeForKill[id]) <= timekill){ //Если Не первое убийство за N сек.
                
            g_sFrags[id]++ //Прибавляем фраг
                
            if(g_sFrags[id] >=3){//Если набрал 3 фрага или больше
                //Сообщение в чат
                client_print(0,print_chat,"kill %d humans in %.1f sec",g_sFrags[id],timekill)
            }
            
        }else if(g_fTimeForKill[id] == 0.0){//Если это первое убийство
            
            g_sFrags[id]++//Прибавляем фраг
            g_fTimeForKill[id] = gametime//Запоминаем время начала отсчета N секунд
            
        }else if((gametime - g_fTimeForKill[id]) > timekill){//Если это убийство не первое,но более N сек
            g_sFrags[id]=1//Так как с данного момента будут новые N секунд, присваиваем первый фраг
            g_fTimeForKill[id] = gametime//И обновляем время
        }
    }
    public client_connect(id){
        //Обнуляем переменные при входе игрока
        g_fTimeForKill[id] = 0.0
        g_sFrags[id]=0
    }


    Надеюсь вы теперь понимаете, что если нужно отследить время между двумя событиями, то нужно "записать" время первого события и вычесть его из времени второго события.

    Мини задачка для самоконтроля:
    Попробуйте написать скрипт, который будет выдавать время между двумя убийствами (то есть сколько прошло времени между первым и вторым фрагом).
    Свои результаты прячьте в спойлер :)
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    kolo6ok

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    да легко bully

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама