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

#kweeZ

Известный
577
123
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про hash_map, а если компилить с "
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1", то при входе в игру пишется "Test", а команда /showinfo просто не работает
Код:
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>

#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void CALLBACK cmd_show_info_player(std::string param)
{
    if (param.empty()) return;
    int    i = std::stoi(param);

    char buf[128];

    stRemotePlayer* pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[i];

    if (!pPlayer) return;

    sprintf(buf, "Nickname - %s, Ping - %d, Score - %d, isNPC - %d, AFKState - %d",
        pPlayer->szPlayerName,
        pPlayer->iPing,
        pPlayer->iScore,
        pPlayer->iIsNPC,
        pPlayer->pPlayerData->iAFKState == 2);

    SF->getSAMP()->getChat()->AddChatMessage(-1, buf);
};

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;
        if (!SF->getSAMP()->IsInitialized())
            return;
        SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "Test." );
        SF->getSAMP()->registerChatCommand("showinfo", cmd_show_info_player);
        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
 

Cake_

Потрачен
Проверенный
263
313
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про hash_map, а если компилить с "
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1", то при входе в игру пишется "Test", а команда /showinfo просто не работает
Код:
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>

#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void CALLBACK cmd_show_info_player(std::string param)
{
    if (param.empty()) return;
    int    i = std::stoi(param);

    char buf[128];

    stRemotePlayer* pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[i];

    if (!pPlayer) return;

    sprintf(buf, "Nickname - %s, Ping - %d, Score - %d, isNPC - %d, AFKState - %d",
        pPlayer->szPlayerName,
        pPlayer->iPing,
        pPlayer->iScore,
        pPlayer->iIsNPC,
        pPlayer->pPlayerData->iAFKState == 2);

    SF->getSAMP()->getChat()->AddChatMessage(-1, buf);
};

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;
        if (!SF->getSAMP()->IsInitialized())
            return;
        SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "Test." );
        SF->getSAMP()->registerChatCommand("showinfo", cmd_show_info_player);
        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
Первой строкой поставь. Нужно вводить не просто /showinfo, в команде должен быть один параметр, в данном случае это id игрока ( 0 - 1000).
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
 
  • Нравится
Реакции: #kweeZ

#kweeZ

Известный
577
123
Первой строкой поставь. Нужно вводить не просто /showinfo, в команде должен быть один параметр, в данном случае это id игрока ( 0 - 1000).
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
 

Cake_

Потрачен
Проверенный
263
313
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
Чтобы вывести свои данные вот код:
C++:
char* name = SF->getSAMP()->getPlayers()->pszLocalPlayerName;
    int id = SF->getSAMP()->getPlayers()->sLocalPlayerID;
    int score = SF->getSAMP()->getPlayers()->iLocalPlayerScore;
    int ping = SF->getSAMP()->getPlayers()->iLocalPlayerPing;

    char buffer[228];
    sprintf(buffer, "NickName: %s , ID: %d , Ping: %d , Score: %d , ", name, id, ping, score);
    SF->getSAMP()->getChat()->AddChatMessage(-1, buffer);
 

Vadim.dll

Известный
168
81
Вопрос:
Есть такая структура:
C++:
struct stSAMP
{
    void                    *pUnk0[2];
    uint8_t                    byteSpace[24];
    char                    szIP[257];
    char                    szHostname[259];
    uint8_t                    byteUnk1;
    uint32_t                ulPort;
    uint32_t                ulMapIcons[100];
    int                        iLanMode;
    int                        iGameState;
    uint32_t                ulConnectTick;
    struct stSAMPSettings    *pSettings;
    void                    *pRakClientInterface;
    struct stSAMPPools        *pPools;
};

VbXsKBq.png


Но в cheat engine она выглядит совсем не так, данные то в ней есть, вроде IP и Hostname, но они расположены на каких-то непонятных оффсетах, почему структура в C++ выглядит не так, как в CheatEngine, смотрел еще некоторые структуры - так там данные в CE расположены в том же порядке, что и в C++
 

index

