HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 15.05.2019, 15:40
Vadim.dll
Участник форума
Регистрация: 04.07.2015
Сообщений: 168
С нами: 5715860

Репутация: 78
По умолчанию

Цитата:
Сообщение от index  

Как минимум - у Вас несоответствие кодировок. 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
Спасибо! Надеюсь это мне поможет!
 
Ответить с цитированием

  #2  
Старый 15.05.2019, 17:08
Vadim.dll
Участник форума
Регистрация: 04.07.2015
Сообщений: 168
С нами: 5715860

Репутация: 78
По умолчанию

[QUOTE="SAMP.ASI"]

Хочу получить ники всех игроков на сервере.

C++:





[CODE]
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

strPlayerName

C++:





[CODE]
#include
#include
#include
#include
#include
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
strPlayerName



Попробуй это.
 
Ответить с цитированием

  #3  
Старый 16.05.2019, 00:26
SAMP.ASI
Участник форума
Регистрация: 27.05.2016
Сообщений: 223
С нами: 5242744

Репутация: 83
По умолчанию

[QUOTE="Vadim.dll"]

C++:





[CODE]
#include
#include
#include
#include
#include
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
strPlayerName
 
Ответить с цитированием

  #4  
Старый 16.05.2019, 19:11
Vadim.dll
Участник форума
Регистрация: 04.07.2015
Сообщений: 168
С нами: 5715860

Репутация: 78
По умолчанию

Цитата:
Сообщение от SAMP.ASI  

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

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

  #5  
Старый 16.05.2019, 19:18
SAMP.ASI
Участник форума
Регистрация: 27.05.2016
Сообщений: 223
С нами: 5242744

Репутация: 83
По умолчанию

Цитата:
Сообщение от Vadim.dll  

А где у тебя эта структура определена?

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

  #6  
Старый 15.05.2019, 14:05
#kweeZ
Постоянный
Регистрация: 17.06.2015
Сообщений: 578
С нами: 5739536

Репутация: 98


По умолчанию

Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про hash_map, а если компилить с "

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1", то при входе в игру пишется "Test", а команда /showinfo просто не работает

Код:





Код:
#include 
#include 
#include 
#include 

#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;
}
 
Ответить с цитированием

  #7  
Старый 15.05.2019, 14:10
Cake_
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами: 4793630

Репутация: 133
По умолчанию

Цитата:
Сообщение от HanPrincess  

Почему не работает это? Если попробовать вот так компилить, то выдаёт ошибку про hash_map, а если компилить с "
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1", то при входе в игру пишется "Test", а команда /showinfo просто не работает

Код:





Код:
#include 
#include 
#include 
#include 

#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


 
Ответить с цитированием

  #8  
Старый 15.05.2019, 14:15
#kweeZ
Постоянный
Регистрация: 17.06.2015
Сообщений: 578
С нами: 5739536

Репутация: 98


По умолчанию

Цитата:
Сообщение от cakebou  

Первой строкой поставь. Нужно вводить не просто /showinfo, в команде должен быть один параметр, в данном случае это id игрока ( 0 - 1000).







C++:





Код:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1



Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
 
Ответить с цитированием

  #9  
Старый 15.05.2019, 15:02
Cake_
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами: 4793630

Репутация: 133
По умолчанию

Цитата:
Сообщение от HanPrincess  

Просто при вводе своего ид ничего не выводится, поэтому и думал, что не работает, сенкс
Чтобы вывестисвои данныевот код:

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
)
;


 
Ответить с цитированием

  #10  
Старый 15.05.2019, 15:03
Vadim.dll
Участник форума
Регистрация: 04.07.2015
Сообщений: 168
С нами: 5715860

Репутация: 78
По умолчанию

Вопрос:

Есть такая структура:

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
;
}
;




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





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Создать сделку

Продавец: ник или ID

Название сделки:

Сумма USDT:

Срок сделки, дней:

Кто платит комиссию:

Условия сделки:

После создания сделки средства будут зарезервированы в холде до завершения сделки.

×

Мои сделки

Загрузка...
×

Сделка


Загрузка чата...