И так есть задача: Отловить количество чего либо ( в нашем варианте фрагов) за 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 ситуации:
- Для игрока это первый фраг - старт времени
- Для игрока это второй фраг в течении нужного времени ( от 0 до N секунд) - прибавляем фраг
- Дли игрока это второй фраг за пределами отлавливаемого времени - обнуляем таймер
- Игрок вышел с сервера и его место занял другой вошедший - обнуление переменных
Теперь осталось это все объединить:
/* 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
}
Надеюсь вы теперь понимаете, что если нужно отследить время между двумя событиями, то нужно "записать" время первого события и вычесть его из времени второго события.
Мини задачка для самоконтроля:
Попробуйте написать скрипт, который будет выдавать время между двумя убийствами (то есть сколько прошло времени между первым и вторым фрагом).
Свои результаты прячьте в спойлер :)