Известный
126
82
Хочу получить ники всех игроков на сервере.
C++:
int main() {
   DWORD pID;
   char moduleName[] = "samp.dll";

   HWND hGameWindow = FindWindow(NULL, L"GTA:SA:MP");
   GetWindowThreadProcessId(hGameWindow, &pID);
   HANDLE pGta = OpenProcess(PROCESS_VM_READ, FALSE, pID);
   DWORD pSamp = GetModuleBaseAddress(pID, L"samp.dll");
  
   cout << "samp.dll addr: " << hex << pSamp << endl;

   char nickname[24] = { " " };
   ReadProcessMemory(pGta, (LPCVOID)(pSamp + OFFSET_NICKNAME), &nickname, sizeof(nickname), NULL);

   DWORD dwAddress;
   ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
   cout << "dwAdress : " << dwAddress << endl;

   ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
   cout << "dwAdres : " << dwAddress << endl;

   DWORD dwPlayers;
   ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
   cout << "dwPlayers : " << dwPlayers << endl;

   cout << endl << endl;

   uint32_t ulMaxPlayerID;
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
   cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl;

   uint16_t sLocalPlayerID;
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
   cout << "sLocalPlayerID : " << sLocalPlayerID << endl;

   //0x2a

   stRemotePlayer* pRemotePlayer[SAMP_MAX_PLAYERS];
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0);
   cout << "pRemotePlayer : " << pRemotePlayer << endl;
   cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl;
}

Но получаю либо кашу либо краш.
Как минимум - у Вас несоответствие кодировок. ANSI программа использующая ANSI версии функций winApi у Вас принимает в качестве аргументов const wchar_t * (строки L"..."), что является ошибкой.
А как более - хороший пример по external получению списка игроков написан в samp udf for ahk. Все оффсеты есть в верхней части файла в массивах, где 1, 2, 3 позиции соответствуют версиям 0.3.7r1, r2, 0.3dl с поправкой для global SAMP_REMOTEPLAYERDATA_PED := [0x2A4, 0x40, 0x40].
Также для определения причин вылета лучше применять отладчик, т.к. сообщение "у меня крашит" практически не несет в себе полезной нагрузки, а узнать причины краша Вы можете самостоятельно.

Вопрос:
Есть такая структура:
C++:
struct stSAMP
{
    void                    *pUnk0[2];
    uint8_t                    byteSpace[24];
    char                    szIP[257];
    char                    szHostname[259];
    uint8_t                    byteUnk1;
    uint32_t                ulPort;
    uint32_t                ulMapIcons[100];
    int                        iLanMode;
    int                        iGameState;
    uint32_t                ulConnectTick;
    struct stSAMPSettings    *pSettings;
    void                    *pRakClientInterface;
    struct stSAMPPools        *pPools;
};

VbXsKBq.png


Но в cheat engine она выглядит совсем не так, данные то в ней есть, вроде IP и Hostname, но они расположены на каких-то непонятных оффсетах, почему структура в C++ выглядит не так, как в CheatEngine, смотрел еще некоторые структуры - так там данные в CE расположены в том же порядке, что и в C++
Вероятно, дело в выравнивании структур компилятором. Статья 1, Статья 2
 
  • Нравится
Реакции: Ya Zaregalsya

Vadim.dll

Известный
168
81
Как минимум - у Вас несоответствие кодировок. ANSI программа использующая ANSI версии функций winApi у Вас принимает в качестве аргументов const wchar_t * (строки L"..."), что является ошибкой.
А как более - хороший пример по external получению списка игроков написан в samp udf for ahk. Все оффсеты есть в верхней части файла в массивах, где 1, 2, 3 позиции соответствуют версиям 0.3.7r1, r2, 0.3dl с поправкой для global SAMP_REMOTEPLAYERDATA_PED := [0x2A4, 0x40, 0x40].
Также для определения причин вылета лучше применять отладчик, т.к. сообщение "у меня крашит" практически не несет в себе полезной нагрузки, а узнать причины краша Вы можете самостоятельно.


Вероятно, дело в выравнивании структур компилятором. Статья 1, Статья 2
Спасибо! Надеюсь это мне поможет!
 

#kweeZ

Известный
577
123
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        short int DialogID;
        char pText[64];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(DialogID);
        params->bitStream->Read(pText);
        params->bitStream->ResetReadPointer();

        SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]",    DialogID);
        SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
    };

    return true;
};
 

Вложения

  • sa-mp-077.png
    sa-mp-077.png
    8.2 KB · Просмотры: 181

Cake_

Потрачен
Проверенный
263
313
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        short int DialogID;
        char pText[64];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(DialogID);
        params->bitStream->Read(pText);
        params->bitStream->ResetReadPointer();

        SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]",    DialogID);
        SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
    };

    return true;
};
Читаешь длину текста, читаешь сам текст, декодишь, убираешь мусор.

Читаешь длину текста, читаешь сам текст, декодишь, убираешь мусор.
  • ShowDialog - ID: 61
Parameters: UINT16 wDialogID, UINT8 bDialogStyle, UINT8 bTitleLength, char[] szTitle, UINT8 bButton1Len, char[] szButton1, UINT8 bButton2Len, char[] szButton2, CSTRING szInfo
 

Vadim.dll

