- 370
- 127
как создать коллбек на событие в игре?
ну, как "хуки" сетевые, только на внутриигровые события (любое действие, совершённое/спровоцированное игроком)
Последнее редактирование:
как создать коллбек на событие в игре?
ну, как "хуки" сетевые, только на внутриигровые события (любое действие, совершённое/спровоцированное игроком)
#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();
Вторым аргументом будет void* edxМогу тебе кинуть пример хука на urmem DoBulletImpact. По логике вещей должен код работать, но 100 процентной гарантии не даю ибо пишу не со своего компа и пишу без компилятора. Скажу сам, я сам до сих пор не особо в хуках разбираюсь.
Ссылка на urmemC++:#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();
Ссылка на опредление метода DoBulletImpact и его адресс
Скажу от себя еще. Этой либой я лично не ставил хуки на thiscall и все делал исключительно на свой глаз и код может быть не рабочим.
— Как обжарить хлеб в тостере?
— Покупаешь хлеб и жаришь. Сварочный аппарат в помощь.
Будет, но нужно будет вызвать функцию, которая была до тебя, для того, чтобы не сломать цепочку вызовов.Т.е. этот хук действительно будет срабатывать на игровые события или только если эта функция будет вызвана из плагина?
Жалуется на неправильные аргументы в 5-6 строчках. В шаблоне типов больше, чем аргументов в сигнатуре функции.
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);
}
у меня на гитхабе в BulletTracer есть хук этой функцииСпасибо за ссылку! Правильно ли я понимаю, что функции из библиотеки SF и PSDK (в частности DoBulletImpact()) использует не только программист, но и игра? Т.е. этот хук действительно будет срабатывать на игровые события или только если эта функция будет вызвана из плагина?
1) Да, объяснил ниже.В папке build2.0 не появилось файла с расширением .sln. Уточните, в CMake в поле исходников нужно указывать папку, скачанную из ГитХаба или что-то другое? Я скачал архив и распаковал minhook-master в проект в папку SDK, теперь в папке SDK\Minhook всего четыре папки и один документ: Libs, Includes, build2.0, minhook-master и CMakeLists.txt. Зачем там Libs и Includes — пока непонятно.
urmem::hook urmemHookAimingCoords;
void __fastcall UpdateAimingCoors(void* _this, void* edx, CVector const* AimingTargetCoors)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors");
SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors. posX: %f; posY: %f; posZ: %f",
AimingTargetCoors->fX,
AimingTargetCoors->fY,
AimingTargetCoors->fZ);
urmemHookAimingCoords.call<urmem::calling_convention::thiscall, void>(_this, AimingTargetCoors);
}
urmem::hook urmemHookDoBulletImpact;
void __fastcall DoBulletImpact(void* _this, void* edx, CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint,CColPoint* colPoint, int arg5)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact");
SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact. posX: %f; posY: %f; posZ: %f",
endPoint->fX,
endPoint->fY,
endPoint->fZ);
urmemHookDoBulletImpact.call<urmem::calling_convention::thiscall, void>(_this, owner, victim, startPoint, endPoint, colPoint, arg5);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
switch (dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
urmemHookAimingCoords.install(0x50CB10, urmem::get_func_addr(&UpdateAimingCoors));
urmemHookDoBulletImpact.install(0x73B550, urmem::get_func_addr(&DoBulletImpact));
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
urmemHookAimingCoords.disable();
urmemHookDoBulletImpact.disable();
break;
}
return TRUE;
}
— Как обжарить хлеб в тостере?найти его адресс и поставить на него хук. Плагин SDK в помощь.
Нужно обработать попадание пули в конкретный объект. Здесь таких событий нет.так оно и есть. Ты сказал что ты хочешь игровое событие словить, а их херовая туча и хорошо они описаны в плагин SDK
Хук на DoBulletImpact и сравнение объектов приходящих в эту функциюНужно обработать попадание пули в конкретный объект. Здесь таких событий нет.
=)Хук на DoBulletImpact и сравнение объектов приходящих в эту функцию
Немного уточни этот момент)=)
А как получить объекты, которые приходят в эту функцию?