Отлов события когда hegrenade_projectile ударилась

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Привет всем. Подскажите можно ли отловить событие когда hegrenade_projectile ударилась об стену.
Об проп можно отловить через прикосновение двух entity например а вот об стену как.
 

xstage

🏹
Сообщения
726
Реакции
754
На линукс вот такой вариант могу предложить
C++:
#include <dhooks>

DynamicHook Hook_OnBounced;

public void OnPluginStart()
{
    // virtual void OnBounced( void ) {}
    Hook_OnBounced = new DynamicHook(251, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity);
    DHookAddEntityListener(ListenType_Created, EntityCreated);
}

public void EntityCreated(int iEntity, const char[] szClassName)
{
    if (!strcmp(szClassName, "hegrenade_projectile"))
    {
        Hook_OnBounced.HookEntity(Hook_Post, iEntity, OnBounced_Handler);
    }
}

MRESReturn OnBounced_Handler(int pThis)
{
    if (0 < pThis > MaxClients)
    {
        PrintToChatAll("Entity - %d, владелец - %N", pThis, GetEntPropEnt(pThis, Prop_Data, "m_hThrower"));
    }

    return MRES_Ignored;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
что бы не искать циклом владельца по всем entity?
Вешаешь на hegrenade_projectile хук SDKHook(nade, SDKHook_StartTouch, Touch_Wall); через тик после создания этой энтити, а потом в сравниваешь индекс:
C-подобный:
public void Touch_Wall(int nade, int ent)
{
    if(!ent || ent > MaxClients)
    {
        // граната коснулась стены или предмета
    }
}
Всё, ты молодец
Сообщения автоматически склеены:

P.S. 3,5 года назад писал такой код и он вполне себе нормально работал
 

xstage

🏹
Сообщения
726
Реакции
754
Вешаешь на hegrenade_projectile хук SDKHook(nade, SDKHook_StartTouch, Touch_Wall); через тик после создания этой энтити, а потом в сравниваешь индекс:
C-подобный:
public void Touch_Wall(int nade, int ent)
{
    if(!ent || ent > MaxClients)
    {
        // граната коснулась стены или предмета
    }
}
Всё, ты молодец
Сообщения автоматически склеены:

P.S. 3,5 года назад писал такой код и он вполне себе нормально работал
Твой вариант тоже сработает. Просто у него, наверно, стояла проверка entity, которая не учитывала world.
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Вешаешь на hegrenade_projectile хук SDKHook(nade, SDKHook_StartTouch, Touch_Wall); через тик после создания этой энтити, а потом в сравниваешь индекс:
C-подобный:
public void Touch_Wall(int nade, int ent)
{
    if(!ent || ent > MaxClients)
    {
        // граната коснулась стены или предмета
    }
}
Всё, ты молодец
Сообщения автоматически склеены:

P.S. 3,5 года назад писал такой код и он вполне себе нормально работал
Не знал что SDKHook_StartTouch работает и при прикосновение к стенам.
Сообщения автоматически склеены:

Твой вариант тоже сработает. Просто у него, наверно, стояла проверка entity, которая не учитывала world.
Вот такой код у меня
C-подобный:
//Каждый раз, когда граната отскакивает
void Event_GrenadeBounce(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int iIndex = OSGetEnt(iClient);

    char sClassname[32];
    GetEdictClassname(iIndex, sClassname, sizeof(sClassname));

    if(strcmp(sClassname, g_sClassname, false) == 0)
    {
        //...
    }
}

//Получаем индекс entity которая ударилась
int OSGetEnt(int iClient)
{
    int iIndex = MaxClients + 1;
    while((iIndex = FindEntityByClassname(iIndex, g_sClassname)) != -1)
    {
        if(GetEntPropEnt(iIndex, Prop_Send, "m_hThrower") == iClient) {
            return iIndex;
        }
    }
    return 0;
}
 
Сверху Снизу