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

Imbecil

Новичок
15
0
upload_2019-5-13_16-22-26.png
Почему если пытаюсь получить index сразу крашит? и почему szString всегда одинаковый пишет, какое то не понятное число?
 

Rjx13

Известный
Проверенный
224
160
Посмотреть вложение 29906
Почему если пытаюсь получить index сразу крашит? и почему szString всегда одинаковый пишет, какое то не понятное число?
Потому что читаешь не правильно:
Код:
ShowTextDraw - ID: 134
Parameters: UINT16 wTextDrawID, UINT8 Flags, float fLetterWidth, float fLetterHeight, UINT32 dwLetterColor, float fLineWidth, float fLineHeight, UINT32 dwBoxColor, UINT8 Shadow, UINT8 Outline, UINT32 dwBackgroundColor, UINT8 Style, UINT8 Selectable, float fX, float fY, UINT16 wModelID, float fRotX, float fRotY, float fRotZ, float fZoom, UINT16 wColor1, UINT16 wColor2, UINT8 szTextLen, char[] szText
 

Imbecil

Новичок
15
0
Потому что читаешь не правильно:
Код:
ShowTextDraw - ID: 134
Parameters: UINT16 wTextDrawID, UINT8 Flags, float fLetterWidth, float fLetterHeight, UINT32 dwLetterColor, float fLineWidth, float fLineHeight, UINT32 dwBoxColor, UINT8 Shadow, UINT8 Outline, UINT32 dwBackgroundColor, UINT8 Style, UINT8 Selectable, float fX, float fY, UINT16 wModelID, float fRotX, float fRotY, float fRotZ, float fZoom, UINT16 wColor1, UINT16 wColor2, UINT8 szTextLen, char[] szText
из-за id все равно крашит, а текст все тот же пишет
upload_2019-5-13_17-52-1.png
 

Cake_

Известный
Проверенный
263
313
Посмотреть вложение 29906
Почему если пытаюсь получить index сразу крашит? и почему szString всегда одинаковый пишет, какое то не понятное число?
Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусор в строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам


а как надо? я из примера брал
Длину текста нужно читать перед текстом

Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусор в строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам


Длину текста нужно читать перед текстом
!отдельно!
 
  • Нравится
Реакции: Imbecil

SAMP.ASI

Известный
223
53
Хочу получить ники всех игроков на сервере.
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;
}

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

Imbecil

Новичок
15
0
Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусор в строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам


Длину текста нужно читать перед текстом


!отдельно!
а как? напиши, пожалуйста, а то я дурачек
 

Cake_

Известный
Проверенный
263
313
а как? напиши, пожалуйста, а то я дурачек
Попробуй просто длину текста читать отдельно

Попробуй просто длину текста читать отдельно
Дату текстдрава вроде не обязательно читать

Попробуй просто длину текста читать отдельно


Дату текстдрава вроде не обязательно читать
И используй 256 элементов в массиве , на всякий случай
 
  • Нравится
Реакции: Imbecil

astap_

Известный
Всефорумный модератор
625
593
а как? напиши, пожалуйста, а то я дурачек
Код:
bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowTextDraw)
    {
        stTextDrawTransmit txd;
       
        WORD txdID, cTextLen; char cText[800];
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(txdID);
        params->bitStream->Read((PCHAR)&txd, sizeof(stTextDrawTransmit));
        params->bitStream->Read(cTextLen);
        params->bitStream->Read(cText, cTextLen);
        params->bitStream->ResetReadPointer();
        cText[cTextLen] = '\0';

        SF->getSAMP()->getChat()->AddChatMessage(-1, "Получен текстдрав (%i) с текстом: %s", txdID, cText);
    }
    return true;
};
 
  • Нравится
Реакции: Imbecil

#kweeZ

Известный
577
122
Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про 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
122
Первой строкой поставь. Нужно вводить не просто /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
80
Вопрос:
Есть такая структура:
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++