Известный
168
81
Хочу получить ники всех игроков на сервере.
C++:
int main() {
   DWORD pID;
   char moduleName[] = "samp.dll";

   HWND hGameWindow = FindWindow(NULL, L"GTA:SA:MP");
   GetWindowThreadProcessId(hGameWindow, &pID);
   HANDLE pGta = OpenProcess(PROCESS_VM_READ, FALSE, pID);
   DWORD pSamp = GetModuleBaseAddress(pID, L"samp.dll");
  
   cout << "samp.dll addr: " << hex << pSamp << endl;

   char nickname[24] = { " " };
   ReadProcessMemory(pGta, (LPCVOID)(pSamp + OFFSET_NICKNAME), &nickname, sizeof(nickname), NULL);

   DWORD dwAddress;
   ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
   cout << "dwAdress : " << dwAddress << endl;

   ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
   cout << "dwAdres : " << dwAddress << endl;

   DWORD dwPlayers;
   ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
   cout << "dwPlayers : " << dwPlayers << endl;

   cout << endl << endl;

   uint32_t ulMaxPlayerID;
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
   cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl;

   uint16_t sLocalPlayerID;
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
   cout << "sLocalPlayerID : " << sLocalPlayerID << endl;

   //0x2a

   stRemotePlayer* pRemotePlayer[SAMP_MAX_PLAYERS];
   ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0);
   cout << "pRemotePlayer : " << pRemotePlayer << endl;
   cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl;
}

Но получаю либо кашу либо краш.


C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <psapi.h>


using namespace std;

DWORD GetProcId(const wchar_t* procname)
{
    PROCESSENTRY32 pe;
    HANDLE hSnap;

    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(hSnap, &pe)) {
        do {
            if (wcscmp(pe.szExeFile, procname) == 0)
                break;
        } while (Process32Next(hSnap, &pe));
    }
    return pe.th32ProcessID;
}

DWORD get_module(DWORD processID, const wchar_t* name)
{
    HMODULE hMods[1024];
    HANDLE hProcess;
    DWORD cbNeeded;
    unsigned int i;

    // Print the process identifier.

    printf("\nProcess ID: %u\n", processID);

    // Get a handle to the process.

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ,
        FALSE, processID);
    if (NULL == hProcess)
        return 1;

    // Get a list of all the modules in this process.

    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            // Get the full path to the module's file.
            //GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))
            if (GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[i];
               

            }
        }
    }

    // Release the handle to the process.

    CloseHandle(hProcess);

    return 0;
}

int main() {
    DWORD pID = GetProcId(L"gta_sa.exe");

    std::cout << "pid:" << pID << endl;

    HANDLE pGta = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    DWORD pSamp = (DWORD)get_module(pID, L"samp.dll");


    std::cout << "samp.dll addr: " << hex << pSamp << endl;

    char nickname[24];
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x219A6F), &nickname, 24, 0);
    std::cout << nickname << endl;

    DWORD dwAddress;
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
    std::cout << "dwAdress : " << hex << dwAddress << endl;

    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
    std::cout << "dwAdres : " << hex << dwAddress << endl;

    DWORD dwPlayers;
    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
    std::cout << "dwPlayers : " << dwPlayers << endl;

    std::cout << endl << endl;

    uint32_t ulMaxPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
    std::cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl;

    uint16_t sLocalPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
    std::cout << "sLocalPlayerID : " << sLocalPlayerID << endl;

    //0x2a

    //stRemotePlayer * pRemotePlayer[SAMP_MAX_PLAYERS];
    //ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0);
    //cout << "pRemotePlayer : " << pRemotePlayer << endl;
    //cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl;
}

Попробуй это.
 

SAMP.ASI

Известный
223
53
C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <psapi.h>


using namespace std;

DWORD GetProcId(const wchar_t* procname)
{
    PROCESSENTRY32 pe;
    HANDLE hSnap;

    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(hSnap, &pe)) {
        do {
            if (wcscmp(pe.szExeFile, procname) == 0)
                break;
        } while (Process32Next(hSnap, &pe));
    }
    return pe.th32ProcessID;
}

DWORD get_module(DWORD processID, const wchar_t* name)
{
    HMODULE hMods[1024];
    HANDLE hProcess;
    DWORD cbNeeded;
    unsigned int i;

    // Print the process identifier.

    printf("\nProcess ID: %u\n", processID);

    // Get a handle to the process.

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ,
        FALSE, processID);
    if (NULL == hProcess)
        return 1;

    // Get a list of all the modules in this process.

    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            // Get the full path to the module's file.
            //GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))
            if (GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[i];
              

            }
        }
    }

    // Release the handle to the process.

    CloseHandle(hProcess);

    return 0;
}

