Как отловить событие до того как игрок ослеп?

gameuser425

Участник
Сообщения
30
Реакции
3
Здравствуйте.
Хочу отловить событие ослепления игрока до того как оно произошло, для того что-бы получить пред идущее состояние ослепления. И далее уже либо слепить игрока из противоположной команды новыми параметрами, либо слепить игрока пред идущими параметрами если флешку бросил товарищ по команде. Ибо если не устанавливать пред идущее состояние, слепота от врага мгновенно пропадает если рядом взорвалась флешка товарища по команде.

При перехвате события "player_blind" с параметром EventHookMode_Pre это бесполезно. В этот момент игрок уже ослеплён, а так же не известен тот кто бросил гранату, так как событие "flashbang_detonate" срабатывает после.
 

Rolzzandik

Участник
Сообщения
492
Реакции
234
 

gameuser425

Участник
Сообщения
30
Реакции
3
Эта библиотека для CS:GO, мне нужно для CS:S
 

xstage

🏹
Сообщения
726
Реакции
754
Эта библиотека для CS:GO, мне нужно для CS:S
C-подобный:
#include <sourcemod>
#include <dhooks>
#include <sdktools>

Handle hBlind;

public void OnPluginStart()
{
    // CCSPlayer::Blind(float, float, float)
    // 469 - linux
    // 466 - windows

    hBlind = DHookCreate(469, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity, OnBlindPlayer);
    DHookAddParam(hBlind, HookParamType_Float);
    DHookAddParam(hBlind, HookParamType_Float);
    DHookAddParam(hBlind, HookParamType_Float);
}

public void OnClientPutInServer(int client)
{
    DHookEntity(hBlind, false, client);
}

public MRESReturn OnBlindPlayer(int pThis, Handle hParams)
{
    //...
}
 

Kailo

Участник
Сообщения
194
Реакции
896
Blind Hook имеет также и версию под CSS:OB linux доступный по ссылки для скачивания blindhook-cssob-linux.zip
А в обсуждении можно найти собранный под v34
 

gameuser425

Участник
Сообщения
30
Реакции
3
C-подобный:
#include <sourcemod>
#include <dhooks>
#include <sdktools>

Handle hBlind;

public void OnPluginStart()
{
    // CCSPlayer::Blind(float, float, float)
    // 469 - linux
    // 466 - windows

    hBlind = DHookCreate(469, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity, OnBlindPlayer);
    DHookAddParam(hBlind, HookParamType_Float);
    DHookAddParam(hBlind, HookParamType_Float);
    DHookAddParam(hBlind, HookParamType_Float);
}

public void OnClientPutInServer(int client)
{
    DHookEntity(hBlind, false, client);
}

public MRESReturn OnBlindPlayer(int pThis, Handle hParams)
{
    //...
}
Спасибо! Ещё вопрос) А как правильно получить степень и время ослепления игрока ?

Вот мои наработки с комментариями.

C-подобный:
public MRESReturn OnBlindPlayer(int client, Handle hParams)
{
    m_flFlashDuration[client] = 0.0;    //Очищу для теста.
    m_flFlashMaxAlpha[client] = 0.0;    //Очищу для теста.

    /**
        Если сначала установить время и степень ослепления по нулям, то игрок слепнет,
        Но GetEntDataFloat и GetEntPropFloat будут возвращать всегда 0.0.
        SetEntDataFloat(client, g_iOffset_flFlashDuration, 0.0);
        SetEntDataFloat(client, g_iOffset_flFlashMaxAlpha, 0.0);
    */

    //Записываю старое состояние в m_flFlashDuration[client] и m_flFlashMaxAlpha[client], для того что-бы позже разобраться кто-же слепнет и чья флешка, и установить Это, старое состояние игроку, если флешка была брошена кем-то из команды.


    /**
        Показывает предидущее состояние, то состояние которое было когда игрок ослеп в последний раз.
        То есть если игрок отошёл от старой флешки уже давно, всё равно покажет старое состояние, эти цифры как будто сохраняются где-то в памяти.
        Я не могу узнать состояние флешки в этот самый момент, когда срабатывает этот паблик.
        Не могу определить степень ослепления игрока на данный момент и время ослепления.
    */
#if(METOD)
    m_flFlashDuration[client] = GetEntDataFloat(client, g_iOffset_flFlashDuration);
    m_flFlashMaxAlpha[client] = GetEntDataFloat(client, g_iOffset_flFlashMaxAlpha);
#else
    m_flFlashDuration[client] = GetEntPropFloat(client, Prop_Send, "m_flFlashDuration");
    m_flFlashMaxAlpha[client] = GetEntPropFloat(client, Prop_Send, "m_flFlashMaxAlpha");
#endif

    PrintToChat(client, "Время = %f, Интенсивность = %f", m_flFlashDuration[client], m_flFlashMaxAlpha[client]);
    return MRES_Ignored;
}
 

xstage

🏹
Сообщения
726
Реакции
754
Спасибо! Ещё вопрос) А как правильно получить степень и время ослепления игрока ?

Вот мои наработки с комментариями.

C-подобный:
public MRESReturn OnBlindPlayer(int client, Handle hParams)
{
    m_flFlashDuration[client] = 0.0;    //Очищу для теста.
    m_flFlashMaxAlpha[client] = 0.0;    //Очищу для теста.

    /**
        Если сначала установить время и степень ослепления по нулям, то игрок слепнет,
        Но GetEntDataFloat и GetEntPropFloat будут возвращать всегда 0.0.
        SetEntDataFloat(client, g_iOffset_flFlashDuration, 0.0);
        SetEntDataFloat(client, g_iOffset_flFlashMaxAlpha, 0.0);
    */

    //Записываю старое состояние в m_flFlashDuration[client] и m_flFlashMaxAlpha[client], для того что-бы позже разобраться кто-же слепнет и чья флешка, и установить Это, старое состояние игроку, если флешка была брошена кем-то из команды.


    /**
        Показывает предидущее состояние, то состояние которое было когда игрок ослеп в последний раз.
        То есть если игрок отошёл от старой флешки уже давно, всё равно покажет старое состояние, эти цифры как будто сохраняются где-то в памяти.
        Я не могу узнать состояние флешки в этот самый момент, когда срабатывает этот паблик.
        Не могу определить степень ослепления игрока на данный момент и время ослепления.
    */
#if(METOD)
    m_flFlashDuration[client] = GetEntDataFloat(client, g_iOffset_flFlashDuration);
    m_flFlashMaxAlpha[client] = GetEntDataFloat(client, g_iOffset_flFlashMaxAlpha);
#else
    m_flFlashDuration[client] = GetEntPropFloat(client, Prop_Send, "m_flFlashDuration");
    m_flFlashMaxAlpha[client] = GetEntPropFloat(client, Prop_Send, "m_flFlashMaxAlpha");
#endif

    PrintToChat(client, "Время = %f, Интенсивность = %f", m_flFlashDuration[client], m_flFlashMaxAlpha[client]);
    return MRES_Ignored;
}

C-подобный:
public MRESReturn OnBlindPlayer(int client, Handle hParams)
{
    float holdTime = DHookGetParam(hParams, 1);
    float startingAlpha = DHookGetParam(hParams, 3);
}
 
Сверху Снизу