ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   получить id локального игрока (https://forum.antichat.xyz/showthread.php?t=1441724)

RedHolms 22.07.2022 00:49

Задача казалось бы простая, но в CNetGame.m_localinfo.m_nId хранится мусор) Так же пробовал samp'овской функцией искать ID по педу, возвращало тоже самое

И да, мне нужно без SF, чистый самп

F0RQU1N and 22.07.2022 05:35

какой именно мусор? у меня нормальный ид возвращает.

RedHolms 22.07.2022 17:32

Цитата:

Сообщение от F0RQU1N

какой именно мусор? у меня нормальный ид возвращает.

Число 5057

RedHolms 24.07.2022 16:18

up

sizeoftrickster 24.07.2022 16:51

Цитата:

Сообщение от RedHolms

up

Могу предложить вариант:

C++:





[CODE]
// Вначале получаем указатель на структуру SAMP или stSAMP, CNetGame, pSAMP, вообщем как удобнее
pSAMP
=
*
reinterpret_cast

(
samp
.
dll
+
0x21A0F8
)
;
// Потом из структуры сампа получаем указатель на структуру игровых пулов
ppPools
=
reinterpret_cast

(
(
size_t
)
pSAMP
+
0x3CD
)
;
// Потом из структуры игровых пулов в структуре самп получаем указатель на структуру игроков
ppPlayer
=
reinterpret_cast

(
(
size_t
)
pPools
+
0x18
)
;
// В итоге, из структуры игроков получаем ник и ид ЛОКАЛЬНОГО игрока. Смотри: https://gitlab.com/prime-hack/samp/plugins/templates/samp/-/blob/master/SAMP by SR_team
pLocalPlayerNickname
=
reinterpret_cast

(
(
size_t
)
pPlayerPool
+
0xA
)
;
pLocalPlayerId
=
reinterpret_cast

(
(
size_t
)
pPlayerPool
+
0x4
)
;
short
SAMP
::
PlayerPool
::
GetLocalPlayerId
(
)
{
if
(
pLocalPlayerId
)
return
*
pLocalPlayerId
;
return
-
1
;
}
std
::
string SAMP
::
PlayerPool
::
GetLocalPlayerNickname
(
)
{
struct
msvc_string
{
union
{
char
szString
[
0x10
]
;
char
*
pszString
;
}
;
std
::
size_t length
;
std
::
size_t allocated
;
}
;
auto
string
=
*
reinterpret_cast

(
pLocalPlayerNickname
)
;
if
(
string
.
allocated



Еще один вариант, через pack и pop

C++:





Код:

#pragma pack(push, 1)
// Сюда структуры, сами структуры можно посмотреть: https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/master/src/samp.h
struct
stSAMP
{
void
*
pUnk0
;
struct
stServerInfo
*
pServerInfo
;
uint8_t
byteSpace
[
24
]
;
char
szIP
[
257
]
;
char
szHostname
[
259
]
;
bool
bNametagStatus
;
// changes by /nametagstatus
uint32_t
ulPort
;
uint32_t
ulMapIcons
[
100
]
;
int
iLanMode
;
int
iGameState
;
uint32_t
ulConnectTick
;
struct
stServerPresets
*
pSettings
;
void
*
pRakClientInterface
;
struct
stSAMPPools
*
pPools
;
}
;
#pragma pack(pop)


RedHolms 24.07.2022 17:01

г

[QUOTE="tr1ckster"]

Могу предложить вариант:

C++:





[CODE]
// Вначале получаем указатель на структуру SAMP или stSAMP, CNetGame, pSAMP, вообщем как удобнее
pSAMP
=
*
reinterpret_cast

(
samp
.
dll
+
0x21A0F8
)
;
// Потом из структуры сампа получаем указатель на структуру игровых пулов
ppPools
=
reinterpret_cast

(
(
size_t
)
pSAMP
+
0x3CD
)
;
// Потом из структуры игровых пулов в структуре самп получаем указатель на структуру игроков
ppPlayer
=
reinterpret_cast

(
(
size_t
)
pPools
+
0x18
)
;
// В итоге, из структуры игроков получаем ник и ид ЛОКАЛЬНОГО игрока. Смотри: https://gitlab.com/prime-hack/samp/plugins/templates/samp/-/blob/master/SAMP by SR_team
pLocalPlayerNickname
=
reinterpret_cast

(
(
size_t
)
pPlayerPool
+
0xA
)
;
pLocalPlayerId
=
reinterpret_cast

(
(
size_t
)
pPlayerPool
+
0x4
)
;
short
SAMP
::
PlayerPool
::
GetLocalPlayerId
(
)
{
if
(
pLocalPlayerId
)
return
*
pLocalPlayerId
;
return
-
1
;
}
std
::
string SAMP
::
PlayerPool
::
GetLocalPlayerNickname
(
)
{
struct
msvc_string
{
union
{
char
szString
[
0x10
]
;
char
*
pszString
;
}
;
std
::
size_t length
;
std
::
size_t allocated
;
}
;
auto
string
=
*
reinterpret_cast

(
pLocalPlayerNickname
)
;
if
(
string
.
allocated

RedHolms 26.07.2022 17:42

up

Решение

я тупич масштаба миллиард, брал адрес, прибавлял оффсет и брал полученный адрес как ID (надо было кастить к поинтеру и брать значения с поинтера)

в коде нагляднее:

C++:





Код:

short
id
=
idk
+
0x1
;
// как я брал
short
id
=
*
(
short
*
)
(
idk
+
0x1
)
;
// как надо



догадался спустя 3 дня, класс)


Время: 03:58