Перехват взрыва гранат (удаление ее до взрыва)

Banana

Участник
Сообщения
892
Реакции
113
HookEvent("hegrenade_detonate", Event_Detonate, EventHookMode_Pre);

вот так делаю перехват и удаляю ее "Kill" .. однако граната взрывается все равно.. есть ли не костыльный способ перехвата взрыва гранаты? (не костыльный это без CreateTimer(..))
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Banana, ловить создание энтити c классом hegrenade_projectile.
C-подобный:
public void OnEntityCreated(int ent, const char[] cls)
{
    if(!strcmp(cls, "hegrenade_projectile", false)) AcceptEntityInput(ent, "Kill");
}
Сообщения автоматически склеены:

Разве что тебе это нужно делать не сразу, а вот как узнать время через которое нужно удалять я хз.
Как вариант через тик после создания этой энтити получить значения её скорости (как раз в этот момент значения станет можно получить) и положения, удалить энтити, создать другую энтити и прописать в TeleportEntity() полученные параметры.
После этого полетит другая энтити (лучше ещё и скопировать модель). А там можно таймер установить на срабатывание.
 
Последнее редактирование:

Banana

Участник
Сообщения
892
Реакции
113
@Banana, ловить создание энтити c классом hegrenade_projectile.
C-подобный:
public void OnEntityCreated(int ent, const char[] cls)
{
    if(!strcmp(cls, "hegrenade_projectile", false)) AcceptEntityInput(ent, "Kill");
}
Сообщения автоматически склеены:

Разве что тебе это нужно делать не сразу, а вот как узнать время через которое нужно удалять я хз.
Как вариант через тик после создания этой энтити получить значения её скорости (как раз в этот момент значения станет можно получить) и положения, удалить энтити, создать другую энтити и прописать в TeleportEntity() полученные параметры.
После этого полетит другая энтити (лучше ещё и скопировать модель). А там можно таймер установить на срабатывание.
Хотел приготовить бутерброд, а сврил борщ) Но спасибо)
 

Banana

Участник
Сообщения
892
Реакции
113
Решение.

PHP:
#include <dhooks>
#include <sdkhooks>

bool method_debug = false; //Реализация 2 способами - оба работают по сути одинаково, разница лишь в методе реализации которую вы можете изучить.
DynamicHook hook_detonate;
public void OnPluginStart()
{
    GameData conf = new GameData ("test_gamedata_kailo"); //Обьявили начало работы с gamedata
    if (method_debug) hook_detonate = new DynamicHook (conf.GetOffset("Detonate"), HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity); //Подготовили нашу функцию для хука методом Native
    else hook_detonate = DynamicHook.FromConf(conf, "Detonate_Func"); //Подготовили нашу функцию для хука методом GameData
    conf.Close(); //Чистим после использования. можно delete, но в данном случае не имеет смысла.
}
public void OnEntityCreated(int entity, const char[] classname)
{
    if (strcmp(classname, "hegrenade_projectile", false) == 0)
        hook_detonate.HookEntity(Hook_Pre, entity, HookHeDetonate);
}

MRESReturn HookHeDetonate (int pThis)
{
    PrintToChatAll("Индекс боевой гранаты - %d", pThis);
    RemoveEntity(pThis);
    return MRES_Supercede;
}

"Games"
{
"#default" //название игры
{
"Offsets" //Offsets, Signatures, adresses, functions, Keys (Для строк)
{
"Detonate" //CBaseGrenade::Detonate
{
//"library" "server" - нужно только для Signatures
"windows" "238"
"linux" "239"
}
}

"Functions"
{
"Detonate_Func"
{
"offset" "Detonate"
"hooktype" "entity"
"this" "entity"
"return" "void"
}
}
}
}

Спасибо кайло.
 
Сверху Снизу