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

  #7581  
Старый 02.08.2025, 22:44
swlm
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами: 1990627

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

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

SAMP_SDK/SAMP_API_REMASTERED/SAMP/SAMP.hpp at 20f6db662727eccddadfc5305e422741fecc1f1f · DpO4uLa/SAMP_SDK

Ремастер SDK для быстрого взаимодействия с SA-MP & GTA SA - DpO4uLa/SAMP_SDK

github.com


SAMP_SDK/SAMP_API_REMASTERED/SAMP/SAMP.hpp at 20f6db662727eccddadfc5305e422741fecc1f1f · DpO4uLa/SAMP_SDK

Ремастер SDK для быстрого взаимодействия с SA-MP & GTA SA - DpO4uLa/SAMP_SDK

github.com


SAMP_SDK/SAMP_API_REMASTERED/SAMP/SAMP.hpp at 20f6db662727eccddadfc5305e422741fecc1f1f · DpO4uLa/SAMP_SDK

Ремастер SDK для быстрого взаимодействия с SA-MP & GTA SA - DpO4uLa/SAMP_SDK

github.com

ладно, сделаю тогда на функцию сразу...
 
Ответить с цитированием

  #7582  
Старый 02.08.2025, 22:58
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

Цитата:
Сообщение от daun.daunovich.01  

получить что-то из пакета, происходит краш.
Потому-что эта функция вызывается в бесконечном цикле игры и не морозит основной поток, т.е. если нет пакета для получения, возвращается nullptr (под капотом там обычное получение пакета из потокобезопасной очереди, которая пополняется внутри ракпира). Делай проверку на nullptr и должно работать
 
Ответить с цитированием

  #7583  
Старый 02.08.2025, 23:06
swlm
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами: 1990627

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

Цитата:
Сообщение от вайега52  

Потому-что эта функция вызывается в бесконечном цикле игры и не морозит основной поток, т.е. если нет пакета для получения, возвращается nullptr (под капотом там обычное получение пакета из потокобезопасной очереди, которая пополняется внутри ракпира). Делай проверку на nullptr и должно работать
Да, сяб, проверил и всё работает.

Получается этот вариант хука правильный?

C++:





[CODE]
bool
Hooks
::
HookReceive
(
)
{
HMODULE sampModule
=
GetModuleHandleA
(
"samp.dll"
)
;
if
(
!
sampModule
)
{
return
false
;
}
// Получаем указатель на рак клиент
RakClientInterface
*
*
rakclient
=
reinterpret_cast

(
AVSSync
::
getRakClientIntf
(
)
)
;
if
(
!
rakclient
)
{
return
false
;
}
DWORD
*
vTable
=
*
reinterpret_cast

(
rakclient
)
;
LPVOID target
=
reinterpret_cast

(
vTable
[
8
]
)
;
MH_STATUS createStatus
=
MH_CreateHook
(
target
,
&
HookedReceive
,
reinterpret_cast

(
&
originalReceive
)
)
;
if
(
createStatus
!=
MH_OK
)
{
return
false
;
}
MH_STATUS enableStatus
=
MH_EnableHook
(
target
)
;
if
(
enableStatus
!=
MH_OK
)
{
return
false
;
}
std
::
cout

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

  #7584  
Старый 02.08.2025, 23:10
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

[QUOTE="daun.daunovich.01"]

Да, сяб, проверил и всё работает.

Получается этот вариант хука правильный?

C++:





[CODE]
bool
Hooks
::
HookReceive
(
)
{
HMODULE sampModule
=
GetModuleHandleA
(
"samp.dll"
)
;
if
(
!
sampModule
)
{
return
false
;
}
// Получаем указатель на рак клиент
RakClientInterface
*
*
rakclient
=
reinterpret_cast

(
AVSSync
::
getRakClientIntf
(
)
)
;
if
(
!
rakclient
)
{
return
false
;
}
DWORD
*
vTable
=
*
reinterpret_cast

(
rakclient
)
;
LPVOID target
=
reinterpret_cast

(
vTable
[
8
]
)
;
MH_STATUS createStatus
=
MH_CreateHook
(
target
,
&
HookedReceive
,
reinterpret_cast

(
&
originalReceive
)
)
;
if
(
createStatus
!=
MH_OK
)
{
return
false
;
}
MH_STATUS enableStatus
=
MH_EnableHook
(
target
)
;
if
(
enableStatus
!=
MH_OK
)
{
return
false
;
}
std
::
cout
 
Ответить с цитированием

  #7585  
Старый 11.08.2025, 19:56
swlm
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами: 1990627

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

Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.

Что не так?

cpp:





Код:
Это R3

CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);

uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;

    return reinterpret_cast(local_info + 0x2A4);
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}

// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
 
Ответить с цитированием

  #7586  
Старый 11.08.2025, 20:00
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

Цитата:
Сообщение от daun.daunovich.01  

Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.
Что не так?

cpp:





Код:
Это R3

CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);

uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;

    return reinterpret_cast(local_info + 0x2A4);
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}

// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO

