#pragma newdecls required
#include <sdktools>
#include <sdkhooks>
ArrayList queue;
public void OnPluginStart() {
queue = new ArrayList(64, 0);
}
public void OnMapStart() {
queue.Clear();
SDKHook(GetPlayerResourceEntity(), SDKHook_ThinkPost, OnThinkPost);
}
public void OnThinkPost(int ent) {
if(ent == -1) {
SDKUnhook(ent, SDKHook_ThinkPost, OnThinkPost);
return;
}
static int currentTick;
currentTick = GetGameTickCount();
if(queue.Length)
causeEffects(currentTick);
}
void causeEffects(int currentTick) {
static DataPack dp;
static bool isRepeat;
for(int i, tick; i < queue.Length; i+=2) {
tick = queue.Get(i);
isRepeat = false;
if(currentTick > tick)
continue;
if((dp = view_as<DataPack>(queue.Get(i+1))) != null) {
// Вызов функции, которая повесит эффект...
// Отработав, функция возвращает необходимость в повторе.
// isRepeat = causeEffect(dp);
}
// Повтора не требуется, удаляем из очереди
if(!isRepeat) {
queue.Erase(i);
queue.Erase(i);
delete dp;
continue;
}
// Обновляем время повторения
queue.Set(i, currentTick + convertTimeToTick(1.00));
}
}
public void OnClientPutInServer(int iClient) {
SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}
public void OnClientDisconnect(int iClient) {
SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}
public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype) {
if(attacker != victim) {
DataPack dp = new DataPack();
dp.WriteCell(GetClientUserId(attacker));
dp.WriteCell(GetClientUserId(victim));
// ....
queue.Push(GetGameTickCount() + convertTimeToTick(0.05));
queue.Push(dp);
}
}
stock int convertTimeToTick(float fTime) {
return RoundFloat(fTime/GetTickInterval());
}