Как поймать внутриигровое событие в SAMPFUNCS?

Ya Zaregalsya

Известный
Автор темы
370
127
Последнее редактирование:

Ya Zaregalsya

Известный
Автор темы
370
127
так оно и есть. Ты сказал что ты хочешь игровое событие словить, а их херовая туча и хорошо они описаны в плагин SDK
Нужно обработать попадание пули в конкретный объект. Здесь таких событий нет.
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
  • Нравится
Реакции: Ya Zaregalsya

Ya Zaregalsya

Известный
Автор темы
370
127
Хук на DoBulletImpact и сравнение объектов приходящих в эту функцию
Всё ещё не разобрался с Вашим предложением. Можете объяснить подробнее как реализовать тело такого хука? У меня вообще крайне мало опыта работы с хуками.
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Могу тебе кинуть пример хука на urmem DoBulletImpact. По логике вещей должен код работать, но 100 процентной гарантии не даю ибо пишу не со своего компа и пишу без компилятора. Скажу сам, я сам до сих пор не особо в хуках разбираюсь.
C++:
#include "urmem.hpp"
urmem::hook hook;//Определение обьекта нашего хука(вроде правильно сказал по терминологии)
//Определяем тело нашей функции куда мы хотим чтобы шли данные с хука
void DoBulletImpact(void *_this,CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint, CColPoint* colPoint, int arg5) {
    hook.call<urmem::calling_convention::thiscall,void *, CEntity*, CEntity*, CVector *, CVector *, CColPoint *, int>
   (_this, owner, victim, startPoint, endPoint, colPoint, arg5);
//Вызываем оригинальную функцию.

}

//В иницилизацию плагина
hook.install(0x73B550, urmem::get_func_addr(&DoBulletImpact));
//Первый параметр метода - это куда мы ставим хук.
//Второй - это адресс нашего метода или функции. Если это метод класса, то он должен быть статичным.

//В выгрызку плагина
hook.disable();
Ссылка на urmem
Ссылка на опредление метода DoBulletImpact и его адресс
Скажу от себя еще. Этой либой я лично не ставил хуки на thiscall и все делал исключительно на свой глаз и код может быть не рабочим.
 

Musaigen

abobusnik
Проверенный
1,583
1,302
Могу тебе кинуть пример хука на urmem DoBulletImpact. По логике вещей должен код работать, но 100 процентной гарантии не даю ибо пишу не со своего компа и пишу без компилятора. Скажу сам, я сам до сих пор не особо в хуках разбираюсь.
C++:
#include "urmem.hpp"
urmem::hook hook;//Определение обьекта нашего хука(вроде правильно сказал по терминологии)
//Определяем тело нашей функции куда мы хотим чтобы шли данные с хука
void DoBulletImpact(void *_this,CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint, CColPoint* colPoint, int arg5) {
    hook.call<urmem::calling_convention::thiscall,void *, CEntity*, CEntity*, CVector *, CVector *, CColPoint *, int>
   (_this, owner, victim, startPoint, endPoint, colPoint, arg5);
//Вызываем оригинальную функцию.

}

//В иницилизацию плагина
hook.install(0x73B550, urmem::get_func_addr(&DoBulletImpact));
//Первый параметр метода - это куда мы ставим хук.
//Второй - это адресс нашего метода или функции. Если это метод класса, то он должен быть статичным.

//В выгрызку плагина
hook.disable();
Ссылка на urmem
Ссылка на опредление метода DoBulletImpact и его адресс
Скажу от себя еще. Этой либой я лично не ставил хуки на thiscall и все делал исключительно на свой глаз и код может быть не рабочим.
Вторым аргументом будет void* edx

— Как обжарить хлеб в тостере?
— Покупаешь хлеб и жаришь. Сварочный аппарат в помощь.
 
  • Нравится
Реакции: Ya Zaregalsya

Ya Zaregalsya

Известный
Автор темы
370
127
Могу тебе кинуть пример хука на urmem DoBulletImpact. По логике вещей должен код работать, но 100 процентной гарантии не даю ибо пишу не со своего компа и пишу без компилятора. Скажу сам, я сам до сих пор не особо в хуках разбираюсь.
C++:
#include "urmem.hpp"
urmem::hook hook;//Определение обьекта нашего хука(вроде правильно сказал по терминологии)
//Определяем тело нашей функции куда мы хотим чтобы шли данные с хука
void DoBulletImpact(void *_this,CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint, CColPoint* colPoint, int arg5) {
    hook.call<urmem::calling_convention::thiscall,void *, CEntity*, CEntity*, CVector *, CVector *, CColPoint *, int>
   (_this, owner, victim, startPoint, endPoint, colPoint, arg5);
//Вызываем оригинальную функцию.

}

//В иницилизацию плагина
hook.install(0x73B550, urmem::get_func_addr(&DoBulletImpact));
//Первый параметр метода - это куда мы ставим хук.
//Второй - это адресс нашего метода или функции. Если это метод класса, то он должен быть статичным.

//В выгрызку плагина
hook.disable();
Ссылка на urmem
Ссылка на опредление метода DoBulletImpact и его адресс
Скажу от себя еще. Этой либой я лично не ставил хуки на thiscall и все делал исключительно на свой глаз и код может быть не рабочим.
Жалуется на неправильные аргументы в 5-6 строчках. В шаблоне типов больше, чем аргументов в сигнатуре функции.
 

Ya Zaregalsya

Известный
Автор темы
370
127
Вторым аргументом будет void* edx


Спасибо за ссылку! Правильно ли я понимаю, что функции из библиотеки SF и PSDK (в частности DoBulletImpact()) использует не только программист, но и игра? Т.е. этот хук действительно будет срабатывать на игровые события или только если эта функция будет вызвана из плагина?
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Жалуется на неправильные аргументы в 5-6 строчках. В шаблоне типов больше, чем аргументов в сигнатуре функции.
Вечером попробую разобратся. Как говорил писал методом научного тыка.
 
  • Нравится
Реакции: Ya Zaregalsya

Musaigen

abobusnik
Проверенный
1,583
1,302
Т.е. этот хук действительно будет срабатывать на игровые события или только если эта функция будет вызвана из плагина?
Будет, но нужно будет вызвать функцию, которая была до тебя, для того, чтобы не сломать цепочку вызовов.

Жалуется на неправильные аргументы в 5-6 строчках. В шаблоне типов больше, чем аргументов в сигнатуре функции.
C++:
void DoBulletImpact(void* _this, void* edx, CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint, CColPoint* colPoint, int arg5)
{
    /* Твой код */

    // вызов той функции, что была до нас, DoBulletImpact ничего не возвращает, поэтому указываем только соглашение о вызове __thiscall
    hook.call<urmem::calling_convention::thiscall>(_this, owner, victim, startPoint, endPoint, colPoint, arg5);
}
 
  • Нравится
Реакции: Ya Zaregalsya