Как связать Events и Timer?

Pan1k

Участник
Сообщения
5
Реакции
0
Всем привет,у меня возникла проблема при изучении SourcePawn. Я решил написать маленький плагин. Суть плагина заключается в том ,что при стрельбе игрок увеличивает скорость на определенное кол-во времени. Я сначала сделал плагин без таймера , все получилось,но вот дальше я не очень понимаю как связать Events и Timer.
Сам код без Timer :Оффтоп
Дальше я пошел в какие то дебри и не понимаю как связать..
Мои наработки:
№1Оффтоп
№2
Оффтоп
Объясните пожалуйста как связать:ab:
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
@Pan1k, создавай таймер после SetEntPropFloat, передавай в него юзер ид игрока (можно и индекс, но юзер ид лучше)
А затем в таймере устанавливай скорость в прежнее значение.
 

Pan1k

Участник
Сообщения
5
Реакции
0
@Pan1k, создавай таймер после SetEntPropFloat, передавай в него юзер ид игрока (можно и индекс, но юзер ид лучше)
А затем в таймере устанавливай скорость в прежнее значение.
щас попробую
--- Добавлено позже ---
У меня чет не получается:dash2:
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Тут следует создавать глобальный массив для таймеров и в событии хурта проверять запущен ли таймер для игрока. Никаких там юзер айди и тому подобного, потому что в игрока могут попасть n раз подряд и у тебя будет в итоге n запущенных таймеров.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
@gibs, это был самый простой вариант хоть и не совсем верный.
Но без готового кода я думаю он вряд ли разберется.

@Pan1k, Тебе @gibs истину написал.
 

Pan1k

Участник
Сообщения
5
Реакции
0
Вооо заработало :)
Оффтоп
Всем спасибо!
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #9
@Pan1k, немного не верно. Так правильнее:
PHP:
#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

Handle g_hTimer[MAXPLAYERS+1];
public void OnPluginStart()
{
    HookEvent("player_hurt" , Hurt,EventHookMode_Pre);
}
public void Hurt(Event hEvent , const char[] sEvName , bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(iClient)
    {
        PrintToChat(iClient,"Ваша скорость увеличилась!");
        SetEntPropFloat(iClient, Prop_Data, "m_flLaggedMovementValue", 1.7);
        
        if(g_hTimer[iClient])
        {
            KillTimer(g_hTimer[iClient]);
        }
        g_hTimer[iClient] = CreateTimer(3.0, Timer_Delay, iClient);
    }
}

public Action Timer_Delay(Handle hTimer, any iClient)
{
    g_hTimer[iClient] = null;
    if(IsClientInGame(iClient) && IsPlayerAlive(iClient))
    {
        SetEntPropFloat(iClient, Prop_Data, "m_flLaggedMovementValue", 1.0);
    }
    return Plugin_Stop;
}

+ При выходе можно добавить проверку для надежности
 

Pan1k

Участник
Сообщения
5
Реакции
0
@Pan1k, немного не верно. Так правильнее:
PHP:
#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

Handle g_hTimer[MAXPLAYERS+1];
public void OnPluginStart()
{
    HookEvent("player_hurt" , Hurt,EventHookMode_Pre);
}
public void Hurt(Event hEvent , const char[] sEvName , bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(iClient)
    {
        PrintToChat(iClient,"Ваша скорость увеличилась!");
        SetEntPropFloat(iClient, Prop_Data, "m_flLaggedMovementValue", 1.7);
       
        if(g_hTimer[iClient])
        {
            KillTimer(g_hTimer[iClient]);
        }
        g_hTimer[iClient] = CreateTimer(3.0, Timer_Delay, iClient);
    }
}

public Action Timer_Delay(Handle hTimer, any iClient)
{
    g_hTimer[iClient] = null;
    if(IsClientInGame(iClient) && IsPlayerAlive(iClient))
    {
        SetEntPropFloat(iClient, Prop_Data, "m_flLaggedMovementValue", 1.0);
    }
    return Plugin_Stop;
}

+ При выходе можно добавить проверку для надежности
Спасибо
 
Сверху Снизу