Другое С/С++ Вопрос - Ответ

swlm

Участник
47
15
Привет. Подключил библиотеку, вызываю rakplugin::initialize(ppData);
И сервер просто виснет на загрузке плагина.


C++:
PLUGIN_EXPORT bool PLUGIN_CALL Load(void** ppData) {
    //bool isSuccess = rakplugin::initialize(ppData);
    rakplugin::initialize(ppData);

    return PluginVoice::DoLoad(ppData);
}

Привет. Подключил библиотеку, вызываю rakplugin::initialize(ppData);
И сервер просто виснет на загрузке плагина.


C++:
PLUGIN_EXPORT bool PLUGIN_CALL Load(void** ppData) {
    //bool isSuccess = rakplugin::initialize(ppData);
    rakplugin::initialize(ppData);

    return PluginVoice::DoLoad(ppData);
}
Вообще, если любой метод вызываю из namespace rakplugin, то сервер тупо виснет, и ошибка загрузки плагина.
 
Последнее редактирование:

вайега52

Налуашил состояние
Модератор
2,980
3,103
как удалить черный экран при alt tab или сворачивании игры
Освобождать все ресурсы д3д9 перед вызовом Device::Reset ( в псдк и многих других готовых хукерах, можно найти событие Lost, которое вызывается перед ресетом). Если юзаешь имгуи, то там есть специальная функция с префиксом д3д9 invalidate, которую ты должен вызывать в каллбеке на lost
 
  • Нравится
Реакции: tanksoftik

Smeruxa

smeruxa.ru
Проверенный
1,429
788
Подскажите пожалуйста, как вызвать зеленый треугольник. По-разному пытался, но что-то уже мозги не варят :)
Последнее, что пытался (хз, последние надежды на функцию с псдк была):
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);
}
 

ARMOR

Я креветка
Модератор
5,067
7,378
Подскажите пожалуйста, как вызвать зеленый треугольник. По-разному пытался, но что-то уже мозги не варят :)
Последнее, что пытался (хз, последние надежды на функцию с псдк была):
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);
}
Это потому что CPlayerPed это класс только для локального игрока. В этом методе получается
C++:
CEntity* CPlayerPed::m_p3rdPersonMouseTarget
1753628270564.png

И от него уже рисуется треугольник. Можно в теории переписать метод для рисования по CPed других педов
 
  • Влюблен
  • Нравится
Реакции: Smeruxa и вайега52

Smeruxa

smeruxa.ru
Проверенный
1,429
788
Это потому что CPlayerPed это класс только для локального игрока. В этом методе получается
C++:
CEntity* CPlayerPed::m_p3rdPersonMouseTarget
Посмотреть вложение 275142
И от него уже рисуется треугольник. Можно в теории переписать метод для рисования по CPed других педов
Вот такой вариант попробовал, он работает в случае, если играют анимации, откуда этот эффект взялся - я без понятия, случайно выявил (прыгал и забирался по стенке)
Т.е. рисует треугольник, видимо есть какой-то случай, вызывающий это
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();
Может чего-то не хватает, какого-то флага/стейта
 
Последнее редактирование:

Musaigen

ihatemyself
Проверенный
1,690
1,556
Вот такой вариант попробовал, он работает в случае, если играют анимации, откуда этот эффект взялся - я без понятия, случайно выявил (прыгал и забирался по стенке)
Т.е. рисует треугольник, видимо есть какой-то случай, вызывающий это
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();
Может чего-то не хватает, какого-то флага/стейта
Нет никакого флага или стейта, таргетный пед сразу чистится по адресам 0x609EE3 и 0x60BA52, если ты не в прицеле.
 
Последнее редактирование:
  • Нравится
Реакции: вайега52

tanksoftik

Участник
35
7
Освобождать все ресурсы д3д9 перед вызовом Device::Reset ( в псдк и многих других готовых хукерах, можно найти событие Lost, которое вызывается перед ресетом). Если юзаешь имгуи, то там есть специальная функция с префиксом д3д9 invalidate, которую ты должен вызывать в каллбеке на lost
сделал так

