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

ARMOR

God has forsaken us
Модератор
5,058
7,437
как хукать MODELS\FONTS.TXD для подгрузки своих шрифтов
CFont::Initialise 0x5BA690 Тут подгружается fonts.txd через CTxdStore, можешь просто переписать функцию и инджектнуть её, либо просто хукнуть CSprite2d::SetTexture внутри неё. для font2 - 0x5BA6CC, для font1 - 0x5BA6E0.
Ещё можешь просто после подгрузки игровых шрифтов подгрузить свои вместо них в массив CSprite2d CFont::Sprite[2] - 0xC71AD0
 
  • Клоун
Реакции: #Northn

vmprotect

Известный
394
279
каким образом происходит подгрузка своих шрифтов для чата типа ttf
 

ARMOR

God has forsaken us
Модератор
5,058
7,437
каким образом происходит подгрузка своих шрифтов для чата типа ttf
Для чата подгрузка происходит через CFonts::Reset(), для диалогов и т.д используется CDXUTDialog::InitFont(). Сами методы просто используют D3DXCreateFontA
 

yorenov

Участник
65
65
C++:
void loooooooool::rakhookSetup() {
rakhook::on_receive_rpc += [&] (unsigned char &id, RakNet::BitStream *bitStream) {
        if (!enabled)
            return true;
        if (id != 215)
            return true;

        bitStream->ResetReadPointer();

        char test[5]{0};
        bitStream->Read(test, 5);

        uint16_t test2;
        bitStream->Read(test2);

       
        sendResponse(test, test2, 0, 0);
        // тут надо подождать 20 секунд
        sendResponse(test, test2, 0, 0);

        return true;
    };
}
У нас есть лямбда, функция loooooooool::rakhookSetup() вызывается 1 раз после инициализации. Вопрос вот в чем, как мне вызвать функцию sendResponse два раза с интервалом в 20 секунд? Переменные test и test2 не хочу выносить за пределы лямбды, выносить битстрим - бяка, создавать поток не хочу, использовать ktcoro - научите). Суть просто в том, что мне надо вызвать функцию sendResponse несколько раз, передав в аргументы те самые test и test2, так же, вызывать с интервалом. Подскажите нормальные способы

C++:
void loooooooool::rakhookSetup() {
rakhook::on_receive_rpc += [&] (unsigned char &id, RakNet::BitStream *bitStream) {
        if (!enabled)
            return true;
        if (id != 215)
            return true;

        bitStream->ResetReadPointer();

        char test[5]{0};
        bitStream->Read(test, 5);

        uint16_t test2;
        bitStream->Read(test2);

      
        sendResponse(test, test2, 0, 0);
        // тут надо подождать 20 секунд
        sendResponse(test, test2, 0, 0);

        return true;
    };
}
У нас есть лямбда, функция loooooooool::rakhookSetup() вызывается 1 раз после инициализации. Вопрос вот в чем, как мне вызвать функцию sendResponse два раза с интервалом в 20 секунд? Переменные test и test2 не хочу выносить за пределы лямбды, выносить битстрим - бяка, создавать поток не хочу, использовать ktcoro - научите). Суть просто в том, что мне надо вызвать функцию sendResponse несколько раз, передав в аргументы те самые test и test2, так же, вызывать с интервалом. Подскажите нормальные способы
upd: Нашел решение

С++:
tasklist.add_task([](int _test, int _test2) -> ktwait {
            looooooool::sendResponse(_test, _test2, "1", false);
            co_await 16000;
            looooooool::sendResponse(_test, _test2, "2", true);
        }, test, test2);
 
Последнее редактирование:

vmprotect

Известный
394
279
как можно реализовать привязку сервера, например если подключаешься на IP 127.0.0.1:7777, то будет выводиться определенная функция, а если на другой IP то ничего не будет
 

ARMOR

God has forsaken us
Модератор
5,058
7,437
как можно реализовать привязку сервера, например если подключаешься на IP 127.0.0.1:7777, то будет выводиться определенная функция, а если на другой IP то ничего не будет
Получать адрес и порт из CNetGame и проверять их
 
  • Нравится
Реакции: вайега52 и vmprotect

vmprotect

Известный
394
279
в sampapi возможно создавать свой кастомный диалог? если да каким образом это реализуется ?
 

forgit

Новичок
3
1
как вызывать такое окно для перезапуска программы с правами администратора
startadmin.jpg
 

writeline

Новичок
28
9
как можно реализовать привязку сервера, например если подключаешься на IP 127.0.0.1:7777, то будет выводиться определенная функция, а если на другой IP то ничего не будет
При загрузке плагина добавь проверку наличия "ключа" в строке запуска сампа, при наличии твоего IP будет выполнятся функция, если же его не будет то самп запустится как обычно.
с++:
BOOL APIENTRY DllEntryPoint(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        TCHAR* cmdline = GetCommandLine();
        if (StrStr(cmdline, "127.0.0.1:7777")) {
        // ТУТ ТВОЙ КОД
        }
    }
    return TRUE;
    LoadLibrary("samp.dll");
}
 

вайега52

Налуашил состояние
Модератор
3,055
3,285
как можно реализовать привязку сервера, например если подключаешься на IP 127.0.0.1:7777, то будет выводиться определенная функция, а если на другой IP то ничего не будет
При загрузке плагина добавь проверку наличия "ключа" в строке запуска сампа, при наличии твоего IP будет выполнятся функция, если же его не будет то самп запустится как обычно.
с++:
BOOL APIENTRY DllEntryPoint(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hModule);
        TCHAR* cmdline = GetCommandLine();
        if (StrStr(cmdline, "127.0.0.1:7777")) {
        // ТУТ ТВОЙ КОД
        }
    }
    return TRUE;
    LoadLibrary("samp.dll");
}
Можно хукнуть метод RakClient, отвечающий за подключение к серверу
C++:
#include "kthook/kthook.hpp"



using RakClientConnect_t = bool(__thiscall*)(void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer);
kthook::kthook_simple<RakClientConnect_t>(RakClientConnectHook);



bool RakClientConnectHooked(const decltype(RakClientConnectHook)& hook, void* pRakClient, const char* host, unsigned short serverPort, unsigned short clientPort, unsigned int depreciated, int threadSleepTimer)
{
    if (strcmp(host, "127.0.0.1") == 0))
        std::cout << "Ochko anus rvat ebat" << std::endl;
    else
        std::cout << "Ne chunazes" << std::endl;


    return hook.get_trampoline()(pRakClient, host, serverPort, clientPort, depreciated, threadSleepTimer);
}



auto SAMPHandle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));
RakClientConnectHook.set_cb(&RakClientHooked);
RakClientConnectHook.set_dest(SAMPHandle + 0x339F0); // R3
RakClientConnectHook.install();

Еще к примеру можно хукать какую-нибудь функцию из winsock (получать адрес экпортируемой функции из Ws2_32.dll), но тогда есть вероятность. то функция вызвана не из samp.dll, а например из какого-то плагина
 
Последнее редактирование:
  • Нравится
Реакции: writeline и 0x73616D