int main() {
    DWORD pID = GetProcId(L"gta_sa.exe");

    std::cout << "pid:" << pID << endl;

    HANDLE pGta = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    DWORD pSamp = (DWORD)get_module(pID, L"samp.dll");


    std::cout << "samp.dll addr: " << hex << pSamp << endl;

    char nickname[24];
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x219A6F), &nickname, 24, 0);
    std::cout << nickname << endl;

    DWORD dwAddress;
    ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0);
    std::cout << "dwAdress : " << hex << dwAddress << endl;

    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0);
    std::cout << "dwAdres : " << hex << dwAddress << endl;

    DWORD dwPlayers;
    ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool
    std::cout << "dwPlayers : " << dwPlayers << endl;

    std::cout << endl << endl;

    uint32_t ulMaxPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID
    std::cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl;

    uint16_t sLocalPlayerID;
    ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID
    std::cout << "sLocalPlayerID : " << sLocalPlayerID << endl;

    //0x2a

    //stRemotePlayer * pRemotePlayer[SAMP_MAX_PLAYERS];
    //ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0);
    //cout << "pRemotePlayer : " << pRemotePlayer << endl;
    //cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl;
}

Попробуй это.
Мне нужно получить структуру pRemotePlayer[1004], чтоб получить из нее значения ника, счета. pRemotePlayer находится в stPlayerPool
 

astap_

Известный
Всефорумный модератор
626
601
Как узнать текст диалога? При таком коде выводится только текст "Авторизация/Принять", то есть титла/кнопки, а дальше какие-то иероглифы, а мне надо прочитать текст, который находится в самом диалоге
Код:
bool CALLBACK incomingRPC(stRakNetHookParams* params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        short int DialogID;
        char pText[64];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(DialogID);
        params->bitStream->Read(pText);
        params->bitStream->ResetReadPointer();

        SF->getSAMP()->getChat()->AddChatMessage(-1, "DIALOG ID [%d]]",    DialogID);
        SF->getSAMP()->getChat()->AddChatMessage(-1, "Text: [%s]", pText);
    };

    return true;
};
странно что у тебя вообще что-то выводится с таким кодом.
компоненты RPC/пакета нужно получать строго по порядку.
Код:
struct stSAMPDialog
{
    int iIsActive;
    BYTE bDialogStyle;
    WORD wDialogID;
    BYTE bTitleLength;
    char szTitle[257];
    BYTE bButton1Len;
    char szButton1[257];
    BYTE bButton2Len;
    char szButton2[257];
    char szInfo[1000];
};

bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
    if (hook->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
    {
        stSAMPDialog sampDialog;

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(sampDialog.wDialogID);
        params->bitStream->Read(sampDialog.bDialogStyle);
        params->bitStream->Read(sampDialog.bTitleLength);
        params->bitStream->Read(sampDialog.szTitle, sampDialog.bTitleLength);
        sampDialog.szTitle[sampDialog.bTitleLength] = 0;
        params->bitStream->Read(sampDialog.bButton1Len);
        params->bitStream->Read(sampDialog.szButton1, sampDialog.bButton1Len);
        sampDialog.szButton1[sampDialog.bButton1Len] = 0;
        params->bitStream->Read(sampDialog.bButton2Len);
        params->bitStream->Read(sampDialog.szButton2, sampDialog.bButton2Len);
        sampDialog.szButton2[sampDialog.bButton2Len] = 0;
        SF->getRakNet()->DecodeString(sampDialog.szInfo, 900, params->bitStream);
 
        SF->getSAMP()->getChat()->AddChatMessage(-1, sampDialog.szInfo);
    };
    return true;
};
 
Последнее редактирование:
  • Нравится
Реакции: #kweeZ

Vadim.dll

Известный
168
81
Мне нужно получить структуру pRemotePlayer[1004], чтоб получить из нее значения ника, счета. pRemotePlayer находится в stPlayerPool
А где у тебя эта структура определена?

Вопрос, как в Cheat Engine или где-нибудь еще получить адрес на структуру, в которой лежит текст диалога? Пробовал искать, нашел один указатель, так на него ничего не ссылается и в дизассембле пишется прямо в него, нету сдвига, может подскажет кто.
 

SAMP.ASI

Известный
223
53
А где у тебя эта структура определена?

Вопрос, как в Cheat Engine или где-нибудь еще получить адрес на структуру, в которой лежит текст диалога? Пробовал искать, нашел один указатель, так на него ничего не ссылается и в дизассембле пишется прямо в него, нету сдвига, может подскажет кто.
В начале кода подключена structures.h, вот она https://pastebin.com/7iBpCA9L