C++:
static void LostEvent() {
    ImGui_ImplDX9_InvalidateDeviceObjects();
}

Events::d3dLostEvent += LostEvent;

но при alt tab или сворачивании игры все равно черный экран некоторое время
 

swlm

Участник
47
15
Вопрос по поводу RakClient.h
Как правильно работать с Receive? То-есть, как правильно получать пакеты исходящие от сервера?
Вопрос в том, где это делать? В игровом цикле? Нужна ли какая-то задержка?

RakNet:
virtual Packet* Receive(void);
P.S. Прикол в том, что когда я использую Receive, то как будто я перехватываю пакет, и дальше уже никакие пакеты от клиента на сервер не идут.
 
Последнее редактирование:

вайега52

Налуашил состояние
Модератор
2,980
3,103
Вопрос по поводу RakClient.h
Как правильно работать с Receive? То-есть, как правильно получать пакеты исходящие от сервера?
Вопрос в том, где это делать? В игровом цикле? Нужна ли какая-то задержка?

RakNet:
virtual Packet* Receive(void);
P.S. Прикол в том, что когда я использую Receive, то как будто я перехватываю пакет, и дальше уже никакие пакеты от клиента на сервер не идут.
Ты это делаешь внутри своего самп клиента или хукаешь самп.длл?

Если второй вариант, то тебе надо хукать вызов RakClient::Receive - вызывать оригинал, сохранять результат (полученный пакет), обрабатывать его, если это нужный тебе пакет и уже в зависимости от нужд возвращать из Хука либо nullptr (самп его не прочитает), либо результат вызова оригинала
 

tanksoftik

Участник
35
7
как полностью отключить pause mune ( esc )? пробовал отключить рендер по итогу при esc экран черный и выйти из esc не получалось
 

swlm

Участник
47
15
Ты это делаешь внутри своего самп клиента или хукаешь самп.длл?

Если второй вариант, то тебе надо хукать вызов RakClient::Receive - вызывать оригинал, сохранять результат (полученный пакет), обрабатывать его, если это нужный тебе пакет и уже в зависимости от нужд возвращать из Хука либо nullptr (самп его не прочитает), либо результат вызова оригинала
P.S. Я это делал в своём самп-клиенте.

Спасибо. Я так и думал, что нужно хукать вызов RakClient::Receive.
А теперь вопрос, как правильно хукать вызов RakClient::Receive?
Посмотрел в IDA PRO (sampr3.idb)
Я так понимаю, там нужно мутить что-то с RakClientInterface_vtbl?
Получать указатель на RakClientInterface, а потом с помощью оффсетов хукать функцию Receive?
 
Последнее редактирование:

вайега52

Налуашил состояние
Модератор
2,980
3,103
P.S. Я это делал в своём самп-клиенте.

Спасибо. Я так и думал, что нужно хукать вызов RakClient::Receive.
А теперь вопрос, как правильно хукать вызов RakClient::Receive?
Посмотрел в IDA PRO (sampr3.idb)
Я так понимаю, там нужно мутить что-то с RakClientInterface_vtbl?
Получать указатель на RakClientInterface, а потом с помощью оффсетов хукать функцию Receive?
в структуре CNetGame есть указатель на RakClientInterface (pNetGame + 0x2C на R3), можешь от туда его получить и изменять указатель на метод внутри самой вмт. Либо же можешь найти адрес самой функции и хукать ее (samp.dll + 0x34AC0 на R3)
 

вайега52

Налуашил состояние
Модератор
2,980
3,103
как полностью отключить pause mune ( esc )? пробовал отключить рендер по итогу при esc экран черный и выйти из esc не получалось
Из самого простого - хукнуть WNDPROC и не пропускать сообщение для VK_ESCAPE
 
  • Нравится
Реакции: tanksoftik