Лучше используй псдк, получай CPed* локального игрока через FindPlayerPed() и из него доставай матрицу (вроде даже есть метод GetPosition)
 
Ответить с цитированием

  #7587  
Старый 11.08.2025, 20:12
swlm
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами: 1990627

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

Цитата:
Сообщение от вайега52  

Лучше используй псдк, получай CPed* локального игрока через FindPlayerPed() и из него доставай матрицу (вроде даже есть метод GetPosition)
Не могу, у меня проект создан отдельно от plugin-sdk, если я его добавлю в ручную - то он работать не будет
 
Ответить с цитированием

  #7588  
Старый 12.08.2025, 00:00
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

Цитата:
Сообщение от daun.daunovich.01  

Не могу, у меня проект создан отдельно от plugin-sdk, если я его добавлю в ручную - то он работать не будет
Не совсем понял, как это. Ты можешь просто в свой проект подключить plugin-sdk как библиотеку

Цитата:
Сообщение от daun.daunovich.01  

Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.
Что не так?

cpp:





Код:
Это R3

CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);

uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;

    return reinterpret_cast(local_info + 0x2A4);
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}

// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO

Если getPlayerPool возвращает указатель на пул, то +- такой код (хотя опять же, есть уже все готовое: sampapi):

C++:





Код:
Это R3

CVector
*
pos
=
samp
->
getPos
(
)
;
printf
(
"x: %f, y: %f, z: %f\n"
,
pos
->
x
,
pos
->
y
,
pos
->
z
)
;
uintptr_t
*
getPlayerEntity
(
)
{
uintptr_t player_pool
=
getPlayerPool
(
)
;
uintptr_t local_info
=
player_pool
+
0x2F14
;
uintptr_t
*
local_player
=
reinterpret_cast

(
local_info
+
0x26
)
;
uintptr_t samp_ped
=
*
local_player
;
// offset 0x0 CPed
uintptr_t game_ped
=
samp_ped
+
0x2A4
;
return
game_ped
;
}
CVector
*
getPos
(
)
{
uintptr_t
*
gamePed
=
getPlayerEntity
(
)
;
if
(
gamePed
!=
nullptr
)
{
return
reinterpret_cast

(
0x4043A0
)
(
gamePed
)
;
}
//return CVector(1.0, 5.0, 10.0);
}
// 0x4043A0
CSimpleTransform
*
__thiscall CEntity
::
GetPosition
(
CEntity
*
this
)
-
функция в IDA PRO
 
Ответить с цитированием

  #7589  
Старый 12.08.2025, 01:21
swlm
Познающий
Регистрация: 03.08.2022
Сообщений: 57
С нами: 1990627

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

Цитата:
Сообщение от вайега52  

Не совсем понял, как это. Ты можешь просто в свой проект подключить plugin-sdk как библиотеку

Если getPlayerPool возвращает указатель на пул, то +- такой код (хотя опять же, есть уже все готовое: sampapi):

C++:





Код:
Это R3

CVector
*
pos
=
samp
->
getPos
(
)
;
printf
(
"x: %f, y: %f, z: %f\n"
,
pos
->
x
,
pos
->
y
,
pos
->
z
)
;
uintptr_t
*
getPlayerEntity
(
)
{
uintptr_t player_pool
=
getPlayerPool
(
)
;
uintptr_t local_info
=
player_pool
+
0x2F14
;
uintptr_t
*
local_player
=
reinterpret_cast

(
local_info
+
0x26
)
;
uintptr_t samp_ped
=
*
local_player
;
// offset 0x0 CPed
uintptr_t game_ped
=
samp_ped
+
0x2A4
;
return
game_ped
;
}
CVector
*
getPos
(
)
{
uintptr_t
*
gamePed
=
getPlayerEntity
(
)
;
if
(
gamePed
!=
nullptr
)
{
return
reinterpret_cast

(
0x4043A0
)
(
gamePed
)
;
}
//return CVector(1.0, 5.0, 10.0);
}
// 0x4043A0
CSimpleTransform
*
__thiscall CEntity
::
GetPosition
(
CEntity
*
this
)
-
функция в IDA PRO

Проект отдельно от plugin-sdk, это значит что проект у меня совсем в другой директории.

И если я добавлю plugin-sdk как библиотеку - то в проекте появятся какие-то ошибки...

Когда я инклуд plugin.h делаю
 
Ответить с цитированием

  #7590  
Старый 12.08.2025, 01:26
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

Цитата:
Сообщение от daun.daunovich.01  

Проект отдельно от plugin-sdk, это значит что проект у меня совсем в другой директории.
И если я добавлю plugin-sdk как библиотеку - то в проекте появятся какие-то ошибки...
Когда я инклуд plugin.h делаю
Значит неправильно подключаешь)

Если используешь визуалку, то копируешь псдк с гита, запускаешь его инсталлер, ставишь в первом поле путь до папки, где у тебя плагинсдк лежит, потом выбираешь версию визуалки, генерируешь проект, билдишь.

В своём проекте в настройках пишешь путь до .lib файла псдк и до заголовочных файлов
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.