скорее всегоПод винду же делал, не? CMakeLists.txt
скорее всегоПод винду же делал, не? CMakeLists.txt
Привет. Подключил библиотеку, вызываю rakplugin::initialize(ppData);скорее всего
PLUGIN_EXPORT bool PLUGIN_CALL Load(void** ppData) {
//bool isSuccess = rakplugin::initialize(ppData);
rakplugin::initialize(ppData);
return PluginVoice::DoLoad(ppData);
}
Вообще, если любой метод вызываю из namespace rakplugin, то сервер тупо виснет, и ошибка загрузки плагина.Привет. Подключил библиотеку, вызываю rakplugin::initialize(ppData);
И сервер просто виснет на загрузке плагина.
C++:PLUGIN_EXPORT bool PLUGIN_CALL Load(void** ppData) { //bool isSuccess = rakplugin::initialize(ppData); rakplugin::initialize(ppData); return PluginVoice::DoLoad(ppData); }
Освобождать все ресурсы д3д9 перед вызовом Device::Reset ( в псдк и многих других готовых хукерах, можно найти событие Lost, которое вызывается перед ресетом). Если юзаешь имгуи, то там есть специальная функция с префиксом д3д9 invalidate, которую ты должен вызывать в каллбеке на lostкак удалить черный экран при alt tab или сворачивании игры
CPed* t = CPools::GetPed(sampapi::v037r1::RefNetGame()->GetPlayerPool()->GetAt(id)->m_pPlayer->m_pPed->m_handle);
static_cast<CPlayerPed*>(t)->DrawTriangleForMouseRecruitPed();
// Converted from thiscall void CPlayerPed::DrawTriangleForMouseRecruitPed(void) 0x60BA80
void CPlayerPed::DrawTriangleForMouseRecruitPed() {
plugin::CallMethod<0x60BA80, CPlayerPed *>(this);
}
Это потому что CPlayerPed это класс только для локального игрока. В этом методе получаетсяПодскажите пожалуйста, как вызвать зеленый треугольник. По-разному пытался, но что-то уже мозги не варят :)
Последнее, что пытался (хз, последние надежды на функцию с псдк была):
C++:CPed* t = CPools::GetPed(sampapi::v037r1::RefNetGame()->GetPlayerPool()->GetAt(id)->m_pPlayer->m_pPed->m_handle); static_cast<CPlayerPed*>(t)->DrawTriangleForMouseRecruitPed();C++:// Converted from thiscall void CPlayerPed::DrawTriangleForMouseRecruitPed(void) 0x60BA80 void CPlayerPed::DrawTriangleForMouseRecruitPed() { plugin::CallMethod<0x60BA80, CPlayerPed *>(this); }
CEntity* CPlayerPed::m_p3rdPersonMouseTarget
Вот такой вариант попробовал, он работает в случае, если играют анимации, откуда этот эффект взялся - я без понятия, случайно выявил (прыгал и забирался по стенке)Это потому что CPlayerPed это класс только для локального игрока. В этом методе получается
Посмотреть вложение 275142C++:CEntity* CPlayerPed::m_p3rdPersonMouseTarget
И от него уже рисуется треугольник. Можно в теории переписать метод для рисования по CPed других педов
CPlayerPed* l = static_cast<CPlayerPed*>(FindPlayerPed());
l->m_pPlayerTargettedPed = CPools::GetPed(sampapi::v037r1::RefNetGame()->GetPlayerPool()->GetAt(nearId)->m_pPlayer->m_pPed->m_handle);
l->DrawTriangleForMouseRecruitPed();
Нет никакого флага или стейта, таргетный пед сразу чистится по адресам 0x609EE3 и 0x60BA52, если ты не в прицеле.Вот такой вариант попробовал, он работает в случае, если играют анимации, откуда этот эффект взялся - я без понятия, случайно выявил (прыгал и забирался по стенке)
Т.е. рисует треугольник, видимо есть какой-то случай, вызывающий это
Может чего-то не хватает, какого-то флага/стейтаC++:CPlayerPed* l = static_cast<CPlayerPed*>(FindPlayerPed()); l->m_pPlayerTargettedPed = CPools::GetPed(sampapi::v037r1::RefNetGame()->GetPlayerPool()->GetAt(nearId)->m_pPlayer->m_pPed->m_handle); l->DrawTriangleForMouseRecruitPed();
сделал такОсвобождать все ресурсы д3д9 перед вызовом Device::Reset ( в псдк и многих других готовых хукерах, можно найти событие Lost, которое вызывается перед ресетом). Если юзаешь имгуи, то там есть специальная функция с префиксом д3д9 invalidate, которую ты должен вызывать в каллбеке на lost
static void LostEvent() {
ImGui_ImplDX9_InvalidateDeviceObjects();
}
Events::d3dLostEvent += LostEvent;
virtual Packet* Receive(void);
Ты это делаешь внутри своего самп клиента или хукаешь самп.длл?Вопрос по поводу RakClient.h
Как правильно работать с Receive? То-есть, как правильно получать пакеты исходящие от сервера?
Вопрос в том, где это делать? В игровом цикле? Нужна ли какая-то задержка?
P.S. Прикол в том, что когда я использую Receive, то как будто я перехватываю пакет, и дальше уже никакие пакеты от клиента на сервер не идут.RakNet:virtual Packet* Receive(void);
P.S. Я это делал в своём самп-клиенте.Ты это делаешь внутри своего самп клиента или хукаешь самп.длл?
Если второй вариант, то тебе надо хукать вызов RakClient::Receive - вызывать оригинал, сохранять результат (полученный пакет), обрабатывать его, если это нужный тебе пакет и уже в зависимости от нужд возвращать из Хука либо nullptr (самп его не прочитает), либо результат вызова оригинала
в структуре CNetGame есть указатель на RakClientInterface (pNetGame + 0x2C на R3), можешь от туда его получить и изменять указатель на метод внутри самой вмт. Либо же можешь найти адрес самой функции и хукать ее (samp.dll + 0x34AC0 на R3)P.S. Я это делал в своём самп-клиенте.
Спасибо. Я так и думал, что нужно хукать вызов RakClient::Receive.
А теперь вопрос, как правильно хукать вызов RakClient::Receive?
Посмотрел в IDA PRO (sampr3.idb)
Я так понимаю, там нужно мутить что-то с RakClientInterface_vtbl?
Получать указатель на RakClientInterface, а потом с помощью оффсетов хукать функцию Receive?
Из самого простого - хукнуть WNDPROC и не пропускать сообщение для VK_ESCAPEкак полностью отключить pause mune ( esc )? пробовал отключить рендер по итогу при esc экран черный и выйти из esc не получалось