Потому что читаешь не правильно:Посмотреть вложение 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
из-за id все равно крашит, а текст все тот же пишетПотому что читаешь не правильно:
Код: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
Потому что ты гений, который читает не по структуре RPCиз-за id все равно крашит, а текст все тот же пишет
Посмотреть вложение 29914
а как надо? я из примера бралПотому что ты гений, который читает не по структуре RPC
Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусор в строке. Я не за компом , так бы написал код. Я думаю , разберёшься самПосмотреть вложение 29906
Почему если пытаюсь получить index сразу крашит? и почему szString всегда одинаковый пишет, какое то не понятное число?
Длину текста нужно читать перед текстома как надо? я из примера брал
!отдельно!Facepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусор в строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам
Длину текста нужно читать перед текстом
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;
}
а как? напиши, пожалуйста, а то я дурачекFacepalm... Нужно читать textdraw id. Textdraw data, len textdraw, text textdrawa, в конце обязательно очисти мусор в строке. Я не за компом , так бы написал код. Я думаю , разберёшься сам
Длину текста нужно читать перед текстом
!отдельно!
Попробуй просто длину текста читать отдельноа как? напиши, пожалуйста, а то я дурачек
Дату текстдрава вроде не обязательно читатьПопробуй просто длину текста читать отдельно
И используй 256 элементов в массиве , на всякий случайПопробуй просто длину текста читать отдельно
Дату текстдрава вроде не обязательно читать
а как? напиши, пожалуйста, а то я дурачек
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;
};
#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).Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про 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; }
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенксПервой строкой поставь. Нужно вводить не просто /showinfo, в команде должен быть один параметр, в данном случае это id игрока ( 0 - 1000).C++:#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
Чтобы вывести свои данные вот код:Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
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);
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;
};